fox-wamp
Version:
Web Application Message Router/Server WAMP/MQTT
109 lines (90 loc) • 2.72 kB
JavaScript
const WebSocket = require('ws')
const msgpack = require('msgpack-lite')
const { SESSION_TX, SESSION_RX, SESSION_DEBUG } = require('../messages')
const { HyperSocketFormatter, RemoteHyperClient } = require('./client')
function HyperWSWriter(wsclient, session, router) {
this.hyperPkgWrite = function (msg, callback) {
const pkg = msgpack.encode(msg)
router.emit(SESSION_TX, session, pkg)
wsclient.send(pkg, callback)
}
this.hyperPkgClose = function (code, reason) {
router.emit(SESSION_DEBUG, session, 'Closing WebSocket connection: [' + code + '] ' + reason)
wsclient.close(code, reason)
}
}
function HyperWSServer(gate, options) {
const router = gate.getRouter()
const wss = new WebSocket.Server(options)
wss.on('connection', function (ws) {
const session = router.createSession()
session.setGateProtocol('hyper.ws')
const socketWriter = new HyperWSWriter(ws, session, router)
ws.on('message', function (data) {
ctx.emit(SESSION_RX, data.toString('utf-8'))
let msg
try {
msg = msgpack.decode(data)
} catch (e) {
console.error('Failed to decode msgpack:', e)
return
}
const ctx = gate.createContext(session, socketWriter)
gate.handle(ctx, session, msg)
})
ws.on('close', function () {
router.removeSession(session)
})
ws.on('error', function (exc) {
console.log("ignoring exception:" + exc, session.getSid())
})
})
return wss
}
function HyperWSClient(params) {
const conf = params || {}
let ws
let socketWriter
let formater
RemoteHyperClient.call(this, null)
this.connect = () => {
return new Promise((resolve, reject) => {
ws = new WebSocket(`ws://${conf.host}:${conf.port}`)
ws.binaryType = 'arraybuffer'
ws.onopen = () => {
socketWriter = new HyperWSWriter(ws)
formater = new HyperSocketFormatter(socketWriter)
this.formater = formater
resolve(this)
this.applyOnOpen()
}
ws.onmessage = (event) => {
let msg
try {
msg = msgpack.decode(Buffer.from(event.data))
} catch (e) {
console.error('Failed to decode msgpack:', e)
return
}
formater.onMessage(msg)
}
ws.onerror = (err) => {
console.log('Connection ERROR', err)
reject(err)
}
ws.onclose = () => {
console.log('event:Connection closed')
}
})
}
this.close = function () {
if (ws) ws.close()
}
this.getSocket = function () {
return ws
}
}
exports.HyperWSServer = HyperWSServer
exports.HyperWSWriter = HyperWSWriter
exports.HyperWSClient = HyperWSClient