@dolby-optiview/ads-sdk-adapter-shaka 1.2.0 → 1.3.0

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.
@@ -1,4 +1,4 @@
1
- import type { PlayerAdapter, PlayerAdapterEvent, PlayerAdapterEventHandler, VideoQuality } from '@dolby-optiview/ads-sdk-core';
1
+ import type { ExternalPlaybackState, PlayerAdapter, PlayerAdapterEvent, PlayerAdapterEventHandler, VideoQuality } from '@dolby-optiview/ads-sdk-core';
2
2
  import { type ShakaPtsOffsetManifestLike } from './shakaPtsOffset';
3
3
  /**
4
4
  * Minimal surface of a Shaka variant track. `bandwidth` is bits/s; `active` marks the one
@@ -182,6 +182,7 @@ interface ShakaManifestLike extends ShakaPtsOffsetManifestLike {
182
182
  export declare class ShakaAdapter implements PlayerAdapter {
183
183
  private player;
184
184
  private video;
185
+ private externalPlayback;
185
186
  private eventListeners;
186
187
  private boundHandlers;
187
188
  private deferredSeekTime;
@@ -321,6 +322,8 @@ export declare class ShakaAdapter implements PlayerAdapter {
321
322
  * Unsubscribe from player events.
322
323
  */
323
324
  off(event: PlayerAdapterEvent, handler: PlayerAdapterEventHandler): void;
325
+ get externalPlaybackState(): ExternalPlaybackState | undefined;
326
+ setExternalPlaybackAllowed(allowed: boolean): void;
324
327
  /**
325
328
  * Clean up resources.
326
329
  */
