primus-requests
Version:
Send named requests and receive responses with primus
64 lines (50 loc) • 1.15 kB
JavaScript
const callbacks = new Map()
, types = {
request: 0,
response: 1
}
let callbackId = 0
const messages = module.exports
messages.callbacks = callbacks
messages.incoming = function({ data }) {
if (data.type === 0 && data.name) {
this.emit(data.name, data.data, (response) => {
return this.write({
type: types.response,
id: data.id,
name: data.name,
data: response
})
})
return false
}
if (data.type === 1 && data.id >= 0) {
const callback = callbacks.get(data.id)
if (callback) {
callback(data.data)
callbacks.delete(data.id)
this.callbackIds.delete(data.id)
}
return false
}
}
messages.send = function(name, data, callback) {
if (typeof data === 'function') {
callback = data
data = null
}
const packet = {
type: types.request,
name: name,
data: data
}
if (callback) {
packet.id = callbackId++
callbacks.set(packet.id, callback)
if (this.callbackIds)
this.callbackIds.add(packet.id)
else
this.callbackIds = new Set([packet.id])
}
return this.write(packet)
}