fbp-spec
Version:
Data-driven FBP component/graph testing tool
66 lines (55 loc) • 2.05 kB
text/coffeescript
WebSocketServer = require('websocket').server
# XXX: Copied from https://github.com/noflo/noflo-runtime-websocket/blob/master/runtime/network.js
# should probably reuse it as-is
class WebSocketRuntime
constructor: ( = {}) ->
= []
send: (protocol, topic, payload, context) ->
if !context.connection or !context.connection.connected
return
if topic == 'error' and payload instanceof Error
payload =
message: payload.message
stack: payload.stack
context.connection.sendUTF JSON.stringify(
protocol: protocol
command: topic
payload: payload)
return
sendAll: (protocol, topic, payload, context) ->
if topic == 'error' and payload instanceof Error
payload =
message: payload.message
stack: payload.stack
.forEach (connection) ->
connection.sendUTF JSON.stringify(
protocol: protocol
command: topic
payload: payload)
return
return
module.exports = (httpServer, options) ->
wsServer = new WebSocketServer(httpServer: httpServer)
runtime = new WebSocketRuntime(options)
handleMessage = (message, connection) ->
if message.type == 'utf8'
contents = undefined
try
contents = JSON.parse(message.utf8Data)
catch e
if e.stack
console.error e.stack
else
console.error 'Error: ' + e.toString()
return
runtime.receive contents.protocol, contents.command, contents.payload, connection: connection
wsServer.on 'request', (request) ->
subProtocol = if request.requestedProtocols.indexOf('noflo') != -1 then 'noflo' else null
connection = request.accept(subProtocol, request.origin)
runtime.connections.push connection
connection.on 'message', (message) ->
handleMessage message, connection
connection.on 'close', ->
return if runtime.connections.indexOf(connection) == -1
runtime.connections.splice runtime.connections.indexOf(connection), 1
return runtime