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 connections
return next(ctx)
})
ws.On(faas.WebsocketDisconnect, func(ctx *faas.WebsocketContext, next faas.WebsocketHandler) (*faas.WebsocketContext, error) {
// handle disconnections
return next(ctx)
})
ws.On(faas.WebsocketMessage, func(ctx *faas.WebsocketContext, next faas.WebsocketHandler) (*faas.WebsocketContext, error) {
// handle messages
return next(ctx)
})
nitric.Run()
}

Parameters

  • Name
    eventType
    Required
    Required
    Type
    WebsocketEventType
    Description

    The type of websocket event to listen for. Can be WebsocketConnect, WebsocketDisconnect, or WebsocketMessage.

  • 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 collection
err := 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 content
return 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