89 lines
2.2 KiB
JavaScript
89 lines
2.2 KiB
JavaScript
var EventTarget = require('./api/event_target'),
|
|
Event = require('./api/event');
|
|
|
|
var API = {
|
|
CONNECTING: 0,
|
|
OPEN: 1,
|
|
CLOSING: 2,
|
|
CLOSED: 3,
|
|
|
|
_open: function() {
|
|
if (this._parser && !this._parser.isOpen()) return;
|
|
this.readyState = API.OPEN;
|
|
|
|
var buffer = this._sendBuffer || [],
|
|
message;
|
|
|
|
while (message = buffer.shift())
|
|
this.send.apply(this, message);
|
|
|
|
var event = new Event('open');
|
|
event.initEvent('open', false, false);
|
|
this.dispatchEvent(event);
|
|
},
|
|
|
|
receive: function(data) {
|
|
if (this.readyState !== API.OPEN) return false;
|
|
var event = new Event('message');
|
|
event.initEvent('message', false, false);
|
|
event.data = data;
|
|
this.dispatchEvent(event);
|
|
},
|
|
|
|
send: function(data, type, errorType) {
|
|
if (this.readyState === API.CONNECTING) {
|
|
if (this._sendBuffer) {
|
|
this._sendBuffer.push(arguments);
|
|
return true;
|
|
} else {
|
|
throw new Error('Cannot call send(), socket is not open yet');
|
|
}
|
|
}
|
|
|
|
if (this.readyState === API.CLOSED)
|
|
return false;
|
|
|
|
if (!(data instanceof Buffer)) data = String(data);
|
|
|
|
var frame = this._parser.frame(data, type, errorType);
|
|
try {
|
|
this._stream.write(frame, 'binary');
|
|
return true;
|
|
} catch (e) {
|
|
return false;
|
|
}
|
|
},
|
|
|
|
close: function(code, reason, ack) {
|
|
if (this.readyState === API.CLOSED) return;
|
|
if (this.readyState === API.CLOSING && ack !== false) return;
|
|
|
|
var finalize = function() {
|
|
this.readyState = API.CLOSED;
|
|
if (this._pingLoop) clearInterval(this._pingLoop);
|
|
if (this._stream) this._stream.end();
|
|
var event = new Event('close', {code: code || 1000, reason: reason || ''});
|
|
event.initEvent('close', false, false);
|
|
this.dispatchEvent(event);
|
|
};
|
|
|
|
if (this.readyState === API.CONNECTING)
|
|
return finalize.call(this);
|
|
|
|
this.readyState = API.CLOSING;
|
|
|
|
if (ack === false) {
|
|
if (this._parser.close) this._parser.close(code, reason);
|
|
finalize.call(this);
|
|
} else {
|
|
if (this._parser.close) this._parser.close(code, reason, finalize, this);
|
|
else finalize.call(this);
|
|
}
|
|
}
|
|
};
|
|
|
|
for (var key in EventTarget) API[key] = EventTarget[key];
|
|
|
|
module.exports = API;
|
|
|