This WSSbackend provides websocket server and websocket tools with one-liner configuration. Chain this with the HTTPbackend or use any generic http/https server. This uses the ws
library which includes the websocket server spec that is not default in Node.js.
Socket server clients can subscribe to node states on the socket server as well so it's easy to set up listener logic in your flow graph.
The default onmessage function handles service calls with jsonified commands. You can overwrite this or add custom listeners in parallel, everything else follows standard WebSocket API usage.
//e.g.. let served = await http.setupServer(...) from HTTPBackend
import {WSSbackend} from 'graphscript-node'
export type SocketServerProps = {
server:http.Server|https.Server,
host:'localhost'|'127.0.0.1'|string,
port:7000|number,
path:'wss'|'hotreload'|'python'|string,
onmessage?:(data:any, ws:WebSocket, serverinfo:SocketServerInfo)=>void,
onclose?:(wss:WebSocketServer, serverinfo:SocketServerInfo)=>void,
onconnection?:(ws:WebSocket,request:http.IncomingMessage, serverinfo:SocketServerInfo, clientId:string)=>void,
onconnectionclosed?:(code:number,reason:Buffer,ws:WebSocket, serverinfo:SocketServerInfo, clientId:string)=>void,
onerror?:(err:Error, wss:WebSocketServer, serverinfo:SocketServerInfo)=>void,
onupgrade?:(ws:WebSocket, serverinfo:SocketServerInfo, request:http.IncomingMessage, socket:any, head:Buffer)=>void, //after handleUpgrade is called
keepState?:boolean,
type?:'wss',
[key:string]:any
}
export type SocketServerInfo = {
wss:WebSocketServer,
clients:{[key:string]:WebSocket}, //corresponding socket controls are found in this.sockets for each clientId
address:string,
send:(message:any,socketId?:string)=>void,
request:(message:any, method?:string, socketId?:string)=>Promise<any>|Promise<any>[],
post:(route:any, args?:any, method?:string, socketId?:string)=>void,
run:(route:any, args?:any, method?:string, socketId?:string)=>Promise<any>|Promise<any>[],
subscribe:(route:any, callback?:((res:any)=>void)|string, socketId?:string)=>Promise<number>|Promise<number>[]|undefined,
unsubscribe:(route:any, sub:number,socketId?:string)=>Promise<boolean>|Promise<boolean>[],
terminate:(socketId?:string)=>boolean,
graph:WSSbackend
} & SocketServerProps;
const wss = new WSSbackend({loadDefaultRoutes:true});
let socketserver = wss.setupWSS(
{
server:served.server, //e.g. returned from httpbackend.setupServer
host:served.host,
port:8081,
path:'wss',
onconnection:(ws,req,serverinfo,id)=>{
ws.send('Hello from WSS!');
}
} as SocketServerProps
) as SocketServerInfo;
To open a websocket connection from node to another server
export type SocketProps = {
host?:string,
port?:number,
path?:string,
socket?:WebSocket,
address?:string,
serverOptions?:WebSocket.ServerOptions
onmessage?:(data:string | ArrayBufferLike | Blob | ArrayBufferView | Buffer[], ws:WebSocket,wsinfo:SocketProps)=>void, //will use this.receive as default
onopen?:(ws:WebSocket,wsinfo:SocketProps)=>void,
onclose?:(code:any,reason:any,ws:WebSocket,wsinfo:SocketProps)=>void,
onerror?:(er:Error, ws:WebSocket,wsinfo:SocketProps)=>void,
protocol?:'ws'|'wss',
type?:'socket',
_id?:string,
keepState?:boolean
}
export type SocketInfo = {
socket:WebSocket,
address?:string,
send:(message:any)=>void,
request:(message:any, method?:string)=>Promise<any>,
post:(route:any, args?:any, method?:string)=>void,
run:(route:any, args?:any, method?:string)=>Promise<any>,
subscribe:(route:any, callback?:((res:any)=>void)|string)=>any,
unsubscribe:(route:any, sub:number)=>Promise<boolean>,
terminate:()=>void,
graph:WSSbackend
} & SocketProps;
let socketinfo = wss.openWS({
host:'localhost',
port:8081
} as SocketProps) as SocketInfo;
//e.g..
socketinfo.subscribe('ping', console.log); //ping is available if loadDefaultRoutes is set to true when initializing a service
socketinfo.post('ping');