eventric-remote-socketio-client
Version:
eventric remote Socket.IO client implementation
105 lines (78 loc) • 3.03 kB
text/coffeescript
class SocketIORemoteServiceClient
initialize: (options = {}) ->
= 0
= 0
= []
= {}
options
_initializeSocketIo: ({ioClientInstance}) ->
new Promise (resolve) =>
= ioClientInstance
()
resolve()
_initializeRPCResponseListener: ->
.on 'eventric:rpcResponse', (response) =>
setTimeout =>
response
rpc: (payload) ->
new Promise (resolve, reject) =>
rpcId = ()
payload.rpcId = rpcId
[rpcId] =
resolve: resolve
reject: reject
.emit 'eventric:rpcRequest', payload
_getNextRpcId: ->
++
_handleRpcResponse: (response) ->
if not response.rpcId?
throw new Error 'Missing rpcId in RPC Response'
if response.rpcId not of
throw new Error "No promise registered for id #{response.rpcId}"
if response.error
if response.error.constructor isnt Error
response.error = response.error
[response.rpcId].reject response.error
else
[response.rpcId].resolve response.data
delete [response.rpcId]
_convertObjectToError: (object) ->
error = new Error object.message
Object.keys(object).forEach (key) ->
error[key] = object[key]
return error
subscribe: (context, [domainEventName, aggregateId]..., subscriberFn) ->
new Promise (resolve, reject) =>
fullEventName = context, domainEventName, aggregateId
subscriber =
eventName: fullEventName
subscriberFn: subscriberFn
subscriberId: ()
.emit 'eventric:joinRoom', fullEventName
.on fullEventName, subscriberFn
.push subscriber
resolve subscriber.subscriberId
unsubscribe: (subscriberId) ->
new Promise (resolve, reject) =>
matchingSubscriber = .filter((subscriber) ->
subscriber.subscriberId is subscriberId
)[0]
= .filter (subscriber) -> subscriber isnt matchingSubscriber
.removeListener matchingSubscriber.eventName, matchingSubscriber.subscriberFn
othersHaveSubscribedToThisEvent = .some (subscriber) ->
subscriber.eventName is matchingSubscriber.eventName
if not othersHaveSubscribedToThisEvent
.emit 'eventric:leaveRoom', matchingSubscriber.eventName
resolve()
_getNextSubscriberId: ->
++
_getFullEventName: (context, domainEventName, aggregateId) ->
fullEventName = context
if domainEventName
fullEventName += "/#{domainEventName}"
if aggregateId
fullEventName += "/#{aggregateId}"
fullEventName
disconnect: ->
.disconnect()
module.exports = new SocketIORemoteServiceClient