{"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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"}