xapi-connector
Version:
Simple low level connector for xAPI written in Coffeescript
126 lines (107 loc) • 4.02 kB
text/coffeescript
#Copyright (c) Piotr Gorzelany 2014
tls = require('tls')
dispatcher = require('./dispatcher.js')
Emitter = require('events').EventEmitter
print = (msg) ->
console.log(msg + '\n')
return
class Connector
constructor: (, , , , ) ->
= '' #this is required since data comes in chunks
= '' #this is for the stream
= {}
= {}
= new Emitter()
= new Emitter()
buildCommand: (command, args, tag) ->
com =
command: if command? then command else throw new Error('Missing command')
arguments: args if args?
#myCustomTag = JSON.stringify(com)
if tag? then com.customTag = tag
#if tag? then com.customTag = tag else com.customTag = myCustomTag
return JSON.stringify(com)
buildStreamCommand: (command, stream_session_id, args) ->
throw new Error('Missing stream command') if not command?
com =
command: command
streamSessionId: stream_session_id if stream_session_id?
com[key] = val for key, val of args if args?
return JSON.stringify(com)
connect: () ->
#establish tls connection and handlers
.socket = tls.connect(, , () =>
.emit('open'))
.socket.setEncoding('utf-8')
.dispatcher = new dispatcher(.socket, 200)
= (msg) =>
#console.log("Sending message: #{msg}")
.dispatcher.add(msg)
.socket.addListener('data', )
.socket.addListener('error', (err) =>
.emit('error', err))
.socket.addListener('close', () =>
.emit('close'))
return
_onChunk: (data) =>
#since it is possible to receive multiple responses in one chunk, we have to split it
#if the response is a partial msg we just add it to the
responses = data.split('\n\n')
if responses.length == 1
+= responses[0]
else
#if the responses contains multiple messages we send them to handler one by one
responses = (res for res in data.split('\n\n') when res != '')
for res in responses
+= res
.emit('message', )
= ''
return
disconnect: () ->
#.socket.end() if .socket?
.socket.destroy() if .socket?
return
connectStream: () ->
.socket = tls.connect(, , () =>
.emit('open'))
.socket.setEncoding('utf-8')
.dispatcher = new dispatcher(.socket, 200)
= (msg) =>
#console.log("Sending message: #{msg}")
.dispatcher.add(msg)
.socket.addListener('data', )
.socket.addListener('error', (err) =>
.emit('error', err))
.socket.addListener('close', () =>
.emit('close'))
return
_onStreamChunk: (data) =>
#since it is possible to receive multiple responses in one chunk, we have to split it
responses = data.split('\n\n')
#partial response, just add the chunk
if responses.length == 1
+= responses[0]
#multiple responses, handle one by one
else
responses = (res for res in responses when res != '')
for res in responses
+= res
.emit('message', )
= ''
return
disconnectStream: () ->
#.socket.end() if .socket?
.socket.destroy() if .socket?
return
on: (event, callback) ->
.on(event, callback)
return
onStream: (event, callback) ->
.on(event, callback)
return
getQue: () ->
return .dispatcher.getQue()
getStreamQue: () ->
return .dispatcher.getQue()
#fill in onOpen, onMessage, onStreamOpen, onStreamMessage, onError and onStreamError handlers
module.exports = Connector