@synerty/vortexjs
Version:
Custom observable data serialisation and routing based on Angular 2+
112 lines • 13.9 kB
JavaScript
import { Inject, Injectable, NgZone } from "@angular/core";
import { 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);
export class VortexStatusService {
zone;
isOnline = new Subject();
httpSessionLoggedOut = new Subject();
debug = new Subject();
info = new Subject();
warning = new Subject();
errors = new Subject();
connectionInfo = new Subject();
connectionError = new Subject();
wasOnline = false;
constructor(zone) {
this.zone = zone;
}
get snapshot() {
return {
isOnline: this.wasOnline,
queuedActionCount: this.lastQueuedTupleActions,
};
}
setOnline(online) {
if (online === this.wasOnline)
return;
logDebug(dateStr() + "Vortex Status - online: " + online);
this.wasOnline = online;
this.zone.run(() => {
this.isOnline.next(online);
});
}
setHttpSessionLoggedOut() {
logDebug(dateStr() + "Vortex Status - Http Service is Logged Out");
this.zone.run(() => {
this.httpSessionLoggedOut.next();
});
}
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.zone.run(() => {
this.queuedActionCount.next(count);
});
}
logDebug(message) {
logDebug(dateStr() + "Vortex Status - debug: " + message);
this.zone.run(() => {
this.debug.next(message);
});
}
logInfo(message) {
logInfo(dateStr() + "Vortex Status - info: " + message);
this.zone.run(() => {
this.info.next(message);
});
}
logWarning(message) {
logWarning(dateStr() + "Vortex Status - warning: " + message);
this.zone.run(() => {
this.warning.next(message);
});
}
logError(message) {
logError(dateStr() + "Vortex Status - error: " + message);
this.zone.run(() => {
this.errors.next(message);
});
}
logConnectionInfo(message) {
logInfo(dateStr() + "Vortex Connection Status - info: " + message);
this.zone.run(() => {
this.connectionInfo.next(message);
});
}
logConnectionError(message) {
logError(dateStr() + "Vortex Connection Status - error: " + message);
this.zone.run(() => {
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 });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: VortexStatusService, decorators: [{
type: Injectable
}], ctorParameters: function () { return [{ type: i0.NgZone, decorators: [{
type: Inject,
args: [NgZone]
}] }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVm9ydGV4U3RhdHVzU2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy92b3J0ZXgvVm9ydGV4U3RhdHVzU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLFlBQVksQ0FBQzs7QUFFM0MscUJBQXFCO0FBQ3JCLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxLQUFLO0lBQzFCLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFDOUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzNDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxLQUFLO0lBQzFCLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFDOUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pDLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxJQUFJO0lBQzNCLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUM7SUFDN0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBUWpDLE1BQU0sT0FBTyxtQkFBbUI7SUFZUTtJQVgzQixRQUFRLEdBQXFCLElBQUksT0FBTyxFQUFXLENBQUM7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QWFNLE1BQU07MkJBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgTmdab25lIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgYmluZCwgZGF0ZVN0ciB9IGZyb20gXCIuL1V0aWxNaXNjXCI7XG5cbi8vIE5vZGUgY29tcGF0aWJpbGl0eVxuY29uc3QgbG9nRGVidWcgPSBjb25zb2xlLmRlYnVnXG4gICAgPyBiaW5kKGNvbnNvbGUsIGNvbnNvbGUuZGVidWcpXG4gICAgOiBiaW5kKGNvbnNvbGUsIGNvbnNvbGUubG9nKTtcbmNvbnN0IGxvZ0luZm8gPSBiaW5kKGNvbnNvbGUsIGNvbnNvbGUubG9nKTtcbmNvbnN0IGxvZ0Vycm9yID0gY29uc29sZS5lcnJvclxuICAgID8gYmluZChjb25zb2xlLCBjb25zb2xlLmVycm9yKVxuICAgIDogYmluZChjb25zb2xlLCBjb25zb2xlLmxvZyk7XG5jb25zdCBsb2dXYXJuaW5nID0gY29uc29sZS53YXJuXG4gICAgPyBiaW5kKGNvbnNvbGUsIGNvbnNvbGUud2FybilcbiAgICA6IGJpbmQoY29uc29sZSwgY29uc29sZS5sb2cpO1xuXG5leHBvcnQgaW50ZXJmYWNlIFZvcnRleFN0YXR1c1NlcnZpY2VTbmFwc2hvdCB7XG4gICAgaXNPbmxpbmU6IGJvb2xlYW47XG4gICAgcXVldWVkQWN0aW9uQ291bnQ6IG51bWJlcjtcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFZvcnRleFN0YXR1c1NlcnZpY2Uge1xuICAgIHJlYWRvbmx5IGlzT25saW5lOiBTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcbiAgICByZWFkb25seSBodHRwU2Vzc2lvbkxvZ2dlZE91dDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gICAgcmVhZG9ubHkgZGVidWc6IFN1YmplY3Q8c3RyaW5nPiA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcbiAgICByZWFkb25seSBpbmZvOiBTdWJqZWN0PHN0cmluZz4gPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG4gICAgcmVhZG9ubHkgd2FybmluZzogU3ViamVjdDxzdHJpbmc+ID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuICAgIHJlYWRvbmx5IGVycm9yczogU3ViamVjdDxzdHJpbmc+ID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuICAgIHJlYWRvbmx5IGNvbm5lY3Rpb25JbmZvOiBTdWJqZWN0PHN0cmluZz4gPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG4gICAgcmVhZG9ubHkgY29ubmVjdGlvbkVycm9yOiBTdWJqZWN0PHN0cmluZz4gPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG5cbiAgICBwcml2YXRlIHdhc09ubGluZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IoQEluamVjdChOZ1pvbmUpIHByaXZhdGUgem9uZTogTmdab25lKSB7fVxuXG4gICAgZ2V0IHNuYXBzaG90KCk6IFZvcnRleFN0YXR1c1NlcnZpY2VTbmFwc2hvdCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpc09ubGluZTogdGhpcy53YXNPbmxpbmUsXG4gICAgICAgICAgICBxdWV1ZWRBY3Rpb25Db3VudDogdGhpcy5sYXN0UXVldWVkVHVwbGVBY3Rpb25zLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHNldE9ubGluZShvbmxpbmU6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKG9ubGluZSA9PT0gdGhpcy53YXNPbmxpbmUpIHJldHVybjtcblxuICAgICAgICBsb2dEZWJ1ZyhkYXRlU3RyKCkgKyBcIlZvcnRleCBTdGF0dXMgLSBvbmxpbmU6IFwiICsgb25saW5lKTtcblxuICAgICAgICB0aGlzLndhc09ubGluZSA9IG9ubGluZTtcbiAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmlzT25saW5lLm5leHQob25saW5lKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0SHR0cFNlc3Npb25Mb2dnZWRPdXQoKSB7XG4gICAgICAgIGxvZ0RlYnVnKGRhdGVTdHIoKSArIFwiVm9ydGV4IFN0YXR1cyAtIEh0dHAgU2VydmljZSBpcyBMb2dnZWQgT3V0XCIpO1xuXG4gICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5odHRwU2Vzc2lvbkxvZ2dlZE91dC5uZXh0KCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHF1ZXVlZEFjdGlvbkNvdW50OiBTdWJqZWN0PG51bWJlcj4gPSBuZXcgU3ViamVjdDxudW1iZXI+KCk7XG4gICAgbGFzdFF1ZXVlZFR1cGxlQWN0aW9uczogbnVtYmVyID0gMDtcblxuICAgIGluY3JlbWVudFF1ZXVlZEFjdGlvbkNvdW50KCkge1xuICAgICAgICB0aGlzLnNldFF1ZXVlZEFjdGlvbkNvdW50KHRoaXMubGFzdFF1ZXVlZFR1cGxlQWN0aW9ucyArIDEpO1xuICAgIH1cblxuICAgIGRlY3JlbWVudFF1ZXVlZEFjdGlvbkNvdW50KCkge1xuICAgICAgICB0aGlzLnNldFF1ZXVlZEFjdGlvbkNvdW50KHRoaXMubGFzdFF1ZXVlZFR1cGxlQWN0aW9ucyAtIDEpO1xuICAgIH1cblxuICAgIHNldFF1ZXVlZEFjdGlvbkNvdW50KGNvdW50OiBudW1iZXIpIHtcbiAgICAgICAgaWYgKGNvdW50ID09PSB0aGlzLmxhc3RRdWV1ZWRUdXBsZUFjdGlvbnMpIHJldHVybjtcblxuICAgICAgICB0aGlzLmxhc3RRdWV1ZWRUdXBsZUFjdGlvbnMgPSBjb3VudDtcbiAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnF1ZXVlZEFjdGlvbkNvdW50Lm5leHQoY291bnQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBsb2dEZWJ1ZyhtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgbG9nRGVidWcoZGF0ZVN0cigpICsgXCJWb3J0ZXggU3RhdHVzIC0gZGVidWc6IFwiICsgbWVzc2FnZSk7XG4gICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5kZWJ1Zy5uZXh0KG1lc3NhZ2UpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBsb2dJbmZvKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICBsb2dJbmZvKGRhdGVTdHIoKSArIFwiVm9ydGV4IFN0YXR1cyAtIGluZm86IFwiICsgbWVzc2FnZSk7XG4gICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5pbmZvLm5leHQobWVzc2FnZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGxvZ1dhcm5pbmcobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIGxvZ1dhcm5pbmcoZGF0ZVN0cigpICsgXCJWb3J0ZXggU3RhdHVzIC0gd2FybmluZzogXCIgKyBtZXNzYWdlKTtcbiAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLndhcm5pbmcubmV4dChtZXNzYWdlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbG9nRXJyb3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIGxvZ0Vycm9yKGRhdGVTdHIoKSArIFwiVm9ydGV4IFN0YXR1cyAtIGVycm9yOiBcIiArIG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZXJyb3JzLm5leHQobWVzc2FnZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGxvZ0Nvbm5lY3Rpb25JbmZvKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICBsb2dJbmZvKGRhdGVTdHIoKSArIFwiVm9ydGV4IENvbm5lY3Rpb24gU3RhdHVzIC0gaW5mbzogXCIgKyBtZXNzYWdlKTtcbiAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25JbmZvLm5leHQobWVzc2FnZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGxvZ0Nvbm5lY3Rpb25FcnJvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgbG9nRXJyb3IoZGF0ZVN0cigpICsgXCJWb3J0ZXggQ29ubmVjdGlvbiBTdGF0dXMgLSBlcnJvcjogXCIgKyBtZXNzYWdlKTtcbiAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25FcnJvci5uZXh0KG1lc3NhZ2UpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=