ARTEMIS-1426 update stomp.js for chat example

Our copy of the stomp.js library hasn't been updated since the end of
2012. Lots of nice changes have been made since then. Pulled from
https://github.com/jmesnil/stomp-websocket/blob/master/lib/stomp.js.
This commit is contained in:
Justin Bertram 2017-09-20 11:01:14 -05:00 committed by Timothy Bish
parent b893042d8d
commit b6ce1c65fb
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);