This commit is contained in:
Timothy Bish 2017-09-22 13:11:36 -04:00
commit d7612531f6
1 changed files with 248 additions and 126 deletions

View File

@ -17,10 +17,10 @@
* under the License. * under the License.
*/ */
// Generated by CoffeeScript 1.3.3
(function() { (function() {
var Byte, Client, Frame, Stomp, var Byte, Client, Frame, Stomp,
__hasProp = {}.hasOwnProperty; __hasProp = {}.hasOwnProperty,
__slice = [].slice;
Byte = { Byte = {
LF: '\x0A', LF: '\x0A',
@ -28,6 +28,7 @@
}; };
Frame = (function() { Frame = (function() {
var unmarshallSingle;
function Frame(command, headers, body) { function Frame(command, headers, body) {
this.command = command; this.command = command;
@ -36,23 +37,35 @@
} }
Frame.prototype.toString = function() { Frame.prototype.toString = function() {
var lines, name, value, _ref; var lines, name, skipContentLength, value, _ref;
lines = [this.command]; lines = [this.command];
skipContentLength = this.headers['content-length'] === false ? true : false;
if (skipContentLength) {
delete this.headers['content-length'];
}
_ref = this.headers; _ref = this.headers;
for (name in _ref) { for (name in _ref) {
if (!__hasProp.call(_ref, name)) continue; if (!__hasProp.call(_ref, name)) continue;
value = _ref[name]; value = _ref[name];
lines.push("" + name + ":" + value); lines.push("" + name + ":" + value);
} }
if (this.body) { if (this.body && !skipContentLength) {
lines.push("content-length:" + ('' + this.body).length); lines.push("content-length:" + (Frame.sizeOfUTF8(this.body)));
} }
lines.push(Byte.LF + this.body); lines.push(Byte.LF + this.body);
return lines.join(Byte.LF); return lines.join(Byte.LF);
}; };
Frame._unmarshallSingle = function(data) { Frame.sizeOfUTF8 = function(s) {
var body, chr, command, divider, headerLines, headers, i, idx, len, line, start, trim, _i, _j, _ref, _ref1; if (s) {
return encodeURI(s).match(/%..|./g).length;
} else {
return 0;
}
};
unmarshallSingle = function(data) {
var body, chr, command, divider, headerLines, headers, i, idx, len, line, start, trim, _i, _j, _len, _ref, _ref1;
divider = data.search(RegExp("" + Byte.LF + Byte.LF)); divider = data.search(RegExp("" + Byte.LF + Byte.LF));
headerLines = data.substring(0, divider).split(Byte.LF); headerLines = data.substring(0, divider).split(Byte.LF);
command = headerLines.shift(); command = headerLines.shift();
@ -60,9 +73,9 @@
trim = function(str) { trim = function(str) {
return str.replace(/^\s+|\s+$/g, ''); return str.replace(/^\s+|\s+$/g, '');
}; };
line = idx = null; _ref = headerLines.reverse();
for (i = _i = 0, _ref = headerLines.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) { for (_i = 0, _len = _ref.length; _i < _len; _i++) {
line = headerLines[i]; line = _ref[_i];
idx = line.indexOf(':'); idx = line.indexOf(':');
headers[trim(line.substring(0, idx))] = trim(line.substring(idx + 1)); headers[trim(line.substring(0, idx))] = trim(line.substring(idx + 1));
} }
@ -85,19 +98,29 @@
}; };
Frame.unmarshall = function(datas) { Frame.unmarshall = function(datas) {
var data; var frame, frames, last_frame, r;
return (function() { frames = datas.split(RegExp("" + Byte.NULL + Byte.LF + "*"));
r = {
frames: [],
partial: ''
};
r.frames = (function() {
var _i, _len, _ref, _results; var _i, _len, _ref, _results;
_ref = datas.split(RegExp("" + Byte.NULL + Byte.LF + "*")); _ref = frames.slice(0, -1);
_results = []; _results = [];
for (_i = 0, _len = _ref.length; _i < _len; _i++) { for (_i = 0, _len = _ref.length; _i < _len; _i++) {
data = _ref[_i]; frame = _ref[_i];
if ((data != null ? data.length : void 0) > 0) { _results.push(unmarshallSingle(frame));
_results.push(Frame._unmarshallSingle(data));
}
} }
return _results; return _results;
})(); })();
last_frame = frames.slice(-1)[0];
if (last_frame === Byte.LF || (last_frame.search(RegExp("" + Byte.NULL + Byte.LF + "*$"))) !== -1) {
r.frames.push(unmarshallSingle(last_frame));
} else {
r.partial = last_frame;
}
return r;
}; };
Frame.marshall = function(command, headers, body) { Frame.marshall = function(command, headers, body) {
@ -111,6 +134,7 @@
})(); })();
Client = (function() { Client = (function() {
var now;
function Client(ws) { function Client(ws) {
this.ws = ws; this.ws = ws;
@ -121,21 +145,45 @@
outgoing: 10000, outgoing: 10000,
incoming: 10000 incoming: 10000
}; };
this.maxWebSocketFrameSize = 16 * 1024;
this.subscriptions = {}; this.subscriptions = {};
this.partialData = '';
} }
Client.prototype.debug = function(message) {
var _ref;
return typeof window !== "undefined" && window !== null ? (_ref = window.console) != null ? _ref.log(message) : void 0 : void 0;
};
now = function() {
if (Date.now) {
return Date.now();
} else {
return new Date().valueOf;
}
};
Client.prototype._transmit = function(command, headers, body) { Client.prototype._transmit = function(command, headers, body) {
var out; var out;
out = Frame.marshall(command, headers, body); out = Frame.marshall(command, headers, body);
if (typeof this.debug === "function") { if (typeof this.debug === "function") {
this.debug(">>> " + out); this.debug(">>> " + out);
} }
return this.ws.send(out); while (true) {
if (out.length > this.maxWebSocketFrameSize) {
this.ws.send(out.substring(0, this.maxWebSocketFrameSize));
out = out.substring(this.maxWebSocketFrameSize);
if (typeof this.debug === "function") {
this.debug("remaining = " + out.length);
}
} else {
return this.ws.send(out);
}
}
}; };
Client.prototype._setupHeartbeat = function(headers) { Client.prototype._setupHeartbeat = function(headers) {
var serverIncoming, serverOutgoing, ttl, v, _ref, _ref1, var serverIncoming, serverOutgoing, ttl, v, _ref, _ref1;
_this = this;
if ((_ref = headers.version) !== Stomp.VERSIONS.V1_1 && _ref !== Stomp.VERSIONS.V1_2) { if ((_ref = headers.version) !== Stomp.VERSIONS.V1_1 && _ref !== Stomp.VERSIONS.V1_2) {
return; return;
} }
@ -154,132 +202,179 @@
if (typeof this.debug === "function") { if (typeof this.debug === "function") {
this.debug("send PING every " + ttl + "ms"); this.debug("send PING every " + ttl + "ms");
} }
this.pinger = typeof window !== "undefined" && window !== null ? window.setInterval(function() { this.pinger = Stomp.setInterval(ttl, (function(_this) {
_this.ws.send(Byte.LF); return function() {
return typeof _this.debug === "function" ? _this.debug(">>> PING") : void 0; _this.ws.send(Byte.LF);
}, ttl) : void 0; return typeof _this.debug === "function" ? _this.debug(">>> PING") : void 0;
};
})(this));
} }
if (!(this.heartbeat.incoming === 0 || serverOutgoing === 0)) { if (!(this.heartbeat.incoming === 0 || serverOutgoing === 0)) {
ttl = Math.max(this.heartbeat.incoming, serverOutgoing); ttl = Math.max(this.heartbeat.incoming, serverOutgoing);
if (typeof this.debug === "function") { if (typeof this.debug === "function") {
this.debug("check PONG every " + ttl + "ms"); this.debug("check PONG every " + ttl + "ms");
} }
return this.ponger = typeof window !== "undefined" && window !== null ? window.setInterval(function() { return this.ponger = Stomp.setInterval(ttl, (function(_this) {
var delta; return function() {
delta = Date.now() - _this.serverActivity; var delta;
if (delta > ttl * 2) { delta = now() - _this.serverActivity;
if (typeof _this.debug === "function") { if (delta > ttl * 2) {
_this.debug("did not receive server activity for the last " + delta + "ms"); if (typeof _this.debug === "function") {
_this.debug("did not receive server activity for the last " + delta + "ms");
}
return _this.ws.close();
} }
return _this._cleanUp(); };
} })(this));
}, ttl) : void 0;
} }
}; };
Client.prototype.connect = function(login, passcode, connectCallback, errorCallback, vhost) { Client.prototype._parseConnect = function() {
var _this = this; var args, connectCallback, errorCallback, headers;
this.connectCallback = connectCallback; args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
headers = {};
switch (args.length) {
case 2:
headers = args[0], connectCallback = args[1];
break;
case 3:
if (args[1] instanceof Function) {
headers = args[0], connectCallback = args[1], errorCallback = args[2];
} else {
headers.login = args[0], headers.passcode = args[1], connectCallback = args[2];
}
break;
case 4:
headers.login = args[0], headers.passcode = args[1], connectCallback = args[2], errorCallback = args[3];
break;
default:
headers.login = args[0], headers.passcode = args[1], connectCallback = args[2], errorCallback = args[3], headers.host = args[4];
}
return [headers, connectCallback, errorCallback];
};
Client.prototype.connect = function() {
var args, errorCallback, headers, out;
args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
out = this._parseConnect.apply(this, args);
headers = out[0], this.connectCallback = out[1], errorCallback = out[2];
if (typeof this.debug === "function") { if (typeof this.debug === "function") {
this.debug("Opening Web Socket..."); this.debug("Opening Web Socket...");
} }
this.ws.onmessage = function(evt) { this.ws.onmessage = (function(_this) {
var arr, c, data, frame, onreceive, _i, _len, _ref, _results; return function(evt) {
data = typeof ArrayBuffer !== 'undefined' && evt.data instanceof ArrayBuffer ? (arr = new Uint8Array(evt.data), typeof _this.debug === "function" ? _this.debug("--- got data length: " + arr.length) : void 0, ((function() { var arr, c, client, data, frame, messageID, onreceive, subscription, unmarshalledData, _i, _len, _ref, _results;
var _i, _len, _results; data = typeof ArrayBuffer !== 'undefined' && evt.data instanceof ArrayBuffer ? (arr = new Uint8Array(evt.data), typeof _this.debug === "function" ? _this.debug("--- got data length: " + arr.length) : void 0, ((function() {
var _i, _len, _results;
_results = [];
for (_i = 0, _len = arr.length; _i < _len; _i++) {
c = arr[_i];
_results.push(String.fromCharCode(c));
}
return _results;
})()).join('')) : evt.data;
_this.serverActivity = now();
if (data === Byte.LF) {
if (typeof _this.debug === "function") {
_this.debug("<<< PONG");
}
return;
}
if (typeof _this.debug === "function") {
_this.debug("<<< " + data);
}
unmarshalledData = Frame.unmarshall(_this.partialData + data);
_this.partialData = unmarshalledData.partial;
_ref = unmarshalledData.frames;
_results = []; _results = [];
for (_i = 0, _len = arr.length; _i < _len; _i++) { for (_i = 0, _len = _ref.length; _i < _len; _i++) {
c = arr[_i]; frame = _ref[_i];
_results.push(String.fromCharCode(c)); switch (frame.command) {
case "CONNECTED":
if (typeof _this.debug === "function") {
_this.debug("connected to server " + frame.headers.server);
}
_this.connected = true;
_this._setupHeartbeat(frame.headers);
_results.push(typeof _this.connectCallback === "function" ? _this.connectCallback(frame) : void 0);
break;
case "MESSAGE":
subscription = frame.headers.subscription;
onreceive = _this.subscriptions[subscription] || _this.onreceive;
if (onreceive) {
client = _this;
messageID = frame.headers["message-id"];
frame.ack = function(headers) {
if (headers == null) {
headers = {};
}
return client.ack(messageID, subscription, headers);
};
frame.nack = function(headers) {
if (headers == null) {
headers = {};
}
return client.nack(messageID, subscription, headers);
};
_results.push(onreceive(frame));
} else {
_results.push(typeof _this.debug === "function" ? _this.debug("Unhandled received MESSAGE: " + frame) : void 0);
}
break;
case "RECEIPT":
_results.push(typeof _this.onreceipt === "function" ? _this.onreceipt(frame) : void 0);
break;
case "ERROR":
_results.push(typeof errorCallback === "function" ? errorCallback(frame) : void 0);
break;
default:
_results.push(typeof _this.debug === "function" ? _this.debug("Unhandled frame: " + frame) : void 0);
}
} }
return _results; return _results;
})()).join('')) : evt.data;
_this.serverActivity = Date.now();
if (data === Byte.LF) {
if (typeof _this.debug === "function") {
_this.debug("<<< PONG");
}
return;
}
if (typeof _this.debug === "function") {
_this.debug("<<< " + data);
}
_ref = Frame.unmarshall(data);
_results = [];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
frame = _ref[_i];
switch (frame.command) {
case "CONNECTED":
if (typeof _this.debug === "function") {
_this.debug("connected to server " + frame.headers.server);
}
_this.connected = true;
_this._setupHeartbeat(frame.headers);
_results.push(typeof _this.connectCallback === "function" ? _this.connectCallback(frame) : void 0);
break;
case "MESSAGE":
onreceive = _this.subscriptions[frame.headers.subscription];
_results.push(typeof onreceive === "function" ? onreceive(frame) : void 0);
break;
case "RECEIPT":
_results.push(typeof _this.onreceipt === "function" ? _this.onreceipt(frame) : void 0);
break;
case "ERROR":
_results.push(typeof errorCallback === "function" ? errorCallback(frame) : void 0);
break;
default:
_results.push(typeof _this.debug === "function" ? _this.debug("Unhandled frame: " + frame) : void 0);
}
}
return _results;
};
this.ws.onclose = function() {
var msg;
msg = "Whoops! Lost connection to " + _this.ws.url;
if (typeof _this.debug === "function") {
_this.debug(msg);
}
return typeof errorCallback === "function" ? errorCallback(msg) : void 0;
};
return this.ws.onopen = function() {
var headers;
if (typeof _this.debug === "function") {
_this.debug('Web Socket Opened...');
}
headers = {
"accept-version": Stomp.VERSIONS.supportedVersions(),
"heart-beat": [_this.heartbeat.outgoing, _this.heartbeat.incoming].join(',')
}; };
if (vhost) { })(this);
headers.host = vhost; this.ws.onclose = (function(_this) {
} return function() {
if (login) { var msg;
headers.login = login; msg = "Whoops! Lost connection to " + _this.ws.url;
} if (typeof _this.debug === "function") {
if (passcode) { _this.debug(msg);
headers.passcode = passcode; }
} _this._cleanUp();
return _this._transmit("CONNECT", headers); return typeof errorCallback === "function" ? errorCallback(msg) : void 0;
}; };
})(this);
return this.ws.onopen = (function(_this) {
return function() {
if (typeof _this.debug === "function") {
_this.debug('Web Socket Opened...');
}
headers["accept-version"] = Stomp.VERSIONS.supportedVersions();
headers["heart-beat"] = [_this.heartbeat.outgoing, _this.heartbeat.incoming].join(',');
return _this._transmit("CONNECT", headers);
};
})(this);
}; };
Client.prototype.disconnect = function(disconnectCallback) { Client.prototype.disconnect = function(disconnectCallback, headers) {
this._transmit("DISCONNECT"); if (headers == null) {
headers = {};
}
this._transmit("DISCONNECT", headers);
this.ws.onclose = null; this.ws.onclose = null;
this.ws.close();
this._cleanUp(); this._cleanUp();
return typeof disconnectCallback === "function" ? disconnectCallback() : void 0; return typeof disconnectCallback === "function" ? disconnectCallback() : void 0;
}; };
Client.prototype._cleanUp = function() { Client.prototype._cleanUp = function() {
this.ws.close();
this.connected = false; this.connected = false;
if (this.pinger) { if (this.pinger) {
if (typeof window !== "undefined" && window !== null) { Stomp.clearInterval(this.pinger);
window.clearInterval(this.pinger);
}
} }
if (this.ponger) { if (this.ponger) {
return typeof window !== "undefined" && window !== null ? window.clearInterval(this.ponger) : void 0; return Stomp.clearInterval(this.ponger);
} }
}; };
@ -295,6 +390,7 @@
}; };
Client.prototype.subscribe = function(destination, callback, headers) { Client.prototype.subscribe = function(destination, callback, headers) {
var client;
if (headers == null) { if (headers == null) {
headers = {}; headers = {};
} }
@ -304,7 +400,13 @@
headers.destination = destination; headers.destination = destination;
this.subscriptions[headers.id] = callback; this.subscriptions[headers.id] = callback;
this._transmit("SUBSCRIBE", headers); this._transmit("SUBSCRIBE", headers);
return headers.id; client = this;
return {
id: headers.id,
unsubscribe: function() {
return client.unsubscribe(headers.id);
}
};
}; };
Client.prototype.unsubscribe = function(id) { Client.prototype.unsubscribe = function(id) {
@ -315,9 +417,21 @@
}; };
Client.prototype.begin = function(transaction) { Client.prototype.begin = function(transaction) {
return this._transmit("BEGIN", { var client, txid;
transaction: transaction txid = transaction || "tx-" + this.counter++;
this._transmit("BEGIN", {
transaction: txid
}); });
client = this;
return {
id: txid,
commit: function() {
return client.commit(txid);
},
abort: function() {
return client.abort(txid);
}
};
}; };
Client.prototype.commit = function(transaction) { Client.prototype.commit = function(transaction) {
@ -355,7 +469,6 @@
})(); })();
Stomp = { Stomp = {
libVersion: "2.0.0-next",
VERSIONS: { VERSIONS: {
V1_0: '1.0', V1_0: '1.0',
V1_1: '1.1', V1_1: '1.1',
@ -379,11 +492,20 @@
Frame: Frame Frame: Frame
}; };
if (typeof window !== "undefined" && window !== null) { if (typeof exports !== "undefined" && exports !== null) {
window.Stomp = Stomp;
} else {
exports.Stomp = Stomp; exports.Stomp = Stomp;
Stomp.WebSocketClass = require('./test/server.mock.js').StompServerMock;
} }
}).call(this); if (typeof window !== "undefined" && window !== null) {
Stomp.setInterval = function(interval, f) {
return window.setInterval(f, interval);
};
Stomp.clearInterval = function(id) {
return window.clearInterval(id);
};
window.Stomp = Stomp;
} else if (!exports) {
self.Stomp = Stomp;
}
}).call(this);