UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

92 lines 12.7 kB
import { Injectable } from '@angular/core'; import { Realtime } from '@c8y/client'; import { Observable } from 'rxjs'; import { distinctUntilChanged, share, shareReplay } from 'rxjs/operators'; import * as i0 from "@angular/core"; import * as i1 from "@c8y/client"; /** * Service (providedIn root) that ensures to only create a single realtime subscription for each channel */ export class RealtimeSubjectService { constructor(realtime) { this.realtime = realtime; this.subjects$ = new Map(); this.reconnect$ = this.createObservableForReconnect().pipe(share()); this.connectionStatus$ = this.createObservableForConnectionStatus().pipe(distinctUntilChanged(), shareReplay({ refCount: true, bufferSize: 1 })); } getObservableForChannel(channel) { if (this.subjects$.has(channel)) { return this.subjects$.get(channel); } const observable$ = this.createObservableForChannel(channel, this.realtime); const sharedObservable$ = observable$.pipe(share()); this.subjects$.set(channel, sharedObservable$); return sharedObservable$; } createObservableForChannel(channel, realtime) { return new Observable(observer => { let realtimeSubscription = realtime.subscribe(channel, msg => { const data = { channel: msg.channel, data: msg.data.data, id: msg.id, realtimeAction: msg.data.realtimeAction }; observer.next(data); }); /** * In (rare) case of a re-handshake, resubscribe valid subscriptions. * @see https://docs.cometd.org/current/reference/#_javascript_subscribe_resubscribe */ const reconnectSubscription = this.reconnect$.subscribe(() => { try { realtimeSubscription = this.realtime.resubscribe(realtimeSubscription); } catch (e) { console.warn(`Failed to resubscribe to channel: "${channel}" after reconnect.`, e); observer.error(e); } }); return { unsubscribe: () => { reconnectSubscription.unsubscribe(); realtime.unsubscribe(realtimeSubscription); } }; }); } createObservableForReconnect() { return new Observable(observer => { const handle = this.realtime.addHandshakeListener(msg => { if (msg.successful && msg.reestablish) { observer.next(); } }); return { unsubscribe: () => { this.realtime.removeListener(handle); } }; }); } createObservableForConnectionStatus() { return new Observable(observer => { observer.next(!this.realtime.isDisconnected() ? 'connected' : 'disconnected'); const handle = this.realtime.addConnectListener(msg => { observer.next(msg.successful ? 'connected' : 'disconnected'); }); return { unsubscribe: () => { this.realtime.removeListener(handle); } }; }); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RealtimeSubjectService, deps: [{ token: i1.Realtime }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RealtimeSubjectService, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RealtimeSubjectService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: () => [{ type: i1.Realtime }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhbHRpbWUtc3ViamVjdC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vY29yZS9yZWFsdGltZS9yZWFsdGltZS1zdWJqZWN0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbEMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBRzFFOztHQUVHO0FBRUgsTUFBTSxPQUFPLHNCQUFzQjtJQUtqQyxZQUFzQixRQUFrQjtRQUFsQixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBRmhDLGNBQVMsR0FBRyxJQUFJLEdBQUcsRUFBZ0QsQ0FBQztRQUcxRSxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3BFLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsbUNBQW1DLEVBQUUsQ0FBQyxJQUFJLENBQ3RFLG9CQUFvQixFQUFFLEVBQ3RCLFdBQVcsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQy9DLENBQUM7SUFDSixDQUFDO0lBRUQsdUJBQXVCLENBQUksT0FBZTtRQUN4QyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDaEMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQW1DLENBQUM7UUFDdkUsQ0FBQztRQUNELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FB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QyxDQUFDLENBQUM7WUFDSCxPQUFPO2dCQUNMLFdBQVcsRUFBRSxHQUFHLEVBQUU7b0JBQ2hCLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUN2QyxDQUFDO2FBQ0YsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzsrR0F4RlUsc0JBQXNCO21IQUF0QixzQkFBc0IsY0FEVCxNQUFNOzs0RkFDbkIsc0JBQXNCO2tCQURsQyxVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJlYWx0aW1lIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIHNoYXJlLCBzaGFyZVJlcGxheSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFJlYWx0aW1lTWVzc2FnZSB9IGZyb20gJy4vcmVhbHRpbWUubW9kZWwnO1xuXG4vKipcbiAqIFNlcnZpY2UgKHByb3ZpZGVkSW4gcm9vdCkgdGhhdCBlbnN1cmVzIHRvIG9ubHkgY3JlYXRlIGEgc2luZ2xlIHJlYWx0aW1lIHN1YnNjcmlwdGlvbiBmb3IgZWFjaCBjaGFubmVsXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgUmVhbHRpbWVTdWJqZWN0U2VydmljZSB7XG4gIHJlY29ubmVjdCQ6IE9ic2VydmFibGU8dm9pZD47XG4gIGNvbm5lY3Rpb25TdGF0dXMkOiBPYnNlcnZhYmxlPCdjb25uZWN0ZWQnIHwgJ2Rpc2Nvbm5lY3RlZCc+O1xuICBwcml2YXRlIHN1YmplY3RzJCA9IG5ldyBNYXA8c3RyaW5nLCBPYnNlcnZhYmxlPFJlYWx0aW1lTWVzc2FnZTx1bmtub3duPj4+KCk7XG5cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIHJlYWx0aW1lOiBSZWFsdGltZSkge1xuICAgIHRoaXMucmVjb25uZWN0JCA9IHRoaXMuY3JlYXRlT2JzZXJ2YWJsZUZvclJlY29ubmVjdCgpLnBpcGUoc2hhcmUoKSk7XG4gICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJCA9IHRoaXMuY3JlYXRlT2JzZXJ2YWJsZUZvckNvbm5lY3Rpb25TdGF0dXMoKS5waXBlKFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0T2JzZXJ2YWJsZUZvckNoYW5uZWw8VD4oY2hhbm5lbDogc3RyaW5nKTogT2JzZXJ2YWJsZTxSZWFsdGltZU1lc3NhZ2U8VD4+IHtcbiAgICBpZiAodGhpcy5zdWJqZWN0cyQuaGFzKGNoYW5uZWwpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdWJqZWN0cyQuZ2V0KGNoYW5uZWwpIGFzIE9ic2VydmFibGU8UmVhbHRpbWVNZXNzYWdlPFQ+PjtcbiAgICB9XG4gICAgY29uc3Qgb2JzZXJ2YWJsZSQgPSB0aGlzLmNyZWF0ZU9ic2VydmFibGVGb3JDaGFubmVsPFQ+KGNoYW5uZWwsIHRoaXMucmVhbHRpbWUpO1xuICAgIGNvbnN0IHNoYXJlZE9ic2VydmFibGUkID0gb2JzZXJ2YWJsZSQucGlwZShzaGFyZSgpKTtcbiAgICB0aGlzLnN1YmplY3RzJC5zZXQoY2hhbm5lbCwgc2hhcmVkT2JzZXJ2YWJsZSQpO1xuXG4gICAgcmV0dXJuIHNoYXJlZE9ic2VydmFibGUkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZU9ic2VydmFibGVGb3JDaGFubmVsPFQ+KFxuICAgIGNoYW5uZWw6IHN0cmluZyxcbiAgICByZWFsdGltZTogUmVhbHRpbWVcbiAgKTogT2JzZXJ2YWJsZTxSZWFsdGltZU1lc3NhZ2U8VD4+IHtcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8UmVhbHRpbWVNZXNzYWdlPFQ+PihvYnNlcnZlciA9PiB7XG4gICAgICBsZXQgcmVhbHRpbWVTdWJzY3JpcHRpb24gPSByZWFsdGltZS5zdWJzY3JpYmUoY2hhbm5lbCwgbXNnID0+IHtcbiAgICAgICAgY29uc3QgZGF0YTogUmVhbHRpbWVNZXNzYWdlPFQ+ID0ge1xuICAgICAgICAgIGNoYW5uZWw6IG1zZy5jaGFubmVsLFxuICAgICAgICAgIGRhdGE6IG1zZy5kYXRhLmRhdGEsXG4gICAgICAgICAgaWQ6IG1zZy5pZCxcbiAgICAgICAgICByZWFsdGltZUFjdGlvbjogbXNnLmRhdGEucmVhbHRpbWVBY3Rpb25cbiAgICAgICAgfTtcbiAgICAgICAgb2JzZXJ2ZXIubmV4dChkYXRhKTtcbiAgICAgIH0pO1xuXG4gICAgICAvKipcbiAgICAgICAqIEluIChyYXJlKSBjYXNlIG9mIGEgcmUtaGFuZHNoYWtlLCByZXN1YnNjcmliZSB2YWxpZCBzdWJzY3JpcHRpb25zLlxuICAgICAgICogQHNlZSBodHRwczovL2RvY3MuY29tZXRkLm9yZy9jdXJyZW50L3JlZmVyZW5jZS8jX2phdmFzY3JpcHRfc3Vic2NyaWJlX3Jlc3Vic2NyaWJlXG4gICAgICAgKi9cbiAgICAgIGNvbnN0IHJlY29ubmVjdFN1YnNjcmlwdGlvbiA9IHRoaXMucmVjb25uZWN0JC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJlYWx0aW1lU3Vic2NyaXB0aW9uID0gdGhpcy5yZWFsdGltZS5yZXN1YnNjcmliZShyZWFsdGltZVN1YnNjcmlwdGlvbik7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byByZXN1YnNjcmliZSB0byBjaGFubmVsOiBcIiR7Y2hhbm5lbH1cIiBhZnRlciByZWNvbm5lY3QuYCwgZSk7XG4gICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB1bnN1YnNjcmliZTogKCkgPT4ge1xuICAgICAgICAgIHJlY29ubmVjdFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgIHJlYWx0aW1lLnVuc3Vic2NyaWJlKHJlYWx0aW1lU3Vic2NyaXB0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVPYnNlcnZhYmxlRm9yUmVjb25uZWN0KCkge1xuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZTx2b2lkPihvYnNlcnZlciA9PiB7XG4gICAgICBjb25zdCBoYW5kbGUgPSB0aGlzLnJlYWx0aW1lLmFkZEhhbmRzaGFrZUxpc3RlbmVyKG1zZyA9PiB7XG4gICAgICAgIGlmIChtc2cuc3VjY2Vzc2Z1bCAmJiBtc2cucmVlc3RhYmxpc2gpIHtcbiAgICAgICAgICBvYnNlcnZlci5uZXh0KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdW5zdWJzY3JpYmU6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLnJlYWx0aW1lLnJlbW92ZUxpc3RlbmVyKGhhbmRsZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlT2JzZXJ2YWJsZUZvckNvbm5lY3Rpb25TdGF0dXMoKSB7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPCdjb25uZWN0ZWQnIHwgJ2Rpc2Nvbm5lY3RlZCc+KG9ic2VydmVyID0+IHtcbiAgICAgIG9ic2VydmVyLm5leHQoIXRoaXMucmVhbHRpbWUuaXNEaXNjb25uZWN0ZWQoKSA/ICdjb25uZWN0ZWQnIDogJ2Rpc2Nvbm5lY3RlZCcpO1xuICAgICAgY29uc3QgaGFuZGxlID0gdGhpcy5yZWFsdGltZS5hZGRDb25uZWN0TGlzdGVuZXIobXNnID0+IHtcbiAgICAgICAgb2JzZXJ2ZXIubmV4dChtc2cuc3VjY2Vzc2Z1bCA/ICdjb25uZWN0ZWQnIDogJ2Rpc2Nvbm5lY3RlZCcpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB1bnN1YnNjcmliZTogKCkgPT4ge1xuICAgICAgICAgIHRoaXMucmVhbHRpbWUucmVtb3ZlTGlzdGVuZXIoaGFuZGxlKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxufVxuIl19