blob: 040e4c3257606ebb61a4b46bc39d3ba4041c87ff [file] [log] [blame]
// Generated by CoffeeScript 1.8.0
var AnonymousId, Channel, MessageQueue, channelManager, genJSON, messageHandler, parseJSON, utils, _,
__slice = [].slice;
_ = require('underscore');
utils = require('./utils');
channelManager = require('./channelManager');
messageHandler = require('./messageHandler');
MessageQueue = require('./MessageQueue');
AnonymousId = 'anonymous';
module.exports = utils.registerClass(Channel = (function() {
function Channel(pathPrefix, id, remoteAddress, isClient) {
var prefix;
this.pathPrefix = pathPrefix;
this.id = id;
this.remoteAddress = remoteAddress;
this.isClient = isClient;
prefix = this.isClient ? 'c-' : 't-';
this.name = "" + prefix + (utils.getNextSequenceNumber());
this.messageQueue = new MessageQueue;
this.isClosed = false;
this.connections = [];
this.isTarget = !this.isClient;
this.readTimeout = utils.options.readTimeout * 1000;
if (!this.id) {
this.id = AnonymousId;
}
this.description = {
channel: this.name,
id: this.id,
hostName: this.remoteAddress,
remoteAddress: this.remoteAddress
};
this.updateLastRead();
channelManager.created(this);
}
Channel.prototype.close = function() {
if (this.isClosed) {
return;
}
channelManager.destroyed(this);
this.isClosed = true;
return this.messageQueue.shutdown();
};
Channel.prototype.sendCallback = function() {
var args, callbackId, intfName;
intfName = arguments[0], callbackId = arguments[1], args = 3 <= arguments.length ? __slice.call(arguments, 2) : [];
if (!callbackId) {
return;
}
args.unshift(callbackId);
return this.sendMessage.apply(this, [intfName, 'sendCallback'].concat(__slice.call(args)));
};
Channel.prototype.sendMessage = function() {
var args, intfName, message, method;
intfName = arguments[0], method = arguments[1], args = 3 <= arguments.length ? __slice.call(arguments, 2) : [];
message = genJSON({
"interface": intfName,
method: method,
args: args
});
return this.messageQueue.push(message);
};
Channel.prototype.handleMessages = function(messages) {
var message, _i, _len, _results;
_results = [];
for (_i = 0, _len = messages.length; _i < _len; _i++) {
message = messages[_i];
message = parseJSON(message);
if (!message) {
continue;
}
_results.push(messageHandler.handleMessage(this, message));
}
return _results;
};
Channel.prototype.getMessages = function(callback) {
this.updateLastRead();
if (this.isClosed) {
return callback.call(null, null);
}
return this.messageQueue.pullAll(this.readTimeout, callback);
};
Channel.prototype.updateLastRead = function() {
return this.lastRead = (new Date).valueOf();
};
Channel.prototype.toString = function() {
var connections;
connections = _.map(this.connections, function(val) {
return val.name;
}).join(',');
return "Channel(" + this.name + ", closed:" + this.isClosed + ", connections:[" + connections + "])";
};
return Channel;
})());
parseJSON = function(message) {
var e;
try {
return JSON.parse(message);
} catch (_error) {
e = _error;
return null;
}
};
genJSON = function(message) {
var e;
try {
return JSON.stringify(message);
} catch (_error) {
e = _error;
return null;
}
};