@gumlet/player.js 3.0.2 → 3.0.3

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/dist/main.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var m=Object.defineProperty;var O=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var L=Object.prototype.hasOwnProperty;var C=(i,e)=>{for(var t in e)m(i,t,{get:e[t],enumerable:!0})},N=(i,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of k(e))!L.call(i,o)&&o!==t&&m(i,o,{get:()=>e[o],enumerable:!(n=O(e,o))||n.enumerable});return i};var D=i=>N(m({},"__esModule",{value:!0}),i);var V={};C(V,{default:()=>A});module.exports=D(V);var u={EVENTS:{READY:"ready",PLAY:"play",PAUSE:"pause",ENDED:"ended",TIMEUPDATE:"timeupdate",PROGRESS:"progress",SEEKED:"seeked",ERROR:"error",FULLSCREEN_CHANGE:"fullscreenChange",PIP_CHANGE:"pipChange",PLAYBACK_RATE_CHANGE:"playbackRateChange",AUDIO_CHANGE:"audioChange",QUALITY_CHANGE:"qualityChange",VOLUME_CHANGE:"volumeChange",all(){let i=[];for(let e in u.EVENTS)u.has(u.EVENTS,e)&&u.isString(u.EVENTS[e])&&i.push(u.EVENTS[e]);return i}},POST_MESSAGE:!!window.postMessage,METHODS:{PLAY:"play",PAUSE:"pause",GETPAUSED:"getPaused",MUTE:"mute",UNMUTE:"unmute",GETMUTED:"getMuted",SETVOLUME:"setVolume",GETVOLUME:"getVolume",GETDURATION:"getDuration",SETCURRENTTIME:"setCurrentTime",GETCURRENTTIME:"getCurrentTime",SETLOOP:"setLoop",GETLOOP:"getLoop",SETPLAYBACKRATE:"setPlaybackRate",GETPLAYBACKRATE:"getPlaybackRate",REMOVEEVENTLISTENER:"removeEventListener",ADDEVENTLISTENER:"addEventListener",all(){let i=[];for(let e in u.METHODS)u.has(u.METHODS,e)&&u.isString(u.METHODS[e])&&i.push(u.METHODS[e]);return i}},DEBUG:!1,VERSION:"2.0",CONTEXT:"player.js",isString(i){return Object.prototype.toString.call(i)==="[object String]"},has(i,e){return Object.prototype.hasOwnProperty.call(i,e)},addEvent(i,e,t){i&&(i.addEventListener?i.addEventListener(e,t,!1):i.attachEvent?i.attachEvent("on"+e,t):i["on"+e]=t)},isNone(i){return i==null},assert(i,e){if(!i)throw e||"Player.js Assert Failed"},generateUUID(){if(crypto&&crypto.randomUUID)return crypto.randomUUID();{let i=URL.createObjectURL(new Blob);return i.substring(i.lastIndexOf("/")+1)}},isArray(i){return Object.prototype.toString.call(i)==="[object Array]"}},r=u;var h=class{constructor(){this.data={}}has(e,t){if(!Object.prototype.hasOwnProperty.call(this.data,e))return!1;if(r.isNone(t))return!0;let n=this.data[e];for(let o=0;o<n.length;o++)if(n[o].id===t)return!0;return!1}add(e,t,n,o,s=!1){let a={id:e,event:t,cb:n,ctx:o,one:s};this.has(t)?this.data[t].push(a):this.data[t]=[a]}execute(e,t,n,o){if(!this.has(e,t))return!1;let s=[],a=[];for(let c=0;c<this.data[e].length;c++){let l=this.data[e][c];r.isNone(t)||!r.isNone(t)&&l.id===t?(a.push({cb:l.cb,ctx:l.ctx?l.ctx:o,data:n}),l.one===!1&&s.push(l)):s.push(l)}s.length===0?delete this.data[e]:this.data[e]=s;for(let c=0;c<a.length;c++){let l=a[c];l.cb.call(l.ctx,l.data)}return!0}on(e,t,n,o){this.add(e,t,n,o,!1)}one(e,t,n,o){this.add(e,t,n,o,!0)}off(e,t){let n=[];if(!Object.prototype.hasOwnProperty.call(this.data,e))return n;let o=[];for(let s=0;s<this.data[e].length;s++){let a=this.data[e][s];!r.isNone(t)&&a.cb!==t?o.push(a):r.isNone(a.id)||n.push(a.id)}return o.length===0?delete this.data[e]:this.data[e]=o,n}},E=h;var p=[],f=class{constructor(e,t=!1){let n=this;if(this.READIED=p,r.isString(e)){let o=document.getElementById(e);if(!o)throw new Error(`Element with id "${e}" not found`);e=o}this.elem=e,this.debug=t,r.assert(e.nodeName==="IFRAME",'playerjs.Player constructor requires an Iframe, got "'+e.nodeName+'"'),r.assert(e.src,"playerjs.Player constructor requires a Iframe with a 'src' attribute."),this.origin=new URL(e.src).origin,this.keeper=new E,this.isReady=!1,this.queue=[],this.events=r.EVENTS.all(),this.methods=r.METHODS.all(),r.POST_MESSAGE?r.addEvent(window,"message",function(o){n.receive(o)}):console.error("Post Message is not Available."),p.includes(e.src)?n.loaded=!0:this.elem.onload=function(){n.loaded=!0}}send(e,t,n){if(e.context=r.CONTEXT,e.version=r.VERSION,t){let o=r.generateUUID();e.listener=o,this.keeper.one(o,e.method||"",t,n)}return!this.isReady&&e.value!=="ready"?(this.debug&&console.debug("Player.queue",e),this.queue.push(e),!1):(this.debug&&console.debug("Player.send",e,this.origin),this.loaded===!0&&this.elem.contentWindow&&this.elem.contentWindow.postMessage(JSON.stringify(e),this.origin),!0)}receive(e){if(this.debug&&console.debug("Player.receive",e),e.origin!==this.origin)return!1;let t;try{t=JSON.parse(e.data)}catch(n){return!1}return t.context!==r.CONTEXT?!1:(t.event==="ready"&&t.value&&t.value.src===this.elem.src&&this.ready(t),this.keeper.has(t.event,t.listener)&&this.keeper.execute(t.event,t.listener,t.value,this),!0)}ready(e){if(this.isReady===!0)return!1;e.value.events&&(this.events=e.value.events),e.value.methods&&(this.methods=e.value.methods),this.isReady=!0,this.loaded=!0;for(let t=0;t<this.queue.length;t++){let n=this.queue[t];this.debug&&console.debug("Player.dequeue",n),e.event==="ready"&&this.keeper.execute(n.event||"",n.listener,!0,this),this.send(n)}return this.queue=[],!0}on(e,t,n){let o=r.generateUUID();return e==="ready"?this.keeper.one(o,e,t,n):this.keeper.on(o,e,t,n),this.send({method:"addEventListener",value:e,listener:o}),!0}off(e,t){let n=this.keeper.off(e,t);if(this.debug&&console.debug("Player.off",n),n.length>0){for(let o in n)this.send({method:"removeEventListener",value:e,listener:n[o]});return!0}return!1}supports(e,t){r.assert(["method","event"].includes(e),'evtOrMethod needs to be either "event" or "method" got '+e),t=r.isArray(t)?t:[t];let n=e==="event"?this.events:this.methods;for(let o=0;o<t.length;o++)if(!n.includes(t[o]))return!1;return!0}};function w(i){return function(...e){let t={method:i};if(/^get/.test(i))if(e.length>0&&typeof e[0]=="function"){let n=e[0];this.send(t,n,e[1]);return}else return new Promise((n,o)=>{this.send(t,s=>{n(s)})});else return/^set/.test(i)&&(r.assert(e.length!==0,"Set methods require a value."),t.value=e[0]),new Promise((n,o)=>{["play","pause","mute","unmute"].includes(i)?(this.send(t),n()):this.send(t,()=>{n()})})}}for(let i of r.METHODS.all())Object.prototype.hasOwnProperty.call(f.prototype,i)||(f.prototype[i]=w(i));r.addEvent(window,"message",function(i){let e;try{e=JSON.parse(i.data)}catch(t){return!1}if(e.context!==r.CONTEXT)return!1;e.event==="ready"&&e.value&&e.value.src&&p.push(e.value.src)});var T=f;var b=class{constructor(e,t){let n=this;this.isReady=!1,document.referrer?this.origin=new URL(document.referrer).origin:this.origin="*",this.methods={},this.supported={events:e||r.EVENTS.all(),methods:t||r.METHODS.all()},this.eventListeners={},this.reject=!(window.self!==window.top&&r.POST_MESSAGE),this.reject||r.addEvent(window,"message",function(o){n.receive(o)})}receive(e){if(e.origin!==this.origin)return!1;let t={};if(typeof e.data=="object")t=e.data;else try{t=window.JSON.parse(e.data)}catch(o){console.error("JSON Parse Error",o)}if(console.debug("Receiver.receive",e,t),!t.method||t.context!==r.CONTEXT)return!1;if(!r.METHODS.all().includes(t.method))return this.emit("error",{code:2,msg:'Invalid Method "'+t.method+'"'}),!1;let n=r.isNone(t.listener)?null:t.listener;if(t.method==="addEventListener")Object.prototype.hasOwnProperty.call(this.eventListeners,t.value)?this.eventListeners[t.value].includes(n)||this.eventListeners[t.value].push(n):this.eventListeners[t.value]=[n],t.value==="ready"&&this.isReady&&this.ready();else if(t.method==="removeEventListener"){if(Object.prototype.hasOwnProperty.call(this.eventListeners,t.value)){let o=this.eventListeners[t.value].indexOf(n);o>-1&&this.eventListeners[t.value].splice(o,1),this.eventListeners[t.value].length===0&&delete this.eventListeners[t.value]}}else this.get(t.method,t.value,n);return!0}get(e,t,n){let o=this;if(!Object.prototype.hasOwnProperty.call(this.methods,e))return this.emit("error",{code:3,msg:'Method Not Supported "'+e+'"'}),!1;let s=this.methods[e];if(e.substr(0,3)==="get"){let a=function(c){o.send(e,c,n)};s.call(this,a)}else s.call(this,t);return!0}on(e,t){this.methods[e]=t}send(e,t,n){if(console.debug("Receiver.send",e,t,n),this.reject)return console.error("Receiver.send.reject",e,t,n),!1;let o={context:r.CONTEXT,version:r.VERSION,event:e};r.isNone(t)||(o.value=t),r.isNone(n)||(o.listener=n);let s=JSON.stringify(o);return window.parent.postMessage(s,this.origin===""?"*":this.origin),!0}emit(e,t){if(!Object.prototype.hasOwnProperty.call(this.eventListeners,e))return!1;console.debug("Instance.emit",e,t,this.eventListeners[e]);for(let n=0;n<this.eventListeners[e].length;n++){let o=this.eventListeners[e][n];this.send(e,t,o)}return!0}ready(){console.debug("Receiver.ready"),this.isReady=!0;let e={src:window.location.toString(),events:this.supported.events,methods:this.supported.methods};this.emit("ready",e)||this.send("ready",e)}},d=b;var g=class{constructor(){this.init()}init(){let e={duration:20,currentTime:0,interval:null,timeupdate:function(){},volume:100,mute:!1,playing:!1,loop:!1,playbackRate:1,play:function(){e.interval=setInterval(function(){e.currentTime+=.25,e.timeupdate({seconds:e.currentTime,duration:e.duration})},250),e.playing=!0},pause:function(){e.interval&&clearInterval(e.interval),e.playing=!1}},t=this.receiver=new d;t.on("play",function(){let n=this;e.play(),this.emit("play"),e.timeupdate=function(o){n.emit("timeupdate",o)}}),t.on("pause",function(){e.pause(),this.emit("pause")}),t.on("getPaused",function(n){let o=!e.playing;n(o)}),t.on("getCurrentTime",function(n){n(e.currentTime)}),t.on("setCurrentTime",function(n){e.currentTime=n}),t.on("getDuration",function(n){n(e.duration)}),t.on("getVolume",function(n){n(e.volume)}),t.on("setVolume",function(n){e.volume=n}),t.on("mute",function(){e.mute=!0}),t.on("unmute",function(){e.mute=!1}),t.on("getMuted",function(n){n(e.mute)}),t.on("getLoop",function(n){n(e.loop)}),t.on("setLoop",function(n){e.loop=n}),t.on("setPlaybackRate",function(n){e.playbackRate=n}),t.on("getPlaybackRate",function(n){n(e.playbackRate)})}ready(){this.receiver.ready()}},P=g;var v=class{constructor(e){this.init(e)}init(e){r.assert(e,"VideoJSReceiver requires a player object");let t=this.receiver=new d;e.on("pause",function(){t.emit("pause")}),e.on("play",function(){t.emit("play")}),e.on("timeupdate",function(){let n=e.currentTime(),o=e.duration();if(!n||!o)return!1;let s={seconds:n,duration:o};t.emit("timeupdate",s)}),e.on("ended",function(){t.emit("ended")}),e.on("error",function(){t.emit("error")}),t.on("play",function(){e.play()}),t.on("pause",function(){e.pause()}),t.on("getPaused",function(n){n(e.paused())}),t.on("getCurrentTime",function(n){n(e.currentTime())}),t.on("setCurrentTime",function(n){e.currentTime(n)}),t.on("getDuration",function(n){n(e.duration())}),t.on("getVolume",function(n){let o=e.volume()*100;n(o)}),t.on("setVolume",function(n){e.volume(n/100)}),t.on("mute",function(){e.volume(0)}),t.on("unmute",function(){e.volume(1)}),t.on("getMuted",function(n){let o=e.volume()===0;n(o)}),t.on("getLoop",function(n){n(e.loop())}),t.on("setLoop",function(n){e.loop(n)}),t.on("setPlaybackRate",function(n){e.playbackRate(n)}),t.on("getPlaybackRate",function(n){n(e.playbackRate())})}ready(){this.receiver.ready()}},M=v;var y=class{constructor(e){this.init(e)}init(e){r.assert(e,"HTML5Adapter requires a video element");let t=this.receiver=new d;e.addEventListener("playing",function(){t.emit("play")}),e.addEventListener("pause",function(){t.emit("pause")}),e.addEventListener("ended",function(){t.emit("ended")}),e.addEventListener("timeupdate",function(){t.emit("timeupdate",{seconds:e.currentTime,duration:e.duration})}),e.addEventListener("progress",function(){t.emit("buffered",{percent:e.buffered.length})}),t.on("play",function(){e.play()}),t.on("pause",function(){e.pause()}),t.on("getPaused",function(n){n(e.paused)}),t.on("getCurrentTime",function(n){n(e.currentTime)}),t.on("setCurrentTime",function(n){e.currentTime=n}),t.on("getDuration",function(n){n(e.duration)}),t.on("getVolume",function(n){let o=e.volume*100;n(o)}),t.on("setVolume",function(n){e.volume=n/100}),t.on("mute",function(){e.muted=!0}),t.on("unmute",function(){e.muted=!1}),t.on("getMuted",function(n){n(e.muted)}),t.on("getLoop",function(n){n(e.loop)}),t.on("setLoop",function(n){e.loop=n}),t.on("setPlaybackRate",function(n){e.playbackRate=n}),t.on("getPlaybackRate",function(n){n(e.playbackRate)})}ready(){this.receiver.ready()}},R=y;var S={Player:T,Receiver:d,MockAdapter:P,VideoJSAdapter:M,HTML5Adapter:R,CONTEXT:r.CONTEXT,VERSION:r.VERSION,METHODS:r.METHODS,addEvent:r.addEvent};typeof window!="undefined"&&(window.playerjs=S);var A=S;
1
+ "use strict";var p=Object.defineProperty;var k=Object.getOwnPropertyDescriptor;var C=Object.getOwnPropertyNames;var N=Object.prototype.hasOwnProperty;var D=(o,e)=>{for(var t in e)p(o,t,{get:e[t],enumerable:!0})},w=(o,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of C(e))!N.call(o,n)&&n!==t&&p(o,n,{get:()=>e[n],enumerable:!(r=k(e,n))||r.enumerable});return o};var A=o=>w(p({},"__esModule",{value:!0}),o);var U={};D(U,{default:()=>I});module.exports=A(U);var l={EVENTS:{READY:"ready",PLAY:"play",PAUSE:"pause",ENDED:"ended",TIMEUPDATE:"timeupdate",PROGRESS:"progress",SEEKED:"seeked",ERROR:"error",FULLSCREEN_CHANGE:"fullscreenChange",PIP_CHANGE:"pipChange",PLAYBACK_RATE_CHANGE:"playbackRateChange",AUDIO_CHANGE:"audioChange",QUALITY_CHANGE:"qualityChange",VOLUME_CHANGE:"volumeChange",all(){let o=[];for(let e in l.EVENTS)l.has(l.EVENTS,e)&&l.isString(l.EVENTS[e])&&o.push(l.EVENTS[e]);return o}},POST_MESSAGE:!!window.postMessage,METHODS:{PLAY:"play",PAUSE:"pause",GETPAUSED:"getPaused",MUTE:"mute",UNMUTE:"unmute",GETMUTED:"getMuted",SETVOLUME:"setVolume",GETVOLUME:"getVolume",GETDURATION:"getDuration",SETCURRENTTIME:"setCurrentTime",GETCURRENTTIME:"getCurrentTime",SETLOOP:"setLoop",GETLOOP:"getLoop",SETPLAYBACKRATE:"setPlaybackRate",GETPLAYBACKRATE:"getPlaybackRate",REMOVEEVENTLISTENER:"removeEventListener",ADDEVENTLISTENER:"addEventListener",all(){let o=[];for(let e in l.METHODS)l.has(l.METHODS,e)&&l.isString(l.METHODS[e])&&o.push(l.METHODS[e]);return o}},DEBUG:!1,VERSION:"2.0",CONTEXT:"player.js",isString(o){return Object.prototype.toString.call(o)==="[object String]"},has(o,e){return Object.hasOwn(o,e)},addEvent(o,e,t){o&&(o.addEventListener?o.addEventListener(e,t,!1):o.attachEvent?o.attachEvent(`on${e}`,t):o[`on${e}`]=t)},isNone(o){return o==null},assert(o,e){if(!o)throw e||"Player.js Assert Failed"},generateUUID(){if(crypto!=null&&crypto.randomUUID)return crypto.randomUUID();{let o=URL.createObjectURL(new Blob);return o.substring(o.lastIndexOf("/")+1)}},isArray(o){return Object.prototype.toString.call(o)==="[object Array]"}},i=l;var g=class{constructor(){this.data={}}has(e,t){if(!Object.hasOwn(this.data,e))return!1;if(i.isNone(t))return!0;let r=this.data[e];for(let n=0;n<r.length;n++)if(r[n].id===t)return!0;return!1}add(e,t,r,n,s=!1){let a={id:e,event:t,cb:r,ctx:n,one:s};this.has(t)?this.data[t].push(a):this.data[t]=[a]}execute(e,t,r,n){if(!this.has(e,t))return!1;let s=[],a=[];for(let c=0;c<this.data[e].length;c++){let u=this.data[e][c];i.isNone(t)||!i.isNone(t)&&u.id===t?(a.push({cb:u.cb,ctx:u.ctx?u.ctx:n,data:r}),u.one===!1&&s.push(u)):s.push(u)}s.length===0?delete this.data[e]:this.data[e]=s;for(let c=0;c<a.length;c++){let u=a[c];u.cb.call(u.ctx,u.data)}return!0}on(e,t,r,n){this.add(e,t,r,n,!1)}one(e,t,r,n){this.add(e,t,r,n,!0)}off(e,t){let r=[];if(!Object.hasOwn(this.data,e))return r;let n=[];for(let s=0;s<this.data[e].length;s++){let a=this.data[e][s];!i.isNone(t)&&a.cb!==t?n.push(a):i.isNone(a.id)||r.push(a.id)}return n.length===0?delete this.data[e]:this.data[e]=n,r}},P=g;var b=class{constructor(e=!1){this.enabled=e}setEnabled(e){this.enabled=e}isEnabled(){return this.enabled}debug(...e){this.enabled&&console.debug(...e)}log(...e){this.enabled&&console.log(...e)}warn(...e){this.enabled&&console.warn(...e)}error(...e){this.enabled&&console.error(...e)}};var h=b;var f=[],m=class{constructor(e,t=!1){if(this.READIED=f,i.isString(e)){let r=document.getElementById(e);if(!r)throw new Error(`Element with id "${e}" not found`);e=r}this.elem=e,this.debug=t,this.logger=new h(t),i.assert(e.nodeName==="IFRAME",'playerjs.Player constructor requires an Iframe, got "'+e.nodeName+'"'),i.assert(e.src,"playerjs.Player constructor requires a Iframe with a 'src' attribute."),this.origin=new URL(e.src).origin,this.keeper=new P,this.isReady=!1,this.queue=[],this.events=i.EVENTS.all(),this.methods=i.METHODS.all(),i.POST_MESSAGE?i.addEvent(window,"message",r=>{this.receive(r)}):this.logger.error("Post Message is not Available."),f.includes(e.src)?this.loaded=!0:this.elem.onload=()=>{this.loaded=!0}}send(e,t,r){if(e.context=i.CONTEXT,e.version=i.VERSION,t){let n=i.generateUUID();e.listener=n,this.keeper.one(n,e.method||"",t,r)}return!this.isReady&&e.value!=="ready"?(this.logger.debug("Player.queue",e),this.queue.push(e),!1):(this.logger.debug("Player.send",e,this.origin),this.loaded===!0&&this.elem.contentWindow&&this.elem.contentWindow.postMessage(JSON.stringify(e),this.origin),!0)}receive(e){if(this.logger.debug("Player.receive",e),e.origin!==this.origin)return!1;let t;try{t=JSON.parse(e.data)}catch(r){return!1}return t.context!==i.CONTEXT?!1:(t.event==="ready"&&t.value&&t.value.src===this.elem.src&&this.ready(t),this.keeper.has(t.event,t.listener)&&this.keeper.execute(t.event,t.listener,t.value,this),!0)}ready(e){if(this.isReady===!0)return!1;e.value.events&&(this.events=e.value.events),e.value.methods&&(this.methods=e.value.methods),this.isReady=!0,this.loaded=!0;for(let t=0;t<this.queue.length;t++){let r=this.queue[t];this.logger.debug("Player.dequeue",r),e.event==="ready"&&this.keeper.execute(r.event||"",r.listener,!0,this),this.send(r)}return this.queue=[],!0}on(e,t,r){let n=i.generateUUID();return e==="ready"?this.keeper.one(n,e,t,r):this.keeper.on(n,e,t,r),this.send({method:"addEventListener",value:e,listener:n}),!0}off(e,t){let r=this.keeper.off(e,t);if(this.logger.debug("Player.off",r),r.length>0){for(let n in r)this.send({method:"removeEventListener",value:e,listener:r[n]});return!0}return!1}supports(e,t){i.assert(["method","event"].includes(e),'evtOrMethod needs to be either "event" or "method" got '+e),t=i.isArray(t)?t:[t];let r=e==="event"?this.events:this.methods;for(let n=0;n<t.length;n++)if(!r.includes(t[n]))return!1;return!0}};function V(o){return function(...e){let t={method:o};if(/^get/.test(o))if(e.length>0&&typeof e[0]=="function"){let r=e[0];this.send(t,r,e[1]);return}else return new Promise(r=>{this.send(t,n=>{r(n)})});else return/^set/.test(o)&&(i.assert(e.length!==0,"Set methods require a value."),t.value=e[0]),new Promise(r=>{["play","pause","mute","unmute"].includes(o)?(this.send(t),r()):this.send(t,()=>{r()})})}}for(let o of i.METHODS.all())Object.hasOwn(m.prototype,o)||(m.prototype[o]=V(o));i.addEvent(window,"message",o=>{let e;try{e=JSON.parse(o.data)}catch(t){return!1}if(e.context!==i.CONTEXT)return!1;e.event==="ready"&&e.value&&e.value.src&&f.push(e.value.src)});var M=m;var v=class{constructor(e,t,r=!1){this.isReady=!1,this.debug=r,this.logger=new h(r),document.referrer?this.origin=new URL(document.referrer).origin:this.origin="*",this.methods={},this.supported={events:e||i.EVENTS.all(),methods:t||i.METHODS.all()},this.eventListeners={},this.reject=!(window.self!==window.top&&i.POST_MESSAGE),this.reject||i.addEvent(window,"message",n=>{this.receive(n)})}receive(e){if(e.origin!==this.origin)return!1;let t={};if(typeof e.data=="object")t=e.data;else try{t=window.JSON.parse(e.data)}catch(n){this.logger.error("JSON Parse Error",n)}if(this.logger.debug("Receiver.receive",e,t),!t.method||t.context!==i.CONTEXT)return!1;if(!i.METHODS.all().includes(t.method))return this.emit("error",{code:2,msg:'Invalid Method "'+t.method+'"'}),!1;let r=i.isNone(t.listener)?null:t.listener;if(t.method==="addEventListener")Object.hasOwn(this.eventListeners,t.value)?this.eventListeners[t.value].includes(r)||this.eventListeners[t.value].push(r):this.eventListeners[t.value]=[r],t.value==="ready"&&this.isReady&&this.ready();else if(t.method==="removeEventListener"){if(Object.hasOwn(this.eventListeners,t.value)){let n=this.eventListeners[t.value].indexOf(r);n>-1&&this.eventListeners[t.value].splice(n,1),this.eventListeners[t.value].length===0&&delete this.eventListeners[t.value]}}else this.get(t.method,t.value,r);return!0}get(e,t,r){if(!Object.hasOwn(this.methods,e))return this.emit("error",{code:3,msg:'Method Not Supported "'+e+'"'}),!1;let n=this.methods[e];if(e.substr(0,3)==="get"){let s=a=>{this.send(e,a,r)};n.call(this,s)}else n.call(this,t);return!0}on(e,t){this.methods[e]=t}send(e,t,r){if(this.logger.debug("Receiver.send",e,t,r),this.reject)return this.logger.error("Receiver.send.reject",e,t,r),!1;let n={context:i.CONTEXT,version:i.VERSION,event:e};i.isNone(t)||(n.value=t),i.isNone(r)||(n.listener=r);let s=JSON.stringify(n);return window.parent.postMessage(s,this.origin===""?"*":this.origin),!0}emit(e,t){if(!Object.hasOwn(this.eventListeners,e))return!1;this.logger.debug("Receiver.emit",e,t,this.eventListeners[e]);for(let r=0;r<this.eventListeners[e].length;r++){let n=this.eventListeners[e][r];this.send(e,t,n)}return!0}ready(){this.logger.debug("Receiver.ready"),this.isReady=!0;let e={src:window.location.toString(),events:this.supported.events,methods:this.supported.methods};this.emit("ready",e)||this.send("ready",e)}},d=v;var y=class{constructor(){this.init()}init(){let e={duration:20,currentTime:0,interval:null,timeupdate:()=>{},volume:100,mute:!1,playing:!1,loop:!1,playbackRate:1,play:()=>{e.interval=setInterval(()=>{e.currentTime+=.25,e.timeupdate({seconds:e.currentTime,duration:e.duration})},250),e.playing=!0},pause:()=>{e.interval&&clearInterval(e.interval),e.playing=!1}},t=new d;this.receiver=t,t.on("play",function(){e.play(),this.emit("play"),e.timeupdate=r=>{this.emit("timeupdate",r)}}),t.on("pause",function(){e.pause(),this.emit("pause")}),t.on("getPaused",r=>{let n=!e.playing;r(n)}),t.on("getCurrentTime",r=>{r(e.currentTime)}),t.on("setCurrentTime",r=>{e.currentTime=r}),t.on("getDuration",r=>{r(e.duration)}),t.on("getVolume",r=>{r(e.volume)}),t.on("setVolume",r=>{e.volume=r}),t.on("mute",()=>{e.mute=!0}),t.on("unmute",()=>{e.mute=!1}),t.on("getMuted",r=>{r(e.mute)}),t.on("getLoop",r=>{r(e.loop)}),t.on("setLoop",r=>{e.loop=r}),t.on("setPlaybackRate",r=>{e.playbackRate=r}),t.on("getPlaybackRate",r=>{r(e.playbackRate)})}ready(){this.receiver.ready()}},R=y;var E=class{constructor(e){this.init(e)}init(e){i.assert(e,"VideoJSReceiver requires a player object");let t=new d;this.receiver=t,e.on("pause",()=>{t.emit("pause")}),e.on("play",()=>{t.emit("play")}),e.on("timeupdate",()=>{let r=e.currentTime(),n=e.duration();if(!r||!n)return!1;let s={seconds:r,duration:n};t.emit("timeupdate",s)}),e.on("ended",()=>{t.emit("ended")}),e.on("error",()=>{t.emit("error")}),t.on("play",()=>{e.play()}),t.on("pause",()=>{e.pause()}),t.on("getPaused",r=>{r(e.paused())}),t.on("getCurrentTime",r=>{r(e.currentTime())}),t.on("setCurrentTime",r=>{e.currentTime(r)}),t.on("getDuration",r=>{r(e.duration())}),t.on("getVolume",r=>{let n=e.volume()*100;r(n)}),t.on("setVolume",r=>{e.volume(r/100)}),t.on("mute",()=>{e.volume(0)}),t.on("unmute",()=>{e.volume(1)}),t.on("getMuted",r=>{let n=e.volume()===0;r(n)}),t.on("getLoop",r=>{r(e.loop())}),t.on("setLoop",r=>{e.loop(r)}),t.on("setPlaybackRate",r=>{e.playbackRate(r)}),t.on("getPlaybackRate",r=>{r(e.playbackRate())})}ready(){this.receiver.ready()}},S=E;var T=class{constructor(e){this.init(e)}init(e){i.assert(e,"HTML5Adapter requires a video element");let t=new d;this.receiver=t,e.addEventListener("playing",()=>{t.emit("play")}),e.addEventListener("pause",()=>{t.emit("pause")}),e.addEventListener("ended",()=>{t.emit("ended")}),e.addEventListener("timeupdate",()=>{t.emit("timeupdate",{seconds:e.currentTime,duration:e.duration})}),e.addEventListener("progress",()=>{t.emit("buffered",{percent:e.buffered.length})}),t.on("play",()=>{e.play()}),t.on("pause",()=>{e.pause()}),t.on("getPaused",r=>{r(e.paused)}),t.on("getCurrentTime",r=>{r(e.currentTime)}),t.on("setCurrentTime",r=>{e.currentTime=r}),t.on("getDuration",r=>{r(e.duration)}),t.on("getVolume",r=>{let n=e.volume*100;r(n)}),t.on("setVolume",r=>{e.volume=r/100}),t.on("mute",()=>{e.muted=!0}),t.on("unmute",()=>{e.muted=!1}),t.on("getMuted",r=>{r(e.muted)}),t.on("getLoop",r=>{r(e.loop)}),t.on("setLoop",r=>{e.loop=r}),t.on("setPlaybackRate",r=>{e.playbackRate=r}),t.on("getPlaybackRate",r=>{r(e.playbackRate)})}ready(){this.receiver.ready()}},L=T;var O={Player:M,Receiver:d,MockAdapter:R,VideoJSAdapter:S,HTML5Adapter:L,CONTEXT:i.CONTEXT,VERSION:i.VERSION,METHODS:i.METHODS,addEvent:i.addEvent};typeof window!="undefined"&&(window.playerjs=O);var I=O;
2
2
  //# sourceMappingURL=main.cjs.map
