@ngx-telly/plugin-wowza-webrtc
Version:
Telly - HLS plugin
1 lines • 19.7 kB
Source Map (JSON)
{"version":3,"file":"ngx-telly-plugin-wowza-webrtc.mjs","sources":["../../../../libs/plugin-wowza-webrtc/src/lib/munge.ts","../../../../libs/plugin-wowza-webrtc/src/lib/wowza-connector.ts","../../../../libs/plugin-wowza-webrtc/src/lib/wowza.directive.ts","../../../../libs/plugin-wowza-webrtc/src/ngx-telly-plugin-wowza-webrtc.ts"],"sourcesContent":["/*\n * This code and all components (c) Copyright 2019-2020, Wowza Media Systems, LLC. All rights reserved.\n * This code is licensed pursuant to the BSD 3-Clause License.\n */\n\nexport function mungeSDPPlay(sdpStr: string) {\n // For greatest playback compatibility,\n // force H.264 playback to constrained baseline (42e01f).\n\n const sdpLines = sdpStr.split(/\\r\\n/);\n let sdpStrRet = '';\n\n for (const sdpIndex in sdpLines) {\n let sdpLine = sdpLines[sdpIndex];\n\n if (sdpLine.length == 0) continue;\n\n if (sdpLine.includes('profile-level-id')) {\n // The profile-level-id string has three parts: XXYYZZ, where\n // XX: 42 baseline, 4D main, 64 high\n // YY: constraint\n // ZZ: level ID\n // Look for codecs higher than baseline and force downward.\n const profileLevelId = sdpLine.substr(sdpLine.indexOf('profile-level-id') + 17, 6);\n let profile = Number('0x' + profileLevelId.substr(0, 2));\n let constraint = Number('0x' + profileLevelId.substr(2, 2));\n let level = Number('0x' + profileLevelId.substr(4, 2));\n if (profile > 0x42) {\n profile = 0x42;\n constraint = 0xe0;\n level = 0x1f;\n }\n if (constraint == 0x00) {\n constraint = 0xe0;\n }\n const newProfileLevelId =\n ('00' + profile.toString(16)).slice(-2).toLowerCase() +\n ('00' + constraint.toString(16)).slice(-2).toLowerCase() +\n ('00' + level.toString(16)).slice(-2).toLowerCase();\n\n sdpLine = sdpLine.replace(profileLevelId, newProfileLevelId);\n }\n\n sdpStrRet += sdpLine;\n sdpStrRet += '\\r\\n';\n }\n\n return sdpStrRet;\n}\n","import { mungeSDPPlay } from './munge';\nimport { WowzaConnectionConfig } from './wowza-conn-config';\n\nexport class WowzaConnector {\n wsConnection?: WebSocket;\n peerConnection?: RTCPeerConnection;\n config: WowzaConnectionConfig;\n\n constructor(config: WowzaConnectionConfig) {\n this.config = config;\n }\n\n start() {\n if (!this.peerConnection) {\n this.wsConnect(this.config.sdpUrl);\n }\n }\n\n stop() {\n if (this.peerConnection) {\n this.peerConnection.close();\n this.peerConnection = undefined;\n }\n\n if (this.wsConnection) {\n this.wsConnection.close();\n this.wsConnection = undefined;\n }\n\n if (this.config.videoEl) {\n this.config.videoEl.src = '';\n }\n }\n\n wsConnect(url: string): void {\n this.wsConnection = new WebSocket(url);\n this.wsConnection.binaryType = 'arraybuffer';\n this.wsConnection.onopen = this.onWsConnected;\n this.wsConnection.onmessage = this.onMsgRcv;\n this.wsConnection.onclose = this.onClose;\n this.wsConnection.onerror = this.onError;\n }\n\n wsSend(command: string, ext: any = {}): void {\n const cmd = {\n direction: 'play',\n command: command,\n streamInfo: this.config.streamInfo,\n userData: this.config.userData,\n ...ext,\n };\n\n if (this.config.secureToken != null) {\n cmd.secureToken = this.config.secureToken;\n }\n\n this.wsConnection?.send(JSON.stringify(cmd));\n }\n\n onIceCandidateRcv = (ev: RTCPeerConnectionIceEvent): void => {\n console.log('[ ICE ]', ev.candidate);\n };\n\n onDescriptionRcv = (desc: RTCSessionDescriptionInit): void => {\n this.peerConnection\n ?.setLocalDescription(desc)\n .then(() => {\n this.wsSend('sendResponse', { sdp: desc });\n })\n .catch((err) => {\n console.log('[WEB RTC] Setting local RTCSessionDescriptionInit failed', err);\n });\n };\n\n onTrackRcv = (ev: RTCTrackEvent): void => {\n try {\n this.config.videoEl.srcObject = ev.streams[0];\n this.config.videoEl.onerror = this.onVideoError;\n } catch {\n console.log('[WEB RTC] Cannot bind srcObject to video element. Sources: ', ev.streams);\n }\n };\n\n onVideoError = (ev: string | Event): void => {\n if (typeof ev === 'string') return;\n\n const videoEl = ev.target as HTMLVideoElement;\n const error = videoEl.error;\n\n if (error) {\n const errorMsg = `[VIDEO PLAYBACK ERROR] Code: ${error.code}, Message: ${error.message}`;\n console.error(errorMsg, error);\n this.config?.errorCallback?.(ev);\n }\n };\n\n onMsgRcv = (ev: MessageEvent): void => {\n const msg = JSON.parse(ev.data);\n const status = +msg['status'];\n const command = msg['command'];\n\n switch (status) {\n case 200: {\n console.log('[WOWZA] Success response');\n if (msg['streamInfo']) {\n const streamInfo = msg['streamInfo'];\n this.config.streamInfo.sessionId = streamInfo.sessionId;\n }\n\n if (msg['sdp']) {\n msg.sdp.sdp = mungeSDPPlay(msg.sdp.sdp);\n\n this.peerConnection?.setRemoteDescription(new RTCSessionDescription(msg.sdp)).then(() => {\n this.peerConnection?.createAnswer().then((d) => this.onDescriptionRcv(d));\n });\n }\n\n if (msg['iceCandidates'] && msg['iceCandidates'].length) {\n msg['iceCandidates'].forEach((x: RTCIceCandidateInit) => {\n this.peerConnection?.addIceCandidate(new RTCIceCandidate(x));\n });\n }\n\n if ('sendResponse'.localeCompare(command) == 0) {\n this.wsConnection?.close();\n this.wsConnection = undefined;\n }\n\n if ('getAvailableStreams'.localeCompare(command) == 0) {\n this.stop();\n }\n break;\n }\n case 403: {\n const errorMsg = '[WOWZA ERROR] 403 Forbidden - Access denied or authentication failed';\n console.error(errorMsg, msg);\n this.config?.errorCallback?.(ev);\n this.stop();\n break;\n }\n case 404: {\n const errorMsg = '[WOWZA ERROR] 404 Not Found - Stream or resource not found';\n console.error(errorMsg, msg);\n this.config?.errorCallback?.(ev);\n this.stop();\n break;\n }\n case 507: {\n const errorMsg = '[WOWZA ERROR] 507 WebRTC session not found';\n console.error(errorMsg, msg);\n this.config?.errorCallback?.(ev);\n this.stop();\n break;\n }\n case 514: {\n console.warn('[WOWZA] 514 Stream not ready, retrying...');\n let retries = 0;\n\n if (retries < 10) {\n setTimeout(() => {\n this.wsSend('getOffer');\n retries++;\n }, 500);\n } else {\n const errorMsg = '[WOWZA ERROR] 514 Max retries exceeded - Stream unavailable';\n console.error(errorMsg);\n this.config?.errorCallback?.(ev);\n this.stop();\n }\n break;\n }\n default: {\n const errorMsg = `[WOWZA ERROR] Unexpected status code: ${status}`;\n console.error(errorMsg, msg);\n this.config?.errorCallback?.(ev);\n this.stop();\n break;\n }\n }\n };\n\n onStateChanged = (ev: Event): void => {\n const state = this.peerConnection?.connectionState;\n console.log('[WEB RTC] Connection state changed to:', state);\n\n if (state === 'failed' || state === 'disconnected') {\n console.error('[WEB RTC] Connection failed/disconnected. ICE state:', this.peerConnection?.iceConnectionState);\n this.config?.errorCallback?.(ev);\n }\n\n this.config?.stateCallback?.(ev);\n };\n\n onError = (ev: Event): void => {\n this.config?.errorCallback?.(ev);\n };\n\n onClose = (ev: Event): void => {\n this.config?.closeCallback?.(ev);\n };\n\n onWsConnected = (): void => {\n this.peerConnection = new RTCPeerConnection();\n this.peerConnection.onicecandidate = this.onIceCandidateRcv;\n this.peerConnection.ontrack = this.onTrackRcv;\n this.peerConnection.onconnectionstatechange = this.onStateChanged;\n\n this.wsSend('getOffer');\n };\n}\n","import { Directive, EventEmitter, inject, Input, OnChanges, OnDestroy, Output, SimpleChanges } from '@angular/core';\nimport { PlayerComponent } from '@ngx-telly/player';\nimport { WowzaConnectionConfig } from './wowza-conn-config';\nimport { WowzaConnector } from './wowza-connector';\nimport { WowzaSecureToken } from './wowza-secure-token';\n\n@Directive({\n selector: '[tellyWowza]',\n standalone: true,\n})\nexport class WowzaDirective implements OnChanges, OnDestroy {\n @Input({ required: true }) tellyWowza?: string;\n @Input() streamName?: string;\n @Input() appName?: string;\n @Input() sessionId = '[empty]';\n @Input() token?: WowzaSecureToken;\n\n @Output() wowzaStateCallback = new EventEmitter<Event>();\n @Output() wowzaCloseCallback = new EventEmitter<Event>();\n @Output() wowzaErrorCallback = new EventEmitter<Event>();\n\n wowza?: WowzaConnector;\n player = inject(PlayerComponent);\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['tellyWowza']?.currentValue || changes['streamName']?.currentValue) {\n this.create();\n }\n }\n\n create(): void {\n if (!this.tellyWowza || !this.streamName || !this.appName) {\n return;\n }\n\n if (this.wowza) {\n this.destroy();\n }\n\n const config: WowzaConnectionConfig = {\n sdpUrl: this.tellyWowza,\n videoEl: this.player.video.nativeElement,\n streamInfo: {\n applicationName: this.appName,\n streamName: this.streamName,\n sessionId: this.sessionId,\n },\n stateCallback: (e) => this.wowzaStateCallback.emit(e),\n closeCallback: (e) => this.wowzaCloseCallback.emit(e),\n errorCallback: (e) => this.wowzaErrorCallback.emit(e),\n };\n\n if (this.token != null) {\n config.secureToken = this.token;\n }\n\n this.wowza = new WowzaConnector(config);\n this.wowza.start();\n }\n\n destroy(): void {\n this.player.video.nativeElement.srcObject = null;\n this.wowza?.stop();\n this.wowza = undefined;\n }\n\n ngOnDestroy(): void {\n this.destroy();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}