UNPKG

@experteam-mx/ngx-services

Version:

Angular common services for Experteam apps

115 lines 14.5 kB
import { Inject, Injectable } from '@angular/core'; import Pusher from 'pusher-js'; import { Observable } from 'rxjs'; import * as i0 from "@angular/core"; export class WebSocketsService { environments; pusher; constructor(environments) { this.environments = environments; this.pusher = null; this.connect() .then((pusher) => { if (!pusher) return; this.pusher = pusher; }); } /** * Publishes an event to the specified channel with the given data. * * @param {Channel} channel - The channel instance where the event will be published. * @param {string} eventName - The name of the event to be published. * @param {T} data - The payload data to be sent with the event. * @return {Promise<boolean>} A promise that resolves to a boolean indicating * whether the event was successfully triggered on the channel. */ async pub(channel, eventName, data) { return channel.trigger(`client-${eventName}`, data); } /** * Subscribes to a specified channel, retrying multiple times upon failure. * * @param {string} channelName - The name of the channel to be subscribed to. * @return {Promise<Channel>} A promise that resolves to the subscribed channel object if successful. * @throws {Error} If the subscription fails after the maximum number of retry attempts. */ async channelSub(channelName) { const attempts = 3; for (let attempt = 0; attempt <= attempts; attempt++) { const channel = this.pusher?.channel(channelName); if (channel?.subscribed) { return channel; } this.pusher?.subscribe(channelName); if (attempt < attempts) { await this.wait(); } } throw new Error(`Failed to subscribe to channel "${channelName}" after ${attempts} attempts.`); } /** * Binds an event listener to a specified event on a given channel using Pusher or a Channel object, * and returns an Observable that emits event data of type T. * * @param {Channel|string} channel - The channel to bind the event to. It can be a Channel object or a string representing the channel name. * @param {string} event - The name of the event to bind to the channel. * @return {Observable<T>} An Observable that emits data of type T when the specified event is triggered. */ eventBind(channel, event) { return new Observable((subscriber) => { if (channel?.name) { channel.bind(event, (data) => subscriber.next(data)); } else { this.pusher?.subscribe(channel) .bind(event, (data) => subscriber.next(data)); } }); } /** * Unbinds an event from the specified channel and returns an observable * that emits data when the event callback is triggered. * * @param {Channel} channel - The channel object from which the event should be unbound. * @param {string} event - The name of the event to unbind. * @return {Observable<T>} An observable that emits data from the unbound event callback. */ eventUnbind(channel, event) { return new Observable((subscriber) => channel.unbind(event, (data) => subscriber.next(data))); } connect() { return new Promise((resolve) => { const { sockets } = this.environments; if (!sockets) return resolve(false); const pusher = new Pusher(sockets.app_key, { wsHost: sockets.url, wsPort: sockets.port, enabledTransports: ['wss', 'ws'], forceTLS: false, enableStats: false, }); if (sockets.debug) { Pusher.logToConsole = true; } return resolve(pusher); }); } async wait() { const waitTime = 3 * 1000; return new Promise((resolve) => setTimeout(resolve, waitTime)); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WebSocketsService, deps: [{ token: 'env' }], target: i0.ɵɵFactoryTarget.Injectable }); static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WebSocketsService, providedIn: 'root' }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WebSocketsService, decorators: [{ type: Injectable, args: [{ providedIn: 'root', }] }], ctorParameters: () => [{ type: undefined, decorators: [{ type: Inject, args: ['env'] }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLXNvY2tldHMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2V4cGVydGVhbS1teC9uZ3gtc2VydmljZXMvc3JjL2xpYi93ZWJzb2NrZXRzL3dlYi1zb2NrZXRzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDbEQsT0FBTyxNQUFtQixNQUFNLFdBQVcsQ0FBQTtBQUMzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFBOztBQU1qQyxNQUFNLE9BQU8saUJBQWlCO0lBSUg7SUFIakIsTUFBTSxDQUFlO0lBRTdCLFlBQ3lCLFlBQXlCO1FBQXpCLGlCQUFZLEdBQVosWUFBWSxDQUFhO1FBRWhELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFBO1FBRWxCLElBQUksQ0FBQyxPQUFPLEVBQUU7YUFDWCxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUNmLElBQUksQ0FBQyxNQUFNO2dCQUFFLE9BQU07WUFFbkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUE7UUFDdEIsQ0FBQyxDQUFDLENBQUE7SUFDTixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxLQUFLLENBQUMsR0FBRyxDQUFLLE9BQWdCLEVBQUUsU0FBaUIsRUFBRSxJQUFPO1FBQ3hELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFVLFNBQVMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFBO0lBQ3JELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsVUFBVSxDQUFFLFdBQW1CO1FBQ25DLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQTtRQUVsQixLQUFLLElBQUksT0FBTyxHQUFHLENBQUMsRUFBRSxPQUFPLElBQUksUUFBUSxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDckQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUE7WUFFakQsSUFBSSxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUM7Z0JBQ3hCLE9BQU8sT0FBTyxDQUFBO1lBQ2hCLENBQUM7WUFFRCxJQUFJLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQTtZQUVuQyxJQUFJLE9BQU8sR0FBRyxRQUFRLEVBQUUsQ0FBQztnQkFDdkIsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUE7WUFDbkIsQ0FBQztRQUNILENBQUM7UUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxXQUFXLFdBQVcsUUFBUSxZQUFZLENBQUMsQ0FBQTtJQUNoRyxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILFNBQVMsQ0FBSyxPQUF5QixFQUFFLEtBQWE7UUFDcEQsT0FBTyxJQUFJLFVBQVUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFO1lBQ25DLElBQUssT0FBbUIsRUFBRSxJQUFJLEVBQUUsQ0FBQztnQkFDOUIsT0FBbUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBTyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7WUFDdEUsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFFLE9BQWtCLENBQUM7cUJBQ3hDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFPLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtZQUNwRCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILFdBQVcsQ0FBSyxPQUFnQixFQUFFLEtBQWE7UUFDN0MsT0FBTyxJQUFJLFVBQVUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQ25DLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBTyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUM5RCxDQUFDO0lBRU8sT0FBTztRQUNiLE9BQU8sSUFBSSxPQUFPLENBQWlCLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDN0MsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUE7WUFFckMsSUFBSSxDQUFDLE9BQU87Z0JBQUUsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7WUFFbkMsTUFBTSxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRTtnQkFDekMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxHQUFHO2dCQUNuQixNQUFNLEVBQUUsT0FBTyxDQUFDLElBQUk7Z0JBQ3BCLGlCQUFpQixFQUFFLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQztnQkFDaEMsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsV0FBVyxFQUFFLEtBQUs7YUFDbkIsQ0FBQyxDQUFBO1lBRUYsSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2xCLE1BQU0sQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFBO1lBQzVCLENBQUM7WUFFRCxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUN4QixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFTyxLQUFLLENBQUMsSUFBSTtRQUNoQixNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFBO1FBRXpCLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQTtJQUNoRSxDQUFDO3dHQWxIVSxpQkFBaUIsa0JBSWxCLEtBQUs7NEdBSkosaUJBQWlCLGNBRmhCLE1BQU07OzRGQUVQLGlCQUFpQjtrQkFIN0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQUtJLE1BQU07MkJBQUMsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcbmltcG9ydCBQdXNoZXIsIHsgQ2hhbm5lbCB9IGZyb20gJ3B1c2hlci1qcydcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnXHJcbmltcG9ydCB7IEVudmlyb25tZW50IH0gZnJvbSAnLi4vbmd4LXNlcnZpY2VzLm1vZGVscydcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBXZWJTb2NrZXRzU2VydmljZSB7XHJcbiAgcHJpdmF0ZSBwdXNoZXI6IFB1c2hlciB8IG51bGxcclxuXHJcbiAgY29uc3RydWN0b3IgKFxyXG4gICAgQEluamVjdCgnZW52JykgcHJpdmF0ZSBlbnZpcm9ubWVudHM6IEVudmlyb25tZW50XHJcbiAgKSB7XHJcbiAgICB0aGlzLnB1c2hlciA9IG51bGxcclxuXHJcbiAgICB0aGlzLmNvbm5lY3QoKVxyXG4gICAgICAudGhlbigocHVzaGVyKSA9PiB7XHJcbiAgICAgICAgaWYgKCFwdXNoZXIpIHJldHVyblxyXG5cclxuICAgICAgICB0aGlzLnB1c2hlciA9IHB1c2hlclxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUHVibGlzaGVzIGFuIGV2ZW50IHRvIHRoZSBzcGVjaWZpZWQgY2hhbm5lbCB3aXRoIHRoZSBnaXZlbiBkYXRhLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtDaGFubmVsfSBjaGFubmVsIC0gVGhlIGNoYW5uZWwgaW5zdGFuY2Ugd2hlcmUgdGhlIGV2ZW50IHdpbGwgYmUgcHVibGlzaGVkLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gYmUgcHVibGlzaGVkLlxyXG4gICAqIEBwYXJhbSB7VH0gZGF0YSAtIFRoZSBwYXlsb2FkIGRhdGEgdG8gYmUgc2VudCB3aXRoIHRoZSBldmVudC5cclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGJvb2xlYW4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhIGJvb2xlYW4gaW5kaWNhdGluZ1xyXG4gICAqIHdoZXRoZXIgdGhlIGV2ZW50IHdhcyBzdWNjZXNzZnVsbHkgdHJpZ2dlcmVkIG9uIHRoZSBjaGFubmVsLlxyXG4gICAqL1xyXG4gIGFzeW5jIHB1YjxUPiAoY2hhbm5lbDogQ2hhbm5lbCwgZXZlbnROYW1lOiBzdHJpbmcsIGRhdGE6IFQpIHtcclxuICAgIHJldHVybiBjaGFubmVsLnRyaWdnZXIoYGNsaWVudC0ke2V2ZW50TmFtZX1gLCBkYXRhKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU3Vic2NyaWJlcyB0byBhIHNwZWNpZmllZCBjaGFubmVsLCByZXRyeWluZyBtdWx0aXBsZSB0aW1lcyB1cG9uIGZhaWx1cmUuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgY2hhbm5lbCB0byBiZSBzdWJzY3JpYmVkIHRvLlxyXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Q2hhbm5lbD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBzdWJzY3JpYmVkIGNoYW5uZWwgb2JqZWN0IGlmIHN1Y2Nlc3NmdWwuXHJcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBzdWJzY3JpcHRpb24gZmFpbHMgYWZ0ZXIgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJldHJ5IGF0dGVtcHRzLlxyXG4gICAqL1xyXG4gIGFzeW5jIGNoYW5uZWxTdWIgKGNoYW5uZWxOYW1lOiBzdHJpbmcpOiBQcm9taXNlPENoYW5uZWw+IHtcclxuICAgIGNvbnN0IGF0dGVtcHRzID0gM1xyXG5cclxuICAgIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDw9IGF0dGVtcHRzOyBhdHRlbXB0KyspIHtcclxuICAgICAgY29uc3QgY2hhbm5lbCA9IHRoaXMucHVzaGVyPy5jaGFubmVsKGNoYW5uZWxOYW1lKVxyXG5cclxuICAgICAgaWYgKGNoYW5uZWw/LnN1YnNjcmliZWQpIHtcclxuICAgICAgICByZXR1cm4gY2hhbm5lbFxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnB1c2hlcj8uc3Vic2NyaWJlKGNoYW5uZWxOYW1lKVxyXG5cclxuICAgICAgaWYgKGF0dGVtcHQgPCBhdHRlbXB0cykge1xyXG4gICAgICAgIGF3YWl0IHRoaXMud2FpdCgpXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBzdWJzY3JpYmUgdG8gY2hhbm5lbCBcIiR7Y2hhbm5lbE5hbWV9XCIgYWZ0ZXIgJHthdHRlbXB0c30gYXR0ZW1wdHMuYClcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEJpbmRzIGFuIGV2ZW50IGxpc3RlbmVyIHRvIGEgc3BlY2lmaWVkIGV2ZW50IG9uIGEgZ2l2ZW4gY2hhbm5lbCB1c2luZyBQdXNoZXIgb3IgYSBDaGFubmVsIG9iamVjdCxcclxuICAgKiBhbmQgcmV0dXJucyBhbiBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgZXZlbnQgZGF0YSBvZiB0eXBlIFQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0NoYW5uZWx8c3RyaW5nfSBjaGFubmVsIC0gVGhlIGNoYW5uZWwgdG8gYmluZCB0aGUgZXZlbnQgdG8uIEl0IGNhbiBiZSBhIENoYW5uZWwgb2JqZWN0IG9yIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY2hhbm5lbCBuYW1lLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudCAtIFRoZSBuYW1lIG9mIHRoZSBldmVudCB0byBiaW5kIHRvIHRoZSBjaGFubmVsLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8VD59IEFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyBkYXRhIG9mIHR5cGUgVCB3aGVuIHRoZSBzcGVjaWZpZWQgZXZlbnQgaXMgdHJpZ2dlcmVkLlxyXG4gICAqL1xyXG4gIGV2ZW50QmluZDxUPiAoY2hhbm5lbDogQ2hhbm5lbCB8IHN0cmluZywgZXZlbnQ6IHN0cmluZyk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChzdWJzY3JpYmVyKSA9PiB7XHJcbiAgICAgIGlmICgoY2hhbm5lbCBhcyBDaGFubmVsKT8ubmFtZSkge1xyXG4gICAgICAgIChjaGFubmVsIGFzIENoYW5uZWwpLmJpbmQoZXZlbnQsIChkYXRhOiBUKSA9PiBzdWJzY3JpYmVyLm5leHQoZGF0YSkpXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5wdXNoZXI/LnN1YnNjcmliZSgoY2hhbm5lbCBhcyBzdHJpbmcpKVxyXG4gICAgICAgICAgLmJpbmQoZXZlbnQsIChkYXRhOiBUKSA9PiBzdWJzY3JpYmVyLm5leHQoZGF0YSkpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVbmJpbmRzIGFuIGV2ZW50IGZyb20gdGhlIHNwZWNpZmllZCBjaGFubmVsIGFuZCByZXR1cm5zIGFuIG9ic2VydmFibGVcclxuICAgKiB0aGF0IGVtaXRzIGRhdGEgd2hlbiB0aGUgZXZlbnQgY2FsbGJhY2sgaXMgdHJpZ2dlcmVkLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtDaGFubmVsfSBjaGFubmVsIC0gVGhlIGNoYW5uZWwgb2JqZWN0IGZyb20gd2hpY2ggdGhlIGV2ZW50IHNob3VsZCBiZSB1bmJvdW5kLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudCAtIFRoZSBuYW1lIG9mIHRoZSBldmVudCB0byB1bmJpbmQuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxUPn0gQW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIGRhdGEgZnJvbSB0aGUgdW5ib3VuZCBldmVudCBjYWxsYmFjay5cclxuICAgKi9cclxuICBldmVudFVuYmluZDxUPiAoY2hhbm5lbDogQ2hhbm5lbCwgZXZlbnQ6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChzdWJzY3JpYmVyKSA9PlxyXG4gICAgICBjaGFubmVsLnVuYmluZChldmVudCwgKGRhdGE6IFQpID0+IHN1YnNjcmliZXIubmV4dChkYXRhKSkpXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbm5lY3QgKCkge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPFB1c2hlciB8IGZhbHNlPigocmVzb2x2ZSkgPT4ge1xyXG4gICAgICBjb25zdCB7IHNvY2tldHMgfSA9IHRoaXMuZW52aXJvbm1lbnRzXHJcblxyXG4gICAgICBpZiAoIXNvY2tldHMpIHJldHVybiByZXNvbHZlKGZhbHNlKVxyXG5cclxuICAgICAgY29uc3QgcHVzaGVyID0gbmV3IFB1c2hlcihzb2NrZXRzLmFwcF9rZXksIHtcclxuICAgICAgICB3c0hvc3Q6IHNvY2tldHMudXJsLFxyXG4gICAgICAgIHdzUG9ydDogc29ja2V0cy5wb3J0LFxyXG4gICAgICAgIGVuYWJsZWRUcmFuc3BvcnRzOiBbJ3dzcycsICd3cyddLFxyXG4gICAgICAgIGZvcmNlVExTOiBmYWxzZSxcclxuICAgICAgICBlbmFibGVTdGF0czogZmFsc2UsXHJcbiAgICAgIH0pXHJcblxyXG4gICAgICBpZiAoc29ja2V0cy5kZWJ1Zykge1xyXG4gICAgICAgIFB1c2hlci5sb2dUb0NvbnNvbGUgPSB0cnVlXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiByZXNvbHZlKHB1c2hlcilcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHdhaXQgKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgd2FpdFRpbWUgPSAzICogMTAwMFxyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCB3YWl0VGltZSkpXHJcbiAgfVxyXG59XHJcbiJdfQ==