tas-uell-sdk 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,160 @@
1
+ import { Component, Input, ViewChild, } from "@angular/core";
2
+ import { CallState, ViewMode } from "../../services/tas.service";
3
+ import { Subscription } from "rxjs";
4
+ import interact from "interactjs";
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@ng-bootstrap/ng-bootstrap";
7
+ import * as i2 from "../../services/tas.service";
8
+ export class TasVideocallComponent {
9
+ constructor(activeModal, tasService) {
10
+ this.activeModal = activeModal;
11
+ this.tasService = tasService;
12
+ this.isReturningFromPip = false;
13
+ this.isPublisherSmall = true;
14
+ this.callState = CallState.IDLE;
15
+ this.isMuted = false;
16
+ this.subscriptions = new Subscription();
17
+ }
18
+ ngOnInit() {
19
+ this.setupSubscriptions();
20
+ this.initializeCall();
21
+ }
22
+ ngAfterViewInit() {
23
+ this.initInteract();
24
+ }
25
+ ngOnDestroy() {
26
+ this.subscriptions.unsubscribe();
27
+ if (!this.tasService.isPipMode()) {
28
+ this.tasService.disconnectSession();
29
+ }
30
+ interact(".publisher-view").unset();
31
+ }
32
+ // Public Methods
33
+ hangUp() {
34
+ this.tasService.disconnectSession();
35
+ }
36
+ toggleMute() {
37
+ this.tasService.toggleMute();
38
+ }
39
+ minimize() {
40
+ this.tasService.moveMainVideoTo("pip-main-video");
41
+ setTimeout(() => this.tasService.enterPipMode(), 50);
42
+ }
43
+ toggleSwap() {
44
+ this.isPublisherSmall = !this.isPublisherSmall;
45
+ this.resetVideoPositions();
46
+ setTimeout(() => this.initInteract());
47
+ }
48
+ onDoubleClick() {
49
+ this.toggleSwap();
50
+ }
51
+ // Private Methods
52
+ setupSubscriptions() {
53
+ this.subscriptions.add(this.tasService.callState$.subscribe((state) => {
54
+ this.callState = state;
55
+ if (state === CallState.DISCONNECTED) {
56
+ this.activeModal.close("hangup");
57
+ }
58
+ }));
59
+ this.subscriptions.add(this.tasService.viewMode$.subscribe((mode) => {
60
+ if (mode === ViewMode.PIP) {
61
+ this.activeModal.close("pip");
62
+ }
63
+ }));
64
+ this.subscriptions.add(this.tasService.isMuted$.subscribe((muted) => {
65
+ this.isMuted = muted;
66
+ }));
67
+ }
68
+ initializeCall() {
69
+ if (this.isReturningFromPip) {
70
+ setTimeout(() => this.tasService.moveVideosToFullscreen(), 100);
71
+ }
72
+ else if (this.sessionId && this.token) {
73
+ this.tasService
74
+ .connectSession(this.sessionId, this.token, "publisher-container", "subscriber-container")
75
+ .catch((err) => {
76
+ console.error("Error connecting to video call:", err);
77
+ });
78
+ }
79
+ }
80
+ resetVideoPositions() {
81
+ const publisherEl = this.publisherContainer?.nativeElement;
82
+ const subscriberEl = this.subscriberContainer?.nativeElement;
83
+ if (publisherEl) {
84
+ publisherEl.removeAttribute("style");
85
+ publisherEl.removeAttribute("data-x");
86
+ publisherEl.removeAttribute("data-y");
87
+ }
88
+ if (subscriberEl) {
89
+ subscriberEl.removeAttribute("style");
90
+ subscriberEl.removeAttribute("data-x");
91
+ subscriberEl.removeAttribute("data-y");
92
+ }
93
+ }
94
+ initInteract() {
95
+ interact(".publisher-view").unset();
96
+ interact(".publisher-view")
97
+ .draggable({
98
+ inertia: true,
99
+ modifiers: [
100
+ interact.modifiers.restrictRect({
101
+ restriction: "parent",
102
+ endOnly: true,
103
+ }),
104
+ ],
105
+ autoScroll: true,
106
+ listeners: {
107
+ move: (event) => {
108
+ const target = event.target;
109
+ const x = (parseFloat(target.getAttribute("data-x")) || 0) + event.dx;
110
+ const y = (parseFloat(target.getAttribute("data-y")) || 0) + event.dy;
111
+ target.style.transform = `translate(${x}px, ${y}px)`;
112
+ target.setAttribute("data-x", String(x));
113
+ target.setAttribute("data-y", String(y));
114
+ },
115
+ },
116
+ })
117
+ .resizable({
118
+ edges: { left: false, right: true, bottom: true, top: false },
119
+ listeners: {
120
+ move: (event) => {
121
+ const target = event.target;
122
+ let x = parseFloat(target.getAttribute("data-x")) || 0;
123
+ let y = parseFloat(target.getAttribute("data-y")) || 0;
124
+ target.style.width = `${event.rect.width}px`;
125
+ target.style.height = `${event.rect.height}px`;
126
+ x += event.deltaRect.left;
127
+ y += event.deltaRect.top;
128
+ target.style.transform = `translate(${x}px, ${y}px)`;
129
+ target.setAttribute("data-x", String(x));
130
+ target.setAttribute("data-y", String(y));
131
+ },
132
+ },
133
+ modifiers: [
134
+ interact.modifiers.restrictEdges({ outer: "parent" }),
135
+ interact.modifiers.restrictSize({ min: { width: 150, height: 100 } }),
136
+ interact.modifiers.aspectRatio({ ratio: "preserve" }),
137
+ ],
138
+ inertia: true,
139
+ });
140
+ }
141
+ }
142
+ TasVideocallComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TasVideocallComponent, deps: [{ token: i1.NgbActiveModal }, { token: i2.TasService }], target: i0.ɵɵFactoryTarget.Component });
143
+ TasVideocallComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: TasVideocallComponent, selector: "tas-videocall", inputs: { sessionId: "sessionId", token: "token", isReturningFromPip: "isReturningFromPip" }, viewQueries: [{ propertyName: "publisherContainer", first: true, predicate: ["publisherContainer"], descendants: true }, { propertyName: "subscriberContainer", first: true, predicate: ["subscriberContainer"], descendants: true }], ngImport: i0, template: "<div class=\"tas-videocall-container\">\n <div\n id=\"subscriber-container\"\n [class.subscriber-view]=\"isPublisherSmall\"\n [class.publisher-view]=\"!isPublisherSmall\"\n #subscriberContainer\n (dblclick)=\"onDoubleClick()\"\n ></div>\n\n <div\n id=\"publisher-container\"\n [class.publisher-view]=\"isPublisherSmall\"\n [class.subscriber-view]=\"!isPublisherSmall\"\n #publisherContainer\n (dblclick)=\"onDoubleClick()\"\n ></div>\n\n <div class=\"controls-container\">\n <button class=\"btn swap-btn\" (click)=\"toggleSwap()\" title=\"Cambiar vista\">\n <i class=\"fa fa-refresh\"></i>\n </button>\n <button\n class=\"btn pip-btn\"\n (click)=\"minimize()\"\n title=\"Minimizar (Picture in Picture)\"\n >\n <i class=\"fa fa-compress\"></i>\n </button>\n <button\n class=\"btn mute-btn\"\n [class.muted]=\"isMuted\"\n (click)=\"toggleMute()\"\n [title]=\"isMuted ? 'Activar micr\u00F3fono' : 'Silenciar micr\u00F3fono'\"\n >\n <i\n class=\"fa\"\n [class.fa-microphone]=\"!isMuted\"\n [class.fa-microphone-slash]=\"isMuted\"\n ></i>\n </button>\n <button class=\"btn hangup-btn\" (click)=\"hangUp()\" title=\"Colgar\">\n <i class=\"fa fa-phone\" style=\"transform: rotate(135deg)\"></i>\n </button>\n </div>\n</div>\n", styles: [".tas-videocall-container{position:relative;width:100vw;height:100vh;background-color:#000;overflow:hidden}.tas-videocall-container ::ng-deep .OT_edge-bar-item,.tas-videocall-container ::ng-deep .OT_mute,.tas-videocall-container ::ng-deep .OT_audio-level-meter,.tas-videocall-container ::ng-deep .OT_bar,.tas-videocall-container ::ng-deep .OT_name{display:none!important}.tas-videocall-container .subscriber-view{width:100%;height:100%;z-index:1}.tas-videocall-container .publisher-view{position:absolute;top:20px;right:20px;width:200px;height:150px;z-index:2;border:2px solid #fff;border-radius:8px;background-color:#333}.tas-videocall-container .controls-container{display:flex;flex-direction:row;gap:20px;position:absolute;bottom:30px;left:50%;transform:translate(-50%);z-index:3;background-color:#00000080;padding:15px 25px;border-radius:50px;backdrop-filter:blur(5px)}.tas-videocall-container .controls-container .hangup-btn,.tas-videocall-container .controls-container .swap-btn,.tas-videocall-container .controls-container .pip-btn,.tas-videocall-container .controls-container .mute-btn{width:60px;height:60px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:24px;border:none;box-shadow:0 4px 6px #0000004d;transition:all .2s ease}.tas-videocall-container .controls-container .hangup-btn i,.tas-videocall-container .controls-container .swap-btn i,.tas-videocall-container .controls-container .pip-btn i,.tas-videocall-container .controls-container .mute-btn i{color:#fff}.tas-videocall-container .controls-container .hangup-btn{background:#dc3545}.tas-videocall-container .controls-container .hangup-btn:hover{background:#c82333;transform:scale(1.05)}.tas-videocall-container .controls-container .swap-btn{background:rgba(255,255,255,.2)}.tas-videocall-container .controls-container .swap-btn:hover{background:rgba(255,255,255,.35);transform:scale(1.05)}.tas-videocall-container .controls-container .pip-btn{background:rgba(255,255,255,.2)}.tas-videocall-container .controls-container .pip-btn:hover{background:rgba(255,255,255,.35);transform:scale(1.05)}.tas-videocall-container .controls-container .mute-btn{background:rgba(255,255,255,.2)}.tas-videocall-container .controls-container .mute-btn:hover{background:rgba(255,255,255,.35);transform:scale(1.05)}.tas-videocall-container .controls-container .mute-btn.muted{background:#f39c12}.tas-videocall-container .controls-container .mute-btn.muted:hover{background:#e67e22}\n"] });
144
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TasVideocallComponent, decorators: [{
145
+ type: Component,
146
+ args: [{ selector: "tas-videocall", template: "<div class=\"tas-videocall-container\">\n <div\n id=\"subscriber-container\"\n [class.subscriber-view]=\"isPublisherSmall\"\n [class.publisher-view]=\"!isPublisherSmall\"\n #subscriberContainer\n (dblclick)=\"onDoubleClick()\"\n ></div>\n\n <div\n id=\"publisher-container\"\n [class.publisher-view]=\"isPublisherSmall\"\n [class.subscriber-view]=\"!isPublisherSmall\"\n #publisherContainer\n (dblclick)=\"onDoubleClick()\"\n ></div>\n\n <div class=\"controls-container\">\n <button class=\"btn swap-btn\" (click)=\"toggleSwap()\" title=\"Cambiar vista\">\n <i class=\"fa fa-refresh\"></i>\n </button>\n <button\n class=\"btn pip-btn\"\n (click)=\"minimize()\"\n title=\"Minimizar (Picture in Picture)\"\n >\n <i class=\"fa fa-compress\"></i>\n </button>\n <button\n class=\"btn mute-btn\"\n [class.muted]=\"isMuted\"\n (click)=\"toggleMute()\"\n [title]=\"isMuted ? 'Activar micr\u00F3fono' : 'Silenciar micr\u00F3fono'\"\n >\n <i\n class=\"fa\"\n [class.fa-microphone]=\"!isMuted\"\n [class.fa-microphone-slash]=\"isMuted\"\n ></i>\n </button>\n <button class=\"btn hangup-btn\" (click)=\"hangUp()\" title=\"Colgar\">\n <i class=\"fa fa-phone\" style=\"transform: rotate(135deg)\"></i>\n </button>\n </div>\n</div>\n", styles: [".tas-videocall-container{position:relative;width:100vw;height:100vh;background-color:#000;overflow:hidden}.tas-videocall-container ::ng-deep .OT_edge-bar-item,.tas-videocall-container ::ng-deep .OT_mute,.tas-videocall-container ::ng-deep .OT_audio-level-meter,.tas-videocall-container ::ng-deep .OT_bar,.tas-videocall-container ::ng-deep .OT_name{display:none!important}.tas-videocall-container .subscriber-view{width:100%;height:100%;z-index:1}.tas-videocall-container .publisher-view{position:absolute;top:20px;right:20px;width:200px;height:150px;z-index:2;border:2px solid #fff;border-radius:8px;background-color:#333}.tas-videocall-container .controls-container{display:flex;flex-direction:row;gap:20px;position:absolute;bottom:30px;left:50%;transform:translate(-50%);z-index:3;background-color:#00000080;padding:15px 25px;border-radius:50px;backdrop-filter:blur(5px)}.tas-videocall-container .controls-container .hangup-btn,.tas-videocall-container .controls-container .swap-btn,.tas-videocall-container .controls-container .pip-btn,.tas-videocall-container .controls-container .mute-btn{width:60px;height:60px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:24px;border:none;box-shadow:0 4px 6px #0000004d;transition:all .2s ease}.tas-videocall-container .controls-container .hangup-btn i,.tas-videocall-container .controls-container .swap-btn i,.tas-videocall-container .controls-container .pip-btn i,.tas-videocall-container .controls-container .mute-btn i{color:#fff}.tas-videocall-container .controls-container .hangup-btn{background:#dc3545}.tas-videocall-container .controls-container .hangup-btn:hover{background:#c82333;transform:scale(1.05)}.tas-videocall-container .controls-container .swap-btn{background:rgba(255,255,255,.2)}.tas-videocall-container .controls-container .swap-btn:hover{background:rgba(255,255,255,.35);transform:scale(1.05)}.tas-videocall-container .controls-container .pip-btn{background:rgba(255,255,255,.2)}.tas-videocall-container .controls-container .pip-btn:hover{background:rgba(255,255,255,.35);transform:scale(1.05)}.tas-videocall-container .controls-container .mute-btn{background:rgba(255,255,255,.2)}.tas-videocall-container .controls-container .mute-btn:hover{background:rgba(255,255,255,.35);transform:scale(1.05)}.tas-videocall-container .controls-container .mute-btn.muted{background:#f39c12}.tas-videocall-container .controls-container .mute-btn.muted:hover{background:#e67e22}\n"] }]
147
+ }], ctorParameters: function () { return [{ type: i1.NgbActiveModal }, { type: i2.TasService }]; }, propDecorators: { sessionId: [{
148
+ type: Input
149
+ }], token: [{
150
+ type: Input
151
+ }], isReturningFromPip: [{
152
+ type: Input
153
+ }], publisherContainer: [{
154
+ type: ViewChild,
155
+ args: ["publisherContainer"]
156
+ }], subscriberContainer: [{
157
+ type: ViewChild,
158
+ args: ["subscriberContainer"]
159
+ }] } });
160
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzLXZpZGVvY2FsbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvdGFzLXZpZGVvY2FsbC90YXMtdmlkZW9jYWxsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy90YXMtdmlkZW9jYWxsL3Rhcy12aWRlb2NhbGwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFHVCxLQUFLLEVBQ0wsU0FBUyxHQUdWLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBYyxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0UsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLFFBQVEsTUFBTSxZQUFZLENBQUM7Ozs7QUFPbEMsTUFBTSxPQUFPLHFCQUFxQjtJQWNoQyxZQUNTLFdBQTJCLEVBQzFCLFVBQXNCO1FBRHZCLGdCQUFXLEdBQVgsV0FBVyxDQUFnQjtRQUMxQixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBYnZCLHVCQUFrQixHQUFZLEtBQUssQ0FBQztRQUt0QyxxQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFDeEIsY0FBUyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7UUFDM0IsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUVmLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUt4QyxDQUFDO0lBRUosUUFBUTtRQUNOLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQsZUFBZTtRQUNiLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUM7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LE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO29CQUNyRCxNQUFNLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDekMsTUFBTSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzNDLENBQUM7YUFDRjtZQUNELFNBQVMsRUFBRTtnQkFDVCxRQUFRLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsQ0FBQztnQkFDckQsUUFBUSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDO2dCQUNyRSxRQUFRLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsQ0FBQzthQUN0RDtZQUNELE9BQU8sRUFBRSxJQUFJO1NBQ2QsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzs7a0hBL0tVLHFCQUFxQjtzR0FBckIscUJBQXFCLDBYQ25CbEMsdTFDQTZDQTsyRkQxQmEscUJBQXFCO2tCQUxqQyxTQUFTOytCQUNFLGVBQWU7OEhBS2hCLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFFMkIsa0JBQWtCO3NCQUFsRCxTQUFTO3VCQUFDLG9CQUFvQjtnQkFDRyxtQkFBbUI7c0JBQXBELFNBQVM7dUJBQUMscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBPbkluaXQsXG4gIE9uRGVzdHJveSxcbiAgSW5wdXQsXG4gIFZpZXdDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgQWZ0ZXJWaWV3SW5pdCxcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IE5nYkFjdGl2ZU1vZGFsIH0gZnJvbSBcIkBuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXCI7XG5pbXBvcnQgeyBUYXNTZXJ2aWNlLCBDYWxsU3RhdGUsIFZpZXdNb2RlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL3Rhcy5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IGludGVyYWN0IGZyb20gXCJpbnRlcmFjdGpzXCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJ0YXMtdmlkZW9jYWxsXCIsXG4gIHRlbXBsYXRlVXJsOiBcIi4vdGFzLXZpZGVvY2FsbC5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFtcIi4vdGFzLXZpZGVvY2FsbC5jb21wb25lbnQuc2Nzc1wiXSxcbn0pXG5leHBvcnQgY2xhc3MgVGFzVmlkZW9jYWxsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQge1xuICBASW5wdXQoKSBzZXNzaW9uSWQhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHRva2VuITogc3RyaW5nO1xuICBASW5wdXQoKSBpc1JldHVybmluZ0Zyb21QaXA6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBAVmlld0NoaWxkKFwicHVibGlzaGVyQ29udGFpbmVyXCIpIHB1Ymxpc2hlckNvbnRhaW5lciE6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoXCJzdWJzY3JpYmVyQ29udGFpbmVyXCIpIHN1YnNjcmliZXJDb250YWluZXIhOiBFbGVtZW50UmVmO1xuXG4gIHB1YmxpYyBpc1B1Ymxpc2hlclNtYWxsID0gdHJ1ZTtcbiAgcHVibGljIGNhbGxTdGF0ZSA9IENhbGxTdGF0ZS5JRExFO1xuICBwdWJsaWMgaXNNdXRlZCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgYWN0aXZlTW9kYWw6IE5nYkFjdGl2ZU1vZGFsLFxuICAgIHByaXZhdGUgdGFzU2VydmljZTogVGFzU2VydmljZVxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zZXR1cFN1YnNjcmlwdGlvbnMoKTtcbiAgICB0aGlzLmluaXRpYWxpemVDYWxsKCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pbml0SW50ZXJhY3QoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuXG4gICAgaWYgKCF0aGlzLnRhc1NlcnZpY2UuaXNQaXBNb2RlKCkpIHtcbiAgICAgIHRoaXMudGFzU2VydmljZS5kaXNjb25uZWN0U2Vzc2lvbigpO1xuICAgIH1cblxuICAgIGludGVyYWN0KFwiLnB1Ymxpc2hlci12aWV3XCIpLnVuc2V0KCk7XG4gIH1cblxuICAvLyBQdWJsaWMgTWV0aG9kc1xuICBoYW5nVXAoKTogdm9pZCB7XG4gICAgdGhpcy50YXNTZXJ2aWNlLmRpc2Nvbm5lY3RTZXNzaW9uKCk7XG4gIH1cblxuICB0b2dnbGVNdXRlKCk6IHZvaWQge1xuICAgIHRoaXMudGFzU2VydmljZS50b2dnbGVNdXRlKCk7XG4gIH1cblxuICBtaW5pbWl6ZSgpOiB2b2lkIHtcbiAgICB0aGlzLnRhc1NlcnZpY2UubW92ZU1haW5WaWRlb1RvKFwicGlwLW1haW4tdmlkZW9cIik7XG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnRhc1NlcnZpY2UuZW50ZXJQaXBNb2RlKCksIDUwKTtcbiAgfVxuXG4gIHRvZ2dsZVN3YXAoKTogdm9pZCB7XG4gICAgdGhpcy5pc1B1Ymxpc2hlclNtYWxsID0gIXRoaXMuaXNQdWJsaXNoZXJTbWFsbDtcbiAgICB0aGlzLnJlc2V0VmlkZW9Qb3NpdGlvbnMoKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuaW5pdEludGVyYWN0KCkpO1xuICB9XG5cbiAgb25Eb3VibGVDbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLnRvZ2dsZVN3YXAoKTtcbiAgfVxuXG4gIC8vIFByaXZhdGUgTWV0aG9kc1xuICBwcml2YXRlIHNldHVwU3Vic2NyaXB0aW9ucygpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy50YXNTZXJ2aWNlLmNhbGxTdGF0ZSQuc3Vic2NyaWJlKChzdGF0ZSkgPT4ge1xuICAgICAgICB0aGlzLmNhbGxTdGF0ZSA9IHN0YXRlO1xuICAgICAgICBpZiAoc3RhdGUgPT09IENhbGxTdGF0ZS5ESVNDT05ORUNURUQpIHtcbiAgICAgICAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKFwiaGFuZ3VwXCIpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy50YXNTZXJ2aWNlLnZpZXdNb2RlJC5zdWJzY3JpYmUoKG1vZGUpID0+IHtcbiAgICAgICAgaWYgKG1vZGUgPT09IFZpZXdNb2RlLlBJUCkge1xuICAgICAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoXCJwaXBcIik7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLnRhc1NlcnZpY2UuaXNNdXRlZCQuc3Vic2NyaWJlKChtdXRlZCkgPT4ge1xuICAgICAgICB0aGlzLmlzTXV0ZWQgPSBtdXRlZDtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUNhbGwoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNSZXR1cm5pbmdGcm9tUGlwKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMudGFzU2VydmljZS5tb3ZlVmlkZW9zVG9GdWxsc2NyZWVuKCksIDEwMCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnNlc3Npb25JZCAmJiB0aGlzLnRva2VuKSB7XG4gICAgICB0aGlzLnRhc1NlcnZpY2VcbiAgICAgICAgLmNvbm5lY3RTZXNzaW9uKFxuICAgICAgICAgIHRoaXMuc2Vzc2lvbklkLFxuICAgICAgICAgIHRoaXMudG9rZW4sXG4gICAgICAgICAgXCJwdWJsaXNoZXItY29udGFpbmVyXCIsXG4gICAgICAgICAgXCJzdWJzY3JpYmVyLWNvbnRhaW5lclwiXG4gICAgICAgIClcbiAgICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgY29ubmVjdGluZyB0byB2aWRlbyBjYWxsOlwiLCBlcnIpO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc2V0VmlkZW9Qb3NpdGlvbnMoKTogdm9pZCB7XG4gICAgY29uc3QgcHVibGlzaGVyRWwgPSB0aGlzLnB1Ymxpc2hlckNvbnRhaW5lcj8ubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICBjb25zdCBzdWJzY3JpYmVyRWwgPSB0aGlzLnN1YnNjcmliZXJDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICBpZiAocHVibGlzaGVyRWwpIHtcbiAgICAgIHB1Ymxpc2hlckVsLnJlbW92ZUF0dHJpYnV0ZShcInN0eWxlXCIpO1xuICAgICAgcHVibGlzaGVyRWwucmVtb3ZlQXR0cmlidXRlKFwiZGF0YS14XCIpO1xuICAgICAgcHVibGlzaGVyRWwucmVtb3ZlQXR0cmlidXRlKFwiZGF0YS15XCIpO1xuICAgIH1cblxuICAgIGlmIChzdWJzY3JpYmVyRWwpIHtcbiAgICAgIHN1YnNjcmliZXJFbC5yZW1vdmVBdHRyaWJ1dGUoXCJzdHlsZVwiKTtcbiAgICAgIHN1YnNjcmliZXJFbC5yZW1vdmVBdHRyaWJ1dGUoXCJkYXRhLXhcIik7XG4gICAgICBzdWJzY3JpYmVyRWwucmVtb3ZlQXR0cmlidXRlKFwiZGF0YS15XCIpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaW5pdEludGVyYWN0KCk6IHZvaWQge1xuICAgIGludGVyYWN0KFwiLnB1Ymxpc2hlci12aWV3XCIpLnVuc2V0KCk7XG5cbiAgICBpbnRlcmFjdChcIi5wdWJsaXNoZXItdmlld1wiKVxuICAgICAgLmRyYWdnYWJsZSh7XG4gICAgICAgIGluZXJ0aWE6IHRydWUsXG4gICAgICAgIG1vZGlmaWVyczogW1xuICAgICAgICAgIGludGVyYWN0Lm1vZGlmaWVycy5yZXN0cmljdFJlY3Qoe1xuICAgICAgICAgICAgcmVzdHJpY3Rpb246IFwicGFyZW50XCIsXG4gICAgICAgICAgICBlbmRPbmx5OiB0cnVlLFxuICAgICAgICAgIH0pLFxuICAgICAgICBdLFxuICAgICAgICBhdXRvU2Nyb2xsOiB0cnVlLFxuICAgICAgICBsaXN0ZW5lcnM6IHtcbiAgICAgICAgICBtb3ZlOiAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICAgICAgICAgIGNvbnN0IHggPVxuICAgICAgICAgICAgICAocGFyc2VGbG9hdCh0YXJnZXQuZ2V0QXR0cmlidXRlKFwiZGF0YS14XCIpKSB8fCAwKSArIGV2ZW50LmR4O1xuICAgICAgICAgICAgY29uc3QgeSA9XG4gICAgICAgICAgICAgIChwYXJzZUZsb2F0KHRhcmdldC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXlcIikpIHx8IDApICsgZXZlbnQuZHk7XG5cbiAgICAgICAgICAgIHRhcmdldC5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlKCR7eH1weCwgJHt5fXB4KWA7XG4gICAgICAgICAgICB0YXJnZXQuc2V0QXR0cmlidXRlKFwiZGF0YS14XCIsIFN0cmluZyh4KSk7XG4gICAgICAgICAgICB0YXJnZXQuc2V0QXR0cmlidXRlKFwiZGF0YS15XCIsIFN0cmluZyh5KSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICAucmVzaXphYmxlKHtcbiAgICAgICAgZWRnZXM6IHsgbGVmdDogZmFsc2UsIHJpZ2h0OiB0cnVlLCBib3R0b206IHRydWUsIHRvcDogZmFsc2UgfSxcbiAgICAgICAgbGlzdGVuZXJzOiB7XG4gICAgICAgICAgbW92ZTogKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgICAgICAgICBsZXQgeCA9IHBhcnNlRmxvYXQodGFyZ2V0LmdldEF0dHJpYnV0ZShcImRhdGEteFwiKSkgfHwgMDtcbiAgICAgICAgICAgIGxldCB5ID0gcGFyc2VGbG9hdCh0YXJnZXQuZ2V0QXR0cmlidXRlKFwiZGF0YS15XCIpKSB8fCAwO1xuXG4gICAgICAgICAgICB0YXJnZXQuc3R5bGUud2lkdGggPSBgJHtldmVudC5yZWN0LndpZHRofXB4YDtcbiAgICAgICAgICAgIHRhcmdldC5zdHlsZS5oZWlnaHQgPSBgJHtldmVudC5yZWN0LmhlaWdodH1weGA7XG5cbiAgICAgICAgICAgIHggKz0gZXZlbnQuZGVsdGFSZWN0LmxlZnQ7XG4gICAgICAgICAgICB5ICs9IGV2ZW50LmRlbHRhUmVjdC50b3A7XG5cbiAgICAgICAgICAgIHRhcmdldC5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlKCR7eH1weCwgJHt5fXB4KWA7XG4gICAgICAgICAgICB0YXJnZXQuc2V0QXR0cmlidXRlKFwiZGF0YS14XCIsIFN0cmluZyh4KSk7XG4gICAgICAgICAgICB0YXJnZXQuc2V0QXR0cmlidXRlKFwiZGF0YS15XCIsIFN0cmluZyh5KSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgbW9kaWZpZXJzOiBbXG4gICAgICAgICAgaW50ZXJhY3QubW9kaWZpZXJzLnJlc3RyaWN0RWRnZXMoeyBvdXRlcjogXCJwYXJlbnRcIiB9KSxcbiAgICAgICAgICBpbnRlcmFjdC5tb2RpZmllcnMucmVzdHJpY3RTaXplKHsgbWluOiB7IHdpZHRoOiAxNTAsIGhlaWdodDogMTAwIH0gfSksXG4gICAgICAgICAgaW50ZXJhY3QubW9kaWZpZXJzLmFzcGVjdFJhdGlvKHsgcmF0aW86IFwicHJlc2VydmVcIiB9KSxcbiAgICAgICAgXSxcbiAgICAgICAgaW5lcnRpYTogdHJ1ZSxcbiAgICAgIH0pO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwidGFzLXZpZGVvY2FsbC1jb250YWluZXJcIj5cbiAgPGRpdlxuICAgIGlkPVwic3Vic2NyaWJlci1jb250YWluZXJcIlxuICAgIFtjbGFzcy5zdWJzY3JpYmVyLXZpZXddPVwiaXNQdWJsaXNoZXJTbWFsbFwiXG4gICAgW2NsYXNzLnB1Ymxpc2hlci12aWV3XT1cIiFpc1B1Ymxpc2hlclNtYWxsXCJcbiAgICAjc3Vic2NyaWJlckNvbnRhaW5lclxuICAgIChkYmxjbGljayk9XCJvbkRvdWJsZUNsaWNrKClcIlxuICA+PC9kaXY+XG5cbiAgPGRpdlxuICAgIGlkPVwicHVibGlzaGVyLWNvbnRhaW5lclwiXG4gICAgW2NsYXNzLnB1Ymxpc2hlci12aWV3XT1cImlzUHVibGlzaGVyU21hbGxcIlxuICAgIFtjbGFzcy5zdWJzY3JpYmVyLXZpZXddPVwiIWlzUHVibGlzaGVyU21hbGxcIlxuICAgICNwdWJsaXNoZXJDb250YWluZXJcbiAgICAoZGJsY2xpY2spPVwib25Eb3VibGVDbGljaygpXCJcbiAgPjwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJjb250cm9scy1jb250YWluZXJcIj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIHN3YXAtYnRuXCIgKGNsaWNrKT1cInRvZ2dsZVN3YXAoKVwiIHRpdGxlPVwiQ2FtYmlhciB2aXN0YVwiPlxuICAgICAgPGkgY2xhc3M9XCJmYSBmYS1yZWZyZXNoXCI+PC9pPlxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b25cbiAgICAgIGNsYXNzPVwiYnRuIHBpcC1idG5cIlxuICAgICAgKGNsaWNrKT1cIm1pbmltaXplKClcIlxuICAgICAgdGl0bGU9XCJNaW5pbWl6YXIgKFBpY3R1cmUgaW4gUGljdHVyZSlcIlxuICAgID5cbiAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY29tcHJlc3NcIj48L2k+XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvblxuICAgICAgY2xhc3M9XCJidG4gbXV0ZS1idG5cIlxuICAgICAgW2NsYXNzLm11dGVkXT1cImlzTXV0ZWRcIlxuICAgICAgKGNsaWNrKT1cInRvZ2dsZU11dGUoKVwiXG4gICAgICBbdGl0bGVdPVwiaXNNdXRlZCA/ICdBY3RpdmFyIG1pY3LDs2Zvbm8nIDogJ1NpbGVuY2lhciBtaWNyw7Nmb25vJ1wiXG4gICAgPlxuICAgICAgPGlcbiAgICAgICAgY2xhc3M9XCJmYVwiXG4gICAgICAgIFtjbGFzcy5mYS1taWNyb3Bob25lXT1cIiFpc011dGVkXCJcbiAgICAgICAgW2NsYXNzLmZhLW1pY3JvcGhvbmUtc2xhc2hdPVwiaXNNdXRlZFwiXG4gICAgICA+PC9pPlxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJidG4gaGFuZ3VwLWJ0blwiIChjbGljayk9XCJoYW5nVXAoKVwiIHRpdGxlPVwiQ29sZ2FyXCI+XG4gICAgICA8aSBjbGFzcz1cImZhIGZhLXBob25lXCIgc3R5bGU9XCJ0cmFuc2Zvcm06IHJvdGF0ZSgxMzVkZWcpXCI+PC9pPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzLmludGVyZmFjZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2ludGVyZmFjZXMvdGFzLmludGVyZmFjZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlUm9vbVJlcXVlc3Qge1xuICB0ZW5hbnQ6IHN0cmluZztcbiAgdXNlcklkOiBzdHJpbmc7XG4gIHByb2R1Y3Q6IHN0cmluZztcbiAgcmVjb3JkOiBib29sZWFuO1xuICByb29tVHlwZTogVGFzUm9vbVR5cGU7XG4gIHR5cGU6IFRhc1Nlc3Npb25UeXBlO1xuICB1dGNTY2hlZHVsZWQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlUm9vbVJlc3BvbnNlIHtcbiAgY29udGVudDoge1xuICAgIHJvb21UeXBlOiBzdHJpbmcgfCBudWxsO1xuICAgIHRlbmFudDogc3RyaW5nIHwgbnVsbDtcbiAgICB1c2VyX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIHByb2R1Y3Q6IHN0cmluZyB8IG51bGw7XG4gICAgcmVjb3JkOiBib29sZWFuIHwgbnVsbDtcbiAgICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgfTtcbn1cblxuZXhwb3J0IHR5cGUgVGFzUm9vbVR5cGUgPSBcIlRBU1wiIHwgXCJKTVwiIHwgXCJXRUJJTkFSXCI7XG5cbmV4cG9ydCB0eXBlIFRhc1Nlc3Npb25UeXBlID0gXCJTUE9OVEFORU9VU1wiIHwgXCJTQ0hFRFVMRURcIjtcblxuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZVRva2VuUmVxdWVzdCB7XG4gIHNlc3Npb25JZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGxhc3RuYW1lOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJhdGVUb2tlblJlc3BvbnNlIHtcbiAgY29udGVudDoge1xuICAgIHRva2VuOiBzdHJpbmc7XG4gIH07XG59XG4iXX0=
@@ -0,0 +1,265 @@
1
+ import { Injectable, Inject, Optional } from "@angular/core";
2
+ import { BehaviorSubject } from "rxjs";
3
+ import { catchError, map } from "rxjs/operators";
4
+ import * as OT from "@opentok/client";
5
+ import { TAS_CONFIG, TAS_HTTP_CLIENT, } from "../tas.config";
6
+ import * as i0 from "@angular/core";
7
+ export var CallState;
8
+ (function (CallState) {
9
+ CallState["IDLE"] = "IDLE";
10
+ CallState["CONNECTING"] = "CONNECTING";
11
+ CallState["CONNECTED"] = "CONNECTED";
12
+ CallState["DISCONNECTED"] = "DISCONNECTED";
13
+ CallState["ERROR"] = "ERROR";
14
+ })(CallState || (CallState = {}));
15
+ export var ViewMode;
16
+ (function (ViewMode) {
17
+ ViewMode["FULLSCREEN"] = "FULLSCREEN";
18
+ ViewMode["PIP"] = "PIP";
19
+ })(ViewMode || (ViewMode = {}));
20
+ export class TasService {
21
+ constructor(config, httpClient) {
22
+ this.config = config;
23
+ this.httpClient = httpClient;
24
+ this.session = null;
25
+ this.publisher = null;
26
+ this.subscribers = [];
27
+ this.callStateSubject = new BehaviorSubject(CallState.IDLE);
28
+ this.callState$ = this.callStateSubject.asObservable();
29
+ this.viewModeSubject = new BehaviorSubject(ViewMode.FULLSCREEN);
30
+ this.viewMode$ = this.viewModeSubject.asObservable();
31
+ this.isMutedSubject = new BehaviorSubject(false);
32
+ this.isMuted$ = this.isMutedSubject.asObservable();
33
+ // Session info for PiP mode restoration
34
+ this.currentSessionId = null;
35
+ this.currentToken = null;
36
+ if (!this.config || !this.httpClient) {
37
+ console.warn("TasService: Configuration not provided. Make sure to use TasModule.forRoot()");
38
+ }
39
+ }
40
+ // Getters
41
+ get currentSession() {
42
+ return this.session;
43
+ }
44
+ get currentPublisher() {
45
+ return this.publisher;
46
+ }
47
+ get currentSubscribers() {
48
+ return this.subscribers;
49
+ }
50
+ get sessionId() {
51
+ return this.currentSessionId;
52
+ }
53
+ get token() {
54
+ return this.currentToken;
55
+ }
56
+ get isMuted() {
57
+ return this.isMutedSubject.getValue();
58
+ }
59
+ // View Mode Methods
60
+ setViewMode(mode) {
61
+ this.viewModeSubject.next(mode);
62
+ }
63
+ enterPipMode() {
64
+ this.viewModeSubject.next(ViewMode.PIP);
65
+ }
66
+ exitPipMode() {
67
+ this.viewModeSubject.next(ViewMode.FULLSCREEN);
68
+ }
69
+ isPipMode() {
70
+ return this.viewModeSubject.getValue() === ViewMode.PIP;
71
+ }
72
+ // Audio Control
73
+ toggleMute() {
74
+ if (this.publisher) {
75
+ const newMuteState = !this.isMutedSubject.getValue();
76
+ this.publisher.publishAudio(!newMuteState);
77
+ this.isMutedSubject.next(newMuteState);
78
+ }
79
+ }
80
+ setMute(muted) {
81
+ if (this.publisher) {
82
+ this.publisher.publishAudio(!muted);
83
+ this.isMutedSubject.next(muted);
84
+ }
85
+ }
86
+ // Session Management
87
+ disconnectSession() {
88
+ if (this.session) {
89
+ this.session.disconnect();
90
+ this.session = null;
91
+ }
92
+ this.publisher = null;
93
+ this.subscribers = [];
94
+ this.currentSessionId = null;
95
+ this.currentToken = null;
96
+ this.isMutedSubject.next(false);
97
+ this.viewModeSubject.next(ViewMode.FULLSCREEN);
98
+ this.callStateSubject.next(CallState.DISCONNECTED);
99
+ }
100
+ isCallActive() {
101
+ return this.callStateSubject.getValue() === CallState.CONNECTED;
102
+ }
103
+ // API Methods
104
+ createRoom(payload) {
105
+ if (!this.config || !this.httpClient) {
106
+ throw new Error("TasService not configured. Use TasModule.forRoot()");
107
+ }
108
+ const url = `${this.config.apiBaseUrl}/v2/room`;
109
+ return this.httpClient.post(url, payload).pipe(map((response) => response), catchError((error) => {
110
+ console.error("TAS Service: createRoom failed", error);
111
+ throw error;
112
+ }));
113
+ }
114
+ generateToken(payload) {
115
+ if (!this.config || !this.httpClient) {
116
+ throw new Error("TasService not configured. Use TasModule.forRoot()");
117
+ }
118
+ const url = `${this.config.apiBaseUrl}/v2/room/token`;
119
+ return this.httpClient.post(url, payload).pipe(map((response) => response), catchError((error) => {
120
+ console.error("TAS Service: generateToken failed", error);
121
+ throw error;
122
+ }));
123
+ }
124
+ /**
125
+ * Connects to a TokBox video session
126
+ */
127
+ connectSession(sessionId, token, publisherElement, subscriberElement) {
128
+ this.callStateSubject.next(CallState.CONNECTING);
129
+ this.currentSessionId = sessionId;
130
+ this.currentToken = token;
131
+ return new Promise((resolve, reject) => {
132
+ if (!this.config) {
133
+ this.callStateSubject.next(CallState.ERROR);
134
+ reject(new Error("TasService not configured. Use TasModule.forRoot()"));
135
+ return;
136
+ }
137
+ if (!OT.checkSystemRequirements()) {
138
+ this.callStateSubject.next(CallState.ERROR);
139
+ reject(new Error("Browser not compatible with TokBox"));
140
+ return;
141
+ }
142
+ this.session = OT.initSession(this.config.tokBoxApiKey, sessionId);
143
+ // Handle new streams (remote participants joining)
144
+ this.session.on("streamCreated", (event) => {
145
+ const subscriber = this.session?.subscribe(event.stream, subscriberElement, {
146
+ insertMode: "append",
147
+ width: "100%",
148
+ height: "100%",
149
+ }, (error) => {
150
+ if (error) {
151
+ console.error("Error subscribing to stream:", error);
152
+ }
153
+ });
154
+ if (subscriber) {
155
+ this.subscribers.push(subscriber);
156
+ }
157
+ });
158
+ // Handle streams ending (remote participants leaving)
159
+ this.session.on("streamDestroyed", (event) => {
160
+ this.subscribers = this.subscribers.filter((sub) => sub.stream?.streamId !== event.stream.streamId);
161
+ });
162
+ // Handle session disconnection
163
+ this.session.on("sessionDisconnected", () => {
164
+ this.callStateSubject.next(CallState.DISCONNECTED);
165
+ });
166
+ // Connect to session
167
+ this.session.connect(token, (error) => {
168
+ if (error) {
169
+ console.error("Error connecting to session:", error);
170
+ this.callStateSubject.next(CallState.ERROR);
171
+ reject(error);
172
+ return;
173
+ }
174
+ // Initialize publisher (local video)
175
+ this.publisher = OT.initPublisher(publisherElement, {
176
+ insertMode: "append",
177
+ width: "100%",
178
+ height: "100%",
179
+ }, (err) => {
180
+ if (err) {
181
+ console.error("Error initializing publisher:", err);
182
+ this.callStateSubject.next(CallState.ERROR);
183
+ reject(err);
184
+ return;
185
+ }
186
+ // Publish to session
187
+ this.session?.publish(this.publisher, (pubErr) => {
188
+ if (pubErr) {
189
+ console.error("Error publishing stream:", pubErr);
190
+ this.callStateSubject.next(CallState.ERROR);
191
+ reject(pubErr);
192
+ }
193
+ else {
194
+ this.callStateSubject.next(CallState.CONNECTED);
195
+ resolve();
196
+ }
197
+ });
198
+ });
199
+ });
200
+ });
201
+ }
202
+ // Video Element Movement Methods
203
+ movePublisherTo(newContainerId) {
204
+ if (!this.publisher)
205
+ return;
206
+ const publisherElement = this.publisher.element;
207
+ const newContainer = document.getElementById(newContainerId);
208
+ if (publisherElement && newContainer) {
209
+ newContainer.appendChild(publisherElement);
210
+ }
211
+ }
212
+ moveSubscribersTo(newContainerId) {
213
+ const newContainer = document.getElementById(newContainerId);
214
+ if (!newContainer)
215
+ return;
216
+ this.subscribers.forEach((subscriber) => {
217
+ const subscriberElement = subscriber.element;
218
+ if (subscriberElement) {
219
+ newContainer.appendChild(subscriberElement);
220
+ }
221
+ });
222
+ }
223
+ /**
224
+ * Moves the main video (subscriber if available, otherwise publisher) to a container.
225
+ * Used for PiP mode to show only one video.
226
+ */
227
+ moveMainVideoTo(newContainerId) {
228
+ const newContainer = document.getElementById(newContainerId);
229
+ if (!newContainer)
230
+ return;
231
+ // Prefer remote video (subscriber) as main
232
+ if (this.subscribers.length > 0 && this.subscribers[0].element) {
233
+ newContainer.appendChild(this.subscribers[0].element);
234
+ return;
235
+ }
236
+ // Fall back to local video (publisher)
237
+ if (this.publisher?.element) {
238
+ newContainer.appendChild(this.publisher.element);
239
+ }
240
+ }
241
+ /**
242
+ * Moves videos back to fullscreen containers
243
+ */
244
+ moveVideosToFullscreen() {
245
+ this.moveSubscribersTo("subscriber-container");
246
+ this.movePublisherTo("publisher-container");
247
+ }
248
+ }
249
+ TasService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TasService, deps: [{ token: TAS_CONFIG, optional: true }, { token: TAS_HTTP_CLIENT, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
250
+ TasService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TasService, providedIn: "root" });
251
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TasService, decorators: [{
252
+ type: Injectable,
253
+ args: [{ providedIn: "root" }]
254
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
255
+ type: Optional
256
+ }, {
257
+ type: Inject,
258
+ args: [TAS_CONFIG]
259
+ }] }, { type: undefined, decorators: [{
260
+ type: Optional
261
+ }, {
262
+ type: Inject,
263
+ args: [TAS_HTTP_CLIENT]
264
+ }] }]; } });
265
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NlcnZpY2VzL3Rhcy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakQsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN0QyxPQUFPLEVBQ0wsVUFBVSxFQUNWLGVBQWUsR0FHaEIsTUFBTSxlQUFlLENBQUM7O0FBUXZCLE1BQU0sQ0FBTixJQUFZLFNBTVg7QUFORCxXQUFZLFNBQVM7SUFDbkIsMEJBQWEsQ0FBQTtJQUNiLHNDQUF5QixDQUFBO0lBQ3pCLG9DQUF1QixDQUFBO0lBQ3ZCLDBDQUE2QixDQUFBO0lBQzdCLDRCQUFlLENBQUE7QUFDakIsQ0FBQyxFQU5XLFNBQVMsS0FBVCxTQUFTLFFBTXBCO0FBRUQsTUFBTSxDQUFOLElBQVksUUFHWDtBQUhELFdBQVksUUFBUTtJQUNsQixxQ0FBeUIsQ0FBQTtJQUN6Qix1QkFBVyxDQUFBO0FBQ2IsQ0FBQyxFQUhXLFFBQVEsS0FBUixRQUFRLFFBR25CO0FBR0QsTUFBTSxPQUFPLFVBQVU7SUFrQnJCLFlBQzBDLE1BQXdCLEVBQ25CLFVBQWdDO1FBRHJDLFdBQU0sR0FBTixNQUFNLENBQWtCO1FBQ25CLGVBQVUsR0FBVixVQUFVLENBQXNCO1FBbkJ2RSxZQUFPLEdBQXNCLElBQUksQ0FBQztRQUNsQyxjQUFTLEdBQXdCLElBQUksQ0FBQztRQUN0QyxnQkFBVyxHQUFvQixFQUFFLENBQUM7UUFFbEMscUJBQWdCLEdBQUcsSUFBSSxlQUFlLENBQVksU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFD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QUVEOzs7T0FHRztJQUNJLGVBQWUsQ0FBQyxjQUFzQjtRQUMzQyxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyxZQUFZO1lBQUUsT0FBTztRQUUxQiwyQ0FBMkM7UUFDM0MsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUU7WUFDOUQsWUFBWSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3RELE9BQU87U0FDUjtRQUVELHVDQUF1QztRQUN2QyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFO1lBQzNCLFlBQVksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNsRDtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLHNCQUFzQjtRQUMzQixJQUFJLENBQUMsaUJBQWlCLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsZUFBZSxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDOUMsQ0FBQzs7dUdBcFNVLFVBQVUsa0JBbUJDLFVBQVUsNkJBQ1YsZUFBZTsyR0FwQjFCLFVBQVUsY0FERyxNQUFNOzJGQUNuQixVQUFVO2tCQUR0QixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRTs7MEJBb0I3QixRQUFROzswQkFBSSxNQUFNOzJCQUFDLFVBQVU7OzBCQUM3QixRQUFROzswQkFBSSxNQUFNOzJCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QsIE9wdGlvbmFsIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBtYXAgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcbmltcG9ydCAqIGFzIE9UIGZyb20gXCJAb3BlbnRvay9jbGllbnRcIjtcbmltcG9ydCB7XG4gIFRBU19DT05GSUcsXG4gIFRBU19IVFRQX0NMSUVOVCxcbiAgVGFzQ29uZmlnLFxuICBUYXNIdHRwQ2xpZW50LFxufSBmcm9tIFwiLi4vdGFzLmNvbmZpZ1wiO1xuaW1wb3J0IHtcbiAgQ3JlYXRlUm9vbVJlcXVlc3QsXG4gIENyZWF0ZVJvb21SZXNwb25zZSxcbiAgR2VuZXJhdGVUb2tlblJlcXVlc3QsXG4gIEdlbmVyYXRlVG9rZW5SZXNwb25zZSxcbn0gZnJvbSBcIi4uL2ludGVyZmFjZXMvdGFzLmludGVyZmFjZXNcIjtcblxuZXhwb3J0IGVudW0gQ2FsbFN0YXRlIHtcbiAgSURMRSA9IFwiSURMRVwiLFxuICBDT05ORUNUSU5HID0gXCJDT05ORUNUSU5HXCIsXG4gIENPTk5FQ1RFRCA9IFwiQ09OTkVDVEVEXCIsXG4gIERJU0NPTk5FQ1RFRCA9IFwiRElTQ09OTkVDVEVEXCIsXG4gIEVSUk9SID0gXCJFUlJPUlwiLFxufVxuXG5leHBvcnQgZW51bSBWaWV3TW9kZSB7XG4gIEZVTExTQ1JFRU4gPSBcIkZVTExTQ1JFRU5cIixcbiAgUElQID0gXCJQSVBcIixcbn1cblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiBcInJvb3RcIiB9KVxuZXhwb3J0IGNsYXNzIFRhc1NlcnZpY2Uge1xuICBwcml2YXRlIHNlc3Npb246IE9ULlNlc3Npb24gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwdWJsaXNoZXI6IE9ULlB1Ymxpc2hlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHN1YnNjcmliZXJzOiBPVC5TdWJzY3JpYmVyW10gPSBbXTtcblxuICBwcml2YXRlIGNhbGxTdGF0ZVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PENhbGxTdGF0ZT4oQ2FsbFN0YXRlLklETEUpO1xuICBwdWJsaWMgY2FsbFN0YXRlJCA9IHRoaXMuY2FsbFN0YXRlU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICBwcml2YXRlIHZpZXdNb2RlU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Vmlld01vZGU+KFZpZXdNb2RlLkZVTExTQ1JFRU4pO1xuICBwdWJsaWMgdmlld01vZGUkID0gdGhpcy52aWV3TW9kZVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgcHJpdmF0ZSBpc011dGVkU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwdWJsaWMgaXNNdXRlZCQgPSB0aGlzLmlzTXV0ZWRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gIC8vIFNlc3Npb24gaW5mbyBmb3IgUGlQIG1vZGUgcmVzdG9yYXRpb25cbiAgcHJpdmF0ZSBjdXJyZW50U2Vzc2lvbklkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjdXJyZW50VG9rZW46IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoVEFTX0NPTkZJRykgcHJpdmF0ZSBjb25maWc6IFRhc0NvbmZpZyB8IG51bGwsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChUQVNfSFRUUF9DTElFTlQpIHByaXZhdGUgaHR0cENsaWVudDogVGFzSHR0cENsaWVudCB8IG51bGxcbiAgKSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZyB8fCAhdGhpcy5odHRwQ2xpZW50KSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiVGFzU2VydmljZTogQ29uZmlndXJhdGlvbiBub3QgcHJvdmlkZWQuIE1ha2Ugc3VyZSB0byB1c2UgVGFzTW9kdWxlLmZvclJvb3QoKVwiXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgcHVibGljIGdldCBjdXJyZW50U2Vzc2lvbigpOiBPVC5TZXNzaW9uIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY3VycmVudFB1Ymxpc2hlcigpOiBPVC5QdWJsaXNoZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5wdWJsaXNoZXI7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGN1cnJlbnRTdWJzY3JpYmVycygpOiBPVC5TdWJzY3JpYmVyW10ge1xuICAgIHJldHVybiB0aGlzLnN1YnNjcmliZXJzO1xuICB9XG5cbiAgcHVibGljIGdldCBzZXNzaW9uSWQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFNlc3Npb25JZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdG9rZW4oKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFRva2VuO1xuICB9XG5cbiAgcHVibGljIGdldCBpc011dGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzTXV0ZWRTdWJqZWN0LmdldFZhbHVlKCk7XG4gIH1cblxuICAvLyBWaWV3IE1vZGUgTWV0aG9kc1xuICBwdWJsaWMgc2V0Vmlld01vZGUobW9kZTogVmlld01vZGUpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdNb2RlU3ViamVjdC5uZXh0KG1vZGUpO1xuICB9XG5cbiAgcHVibGljIGVudGVyUGlwTW9kZSgpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdNb2RlU3ViamVjdC5uZXh0KFZpZXdNb2RlLlBJUCk7XG4gIH1cblxuICBwdWJsaWMgZXhpdFBpcE1vZGUoKTogdm9pZCB7XG4gICAgdGhpcy52aWV3TW9kZVN1YmplY3QubmV4dChWaWV3TW9kZS5GVUxMU0NSRUVOKTtcbiAgfVxuXG4gIHB1YmxpYyBpc1BpcE1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudmlld01vZGVTdWJqZWN0LmdldFZhbHVlKCkgPT09IFZpZXdNb2RlLlBJUDtcbiAgfVxuXG4gIC8vIEF1ZGlvIENvbnRyb2xcbiAgcHVibGljIHRvZ2dsZU11dGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucHVibGlzaGVyKSB7XG4gICAgICBjb25zdCBuZXdNdXRlU3RhdGUgPSAhdGhpcy5pc011dGVkU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgICAgdGhpcy5wdWJsaXNoZXIucHVibGlzaEF1ZGlvKCFuZXdNdXRlU3RhdGUpO1xuICAgICAgdGhpcy5pc011dGVkU3ViamVjdC5uZXh0KG5ld011dGVTdGF0ZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldE11dGUobXV0ZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wdWJsaXNoZXIpIHtcbiAgICAgIHRoaXMucHVibGlzaGVyLnB1Ymxpc2hBdWRpbyghbXV0ZWQpO1xuICAgICAgdGhpcy5pc011dGVkU3ViamVjdC5uZXh0KG11dGVkKTtcbiAgICB9XG4gIH1cblxuICAvLyBTZXNzaW9uIE1hbmFnZW1lbnRcbiAgcHVibGljIGRpc2Nvbm5lY3RTZXNzaW9uKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNlc3Npb24pIHtcbiAgICAgIHRoaXMuc2Vzc2lvbi5kaXNjb25uZWN0KCk7XG4gICAgICB0aGlzLnNlc3Npb24gPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLnB1Ymxpc2hlciA9IG51bGw7XG4gICAgdGhpcy5zdWJzY3JpYmVycyA9IFtdO1xuICAgIHRoaXMuY3VycmVudFNlc3Npb25JZCA9IG51bGw7XG4gICAgdGhpcy5jdXJyZW50VG9rZW4gPSBudWxsO1xuICAgIHRoaXMuaXNNdXRlZFN1YmplY3QubmV4dChmYWxzZSk7XG4gICAgdGhpcy52aWV3TW9kZVN1YmplY3QubmV4dChWaWV3TW9kZS5GVUxMU0NSRUVOKTtcbiAgICB0aGlzLmNhbGxTdGF0ZVN1YmplY3QubmV4dChDYWxsU3RhdGUuRElTQ09OTkVDVEVEKTtcbiAgfVxuXG4gIHB1YmxpYyBpc0NhbGxBY3RpdmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY2FsbFN0YXRlU3ViamVjdC5nZXRWYWx1ZSgpID09PSBDYWxsU3RhdGUuQ09OTkVDVEVEO1xuICB9XG5cbiAgLy8gQVBJIE1ldGhvZHNcbiAgcHVibGljIGNyZWF0ZVJvb20oXG4gICAgcGF5bG9hZDogQ3JlYXRlUm9vbVJlcXVlc3RcbiAgKTogT2JzZXJ2YWJsZTxDcmVhdGVSb29tUmVzcG9uc2U+IHtcbiAgICBpZiAoIXRoaXMuY29uZmlnIHx8ICF0aGlzLmh0dHBDbGllbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlRhc1NlcnZpY2Ugbm90IGNvbmZpZ3VyZWQuIFVzZSBUYXNNb2R1bGUuZm9yUm9vdCgpXCIpO1xuICAgIH1cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmNvbmZpZy5hcGlCYXNlVXJsfS92Mi9yb29tYDtcbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnBvc3Q8Q3JlYXRlUm9vbVJlc3BvbnNlPih1cmwsIHBheWxvYWQpLnBpcGUoXG4gICAgICBtYXAoKHJlc3BvbnNlKSA9PiByZXNwb25zZSBhcyBDcmVhdGVSb29tUmVzcG9uc2UpLFxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIlRBUyBTZXJ2aWNlOiBjcmVhdGVSb29tIGZhaWxlZFwiLCBlcnJvcik7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdlbmVyYXRlVG9rZW4oXG4gICAgcGF5bG9hZDogR2VuZXJhdGVUb2tlblJlcXVlc3RcbiAgKTogT2JzZXJ2YWJsZTxHZW5lcmF0ZVRva2VuUmVzcG9uc2U+IHtcbiAgICBpZiAoIXRoaXMuY29uZmlnIHx8ICF0aGlzLmh0dHBDbGllbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlRhc1NlcnZpY2Ugbm90IGNvbmZpZ3VyZWQuIFVzZSBUYXNNb2R1bGUuZm9yUm9vdCgpXCIpO1xuICAgIH1cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmNvbmZpZy5hcGlCYXNlVXJsfS92Mi9yb29tL3Rva2VuYDtcbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnBvc3Q8R2VuZXJhdGVUb2tlblJlc3BvbnNlPih1cmwsIHBheWxvYWQpLnBpcGUoXG4gICAgICBtYXAoKHJlc3BvbnNlOiBhbnkpID0+IHJlc3BvbnNlIGFzIEdlbmVyYXRlVG9rZW5SZXNwb25zZSksXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiVEFTIFNlcnZpY2U6IGdlbmVyYXRlVG9rZW4gZmFpbGVkXCIsIGVycm9yKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ29ubmVjdHMgdG8gYSBUb2tCb3ggdmlkZW8gc2Vzc2lvblxuICAgKi9cbiAgcHVibGljIGNvbm5lY3RTZXNzaW9uKFxuICAgIHNlc3Npb25JZDogc3RyaW5nLFxuICAgIHRva2VuOiBzdHJpbmcsXG4gICAgcHVibGlzaGVyRWxlbWVudDogc3RyaW5nLFxuICAgIHN1YnNjcmliZXJFbGVtZW50OiBzdHJpbmdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5jYWxsU3RhdGVTdWJqZWN0Lm5leHQoQ2FsbFN0YXRlLkNPTk5FQ1RJTkcpO1xuICAgIHRoaXMuY3VycmVudFNlc3Npb25JZCA9IHNlc3Npb25JZDtcbiAgICB0aGlzLmN1cnJlbnRUb2tlbiA9IHRva2VuO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsgICBcbiAgICAgIGlmICghdGhpcy5jb25maWcpIHtcbiAgICAgICAgdGhpcy5jYWxsU3RhdGVTdWJqZWN0Lm5leHQoQ2FsbFN0YXRlLkVSUk9SKTtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihcIlRhc1NlcnZpY2Ugbm90IGNvbmZpZ3VyZWQuIFVzZSBUYXNNb2R1bGUuZm9yUm9vdCgpXCIpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIU9ULmNoZWNrU3lzdGVtUmVxdWlyZW1lbnRzKCkpIHtcbiAgICAgICAgdGhpcy5jYWxsU3RhdGVTdWJqZWN0Lm5leHQoQ2FsbFN0YXRlLkVSUk9SKTtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihcIkJyb3dzZXIgbm90IGNvbXBhdGlibGUgd2l0aCBUb2tCb3hcIikpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2Vzc2lvbiA9IE9ULmluaXRTZXNzaW9uKHRoaXMuY29uZmlnLnRva0JveEFwaUtleSwgc2Vzc2lvbklkKTtcblxuICAgICAgLy8gSGFuZGxlIG5ldyBzdHJlYW1zIChyZW1vdGUgcGFydGljaXBhbnRzIGpvaW5pbmcpXG4gICAgICB0aGlzLnNlc3Npb24ub24oXCJzdHJlYW1DcmVhdGVkXCIsIChldmVudCkgPT4ge1xuICAgICAgICBjb25zdCBzdWJzY3JpYmVyID0gdGhpcy5zZXNzaW9uPy5zdWJzY3JpYmUoXG4gICAgICAgICAgZXZlbnQuc3RyZWFtLFxuICAgICAgICAgIHN1YnNjcmliZXJFbGVtZW50LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGluc2VydE1vZGU6IFwiYXBwZW5kXCIsXG4gICAgICAgICAgICB3aWR0aDogXCIxMDAlXCIsXG4gICAgICAgICAgICBoZWlnaHQ6IFwiMTAwJVwiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIHN1YnNjcmliaW5nIHRvIHN0cmVhbTpcIiwgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHN1YnNjcmliZXIpIHtcbiAgICAgICAgICB0aGlzLnN1YnNjcmliZXJzLnB1c2goc3Vic2NyaWJlcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBIYW5kbGUgc3RyZWFtcyBlbmRpbmcgKHJlbW90ZSBwYXJ0aWNpcGFudHMgbGVhdmluZylcbiAgICAgIHRoaXMuc2Vzc2lvbi5vbihcInN0cmVhbURlc3Ryb3llZFwiLCAoZXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmVycyA9IHRoaXMuc3Vic2NyaWJlcnMuZmlsdGVyKFxuICAgICAgICAgIChzdWIpID0+IHN1Yi5zdHJlYW0/LnN0cmVhbUlkICE9PSBldmVudC5zdHJlYW0uc3RyZWFtSWRcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBIYW5kbGUgc2Vzc2lvbiBkaXNjb25uZWN0aW9uXG4gICAgICB0aGlzLnNlc3Npb24ub24oXCJzZXNzaW9uRGlzY29ubmVjdGVkXCIsICgpID0+IHtcbiAgICAgICAgdGhpcy5jYWxsU3RhdGVTdWJqZWN0Lm5leHQoQ2FsbFN0YXRlLkRJU0NPTk5FQ1RFRCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gQ29ubmVjdCB0byBzZXNzaW9uXG4gICAgICB0aGlzLnNlc3Npb24uY29ubmVjdCh0b2tlbiwgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBjb25uZWN0aW5nIHRvIHNlc3Npb246XCIsIGVycm9yKTtcbiAgICAgICAgICB0aGlzLmNhbGxTdGF0ZVN1YmplY3QubmV4dChDYWxsU3RhdGUuRVJST1IpO1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBwdWJsaXNoZXIgKGxvY2FsIHZpZGVvKVxuICAgICAgICB0aGlzLnB1Ymxpc2hlciA9IE9ULmluaXRQdWJsaXNoZXIoXG4gICAgICAgICAgcHVibGlzaGVyRWxlbWVudCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpbnNlcnRNb2RlOiBcImFwcGVuZFwiLFxuICAgICAgICAgICAgd2lkdGg6IFwiMTAwJVwiLFxuICAgICAgICAgICAgaGVpZ2h0OiBcIjEwMCVcIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIChlcnIpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGluaXRpYWxpemluZyBwdWJsaXNoZXI6XCIsIGVycik7XG4gICAgICAgICAgICAgIHRoaXMuY2FsbFN0YXRlU3ViamVjdC5uZXh0KENhbGxTdGF0ZS5FUlJPUik7XG4gICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFB1Ymxpc2ggdG8gc2Vzc2lvblxuICAgICAgICAgICAgdGhpcy5zZXNzaW9uPy5wdWJsaXNoKHRoaXMucHVibGlzaGVyISwgKHB1YkVycikgPT4ge1xuICAgICAgICAgICAgICBpZiAocHViRXJyKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIHB1Ymxpc2hpbmcgc3RyZWFtOlwiLCBwdWJFcnIpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2FsbFN0YXRlU3ViamVjdC5uZXh0KENhbGxTdGF0ZS5FUlJPUik7XG4gICAgICAgICAgICAgICAgcmVqZWN0KHB1YkVycik7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWxsU3RhdGVTdWJqZWN0Lm5leHQoQ2FsbFN0YXRlLkNPTk5FQ1RFRCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFZpZGVvIEVsZW1lbnQgTW92ZW1lbnQgTWV0aG9kc1xuICBwdWJsaWMgbW92ZVB1Ymxpc2hlclRvKG5ld0NvbnRhaW5lcklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucHVibGlzaGVyKSByZXR1cm47XG5cbiAgICBjb25zdCBwdWJsaXNoZXJFbGVtZW50ID0gdGhpcy5wdWJsaXNoZXIuZWxlbWVudDtcbiAgICBjb25zdCBuZXdDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChuZXdDb250YWluZXJJZCk7XG5cbiAgICBpZiAocHVibGlzaGVyRWxlbWVudCAmJiBuZXdDb250YWluZXIpIHtcbiAgICAgIG5ld0NvbnRhaW5lci5hcHBlbmRDaGlsZChwdWJsaXNoZXJFbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbW92ZVN1YnNjcmliZXJzVG8obmV3Q29udGFpbmVySWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IG5ld0NvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG5ld0NvbnRhaW5lcklkKTtcbiAgICBpZiAoIW5ld0NvbnRhaW5lcikgcmV0dXJuO1xuXG4gICAgdGhpcy5zdWJzY3JpYmVycy5mb3JFYWNoKChzdWJzY3JpYmVyKSA9PiB7XG4gICAgICBjb25zdCBzdWJzY3JpYmVyRWxlbWVudCA9IHN1YnNjcmliZXIuZWxlbWVudDtcbiAgICAgIGlmIChzdWJzY3JpYmVyRWxlbWVudCkge1xuICAgICAgICBuZXdDb250YWluZXIuYXBwZW5kQ2hpbGQoc3Vic2NyaWJlckVsZW1lbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdmVzIHRoZSBtYWluIHZpZGVvIChzdWJzY3JpYmVyIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIHB1Ymxpc2hlcikgdG8gYSBjb250YWluZXIuXG4gICAqIFVzZWQgZm9yIFBpUCBtb2RlIHRvIHNob3cgb25seSBvbmUgdmlkZW8uXG4gICAqL1xuICBwdWJsaWMgbW92ZU1haW5WaWRlb1RvKG5ld0NvbnRhaW5lcklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBuZXdDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChuZXdDb250YWluZXJJZCk7XG4gICAgaWYgKCFuZXdDb250YWluZXIpIHJldHVybjtcblxuICAgIC8vIFByZWZlciByZW1vdGUgdmlkZW8gKHN1YnNjcmliZXIpIGFzIG1haW5cbiAgICBpZiAodGhpcy5zdWJzY3JpYmVycy5sZW5ndGggPiAwICYmIHRoaXMuc3Vic2NyaWJlcnNbMF0uZWxlbWVudCkge1xuICAgICAgbmV3Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuc3Vic2NyaWJlcnNbMF0uZWxlbWVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRmFsbCBiYWNrIHRvIGxvY2FsIHZpZGVvIChwdWJsaXNoZXIpXG4gICAgaWYgKHRoaXMucHVibGlzaGVyPy5lbGVtZW50KSB7XG4gICAgICBuZXdDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5wdWJsaXNoZXIuZWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1vdmVzIHZpZGVvcyBiYWNrIHRvIGZ1bGxzY3JlZW4gY29udGFpbmVyc1xuICAgKi9cbiAgcHVibGljIG1vdmVWaWRlb3NUb0Z1bGxzY3JlZW4oKTogdm9pZCB7XG4gICAgdGhpcy5tb3ZlU3Vic2NyaWJlcnNUbyhcInN1YnNjcmliZXItY29udGFpbmVyXCIpO1xuICAgIHRoaXMubW92ZVB1Ymxpc2hlclRvKFwicHVibGlzaGVyLWNvbnRhaW5lclwiKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,14 @@
1
+ import { InjectionToken } from "@angular/core";
2
+ /**
3
+ * Injection token for TAS configuration
4
+ */
5
+ export const TAS_CONFIG = new InjectionToken("TAS_CONFIG");
6
+ /**
7
+ * Injection token for HTTP client
8
+ */
9
+ export const TAS_HTTP_CLIENT = new InjectionToken("TAS_HTTP_CLIENT");
10
+ /**
11
+ * Injection token for user data provider
12
+ */
13
+ export const TAS_USER_DATA_PROVIDER = new InjectionToken("TAS_USER_DATA_PROVIDER");
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzLmNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvdGFzLmNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBK0MvQzs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxJQUFJLGNBQWMsQ0FBWSxZQUFZLENBQUMsQ0FBQztBQUV0RTs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxJQUFJLGNBQWMsQ0FDL0MsaUJBQWlCLENBQ2xCLENBQUM7QUFFRjs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLElBQUksY0FBYyxDQUN0RCx3QkFBd0IsQ0FDekIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGlvblRva2VuIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gaW50ZXJmYWNlIGZvciB0aGUgVEFTIFNES1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRhc0NvbmZpZyB7XG4gIC8qKlxuICAgKiBUb2tCb3gvVm9uYWdlIEFQSSBLZXlcbiAgICovXG4gIHRva0JveEFwaUtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBCYXNlIFVSTCBmb3IgdGhlIFRBUyBBUEkgZW5kcG9pbnRzXG4gICAqL1xuICBhcGlCYXNlVXJsOiBzdHJpbmc7XG59XG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciBIVFRQIGNsaWVudCB0aGF0IHRoZSBTREsgd2lsbCB1c2UuXG4gKiBJbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgaW4geW91ciBhcHAgYW5kIHByb3ZpZGUgaXQgdG8gdGhlIFNESy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYXNIdHRwQ2xpZW50IHtcbiAgcG9zdDxUPihcbiAgICB1cmw6IHN0cmluZyxcbiAgICBib2R5OiBhbnksXG4gICAgb3B0aW9ucz86IHsgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfVxuICApOiBPYnNlcnZhYmxlPFQ+O1xufVxuXG4vKipcbiAqIFVzZXIgZGF0YSBpbnRlcmZhY2UgcmVxdWlyZWQgYnkgVGFzQnV0dG9uQ29tcG9uZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFzVXNlckRhdGEge1xuICBpZDogc3RyaW5nIHwgbnVtYmVyO1xuICBuYW1lOiBzdHJpbmc7XG4gIHN1cm5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBVc2VyIGRhdGEgcHJvdmlkZXIgaW50ZXJmYWNlIC0gaW1wbGVtZW50IHRoaXMgdG8gcHJvdmlkZSB1c2VyIGRhdGEgdG8gdGhlIFNES1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRhc1VzZXJEYXRhUHJvdmlkZXIge1xuICBnZXRVc2VyRGF0YSgpOiBUYXNVc2VyRGF0YSB8IG51bGw7XG4gIGdldFRlbmFudElkKCk6IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKlxuICogSW5qZWN0aW9uIHRva2VuIGZvciBUQVMgY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgY29uc3QgVEFTX0NPTkZJRyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxUYXNDb25maWc+KFwiVEFTX0NPTkZJR1wiKTtcblxuLyoqXG4gKiBJbmplY3Rpb24gdG9rZW4gZm9yIEhUVFAgY2xpZW50XG4gKi9cbmV4cG9ydCBjb25zdCBUQVNfSFRUUF9DTElFTlQgPSBuZXcgSW5qZWN0aW9uVG9rZW48VGFzSHR0cENsaWVudD4oXG4gIFwiVEFTX0hUVFBfQ0xJRU5UXCJcbik7XG5cbi8qKlxuICogSW5qZWN0aW9uIHRva2VuIGZvciB1c2VyIGRhdGEgcHJvdmlkZXJcbiAqL1xuZXhwb3J0IGNvbnN0IFRBU19VU0VSX0RBVEFfUFJPVklERVIgPSBuZXcgSW5qZWN0aW9uVG9rZW48VGFzVXNlckRhdGFQcm92aWRlcj4oXG4gIFwiVEFTX1VTRVJfREFUQV9QUk9WSURFUlwiXG4pO1xuIl19
@@ -0,0 +1,73 @@
1
+ import { NgModule } from "@angular/core";
2
+ import { CommonModule } from "@angular/common";
3
+ import { NgbModalModule } from "@ng-bootstrap/ng-bootstrap";
4
+ import { TasButtonComponent } from "./components/tas-btn/tas-btn.component";
5
+ import { TasVideocallComponent } from "./components/tas-videocall/tas-videocall.component";
6
+ import { TasFloatingCallComponent } from "./components/tas-floating-call/tas-floating-call.component";
7
+ import { TAS_CONFIG, TAS_HTTP_CLIENT, TAS_USER_DATA_PROVIDER, } from "./tas.config";
8
+ import * as i0 from "@angular/core";
9
+ export class TasModule {
10
+ /**
11
+ * Use this method in your app module to configure the TAS SDK
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * TasModule.forRoot({
16
+ * config: {
17
+ * tokBoxApiKey: environment.tokBox,
18
+ * apiBaseUrl: environment.apiUrl
19
+ * },
20
+ * httpClient: MyHttpClientAdapter,
21
+ * userDataProvider: MyUserDataProvider
22
+ * })
23
+ * ```
24
+ */
25
+ static forRoot(moduleConfig) {
26
+ const providers = [
27
+ {
28
+ provide: TAS_CONFIG,
29
+ useValue: moduleConfig.config,
30
+ },
31
+ ];
32
+ if (moduleConfig.httpClient) {
33
+ providers.push({
34
+ provide: TAS_HTTP_CLIENT,
35
+ useClass: moduleConfig.httpClient,
36
+ });
37
+ }
38
+ if (moduleConfig.userDataProvider) {
39
+ providers.push({
40
+ provide: TAS_USER_DATA_PROVIDER,
41
+ useClass: moduleConfig.userDataProvider,
42
+ });
43
+ }
44
+ return {
45
+ ngModule: TasModule,
46
+ providers,
47
+ };
48
+ }
49
+ }
50
+ TasModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TasModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
51
+ TasModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TasModule, declarations: [TasButtonComponent,
52
+ TasVideocallComponent,
53
+ TasFloatingCallComponent], imports: [CommonModule, NgbModalModule], exports: [TasButtonComponent,
54
+ TasVideocallComponent,
55
+ TasFloatingCallComponent] });
56
+ TasModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TasModule, imports: [[CommonModule, NgbModalModule]] });
57
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TasModule, decorators: [{
58
+ type: NgModule,
59
+ args: [{
60
+ declarations: [
61
+ TasButtonComponent,
62
+ TasVideocallComponent,
63
+ TasFloatingCallComponent,
64
+ ],
65
+ imports: [CommonModule, NgbModalModule],
66
+ exports: [
67
+ TasButtonComponent,
68
+ TasVideocallComponent,
69
+ TasFloatingCallComponent,
70
+ ],
71
+ }]
72
+ }] });
73
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvdGFzLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUF1QixNQUFNLGVBQWUsQ0FBQztBQUM5RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRTVELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG9EQUFvRCxDQUFDO0FBQzNGLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDREQUE0RCxDQUFDO0FBQ3RHLE9BQU8sRUFDTCxVQUFVLEVBQ1YsZUFBZSxFQUNmLHNCQUFzQixHQUl2QixNQUFNLGNBQWMsQ0FBQzs7QUFxQnRCLE1BQU0sT0FBTyxTQUFTO0lBQ3BCOzs7Ozs7Ozs7Ozs7OztPQWNHO0lBQ0gsTUFBTSxDQUFDLE9BQU8sQ0FDWixZQUE2QjtRQUU3QixNQUFNLFNBQVMsR0FBVTtZQUN2QjtnQkFDRSxPQUFPLEVBQUUsVUFBVTtnQkFDbkIsUUFBUSxFQUFFLFlBQVksQ0FBQyxNQUFNO2FBQzlCO1NBQ0YsQ0FBQztRQUVGLElBQUksWUFBWSxDQUFDLFVBQVUsRUFBRTtZQUMzQixTQUFTLENBQUMsSUFBSSxDQUFDO2dCQUNiLE9BQU8sRUFBRSxlQUFlO2dCQUN4QixRQUFRLEVBQUUsWUFBWSxDQUFDLFVBQVU7YUFDbEMsQ0FBQyxDQUFDO1NBQ0o7UUFFRCxJQUFJLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRTtZQUNqQyxTQUFTLENBQUMsSUFBSSxDQUFDO2dCQUNiLE9BQU8sRUFBRSxzQkFBc0I7Z0JBQy9CLFFBQVEsRUFBRSxZQUFZLENBQUMsZ0JBQWdCO2FBQ3hDLENBQUMsQ0FBQztTQUNKO1FBRUQsT0FBTztZQUNMLFFBQVEsRUFBRSxTQUFTO1lBQ25CLFNBQVM7U0FDVixDQUFDO0lBQ0osQ0FBQzs7c0dBNUNVLFNBQVM7dUdBQVQsU0FBUyxpQkFYbEIsa0JBQWtCO1FBQ2xCLHFCQUFxQjtRQUNyQix3QkFBd0IsYUFFaEIsWUFBWSxFQUFFLGNBQWMsYUFFcEMsa0JBQWtCO1FBQ2xCLHFCQUFxQjtRQUNyQix3QkFBd0I7dUdBR2YsU0FBUyxZQVBYLENBQUMsWUFBWSxFQUFFLGNBQWMsQ0FBQzsyRkFPNUIsU0FBUztrQkFickIsUUFBUTttQkFBQztvQkFDUixZQUFZLEVBQUU7d0JBQ1osa0JBQWtCO3dCQUNsQixxQkFBcUI7d0JBQ3JCLHdCQUF3QjtxQkFDekI7b0JBQ0QsT0FBTyxFQUFFLENBQUMsWUFBWSxFQUFFLGNBQWMsQ0FBQztvQkFDdkMsT0FBTyxFQUFFO3dCQUNQLGtCQUFrQjt3QkFDbEIscUJBQXFCO3dCQUNyQix3QkFBd0I7cUJBQ3pCO2lCQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUsIE1vZHVsZVdpdGhQcm92aWRlcnMgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuaW1wb3J0IHsgTmdiTW9kYWxNb2R1bGUgfSBmcm9tIFwiQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXBcIjtcblxuaW1wb3J0IHsgVGFzQnV0dG9uQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy90YXMtYnRuL3Rhcy1idG4uY29tcG9uZW50XCI7XG5pbXBvcnQgeyBUYXNWaWRlb2NhbGxDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRzL3Rhcy12aWRlb2NhbGwvdGFzLXZpZGVvY2FsbC5jb21wb25lbnRcIjtcbmltcG9ydCB7IFRhc0Zsb2F0aW5nQ2FsbENvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudHMvdGFzLWZsb2F0aW5nLWNhbGwvdGFzLWZsb2F0aW5nLWNhbGwuY29tcG9uZW50XCI7XG5pbXBvcnQge1xuICBUQVNfQ09ORklHLFxuICBUQVNfSFRUUF9DTElFTlQsXG4gIFRBU19VU0VSX0RBVEFfUFJPVklERVIsXG4gIFRhc0NvbmZpZyxcbiAgVGFzSHR0cENsaWVudCxcbiAgVGFzVXNlckRhdGFQcm92aWRlcixcbn0gZnJvbSBcIi4vdGFzLmNvbmZpZ1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRhc01vZHVsZUNvbmZpZyB7XG4gIGNvbmZpZzogVGFzQ29uZmlnO1xuICBodHRwQ2xpZW50PzogbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVGFzSHR0cENsaWVudDtcbiAgdXNlckRhdGFQcm92aWRlcj86IG5ldyAoLi4uYXJnczogYW55W10pID0+IFRhc1VzZXJEYXRhUHJvdmlkZXI7XG59XG5cbkBOZ01vZHVsZSh7XG4gIGRlY2xhcmF0aW9uczogW1xuICAgIFRhc0J1dHRvbkNvbXBvbmVudCxcbiAgICBUYXNWaWRlb2NhbGxDb21wb25lbnQsXG4gICAgVGFzRmxvYXRpbmdDYWxsQ29tcG9uZW50LFxuICBdLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBOZ2JNb2RhbE1vZHVsZV0sXG4gIGV4cG9ydHM6IFtcbiAgICBUYXNCdXR0b25Db21wb25lbnQsXG4gICAgVGFzVmlkZW9jYWxsQ29tcG9uZW50LFxuICAgIFRhc0Zsb2F0aW5nQ2FsbENvbXBvbmVudCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgVGFzTW9kdWxlIHtcbiAgLyoqXG4gICAqIFVzZSB0aGlzIG1ldGhvZCBpbiB5b3VyIGFwcCBtb2R1bGUgdG8gY29uZmlndXJlIHRoZSBUQVMgU0RLXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogVGFzTW9kdWxlLmZvclJvb3Qoe1xuICAgKiAgIGNvbmZpZzoge1xuICAgKiAgICAgdG9rQm94QXBpS2V5OiBlbnZpcm9ubWVudC50b2tCb3gsXG4gICAqICAgICBhcGlCYXNlVXJsOiBlbnZpcm9ubWVudC5hcGlVcmxcbiAgICogICB9LFxuICAgKiAgIGh0dHBDbGllbnQ6IE15SHR0cENsaWVudEFkYXB0ZXIsXG4gICAqICAgdXNlckRhdGFQcm92aWRlcjogTXlVc2VyRGF0YVByb3ZpZGVyXG4gICAqIH0pXG4gICAqIGBgYFxuICAgKi9cbiAgc3RhdGljIGZvclJvb3QoXG4gICAgbW9kdWxlQ29uZmlnOiBUYXNNb2R1bGVDb25maWdcbiAgKTogTW9kdWxlV2l0aFByb3ZpZGVyczxUYXNNb2R1bGU+IHtcbiAgICBjb25zdCBwcm92aWRlcnM6IGFueVtdID0gW1xuICAgICAge1xuICAgICAgICBwcm92aWRlOiBUQVNfQ09ORklHLFxuICAgICAgICB1c2VWYWx1ZTogbW9kdWxlQ29uZmlnLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIGlmIChtb2R1bGVDb25maWcuaHR0cENsaWVudCkge1xuICAgICAgcHJvdmlkZXJzLnB1c2goe1xuICAgICAgICBwcm92aWRlOiBUQVNfSFRUUF9DTElFTlQsXG4gICAgICAgIHVzZUNsYXNzOiBtb2R1bGVDb25maWcuaHR0cENsaWVudCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChtb2R1bGVDb25maWcudXNlckRhdGFQcm92aWRlcikge1xuICAgICAgcHJvdmlkZXJzLnB1c2goe1xuICAgICAgICBwcm92aWRlOiBUQVNfVVNFUl9EQVRBX1BST1ZJREVSLFxuICAgICAgICB1c2VDbGFzczogbW9kdWxlQ29uZmlnLnVzZXJEYXRhUHJvdmlkZXIsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbmdNb2R1bGU6IFRhc01vZHVsZSxcbiAgICAgIHByb3ZpZGVycyxcbiAgICB9O1xuICB9XG59XG4iXX0=
@@ -0,0 +1,16 @@
1
+ /*
2
+ * Public API Surface of tas-uell-sdk
3
+ */
4
+ // Module
5
+ export * from "./lib/tas.module";
6
+ // Configuration
7
+ export * from "./lib/tas.config";
8
+ // Services
9
+ export * from "./lib/services/tas.service";
10
+ // Components
11
+ export * from "./lib/components/tas-btn/tas-btn.component";
12
+ export * from "./lib/components/tas-videocall/tas-videocall.component";
13
+ export * from "./lib/components/tas-floating-call/tas-floating-call.component";
14
+ // Interfaces
15
+ export * from "./lib/interfaces/tas.interfaces";
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsU0FBUztBQUNULGNBQWMsa0JBQWtCLENBQUM7QUFFakMsZ0JBQWdCO0FBQ2hCLGNBQWMsa0JBQWtCLENBQUM7QUFFakMsV0FBVztBQUNYLGNBQWMsNEJBQTRCLENBQUM7QUFFM0MsYUFBYTtBQUNiLGNBQWMsNENBQTRDLENBQUM7QUFDM0QsY0FBYyx3REFBd0QsQ0FBQztBQUN2RSxjQUFjLGdFQUFnRSxDQUFDO0FBRS9FLGFBQWE7QUFDYixjQUFjLGlDQUFpQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiB0YXMtdWVsbC1zZGtcbiAqL1xuXG4vLyBNb2R1bGVcbmV4cG9ydCAqIGZyb20gXCIuL2xpYi90YXMubW9kdWxlXCI7XG5cbi8vIENvbmZpZ3VyYXRpb25cbmV4cG9ydCAqIGZyb20gXCIuL2xpYi90YXMuY29uZmlnXCI7XG5cbi8vIFNlcnZpY2VzXG5leHBvcnQgKiBmcm9tIFwiLi9saWIvc2VydmljZXMvdGFzLnNlcnZpY2VcIjtcblxuLy8gQ29tcG9uZW50c1xuZXhwb3J0ICogZnJvbSBcIi4vbGliL2NvbXBvbmVudHMvdGFzLWJ0bi90YXMtYnRuLmNvbXBvbmVudFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbGliL2NvbXBvbmVudHMvdGFzLXZpZGVvY2FsbC90YXMtdmlkZW9jYWxsLmNvbXBvbmVudFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbGliL2NvbXBvbmVudHMvdGFzLWZsb2F0aW5nLWNhbGwvdGFzLWZsb2F0aW5nLWNhbGwuY29tcG9uZW50XCI7XG5cbi8vIEludGVyZmFjZXNcbmV4cG9ydCAqIGZyb20gXCIuL2xpYi9pbnRlcmZhY2VzL3Rhcy5pbnRlcmZhY2VzXCI7XG4iXX0=