Go - Websocket.On()
Register a handler for connections, disconnections, or messages for the websocket.
import ("fmt""github.com/nitrictech/go-sdk/faas""github.com/nitrictech/go-sdk/nitric")func main() {ws, err := nitric.NewWebsocket("public")if err != nil {return}ws.On(faas.WebsocketConnect, func(ctx *faas.WebsocketContext, next faas.WebsocketHandler) (*faas.WebsocketContext, error) {// handle connectionsreturn next(ctx)})ws.On(faas.WebsocketDisconnect, func(ctx *faas.WebsocketContext, next faas.WebsocketHandler) (*faas.WebsocketContext, error) {// handle disconnectionsreturn next(ctx)})ws.On(faas.WebsocketMessage, func(ctx *faas.WebsocketContext, next faas.WebsocketHandler) (*faas.WebsocketContext, error) {// handle messagesreturn next(ctx)})nitric.Run()}
Parameters
- Name
eventType
- Required
- Required
- Type
- WebsocketEventType
- Description
The type of websocket event to listen for. Can be
WebsocketConnect
,WebsocketDisconnect
, orWebsocketMessage
.
- Name
middleware
- Required
- Required
- Type
- WebsocketMiddleware
- Description
The middleware function to use as the handler for Websocket events. If you want to compose more than one middleware use
faas.ComposeWebsocketMiddleware
.
Examples
Register a handler for message events
ws.On(faas.WebsocketMessage, func(ctx *faas.WebsocketContext, next faas.WebsocketHandler) (*faas.WebsocketContext, error) {message := string(ctx.Request.Data())fmt.Printf("New Message from %s: %s\n", ctx.Request.ConnectionID(), message)return next(ctx)})
Manage Websocket connections
To store Websocket connections you can use a Nitric collection.
import ("fmt""github.com/nitrictech/go-sdk/faas""github.com/nitrictech/go-sdk/nitric")func main() {ws, err := nitric.NewWebsocket("public")if err != nil {return}connections, err := nitric.NewCollection("connections").With(nitric.CollectionEverything...)if err != nil {return}ws.On(faas.WebsocketConnect, func(ctx *faas.WebsocketContext, next faas.WebsocketHandler) (*faas.WebsocketContext, error) {err := connections.Doc(ctx.Request.ConnectionID()).Set(ctx.Request.Context(), map[string]interface{}{// store any metadata related to the connection here"connectionId": ctx.Request.ConnectionID(),})if err != nil {return ctx, err}return next(ctx)})ws.On(faas.WebsocketDisconnect, func(ctx *faas.WebsocketContext, next faas.WebsocketHandler) (*faas.WebsocketContext, error) {// remove the connection from the collectionerr := connections.Doc(ctx.Request.ConnectionID()).Delete(ctx.Request.Context())if err != nil {return ctx, err}return next(ctx)})nitric.Run()}
Chain functions as a single method handler
import ("fmt""github.com/nitrictech/go-sdk/faas""github.com/nitrictech/go-sdk/nitric")func validateMessage(ctx *faas.WebsocketContext, next faas.WebsocketHandler) (*faas.WebsocketContext, error) {// validate that the message does not contain explicit contentreturn next(ctx)}func handleMessage(ctx *faas.WebsocketContext, next faas.WebsocketHandler) (*faas.WebsocketContext, error) {message := string(ctx.Request.Data())fmt.Printf("New Message from %s: %s\n", ctx.Request.ConnectionID(), message)return next(ctx)}func main() {ws, err := nitric.NewWebsocket("public")if err != nil {return}ws.On(faas.WebsocketMessage, faas.ComposeWebsocketMiddleware(validateMessage, handleMessage))nitric.Run()}
Last updated on Jan 14, 2025