@stomp/stompjs
Version:
STOMP client for Javascript and Typescript
1,273 lines (1,245 loc) • 80.4 kB
JavaScript
(function webpackUniversalModuleDefinition(root, factory) {
if(typeof exports === 'object' && typeof module === 'object')
module.exports = factory();
else if(typeof define === 'function' && define.amd)
define("StompJs", [], factory);
else if(typeof exports === 'object')
exports["StompJs"] = factory();
else
root["StompJs"] = factory();
})(typeof self !== 'undefined' ? self : this, function() {
return /******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/ }
/******/ };
/******/
/******/ // define __esModule on exports
/******/ __webpack_require__.r = function(exports) {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/
/******/ // create a fake namespace object
/******/ // mode & 1: value is a module id, require it
/******/ // mode & 2: merge all properties of value into the ns
/******/ // mode & 4: return value when already ns object
/******/ // mode & 8|1: behave like require
/******/ __webpack_require__.t = function(value, mode) {
/******/ if(mode & 1) value = __webpack_require__(value);
/******/ if(mode & 8) return value;
/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ var ns = Object.create(null);
/******/ __webpack_require__.r(ns);
/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ return ns;
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = 0);
/******/ })
/************************************************************************/
/******/ ({
/***/ "./src/byte.ts":
/*!*********************!*\
!*** ./src/byte.ts ***!
\*********************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
/**
* Some byte values, used as per STOMP specifications.
*
* Part of `@stomp/stompjs`.
*
* @internal
*/
exports.BYTE = {
// LINEFEED byte (octet 10)
LF: '\x0A',
// NULL byte (octet 0)
NULL: '\x00'
};
/***/ }),
/***/ "./src/client.ts":
/*!***********************!*\
!*** ./src/client.ts ***!
\***********************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
Object.defineProperty(exports, "__esModule", { value: true });
var stomp_handler_1 = __webpack_require__(/*! ./stomp-handler */ "./src/stomp-handler.ts");
var versions_1 = __webpack_require__(/*! ./versions */ "./src/versions.ts");
var web_socket_state_1 = __webpack_require__(/*! ./web-socket-state */ "./src/web-socket-state.ts");
/**
* STOMP Client Class.
*
* Part of `@stomp/stompjs`.
*/
var Client = /** @class */ (function () {
/**
* Create an instance.
*/
function Client(conf) {
if (conf === void 0) { conf = {}; }
/**
* STOMP versions to attempt during STOMP handshake. By default versions `1.0`, `1.1`, and `1.2` are attempted.
*
* Example:
* ```javascript
* // Try only versions 1.0 and 1.1
* client.stompVersions = new Versions(['1.0', '1.1'])
* ```
*/
this.stompVersions = versions_1.Versions.default;
/**
* automatically reconnect with delay in milliseconds, set to 0 to disable.
*/
this.reconnectDelay = 5000;
/**
* Incoming heartbeat interval in milliseconds. Set to 0 to disable.
*/
this.heartbeatIncoming = 10000;
/**
* Outgoing heartbeat interval in milliseconds. Set to 0 to disable.
*/
this.heartbeatOutgoing = 10000;
/**
* This switches on a non standard behavior while sending WebSocket packets.
* It splits larger (text) packets into chunks of [maxWebSocketChunkSize]{@link Client#maxWebSocketChunkSize}.
* Only Java Spring brokers seems to use this mode.
*
* WebSockets, by itself, split large (text) packets,
* so it is not needed with a truly compliant STOMP/WebSocket broker.
* Actually setting it for such broker will cause large messages to fail.
*
* `false` by default.
*
* Binary frames are never split.
*/
this.splitLargeFrames = false;
/**
* See [splitLargeFrames]{@link Client#splitLargeFrames}.
* This has no effect if [splitLargeFrames]{@link Client#splitLargeFrames} is `false`.
*/
this.maxWebSocketChunkSize = 8 * 1024;
/**
* Usually the
* [type of WebSocket frame]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/send#Parameters}
* is automatically decided by type of the payload.
* Default is `false`, which should work with all compliant brokers.
*
* Set this flag to force binary frames.
*/
this.forceBinaryWSFrames = false;
/**
* A bug in ReactNative chops a string on occurrence of a NULL.
* See issue [https://github.com/stomp-js/stompjs/issues/89]{@link https://github.com/stomp-js/stompjs/issues/89}.
* This makes incoming WebSocket messages invalid STOMP packets.
* Setting this flag attempts to reverse the damage by appending a NULL.
* If the broker splits a large message into multiple WebSocket messages,
* this flag will cause data loss and abnormal termination of connection.
*
* This is not an ideal solution, but a stop gap until the underlying issue is fixed at ReactNative library.
*/
this.appendMissingNULLonIncoming = false;
this._active = false;
// Dummy callbacks
var noOp = function () { };
this.debug = noOp;
this.beforeConnect = noOp;
this.onConnect = noOp;
this.onDisconnect = noOp;
this.onUnhandledMessage = noOp;
this.onUnhandledReceipt = noOp;
this.onUnhandledFrame = noOp;
this.onStompError = noOp;
this.onWebSocketClose = noOp;
this.onWebSocketError = noOp;
this.logRawCommunication = false;
// These parameters would typically get proper values before connect is called
this.connectHeaders = {};
this._disconnectHeaders = {};
// Apply configuration
this.configure(conf);
}
Object.defineProperty(Client.prototype, "webSocket", {
/**
* Underlying WebSocket instance, READONLY.
*/
get: function () {
return this._webSocket;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Client.prototype, "disconnectHeaders", {
/**
* Disconnection headers.
*/
get: function () {
return this._disconnectHeaders;
},
set: function (value) {
this._disconnectHeaders = value;
if (this._stompHandler) {
this._stompHandler.disconnectHeaders = this._disconnectHeaders;
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(Client.prototype, "connected", {
/**
* `true` if there is a active connection with STOMP Broker
*/
get: function () {
return (!!this._stompHandler) && this._stompHandler.connected;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Client.prototype, "connectedVersion", {
/**
* version of STOMP protocol negotiated with the server, READONLY
*/
get: function () {
return this._stompHandler ? this._stompHandler.connectedVersion : undefined;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Client.prototype, "active", {
/**
* if the client is active (connected or going to reconnect)
*/
get: function () {
return this._active;
},
enumerable: true,
configurable: true
});
/**
* Update configuration.
*/
Client.prototype.configure = function (conf) {
// bulk assign all properties to this
Object.assign(this, conf);
};
/**
* Initiate the connection with the broker.
* If the connection breaks, as per [Client#reconnectDelay]{@link Client#reconnectDelay},
* it will keep trying to reconnect.
*
* Call [Client#deactivate]{@link Client#deactivate} to disconnect and stop reconnection attempts.
*/
Client.prototype.activate = function () {
this._active = true;
this._connect();
};
Client.prototype._connect = function () {
return __awaiter(this, void 0, void 0, function () {
var _this = this;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
if (this.connected) {
this.debug('STOMP: already connected, nothing to do');
return [2 /*return*/];
}
return [4 /*yield*/, this.beforeConnect()];
case 1:
_a.sent();
if (!this._active) {
this.debug('Client has been marked inactive, will not attempt to connect');
return [2 /*return*/];
}
this.debug('Opening Web Socket...');
// Get the actual WebSocket (or a similar object)
this._webSocket = this._createWebSocket();
this._stompHandler = new stomp_handler_1.StompHandler(this, this._webSocket, {
debug: this.debug,
stompVersions: this.stompVersions,
connectHeaders: this.connectHeaders,
disconnectHeaders: this._disconnectHeaders,
heartbeatIncoming: this.heartbeatIncoming,
heartbeatOutgoing: this.heartbeatOutgoing,
splitLargeFrames: this.splitLargeFrames,
maxWebSocketChunkSize: this.maxWebSocketChunkSize,
forceBinaryWSFrames: this.forceBinaryWSFrames,
logRawCommunication: this.logRawCommunication,
appendMissingNULLonIncoming: this.appendMissingNULLonIncoming,
onConnect: function (frame) {
if (!_this._active) {
_this.debug('STOMP got connected while deactivate was issued, will disconnect now');
_this._disposeStompHandler();
return;
}
_this.onConnect(frame);
},
onDisconnect: function (frame) {
_this.onDisconnect(frame);
},
onStompError: function (frame) {
_this.onStompError(frame);
},
onWebSocketClose: function (evt) {
_this.onWebSocketClose(evt);
// The callback is called before attempting to reconnect, this would allow the client
// to be `deactivated` in the callback.
if (_this._active) {
_this._schedule_reconnect();
}
},
onWebSocketError: function (evt) {
_this.onWebSocketError(evt);
},
onUnhandledMessage: function (message) {
_this.onUnhandledMessage(message);
},
onUnhandledReceipt: function (frame) {
_this.onUnhandledReceipt(frame);
},
onUnhandledFrame: function (frame) {
_this.onUnhandledFrame(frame);
}
});
this._stompHandler.start();
return [2 /*return*/];
}
});
});
};
Client.prototype._createWebSocket = function () {
var webSocket;
if (this.webSocketFactory) {
webSocket = this.webSocketFactory();
}
else {
webSocket = new WebSocket(this.brokerURL, this.stompVersions.protocolVersions());
}
webSocket.binaryType = 'arraybuffer';
return webSocket;
};
Client.prototype._schedule_reconnect = function () {
var _this = this;
if (this.reconnectDelay > 0) {
this.debug("STOMP: scheduling reconnection in " + this.reconnectDelay + "ms");
this._reconnector = setTimeout(function () {
_this._connect();
}, this.reconnectDelay);
}
};
/**
* Disconnect if connected and stop auto reconnect loop.
* Appropriate callbacks will be invoked if underlying STOMP connection was connected.
*
* To reactivate you can call [Client#activate]{@link Client#activate}.
*/
Client.prototype.deactivate = function () {
// indicate that auto reconnect loop should terminate
this._active = false;
// Clear if a reconnection was scheduled
if (this._reconnector) {
clearTimeout(this._reconnector);
}
this._disposeStompHandler();
};
/**
* Force disconnect if there is an active connection by directly closing the underlying WebSocket.
* This is different than a normal disconnect where a DISCONNECT sequence is carried out with the broker.
* After forcing disconnect, automatic reconnect will be attempted.
* To stop further reconnects call [Client#deactivate]{@link Client#deactivate} as well.
*/
Client.prototype.forceDisconnect = function () {
if (this._webSocket) {
if (this._webSocket.readyState === web_socket_state_1.WebSocketState.CONNECTING
|| this._webSocket.readyState === web_socket_state_1.WebSocketState.OPEN) {
this._webSocket.close();
}
}
};
Client.prototype._disposeStompHandler = function () {
// Dispose STOMP Handler
if (this._stompHandler) {
this._stompHandler.dispose();
this._stompHandler = null;
}
};
/**
* Send a message to a named destination. Refer to your STOMP broker documentation for types
* and naming of destinations.
*
* STOMP protocol specifies and suggests some headers and also allows broker specific headers.
*
* `body` must be String.
* You will need to covert the payload to string in case it is not string (e.g. JSON).
*
* To send a binary message body use binaryBody parameter. It should be a
* [Uint8Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array).
* Sometimes brokers may not support binary frames out of the box.
* Please check your broker documentation.
*
* `content-length` header is automatically added to the STOMP Frame sent to the broker.
* Set `skipContentLengthHeader` to indicate that `content-length` header should not be added.
* For binary messages `content-length` header is always added.
*
* Caution: The broker will, most likely, report an error and disconnect if message body has NULL octet(s)
* and `content-length` header is missing.
*
* ```javascript
* client.publish({destination: "/queue/test", headers: {priority: 9}, body: "Hello, STOMP"});
*
* // Only destination is mandatory parameter
* client.publish({destination: "/queue/test", body: "Hello, STOMP"});
*
* // Skip content-length header in the frame to the broker
* client.publish({"/queue/test", body: "Hello, STOMP", skipContentLengthHeader: true});
*
* var binaryData = generateBinaryData(); // This need to be of type Uint8Array
* // setting content-type header is not mandatory, however a good practice
* client.publish({destination: '/topic/special', binaryBody: binaryData,
* headers: {'content-type': 'application/octet-stream'}});
* ```
*/
Client.prototype.publish = function (params) {
this._stompHandler.publish(params);
};
/**
* STOMP brokers may carry out operation asynchronously and allow requesting for acknowledgement.
* To request an acknowledgement, a `receipt` header needs to be sent with the actual request.
* The value (say receipt-id) for this header needs to be unique for each use. Typically a sequence, a UUID, a
* random number or a combination may be used.
*
* A complaint broker will send a RECEIPT frame when an operation has actually been completed.
* The operation needs to be matched based in the value of the receipt-id.
*
* This method allow watching for a receipt and invoke the callback
* when corresponding receipt has been received.
*
* The actual {@link FrameImpl} will be passed as parameter to the callback.
*
* Example:
* ```javascript
* // Subscribing with acknowledgement
* let receiptId = randomText();
*
* client.watchForReceipt(receiptId, function() {
* // Will be called after server acknowledges
* });
*
* client.subscribe(TEST.destination, onMessage, {receipt: receiptId});
*
*
* // Publishing with acknowledgement
* receiptId = randomText();
*
* client.watchForReceipt(receiptId, function() {
* // Will be called after server acknowledges
* });
* client.publish({destination: TEST.destination, headers: {receipt: receiptId}, body: msg});
* ```
*/
Client.prototype.watchForReceipt = function (receiptId, callback) {
this._stompHandler.watchForReceipt(receiptId, callback);
};
/**
* Subscribe to a STOMP Broker location. The callback will be invoked for each received message with
* the {@link IMessage} as argument.
*
* Note: The library will generate an unique ID if there is none provided in the headers.
* To use your own ID, pass it using the headers argument.
*
* ```javascript
* callback = function(message) {
* // called when the client receives a STOMP message from the server
* if (message.body) {
* alert("got message with body " + message.body)
* } else {
* alert("got empty message");
* }
* });
*
* var subscription = client.subscribe("/queue/test", callback);
*
* // Explicit subscription id
* var mySubId = 'my-subscription-id-001';
* var subscription = client.subscribe(destination, callback, { id: mySubId });
* ```
*/
Client.prototype.subscribe = function (destination, callback, headers) {
if (headers === void 0) { headers = {}; }
return this._stompHandler.subscribe(destination, callback, headers);
};
/**
* It is preferable to unsubscribe from a subscription by calling
* `unsubscribe()` directly on {@link StompSubscription} returned by `client.subscribe()`:
*
* ```javascript
* var subscription = client.subscribe(destination, onmessage);
* // ...
* subscription.unsubscribe();
* ```
*
* See: http://stomp.github.com/stomp-specification-1.2.html#UNSUBSCRIBE UNSUBSCRIBE Frame
*/
Client.prototype.unsubscribe = function (id, headers) {
if (headers === void 0) { headers = {}; }
this._stompHandler.unsubscribe(id, headers);
};
/**
* Start a transaction, the returned {@link ITransaction} has methods - [commit]{@link ITransaction#commit}
* and [abort]{@link ITransaction#abort}.
*
* `transactionId` is optional, if not passed the library will generate it internally.
*/
Client.prototype.begin = function (transactionId) {
return this._stompHandler.begin(transactionId);
};
/**
* Commit a transaction.
*
* It is preferable to commit a transaction by calling [commit]{@link ITransaction#commit} directly on
* {@link ITransaction} returned by [client.begin]{@link Client#begin}.
*
* ```javascript
* var tx = client.begin(txId);
* //...
* tx.commit();
* ```
*/
Client.prototype.commit = function (transactionId) {
this._stompHandler.commit(transactionId);
};
/**
* Abort a transaction.
* It is preferable to abort a transaction by calling [abort]{@link ITransaction#abort} directly on
* {@link ITransaction} returned by [client.begin]{@link Client#begin}.
*
* ```javascript
* var tx = client.begin(txId);
* //...
* tx.abort();
* ```
*/
Client.prototype.abort = function (transactionId) {
this._stompHandler.abort(transactionId);
};
/**
* ACK a message. It is preferable to acknowledge a message by calling [ack]{@link IMessage#ack} directly
* on the {@link IMessage} handled by a subscription callback:
*
* ```javascript
* var callback = function (message) {
* // process the message
* // acknowledge it
* message.ack();
* };
* client.subscribe(destination, callback, {'ack': 'client'});
* ```
*/
Client.prototype.ack = function (messageId, subscriptionId, headers) {
if (headers === void 0) { headers = {}; }
this._stompHandler.ack(messageId, subscriptionId, headers);
};
/**
* NACK a message. It is preferable to acknowledge a message by calling [nack]{@link IMessage#nack} directly
* on the {@link IMessage} handled by a subscription callback:
*
* ```javascript
* var callback = function (message) {
* // process the message
* // an error occurs, nack it
* message.nack();
* };
* client.subscribe(destination, callback, {'ack': 'client'});
* ```
*/
Client.prototype.nack = function (messageId, subscriptionId, headers) {
if (headers === void 0) { headers = {}; }
this._stompHandler.nack(messageId, subscriptionId, headers);
};
return Client;
}());
exports.Client = Client;
/***/ }),
/***/ "./src/compatibility/compat-client.ts":
/*!********************************************!*\
!*** ./src/compatibility/compat-client.ts ***!
\********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
var client_1 = __webpack_require__(/*! ../client */ "./src/client.ts");
var heartbeat_info_1 = __webpack_require__(/*! ./heartbeat-info */ "./src/compatibility/heartbeat-info.ts");
/**
* Available for backward compatibility, please shift to using {@link Client}.
*
* **Deprecated**
*
* Part of `@stomp/stompjs`.
*
* To upgrade, please follow the [Upgrade Guide](../additional-documentation/upgrading.html)
*/
var CompatClient = /** @class */ (function (_super) {
__extends(CompatClient, _super);
/**
* Available for backward compatibility, please shift to using {@link Client}
* and [Client#webSocketFactory]{@link Client#webSocketFactory}.
*
* **Deprecated**
*
* @internal
*/
function CompatClient(webSocketFactory) {
var _this = _super.call(this) || this;
/**
* It is no op now. No longer needed. Large packets work out of the box.
*/
_this.maxWebSocketFrameSize = 16 * 1024;
_this._heartbeatInfo = new heartbeat_info_1.HeartbeatInfo(_this);
_this.reconnect_delay = 0;
_this.webSocketFactory = webSocketFactory;
// Default from previous version
_this.debug = function () {
var message = [];
for (var _i = 0; _i < arguments.length; _i++) {
message[_i] = arguments[_i];
}
console.log.apply(console, message);
};
return _this;
}
CompatClient.prototype._parseConnect = function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
var closeEventCallback;
var connectCallback;
var errorCallback;
var headers = {};
if (args.length < 2) {
throw new Error(('Connect requires at least 2 arguments'));
}
if (typeof (args[1]) === 'function') {
headers = args[0], connectCallback = args[1], errorCallback = args[2], closeEventCallback = args[3];
}
else {
switch (args.length) {
case 6:
headers.login = args[0], headers.passcode = args[1], connectCallback = args[2], errorCallback = args[3], closeEventCallback = args[4], headers.host = args[5];
break;
default:
headers.login = args[0], headers.passcode = args[1], connectCallback = args[2], errorCallback = args[3], closeEventCallback = args[4];
}
}
return [headers, connectCallback, errorCallback, closeEventCallback];
};
/**
* Available for backward compatibility, please shift to using [Client#activate]{@link Client#activate}.
*
* **Deprecated**
*
* The `connect` method accepts different number of arguments and types. See the Overloads list. Use the
* version with headers to pass your broker specific options.
*
* overloads:
* - connect(headers, connectCallback)
* - connect(headers, connectCallback, errorCallback)
* - connect(login, passcode, connectCallback)
* - connect(login, passcode, connectCallback, errorCallback)
* - connect(login, passcode, connectCallback, errorCallback, closeEventCallback)
* - connect(login, passcode, connectCallback, errorCallback, closeEventCallback, host)
*
* params:
* - headers, see [Client#connectHeaders]{@link Client#connectHeaders}
* - connectCallback, see [Client#onConnect]{@link Client#onConnect}
* - errorCallback, see [Client#onStompError]{@link Client#onStompError}
* - closeEventCallback, see [Client#onWebSocketClose]{@link Client#onWebSocketClose}
* - login [String], see [Client#connectHeaders](../classes/Client.html#connectHeaders)
* - passcode [String], [Client#connectHeaders](../classes/Client.html#connectHeaders)
* - host [String], see [Client#connectHeaders](../classes/Client.html#connectHeaders)
*
* To upgrade, please follow the [Upgrade Guide](../additional-documentation/upgrading.html)
*/
CompatClient.prototype.connect = function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
var out = this._parseConnect.apply(this, args);
if (out[0]) {
this.connectHeaders = out[0];
}
if (out[1]) {
this.onConnect = out[1];
}
if (out[2]) {
this.onStompError = out[2];
}
if (out[3]) {
this.onWebSocketClose = out[3];
}
_super.prototype.activate.call(this);
};
/**
* Available for backward compatibility, please shift to using [Client#deactivate]{@link Client#deactivate}.
*
* **Deprecated**
*
* See:
* [Client#onDisconnect]{@link Client#onDisconnect}, and
* [Client#disconnectHeaders]{@link Client#disconnectHeaders}
*
* To upgrade, please follow the [Upgrade Guide](../additional-documentation/upgrading.html)
*/
CompatClient.prototype.disconnect = function (disconnectCallback, headers) {
if (headers === void 0) { headers = {}; }
if (disconnectCallback) {
this.onDisconnect = disconnectCallback;
}
this.disconnectHeaders = headers;
_super.prototype.deactivate.call(this);
};
/**
* Available for backward compatibility, use [Client#publish]{@link Client#publish}.
*
* Send a message to a named destination. Refer to your STOMP broker documentation for types
* and naming of destinations. The headers will, typically, be available to the subscriber.
* However, there may be special purpose headers corresponding to your STOMP broker.
*
* **Deprecated**, use [Client#publish]{@link Client#publish}
*
* Note: Body must be String. You will need to covert the payload to string in case it is not string (e.g. JSON)
*
* ```javascript
* client.send("/queue/test", {priority: 9}, "Hello, STOMP");
*
* // If you want to send a message with a body, you must also pass the headers argument.
* client.send("/queue/test", {}, "Hello, STOMP");
* ```
*
* To upgrade, please follow the [Upgrade Guide](../additional-documentation/upgrading.html)
*/
CompatClient.prototype.send = function (destination, headers, body) {
if (headers === void 0) { headers = {}; }
if (body === void 0) { body = ''; }
headers = Object.assign({}, headers);
var skipContentLengthHeader = (headers['content-length'] === false);
if (skipContentLengthHeader) {
delete headers['content-length'];
}
this.publish({
destination: destination,
headers: headers,
body: body,
skipContentLengthHeader: skipContentLengthHeader
});
};
Object.defineProperty(CompatClient.prototype, "reconnect_delay", {
/**
* Available for backward compatibility, renamed to [Client#reconnectDelay]{@link Client#reconnectDelay}.
*
* **Deprecated**
*/
set: function (value) {
this.reconnectDelay = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(CompatClient.prototype, "ws", {
/**
* Available for backward compatibility, renamed to [Client#webSocket]{@link Client#webSocket}.
*
* **Deprecated**
*/
get: function () {
return this._webSocket;
},
enumerable: true,
configurable: true
});
Object.defineProperty(CompatClient.prototype, "version", {
/**
* Available for backward compatibility, renamed to [Client#connectedVersion]{@link Client#connectedVersion}.
*
* **Deprecated**
*/
get: function () {
return this.connectedVersion;
},
enumerable: true,
configurable: true
});
Object.defineProperty(CompatClient.prototype, "onreceive", {
/**
* Available for backward compatibility, renamed to [Client#onUnhandledMessage]{@link Client#onUnhandledMessage}.
*
* **Deprecated**
*/
get: function () {
return this.onUnhandledMessage;
},
/**
* Available for backward compatibility, renamed to [Client#onUnhandledMessage]{@link Client#onUnhandledMessage}.
*
* **Deprecated**
*/
set: function (value) {
this.onUnhandledMessage = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(CompatClient.prototype, "onreceipt", {
/**
* Available for backward compatibility, renamed to [Client#onUnhandledReceipt]{@link Client#onUnhandledReceipt}.
* Prefer using [Client#watchForReceipt]{@link Client#watchForReceipt}.
*
* **Deprecated**
*/
get: function () {
return this.onUnhandledReceipt;
},
/**
* Available for backward compatibility, renamed to [Client#onUnhandledReceipt]{@link Client#onUnhandledReceipt}.
*
* **Deprecated**
*/
set: function (value) {
this.onUnhandledReceipt = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(CompatClient.prototype, "heartbeat", {
/**
* Available for backward compatibility, renamed to [Client#heartbeatIncoming]{@link Client#heartbeatIncoming}
* [Client#heartbeatOutgoing]{@link Client#heartbeatOutgoing}.
*
* **Deprecated**
*/
get: function () {
return this._heartbeatInfo;
},
/**
* Available for backward compatibility, renamed to [Client#heartbeatIncoming]{@link Client#heartbeatIncoming}
* [Client#heartbeatOutgoing]{@link Client#heartbeatOutgoing}.
*
* **Deprecated**
*/
set: function (value) {
this.heartbeatIncoming = value.incoming;
this.heartbeatOutgoing = value.outgoing;
},
enumerable: true,
configurable: true
});
return CompatClient;
}(client_1.Client));
exports.CompatClient = CompatClient;
/***/ }),
/***/ "./src/compatibility/heartbeat-info.ts":
/*!*********************************************!*\
!*** ./src/compatibility/heartbeat-info.ts ***!
\*********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
/**
* Part of `@stomp/stompjs`.
*
* @internal
*/
var HeartbeatInfo = /** @class */ (function () {
function HeartbeatInfo(client) {
this.client = client;
}
Object.defineProperty(HeartbeatInfo.prototype, "outgoing", {
get: function () {
return this.client.heartbeatOutgoing;
},
set: function (value) {
this.client.heartbeatOutgoing = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(HeartbeatInfo.prototype, "incoming", {
get: function () {
return this.client.heartbeatIncoming;
},
set: function (value) {
this.client.heartbeatIncoming = value;
},
enumerable: true,
configurable: true
});
return HeartbeatInfo;
}());
exports.HeartbeatInfo = HeartbeatInfo;
/***/ }),
/***/ "./src/compatibility/stomp.ts":
/*!************************************!*\
!*** ./src/compatibility/stomp.ts ***!
\************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var versions_1 = __webpack_require__(/*! ../versions */ "./src/versions.ts");
var compat_client_1 = __webpack_require__(/*! ./compat-client */ "./src/compatibility/compat-client.ts");
/**
* STOMP Class, acts like a factory to create {@link Client}.
*
* Part of `@stomp/stompjs`.
*
* **Deprecated**
*
* It will be removed in next major version. Please switch to {@link Client}.
*/
var Stomp = /** @class */ (function () {
function Stomp() {
}
/**
* This method creates a WebSocket client that is connected to
* the STOMP server located at the url.
*
* ```javascript
* var url = "ws://localhost:61614/stomp";
* var client = Stomp.client(url);
* ```
*
* **Deprecated**
*
* It will be removed in next major version. Please switch to {@link Client}
* using [Client#brokerURL]{@link Client#brokerURL}.
*/
Stomp.client = function (url, protocols) {
// This is a hack to allow another implementation than the standard
// HTML5 WebSocket class.
//
// It is possible to use another class by calling
//
// Stomp.WebSocketClass = MozWebSocket
//
// *prior* to call `Stomp.client()`.
//
// This hack is deprecated and `Stomp.over()` method should be used
// instead.
// See remarks on the function Stomp.over
if (protocols == null) {
protocols = versions_1.Versions.default.protocolVersions();
}
var wsFn = function () {
var klass = Stomp.WebSocketClass || WebSocket;
return new klass(url, protocols);
};
return new compat_client_1.CompatClient(wsFn);
};
/**
* This method is an alternative to [Stomp#client]{@link Stomp#client} to let the user
* specify the WebSocket to use (either a standard HTML5 WebSocket or
* a similar object).
*
* In order to support reconnection, the function Client._connect should be callable more than once.
* While reconnecting
* a new instance of underlying transport (TCP Socket, WebSocket or SockJS) will be needed. So, this function
* alternatively allows passing a function that should return a new instance of the underlying socket.
*
* ```javascript
* var client = Stomp.over(function(){
* return new WebSocket('ws://localhost:15674/ws')
* });
* ```
*
* **Deprecated**
*
* It will be removed in next major version. Please switch to {@link Client}
* using [Client#webSocketFactory]{@link Client#webSocketFactory}.
*/
Stomp.over = function (ws) {
var wsFn;
if (typeof (ws) === 'function') {
wsFn = ws;
}
else {
console.warn('Stomp.over did not receive a factory, auto reconnect will not work. ' +
'Please see https://stomp-js.github.io/api-docs/latest/classes/Stomp.html#over');
wsFn = function () { return ws; };
}
return new compat_client_1.CompatClient(wsFn);
};
/**
* In case you need to use a non standard class for WebSocket.
*
* For example when using within NodeJS environment:
*
* ```javascript
* StompJs = require('../../esm5/');
* Stomp = StompJs.Stomp;
* Stomp.WebSocketClass = require('websocket').w3cwebsocket;
* ```
*
* **Deprecated**
*
*
* It will be removed in next major version. Please switch to {@link Client}
* using [Client#webSocketFactory]{@link Client#webSocketFactory}.
*/
// tslint:disable-next-line:variable-name
Stomp.WebSocketClass = null;
return Stomp;
}());
exports.Stomp = Stomp;
/***/ }),
/***/ "./src/frame-impl.ts":
/*!***************************!*\
!*** ./src/frame-impl.ts ***!
\***************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var byte_1 = __webpack_require__(/*! ./byte */ "./src/byte.ts");
/**
* Frame class represents a STOMP frame.
*
* @internal
*/
var FrameImpl = /** @class */ (function () {
/**
* Frame constructor. `command`, `headers` and `body` are available as properties.
*
* @internal
*/
function FrameImpl(params) {
var command = params.command, headers = params.headers, body = params.body, binaryBody = params.binaryBody, escapeHeaderValues = params.escapeHeaderValues, skipContentLengthHeader = params.skipContentLengthHeader;
this.command = command;
this.headers = Object.assign({}, headers || {});
if (binaryBody) {
this._binaryBody = binaryBody;
this.isBinaryBody = true;
}
else {
this._body = body || '';
this.isBinaryBody = false;
}
this.escapeHeaderValues = escapeHeaderValues || false;
this.skipContentLengthHeader = skipContentLengthHeader || false;
}
Object.defineProperty(FrameImpl.prototype, "body", {
/**
* body of the frame
*/
get: function () {
if (!this._body && this.isBinaryBody) {
this._body = new TextDecoder().decode(this._binaryBody);
}
return this._body;
},
enumerable: true,
configurable: true
});
Object.defineProperty(FrameImpl.prototype, "binaryBody", {
/**
* body as Uint8Array
*/
get: function () {
if (!this._binaryBody && !this.isBinaryBody) {
this._binaryBody = new TextEncoder().encode(this._body);
}
return this._binaryBody;
},
enumerable: true,
configurable: true
});
/**
* deserialize a STOMP Frame from raw data.
*
* @internal
*/
FrameImpl.fromRawFrame = function (rawFrame, escapeHeaderValues) {
var headers = {};
var trim = function (str) { return str.replace(/^\s+|\s+$/g, ''); };
// In case of repeated headers, as per standards, first value need to be used
for (var _i = 0, _a = rawFrame.headers.reverse(); _i < _a.length; _i++) {
var header = _a[_i];
var idx = header.indexOf(':');
var key = trim(header[0]);
var value = trim(header[1]);
if (escapeHeaderValues && (rawFrame.command !== 'CONNECT') && (rawFrame.command !== 'CONNECTED')) {
value = FrameImpl.hdrValueUnEscape(value);
}
headers[key] = value;
}
return new FrameImpl({
command: rawFrame.command,
headers: headers,
binaryBody: rawFrame.binaryBody,
escapeHeaderValues: escapeHeaderValues
});
};
/**
* @internal
*/
FrameImpl.prototype.toString = function () {
return this.serializeCmdAndHeaders();
};
/**
* serialize this Frame in a format suitable to be passed to WebSocket.
* If the body is string the output will be string.
* If the body is binary (i.e. of type Unit8Array) it will be serialized to ArrayBuffer.
*
* @internal
*/
FrameImpl.prototype.serialize = function () {
var cmdAndHeaders = this.serializeCmdAndHeaders();
if (this.isBinaryBody) {
return FrameImpl.toUnit8Array(cmdAndHeaders, this._binaryBody).buffer;
}
else {
return cmdAndHeaders + this._body + byte_1.BYTE.NULL;
}
};
FrameImpl.prototype.serializeCmdAndHeaders = function () {
var lines = [this.command];
if (this.skipContentLengthHeader) {
delete this.headers['content-length'];
}
for (var _i = 0, _a = Object.keys(this.headers || {}); _i < _a.length; _i++) {
var name_1 = _a[_i];
var value = this.headers[name_1];
if (this.escapeHeaderValues && (this.command !== 'CONNECT') && (this.command !== 'CONNECTED')) {
lines.push(name_1 + ":" + FrameImpl.hdrValueEscape("" + value));
}
else {
lines.push(name_1 + ":" + value);
}
}
if (this.isBinaryBody || (!this.isBodyEmpty() && !this.skipContentLengthHeader)) {
lines.push("content-length:" + this.bodyLength());
}
return lines.join(byte_1.BYTE.LF) + byte_1.BYTE.LF + byte_1.BYTE.LF;
};
FrameImpl.prototype.isBodyEmpty = function () {
return this.bodyLength() === 0;
};
FrameImpl.prototype.bodyLength = function () {
var binaryBody = this.binaryBody;
return binaryBody ? binaryBody.length : 0;
};
/**
* Compute the size of a UTF-8 string by counting its number of bytes
* (and not the number of characters composing the string)
*/
FrameImpl.sizeO