@@ -1 +1 @@
1
- import{decodeUtf8 as e,parseId3GeobBody as t}from"@dolby-optiview/ads-sdk-core/id3";import{shakaPtsOffsetAt as i}from"./shakaPtsOffset";import{isLoadInterrupted as a,refineShakaLoadError as r}from"./shakaLoadError";function s(e){if(null!=e)return"string"==typeof e?e:n(e)?new TextDecoder("utf-8").decode(e):ArrayBuffer.isView(e)?new TextDecoder("utf-8").decode(new Uint8Array(e.buffer,e.byteOffset,e.byteLength)):String(e)}function n(e){return e instanceof ArrayBuffer||"[object ArrayBuffer]"===Object.prototype.toString.call(e)}function d(e){if(n(e))return new Uint8Array(e);const t=e;return new Uint8Array(t.buffer,t.byteOffset,t.byteLength)}export class ShakaAdapter{constructor(e,t){this.eventListeners=new Map,this.boundHandlers=new Map,this.deferredSeekTime=null,this.loadingViaAdapter=!1,this.pendingPresentationDelay=null,this.abrEnabledBeforePin=null,this.variantBeforePin=null,this.emittedCueKeys=new Set,this.player=e,this.video=t;const i=e.load;this.originalPlayerLoad=i,e.load=async(...t)=>{null!==this.pendingPresentationDelay&&e.configure?.("manifest.defaultPresentationDelay",this.pendingPresentationDelay),this.pendingPresentationDelay=null;try{return await i.apply(e,t)}catch(e){throw this.loadingViaAdapter||a(e)||this.emit("error",e),e}},this.setupVideoListeners(),this.setupMetadataListener()}get currentTime(){return this.video.currentTime}prepareForAdPlayback(){try{this.player.configure?.("mediaSource.dispatchAllEmsgBoxes",!0)}catch{return}}get duration(){return this.video.duration}get isLive(){return this.player.isLive?.()??null}get paused(){return this.video.paused}get playbackReady(){return this.video.readyState>=HTMLMediaElement.HAVE_CURRENT_DATA&&!this.video.seeking}get muted(){return this.video.muted}set muted(e){this.video.muted=e}get volume(){return this.video.volume}set volume(e){this.video.volume=e}get videoElement(){return this.video}get programDateTime(){try{const e=this.player.getManifest();if(!e)return null;const t=e.presentationTimeline.getInitialProgramDateTime();return null==t?null:new Date(1e3*(t+this.video.currentTime))}catch{return null}}pause(){this.video.pause()}async play(){await this.video.play()}seek(e){this.video.seeking?this.deferredSeekTime=e:this.video.currentTime=e}get sourceUrl(){return this.player.getAssetUri?.()??null}async load(e){this.player.getMediaElement?.()!==this.video&&await this.player.attach(this.video,!1),this.loadingViaAdapter=!0;try{await this.player.load(e)}catch(t){throw await r(t,e)}finally{this.loadingViaAdapter=!1}}async releaseMediaElement(){await(this.player.detach?.())}async unload(){"function"==typeof this.player.unload?await this.player.unload(!1):await(this.player.detach?.())}async recreateMediaPipeline(e){const t=this.sourceUrl;if(!t)throw new Error("Shaka pipeline recreate: no asset URI");this.deferredSeekTime=null;const i=e.startTime,a=!0===this.isLive;let r;try{r=this.player.getManifest()?.presentationTimeline.getInitialProgramDateTime()??null}catch{r=null}const s=a&&null!==r?1e3*(r+i):null,n=this.player.seekRange?.()?.end,d=a&&void 0!==n&&Number.isFinite(n)?Math.max(0,n-i):null;await this.unload(),this.player.getMediaElement?.()!==this.video&&await this.player.attach(this.video,!1),this.loadingViaAdapter=!0;try{if(a)if(null!==s)await this.player.load(t,new Date(s));else if(null!==d){await this.player.load(t,null);const e=this.player.seekRange?.()?.end;if(void 0!==e&&Number.isFinite(e)){const t=e-d;Math.abs(t-this.video.currentTime)>.5&&(this.video.currentTime=t)}}else await this.player.load(t,i);else await this.player.load(t,i)}finally{this.loadingViaAdapter=!1}}on(e,t){this.eventListeners.has(e)||this.eventListeners.set(e,new Set),this.eventListeners.get(e).add(t)}off(e,t){const i=this.eventListeners.get(e);i&&i.delete(t)}destroy(){for(const[e,t]of this.boundHandlers)this.video.removeEventListener(e,t);this.boundHandlers.clear(),this.deferredSeekTime=null,this.player.removeEventListener&&(this.presentedMetadataHandler&&(this.player.removeEventListener("metadata",this.presentedMetadataHandler),this.presentedMetadataHandler=void 0),this.parsedMetadataHandler&&(this.player.removeEventListener("metadataadded",this.parsedMetadataHandler),this.parsedMetadataHandler=void 0)),this.emsgHandler&&this.player.removeEventListener&&(this.player.removeEventListener("emsg",this.emsgHandler),this.emsgHandler=void 0),this.shakaErrorHandler&&this.player.removeEventListener&&(this.player.removeEventListener("error",this.shakaErrorHandler),this.shakaErrorHandler=void 0),this.originalPlayerLoad&&(this.player.load=this.originalPlayerLoad,this.originalPlayerLoad=void 0),this.emittedCueKeys.clear(),this.eventListeners.clear(),this.player.destroy()}get playbackRate(){return this.video.playbackRate}set playbackRate(e){this.video.playbackRate=e}setVideoQuality(e){if(null===e){if(null===this.abrEnabledBeforePin)return!1;const e=this.abrEnabledBeforePin,t=this.variantBeforePin;if(e){if(!this.player.configure)return!1;this.player.configure("abr.enabled",!0)}else{if(!t)return!1;if(!this.player.selectVariantTrack)return!1;this.player.selectVariantTrack(t,!1)}return this.abrEnabledBeforePin=null,this.variantBeforePin=null,!0}const t=this.player.getVariantTracks?.();if(!t||!this.player.selectVariantTrack)return!1;const i=t.filter(e=>{const t=e?.bandwidth;return"number"==typeof t&&Number.isFinite(t)&&t>0});if(i.length<2)return!1;let a=i[0];for(let e=1;e<i.length;e++)i[e].bandwidth<a.bandwidth&&(a=i[e]);if(null!==this.abrEnabledBeforePin)return!0;const r=this.player.getConfiguration?.()?.abr?.enabled??!0,s=t.find(e=>e?.active)??null;if(r&&!this.player.configure||!r&&!s)return!1;this.abrEnabledBeforePin=r,this.variantBeforePin=s;try{return this.player.configure?.("abr.enabled",!1),this.player.selectVariantTrack(a,!1),!0}catch{if(r)try{this.player.configure?.("abr.enabled",!0)}catch{this.variantBeforePin=null}return this.abrEnabledBeforePin=null,this.variantBeforePin=null,!1}}requestLiveStartOffset(e,t){const i=(e??NaN)*(t??NaN),a=Number.isFinite(i)&&i>0&&!!this.player.configure&&!this.player.getManifest();return this.pendingPresentationDelay=a?i:null,a}get liveEdge(){const e=this.player.isLive?.()?this.player.getManifest()?.presentationTimeline.getMaxSegmentEndTime?.():null;return"number"==typeof e&&Number.isFinite(e)?e:null}get maxLiveSeekPosition(){if(!this.player.isLive?.())return null;const e=this.player.seekRange?.(),t=e?.end;if("number"!=typeof t||!Number.isFinite(t))return null;const i=this.player.getConfiguration?.()?.streaming,a=i?.liveSync;let r;if(a?.enabled){const e=a.targetLatency,t=a.targetLatencyTolerance??0;"number"==typeof e&&(r=e-t)}if(void 0===r&&(r=i?.safeSeekEndOffset),"number"!=typeof r||!Number.isFinite(r))return null;const s=t-r;return Number.isFinite(s)?s:null}setupMetadataListener(){if(!this.player.addEventListener)return;const e=e=>t=>{const i={...this.toCue(t),phase:e};this.isDuplicateCue(i)||this.emit("timedmetadata",i)};this.parsedMetadataHandler=e("parsed"),this.presentedMetadataHandler=e("presented"),this.player.addEventListener("metadata",this.presentedMetadataHandler),this.player.addEventListener("metadataadded",this.parsedMetadataHandler);const t=e=>{const t=e.detail;t&&this.emit("timedmetadata",this.emsgToCue(t))};this.emsgHandler=t,this.player.addEventListener("emsg",t);const i=e=>{2!==e.detail?.severity||this.loadingViaAdapter||this.emit("error",e.detail)};this.shakaErrorHandler=i,this.player.addEventListener("error",i)}isDuplicateCue(e){const t=[e.startTime,e.description??"",e.mimeType??"",e.messageData??"",e.frames?JSON.stringify(e.frames):"",e.phase??""].join("\0");return!!this.emittedCueKeys.has(t)||(this.emittedCueKeys.add(t),this.emittedCueKeys.size>256&&this.emittedCueKeys.delete(this.emittedCueKeys.values().next().value),!1)}toCue(i){const a=(i.metadataType??"").toLowerCase(),r=a.includes("emsg")?"emsg":a.includes("daterange")?"daterange":"id3",l=i.payload?.key??i.key,o=i.payload?.data??i.payload?.value??i.data,h={type:r,startTime:i.startTime??i.cueTime??0,endTime:i.endTime};if(void 0!==i.schemeIdUri&&(h.schemeIdUri=i.schemeIdUri),"emsg"===r){const e=null==o?null:d(o);e&&(h.raw=e)}if("id3"===r&&"GEOB"===l){const a=function(e,t){return(void 0===e||""===e)&&(n(t)||ArrayBuffer.isView(t))}(i.payload?.description,o)?t(d(o)):null;if(a)return h.description=a.description,a.mimeType&&(h.mimeType=a.mimeType),h.messageData=e(a.data),h;void 0!==i.payload?.description&&(h.description=i.payload.description),null!=i.payload?.mimeType&&(h.mimeType=i.payload.mimeType);const r=s(o);return void 0!==r&&(h.messageData=r),h}const u="id3"===r?null==o?void 0:String(o):s(o);return l&&void 0!==u?"id3"===r?h.frames={[l]:u}:h.messageData=u:void 0!==u&&(h.messageData=u),h}emsgToCue(e){const t={type:"emsg",startTime:e.startTime??0,endTime:e.endTime};void 0!==e.schemeIdUri&&(t.schemeIdUri=e.schemeIdUri),void 0!==e.id&&(t.id=String(e.id));const a=i(this.player.getManifest(),t.startTime);if(void 0!==a&&(t.ptsOffset=a),null!=e.messageData){const i=d(e.messageData);i&&(t.raw=i)}const r=s(e.messageData);return void 0!==r&&(t.messageData=r),t}setupVideoListeners(){const e=()=>{this.emit("timeupdate")},t=()=>{this.emit("ended")},i=()=>{this.loadingViaAdapter||this.emit("error",this.video.error)},a=()=>{if(this.emit("seeked"),null!==this.deferredSeekTime){const e=this.deferredSeekTime;this.deferredSeekTime=null,this.seek(e)}},r=()=>{this.emit("volumechange")},s=()=>{this.emit("waiting")},n=()=>{this.emit("playing")},d=()=>{this.emit("pause")};this.video.addEventListener("timeupdate",e),this.video.addEventListener("ended",t),this.video.addEventListener("error",i),this.video.addEventListener("seeked",a),this.video.addEventListener("volumechange",r),this.video.addEventListener("waiting",s),this.video.addEventListener("playing",n),this.video.addEventListener("pause",d),this.boundHandlers.set("timeupdate",e),this.boundHandlers.set("ended",t),this.boundHandlers.set("error",i),this.boundHandlers.set("seeked",a),this.boundHandlers.set("volumechange",r),this.boundHandlers.set("waiting",s),this.boundHandlers.set("playing",n),this.boundHandlers.set("pause",d)}emit(e,t){const i=this.eventListeners.get(e);if(i)for(const e of i)try{e(t)}catch(e){console.error("[ShakaAdapter] Event handler error:",e)}}}
1
+ import{decodeUtf8 as e,parseId3GeobBody as t}from"@dolby-optiview/ads-sdk-core/id3";import{observeExternalPlayback as i,setExternalPlaybackAllowed as a}from"@dolby-optiview/ads-sdk-core/external-playback";import{decodeMetadataValue as s,isGeobBodyCandidate as r,toUint8Array as n}from"./shakaMetadataValue";import{shakaPtsOffsetAt as d}from"./shakaPtsOffset";import{isLoadInterrupted as l,refineShakaLoadError as o}from"./shakaLoadError";export class ShakaAdapter{constructor(e,t){this.eventListeners=new Map,this.boundHandlers=new Map,this.deferredSeekTime=null,this.loadingViaAdapter=!1,this.pendingPresentationDelay=null,this.abrEnabledBeforePin=null,this.variantBeforePin=null,this.emittedCueKeys=new Set,this.player=e,this.video=t,this.externalPlayback=i(t,e=>this.emit("externalplaybackchange",e));const a=e.load;this.originalPlayerLoad=a,e.load=async(...t)=>{null!==this.pendingPresentationDelay&&e.configure?.("manifest.defaultPresentationDelay",this.pendingPresentationDelay),this.pendingPresentationDelay=null;try{return await a.apply(e,t)}catch(e){throw this.loadingViaAdapter||l(e)||this.emit("error",e),e}},this.setupVideoListeners(),this.setupMetadataListener()}get currentTime(){return this.video.currentTime}prepareForAdPlayback(){try{this.player.configure?.("mediaSource.dispatchAllEmsgBoxes",!0)}catch{return}}get duration(){return this.video.duration}get isLive(){return this.player.isLive?.()??null}get paused(){return this.video.paused}get playbackReady(){return this.video.readyState>=HTMLMediaElement.HAVE_CURRENT_DATA&&!this.video.seeking}get muted(){return this.video.muted}set muted(e){this.video.muted=e}get volume(){return this.video.volume}set volume(e){this.video.volume=e}get videoElement(){return this.video}get programDateTime(){try{const e=this.player.getManifest();if(!e)return null;const t=e.presentationTimeline.getInitialProgramDateTime();return null==t?null:new Date(1e3*(t+this.video.currentTime))}catch{return null}}pause(){this.video.pause()}async play(){await this.video.play()}seek(e){this.video.seeking?this.deferredSeekTime=e:this.video.currentTime=e}get sourceUrl(){return this.player.getAssetUri?.()??null}async load(e){this.player.getMediaElement?.()!==this.video&&await this.player.attach(this.video,!1),this.loadingViaAdapter=!0;try{await this.player.load(e)}catch(t){throw await o(t,e)}finally{this.loadingViaAdapter=!1}}async releaseMediaElement(){await(this.player.detach?.())}async unload(){"function"==typeof this.player.unload?await this.player.unload(!1):await(this.player.detach?.())}async recreateMediaPipeline(e){const t=this.sourceUrl;if(!t)throw new Error("Shaka pipeline recreate: no asset URI");this.deferredSeekTime=null;const i=e.startTime,a=!0===this.isLive;let s;try{s=this.player.getManifest()?.presentationTimeline.getInitialProgramDateTime()??null}catch{s=null}const r=a&&null!==s?1e3*(s+i):null,n=this.player.seekRange?.()?.end,d=a&&void 0!==n&&Number.isFinite(n)?Math.max(0,n-i):null;await this.unload(),this.player.getMediaElement?.()!==this.video&&await this.player.attach(this.video,!1),this.loadingViaAdapter=!0;try{if(a)if(null!==r)await this.player.load(t,new Date(r));else if(null!==d){await this.player.load(t,null);const e=this.player.seekRange?.()?.end;if(void 0!==e&&Number.isFinite(e)){const t=e-d;Math.abs(t-this.video.currentTime)>.5&&(this.video.currentTime=t)}}else await this.player.load(t,i);else await this.player.load(t,i)}finally{this.loadingViaAdapter=!1}}on(e,t){this.eventListeners.has(e)||this.eventListeners.set(e,new Set),this.eventListeners.get(e).add(t)}off(e,t){const i=this.eventListeners.get(e);i&&i.delete(t)}get externalPlaybackState(){return this.externalPlayback?.state}setExternalPlaybackAllowed(e){a(this.video,e)}destroy(){this.externalPlayback?.dispose();for(const[e,t]of this.boundHandlers)this.video.removeEventListener(e,t);this.boundHandlers.clear(),this.deferredSeekTime=null,this.player.removeEventListener&&(this.presentedMetadataHandler&&(this.player.removeEventListener("metadata",this.presentedMetadataHandler),this.presentedMetadataHandler=void 0),this.parsedMetadataHandler&&(this.player.removeEventListener("metadataadded",this.parsedMetadataHandler),this.parsedMetadataHandler=void 0)),this.emsgHandler&&this.player.removeEventListener&&(this.player.removeEventListener("emsg",this.emsgHandler),this.emsgHandler=void 0),this.shakaErrorHandler&&this.player.removeEventListener&&(this.player.removeEventListener("error",this.shakaErrorHandler),this.shakaErrorHandler=void 0),this.originalPlayerLoad&&(this.player.load=this.originalPlayerLoad,this.originalPlayerLoad=void 0),this.emittedCueKeys.clear(),this.eventListeners.clear(),this.player.destroy()}get playbackRate(){return this.video.playbackRate}set playbackRate(e){this.video.playbackRate=e}setVideoQuality(e){if(null===e){if(null===this.abrEnabledBeforePin)return!1;const e=this.abrEnabledBeforePin,t=this.variantBeforePin;if(e){if(!this.player.configure)return!1;this.player.configure("abr.enabled",!0)}else{if(!t)return!1;if(!this.player.selectVariantTrack)return!1;this.player.selectVariantTrack(t,!1)}return this.abrEnabledBeforePin=null,this.variantBeforePin=null,!0}const t=this.player.getVariantTracks?.();if(!t||!this.player.selectVariantTrack)return!1;const i=t.filter(e=>{const t=e?.bandwidth;return"number"==typeof t&&Number.isFinite(t)&&t>0});if(i.length<2)return!1;let a=i[0];for(let e=1;e<i.length;e++)i[e].bandwidth<a.bandwidth&&(a=i[e]);if(null!==this.abrEnabledBeforePin)return!0;const s=this.player.getConfiguration?.()?.abr?.enabled??!0,r=t.find(e=>e?.active)??null;if(s&&!this.player.configure||!s&&!r)return!1;this.abrEnabledBeforePin=s,this.variantBeforePin=r;try{return this.player.configure?.("abr.enabled",!1),this.player.selectVariantTrack(a,!1),!0}catch{if(s)try{this.player.configure?.("abr.enabled",!0)}catch{this.variantBeforePin=null}return this.abrEnabledBeforePin=null,this.variantBeforePin=null,!1}}requestLiveStartOffset(e,t){const i=(e??NaN)*(t??NaN),a=Number.isFinite(i)&&i>0&&!!this.player.configure&&!this.player.getManifest();return this.pendingPresentationDelay=a?i:null,a}get liveEdge(){const e=this.player.isLive?.()?this.player.getManifest()?.presentationTimeline.getMaxSegmentEndTime?.():null;return"number"==typeof e&&Number.isFinite(e)?e:null}get maxLiveSeekPosition(){if(!this.player.isLive?.())return null;const e=this.player.seekRange?.(),t=e?.end;if("number"!=typeof t||!Number.isFinite(t))return null;const i=this.player.getConfiguration?.()?.streaming,a=i?.liveSync;let s;if(a?.enabled){const e=a.targetLatency,t=a.targetLatencyTolerance??0;"number"==typeof e&&(s=e-t)}if(void 0===s&&(s=i?.safeSeekEndOffset),"number"!=typeof s||!Number.isFinite(s))return null;const r=t-s;return Number.isFinite(r)?r:null}setupMetadataListener(){if(!this.player.addEventListener)return;const e=e=>t=>{const i={...this.toCue(t),phase:e};this.isDuplicateCue(i)||this.emit("timedmetadata",i)};this.parsedMetadataHandler=e("parsed"),this.presentedMetadataHandler=e("presented"),this.player.addEventListener("metadata",this.presentedMetadataHandler),this.player.addEventListener("metadataadded",this.parsedMetadataHandler);const t=e=>{const t=e.detail;t&&this.emit("timedmetadata",this.emsgToCue(t))};this.emsgHandler=t,this.player.addEventListener("emsg",t);const i=e=>{2!==e.detail?.severity||this.loadingViaAdapter||this.emit("error",e.detail)};this.shakaErrorHandler=i,this.player.addEventListener("error",i)}isDuplicateCue(e){const t=[e.startTime,e.description??"",e.mimeType??"",e.messageData??"",e.frames?JSON.stringify(e.frames):"",e.phase??""].join("\0");return!!this.emittedCueKeys.has(t)||(this.emittedCueKeys.add(t),this.emittedCueKeys.size>256&&this.emittedCueKeys.delete(this.emittedCueKeys.values().next().value),!1)}toCue(i){const a=(i.metadataType??"").toLowerCase(),d=a.includes("emsg")?"emsg":a.includes("daterange")?"daterange":"id3",l=i.payload?.key??i.key,o=i.payload?.data??i.payload?.value??i.data,h={type:d,startTime:i.startTime??i.cueTime??0,endTime:i.endTime};if(void 0!==i.schemeIdUri&&(h.schemeIdUri=i.schemeIdUri),"emsg"===d){const e=null==o?null:n(o);e&&(h.raw=e)}if("id3"===d&&"GEOB"===l){const a=r(i.payload?.description,o)?t(n(o)):null;if(a)return h.description=a.description,a.mimeType&&(h.mimeType=a.mimeType),h.messageData=e(a.data),h;void 0!==i.payload?.description&&(h.description=i.payload.description),null!=i.payload?.mimeType&&(h.mimeType=i.payload.mimeType);const d=s(o);return void 0!==d&&(h.messageData=d),h}const u="id3"===d?null==o?void 0:String(o):s(o);return l&&void 0!==u?"id3"===d?h.frames={[l]:u}:h.messageData=u:void 0!==u&&(h.messageData=u),h}emsgToCue(e){const t={type:"emsg",startTime:e.startTime??0,endTime:e.endTime};void 0!==e.schemeIdUri&&(t.schemeIdUri=e.schemeIdUri),void 0!==e.id&&(t.id=String(e.id));const i=d(this.player.getManifest(),t.startTime);if(void 0!==i&&(t.ptsOffset=i),null!=e.messageData){const i=n(e.messageData);i&&(t.raw=i)}const a=s(e.messageData);return void 0!==a&&(t.messageData=a),t}setupVideoListeners(){const e=()=>{this.emit("timeupdate")},t=()=>{this.emit("ended")},i=()=>{this.loadingViaAdapter||this.emit("error",this.video.error)},a=()=>{if(this.emit("seeked"),null!==this.deferredSeekTime){const e=this.deferredSeekTime;this.deferredSeekTime=null,this.seek(e)}},s=()=>{this.emit("volumechange")},r=()=>{this.emit("waiting")},n=()=>{this.emit("playing")},d=()=>{this.emit("pause")};this.video.addEventListener("timeupdate",e),this.video.addEventListener("ended",t),this.video.addEventListener("error",i),this.video.addEventListener("seeked",a),this.video.addEventListener("volumechange",s),this.video.addEventListener("waiting",r),this.video.addEventListener("playing",n),this.video.addEventListener("pause",d),this.boundHandlers.set("timeupdate",e),this.boundHandlers.set("ended",t),this.boundHandlers.set("error",i),this.boundHandlers.set("seeked",a),this.boundHandlers.set("volumechange",s),this.boundHandlers.set("waiting",r),this.boundHandlers.set("playing",n),this.boundHandlers.set("pause",d)}emit(e,t){const i=this.eventListeners.get(e);if(i)for(const e of i)try{e(t)}catch(e){console.error("[ShakaAdapter] Event handler error:",e)}}}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Decode a metadata payload value into text: byte buffers are decoded as
3
+ * UTF-8 (the encoding of ID3 GEOB object data and emsg message data);
4
+ * strings pass through; anything else is stringified.
5
+ */
6
+ export declare function decodeMetadataValue(value: unknown): string | undefined;
7
+ /**
8
+ * Whether a GEOB payload looks like a raw, undecoded frame body that this
9
+ * adapter has to parse itself: Shaka surfaced no content description AND the
10
+ * data arrived as bytes. A player that decoded the frame gives us a real
11
+ * description (and hands over just the object data), so it is left untouched.
12
+ */
13
+ export declare function isGeobBodyCandidate(description: string | undefined, value: unknown): boolean;
14
+ /** View a byte payload as a Uint8Array without copying. */
15
+ export declare function toUint8Array(value: unknown): Uint8Array;
@@ -0,0 +1 @@
1
+ export function decodeMetadataValue(t){if(null!=t)return"string"==typeof t?t:e(t)?new TextDecoder("utf-8").decode(t):ArrayBuffer.isView(t)?new TextDecoder("utf-8").decode(new Uint8Array(t.buffer,t.byteOffset,t.byteLength)):String(t)}function e(e){return e instanceof ArrayBuffer||"[object ArrayBuffer]"===Object.prototype.toString.call(e)}export function isGeobBodyCandidate(t,r){return(void 0===t||""===t)&&(e(r)||ArrayBuffer.isView(r))}export function toUint8Array(t){if(e(t))return new Uint8Array(t);const r=t;return new Uint8Array(r.buffer,r.byteOffset,r.byteLength)}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dolby-optiview/ads-sdk-adapter-shaka",
3
- "version": "1.2.0",
3
+ "version": "1.3.0",
4
4
  "description": "Shaka Player adapter for OptiView Ads SDK",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -38,7 +38,7 @@
38
38
  },
39
39
  "sideEffects": false,
40
40
  "dependencies": {
41
- "@dolby-optiview/ads-sdk-core": "^1.2.0"
41
+ "@dolby-optiview/ads-sdk-core": "^1.3.0"
42
42
  },
43
43
  "peerDependencies": {
44
44
  "shaka-player": "^4.0.0 || ^5.0.0"