@experteam-mx/ngx-services
Version:
Angular common services for Experteam apps
115 lines • 14.5 kB
JavaScript
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLXNvY2tldHMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2V4cGVydGVhbS1teC9uZ3gtc2VydmljZXMvc3JjL2xpYi93ZWJzb2NrZXRzL3dlYi1zb2NrZXRzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDbEQsT0FBTyxNQUFtQixNQUFNLFdBQVcsQ0FBQTtBQUMzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFBOztBQU1qQyxNQUFNLE9BQU8saUJBQWlCO0lBSUg7SUFIakIsTUFBTSxDQUFlO0lBRTdCLFlBQ3lCLFlBQXlCO1FBQXpCLGlCQUFZLEdBQVosWUFBWSxDQUFhO1FBRWhELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFBO1FBRWxCLElBQUksQ0FBQyxPQUFPLEVBQUU7YUFDWCxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUNmLElBQUksQ0FBQyxNQUFNO2dCQUFFLE9BQU07WUFFbkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUE7UUFDdEIsQ0FBQyxDQUFDLENBQUE7SUFDTixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxLQUFLLENBQUMsR0FBRyxDQUFLLE9BQWdCLEVBQUUsU0FBaUIsRUFBRSxJQUFPO1FBQ3hELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFVLFNBQVMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFBO0lBQ3JELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsVUFBVSxDQUFFLFdBQW1CO1FBQ25DLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQTtRQUVsQixLQUFLLElBQUksT0FBTyxHQUFHLENBQUMsRUFBRSxPQUFPLElBQUksUUFBUSxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUM7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QkFDbkI7OzBCQUtJLE1BQU07MkJBQUMsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcbmltcG9ydCBQdXNoZXIsIHsgQ2hhbm5lbCB9IGZyb20gJ3B1c2hlci1qcydcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnXHJcbmltcG9ydCB7IEVudmlyb25tZW50IH0gZnJvbSAnLi4vbmd4LXNlcnZpY2VzLm1vZGVscydcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBXZWJTb2NrZXRzU2VydmljZSB7XHJcbiAgcHJpdmF0ZSBwdXNoZXI6IFB1c2hlciB8IG51bGxcclxuXHJcbiAgY29uc3RydWN0b3IgKFxyXG4gICAgQEluamVjdCgnZW52JykgcHJpdmF0ZSBlbnZpcm9ubWVudHM6IEVudmlyb25tZW50XHJcbiAgKSB7XHJcbiAgICB0aGlzLnB1c2hlciA9IG51bGxcclxuXHJcbiAgICB0aGlzLmNvbm5lY3QoKVxyXG4gICAgICAudGhlbigocHVzaGVyKSA9PiB7XHJcbiAgICAgICAgaWYgKCFwdXNoZXIpIHJldHVyblxyXG5cclxuICAgICAgICB0aGlzLnB1c2hlciA9IHB1c2hlclxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUHVibGlzaGVzIGFuIGV2ZW50IHRvIHRoZSBzcGVjaWZpZWQgY2hhbm5lbCB3aXRoIHRoZSBnaXZlbiBkYXRhLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtDaGFubmVsfSBjaGFubmVsIC0gVGhlIGNoYW5uZWwgaW5zdGFuY2Ugd2hlcmUgdGhlIGV2ZW50IHdpbGwgYmUgcHVibGlzaGVkLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gYmUgcHVibGlzaGVkLlxyXG4gICAqIEBwYXJhbSB7VH0gZGF0YSAtIFRoZSBwYXlsb2FkIGRhdGEgdG8gYmUgc2VudCB3aXRoIHRoZSBldmVudC5cclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGJvb2xlYW4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhIGJvb2xlYW4gaW5kaWNhdGluZ1xyXG4gICAqIHdoZXRoZXIgdGhlIGV2ZW50IHdhcyBzdWNjZXNzZnVsbHkgdHJpZ2dlcmVkIG9uIHRoZSBjaGFubmVsLlxyXG4gICAqL1xyXG4gIGFzeW5jIHB1YjxUPiAoY2hhbm5lbDogQ2hhbm5lbCwgZXZlbnROYW1lOiBzdHJpbmcsIGRhdGE6IFQpIHtcclxuICAgIHJldHVybiBjaGFubmVsLnRyaWdnZXIoYGNsaWVudC0ke2V2ZW50TmFtZX1gLCBkYXRhKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU3Vic2NyaWJlcyB0byBhIHNwZWNpZmllZCBjaGFubmVsLCByZXRyeWluZyBtdWx0aXBsZSB0aW1lcyB1cG9uIGZhaWx1cmUuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgY2hhbm5lbCB0byBiZSBzdWJzY3JpYmVkIHRvLlxyXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Q2hhbm5lbD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBzdWJzY3JpYmVkIGNoYW5uZWwgb2JqZWN0IGlmIHN1Y2Nlc3NmdWwuXHJcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBzdWJzY3JpcHRpb24gZmFpbHMgYWZ0ZXIgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJldHJ5IGF0dGVtcHRzLlxyXG4gICAqL1xyXG4gIGFzeW5jIGNoYW5uZWxTdWIgKGNoYW5uZWxOYW1lOiBzdHJpbmcpOiBQcm9taXNlPENoYW5uZWw+IHtcclxuICAgIGNvbnN0IGF0dGVtcHRzID0gM1xyXG5cclxuICAgIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDw9IGF0dGVtcHRzOyBhdHRlbXB0KyspIHtcclxuICAgICAgY29uc3QgY2hhbm5lbCA9IHRoaXMucHVzaGVyPy5jaGFubmVsKGNoYW5uZWxOYW1lKVxyXG5cclxuICAgICAgaWYgKGNoYW5uZWw/LnN1YnNjcmliZWQpIHtcclxuICAgICAgICByZXR1cm4gY2hhbm5lbFxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnB1c2hlcj8uc3Vic2NyaWJlKGNoYW5uZWxOYW1lKVxyXG5cclxuICAgICAgaWYgKGF0dGVtcHQgPCBhdHRlbXB0cykge1xyXG4gICAgICAgIGF3YWl0IHRoaXMud2FpdCgpXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBzdWJzY3JpYmUgdG8gY2hhbm5lbCBcIiR7Y2hhbm5lbE5hbWV9XCIgYWZ0ZXIgJHthdHRlbXB0c30gYXR0ZW1wdHMuYClcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEJpbmRzIGFuIGV2ZW50IGxpc3RlbmVyIHRvIGEgc3BlY2lmaWVkIGV2ZW50IG9uIGEgZ2l2ZW4gY2hhbm5lbCB1c2luZyBQdXNoZXIgb3IgYSBDaGFubmVsIG9iamVjdCxcclxuICAgKiBhbmQgcmV0dXJucyBhbiBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgZXZlbnQgZGF0YSBvZiB0eXBlIFQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0NoYW5uZWx8c3RyaW5nfSBjaGFubmVsIC0gVGhlIGNoYW5uZWwgdG8gYmluZCB0aGUgZXZlbnQgdG8uIEl0IGNhbiBiZSBhIENoYW5uZWwgb2JqZWN0IG9yIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY2hhbm5lbCBuYW1lLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudCAtIFRoZSBuYW1lIG9mIHRoZSBldmVudCB0byBiaW5kIHRvIHRoZSBjaGFubmVsLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8VD59IEFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyBkYXRhIG9mIHR5cGUgVCB3aGVuIHRoZSBzcGVjaWZpZWQgZXZlbnQgaXMgdHJpZ2dlcmVkLlxyXG4gICAqL1xyXG4gIGV2ZW50QmluZDxUPiAoY2hhbm5lbDogQ2hhbm5lbCB8IHN0cmluZywgZXZlbnQ6IHN0cmluZyk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChzdWJzY3JpYmVyKSA9PiB7XHJcbiAgICAgIGlmICgoY2hhbm5lbCBhcyBDaGFubmVsKT8ubmFtZSkge1xyXG4gICAgICAgIChjaGFubmVsIGFzIENoYW5uZWwpLmJpbmQoZXZlbnQsIChkYXRhOiBUKSA9PiBzdWJzY3JpYmVyLm5leHQoZGF0YSkpXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5wdXNoZXI/LnN1YnNjcmliZSgoY2hhbm5lbCBhcyBzdHJpbmcpKVxyXG4gICAgICAgICAgLmJpbmQoZXZlbnQsIChkYXRhOiBUKSA9PiBzdWJzY3JpYmVyLm5leHQoZGF0YSkpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVbmJpbmRzIGFuIGV2ZW50IGZyb20gdGhlIHNwZWNpZmllZCBjaGFubmVsIGFuZCByZXR1cm5zIGFuIG9ic2VydmFibGVcclxuICAgKiB0aGF0IGVtaXRzIGRhdGEgd2hlbiB0aGUgZXZlbnQgY2FsbGJhY2sgaXMgdHJpZ2dlcmVkLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtDaGFubmVsfSBjaGFubmVsIC0gVGhlIGNoYW5uZWwgb2JqZWN0IGZyb20gd2hpY2ggdGhlIGV2ZW50IHNob3VsZCBiZSB1bmJvdW5kLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudCAtIFRoZSBuYW1lIG9mIHRoZSBldmVudCB0byB1bmJpbmQuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxUPn0gQW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIGRhdGEgZnJvbSB0aGUgdW5ib3VuZCBldmVudCBjYWxsYmFjay5cclxuICAgKi9cclxuICBldmVudFVuYmluZDxUPiAoY2hhbm5lbDogQ2hhbm5lbCwgZXZlbnQ6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChzdWJzY3JpYmVyKSA9PlxyXG4gICAgICBjaGFubmVsLnVuYmluZChldmVudCwgKGRhdGE6IFQpID0+IHN1YnNjcmliZXIubmV4dChkYXRhKSkpXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbm5lY3QgKCkge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPFB1c2hlciB8IGZhbHNlPigocmVzb2x2ZSkgPT4ge1xyXG4gICAgICBjb25zdCB7IHNvY2tldHMgfSA9IHRoaXMuZW52aXJvbm1lbnRzXHJcblxyXG4gICAgICBpZiAoIXNvY2tldHMpIHJldHVybiByZXNvbHZlKGZhbHNlKVxyXG5cclxuICAgICAgY29uc3QgcHVzaGVyID0gbmV3IFB1c2hlcihzb2NrZXRzLmFwcF9rZXksIHtcclxuICAgICAgICB3c0hvc3Q6IHNvY2tldHMudXJsLFxyXG4gICAgICAgIHdzUG9ydDogc29ja2V0cy5wb3J0LFxyXG4gICAgICAgIGVuYWJsZWRUcmFuc3BvcnRzOiBbJ3dzcycsICd3cyddLFxyXG4gICAgICAgIGZvcmNlVExTOiBmYWxzZSxcclxuICAgICAgICBlbmFibGVTdGF0czogZmFsc2UsXHJcbiAgICAgIH0pXHJcblxyXG4gICAgICBpZiAoc29ja2V0cy5kZWJ1Zykge1xyXG4gICAgICAgIFB1c2hlci5sb2dUb0NvbnNvbGUgPSB0cnVlXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiByZXNvbHZlKHB1c2hlcilcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHdhaXQgKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgd2FpdFRpbWUgPSAzICogMTAwMFxyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCB3YWl0VGltZSkpXHJcbiAgfVxyXG59XHJcbiJdfQ==