GSB API
March 9, 2023 ยท View on GitHub
GSB REST API allows to bind and unbind GSB services.
Binding GSB service enables WebSocket endpoint which allows to listen on incoming GSB messages. Path to WebSocket endpoint is returned in bind service response.
API documentation:
-
REST endpoints OpenAPI schema.
-
WS AsyncAPI schema.
Open it directly or by using AsyncAPI Studio.
docker run -it -p 8000:80 asyncapi/studio
Sample GSB API usage scenarios
Basic scenario
sequenceDiagram
participant App as WebSocket Client
participant Backend as Backend Yagna
participant Service as Golem Service
App ->>+ Backend: POST /gsb-api/v1/services:<br> { listen: { on: '/public/gftp/myapp', <br> components: ['GetMetadata', 'GetChunk'] }}
Backend -->> App: HTTP 201<br>{ listen: { ..., links: { messages: <br>'gsb-api/v1/services/<br>L3B1YmxpYy9nZnRwL215YXBw' } } }
App ->> Backend: GET gsb-api/v1/services/<br>L3B1YmxpYy9nZnRwL215YXBw <br> Headers: { Upgrade: websocket }
Backend -->> App: HTTP 101
par WebSocket connection lifespan
App ->> Backend: WS Event: Open
loop Multiple GSB message calls
Service ->>+ Backend: GSB: GetChunk <br>public/gftp/myapp
Backend ->> App: WS Message: gsbRequest<br> { id: '<br>L3B1YmxpYy9nZnRwL215YXBw', <br>component: 'GetMetadata', <br>payload: { .. } }
App -->> Backend: WS Message: gsbResponse<br> { id: '<br>L3B1YmxpYy9nZnRwL215YXBw', payload: { .. } }
Backend -->>- Service : GSB: GftpMetadata
end
App ->> Backend: DELETE /gsb-api/v1/services/<br>L3B1YmxpYy9nZnRwL215YXBw
Backend -->> App: WS Event: Close<br> CloseCode: Normal
end
Backend -->>- App: HTTP 200
Early GSB request scenario (simplified)
sequenceDiagram
participant App as WebSocket Client
participant Backend as Backend Yagna
participant Service as Golem Service
App ->>+ Backend: POST /gsb-api/v1/services
Backend -->> App: HTTP 201
Service ->>+ Backend: GSB: GetChunk
Note right of Backend: Buffered GSB request
App ->> Backend: GET gsb-api/v1/services/<br>L3B1YmxpYy9nZnRwL215YXBw
Backend -->> App: HTTP 101
par WebSocket connection lifespan
App ->> Backend: WS Event: Open
Backend ->> App: WS Message: gsbRequest
App -->> Backend: WS Message: gsbResponse
Backend -->>- Service : GSB: GftpMetadata
App ->> Backend: DELETE /gsb-api/v1/services/<br>L3B1YmxpYy9nZnRwL215YXBw
Backend -->> App: WS Event: Close<br> CloseCode: Normal
end
Backend -->>- App: HTTP 200
GSB messages buffering and cancelling (simplified)
sequenceDiagram
participant App as WebSocket Client
participant Backend as Backend Yagna
participant Service as Golem Service
App ->>+ Backend: POST /gsb-api/v1/services
Backend -->> App: HTTP 201
App ->> Backend: GET gsb-api/v1/services/<br>L3B1YmxpYy9nZnRwL215YXBw
Backend -->> App: HTTP 101
par 1st WS connection lifespan
App -->> Backend: WS Event: Close<br>CloseCode: Abnormal
end
Service ->>+ Backend: GSB: GetMetadata
Note right of Backend: Buffering GSB request<br>when WS disconnected
App ->> Backend: GET gsb-api/v1/services/<br>L3B1YmxpYy9nZnRwL215YXBw
Backend -->> App: HTTP 101
par 2nd WS connection lifespan
App ->> Backend: WS Event: Open
Backend ->> App: WS Message: gsbRequest
App -->> Backend: WS Message: gsbResponse
Backend -->>- Service : GSB: GftpMetadata
Service ->>+ Backend: GSB: GetChunk
Backend ->> App: WS Message: gsbRequest
App -->> Backend: WS Event: Close<br>CloseCode: Abnormal
end
Note right of Backend: Canceling GSB request<br> on WS Close
Backend -->>- Service: GSB: Error<br>ya_service_bus::Error::Closed
App ->> Backend: DELETE /gsb-api/v1/services/<br>L3B1YmxpYy9nZnRwL215YXBw
Backend -->>- App: HTTP 200
Disconnect WS on new WS connection (simplified)
sequenceDiagram
participant App0 as WebSocket Client<br>Old session
participant App1 as WebSocket Client<br>New session
participant Backend as Backend Yagna
App0 ->>+ Backend: POST /gsb-api/v1/services
Backend -->> App0: HTTP 201
App0 ->> Backend: GET gsb-api/v1/services/<br>L3B1YmxpYy9nZnRwL215YXBw
Backend -->> App0: HTTP 101
par Old WS connection
App0 ->> Backend: WS Event: Open
App1 ->> Backend: GET gsb-api/v1/services/<br>L3B1YmxpYy9nZnRwL215YXBw
Backend -->> App0: WS Event: Close<br>CloseCode: Policy
end
par New WS connection
Backend -->> App1: HTTP 101
App1 ->> Backend: WS Event: Open
App1 ->> Backend: DELETE /gsb-api/v1/services/<br>L3B1YmxpYy9nZnRwL215YXBw
Backend -->> App1: WS Event: Close<br> CloseCode: Normal
end
Backend -->>- App0: HTTP 200