UNPKG

muweb-socket

Version:

WebSocket communication for mudb

141 lines (103 loc) 5.38 kB
# muweb-socket WebSocket communications made available for `mudb`, using [`uws`](https://github.com/uNetworking/uWebSockets) for the WebSocket server implementation. # example **server.js** ```javascript var http = require('http') var MuWebSocketServer = require('muweb-socket/server').MuWebSocketServer var MuServer = require('mudb/server').MuServer var httpServer = http.createServer() // use a pre-created HTTP server var socketServer = new MuWebSocketServer({ server: httpServer }) var muServer = new MuServer(socketServer) muServer.start({ /* event handlers */ }) // should call `listen()` when using an external HTTP/S server httpServer.listen() ``` **client.js** ```javascript var MuWebSocket = require('muweb-socket/socket').MuWebSocket var MuClient = require('mudb/client').MuClient var socket = new MuWebSocket({ sessionId: Math.random().toString(36).substr(2), url: /* URL to server */, maxSockets: 10, // how many WebSockets to be opened }) var muClient = new MuClient(socket) muClient.start({ /* event handlers */ }) ``` # table of contents * [1 install](#section_1) * [2 api](#section_2) * [2.1 interfaces](#section_2.1) * [2.2 `MuWebSocketServer(spec)`](#section_2.2) * [2.2.1 `state:SocketServerState`](#section_2.2.1) * [2.2.2 `clients:MuWebSocketClient[]`](#section_2.2.2) * [2.2.3 `start(spec)`](#section_2.2.3) * [2.2.4 `close()`](#section_2.2.4) * [2.3 `MuWebSocket(spec)`](#section_2.3) * [2.3.1 `sessionId:SessionId`](#section_2.3.1) * [2.3.2 `state:SocketState`](#section_2.3.2) * [2.3.3 `open(spec)`](#section_2.3.3) * [2.3.4 `send(data:Data, unreliable?:boolean)`](#section_2.3.4) * [2.3.5 `close()`](#section_2.3.5) # <a name="section_1"></a> 1 install ``` npm i muweb-socket ``` # <a name="section_2"></a> 2 api ## <a name="section_2.1"></a> 2.1 interfaces Purely instructive types used to describe the API: * `SessionId`: `string` * `Data`: `Uint8Array | string` * `SocketState`: an enum consisting of three members * `SocketState.INIT` * `SocketState.OPEN` * `SocketState.CLOSED` * `SocketServerState`: an enum consisting of three members * `SocketServerState.INIT` * `SocketServerState.RUNNING` * `SocketServerState.SHUTDOWN` ## <a name="section_2.2"></a> 2.2 `MuWebSocketServer(spec)` A `MuWebSocketServer` can be used to create a `MuServer`. It handles client-server communications over the WebSocket protocol. * `spec:object` * `server:http.Server | https.Server` an HTTP/S server ### <a name="section_2.2.1"></a> 2.2.1 `state:SocketServerState` A tri-valued field **determining** the availability of the socket server. It is initialized to `SocketServerState.INIT`. ### <a name="section_2.2.2"></a> 2.2.2 `clients:MuWebSocketClient[]` Virtual server-side sockets each of which is used to communicate with a specific client. ### <a name="section_2.2.3"></a> 2.2.3 `start(spec)` Spins up a WebSocket server and hooks handlers. `state` is set to `SocketServerState.RUNNING`. * `spec:object` * `ready()` called when the WebSocket server is ready to handle connections * `connection(socket:MuWebSocketClient)` called when a client first connects * `close(error?)` called when the WebSocket server is shut down ### <a name="section_2.2.4"></a> 2.2.4 `close()` Shuts down the WebSocket server. `state` is set to `SocketServerState.SHUTDOWN`. ## <a name="section_2.3"></a> 2.3 `MuWebSocket(spec)` A `MuWebSocket` can be used to create a `MuClient`. It is a virtual client-side socket used to communicate with the server over the WebSocket protocol. * `spec:object` * `sessionId:SessionId`: a unique session id used to identify a client * `url:string`: URL to the server * `maxSockets?:number`: optional, the number of connections to be opened, which defaults to 5 Two data channels can exist simultaneously in each `MuWebSocket`, one delivers in order and the other delivers out of order but with potentially lower latency. The first established connection is used as the in-order data channel. ### <a name="section_2.3.1"></a> 2.3.1 `sessionId:SessionId` The unique session id identifying the client. ### <a name="section_2.3.2"></a> 2.3.2 `state:SocketState` A tri-valued field determining the availability of the socket. It is initialized to `SocketState.INIT`. ### <a name="section_2.3.3"></a> 2.3.3 `open(spec)` Opens a number of connections to the server. `state` is set to `SocketState.OPEN` when the in-order data channel is determined. * `spec:object` * `ready()` called when the in-order channel is ready * `message(data:Data, unreliable:boolean)` called when receiving data * `close(error?)` called when the in-order channel is closed ### <a name="section_2.3.4"></a> 2.3.4 `send(data:Data, unreliable?:boolean)` Sends data to the server, either via the in-order channel or the out-of-order channel. * `data:Data` data to be sent, can either be a JSON string or a `Uint8Array` * `unreliable?:boolean` optional, data is sent via the out-of-order channel if set to `true` to allow potential performance improvements ### <a name="section_2.3.5"></a> 2.3.5 `close()` Closes all connections. `state` is set to `SocketState.CLOSED`. # credits Copyright (c) 2017 Mikola Lysenko, Shenzhen Dianmao Technology Company Limited