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 @@
1
+ {"version":3,"file":"tas-uell-sdk.mjs","sources":["../../src/lib/tas.config.ts","../../src/lib/services/tas.service.ts","../../src/lib/components/tas-videocall/tas-videocall.component.ts","../../src/lib/components/tas-videocall/tas-videocall.component.html","../../src/lib/components/tas-btn/tas-btn.component.ts","../../src/lib/components/tas-btn/tas-btn.component.html","../../src/lib/components/tas-floating-call/tas-floating-call.component.ts","../../src/lib/components/tas-floating-call/tas-floating-call.component.html","../../src/lib/tas.module.ts","../../src/public-api.ts","../../src/tas-uell-sdk.ts"],"sourcesContent":["import { InjectionToken } from \"@angular/core\";\nimport { Observable } from \"rxjs\";\n\n/**\n * Configuration interface for the TAS SDK\n */\nexport interface TasConfig {\n /**\n * TokBox/Vonage API Key\n */\n tokBoxApiKey: string;\n\n /**\n * Base URL for the TAS API endpoints\n */\n apiBaseUrl: string;\n}\n\n/**\n * Interface for HTTP client that the SDK will use.\n * Implement this interface in your app and provide it to the SDK.\n */\nexport interface TasHttpClient {\n post<T>(\n url: string,\n body: any,\n options?: { headers?: Record<string, string> }\n ): Observable<T>;\n}\n\n/**\n * User data interface required by TasButtonComponent\n */\nexport interface TasUserData {\n id: string | number;\n name: string;\n surname: string;\n}\n\n/**\n * User data provider interface - implement this to provide user data to the SDK\n */\nexport interface TasUserDataProvider {\n getUserData(): TasUserData | null;\n getTenantId(): string | null;\n}\n\n/**\n * Injection token for TAS configuration\n */\nexport const TAS_CONFIG = new InjectionToken<TasConfig>(\"TAS_CONFIG\");\n\n/**\n * Injection token for HTTP client\n */\nexport const TAS_HTTP_CLIENT = new InjectionToken<TasHttpClient>(\n \"TAS_HTTP_CLIENT\"\n);\n\n/**\n * Injection token for user data provider\n */\nexport const TAS_USER_DATA_PROVIDER = new InjectionToken<TasUserDataProvider>(\n \"TAS_USER_DATA_PROVIDER\"\n);\n","import { Injectable, Inject, Optional } from \"@angular/core\";\nimport { BehaviorSubject, Observable } from \"rxjs\";\nimport { catchError, map } from \"rxjs/operators\";\nimport * as OT from \"@opentok/client\";\nimport {\n TAS_CONFIG,\n TAS_HTTP_CLIENT,\n TasConfig,\n TasHttpClient,\n} from \"../tas.config\";\nimport {\n CreateRoomRequest,\n CreateRoomResponse,\n GenerateTokenRequest,\n GenerateTokenResponse,\n} from \"../interfaces/tas.interfaces\";\n\nexport enum CallState {\n IDLE = \"IDLE\",\n CONNECTING = \"CONNECTING\",\n CONNECTED = \"CONNECTED\",\n DISCONNECTED = \"DISCONNECTED\",\n ERROR = \"ERROR\",\n}\n\nexport enum ViewMode {\n FULLSCREEN = \"FULLSCREEN\",\n PIP = \"PIP\",\n}\n\n@Injectable({ providedIn: \"root\" })\nexport class TasService {\n private session: OT.Session | null = null;\n private publisher: OT.Publisher | null = null;\n private subscribers: OT.Subscriber[] = [];\n\n private callStateSubject = new BehaviorSubject<CallState>(CallState.IDLE);\n public callState$ = this.callStateSubject.asObservable();\n\n private viewModeSubject = new BehaviorSubject<ViewMode>(ViewMode.FULLSCREEN);\n public viewMode$ = this.viewModeSubject.asObservable();\n\n private isMutedSubject = new BehaviorSubject<boolean>(false);\n public isMuted$ = this.isMutedSubject.asObservable();\n\n // Session info for PiP mode restoration\n private currentSessionId: string | null = null;\n private currentToken: string | null = null;\n\n constructor(\n @Optional() @Inject(TAS_CONFIG) private config: TasConfig | null,\n @Optional() @Inject(TAS_HTTP_CLIENT) private httpClient: TasHttpClient | null\n ) {\n if (!this.config || !this.httpClient) {\n console.warn(\n \"TasService: Configuration not provided. Make sure to use TasModule.forRoot()\"\n );\n }\n }\n\n // Getters\n public get currentSession(): OT.Session | null {\n return this.session;\n }\n\n public get currentPublisher(): OT.Publisher | null {\n return this.publisher;\n }\n\n public get currentSubscribers(): OT.Subscriber[] {\n return this.subscribers;\n }\n\n public get sessionId(): string | null {\n return this.currentSessionId;\n }\n\n public get token(): string | null {\n return this.currentToken;\n }\n\n public get isMuted(): boolean {\n return this.isMutedSubject.getValue();\n }\n\n // View Mode Methods\n public setViewMode(mode: ViewMode): void {\n this.viewModeSubject.next(mode);\n }\n\n public enterPipMode(): void {\n this.viewModeSubject.next(ViewMode.PIP);\n }\n\n public exitPipMode(): void {\n this.viewModeSubject.next(ViewMode.FULLSCREEN);\n }\n\n public isPipMode(): boolean {\n return this.viewModeSubject.getValue() === ViewMode.PIP;\n }\n\n // Audio Control\n public toggleMute(): void {\n if (this.publisher) {\n const newMuteState = !this.isMutedSubject.getValue();\n this.publisher.publishAudio(!newMuteState);\n this.isMutedSubject.next(newMuteState);\n }\n }\n\n public setMute(muted: boolean): void {\n if (this.publisher) {\n this.publisher.publishAudio(!muted);\n this.isMutedSubject.next(muted);\n }\n }\n\n // Session Management\n public disconnectSession(): void {\n if (this.session) {\n this.session.disconnect();\n this.session = null;\n }\n this.publisher = null;\n this.subscribers = [];\n this.currentSessionId = null;\n this.currentToken = null;\n this.isMutedSubject.next(false);\n this.viewModeSubject.next(ViewMode.FULLSCREEN);\n this.callStateSubject.next(CallState.DISCONNECTED);\n }\n\n public isCallActive(): boolean {\n return this.callStateSubject.getValue() === CallState.CONNECTED;\n }\n\n // API Methods\n public createRoom(\n payload: CreateRoomRequest\n ): Observable<CreateRoomResponse> {\n if (!this.config || !this.httpClient) {\n throw new Error(\"TasService not configured. Use TasModule.forRoot()\");\n }\n const url = `${this.config.apiBaseUrl}/v2/room`;\n return this.httpClient.post<CreateRoomResponse>(url, payload).pipe(\n map((response) => response as CreateRoomResponse),\n catchError((error) => {\n console.error(\"TAS Service: createRoom failed\", error);\n throw error;\n })\n );\n }\n\n public generateToken(\n payload: GenerateTokenRequest\n ): Observable<GenerateTokenResponse> {\n if (!this.config || !this.httpClient) {\n throw new Error(\"TasService not configured. Use TasModule.forRoot()\");\n }\n const url = `${this.config.apiBaseUrl}/v2/room/token`;\n return this.httpClient.post<GenerateTokenResponse>(url, payload).pipe(\n map((response: any) => response as GenerateTokenResponse),\n catchError((error) => {\n console.error(\"TAS Service: generateToken failed\", error);\n throw error;\n })\n );\n }\n\n /**\n * Connects to a TokBox video session\n */\n public connectSession(\n sessionId: string,\n token: string,\n publisherElement: string,\n subscriberElement: string\n ): Promise<void> {\n this.callStateSubject.next(CallState.CONNECTING);\n this.currentSessionId = sessionId;\n this.currentToken = token;\n\n return new Promise((resolve, reject) => { \n if (!this.config) {\n this.callStateSubject.next(CallState.ERROR);\n reject(new Error(\"TasService not configured. Use TasModule.forRoot()\"));\n return;\n }\n\n if (!OT.checkSystemRequirements()) {\n this.callStateSubject.next(CallState.ERROR);\n reject(new Error(\"Browser not compatible with TokBox\"));\n return;\n }\n\n this.session = OT.initSession(this.config.tokBoxApiKey, sessionId);\n\n // Handle new streams (remote participants joining)\n this.session.on(\"streamCreated\", (event) => {\n const subscriber = this.session?.subscribe(\n event.stream,\n subscriberElement,\n {\n insertMode: \"append\",\n width: \"100%\",\n height: \"100%\",\n },\n (error) => {\n if (error) {\n console.error(\"Error subscribing to stream:\", error);\n }\n }\n );\n if (subscriber) {\n this.subscribers.push(subscriber);\n }\n });\n\n // Handle streams ending (remote participants leaving)\n this.session.on(\"streamDestroyed\", (event) => {\n this.subscribers = this.subscribers.filter(\n (sub) => sub.stream?.streamId !== event.stream.streamId\n );\n });\n\n // Handle session disconnection\n this.session.on(\"sessionDisconnected\", () => {\n this.callStateSubject.next(CallState.DISCONNECTED);\n });\n\n // Connect to session\n this.session.connect(token, (error) => {\n if (error) {\n console.error(\"Error connecting to session:\", error);\n this.callStateSubject.next(CallState.ERROR);\n reject(error);\n return;\n }\n\n // Initialize publisher (local video)\n this.publisher = OT.initPublisher(\n publisherElement,\n {\n insertMode: \"append\",\n width: \"100%\",\n height: \"100%\",\n },\n (err) => {\n if (err) {\n console.error(\"Error initializing publisher:\", err);\n this.callStateSubject.next(CallState.ERROR);\n reject(err);\n return;\n }\n\n // Publish to session\n this.session?.publish(this.publisher!, (pubErr) => {\n if (pubErr) {\n console.error(\"Error publishing stream:\", pubErr);\n this.callStateSubject.next(CallState.ERROR);\n reject(pubErr);\n } else {\n this.callStateSubject.next(CallState.CONNECTED);\n resolve();\n }\n });\n }\n );\n });\n });\n }\n\n // Video Element Movement Methods\n public movePublisherTo(newContainerId: string): void {\n if (!this.publisher) return;\n\n const publisherElement = this.publisher.element;\n const newContainer = document.getElementById(newContainerId);\n\n if (publisherElement && newContainer) {\n newContainer.appendChild(publisherElement);\n }\n }\n\n public moveSubscribersTo(newContainerId: string): void {\n const newContainer = document.getElementById(newContainerId);\n if (!newContainer) return;\n\n this.subscribers.forEach((subscriber) => {\n const subscriberElement = subscriber.element;\n if (subscriberElement) {\n newContainer.appendChild(subscriberElement);\n }\n });\n }\n\n /**\n * Moves the main video (subscriber if available, otherwise publisher) to a container.\n * Used for PiP mode to show only one video.\n */\n public moveMainVideoTo(newContainerId: string): void {\n const newContainer = document.getElementById(newContainerId);\n if (!newContainer) return;\n\n // Prefer remote video (subscriber) as main\n if (this.subscribers.length > 0 && this.subscribers[0].element) {\n newContainer.appendChild(this.subscribers[0].element);\n return;\n }\n\n // Fall back to local video (publisher)\n if (this.publisher?.element) {\n newContainer.appendChild(this.publisher.element);\n }\n }\n\n /**\n * Moves videos back to fullscreen containers\n */\n public moveVideosToFullscreen(): void {\n this.moveSubscribersTo(\"subscriber-container\");\n this.movePublisherTo(\"publisher-container\");\n }\n}\n","import {\n Component,\n OnInit,\n OnDestroy,\n Input,\n ViewChild,\n ElementRef,\n AfterViewInit,\n} from \"@angular/core\";\nimport { NgbActiveModal } from \"@ng-bootstrap/ng-bootstrap\";\nimport { TasService, CallState, ViewMode } from \"../../services/tas.service\";\nimport { Subscription } from \"rxjs\";\nimport interact from \"interactjs\";\n\n@Component({\n selector: \"tas-videocall\",\n templateUrl: \"./tas-videocall.component.html\",\n styleUrls: [\"./tas-videocall.component.scss\"],\n})\nexport class TasVideocallComponent implements OnInit, OnDestroy, AfterViewInit {\n @Input() sessionId!: string;\n @Input() token!: string;\n @Input() isReturningFromPip: boolean = false;\n\n @ViewChild(\"publisherContainer\") publisherContainer!: ElementRef;\n @ViewChild(\"subscriberContainer\") subscriberContainer!: ElementRef;\n\n public isPublisherSmall = true;\n public callState = CallState.IDLE;\n public isMuted = false;\n\n private subscriptions = new Subscription();\n\n constructor(\n public activeModal: NgbActiveModal,\n private tasService: TasService\n ) {}\n\n ngOnInit(): void {\n this.setupSubscriptions();\n this.initializeCall();\n }\n\n ngAfterViewInit(): void {\n this.initInteract();\n }\n\n ngOnDestroy(): void {\n this.subscriptions.unsubscribe();\n\n if (!this.tasService.isPipMode()) {\n this.tasService.disconnectSession();\n }\n\n interact(\".publisher-view\").unset();\n }\n\n // Public Methods\n hangUp(): void {\n this.tasService.disconnectSession();\n }\n\n toggleMute(): void {\n this.tasService.toggleMute();\n }\n\n minimize(): void {\n this.tasService.moveMainVideoTo(\"pip-main-video\");\n setTimeout(() => this.tasService.enterPipMode(), 50);\n }\n\n toggleSwap(): void {\n this.isPublisherSmall = !this.isPublisherSmall;\n this.resetVideoPositions();\n setTimeout(() => this.initInteract());\n }\n\n onDoubleClick(): void {\n this.toggleSwap();\n }\n\n // Private Methods\n private setupSubscriptions(): void {\n this.subscriptions.add(\n this.tasService.callState$.subscribe((state) => {\n this.callState = state;\n if (state === CallState.DISCONNECTED) {\n this.activeModal.close(\"hangup\");\n }\n })\n );\n\n this.subscriptions.add(\n this.tasService.viewMode$.subscribe((mode) => {\n if (mode === ViewMode.PIP) {\n this.activeModal.close(\"pip\");\n }\n })\n );\n\n this.subscriptions.add(\n this.tasService.isMuted$.subscribe((muted) => {\n this.isMuted = muted;\n })\n );\n }\n\n private initializeCall(): void {\n if (this.isReturningFromPip) {\n setTimeout(() => this.tasService.moveVideosToFullscreen(), 100);\n } else if (this.sessionId && this.token) {\n this.tasService\n .connectSession(\n this.sessionId,\n this.token,\n \"publisher-container\",\n \"subscriber-container\"\n )\n .catch((err) => {\n console.error(\"Error connecting to video call:\", err);\n });\n }\n }\n\n private resetVideoPositions(): void {\n const publisherEl = this.publisherContainer?.nativeElement as HTMLElement;\n const subscriberEl = this.subscriberContainer?.nativeElement as HTMLElement;\n\n if (publisherEl) {\n publisherEl.removeAttribute(\"style\");\n publisherEl.removeAttribute(\"data-x\");\n publisherEl.removeAttribute(\"data-y\");\n }\n\n if (subscriberEl) {\n subscriberEl.removeAttribute(\"style\");\n subscriberEl.removeAttribute(\"data-x\");\n subscriberEl.removeAttribute(\"data-y\");\n }\n }\n\n private initInteract(): void {\n interact(\".publisher-view\").unset();\n\n interact(\".publisher-view\")\n .draggable({\n inertia: true,\n modifiers: [\n interact.modifiers.restrictRect({\n restriction: \"parent\",\n endOnly: true,\n }),\n ],\n autoScroll: true,\n listeners: {\n move: (event) => {\n const target = event.target;\n const x =\n (parseFloat(target.getAttribute(\"data-x\")) || 0) + event.dx;\n const y =\n (parseFloat(target.getAttribute(\"data-y\")) || 0) + event.dy;\n\n target.style.transform = `translate(${x}px, ${y}px)`;\n target.setAttribute(\"data-x\", String(x));\n target.setAttribute(\"data-y\", String(y));\n },\n },\n })\n .resizable({\n edges: { left: false, right: true, bottom: true, top: false },\n listeners: {\n move: (event) => {\n const target = event.target;\n let x = parseFloat(target.getAttribute(\"data-x\")) || 0;\n let y = parseFloat(target.getAttribute(\"data-y\")) || 0;\n\n target.style.width = `${event.rect.width}px`;\n target.style.height = `${event.rect.height}px`;\n\n x += event.deltaRect.left;\n y += event.deltaRect.top;\n\n target.style.transform = `translate(${x}px, ${y}px)`;\n target.setAttribute(\"data-x\", String(x));\n target.setAttribute(\"data-y\", String(y));\n },\n },\n modifiers: [\n interact.modifiers.restrictEdges({ outer: \"parent\" }),\n interact.modifiers.restrictSize({ min: { width: 150, height: 100 } }),\n interact.modifiers.aspectRatio({ ratio: \"preserve\" }),\n ],\n inertia: true,\n });\n }\n}\n","<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ófono' : 'Silenciar micrófono'\"\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","import { Component, OnInit, OnDestroy, Inject, Optional } from \"@angular/core\";\nimport { TasService, ViewMode } from \"../../services/tas.service\";\nimport {\n TAS_USER_DATA_PROVIDER,\n TasUserDataProvider,\n TasUserData,\n} from \"../../tas.config\";\nimport { NgbModal, NgbModalRef } from \"@ng-bootstrap/ng-bootstrap\";\nimport { TasVideocallComponent } from \"../tas-videocall/tas-videocall.component\";\nimport { Subscription } from \"rxjs\";\nimport { switchMap } from \"rxjs/operators\";\n\n@Component({\n selector: \"tas-btn\",\n templateUrl: \"./tas-btn.component.html\",\n styleUrls: [\"./tas-btn.component.scss\"],\n})\nexport class TasButtonComponent implements OnInit, OnDestroy {\n isLoading = false;\n\n private userData: TasUserData | null = null;\n private tenantId: string | null = null;\n private subscriptions = new Subscription();\n private currentModalRef: NgbModalRef | null = null;\n\n constructor(\n private tasService: TasService,\n private modalService: NgbModal,\n @Optional()\n @Inject(TAS_USER_DATA_PROVIDER)\n private userDataProvider: TasUserDataProvider | null\n ) {}\n\n ngOnInit(): void {\n this.loadUserData();\n this.setupViewModeSubscription();\n }\n\n ngOnDestroy(): void {\n this.subscriptions.unsubscribe();\n }\n\n onClick(): void {\n if (!this.userData || !this.tenantId) {\n console.error(\"User data or tenant ID not available\");\n return;\n }\n\n this.isLoading = true;\n\n this.subscriptions.add(\n this.tasService\n .createRoom({\n tenant: this.tenantId,\n userId: this.userData.id.toString(),\n product: \"Uell\",\n record: true,\n roomType: \"TAS\",\n type: \"SPONTANEOUS\",\n })\n .pipe(\n switchMap((response) => {\n const sessionId = response.content.sessionId;\n return this.tasService\n .generateToken({\n sessionId: sessionId,\n name: this.userData!.name,\n lastname: this.userData!.surname,\n })\n .pipe(\n switchMap((tokenResponse) => {\n return [\n {\n sessionId,\n token: tokenResponse.content.token,\n },\n ];\n })\n );\n })\n )\n .subscribe({\n next: ({ sessionId, token }) => {\n this.isLoading = false;\n this.openVideoCallModal(sessionId, token);\n },\n error: (err) => {\n console.error(\"Error starting video call:\", err);\n this.isLoading = false;\n },\n })\n );\n }\n\n // Private Methods\n private loadUserData(): void {\n if (!this.userDataProvider) {\n console.warn(\"TasButtonComponent: UserDataProvider not configured\");\n return;\n }\n this.userData = this.userDataProvider.getUserData();\n this.tenantId = this.userDataProvider.getTenantId();\n }\n\n private setupViewModeSubscription(): void {\n this.subscriptions.add(\n this.tasService.viewMode$.subscribe((mode) => {\n if (\n mode === ViewMode.FULLSCREEN &&\n this.tasService.isCallActive() &&\n !this.currentModalRef\n ) {\n const sessionId = this.tasService.sessionId;\n const token = this.tasService.token;\n if (sessionId && token) {\n this.openVideoCallModal(sessionId, token, true);\n }\n }\n })\n );\n }\n\n private openVideoCallModal(\n sessionId: string,\n token: string,\n isReturningFromPip: boolean = false\n ): void {\n this.currentModalRef = this.modalService.open(TasVideocallComponent, {\n size: \"xl\",\n windowClass: \"tas-video-modal\",\n backdrop: \"static\",\n keyboard: false,\n });\n\n this.currentModalRef.componentInstance.sessionId = sessionId;\n this.currentModalRef.componentInstance.token = token;\n this.currentModalRef.componentInstance.isReturningFromPip =\n isReturningFromPip;\n\n this.currentModalRef.result.then(\n () => {\n this.currentModalRef = null;\n },\n () => {\n this.currentModalRef = null;\n }\n );\n }\n}\n","<button\n type=\"button\"\n class=\"btn btn-primary boton\"\n (click)=\"onClick()\"\n [disabled]=\"isLoading\"\n>\n <i class=\"fa fa-video-camera\" aria-hidden=\"true\" *ngIf=\"!isLoading\"></i>\n <span *ngIf=\"!isLoading\"> Iniciar TAS</span>\n <span *ngIf=\"isLoading\"> Processing...</span>\n</button>\n","import { Component, OnInit, OnDestroy } from \"@angular/core\";\nimport { TasService, CallState, ViewMode } from \"../../services/tas.service\";\nimport { Subscription } from \"rxjs\";\nimport interact from \"interactjs\";\n\n@Component({\n selector: \"tas-floating-call\",\n templateUrl: \"./tas-floating-call.component.html\",\n styleUrls: [\"./tas-floating-call.component.scss\"],\n})\nexport class TasFloatingCallComponent implements OnInit, OnDestroy {\n public isVisible = false;\n public isMuted = false;\n\n private subscriptions = new Subscription();\n\n constructor(private tasService: TasService) {}\n\n ngOnInit(): void {\n this.setupSubscriptions();\n }\n\n ngOnDestroy(): void {\n this.subscriptions.unsubscribe();\n interact(\".tas-floating-container\").unset();\n }\n\n // Public Methods\n onExpand(): void {\n this.tasService.exitPipMode();\n }\n\n onHangUp(): void {\n this.tasService.disconnectSession();\n }\n\n toggleMute(): void {\n this.tasService.toggleMute();\n }\n\n // Private Methods\n private setupSubscriptions(): void {\n this.subscriptions.add(\n this.tasService.callState$.subscribe((state) => {\n if (state === CallState.DISCONNECTED) {\n this.isVisible = false;\n }\n })\n );\n\n this.subscriptions.add(\n this.tasService.viewMode$.subscribe((mode) => {\n this.isVisible =\n mode === ViewMode.PIP && this.tasService.isCallActive();\n if (this.isVisible) {\n setTimeout(() => this.initInteract(), 100);\n }\n })\n );\n\n this.subscriptions.add(\n this.tasService.isMuted$.subscribe((muted) => {\n this.isMuted = muted;\n })\n );\n }\n\n private initInteract(): void {\n interact(\".tas-floating-container\").unset();\n\n interact(\".tas-floating-container\").draggable({\n inertia: true,\n modifiers: [\n interact.modifiers.restrictRect({\n restriction: \"body\",\n endOnly: true,\n }),\n ],\n autoScroll: false,\n listeners: {\n move: (event) => {\n const target = event.target;\n const x = (parseFloat(target.getAttribute(\"data-x\")) || 0) + event.dx;\n const y = (parseFloat(target.getAttribute(\"data-y\")) || 0) + event.dy;\n\n target.style.transform = `translate(${x}px, ${y}px)`;\n target.setAttribute(\"data-x\", String(x));\n target.setAttribute(\"data-y\", String(y));\n },\n },\n });\n }\n}\n","<div class=\"tas-floating-container\" [class.visible]=\"isVisible\">\n <div class=\"floating-content\">\n <div id=\"pip-main-video\" class=\"pip-main-video\"></div>\n\n <div class=\"floating-controls\">\n <button\n class=\"action-btn expand-btn\"\n (click)=\"onExpand()\"\n title=\"Expandir a pantalla completa\"\n >\n <i class=\"fa fa-expand\"></i>\n </button>\n <button\n class=\"action-btn mute-btn\"\n [class.muted]=\"isMuted\"\n (click)=\"toggleMute()\"\n [title]=\"isMuted ? 'Activar micrófono' : 'Silenciar micrófono'\"\n >\n <i\n class=\"fa\"\n [class.fa-microphone]=\"!isMuted\"\n [class.fa-microphone-slash]=\"isMuted\"\n ></i>\n </button>\n <button\n class=\"action-btn hangup-btn\"\n (click)=\"onHangUp()\"\n title=\"Colgar llamada\"\n >\n <i class=\"fa fa-phone\" style=\"transform: rotate(135deg)\"></i>\n </button>\n </div>\n </div>\n</div>\n","import { NgModule, ModuleWithProviders } from \"@angular/core\";\nimport { CommonModule } from \"@angular/common\";\nimport { NgbModalModule } from \"@ng-bootstrap/ng-bootstrap\";\n\nimport { TasButtonComponent } from \"./components/tas-btn/tas-btn.component\";\nimport { TasVideocallComponent } from \"./components/tas-videocall/tas-videocall.component\";\nimport { TasFloatingCallComponent } from \"./components/tas-floating-call/tas-floating-call.component\";\nimport {\n TAS_CONFIG,\n TAS_HTTP_CLIENT,\n TAS_USER_DATA_PROVIDER,\n TasConfig,\n TasHttpClient,\n TasUserDataProvider,\n} from \"./tas.config\";\n\nexport interface TasModuleConfig {\n config: TasConfig;\n httpClient?: new (...args: any[]) => TasHttpClient;\n userDataProvider?: new (...args: any[]) => TasUserDataProvider;\n}\n\n@NgModule({\n declarations: [\n TasButtonComponent,\n TasVideocallComponent,\n TasFloatingCallComponent,\n ],\n imports: [CommonModule, NgbModalModule],\n exports: [\n TasButtonComponent,\n TasVideocallComponent,\n TasFloatingCallComponent,\n ],\n})\nexport class TasModule {\n /**\n * Use this method in your app module to configure the TAS SDK\n *\n * @example\n * ```typescript\n * TasModule.forRoot({\n * config: {\n * tokBoxApiKey: environment.tokBox,\n * apiBaseUrl: environment.apiUrl\n * },\n * httpClient: MyHttpClientAdapter,\n * userDataProvider: MyUserDataProvider\n * })\n * ```\n */\n static forRoot(\n moduleConfig: TasModuleConfig\n ): ModuleWithProviders<TasModule> {\n const providers: any[] = [\n {\n provide: TAS_CONFIG,\n useValue: moduleConfig.config,\n },\n ];\n\n if (moduleConfig.httpClient) {\n providers.push({\n provide: TAS_HTTP_CLIENT,\n useClass: moduleConfig.httpClient,\n });\n }\n\n if (moduleConfig.userDataProvider) {\n providers.push({\n provide: TAS_USER_DATA_PROVIDER,\n useClass: moduleConfig.userDataProvider,\n });\n }\n\n return {\n ngModule: TasModule,\n providers,\n };\n }\n}\n","/*\n * Public API Surface of tas-uell-sdk\n */\n\n// Module\nexport * from \"./lib/tas.module\";\n\n// Configuration\nexport * from \"./lib/tas.config\";\n\n// Services\nexport * from \"./lib/services/tas.service\";\n\n// Components\nexport * from \"./lib/components/tas-btn/tas-btn.component\";\nexport * from \"./lib/components/tas-videocall/tas-videocall.component\";\nexport * from \"./lib/components/tas-floating-call/tas-floating-call.component\";\n\n// Interfaces\nexport * from \"./lib/interfaces/tas.interfaces\";\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2.TasService","i1.TasService"],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { OnInit, OnDestroy } from "@angular/core";
2
+ import { TasService } from "../../services/tas.service";
3
+ import { TasUserDataProvider } from "../../tas.config";
4
+ import { NgbModal } from "@ng-bootstrap/ng-bootstrap";
5
+ import * as i0 from "@angular/core";
6
+ export declare class TasButtonComponent implements OnInit, OnDestroy {
7
+ private tasService;
8
+ private modalService;
9
+ private userDataProvider;
10
+ isLoading: boolean;
11
+ private userData;
12
+ private tenantId;
13
+ private subscriptions;
14
+ private currentModalRef;
15
+ constructor(tasService: TasService, modalService: NgbModal, userDataProvider: TasUserDataProvider | null);
16
+ ngOnInit(): void;
17
+ ngOnDestroy(): void;
18
+ onClick(): void;
19
+ private loadUserData;
20
+ private setupViewModeSubscription;
21
+ private openVideoCallModal;
22
+ static ɵfac: i0.ɵɵFactoryDeclaration<TasButtonComponent, [null, null, { optional: true; }]>;
23
+ static ɵcmp: i0.ɵɵComponentDeclaration<TasButtonComponent, "tas-btn", never, {}, {}, never, never>;
24
+ }
@@ -0,0 +1,19 @@
1
+ import { OnInit, OnDestroy } from "@angular/core";
2
+ import { TasService } from "../../services/tas.service";
3
+ import * as i0 from "@angular/core";
4
+ export declare class TasFloatingCallComponent implements OnInit, OnDestroy {
5
+ private tasService;
6
+ isVisible: boolean;
7
+ isMuted: boolean;
8
+ private subscriptions;
9
+ constructor(tasService: TasService);
10
+ ngOnInit(): void;
11
+ ngOnDestroy(): void;
12
+ onExpand(): void;
13
+ onHangUp(): void;
14
+ toggleMute(): void;
15
+ private setupSubscriptions;
16
+ private initInteract;
17
+ static ɵfac: i0.ɵɵFactoryDeclaration<TasFloatingCallComponent, never>;
18
+ static ɵcmp: i0.ɵɵComponentDeclaration<TasFloatingCallComponent, "tas-floating-call", never, {}, {}, never, never>;
19
+ }
@@ -0,0 +1,32 @@
1
+ import { OnInit, OnDestroy, ElementRef, AfterViewInit } from "@angular/core";
2
+ import { NgbActiveModal } from "@ng-bootstrap/ng-bootstrap";
3
+ import { TasService, CallState } from "../../services/tas.service";
4
+ import * as i0 from "@angular/core";
5
+ export declare class TasVideocallComponent implements OnInit, OnDestroy, AfterViewInit {
6
+ activeModal: NgbActiveModal;
7
+ private tasService;
8
+ sessionId: string;
9
+ token: string;
10
+ isReturningFromPip: boolean;
11
+ publisherContainer: ElementRef;
12
+ subscriberContainer: ElementRef;
13
+ isPublisherSmall: boolean;
14
+ callState: CallState;
15
+ isMuted: boolean;
16
+ private subscriptions;
17
+ constructor(activeModal: NgbActiveModal, tasService: TasService);
18
+ ngOnInit(): void;
19
+ ngAfterViewInit(): void;
20
+ ngOnDestroy(): void;
21
+ hangUp(): void;
22
+ toggleMute(): void;
23
+ minimize(): void;
24
+ toggleSwap(): void;
25
+ onDoubleClick(): void;
26
+ private setupSubscriptions;
27
+ private initializeCall;
28
+ private resetVideoPositions;
29
+ private initInteract;
30
+ static ɵfac: i0.ɵɵFactoryDeclaration<TasVideocallComponent, never>;
31
+ static ɵcmp: i0.ɵɵComponentDeclaration<TasVideocallComponent, "tas-videocall", never, { "sessionId": "sessionId"; "token": "token"; "isReturningFromPip": "isReturningFromPip"; }, {}, never, never>;
32
+ }
@@ -0,0 +1,31 @@
1
+ export interface CreateRoomRequest {
2
+ tenant: string;
3
+ userId: string;
4
+ product: string;
5
+ record: boolean;
6
+ roomType: TasRoomType;
7
+ type: TasSessionType;
8
+ utcScheduled?: string;
9
+ }
10
+ export interface CreateRoomResponse {
11
+ content: {
12
+ roomType: string | null;
13
+ tenant: string | null;
14
+ user_id: string | null;
15
+ product: string | null;
16
+ record: boolean | null;
17
+ sessionId: string;
18
+ };
19
+ }
20
+ export declare type TasRoomType = "TAS" | "JM" | "WEBINAR";
21
+ export declare type TasSessionType = "SPONTANEOUS" | "SCHEDULED";
22
+ export interface GenerateTokenRequest {
23
+ sessionId: string;
24
+ name: string;
25
+ lastname: string;
26
+ }
27
+ export interface GenerateTokenResponse {
28
+ content: {
29
+ token: string;
30
+ };
31
+ }
@@ -0,0 +1,65 @@
1
+ import { Observable } from "rxjs";
2
+ import * as OT from "@opentok/client";
3
+ import { TasConfig, TasHttpClient } from "../tas.config";
4
+ import { CreateRoomRequest, CreateRoomResponse, GenerateTokenRequest, GenerateTokenResponse } from "../interfaces/tas.interfaces";
5
+ import * as i0 from "@angular/core";
6
+ export declare enum CallState {
7
+ IDLE = "IDLE",
8
+ CONNECTING = "CONNECTING",
9
+ CONNECTED = "CONNECTED",
10
+ DISCONNECTED = "DISCONNECTED",
11
+ ERROR = "ERROR"
12
+ }
13
+ export declare enum ViewMode {
14
+ FULLSCREEN = "FULLSCREEN",
15
+ PIP = "PIP"
16
+ }
17
+ export declare class TasService {
18
+ private config;
19
+ private httpClient;
20
+ private session;
21
+ private publisher;
22
+ private subscribers;
23
+ private callStateSubject;
24
+ callState$: Observable<CallState>;
25
+ private viewModeSubject;
26
+ viewMode$: Observable<ViewMode>;
27
+ private isMutedSubject;
28
+ isMuted$: Observable<boolean>;
29
+ private currentSessionId;
30
+ private currentToken;
31
+ constructor(config: TasConfig | null, httpClient: TasHttpClient | null);
32
+ get currentSession(): OT.Session | null;
33
+ get currentPublisher(): OT.Publisher | null;
34
+ get currentSubscribers(): OT.Subscriber[];
35
+ get sessionId(): string | null;
36
+ get token(): string | null;
37
+ get isMuted(): boolean;
38
+ setViewMode(mode: ViewMode): void;
39
+ enterPipMode(): void;
40
+ exitPipMode(): void;
41
+ isPipMode(): boolean;
42
+ toggleMute(): void;
43
+ setMute(muted: boolean): void;
44
+ disconnectSession(): void;
45
+ isCallActive(): boolean;
46
+ createRoom(payload: CreateRoomRequest): Observable<CreateRoomResponse>;
47
+ generateToken(payload: GenerateTokenRequest): Observable<GenerateTokenResponse>;
48
+ /**
49
+ * Connects to a TokBox video session
50
+ */
51
+ connectSession(sessionId: string, token: string, publisherElement: string, subscriberElement: string): Promise<void>;
52
+ movePublisherTo(newContainerId: string): void;
53
+ moveSubscribersTo(newContainerId: string): void;
54
+ /**
55
+ * Moves the main video (subscriber if available, otherwise publisher) to a container.
56
+ * Used for PiP mode to show only one video.
57
+ */
58
+ moveMainVideoTo(newContainerId: string): void;
59
+ /**
60
+ * Moves videos back to fullscreen containers
61
+ */
62
+ moveVideosToFullscreen(): void;
63
+ static ɵfac: i0.ɵɵFactoryDeclaration<TasService, [{ optional: true; }, { optional: true; }]>;
64
+ static ɵprov: i0.ɵɵInjectableDeclaration<TasService>;
65
+ }
@@ -0,0 +1,51 @@
1
+ import { InjectionToken } from "@angular/core";
2
+ import { Observable } from "rxjs";
3
+ /**
4
+ * Configuration interface for the TAS SDK
5
+ */
6
+ export interface TasConfig {
7
+ /**
8
+ * TokBox/Vonage API Key
9
+ */
10
+ tokBoxApiKey: string;
11
+ /**
12
+ * Base URL for the TAS API endpoints
13
+ */
14
+ apiBaseUrl: string;
15
+ }
16
+ /**
17
+ * Interface for HTTP client that the SDK will use.
18
+ * Implement this interface in your app and provide it to the SDK.
19
+ */
20
+ export interface TasHttpClient {
21
+ post<T>(url: string, body: any, options?: {
22
+ headers?: Record<string, string>;
23
+ }): Observable<T>;
24
+ }
25
+ /**
26
+ * User data interface required by TasButtonComponent
27
+ */
28
+ export interface TasUserData {
29
+ id: string | number;
30
+ name: string;
31
+ surname: string;
32
+ }
33
+ /**
34
+ * User data provider interface - implement this to provide user data to the SDK
35
+ */
36
+ export interface TasUserDataProvider {
37
+ getUserData(): TasUserData | null;
38
+ getTenantId(): string | null;
39
+ }
40
+ /**
41
+ * Injection token for TAS configuration
42
+ */
43
+ export declare const TAS_CONFIG: InjectionToken<TasConfig>;
44
+ /**
45
+ * Injection token for HTTP client
46
+ */
47
+ export declare const TAS_HTTP_CLIENT: InjectionToken<TasHttpClient>;
48
+ /**
49
+ * Injection token for user data provider
50
+ */
51
+ export declare const TAS_USER_DATA_PROVIDER: InjectionToken<TasUserDataProvider>;
@@ -0,0 +1,34 @@
1
+ import { ModuleWithProviders } from "@angular/core";
2
+ import { TasConfig, TasHttpClient, TasUserDataProvider } from "./tas.config";
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "./components/tas-btn/tas-btn.component";
5
+ import * as i2 from "./components/tas-videocall/tas-videocall.component";
6
+ import * as i3 from "./components/tas-floating-call/tas-floating-call.component";
7
+ import * as i4 from "@angular/common";
8
+ import * as i5 from "@ng-bootstrap/ng-bootstrap";
9
+ export interface TasModuleConfig {
10
+ config: TasConfig;
11
+ httpClient?: new (...args: any[]) => TasHttpClient;
12
+ userDataProvider?: new (...args: any[]) => TasUserDataProvider;
13
+ }
14
+ export declare class TasModule {
15
+ /**
16
+ * Use this method in your app module to configure the TAS SDK
17
+ *
18
+ * @example
19
+ * ```typescript
20
+ * TasModule.forRoot({
21
+ * config: {
22
+ * tokBoxApiKey: environment.tokBox,
23
+ * apiBaseUrl: environment.apiUrl
24
+ * },
25
+ * httpClient: MyHttpClientAdapter,
26
+ * userDataProvider: MyUserDataProvider
27
+ * })
28
+ * ```
29
+ */
30
+ static forRoot(moduleConfig: TasModuleConfig): ModuleWithProviders<TasModule>;
31
+ static ɵfac: i0.ɵɵFactoryDeclaration<TasModule, never>;
32
+ static ɵmod: i0.ɵɵNgModuleDeclaration<TasModule, [typeof i1.TasButtonComponent, typeof i2.TasVideocallComponent, typeof i3.TasFloatingCallComponent], [typeof i4.CommonModule, typeof i5.NgbModalModule], [typeof i1.TasButtonComponent, typeof i2.TasVideocallComponent, typeof i3.TasFloatingCallComponent]>;
33
+ static ɵinj: i0.ɵɵInjectorDeclaration<TasModule>;
34
+ }
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "tas-uell-sdk",
3
+ "version": "0.0.1",
4
+ "description": "TAS Video Call SDK",
5
+ "main": "dist/tas-uell-sdk.umd.js",
6
+ "module": "fesm2015/tas-uell-sdk.mjs",
7
+ "es2015": "dist/tas-uell-sdk.js",
8
+ "esm5": "dist/esm5/public-api.js",
9
+ "esm2015": "dist/esm2015/public-api.js",
10
+ "fesm5": "dist/fesm5/tas-uell-sdk.js",
11
+ "fesm2015": "fesm2015/tas-uell-sdk.mjs",
12
+ "typings": "tas-uell-sdk.d.ts",
13
+ "metadata": "dist/tas-uell-sdk.metadata.json",
14
+ "sideEffects": false,
15
+ "peerDependencies": {
16
+ "@angular/common": ">=13.0.0",
17
+ "@angular/core": ">=13.0.0",
18
+ "@ng-bootstrap/ng-bootstrap": ">=12.0.0",
19
+ "@opentok/client": ">=2.20.0",
20
+ "interactjs": ">=1.10.0",
21
+ "rxjs": ">=7.0.0"
22
+ },
23
+ "keywords": [
24
+ "angular",
25
+ "video-call",
26
+ "tokbox",
27
+ "vonage",
28
+ "tas"
29
+ ],
30
+ "license": "UNLICENSED",
31
+ "es2020": "fesm2020/tas-uell-sdk.mjs",
32
+ "esm2020": "esm2020/tas-uell-sdk.mjs",
33
+ "fesm2020": "fesm2020/tas-uell-sdk.mjs",
34
+ "exports": {
35
+ "./package.json": {
36
+ "default": "./package.json"
37
+ },
38
+ ".": {
39
+ "types": "./tas-uell-sdk.d.ts",
40
+ "esm2020": "./esm2020/tas-uell-sdk.mjs",
41
+ "es2020": "./fesm2020/tas-uell-sdk.mjs",
42
+ "es2015": "./fesm2015/tas-uell-sdk.mjs",
43
+ "node": "./fesm2015/tas-uell-sdk.mjs",
44
+ "default": "./fesm2020/tas-uell-sdk.mjs"
45
+ }
46
+ },
47
+ "dependencies": {
48
+ "tslib": "^2.3.0"
49
+ }
50
+ }
@@ -0,0 +1,7 @@
1
+ export * from "./lib/tas.module";
2
+ export * from "./lib/tas.config";
3
+ export * from "./lib/services/tas.service";
4
+ export * from "./lib/components/tas-btn/tas-btn.component";
5
+ export * from "./lib/components/tas-videocall/tas-videocall.component";
6
+ export * from "./lib/components/tas-floating-call/tas-floating-call.component";
7
+ export * from "./lib/interfaces/tas.interfaces";
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ /// <amd-module name="tas-uell-sdk" />
5
+ export * from './public-api';