package/dist/main.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/main.ts","../src/core.ts","../src/keeper.ts","../src/player.ts","../src/receiver.ts","../src/adapters/mock.ts","../src/adapters/video.ts","../src/adapters/html.ts"],"sourcesContent":["import core from './core'\nimport Player from './player'\nimport Receiver from './receiver'\nimport MockAdapter from './adapters/mock'\nimport VideoJSAdapter from './adapters/video'\nimport HTML5Adapter from './adapters/html'\nimport { PlayerMethods } from './types'\n\ninterface PlayerJS {\n Player: typeof Player\n Receiver: typeof Receiver\n MockAdapter: typeof MockAdapter\n VideoJSAdapter: typeof VideoJSAdapter\n HTML5Adapter: typeof HTML5Adapter\n CONTEXT: string\n VERSION: string\n METHODS: PlayerMethods\n addEvent: typeof core.addEvent\n}\n\nconst playerjs: PlayerJS = {\n Player,\n Receiver,\n MockAdapter,\n VideoJSAdapter,\n HTML5Adapter,\n CONTEXT: core.CONTEXT,\n VERSION: core.VERSION,\n METHODS: core.METHODS,\n addEvent: core.addEvent\n}\n\n// Attach to the window object explicitly\ndeclare global {\n interface Window {\n playerjs: PlayerJS\n }\n}\n\nif (typeof window !== 'undefined') {\n window.playerjs = playerjs\n}\n\nexport default playerjs\n","import { PlayerEvents, PlayerMethods, Core } from './types'\n\nconst core: Core = {\n EVENTS: {\n READY: 'ready',\n PLAY: 'play',\n PAUSE: 'pause',\n ENDED: 'ended',\n TIMEUPDATE: 'timeupdate',\n PROGRESS: 'progress',\n SEEKED: 'seeked',\n ERROR: 'error',\n FULLSCREEN_CHANGE: 'fullscreenChange',\n PIP_CHANGE: 'pipChange',\n PLAYBACK_RATE_CHANGE: 'playbackRateChange',\n AUDIO_CHANGE: 'audioChange',\n QUALITY_CHANGE: 'qualityChange',\n VOLUME_CHANGE: 'volumeChange',\n all(): string[] {\n const all: string[] = []\n for (const key in core.EVENTS) {\n if (core.has(core.EVENTS, key) && core.isString((core.EVENTS as any)[key])) {\n all.push((core.EVENTS as any)[key])\n }\n }\n return all\n }\n } as PlayerEvents,\n\n POST_MESSAGE: !!window.postMessage,\n\n METHODS: {\n PLAY: 'play',\n PAUSE: 'pause',\n GETPAUSED: 'getPaused',\n MUTE: 'mute',\n UNMUTE: 'unmute',\n GETMUTED: 'getMuted',\n SETVOLUME: 'setVolume',\n GETVOLUME: 'getVolume',\n GETDURATION: 'getDuration',\n SETCURRENTTIME: 'setCurrentTime',\n GETCURRENTTIME: 'getCurrentTime',\n SETLOOP: 'setLoop',\n GETLOOP: 'getLoop',\n SETPLAYBACKRATE: 'setPlaybackRate',\n GETPLAYBACKRATE: 'getPlaybackRate',\n REMOVEEVENTLISTENER: 'removeEventListener',\n ADDEVENTLISTENER: 'addEventListener',\n all(): string[] {\n const all: string[] = []\n for (const key in core.METHODS) {\n if (core.has(core.METHODS, key) && core.isString((core.METHODS as any)[key])) {\n all.push((core.METHODS as any)[key])\n }\n }\n return all\n }\n } as PlayerMethods,\n\n DEBUG: false,\n VERSION: '2.0',\n CONTEXT: 'player.js',\n\n isString(obj: any): obj is string {\n return Object.prototype.toString.call(obj) === '[object String]'\n },\n\n has(obj: object, key: string): boolean {\n return Object.prototype.hasOwnProperty.call(obj, key)\n },\n\n addEvent(elem: any, type: string, eventHandle: (e: any) => void): void {\n if (!elem) { return }\n if (elem.addEventListener) {\n elem.addEventListener(type, eventHandle, false)\n } else if (elem.attachEvent) {\n elem.attachEvent('on' + type, eventHandle)\n } else {\n elem['on' + type] = eventHandle\n }\n },\n\n isNone(obj: any): obj is null | undefined {\n return (obj === null || obj === undefined)\n },\n\n assert(test: any, msg?: string): asserts test {\n if (!test) {\n throw msg || 'Player.js Assert Failed'\n }\n },\n\n generateUUID(): string {\n if (crypto && crypto.randomUUID) {\n return crypto.randomUUID()\n } else {\n const url = URL.createObjectURL(new Blob())\n return url.substring(url.lastIndexOf('/') + 1)\n }\n },\n\n isArray(obj: any): obj is any[] {\n return Object.prototype.toString.call(obj) === '[object Array]'\n }\n}\n\nexport default core\n","/*\n* Keeper is just a method for keeping track of all the callbacks.\n*/\nimport core from './core'\nimport { KeeperData, EventCallback } from './types'\n\nclass Keeper {\n private data: { [event: string]: KeeperData[] }\n\n constructor() {\n this.data = {}\n }\n\n has(event: string, id?: string): boolean {\n if (!Object.prototype.hasOwnProperty.call(this.data, event)) {\n return false\n }\n\n if (core.isNone(id)) {\n return true\n }\n\n // Figure out if we have the event.\n const events = this.data[event]\n\n for (let i = 0; i < events.length; i++) {\n if (events[i].id === id) {\n return true\n }\n }\n\n return false\n }\n\n add(id: string, event: string, cb: EventCallback, ctx?: any, one: boolean = false): void {\n const d: KeeperData = {\n id,\n event,\n cb,\n ctx,\n one\n }\n\n if (this.has(event)) {\n this.data[event].push(d)\n } else {\n this.data[event] = [d]\n }\n }\n\n execute(event: string, id?: string, data?: any, ctx?: any): boolean {\n if (!this.has(event, id)) {\n return false\n }\n\n const keep: KeeperData[] = []\n const execute: Array<{cb: EventCallback, ctx: any, data: any}> = []\n\n for (let i = 0; i < this.data[event].length; i++) {\n const d = this.data[event][i]\n\n // There are omni events, in that they do not have an id. i.e \"ready\".\n // Or there is an ID and we only want to execute the right id'd method.\n if (core.isNone(id) || (!core.isNone(id) && d.id === id)) {\n execute.push({\n cb: d.cb,\n ctx: d.ctx ? d.ctx : ctx,\n data\n })\n\n // If we only wanted to execute this once.\n if (d.one === false) {\n keep.push(d)\n }\n } else {\n keep.push(d)\n }\n }\n\n if (keep.length === 0) {\n delete this.data[event]\n } else {\n this.data[event] = keep\n }\n\n // We need to execute everything after we deal with the one stuff. otherwise\n // we have issues to order of operations.\n for (let n = 0; n < execute.length; n++) {\n const e = execute[n]\n e.cb.call(e.ctx, e.data)\n }\n\n return true\n }\n\n on(id: string, event: string, cb: EventCallback, ctx?: any): void {\n this.add(id, event, cb, ctx, false)\n }\n\n one(id: string, event: string, cb: EventCallback, ctx?: any): void {\n this.add(id, event, cb, ctx, true)\n }\n\n off(event: string, cb?: EventCallback): string[] {\n // We should probably restructure so this is a bit less of a pain.\n const listeners: string[] = []\n\n if (!Object.prototype.hasOwnProperty.call(this.data, event)) {\n return listeners\n }\n\n const keep: KeeperData[] = []\n\n // Loop through everything.\n for (let i = 0; i < this.data[event].length; i++) {\n const data = this.data[event][i]\n // If we only keep if there was a CB and the CB is there.\n if (!core.isNone(cb) && data.cb !== cb) {\n keep.push(data)\n } else if (!core.isNone(data.id)) {\n listeners.push(data.id)\n }\n }\n\n if (keep.length === 0) {\n delete this.data[event]\n } else {\n this.data[event] = keep\n }\n\n return listeners\n }\n}\n\nexport default Keeper\n","/*\n* Player.js is a javascript library for interacting with iframes via\n* postMessage that use an Open Player Spec\n*\n*/\nimport core from './core'\nimport Keeper from './keeper'\nimport { PlayerData, ReadyData, EventCallback, MethodCallback, GetMethodPromise, SetMethodPromise } from './types'\n\nconst READIED: string[] = []\n\nclass Player {\n public READIED: string[]\n public elem: HTMLIFrameElement\n public debug: boolean\n public origin: string\n public keeper: Keeper\n public isReady: boolean\n public queue: PlayerData[]\n public events: string[]\n public methods: string[]\n public loaded?: boolean\n\n constructor(elem: string | HTMLIFrameElement, debug: boolean = false) {\n const self = this\n this.READIED = READIED\n\n if (core.isString(elem)) {\n const element = document.getElementById(elem) as HTMLIFrameElement\n if (!element) {\n throw new Error(`Element with id \"${elem}\" not found`)\n }\n elem = element\n }\n\n this.elem = elem\n\n this.debug = debug\n\n // make sure we have an iframe\n core.assert(elem.nodeName === 'IFRAME',\n 'playerjs.Player constructor requires an Iframe, got \"' + elem.nodeName + '\"')\n core.assert(elem.src,\n 'playerjs.Player constructor requires a Iframe with a \\'src\\' attribute.')\n\n // Figure out the origin of where we are sending messages.\n this.origin = (new URL(elem.src)).origin\n\n // Event handling.\n this.keeper = new Keeper()\n\n // Queuing before ready.\n this.isReady = false\n this.queue = []\n\n // Assume that everything is supported, unless we know otherwise.\n this.events = core.EVENTS.all()\n this.methods = core.METHODS.all()\n\n if (core.POST_MESSAGE) {\n // Set up the reciever.\n core.addEvent(window, 'message', function (e: MessageEvent) {\n self.receive(e)\n })\n } else {\n console.error('Post Message is not Available.')\n }\n\n // See if we caught the src event first, otherwise assume we haven't loaded\n if (READIED.includes(elem.src)) {\n self.loaded = true\n } else {\n // Try the onload event, just lets us give another test.\n this.elem.onload = function () {\n self.loaded = true\n }\n }\n }\n\n send(data: PlayerData, callback?: MethodCallback, ctx?: any): boolean {\n // Add the context and version to the data.\n data.context = core.CONTEXT\n data.version = core.VERSION\n\n // We are expecting a response.\n if (callback) {\n // Create a UUID\n const id = core.generateUUID()\n\n // Set the listener.\n data.listener = id\n\n // Only hang on to this listener once.\n this.keeper.one(id, data.method || '', callback, ctx)\n }\n\n if (!this.isReady && data.value !== 'ready') {\n if (this.debug) {\n console.debug('Player.queue', data)\n }\n this.queue.push(data)\n return false\n }\n\n if (this.debug) {\n console.debug('Player.send', data, this.origin)\n }\n\n if (this.loaded === true && this.elem.contentWindow) {\n this.elem.contentWindow.postMessage(JSON.stringify(data), this.origin)\n }\n\n return true\n }\n\n receive(e: MessageEvent): boolean {\n if (this.debug) {\n console.debug('Player.receive', e)\n }\n\n if (e.origin !== this.origin) {\n return false\n }\n\n let data: any\n try {\n data = JSON.parse(e.data)\n } catch (err) {\n // Not a valid response.\n return false\n }\n\n // abort if this message wasn't a player.js message\n if (data.context !== core.CONTEXT) {\n return false\n }\n\n // We need to determine if we are ready.\n if (data.event === 'ready' && data.value && data.value.src === this.elem.src) {\n this.ready(data as ReadyData)\n }\n\n if (this.keeper.has(data.event, data.listener)) {\n this.keeper.execute(data.event, data.listener, data.value, this)\n }\n\n return true\n }\n\n ready(data: ReadyData): boolean {\n if (this.isReady === true) {\n return false\n }\n\n // If we got a list of supported methods, we should set them.\n if (data.value.events) {\n this.events = data.value.events\n }\n if (data.value.methods) {\n this.methods = data.value.methods\n }\n\n // set ready.\n this.isReady = true\n this.loaded = true\n\n // Clear the queue\n for (let i = 0; i < this.queue.length; i++) {\n const obj = this.queue[i]\n\n if (this.debug) {\n console.debug('Player.dequeue', obj)\n }\n\n if (data.event === 'ready') {\n this.keeper.execute(obj.event || '', obj.listener, true, this)\n }\n this.send(obj)\n }\n this.queue = []\n\n return true\n }\n\n on(event: string, callback: EventCallback, ctx?: any): boolean {\n const id = core.generateUUID()\n\n if (event === 'ready') {\n // We only want to call ready once.\n this.keeper.one(id, event, callback, ctx)\n } else {\n this.keeper.on(id, event, callback, ctx)\n }\n\n this.send({\n method: 'addEventListener',\n value: event,\n listener: id\n })\n\n return true\n }\n\n off(event: string, callback?: EventCallback): boolean {\n const listeners = this.keeper.off(event, callback)\n if (this.debug) {\n console.debug('Player.off', listeners)\n }\n\n if (listeners.length > 0) {\n for (const i in listeners) {\n this.send({\n method: 'removeEventListener',\n value: event,\n listener: listeners[i]\n })\n }\n return true\n }\n\n return false\n }\n\n // Based on what ready passed back, we can determine if the events/method are\n // supported by the player.\n supports(evtOrMethod: 'event' | 'method', names: string | string[]): boolean {\n core.assert(['method', 'event'].includes(evtOrMethod),\n 'evtOrMethod needs to be either \"event\" or \"method\" got ' + evtOrMethod)\n\n // Make everything an array.\n names = core.isArray(names) ? names : [names]\n\n const all = evtOrMethod === 'event' ? this.events : this.methods\n\n for (let i = 0; i < names.length; i++) {\n if (!all.includes(names[i])) {\n return false\n }\n }\n\n return true\n }\n\n // Dynamic method generation will be added via the prototype modification below\n // Method overloads for both promise and callback styles\n \n // Play/Pause methods (no return value needed)\n play?(): Promise<void>\n pause?(): Promise<void>\n mute?(): Promise<void>\n unmute?(): Promise<void>\n \n // Getter methods with overloads\n getPaused?(): GetMethodPromise<boolean>\n getPaused?(callback: MethodCallback): void\n \n getMuted?(): GetMethodPromise<boolean>\n getMuted?(callback: MethodCallback): void\n \n getVolume?(): GetMethodPromise<number>\n getVolume?(callback: MethodCallback): void\n \n getDuration?(): GetMethodPromise<number>\n getDuration?(callback: MethodCallback): void\n \n getCurrentTime?(): GetMethodPromise<number>\n getCurrentTime?(callback: MethodCallback): void\n \n getLoop?(): GetMethodPromise<boolean>\n getLoop?(callback: MethodCallback): void\n \n getPlaybackRate?(): GetMethodPromise<number>\n getPlaybackRate?(callback: MethodCallback): void\n \n // Setter methods\n setVolume?(volume: number): SetMethodPromise\n setCurrentTime?(time: number): SetMethodPromise\n setLoop?(loop: boolean): SetMethodPromise\n setPlaybackRate?(rate: number): SetMethodPromise\n}\n\n// create function to add to the Player prototype\nfunction createPrototypeFunction(name: string) {\n return function (this: Player, ...args: any[]): any {\n const data: PlayerData = {\n method: name\n }\n\n // for getters, check if callback is provided or return a promise\n if (/^get/.test(name)) {\n // If a callback is provided, use callback style\n if (args.length > 0 && typeof args[0] === 'function') {\n const callback = args[0]\n this.send(data, callback, args[1])\n return\n } else {\n // Return a promise\n return new Promise((resolve, reject) => {\n this.send(data, (value: any) => {\n resolve(value)\n })\n })\n }\n } else {\n // for setters and action methods, return a promise\n if (/^set/.test(name)) {\n core.assert(args.length !== 0, 'Set methods require a value.')\n data.value = args[0]\n }\n \n // For action methods (play, pause, mute, unmute) and setters, return promise\n return new Promise<void>((resolve, reject) => {\n // For action methods, we don't need to wait for a response\n if (['play', 'pause', 'mute', 'unmute'].includes(name)) {\n this.send(data)\n resolve()\n } else {\n // For setters, we might want to wait for confirmation\n this.send(data, () => {\n resolve()\n })\n }\n })\n }\n }\n}\n\n// Loop through the methods to add them to the prototype.\nfor (const methodName of core.METHODS.all()) {\n if (!Object.prototype.hasOwnProperty.call(Player.prototype, methodName)) {\n (Player.prototype as any)[methodName] = createPrototypeFunction(methodName)\n }\n}\n\ncore.addEvent(window, 'message', function (e: MessageEvent) {\n let data: any\n try {\n data = JSON.parse(e.data)\n } catch (err) {\n return false\n }\n\n // abort if this message wasn't a player.js message\n if (data.context !== core.CONTEXT) {\n return false\n }\n\n // We need to determine if we are ready.\n if (data.event === 'ready' && data.value && data.value.src) {\n READIED.push(data.value.src)\n }\n})\n\nexport default Player\n","/*\n* Does all the wiring up for the backend.\n*\n* var receiver = new playerjs.Receiver();\n* receiver.on('play', function(){ video.play() });\n* receiver.on('getDuration', function(callback){ callback(video.duration) });\n* receiver.emit('timeupdate', {});\n*/\n\nimport core from './core'\nimport { SupportedFeatures, EventCallback, MethodCallback } from './types'\n\nclass Receiver {\n public isReady: boolean\n public origin: string\n public methods: { [method: string]: Function }\n public supported: SupportedFeatures\n public eventListeners: { [event: string]: (string | null)[] }\n public reject: boolean\n\n constructor(events?: string[], methods?: string[]) {\n const self = this\n\n // Deal with the ready crap.\n this.isReady = false\n\n // Bind the window message.\n if (document.referrer) {\n this.origin = (new URL(document.referrer)).origin\n } else {\n this.origin = '*'\n }\n\n // Create a holder for all the methods.\n this.methods = {}\n\n // holds all the information about what's supported\n this.supported = {\n events: events || core.EVENTS.all(),\n methods: methods || core.METHODS.all()\n }\n\n // Deals with the adding and removing of event listeners.\n this.eventListeners = {}\n\n // We can't send any messages.\n this.reject = !(window.self !== window.top && core.POST_MESSAGE)\n\n // We aren't in an iframe, don't listen.\n if (!this.reject) {\n core.addEvent(window, 'message', function (e: MessageEvent) {\n self.receive(e)\n })\n }\n }\n\n receive(e: MessageEvent): boolean {\n // Only want to listen to events that came from our origin.\n if (e.origin !== this.origin) {\n return false\n }\n\n // Browsers that support postMessage also support JSON.\n let data: any = {}\n if (typeof e.data === 'object') {\n data = e.data\n } else {\n try {\n data = window.JSON.parse(e.data)\n } catch (err) {\n console.error('JSON Parse Error', err)\n }\n }\n\n console.debug('Receiver.receive', e, data)\n\n // Nothing for us to do.\n if (!data.method) {\n return false\n }\n\n // make sure the context is correct.\n if (data.context !== core.CONTEXT) {\n return false\n }\n\n // Make sure we have a valid method.\n if (!core.METHODS.all().includes(data.method)) {\n this.emit('error', {\n code: 2,\n msg: 'Invalid Method \"' + data.method + '\"'\n })\n return false\n }\n\n // See if we added a listener\n const listener = !core.isNone(data.listener) ? data.listener : null\n\n // Add Event Listener.\n if (data.method === 'addEventListener') {\n if (Object.prototype.hasOwnProperty.call(this.eventListeners, data.value)) {\n // If the listener is the same, i.e. null only add it once.\n if (!this.eventListeners[data.value].includes(listener)) {\n this.eventListeners[data.value].push(listener)\n }\n } else {\n this.eventListeners[data.value] = [listener]\n }\n\n if (data.value === 'ready' && this.isReady) {\n this.ready()\n }\n } else if (data.method === 'removeEventListener') { // Remove the event listener.\n if (Object.prototype.hasOwnProperty.call(this.eventListeners, data.value)) {\n const index = this.eventListeners[data.value].indexOf(listener)\n\n // if we find the element, remove it.\n if (index > -1) {\n this.eventListeners[data.value].splice(index, 1)\n }\n\n if (this.eventListeners[data.value].length === 0) {\n delete this.eventListeners[data.value]\n }\n }\n } else { // Go get it.\n this.get(data.method, data.value, listener)\n }\n\n return true\n }\n\n get(method: string, value: any, listener: string | null): boolean {\n const self = this\n\n // Now lets do it.\n if (!Object.prototype.hasOwnProperty.call(this.methods, method)) {\n this.emit('error', {\n code: 3,\n msg: 'Method Not Supported \"' + method + '\"'\n })\n return false\n }\n\n const func = this.methods[method]\n\n if (method.substr(0, 3) === 'get') {\n const callback = function (val: any) {\n self.send(method, val, listener)\n }\n func.call(this, callback)\n } else {\n func.call(this, value)\n }\n\n return true\n }\n\n on(event: string, callback: Function): void {\n this.methods[event] = callback\n }\n\n send(event: string, value?: any, listener?: string | null): boolean {\n console.debug('Receiver.send', event, value, listener)\n\n if (this.reject) {\n // We are not in a frame, or we don't support POST_MESSAGE\n console.error('Receiver.send.reject', event, value, listener)\n return false\n }\n\n const data: any = {\n context: core.CONTEXT,\n version: core.VERSION,\n event\n }\n\n if (!core.isNone(value)) {\n data.value = value\n }\n\n if (!core.isNone(listener)) {\n data.listener = listener\n }\n\n const msg = JSON.stringify(data)\n window.parent.postMessage(msg, this.origin === '' ? '*' : this.origin)\n\n return true\n }\n\n emit(event: string, value?: any): boolean {\n if (!Object.prototype.hasOwnProperty.call(this.eventListeners, event)) {\n return false\n }\n\n console.debug('Instance.emit', event, value, this.eventListeners[event])\n\n for (let i = 0; i < this.eventListeners[event].length; i++) {\n const listener = this.eventListeners[event][i]\n this.send(event, value, listener)\n }\n\n return true\n }\n\n ready(): void {\n console.debug('Receiver.ready')\n this.isReady = true\n\n const data = {\n src: window.location.toString(),\n events: this.supported.events,\n methods: this.supported.methods\n }\n\n if (!this.emit('ready', data)) {\n this.send('ready', data)\n }\n }\n}\n\nexport default Receiver\n","import Receiver from '../receiver'\n\ninterface MockVideo {\n duration: number\n currentTime: number\n interval: NodeJS.Timeout | null\n timeupdate: (data: { seconds: number; duration: number }) => void\n volume: number\n mute: boolean\n playing: boolean\n loop: boolean\n playbackRate: number\n play: () => void\n pause: () => void\n}\n\nclass MockAdapter {\n public receiver!: Receiver\n\n constructor() {\n this.init()\n }\n\n init(): void {\n // Our mock video\n const video: MockVideo = {\n duration: 20,\n currentTime: 0,\n interval: null,\n timeupdate: function () {},\n volume: 100,\n mute: false,\n playing: false,\n loop: false,\n playbackRate: 1,\n play: function () {\n video.interval = setInterval(function () {\n video.currentTime += 0.25\n video.timeupdate({\n seconds: video.currentTime,\n duration: video.duration\n })\n }, 250)\n video.playing = true\n },\n pause: function () {\n if (video.interval) {\n clearInterval(video.interval)\n }\n video.playing = false\n }\n }\n\n // Set up the actual receiver\n const receiver = this.receiver = new Receiver()\n\n receiver.on('play', function (this: Receiver) {\n const self = this\n video.play()\n this.emit('play')\n video.timeupdate = function (data: { seconds: number; duration: number }) {\n self.emit('timeupdate', data)\n }\n })\n\n receiver.on('pause', function (this: Receiver) {\n video.pause()\n this.emit('pause')\n })\n\n receiver.on('getPaused', function (callback: (isPaused: boolean) => void) {\n const isPaused = !video.playing\n callback(isPaused)\n })\n\n receiver.on('getCurrentTime', function (callback: (time: number) => void) {\n callback(video.currentTime)\n })\n\n receiver.on('setCurrentTime', function (value: number) {\n video.currentTime = value\n })\n\n receiver.on('getDuration', function (callback: (duration: number) => void) {\n callback(video.duration)\n })\n\n receiver.on('getVolume', function (callback: (volume: number) => void) {\n callback(video.volume)\n })\n\n receiver.on('setVolume', function (value: number) {\n video.volume = value\n })\n\n receiver.on('mute', function () {\n video.mute = true\n })\n\n receiver.on('unmute', function () {\n video.mute = false\n })\n\n receiver.on('getMuted', function (callback: (muted: boolean) => void) {\n callback(video.mute)\n })\n\n receiver.on('getLoop', function (callback: (loop: boolean) => void) {\n callback(video.loop)\n })\n\n receiver.on('setLoop', function (value: boolean) {\n video.loop = value\n })\n\n receiver.on('setPlaybackRate', function (value: number) {\n video.playbackRate = value\n })\n\n receiver.on('getPlaybackRate', function (callback: (rate: number) => void) {\n callback(video.playbackRate)\n })\n }\n\n ready(): void {\n this.receiver.ready()\n }\n}\n\nexport default MockAdapter\n","import core from '../core'\nimport Receiver from '../receiver'\n\n// VideoJS player interface - adjust based on actual VideoJS types if available\ninterface VideoJSPlayer {\n on(event: string, callback: () => void): void\n play(): void\n pause(): void\n paused(): boolean\n currentTime(time?: number): number\n duration(): number\n volume(vol?: number): number\n loop(loop?: boolean): boolean\n playbackRate(rate?: number): number\n}\n\nclass VideoJSAdapter {\n public receiver!: Receiver\n\n constructor(player: VideoJSPlayer) {\n this.init(player)\n }\n\n init(player: VideoJSPlayer): void {\n core.assert(player, 'VideoJSReceiver requires a player object')\n\n // Set up the actual receiver\n const receiver = this.receiver = new Receiver()\n\n /* EVENTS */\n player.on('pause', function () {\n receiver.emit('pause')\n })\n\n player.on('play', function () {\n receiver.emit('play')\n })\n\n player.on('timeupdate', function () {\n const seconds = player.currentTime()\n const duration = player.duration()\n\n if (!seconds || !duration) {\n return false\n }\n\n const value = {\n seconds,\n duration\n }\n receiver.emit('timeupdate', value)\n })\n\n player.on('ended', function () {\n receiver.emit('ended')\n })\n\n player.on('error', function () {\n receiver.emit('error')\n })\n\n /* METHODS */\n receiver.on('play', function () {\n player.play()\n })\n\n receiver.on('pause', function () {\n player.pause()\n })\n\n receiver.on('getPaused', function (callback: (paused: boolean) => void) {\n callback(player.paused())\n })\n\n receiver.on('getCurrentTime', function (callback: (time: number) => void) {\n callback(player.currentTime())\n })\n\n receiver.on('setCurrentTime', function (value: number) {\n player.currentTime(value)\n })\n\n receiver.on('getDuration', function (callback: (duration: number) => void) {\n callback(player.duration())\n })\n\n receiver.on('getVolume', function (callback: (volume: number) => void) {\n const volume = player.volume() * 100\n callback(volume)\n })\n\n receiver.on('setVolume', function (value: number) {\n player.volume(value / 100)\n })\n\n receiver.on('mute', function () {\n player.volume(0)\n })\n\n receiver.on('unmute', function () {\n player.volume(1)\n })\n\n receiver.on('getMuted', function (callback: (muted: boolean) => void) {\n const isMuted = player.volume() === 0\n callback(isMuted)\n })\n\n receiver.on('getLoop', function (callback: (loop: boolean) => void) {\n callback(player.loop())\n })\n\n receiver.on('setLoop', function (value: boolean) {\n player.loop(value)\n })\n\n receiver.on('setPlaybackRate', function (value: number) {\n player.playbackRate(value)\n })\n\n receiver.on('getPlaybackRate', function (callback: (rate: number) => void) {\n callback(player.playbackRate())\n })\n }\n\n ready(): void {\n this.receiver.ready()\n }\n}\n\nexport default VideoJSAdapter\n","import core from '../core'\nimport Receiver from '../receiver'\n\nclass HTML5Adapter {\n public receiver!: Receiver\n\n constructor(video: HTMLVideoElement) {\n this.init(video)\n }\n\n init(video: HTMLVideoElement): void {\n core.assert(video, 'HTML5Adapter requires a video element')\n\n // Set up the actual receiver\n const receiver = this.receiver = new Receiver()\n\n /* EVENTS */\n video.addEventListener('playing', function () {\n receiver.emit('play')\n })\n\n video.addEventListener('pause', function () {\n receiver.emit('pause')\n })\n\n video.addEventListener('ended', function () {\n receiver.emit('ended')\n })\n\n video.addEventListener('timeupdate', function () {\n receiver.emit('timeupdate', {\n seconds: video.currentTime,\n duration: video.duration\n })\n })\n\n video.addEventListener('progress', function () {\n receiver.emit('buffered', {\n percent: video.buffered.length\n })\n })\n\n /* Methods */\n receiver.on('play', function () {\n video.play()\n })\n\n receiver.on('pause', function () {\n video.pause()\n })\n\n receiver.on('getPaused', function (callback: (paused: boolean) => void) {\n callback(video.paused)\n })\n\n receiver.on('getCurrentTime', function (callback: (time: number) => void) {\n callback(video.currentTime)\n })\n\n receiver.on('setCurrentTime', function (value: number) {\n video.currentTime = value\n })\n\n receiver.on('getDuration', function (callback: (duration: number) => void) {\n callback(video.duration)\n })\n\n receiver.on('getVolume', function (callback: (volume: number) => void) {\n const volume = video.volume * 100\n callback(volume)\n })\n\n receiver.on('setVolume', function (value: number) {\n video.volume = value / 100\n })\n\n receiver.on('mute', function () {\n video.muted = true\n })\n\n receiver.on('unmute', function () {\n video.muted = false\n })\n\n receiver.on('getMuted', function (callback: (muted: boolean) => void) {\n callback(video.muted)\n })\n\n receiver.on('getLoop', function (callback: (loop: boolean) => void) {\n callback(video.loop)\n })\n\n receiver.on('setLoop', function (value: boolean) {\n video.loop = value\n })\n\n receiver.on('setPlaybackRate', function (value: number) {\n video.playbackRate = value\n })\n\n receiver.on('getPlaybackRate', function (callback: (rate: number) => void) {\n callback(video.playbackRate)\n })\n }\n\n ready(): void {\n this.receiver.ready()\n }\n}\n\nexport default HTML5Adapter\n"],"mappings":"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","names":["main_exports","__export","main_default","__toCommonJS","core","all","key","obj","elem","type","eventHandle","test","msg","url","core_default","Keeper","event","id","core_default","events","i","cb","ctx","one","d","data","keep","execute","n","e","listeners","keeper_default","READIED","Player","elem","debug","self","core_default","element","keeper_default","e","data","callback","ctx","id","err","i","obj","event","listeners","evtOrMethod","names","all","createPrototypeFunction","name","args","resolve","reject","value","methodName","player_default","Receiver","events","methods","self","core_default","e","data","err","listener","index","method","value","func","callback","val","event","msg","i","receiver_default","MockAdapter","video","receiver","receiver_default","self","data","callback","isPaused","value","mock_default","VideoJSAdapter","player","core_default","receiver","receiver_default","seconds","duration","value","callback","volume","isMuted","video_default","HTML5Adapter","video","core_default","receiver","receiver_default","callback","value","volume","html_default","playerjs","player_default","receiver_default","mock_default","video_default","html_default","core_default","main_default"]}
1
+ {"version":3,"sources":["../src/main.ts","../src/core.ts","../src/keeper.ts","../src/logger.ts","../src/player.ts","../src/receiver.ts","../src/adapters/mock.ts","../src/adapters/video.ts","../src/adapters/html.ts"],"sourcesContent":["import core from './core'\nimport Player from './player'\nimport Receiver from './receiver'\nimport MockAdapter from './adapters/mock'\nimport VideoJSAdapter from './adapters/video'\nimport HTML5Adapter from './adapters/html'\nimport type { PlayerMethods } from './types'\n\ninterface PlayerJS {\n Player: typeof Player\n Receiver: typeof Receiver\n MockAdapter: typeof MockAdapter\n VideoJSAdapter: typeof VideoJSAdapter\n HTML5Adapter: typeof HTML5Adapter\n CONTEXT: string\n VERSION: string\n METHODS: PlayerMethods\n addEvent: typeof core.addEvent\n}\n\nconst playerjs: PlayerJS = {\n Player,\n Receiver,\n MockAdapter,\n VideoJSAdapter,\n HTML5Adapter,\n CONTEXT: core.CONTEXT,\n VERSION: core.VERSION,\n METHODS: core.METHODS,\n addEvent: core.addEvent\n}\n\n// Attach to the window object explicitly\ndeclare global {\n interface Window {\n playerjs: PlayerJS\n }\n}\n\nif (typeof window !== 'undefined') {\n window.playerjs = playerjs\n}\n\nexport default playerjs\n","import type { PlayerEvents, PlayerMethods, Core } from './types'\n\nconst core: Core = {\n EVENTS: {\n READY: 'ready',\n PLAY: 'play',\n PAUSE: 'pause',\n ENDED: 'ended',\n TIMEUPDATE: 'timeupdate',\n PROGRESS: 'progress',\n SEEKED: 'seeked',\n ERROR: 'error',\n FULLSCREEN_CHANGE: 'fullscreenChange',\n PIP_CHANGE: 'pipChange',\n PLAYBACK_RATE_CHANGE: 'playbackRateChange',\n AUDIO_CHANGE: 'audioChange',\n QUALITY_CHANGE: 'qualityChange',\n VOLUME_CHANGE: 'volumeChange',\n all(): string[] {\n const all: string[] = []\n for (const key in core.EVENTS) {\n if (core.has(core.EVENTS, key) && core.isString((core.EVENTS as any)[key])) {\n all.push((core.EVENTS as any)[key])\n }\n }\n return all\n }\n } as PlayerEvents,\n\n POST_MESSAGE: !!window.postMessage,\n\n METHODS: {\n PLAY: 'play',\n PAUSE: 'pause',\n GETPAUSED: 'getPaused',\n MUTE: 'mute',\n UNMUTE: 'unmute',\n GETMUTED: 'getMuted',\n SETVOLUME: 'setVolume',\n GETVOLUME: 'getVolume',\n GETDURATION: 'getDuration',\n SETCURRENTTIME: 'setCurrentTime',\n GETCURRENTTIME: 'getCurrentTime',\n SETLOOP: 'setLoop',\n GETLOOP: 'getLoop',\n SETPLAYBACKRATE: 'setPlaybackRate',\n GETPLAYBACKRATE: 'getPlaybackRate',\n REMOVEEVENTLISTENER: 'removeEventListener',\n ADDEVENTLISTENER: 'addEventListener',\n all(): string[] {\n const all: string[] = []\n for (const key in core.METHODS) {\n if (core.has(core.METHODS, key) && core.isString((core.METHODS as any)[key])) {\n all.push((core.METHODS as any)[key])\n }\n }\n return all\n }\n } as PlayerMethods,\n\n DEBUG: false,\n VERSION: '2.0',\n CONTEXT: 'player.js',\n\n isString(obj: any): obj is string {\n return Object.prototype.toString.call(obj) === '[object String]'\n },\n\n has(obj: object, key: string): boolean {\n return Object.hasOwn(obj, key)\n },\n\n addEvent(elem: any, type: string, eventHandle: (e: any) => void): void {\n if (!elem) { return }\n if (elem.addEventListener) {\n elem.addEventListener(type, eventHandle, false)\n } else if (elem.attachEvent) {\n elem.attachEvent(`on${type}`, eventHandle)\n } else {\n elem[`on${type}`] = eventHandle\n }\n },\n\n isNone(obj: any): obj is null | undefined {\n return (obj === null || obj === undefined)\n },\n\n assert(test: any, msg?: string): asserts test {\n if (!test) {\n throw msg || 'Player.js Assert Failed'\n }\n },\n\n generateUUID(): string {\n if (crypto?.randomUUID) {\n return crypto.randomUUID()\n } else {\n const url = URL.createObjectURL(new Blob())\n return url.substring(url.lastIndexOf('/') + 1)\n }\n },\n\n isArray(obj: any): obj is any[] {\n return Object.prototype.toString.call(obj) === '[object Array]'\n }\n}\n\nexport default core\n","/*\n* Keeper is just a method for keeping track of all the callbacks.\n*/\nimport core from './core'\nimport type { KeeperData, EventCallback } from './types'\n\nclass Keeper {\n private data: { [event: string]: KeeperData[] }\n\n constructor() {\n this.data = {}\n }\n\n has(event: string, id?: string): boolean {\n if (!Object.hasOwn(this.data, event)) {\n return false\n }\n\n if (core.isNone(id)) {\n return true\n }\n\n // Figure out if we have the event.\n const events = this.data[event]\n\n for (let i = 0; i < events.length; i++) {\n if (events[i].id === id) {\n return true\n }\n }\n\n return false\n }\n\n add(id: string, event: string, cb: EventCallback, ctx?: any, one: boolean = false): void {\n const d: KeeperData = {\n id,\n event,\n cb,\n ctx,\n one\n }\n\n if (this.has(event)) {\n this.data[event].push(d)\n } else {\n this.data[event] = [d]\n }\n }\n\n execute(event: string, id?: string, data?: any, ctx?: any): boolean {\n if (!this.has(event, id)) {\n return false\n }\n\n const keep: KeeperData[] = []\n const execute: Array<{cb: EventCallback, ctx: any, data: any}> = []\n\n for (let i = 0; i < this.data[event].length; i++) {\n const d = this.data[event][i]\n\n // There are omni events, in that they do not have an id. i.e \"ready\".\n // Or there is an ID and we only want to execute the right id'd method.\n if (core.isNone(id) || (!core.isNone(id) && d.id === id)) {\n execute.push({\n cb: d.cb,\n ctx: d.ctx ? d.ctx : ctx,\n data\n })\n\n // If we only wanted to execute this once.\n if (d.one === false) {\n keep.push(d)\n }\n } else {\n keep.push(d)\n }\n }\n\n if (keep.length === 0) {\n delete this.data[event]\n } else {\n this.data[event] = keep\n }\n\n // We need to execute everything after we deal with the one stuff. otherwise\n // we have issues to order of operations.\n for (let n = 0; n < execute.length; n++) {\n const e = execute[n]\n e.cb.call(e.ctx, e.data)\n }\n\n return true\n }\n\n on(id: string, event: string, cb: EventCallback, ctx?: any): void {\n this.add(id, event, cb, ctx, false)\n }\n\n one(id: string, event: string, cb: EventCallback, ctx?: any): void {\n this.add(id, event, cb, ctx, true)\n }\n\n off(event: string, cb?: EventCallback): string[] {\n // We should probably restructure so this is a bit less of a pain.\n const listeners: string[] = []\n\n if (!Object.hasOwn(this.data, event)) {\n return listeners\n }\n\n const keep: KeeperData[] = []\n\n // Loop through everything.\n for (let i = 0; i < this.data[event].length; i++) {\n const data = this.data[event][i]\n // If we only keep if there was a CB and the CB is there.\n if (!core.isNone(cb) && data.cb !== cb) {\n keep.push(data)\n } else if (!core.isNone(data.id)) {\n listeners.push(data.id)\n }\n }\n\n if (keep.length === 0) {\n delete this.data[event]\n } else {\n this.data[event] = keep\n }\n\n return listeners\n }\n}\n\nexport default Keeper\n","/**\n * Conditional logger utility for player.js\n * Provides debug, log, warn, and error methods that only output when enabled\n */\n\nclass Logger {\n private enabled: boolean\n\n constructor(enabled: boolean = false) {\n this.enabled = enabled\n }\n\n setEnabled(enabled: boolean): void {\n this.enabled = enabled\n }\n\n isEnabled(): boolean {\n return this.enabled\n }\n\n debug(...args: any[]): void {\n if (this.enabled) {\n console.debug(...args)\n }\n }\n\n log(...args: any[]): void {\n if (this.enabled) {\n console.log(...args)\n }\n }\n\n warn(...args: any[]): void {\n if (this.enabled) {\n console.warn(...args)\n }\n }\n\n error(...args: any[]): void {\n if (this.enabled) {\n console.error(...args)\n }\n }\n}\n\n/**\n * Creates a new logger instance\n * @param enabled - Whether logging is enabled (default: false)\n */\nexport function createLogger(enabled: boolean = false): Logger {\n return new Logger(enabled)\n}\n\nexport default Logger\n","/*\n* Player.js is a javascript library for interacting with iframes via\n* postMessage that use an Open Player Spec\n*\n*/\nimport core from './core'\nimport Keeper from './keeper'\nimport type { PlayerData, ReadyData, EventCallback, MethodCallback, GetMethodPromise, SetMethodPromise } from './types'\nimport Logger from './logger'\n\nconst READIED: string[] = []\n\nclass Player {\n public READIED: string[]\n public elem: HTMLIFrameElement\n public debug: boolean\n private logger: Logger\n public origin: string\n public keeper: Keeper\n public isReady: boolean\n public queue: PlayerData[]\n public events: string[]\n public methods: string[]\n public loaded?: boolean\n\n constructor(elem: string | HTMLIFrameElement, debug: boolean = false) {\n this.READIED = READIED\n\n if (core.isString(elem)) {\n const element = document.getElementById(elem) as HTMLIFrameElement\n if (!element) {\n throw new Error(`Element with id \"${elem}\" not found`)\n }\n elem = element\n }\n\n this.elem = elem\n\n this.debug = debug\n this.logger = new Logger(debug)\n\n // make sure we have an iframe\n core.assert(elem.nodeName === 'IFRAME',\n 'playerjs.Player constructor requires an Iframe, got \"' + elem.nodeName + '\"')\n core.assert(elem.src,\n 'playerjs.Player constructor requires a Iframe with a \\'src\\' attribute.')\n\n // Figure out the origin of where we are sending messages.\n this.origin = (new URL(elem.src)).origin\n\n // Event handling.\n this.keeper = new Keeper()\n\n // Queuing before ready.\n this.isReady = false\n this.queue = []\n\n // Assume that everything is supported, unless we know otherwise.\n this.events = core.EVENTS.all()\n this.methods = core.METHODS.all()\n\n if (core.POST_MESSAGE) {\n // Set up the reciever.\n core.addEvent(window, 'message', (e: MessageEvent) => {\n this.receive(e)\n })\n } else {\n this.logger.error('Post Message is not Available.')\n }\n\n // See if we caught the src event first, otherwise assume we haven't loaded\n if (READIED.includes(elem.src)) {\n this.loaded = true\n } else {\n // Try the onload event, just lets us give another test.\n this.elem.onload = () => {\n this.loaded = true\n }\n }\n }\n\n send(data: PlayerData, callback?: MethodCallback, ctx?: any): boolean {\n // Add the context and version to the data.\n data.context = core.CONTEXT\n data.version = core.VERSION\n\n // We are expecting a response.\n if (callback) {\n // Create a UUID\n const id = core.generateUUID()\n\n // Set the listener.\n data.listener = id\n\n // Only hang on to this listener once.\n this.keeper.one(id, data.method || '', callback, ctx)\n }\n\n if (!this.isReady && data.value !== 'ready') {\n this.logger.debug('Player.queue', data)\n this.queue.push(data)\n return false\n }\n\n this.logger.debug('Player.send', data, this.origin)\n\n if (this.loaded === true && this.elem.contentWindow) {\n this.elem.contentWindow.postMessage(JSON.stringify(data), this.origin)\n }\n\n return true\n }\n\n receive(e: MessageEvent): boolean {\n this.logger.debug('Player.receive', e)\n\n if (e.origin !== this.origin) {\n return false\n }\n\n let data: any\n try {\n data = JSON.parse(e.data)\n } catch (_err) {\n // Not a valid response.\n return false\n }\n\n // abort if this message wasn't a player.js message\n if (data.context !== core.CONTEXT) {\n return false\n }\n\n // We need to determine if we are ready.\n if (data.event === 'ready' && data.value && data.value.src === this.elem.src) {\n this.ready(data as ReadyData)\n }\n\n if (this.keeper.has(data.event, data.listener)) {\n this.keeper.execute(data.event, data.listener, data.value, this)\n }\n\n return true\n }\n\n ready(data: ReadyData): boolean {\n if (this.isReady === true) {\n return false\n }\n\n // If we got a list of supported methods, we should set them.\n if (data.value.events) {\n this.events = data.value.events\n }\n if (data.value.methods) {\n this.methods = data.value.methods\n }\n\n // set ready.\n this.isReady = true\n this.loaded = true\n\n // Clear the queue\n for (let i = 0; i < this.queue.length; i++) {\n const obj = this.queue[i]\n\n this.logger.debug('Player.dequeue', obj)\n\n if (data.event === 'ready') {\n this.keeper.execute(obj.event || '', obj.listener, true, this)\n }\n this.send(obj)\n }\n this.queue = []\n\n return true\n }\n\n on(event: string, callback: EventCallback, ctx?: any): boolean {\n const id = core.generateUUID()\n\n if (event === 'ready') {\n // We only want to call ready once.\n this.keeper.one(id, event, callback, ctx)\n } else {\n this.keeper.on(id, event, callback, ctx)\n }\n\n this.send({\n method: 'addEventListener',\n value: event,\n listener: id\n })\n\n return true\n }\n\n off(event: string, callback?: EventCallback): boolean {\n const listeners = this.keeper.off(event, callback)\n this.logger.debug('Player.off', listeners)\n\n if (listeners.length > 0) {\n for (const i in listeners) {\n this.send({\n method: 'removeEventListener',\n value: event,\n listener: listeners[i]\n })\n }\n return true\n }\n\n return false\n }\n\n // Based on what ready passed back, we can determine if the events/method are\n // supported by the player.\n supports(evtOrMethod: 'event' | 'method', names: string | string[]): boolean {\n core.assert(['method', 'event'].includes(evtOrMethod),\n 'evtOrMethod needs to be either \"event\" or \"method\" got ' + evtOrMethod)\n\n // Make everything an array.\n names = core.isArray(names) ? names : [names]\n\n const all = evtOrMethod === 'event' ? this.events : this.methods\n\n for (let i = 0; i < names.length; i++) {\n if (!all.includes(names[i])) {\n return false\n }\n }\n\n return true\n }\n\n // Dynamic method generation will be added via the prototype modification below\n // Method overloads for both promise and callback styles\n \n // Play/Pause methods (no return value needed)\n play?(): Promise<void>\n pause?(): Promise<void>\n mute?(): Promise<void>\n unmute?(): Promise<void>\n \n // Getter methods with overloads\n getPaused?(): GetMethodPromise<boolean>\n getPaused?(callback: MethodCallback): void\n \n getMuted?(): GetMethodPromise<boolean>\n getMuted?(callback: MethodCallback): void\n \n getVolume?(): GetMethodPromise<number>\n getVolume?(callback: MethodCallback): void\n \n getDuration?(): GetMethodPromise<number>\n getDuration?(callback: MethodCallback): void\n \n getCurrentTime?(): GetMethodPromise<number>\n getCurrentTime?(callback: MethodCallback): void\n \n getLoop?(): GetMethodPromise<boolean>\n getLoop?(callback: MethodCallback): void\n \n getPlaybackRate?(): GetMethodPromise<number>\n getPlaybackRate?(callback: MethodCallback): void\n \n // Setter methods\n setVolume?(volume: number): SetMethodPromise\n setCurrentTime?(time: number): SetMethodPromise\n setLoop?(loop: boolean): SetMethodPromise\n setPlaybackRate?(rate: number): SetMethodPromise\n}\n\n// create function to add to the Player prototype\nfunction createPrototypeFunction(name: string) {\n return function (this: Player, ...args: any[]): any {\n const data: PlayerData = {\n method: name\n }\n\n // for getters, check if callback is provided or return a promise\n if (/^get/.test(name)) {\n // If a callback is provided, use callback style\n if (args.length > 0 && typeof args[0] === 'function') {\n const callback = args[0]\n this.send(data, callback, args[1])\n return\n } else {\n // Return a promise\n return new Promise((resolve) => {\n this.send(data, (value: any) => {\n resolve(value)\n })\n })\n }\n } else {\n // for setters and action methods, return a promise\n if (/^set/.test(name)) {\n core.assert(args.length !== 0, 'Set methods require a value.')\n data.value = args[0]\n }\n \n // For action methods (play, pause, mute, unmute) and setters, return promise\n return new Promise<void>((resolve) => {\n // For action methods, we don't need to wait for a response\n if (['play', 'pause', 'mute', 'unmute'].includes(name)) {\n this.send(data)\n resolve()\n } else {\n // For setters, we might want to wait for confirmation\n this.send(data, () => {\n resolve()\n })\n }\n })\n }\n }\n}\n\n// Loop through the methods to add them to the prototype.\nfor (const methodName of core.METHODS.all()) {\n if (!Object.hasOwn(Player.prototype, methodName)) {\n (Player.prototype as any)[methodName] = createPrototypeFunction(methodName)\n }\n}\n\ncore.addEvent(window, 'message', (e: MessageEvent) => {\n let data: any\n try {\n data = JSON.parse(e.data)\n } catch (_err) {\n return false\n }\n\n // abort if this message wasn't a player.js message\n if (data.context !== core.CONTEXT) {\n return false\n }\n\n // We need to determine if we are ready.\n if (data.event === 'ready' && data.value && data.value.src) {\n READIED.push(data.value.src)\n }\n})\n\nexport default Player\n","/*\n* Does all the wiring up for the backend.\n*\n* var receiver = new playerjs.Receiver();\n* receiver.on('play', function(){ video.play() });\n* receiver.on('getDuration', function(callback){ callback(video.duration) });\n* receiver.emit('timeupdate', {});\n*/\n\nimport core from './core'\nimport type { SupportedFeatures } from './types'\nimport Logger from './logger'\n\nclass Receiver {\n public isReady: boolean\n public origin: string\n public methods: { [method: string]: Function }\n public supported: SupportedFeatures\n public eventListeners: { [event: string]: (string | null)[] }\n public reject: boolean\n public debug: boolean\n private logger: Logger\n\n constructor(events?: string[], methods?: string[], debug: boolean = false) {\n \n // Deal with the ready crap.\n this.isReady = false\n this.debug = debug\n this.logger = new Logger(debug)\n\n // Bind the window message.\n if (document.referrer) {\n this.origin = (new URL(document.referrer)).origin\n } else {\n this.origin = '*'\n }\n\n // Create a holder for all the methods.\n this.methods = {}\n\n // holds all the information about what's supported\n this.supported = {\n events: events || core.EVENTS.all(),\n methods: methods || core.METHODS.all()\n }\n\n // Deals with the adding and removing of event listeners.\n this.eventListeners = {}\n\n // We can't send any messages.\n this.reject = !(window.self !== window.top && core.POST_MESSAGE)\n\n // We aren't in an iframe, don't listen.\n if (!this.reject) {\n core.addEvent(window, 'message', (e: MessageEvent) => {\n this.receive(e)\n })\n }\n }\n\n receive(e: MessageEvent): boolean {\n // Only want to listen to events that came from our origin.\n if (e.origin !== this.origin) {\n return false\n }\n\n // Browsers that support postMessage also support JSON.\n let data: any = {}\n if (typeof e.data === 'object') {\n data = e.data\n } else {\n try {\n data = window.JSON.parse(e.data)\n } catch (err) {\n this.logger.error('JSON Parse Error', err)\n }\n }\n\n this.logger.debug('Receiver.receive', e, data)\n\n // Nothing for us to do.\n if (!data.method) {\n return false\n }\n\n // make sure the context is correct.\n if (data.context !== core.CONTEXT) {\n return false\n }\n\n // Make sure we have a valid method.\n if (!core.METHODS.all().includes(data.method)) {\n this.emit('error', {\n code: 2,\n msg: 'Invalid Method \"' + data.method + '\"'\n })\n return false\n }\n\n // See if we added a listener\n const listener = !core.isNone(data.listener) ? data.listener : null\n\n // Add Event Listener.\n if (data.method === 'addEventListener') {\n if (Object.hasOwn(this.eventListeners, data.value)) {\n // If the listener is the same, i.e. null only add it once.\n if (!this.eventListeners[data.value].includes(listener)) {\n this.eventListeners[data.value].push(listener)\n }\n } else {\n this.eventListeners[data.value] = [listener]\n }\n\n if (data.value === 'ready' && this.isReady) {\n this.ready()\n }\n } else if (data.method === 'removeEventListener') { // Remove the event listener.\n if (Object.hasOwn(this.eventListeners, data.value)) {\n const index = this.eventListeners[data.value].indexOf(listener)\n\n // if we find the element, remove it.\n if (index > -1) {\n this.eventListeners[data.value].splice(index, 1)\n }\n\n if (this.eventListeners[data.value].length === 0) {\n delete this.eventListeners[data.value]\n }\n }\n } else { // Go get it.\n this.get(data.method, data.value, listener)\n }\n\n return true\n }\n\n get(method: string, value: any, listener: string | null): boolean {\n\n // Now lets do it.\n if (!Object.hasOwn(this.methods, method)) {\n this.emit('error', {\n code: 3,\n msg: 'Method Not Supported \"' + method + '\"'\n })\n return false\n }\n\n const func = this.methods[method]\n\n if (method.substr(0, 3) === 'get') {\n const callback = (val: any) => {\n this.send(method, val, listener)\n }\n func.call(this, callback)\n } else {\n func.call(this, value)\n }\n\n return true\n }\n\n on(event: string, callback: Function): void {\n this.methods[event] = callback\n }\n\n send(event: string, value?: any, listener?: string | null): boolean {\n this.logger.debug('Receiver.send', event, value, listener)\n\n if (this.reject) {\n // We are not in a frame, or we don't support POST_MESSAGE\n this.logger.error('Receiver.send.reject', event, value, listener)\n return false\n }\n\n const data: any = {\n context: core.CONTEXT,\n version: core.VERSION,\n event\n }\n\n if (!core.isNone(value)) {\n data.value = value\n }\n\n if (!core.isNone(listener)) {\n data.listener = listener\n }\n\n const msg = JSON.stringify(data)\n window.parent.postMessage(msg, this.origin === '' ? '*' : this.origin)\n\n return true\n }\n\n emit(event: string, value?: any): boolean {\n if (!Object.hasOwn(this.eventListeners, event)) {\n return false\n }\n\n this.logger.debug('Receiver.emit', event, value, this.eventListeners[event])\n\n for (let i = 0; i < this.eventListeners[event].length; i++) {\n const listener = this.eventListeners[event][i]\n this.send(event, value, listener)\n }\n\n return true\n }\n\n ready(): void {\n this.logger.debug('Receiver.ready')\n this.isReady = true\n\n const data = {\n src: window.location.toString(),\n events: this.supported.events,\n methods: this.supported.methods\n }\n\n if (!this.emit('ready', data)) {\n this.send('ready', data)\n }\n }\n}\n\nexport default Receiver\n","import Receiver from '../receiver'\n\ninterface MockVideo {\n duration: number\n currentTime: number\n interval: NodeJS.Timeout | null\n timeupdate: (data: { seconds: number; duration: number }) => void\n volume: number\n mute: boolean\n playing: boolean\n loop: boolean\n playbackRate: number\n play: () => void\n pause: () => void\n}\n\nclass MockAdapter {\n public receiver!: Receiver\n\n constructor() {\n this.init()\n }\n\n init(): void {\n // Our mock video\n const video: MockVideo = {\n duration: 20,\n currentTime: 0,\n interval: null,\n timeupdate: () => {},\n volume: 100,\n mute: false,\n playing: false,\n loop: false,\n playbackRate: 1,\n play: () => {\n video.interval = setInterval(() => {\n video.currentTime += 0.25\n video.timeupdate({\n seconds: video.currentTime,\n duration: video.duration\n })\n }, 250)\n video.playing = true\n },\n pause: () => {\n if (video.interval) {\n clearInterval(video.interval)\n }\n video.playing = false\n }\n }\n\n // Set up the actual receiver\n const receiver = new Receiver()\n this.receiver = receiver\n\n receiver.on('play', function (this: Receiver) {\n video.play()\n this.emit('play')\n video.timeupdate = (data: { seconds: number; duration: number }) => {\n this.emit('timeupdate', data)\n }\n })\n\n receiver.on('pause', function (this: Receiver) {\n video.pause()\n this.emit('pause')\n })\n\n receiver.on('getPaused', (callback: (isPaused: boolean) => void) => {\n const isPaused = !video.playing\n callback(isPaused)\n })\n\n receiver.on('getCurrentTime', (callback: (time: number) => void) => {\n callback(video.currentTime)\n })\n\n receiver.on('setCurrentTime', (value: number) => {\n video.currentTime = value\n })\n\n receiver.on('getDuration', (callback: (duration: number) => void) => {\n callback(video.duration)\n })\n\n receiver.on('getVolume', (callback: (volume: number) => void) => {\n callback(video.volume)\n })\n\n receiver.on('setVolume', (value: number) => {\n video.volume = value\n })\n\n receiver.on('mute', () => {\n video.mute = true\n })\n\n receiver.on('unmute', () => {\n video.mute = false\n })\n\n receiver.on('getMuted', (callback: (muted: boolean) => void) => {\n callback(video.mute)\n })\n\n receiver.on('getLoop', (callback: (loop: boolean) => void) => {\n callback(video.loop)\n })\n\n receiver.on('setLoop', (value: boolean) => {\n video.loop = value\n })\n\n receiver.on('setPlaybackRate', (value: number) => {\n video.playbackRate = value\n })\n\n receiver.on('getPlaybackRate', (callback: (rate: number) => void) => {\n callback(video.playbackRate)\n })\n }\n\n ready(): void {\n this.receiver.ready()\n }\n}\n\nexport default MockAdapter\n","import core from '../core'\nimport Receiver from '../receiver'\n\n// VideoJS player interface - adjust based on actual VideoJS types if available\ninterface VideoJSPlayer {\n on(event: string, callback: () => void): void\n play(): void\n pause(): void\n paused(): boolean\n currentTime(time?: number): number\n duration(): number\n volume(vol?: number): number\n loop(loop?: boolean): boolean\n playbackRate(rate?: number): number\n}\n\nclass VideoJSAdapter {\n public receiver!: Receiver\n\n constructor(player: VideoJSPlayer) {\n this.init(player)\n }\n\n init(player: VideoJSPlayer): void {\n core.assert(player, 'VideoJSReceiver requires a player object')\n\n // Set up the actual receiver\n const receiver = new Receiver()\n this.receiver = receiver\n\n /* EVENTS */\n player.on('pause', () => {\n receiver.emit('pause')\n })\n\n player.on('play', () => {\n receiver.emit('play')\n })\n\n player.on('timeupdate', () => {\n const seconds = player.currentTime()\n const duration = player.duration()\n\n if (!seconds || !duration) {\n return false\n }\n\n const value = {\n seconds,\n duration\n }\n receiver.emit('timeupdate', value)\n })\n\n player.on('ended', () => {\n receiver.emit('ended')\n })\n\n player.on('error', () => {\n receiver.emit('error')\n })\n\n /* METHODS */\n receiver.on('play', () => {\n player.play()\n })\n\n receiver.on('pause', () => {\n player.pause()\n })\n\n receiver.on('getPaused', (callback: (paused: boolean) => void) => {\n callback(player.paused())\n })\n\n receiver.on('getCurrentTime', (callback: (time: number) => void) => {\n callback(player.currentTime())\n })\n\n receiver.on('setCurrentTime', (value: number) => {\n player.currentTime(value)\n })\n\n receiver.on('getDuration', (callback: (duration: number) => void) => {\n callback(player.duration())\n })\n\n receiver.on('getVolume', (callback: (volume: number) => void) => {\n const volume = player.volume() * 100\n callback(volume)\n })\n\n receiver.on('setVolume', (value: number) => {\n player.volume(value / 100)\n })\n\n receiver.on('mute', () => {\n player.volume(0)\n })\n\n receiver.on('unmute', () => {\n player.volume(1)\n })\n\n receiver.on('getMuted', (callback: (muted: boolean) => void) => {\n const isMuted = player.volume() === 0\n callback(isMuted)\n })\n\n receiver.on('getLoop', (callback: (loop: boolean) => void) => {\n callback(player.loop())\n })\n\n receiver.on('setLoop', (value: boolean) => {\n player.loop(value)\n })\n\n receiver.on('setPlaybackRate', (value: number) => {\n player.playbackRate(value)\n })\n\n receiver.on('getPlaybackRate', (callback: (rate: number) => void) => {\n callback(player.playbackRate())\n })\n }\n\n ready(): void {\n this.receiver.ready()\n }\n}\n\nexport default VideoJSAdapter\n","import core from '../core'\nimport Receiver from '../receiver'\n\nclass HTML5Adapter {\n public receiver!: Receiver\n\n constructor(video: HTMLVideoElement) {\n this.init(video)\n }\n\n init(video: HTMLVideoElement): void {\n core.assert(video, 'HTML5Adapter requires a video element')\n\n // Set up the actual receiver\n const receiver = new Receiver()\n this.receiver = receiver\n\n /* EVENTS */\n video.addEventListener('playing', () => {\n receiver.emit('play')\n })\n\n video.addEventListener('pause', () => {\n receiver.emit('pause')\n })\n\n video.addEventListener('ended', () => {\n receiver.emit('ended')\n })\n\n video.addEventListener('timeupdate', () => {\n receiver.emit('timeupdate', {\n seconds: video.currentTime,\n duration: video.duration\n })\n })\n\n video.addEventListener('progress', () => {\n receiver.emit('buffered', {\n percent: video.buffered.length\n })\n })\n\n /* Methods */\n receiver.on('play', () => {\n video.play()\n })\n\n receiver.on('pause', () => {\n video.pause()\n })\n\n receiver.on('getPaused', (callback: (paused: boolean) => void) => {\n callback(video.paused)\n })\n\n receiver.on('getCurrentTime', (callback: (time: number) => void) => {\n callback(video.currentTime)\n })\n\n receiver.on('setCurrentTime', (value: number) => {\n video.currentTime = value\n })\n\n receiver.on('getDuration', (callback: (duration: number) => void) => {\n callback(video.duration)\n })\n\n receiver.on('getVolume', (callback: (volume: number) => void) => {\n const volume = video.volume * 100\n callback(volume)\n })\n\n receiver.on('setVolume', (value: number) => {\n video.volume = value / 100\n })\n\n receiver.on('mute', () => {\n video.muted = true\n })\n\n receiver.on('unmute', () => {\n video.muted = false\n })\n\n receiver.on('getMuted', (callback: (muted: boolean) => void) => {\n callback(video.muted)\n })\n\n receiver.on('getLoop', (callback: (loop: boolean) => void) => {\n callback(video.loop)\n })\n\n receiver.on('setLoop', (value: boolean) => {\n video.loop = value\n })\n\n receiver.on('setPlaybackRate', (value: number) => {\n video.playbackRate = value\n })\n\n receiver.on('getPlaybackRate', (callback: (rate: number) => void) => {\n callback(video.playbackRate)\n })\n }\n\n ready(): void {\n this.receiver.ready()\n }\n}\n\nexport default HTML5Adapter\n"],"mappings":"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","names":["main_exports","__export","main_default","__toCommonJS","core","all","key","obj","elem","type","eventHandle","test","msg","url","core_default","Keeper","event","id","core_default","events","i","cb","ctx","one","d","data","keep","execute","n","e","listeners","keeper_default","Logger","enabled","args","logger_default","Logger","READIED","Player","elem","debug","core_default","element","logger_default","keeper_default","e","data","callback","ctx","id","_err","i","obj","event","listeners","evtOrMethod","names","all","createPrototypeFunction","name","args","resolve","value","methodName","player_default","Receiver","events","methods","debug","logger_default","core_default","e","data","err","listener","index","method","value","func","callback","val","event","msg","i","receiver_default","MockAdapter","video","receiver","receiver_default","data","callback","isPaused","value","mock_default","VideoJSAdapter","player","core_default","receiver","receiver_default","seconds","duration","value","callback","volume","isMuted","video_default","HTML5Adapter","video","core_default","receiver","receiver_default","callback","value","volume","html_default","playerjs","player_default","receiver_default","mock_default","video_default","html_default","core_default","main_default"]}
package/dist/main.d.cts CHANGED
@@ -92,6 +92,7 @@ declare class Player {
92
92
  READIED: string[];
93
93
  elem: HTMLIFrameElement;
94
94
  debug: boolean;
95
+ private logger;
95
96
  origin: string;
96
97
  keeper: Keeper;
97
98
  isReady: boolean;
@@ -141,7 +142,9 @@ declare class Receiver {
141
142
  [event: string]: (string | null)[];
142
143
  };
143
144
  reject: boolean;
144
- constructor(events?: string[], methods?: string[]);
145
+ debug: boolean;
146
+ private logger;
147
+ constructor(events?: string[], methods?: string[], debug?: boolean);
145
148
  receive(e: MessageEvent): boolean;
146
149
  get(method: string, value: any, listener: string | null): boolean;
147
150
  on(event: string, callback: Function): void;
package/dist/main.d.ts CHANGED
@@ -92,6 +92,7 @@ declare class Player {
92
92
  READIED: string[];
93
93
  elem: HTMLIFrameElement;
94
94
  debug: boolean;
95
+ private logger;
95
96
  origin: string;
96
97
  keeper: Keeper;
97
98
  isReady: boolean;
@@ -141,7 +142,9 @@ declare class Receiver {
141
142
  [event: string]: (string | null)[];
142
143
  };
143
144
  reject: boolean;
144
- constructor(events?: string[], methods?: string[]);
145
+ debug: boolean;
146
+ private logger;
147
+ constructor(events?: string[], methods?: string[], debug?: boolean);
145
148
  receive(e: MessageEvent): boolean;
146
149
  get(method: string, value: any, listener: string | null): boolean;
147
150
  on(event: string, callback: Function): void;
@@ -1,2 +1,2 @@
1
- "use strict";(()=>{var u={EVENTS:{READY:"ready",PLAY:"play",PAUSE:"pause",ENDED:"ended",TIMEUPDATE:"timeupdate",PROGRESS:"progress",SEEKED:"seeked",ERROR:"error",FULLSCREEN_CHANGE:"fullscreenChange",PIP_CHANGE:"pipChange",PLAYBACK_RATE_CHANGE:"playbackRateChange",AUDIO_CHANGE:"audioChange",QUALITY_CHANGE:"qualityChange",VOLUME_CHANGE:"volumeChange",all(){let r=[];for(let e in u.EVENTS)u.has(u.EVENTS,e)&&u.isString(u.EVENTS[e])&&r.push(u.EVENTS[e]);return r}},POST_MESSAGE:!!window.postMessage,METHODS:{PLAY:"play",PAUSE:"pause",GETPAUSED:"getPaused",MUTE:"mute",UNMUTE:"unmute",GETMUTED:"getMuted",SETVOLUME:"setVolume",GETVOLUME:"getVolume",GETDURATION:"getDuration",SETCURRENTTIME:"setCurrentTime",GETCURRENTTIME:"getCurrentTime",SETLOOP:"setLoop",GETLOOP:"getLoop",SETPLAYBACKRATE:"setPlaybackRate",GETPLAYBACKRATE:"getPlaybackRate",REMOVEEVENTLISTENER:"removeEventListener",ADDEVENTLISTENER:"addEventListener",all(){let r=[];for(let e in u.METHODS)u.has(u.METHODS,e)&&u.isString(u.METHODS[e])&&r.push(u.METHODS[e]);return r}},DEBUG:!1,VERSION:"2.0",CONTEXT:"player.js",isString(r){return Object.prototype.toString.call(r)==="[object String]"},has(r,e){return Object.prototype.hasOwnProperty.call(r,e)},addEvent(r,e,t){r&&(r.addEventListener?r.addEventListener(e,t,!1):r.attachEvent?r.attachEvent("on"+e,t):r["on"+e]=t)},isNone(r){return r==null},assert(r,e){if(!r)throw e||"Player.js Assert Failed"},generateUUID(){if(crypto&&crypto.randomUUID)return crypto.randomUUID();{let r=URL.createObjectURL(new Blob);return r.substring(r.lastIndexOf("/")+1)}},isArray(r){return Object.prototype.toString.call(r)==="[object Array]"}},i=u;var m=class{constructor(){this.data={}}has(e,t){if(!Object.prototype.hasOwnProperty.call(this.data,e))return!1;if(i.isNone(t))return!0;let n=this.data[e];for(let o=0;o<n.length;o++)if(n[o].id===t)return!0;return!1}add(e,t,n,o,s=!1){let a={id:e,event:t,cb:n,ctx:o,one:s};this.has(t)?this.data[t].push(a):this.data[t]=[a]}execute(e,t,n,o){if(!this.has(e,t))return!1;let s=[],a=[];for(let c=0;c<this.data[e].length;c++){let l=this.data[e][c];i.isNone(t)||!i.isNone(t)&&l.id===t?(a.push({cb:l.cb,ctx:l.ctx?l.ctx:o,data:n}),l.one===!1&&s.push(l)):s.push(l)}s.length===0?delete this.data[e]:this.data[e]=s;for(let c=0;c<a.length;c++){let l=a[c];l.cb.call(l.ctx,l.data)}return!0}on(e,t,n,o){this.add(e,t,n,o,!1)}one(e,t,n,o){this.add(e,t,n,o,!0)}off(e,t){let n=[];if(!Object.prototype.hasOwnProperty.call(this.data,e))return n;let o=[];for(let s=0;s<this.data[e].length;s++){let a=this.data[e][s];!i.isNone(t)&&a.cb!==t?o.push(a):i.isNone(a.id)||n.push(a.id)}return o.length===0?delete this.data[e]:this.data[e]=o,n}},y=m;var h=[],f=class{constructor(e,t=!1){let n=this;if(this.READIED=h,i.isString(e)){let o=document.getElementById(e);if(!o)throw new Error(`Element with id "${e}" not found`);e=o}this.elem=e,this.debug=t,i.assert(e.nodeName==="IFRAME",'playerjs.Player constructor requires an Iframe, got "'+e.nodeName+'"'),i.assert(e.src,"playerjs.Player constructor requires a Iframe with a 'src' attribute."),this.origin=new URL(e.src).origin,this.keeper=new y,this.isReady=!1,this.queue=[],this.events=i.EVENTS.all(),this.methods=i.METHODS.all(),i.POST_MESSAGE?i.addEvent(window,"message",function(o){n.receive(o)}):console.error("Post Message is not Available."),h.includes(e.src)?n.loaded=!0:this.elem.onload=function(){n.loaded=!0}}send(e,t,n){if(e.context=i.CONTEXT,e.version=i.VERSION,t){let o=i.generateUUID();e.listener=o,this.keeper.one(o,e.method||"",t,n)}return!this.isReady&&e.value!=="ready"?(this.debug&&console.debug("Player.queue",e),this.queue.push(e),!1):(this.debug&&console.debug("Player.send",e,this.origin),this.loaded===!0&&this.elem.contentWindow&&this.elem.contentWindow.postMessage(JSON.stringify(e),this.origin),!0)}receive(e){if(this.debug&&console.debug("Player.receive",e),e.origin!==this.origin)return!1;let t;try{t=JSON.parse(e.data)}catch(n){return!1}return t.context!==i.CONTEXT?!1:(t.event==="ready"&&t.value&&t.value.src===this.elem.src&&this.ready(t),this.keeper.has(t.event,t.listener)&&this.keeper.execute(t.event,t.listener,t.value,this),!0)}ready(e){if(this.isReady===!0)return!1;e.value.events&&(this.events=e.value.events),e.value.methods&&(this.methods=e.value.methods),this.isReady=!0,this.loaded=!0;for(let t=0;t<this.queue.length;t++){let n=this.queue[t];this.debug&&console.debug("Player.dequeue",n),e.event==="ready"&&this.keeper.execute(n.event||"",n.listener,!0,this),this.send(n)}return this.queue=[],!0}on(e,t,n){let o=i.generateUUID();return e==="ready"?this.keeper.one(o,e,t,n):this.keeper.on(o,e,t,n),this.send({method:"addEventListener",value:e,listener:o}),!0}off(e,t){let n=this.keeper.off(e,t);if(this.debug&&console.debug("Player.off",n),n.length>0){for(let o in n)this.send({method:"removeEventListener",value:e,listener:n[o]});return!0}return!1}supports(e,t){i.assert(["method","event"].includes(e),'evtOrMethod needs to be either "event" or "method" got '+e),t=i.isArray(t)?t:[t];let n=e==="event"?this.events:this.methods;for(let o=0;o<t.length;o++)if(!n.includes(t[o]))return!1;return!0}};function S(r){return function(...e){let t={method:r};if(/^get/.test(r))if(e.length>0&&typeof e[0]=="function"){let n=e[0];this.send(t,n,e[1]);return}else return new Promise((n,o)=>{this.send(t,s=>{n(s)})});else return/^set/.test(r)&&(i.assert(e.length!==0,"Set methods require a value."),t.value=e[0]),new Promise((n,o)=>{["play","pause","mute","unmute"].includes(r)?(this.send(t),n()):this.send(t,()=>{n()})})}}for(let r of i.METHODS.all())Object.prototype.hasOwnProperty.call(f.prototype,r)||(f.prototype[r]=S(r));i.addEvent(window,"message",function(r){let e;try{e=JSON.parse(r.data)}catch(t){return!1}if(e.context!==i.CONTEXT)return!1;e.event==="ready"&&e.value&&e.value.src&&h.push(e.value.src)});var E=f;var p=class{constructor(e,t){let n=this;this.isReady=!1,document.referrer?this.origin=new URL(document.referrer).origin:this.origin="*",this.methods={},this.supported={events:e||i.EVENTS.all(),methods:t||i.METHODS.all()},this.eventListeners={},this.reject=!(window.self!==window.top&&i.POST_MESSAGE),this.reject||i.addEvent(window,"message",function(o){n.receive(o)})}receive(e){if(e.origin!==this.origin)return!1;let t={};if(typeof e.data=="object")t=e.data;else try{t=window.JSON.parse(e.data)}catch(o){console.error("JSON Parse Error",o)}if(console.debug("Receiver.receive",e,t),!t.method||t.context!==i.CONTEXT)return!1;if(!i.METHODS.all().includes(t.method))return this.emit("error",{code:2,msg:'Invalid Method "'+t.method+'"'}),!1;let n=i.isNone(t.listener)?null:t.listener;if(t.method==="addEventListener")Object.prototype.hasOwnProperty.call(this.eventListeners,t.value)?this.eventListeners[t.value].includes(n)||this.eventListeners[t.value].push(n):this.eventListeners[t.value]=[n],t.value==="ready"&&this.isReady&&this.ready();else if(t.method==="removeEventListener"){if(Object.prototype.hasOwnProperty.call(this.eventListeners,t.value)){let o=this.eventListeners[t.value].indexOf(n);o>-1&&this.eventListeners[t.value].splice(o,1),this.eventListeners[t.value].length===0&&delete this.eventListeners[t.value]}}else this.get(t.method,t.value,n);return!0}get(e,t,n){let o=this;if(!Object.prototype.hasOwnProperty.call(this.methods,e))return this.emit("error",{code:3,msg:'Method Not Supported "'+e+'"'}),!1;let s=this.methods[e];if(e.substr(0,3)==="get"){let a=function(c){o.send(e,c,n)};s.call(this,a)}else s.call(this,t);return!0}on(e,t){this.methods[e]=t}send(e,t,n){if(console.debug("Receiver.send",e,t,n),this.reject)return console.error("Receiver.send.reject",e,t,n),!1;let o={context:i.CONTEXT,version:i.VERSION,event:e};i.isNone(t)||(o.value=t),i.isNone(n)||(o.listener=n);let s=JSON.stringify(o);return window.parent.postMessage(s,this.origin===""?"*":this.origin),!0}emit(e,t){if(!Object.prototype.hasOwnProperty.call(this.eventListeners,e))return!1;console.debug("Instance.emit",e,t,this.eventListeners[e]);for(let n=0;n<this.eventListeners[e].length;n++){let o=this.eventListeners[e][n];this.send(e,t,o)}return!0}ready(){console.debug("Receiver.ready"),this.isReady=!0;let e={src:window.location.toString(),events:this.supported.events,methods:this.supported.methods};this.emit("ready",e)||this.send("ready",e)}},d=p;var b=class{constructor(){this.init()}init(){let e={duration:20,currentTime:0,interval:null,timeupdate:function(){},volume:100,mute:!1,playing:!1,loop:!1,playbackRate:1,play:function(){e.interval=setInterval(function(){e.currentTime+=.25,e.timeupdate({seconds:e.currentTime,duration:e.duration})},250),e.playing=!0},pause:function(){e.interval&&clearInterval(e.interval),e.playing=!1}},t=this.receiver=new d;t.on("play",function(){let n=this;e.play(),this.emit("play"),e.timeupdate=function(o){n.emit("timeupdate",o)}}),t.on("pause",function(){e.pause(),this.emit("pause")}),t.on("getPaused",function(n){let o=!e.playing;n(o)}),t.on("getCurrentTime",function(n){n(e.currentTime)}),t.on("setCurrentTime",function(n){e.currentTime=n}),t.on("getDuration",function(n){n(e.duration)}),t.on("getVolume",function(n){n(e.volume)}),t.on("setVolume",function(n){e.volume=n}),t.on("mute",function(){e.mute=!0}),t.on("unmute",function(){e.mute=!1}),t.on("getMuted",function(n){n(e.mute)}),t.on("getLoop",function(n){n(e.loop)}),t.on("setLoop",function(n){e.loop=n}),t.on("setPlaybackRate",function(n){e.playbackRate=n}),t.on("getPlaybackRate",function(n){n(e.playbackRate)})}ready(){this.receiver.ready()}},T=b;var g=class{constructor(e){this.init(e)}init(e){i.assert(e,"VideoJSReceiver requires a player object");let t=this.receiver=new d;e.on("pause",function(){t.emit("pause")}),e.on("play",function(){t.emit("play")}),e.on("timeupdate",function(){let n=e.currentTime(),o=e.duration();if(!n||!o)return!1;let s={seconds:n,duration:o};t.emit("timeupdate",s)}),e.on("ended",function(){t.emit("ended")}),e.on("error",function(){t.emit("error")}),t.on("play",function(){e.play()}),t.on("pause",function(){e.pause()}),t.on("getPaused",function(n){n(e.paused())}),t.on("getCurrentTime",function(n){n(e.currentTime())}),t.on("setCurrentTime",function(n){e.currentTime(n)}),t.on("getDuration",function(n){n(e.duration())}),t.on("getVolume",function(n){let o=e.volume()*100;n(o)}),t.on("setVolume",function(n){e.volume(n/100)}),t.on("mute",function(){e.volume(0)}),t.on("unmute",function(){e.volume(1)}),t.on("getMuted",function(n){let o=e.volume()===0;n(o)}),t.on("getLoop",function(n){n(e.loop())}),t.on("setLoop",function(n){e.loop(n)}),t.on("setPlaybackRate",function(n){e.playbackRate(n)}),t.on("getPlaybackRate",function(n){n(e.playbackRate())})}ready(){this.receiver.ready()}},P=g;var v=class{constructor(e){this.init(e)}init(e){i.assert(e,"HTML5Adapter requires a video element");let t=this.receiver=new d;e.addEventListener("playing",function(){t.emit("play")}),e.addEventListener("pause",function(){t.emit("pause")}),e.addEventListener("ended",function(){t.emit("ended")}),e.addEventListener("timeupdate",function(){t.emit("timeupdate",{seconds:e.currentTime,duration:e.duration})}),e.addEventListener("progress",function(){t.emit("buffered",{percent:e.buffered.length})}),t.on("play",function(){e.play()}),t.on("pause",function(){e.pause()}),t.on("getPaused",function(n){n(e.paused)}),t.on("getCurrentTime",function(n){n(e.currentTime)}),t.on("setCurrentTime",function(n){e.currentTime=n}),t.on("getDuration",function(n){n(e.duration)}),t.on("getVolume",function(n){let o=e.volume*100;n(o)}),t.on("setVolume",function(n){e.volume=n/100}),t.on("mute",function(){e.muted=!0}),t.on("unmute",function(){e.muted=!1}),t.on("getMuted",function(n){n(e.muted)}),t.on("getLoop",function(n){n(e.loop)}),t.on("setLoop",function(n){e.loop=n}),t.on("setPlaybackRate",function(n){e.playbackRate=n}),t.on("getPlaybackRate",function(n){n(e.playbackRate)})}ready(){this.receiver.ready()}},M=v;var R={Player:E,Receiver:d,MockAdapter:T,VideoJSAdapter:P,HTML5Adapter:M,CONTEXT:i.CONTEXT,VERSION:i.VERSION,METHODS:i.METHODS,addEvent:i.addEvent};typeof window!="undefined"&&(window.playerjs=R);var B=R;})();
1
+ "use strict";(()=>{var l={EVENTS:{READY:"ready",PLAY:"play",PAUSE:"pause",ENDED:"ended",TIMEUPDATE:"timeupdate",PROGRESS:"progress",SEEKED:"seeked",ERROR:"error",FULLSCREEN_CHANGE:"fullscreenChange",PIP_CHANGE:"pipChange",PLAYBACK_RATE_CHANGE:"playbackRateChange",AUDIO_CHANGE:"audioChange",QUALITY_CHANGE:"qualityChange",VOLUME_CHANGE:"volumeChange",all(){let i=[];for(let e in l.EVENTS)l.has(l.EVENTS,e)&&l.isString(l.EVENTS[e])&&i.push(l.EVENTS[e]);return i}},POST_MESSAGE:!!window.postMessage,METHODS:{PLAY:"play",PAUSE:"pause",GETPAUSED:"getPaused",MUTE:"mute",UNMUTE:"unmute",GETMUTED:"getMuted",SETVOLUME:"setVolume",GETVOLUME:"getVolume",GETDURATION:"getDuration",SETCURRENTTIME:"setCurrentTime",GETCURRENTTIME:"getCurrentTime",SETLOOP:"setLoop",GETLOOP:"getLoop",SETPLAYBACKRATE:"setPlaybackRate",GETPLAYBACKRATE:"getPlaybackRate",REMOVEEVENTLISTENER:"removeEventListener",ADDEVENTLISTENER:"addEventListener",all(){let i=[];for(let e in l.METHODS)l.has(l.METHODS,e)&&l.isString(l.METHODS[e])&&i.push(l.METHODS[e]);return i}},DEBUG:!1,VERSION:"2.0",CONTEXT:"player.js",isString(i){return Object.prototype.toString.call(i)==="[object String]"},has(i,e){return Object.hasOwn(i,e)},addEvent(i,e,t){i&&(i.addEventListener?i.addEventListener(e,t,!1):i.attachEvent?i.attachEvent(`on${e}`,t):i[`on${e}`]=t)},isNone(i){return i==null},assert(i,e){if(!i)throw e||"Player.js Assert Failed"},generateUUID(){if(crypto!=null&&crypto.randomUUID)return crypto.randomUUID();{let i=URL.createObjectURL(new Blob);return i.substring(i.lastIndexOf("/")+1)}},isArray(i){return Object.prototype.toString.call(i)==="[object Array]"}},o=l;var p=class{constructor(){this.data={}}has(e,t){if(!Object.hasOwn(this.data,e))return!1;if(o.isNone(t))return!0;let r=this.data[e];for(let n=0;n<r.length;n++)if(r[n].id===t)return!0;return!1}add(e,t,r,n,s=!1){let a={id:e,event:t,cb:r,ctx:n,one:s};this.has(t)?this.data[t].push(a):this.data[t]=[a]}execute(e,t,r,n){if(!this.has(e,t))return!1;let s=[],a=[];for(let c=0;c<this.data[e].length;c++){let u=this.data[e][c];o.isNone(t)||!o.isNone(t)&&u.id===t?(a.push({cb:u.cb,ctx:u.ctx?u.ctx:n,data:r}),u.one===!1&&s.push(u)):s.push(u)}s.length===0?delete this.data[e]:this.data[e]=s;for(let c=0;c<a.length;c++){let u=a[c];u.cb.call(u.ctx,u.data)}return!0}on(e,t,r,n){this.add(e,t,r,n,!1)}one(e,t,r,n){this.add(e,t,r,n,!0)}off(e,t){let r=[];if(!Object.hasOwn(this.data,e))return r;let n=[];for(let s=0;s<this.data[e].length;s++){let a=this.data[e][s];!o.isNone(t)&&a.cb!==t?n.push(a):o.isNone(a.id)||r.push(a.id)}return n.length===0?delete this.data[e]:this.data[e]=n,r}},T=p;var g=class{constructor(e=!1){this.enabled=e}setEnabled(e){this.enabled=e}isEnabled(){return this.enabled}debug(...e){this.enabled&&console.debug(...e)}log(...e){this.enabled&&console.log(...e)}warn(...e){this.enabled&&console.warn(...e)}error(...e){this.enabled&&console.error(...e)}};var h=g;var b=[],m=class{constructor(e,t=!1){if(this.READIED=b,o.isString(e)){let r=document.getElementById(e);if(!r)throw new Error(`Element with id "${e}" not found`);e=r}this.elem=e,this.debug=t,this.logger=new h(t),o.assert(e.nodeName==="IFRAME",'playerjs.Player constructor requires an Iframe, got "'+e.nodeName+'"'),o.assert(e.src,"playerjs.Player constructor requires a Iframe with a 'src' attribute."),this.origin=new URL(e.src).origin,this.keeper=new T,this.isReady=!1,this.queue=[],this.events=o.EVENTS.all(),this.methods=o.METHODS.all(),o.POST_MESSAGE?o.addEvent(window,"message",r=>{this.receive(r)}):this.logger.error("Post Message is not Available."),b.includes(e.src)?this.loaded=!0:this.elem.onload=()=>{this.loaded=!0}}send(e,t,r){if(e.context=o.CONTEXT,e.version=o.VERSION,t){let n=o.generateUUID();e.listener=n,this.keeper.one(n,e.method||"",t,r)}return!this.isReady&&e.value!=="ready"?(this.logger.debug("Player.queue",e),this.queue.push(e),!1):(this.logger.debug("Player.send",e,this.origin),this.loaded===!0&&this.elem.contentWindow&&this.elem.contentWindow.postMessage(JSON.stringify(e),this.origin),!0)}receive(e){if(this.logger.debug("Player.receive",e),e.origin!==this.origin)return!1;let t;try{t=JSON.parse(e.data)}catch(r){return!1}return t.context!==o.CONTEXT?!1:(t.event==="ready"&&t.value&&t.value.src===this.elem.src&&this.ready(t),this.keeper.has(t.event,t.listener)&&this.keeper.execute(t.event,t.listener,t.value,this),!0)}ready(e){if(this.isReady===!0)return!1;e.value.events&&(this.events=e.value.events),e.value.methods&&(this.methods=e.value.methods),this.isReady=!0,this.loaded=!0;for(let t=0;t<this.queue.length;t++){let r=this.queue[t];this.logger.debug("Player.dequeue",r),e.event==="ready"&&this.keeper.execute(r.event||"",r.listener,!0,this),this.send(r)}return this.queue=[],!0}on(e,t,r){let n=o.generateUUID();return e==="ready"?this.keeper.one(n,e,t,r):this.keeper.on(n,e,t,r),this.send({method:"addEventListener",value:e,listener:n}),!0}off(e,t){let r=this.keeper.off(e,t);if(this.logger.debug("Player.off",r),r.length>0){for(let n in r)this.send({method:"removeEventListener",value:e,listener:r[n]});return!0}return!1}supports(e,t){o.assert(["method","event"].includes(e),'evtOrMethod needs to be either "event" or "method" got '+e),t=o.isArray(t)?t:[t];let r=e==="event"?this.events:this.methods;for(let n=0;n<t.length;n++)if(!r.includes(t[n]))return!1;return!0}};function O(i){return function(...e){let t={method:i};if(/^get/.test(i))if(e.length>0&&typeof e[0]=="function"){let r=e[0];this.send(t,r,e[1]);return}else return new Promise(r=>{this.send(t,n=>{r(n)})});else return/^set/.test(i)&&(o.assert(e.length!==0,"Set methods require a value."),t.value=e[0]),new Promise(r=>{["play","pause","mute","unmute"].includes(i)?(this.send(t),r()):this.send(t,()=>{r()})})}}for(let i of o.METHODS.all())Object.hasOwn(m.prototype,i)||(m.prototype[i]=O(i));o.addEvent(window,"message",i=>{let e;try{e=JSON.parse(i.data)}catch(t){return!1}if(e.context!==o.CONTEXT)return!1;e.event==="ready"&&e.value&&e.value.src&&b.push(e.value.src)});var P=m;var f=class{constructor(e,t,r=!1){this.isReady=!1,this.debug=r,this.logger=new h(r),document.referrer?this.origin=new URL(document.referrer).origin:this.origin="*",this.methods={},this.supported={events:e||o.EVENTS.all(),methods:t||o.METHODS.all()},this.eventListeners={},this.reject=!(window.self!==window.top&&o.POST_MESSAGE),this.reject||o.addEvent(window,"message",n=>{this.receive(n)})}receive(e){if(e.origin!==this.origin)return!1;let t={};if(typeof e.data=="object")t=e.data;else try{t=window.JSON.parse(e.data)}catch(n){this.logger.error("JSON Parse Error",n)}if(this.logger.debug("Receiver.receive",e,t),!t.method||t.context!==o.CONTEXT)return!1;if(!o.METHODS.all().includes(t.method))return this.emit("error",{code:2,msg:'Invalid Method "'+t.method+'"'}),!1;let r=o.isNone(t.listener)?null:t.listener;if(t.method==="addEventListener")Object.hasOwn(this.eventListeners,t.value)?this.eventListeners[t.value].includes(r)||this.eventListeners[t.value].push(r):this.eventListeners[t.value]=[r],t.value==="ready"&&this.isReady&&this.ready();else if(t.method==="removeEventListener"){if(Object.hasOwn(this.eventListeners,t.value)){let n=this.eventListeners[t.value].indexOf(r);n>-1&&this.eventListeners[t.value].splice(n,1),this.eventListeners[t.value].length===0&&delete this.eventListeners[t.value]}}else this.get(t.method,t.value,r);return!0}get(e,t,r){if(!Object.hasOwn(this.methods,e))return this.emit("error",{code:3,msg:'Method Not Supported "'+e+'"'}),!1;let n=this.methods[e];if(e.substr(0,3)==="get"){let s=a=>{this.send(e,a,r)};n.call(this,s)}else n.call(this,t);return!0}on(e,t){this.methods[e]=t}send(e,t,r){if(this.logger.debug("Receiver.send",e,t,r),this.reject)return this.logger.error("Receiver.send.reject",e,t,r),!1;let n={context:o.CONTEXT,version:o.VERSION,event:e};o.isNone(t)||(n.value=t),o.isNone(r)||(n.listener=r);let s=JSON.stringify(n);return window.parent.postMessage(s,this.origin===""?"*":this.origin),!0}emit(e,t){if(!Object.hasOwn(this.eventListeners,e))return!1;this.logger.debug("Receiver.emit",e,t,this.eventListeners[e]);for(let r=0;r<this.eventListeners[e].length;r++){let n=this.eventListeners[e][r];this.send(e,t,n)}return!0}ready(){this.logger.debug("Receiver.ready"),this.isReady=!0;let e={src:window.location.toString(),events:this.supported.events,methods:this.supported.methods};this.emit("ready",e)||this.send("ready",e)}},d=f;var v=class{constructor(){this.init()}init(){let e={duration:20,currentTime:0,interval:null,timeupdate:()=>{},volume:100,mute:!1,playing:!1,loop:!1,playbackRate:1,play:()=>{e.interval=setInterval(()=>{e.currentTime+=.25,e.timeupdate({seconds:e.currentTime,duration:e.duration})},250),e.playing=!0},pause:()=>{e.interval&&clearInterval(e.interval),e.playing=!1}},t=new d;this.receiver=t,t.on("play",function(){e.play(),this.emit("play"),e.timeupdate=r=>{this.emit("timeupdate",r)}}),t.on("pause",function(){e.pause(),this.emit("pause")}),t.on("getPaused",r=>{let n=!e.playing;r(n)}),t.on("getCurrentTime",r=>{r(e.currentTime)}),t.on("setCurrentTime",r=>{e.currentTime=r}),t.on("getDuration",r=>{r(e.duration)}),t.on("getVolume",r=>{r(e.volume)}),t.on("setVolume",r=>{e.volume=r}),t.on("mute",()=>{e.mute=!0}),t.on("unmute",()=>{e.mute=!1}),t.on("getMuted",r=>{r(e.mute)}),t.on("getLoop",r=>{r(e.loop)}),t.on("setLoop",r=>{e.loop=r}),t.on("setPlaybackRate",r=>{e.playbackRate=r}),t.on("getPlaybackRate",r=>{r(e.playbackRate)})}ready(){this.receiver.ready()}},M=v;var y=class{constructor(e){this.init(e)}init(e){o.assert(e,"VideoJSReceiver requires a player object");let t=new d;this.receiver=t,e.on("pause",()=>{t.emit("pause")}),e.on("play",()=>{t.emit("play")}),e.on("timeupdate",()=>{let r=e.currentTime(),n=e.duration();if(!r||!n)return!1;let s={seconds:r,duration:n};t.emit("timeupdate",s)}),e.on("ended",()=>{t.emit("ended")}),e.on("error",()=>{t.emit("error")}),t.on("play",()=>{e.play()}),t.on("pause",()=>{e.pause()}),t.on("getPaused",r=>{r(e.paused())}),t.on("getCurrentTime",r=>{r(e.currentTime())}),t.on("setCurrentTime",r=>{e.currentTime(r)}),t.on("getDuration",r=>{r(e.duration())}),t.on("getVolume",r=>{let n=e.volume()*100;r(n)}),t.on("setVolume",r=>{e.volume(r/100)}),t.on("mute",()=>{e.volume(0)}),t.on("unmute",()=>{e.volume(1)}),t.on("getMuted",r=>{let n=e.volume()===0;r(n)}),t.on("getLoop",r=>{r(e.loop())}),t.on("setLoop",r=>{e.loop(r)}),t.on("setPlaybackRate",r=>{e.playbackRate(r)}),t.on("getPlaybackRate",r=>{r(e.playbackRate())})}ready(){this.receiver.ready()}},R=y;var E=class{constructor(e){this.init(e)}init(e){o.assert(e,"HTML5Adapter requires a video element");let t=new d;this.receiver=t,e.addEventListener("playing",()=>{t.emit("play")}),e.addEventListener("pause",()=>{t.emit("pause")}),e.addEventListener("ended",()=>{t.emit("ended")}),e.addEventListener("timeupdate",()=>{t.emit("timeupdate",{seconds:e.currentTime,duration:e.duration})}),e.addEventListener("progress",()=>{t.emit("buffered",{percent:e.buffered.length})}),t.on("play",()=>{e.play()}),t.on("pause",()=>{e.pause()}),t.on("getPaused",r=>{r(e.paused)}),t.on("getCurrentTime",r=>{r(e.currentTime)}),t.on("setCurrentTime",r=>{e.currentTime=r}),t.on("getDuration",r=>{r(e.duration)}),t.on("getVolume",r=>{let n=e.volume*100;r(n)}),t.on("setVolume",r=>{e.volume=r/100}),t.on("mute",()=>{e.muted=!0}),t.on("unmute",()=>{e.muted=!1}),t.on("getMuted",r=>{r(e.muted)}),t.on("getLoop",r=>{r(e.loop)}),t.on("setLoop",r=>{e.loop=r}),t.on("setPlaybackRate",r=>{e.playbackRate=r}),t.on("getPlaybackRate",r=>{r(e.playbackRate)})}ready(){this.receiver.ready()}},S=E;var L={Player:P,Receiver:d,MockAdapter:M,VideoJSAdapter:R,HTML5Adapter:S,CONTEXT:o.CONTEXT,VERSION:o.VERSION,METHODS:o.METHODS,addEvent:o.addEvent};typeof window!="undefined"&&(window.playerjs=L);var Z=L;})();
2
2
  //# sourceMappingURL=main.global.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core.ts","../src/keeper.ts","../src/player.ts","../src/receiver.ts","../src/adapters/mock.ts","../src/adapters/video.ts","../src/adapters/html.ts","../src/main.ts"],"sourcesContent":["import { PlayerEvents, PlayerMethods, Core } from './types'\n\nconst core: Core = {\n EVENTS: {\n READY: 'ready',\n PLAY: 'play',\n PAUSE: 'pause',\n ENDED: 'ended',\n TIMEUPDATE: 'timeupdate',\n PROGRESS: 'progress',\n SEEKED: 'seeked',\n ERROR: 'error',\n FULLSCREEN_CHANGE: 'fullscreenChange',\n PIP_CHANGE: 'pipChange',\n PLAYBACK_RATE_CHANGE: 'playbackRateChange',\n AUDIO_CHANGE: 'audioChange',\n QUALITY_CHANGE: 'qualityChange',\n VOLUME_CHANGE: 'volumeChange',\n all(): string[] {\n const all: string[] = []\n for (const key in core.EVENTS) {\n if (core.has(core.EVENTS, key) && core.isString((core.EVENTS as any)[key])) {\n all.push((core.EVENTS as any)[key])\n }\n }\n return all\n }\n } as PlayerEvents,\n\n POST_MESSAGE: !!window.postMessage,\n\n METHODS: {\n PLAY: 'play',\n PAUSE: 'pause',\n GETPAUSED: 'getPaused',\n MUTE: 'mute',\n UNMUTE: 'unmute',\n GETMUTED: 'getMuted',\n SETVOLUME: 'setVolume',\n GETVOLUME: 'getVolume',\n GETDURATION: 'getDuration',\n SETCURRENTTIME: 'setCurrentTime',\n GETCURRENTTIME: 'getCurrentTime',\n SETLOOP: 'setLoop',\n GETLOOP: 'getLoop',\n SETPLAYBACKRATE: 'setPlaybackRate',\n GETPLAYBACKRATE: 'getPlaybackRate',\n REMOVEEVENTLISTENER: 'removeEventListener',\n ADDEVENTLISTENER: 'addEventListener',\n all(): string[] {\n const all: string[] = []\n for (const key in core.METHODS) {\n if (core.has(core.METHODS, key) && core.isString((core.METHODS as any)[key])) {\n all.push((core.METHODS as any)[key])\n }\n }\n return all\n }\n } as PlayerMethods,\n\n DEBUG: false,\n VERSION: '2.0',\n CONTEXT: 'player.js',\n\n isString(obj: any): obj is string {\n return Object.prototype.toString.call(obj) === '[object String]'\n },\n\n has(obj: object, key: string): boolean {\n return Object.prototype.hasOwnProperty.call(obj, key)\n },\n\n addEvent(elem: any, type: string, eventHandle: (e: any) => void): void {\n if (!elem) { return }\n if (elem.addEventListener) {\n elem.addEventListener(type, eventHandle, false)\n } else if (elem.attachEvent) {\n elem.attachEvent('on' + type, eventHandle)\n } else {\n elem['on' + type] = eventHandle\n }\n },\n\n isNone(obj: any): obj is null | undefined {\n return (obj === null || obj === undefined)\n },\n\n assert(test: any, msg?: string): asserts test {\n if (!test) {\n throw msg || 'Player.js Assert Failed'\n }\n },\n\n generateUUID(): string {\n if (crypto && crypto.randomUUID) {\n return crypto.randomUUID()\n } else {\n const url = URL.createObjectURL(new Blob())\n return url.substring(url.lastIndexOf('/') + 1)\n }\n },\n\n isArray(obj: any): obj is any[] {\n return Object.prototype.toString.call(obj) === '[object Array]'\n }\n}\n\nexport default core\n","/*\n* Keeper is just a method for keeping track of all the callbacks.\n*/\nimport core from './core'\nimport { KeeperData, EventCallback } from './types'\n\nclass Keeper {\n private data: { [event: string]: KeeperData[] }\n\n constructor() {\n this.data = {}\n }\n\n has(event: string, id?: string): boolean {\n if (!Object.prototype.hasOwnProperty.call(this.data, event)) {\n return false\n }\n\n if (core.isNone(id)) {\n return true\n }\n\n // Figure out if we have the event.\n const events = this.data[event]\n\n for (let i = 0; i < events.length; i++) {\n if (events[i].id === id) {\n return true\n }\n }\n\n return false\n }\n\n add(id: string, event: string, cb: EventCallback, ctx?: any, one: boolean = false): void {\n const d: KeeperData = {\n id,\n event,\n cb,\n ctx,\n one\n }\n\n if (this.has(event)) {\n this.data[event].push(d)\n } else {\n this.data[event] = [d]\n }\n }\n\n execute(event: string, id?: string, data?: any, ctx?: any): boolean {\n if (!this.has(event, id)) {\n return false\n }\n\n const keep: KeeperData[] = []\n const execute: Array<{cb: EventCallback, ctx: any, data: any}> = []\n\n for (let i = 0; i < this.data[event].length; i++) {\n const d = this.data[event][i]\n\n // There are omni events, in that they do not have an id. i.e \"ready\".\n // Or there is an ID and we only want to execute the right id'd method.\n if (core.isNone(id) || (!core.isNone(id) && d.id === id)) {\n execute.push({\n cb: d.cb,\n ctx: d.ctx ? d.ctx : ctx,\n data\n })\n\n // If we only wanted to execute this once.\n if (d.one === false) {\n keep.push(d)\n }\n } else {\n keep.push(d)\n }\n }\n\n if (keep.length === 0) {\n delete this.data[event]\n } else {\n this.data[event] = keep\n }\n\n // We need to execute everything after we deal with the one stuff. otherwise\n // we have issues to order of operations.\n for (let n = 0; n < execute.length; n++) {\n const e = execute[n]\n e.cb.call(e.ctx, e.data)\n }\n\n return true\n }\n\n on(id: string, event: string, cb: EventCallback, ctx?: any): void {\n this.add(id, event, cb, ctx, false)\n }\n\n one(id: string, event: string, cb: EventCallback, ctx?: any): void {\n this.add(id, event, cb, ctx, true)\n }\n\n off(event: string, cb?: EventCallback): string[] {\n // We should probably restructure so this is a bit less of a pain.\n const listeners: string[] = []\n\n if (!Object.prototype.hasOwnProperty.call(this.data, event)) {\n return listeners\n }\n\n const keep: KeeperData[] = []\n\n // Loop through everything.\n for (let i = 0; i < this.data[event].length; i++) {\n const data = this.data[event][i]\n // If we only keep if there was a CB and the CB is there.\n if (!core.isNone(cb) && data.cb !== cb) {\n keep.push(data)\n } else if (!core.isNone(data.id)) {\n listeners.push(data.id)\n }\n }\n\n if (keep.length === 0) {\n delete this.data[event]\n } else {\n this.data[event] = keep\n }\n\n return listeners\n }\n}\n\nexport default Keeper\n","/*\n* Player.js is a javascript library for interacting with iframes via\n* postMessage that use an Open Player Spec\n*\n*/\nimport core from './core'\nimport Keeper from './keeper'\nimport { PlayerData, ReadyData, EventCallback, MethodCallback, GetMethodPromise, SetMethodPromise } from './types'\n\nconst READIED: string[] = []\n\nclass Player {\n public READIED: string[]\n public elem: HTMLIFrameElement\n public debug: boolean\n public origin: string\n public keeper: Keeper\n public isReady: boolean\n public queue: PlayerData[]\n public events: string[]\n public methods: string[]\n public loaded?: boolean\n\n constructor(elem: string | HTMLIFrameElement, debug: boolean = false) {\n const self = this\n this.READIED = READIED\n\n if (core.isString(elem)) {\n const element = document.getElementById(elem) as HTMLIFrameElement\n if (!element) {\n throw new Error(`Element with id \"${elem}\" not found`)\n }\n elem = element\n }\n\n this.elem = elem\n\n this.debug = debug\n\n // make sure we have an iframe\n core.assert(elem.nodeName === 'IFRAME',\n 'playerjs.Player constructor requires an Iframe, got \"' + elem.nodeName + '\"')\n core.assert(elem.src,\n 'playerjs.Player constructor requires a Iframe with a \\'src\\' attribute.')\n\n // Figure out the origin of where we are sending messages.\n this.origin = (new URL(elem.src)).origin\n\n // Event handling.\n this.keeper = new Keeper()\n\n // Queuing before ready.\n this.isReady = false\n this.queue = []\n\n // Assume that everything is supported, unless we know otherwise.\n this.events = core.EVENTS.all()\n this.methods = core.METHODS.all()\n\n if (core.POST_MESSAGE) {\n // Set up the reciever.\n core.addEvent(window, 'message', function (e: MessageEvent) {\n self.receive(e)\n })\n } else {\n console.error('Post Message is not Available.')\n }\n\n // See if we caught the src event first, otherwise assume we haven't loaded\n if (READIED.includes(elem.src)) {\n self.loaded = true\n } else {\n // Try the onload event, just lets us give another test.\n this.elem.onload = function () {\n self.loaded = true\n }\n }\n }\n\n send(data: PlayerData, callback?: MethodCallback, ctx?: any): boolean {\n // Add the context and version to the data.\n data.context = core.CONTEXT\n data.version = core.VERSION\n\n // We are expecting a response.\n if (callback) {\n // Create a UUID\n const id = core.generateUUID()\n\n // Set the listener.\n data.listener = id\n\n // Only hang on to this listener once.\n this.keeper.one(id, data.method || '', callback, ctx)\n }\n\n if (!this.isReady && data.value !== 'ready') {\n if (this.debug) {\n console.debug('Player.queue', data)\n }\n this.queue.push(data)\n return false\n }\n\n if (this.debug) {\n console.debug('Player.send', data, this.origin)\n }\n\n if (this.loaded === true && this.elem.contentWindow) {\n this.elem.contentWindow.postMessage(JSON.stringify(data), this.origin)\n }\n\n return true\n }\n\n receive(e: MessageEvent): boolean {\n if (this.debug) {\n console.debug('Player.receive', e)\n }\n\n if (e.origin !== this.origin) {\n return false\n }\n\n let data: any\n try {\n data = JSON.parse(e.data)\n } catch (err) {\n // Not a valid response.\n return false\n }\n\n // abort if this message wasn't a player.js message\n if (data.context !== core.CONTEXT) {\n return false\n }\n\n // We need to determine if we are ready.\n if (data.event === 'ready' && data.value && data.value.src === this.elem.src) {\n this.ready(data as ReadyData)\n }\n\n if (this.keeper.has(data.event, data.listener)) {\n this.keeper.execute(data.event, data.listener, data.value, this)\n }\n\n return true\n }\n\n ready(data: ReadyData): boolean {\n if (this.isReady === true) {\n return false\n }\n\n // If we got a list of supported methods, we should set them.\n if (data.value.events) {\n this.events = data.value.events\n }\n if (data.value.methods) {\n this.methods = data.value.methods\n }\n\n // set ready.\n this.isReady = true\n this.loaded = true\n\n // Clear the queue\n for (let i = 0; i < this.queue.length; i++) {\n const obj = this.queue[i]\n\n if (this.debug) {\n console.debug('Player.dequeue', obj)\n }\n\n if (data.event === 'ready') {\n this.keeper.execute(obj.event || '', obj.listener, true, this)\n }\n this.send(obj)\n }\n this.queue = []\n\n return true\n }\n\n on(event: string, callback: EventCallback, ctx?: any): boolean {\n const id = core.generateUUID()\n\n if (event === 'ready') {\n // We only want to call ready once.\n this.keeper.one(id, event, callback, ctx)\n } else {\n this.keeper.on(id, event, callback, ctx)\n }\n\n this.send({\n method: 'addEventListener',\n value: event,\n listener: id\n })\n\n return true\n }\n\n off(event: string, callback?: EventCallback): boolean {\n const listeners = this.keeper.off(event, callback)\n if (this.debug) {\n console.debug('Player.off', listeners)\n }\n\n if (listeners.length > 0) {\n for (const i in listeners) {\n this.send({\n method: 'removeEventListener',\n value: event,\n listener: listeners[i]\n })\n }\n return true\n }\n\n return false\n }\n\n // Based on what ready passed back, we can determine if the events/method are\n // supported by the player.\n supports(evtOrMethod: 'event' | 'method', names: string | string[]): boolean {\n core.assert(['method', 'event'].includes(evtOrMethod),\n 'evtOrMethod needs to be either \"event\" or \"method\" got ' + evtOrMethod)\n\n // Make everything an array.\n names = core.isArray(names) ? names : [names]\n\n const all = evtOrMethod === 'event' ? this.events : this.methods\n\n for (let i = 0; i < names.length; i++) {\n if (!all.includes(names[i])) {\n return false\n }\n }\n\n return true\n }\n\n // Dynamic method generation will be added via the prototype modification below\n // Method overloads for both promise and callback styles\n \n // Play/Pause methods (no return value needed)\n play?(): Promise<void>\n pause?(): Promise<void>\n mute?(): Promise<void>\n unmute?(): Promise<void>\n \n // Getter methods with overloads\n getPaused?(): GetMethodPromise<boolean>\n getPaused?(callback: MethodCallback): void\n \n getMuted?(): GetMethodPromise<boolean>\n getMuted?(callback: MethodCallback): void\n \n getVolume?(): GetMethodPromise<number>\n getVolume?(callback: MethodCallback): void\n \n getDuration?(): GetMethodPromise<number>\n getDuration?(callback: MethodCallback): void\n \n getCurrentTime?(): GetMethodPromise<number>\n getCurrentTime?(callback: MethodCallback): void\n \n getLoop?(): GetMethodPromise<boolean>\n getLoop?(callback: MethodCallback): void\n \n getPlaybackRate?(): GetMethodPromise<number>\n getPlaybackRate?(callback: MethodCallback): void\n \n // Setter methods\n setVolume?(volume: number): SetMethodPromise\n setCurrentTime?(time: number): SetMethodPromise\n setLoop?(loop: boolean): SetMethodPromise\n setPlaybackRate?(rate: number): SetMethodPromise\n}\n\n// create function to add to the Player prototype\nfunction createPrototypeFunction(name: string) {\n return function (this: Player, ...args: any[]): any {\n const data: PlayerData = {\n method: name\n }\n\n // for getters, check if callback is provided or return a promise\n if (/^get/.test(name)) {\n // If a callback is provided, use callback style\n if (args.length > 0 && typeof args[0] === 'function') {\n const callback = args[0]\n this.send(data, callback, args[1])\n return\n } else {\n // Return a promise\n return new Promise((resolve, reject) => {\n this.send(data, (value: any) => {\n resolve(value)\n })\n })\n }\n } else {\n // for setters and action methods, return a promise\n if (/^set/.test(name)) {\n core.assert(args.length !== 0, 'Set methods require a value.')\n data.value = args[0]\n }\n \n // For action methods (play, pause, mute, unmute) and setters, return promise\n return new Promise<void>((resolve, reject) => {\n // For action methods, we don't need to wait for a response\n if (['play', 'pause', 'mute', 'unmute'].includes(name)) {\n this.send(data)\n resolve()\n } else {\n // For setters, we might want to wait for confirmation\n this.send(data, () => {\n resolve()\n })\n }\n })\n }\n }\n}\n\n// Loop through the methods to add them to the prototype.\nfor (const methodName of core.METHODS.all()) {\n if (!Object.prototype.hasOwnProperty.call(Player.prototype, methodName)) {\n (Player.prototype as any)[methodName] = createPrototypeFunction(methodName)\n }\n}\n\ncore.addEvent(window, 'message', function (e: MessageEvent) {\n let data: any\n try {\n data = JSON.parse(e.data)\n } catch (err) {\n return false\n }\n\n // abort if this message wasn't a player.js message\n if (data.context !== core.CONTEXT) {\n return false\n }\n\n // We need to determine if we are ready.\n if (data.event === 'ready' && data.value && data.value.src) {\n READIED.push(data.value.src)\n }\n})\n\nexport default Player\n","/*\n* Does all the wiring up for the backend.\n*\n* var receiver = new playerjs.Receiver();\n* receiver.on('play', function(){ video.play() });\n* receiver.on('getDuration', function(callback){ callback(video.duration) });\n* receiver.emit('timeupdate', {});\n*/\n\nimport core from './core'\nimport { SupportedFeatures, EventCallback, MethodCallback } from './types'\n\nclass Receiver {\n public isReady: boolean\n public origin: string\n public methods: { [method: string]: Function }\n public supported: SupportedFeatures\n public eventListeners: { [event: string]: (string | null)[] }\n public reject: boolean\n\n constructor(events?: string[], methods?: string[]) {\n const self = this\n\n // Deal with the ready crap.\n this.isReady = false\n\n // Bind the window message.\n if (document.referrer) {\n this.origin = (new URL(document.referrer)).origin\n } else {\n this.origin = '*'\n }\n\n // Create a holder for all the methods.\n this.methods = {}\n\n // holds all the information about what's supported\n this.supported = {\n events: events || core.EVENTS.all(),\n methods: methods || core.METHODS.all()\n }\n\n // Deals with the adding and removing of event listeners.\n this.eventListeners = {}\n\n // We can't send any messages.\n this.reject = !(window.self !== window.top && core.POST_MESSAGE)\n\n // We aren't in an iframe, don't listen.\n if (!this.reject) {\n core.addEvent(window, 'message', function (e: MessageEvent) {\n self.receive(e)\n })\n }\n }\n\n receive(e: MessageEvent): boolean {\n // Only want to listen to events that came from our origin.\n if (e.origin !== this.origin) {\n return false\n }\n\n // Browsers that support postMessage also support JSON.\n let data: any = {}\n if (typeof e.data === 'object') {\n data = e.data\n } else {\n try {\n data = window.JSON.parse(e.data)\n } catch (err) {\n console.error('JSON Parse Error', err)\n }\n }\n\n console.debug('Receiver.receive', e, data)\n\n // Nothing for us to do.\n if (!data.method) {\n return false\n }\n\n // make sure the context is correct.\n if (data.context !== core.CONTEXT) {\n return false\n }\n\n // Make sure we have a valid method.\n if (!core.METHODS.all().includes(data.method)) {\n this.emit('error', {\n code: 2,\n msg: 'Invalid Method \"' + data.method + '\"'\n })\n return false\n }\n\n // See if we added a listener\n const listener = !core.isNone(data.listener) ? data.listener : null\n\n // Add Event Listener.\n if (data.method === 'addEventListener') {\n if (Object.prototype.hasOwnProperty.call(this.eventListeners, data.value)) {\n // If the listener is the same, i.e. null only add it once.\n if (!this.eventListeners[data.value].includes(listener)) {\n this.eventListeners[data.value].push(listener)\n }\n } else {\n this.eventListeners[data.value] = [listener]\n }\n\n if (data.value === 'ready' && this.isReady) {\n this.ready()\n }\n } else if (data.method === 'removeEventListener') { // Remove the event listener.\n if (Object.prototype.hasOwnProperty.call(this.eventListeners, data.value)) {\n const index = this.eventListeners[data.value].indexOf(listener)\n\n // if we find the element, remove it.\n if (index > -1) {\n this.eventListeners[data.value].splice(index, 1)\n }\n\n if (this.eventListeners[data.value].length === 0) {\n delete this.eventListeners[data.value]\n }\n }\n } else { // Go get it.\n this.get(data.method, data.value, listener)\n }\n\n return true\n }\n\n get(method: string, value: any, listener: string | null): boolean {\n const self = this\n\n // Now lets do it.\n if (!Object.prototype.hasOwnProperty.call(this.methods, method)) {\n this.emit('error', {\n code: 3,\n msg: 'Method Not Supported \"' + method + '\"'\n })\n return false\n }\n\n const func = this.methods[method]\n\n if (method.substr(0, 3) === 'get') {\n const callback = function (val: any) {\n self.send(method, val, listener)\n }\n func.call(this, callback)\n } else {\n func.call(this, value)\n }\n\n return true\n }\n\n on(event: string, callback: Function): void {\n this.methods[event] = callback\n }\n\n send(event: string, value?: any, listener?: string | null): boolean {\n console.debug('Receiver.send', event, value, listener)\n\n if (this.reject) {\n // We are not in a frame, or we don't support POST_MESSAGE\n console.error('Receiver.send.reject', event, value, listener)\n return false\n }\n\n const data: any = {\n context: core.CONTEXT,\n version: core.VERSION,\n event\n }\n\n if (!core.isNone(value)) {\n data.value = value\n }\n\n if (!core.isNone(listener)) {\n data.listener = listener\n }\n\n const msg = JSON.stringify(data)\n window.parent.postMessage(msg, this.origin === '' ? '*' : this.origin)\n\n return true\n }\n\n emit(event: string, value?: any): boolean {\n if (!Object.prototype.hasOwnProperty.call(this.eventListeners, event)) {\n return false\n }\n\n console.debug('Instance.emit', event, value, this.eventListeners[event])\n\n for (let i = 0; i < this.eventListeners[event].length; i++) {\n const listener = this.eventListeners[event][i]\n this.send(event, value, listener)\n }\n\n return true\n }\n\n ready(): void {\n console.debug('Receiver.ready')\n this.isReady = true\n\n const data = {\n src: window.location.toString(),\n events: this.supported.events,\n methods: this.supported.methods\n }\n\n if (!this.emit('ready', data)) {\n this.send('ready', data)\n }\n }\n}\n\nexport default Receiver\n","import Receiver from '../receiver'\n\ninterface MockVideo {\n duration: number\n currentTime: number\n interval: NodeJS.Timeout | null\n timeupdate: (data: { seconds: number; duration: number }) => void\n volume: number\n mute: boolean\n playing: boolean\n loop: boolean\n playbackRate: number\n play: () => void\n pause: () => void\n}\n\nclass MockAdapter {\n public receiver!: Receiver\n\n constructor() {\n this.init()\n }\n\n init(): void {\n // Our mock video\n const video: MockVideo = {\n duration: 20,\n currentTime: 0,\n interval: null,\n timeupdate: function () {},\n volume: 100,\n mute: false,\n playing: false,\n loop: false,\n playbackRate: 1,\n play: function () {\n video.interval = setInterval(function () {\n video.currentTime += 0.25\n video.timeupdate({\n seconds: video.currentTime,\n duration: video.duration\n })\n }, 250)\n video.playing = true\n },\n pause: function () {\n if (video.interval) {\n clearInterval(video.interval)\n }\n video.playing = false\n }\n }\n\n // Set up the actual receiver\n const receiver = this.receiver = new Receiver()\n\n receiver.on('play', function (this: Receiver) {\n const self = this\n video.play()\n this.emit('play')\n video.timeupdate = function (data: { seconds: number; duration: number }) {\n self.emit('timeupdate', data)\n }\n })\n\n receiver.on('pause', function (this: Receiver) {\n video.pause()\n this.emit('pause')\n })\n\n receiver.on('getPaused', function (callback: (isPaused: boolean) => void) {\n const isPaused = !video.playing\n callback(isPaused)\n })\n\n receiver.on('getCurrentTime', function (callback: (time: number) => void) {\n callback(video.currentTime)\n })\n\n receiver.on('setCurrentTime', function (value: number) {\n video.currentTime = value\n })\n\n receiver.on('getDuration', function (callback: (duration: number) => void) {\n callback(video.duration)\n })\n\n receiver.on('getVolume', function (callback: (volume: number) => void) {\n callback(video.volume)\n })\n\n receiver.on('setVolume', function (value: number) {\n video.volume = value\n })\n\n receiver.on('mute', function () {\n video.mute = true\n })\n\n receiver.on('unmute', function () {\n video.mute = false\n })\n\n receiver.on('getMuted', function (callback: (muted: boolean) => void) {\n callback(video.mute)\n })\n\n receiver.on('getLoop', function (callback: (loop: boolean) => void) {\n callback(video.loop)\n })\n\n receiver.on('setLoop', function (value: boolean) {\n video.loop = value\n })\n\n receiver.on('setPlaybackRate', function (value: number) {\n video.playbackRate = value\n })\n\n receiver.on('getPlaybackRate', function (callback: (rate: number) => void) {\n callback(video.playbackRate)\n })\n }\n\n ready(): void {\n this.receiver.ready()\n }\n}\n\nexport default MockAdapter\n","import core from '../core'\nimport Receiver from '../receiver'\n\n// VideoJS player interface - adjust based on actual VideoJS types if available\ninterface VideoJSPlayer {\n on(event: string, callback: () => void): void\n play(): void\n pause(): void\n paused(): boolean\n currentTime(time?: number): number\n duration(): number\n volume(vol?: number): number\n loop(loop?: boolean): boolean\n playbackRate(rate?: number): number\n}\n\nclass VideoJSAdapter {\n public receiver!: Receiver\n\n constructor(player: VideoJSPlayer) {\n this.init(player)\n }\n\n init(player: VideoJSPlayer): void {\n core.assert(player, 'VideoJSReceiver requires a player object')\n\n // Set up the actual receiver\n const receiver = this.receiver = new Receiver()\n\n /* EVENTS */\n player.on('pause', function () {\n receiver.emit('pause')\n })\n\n player.on('play', function () {\n receiver.emit('play')\n })\n\n player.on('timeupdate', function () {\n const seconds = player.currentTime()\n const duration = player.duration()\n\n if (!seconds || !duration) {\n return false\n }\n\n const value = {\n seconds,\n duration\n }\n receiver.emit('timeupdate', value)\n })\n\n player.on('ended', function () {\n receiver.emit('ended')\n })\n\n player.on('error', function () {\n receiver.emit('error')\n })\n\n /* METHODS */\n receiver.on('play', function () {\n player.play()\n })\n\n receiver.on('pause', function () {\n player.pause()\n })\n\n receiver.on('getPaused', function (callback: (paused: boolean) => void) {\n callback(player.paused())\n })\n\n receiver.on('getCurrentTime', function (callback: (time: number) => void) {\n callback(player.currentTime())\n })\n\n receiver.on('setCurrentTime', function (value: number) {\n player.currentTime(value)\n })\n\n receiver.on('getDuration', function (callback: (duration: number) => void) {\n callback(player.duration())\n })\n\n receiver.on('getVolume', function (callback: (volume: number) => void) {\n const volume = player.volume() * 100\n callback(volume)\n })\n\n receiver.on('setVolume', function (value: number) {\n player.volume(value / 100)\n })\n\n receiver.on('mute', function () {\n player.volume(0)\n })\n\n receiver.on('unmute', function () {\n player.volume(1)\n })\n\n receiver.on('getMuted', function (callback: (muted: boolean) => void) {\n const isMuted = player.volume() === 0\n callback(isMuted)\n })\n\n receiver.on('getLoop', function (callback: (loop: boolean) => void) {\n callback(player.loop())\n })\n\n receiver.on('setLoop', function (value: boolean) {\n player.loop(value)\n })\n\n receiver.on('setPlaybackRate', function (value: number) {\n player.playbackRate(value)\n })\n\n receiver.on('getPlaybackRate', function (callback: (rate: number) => void) {\n callback(player.playbackRate())\n })\n }\n\n ready(): void {\n this.receiver.ready()\n }\n}\n\nexport default VideoJSAdapter\n","import core from '../core'\nimport Receiver from '../receiver'\n\nclass HTML5Adapter {\n public receiver!: Receiver\n\n constructor(video: HTMLVideoElement) {\n this.init(video)\n }\n\n init(video: HTMLVideoElement): void {\n core.assert(video, 'HTML5Adapter requires a video element')\n\n // Set up the actual receiver\n const receiver = this.receiver = new Receiver()\n\n /* EVENTS */\n video.addEventListener('playing', function () {\n receiver.emit('play')\n })\n\n video.addEventListener('pause', function () {\n receiver.emit('pause')\n })\n\n video.addEventListener('ended', function () {\n receiver.emit('ended')\n })\n\n video.addEventListener('timeupdate', function () {\n receiver.emit('timeupdate', {\n seconds: video.currentTime,\n duration: video.duration\n })\n })\n\n video.addEventListener('progress', function () {\n receiver.emit('buffered', {\n percent: video.buffered.length\n })\n })\n\n /* Methods */\n receiver.on('play', function () {\n video.play()\n })\n\n receiver.on('pause', function () {\n video.pause()\n })\n\n receiver.on('getPaused', function (callback: (paused: boolean) => void) {\n callback(video.paused)\n })\n\n receiver.on('getCurrentTime', function (callback: (time: number) => void) {\n callback(video.currentTime)\n })\n\n receiver.on('setCurrentTime', function (value: number) {\n video.currentTime = value\n })\n\n receiver.on('getDuration', function (callback: (duration: number) => void) {\n callback(video.duration)\n })\n\n receiver.on('getVolume', function (callback: (volume: number) => void) {\n const volume = video.volume * 100\n callback(volume)\n })\n\n receiver.on('setVolume', function (value: number) {\n video.volume = value / 100\n })\n\n receiver.on('mute', function () {\n video.muted = true\n })\n\n receiver.on('unmute', function () {\n video.muted = false\n })\n\n receiver.on('getMuted', function (callback: (muted: boolean) => void) {\n callback(video.muted)\n })\n\n receiver.on('getLoop', function (callback: (loop: boolean) => void) {\n callback(video.loop)\n })\n\n receiver.on('setLoop', function (value: boolean) {\n video.loop = value\n })\n\n receiver.on('setPlaybackRate', function (value: number) {\n video.playbackRate = value\n })\n\n receiver.on('getPlaybackRate', function (callback: (rate: number) => void) {\n callback(video.playbackRate)\n })\n }\n\n ready(): void {\n this.receiver.ready()\n }\n}\n\nexport default HTML5Adapter\n","import core from './core'\nimport Player from './player'\nimport Receiver from './receiver'\nimport MockAdapter from './adapters/mock'\nimport VideoJSAdapter from './adapters/video'\nimport HTML5Adapter from './adapters/html'\nimport { PlayerMethods } from './types'\n\ninterface PlayerJS {\n Player: typeof Player\n Receiver: typeof Receiver\n MockAdapter: typeof MockAdapter\n VideoJSAdapter: typeof VideoJSAdapter\n HTML5Adapter: typeof HTML5Adapter\n CONTEXT: string\n VERSION: string\n METHODS: PlayerMethods\n addEvent: typeof core.addEvent\n}\n\nconst playerjs: PlayerJS = {\n Player,\n Receiver,\n MockAdapter,\n VideoJSAdapter,\n HTML5Adapter,\n CONTEXT: core.CONTEXT,\n VERSION: core.VERSION,\n METHODS: core.METHODS,\n addEvent: core.addEvent\n}\n\n// Attach to the window object explicitly\ndeclare global {\n interface Window {\n playerjs: PlayerJS\n }\n}\n\nif (typeof window !== 'undefined') {\n window.playerjs = playerjs\n}\n\nexport default playerjs\n"],"mappings":"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","names":["core","all","key","obj","elem","type","eventHandle","test","msg","url","core_default","Keeper","event","id","core_default","events","i","cb","ctx","one","d","data","keep","execute","n","e","listeners","keeper_default","READIED","Player","elem","debug","self","core_default","element","keeper_default","e","data","callback","ctx","id","err","i","obj","event","listeners","evtOrMethod","names","all","createPrototypeFunction","name","args","resolve","reject","value","methodName","player_default","Receiver","events","methods","self","core_default","e","data","err","listener","index","method","value","func","callback","val","event","msg","i","receiver_default","MockAdapter","video","receiver","receiver_default","self","data","callback","isPaused","value","mock_default","VideoJSAdapter","player","core_default","receiver","receiver_default","seconds","duration","value","callback","volume","isMuted","video_default","HTML5Adapter","video","core_default","receiver","receiver_default","callback","value","volume","html_default","playerjs","player_default","receiver_default","mock_default","video_default","html_default","core_default","main_default"]}
1
+ {"version":3,"sources":["../src/core.ts","../src/keeper.ts","../src/logger.ts","../src/player.ts","../src/receiver.ts","../src/adapters/mock.ts","../src/adapters/video.ts","../src/adapters/html.ts","../src/main.ts"],"sourcesContent":["import type { PlayerEvents, PlayerMethods, Core } from './types'\n\nconst core: Core = {\n EVENTS: {\n READY: 'ready',\n PLAY: 'play',\n PAUSE: 'pause',\n ENDED: 'ended',\n TIMEUPDATE: 'timeupdate',\n PROGRESS: 'progress',\n SEEKED: 'seeked',\n ERROR: 'error',\n FULLSCREEN_CHANGE: 'fullscreenChange',\n PIP_CHANGE: 'pipChange',\n PLAYBACK_RATE_CHANGE: 'playbackRateChange',\n AUDIO_CHANGE: 'audioChange',\n QUALITY_CHANGE: 'qualityChange',\n VOLUME_CHANGE: 'volumeChange',\n all(): string[] {\n const all: string[] = []\n for (const key in core.EVENTS) {\n if (core.has(core.EVENTS, key) && core.isString((core.EVENTS as any)[key])) {\n all.push((core.EVENTS as any)[key])\n }\n }\n return all\n }\n } as PlayerEvents,\n\n POST_MESSAGE: !!window.postMessage,\n\n METHODS: {\n PLAY: 'play',\n PAUSE: 'pause',\n GETPAUSED: 'getPaused',\n MUTE: 'mute',\n UNMUTE: 'unmute',\n GETMUTED: 'getMuted',\n SETVOLUME: 'setVolume',\n GETVOLUME: 'getVolume',\n GETDURATION: 'getDuration',\n SETCURRENTTIME: 'setCurrentTime',\n GETCURRENTTIME: 'getCurrentTime',\n SETLOOP: 'setLoop',\n GETLOOP: 'getLoop',\n SETPLAYBACKRATE: 'setPlaybackRate',\n GETPLAYBACKRATE: 'getPlaybackRate',\n REMOVEEVENTLISTENER: 'removeEventListener',\n ADDEVENTLISTENER: 'addEventListener',\n all(): string[] {\n const all: string[] = []\n for (const key in core.METHODS) {\n if (core.has(core.METHODS, key) && core.isString((core.METHODS as any)[key])) {\n all.push((core.METHODS as any)[key])\n }\n }\n return all\n }\n } as PlayerMethods,\n\n DEBUG: false,\n VERSION: '2.0',\n CONTEXT: 'player.js',\n\n isString(obj: any): obj is string {\n return Object.prototype.toString.call(obj) === '[object String]'\n },\n\n has(obj: object, key: string): boolean {\n return Object.hasOwn(obj, key)\n },\n\n addEvent(elem: any, type: string, eventHandle: (e: any) => void): void {\n if (!elem) { return }\n if (elem.addEventListener) {\n elem.addEventListener(type, eventHandle, false)\n } else if (elem.attachEvent) {\n elem.attachEvent(`on${type}`, eventHandle)\n } else {\n elem[`on${type}`] = eventHandle\n }\n },\n\n isNone(obj: any): obj is null | undefined {\n return (obj === null || obj === undefined)\n },\n\n assert(test: any, msg?: string): asserts test {\n if (!test) {\n throw msg || 'Player.js Assert Failed'\n }\n },\n\n generateUUID(): string {\n if (crypto?.randomUUID) {\n return crypto.randomUUID()\n } else {\n const url = URL.createObjectURL(new Blob())\n return url.substring(url.lastIndexOf('/') + 1)\n }\n },\n\n isArray(obj: any): obj is any[] {\n return Object.prototype.toString.call(obj) === '[object Array]'\n }\n}\n\nexport default core\n","/*\n* Keeper is just a method for keeping track of all the callbacks.\n*/\nimport core from './core'\nimport type { KeeperData, EventCallback } from './types'\n\nclass Keeper {\n private data: { [event: string]: KeeperData[] }\n\n constructor() {\n this.data = {}\n }\n\n has(event: string, id?: string): boolean {\n if (!Object.hasOwn(this.data, event)) {\n return false\n }\n\n if (core.isNone(id)) {\n return true\n }\n\n // Figure out if we have the event.\n const events = this.data[event]\n\n for (let i = 0; i < events.length; i++) {\n if (events[i].id === id) {\n return true\n }\n }\n\n return false\n }\n\n add(id: string, event: string, cb: EventCallback, ctx?: any, one: boolean = false): void {\n const d: KeeperData = {\n id,\n event,\n cb,\n ctx,\n one\n }\n\n if (this.has(event)) {\n this.data[event].push(d)\n } else {\n this.data[event] = [d]\n }\n }\n\n execute(event: string, id?: string, data?: any, ctx?: any): boolean {\n if (!this.has(event, id)) {\n return false\n }\n\n const keep: KeeperData[] = []\n const execute: Array<{cb: EventCallback, ctx: any, data: any}> = []\n\n for (let i = 0; i < this.data[event].length; i++) {\n const d = this.data[event][i]\n\n // There are omni events, in that they do not have an id. i.e \"ready\".\n // Or there is an ID and we only want to execute the right id'd method.\n if (core.isNone(id) || (!core.isNone(id) && d.id === id)) {\n execute.push({\n cb: d.cb,\n ctx: d.ctx ? d.ctx : ctx,\n data\n })\n\n // If we only wanted to execute this once.\n if (d.one === false) {\n keep.push(d)\n }\n } else {\n keep.push(d)\n }\n }\n\n if (keep.length === 0) {\n delete this.data[event]\n } else {\n this.data[event] = keep\n }\n\n // We need to execute everything after we deal with the one stuff. otherwise\n // we have issues to order of operations.\n for (let n = 0; n < execute.length; n++) {\n const e = execute[n]\n e.cb.call(e.ctx, e.data)\n }\n\n return true\n }\n\n on(id: string, event: string, cb: EventCallback, ctx?: any): void {\n this.add(id, event, cb, ctx, false)\n }\n\n one(id: string, event: string, cb: EventCallback, ctx?: any): void {\n this.add(id, event, cb, ctx, true)\n }\n\n off(event: string, cb?: EventCallback): string[] {\n // We should probably restructure so this is a bit less of a pain.\n const listeners: string[] = []\n\n if (!Object.hasOwn(this.data, event)) {\n return listeners\n }\n\n const keep: KeeperData[] = []\n\n // Loop through everything.\n for (let i = 0; i < this.data[event].length; i++) {\n const data = this.data[event][i]\n // If we only keep if there was a CB and the CB is there.\n if (!core.isNone(cb) && data.cb !== cb) {\n keep.push(data)\n } else if (!core.isNone(data.id)) {\n listeners.push(data.id)\n }\n }\n\n if (keep.length === 0) {\n delete this.data[event]\n } else {\n this.data[event] = keep\n }\n\n return listeners\n }\n}\n\nexport default Keeper\n","/**\n * Conditional logger utility for player.js\n * Provides debug, log, warn, and error methods that only output when enabled\n */\n\nclass Logger {\n private enabled: boolean\n\n constructor(enabled: boolean = false) {\n this.enabled = enabled\n }\n\n setEnabled(enabled: boolean): void {\n this.enabled = enabled\n }\n\n isEnabled(): boolean {\n return this.enabled\n }\n\n debug(...args: any[]): void {\n if (this.enabled) {\n console.debug(...args)\n }\n }\n\n log(...args: any[]): void {\n if (this.enabled) {\n console.log(...args)\n }\n }\n\n warn(...args: any[]): void {\n if (this.enabled) {\n console.warn(...args)\n }\n }\n\n error(...args: any[]): void {\n if (this.enabled) {\n console.error(...args)\n }\n }\n}\n\n/**\n * Creates a new logger instance\n * @param enabled - Whether logging is enabled (default: false)\n */\nexport function createLogger(enabled: boolean = false): Logger {\n return new Logger(enabled)\n}\n\nexport default Logger\n","/*\n* Player.js is a javascript library for interacting with iframes via\n* postMessage that use an Open Player Spec\n*\n*/\nimport core from './core'\nimport Keeper from './keeper'\nimport type { PlayerData, ReadyData, EventCallback, MethodCallback, GetMethodPromise, SetMethodPromise } from './types'\nimport Logger from './logger'\n\nconst READIED: string[] = []\n\nclass Player {\n public READIED: string[]\n public elem: HTMLIFrameElement\n public debug: boolean\n private logger: Logger\n public origin: string\n public keeper: Keeper\n public isReady: boolean\n public queue: PlayerData[]\n public events: string[]\n public methods: string[]\n public loaded?: boolean\n\n constructor(elem: string | HTMLIFrameElement, debug: boolean = false) {\n this.READIED = READIED\n\n if (core.isString(elem)) {\n const element = document.getElementById(elem) as HTMLIFrameElement\n if (!element) {\n throw new Error(`Element with id \"${elem}\" not found`)\n }\n elem = element\n }\n\n this.elem = elem\n\n this.debug = debug\n this.logger = new Logger(debug)\n\n // make sure we have an iframe\n core.assert(elem.nodeName === 'IFRAME',\n 'playerjs.Player constructor requires an Iframe, got \"' + elem.nodeName + '\"')\n core.assert(elem.src,\n 'playerjs.Player constructor requires a Iframe with a \\'src\\' attribute.')\n\n // Figure out the origin of where we are sending messages.\n this.origin = (new URL(elem.src)).origin\n\n // Event handling.\n this.keeper = new Keeper()\n\n // Queuing before ready.\n this.isReady = false\n this.queue = []\n\n // Assume that everything is supported, unless we know otherwise.\n this.events = core.EVENTS.all()\n this.methods = core.METHODS.all()\n\n if (core.POST_MESSAGE) {\n // Set up the reciever.\n core.addEvent(window, 'message', (e: MessageEvent) => {\n this.receive(e)\n })\n } else {\n this.logger.error('Post Message is not Available.')\n }\n\n // See if we caught the src event first, otherwise assume we haven't loaded\n if (READIED.includes(elem.src)) {\n this.loaded = true\n } else {\n // Try the onload event, just lets us give another test.\n this.elem.onload = () => {\n this.loaded = true\n }\n }\n }\n\n send(data: PlayerData, callback?: MethodCallback, ctx?: any): boolean {\n // Add the context and version to the data.\n data.context = core.CONTEXT\n data.version = core.VERSION\n\n // We are expecting a response.\n if (callback) {\n // Create a UUID\n const id = core.generateUUID()\n\n // Set the listener.\n data.listener = id\n\n // Only hang on to this listener once.\n this.keeper.one(id, data.method || '', callback, ctx)\n }\n\n if (!this.isReady && data.value !== 'ready') {\n this.logger.debug('Player.queue', data)\n this.queue.push(data)\n return false\n }\n\n this.logger.debug('Player.send', data, this.origin)\n\n if (this.loaded === true && this.elem.contentWindow) {\n this.elem.contentWindow.postMessage(JSON.stringify(data), this.origin)\n }\n\n return true\n }\n\n receive(e: MessageEvent): boolean {\n this.logger.debug('Player.receive', e)\n\n if (e.origin !== this.origin) {\n return false\n }\n\n let data: any\n try {\n data = JSON.parse(e.data)\n } catch (_err) {\n // Not a valid response.\n return false\n }\n\n // abort if this message wasn't a player.js message\n if (data.context !== core.CONTEXT) {\n return false\n }\n\n // We need to determine if we are ready.\n if (data.event === 'ready' && data.value && data.value.src === this.elem.src) {\n this.ready(data as ReadyData)\n }\n\n if (this.keeper.has(data.event, data.listener)) {\n this.keeper.execute(data.event, data.listener, data.value, this)\n }\n\n return true\n }\n\n ready(data: ReadyData): boolean {\n if (this.isReady === true) {\n return false\n }\n\n // If we got a list of supported methods, we should set them.\n if (data.value.events) {\n this.events = data.value.events\n }\n if (data.value.methods) {\n this.methods = data.value.methods\n }\n\n // set ready.\n this.isReady = true\n this.loaded = true\n\n // Clear the queue\n for (let i = 0; i < this.queue.length; i++) {\n const obj = this.queue[i]\n\n this.logger.debug('Player.dequeue', obj)\n\n if (data.event === 'ready') {\n this.keeper.execute(obj.event || '', obj.listener, true, this)\n }\n this.send(obj)\n }\n this.queue = []\n\n return true\n }\n\n on(event: string, callback: EventCallback, ctx?: any): boolean {\n const id = core.generateUUID()\n\n if (event === 'ready') {\n // We only want to call ready once.\n this.keeper.one(id, event, callback, ctx)\n } else {\n this.keeper.on(id, event, callback, ctx)\n }\n\n this.send({\n method: 'addEventListener',\n value: event,\n listener: id\n })\n\n return true\n }\n\n off(event: string, callback?: EventCallback): boolean {\n const listeners = this.keeper.off(event, callback)\n this.logger.debug('Player.off', listeners)\n\n if (listeners.length > 0) {\n for (const i in listeners) {\n this.send({\n method: 'removeEventListener',\n value: event,\n listener: listeners[i]\n })\n }\n return true\n }\n\n return false\n }\n\n // Based on what ready passed back, we can determine if the events/method are\n // supported by the player.\n supports(evtOrMethod: 'event' | 'method', names: string | string[]): boolean {\n core.assert(['method', 'event'].includes(evtOrMethod),\n 'evtOrMethod needs to be either \"event\" or \"method\" got ' + evtOrMethod)\n\n // Make everything an array.\n names = core.isArray(names) ? names : [names]\n\n const all = evtOrMethod === 'event' ? this.events : this.methods\n\n for (let i = 0; i < names.length; i++) {\n if (!all.includes(names[i])) {\n return false\n }\n }\n\n return true\n }\n\n // Dynamic method generation will be added via the prototype modification below\n // Method overloads for both promise and callback styles\n \n // Play/Pause methods (no return value needed)\n play?(): Promise<void>\n pause?(): Promise<void>\n mute?(): Promise<void>\n unmute?(): Promise<void>\n \n // Getter methods with overloads\n getPaused?(): GetMethodPromise<boolean>\n getPaused?(callback: MethodCallback): void\n \n getMuted?(): GetMethodPromise<boolean>\n getMuted?(callback: MethodCallback): void\n \n getVolume?(): GetMethodPromise<number>\n getVolume?(callback: MethodCallback): void\n \n getDuration?(): GetMethodPromise<number>\n getDuration?(callback: MethodCallback): void\n \n getCurrentTime?(): GetMethodPromise<number>\n getCurrentTime?(callback: MethodCallback): void\n \n getLoop?(): GetMethodPromise<boolean>\n getLoop?(callback: MethodCallback): void\n \n getPlaybackRate?(): GetMethodPromise<number>\n getPlaybackRate?(callback: MethodCallback): void\n \n // Setter methods\n setVolume?(volume: number): SetMethodPromise\n setCurrentTime?(time: number): SetMethodPromise\n setLoop?(loop: boolean): SetMethodPromise\n setPlaybackRate?(rate: number): SetMethodPromise\n}\n\n// create function to add to the Player prototype\nfunction createPrototypeFunction(name: string) {\n return function (this: Player, ...args: any[]): any {\n const data: PlayerData = {\n method: name\n }\n\n // for getters, check if callback is provided or return a promise\n if (/^get/.test(name)) {\n // If a callback is provided, use callback style\n if (args.length > 0 && typeof args[0] === 'function') {\n const callback = args[0]\n this.send(data, callback, args[1])\n return\n } else {\n // Return a promise\n return new Promise((resolve) => {\n this.send(data, (value: any) => {\n resolve(value)\n })\n })\n }\n } else {\n // for setters and action methods, return a promise\n if (/^set/.test(name)) {\n core.assert(args.length !== 0, 'Set methods require a value.')\n data.value = args[0]\n }\n \n // For action methods (play, pause, mute, unmute) and setters, return promise\n return new Promise<void>((resolve) => {\n // For action methods, we don't need to wait for a response\n if (['play', 'pause', 'mute', 'unmute'].includes(name)) {\n this.send(data)\n resolve()\n } else {\n // For setters, we might want to wait for confirmation\n this.send(data, () => {\n resolve()\n })\n }\n })\n }\n }\n}\n\n// Loop through the methods to add them to the prototype.\nfor (const methodName of core.METHODS.all()) {\n if (!Object.hasOwn(Player.prototype, methodName)) {\n (Player.prototype as any)[methodName] = createPrototypeFunction(methodName)\n }\n}\n\ncore.addEvent(window, 'message', (e: MessageEvent) => {\n let data: any\n try {\n data = JSON.parse(e.data)\n } catch (_err) {\n return false\n }\n\n // abort if this message wasn't a player.js message\n if (data.context !== core.CONTEXT) {\n return false\n }\n\n // We need to determine if we are ready.\n if (data.event === 'ready' && data.value && data.value.src) {\n READIED.push(data.value.src)\n }\n})\n\nexport default Player\n","/*\n* Does all the wiring up for the backend.\n*\n* var receiver = new playerjs.Receiver();\n* receiver.on('play', function(){ video.play() });\n* receiver.on('getDuration', function(callback){ callback(video.duration) });\n* receiver.emit('timeupdate', {});\n*/\n\nimport core from './core'\nimport type { SupportedFeatures } from './types'\nimport Logger from './logger'\n\nclass Receiver {\n public isReady: boolean\n public origin: string\n public methods: { [method: string]: Function }\n public supported: SupportedFeatures\n public eventListeners: { [event: string]: (string | null)[] }\n public reject: boolean\n public debug: boolean\n private logger: Logger\n\n constructor(events?: string[], methods?: string[], debug: boolean = false) {\n \n // Deal with the ready crap.\n this.isReady = false\n this.debug = debug\n this.logger = new Logger(debug)\n\n // Bind the window message.\n if (document.referrer) {\n this.origin = (new URL(document.referrer)).origin\n } else {\n this.origin = '*'\n }\n\n // Create a holder for all the methods.\n this.methods = {}\n\n // holds all the information about what's supported\n this.supported = {\n events: events || core.EVENTS.all(),\n methods: methods || core.METHODS.all()\n }\n\n // Deals with the adding and removing of event listeners.\n this.eventListeners = {}\n\n // We can't send any messages.\n this.reject = !(window.self !== window.top && core.POST_MESSAGE)\n\n // We aren't in an iframe, don't listen.\n if (!this.reject) {\n core.addEvent(window, 'message', (e: MessageEvent) => {\n this.receive(e)\n })\n }\n }\n\n receive(e: MessageEvent): boolean {\n // Only want to listen to events that came from our origin.\n if (e.origin !== this.origin) {\n return false\n }\n\n // Browsers that support postMessage also support JSON.\n let data: any = {}\n if (typeof e.data === 'object') {\n data = e.data\n } else {\n try {\n data = window.JSON.parse(e.data)\n } catch (err) {\n this.logger.error('JSON Parse Error', err)\n }\n }\n\n this.logger.debug('Receiver.receive', e, data)\n\n // Nothing for us to do.\n if (!data.method) {\n return false\n }\n\n // make sure the context is correct.\n if (data.context !== core.CONTEXT) {\n return false\n }\n\n // Make sure we have a valid method.\n if (!core.METHODS.all().includes(data.method)) {\n this.emit('error', {\n code: 2,\n msg: 'Invalid Method \"' + data.method + '\"'\n })\n return false\n }\n\n // See if we added a listener\n const listener = !core.isNone(data.listener) ? data.listener : null\n\n // Add Event Listener.\n if (data.method === 'addEventListener') {\n if (Object.hasOwn(this.eventListeners, data.value)) {\n // If the listener is the same, i.e. null only add it once.\n if (!this.eventListeners[data.value].includes(listener)) {\n this.eventListeners[data.value].push(listener)\n }\n } else {\n this.eventListeners[data.value] = [listener]\n }\n\n if (data.value === 'ready' && this.isReady) {\n this.ready()\n }\n } else if (data.method === 'removeEventListener') { // Remove the event listener.\n if (Object.hasOwn(this.eventListeners, data.value)) {\n const index = this.eventListeners[data.value].indexOf(listener)\n\n // if we find the element, remove it.\n if (index > -1) {\n this.eventListeners[data.value].splice(index, 1)\n }\n\n if (this.eventListeners[data.value].length === 0) {\n delete this.eventListeners[data.value]\n }\n }\n } else { // Go get it.\n this.get(data.method, data.value, listener)\n }\n\n return true\n }\n\n get(method: string, value: any, listener: string | null): boolean {\n\n // Now lets do it.\n if (!Object.hasOwn(this.methods, method)) {\n this.emit('error', {\n code: 3,\n msg: 'Method Not Supported \"' + method + '\"'\n })\n return false\n }\n\n const func = this.methods[method]\n\n if (method.substr(0, 3) === 'get') {\n const callback = (val: any) => {\n this.send(method, val, listener)\n }\n func.call(this, callback)\n } else {\n func.call(this, value)\n }\n\n return true\n }\n\n on(event: string, callback: Function): void {\n this.methods[event] = callback\n }\n\n send(event: string, value?: any, listener?: string | null): boolean {\n this.logger.debug('Receiver.send', event, value, listener)\n\n if (this.reject) {\n // We are not in a frame, or we don't support POST_MESSAGE\n this.logger.error('Receiver.send.reject', event, value, listener)\n return false\n }\n\n const data: any = {\n context: core.CONTEXT,\n version: core.VERSION,\n event\n }\n\n if (!core.isNone(value)) {\n data.value = value\n }\n\n if (!core.isNone(listener)) {\n data.listener = listener\n }\n\n const msg = JSON.stringify(data)\n window.parent.postMessage(msg, this.origin === '' ? '*' : this.origin)\n\n return true\n }\n\n emit(event: string, value?: any): boolean {\n if (!Object.hasOwn(this.eventListeners, event)) {\n return false\n }\n\n this.logger.debug('Receiver.emit', event, value, this.eventListeners[event])\n\n for (let i = 0; i < this.eventListeners[event].length; i++) {\n const listener = this.eventListeners[event][i]\n this.send(event, value, listener)\n }\n\n return true\n }\n\n ready(): void {\n this.logger.debug('Receiver.ready')\n this.isReady = true\n\n const data = {\n src: window.location.toString(),\n events: this.supported.events,\n methods: this.supported.methods\n }\n\n if (!this.emit('ready', data)) {\n this.send('ready', data)\n }\n }\n}\n\nexport default Receiver\n","import Receiver from '../receiver'\n\ninterface MockVideo {\n duration: number\n currentTime: number\n interval: NodeJS.Timeout | null\n timeupdate: (data: { seconds: number; duration: number }) => void\n volume: number\n mute: boolean\n playing: boolean\n loop: boolean\n playbackRate: number\n play: () => void\n pause: () => void\n}\n\nclass MockAdapter {\n public receiver!: Receiver\n\n constructor() {\n this.init()\n }\n\n init(): void {\n // Our mock video\n const video: MockVideo = {\n duration: 20,\n currentTime: 0,\n interval: null,\n timeupdate: () => {},\n volume: 100,\n mute: false,\n playing: false,\n loop: false,\n playbackRate: 1,\n play: () => {\n video.interval = setInterval(() => {\n video.currentTime += 0.25\n video.timeupdate({\n seconds: video.currentTime,\n duration: video.duration\n })\n }, 250)\n video.playing = true\n },\n pause: () => {\n if (video.interval) {\n clearInterval(video.interval)\n }\n video.playing = false\n }\n }\n\n // Set up the actual receiver\n const receiver = new Receiver()\n this.receiver = receiver\n\n receiver.on('play', function (this: Receiver) {\n video.play()\n this.emit('play')\n video.timeupdate = (data: { seconds: number; duration: number }) => {\n this.emit('timeupdate', data)\n }\n })\n\n receiver.on('pause', function (this: Receiver) {\n video.pause()\n this.emit('pause')\n })\n\n receiver.on('getPaused', (callback: (isPaused: boolean) => void) => {\n const isPaused = !video.playing\n callback(isPaused)\n })\n\n receiver.on('getCurrentTime', (callback: (time: number) => void) => {\n callback(video.currentTime)\n })\n\n receiver.on('setCurrentTime', (value: number) => {\n video.currentTime = value\n })\n\n receiver.on('getDuration', (callback: (duration: number) => void) => {\n callback(video.duration)\n })\n\n receiver.on('getVolume', (callback: (volume: number) => void) => {\n callback(video.volume)\n })\n\n receiver.on('setVolume', (value: number) => {\n video.volume = value\n })\n\n receiver.on('mute', () => {\n video.mute = true\n })\n\n receiver.on('unmute', () => {\n video.mute = false\n })\n\n receiver.on('getMuted', (callback: (muted: boolean) => void) => {\n callback(video.mute)\n })\n\n receiver.on('getLoop', (callback: (loop: boolean) => void) => {\n callback(video.loop)\n })\n\n receiver.on('setLoop', (value: boolean) => {\n video.loop = value\n })\n\n receiver.on('setPlaybackRate', (value: number) => {\n video.playbackRate = value\n })\n\n receiver.on('getPlaybackRate', (callback: (rate: number) => void) => {\n callback(video.playbackRate)\n })\n }\n\n ready(): void {\n this.receiver.ready()\n }\n}\n\nexport default MockAdapter\n","import core from '../core'\nimport Receiver from '../receiver'\n\n// VideoJS player interface - adjust based on actual VideoJS types if available\ninterface VideoJSPlayer {\n on(event: string, callback: () => void): void\n play(): void\n pause(): void\n paused(): boolean\n currentTime(time?: number): number\n duration(): number\n volume(vol?: number): number\n loop(loop?: boolean): boolean\n playbackRate(rate?: number): number\n}\n\nclass VideoJSAdapter {\n public receiver!: Receiver\n\n constructor(player: VideoJSPlayer) {\n this.init(player)\n }\n\n init(player: VideoJSPlayer): void {\n core.assert(player, 'VideoJSReceiver requires a player object')\n\n // Set up the actual receiver\n const receiver = new Receiver()\n this.receiver = receiver\n\n /* EVENTS */\n player.on('pause', () => {\n receiver.emit('pause')\n })\n\n player.on('play', () => {\n receiver.emit('play')\n })\n\n player.on('timeupdate', () => {\n const seconds = player.currentTime()\n const duration = player.duration()\n\n if (!seconds || !duration) {\n return false\n }\n\n const value = {\n seconds,\n duration\n }\n receiver.emit('timeupdate', value)\n })\n\n player.on('ended', () => {\n receiver.emit('ended')\n })\n\n player.on('error', () => {\n receiver.emit('error')\n })\n\n /* METHODS */\n receiver.on('play', () => {\n player.play()\n })\n\n receiver.on('pause', () => {\n player.pause()\n })\n\n receiver.on('getPaused', (callback: (paused: boolean) => void) => {\n callback(player.paused())\n })\n\n receiver.on('getCurrentTime', (callback: (time: number) => void) => {\n callback(player.currentTime())\n })\n\n receiver.on('setCurrentTime', (value: number) => {\n player.currentTime(value)\n })\n\n receiver.on('getDuration', (callback: (duration: number) => void) => {\n callback(player.duration())\n })\n\n receiver.on('getVolume', (callback: (volume: number) => void) => {\n const volume = player.volume() * 100\n callback(volume)\n })\n\n receiver.on('setVolume', (value: number) => {\n player.volume(value / 100)\n })\n\n receiver.on('mute', () => {\n player.volume(0)\n })\n\n receiver.on('unmute', () => {\n player.volume(1)\n })\n\n receiver.on('getMuted', (callback: (muted: boolean) => void) => {\n const isMuted = player.volume() === 0\n callback(isMuted)\n })\n\n receiver.on('getLoop', (callback: (loop: boolean) => void) => {\n callback(player.loop())\n })\n\n receiver.on('setLoop', (value: boolean) => {\n player.loop(value)\n })\n\n receiver.on('setPlaybackRate', (value: number) => {\n player.playbackRate(value)\n })\n\n receiver.on('getPlaybackRate', (callback: (rate: number) => void) => {\n callback(player.playbackRate())\n })\n }\n\n ready(): void {\n this.receiver.ready()\n }\n}\n\nexport default VideoJSAdapter\n","import core from '../core'\nimport Receiver from '../receiver'\n\nclass HTML5Adapter {\n public receiver!: Receiver\n\n constructor(video: HTMLVideoElement) {\n this.init(video)\n }\n\n init(video: HTMLVideoElement): void {\n core.assert(video, 'HTML5Adapter requires a video element')\n\n // Set up the actual receiver\n const receiver = new Receiver()\n this.receiver = receiver\n\n /* EVENTS */\n video.addEventListener('playing', () => {\n receiver.emit('play')\n })\n\n video.addEventListener('pause', () => {\n receiver.emit('pause')\n })\n\n video.addEventListener('ended', () => {\n receiver.emit('ended')\n })\n\n video.addEventListener('timeupdate', () => {\n receiver.emit('timeupdate', {\n seconds: video.currentTime,\n duration: video.duration\n })\n })\n\n video.addEventListener('progress', () => {\n receiver.emit('buffered', {\n percent: video.buffered.length\n })\n })\n\n /* Methods */\n receiver.on('play', () => {\n video.play()\n })\n\n receiver.on('pause', () => {\n video.pause()\n })\n\n receiver.on('getPaused', (callback: (paused: boolean) => void) => {\n callback(video.paused)\n })\n\n receiver.on('getCurrentTime', (callback: (time: number) => void) => {\n callback(video.currentTime)\n })\n\n receiver.on('setCurrentTime', (value: number) => {\n video.currentTime = value\n })\n\n receiver.on('getDuration', (callback: (duration: number) => void) => {\n callback(video.duration)\n })\n\n receiver.on('getVolume', (callback: (volume: number) => void) => {\n const volume = video.volume * 100\n callback(volume)\n })\n\n receiver.on('setVolume', (value: number) => {\n video.volume = value / 100\n })\n\n receiver.on('mute', () => {\n video.muted = true\n })\n\n receiver.on('unmute', () => {\n video.muted = false\n })\n\n receiver.on('getMuted', (callback: (muted: boolean) => void) => {\n callback(video.muted)\n })\n\n receiver.on('getLoop', (callback: (loop: boolean) => void) => {\n callback(video.loop)\n })\n\n receiver.on('setLoop', (value: boolean) => {\n video.loop = value\n })\n\n receiver.on('setPlaybackRate', (value: number) => {\n video.playbackRate = value\n })\n\n receiver.on('getPlaybackRate', (callback: (rate: number) => void) => {\n callback(video.playbackRate)\n })\n }\n\n ready(): void {\n this.receiver.ready()\n }\n}\n\nexport default HTML5Adapter\n","import core from './core'\nimport Player from './player'\nimport Receiver from './receiver'\nimport MockAdapter from './adapters/mock'\nimport VideoJSAdapter from './adapters/video'\nimport HTML5Adapter from './adapters/html'\nimport type { PlayerMethods } from './types'\n\ninterface PlayerJS {\n Player: typeof Player\n Receiver: typeof Receiver\n MockAdapter: typeof MockAdapter\n VideoJSAdapter: typeof VideoJSAdapter\n HTML5Adapter: typeof HTML5Adapter\n CONTEXT: string\n VERSION: string\n METHODS: PlayerMethods\n addEvent: typeof core.addEvent\n}\n\nconst playerjs: PlayerJS = {\n Player,\n Receiver,\n MockAdapter,\n VideoJSAdapter,\n HTML5Adapter,\n CONTEXT: core.CONTEXT,\n VERSION: core.VERSION,\n METHODS: core.METHODS,\n addEvent: core.addEvent\n}\n\n// Attach to the window object explicitly\ndeclare global {\n interface Window {\n playerjs: PlayerJS\n }\n}\n\nif (typeof window !== 'undefined') {\n window.playerjs = playerjs\n}\n\nexport default playerjs\n"],"mappings":"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","names":["core","all","key","obj","elem","type","eventHandle","test","msg","url","core_default","Keeper","event","id","core_default","events","i","cb","ctx","one","d","data","keep","execute","n","e","listeners","keeper_default","Logger","enabled","args","logger_default","Logger","READIED","Player","elem","debug","core_default","element","logger_default","keeper_default","e","data","callback","ctx","id","_err","i","obj","event","listeners","evtOrMethod","names","all","createPrototypeFunction","name","args","resolve","value","methodName","player_default","Receiver","events","methods","debug","logger_default","core_default","e","data","err","listener","index","method","value","func","callback","val","event","msg","i","receiver_default","MockAdapter","video","receiver","receiver_default","data","callback","isPaused","value","mock_default","VideoJSAdapter","player","core_default","receiver","receiver_default","seconds","duration","value","callback","volume","isMuted","video_default","HTML5Adapter","video","core_default","receiver","receiver_default","callback","value","volume","html_default","playerjs","player_default","receiver_default","mock_default","video_default","html_default","core_default","main_default"]}
package/dist/main.js CHANGED
@@ -1,2 +1,2 @@
1
- var u={EVENTS:{READY:"ready",PLAY:"play",PAUSE:"pause",ENDED:"ended",TIMEUPDATE:"timeupdate",PROGRESS:"progress",SEEKED:"seeked",ERROR:"error",FULLSCREEN_CHANGE:"fullscreenChange",PIP_CHANGE:"pipChange",PLAYBACK_RATE_CHANGE:"playbackRateChange",AUDIO_CHANGE:"audioChange",QUALITY_CHANGE:"qualityChange",VOLUME_CHANGE:"volumeChange",all(){let r=[];for(let e in u.EVENTS)u.has(u.EVENTS,e)&&u.isString(u.EVENTS[e])&&r.push(u.EVENTS[e]);return r}},POST_MESSAGE:!!window.postMessage,METHODS:{PLAY:"play",PAUSE:"pause",GETPAUSED:"getPaused",MUTE:"mute",UNMUTE:"unmute",GETMUTED:"getMuted",SETVOLUME:"setVolume",GETVOLUME:"getVolume",GETDURATION:"getDuration",SETCURRENTTIME:"setCurrentTime",GETCURRENTTIME:"getCurrentTime",SETLOOP:"setLoop",GETLOOP:"getLoop",SETPLAYBACKRATE:"setPlaybackRate",GETPLAYBACKRATE:"getPlaybackRate",REMOVEEVENTLISTENER:"removeEventListener",ADDEVENTLISTENER:"addEventListener",all(){let r=[];for(let e in u.METHODS)u.has(u.METHODS,e)&&u.isString(u.METHODS[e])&&r.push(u.METHODS[e]);return r}},DEBUG:!1,VERSION:"2.0",CONTEXT:"player.js",isString(r){return Object.prototype.toString.call(r)==="[object String]"},has(r,e){return Object.prototype.hasOwnProperty.call(r,e)},addEvent(r,e,t){r&&(r.addEventListener?r.addEventListener(e,t,!1):r.attachEvent?r.attachEvent("on"+e,t):r["on"+e]=t)},isNone(r){return r==null},assert(r,e){if(!r)throw e||"Player.js Assert Failed"},generateUUID(){if(crypto&&crypto.randomUUID)return crypto.randomUUID();{let r=URL.createObjectURL(new Blob);return r.substring(r.lastIndexOf("/")+1)}},isArray(r){return Object.prototype.toString.call(r)==="[object Array]"}},i=u;var m=class{constructor(){this.data={}}has(e,t){if(!Object.prototype.hasOwnProperty.call(this.data,e))return!1;if(i.isNone(t))return!0;let n=this.data[e];for(let o=0;o<n.length;o++)if(n[o].id===t)return!0;return!1}add(e,t,n,o,s=!1){let a={id:e,event:t,cb:n,ctx:o,one:s};this.has(t)?this.data[t].push(a):this.data[t]=[a]}execute(e,t,n,o){if(!this.has(e,t))return!1;let s=[],a=[];for(let c=0;c<this.data[e].length;c++){let l=this.data[e][c];i.isNone(t)||!i.isNone(t)&&l.id===t?(a.push({cb:l.cb,ctx:l.ctx?l.ctx:o,data:n}),l.one===!1&&s.push(l)):s.push(l)}s.length===0?delete this.data[e]:this.data[e]=s;for(let c=0;c<a.length;c++){let l=a[c];l.cb.call(l.ctx,l.data)}return!0}on(e,t,n,o){this.add(e,t,n,o,!1)}one(e,t,n,o){this.add(e,t,n,o,!0)}off(e,t){let n=[];if(!Object.prototype.hasOwnProperty.call(this.data,e))return n;let o=[];for(let s=0;s<this.data[e].length;s++){let a=this.data[e][s];!i.isNone(t)&&a.cb!==t?o.push(a):i.isNone(a.id)||n.push(a.id)}return o.length===0?delete this.data[e]:this.data[e]=o,n}},y=m;var h=[],f=class{constructor(e,t=!1){let n=this;if(this.READIED=h,i.isString(e)){let o=document.getElementById(e);if(!o)throw new Error(`Element with id "${e}" not found`);e=o}this.elem=e,this.debug=t,i.assert(e.nodeName==="IFRAME",'playerjs.Player constructor requires an Iframe, got "'+e.nodeName+'"'),i.assert(e.src,"playerjs.Player constructor requires a Iframe with a 'src' attribute."),this.origin=new URL(e.src).origin,this.keeper=new y,this.isReady=!1,this.queue=[],this.events=i.EVENTS.all(),this.methods=i.METHODS.all(),i.POST_MESSAGE?i.addEvent(window,"message",function(o){n.receive(o)}):console.error("Post Message is not Available."),h.includes(e.src)?n.loaded=!0:this.elem.onload=function(){n.loaded=!0}}send(e,t,n){if(e.context=i.CONTEXT,e.version=i.VERSION,t){let o=i.generateUUID();e.listener=o,this.keeper.one(o,e.method||"",t,n)}return!this.isReady&&e.value!=="ready"?(this.debug&&console.debug("Player.queue",e),this.queue.push(e),!1):(this.debug&&console.debug("Player.send",e,this.origin),this.loaded===!0&&this.elem.contentWindow&&this.elem.contentWindow.postMessage(JSON.stringify(e),this.origin),!0)}receive(e){if(this.debug&&console.debug("Player.receive",e),e.origin!==this.origin)return!1;let t;try{t=JSON.parse(e.data)}catch(n){return!1}return t.context!==i.CONTEXT?!1:(t.event==="ready"&&t.value&&t.value.src===this.elem.src&&this.ready(t),this.keeper.has(t.event,t.listener)&&this.keeper.execute(t.event,t.listener,t.value,this),!0)}ready(e){if(this.isReady===!0)return!1;e.value.events&&(this.events=e.value.events),e.value.methods&&(this.methods=e.value.methods),this.isReady=!0,this.loaded=!0;for(let t=0;t<this.queue.length;t++){let n=this.queue[t];this.debug&&console.debug("Player.dequeue",n),e.event==="ready"&&this.keeper.execute(n.event||"",n.listener,!0,this),this.send(n)}return this.queue=[],!0}on(e,t,n){let o=i.generateUUID();return e==="ready"?this.keeper.one(o,e,t,n):this.keeper.on(o,e,t,n),this.send({method:"addEventListener",value:e,listener:o}),!0}off(e,t){let n=this.keeper.off(e,t);if(this.debug&&console.debug("Player.off",n),n.length>0){for(let o in n)this.send({method:"removeEventListener",value:e,listener:n[o]});return!0}return!1}supports(e,t){i.assert(["method","event"].includes(e),'evtOrMethod needs to be either "event" or "method" got '+e),t=i.isArray(t)?t:[t];let n=e==="event"?this.events:this.methods;for(let o=0;o<t.length;o++)if(!n.includes(t[o]))return!1;return!0}};function S(r){return function(...e){let t={method:r};if(/^get/.test(r))if(e.length>0&&typeof e[0]=="function"){let n=e[0];this.send(t,n,e[1]);return}else return new Promise((n,o)=>{this.send(t,s=>{n(s)})});else return/^set/.test(r)&&(i.assert(e.length!==0,"Set methods require a value."),t.value=e[0]),new Promise((n,o)=>{["play","pause","mute","unmute"].includes(r)?(this.send(t),n()):this.send(t,()=>{n()})})}}for(let r of i.METHODS.all())Object.prototype.hasOwnProperty.call(f.prototype,r)||(f.prototype[r]=S(r));i.addEvent(window,"message",function(r){let e;try{e=JSON.parse(r.data)}catch(t){return!1}if(e.context!==i.CONTEXT)return!1;e.event==="ready"&&e.value&&e.value.src&&h.push(e.value.src)});var E=f;var p=class{constructor(e,t){let n=this;this.isReady=!1,document.referrer?this.origin=new URL(document.referrer).origin:this.origin="*",this.methods={},this.supported={events:e||i.EVENTS.all(),methods:t||i.METHODS.all()},this.eventListeners={},this.reject=!(window.self!==window.top&&i.POST_MESSAGE),this.reject||i.addEvent(window,"message",function(o){n.receive(o)})}receive(e){if(e.origin!==this.origin)return!1;let t={};if(typeof e.data=="object")t=e.data;else try{t=window.JSON.parse(e.data)}catch(o){console.error("JSON Parse Error",o)}if(console.debug("Receiver.receive",e,t),!t.method||t.context!==i.CONTEXT)return!1;if(!i.METHODS.all().includes(t.method))return this.emit("error",{code:2,msg:'Invalid Method "'+t.method+'"'}),!1;let n=i.isNone(t.listener)?null:t.listener;if(t.method==="addEventListener")Object.prototype.hasOwnProperty.call(this.eventListeners,t.value)?this.eventListeners[t.value].includes(n)||this.eventListeners[t.value].push(n):this.eventListeners[t.value]=[n],t.value==="ready"&&this.isReady&&this.ready();else if(t.method==="removeEventListener"){if(Object.prototype.hasOwnProperty.call(this.eventListeners,t.value)){let o=this.eventListeners[t.value].indexOf(n);o>-1&&this.eventListeners[t.value].splice(o,1),this.eventListeners[t.value].length===0&&delete this.eventListeners[t.value]}}else this.get(t.method,t.value,n);return!0}get(e,t,n){let o=this;if(!Object.prototype.hasOwnProperty.call(this.methods,e))return this.emit("error",{code:3,msg:'Method Not Supported "'+e+'"'}),!1;let s=this.methods[e];if(e.substr(0,3)==="get"){let a=function(c){o.send(e,c,n)};s.call(this,a)}else s.call(this,t);return!0}on(e,t){this.methods[e]=t}send(e,t,n){if(console.debug("Receiver.send",e,t,n),this.reject)return console.error("Receiver.send.reject",e,t,n),!1;let o={context:i.CONTEXT,version:i.VERSION,event:e};i.isNone(t)||(o.value=t),i.isNone(n)||(o.listener=n);let s=JSON.stringify(o);return window.parent.postMessage(s,this.origin===""?"*":this.origin),!0}emit(e,t){if(!Object.prototype.hasOwnProperty.call(this.eventListeners,e))return!1;console.debug("Instance.emit",e,t,this.eventListeners[e]);for(let n=0;n<this.eventListeners[e].length;n++){let o=this.eventListeners[e][n];this.send(e,t,o)}return!0}ready(){console.debug("Receiver.ready"),this.isReady=!0;let e={src:window.location.toString(),events:this.supported.events,methods:this.supported.methods};this.emit("ready",e)||this.send("ready",e)}},d=p;var b=class{constructor(){this.init()}init(){let e={duration:20,currentTime:0,interval:null,timeupdate:function(){},volume:100,mute:!1,playing:!1,loop:!1,playbackRate:1,play:function(){e.interval=setInterval(function(){e.currentTime+=.25,e.timeupdate({seconds:e.currentTime,duration:e.duration})},250),e.playing=!0},pause:function(){e.interval&&clearInterval(e.interval),e.playing=!1}},t=this.receiver=new d;t.on("play",function(){let n=this;e.play(),this.emit("play"),e.timeupdate=function(o){n.emit("timeupdate",o)}}),t.on("pause",function(){e.pause(),this.emit("pause")}),t.on("getPaused",function(n){let o=!e.playing;n(o)}),t.on("getCurrentTime",function(n){n(e.currentTime)}),t.on("setCurrentTime",function(n){e.currentTime=n}),t.on("getDuration",function(n){n(e.duration)}),t.on("getVolume",function(n){n(e.volume)}),t.on("setVolume",function(n){e.volume=n}),t.on("mute",function(){e.mute=!0}),t.on("unmute",function(){e.mute=!1}),t.on("getMuted",function(n){n(e.mute)}),t.on("getLoop",function(n){n(e.loop)}),t.on("setLoop",function(n){e.loop=n}),t.on("setPlaybackRate",function(n){e.playbackRate=n}),t.on("getPlaybackRate",function(n){n(e.playbackRate)})}ready(){this.receiver.ready()}},T=b;var g=class{constructor(e){this.init(e)}init(e){i.assert(e,"VideoJSReceiver requires a player object");let t=this.receiver=new d;e.on("pause",function(){t.emit("pause")}),e.on("play",function(){t.emit("play")}),e.on("timeupdate",function(){let n=e.currentTime(),o=e.duration();if(!n||!o)return!1;let s={seconds:n,duration:o};t.emit("timeupdate",s)}),e.on("ended",function(){t.emit("ended")}),e.on("error",function(){t.emit("error")}),t.on("play",function(){e.play()}),t.on("pause",function(){e.pause()}),t.on("getPaused",function(n){n(e.paused())}),t.on("getCurrentTime",function(n){n(e.currentTime())}),t.on("setCurrentTime",function(n){e.currentTime(n)}),t.on("getDuration",function(n){n(e.duration())}),t.on("getVolume",function(n){let o=e.volume()*100;n(o)}),t.on("setVolume",function(n){e.volume(n/100)}),t.on("mute",function(){e.volume(0)}),t.on("unmute",function(){e.volume(1)}),t.on("getMuted",function(n){let o=e.volume()===0;n(o)}),t.on("getLoop",function(n){n(e.loop())}),t.on("setLoop",function(n){e.loop(n)}),t.on("setPlaybackRate",function(n){e.playbackRate(n)}),t.on("getPlaybackRate",function(n){n(e.playbackRate())})}ready(){this.receiver.ready()}},P=g;var v=class{constructor(e){this.init(e)}init(e){i.assert(e,"HTML5Adapter requires a video element");let t=this.receiver=new d;e.addEventListener("playing",function(){t.emit("play")}),e.addEventListener("pause",function(){t.emit("pause")}),e.addEventListener("ended",function(){t.emit("ended")}),e.addEventListener("timeupdate",function(){t.emit("timeupdate",{seconds:e.currentTime,duration:e.duration})}),e.addEventListener("progress",function(){t.emit("buffered",{percent:e.buffered.length})}),t.on("play",function(){e.play()}),t.on("pause",function(){e.pause()}),t.on("getPaused",function(n){n(e.paused)}),t.on("getCurrentTime",function(n){n(e.currentTime)}),t.on("setCurrentTime",function(n){e.currentTime=n}),t.on("getDuration",function(n){n(e.duration)}),t.on("getVolume",function(n){let o=e.volume*100;n(o)}),t.on("setVolume",function(n){e.volume=n/100}),t.on("mute",function(){e.muted=!0}),t.on("unmute",function(){e.muted=!1}),t.on("getMuted",function(n){n(e.muted)}),t.on("getLoop",function(n){n(e.loop)}),t.on("setLoop",function(n){e.loop=n}),t.on("setPlaybackRate",function(n){e.playbackRate=n}),t.on("getPlaybackRate",function(n){n(e.playbackRate)})}ready(){this.receiver.ready()}},M=v;var R={Player:E,Receiver:d,MockAdapter:T,VideoJSAdapter:P,HTML5Adapter:M,CONTEXT:i.CONTEXT,VERSION:i.VERSION,METHODS:i.METHODS,addEvent:i.addEvent};typeof window!="undefined"&&(window.playerjs=R);var B=R;export{B as default};
1
+ var l={EVENTS:{READY:"ready",PLAY:"play",PAUSE:"pause",ENDED:"ended",TIMEUPDATE:"timeupdate",PROGRESS:"progress",SEEKED:"seeked",ERROR:"error",FULLSCREEN_CHANGE:"fullscreenChange",PIP_CHANGE:"pipChange",PLAYBACK_RATE_CHANGE:"playbackRateChange",AUDIO_CHANGE:"audioChange",QUALITY_CHANGE:"qualityChange",VOLUME_CHANGE:"volumeChange",all(){let i=[];for(let e in l.EVENTS)l.has(l.EVENTS,e)&&l.isString(l.EVENTS[e])&&i.push(l.EVENTS[e]);return i}},POST_MESSAGE:!!window.postMessage,METHODS:{PLAY:"play",PAUSE:"pause",GETPAUSED:"getPaused",MUTE:"mute",UNMUTE:"unmute",GETMUTED:"getMuted",SETVOLUME:"setVolume",GETVOLUME:"getVolume",GETDURATION:"getDuration",SETCURRENTTIME:"setCurrentTime",GETCURRENTTIME:"getCurrentTime",SETLOOP:"setLoop",GETLOOP:"getLoop",SETPLAYBACKRATE:"setPlaybackRate",GETPLAYBACKRATE:"getPlaybackRate",REMOVEEVENTLISTENER:"removeEventListener",ADDEVENTLISTENER:"addEventListener",all(){let i=[];for(let e in l.METHODS)l.has(l.METHODS,e)&&l.isString(l.METHODS[e])&&i.push(l.METHODS[e]);return i}},DEBUG:!1,VERSION:"2.0",CONTEXT:"player.js",isString(i){return Object.prototype.toString.call(i)==="[object String]"},has(i,e){return Object.hasOwn(i,e)},addEvent(i,e,t){i&&(i.addEventListener?i.addEventListener(e,t,!1):i.attachEvent?i.attachEvent(`on${e}`,t):i[`on${e}`]=t)},isNone(i){return i==null},assert(i,e){if(!i)throw e||"Player.js Assert Failed"},generateUUID(){if(crypto!=null&&crypto.randomUUID)return crypto.randomUUID();{let i=URL.createObjectURL(new Blob);return i.substring(i.lastIndexOf("/")+1)}},isArray(i){return Object.prototype.toString.call(i)==="[object Array]"}},o=l;var p=class{constructor(){this.data={}}has(e,t){if(!Object.hasOwn(this.data,e))return!1;if(o.isNone(t))return!0;let r=this.data[e];for(let n=0;n<r.length;n++)if(r[n].id===t)return!0;return!1}add(e,t,r,n,s=!1){let a={id:e,event:t,cb:r,ctx:n,one:s};this.has(t)?this.data[t].push(a):this.data[t]=[a]}execute(e,t,r,n){if(!this.has(e,t))return!1;let s=[],a=[];for(let c=0;c<this.data[e].length;c++){let u=this.data[e][c];o.isNone(t)||!o.isNone(t)&&u.id===t?(a.push({cb:u.cb,ctx:u.ctx?u.ctx:n,data:r}),u.one===!1&&s.push(u)):s.push(u)}s.length===0?delete this.data[e]:this.data[e]=s;for(let c=0;c<a.length;c++){let u=a[c];u.cb.call(u.ctx,u.data)}return!0}on(e,t,r,n){this.add(e,t,r,n,!1)}one(e,t,r,n){this.add(e,t,r,n,!0)}off(e,t){let r=[];if(!Object.hasOwn(this.data,e))return r;let n=[];for(let s=0;s<this.data[e].length;s++){let a=this.data[e][s];!o.isNone(t)&&a.cb!==t?n.push(a):o.isNone(a.id)||r.push(a.id)}return n.length===0?delete this.data[e]:this.data[e]=n,r}},T=p;var g=class{constructor(e=!1){this.enabled=e}setEnabled(e){this.enabled=e}isEnabled(){return this.enabled}debug(...e){this.enabled&&console.debug(...e)}log(...e){this.enabled&&console.log(...e)}warn(...e){this.enabled&&console.warn(...e)}error(...e){this.enabled&&console.error(...e)}};var h=g;var b=[],m=class{constructor(e,t=!1){if(this.READIED=b,o.isString(e)){let r=document.getElementById(e);if(!r)throw new Error(`Element with id "${e}" not found`);e=r}this.elem=e,this.debug=t,this.logger=new h(t),o.assert(e.nodeName==="IFRAME",'playerjs.Player constructor requires an Iframe, got "'+e.nodeName+'"'),o.assert(e.src,"playerjs.Player constructor requires a Iframe with a 'src' attribute."),this.origin=new URL(e.src).origin,this.keeper=new T,this.isReady=!1,this.queue=[],this.events=o.EVENTS.all(),this.methods=o.METHODS.all(),o.POST_MESSAGE?o.addEvent(window,"message",r=>{this.receive(r)}):this.logger.error("Post Message is not Available."),b.includes(e.src)?this.loaded=!0:this.elem.onload=()=>{this.loaded=!0}}send(e,t,r){if(e.context=o.CONTEXT,e.version=o.VERSION,t){let n=o.generateUUID();e.listener=n,this.keeper.one(n,e.method||"",t,r)}return!this.isReady&&e.value!=="ready"?(this.logger.debug("Player.queue",e),this.queue.push(e),!1):(this.logger.debug("Player.send",e,this.origin),this.loaded===!0&&this.elem.contentWindow&&this.elem.contentWindow.postMessage(JSON.stringify(e),this.origin),!0)}receive(e){if(this.logger.debug("Player.receive",e),e.origin!==this.origin)return!1;let t;try{t=JSON.parse(e.data)}catch(r){return!1}return t.context!==o.CONTEXT?!1:(t.event==="ready"&&t.value&&t.value.src===this.elem.src&&this.ready(t),this.keeper.has(t.event,t.listener)&&this.keeper.execute(t.event,t.listener,t.value,this),!0)}ready(e){if(this.isReady===!0)return!1;e.value.events&&(this.events=e.value.events),e.value.methods&&(this.methods=e.value.methods),this.isReady=!0,this.loaded=!0;for(let t=0;t<this.queue.length;t++){let r=this.queue[t];this.logger.debug("Player.dequeue",r),e.event==="ready"&&this.keeper.execute(r.event||"",r.listener,!0,this),this.send(r)}return this.queue=[],!0}on(e,t,r){let n=o.generateUUID();return e==="ready"?this.keeper.one(n,e,t,r):this.keeper.on(n,e,t,r),this.send({method:"addEventListener",value:e,listener:n}),!0}off(e,t){let r=this.keeper.off(e,t);if(this.logger.debug("Player.off",r),r.length>0){for(let n in r)this.send({method:"removeEventListener",value:e,listener:r[n]});return!0}return!1}supports(e,t){o.assert(["method","event"].includes(e),'evtOrMethod needs to be either "event" or "method" got '+e),t=o.isArray(t)?t:[t];let r=e==="event"?this.events:this.methods;for(let n=0;n<t.length;n++)if(!r.includes(t[n]))return!1;return!0}};function O(i){return function(...e){let t={method:i};if(/^get/.test(i))if(e.length>0&&typeof e[0]=="function"){let r=e[0];this.send(t,r,e[1]);return}else return new Promise(r=>{this.send(t,n=>{r(n)})});else return/^set/.test(i)&&(o.assert(e.length!==0,"Set methods require a value."),t.value=e[0]),new Promise(r=>{["play","pause","mute","unmute"].includes(i)?(this.send(t),r()):this.send(t,()=>{r()})})}}for(let i of o.METHODS.all())Object.hasOwn(m.prototype,i)||(m.prototype[i]=O(i));o.addEvent(window,"message",i=>{let e;try{e=JSON.parse(i.data)}catch(t){return!1}if(e.context!==o.CONTEXT)return!1;e.event==="ready"&&e.value&&e.value.src&&b.push(e.value.src)});var P=m;var f=class{constructor(e,t,r=!1){this.isReady=!1,this.debug=r,this.logger=new h(r),document.referrer?this.origin=new URL(document.referrer).origin:this.origin="*",this.methods={},this.supported={events:e||o.EVENTS.all(),methods:t||o.METHODS.all()},this.eventListeners={},this.reject=!(window.self!==window.top&&o.POST_MESSAGE),this.reject||o.addEvent(window,"message",n=>{this.receive(n)})}receive(e){if(e.origin!==this.origin)return!1;let t={};if(typeof e.data=="object")t=e.data;else try{t=window.JSON.parse(e.data)}catch(n){this.logger.error("JSON Parse Error",n)}if(this.logger.debug("Receiver.receive",e,t),!t.method||t.context!==o.CONTEXT)return!1;if(!o.METHODS.all().includes(t.method))return this.emit("error",{code:2,msg:'Invalid Method "'+t.method+'"'}),!1;let r=o.isNone(t.listener)?null:t.listener;if(t.method==="addEventListener")Object.hasOwn(this.eventListeners,t.value)?this.eventListeners[t.value].includes(r)||this.eventListeners[t.value].push(r):this.eventListeners[t.value]=[r],t.value==="ready"&&this.isReady&&this.ready();else if(t.method==="removeEventListener"){if(Object.hasOwn(this.eventListeners,t.value)){let n=this.eventListeners[t.value].indexOf(r);n>-1&&this.eventListeners[t.value].splice(n,1),this.eventListeners[t.value].length===0&&delete this.eventListeners[t.value]}}else this.get(t.method,t.value,r);return!0}get(e,t,r){if(!Object.hasOwn(this.methods,e))return this.emit("error",{code:3,msg:'Method Not Supported "'+e+'"'}),!1;let n=this.methods[e];if(e.substr(0,3)==="get"){let s=a=>{this.send(e,a,r)};n.call(this,s)}else n.call(this,t);return!0}on(e,t){this.methods[e]=t}send(e,t,r){if(this.logger.debug("Receiver.send",e,t,r),this.reject)return this.logger.error("Receiver.send.reject",e,t,r),!1;let n={context:o.CONTEXT,version:o.VERSION,event:e};o.isNone(t)||(n.value=t),o.isNone(r)||(n.listener=r);let s=JSON.stringify(n);return window.parent.postMessage(s,this.origin===""?"*":this.origin),!0}emit(e,t){if(!Object.hasOwn(this.eventListeners,e))return!1;this.logger.debug("Receiver.emit",e,t,this.eventListeners[e]);for(let r=0;r<this.eventListeners[e].length;r++){let n=this.eventListeners[e][r];this.send(e,t,n)}return!0}ready(){this.logger.debug("Receiver.ready"),this.isReady=!0;let e={src:window.location.toString(),events:this.supported.events,methods:this.supported.methods};this.emit("ready",e)||this.send("ready",e)}},d=f;var v=class{constructor(){this.init()}init(){let e={duration:20,currentTime:0,interval:null,timeupdate:()=>{},volume:100,mute:!1,playing:!1,loop:!1,playbackRate:1,play:()=>{e.interval=setInterval(()=>{e.currentTime+=.25,e.timeupdate({seconds:e.currentTime,duration:e.duration})},250),e.playing=!0},pause:()=>{e.interval&&clearInterval(e.interval),e.playing=!1}},t=new d;this.receiver=t,t.on("play",function(){e.play(),this.emit("play"),e.timeupdate=r=>{this.emit("timeupdate",r)}}),t.on("pause",function(){e.pause(),this.emit("pause")}),t.on("getPaused",r=>{let n=!e.playing;r(n)}),t.on("getCurrentTime",r=>{r(e.currentTime)}),t.on("setCurrentTime",r=>{e.currentTime=r}),t.on("getDuration",r=>{r(e.duration)}),t.on("getVolume",r=>{r(e.volume)}),t.on("setVolume",r=>{e.volume=r}),t.on("mute",()=>{e.mute=!0}),t.on("unmute",()=>{e.mute=!1}),t.on("getMuted",r=>{r(e.mute)}),t.on("getLoop",r=>{r(e.loop)}),t.on("setLoop",r=>{e.loop=r}),t.on("setPlaybackRate",r=>{e.playbackRate=r}),t.on("getPlaybackRate",r=>{r(e.playbackRate)})}ready(){this.receiver.ready()}},M=v;var y=class{constructor(e){this.init(e)}init(e){o.assert(e,"VideoJSReceiver requires a player object");let t=new d;this.receiver=t,e.on("pause",()=>{t.emit("pause")}),e.on("play",()=>{t.emit("play")}),e.on("timeupdate",()=>{let r=e.currentTime(),n=e.duration();if(!r||!n)return!1;let s={seconds:r,duration:n};t.emit("timeupdate",s)}),e.on("ended",()=>{t.emit("ended")}),e.on("error",()=>{t.emit("error")}),t.on("play",()=>{e.play()}),t.on("pause",()=>{e.pause()}),t.on("getPaused",r=>{r(e.paused())}),t.on("getCurrentTime",r=>{r(e.currentTime())}),t.on("setCurrentTime",r=>{e.currentTime(r)}),t.on("getDuration",r=>{r(e.duration())}),t.on("getVolume",r=>{let n=e.volume()*100;r(n)}),t.on("setVolume",r=>{e.volume(r/100)}),t.on("mute",()=>{e.volume(0)}),t.on("unmute",()=>{e.volume(1)}),t.on("getMuted",r=>{let n=e.volume()===0;r(n)}),t.on("getLoop",r=>{r(e.loop())}),t.on("setLoop",r=>{e.loop(r)}),t.on("setPlaybackRate",r=>{e.playbackRate(r)}),t.on("getPlaybackRate",r=>{r(e.playbackRate())})}ready(){this.receiver.ready()}},R=y;var E=class{constructor(e){this.init(e)}init(e){o.assert(e,"HTML5Adapter requires a video element");let t=new d;this.receiver=t,e.addEventListener("playing",()=>{t.emit("play")}),e.addEventListener("pause",()=>{t.emit("pause")}),e.addEventListener("ended",()=>{t.emit("ended")}),e.addEventListener("timeupdate",()=>{t.emit("timeupdate",{seconds:e.currentTime,duration:e.duration})}),e.addEventListener("progress",()=>{t.emit("buffered",{percent:e.buffered.length})}),t.on("play",()=>{e.play()}),t.on("pause",()=>{e.pause()}),t.on("getPaused",r=>{r(e.paused)}),t.on("getCurrentTime",r=>{r(e.currentTime)}),t.on("setCurrentTime",r=>{e.currentTime=r}),t.on("getDuration",r=>{r(e.duration)}),t.on("getVolume",r=>{let n=e.volume*100;r(n)}),t.on("setVolume",r=>{e.volume=r/100}),t.on("mute",()=>{e.muted=!0}),t.on("unmute",()=>{e.muted=!1}),t.on("getMuted",r=>{r(e.muted)}),t.on("getLoop",r=>{r(e.loop)}),t.on("setLoop",r=>{e.loop=r}),t.on("setPlaybackRate",r=>{e.playbackRate=r}),t.on("getPlaybackRate",r=>{r(e.playbackRate)})}ready(){this.receiver.ready()}},S=E;var L={Player:P,Receiver:d,MockAdapter:M,VideoJSAdapter:R,HTML5Adapter:S,CONTEXT:o.CONTEXT,VERSION:o.VERSION,METHODS:o.METHODS,addEvent:o.addEvent};typeof window!="undefined"&&(window.playerjs=L);var Z=L;export{Z as default};
2
2
  //# sourceMappingURL=main.js.map
package/dist/main.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core.ts","../src/keeper.ts","../src/player.ts","../src/receiver.ts","../src/adapters/mock.ts","../src/adapters/video.ts","../src/adapters/html.ts","../src/main.ts"],"sourcesContent":["import { PlayerEvents, PlayerMethods, Core } from './types'\n\nconst core: Core = {\n EVENTS: {\n READY: 'ready',\n PLAY: 'play',\n PAUSE: 'pause',\n ENDED: 'ended',\n TIMEUPDATE: 'timeupdate',\n PROGRESS: 'progress',\n SEEKED: 'seeked',\n ERROR: 'error',\n FULLSCREEN_CHANGE: 'fullscreenChange',\n PIP_CHANGE: 'pipChange',\n PLAYBACK_RATE_CHANGE: 'playbackRateChange',\n AUDIO_CHANGE: 'audioChange',\n QUALITY_CHANGE: 'qualityChange',\n VOLUME_CHANGE: 'volumeChange',\n all(): string[] {\n const all: string[] = []\n for (const key in core.EVENTS) {\n if (core.has(core.EVENTS, key) && core.isString((core.EVENTS as any)[key])) {\n all.push((core.EVENTS as any)[key])\n }\n }\n return all\n }\n } as PlayerEvents,\n\n POST_MESSAGE: !!window.postMessage,\n\n METHODS: {\n PLAY: 'play',\n PAUSE: 'pause',\n GETPAUSED: 'getPaused',\n MUTE: 'mute',\n UNMUTE: 'unmute',\n GETMUTED: 'getMuted',\n SETVOLUME: 'setVolume',\n GETVOLUME: 'getVolume',\n GETDURATION: 'getDuration',\n SETCURRENTTIME: 'setCurrentTime',\n GETCURRENTTIME: 'getCurrentTime',\n SETLOOP: 'setLoop',\n GETLOOP: 'getLoop',\n SETPLAYBACKRATE: 'setPlaybackRate',\n GETPLAYBACKRATE: 'getPlaybackRate',\n REMOVEEVENTLISTENER: 'removeEventListener',\n ADDEVENTLISTENER: 'addEventListener',\n all(): string[] {\n const all: string[] = []\n for (const key in core.METHODS) {\n if (core.has(core.METHODS, key) && core.isString((core.METHODS as any)[key])) {\n all.push((core.METHODS as any)[key])\n }\n }\n return all\n }\n } as PlayerMethods,\n\n DEBUG: false,\n VERSION: '2.0',\n CONTEXT: 'player.js',\n\n isString(obj: any): obj is string {\n return Object.prototype.toString.call(obj) === '[object String]'\n },\n\n has(obj: object, key: string): boolean {\n return Object.prototype.hasOwnProperty.call(obj, key)\n },\n\n addEvent(elem: any, type: string, eventHandle: (e: any) => void): void {\n if (!elem) { return }\n if (elem.addEventListener) {\n elem.addEventListener(type, eventHandle, false)\n } else if (elem.attachEvent) {\n elem.attachEvent('on' + type, eventHandle)\n } else {\n elem['on' + type] = eventHandle\n }\n },\n\n isNone(obj: any): obj is null | undefined {\n return (obj === null || obj === undefined)\n },\n\n assert(test: any, msg?: string): asserts test {\n if (!test) {\n throw msg || 'Player.js Assert Failed'\n }\n },\n\n generateUUID(): string {\n if (crypto && crypto.randomUUID) {\n return crypto.randomUUID()\n } else {\n const url = URL.createObjectURL(new Blob())\n return url.substring(url.lastIndexOf('/') + 1)\n }\n },\n\n isArray(obj: any): obj is any[] {\n return Object.prototype.toString.call(obj) === '[object Array]'\n }\n}\n\nexport default core\n","/*\n* Keeper is just a method for keeping track of all the callbacks.\n*/\nimport core from './core'\nimport { KeeperData, EventCallback } from './types'\n\nclass Keeper {\n private data: { [event: string]: KeeperData[] }\n\n constructor() {\n this.data = {}\n }\n\n has(event: string, id?: string): boolean {\n if (!Object.prototype.hasOwnProperty.call(this.data, event)) {\n return false\n }\n\n if (core.isNone(id)) {\n return true\n }\n\n // Figure out if we have the event.\n const events = this.data[event]\n\n for (let i = 0; i < events.length; i++) {\n if (events[i].id === id) {\n return true\n }\n }\n\n return false\n }\n\n add(id: string, event: string, cb: EventCallback, ctx?: any, one: boolean = false): void {\n const d: KeeperData = {\n id,\n event,\n cb,\n ctx,\n one\n }\n\n if (this.has(event)) {\n this.data[event].push(d)\n } else {\n this.data[event] = [d]\n }\n }\n\n execute(event: string, id?: string, data?: any, ctx?: any): boolean {\n if (!this.has(event, id)) {\n return false\n }\n\n const keep: KeeperData[] = []\n const execute: Array<{cb: EventCallback, ctx: any, data: any}> = []\n\n for (let i = 0; i < this.data[event].length; i++) {\n const d = this.data[event][i]\n\n // There are omni events, in that they do not have an id. i.e \"ready\".\n // Or there is an ID and we only want to execute the right id'd method.\n if (core.isNone(id) || (!core.isNone(id) && d.id === id)) {\n execute.push({\n cb: d.cb,\n ctx: d.ctx ? d.ctx : ctx,\n data\n })\n\n // If we only wanted to execute this once.\n if (d.one === false) {\n keep.push(d)\n }\n } else {\n keep.push(d)\n }\n }\n\n if (keep.length === 0) {\n delete this.data[event]\n } else {\n this.data[event] = keep\n }\n\n // We need to execute everything after we deal with the one stuff. otherwise\n // we have issues to order of operations.\n for (let n = 0; n < execute.length; n++) {\n const e = execute[n]\n e.cb.call(e.ctx, e.data)\n }\n\n return true\n }\n\n on(id: string, event: string, cb: EventCallback, ctx?: any): void {\n this.add(id, event, cb, ctx, false)\n }\n\n one(id: string, event: string, cb: EventCallback, ctx?: any): void {\n this.add(id, event, cb, ctx, true)\n }\n\n off(event: string, cb?: EventCallback): string[] {\n // We should probably restructure so this is a bit less of a pain.\n const listeners: string[] = []\n\n if (!Object.prototype.hasOwnProperty.call(this.data, event)) {\n return listeners\n }\n\n const keep: KeeperData[] = []\n\n // Loop through everything.\n for (let i = 0; i < this.data[event].length; i++) {\n const data = this.data[event][i]\n // If we only keep if there was a CB and the CB is there.\n if (!core.isNone(cb) && data.cb !== cb) {\n keep.push(data)\n } else if (!core.isNone(data.id)) {\n listeners.push(data.id)\n }\n }\n\n if (keep.length === 0) {\n delete this.data[event]\n } else {\n this.data[event] = keep\n }\n\n return listeners\n }\n}\n\nexport default Keeper\n","/*\n* Player.js is a javascript library for interacting with iframes via\n* postMessage that use an Open Player Spec\n*\n*/\nimport core from './core'\nimport Keeper from './keeper'\nimport { PlayerData, ReadyData, EventCallback, MethodCallback, GetMethodPromise, SetMethodPromise } from './types'\n\nconst READIED: string[] = []\n\nclass Player {\n public READIED: string[]\n public elem: HTMLIFrameElement\n public debug: boolean\n public origin: string\n public keeper: Keeper\n public isReady: boolean\n public queue: PlayerData[]\n public events: string[]\n public methods: string[]\n public loaded?: boolean\n\n constructor(elem: string | HTMLIFrameElement, debug: boolean = false) {\n const self = this\n this.READIED = READIED\n\n if (core.isString(elem)) {\n const element = document.getElementById(elem) as HTMLIFrameElement\n if (!element) {\n throw new Error(`Element with id \"${elem}\" not found`)\n }\n elem = element\n }\n\n this.elem = elem\n\n this.debug = debug\n\n // make sure we have an iframe\n core.assert(elem.nodeName === 'IFRAME',\n 'playerjs.Player constructor requires an Iframe, got \"' + elem.nodeName + '\"')\n core.assert(elem.src,\n 'playerjs.Player constructor requires a Iframe with a \\'src\\' attribute.')\n\n // Figure out the origin of where we are sending messages.\n this.origin = (new URL(elem.src)).origin\n\n // Event handling.\n this.keeper = new Keeper()\n\n // Queuing before ready.\n this.isReady = false\n this.queue = []\n\n // Assume that everything is supported, unless we know otherwise.\n this.events = core.EVENTS.all()\n this.methods = core.METHODS.all()\n\n if (core.POST_MESSAGE) {\n // Set up the reciever.\n core.addEvent(window, 'message', function (e: MessageEvent) {\n self.receive(e)\n })\n } else {\n console.error('Post Message is not Available.')\n }\n\n // See if we caught the src event first, otherwise assume we haven't loaded\n if (READIED.includes(elem.src)) {\n self.loaded = true\n } else {\n // Try the onload event, just lets us give another test.\n this.elem.onload = function () {\n self.loaded = true\n }\n }\n }\n\n send(data: PlayerData, callback?: MethodCallback, ctx?: any): boolean {\n // Add the context and version to the data.\n data.context = core.CONTEXT\n data.version = core.VERSION\n\n // We are expecting a response.\n if (callback) {\n // Create a UUID\n const id = core.generateUUID()\n\n // Set the listener.\n data.listener = id\n\n // Only hang on to this listener once.\n this.keeper.one(id, data.method || '', callback, ctx)\n }\n\n if (!this.isReady && data.value !== 'ready') {\n if (this.debug) {\n console.debug('Player.queue', data)\n }\n this.queue.push(data)\n return false\n }\n\n if (this.debug) {\n console.debug('Player.send', data, this.origin)\n }\n\n if (this.loaded === true && this.elem.contentWindow) {\n this.elem.contentWindow.postMessage(JSON.stringify(data), this.origin)\n }\n\n return true\n }\n\n receive(e: MessageEvent): boolean {\n if (this.debug) {\n console.debug('Player.receive', e)\n }\n\n if (e.origin !== this.origin) {\n return false\n }\n\n let data: any\n try {\n data = JSON.parse(e.data)\n } catch (err) {\n // Not a valid response.\n return false\n }\n\n // abort if this message wasn't a player.js message\n if (data.context !== core.CONTEXT) {\n return false\n }\n\n // We need to determine if we are ready.\n if (data.event === 'ready' && data.value && data.value.src === this.elem.src) {\n this.ready(data as ReadyData)\n }\n\n if (this.keeper.has(data.event, data.listener)) {\n this.keeper.execute(data.event, data.listener, data.value, this)\n }\n\n return true\n }\n\n ready(data: ReadyData): boolean {\n if (this.isReady === true) {\n return false\n }\n\n // If we got a list of supported methods, we should set them.\n if (data.value.events) {\n this.events = data.value.events\n }\n if (data.value.methods) {\n this.methods = data.value.methods\n }\n\n // set ready.\n this.isReady = true\n this.loaded = true\n\n // Clear the queue\n for (let i = 0; i < this.queue.length; i++) {\n const obj = this.queue[i]\n\n if (this.debug) {\n console.debug('Player.dequeue', obj)\n }\n\n if (data.event === 'ready') {\n this.keeper.execute(obj.event || '', obj.listener, true, this)\n }\n this.send(obj)\n }\n this.queue = []\n\n return true\n }\n\n on(event: string, callback: EventCallback, ctx?: any): boolean {\n const id = core.generateUUID()\n\n if (event === 'ready') {\n // We only want to call ready once.\n this.keeper.one(id, event, callback, ctx)\n } else {\n this.keeper.on(id, event, callback, ctx)\n }\n\n this.send({\n method: 'addEventListener',\n value: event,\n listener: id\n })\n\n return true\n }\n\n off(event: string, callback?: EventCallback): boolean {\n const listeners = this.keeper.off(event, callback)\n if (this.debug) {\n console.debug('Player.off', listeners)\n }\n\n if (listeners.length > 0) {\n for (const i in listeners) {\n this.send({\n method: 'removeEventListener',\n value: event,\n listener: listeners[i]\n })\n }\n return true\n }\n\n return false\n }\n\n // Based on what ready passed back, we can determine if the events/method are\n // supported by the player.\n supports(evtOrMethod: 'event' | 'method', names: string | string[]): boolean {\n core.assert(['method', 'event'].includes(evtOrMethod),\n 'evtOrMethod needs to be either \"event\" or \"method\" got ' + evtOrMethod)\n\n // Make everything an array.\n names = core.isArray(names) ? names : [names]\n\n const all = evtOrMethod === 'event' ? this.events : this.methods\n\n for (let i = 0; i < names.length; i++) {\n if (!all.includes(names[i])) {\n return false\n }\n }\n\n return true\n }\n\n // Dynamic method generation will be added via the prototype modification below\n // Method overloads for both promise and callback styles\n \n // Play/Pause methods (no return value needed)\n play?(): Promise<void>\n pause?(): Promise<void>\n mute?(): Promise<void>\n unmute?(): Promise<void>\n \n // Getter methods with overloads\n getPaused?(): GetMethodPromise<boolean>\n getPaused?(callback: MethodCallback): void\n \n getMuted?(): GetMethodPromise<boolean>\n getMuted?(callback: MethodCallback): void\n \n getVolume?(): GetMethodPromise<number>\n getVolume?(callback: MethodCallback): void\n \n getDuration?(): GetMethodPromise<number>\n getDuration?(callback: MethodCallback): void\n \n getCurrentTime?(): GetMethodPromise<number>\n getCurrentTime?(callback: MethodCallback): void\n \n getLoop?(): GetMethodPromise<boolean>\n getLoop?(callback: MethodCallback): void\n \n getPlaybackRate?(): GetMethodPromise<number>\n getPlaybackRate?(callback: MethodCallback): void\n \n // Setter methods\n setVolume?(volume: number): SetMethodPromise\n setCurrentTime?(time: number): SetMethodPromise\n setLoop?(loop: boolean): SetMethodPromise\n setPlaybackRate?(rate: number): SetMethodPromise\n}\n\n// create function to add to the Player prototype\nfunction createPrototypeFunction(name: string) {\n return function (this: Player, ...args: any[]): any {\n const data: PlayerData = {\n method: name\n }\n\n // for getters, check if callback is provided or return a promise\n if (/^get/.test(name)) {\n // If a callback is provided, use callback style\n if (args.length > 0 && typeof args[0] === 'function') {\n const callback = args[0]\n this.send(data, callback, args[1])\n return\n } else {\n // Return a promise\n return new Promise((resolve, reject) => {\n this.send(data, (value: any) => {\n resolve(value)\n })\n })\n }\n } else {\n // for setters and action methods, return a promise\n if (/^set/.test(name)) {\n core.assert(args.length !== 0, 'Set methods require a value.')\n data.value = args[0]\n }\n \n // For action methods (play, pause, mute, unmute) and setters, return promise\n return new Promise<void>((resolve, reject) => {\n // For action methods, we don't need to wait for a response\n if (['play', 'pause', 'mute', 'unmute'].includes(name)) {\n this.send(data)\n resolve()\n } else {\n // For setters, we might want to wait for confirmation\n this.send(data, () => {\n resolve()\n })\n }\n })\n }\n }\n}\n\n// Loop through the methods to add them to the prototype.\nfor (const methodName of core.METHODS.all()) {\n if (!Object.prototype.hasOwnProperty.call(Player.prototype, methodName)) {\n (Player.prototype as any)[methodName] = createPrototypeFunction(methodName)\n }\n}\n\ncore.addEvent(window, 'message', function (e: MessageEvent) {\n let data: any\n try {\n data = JSON.parse(e.data)\n } catch (err) {\n return false\n }\n\n // abort if this message wasn't a player.js message\n if (data.context !== core.CONTEXT) {\n return false\n }\n\n // We need to determine if we are ready.\n if (data.event === 'ready' && data.value && data.value.src) {\n READIED.push(data.value.src)\n }\n})\n\nexport default Player\n","/*\n* Does all the wiring up for the backend.\n*\n* var receiver = new playerjs.Receiver();\n* receiver.on('play', function(){ video.play() });\n* receiver.on('getDuration', function(callback){ callback(video.duration) });\n* receiver.emit('timeupdate', {});\n*/\n\nimport core from './core'\nimport { SupportedFeatures, EventCallback, MethodCallback } from './types'\n\nclass Receiver {\n public isReady: boolean\n public origin: string\n public methods: { [method: string]: Function }\n public supported: SupportedFeatures\n public eventListeners: { [event: string]: (string | null)[] }\n public reject: boolean\n\n constructor(events?: string[], methods?: string[]) {\n const self = this\n\n // Deal with the ready crap.\n this.isReady = false\n\n // Bind the window message.\n if (document.referrer) {\n this.origin = (new URL(document.referrer)).origin\n } else {\n this.origin = '*'\n }\n\n // Create a holder for all the methods.\n this.methods = {}\n\n // holds all the information about what's supported\n this.supported = {\n events: events || core.EVENTS.all(),\n methods: methods || core.METHODS.all()\n }\n\n // Deals with the adding and removing of event listeners.\n this.eventListeners = {}\n\n // We can't send any messages.\n this.reject = !(window.self !== window.top && core.POST_MESSAGE)\n\n // We aren't in an iframe, don't listen.\n if (!this.reject) {\n core.addEvent(window, 'message', function (e: MessageEvent) {\n self.receive(e)\n })\n }\n }\n\n receive(e: MessageEvent): boolean {\n // Only want to listen to events that came from our origin.\n if (e.origin !== this.origin) {\n return false\n }\n\n // Browsers that support postMessage also support JSON.\n let data: any = {}\n if (typeof e.data === 'object') {\n data = e.data\n } else {\n try {\n data = window.JSON.parse(e.data)\n } catch (err) {\n console.error('JSON Parse Error', err)\n }\n }\n\n console.debug('Receiver.receive', e, data)\n\n // Nothing for us to do.\n if (!data.method) {\n return false\n }\n\n // make sure the context is correct.\n if (data.context !== core.CONTEXT) {\n return false\n }\n\n // Make sure we have a valid method.\n if (!core.METHODS.all().includes(data.method)) {\n this.emit('error', {\n code: 2,\n msg: 'Invalid Method \"' + data.method + '\"'\n })\n return false\n }\n\n // See if we added a listener\n const listener = !core.isNone(data.listener) ? data.listener : null\n\n // Add Event Listener.\n if (data.method === 'addEventListener') {\n if (Object.prototype.hasOwnProperty.call(this.eventListeners, data.value)) {\n // If the listener is the same, i.e. null only add it once.\n if (!this.eventListeners[data.value].includes(listener)) {\n this.eventListeners[data.value].push(listener)\n }\n } else {\n this.eventListeners[data.value] = [listener]\n }\n\n if (data.value === 'ready' && this.isReady) {\n this.ready()\n }\n } else if (data.method === 'removeEventListener') { // Remove the event listener.\n if (Object.prototype.hasOwnProperty.call(this.eventListeners, data.value)) {\n const index = this.eventListeners[data.value].indexOf(listener)\n\n // if we find the element, remove it.\n if (index > -1) {\n this.eventListeners[data.value].splice(index, 1)\n }\n\n if (this.eventListeners[data.value].length === 0) {\n delete this.eventListeners[data.value]\n }\n }\n } else { // Go get it.\n this.get(data.method, data.value, listener)\n }\n\n return true\n }\n\n get(method: string, value: any, listener: string | null): boolean {\n const self = this\n\n // Now lets do it.\n if (!Object.prototype.hasOwnProperty.call(this.methods, method)) {\n this.emit('error', {\n code: 3,\n msg: 'Method Not Supported \"' + method + '\"'\n })\n return false\n }\n\n const func = this.methods[method]\n\n if (method.substr(0, 3) === 'get') {\n const callback = function (val: any) {\n self.send(method, val, listener)\n }\n func.call(this, callback)\n } else {\n func.call(this, value)\n }\n\n return true\n }\n\n on(event: string, callback: Function): void {\n this.methods[event] = callback\n }\n\n send(event: string, value?: any, listener?: string | null): boolean {\n console.debug('Receiver.send', event, value, listener)\n\n if (this.reject) {\n // We are not in a frame, or we don't support POST_MESSAGE\n console.error('Receiver.send.reject', event, value, listener)\n return false\n }\n\n const data: any = {\n context: core.CONTEXT,\n version: core.VERSION,\n event\n }\n\n if (!core.isNone(value)) {\n data.value = value\n }\n\n if (!core.isNone(listener)) {\n data.listener = listener\n }\n\n const msg = JSON.stringify(data)\n window.parent.postMessage(msg, this.origin === '' ? '*' : this.origin)\n\n return true\n }\n\n emit(event: string, value?: any): boolean {\n if (!Object.prototype.hasOwnProperty.call(this.eventListeners, event)) {\n return false\n }\n\n console.debug('Instance.emit', event, value, this.eventListeners[event])\n\n for (let i = 0; i < this.eventListeners[event].length; i++) {\n const listener = this.eventListeners[event][i]\n this.send(event, value, listener)\n }\n\n return true\n }\n\n ready(): void {\n console.debug('Receiver.ready')\n this.isReady = true\n\n const data = {\n src: window.location.toString(),\n events: this.supported.events,\n methods: this.supported.methods\n }\n\n if (!this.emit('ready', data)) {\n this.send('ready', data)\n }\n }\n}\n\nexport default Receiver\n","import Receiver from '../receiver'\n\ninterface MockVideo {\n duration: number\n currentTime: number\n interval: NodeJS.Timeout | null\n timeupdate: (data: { seconds: number; duration: number }) => void\n volume: number\n mute: boolean\n playing: boolean\n loop: boolean\n playbackRate: number\n play: () => void\n pause: () => void\n}\n\nclass MockAdapter {\n public receiver!: Receiver\n\n constructor() {\n this.init()\n }\n\n init(): void {\n // Our mock video\n const video: MockVideo = {\n duration: 20,\n currentTime: 0,\n interval: null,\n timeupdate: function () {},\n volume: 100,\n mute: false,\n playing: false,\n loop: false,\n playbackRate: 1,\n play: function () {\n video.interval = setInterval(function () {\n video.currentTime += 0.25\n video.timeupdate({\n seconds: video.currentTime,\n duration: video.duration\n })\n }, 250)\n video.playing = true\n },\n pause: function () {\n if (video.interval) {\n clearInterval(video.interval)\n }\n video.playing = false\n }\n }\n\n // Set up the actual receiver\n const receiver = this.receiver = new Receiver()\n\n receiver.on('play', function (this: Receiver) {\n const self = this\n video.play()\n this.emit('play')\n video.timeupdate = function (data: { seconds: number; duration: number }) {\n self.emit('timeupdate', data)\n }\n })\n\n receiver.on('pause', function (this: Receiver) {\n video.pause()\n this.emit('pause')\n })\n\n receiver.on('getPaused', function (callback: (isPaused: boolean) => void) {\n const isPaused = !video.playing\n callback(isPaused)\n })\n\n receiver.on('getCurrentTime', function (callback: (time: number) => void) {\n callback(video.currentTime)\n })\n\n receiver.on('setCurrentTime', function (value: number) {\n video.currentTime = value\n })\n\n receiver.on('getDuration', function (callback: (duration: number) => void) {\n callback(video.duration)\n })\n\n receiver.on('getVolume', function (callback: (volume: number) => void) {\n callback(video.volume)\n })\n\n receiver.on('setVolume', function (value: number) {\n video.volume = value\n })\n\n receiver.on('mute', function () {\n video.mute = true\n })\n\n receiver.on('unmute', function () {\n video.mute = false\n })\n\n receiver.on('getMuted', function (callback: (muted: boolean) => void) {\n callback(video.mute)\n })\n\n receiver.on('getLoop', function (callback: (loop: boolean) => void) {\n callback(video.loop)\n })\n\n receiver.on('setLoop', function (value: boolean) {\n video.loop = value\n })\n\n receiver.on('setPlaybackRate', function (value: number) {\n video.playbackRate = value\n })\n\n receiver.on('getPlaybackRate', function (callback: (rate: number) => void) {\n callback(video.playbackRate)\n })\n }\n\n ready(): void {\n this.receiver.ready()\n }\n}\n\nexport default MockAdapter\n","import core from '../core'\nimport Receiver from '../receiver'\n\n// VideoJS player interface - adjust based on actual VideoJS types if available\ninterface VideoJSPlayer {\n on(event: string, callback: () => void): void\n play(): void\n pause(): void\n paused(): boolean\n currentTime(time?: number): number\n duration(): number\n volume(vol?: number): number\n loop(loop?: boolean): boolean\n playbackRate(rate?: number): number\n}\n\nclass VideoJSAdapter {\n public receiver!: Receiver\n\n constructor(player: VideoJSPlayer) {\n this.init(player)\n }\n\n init(player: VideoJSPlayer): void {\n core.assert(player, 'VideoJSReceiver requires a player object')\n\n // Set up the actual receiver\n const receiver = this.receiver = new Receiver()\n\n /* EVENTS */\n player.on('pause', function () {\n receiver.emit('pause')\n })\n\n player.on('play', function () {\n receiver.emit('play')\n })\n\n player.on('timeupdate', function () {\n const seconds = player.currentTime()\n const duration = player.duration()\n\n if (!seconds || !duration) {\n return false\n }\n\n const value = {\n seconds,\n duration\n }\n receiver.emit('timeupdate', value)\n })\n\n player.on('ended', function () {\n receiver.emit('ended')\n })\n\n player.on('error', function () {\n receiver.emit('error')\n })\n\n /* METHODS */\n receiver.on('play', function () {\n player.play()\n })\n\n receiver.on('pause', function () {\n player.pause()\n })\n\n receiver.on('getPaused', function (callback: (paused: boolean) => void) {\n callback(player.paused())\n })\n\n receiver.on('getCurrentTime', function (callback: (time: number) => void) {\n callback(player.currentTime())\n })\n\n receiver.on('setCurrentTime', function (value: number) {\n player.currentTime(value)\n })\n\n receiver.on('getDuration', function (callback: (duration: number) => void) {\n callback(player.duration())\n })\n\n receiver.on('getVolume', function (callback: (volume: number) => void) {\n const volume = player.volume() * 100\n callback(volume)\n })\n\n receiver.on('setVolume', function (value: number) {\n player.volume(value / 100)\n })\n\n receiver.on('mute', function () {\n player.volume(0)\n })\n\n receiver.on('unmute', function () {\n player.volume(1)\n })\n\n receiver.on('getMuted', function (callback: (muted: boolean) => void) {\n const isMuted = player.volume() === 0\n callback(isMuted)\n })\n\n receiver.on('getLoop', function (callback: (loop: boolean) => void) {\n callback(player.loop())\n })\n\n receiver.on('setLoop', function (value: boolean) {\n player.loop(value)\n })\n\n receiver.on('setPlaybackRate', function (value: number) {\n player.playbackRate(value)\n })\n\n receiver.on('getPlaybackRate', function (callback: (rate: number) => void) {\n callback(player.playbackRate())\n })\n }\n\n ready(): void {\n this.receiver.ready()\n }\n}\n\nexport default VideoJSAdapter\n","import core from '../core'\nimport Receiver from '../receiver'\n\nclass HTML5Adapter {\n public receiver!: Receiver\n\n constructor(video: HTMLVideoElement) {\n this.init(video)\n }\n\n init(video: HTMLVideoElement): void {\n core.assert(video, 'HTML5Adapter requires a video element')\n\n // Set up the actual receiver\n const receiver = this.receiver = new Receiver()\n\n /* EVENTS */\n video.addEventListener('playing', function () {\n receiver.emit('play')\n })\n\n video.addEventListener('pause', function () {\n receiver.emit('pause')\n })\n\n video.addEventListener('ended', function () {\n receiver.emit('ended')\n })\n\n video.addEventListener('timeupdate', function () {\n receiver.emit('timeupdate', {\n seconds: video.currentTime,\n duration: video.duration\n })\n })\n\n video.addEventListener('progress', function () {\n receiver.emit('buffered', {\n percent: video.buffered.length\n })\n })\n\n /* Methods */\n receiver.on('play', function () {\n video.play()\n })\n\n receiver.on('pause', function () {\n video.pause()\n })\n\n receiver.on('getPaused', function (callback: (paused: boolean) => void) {\n callback(video.paused)\n })\n\n receiver.on('getCurrentTime', function (callback: (time: number) => void) {\n callback(video.currentTime)\n })\n\n receiver.on('setCurrentTime', function (value: number) {\n video.currentTime = value\n })\n\n receiver.on('getDuration', function (callback: (duration: number) => void) {\n callback(video.duration)\n })\n\n receiver.on('getVolume', function (callback: (volume: number) => void) {\n const volume = video.volume * 100\n callback(volume)\n })\n\n receiver.on('setVolume', function (value: number) {\n video.volume = value / 100\n })\n\n receiver.on('mute', function () {\n video.muted = true\n })\n\n receiver.on('unmute', function () {\n video.muted = false\n })\n\n receiver.on('getMuted', function (callback: (muted: boolean) => void) {\n callback(video.muted)\n })\n\n receiver.on('getLoop', function (callback: (loop: boolean) => void) {\n callback(video.loop)\n })\n\n receiver.on('setLoop', function (value: boolean) {\n video.loop = value\n })\n\n receiver.on('setPlaybackRate', function (value: number) {\n video.playbackRate = value\n })\n\n receiver.on('getPlaybackRate', function (callback: (rate: number) => void) {\n callback(video.playbackRate)\n })\n }\n\n ready(): void {\n this.receiver.ready()\n }\n}\n\nexport default HTML5Adapter\n","import core from './core'\nimport Player from './player'\nimport Receiver from './receiver'\nimport MockAdapter from './adapters/mock'\nimport VideoJSAdapter from './adapters/video'\nimport HTML5Adapter from './adapters/html'\nimport { PlayerMethods } from './types'\n\ninterface PlayerJS {\n Player: typeof Player\n Receiver: typeof Receiver\n MockAdapter: typeof MockAdapter\n VideoJSAdapter: typeof VideoJSAdapter\n HTML5Adapter: typeof HTML5Adapter\n CONTEXT: string\n VERSION: string\n METHODS: PlayerMethods\n addEvent: typeof core.addEvent\n}\n\nconst playerjs: PlayerJS = {\n Player,\n Receiver,\n MockAdapter,\n VideoJSAdapter,\n HTML5Adapter,\n CONTEXT: core.CONTEXT,\n VERSION: core.VERSION,\n METHODS: core.METHODS,\n addEvent: core.addEvent\n}\n\n// Attach to the window object explicitly\ndeclare global {\n interface Window {\n playerjs: PlayerJS\n }\n}\n\nif (typeof window !== 'undefined') {\n window.playerjs = playerjs\n}\n\nexport default playerjs\n"],"mappings":"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","names":["core","all","key","obj","elem","type","eventHandle","test","msg","url","core_default","Keeper","event","id","core_default","events","i","cb","ctx","one","d","data","keep","execute","n","e","listeners","keeper_default","READIED","Player","elem","debug","self","core_default","element","keeper_default","e","data","callback","ctx","id","err","i","obj","event","listeners","evtOrMethod","names","all","createPrototypeFunction","name","args","resolve","reject","value","methodName","player_default","Receiver","events","methods","self","core_default","e","data","err","listener","index","method","value","func","callback","val","event","msg","i","receiver_default","MockAdapter","video","receiver","receiver_default","self","data","callback","isPaused","value","mock_default","VideoJSAdapter","player","core_default","receiver","receiver_default","seconds","duration","value","callback","volume","isMuted","video_default","HTML5Adapter","video","core_default","receiver","receiver_default","callback","value","volume","html_default","playerjs","player_default","receiver_default","mock_default","video_default","html_default","core_default","main_default"]}
1
+ {"version":3,"sources":["../src/core.ts","../src/keeper.ts","../src/logger.ts","../src/player.ts","../src/receiver.ts","../src/adapters/mock.ts","../src/adapters/video.ts","../src/adapters/html.ts","../src/main.ts"],"sourcesContent":["import type { PlayerEvents, PlayerMethods, Core } from './types'\n\nconst core: Core = {\n EVENTS: {\n READY: 'ready',\n PLAY: 'play',\n PAUSE: 'pause',\n ENDED: 'ended',\n TIMEUPDATE: 'timeupdate',\n PROGRESS: 'progress',\n SEEKED: 'seeked',\n ERROR: 'error',\n FULLSCREEN_CHANGE: 'fullscreenChange',\n PIP_CHANGE: 'pipChange',\n PLAYBACK_RATE_CHANGE: 'playbackRateChange',\n AUDIO_CHANGE: 'audioChange',\n QUALITY_CHANGE: 'qualityChange',\n VOLUME_CHANGE: 'volumeChange',\n all(): string[] {\n const all: string[] = []\n for (const key in core.EVENTS) {\n if (core.has(core.EVENTS, key) && core.isString((core.EVENTS as any)[key])) {\n all.push((core.EVENTS as any)[key])\n }\n }\n return all\n }\n } as PlayerEvents,\n\n POST_MESSAGE: !!window.postMessage,\n\n METHODS: {\n PLAY: 'play',\n PAUSE: 'pause',\n GETPAUSED: 'getPaused',\n MUTE: 'mute',\n UNMUTE: 'unmute',\n GETMUTED: 'getMuted',\n SETVOLUME: 'setVolume',\n GETVOLUME: 'getVolume',\n GETDURATION: 'getDuration',\n SETCURRENTTIME: 'setCurrentTime',\n GETCURRENTTIME: 'getCurrentTime',\n SETLOOP: 'setLoop',\n GETLOOP: 'getLoop',\n SETPLAYBACKRATE: 'setPlaybackRate',\n GETPLAYBACKRATE: 'getPlaybackRate',\n REMOVEEVENTLISTENER: 'removeEventListener',\n ADDEVENTLISTENER: 'addEventListener',\n all(): string[] {\n const all: string[] = []\n for (const key in core.METHODS) {\n if (core.has(core.METHODS, key) && core.isString((core.METHODS as any)[key])) {\n all.push((core.METHODS as any)[key])\n }\n }\n return all\n }\n } as PlayerMethods,\n\n DEBUG: false,\n VERSION: '2.0',\n CONTEXT: 'player.js',\n\n isString(obj: any): obj is string {\n return Object.prototype.toString.call(obj) === '[object String]'\n },\n\n has(obj: object, key: string): boolean {\n return Object.hasOwn(obj, key)\n },\n\n addEvent(elem: any, type: string, eventHandle: (e: any) => void): void {\n if (!elem) { return }\n if (elem.addEventListener) {\n elem.addEventListener(type, eventHandle, false)\n } else if (elem.attachEvent) {\n elem.attachEvent(`on${type}`, eventHandle)\n } else {\n elem[`on${type}`] = eventHandle\n }\n },\n\n isNone(obj: any): obj is null | undefined {\n return (obj === null || obj === undefined)\n },\n\n assert(test: any, msg?: string): asserts test {\n if (!test) {\n throw msg || 'Player.js Assert Failed'\n }\n },\n\n generateUUID(): string {\n if (crypto?.randomUUID) {\n return crypto.randomUUID()\n } else {\n const url = URL.createObjectURL(new Blob())\n return url.substring(url.lastIndexOf('/') + 1)\n }\n },\n\n isArray(obj: any): obj is any[] {\n return Object.prototype.toString.call(obj) === '[object Array]'\n }\n}\n\nexport default core\n","/*\n* Keeper is just a method for keeping track of all the callbacks.\n*/\nimport core from './core'\nimport type { KeeperData, EventCallback } from './types'\n\nclass Keeper {\n private data: { [event: string]: KeeperData[] }\n\n constructor() {\n this.data = {}\n }\n\n has(event: string, id?: string): boolean {\n if (!Object.hasOwn(this.data, event)) {\n return false\n }\n\n if (core.isNone(id)) {\n return true\n }\n\n // Figure out if we have the event.\n const events = this.data[event]\n\n for (let i = 0; i < events.length; i++) {\n if (events[i].id === id) {\n return true\n }\n }\n\n return false\n }\n\n add(id: string, event: string, cb: EventCallback, ctx?: any, one: boolean = false): void {\n const d: KeeperData = {\n id,\n event,\n cb,\n ctx,\n one\n }\n\n if (this.has(event)) {\n this.data[event].push(d)\n } else {\n this.data[event] = [d]\n }\n }\n\n execute(event: string, id?: string, data?: any, ctx?: any): boolean {\n if (!this.has(event, id)) {\n return false\n }\n\n const keep: KeeperData[] = []\n const execute: Array<{cb: EventCallback, ctx: any, data: any}> = []\n\n for (let i = 0; i < this.data[event].length; i++) {\n const d = this.data[event][i]\n\n // There are omni events, in that they do not have an id. i.e \"ready\".\n // Or there is an ID and we only want to execute the right id'd method.\n if (core.isNone(id) || (!core.isNone(id) && d.id === id)) {\n execute.push({\n cb: d.cb,\n ctx: d.ctx ? d.ctx : ctx,\n data\n })\n\n // If we only wanted to execute this once.\n if (d.one === false) {\n keep.push(d)\n }\n } else {\n keep.push(d)\n }\n }\n\n if (keep.length === 0) {\n delete this.data[event]\n } else {\n this.data[event] = keep\n }\n\n // We need to execute everything after we deal with the one stuff. otherwise\n // we have issues to order of operations.\n for (let n = 0; n < execute.length; n++) {\n const e = execute[n]\n e.cb.call(e.ctx, e.data)\n }\n\n return true\n }\n\n on(id: string, event: string, cb: EventCallback, ctx?: any): void {\n this.add(id, event, cb, ctx, false)\n }\n\n one(id: string, event: string, cb: EventCallback, ctx?: any): void {\n this.add(id, event, cb, ctx, true)\n }\n\n off(event: string, cb?: EventCallback): string[] {\n // We should probably restructure so this is a bit less of a pain.\n const listeners: string[] = []\n\n if (!Object.hasOwn(this.data, event)) {\n return listeners\n }\n\n const keep: KeeperData[] = []\n\n // Loop through everything.\n for (let i = 0; i < this.data[event].length; i++) {\n const data = this.data[event][i]\n // If we only keep if there was a CB and the CB is there.\n if (!core.isNone(cb) && data.cb !== cb) {\n keep.push(data)\n } else if (!core.isNone(data.id)) {\n listeners.push(data.id)\n }\n }\n\n if (keep.length === 0) {\n delete this.data[event]\n } else {\n this.data[event] = keep\n }\n\n return listeners\n }\n}\n\nexport default Keeper\n","/**\n * Conditional logger utility for player.js\n * Provides debug, log, warn, and error methods that only output when enabled\n */\n\nclass Logger {\n private enabled: boolean\n\n constructor(enabled: boolean = false) {\n this.enabled = enabled\n }\n\n setEnabled(enabled: boolean): void {\n this.enabled = enabled\n }\n\n isEnabled(): boolean {\n return this.enabled\n }\n\n debug(...args: any[]): void {\n if (this.enabled) {\n console.debug(...args)\n }\n }\n\n log(...args: any[]): void {\n if (this.enabled) {\n console.log(...args)\n }\n }\n\n warn(...args: any[]): void {\n if (this.enabled) {\n console.warn(...args)\n }\n }\n\n error(...args: any[]): void {\n if (this.enabled) {\n console.error(...args)\n }\n }\n}\n\n/**\n * Creates a new logger instance\n * @param enabled - Whether logging is enabled (default: false)\n */\nexport function createLogger(enabled: boolean = false): Logger {\n return new Logger(enabled)\n}\n\nexport default Logger\n","/*\n* Player.js is a javascript library for interacting with iframes via\n* postMessage that use an Open Player Spec\n*\n*/\nimport core from './core'\nimport Keeper from './keeper'\nimport type { PlayerData, ReadyData, EventCallback, MethodCallback, GetMethodPromise, SetMethodPromise } from './types'\nimport Logger from './logger'\n\nconst READIED: string[] = []\n\nclass Player {\n public READIED: string[]\n public elem: HTMLIFrameElement\n public debug: boolean\n private logger: Logger\n public origin: string\n public keeper: Keeper\n public isReady: boolean\n public queue: PlayerData[]\n public events: string[]\n public methods: string[]\n public loaded?: boolean\n\n constructor(elem: string | HTMLIFrameElement, debug: boolean = false) {\n this.READIED = READIED\n\n if (core.isString(elem)) {\n const element = document.getElementById(elem) as HTMLIFrameElement\n if (!element) {\n throw new Error(`Element with id \"${elem}\" not found`)\n }\n elem = element\n }\n\n this.elem = elem\n\n this.debug = debug\n this.logger = new Logger(debug)\n\n // make sure we have an iframe\n core.assert(elem.nodeName === 'IFRAME',\n 'playerjs.Player constructor requires an Iframe, got \"' + elem.nodeName + '\"')\n core.assert(elem.src,\n 'playerjs.Player constructor requires a Iframe with a \\'src\\' attribute.')\n\n // Figure out the origin of where we are sending messages.\n this.origin = (new URL(elem.src)).origin\n\n // Event handling.\n this.keeper = new Keeper()\n\n // Queuing before ready.\n this.isReady = false\n this.queue = []\n\n // Assume that everything is supported, unless we know otherwise.\n this.events = core.EVENTS.all()\n this.methods = core.METHODS.all()\n\n if (core.POST_MESSAGE) {\n // Set up the reciever.\n core.addEvent(window, 'message', (e: MessageEvent) => {\n this.receive(e)\n })\n } else {\n this.logger.error('Post Message is not Available.')\n }\n\n // See if we caught the src event first, otherwise assume we haven't loaded\n if (READIED.includes(elem.src)) {\n this.loaded = true\n } else {\n // Try the onload event, just lets us give another test.\n this.elem.onload = () => {\n this.loaded = true\n }\n }\n }\n\n send(data: PlayerData, callback?: MethodCallback, ctx?: any): boolean {\n // Add the context and version to the data.\n data.context = core.CONTEXT\n data.version = core.VERSION\n\n // We are expecting a response.\n if (callback) {\n // Create a UUID\n const id = core.generateUUID()\n\n // Set the listener.\n data.listener = id\n\n // Only hang on to this listener once.\n this.keeper.one(id, data.method || '', callback, ctx)\n }\n\n if (!this.isReady && data.value !== 'ready') {\n this.logger.debug('Player.queue', data)\n this.queue.push(data)\n return false\n }\n\n this.logger.debug('Player.send', data, this.origin)\n\n if (this.loaded === true && this.elem.contentWindow) {\n this.elem.contentWindow.postMessage(JSON.stringify(data), this.origin)\n }\n\n return true\n }\n\n receive(e: MessageEvent): boolean {\n this.logger.debug('Player.receive', e)\n\n if (e.origin !== this.origin) {\n return false\n }\n\n let data: any\n try {\n data = JSON.parse(e.data)\n } catch (_err) {\n // Not a valid response.\n return false\n }\n\n // abort if this message wasn't a player.js message\n if (data.context !== core.CONTEXT) {\n return false\n }\n\n // We need to determine if we are ready.\n if (data.event === 'ready' && data.value && data.value.src === this.elem.src) {\n this.ready(data as ReadyData)\n }\n\n if (this.keeper.has(data.event, data.listener)) {\n this.keeper.execute(data.event, data.listener, data.value, this)\n }\n\n return true\n }\n\n ready(data: ReadyData): boolean {\n if (this.isReady === true) {\n return false\n }\n\n // If we got a list of supported methods, we should set them.\n if (data.value.events) {\n this.events = data.value.events\n }\n if (data.value.methods) {\n this.methods = data.value.methods\n }\n\n // set ready.\n this.isReady = true\n this.loaded = true\n\n // Clear the queue\n for (let i = 0; i < this.queue.length; i++) {\n const obj = this.queue[i]\n\n this.logger.debug('Player.dequeue', obj)\n\n if (data.event === 'ready') {\n this.keeper.execute(obj.event || '', obj.listener, true, this)\n }\n this.send(obj)\n }\n this.queue = []\n\n return true\n }\n\n on(event: string, callback: EventCallback, ctx?: any): boolean {\n const id = core.generateUUID()\n\n if (event === 'ready') {\n // We only want to call ready once.\n this.keeper.one(id, event, callback, ctx)\n } else {\n this.keeper.on(id, event, callback, ctx)\n }\n\n this.send({\n method: 'addEventListener',\n value: event,\n listener: id\n })\n\n return true\n }\n\n off(event: string, callback?: EventCallback): boolean {\n const listeners = this.keeper.off(event, callback)\n this.logger.debug('Player.off', listeners)\n\n if (listeners.length > 0) {\n for (const i in listeners) {\n this.send({\n method: 'removeEventListener',\n value: event,\n listener: listeners[i]\n })\n }\n return true\n }\n\n return false\n }\n\n // Based on what ready passed back, we can determine if the events/method are\n // supported by the player.\n supports(evtOrMethod: 'event' | 'method', names: string | string[]): boolean {\n core.assert(['method', 'event'].includes(evtOrMethod),\n 'evtOrMethod needs to be either \"event\" or \"method\" got ' + evtOrMethod)\n\n // Make everything an array.\n names = core.isArray(names) ? names : [names]\n\n const all = evtOrMethod === 'event' ? this.events : this.methods\n\n for (let i = 0; i < names.length; i++) {\n if (!all.includes(names[i])) {\n return false\n }\n }\n\n return true\n }\n\n // Dynamic method generation will be added via the prototype modification below\n // Method overloads for both promise and callback styles\n \n // Play/Pause methods (no return value needed)\n play?(): Promise<void>\n pause?(): Promise<void>\n mute?(): Promise<void>\n unmute?(): Promise<void>\n \n // Getter methods with overloads\n getPaused?(): GetMethodPromise<boolean>\n getPaused?(callback: MethodCallback): void\n \n getMuted?(): GetMethodPromise<boolean>\n getMuted?(callback: MethodCallback): void\n \n getVolume?(): GetMethodPromise<number>\n getVolume?(callback: MethodCallback): void\n \n getDuration?(): GetMethodPromise<number>\n getDuration?(callback: MethodCallback): void\n \n getCurrentTime?(): GetMethodPromise<number>\n getCurrentTime?(callback: MethodCallback): void\n \n getLoop?(): GetMethodPromise<boolean>\n getLoop?(callback: MethodCallback): void\n \n getPlaybackRate?(): GetMethodPromise<number>\n getPlaybackRate?(callback: MethodCallback): void\n \n // Setter methods\n setVolume?(volume: number): SetMethodPromise\n setCurrentTime?(time: number): SetMethodPromise\n setLoop?(loop: boolean): SetMethodPromise\n setPlaybackRate?(rate: number): SetMethodPromise\n}\n\n// create function to add to the Player prototype\nfunction createPrototypeFunction(name: string) {\n return function (this: Player, ...args: any[]): any {\n const data: PlayerData = {\n method: name\n }\n\n // for getters, check if callback is provided or return a promise\n if (/^get/.test(name)) {\n // If a callback is provided, use callback style\n if (args.length > 0 && typeof args[0] === 'function') {\n const callback = args[0]\n this.send(data, callback, args[1])\n return\n } else {\n // Return a promise\n return new Promise((resolve) => {\n this.send(data, (value: any) => {\n resolve(value)\n })\n })\n }\n } else {\n // for setters and action methods, return a promise\n if (/^set/.test(name)) {\n core.assert(args.length !== 0, 'Set methods require a value.')\n data.value = args[0]\n }\n \n // For action methods (play, pause, mute, unmute) and setters, return promise\n return new Promise<void>((resolve) => {\n // For action methods, we don't need to wait for a response\n if (['play', 'pause', 'mute', 'unmute'].includes(name)) {\n this.send(data)\n resolve()\n } else {\n // For setters, we might want to wait for confirmation\n this.send(data, () => {\n resolve()\n })\n }\n })\n }\n }\n}\n\n// Loop through the methods to add them to the prototype.\nfor (const methodName of core.METHODS.all()) {\n if (!Object.hasOwn(Player.prototype, methodName)) {\n (Player.prototype as any)[methodName] = createPrototypeFunction(methodName)\n }\n}\n\ncore.addEvent(window, 'message', (e: MessageEvent) => {\n let data: any\n try {\n data = JSON.parse(e.data)\n } catch (_err) {\n return false\n }\n\n // abort if this message wasn't a player.js message\n if (data.context !== core.CONTEXT) {\n return false\n }\n\n // We need to determine if we are ready.\n if (data.event === 'ready' && data.value && data.value.src) {\n READIED.push(data.value.src)\n }\n})\n\nexport default Player\n","/*\n* Does all the wiring up for the backend.\n*\n* var receiver = new playerjs.Receiver();\n* receiver.on('play', function(){ video.play() });\n* receiver.on('getDuration', function(callback){ callback(video.duration) });\n* receiver.emit('timeupdate', {});\n*/\n\nimport core from './core'\nimport type { SupportedFeatures } from './types'\nimport Logger from './logger'\n\nclass Receiver {\n public isReady: boolean\n public origin: string\n public methods: { [method: string]: Function }\n public supported: SupportedFeatures\n public eventListeners: { [event: string]: (string | null)[] }\n public reject: boolean\n public debug: boolean\n private logger: Logger\n\n constructor(events?: string[], methods?: string[], debug: boolean = false) {\n \n // Deal with the ready crap.\n this.isReady = false\n this.debug = debug\n this.logger = new Logger(debug)\n\n // Bind the window message.\n if (document.referrer) {\n this.origin = (new URL(document.referrer)).origin\n } else {\n this.origin = '*'\n }\n\n // Create a holder for all the methods.\n this.methods = {}\n\n // holds all the information about what's supported\n this.supported = {\n events: events || core.EVENTS.all(),\n methods: methods || core.METHODS.all()\n }\n\n // Deals with the adding and removing of event listeners.\n this.eventListeners = {}\n\n // We can't send any messages.\n this.reject = !(window.self !== window.top && core.POST_MESSAGE)\n\n // We aren't in an iframe, don't listen.\n if (!this.reject) {\n core.addEvent(window, 'message', (e: MessageEvent) => {\n this.receive(e)\n })\n }\n }\n\n receive(e: MessageEvent): boolean {\n // Only want to listen to events that came from our origin.\n if (e.origin !== this.origin) {\n return false\n }\n\n // Browsers that support postMessage also support JSON.\n let data: any = {}\n if (typeof e.data === 'object') {\n data = e.data\n } else {\n try {\n data = window.JSON.parse(e.data)\n } catch (err) {\n this.logger.error('JSON Parse Error', err)\n }\n }\n\n this.logger.debug('Receiver.receive', e, data)\n\n // Nothing for us to do.\n if (!data.method) {\n return false\n }\n\n // make sure the context is correct.\n if (data.context !== core.CONTEXT) {\n return false\n }\n\n // Make sure we have a valid method.\n if (!core.METHODS.all().includes(data.method)) {\n this.emit('error', {\n code: 2,\n msg: 'Invalid Method \"' + data.method + '\"'\n })\n return false\n }\n\n // See if we added a listener\n const listener = !core.isNone(data.listener) ? data.listener : null\n\n // Add Event Listener.\n if (data.method === 'addEventListener') {\n if (Object.hasOwn(this.eventListeners, data.value)) {\n // If the listener is the same, i.e. null only add it once.\n if (!this.eventListeners[data.value].includes(listener)) {\n this.eventListeners[data.value].push(listener)\n }\n } else {\n this.eventListeners[data.value] = [listener]\n }\n\n if (data.value === 'ready' && this.isReady) {\n this.ready()\n }\n } else if (data.method === 'removeEventListener') { // Remove the event listener.\n if (Object.hasOwn(this.eventListeners, data.value)) {\n const index = this.eventListeners[data.value].indexOf(listener)\n\n // if we find the element, remove it.\n if (index > -1) {\n this.eventListeners[data.value].splice(index, 1)\n }\n\n if (this.eventListeners[data.value].length === 0) {\n delete this.eventListeners[data.value]\n }\n }\n } else { // Go get it.\n this.get(data.method, data.value, listener)\n }\n\n return true\n }\n\n get(method: string, value: any, listener: string | null): boolean {\n\n // Now lets do it.\n if (!Object.hasOwn(this.methods, method)) {\n this.emit('error', {\n code: 3,\n msg: 'Method Not Supported \"' + method + '\"'\n })\n return false\n }\n\n const func = this.methods[method]\n\n if (method.substr(0, 3) === 'get') {\n const callback = (val: any) => {\n this.send(method, val, listener)\n }\n func.call(this, callback)\n } else {\n func.call(this, value)\n }\n\n return true\n }\n\n on(event: string, callback: Function): void {\n this.methods[event] = callback\n }\n\n send(event: string, value?: any, listener?: string | null): boolean {\n this.logger.debug('Receiver.send', event, value, listener)\n\n if (this.reject) {\n // We are not in a frame, or we don't support POST_MESSAGE\n this.logger.error('Receiver.send.reject', event, value, listener)\n return false\n }\n\n const data: any = {\n context: core.CONTEXT,\n version: core.VERSION,\n event\n }\n\n if (!core.isNone(value)) {\n data.value = value\n }\n\n if (!core.isNone(listener)) {\n data.listener = listener\n }\n\n const msg = JSON.stringify(data)\n window.parent.postMessage(msg, this.origin === '' ? '*' : this.origin)\n\n return true\n }\n\n emit(event: string, value?: any): boolean {\n if (!Object.hasOwn(this.eventListeners, event)) {\n return false\n }\n\n this.logger.debug('Receiver.emit', event, value, this.eventListeners[event])\n\n for (let i = 0; i < this.eventListeners[event].length; i++) {\n const listener = this.eventListeners[event][i]\n this.send(event, value, listener)\n }\n\n return true\n }\n\n ready(): void {\n this.logger.debug('Receiver.ready')\n this.isReady = true\n\n const data = {\n src: window.location.toString(),\n events: this.supported.events,\n methods: this.supported.methods\n }\n\n if (!this.emit('ready', data)) {\n this.send('ready', data)\n }\n }\n}\n\nexport default Receiver\n","import Receiver from '../receiver'\n\ninterface MockVideo {\n duration: number\n currentTime: number\n interval: NodeJS.Timeout | null\n timeupdate: (data: { seconds: number; duration: number }) => void\n volume: number\n mute: boolean\n playing: boolean\n loop: boolean\n playbackRate: number\n play: () => void\n pause: () => void\n}\n\nclass MockAdapter {\n public receiver!: Receiver\n\n constructor() {\n this.init()\n }\n\n init(): void {\n // Our mock video\n const video: MockVideo = {\n duration: 20,\n currentTime: 0,\n interval: null,\n timeupdate: () => {},\n volume: 100,\n mute: false,\n playing: false,\n loop: false,\n playbackRate: 1,\n play: () => {\n video.interval = setInterval(() => {\n video.currentTime += 0.25\n video.timeupdate({\n seconds: video.currentTime,\n duration: video.duration\n })\n }, 250)\n video.playing = true\n },\n pause: () => {\n if (video.interval) {\n clearInterval(video.interval)\n }\n video.playing = false\n }\n }\n\n // Set up the actual receiver\n const receiver = new Receiver()\n this.receiver = receiver\n\n receiver.on('play', function (this: Receiver) {\n video.play()\n this.emit('play')\n video.timeupdate = (data: { seconds: number; duration: number }) => {\n this.emit('timeupdate', data)\n }\n })\n\n receiver.on('pause', function (this: Receiver) {\n video.pause()\n this.emit('pause')\n })\n\n receiver.on('getPaused', (callback: (isPaused: boolean) => void) => {\n const isPaused = !video.playing\n callback(isPaused)\n })\n\n receiver.on('getCurrentTime', (callback: (time: number) => void) => {\n callback(video.currentTime)\n })\n\n receiver.on('setCurrentTime', (value: number) => {\n video.currentTime = value\n })\n\n receiver.on('getDuration', (callback: (duration: number) => void) => {\n callback(video.duration)\n })\n\n receiver.on('getVolume', (callback: (volume: number) => void) => {\n callback(video.volume)\n })\n\n receiver.on('setVolume', (value: number) => {\n video.volume = value\n })\n\n receiver.on('mute', () => {\n video.mute = true\n })\n\n receiver.on('unmute', () => {\n video.mute = false\n })\n\n receiver.on('getMuted', (callback: (muted: boolean) => void) => {\n callback(video.mute)\n })\n\n receiver.on('getLoop', (callback: (loop: boolean) => void) => {\n callback(video.loop)\n })\n\n receiver.on('setLoop', (value: boolean) => {\n video.loop = value\n })\n\n receiver.on('setPlaybackRate', (value: number) => {\n video.playbackRate = value\n })\n\n receiver.on('getPlaybackRate', (callback: (rate: number) => void) => {\n callback(video.playbackRate)\n })\n }\n\n ready(): void {\n this.receiver.ready()\n }\n}\n\nexport default MockAdapter\n","import core from '../core'\nimport Receiver from '../receiver'\n\n// VideoJS player interface - adjust based on actual VideoJS types if available\ninterface VideoJSPlayer {\n on(event: string, callback: () => void): void\n play(): void\n pause(): void\n paused(): boolean\n currentTime(time?: number): number\n duration(): number\n volume(vol?: number): number\n loop(loop?: boolean): boolean\n playbackRate(rate?: number): number\n}\n\nclass VideoJSAdapter {\n public receiver!: Receiver\n\n constructor(player: VideoJSPlayer) {\n this.init(player)\n }\n\n init(player: VideoJSPlayer): void {\n core.assert(player, 'VideoJSReceiver requires a player object')\n\n // Set up the actual receiver\n const receiver = new Receiver()\n this.receiver = receiver\n\n /* EVENTS */\n player.on('pause', () => {\n receiver.emit('pause')\n })\n\n player.on('play', () => {\n receiver.emit('play')\n })\n\n player.on('timeupdate', () => {\n const seconds = player.currentTime()\n const duration = player.duration()\n\n if (!seconds || !duration) {\n return false\n }\n\n const value = {\n seconds,\n duration\n }\n receiver.emit('timeupdate', value)\n })\n\n player.on('ended', () => {\n receiver.emit('ended')\n })\n\n player.on('error', () => {\n receiver.emit('error')\n })\n\n /* METHODS */\n receiver.on('play', () => {\n player.play()\n })\n\n receiver.on('pause', () => {\n player.pause()\n })\n\n receiver.on('getPaused', (callback: (paused: boolean) => void) => {\n callback(player.paused())\n })\n\n receiver.on('getCurrentTime', (callback: (time: number) => void) => {\n callback(player.currentTime())\n })\n\n receiver.on('setCurrentTime', (value: number) => {\n player.currentTime(value)\n })\n\n receiver.on('getDuration', (callback: (duration: number) => void) => {\n callback(player.duration())\n })\n\n receiver.on('getVolume', (callback: (volume: number) => void) => {\n const volume = player.volume() * 100\n callback(volume)\n })\n\n receiver.on('setVolume', (value: number) => {\n player.volume(value / 100)\n })\n\n receiver.on('mute', () => {\n player.volume(0)\n })\n\n receiver.on('unmute', () => {\n player.volume(1)\n })\n\n receiver.on('getMuted', (callback: (muted: boolean) => void) => {\n const isMuted = player.volume() === 0\n callback(isMuted)\n })\n\n receiver.on('getLoop', (callback: (loop: boolean) => void) => {\n callback(player.loop())\n })\n\n receiver.on('setLoop', (value: boolean) => {\n player.loop(value)\n })\n\n receiver.on('setPlaybackRate', (value: number) => {\n player.playbackRate(value)\n })\n\n receiver.on('getPlaybackRate', (callback: (rate: number) => void) => {\n callback(player.playbackRate())\n })\n }\n\n ready(): void {\n this.receiver.ready()\n }\n}\n\nexport default VideoJSAdapter\n","import core from '../core'\nimport Receiver from '../receiver'\n\nclass HTML5Adapter {\n public receiver!: Receiver\n\n constructor(video: HTMLVideoElement) {\n this.init(video)\n }\n\n init(video: HTMLVideoElement): void {\n core.assert(video, 'HTML5Adapter requires a video element')\n\n // Set up the actual receiver\n const receiver = new Receiver()\n this.receiver = receiver\n\n /* EVENTS */\n video.addEventListener('playing', () => {\n receiver.emit('play')\n })\n\n video.addEventListener('pause', () => {\n receiver.emit('pause')\n })\n\n video.addEventListener('ended', () => {\n receiver.emit('ended')\n })\n\n video.addEventListener('timeupdate', () => {\n receiver.emit('timeupdate', {\n seconds: video.currentTime,\n duration: video.duration\n })\n })\n\n video.addEventListener('progress', () => {\n receiver.emit('buffered', {\n percent: video.buffered.length\n })\n })\n\n /* Methods */\n receiver.on('play', () => {\n video.play()\n })\n\n receiver.on('pause', () => {\n video.pause()\n })\n\n receiver.on('getPaused', (callback: (paused: boolean) => void) => {\n callback(video.paused)\n })\n\n receiver.on('getCurrentTime', (callback: (time: number) => void) => {\n callback(video.currentTime)\n })\n\n receiver.on('setCurrentTime', (value: number) => {\n video.currentTime = value\n })\n\n receiver.on('getDuration', (callback: (duration: number) => void) => {\n callback(video.duration)\n })\n\n receiver.on('getVolume', (callback: (volume: number) => void) => {\n const volume = video.volume * 100\n callback(volume)\n })\n\n receiver.on('setVolume', (value: number) => {\n video.volume = value / 100\n })\n\n receiver.on('mute', () => {\n video.muted = true\n })\n\n receiver.on('unmute', () => {\n video.muted = false\n })\n\n receiver.on('getMuted', (callback: (muted: boolean) => void) => {\n callback(video.muted)\n })\n\n receiver.on('getLoop', (callback: (loop: boolean) => void) => {\n callback(video.loop)\n })\n\n receiver.on('setLoop', (value: boolean) => {\n video.loop = value\n })\n\n receiver.on('setPlaybackRate', (value: number) => {\n video.playbackRate = value\n })\n\n receiver.on('getPlaybackRate', (callback: (rate: number) => void) => {\n callback(video.playbackRate)\n })\n }\n\n ready(): void {\n this.receiver.ready()\n }\n}\n\nexport default HTML5Adapter\n","import core from './core'\nimport Player from './player'\nimport Receiver from './receiver'\nimport MockAdapter from './adapters/mock'\nimport VideoJSAdapter from './adapters/video'\nimport HTML5Adapter from './adapters/html'\nimport type { PlayerMethods } from './types'\n\ninterface PlayerJS {\n Player: typeof Player\n Receiver: typeof Receiver\n MockAdapter: typeof MockAdapter\n VideoJSAdapter: typeof VideoJSAdapter\n HTML5Adapter: typeof HTML5Adapter\n CONTEXT: string\n VERSION: string\n METHODS: PlayerMethods\n addEvent: typeof core.addEvent\n}\n\nconst playerjs: PlayerJS = {\n Player,\n Receiver,\n MockAdapter,\n VideoJSAdapter,\n HTML5Adapter,\n CONTEXT: core.CONTEXT,\n VERSION: core.VERSION,\n METHODS: core.METHODS,\n addEvent: core.addEvent\n}\n\n// Attach to the window object explicitly\ndeclare global {\n interface Window {\n playerjs: PlayerJS\n }\n}\n\nif (typeof window !== 'undefined') {\n window.playerjs = playerjs\n}\n\nexport default playerjs\n"],"mappings":"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","names":["core","all","key","obj","elem","type","eventHandle","test","msg","url","core_default","Keeper","event","id","core_default","events","i","cb","ctx","one","d","data","keep","execute","n","e","listeners","keeper_default","Logger","enabled","args","logger_default","Logger","READIED","Player","elem","debug","core_default","element","logger_default","keeper_default","e","data","callback","ctx","id","_err","i","obj","event","listeners","evtOrMethod","names","all","createPrototypeFunction","name","args","resolve","value","methodName","player_default","Receiver","events","methods","debug","logger_default","core_default","e","data","err","listener","index","method","value","func","callback","val","event","msg","i","receiver_default","MockAdapter","video","receiver","receiver_default","data","callback","isPaused","value","mock_default","VideoJSAdapter","player","core_default","receiver","receiver_default","seconds","duration","value","callback","volume","isMuted","video_default","HTML5Adapter","video","core_default","receiver","receiver_default","callback","value","volume","html_default","playerjs","player_default","receiver_default","mock_default","video_default","html_default","core_default","main_default"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "title": "Player.js",
3
3
  "name": "@gumlet/player.js",
4
- "version": "3.0.2",
4
+ "version": "3.0.3",
5
5
  "homepage": "http://github.com/gumlet/player.js",
6
6
  "type": "module",
7
7
  "main": "dist/main.cjs",
@@ -25,7 +25,8 @@
25
25
  "build:release": "tsup",
26
26
  "build:ts": "tsc",
27
27
  "type-check": "tsc --noEmit",
28
- "prepublishOnly": "tsc --noEmit && tsup"
28
+ "prepublishOnly": "tsc --noEmit && tsup",
29
+ "lint": "biome lint"
29
30
  },
30
31
  "files": [
31
32
  "dist/*"
@@ -36,6 +37,7 @@
36
37
  "browserslist": "defaults",
37
38
  "license": "MIT",
38
39
  "devDependencies": {
40
+ "@biomejs/biome": "^2.2.4",
39
41
  "@types/node": "^24.3.0",
40
42
  "tsup": "^8.5.0",
41
43
  "typescript": "^5.0.0"