eventric-remote-socketio-endpoint
Version:
eventric socketio remote endpoint
110 lines (70 loc) • 2.76 kB
text/coffeescript
class SocketIORemoteEndpoint
constructor: ->
= []
initialize: ({socketIoServer, logger}) ->
if not socketIoServer
throw new Error 'No socket io server instance passed'
= socketIoServer
= logger
()
addRpcRequestMiddleware: (rpcRequestMiddleware) ->
.push rpcRequestMiddleware
_addSocketIoEventBindings: ->
.sockets.on 'connection', (socket) =>
socket.on 'eventric:rpcRequest', (rpcRequest) =>
rpcRequest, socket
socket.on 'eventric:joinRoom', (roomName) =>
roomName, socket
socket.on 'eventric:leaveRoom', (roomName) ->
socket.leave roomName
setRPCHandler: (handleRPCRequest) ->
= handleRPCRequest
_handleRpcRequestEvent: (rpcRequest, socket) ->
emitRpcResponse = (error, response) =>
if error
error = error
rpcId = rpcRequest.rpcId
socket.emit 'eventric:rpcResponse',
rpcId: rpcId
error: error
data: response
rpcRequest, socket
.then =>
rpcRequest, emitRpcResponse
.catch (error) ->
emitRpcResponse error, null
_handleJoinRoomEvent: (roomName, socket) ->
roomName, socket
.then ->
socket.join roomName
.catch (error) =>
if
.error error, '\n', error.stack
else
throw error
_executeRpcRequestMiddleware: (data, socket) ->
rpcRequestMiddlewarePromise = Promise.resolve()
.forEach (rpcRequestMiddleware) ->
rpcRequestMiddlewarePromise = rpcRequestMiddlewarePromise.then ->
return rpcRequestMiddleware data, socket
rpcRequestMiddlewarePromise
_convertErrorToSerializableObject: (error) ->
serializableErrorObject =
name: error.name
message: error.message
Object.keys(error).forEach (key) ->
serializableErrorObject[key] = error[key]
return serializableErrorObject
publish: (context, [domainEventName, aggregateId]..., payload) ->
fullEventName = context, domainEventName, aggregateId
.to(fullEventName).emit fullEventName, payload
_getFullEventName: (context, domainEventName, aggregateId) ->
fullEventName = context
if domainEventName
fullEventName += "/#{domainEventName}"
if aggregateId
fullEventName += "/#{aggregateId}"
return fullEventName
close: ->
.close()
module.exports = SocketIORemoteEndpoint