@en-solutions/tgm-client-sdk 1.6.21
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.
- package/LICENSE +19 -0
- package/README.md +788 -0
- package/esm2022/en-solutions-tgm-client-sdk.mjs +5 -0
- package/esm2022/lib/components/database-manager/database-manager/database-manager.component.mjs +308 -0
- package/esm2022/lib/components/database-manager/database-manager.module.mjs +66 -0
- package/esm2022/lib/components/database-manager/object-browser/object-browser.component.mjs +98 -0
- package/esm2022/lib/components/database-manager/query-editor/query-editor.component.mjs +196 -0
- package/esm2022/lib/components/database-manager/query-toolbar/query-toolbar.component.mjs +70 -0
- package/esm2022/lib/components/database-manager/record-detail/record-detail.component.mjs +112 -0
- package/esm2022/lib/components/database-manager/registry/entity-registry.mjs +512 -0
- package/esm2022/lib/components/database-manager/results-grid/results-grid.component.mjs +165 -0
- package/esm2022/lib/components/database-manager/services/entity-schema.service.mjs +91 -0
- package/esm2022/lib/components/database-manager/services/query-executor.service.mjs +204 -0
- package/esm2022/lib/components/database-manager/table-data-viewer/table-data-viewer.component.mjs +166 -0
- package/esm2022/lib/components/database-manager/table-structure/table-structure.component.mjs +42 -0
- package/esm2022/lib/components/database-manager/types/database-manager.types.mjs +6 -0
- package/esm2022/lib/components/reporting/export-button/export-button.component.mjs +203 -0
- package/esm2022/lib/components/reporting/generated-report-list/generated-report-list.component.mjs +285 -0
- package/esm2022/lib/components/reporting/report-definition-form/report-definition-form.component.mjs +206 -0
- package/esm2022/lib/components/reporting/report-definition-list/report-definition-list.component.mjs +252 -0
- package/esm2022/lib/components/reporting/report-generate-dialog/report-generate-dialog.component.mjs +122 -0
- package/esm2022/lib/components/reporting/report-stats/report-stats.component.mjs +164 -0
- package/esm2022/lib/components/reporting/report-template-list/report-template-list.component.mjs +114 -0
- package/esm2022/lib/components/reporting/reporting.module.mjs +60 -0
- package/esm2022/lib/components/video-call/incoming-call/incoming-call.component.mjs +80 -0
- package/esm2022/lib/components/video-call/services/livekit-room.service.mjs +142 -0
- package/esm2022/lib/components/video-call/services/video-call-signaling.service.mjs +42 -0
- package/esm2022/lib/components/video-call/services/video-call-state.service.mjs +52 -0
- package/esm2022/lib/components/video-call/types/video-call.types.mjs +2 -0
- package/esm2022/lib/components/video-call/video-call.module.mjs +42 -0
- package/esm2022/lib/components/video-call/video-controls/video-controls.component.mjs +33 -0
- package/esm2022/lib/components/video-call/video-participant/video-participant.component.mjs +68 -0
- package/esm2022/lib/components/video-call/video-room/video-room.component.mjs +89 -0
- package/esm2022/lib/core/auth-interceptor.mjs +33 -0
- package/esm2022/lib/core/client-interceptor.mjs +34 -0
- package/esm2022/lib/core/error-handler.mjs +32 -0
- package/esm2022/lib/core/http-client.service.mjs +254 -0
- package/esm2022/lib/core/websocket.service.mjs +185 -0
- package/esm2022/lib/models/admin/audit.models.mjs +2 -0
- package/esm2022/lib/models/admin/backup.models.mjs +2 -0
- package/esm2022/lib/models/admin/client.models.mjs +2 -0
- package/esm2022/lib/models/admin/email-provider.models.mjs +2 -0
- package/esm2022/lib/models/admin/erp.models.mjs +2 -0
- package/esm2022/lib/models/admin/identity-provider.models.mjs +2 -0
- package/esm2022/lib/models/admin/index.mjs +14 -0
- package/esm2022/lib/models/admin/messaging-provider.models.mjs +2 -0
- package/esm2022/lib/models/admin/platform-admin.models.mjs +2 -0
- package/esm2022/lib/models/admin/queue.models.mjs +2 -0
- package/esm2022/lib/models/admin/role.models.mjs +2 -0
- package/esm2022/lib/models/admin/sandbox.models.mjs +2 -0
- package/esm2022/lib/models/admin/ticket.models.mjs +2 -0
- package/esm2022/lib/models/admin/webhook.models.mjs +2 -0
- package/esm2022/lib/models/api/ai.models.mjs +2 -0
- package/esm2022/lib/models/api/aip.models.mjs +2 -0
- package/esm2022/lib/models/api/cat.models.mjs +2 -0
- package/esm2022/lib/models/api/company.models.mjs +2 -0
- package/esm2022/lib/models/api/compliance.models.mjs +2 -0
- package/esm2022/lib/models/api/component.models.mjs +2 -0
- package/esm2022/lib/models/api/cortex-edge.models.mjs +2 -0
- package/esm2022/lib/models/api/cortex-event.models.mjs +2 -0
- package/esm2022/lib/models/api/cortex-insight.models.mjs +2 -0
- package/esm2022/lib/models/api/cortex-node.models.mjs +2 -0
- package/esm2022/lib/models/api/custom-field.models.mjs +2 -0
- package/esm2022/lib/models/api/deferral.models.mjs +2 -0
- package/esm2022/lib/models/api/diagnostic-report.models.mjs +2 -0
- package/esm2022/lib/models/api/document.models.mjs +2 -0
- package/esm2022/lib/models/api/energy.models.mjs +2 -0
- package/esm2022/lib/models/api/failure.models.mjs +2 -0
- package/esm2022/lib/models/api/fleet.models.mjs +2 -0
- package/esm2022/lib/models/api/inspection.models.mjs +2 -0
- package/esm2022/lib/models/api/intervention.models.mjs +2 -0
- package/esm2022/lib/models/api/iot.models.mjs +2 -0
- package/esm2022/lib/models/api/knowledge.models.mjs +2 -0
- package/esm2022/lib/models/api/loto.models.mjs +2 -0
- package/esm2022/lib/models/api/maintenance-record.models.mjs +2 -0
- package/esm2022/lib/models/api/maintenance.models.mjs +2 -0
- package/esm2022/lib/models/api/material.models.mjs +2 -0
- package/esm2022/lib/models/api/media.models.mjs +2 -0
- package/esm2022/lib/models/api/misc.models.mjs +2 -0
- package/esm2022/lib/models/api/project.models.mjs +2 -0
- package/esm2022/lib/models/api/quality.models.mjs +2 -0
- package/esm2022/lib/models/api/reporting.models.mjs +3 -0
- package/esm2022/lib/models/api/reservoir-websocket.models.mjs +17 -0
- package/esm2022/lib/models/api/reservoir.models.mjs +2 -0
- package/esm2022/lib/models/api/search.models.mjs +2 -0
- package/esm2022/lib/models/api/sensor.models.mjs +2 -0
- package/esm2022/lib/models/api/unit.models.mjs +2 -0
- package/esm2022/lib/models/api/user.models.mjs +2 -0
- package/esm2022/lib/models/api/warranty.models.mjs +2 -0
- package/esm2022/lib/models/api/work-permit.models.mjs +2 -0
- package/esm2022/lib/models/api/workflow.models.mjs +2 -0
- package/esm2022/lib/models/auth/index.mjs +4 -0
- package/esm2022/lib/models/auth/login.models.mjs +2 -0
- package/esm2022/lib/models/auth/sso.models.mjs +2 -0
- package/esm2022/lib/models/auth/totp.models.mjs +2 -0
- package/esm2022/lib/models/base.models.mjs +99 -0
- package/esm2022/lib/models/chat/chat.models.mjs +2 -0
- package/esm2022/lib/models/enums/cat.enums.mjs +17 -0
- package/esm2022/lib/models/enums/energy.enums.mjs +8 -0
- package/esm2022/lib/models/enums/erp.enums.mjs +5 -0
- package/esm2022/lib/models/enums/index.mjs +15 -0
- package/esm2022/lib/models/enums/inspection.enums.mjs +7 -0
- package/esm2022/lib/models/enums/loto.enums.mjs +25 -0
- package/esm2022/lib/models/enums/misc.enums.mjs +19 -0
- package/esm2022/lib/models/enums/quality.enums.mjs +22 -0
- package/esm2022/lib/models/enums/reservoir.enums.mjs +13 -0
- package/esm2022/lib/models/enums/sso.enums.mjs +3 -0
- package/esm2022/lib/models/enums/status.enums.mjs +41 -0
- package/esm2022/lib/models/enums/time.enums.mjs +5 -0
- package/esm2022/lib/models/enums/type.enums.mjs +45 -0
- package/esm2022/lib/models/enums/user.enums.mjs +6 -0
- package/esm2022/lib/models/enums/work-permit.enums.mjs +33 -0
- package/esm2022/lib/models/index.mjs +42 -0
- package/esm2022/lib/models/realtime/realtime-event.models.mjs +9 -0
- package/esm2022/lib/models/video/video-call.models.mjs +2 -0
- package/esm2022/lib/services/admin/activity-log.service.mjs +28 -0
- package/esm2022/lib/services/admin/announcement.service.mjs +37 -0
- package/esm2022/lib/services/admin/article-admin.service.mjs +37 -0
- package/esm2022/lib/services/admin/audit-log.service.mjs +53 -0
- package/esm2022/lib/services/admin/backup.service.mjs +28 -0
- package/esm2022/lib/services/admin/cache-admin.service.mjs +64 -0
- package/esm2022/lib/services/admin/client-admin.service.mjs +101 -0
- package/esm2022/lib/services/admin/client-api-key.service.mjs +31 -0
- package/esm2022/lib/services/admin/client-ocr.service.mjs +28 -0
- package/esm2022/lib/services/admin/client-usage.service.mjs +31 -0
- package/esm2022/lib/services/admin/data-export.service.mjs +19 -0
- package/esm2022/lib/services/admin/document-admin.service.mjs +40 -0
- package/esm2022/lib/services/admin/email-admin.service.mjs +28 -0
- package/esm2022/lib/services/admin/email-provider.service.mjs +58 -0
- package/esm2022/lib/services/admin/erp-admin.service.mjs +111 -0
- package/esm2022/lib/services/admin/identity-provider.service.mjs +46 -0
- package/esm2022/lib/services/admin/impersonation.service.mjs +19 -0
- package/esm2022/lib/services/admin/index.mjs +31 -0
- package/esm2022/lib/services/admin/messaging-provider.service.mjs +55 -0
- package/esm2022/lib/services/admin/notification.service.mjs +31 -0
- package/esm2022/lib/services/admin/platform-admin.service.mjs +34 -0
- package/esm2022/lib/services/admin/platform-webhook.service.mjs +34 -0
- package/esm2022/lib/services/admin/queue-admin.service.mjs +55 -0
- package/esm2022/lib/services/admin/role-admin.service.mjs +81 -0
- package/esm2022/lib/services/admin/sandbox-admin.service.mjs +34 -0
- package/esm2022/lib/services/admin/scheduler-admin.service.mjs +34 -0
- package/esm2022/lib/services/admin/subscription.service.mjs +28 -0
- package/esm2022/lib/services/admin/system-health.service.mjs +22 -0
- package/esm2022/lib/services/admin/user-admin.service.mjs +67 -0
- package/esm2022/lib/services/admin/user-permission.service.mjs +40 -0
- package/esm2022/lib/services/admin/webhook-admin.service.mjs +61 -0
- package/esm2022/lib/services/api/agent.service.mjs +29 -0
- package/esm2022/lib/services/api/ai-feedback.service.mjs +17 -0
- package/esm2022/lib/services/api/ai.service.mjs +66 -0
- package/esm2022/lib/services/api/aip-analysis.service.mjs +20 -0
- package/esm2022/lib/services/api/aip-financial.service.mjs +29 -0
- package/esm2022/lib/services/api/aip-geographic.service.mjs +30 -0
- package/esm2022/lib/services/api/aip-network.service.mjs +29 -0
- package/esm2022/lib/services/api/aip-performance.service.mjs +29 -0
- package/esm2022/lib/services/api/aip-resource.service.mjs +23 -0
- package/esm2022/lib/services/api/aip-workflow.service.mjs +32 -0
- package/esm2022/lib/services/api/aip.service.mjs +158 -0
- package/esm2022/lib/services/api/alert.service.mjs +26 -0
- package/esm2022/lib/services/api/anomaly-detection.service.mjs +40 -0
- package/esm2022/lib/services/api/asset-lifecycle.service.mjs +78 -0
- package/esm2022/lib/services/api/audit-entry.service.mjs +22 -0
- package/esm2022/lib/services/api/base-crud.service.mjs +37 -0
- package/esm2022/lib/services/api/bid.service.mjs +17 -0
- package/esm2022/lib/services/api/budget.service.mjs +17 -0
- package/esm2022/lib/services/api/bulk-operation.service.mjs +65 -0
- package/esm2022/lib/services/api/capex-project.service.mjs +17 -0
- package/esm2022/lib/services/api/cat.service.mjs +77 -0
- package/esm2022/lib/services/api/client-article.service.mjs +23 -0
- package/esm2022/lib/services/api/community.service.mjs +41 -0
- package/esm2022/lib/services/api/company-material-type.service.mjs +17 -0
- package/esm2022/lib/services/api/company-material.service.mjs +17 -0
- package/esm2022/lib/services/api/company.service.mjs +30 -0
- package/esm2022/lib/services/api/compliance.service.mjs +74 -0
- package/esm2022/lib/services/api/component-info.service.mjs +17 -0
- package/esm2022/lib/services/api/component-location.service.mjs +17 -0
- package/esm2022/lib/services/api/component.service.mjs +53 -0
- package/esm2022/lib/services/api/cortex-event.service.mjs +17 -0
- package/esm2022/lib/services/api/cortex-insight.service.mjs +23 -0
- package/esm2022/lib/services/api/cortex-node.service.mjs +17 -0
- package/esm2022/lib/services/api/cortex.service.mjs +29 -0
- package/esm2022/lib/services/api/custom-field.service.mjs +70 -0
- package/esm2022/lib/services/api/custom.service.mjs +43 -0
- package/esm2022/lib/services/api/dashboard.service.mjs +44 -0
- package/esm2022/lib/services/api/deferral.service.mjs +54 -0
- package/esm2022/lib/services/api/department.service.mjs +17 -0
- package/esm2022/lib/services/api/device-gateway.service.mjs +33 -0
- package/esm2022/lib/services/api/diagnostic-report.service.mjs +23 -0
- package/esm2022/lib/services/api/digital-twin.service.mjs +56 -0
- package/esm2022/lib/services/api/document.service.mjs +53 -0
- package/esm2022/lib/services/api/dynamic-crud.service.mjs +67 -0
- package/esm2022/lib/services/api/energy-analytics.service.mjs +42 -0
- package/esm2022/lib/services/api/energy-production.service.mjs +17 -0
- package/esm2022/lib/services/api/energy.service.mjs +91 -0
- package/esm2022/lib/services/api/entity-comment.service.mjs +31 -0
- package/esm2022/lib/services/api/event.service.mjs +17 -0
- package/esm2022/lib/services/api/export.service.mjs +216 -0
- package/esm2022/lib/services/api/extension.service.mjs +56 -0
- package/esm2022/lib/services/api/failure.service.mjs +53 -0
- package/esm2022/lib/services/api/fleet.service.mjs +140 -0
- package/esm2022/lib/services/api/inactive-component.service.mjs +17 -0
- package/esm2022/lib/services/api/index.mjs +101 -0
- package/esm2022/lib/services/api/inspection.service.mjs +29 -0
- package/esm2022/lib/services/api/intervention-request.service.mjs +17 -0
- package/esm2022/lib/services/api/intervention.service.mjs +17 -0
- package/esm2022/lib/services/api/knowledge.service.mjs +209 -0
- package/esm2022/lib/services/api/license.service.mjs +25 -0
- package/esm2022/lib/services/api/location.service.mjs +17 -0
- package/esm2022/lib/services/api/log.service.mjs +17 -0
- package/esm2022/lib/services/api/login-history.service.mjs +17 -0
- package/esm2022/lib/services/api/maintenance-plan.service.mjs +17 -0
- package/esm2022/lib/services/api/maintenance-record.service.mjs +17 -0
- package/esm2022/lib/services/api/material-consumable.service.mjs +41 -0
- package/esm2022/lib/services/api/material-instrument.service.mjs +29 -0
- package/esm2022/lib/services/api/material-item.service.mjs +53 -0
- package/esm2022/lib/services/api/material-tooling.service.mjs +41 -0
- package/esm2022/lib/services/api/measurement-unit.service.mjs +17 -0
- package/esm2022/lib/services/api/misc-crud.service.mjs +329 -0
- package/esm2022/lib/services/api/note.service.mjs +37 -0
- package/esm2022/lib/services/api/outage-resource.service.mjs +28 -0
- package/esm2022/lib/services/api/plant-data.service.mjs +31 -0
- package/esm2022/lib/services/api/procurement.service.mjs +53 -0
- package/esm2022/lib/services/api/project.service.mjs +17 -0
- package/esm2022/lib/services/api/property-template.service.mjs +17 -0
- package/esm2022/lib/services/api/quality.service.mjs +29 -0
- package/esm2022/lib/services/api/recurring-event.service.mjs +17 -0
- package/esm2022/lib/services/api/reporting.service.mjs +117 -0
- package/esm2022/lib/services/api/reservoir-data.service.mjs +19 -0
- package/esm2022/lib/services/api/reservoir.service.mjs +209 -0
- package/esm2022/lib/services/api/room.service.mjs +17 -0
- package/esm2022/lib/services/api/sandbox.service.mjs +62 -0
- package/esm2022/lib/services/api/scheduled-report.service.mjs +17 -0
- package/esm2022/lib/services/api/search.service.mjs +77 -0
- package/esm2022/lib/services/api/sensor.service.mjs +36 -0
- package/esm2022/lib/services/api/sla-policy.service.mjs +17 -0
- package/esm2022/lib/services/api/sla.service.mjs +17 -0
- package/esm2022/lib/services/api/threshold-alert-rule.service.mjs +17 -0
- package/esm2022/lib/services/api/ticket.service.mjs +73 -0
- package/esm2022/lib/services/api/time-entry.service.mjs +17 -0
- package/esm2022/lib/services/api/todo.service.mjs +17 -0
- package/esm2022/lib/services/api/unit.service.mjs +17 -0
- package/esm2022/lib/services/api/upload.service.mjs +84 -0
- package/esm2022/lib/services/api/user.service.mjs +107 -0
- package/esm2022/lib/services/api/warehouse.service.mjs +29 -0
- package/esm2022/lib/services/api/warranty.service.mjs +29 -0
- package/esm2022/lib/services/api/work-order.service.mjs +28 -0
- package/esm2022/lib/services/api/work-permit.service.mjs +17 -0
- package/esm2022/lib/services/api/workflow.service.mjs +86 -0
- package/esm2022/lib/services/auth/auth.service.mjs +97 -0
- package/esm2022/lib/services/auth/index.mjs +5 -0
- package/esm2022/lib/services/auth/platform-auth.service.mjs +39 -0
- package/esm2022/lib/services/auth/sso-auth.service.mjs +46 -0
- package/esm2022/lib/services/auth/totp.service.mjs +34 -0
- package/esm2022/lib/services/chat/chat-rest.service.mjs +104 -0
- package/esm2022/lib/services/chat/chat-websocket.service.mjs +70 -0
- package/esm2022/lib/services/chat/index.mjs +3 -0
- package/esm2022/lib/services/index.mjs +8 -0
- package/esm2022/lib/services/realtime/index.mjs +2 -0
- package/esm2022/lib/services/realtime/realtime-event.service.mjs +187 -0
- package/esm2022/lib/services/reservoir/index.mjs +2 -0
- package/esm2022/lib/services/reservoir/reservoir-websocket.service.mjs +105 -0
- package/esm2022/lib/services/video/index.mjs +3 -0
- package/esm2022/lib/services/video/video-call-rest.service.mjs +42 -0
- package/esm2022/lib/services/video/video-call-websocket.service.mjs +55 -0
- package/esm2022/lib/tgm-sdk.config.mjs +32 -0
- package/esm2022/lib/tgm-sdk.module.mjs +38 -0
- package/esm2022/public-api.mjs +52 -0
- package/fesm2022/en-solutions-tgm-client-sdk.mjs +11029 -0
- package/fesm2022/en-solutions-tgm-client-sdk.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/components/database-manager/database-manager/database-manager.component.d.ts +70 -0
- package/lib/components/database-manager/database-manager.module.d.ts +15 -0
- package/lib/components/database-manager/object-browser/object-browser.component.d.ts +35 -0
- package/lib/components/database-manager/query-editor/query-editor.component.d.ts +31 -0
- package/lib/components/database-manager/query-toolbar/query-toolbar.component.d.ts +23 -0
- package/lib/components/database-manager/record-detail/record-detail.component.d.ts +35 -0
- package/lib/components/database-manager/registry/entity-registry.d.ts +16 -0
- package/lib/components/database-manager/results-grid/results-grid.component.d.ts +62 -0
- package/lib/components/database-manager/services/entity-schema.service.d.ts +37 -0
- package/lib/components/database-manager/services/query-executor.service.d.ts +57 -0
- package/lib/components/database-manager/table-data-viewer/table-data-viewer.component.d.ts +54 -0
- package/lib/components/database-manager/table-structure/table-structure.component.d.ts +16 -0
- package/lib/components/database-manager/types/database-manager.types.d.ts +71 -0
- package/lib/components/reporting/export-button/export-button.component.d.ts +50 -0
- package/lib/components/reporting/generated-report-list/generated-report-list.component.d.ts +93 -0
- package/lib/components/reporting/report-definition-form/report-definition-form.component.d.ts +65 -0
- package/lib/components/reporting/report-definition-list/report-definition-list.component.d.ts +90 -0
- package/lib/components/reporting/report-generate-dialog/report-generate-dialog.component.d.ts +46 -0
- package/lib/components/reporting/report-stats/report-stats.component.d.ts +47 -0
- package/lib/components/reporting/report-template-list/report-template-list.component.d.ts +39 -0
- package/lib/components/reporting/reporting.module.d.ts +14 -0
- package/lib/components/video-call/incoming-call/incoming-call.component.d.ts +20 -0
- package/lib/components/video-call/services/livekit-room.service.d.ts +28 -0
- package/lib/components/video-call/services/video-call-signaling.service.d.ts +21 -0
- package/lib/components/video-call/services/video-call-state.service.d.ts +25 -0
- package/lib/components/video-call/types/video-call.types.d.ts +49 -0
- package/lib/components/video-call/video-call.module.d.ts +11 -0
- package/lib/components/video-call/video-controls/video-controls.component.d.ts +13 -0
- package/lib/components/video-call/video-participant/video-participant.component.d.ts +17 -0
- package/lib/components/video-call/video-room/video-room.component.d.ts +30 -0
- package/lib/core/auth-interceptor.d.ts +13 -0
- package/lib/core/client-interceptor.d.ts +14 -0
- package/lib/core/error-handler.d.ts +13 -0
- package/lib/core/http-client.service.d.ts +61 -0
- package/lib/core/websocket.service.d.ts +37 -0
- package/lib/models/admin/audit.models.d.ts +73 -0
- package/lib/models/admin/backup.models.d.ts +101 -0
- package/lib/models/admin/client.models.d.ts +99 -0
- package/lib/models/admin/email-provider.models.d.ts +56 -0
- package/lib/models/admin/erp.models.d.ts +188 -0
- package/lib/models/admin/identity-provider.models.d.ts +1 -0
- package/lib/models/admin/index.d.ts +13 -0
- package/lib/models/admin/messaging-provider.models.d.ts +49 -0
- package/lib/models/admin/platform-admin.models.d.ts +33 -0
- package/lib/models/admin/queue.models.d.ts +54 -0
- package/lib/models/admin/role.models.d.ts +50 -0
- package/lib/models/admin/sandbox.models.d.ts +54 -0
- package/lib/models/admin/ticket.models.d.ts +48 -0
- package/lib/models/admin/webhook.models.d.ts +65 -0
- package/lib/models/api/ai.models.d.ts +75 -0
- package/lib/models/api/aip.models.d.ts +545 -0
- package/lib/models/api/cat.models.d.ts +260 -0
- package/lib/models/api/company.models.d.ts +125 -0
- package/lib/models/api/compliance.models.d.ts +74 -0
- package/lib/models/api/component.models.d.ts +294 -0
- package/lib/models/api/cortex-edge.models.d.ts +14 -0
- package/lib/models/api/cortex-event.models.d.ts +12 -0
- package/lib/models/api/cortex-insight.models.d.ts +25 -0
- package/lib/models/api/cortex-node.models.d.ts +10 -0
- package/lib/models/api/custom-field.models.d.ts +37 -0
- package/lib/models/api/deferral.models.d.ts +81 -0
- package/lib/models/api/diagnostic-report.models.d.ts +29 -0
- package/lib/models/api/document.models.d.ts +95 -0
- package/lib/models/api/energy.models.d.ts +210 -0
- package/lib/models/api/failure.models.d.ts +171 -0
- package/lib/models/api/fleet.models.d.ts +193 -0
- package/lib/models/api/inspection.models.d.ts +110 -0
- package/lib/models/api/intervention.models.d.ts +254 -0
- package/lib/models/api/iot.models.d.ts +15 -0
- package/lib/models/api/knowledge.models.d.ts +340 -0
- package/lib/models/api/loto.models.d.ts +51 -0
- package/lib/models/api/maintenance-record.models.d.ts +100 -0
- package/lib/models/api/maintenance.models.d.ts +188 -0
- package/lib/models/api/material.models.d.ts +261 -0
- package/lib/models/api/media.models.d.ts +106 -0
- package/lib/models/api/misc.models.d.ts +929 -0
- package/lib/models/api/project.models.d.ts +118 -0
- package/lib/models/api/quality.models.d.ts +153 -0
- package/lib/models/api/reporting.models.d.ts +76 -0
- package/lib/models/api/reservoir-websocket.models.d.ts +48 -0
- package/lib/models/api/reservoir.models.d.ts +274 -0
- package/lib/models/api/search.models.d.ts +30 -0
- package/lib/models/api/sensor.models.d.ts +117 -0
- package/lib/models/api/unit.models.d.ts +82 -0
- package/lib/models/api/user.models.d.ts +253 -0
- package/lib/models/api/warranty.models.d.ts +51 -0
- package/lib/models/api/work-permit.models.d.ts +70 -0
- package/lib/models/api/workflow.models.d.ts +52 -0
- package/lib/models/auth/index.d.ts +3 -0
- package/lib/models/auth/login.models.d.ts +134 -0
- package/lib/models/auth/sso.models.d.ts +136 -0
- package/lib/models/auth/totp.models.d.ts +19 -0
- package/lib/models/base.models.d.ts +90 -0
- package/lib/models/chat/chat.models.d.ts +171 -0
- package/lib/models/enums/cat.enums.d.ts +114 -0
- package/lib/models/enums/energy.enums.d.ts +50 -0
- package/lib/models/enums/erp.enums.d.ts +49 -0
- package/lib/models/enums/index.d.ts +14 -0
- package/lib/models/enums/inspection.enums.d.ts +61 -0
- package/lib/models/enums/loto.enums.d.ts +41 -0
- package/lib/models/enums/misc.enums.d.ts +151 -0
- package/lib/models/enums/quality.enums.d.ts +25 -0
- package/lib/models/enums/reservoir.enums.d.ts +80 -0
- package/lib/models/enums/sso.enums.d.ts +15 -0
- package/lib/models/enums/status.enums.d.ts +296 -0
- package/lib/models/enums/time.enums.d.ts +51 -0
- package/lib/models/enums/type.enums.d.ts +324 -0
- package/lib/models/enums/user.enums.d.ts +31 -0
- package/lib/models/enums/work-permit.enums.d.ts +56 -0
- package/lib/models/index.d.ts +41 -0
- package/lib/models/realtime/realtime-event.models.d.ts +95 -0
- package/lib/models/video/video-call.models.d.ts +65 -0
- package/lib/services/admin/activity-log.service.d.ts +13 -0
- package/lib/services/admin/announcement.service.d.ts +17 -0
- package/lib/services/admin/article-admin.service.d.ts +17 -0
- package/lib/services/admin/audit-log.service.d.ts +22 -0
- package/lib/services/admin/backup.service.d.ts +15 -0
- package/lib/services/admin/cache-admin.service.d.ts +26 -0
- package/lib/services/admin/client-admin.service.d.ts +38 -0
- package/lib/services/admin/client-api-key.service.d.ts +15 -0
- package/lib/services/admin/client-ocr.service.d.ts +14 -0
- package/lib/services/admin/client-usage.service.d.ts +15 -0
- package/lib/services/admin/data-export.service.d.ts +10 -0
- package/lib/services/admin/document-admin.service.d.ts +18 -0
- package/lib/services/admin/email-admin.service.d.ts +14 -0
- package/lib/services/admin/email-provider.service.d.ts +25 -0
- package/lib/services/admin/erp-admin.service.d.ts +41 -0
- package/lib/services/admin/identity-provider.service.d.ts +21 -0
- package/lib/services/admin/impersonation.service.d.ts +11 -0
- package/lib/services/admin/index.d.ts +30 -0
- package/lib/services/admin/messaging-provider.service.d.ts +24 -0
- package/lib/services/admin/notification.service.d.ts +15 -0
- package/lib/services/admin/platform-admin.service.d.ts +17 -0
- package/lib/services/admin/platform-webhook.service.d.ts +16 -0
- package/lib/services/admin/queue-admin.service.d.ts +24 -0
- package/lib/services/admin/role-admin.service.d.ts +37 -0
- package/lib/services/admin/sandbox-admin.service.d.ts +17 -0
- package/lib/services/admin/scheduler-admin.service.d.ts +61 -0
- package/lib/services/admin/subscription.service.d.ts +15 -0
- package/lib/services/admin/system-health.service.d.ts +11 -0
- package/lib/services/admin/user-admin.service.d.ts +27 -0
- package/lib/services/admin/user-permission.service.d.ts +18 -0
- package/lib/services/admin/webhook-admin.service.d.ts +26 -0
- package/lib/services/api/agent.service.d.ts +16 -0
- package/lib/services/api/ai-feedback.service.d.ts +9 -0
- package/lib/services/api/ai.service.d.ts +36 -0
- package/lib/services/api/aip-analysis.service.d.ts +13 -0
- package/lib/services/api/aip-financial.service.d.ts +16 -0
- package/lib/services/api/aip-geographic.service.d.ts +16 -0
- package/lib/services/api/aip-network.service.d.ts +16 -0
- package/lib/services/api/aip-performance.service.d.ts +16 -0
- package/lib/services/api/aip-resource.service.d.ts +14 -0
- package/lib/services/api/aip-workflow.service.d.ts +24 -0
- package/lib/services/api/aip.service.d.ts +73 -0
- package/lib/services/api/alert.service.d.ts +15 -0
- package/lib/services/api/anomaly-detection.service.d.ts +26 -0
- package/lib/services/api/asset-lifecycle.service.d.ts +29 -0
- package/lib/services/api/audit-entry.service.d.ts +13 -0
- package/lib/services/api/base-crud.service.d.ts +18 -0
- package/lib/services/api/bid.service.d.ts +10 -0
- package/lib/services/api/budget.service.d.ts +10 -0
- package/lib/services/api/bulk-operation.service.d.ts +26 -0
- package/lib/services/api/capex-project.service.d.ts +10 -0
- package/lib/services/api/cat.service.d.ts +40 -0
- package/lib/services/api/client-article.service.d.ts +14 -0
- package/lib/services/api/community.service.d.ts +21 -0
- package/lib/services/api/company-material-type.service.d.ts +10 -0
- package/lib/services/api/company-material.service.d.ts +9 -0
- package/lib/services/api/company.service.d.ts +15 -0
- package/lib/services/api/compliance.service.d.ts +35 -0
- package/lib/services/api/component-info.service.d.ts +10 -0
- package/lib/services/api/component-location.service.d.ts +10 -0
- package/lib/services/api/component.service.d.ts +32 -0
- package/lib/services/api/cortex-event.service.d.ts +10 -0
- package/lib/services/api/cortex-insight.service.d.ts +14 -0
- package/lib/services/api/cortex-node.service.d.ts +10 -0
- package/lib/services/api/cortex.service.d.ts +15 -0
- package/lib/services/api/custom-field.service.d.ts +33 -0
- package/lib/services/api/custom.service.d.ts +23 -0
- package/lib/services/api/dashboard.service.d.ts +18 -0
- package/lib/services/api/deferral.service.d.ts +29 -0
- package/lib/services/api/department.service.d.ts +9 -0
- package/lib/services/api/device-gateway.service.d.ts +16 -0
- package/lib/services/api/diagnostic-report.service.d.ts +14 -0
- package/lib/services/api/digital-twin.service.d.ts +29 -0
- package/lib/services/api/document.service.d.ts +28 -0
- package/lib/services/api/dynamic-crud.service.d.ts +41 -0
- package/lib/services/api/energy-analytics.service.d.ts +16 -0
- package/lib/services/api/energy-production.service.d.ts +10 -0
- package/lib/services/api/energy.service.d.ts +46 -0
- package/lib/services/api/entity-comment.service.d.ts +16 -0
- package/lib/services/api/event.service.d.ts +10 -0
- package/lib/services/api/export.service.d.ts +48 -0
- package/lib/services/api/extension.service.d.ts +24 -0
- package/lib/services/api/failure.service.d.ts +28 -0
- package/lib/services/api/fleet.service.d.ts +71 -0
- package/lib/services/api/inactive-component.service.d.ts +10 -0
- package/lib/services/api/index.d.ts +101 -0
- package/lib/services/api/inspection.service.d.ts +16 -0
- package/lib/services/api/intervention-request.service.d.ts +10 -0
- package/lib/services/api/intervention.service.d.ts +10 -0
- package/lib/services/api/knowledge.service.d.ts +106 -0
- package/lib/services/api/license.service.d.ts +14 -0
- package/lib/services/api/location.service.d.ts +9 -0
- package/lib/services/api/log.service.d.ts +9 -0
- package/lib/services/api/login-history.service.d.ts +10 -0
- package/lib/services/api/maintenance-plan.service.d.ts +10 -0
- package/lib/services/api/maintenance-record.service.d.ts +10 -0
- package/lib/services/api/material-consumable.service.d.ts +22 -0
- package/lib/services/api/material-instrument.service.d.ts +16 -0
- package/lib/services/api/material-item.service.d.ts +28 -0
- package/lib/services/api/material-tooling.service.d.ts +22 -0
- package/lib/services/api/measurement-unit.service.d.ts +10 -0
- package/lib/services/api/misc-crud.service.d.ts +167 -0
- package/lib/services/api/note.service.d.ts +14 -0
- package/lib/services/api/outage-resource.service.d.ts +15 -0
- package/lib/services/api/plant-data.service.d.ts +14 -0
- package/lib/services/api/procurement.service.d.ts +27 -0
- package/lib/services/api/project.service.d.ts +10 -0
- package/lib/services/api/property-template.service.d.ts +10 -0
- package/lib/services/api/quality.service.d.ts +16 -0
- package/lib/services/api/recurring-event.service.d.ts +10 -0
- package/lib/services/api/reporting.service.d.ts +38 -0
- package/lib/services/api/reservoir-data.service.d.ts +10 -0
- package/lib/services/api/reservoir.service.d.ts +109 -0
- package/lib/services/api/room.service.d.ts +10 -0
- package/lib/services/api/sandbox.service.d.ts +26 -0
- package/lib/services/api/scheduled-report.service.d.ts +10 -0
- package/lib/services/api/search.service.d.ts +54 -0
- package/lib/services/api/sensor.service.d.ts +17 -0
- package/lib/services/api/sla-policy.service.d.ts +10 -0
- package/lib/services/api/sla.service.d.ts +10 -0
- package/lib/services/api/threshold-alert-rule.service.d.ts +10 -0
- package/lib/services/api/ticket.service.d.ts +60 -0
- package/lib/services/api/time-entry.service.d.ts +10 -0
- package/lib/services/api/todo.service.d.ts +10 -0
- package/lib/services/api/unit.service.d.ts +10 -0
- package/lib/services/api/upload.service.d.ts +50 -0
- package/lib/services/api/user.service.d.ts +59 -0
- package/lib/services/api/warehouse.service.d.ts +15 -0
- package/lib/services/api/warranty.service.d.ts +16 -0
- package/lib/services/api/work-order.service.d.ts +17 -0
- package/lib/services/api/work-permit.service.d.ts +10 -0
- package/lib/services/api/workflow.service.d.ts +33 -0
- package/lib/services/auth/auth.service.d.ts +33 -0
- package/lib/services/auth/index.d.ts +4 -0
- package/lib/services/auth/platform-auth.service.d.ts +16 -0
- package/lib/services/auth/sso-auth.service.d.ts +21 -0
- package/lib/services/auth/totp.service.d.ts +18 -0
- package/lib/services/chat/chat-rest.service.d.ts +40 -0
- package/lib/services/chat/chat-websocket.service.d.ts +34 -0
- package/lib/services/chat/index.d.ts +2 -0
- package/lib/services/index.d.ts +7 -0
- package/lib/services/realtime/index.d.ts +1 -0
- package/lib/services/realtime/realtime-event.service.d.ts +137 -0
- package/lib/services/reservoir/index.d.ts +1 -0
- package/lib/services/reservoir/reservoir-websocket.service.d.ts +47 -0
- package/lib/services/video/index.d.ts +2 -0
- package/lib/services/video/video-call-rest.service.d.ts +19 -0
- package/lib/services/video/video-call-websocket.service.d.ts +31 -0
- package/lib/tgm-sdk.config.d.ts +36 -0
- package/lib/tgm-sdk.module.d.ts +13 -0
- package/package.json +40 -0
- package/public-api.d.ts +42 -0
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { BehaviorSubject, Subject } from 'rxjs';
|
|
3
|
+
import { Room, RoomEvent, Track, ConnectionState, } from 'livekit-client';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export class LivekitRoomService {
|
|
6
|
+
room;
|
|
7
|
+
participantsSubject = new BehaviorSubject([]);
|
|
8
|
+
connectionStateSubject = new BehaviorSubject(ConnectionState.Disconnected);
|
|
9
|
+
activeSpeakersSubject = new BehaviorSubject([]);
|
|
10
|
+
errorSubject = new Subject();
|
|
11
|
+
participants$ = this.participantsSubject.asObservable();
|
|
12
|
+
connectionState$ = this.connectionStateSubject.asObservable();
|
|
13
|
+
activeSpeakers$ = this.activeSpeakersSubject.asObservable();
|
|
14
|
+
error$ = this.errorSubject.asObservable();
|
|
15
|
+
async connect(token, wsUrl) {
|
|
16
|
+
try {
|
|
17
|
+
this.room = new Room({
|
|
18
|
+
adaptiveStream: true,
|
|
19
|
+
dynacast: true,
|
|
20
|
+
});
|
|
21
|
+
this.setupRoomListeners(this.room);
|
|
22
|
+
await this.room.connect(wsUrl, token);
|
|
23
|
+
this.connectionStateSubject.next(ConnectionState.Connected);
|
|
24
|
+
// Enable local tracks
|
|
25
|
+
await this.room.localParticipant.enableCameraAndMicrophone();
|
|
26
|
+
this.updateParticipants();
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
this.connectionStateSubject.next(ConnectionState.Disconnected);
|
|
30
|
+
this.errorSubject.next(error.message || 'Failed to connect to room');
|
|
31
|
+
throw error;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
disconnect() {
|
|
35
|
+
if (this.room) {
|
|
36
|
+
this.room.disconnect();
|
|
37
|
+
this.room = undefined;
|
|
38
|
+
this.connectionStateSubject.next(ConnectionState.Disconnected);
|
|
39
|
+
this.participantsSubject.next([]);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
async toggleMicrophone() {
|
|
43
|
+
if (!this.room)
|
|
44
|
+
return false;
|
|
45
|
+
const enabled = this.room.localParticipant.isMicrophoneEnabled;
|
|
46
|
+
await this.room.localParticipant.setMicrophoneEnabled(!enabled);
|
|
47
|
+
this.updateParticipants();
|
|
48
|
+
return !enabled;
|
|
49
|
+
}
|
|
50
|
+
async toggleCamera() {
|
|
51
|
+
if (!this.room)
|
|
52
|
+
return false;
|
|
53
|
+
const enabled = this.room.localParticipant.isCameraEnabled;
|
|
54
|
+
await this.room.localParticipant.setCameraEnabled(!enabled);
|
|
55
|
+
this.updateParticipants();
|
|
56
|
+
return !enabled;
|
|
57
|
+
}
|
|
58
|
+
async toggleScreenShare() {
|
|
59
|
+
if (!this.room)
|
|
60
|
+
return false;
|
|
61
|
+
const enabled = this.room.localParticipant.isScreenShareEnabled;
|
|
62
|
+
await this.room.localParticipant.setScreenShareEnabled(!enabled);
|
|
63
|
+
this.updateParticipants();
|
|
64
|
+
return !enabled;
|
|
65
|
+
}
|
|
66
|
+
getRoom() {
|
|
67
|
+
return this.room;
|
|
68
|
+
}
|
|
69
|
+
ngOnDestroy() {
|
|
70
|
+
this.disconnect();
|
|
71
|
+
}
|
|
72
|
+
setupRoomListeners(room) {
|
|
73
|
+
room.on(RoomEvent.ParticipantConnected, () => this.updateParticipants());
|
|
74
|
+
room.on(RoomEvent.ParticipantDisconnected, () => this.updateParticipants());
|
|
75
|
+
room.on(RoomEvent.TrackSubscribed, () => this.updateParticipants());
|
|
76
|
+
room.on(RoomEvent.TrackUnsubscribed, () => this.updateParticipants());
|
|
77
|
+
room.on(RoomEvent.TrackMuted, () => this.updateParticipants());
|
|
78
|
+
room.on(RoomEvent.TrackUnmuted, () => this.updateParticipants());
|
|
79
|
+
room.on(RoomEvent.LocalTrackPublished, () => this.updateParticipants());
|
|
80
|
+
room.on(RoomEvent.LocalTrackUnpublished, () => this.updateParticipants());
|
|
81
|
+
room.on(RoomEvent.ActiveSpeakersChanged, (speakers) => {
|
|
82
|
+
this.activeSpeakersSubject.next(speakers.map((s) => s.identity));
|
|
83
|
+
this.updateParticipants();
|
|
84
|
+
});
|
|
85
|
+
room.on(RoomEvent.ConnectionStateChanged, (state) => {
|
|
86
|
+
this.connectionStateSubject.next(state);
|
|
87
|
+
});
|
|
88
|
+
room.on(RoomEvent.Disconnected, () => {
|
|
89
|
+
this.connectionStateSubject.next(ConnectionState.Disconnected);
|
|
90
|
+
this.participantsSubject.next([]);
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
updateParticipants() {
|
|
94
|
+
if (!this.room)
|
|
95
|
+
return;
|
|
96
|
+
const participants = [];
|
|
97
|
+
// Local participant
|
|
98
|
+
participants.push(this.toParticipantInfo(this.room.localParticipant, true));
|
|
99
|
+
// Remote participants
|
|
100
|
+
this.room.remoteParticipants.forEach((participant) => {
|
|
101
|
+
participants.push(this.toParticipantInfo(participant, false));
|
|
102
|
+
});
|
|
103
|
+
this.participantsSubject.next(participants);
|
|
104
|
+
}
|
|
105
|
+
toParticipantInfo(participant, isLocal) {
|
|
106
|
+
let audioTrack;
|
|
107
|
+
let videoTrack;
|
|
108
|
+
let screenShareTrack;
|
|
109
|
+
participant.trackPublications.forEach((pub) => {
|
|
110
|
+
const track = pub.track;
|
|
111
|
+
if (!track)
|
|
112
|
+
return;
|
|
113
|
+
if (track.source === Track.Source.Microphone) {
|
|
114
|
+
audioTrack = track;
|
|
115
|
+
}
|
|
116
|
+
else if (track.source === Track.Source.Camera) {
|
|
117
|
+
videoTrack = track;
|
|
118
|
+
}
|
|
119
|
+
else if (track.source === Track.Source.ScreenShare) {
|
|
120
|
+
screenShareTrack = track;
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
return {
|
|
124
|
+
identity: participant.identity,
|
|
125
|
+
name: participant.name || participant.identity,
|
|
126
|
+
audioTrack,
|
|
127
|
+
videoTrack,
|
|
128
|
+
screenShareTrack,
|
|
129
|
+
isSpeaking: participant.isSpeaking,
|
|
130
|
+
audioEnabled: participant.isMicrophoneEnabled,
|
|
131
|
+
videoEnabled: participant.isCameraEnabled,
|
|
132
|
+
isLocal,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LivekitRoomService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
136
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LivekitRoomService, providedIn: 'root' });
|
|
137
|
+
}
|
|
138
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LivekitRoomService, decorators: [{
|
|
139
|
+
type: Injectable,
|
|
140
|
+
args: [{ providedIn: 'root' }]
|
|
141
|
+
}] });
|
|
142
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGl2ZWtpdC1yb29tLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvdmlkZW8tY2FsbC9zZXJ2aWNlcy9saXZla2l0LXJvb20uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQ3RELE9BQU8sRUFBRSxlQUFlLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVELE9BQU8sRUFDTCxJQUFJLEVBQ0osU0FBUyxFQUNULEtBQUssRUFJTCxlQUFlLEdBR2hCLE1BQU0sZ0JBQWdCLENBQUM7O0FBSXhCLE1BQU0sT0FBTyxrQkFBa0I7SUFDckIsSUFBSSxDQUFRO0lBQ1osbUJBQW1CLEdBQUcsSUFBSSxlQUFlLENBQW9CLEVBQUUsQ0FBQyxDQUFDO0lBQ2pFLHNCQUFzQixHQUFHLElBQUksZUFBZSxDQUFrQixlQUFlLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDNUYscUJBQXFCLEdBQUcsSUFBSSxlQUFlLENBQVcsRUFBRSxDQUFDLENBQUM7SUFDMUQsWUFBWSxHQUFHLElBQUksT0FBTyxFQUFVLENBQUM7SUFFcEMsYUFBYSxHQUFrQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdkYsZ0JBQWdCLEdBQWdDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMzRixlQUFlLEdBQXlCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUNsRixNQUFNLEdBQXVCLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLENBQUM7SUFFdkUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFhLEVBQUUsS0FBYTtRQUN4QyxJQUFJLENBQUM7WUFDSCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDO2dCQUNuQixjQUFj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ZSwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIFJvb20sXG4gIFJvb21FdmVudCxcbiAgVHJhY2ssXG4gIFBhcnRpY2lwYW50LFxuICBSZW1vdGVQYXJ0aWNpcGFudCxcbiAgTG9jYWxQYXJ0aWNpcGFudCxcbiAgQ29ubmVjdGlvblN0YXRlLFxuICBSZW1vdGVUcmFja1B1YmxpY2F0aW9uLFxuICBMb2NhbFRyYWNrUHVibGljYXRpb24sXG59IGZyb20gJ2xpdmVraXQtY2xpZW50JztcbmltcG9ydCB7IFBhcnRpY2lwYW50SW5mbyB9IGZyb20gJy4uL3R5cGVzL3ZpZGVvLWNhbGwudHlwZXMnO1xuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIExpdmVraXRSb29tU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgcm9vbT86IFJvb207XG4gIHByaXZhdGUgcGFydGljaXBhbnRzU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UGFydGljaXBhbnRJbmZvW10+KFtdKTtcbiAgcHJpdmF0ZSBjb25uZWN0aW9uU3RhdGVTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxDb25uZWN0aW9uU3RhdGU+KENvbm5lY3Rpb25TdGF0ZS5EaXNjb25uZWN0ZWQpO1xuICBwcml2YXRlIGFjdGl2ZVNwZWFrZXJzU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nW10+KFtdKTtcbiAgcHJpdmF0ZSBlcnJvclN1YmplY3QgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG5cbiAgcmVhZG9ubHkgcGFydGljaXBhbnRzJDogT2JzZXJ2YWJsZTxQYXJ0aWNpcGFudEluZm9bXT4gPSB0aGlzLnBhcnRpY2lwYW50c1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIHJlYWRvbmx5IGNvbm5lY3Rpb25TdGF0ZSQ6IE9ic2VydmFibGU8Q29ubmVjdGlvblN0YXRlPiA9IHRoaXMuY29ubmVjdGlvblN0YXRlU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgcmVhZG9ubHkgYWN0aXZlU3BlYWtlcnMkOiBPYnNlcnZhYmxlPHN0cmluZ1tdPiA9IHRoaXMuYWN0aXZlU3BlYWtlcnNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICByZWFkb25seSBlcnJvciQ6IE9ic2VydmFibGU8c3RyaW5nPiA9IHRoaXMuZXJyb3JTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gIGFzeW5jIGNvbm5lY3QodG9rZW46IHN0cmluZywgd3NVcmw6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLnJvb20gPSBuZXcgUm9vbSh7XG4gICAgICAgIGFkYXB0aXZlU3RyZWFtOiB0cnVlLFxuICAgICAgICBkeW5hY2FzdDogdHJ1ZSxcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnNldHVwUm9vbUxpc3RlbmVycyh0aGlzLnJvb20pO1xuXG4gICAgICBhd2FpdCB0aGlzLnJvb20uY29ubmVjdCh3c1VybCwgdG9rZW4pO1xuICAgICAgdGhpcy5jb25uZWN0aW9uU3RhdGVTdWJqZWN0Lm5leHQoQ29ubmVjdGlvblN0YXRlLkNvbm5lY3RlZCk7XG5cbiAgICAgIC8vIEVuYWJsZSBsb2NhbCB0cmFja3NcbiAgICAgIGF3YWl0IHRoaXMucm9vbS5sb2NhbFBhcnRpY2lwYW50LmVuYWJsZUNhbWVyYUFuZE1pY3JvcGhvbmUoKTtcbiAgICAgIHRoaXMudXBkYXRlUGFydGljaXBhbnRzKCk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgdGhpcy5jb25uZWN0aW9uU3RhdGVTdWJqZWN0Lm5leHQoQ29ubmVjdGlvblN0YXRlLkRpc2Nvbm5lY3RlZCk7XG4gICAgICB0aGlzLmVycm9yU3ViamVjdC5uZXh0KGVycm9yLm1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byBjb25uZWN0IHRvIHJvb20nKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIGRpc2Nvbm5lY3QoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucm9vbSkge1xuICAgICAgdGhpcy5yb29tLmRpc2Nvbm5lY3QoKTtcbiAgICAgIHRoaXMucm9vbSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuY29ubmVjdGlvblN0YXRlU3ViamVjdC5uZXh0KENvbm5lY3Rpb25TdGF0ZS5EaXNjb25uZWN0ZWQpO1xuICAgICAgdGhpcy5wYXJ0aWNpcGFudHNTdWJqZWN0Lm5leHQoW10pO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHRvZ2dsZU1pY3JvcGhvbmUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCF0aGlzLnJvb20pIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBlbmFibGVkID0gdGhpcy5yb29tLmxvY2FsUGFydGljaXBhbnQuaXNNaWNyb3Bob25lRW5hYmxlZDtcbiAgICBhd2FpdCB0aGlzLnJvb20ubG9jYWxQYXJ0aWNpcGFudC5zZXRNaWNyb3Bob25lRW5hYmxlZCghZW5hYmxlZCk7XG4gICAgdGhpcy51cGRhdGVQYXJ0aWNpcGFudHMoKTtcbiAgICByZXR1cm4gIWVuYWJsZWQ7XG4gIH1cblxuICBhc3luYyB0b2dnbGVDYW1lcmEoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCF0aGlzLnJvb20pIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBlbmFibGVkID0gdGhpcy5yb29tLmxvY2FsUGFydGljaXBhbnQuaXNDYW1lcmFFbmFibGVkO1xuICAgIGF3YWl0IHRoaXMucm9vbS5sb2NhbFBhcnRpY2lwYW50LnNldENhbWVyYUVuYWJsZWQoIWVuYWJsZWQpO1xuICAgIHRoaXMudXBkYXRlUGFydGljaXBhbnRzKCk7XG4gICAgcmV0dXJuICFlbmFibGVkO1xuICB9XG5cbiAgYXN5bmMgdG9nZ2xlU2NyZWVuU2hhcmUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCF0aGlzLnJvb20pIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBlbmFibGVkID0gdGhpcy5yb29tLmxvY2FsUGFydGljaXBhbnQuaXNTY3JlZW5TaGFyZUVuYWJsZWQ7XG4gICAgYXdhaXQgdGhpcy5yb29tLmxvY2FsUGFydGljaXBhbnQuc2V0U2NyZWVuU2hhcmVFbmFibGVkKCFlbmFibGVkKTtcbiAgICB0aGlzLnVwZGF0ZVBhcnRpY2lwYW50cygpO1xuICAgIHJldHVybiAhZW5hYmxlZDtcbiAgfVxuXG4gIGdldFJvb20oKTogUm9vbSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucm9vbTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cFJvb21MaXN0ZW5lcnMocm9vbTogUm9vbSk6IHZvaWQge1xuICAgIHJvb20ub24oUm9vbUV2ZW50LlBhcnRpY2lwYW50Q29ubmVjdGVkLCAoKSA9PiB0aGlzLnVwZGF0ZVBhcnRpY2lwYW50cygpKTtcbiAgICByb29tLm9uKFJvb21FdmVudC5QYXJ0aWNpcGFudERpc2Nvbm5lY3RlZCwgKCkgPT4gdGhpcy51cGRhdGVQYXJ0aWNpcGFudHMoKSk7XG4gICAgcm9vbS5vbihSb29tRXZlbnQuVHJhY2tTdWJzY3JpYmVkLCAoKSA9PiB0aGlzLnVwZGF0ZVBhcnRpY2lwYW50cygpKTtcbiAgICByb29tLm9uKFJvb21FdmVudC5UcmFja1Vuc3Vic2NyaWJlZCwgKCkgPT4gdGhpcy51cGRhdGVQYXJ0aWNpcGFudHMoKSk7XG4gICAgcm9vbS5vbihSb29tRXZlbnQuVHJhY2tNdXRlZCwgKCkgPT4gdGhpcy51cGRhdGVQYXJ0aWNpcGFudHMoKSk7XG4gICAgcm9vbS5vbihSb29tRXZlbnQuVHJhY2tVbm11dGVkLCAoKSA9PiB0aGlzLnVwZGF0ZVBhcnRpY2lwYW50cygpKTtcbiAgICByb29tLm9uKFJvb21FdmVudC5Mb2NhbFRyYWNrUHVibGlzaGVkLCAoKSA9PiB0aGlzLnVwZGF0ZVBhcnRpY2lwYW50cygpKTtcbiAgICByb29tLm9uKFJvb21FdmVudC5Mb2NhbFRyYWNrVW5wdWJsaXNoZWQsICgpID0+IHRoaXMudXBkYXRlUGFydGljaXBhbnRzKCkpO1xuICAgIHJvb20ub24oUm9vbUV2ZW50LkFjdGl2ZVNwZWFrZXJzQ2hhbmdlZCwgKHNwZWFrZXJzOiBQYXJ0aWNpcGFudFtdKSA9PiB7XG4gICAgICB0aGlzLmFjdGl2ZVNwZWFrZXJzU3ViamVjdC5uZXh0KHNwZWFrZXJzLm1hcCgocykgPT4gcy5pZGVudGl0eSkpO1xuICAgICAgdGhpcy51cGRhdGVQYXJ0aWNpcGFudHMoKTtcbiAgICB9KTtcbiAgICByb29tLm9uKFJvb21FdmVudC5Db25uZWN0aW9uU3RhdGVDaGFuZ2VkLCAoc3RhdGU6IENvbm5lY3Rpb25TdGF0ZSkgPT4ge1xuICAgICAgdGhpcy5jb25uZWN0aW9uU3RhdGVTdWJqZWN0Lm5leHQoc3RhdGUpO1xuICAgIH0pO1xuICAgIHJvb20ub24oUm9vbUV2ZW50LkRpc2Nvbm5lY3RlZCwgKCkgPT4ge1xuICAgICAgdGhpcy5jb25uZWN0aW9uU3RhdGVTdWJqZWN0Lm5leHQoQ29ubmVjdGlvblN0YXRlLkRpc2Nvbm5lY3RlZCk7XG4gICAgICB0aGlzLnBhcnRpY2lwYW50c1N1YmplY3QubmV4dChbXSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVBhcnRpY2lwYW50cygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucm9vbSkgcmV0dXJuO1xuXG4gICAgY29uc3QgcGFydGljaXBhbnRzOiBQYXJ0aWNpcGFudEluZm9bXSA9IFtdO1xuXG4gICAgLy8gTG9jYWwgcGFydGljaXBhbnRcbiAgICBwYXJ0aWNpcGFudHMucHVzaCh0aGlzLnRvUGFydGljaXBhbnRJbmZvKHRoaXMucm9vbS5sb2NhbFBhcnRpY2lwYW50LCB0cnVlKSk7XG5cbiAgICAvLyBSZW1vdGUgcGFydGljaXBhbnRzXG4gICAgdGhpcy5yb29tLnJlbW90ZVBhcnRpY2lwYW50cy5mb3JFYWNoKChwYXJ0aWNpcGFudCkgPT4ge1xuICAgICAgcGFydGljaXBhbnRzLnB1c2godGhpcy50b1BhcnRpY2lwYW50SW5mbyhwYXJ0aWNpcGFudCwgZmFsc2UpKTtcbiAgICB9KTtcblxuICAgIHRoaXMucGFydGljaXBhbnRzU3ViamVjdC5uZXh0KHBhcnRpY2lwYW50cyk7XG4gIH1cblxuICBwcml2YXRlIHRvUGFydGljaXBhbnRJbmZvKHBhcnRpY2lwYW50OiBQYXJ0aWNpcGFudCwgaXNMb2NhbDogYm9vbGVhbik6IFBhcnRpY2lwYW50SW5mbyB7XG4gICAgbGV0IGF1ZGlvVHJhY2s6IFRyYWNrIHwgdW5kZWZpbmVkO1xuICAgIGxldCB2aWRlb1RyYWNrOiBUcmFjayB8IHVuZGVmaW5lZDtcbiAgICBsZXQgc2NyZWVuU2hhcmVUcmFjazogVHJhY2sgfCB1bmRlZmluZWQ7XG5cbiAgICBwYXJ0aWNpcGFudC50cmFja1B1YmxpY2F0aW9ucy5mb3JFYWNoKChwdWIpID0+IHtcbiAgICAgIGNvbnN0IHRyYWNrID0gcHViLnRyYWNrO1xuICAgICAgaWYgKCF0cmFjaykgcmV0dXJuO1xuXG4gICAgICBpZiAodHJhY2suc291cmNlID09PSBUcmFjay5Tb3VyY2UuTWljcm9waG9uZSkge1xuICAgICAgICBhdWRpb1RyYWNrID0gdHJhY2s7XG4gICAgICB9IGVsc2UgaWYgKHRyYWNrLnNvdXJjZSA9PT0gVHJhY2suU291cmNlLkNhbWVyYSkge1xuICAgICAgICB2aWRlb1RyYWNrID0gdHJhY2s7XG4gICAgICB9IGVsc2UgaWYgKHRyYWNrLnNvdXJjZSA9PT0gVHJhY2suU291cmNlLlNjcmVlblNoYXJlKSB7XG4gICAgICAgIHNjcmVlblNoYXJlVHJhY2sgPSB0cmFjaztcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBpZGVudGl0eTogcGFydGljaXBhbnQuaWRlbnRpdHksXG4gICAgICBuYW1lOiBwYXJ0aWNpcGFudC5uYW1lIHx8IHBhcnRpY2lwYW50LmlkZW50aXR5LFxuICAgICAgYXVkaW9UcmFjayxcbiAgICAgIHZpZGVvVHJhY2ssXG4gICAgICBzY3JlZW5TaGFyZVRyYWNrLFxuICAgICAgaXNTcGVha2luZzogcGFydGljaXBhbnQuaXNTcGVha2luZyxcbiAgICAgIGF1ZGlvRW5hYmxlZDogcGFydGljaXBhbnQuaXNNaWNyb3Bob25lRW5hYmxlZCxcbiAgICAgIHZpZGVvRW5hYmxlZDogcGFydGljaXBhbnQuaXNDYW1lcmFFbmFibGVkLFxuICAgICAgaXNMb2NhbCxcbiAgICB9O1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { Subject, takeUntil } from 'rxjs';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "../../../core/websocket.service";
|
|
5
|
+
export class VideoCallSignalingService {
|
|
6
|
+
ws;
|
|
7
|
+
destroy$ = new Subject();
|
|
8
|
+
incomingCall$;
|
|
9
|
+
callAnswered$;
|
|
10
|
+
callEnded$;
|
|
11
|
+
callRejected$;
|
|
12
|
+
constructor(ws) {
|
|
13
|
+
this.ws = ws;
|
|
14
|
+
this.incomingCall$ = this.ws.subscribe('/user/queue/video/incoming-call').pipe(takeUntil(this.destroy$));
|
|
15
|
+
this.callAnswered$ = this.ws.subscribe('/user/queue/video/call-answered').pipe(takeUntil(this.destroy$));
|
|
16
|
+
this.callEnded$ = this.ws.subscribe('/user/queue/video/call-ended').pipe(takeUntil(this.destroy$));
|
|
17
|
+
this.callRejected$ = this.ws.subscribe('/user/queue/video/call-rejected').pipe(takeUntil(this.destroy$));
|
|
18
|
+
}
|
|
19
|
+
sendCallInit(request) {
|
|
20
|
+
this.ws.send('/app/video.call-init', request);
|
|
21
|
+
}
|
|
22
|
+
sendCallAnswer(request) {
|
|
23
|
+
this.ws.send('/app/video.call-answer', request);
|
|
24
|
+
}
|
|
25
|
+
sendCallEnd(callId) {
|
|
26
|
+
this.ws.send('/app/video.call-end', { callId });
|
|
27
|
+
}
|
|
28
|
+
sendCallReject(callId) {
|
|
29
|
+
this.ws.send('/app/video.call-reject', { callId });
|
|
30
|
+
}
|
|
31
|
+
ngOnDestroy() {
|
|
32
|
+
this.destroy$.next();
|
|
33
|
+
this.destroy$.complete();
|
|
34
|
+
}
|
|
35
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: VideoCallSignalingService, deps: [{ token: i1.WebSocketService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
36
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: VideoCallSignalingService, providedIn: 'root' });
|
|
37
|
+
}
|
|
38
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: VideoCallSignalingService, decorators: [{
|
|
39
|
+
type: Injectable,
|
|
40
|
+
args: [{ providedIn: 'root' }]
|
|
41
|
+
}], ctorParameters: () => [{ type: i1.WebSocketService }] });
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlkZW8tY2FsbC1zaWduYWxpbmcuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy92aWRlby1jYWxsL3NlcnZpY2VzL3ZpZGVvLWNhbGwtc2lnbmFsaW5nLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUN0RCxPQUFPLEVBQWMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7O0FBV3RELE1BQU0sT0FBTyx5QkFBeUI7SUFRaEI7SUFQWixRQUFRLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztJQUU5QixhQUFhLENBQWdDO0lBQzdDLGFBQWEsQ0FBZ0M7SUFDN0MsVUFBVSxDQUE2QjtJQUN2QyxhQUFhLENBQWdDO0lBRXRELFlBQW9CLEVBQW9CO1FBQXBCLE9BQUUsR0FBRixFQUFFLENBQWtCO1FBQ3RDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQW9CLGlDQUFpQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUM1SCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFvQixpQ0FBaUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDNUgsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBaUIsOEJBQThCLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ25ILElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQW9CLGlDQUFpQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUM5SCxDQUFDO0lBRUQsWUFBWSxDQUFDLE9BQTRCO1FBQ3ZDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRCxjQUFjLENBQUMsT0FBMEI7UUFDdkMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVELFdBQVcsQ0FBQyxNQUFjO1FBQ3hCLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsY0FBYyxDQUFDLE1BQWM7UUFDM0IsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNCLENBQUM7d0dBbENVLHlCQUF5Qjs0R0FBekIseUJBQXlCLGNBRFosTUFBTTs7NEZBQ25CLHlCQUF5QjtrQkFEckMsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgV2ViU29ja2V0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvd2Vic29ja2V0LnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgSW5jb21pbmdDYWxsRXZlbnQsXG4gIENhbGxBbnN3ZXJlZEV2ZW50LFxuICBDYWxsRW5kZWRFdmVudCxcbiAgSW5pdGlhdGVDYWxsUmVxdWVzdCxcbiAgQW5zd2VyQ2FsbFJlcXVlc3QsXG59IGZyb20gJy4uL3R5cGVzL3ZpZGVvLWNhbGwudHlwZXMnO1xuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIFZpZGVvQ2FsbFNpZ25hbGluZ1NlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICByZWFkb25seSBpbmNvbWluZ0NhbGwkOiBPYnNlcnZhYmxlPEluY29taW5nQ2FsbEV2ZW50PjtcbiAgcmVhZG9ubHkgY2FsbEFuc3dlcmVkJDogT2JzZXJ2YWJsZTxDYWxsQW5zd2VyZWRFdmVudD47XG4gIHJlYWRvbmx5IGNhbGxFbmRlZCQ6IE9ic2VydmFibGU8Q2FsbEVuZGVkRXZlbnQ+O1xuICByZWFkb25seSBjYWxsUmVqZWN0ZWQkOiBPYnNlcnZhYmxlPENhbGxBbnN3ZXJlZEV2ZW50PjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHdzOiBXZWJTb2NrZXRTZXJ2aWNlKSB7XG4gICAgdGhpcy5pbmNvbWluZ0NhbGwkID0gdGhpcy53cy5zdWJzY3JpYmU8SW5jb21pbmdDYWxsRXZlbnQ+KCcvdXNlci9xdWV1ZS92aWRlby9pbmNvbWluZy1jYWxsJykucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpO1xuICAgIHRoaXMuY2FsbEFuc3dlcmVkJCA9IHRoaXMud3Muc3Vic2NyaWJlPENhbGxBbnN3ZXJlZEV2ZW50PignL3VzZXIvcXVldWUvdmlkZW8vY2FsbC1hbnN3ZXJlZCcpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKTtcbiAgICB0aGlzLmNhbGxFbmRlZCQgPSB0aGlzLndzLnN1YnNjcmliZTxDYWxsRW5kZWRFdmVudD4oJy91c2VyL3F1ZXVlL3ZpZGVvL2NhbGwtZW5kZWQnKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSk7XG4gICAgdGhpcy5jYWxsUmVqZWN0ZWQkID0gdGhpcy53cy5zdWJzY3JpYmU8Q2FsbEFuc3dlcmVkRXZlbnQ+KCcvdXNlci9xdWV1ZS92aWRlby9jYWxsLXJlamVjdGVkJykucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpO1xuICB9XG5cbiAgc2VuZENhbGxJbml0KHJlcXVlc3Q6IEluaXRpYXRlQ2FsbFJlcXVlc3QpOiB2b2lkIHtcbiAgICB0aGlzLndzLnNlbmQoJy9hcHAvdmlkZW8uY2FsbC1pbml0JywgcmVxdWVzdCk7XG4gIH1cblxuICBzZW5kQ2FsbEFuc3dlcihyZXF1ZXN0OiBBbnN3ZXJDYWxsUmVxdWVzdCk6IHZvaWQge1xuICAgIHRoaXMud3Muc2VuZCgnL2FwcC92aWRlby5jYWxsLWFuc3dlcicsIHJlcXVlc3QpO1xuICB9XG5cbiAgc2VuZENhbGxFbmQoY2FsbElkOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLndzLnNlbmQoJy9hcHAvdmlkZW8uY2FsbC1lbmQnLCB7IGNhbGxJZCB9KTtcbiAgfVxuXG4gIHNlbmRDYWxsUmVqZWN0KGNhbGxJZDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy53cy5zZW5kKCcvYXBwL3ZpZGVvLmNhbGwtcmVqZWN0JywgeyBjYWxsSWQgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { BehaviorSubject } from 'rxjs';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
const INITIAL_STATE = {
|
|
5
|
+
isInCall: false,
|
|
6
|
+
callId: null,
|
|
7
|
+
token: null,
|
|
8
|
+
wsUrl: null,
|
|
9
|
+
roomName: null,
|
|
10
|
+
isInitiator: false,
|
|
11
|
+
incomingCall: null,
|
|
12
|
+
};
|
|
13
|
+
export class VideoCallStateService {
|
|
14
|
+
state$ = new BehaviorSubject(INITIAL_STATE);
|
|
15
|
+
state = this.state$.asObservable();
|
|
16
|
+
get currentState() {
|
|
17
|
+
return this.state$.value;
|
|
18
|
+
}
|
|
19
|
+
get isInCall() {
|
|
20
|
+
return this.state$.value.isInCall;
|
|
21
|
+
}
|
|
22
|
+
setIncomingCall(event) {
|
|
23
|
+
this.state$.next({ ...this.state$.value, incomingCall: event });
|
|
24
|
+
}
|
|
25
|
+
clearIncomingCall() {
|
|
26
|
+
this.state$.next({ ...this.state$.value, incomingCall: null });
|
|
27
|
+
}
|
|
28
|
+
startCall(callId, tokenResponse, isInitiator) {
|
|
29
|
+
this.state$.next({
|
|
30
|
+
isInCall: true,
|
|
31
|
+
callId,
|
|
32
|
+
token: tokenResponse.token,
|
|
33
|
+
wsUrl: tokenResponse.wsUrl,
|
|
34
|
+
roomName: tokenResponse.roomName,
|
|
35
|
+
isInitiator,
|
|
36
|
+
incomingCall: null,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
endCall() {
|
|
40
|
+
this.state$.next(INITIAL_STATE);
|
|
41
|
+
}
|
|
42
|
+
reset() {
|
|
43
|
+
this.state$.next(INITIAL_STATE);
|
|
44
|
+
}
|
|
45
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: VideoCallStateService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
46
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: VideoCallStateService, providedIn: 'root' });
|
|
47
|
+
}
|
|
48
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: VideoCallStateService, decorators: [{
|
|
49
|
+
type: Injectable,
|
|
50
|
+
args: [{ providedIn: 'root' }]
|
|
51
|
+
}] });
|
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlkZW8tY2FsbC1zdGF0ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL3ZpZGVvLWNhbGwvc2VydmljZXMvdmlkZW8tY2FsbC1zdGF0ZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBYyxNQUFNLE1BQU0sQ0FBQzs7QUFhbkQsTUFBTSxhQUFhLEdBQW1CO0lBQ3BDLFFBQVEsRUFBRSxLQUFLO0lBQ2YsTUFBTSxFQUFFLElBQUk7SUFDWixLQUFLLEVBQUUsSUFBSTtJQUNYLEtBQUssRUFBRSxJQUFJO0lBQ1gsUUFBUSxFQUFFLElBQUk7SUFDZCxXQUFXLEVBQUUsS0FBSztJQUNsQixZQUFZLEVBQUUsSUFBSTtDQUNuQixDQUFDO0FBR0YsTUFBTSxPQUFPLHFCQUFxQjtJQUN4QixNQUFNLEdBQUcsSUFBSSxlQUFlLENBQWlCLGFBQWEsQ0FBQyxDQUFDO0lBQzNELEtBQUssR0FBK0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUV4RSxJQUFJLFlBQVk7UUFDZCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQzNCLENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQztJQUNwQyxDQUFDO0lBRUQsZUFBZSxDQUFDLEtBQXdCO1FBQ3RDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRCxTQUFTLENBQUMsTUFBYyxFQUFFLGFBQXFDLEVBQUUsV0FBb0I7UUFDbkYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDZixRQUFRLEVBQUUsSUFBSTtZQUNkLE1BQU07WUFDTixLQUFLLEVBQUUsYUFBYSxDQUFDLEtBQUs7WUFDMUIsS0FBSyxFQUFFLGFBQWEsQ0FBQyxLQUFLO1lBQzFCLFFBQVEsRUFBRSxhQUFhLENBQUMsUUFBUTtZQUNoQyxXQUFXO1lBQ1gsWUFBWSxFQUFFLElBQUk7U0FDbkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE9BQU87UUFDTCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsS0FBSztRQUNILElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7d0dBdENVLHFCQUFxQjs0R0FBckIscUJBQXFCLGNBRFIsTUFBTTs7NEZBQ25CLHFCQUFxQjtrQkFEakMsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEluY29taW5nQ2FsbEV2ZW50LCBWaWRlb0NhbGxUb2tlblJlc3BvbnNlIH0gZnJvbSAnLi4vdHlwZXMvdmlkZW8tY2FsbC50eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmlkZW9DYWxsU3RhdGUge1xuICBpc0luQ2FsbDogYm9vbGVhbjtcbiAgY2FsbElkOiBudW1iZXIgfCBudWxsO1xuICB0b2tlbjogc3RyaW5nIHwgbnVsbDtcbiAgd3NVcmw6IHN0cmluZyB8IG51bGw7XG4gIHJvb21OYW1lOiBzdHJpbmcgfCBudWxsO1xuICBpc0luaXRpYXRvcjogYm9vbGVhbjtcbiAgaW5jb21pbmdDYWxsOiBJbmNvbWluZ0NhbGxFdmVudCB8IG51bGw7XG59XG5cbmNvbnN0IElOSVRJQUxfU1RBVEU6IFZpZGVvQ2FsbFN0YXRlID0ge1xuICBpc0luQ2FsbDogZmFsc2UsXG4gIGNhbGxJZDogbnVsbCxcbiAgdG9rZW46IG51bGwsXG4gIHdzVXJsOiBudWxsLFxuICByb29tTmFtZTogbnVsbCxcbiAgaXNJbml0aWF0b3I6IGZhbHNlLFxuICBpbmNvbWluZ0NhbGw6IG51bGwsXG59O1xuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIFZpZGVvQ2FsbFN0YXRlU2VydmljZSB7XG4gIHByaXZhdGUgc3RhdGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxWaWRlb0NhbGxTdGF0ZT4oSU5JVElBTF9TVEFURSk7XG4gIHJlYWRvbmx5IHN0YXRlOiBPYnNlcnZhYmxlPFZpZGVvQ2FsbFN0YXRlPiA9IHRoaXMuc3RhdGUkLmFzT2JzZXJ2YWJsZSgpO1xuXG4gIGdldCBjdXJyZW50U3RhdGUoKTogVmlkZW9DYWxsU3RhdGUge1xuICAgIHJldHVybiB0aGlzLnN0YXRlJC52YWx1ZTtcbiAgfVxuXG4gIGdldCBpc0luQ2FsbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZSQudmFsdWUuaXNJbkNhbGw7XG4gIH1cblxuICBzZXRJbmNvbWluZ0NhbGwoZXZlbnQ6IEluY29taW5nQ2FsbEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZSQubmV4dCh7IC4uLnRoaXMuc3RhdGUkLnZhbHVlLCBpbmNvbWluZ0NhbGw6IGV2ZW50IH0pO1xuICB9XG5cbiAgY2xlYXJJbmNvbWluZ0NhbGwoKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZSQubmV4dCh7IC4uLnRoaXMuc3RhdGUkLnZhbHVlLCBpbmNvbWluZ0NhbGw6IG51bGwgfSk7XG4gIH1cblxuICBzdGFydENhbGwoY2FsbElkOiBudW1iZXIsIHRva2VuUmVzcG9uc2U6IFZpZGVvQ2FsbFRva2VuUmVzcG9uc2UsIGlzSW5pdGlhdG9yOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZSQubmV4dCh7XG4gICAgICBpc0luQ2FsbDogdHJ1ZSxcbiAgICAgIGNhbGxJZCxcbiAgICAgIHRva2VuOiB0b2tlblJlc3BvbnNlLnRva2VuLFxuICAgICAgd3NVcmw6IHRva2VuUmVzcG9uc2Uud3NVcmwsXG4gICAgICByb29tTmFtZTogdG9rZW5SZXNwb25zZS5yb29tTmFtZSxcbiAgICAgIGlzSW5pdGlhdG9yLFxuICAgICAgaW5jb21pbmdDYWxsOiBudWxsLFxuICAgIH0pO1xuICB9XG5cbiAgZW5kQ2FsbCgpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlJC5uZXh0KElOSVRJQUxfU1RBVEUpO1xuICB9XG5cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZSQubmV4dChJTklUSUFMX1NUQVRFKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlkZW8tY2FsbC50eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy92aWRlby1jYWxsL3R5cGVzL3ZpZGVvLWNhbGwudHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRyYWNrIH0gZnJvbSAnbGl2ZWtpdC1jbGllbnQnO1xuXG5leHBvcnQgdHlwZSBWaWRlb0NhbGxUeXBlID0gJ0RJUkVDVCcgfCAnR1JPVVAnIHwgJ0NPTkZFUkVOQ0UnO1xuZXhwb3J0IHR5cGUgVmlkZW9DYWxsU3RhdHVzID0gJ0lOSVRJQVRFRCcgfCAnUklOR0lORycgfCAnQUNUSVZFJyB8ICdFTkRFRCcgfCAnTUlTU0VEJyB8ICdERUNMSU5FRCc7XG5leHBvcnQgdHlwZSBQYXJ0aWNpcGFudFJvbGUgPSAnSE9TVCcgfCAnUEFSVElDSVBBTlQnIHwgJ1ZJRVdFUic7XG5leHBvcnQgdHlwZSBQYXJ0aWNpcGFudFN0YXR1cyA9ICdJTlZJVEVEJyB8ICdSSU5HSU5HJyB8ICdDT05ORUNURUQnIHwgJ0RJU0NPTk5FQ1RFRCcgfCAnREVDTElORUQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRpY2lwYW50SW5mbyB7XG4gIGlkZW50aXR5OiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgYXVkaW9UcmFjaz86IFRyYWNrO1xuICB2aWRlb1RyYWNrPzogVHJhY2s7XG4gIHNjcmVlblNoYXJlVHJhY2s/OiBUcmFjaztcbiAgaXNTcGVha2luZzogYm9vbGVhbjtcbiAgYXVkaW9FbmFibGVkOiBib29sZWFuO1xuICB2aWRlb0VuYWJsZWQ6IGJvb2xlYW47XG4gIGlzTG9jYWw6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21pbmdDYWxsRXZlbnQge1xuICBjYWxsSWQ6IG51bWJlcjtcbiAgdHlwZTogVmlkZW9DYWxsVHlwZTtcbiAgaGFzVmlkZW86IGJvb2xlYW47XG4gIGluaXRpYXRvcklkOiBudW1iZXI7XG4gIGluaXRpYXRvck5hbWU6IHN0cmluZztcbiAgcm9vbU5hbWU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FsbEFuc3dlcmVkRXZlbnQge1xuICBjYWxsSWQ6IG51bWJlcjtcbiAgdXNlcklkOiBudW1iZXI7XG4gIGFjY2VwdGVkOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhbGxFbmRlZEV2ZW50IHtcbiAgY2FsbElkOiBudW1iZXI7XG4gIGVuZGVkQnk6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWaWRlb0NhbGxUb2tlblJlc3BvbnNlIHtcbiAgdG9rZW46IHN0cmluZztcbiAgd3NVcmw6IHN0cmluZztcbiAgcm9vbU5hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbml0aWF0ZUNhbGxSZXF1ZXN0IHtcbiAgdGFyZ2V0VXNlcklkczogbnVtYmVyW107XG4gIGNvbnZlcnNhdGlvbklkPzogbnVtYmVyO1xuICBoYXNWaWRlbz86IGJvb2xlYW47XG4gIHR5cGU/OiBzdHJpbmc7XG4gIGNvbXBhbnlJZD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBbnN3ZXJDYWxsUmVxdWVzdCB7XG4gIGNhbGxJZDogbnVtYmVyO1xuICBhY2NlcHRlZDogYm9vbGVhbjtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { NgModule } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { VideoRoomComponent } from './video-room/video-room.component';
|
|
4
|
+
import { VideoControlsComponent } from './video-controls/video-controls.component';
|
|
5
|
+
import { VideoParticipantComponent } from './video-participant/video-participant.component';
|
|
6
|
+
import { IncomingCallComponent } from './incoming-call/incoming-call.component';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
export class VideoCallModule {
|
|
9
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: VideoCallModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
10
|
+
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.14", ngImport: i0, type: VideoCallModule, imports: [CommonModule,
|
|
11
|
+
VideoRoomComponent,
|
|
12
|
+
VideoControlsComponent,
|
|
13
|
+
VideoParticipantComponent,
|
|
14
|
+
IncomingCallComponent], exports: [VideoRoomComponent,
|
|
15
|
+
VideoControlsComponent,
|
|
16
|
+
VideoParticipantComponent,
|
|
17
|
+
IncomingCallComponent] });
|
|
18
|
+
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: VideoCallModule, imports: [CommonModule,
|
|
19
|
+
VideoRoomComponent,
|
|
20
|
+
VideoControlsComponent,
|
|
21
|
+
VideoParticipantComponent,
|
|
22
|
+
IncomingCallComponent] });
|
|
23
|
+
}
|
|
24
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: VideoCallModule, decorators: [{
|
|
25
|
+
type: NgModule,
|
|
26
|
+
args: [{
|
|
27
|
+
imports: [
|
|
28
|
+
CommonModule,
|
|
29
|
+
VideoRoomComponent,
|
|
30
|
+
VideoControlsComponent,
|
|
31
|
+
VideoParticipantComponent,
|
|
32
|
+
IncomingCallComponent,
|
|
33
|
+
],
|
|
34
|
+
exports: [
|
|
35
|
+
VideoRoomComponent,
|
|
36
|
+
VideoControlsComponent,
|
|
37
|
+
VideoParticipantComponent,
|
|
38
|
+
IncomingCallComponent,
|
|
39
|
+
],
|
|
40
|
+
}]
|
|
41
|
+
}] });
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlkZW8tY2FsbC5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvdmlkZW8tY2FsbC92aWRlby1jYWxsLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNuRixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUM1RixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQzs7QUFpQmhGLE1BQU0sT0FBTyxlQUFlO3dHQUFmLGVBQWU7eUdBQWYsZUFBZSxZQWJ4QixZQUFZO1lBQ1osa0JBQWtCO1lBQ2xCLHNCQUFzQjtZQUN0Qix5QkFBeUI7WUFDekIscUJBQXFCLGFBR3JCLGtCQUFrQjtZQUNsQixzQkFBc0I7WUFDdEIseUJBQXlCO1lBQ3pCLHFCQUFxQjt5R0FHWixlQUFlLFlBYnhCLFlBQVk7WUFDWixrQkFBa0I7WUFDbEIsc0JBQXNCO1lBQ3RCLHlCQUF5QjtZQUN6QixxQkFBcUI7OzRGQVNaLGVBQWU7a0JBZjNCLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFO3dCQUNQLFlBQVk7d0JBQ1osa0JBQWtCO3dCQUNsQixzQkFBc0I7d0JBQ3RCLHlCQUF5Qjt3QkFDekIscUJBQXFCO3FCQUN0QjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1Asa0JBQWtCO3dCQUNsQixzQkFBc0I7d0JBQ3RCLHlCQUF5Qjt3QkFDekIscUJBQXFCO3FCQUN0QjtpQkFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgVmlkZW9Sb29tQ29tcG9uZW50IH0gZnJvbSAnLi92aWRlby1yb29tL3ZpZGVvLXJvb20uY29tcG9uZW50JztcbmltcG9ydCB7IFZpZGVvQ29udHJvbHNDb21wb25lbnQgfSBmcm9tICcuL3ZpZGVvLWNvbnRyb2xzL3ZpZGVvLWNvbnRyb2xzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBWaWRlb1BhcnRpY2lwYW50Q29tcG9uZW50IH0gZnJvbSAnLi92aWRlby1wYXJ0aWNpcGFudC92aWRlby1wYXJ0aWNpcGFudC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSW5jb21pbmdDYWxsQ29tcG9uZW50IH0gZnJvbSAnLi9pbmNvbWluZy1jYWxsL2luY29taW5nLWNhbGwuY29tcG9uZW50JztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBWaWRlb1Jvb21Db21wb25lbnQsXG4gICAgVmlkZW9Db250cm9sc0NvbXBvbmVudCxcbiAgICBWaWRlb1BhcnRpY2lwYW50Q29tcG9uZW50LFxuICAgIEluY29taW5nQ2FsbENvbXBvbmVudCxcbiAgXSxcbiAgZXhwb3J0czogW1xuICAgIFZpZGVvUm9vbUNvbXBvbmVudCxcbiAgICBWaWRlb0NvbnRyb2xzQ29tcG9uZW50LFxuICAgIFZpZGVvUGFydGljaXBhbnRDb21wb25lbnQsXG4gICAgSW5jb21pbmdDYWxsQ29tcG9uZW50LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBWaWRlb0NhbGxNb2R1bGUge31cbiJdfQ==
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export class VideoControlsComponent {
|
|
5
|
+
micEnabled = true;
|
|
6
|
+
cameraEnabled = true;
|
|
7
|
+
screenShareEnabled = false;
|
|
8
|
+
toggleMic = new EventEmitter();
|
|
9
|
+
toggleCamera = new EventEmitter();
|
|
10
|
+
toggleScreenShare = new EventEmitter();
|
|
11
|
+
hangUp = new EventEmitter();
|
|
12
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: VideoControlsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
13
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: VideoControlsComponent, isStandalone: true, selector: "tgm-video-controls", inputs: { micEnabled: "micEnabled", cameraEnabled: "cameraEnabled", screenShareEnabled: "screenShareEnabled" }, outputs: { toggleMic: "toggleMic", toggleCamera: "toggleCamera", toggleScreenShare: "toggleScreenShare", hangUp: "hangUp" }, ngImport: i0, template: "<div class=\"video-controls\">\n <button\n class=\"control-btn\"\n [class.active]=\"micEnabled\"\n [class.muted]=\"!micEnabled\"\n (click)=\"toggleMic.emit()\"\n [title]=\"micEnabled ? 'Mute microphone' : 'Unmute microphone'\"\n >\n <span class=\"icon\">{{ micEnabled ? '\uD83C\uDFA4' : '\uD83D\uDD07' }}</span>\n <span class=\"label\">{{ micEnabled ? 'Mute' : 'Unmute' }}</span>\n </button>\n\n <button\n class=\"control-btn\"\n [class.active]=\"cameraEnabled\"\n [class.muted]=\"!cameraEnabled\"\n (click)=\"toggleCamera.emit()\"\n [title]=\"cameraEnabled ? 'Turn off camera' : 'Turn on camera'\"\n >\n <span class=\"icon\">{{ cameraEnabled ? '\uD83D\uDCF9' : '\uD83D\uDCF7' }}</span>\n <span class=\"label\">{{ cameraEnabled ? 'Stop Video' : 'Start Video' }}</span>\n </button>\n\n <button\n class=\"control-btn\"\n [class.active]=\"screenShareEnabled\"\n (click)=\"toggleScreenShare.emit()\"\n [title]=\"screenShareEnabled ? 'Stop sharing' : 'Share screen'\"\n >\n <span class=\"icon\">\uD83D\uDDA5\uFE0F</span>\n <span class=\"label\">{{ screenShareEnabled ? 'Stop Share' : 'Share Screen' }}</span>\n </button>\n\n <button\n class=\"control-btn hang-up\"\n (click)=\"hangUp.emit()\"\n title=\"End call\"\n >\n <span class=\"icon\">\uD83D\uDCDE</span>\n <span class=\"label\">End Call</span>\n </button>\n</div>\n", styles: [".video-controls{display:flex;align-items:center;justify-content:center;gap:12px;padding:16px;background:#000000b3;border-radius:12px}.control-btn{display:flex;flex-direction:column;align-items:center;gap:4px;padding:12px 16px;border:none;border-radius:8px;background:#ffffff26;color:#fff;cursor:pointer;transition:background-color .2s;min-width:72px}.control-btn:hover{background:#ffffff40}.control-btn.muted{background:#ef44444d}.control-btn.muted:hover{background:#ef444480}.control-btn.hang-up{background:#ef4444}.control-btn.hang-up:hover{background:#dc2626}.control-btn .icon{font-size:24px}.control-btn .label{font-size:11px;opacity:.8}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }] });
|
|
14
|
+
}
|
|
15
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: VideoControlsComponent, decorators: [{
|
|
16
|
+
type: Component,
|
|
17
|
+
args: [{ selector: 'tgm-video-controls', standalone: true, imports: [CommonModule], template: "<div class=\"video-controls\">\n <button\n class=\"control-btn\"\n [class.active]=\"micEnabled\"\n [class.muted]=\"!micEnabled\"\n (click)=\"toggleMic.emit()\"\n [title]=\"micEnabled ? 'Mute microphone' : 'Unmute microphone'\"\n >\n <span class=\"icon\">{{ micEnabled ? '\uD83C\uDFA4' : '\uD83D\uDD07' }}</span>\n <span class=\"label\">{{ micEnabled ? 'Mute' : 'Unmute' }}</span>\n </button>\n\n <button\n class=\"control-btn\"\n [class.active]=\"cameraEnabled\"\n [class.muted]=\"!cameraEnabled\"\n (click)=\"toggleCamera.emit()\"\n [title]=\"cameraEnabled ? 'Turn off camera' : 'Turn on camera'\"\n >\n <span class=\"icon\">{{ cameraEnabled ? '\uD83D\uDCF9' : '\uD83D\uDCF7' }}</span>\n <span class=\"label\">{{ cameraEnabled ? 'Stop Video' : 'Start Video' }}</span>\n </button>\n\n <button\n class=\"control-btn\"\n [class.active]=\"screenShareEnabled\"\n (click)=\"toggleScreenShare.emit()\"\n [title]=\"screenShareEnabled ? 'Stop sharing' : 'Share screen'\"\n >\n <span class=\"icon\">\uD83D\uDDA5\uFE0F</span>\n <span class=\"label\">{{ screenShareEnabled ? 'Stop Share' : 'Share Screen' }}</span>\n </button>\n\n <button\n class=\"control-btn hang-up\"\n (click)=\"hangUp.emit()\"\n title=\"End call\"\n >\n <span class=\"icon\">\uD83D\uDCDE</span>\n <span class=\"label\">End Call</span>\n </button>\n</div>\n", styles: [".video-controls{display:flex;align-items:center;justify-content:center;gap:12px;padding:16px;background:#000000b3;border-radius:12px}.control-btn{display:flex;flex-direction:column;align-items:center;gap:4px;padding:12px 16px;border:none;border-radius:8px;background:#ffffff26;color:#fff;cursor:pointer;transition:background-color .2s;min-width:72px}.control-btn:hover{background:#ffffff40}.control-btn.muted{background:#ef44444d}.control-btn.muted:hover{background:#ef444480}.control-btn.hang-up{background:#ef4444}.control-btn.hang-up:hover{background:#dc2626}.control-btn .icon{font-size:24px}.control-btn .label{font-size:11px;opacity:.8}\n"] }]
|
|
18
|
+
}], propDecorators: { micEnabled: [{
|
|
19
|
+
type: Input
|
|
20
|
+
}], cameraEnabled: [{
|
|
21
|
+
type: Input
|
|
22
|
+
}], screenShareEnabled: [{
|
|
23
|
+
type: Input
|
|
24
|
+
}], toggleMic: [{
|
|
25
|
+
type: Output
|
|
26
|
+
}], toggleCamera: [{
|
|
27
|
+
type: Output
|
|
28
|
+
}], toggleScreenShare: [{
|
|
29
|
+
type: Output
|
|
30
|
+
}], hangUp: [{
|
|
31
|
+
type: Output
|
|
32
|
+
}] } });
|
|
33
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlkZW8tY29udHJvbHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL3ZpZGVvLWNhbGwvdmlkZW8tY29udHJvbHMvdmlkZW8tY29udHJvbHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL3ZpZGVvLWNhbGwvdmlkZW8tY29udHJvbHMvdmlkZW8tY29udHJvbHMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7O0FBUy9DLE1BQU0sT0FBTyxzQkFBc0I7SUFDeEIsVUFBVSxHQUFHLElBQUksQ0FBQztJQUNsQixhQUFhLEdBQUcsSUFBSSxDQUFDO0lBQ3JCLGtCQUFrQixHQUFHLEtBQUssQ0FBQztJQUUxQixTQUFTLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztJQUNyQyxZQUFZLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztJQUN4QyxpQkFBaUIsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO0lBQzdDLE1BQU0sR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO3dHQVJqQyxzQkFBc0I7NEZBQXRCLHNCQUFzQiwyVENWbkMsODNDQTBDQSw2ckJEcENZLFlBQVk7OzRGQUlYLHNCQUFzQjtrQkFQbEMsU0FBUzsrQkFDRSxvQkFBb0IsY0FDbEIsSUFBSSxXQUNQLENBQUMsWUFBWSxDQUFDOzhCQUtkLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBRUksU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLGlCQUFpQjtzQkFBMUIsTUFBTTtnQkFDRyxNQUFNO3NCQUFmLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndGdtLXZpZGVvLWNvbnRyb2xzJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi92aWRlby1jb250cm9scy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3ZpZGVvLWNvbnRyb2xzLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFZpZGVvQ29udHJvbHNDb21wb25lbnQge1xuICBASW5wdXQoKSBtaWNFbmFibGVkID0gdHJ1ZTtcbiAgQElucHV0KCkgY2FtZXJhRW5hYmxlZCA9IHRydWU7XG4gIEBJbnB1dCgpIHNjcmVlblNoYXJlRW5hYmxlZCA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKSB0b2dnbGVNaWMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSB0b2dnbGVDYW1lcmEgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSB0b2dnbGVTY3JlZW5TaGFyZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGhhbmdVcCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbn1cbiIsIjxkaXYgY2xhc3M9XCJ2aWRlby1jb250cm9sc1wiPlxuICA8YnV0dG9uXG4gICAgY2xhc3M9XCJjb250cm9sLWJ0blwiXG4gICAgW2NsYXNzLmFjdGl2ZV09XCJtaWNFbmFibGVkXCJcbiAgICBbY2xhc3MubXV0ZWRdPVwiIW1pY0VuYWJsZWRcIlxuICAgIChjbGljayk9XCJ0b2dnbGVNaWMuZW1pdCgpXCJcbiAgICBbdGl0bGVdPVwibWljRW5hYmxlZCA/ICdNdXRlIG1pY3JvcGhvbmUnIDogJ1VubXV0ZSBtaWNyb3Bob25lJ1wiXG4gID5cbiAgICA8c3BhbiBjbGFzcz1cImljb25cIj57eyBtaWNFbmFibGVkID8gJ/CfjqQnIDogJ/CflIcnIH19PC9zcGFuPlxuICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj57eyBtaWNFbmFibGVkID8gJ011dGUnIDogJ1VubXV0ZScgfX08L3NwYW4+XG4gIDwvYnV0dG9uPlxuXG4gIDxidXR0b25cbiAgICBjbGFzcz1cImNvbnRyb2wtYnRuXCJcbiAgICBbY2xhc3MuYWN0aXZlXT1cImNhbWVyYUVuYWJsZWRcIlxuICAgIFtjbGFzcy5tdXRlZF09XCIhY2FtZXJhRW5hYmxlZFwiXG4gICAgKGNsaWNrKT1cInRvZ2dsZUNhbWVyYS5lbWl0KClcIlxuICAgIFt0aXRsZV09XCJjYW1lcmFFbmFibGVkID8gJ1R1cm4gb2ZmIGNhbWVyYScgOiAnVHVybiBvbiBjYW1lcmEnXCJcbiAgPlxuICAgIDxzcGFuIGNsYXNzPVwiaWNvblwiPnt7IGNhbWVyYUVuYWJsZWQgPyAn8J+TuScgOiAn8J+TtycgfX08L3NwYW4+XG4gICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPnt7IGNhbWVyYUVuYWJsZWQgPyAnU3RvcCBWaWRlbycgOiAnU3RhcnQgVmlkZW8nIH19PC9zcGFuPlxuICA8L2J1dHRvbj5cblxuICA8YnV0dG9uXG4gICAgY2xhc3M9XCJjb250cm9sLWJ0blwiXG4gICAgW2NsYXNzLmFjdGl2ZV09XCJzY3JlZW5TaGFyZUVuYWJsZWRcIlxuICAgIChjbGljayk9XCJ0b2dnbGVTY3JlZW5TaGFyZS5lbWl0KClcIlxuICAgIFt0aXRsZV09XCJzY3JlZW5TaGFyZUVuYWJsZWQgPyAnU3RvcCBzaGFyaW5nJyA6ICdTaGFyZSBzY3JlZW4nXCJcbiAgPlxuICAgIDxzcGFuIGNsYXNzPVwiaWNvblwiPvCflqXvuI88L3NwYW4+XG4gICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPnt7IHNjcmVlblNoYXJlRW5hYmxlZCA/ICdTdG9wIFNoYXJlJyA6ICdTaGFyZSBTY3JlZW4nIH19PC9zcGFuPlxuICA8L2J1dHRvbj5cblxuICA8YnV0dG9uXG4gICAgY2xhc3M9XCJjb250cm9sLWJ0biBoYW5nLXVwXCJcbiAgICAoY2xpY2spPVwiaGFuZ1VwLmVtaXQoKVwiXG4gICAgdGl0bGU9XCJFbmQgY2FsbFwiXG4gID5cbiAgICA8c3BhbiBjbGFzcz1cImljb25cIj7wn5OePC9zcGFuPlxuICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj5FbmQgQ2FsbDwvc3Bhbj5cbiAgPC9idXR0b24+XG48L2Rpdj5cbiJdfQ==
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { Component, Input, ViewChild, } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@angular/common";
|
|
5
|
+
export class VideoParticipantComponent {
|
|
6
|
+
participant;
|
|
7
|
+
compact = false;
|
|
8
|
+
videoElementRef;
|
|
9
|
+
audioElementRef;
|
|
10
|
+
ngAfterViewInit() {
|
|
11
|
+
this.attachTracks();
|
|
12
|
+
}
|
|
13
|
+
ngOnChanges(changes) {
|
|
14
|
+
if (changes['participant']) {
|
|
15
|
+
this.attachTracks();
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
ngOnDestroy() {
|
|
19
|
+
this.detachTracks();
|
|
20
|
+
}
|
|
21
|
+
get initials() {
|
|
22
|
+
if (!this.participant?.name)
|
|
23
|
+
return '?';
|
|
24
|
+
return this.participant.name
|
|
25
|
+
.split(' ')
|
|
26
|
+
.map((n) => n[0])
|
|
27
|
+
.join('')
|
|
28
|
+
.toUpperCase()
|
|
29
|
+
.substring(0, 2);
|
|
30
|
+
}
|
|
31
|
+
attachTracks() {
|
|
32
|
+
if (!this.participant)
|
|
33
|
+
return;
|
|
34
|
+
// Attach video
|
|
35
|
+
if (this.participant.videoTrack && this.videoElementRef?.nativeElement) {
|
|
36
|
+
this.participant.videoTrack.attach(this.videoElementRef.nativeElement);
|
|
37
|
+
}
|
|
38
|
+
// Attach audio (only for remote participants)
|
|
39
|
+
if (!this.participant.isLocal && this.participant.audioTrack && this.audioElementRef?.nativeElement) {
|
|
40
|
+
this.participant.audioTrack.attach(this.audioElementRef.nativeElement);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
detachTracks() {
|
|
44
|
+
if (this.participant?.videoTrack && this.videoElementRef?.nativeElement) {
|
|
45
|
+
this.participant.videoTrack.detach(this.videoElementRef.nativeElement);
|
|
46
|
+
}
|
|
47
|
+
if (this.participant?.audioTrack && this.audioElementRef?.nativeElement) {
|
|
48
|
+
this.participant.audioTrack.detach(this.audioElementRef.nativeElement);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: VideoParticipantComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
52
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: VideoParticipantComponent, isStandalone: true, selector: "tgm-video-participant", inputs: { participant: "participant", compact: "compact" }, viewQueries: [{ propertyName: "videoElementRef", first: true, predicate: ["videoElement"], descendants: true }, { propertyName: "audioElementRef", first: true, predicate: ["audioElement"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"participant-tile\"\n [class.compact]=\"compact\"\n [class.speaking]=\"participant.isSpeaking\"\n [class.local]=\"participant.isLocal\"\n>\n <!-- Video -->\n <video\n #videoElement\n *ngIf=\"participant.videoEnabled && participant.videoTrack\"\n autoplay\n playsinline\n [muted]=\"participant.isLocal\"\n class=\"video-stream\"\n ></video>\n\n <!-- Audio (remote only) -->\n <audio\n #audioElement\n *ngIf=\"!participant.isLocal && participant.audioTrack\"\n autoplay\n ></audio>\n\n <!-- Avatar fallback -->\n <div *ngIf=\"!participant.videoEnabled || !participant.videoTrack\" class=\"avatar-fallback\">\n <span class=\"initials\">{{ initials }}</span>\n </div>\n\n <!-- Info overlay -->\n <div class=\"participant-info\">\n <span class=\"name\">{{ participant.name }}{{ participant.isLocal ? ' (You)' : '' }}</span>\n <div class=\"status-icons\">\n <span *ngIf=\"!participant.audioEnabled\" class=\"status-icon muted-icon\" title=\"Muted\">\uD83D\uDD07</span>\n <span *ngIf=\"!participant.videoEnabled\" class=\"status-icon camera-off-icon\" title=\"Camera off\">\uD83D\uDCF7</span>\n <span *ngIf=\"participant.screenShareTrack\" class=\"status-icon screen-share-icon\" title=\"Sharing screen\">\uD83D\uDDA5\uFE0F</span>\n </div>\n </div>\n</div>\n", styles: [".participant-tile{position:relative;border-radius:12px;overflow:hidden;background:#1a1a2e;aspect-ratio:16/9;min-height:180px}.participant-tile.speaking{box-shadow:0 0 0 3px #22c55e}.participant-tile.compact{min-height:120px}.video-stream{width:100%;height:100%;object-fit:cover}.avatar-fallback{display:flex;align-items:center;justify-content:center;width:100%;height:100%;background:linear-gradient(135deg,#667eea,#764ba2)}.avatar-fallback .initials{font-size:48px;font-weight:600;color:#fff;text-transform:uppercase}.participant-info{position:absolute;bottom:0;left:0;right:0;display:flex;align-items:center;justify-content:space-between;padding:8px 12px;background:linear-gradient(transparent,#000000b3)}.participant-info .name{color:#fff;font-size:13px;font-weight:500;text-shadow:0 1px 2px rgba(0,0,0,.5)}.participant-info .status-icons{display:flex;gap:4px}.participant-info .status-icons .status-icon{font-size:14px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
|
|
53
|
+
}
|
|
54
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: VideoParticipantComponent, decorators: [{
|
|
55
|
+
type: Component,
|
|
56
|
+
args: [{ selector: 'tgm-video-participant', standalone: true, imports: [CommonModule], template: "<div\n class=\"participant-tile\"\n [class.compact]=\"compact\"\n [class.speaking]=\"participant.isSpeaking\"\n [class.local]=\"participant.isLocal\"\n>\n <!-- Video -->\n <video\n #videoElement\n *ngIf=\"participant.videoEnabled && participant.videoTrack\"\n autoplay\n playsinline\n [muted]=\"participant.isLocal\"\n class=\"video-stream\"\n ></video>\n\n <!-- Audio (remote only) -->\n <audio\n #audioElement\n *ngIf=\"!participant.isLocal && participant.audioTrack\"\n autoplay\n ></audio>\n\n <!-- Avatar fallback -->\n <div *ngIf=\"!participant.videoEnabled || !participant.videoTrack\" class=\"avatar-fallback\">\n <span class=\"initials\">{{ initials }}</span>\n </div>\n\n <!-- Info overlay -->\n <div class=\"participant-info\">\n <span class=\"name\">{{ participant.name }}{{ participant.isLocal ? ' (You)' : '' }}</span>\n <div class=\"status-icons\">\n <span *ngIf=\"!participant.audioEnabled\" class=\"status-icon muted-icon\" title=\"Muted\">\uD83D\uDD07</span>\n <span *ngIf=\"!participant.videoEnabled\" class=\"status-icon camera-off-icon\" title=\"Camera off\">\uD83D\uDCF7</span>\n <span *ngIf=\"participant.screenShareTrack\" class=\"status-icon screen-share-icon\" title=\"Sharing screen\">\uD83D\uDDA5\uFE0F</span>\n </div>\n </div>\n</div>\n", styles: [".participant-tile{position:relative;border-radius:12px;overflow:hidden;background:#1a1a2e;aspect-ratio:16/9;min-height:180px}.participant-tile.speaking{box-shadow:0 0 0 3px #22c55e}.participant-tile.compact{min-height:120px}.video-stream{width:100%;height:100%;object-fit:cover}.avatar-fallback{display:flex;align-items:center;justify-content:center;width:100%;height:100%;background:linear-gradient(135deg,#667eea,#764ba2)}.avatar-fallback .initials{font-size:48px;font-weight:600;color:#fff;text-transform:uppercase}.participant-info{position:absolute;bottom:0;left:0;right:0;display:flex;align-items:center;justify-content:space-between;padding:8px 12px;background:linear-gradient(transparent,#000000b3)}.participant-info .name{color:#fff;font-size:13px;font-weight:500;text-shadow:0 1px 2px rgba(0,0,0,.5)}.participant-info .status-icons{display:flex;gap:4px}.participant-info .status-icons .status-icon{font-size:14px}\n"] }]
|
|
57
|
+
}], propDecorators: { participant: [{
|
|
58
|
+
type: Input
|
|
59
|
+
}], compact: [{
|
|
60
|
+
type: Input
|
|
61
|
+
}], videoElementRef: [{
|
|
62
|
+
type: ViewChild,
|
|
63
|
+
args: ['videoElement']
|
|
64
|
+
}], audioElementRef: [{
|
|
65
|
+
type: ViewChild,
|
|
66
|
+
args: ['audioElement']
|
|
67
|
+
}] } });
|
|
68
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlkZW8tcGFydGljaXBhbnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL3ZpZGVvLWNhbGwvdmlkZW8tcGFydGljaXBhbnQvdmlkZW8tcGFydGljaXBhbnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL3ZpZGVvLWNhbGwvdmlkZW8tcGFydGljaXBhbnQvdmlkZW8tcGFydGljaXBhbnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsU0FBUyxHQU1WLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7O0FBVS9DLE1BQU0sT0FBTyx5QkFBeUI7SUFDM0IsV0FBVyxDQUFtQjtJQUM5QixPQUFPLEdBQUcsS0FBSyxDQUFDO0lBRUUsZUFBZSxDQUFnQztJQUMvQyxlQUFlLENBQWdDO0lBRTFFLGVBQWU7UUFDYixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN0QixDQUFDO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELElBQUksUUFBUTtRQUNWLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUk7WUFBRSxPQUFPLEdBQUcsQ0FBQztRQUN4QyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSTthQUN6QixLQUFLLENBQUMsR0FBRyxDQUFDO2FBQ1YsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDaEIsSUFBSSxDQUFDLEVBQUUsQ0FBQzthQUNSLFdBQVcsRUFBRTthQUNiLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUVPLFlBQVk7UUFDbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXO1lBQUUsT0FBTztRQUU5QixlQUFlO1FBQ2YsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLGFBQWEsRUFBRSxDQUFDO1lBQ3ZFLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3pFLENBQUM7UUFFRCw4Q0FBOEM7UUFDOUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsYUFBYSxFQUFFLENBQUM7WUFDcEcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDekUsQ0FBQztJQUNILENBQUM7SUFFTyxZQUFZO1FBQ2xCLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxhQUFhLEVBQUUsQ0FBQztZQUN4RSxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN6RSxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLGFBQWEsRUFBRSxDQUFDO1lBQ3hFLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3pFLENBQUM7SUFDSCxDQUFDO3dHQXBEVSx5QkFBeUI7NEZBQXpCLHlCQUF5QixxWENwQnRDLHl6Q0FzQ0EsczlCRHRCWSxZQUFZOzs0RkFJWCx5QkFBeUI7a0JBUHJDLFNBQVM7K0JBQ0UsdUJBQXVCLGNBQ3JCLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQzs4QkFLZCxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFFcUIsZUFBZTtzQkFBekMsU0FBUzt1QkFBQyxjQUFjO2dCQUNFLGVBQWU7c0JBQXpDLFNBQVM7dUJBQUMsY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIFZpZXdDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFBhcnRpY2lwYW50SW5mbyB9IGZyb20gJy4uL3R5cGVzL3ZpZGVvLWNhbGwudHlwZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0Z20tdmlkZW8tcGFydGljaXBhbnQnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL3ZpZGVvLXBhcnRpY2lwYW50LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdmlkZW8tcGFydGljaXBhbnQuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgVmlkZW9QYXJ0aWNpcGFudENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgQElucHV0KCkgcGFydGljaXBhbnQhOiBQYXJ0aWNpcGFudEluZm87XG4gIEBJbnB1dCgpIGNvbXBhY3QgPSBmYWxzZTtcblxuICBAVmlld0NoaWxkKCd2aWRlb0VsZW1lbnQnKSB2aWRlb0VsZW1lbnRSZWYhOiBFbGVtZW50UmVmPEhUTUxWaWRlb0VsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCdhdWRpb0VsZW1lbnQnKSBhdWRpb0VsZW1lbnRSZWYhOiBFbGVtZW50UmVmPEhUTUxBdWRpb0VsZW1lbnQ+O1xuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmF0dGFjaFRyYWNrcygpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydwYXJ0aWNpcGFudCddKSB7XG4gICAgICB0aGlzLmF0dGFjaFRyYWNrcygpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGV0YWNoVHJhY2tzKCk7XG4gIH1cblxuICBnZXQgaW5pdGlhbHMoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMucGFydGljaXBhbnQ/Lm5hbWUpIHJldHVybiAnPyc7XG4gICAgcmV0dXJuIHRoaXMucGFydGljaXBhbnQubmFtZVxuICAgICAgLnNwbGl0KCcgJylcbiAgICAgIC5tYXAoKG4pID0+IG5bMF0pXG4gICAgICAuam9pbignJylcbiAgICAgIC50b1VwcGVyQ2FzZSgpXG4gICAgICAuc3Vic3RyaW5nKDAsIDIpO1xuICB9XG5cbiAgcHJpdmF0ZSBhdHRhY2hUcmFja3MoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBhcnRpY2lwYW50KSByZXR1cm47XG5cbiAgICAvLyBBdHRhY2ggdmlkZW9cbiAgICBpZiAodGhpcy5wYXJ0aWNpcGFudC52aWRlb1RyYWNrICYmIHRoaXMudmlkZW9FbGVtZW50UmVmPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICB0aGlzLnBhcnRpY2lwYW50LnZpZGVvVHJhY2suYXR0YWNoKHRoaXMudmlkZW9FbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xuICAgIH1cblxuICAgIC8vIEF0dGFjaCBhdWRpbyAob25seSBmb3IgcmVtb3RlIHBhcnRpY2lwYW50cylcbiAgICBpZiAoIXRoaXMucGFydGljaXBhbnQuaXNMb2NhbCAmJiB0aGlzLnBhcnRpY2lwYW50LmF1ZGlvVHJhY2sgJiYgdGhpcy5hdWRpb0VsZW1lbnRSZWY/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIHRoaXMucGFydGljaXBhbnQuYXVkaW9UcmFjay5hdHRhY2godGhpcy5hdWRpb0VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBkZXRhY2hUcmFja3MoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGFydGljaXBhbnQ/LnZpZGVvVHJhY2sgJiYgdGhpcy52aWRlb0VsZW1lbnRSZWY/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIHRoaXMucGFydGljaXBhbnQudmlkZW9UcmFjay5kZXRhY2godGhpcy52aWRlb0VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnBhcnRpY2lwYW50Py5hdWRpb1RyYWNrICYmIHRoaXMuYXVkaW9FbGVtZW50UmVmPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICB0aGlzLnBhcnRpY2lwYW50LmF1ZGlvVHJhY2suZGV0YWNoKHRoaXMuYXVkaW9FbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdlxuICBjbGFzcz1cInBhcnRpY2lwYW50LXRpbGVcIlxuICBbY2xhc3MuY29tcGFjdF09XCJjb21wYWN0XCJcbiAgW2NsYXNzLnNwZWFraW5nXT1cInBhcnRpY2lwYW50LmlzU3BlYWtpbmdcIlxuICBbY2xhc3MubG9jYWxdPVwicGFydGljaXBhbnQuaXNMb2NhbFwiXG4+XG4gIDwhLS0gVmlkZW8gLS0+XG4gIDx2aWRlb1xuICAgICN2aWRlb0VsZW1lbnRcbiAgICAqbmdJZj1cInBhcnRpY2lwYW50LnZpZGVvRW5hYmxlZCAmJiBwYXJ0aWNpcGFudC52aWRlb1RyYWNrXCJcbiAgICBhdXRvcGxheVxuICAgIHBsYXlzaW5saW5lXG4gICAgW211dGVkXT1cInBhcnRpY2lwYW50LmlzTG9jYWxcIlxuICAgIGNsYXNzPVwidmlkZW8tc3RyZWFtXCJcbiAgPjwvdmlkZW8+XG5cbiAgPCEtLSBBdWRpbyAocmVtb3RlIG9ubHkpIC0tPlxuICA8YXVkaW9cbiAgICAjYXVkaW9FbGVtZW50XG4gICAgKm5nSWY9XCIhcGFydGljaXBhbnQuaXNMb2NhbCAmJiBwYXJ0aWNpcGFudC5hdWRpb1RyYWNrXCJcbiAgICBhdXRvcGxheVxuICA+PC9hdWRpbz5cblxuICA8IS0tIEF2YXRhciBmYWxsYmFjayAtLT5cbiAgPGRpdiAqbmdJZj1cIiFwYXJ0aWNpcGFudC52aWRlb0VuYWJsZWQgfHwgIXBhcnRpY2lwYW50LnZpZGVvVHJhY2tcIiBjbGFzcz1cImF2YXRhci1mYWxsYmFja1wiPlxuICAgIDxzcGFuIGNsYXNzPVwiaW5pdGlhbHNcIj57eyBpbml0aWFscyB9fTwvc3Bhbj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBJbmZvIG92ZXJsYXkgLS0+XG4gIDxkaXYgY2xhc3M9XCJwYXJ0aWNpcGFudC1pbmZvXCI+XG4gICAgPHNwYW4gY2xhc3M9XCJuYW1lXCI+e3sgcGFydGljaXBhbnQubmFtZSB9fXt7IHBhcnRpY2lwYW50LmlzTG9jYWwgPyAnIChZb3UpJyA6ICcnIH19PC9zcGFuPlxuICAgIDxkaXYgY2xhc3M9XCJzdGF0dXMtaWNvbnNcIj5cbiAgICAgIDxzcGFuICpuZ0lmPVwiIXBhcnRpY2lwYW50LmF1ZGlvRW5hYmxlZFwiIGNsYXNzPVwic3RhdHVzLWljb24gbXV0ZWQtaWNvblwiIHRpdGxlPVwiTXV0ZWRcIj7wn5SHPC9zcGFuPlxuICAgICAgPHNwYW4gKm5nSWY9XCIhcGFydGljaXBhbnQudmlkZW9FbmFibGVkXCIgY2xhc3M9XCJzdGF0dXMtaWNvbiBjYW1lcmEtb2ZmLWljb25cIiB0aXRsZT1cIkNhbWVyYSBvZmZcIj7wn5O3PC9zcGFuPlxuICAgICAgPHNwYW4gKm5nSWY9XCJwYXJ0aWNpcGFudC5zY3JlZW5TaGFyZVRyYWNrXCIgY2xhc3M9XCJzdGF0dXMtaWNvbiBzY3JlZW4tc2hhcmUtaWNvblwiIHRpdGxlPVwiU2hhcmluZyBzY3JlZW5cIj7wn5al77iPPC9zcGFuPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { ConnectionState } from 'livekit-client';
|
|
4
|
+
import { VideoParticipantComponent } from '../video-participant/video-participant.component';
|
|
5
|
+
import { VideoControlsComponent } from '../video-controls/video-controls.component';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "../services/livekit-room.service";
|
|
8
|
+
import * as i2 from "@angular/common";
|
|
9
|
+
export class VideoRoomComponent {
|
|
10
|
+
livekitRoom;
|
|
11
|
+
callId;
|
|
12
|
+
token;
|
|
13
|
+
wsUrl;
|
|
14
|
+
callEnded = new EventEmitter();
|
|
15
|
+
error = new EventEmitter();
|
|
16
|
+
participants = [];
|
|
17
|
+
connectionState = ConnectionState.Disconnected;
|
|
18
|
+
subscriptions = [];
|
|
19
|
+
constructor(livekitRoom) {
|
|
20
|
+
this.livekitRoom = livekitRoom;
|
|
21
|
+
}
|
|
22
|
+
ngOnInit() {
|
|
23
|
+
this.subscriptions.push(this.livekitRoom.participants$.subscribe((p) => (this.participants = p)), this.livekitRoom.connectionState$.subscribe((s) => (this.connectionState = s)), this.livekitRoom.error$.subscribe((e) => this.error.emit(e)));
|
|
24
|
+
this.connect();
|
|
25
|
+
}
|
|
26
|
+
ngOnDestroy() {
|
|
27
|
+
this.subscriptions.forEach((s) => s.unsubscribe());
|
|
28
|
+
this.livekitRoom.disconnect();
|
|
29
|
+
}
|
|
30
|
+
async connect() {
|
|
31
|
+
try {
|
|
32
|
+
await this.livekitRoom.connect(this.token, this.wsUrl);
|
|
33
|
+
}
|
|
34
|
+
catch (e) {
|
|
35
|
+
this.error.emit(e.message || 'Failed to connect');
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
onHangUp() {
|
|
39
|
+
this.livekitRoom.disconnect();
|
|
40
|
+
this.callEnded.emit();
|
|
41
|
+
}
|
|
42
|
+
async onToggleMic() {
|
|
43
|
+
await this.livekitRoom.toggleMicrophone();
|
|
44
|
+
}
|
|
45
|
+
async onToggleCamera() {
|
|
46
|
+
await this.livekitRoom.toggleCamera();
|
|
47
|
+
}
|
|
48
|
+
async onToggleScreenShare() {
|
|
49
|
+
await this.livekitRoom.toggleScreenShare();
|
|
50
|
+
}
|
|
51
|
+
get localParticipant() {
|
|
52
|
+
return this.participants.find((p) => p.isLocal);
|
|
53
|
+
}
|
|
54
|
+
get remoteParticipants() {
|
|
55
|
+
return this.participants.filter((p) => !p.isLocal);
|
|
56
|
+
}
|
|
57
|
+
get gridClass() {
|
|
58
|
+
const count = this.participants.length;
|
|
59
|
+
if (count <= 1)
|
|
60
|
+
return 'grid-1';
|
|
61
|
+
if (count <= 2)
|
|
62
|
+
return 'grid-2';
|
|
63
|
+
if (count <= 4)
|
|
64
|
+
return 'grid-4';
|
|
65
|
+
if (count <= 6)
|
|
66
|
+
return 'grid-6';
|
|
67
|
+
return 'grid-many';
|
|
68
|
+
}
|
|
69
|
+
get isConnected() {
|
|
70
|
+
return this.connectionState === ConnectionState.Connected;
|
|
71
|
+
}
|
|
72
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: VideoRoomComponent, deps: [{ token: i1.LivekitRoomService }], target: i0.ɵɵFactoryTarget.Component });
|
|
73
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: VideoRoomComponent, isStandalone: true, selector: "tgm-video-room", inputs: { callId: "callId", token: "token", wsUrl: "wsUrl" }, outputs: { callEnded: "callEnded", error: "error" }, ngImport: i0, template: "<div class=\"video-room\" *ngIf=\"isConnected; else connecting\">\n <!-- Participants Grid -->\n <div class=\"participants-grid\" [ngClass]=\"gridClass\">\n <tgm-video-participant\n *ngFor=\"let participant of participants\"\n [participant]=\"participant\"\n [compact]=\"participants.length > 4\"\n ></tgm-video-participant>\n </div>\n\n <!-- Controls -->\n <div class=\"controls-bar\">\n <tgm-video-controls\n [micEnabled]=\"localParticipant?.audioEnabled ?? true\"\n [cameraEnabled]=\"localParticipant?.videoEnabled ?? true\"\n [screenShareEnabled]=\"!!localParticipant?.screenShareTrack\"\n (toggleMic)=\"onToggleMic()\"\n (toggleCamera)=\"onToggleCamera()\"\n (toggleScreenShare)=\"onToggleScreenShare()\"\n (hangUp)=\"onHangUp()\"\n ></tgm-video-controls>\n </div>\n</div>\n\n<ng-template #connecting>\n <div class=\"connecting-state\">\n <div class=\"spinner\"></div>\n <p>Connecting to call...</p>\n </div>\n</ng-template>\n", styles: [".video-room{display:flex;flex-direction:column;height:100%;background:#0f0f23;border-radius:12px;overflow:hidden}.participants-grid{flex:1;display:grid;gap:8px;padding:8px;min-height:0}.participants-grid.grid-1{grid-template-columns:1fr}.participants-grid.grid-2{grid-template-columns:1fr 1fr}.participants-grid.grid-4{grid-template-columns:1fr 1fr;grid-template-rows:1fr 1fr}.participants-grid.grid-6{grid-template-columns:1fr 1fr 1fr;grid-template-rows:1fr 1fr}.participants-grid.grid-many{grid-template-columns:repeat(auto-fill,minmax(280px,1fr));grid-auto-rows:minmax(180px,1fr)}.controls-bar{display:flex;justify-content:center;padding:12px}.connecting-state{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;color:#fff;background:#0f0f23}.connecting-state .spinner{width:48px;height:48px;border:4px solid rgba(255,255,255,.2);border-top-color:#667eea;border-radius:50%;animation:spin .8s linear infinite;margin-bottom:16px}.connecting-state p{font-size:16px;opacity:.7}@keyframes spin{to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: VideoParticipantComponent, selector: "tgm-video-participant", inputs: ["participant", "compact"] }, { kind: "component", type: VideoControlsComponent, selector: "tgm-video-controls", inputs: ["micEnabled", "cameraEnabled", "screenShareEnabled"], outputs: ["toggleMic", "toggleCamera", "toggleScreenShare", "hangUp"] }] });
|
|
74
|
+
}
|
|
75
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: VideoRoomComponent, decorators: [{
|
|
76
|
+
type: Component,
|
|
77
|
+
args: [{ selector: 'tgm-video-room', standalone: true, imports: [CommonModule, VideoParticipantComponent, VideoControlsComponent], template: "<div class=\"video-room\" *ngIf=\"isConnected; else connecting\">\n <!-- Participants Grid -->\n <div class=\"participants-grid\" [ngClass]=\"gridClass\">\n <tgm-video-participant\n *ngFor=\"let participant of participants\"\n [participant]=\"participant\"\n [compact]=\"participants.length > 4\"\n ></tgm-video-participant>\n </div>\n\n <!-- Controls -->\n <div class=\"controls-bar\">\n <tgm-video-controls\n [micEnabled]=\"localParticipant?.audioEnabled ?? true\"\n [cameraEnabled]=\"localParticipant?.videoEnabled ?? true\"\n [screenShareEnabled]=\"!!localParticipant?.screenShareTrack\"\n (toggleMic)=\"onToggleMic()\"\n (toggleCamera)=\"onToggleCamera()\"\n (toggleScreenShare)=\"onToggleScreenShare()\"\n (hangUp)=\"onHangUp()\"\n ></tgm-video-controls>\n </div>\n</div>\n\n<ng-template #connecting>\n <div class=\"connecting-state\">\n <div class=\"spinner\"></div>\n <p>Connecting to call...</p>\n </div>\n</ng-template>\n", styles: [".video-room{display:flex;flex-direction:column;height:100%;background:#0f0f23;border-radius:12px;overflow:hidden}.participants-grid{flex:1;display:grid;gap:8px;padding:8px;min-height:0}.participants-grid.grid-1{grid-template-columns:1fr}.participants-grid.grid-2{grid-template-columns:1fr 1fr}.participants-grid.grid-4{grid-template-columns:1fr 1fr;grid-template-rows:1fr 1fr}.participants-grid.grid-6{grid-template-columns:1fr 1fr 1fr;grid-template-rows:1fr 1fr}.participants-grid.grid-many{grid-template-columns:repeat(auto-fill,minmax(280px,1fr));grid-auto-rows:minmax(180px,1fr)}.controls-bar{display:flex;justify-content:center;padding:12px}.connecting-state{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;color:#fff;background:#0f0f23}.connecting-state .spinner{width:48px;height:48px;border:4px solid rgba(255,255,255,.2);border-top-color:#667eea;border-radius:50%;animation:spin .8s linear infinite;margin-bottom:16px}.connecting-state p{font-size:16px;opacity:.7}@keyframes spin{to{transform:rotate(360deg)}}\n"] }]
|
|
78
|
+
}], ctorParameters: () => [{ type: i1.LivekitRoomService }], propDecorators: { callId: [{
|
|
79
|
+
type: Input
|
|
80
|
+
}], token: [{
|
|
81
|
+
type: Input
|
|
82
|
+
}], wsUrl: [{
|
|
83
|
+
type: Input
|
|
84
|
+
}], callEnded: [{
|
|
85
|
+
type: Output
|
|
86
|
+
}], error: [{
|
|
87
|
+
type: Output
|
|
88
|
+
}] } });
|
|
89
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlkZW8tcm9vbS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvdmlkZW8tY2FsbC92aWRlby1yb29tL3ZpZGVvLXJvb20uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL3ZpZGVvLWNhbGwvdmlkZW8tcm9vbS92aWRlby1yb29tLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHakQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFDN0YsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNENBQTRDLENBQUM7Ozs7QUFVcEYsTUFBTSxPQUFPLGtCQUFrQjtJQVlUO0lBWFgsTUFBTSxDQUFVO0lBQ2hCLEtBQUssQ0FBVTtJQUNmLEtBQUssQ0FBVTtJQUNkLFNBQVMsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO0lBQ3JDLEtBQUssR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO0lBRTdDLFlBQVksR0FBc0IsRUFBRSxDQUFDO0lBQ3JDLGVBQWUsR0FBb0IsZUFBZSxDQUFDLFlBQVksQ0FBQztJQUV4RCxhQUFhLEdBQW1CLEVBQUUsQ0FBQztJQUUzQyxZQUFvQixXQUErQjtRQUEvQixnQkFBVyxHQUFYLFdBQVcsQ0FBb0I7SUFBRyxDQUFDO0lBRXZELFFBQVE7UUFDTixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDckIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENB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LGdCQUFnQixjQUNkLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSx5QkFBeUIsRUFBRSxzQkFBc0IsQ0FBQzt1RkFLakUsTUFBTTtzQkFBZCxLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0ksU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxLQUFLO3NCQUFkLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb25uZWN0aW9uU3RhdGUgfSBmcm9tICdsaXZla2l0LWNsaWVudCc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IExpdmVraXRSb29tU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2xpdmVraXQtcm9vbS5zZXJ2aWNlJztcbmltcG9ydCB7IFZpZGVvUGFydGljaXBhbnRDb21wb25lbnQgfSBmcm9tICcuLi92aWRlby1wYXJ0aWNpcGFudC92aWRlby1wYXJ0aWNpcGFudC5jb21wb25lbnQnO1xuaW1wb3J0IHsgVmlkZW9Db250cm9sc0NvbXBvbmVudCB9IGZyb20gJy4uL3ZpZGVvLWNvbnRyb2xzL3ZpZGVvLWNvbnRyb2xzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQYXJ0aWNpcGFudEluZm8gfSBmcm9tICcuLi90eXBlcy92aWRlby1jYWxsLnR5cGVzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndGdtLXZpZGVvLXJvb20nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBWaWRlb1BhcnRpY2lwYW50Q29tcG9uZW50LCBWaWRlb0NvbnRyb2xzQ29tcG9uZW50XSxcbiAgdGVtcGxhdGVVcmw6ICcuL3ZpZGVvLXJvb20uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi92aWRlby1yb29tLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFZpZGVvUm9vbUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQElucHV0KCkgY2FsbElkITogbnVtYmVyO1xuICBASW5wdXQoKSB0b2tlbiE6IHN0cmluZztcbiAgQElucHV0KCkgd3NVcmwhOiBzdHJpbmc7XG4gIEBPdXRwdXQoKSBjYWxsRW5kZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBlcnJvciA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIHBhcnRpY2lwYW50czogUGFydGljaXBhbnRJbmZvW10gPSBbXTtcbiAgY29ubmVjdGlvblN0YXRlOiBDb25uZWN0aW9uU3RhdGUgPSBDb25uZWN0aW9uU3RhdGUuRGlzY29ubmVjdGVkO1xuXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGxpdmVraXRSb29tOiBMaXZla2l0Um9vbVNlcnZpY2UpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmxpdmVraXRSb29tLnBhcnRpY2lwYW50cyQuc3Vic2NyaWJlKChwKSA9PiAodGhpcy5wYXJ0aWNpcGFudHMgPSBwKSksXG4gICAgICB0aGlzLmxpdmVraXRSb29tLmNvbm5lY3Rpb25TdGF0ZSQuc3Vic2NyaWJlKChzKSA9PiAodGhpcy5jb25uZWN0aW9uU3RhdGUgPSBzKSksXG4gICAgICB0aGlzLmxpdmVraXRSb29tLmVycm9yJC5zdWJzY3JpYmUoKGUpID0+IHRoaXMuZXJyb3IuZW1pdChlKSlcbiAgICApO1xuXG4gICAgdGhpcy5jb25uZWN0KCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaCgocykgPT4gcy51bnN1YnNjcmliZSgpKTtcbiAgICB0aGlzLmxpdmVraXRSb29tLmRpc2Nvbm5lY3QoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5saXZla2l0Um9vbS5jb25uZWN0KHRoaXMudG9rZW4sIHRoaXMud3NVcmwpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhpcy5lcnJvci5lbWl0KGUubWVzc2FnZSB8fCAnRmFpbGVkIHRvIGNvbm5lY3QnKTtcbiAgICB9XG4gIH1cblxuICBvbkhhbmdVcCgpOiB2b2lkIHtcbiAgICB0aGlzLmxpdmVraXRSb29tLmRpc2Nvbm5lY3QoKTtcbiAgICB0aGlzLmNhbGxFbmRlZC5lbWl0KCk7XG4gIH1cblxuICBhc3luYyBvblRvZ2dsZU1pYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmxpdmVraXRSb29tLnRvZ2dsZU1pY3JvcGhvbmUoKTtcbiAgfVxuXG4gIGFzeW5jIG9uVG9nZ2xlQ2FtZXJhKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMubGl2ZWtpdFJvb20udG9nZ2xlQ2FtZXJhKCk7XG4gIH1cblxuICBhc3luYyBvblRvZ2dsZVNjcmVlblNoYXJlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMubGl2ZWtpdFJvb20udG9nZ2xlU2NyZWVuU2hhcmUoKTtcbiAgfVxuXG4gIGdldCBsb2NhbFBhcnRpY2lwYW50KCk6IFBhcnRpY2lwYW50SW5mbyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucGFydGljaXBhbnRzLmZpbmQoKHApID0+IHAuaXNMb2NhbCk7XG4gIH1cblxuICBnZXQgcmVtb3RlUGFydGljaXBhbnRzKCk6IFBhcnRpY2lwYW50SW5mb1tdIHtcbiAgICByZXR1cm4gdGhpcy5wYXJ0aWNpcGFudHMuZmlsdGVyKChwKSA9PiAhcC5pc0xvY2FsKTtcbiAgfVxuXG4gIGdldCBncmlkQ2xhc3MoKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb3VudCA9IHRoaXMucGFydGljaXBhbnRzLmxlbmd0aDtcbiAgICBpZiAoY291bnQgPD0gMSkgcmV0dXJuICdncmlkLTEnO1xuICAgIGlmIChjb3VudCA8PSAyKSByZXR1cm4gJ2dyaWQtMic7XG4gICAgaWYgKGNvdW50IDw9IDQpIHJldHVybiAnZ3JpZC00JztcbiAgICBpZiAoY291bnQgPD0gNikgcmV0dXJuICdncmlkLTYnO1xuICAgIHJldHVybiAnZ3JpZC1tYW55JztcbiAgfVxuXG4gIGdldCBpc0Nvbm5lY3RlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uU3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5Db25uZWN0ZWQ7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJ2aWRlby1yb29tXCIgKm5nSWY9XCJpc0Nvbm5lY3RlZDsgZWxzZSBjb25uZWN0aW5nXCI+XG4gIDwhLS0gUGFydGljaXBhbnRzIEdyaWQgLS0+XG4gIDxkaXYgY2xhc3M9XCJwYXJ0aWNpcGFudHMtZ3JpZFwiIFtuZ0NsYXNzXT1cImdyaWRDbGFzc1wiPlxuICAgIDx0Z20tdmlkZW8tcGFydGljaXBhbnRcbiAgICAgICpuZ0Zvcj1cImxldCBwYXJ0aWNpcGFudCBvZiBwYXJ0aWNpcGFudHNcIlxuICAgICAgW3BhcnRpY2lwYW50XT1cInBhcnRpY2lwYW50XCJcbiAgICAgIFtjb21wYWN0XT1cInBhcnRpY2lwYW50cy5sZW5ndGggPiA0XCJcbiAgICA+PC90Z20tdmlkZW8tcGFydGljaXBhbnQ+XG4gIDwvZGl2PlxuXG4gIDwhLS0gQ29udHJvbHMgLS0+XG4gIDxkaXYgY2xhc3M9XCJjb250cm9scy1iYXJcIj5cbiAgICA8dGdtLXZpZGVvLWNvbnRyb2xzXG4gICAgICBbbWljRW5hYmxlZF09XCJsb2NhbFBhcnRpY2lwYW50Py5hdWRpb0VuYWJsZWQgPz8gdHJ1ZVwiXG4gICAgICBbY2FtZXJhRW5hYmxlZF09XCJsb2NhbFBhcnRpY2lwYW50Py52aWRlb0VuYWJsZWQgPz8gdHJ1ZVwiXG4gICAgICBbc2NyZWVuU2hhcmVFbmFibGVkXT1cIiEhbG9jYWxQYXJ0aWNpcGFudD8uc2NyZWVuU2hhcmVUcmFja1wiXG4gICAgICAodG9nZ2xlTWljKT1cIm9uVG9nZ2xlTWljKClcIlxuICAgICAgKHRvZ2dsZUNhbWVyYSk9XCJvblRvZ2dsZUNhbWVyYSgpXCJcbiAgICAgICh0b2dnbGVTY3JlZW5TaGFyZSk9XCJvblRvZ2dsZVNjcmVlblNoYXJlKClcIlxuICAgICAgKGhhbmdVcCk9XCJvbkhhbmdVcCgpXCJcbiAgICA+PC90Z20tdmlkZW8tY29udHJvbHM+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjY29ubmVjdGluZz5cbiAgPGRpdiBjbGFzcz1cImNvbm5lY3Rpbmctc3RhdGVcIj5cbiAgICA8ZGl2IGNsYXNzPVwic3Bpbm5lclwiPjwvZGl2PlxuICAgIDxwPkNvbm5lY3RpbmcgdG8gY2FsbC4uLjwvcD5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
|