@ws
Define WebSocket endpoint and Lambda handler functions.
Example
This app.arc file defines both HTTP and WebSocket endpoints:
arc
@app
myapp
@ws
json
{
"architect": {
"app": "myapp"
"ws": {}
},
"start": "npx sandbox",
"dependencies": {
"@architect/architect": "latest"
}
}
yaml
---
app: testapp
ws: ~
Running arc create generates the following WebSocket handlers, each mapping to a required WebSocket event (referred to as an action):
/
├── src/ws/
│ ├── connect
│ ├── default
│ └── disconnect
├── app.arc
└── package.json
Each handler responds to WebSocket actions from clients. In the payload delivered to the function there is a connectionId that uniquely identifies a client. Use this connectionId to send messages to the correct client (if needed).
Default actions
Each action handler created by the @ws pragma receives events from WebSocket clients.
connect- Invoked when a WebSocket client connects to the applicationdefault- Invoked when a WebSocket client sends any (un-routed) message to the applicationdisconnect- Invoked when a WebSocket client disconnects from your application
Custom actions
In addition to the three default WebSocket actions (connect, default, disconnect), you can create custom actions to be routed via message payloads like so:
@ws
some-custom-action
another-custom-action
These will generate additional handlers in your src/ws dir (e.g. src/ws/some-custom-action/). Custom action invocation routing is performed by sending a JSON payload with the corresponding action property; for example:
// Assuming the client is already connected
ws.send(JSON.stringify({
whatever: 'some data'
})) // Invokes `default`
ws.send(JSON.stringify({
action: 'some-custom-action',
whatever: 'related data'
})) // Invokes `some-custom-action`
Payload
WebSocket event payloads may contain a fair bit of data, but here are a few key bits:
| Argument | Description |
|---|---|
req |
The WebSocket request payload |
req.requestContext.connectionId |
An ID that uniquely identifies the client |
req.body |
Body payload sent by the client (if present) |
Send messages
To publish a message to a WebSocket client you can use Arc’s runtime library @architect/functions’ ws.send method. You can call this method from any of your application’s functions so long as you have a valid connectionId.