@synerty/vortexjs
Version:
Custom observable data serialisation and routing based on Angular 2+
134 lines • 16.9 kB
JavaScript
import { Inject, Injectable, NgZone } from "@angular/core";
import { BehaviorSubject, Subject } from "rxjs";
import { bind, dateStr } from "./UtilMisc";
import * as i0 from "@angular/core";
// Node compatibility
const logDebug = console.debug
? bind(console, console.debug)
: bind(console, console.log);
const logInfo = bind(console, console.log);
const logError = console.error
? bind(console, console.error)
: bind(console, console.log);
const logWarning = console.warn
? bind(console, console.warn)
: bind(console, console.log);
/**
* Enum representing the different states of the Vortex application.
* Disabled: The vortex if offline and disconnected
* Reconnecting: The vortex is not online, but is in the reconnecting state
* machine.
* Online: The websocket is online and connected
* NoNetwork: The network is offline
* NetworkOnlineNoWebsocketResource:
* The HTTP service is online, but not serving
* the websocket upgrades.
* This usually means the service is logged out.
*/
export var VortexStateEnum;
(function (VortexStateEnum) {
VortexStateEnum[VortexStateEnum["Disabled"] = 1] = "Disabled";
VortexStateEnum[VortexStateEnum["Reconnecting"] = 2] = "Reconnecting";
VortexStateEnum[VortexStateEnum["Online"] = 3] = "Online";
VortexStateEnum[VortexStateEnum["NoNetwork"] = 4] = "NoNetwork";
VortexStateEnum[VortexStateEnum["NetworkOnlineNoWebsocketResource"] = 5] = "NetworkOnlineNoWebsocketResource";
})(VortexStateEnum || (VortexStateEnum = {}));
export class VortexStatusService {
zone;
_websocketState$ = new BehaviorSubject(VortexStateEnum.NoNetwork);
_isOnline$ = new BehaviorSubject(false);
debug = new Subject();
info = new Subject();
warning = new Subject();
errors = new Subject();
connectionInfo = new Subject();
connectionError = new Subject();
constructor(zone) {
this.zone = zone;
}
get snapshot() {
return {
isOnline: this.websocketState == VortexStateEnum.Online,
queuedActionCount: this.lastQueuedTupleActions,
};
}
get websocketState() {
return this._websocketState$.getValue();
}
get websocketStateObservable() {
return this._websocketState$.asObservable();
}
get isOnline() {
return this._isOnline$.asObservable();
}
setVortexState(state) {
logDebug(dateStr() +
"VortexStatusService.setWebsocketState " +
` old state = ${this.websocketState}` +
` new state = ${state}`);
// Don't let reconnecting clobber NoNetwork
if (this.websocketState === VortexStateEnum.NoNetwork &&
state === VortexStateEnum.Reconnecting) {
logDebug(dateStr() +
"VortexStatusService.setWebsocketState skipping change from" +
" NoNetwork to Reconnecting");
}
else {
this._websocketState$.next(state);
}
const isOnline = state === VortexStateEnum.Online;
if (this._isOnline$.getValue() !== isOnline) {
this._isOnline$.next(isOnline);
}
}
queuedActionCount = new Subject();
lastQueuedTupleActions = 0;
incrementQueuedActionCount() {
this.setQueuedActionCount(this.lastQueuedTupleActions + 1);
}
decrementQueuedActionCount() {
this.setQueuedActionCount(this.lastQueuedTupleActions - 1);
}
setQueuedActionCount(count) {
if (count === this.lastQueuedTupleActions)
return;
this.lastQueuedTupleActions = count;
this.queuedActionCount.next(count);
}
logDebug(message) {
logDebug(dateStr() + "Vortex Status - debug: " + message);
this.debug.next(message);
}
logInfo(message) {
logInfo(dateStr() + "Vortex Status - info: " + message);
this.info.next(message);
}
logWarning(message) {
logWarning(dateStr() + "Vortex Status - warning: " + message);
this.warning.next(message);
}
logError(message) {
logError(dateStr() + "Vortex Status - error: " + message);
this.errors.next(message);
}
logConnectionInfo(message) {
logInfo(dateStr() + "Vortex Connection Status - info: " + message);
this.connectionInfo.next(message);
}
logConnectionError(message) {
logError(dateStr() + "Vortex Connection Status - error: " + message);
this.connectionError.next(message);
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: VortexStatusService, deps: [{ token: NgZone }], target: i0.ɵɵFactoryTarget.Injectable });
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: VortexStatusService, providedIn: "root" });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: VortexStatusService, decorators: [{
type: Injectable,
args: [{
providedIn: "root",
}]
}], ctorParameters: function () { return [{ type: i0.NgZone, decorators: [{
type: Inject,
args: [NgZone]
}] }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVm9ydGV4U3RhdHVzU2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy92b3J0ZXgvVm9ydGV4U3RhdHVzU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxFQUFFLGVBQWUsRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUQsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxZQUFZLENBQUM7O0FBRTNDLHFCQUFxQjtBQUNyQixNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsS0FBSztJQUMxQixDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDO0lBQzlCLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMzQyxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsS0FBSztJQUMxQixDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDO0lBQzlCLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQyxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsSUFBSTtJQUMzQixDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDO0lBQzdCLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQU9qQzs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sQ0FBTixJQUFZLGVBTVg7QUFORCxXQUFZ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QkFBbUIsY0FGaEIsTUFBTTs7NEZBRVQsbUJBQW1CO2tCQUgvQixVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQjs7MEJBYWdCLE1BQU07MkJBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgTmdab25lIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBiaW5kLCBkYXRlU3RyIH0gZnJvbSBcIi4vVXRpbE1pc2NcIjtcblxuLy8gTm9kZSBjb21wYXRpYmlsaXR5XG5jb25zdCBsb2dEZWJ1ZyA9IGNvbnNvbGUuZGVidWdcbiAgICA/IGJpbmQoY29uc29sZSwgY29uc29sZS5kZWJ1ZylcbiAgICA6IGJpbmQoY29uc29sZSwgY29uc29sZS5sb2cpO1xuY29uc3QgbG9nSW5mbyA9IGJpbmQoY29uc29sZSwgY29uc29sZS5sb2cpO1xuY29uc3QgbG9nRXJyb3IgPSBjb25zb2xlLmVycm9yXG4gICAgPyBiaW5kKGNvbnNvbGUsIGNvbnNvbGUuZXJyb3IpXG4gICAgOiBiaW5kKGNvbnNvbGUsIGNvbnNvbGUubG9nKTtcbmNvbnN0IGxvZ1dhcm5pbmcgPSBjb25zb2xlLndhcm5cbiAgICA/IGJpbmQoY29uc29sZSwgY29uc29sZS53YXJuKVxuICAgIDogYmluZChjb25zb2xlLCBjb25zb2xlLmxvZyk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVm9ydGV4U3RhdHVzU2VydmljZVNuYXBzaG90IHtcbiAgICBpc09ubGluZTogYm9vbGVhbjtcbiAgICBxdWV1ZWRBY3Rpb25Db3VudDogbnVtYmVyO1xufVxuXG4vKipcbiAqIEVudW0gcmVwcmVzZW50aW5nIHRoZSBkaWZmZXJlbnQgc3RhdGVzIG9mIHRoZSBWb3J0ZXggYXBwbGljYXRpb24uXG4gKiBEaXNhYmxlZDogVGhlIHZvcnRleCBpZiBvZmZsaW5lIGFuZCBkaXNjb25uZWN0ZWRcbiAqIFJlY29ubmVjdGluZzogVGhlIHZvcnRleCBpcyBub3Qgb25saW5lLCBidXQgaXMgaW4gdGhlIHJlY29ubmVjdGluZyBzdGF0ZVxuICogbWFjaGluZS5cbiAqIE9ubGluZTogVGhlIHdlYnNvY2tldCBpcyBvbmxpbmUgYW5kIGNvbm5lY3RlZFxuICogTm9OZXR3b3JrOiBUaGUgbmV0d29yayBpcyBvZmZsaW5lXG4gKiBOZXR3b3JrT25saW5lTm9XZWJzb2NrZXRSZXNvdXJjZTpcbiAqICAgICBUaGUgSFRUUCBzZXJ2aWNlIGlzIG9ubGluZSwgYnV0IG5vdCBzZXJ2aW5nXG4gKiAgICAgdGhlIHdlYnNvY2tldCB1cGdyYWRlcy5cbiAqICAgICBUaGlzIHVzdWFsbHkgbWVhbnMgdGhlIHNlcnZpY2UgaXMgbG9nZ2VkIG91dC5cbiAqL1xuZXhwb3J0IGVudW0gVm9ydGV4U3RhdGVFbnVtIHtcbiAgICBEaXNhYmxlZCA9IDEsXG4gICAgUmVjb25uZWN0aW5nLFxuICAgIE9ubGluZSxcbiAgICBOb05ldHdvcmssXG4gICAgTmV0d29ya09ubGluZU5vV2Vic29ja2V0UmVzb3VyY2UsXG59XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiBcInJvb3RcIixcbn0pXG5leHBvcnQgY2xhc3MgVm9ydGV4U3RhdHVzU2VydmljZSB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfd2Vic29ja2V0U3RhdGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxWb3J0ZXhTdGF0ZUVudW0+KFxuICAgICAgICBWb3J0ZXhTdGF0ZUVudW0uTm9OZXR3b3JrLFxuICAgICk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfaXNPbmxpbmUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gICAgcmVhZG9ubHkgZGVidWc6IFN1YmplY3Q8c3RyaW5nPiA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcbiAgICByZWFkb25seSBpbmZvOiBTdWJqZWN0PHN0cmluZz4gPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG4gICAgcmVhZG9ubHkgd2FybmluZzogU3ViamVjdDxzdHJpbmc+ID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuICAgIHJlYWRvbmx5IGVycm9yczogU3ViamVjdDxzdHJpbmc+ID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuICAgIHJlYWRvbmx5IGNvbm5lY3Rpb25JbmZvOiBTdWJqZWN0PHN0cmluZz4gPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG4gICAgcmVhZG9ubHkgY29ubmVjdGlvbkVycm9yOiBTdWJqZWN0PHN0cmluZz4gPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG5cbiAgICBjb25zdHJ1Y3RvcihASW5qZWN0KE5nWm9uZSkgcHJpdmF0ZSB6b25lOiBOZ1pvbmUpIHt9XG5cbiAgICBnZXQgc25hcHNob3QoKTogVm9ydGV4U3RhdHVzU2VydmljZVNuYXBzaG90IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlzT25saW5lOiB0aGlzLndlYnNvY2tldFN0YXRlID09IFZvcnRleFN0YXRlRW51bS5PbmxpbmUsXG4gICAgICAgICAgICBxdWV1ZWRBY3Rpb25Db3VudDogdGhpcy5sYXN0UXVldWVkVHVwbGVBY3Rpb25zLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGdldCB3ZWJzb2NrZXRTdGF0ZSgpOiBWb3J0ZXhTdGF0ZUVudW0ge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2Vic29ja2V0U3RhdGUkLmdldFZhbHVlKCk7XG4gICAgfVxuXG4gICAgZ2V0IHdlYnNvY2tldFN0YXRlT2JzZXJ2YWJsZSgpOiBPYnNlcnZhYmxlPFZvcnRleFN0YXRlRW51bT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2Vic29ja2V0U3RhdGUkLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIGdldCBpc09ubGluZSgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzT25saW5lJC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICBzZXRWb3J0ZXhTdGF0ZShzdGF0ZTogVm9ydGV4U3RhdGVFbnVtKSB7XG4gICAgICAgIGxvZ0RlYnVnKFxuICAgICAgICAgICAgZGF0ZVN0cigpICtcbiAgICAgICAgICAgICAgICBcIlZvcnRleFN0YXR1c1NlcnZpY2Uuc2V0V2Vic29ja2V0U3RhdGUgXCIgK1xuICAgICAgICAgICAgICAgIGAgb2xkIHN0YXRlID0gJHt0aGlzLndlYnNvY2tldFN0YXRlfWAgK1xuICAgICAgICAgICAgICAgIGAgbmV3IHN0YXRlID0gJHtzdGF0ZX1gLFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIERvbid0IGxldCByZWNvbm5lY3RpbmcgY2xvYmJlciBOb05ldHdvcmtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy53ZWJzb2NrZXRTdGF0ZSA9PT0gVm9ydGV4U3RhdGVFbnVtLk5vTmV0d29yayAmJlxuICAgICAgICAgICAgc3RhdGUgPT09IFZvcnRleFN0YXRlRW51bS5SZWNvbm5lY3RpbmdcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBsb2dEZWJ1ZyhcbiAgICAgICAgICAgICAgICBkYXRlU3RyKCkgK1xuICAgICAgICAgICAgICAgICAgICBcIlZvcnRleFN0YXR1c1NlcnZpY2Uuc2V0V2Vic29ja2V0U3RhdGUgc2tpcHBpbmcgY2hhbmdlIGZyb21cIiArXG4gICAgICAgICAgICAgICAgICAgIFwiIE5vTmV0d29yayB0byBSZWNvbm5lY3RpbmdcIixcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl93ZWJzb2NrZXRTdGF0ZSQubmV4dChzdGF0ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc09ubGluZSA9IHN0YXRlID09PSBWb3J0ZXhTdGF0ZUVudW0uT25saW5lO1xuICAgICAgICBpZiAodGhpcy5faXNPbmxpbmUkLmdldFZhbHVlKCkgIT09IGlzT25saW5lKSB7XG4gICAgICAgICAgICB0aGlzLl9pc09ubGluZSQubmV4dChpc09ubGluZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBxdWV1ZWRBY3Rpb25Db3VudDogU3ViamVjdDxudW1iZXI+ID0gbmV3IFN1YmplY3Q8bnVtYmVyPigpO1xuICAgIGxhc3RRdWV1ZWRUdXBsZUFjdGlvbnM6IG51bWJlciA9IDA7XG5cbiAgICBpbmNyZW1lbnRRdWV1ZWRBY3Rpb25Db3VudCgpIHtcbiAgICAgICAgdGhpcy5zZXRRdWV1ZWRBY3Rpb25Db3VudCh0aGlzLmxhc3RRdWV1ZWRUdXBsZUFjdGlvbnMgKyAxKTtcbiAgICB9XG5cbiAgICBkZWNyZW1lbnRRdWV1ZWRBY3Rpb25Db3VudCgpIHtcbiAgICAgICAgdGhpcy5zZXRRdWV1ZWRBY3Rpb25Db3VudCh0aGlzLmxhc3RRdWV1ZWRUdXBsZUFjdGlvbnMgLSAxKTtcbiAgICB9XG5cbiAgICBzZXRRdWV1ZWRBY3Rpb25Db3VudChjb3VudDogbnVtYmVyKSB7XG4gICAgICAgIGlmIChjb3VudCA9PT0gdGhpcy5sYXN0UXVldWVkVHVwbGVBY3Rpb25zKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5sYXN0UXVldWVkVHVwbGVBY3Rpb25zID0gY291bnQ7XG4gICAgICAgIHRoaXMucXVldWVkQWN0aW9uQ291bnQubmV4dChjb3VudCk7XG4gICAgfVxuXG4gICAgbG9nRGVidWcobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIGxvZ0RlYnVnKGRhdGVTdHIoKSArIFwiVm9ydGV4IFN0YXR1cyAtIGRlYnVnOiBcIiArIG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLmRlYnVnLm5leHQobWVzc2FnZSk7XG4gICAgfVxuXG4gICAgbG9nSW5mbyhtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgbG9nSW5mbyhkYXRlU3RyKCkgKyBcIlZvcnRleCBTdGF0dXMgLSBpbmZvOiBcIiArIG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLmluZm8ubmV4dChtZXNzYWdlKTtcbiAgICB9XG5cbiAgICBsb2dXYXJuaW5nKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICBsb2dXYXJuaW5nKGRhdGVTdHIoKSArIFwiVm9ydGV4IFN0YXR1cyAtIHdhcm5pbmc6IFwiICsgbWVzc2FnZSk7XG4gICAgICAgIHRoaXMud2FybmluZy5uZXh0KG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIGxvZ0Vycm9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICBsb2dFcnJvcihkYXRlU3RyKCkgKyBcIlZvcnRleCBTdGF0dXMgLSBlcnJvcjogXCIgKyBtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5lcnJvcnMubmV4dChtZXNzYWdlKTtcbiAgICB9XG5cbiAgICBsb2dDb25uZWN0aW9uSW5mbyhtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgbG9nSW5mbyhkYXRlU3RyKCkgKyBcIlZvcnRleCBDb25uZWN0aW9uIFN0YXR1cyAtIGluZm86IFwiICsgbWVzc2FnZSk7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbkluZm8ubmV4dChtZXNzYWdlKTtcbiAgICB9XG5cbiAgICBsb2dDb25uZWN0aW9uRXJyb3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIGxvZ0Vycm9yKGRhdGVTdHIoKSArIFwiVm9ydGV4IENvbm5lY3Rpb24gU3RhdHVzIC0gZXJyb3I6IFwiICsgbWVzc2FnZSk7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbkVycm9yLm5leHQobWVzc2FnZSk7XG4gICAgfVxufVxuIl19