p2p-media-loader-shaka
Advanced tools
Comparing version 0.3.0 to 0.4.0
@@ -68,2 +68,7 @@ require=(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){ | ||
} | ||
getDetails() { | ||
return { | ||
loader: this.loader.getDetails() | ||
}; | ||
} | ||
initShakaPlayer(player) { | ||
@@ -92,2 +97,10 @@ integration.initShakaPlayer(player, this.segmentManager); | ||
*/ | ||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||
return new (P || (P = Promise))(function (resolve, reject) { | ||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | ||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | ||
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } | ||
step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||
}); | ||
}; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
@@ -155,14 +168,8 @@ const Debug = require("debug"); | ||
} | ||
let rejectCallback = null; | ||
debug("request", "load", segment.identity); | ||
const promise = new Promise((resolve, reject) => { | ||
rejectCallback = reject; | ||
segmentManager | ||
.load(segment, utils_1.getSchemedUri(player.getManifestUri()), getPlayheadTime(player)) | ||
.then((data) => resolve({ data })); | ||
const promise = segmentManager.load(segment, utils_1.getSchemedUri(player.getManifestUri()), getPlayheadTime(player)); | ||
const abort = () => __awaiter(this, void 0, void 0, function* () { | ||
debug("request", "abort", segment.identity); | ||
// TODO: implement abort in SegmentManager | ||
}); | ||
const abort = () => { | ||
debug("request", "abort", segment.identity); | ||
return rejectCallback(new shaka.util.Error(shaka.util.Error.Severity.RECOVERABLE, shaka.util.Error.Category.NETWORK, shaka.util.Error.Code.OPERATION_ABORTED)); | ||
}; | ||
return new shaka.util.AbortableOperation(promise, abort); | ||
@@ -514,13 +521,8 @@ } | ||
reportSuccess(request, loaderSegment) { | ||
if (request.resolve) { | ||
let timeDelation = 0; | ||
if (loaderSegment.downloadSpeed > 0 && loaderSegment.data && loaderSegment.data.byteLength > 0) { | ||
const downloadTime = Math.trunc(loaderSegment.data.byteLength / loaderSegment.downloadSpeed); | ||
timeDelation = Date.now() - request.timeCreated + downloadTime; | ||
} | ||
setTimeout(() => { | ||
this.debug("report success", request.id); | ||
request.resolve(loaderSegment.data); | ||
}, timeDelation); | ||
let timeMs = undefined; | ||
if (loaderSegment.downloadSpeed > 0 && loaderSegment.data && loaderSegment.data.byteLength > 0) { | ||
timeMs = Math.trunc(loaderSegment.data.byteLength / loaderSegment.downloadSpeed); | ||
} | ||
this.debug("report success", request.id); | ||
request.resolve({ data: loaderSegment.data, timeMs }); | ||
} | ||
@@ -540,3 +542,2 @@ reportError(request, error) { | ||
this.reject = reject; | ||
this.timeCreated = Date.now(); | ||
} | ||
@@ -589,4 +590,4 @@ } | ||
exports.Engine = engine_1.Engine; | ||
exports.version = typeof (__P2PML_VERSION__) === "undefined" ? "0.3.0" : __P2PML_VERSION__; | ||
exports.version = typeof (__P2PML_VERSION__) === "undefined" ? "0.4.0" : __P2PML_VERSION__; | ||
},{"./engine":2}]},{},[1]); |
@@ -1,1 +0,1 @@ | ||
require=function(){return function e(t,s,r){function i(a,o){if(!s[a]){if(!t[a]){var h="function"==typeof require&&require;if(!o&&h)return h(a,!0);if(n)return n(a,!0);var d=new Error("Cannot find module '"+a+"'");throw d.code="MODULE_NOT_FOUND",d}var g=s[a]={exports:{}};t[a][0].call(g.exports,function(e){return i(t[a][1][e]||e)},g,g.exports,e,t,s,r)}return s[a].exports}for(var n="function"==typeof require&&require,a=0;a<r.length;a++)i(r[a]);return i}}()({1:[function(e,t,s){window.p2pml||(window.p2pml={}),window.p2pml.shaka=e("p2p-media-loader-shaka")},{"p2p-media-loader-shaka":"p2p-media-loader-shaka"}],2:[function(e,t,s){"use strict";Object.defineProperty(s,"__esModule",{value:!0});const r=e("events"),i=e("p2p-media-loader-core"),n=e("./segment-manager"),a=e("./integration");s.Engine=class extends r.EventEmitter{static isSupported(){return i.HybridLoader.isSupported()}constructor(e={}){super(),this.loader=new i.HybridLoader(e.loader),this.segmentManager=new n.SegmentManager(this.loader,e.segments),Object.keys(i.Events).map(e=>i.Events[e]).forEach(e=>this.loader.on(e,(...t)=>this.emit(e,...t)))}destroy(){this.loader.destroy(),this.segmentManager.destroy()}getSettings(){return{segments:this.segmentManager.getSettings(),loader:this.loader.getSettings()}}initShakaPlayer(e){a.initShakaPlayer(e,this.segmentManager)}}},{"./integration":3,"./segment-manager":6,events:"events","p2p-media-loader-core":"p2p-media-loader-core"}],3:[function(e,t,s){"use strict";Object.defineProperty(s,"__esModule",{value:!0});const r=e("debug"),i=e("./manifest-parser-proxy"),n=e("./utils"),a=r("p2pml:shaka:index");function o(e,t,s){if(!t.p2pml||s!==shaka.net.NetworkingEngine.RequestType.SEGMENT)return shaka.net.HttpXHRPlugin(e,t,s);const{player:r,segmentManager:i}=t.p2pml,o=r.getManifest();if(!o||!o.p2pml)return shaka.net.HttpXHRPlugin(e,t,s);const d=o.p2pml.parser.find(e,t.headers.Range);if(!d||"video"!==d.streamType)return shaka.net.HttpXHRPlugin(e,t,s);let g=null;a("request","load",d.identity);const u=new Promise((e,t)=>{g=t,i.load(d,n.getSchemedUri(r.getManifestUri()),h(r)).then(t=>e({data:t}))});return new shaka.util.AbortableOperation(u,()=>(a("request","abort",d.identity),g(new shaka.util.Error(shaka.util.Error.Severity.RECOVERABLE,shaka.util.Error.Category.NETWORK,shaka.util.Error.Code.OPERATION_ABORTED))))}function h(e){let t=0;const s=e.getPlayheadTimeAsDate();return s&&(t=s.valueOf(),e.isLive()&&(t-=e.getPresentationStartTimeAsDate().valueOf()),t/=1e3),t}s.initShakaPlayer=function(e,t){a("register parser proxies"),shaka.media.ManifestParser.registerParserByExtension("mpd",i.ShakaDashManifestParserProxy),shaka.media.ManifestParser.registerParserByMime("application/dash+xml",i.ShakaDashManifestParserProxy),shaka.media.ManifestParser.registerParserByExtension("m3u8",i.ShakaHlsManifestParserProxy),shaka.media.ManifestParser.registerParserByMime("application/x-mpegurl",i.ShakaHlsManifestParserProxy),shaka.media.ManifestParser.registerParserByMime("application/vnd.apple.mpegurl",i.ShakaHlsManifestParserProxy),a("init networking engine"),shaka.net.NetworkingEngine.registerScheme("http",o),shaka.net.NetworkingEngine.registerScheme("https",o);let s=0,r=0;e.addEventListener("loading",()=>{s>0&&(clearInterval(s),s=0),r=0;const i=e.getManifest();i&&i.p2pml&&i.p2pml.parser.reset(),t.destroy(),s=setInterval(()=>{const s=h(e);(s!==r||e.isBuffering())&&(t.setPlayheadTime(s),r=s)},500)}),a("register request filter"),e.getNetworkingEngine().registerRequestFilter((s,r)=>{r.p2pml={player:e,segmentManager:t}})}},{"./manifest-parser-proxy":4,"./utils":7,debug:"debug"}],4:[function(e,t,s){"use strict";Object.defineProperty(s,"__esModule",{value:!0});const r=e("./parser-segment");class i{constructor(e){this.cache=new r.ParserSegmentCache(200),this.originalManifestParser=e}isHls(){return this.originalManifestParser instanceof shaka.hls.HlsParser}isDash(){return this.originalManifestParser instanceof shaka.dash.DashParser}start(e,t){return this.originalManifestParser.start(e,t).then(e=>{this.manifest=e;for(const t of e.periods){const e=[];for(const s of t.variants)null!=s.video&&-1==e.indexOf(s.video)&&(this.hookGetSegmentReference(s.video),e.push(s.video)),null!=s.audio&&-1==e.indexOf(s.audio)&&(this.hookGetSegmentReference(s.audio),e.push(s.audio))}return e.p2pml={parser:this},e})}configure(e){return this.originalManifestParser.configure(e)}stop(){return this.originalManifestParser.stop()}update(){return this.originalManifestParser.update()}onExpirationUpdated(){return this.originalManifestParser.onExpirationUpdated()}find(e,t){return this.cache.find(e,t)}reset(){this.cache.clear()}hookGetSegmentReference(e){e.getSegmentReferenceOriginal=e.getSegmentReference,e.getSegmentReference=(t=>(this.cache.add(e,t),e.getSegmentReferenceOriginal(t))),e.getPosition=(()=>this.isHls()&&"video"===e.type?this.manifest.periods[0].variants.reduce((e,t)=>(t.video&&t.video.id&&!e.includes(t.video.id)&&e.push(t.video.id),e),[]).indexOf(e.id):-1)}}s.ShakaManifestParserProxy=i;s.ShakaDashManifestParserProxy=class extends i{constructor(){super(new shaka.dash.DashParser)}};s.ShakaHlsManifestParserProxy=class extends i{constructor(){super(new shaka.hls.HlsParser)}}},{"./parser-segment":5}],5:[function(e,t,s){"use strict";Object.defineProperty(s,"__esModule",{value:!0});const r=e("./utils");class i{constructor(e,t,s,r,i,n,a,o,h,d,g,u){this.streamId=e,this.streamType=t,this.streamPosition=s,this.streamIdentity=r,this.identity=i,this.position=n,this.start=a,this.end=o,this.uri=h,this.range=d,this.prev=g,this.next=u}static create(e,t){const s=e.getSegmentReferenceOriginal(t);if(!s)return;const n=s.createUris();if(!n||0===n.length)return;const a=s.getStartTime(),o=s.getEndTime(),h=s.getStartByte(),d=s.getEndByte(),g=h||d?`bytes=${h||""}-${d||""}`:void 0,u=e.type.substring(0,1).toUpperCase(),l=e.getPosition(),c=l>=0,m=c?`${u}${l}`:`${u}${e.id}`,p=c?`${m}+${t}`:`${m}+${Number(a).toFixed(3)}`;return new i(e.id,e.type,l,m,p,t,a,o,r.getSchemedUri(n[0]),g,()=>i.create(e,t-1),()=>i.create(e,t+1))}}s.ParserSegment=i;s.ParserSegmentCache=class{constructor(e){this.segments=[],this.maxSegments=e}find(e,t){return this.segments.find(s=>s.uri===e&&s.range===t)}add(e,t){const s=i.create(e,t);s&&!this.find(s.uri,s.range)&&(this.segments.push(s),this.segments.length>this.maxSegments&&this.segments.splice(0,.2*this.maxSegments))}clear(){this.segments.splice(0)}}},{"./utils":7}],6:[function(e,t,s){"use strict";var r=this&&this.__awaiter||function(e,t,s,r){return new(s||(s=Promise))(function(i,n){function a(e){try{h(r.next(e))}catch(e){n(e)}}function o(e){try{h(r.throw(e))}catch(e){n(e)}}function h(e){e.done?i(e.value):new s(function(t){t(e.value)}).then(a,o)}h((r=r.apply(e,t||[])).next())})};Object.defineProperty(s,"__esModule",{value:!0});const i=e("debug"),n=e("p2p-media-loader-core"),a={forwardSegmentCount:20,maxHistorySegments:50,swarmId:void 0};s.SegmentManager=class{constructor(e,t={}){this.debug=i("p2pml:shaka:sm"),this.requests=new Map,this.manifestUri="",this.playheadTime=0,this.segmentHistory=[],this.onSegmentLoaded=(e=>{this.requests.has(e.id)&&(this.reportSuccess(this.requests.get(e.id),e),this.debug("request delete",e.id),this.requests.delete(e.id))}),this.onSegmentError=((e,t)=>{this.requests.has(e.id)&&(this.reportError(this.requests.get(e.id),t),this.debug("request delete from error",e.id),this.requests.delete(e.id))}),this.onSegmentAbort=(e=>{this.requests.has(e.id)&&(this.reportError(this.requests.get(e.id),"Internal abort"),this.debug("request delete from abort",e.id),this.requests.delete(e.id))}),this.settings=Object.assign(a,t),this.loader=e,this.loader.on(n.Events.SegmentLoaded,this.onSegmentLoaded),this.loader.on(n.Events.SegmentError,this.onSegmentError),this.loader.on(n.Events.SegmentAbort,this.onSegmentAbort)}destroy(){0!==this.requests.size&&(console.error("Destroying segment manager with active request(s)!"),this.requests.clear()),this.playheadTime=0,this.segmentHistory.splice(0),this.loader.destroy()}getSettings(){return this.settings}load(e,t,s){return r(this,void 0,void 0,function*(){this.manifestUri=t,this.playheadTime=s,this.pushSegmentHistory(e);const r=this.refreshLoad(),i=this.loader.getSegment(r.id);return new Promise((e,t)=>{const s=new o(r.id,e,t);i?this.reportSuccess(s,i):(this.debug("request add",s.id),this.requests.set(s.id,s))})})}setPlayheadTime(e){this.playheadTime=e,this.segmentHistory.length>0&&this.refreshLoad()}refreshLoad(){const e=this.segmentHistory[this.segmentHistory.length-1],t=this.playheadTime>.1?this.playheadTime:e.start,s=this.segmentHistory.reduce((e,s)=>(s.start>=t&&e.push(s),e),[]);0===s.length&&s.push(e);const r=s.length-1;do{const e=s[s.length-1].next();if(!e)break;s.push(e)}while(s.length<this.settings.forwardSegmentCount);const i=this.settings.swarmId&&0!==this.settings.swarmId.length?this.settings.swarmId:this.manifestUri.split("?")[0],a=s.map((e,t)=>new n.Segment(`${i}+${e.identity}`,e.uri,e.range,t));return this.loader.load(a,`${i}+${e.streamIdentity}`),a[r]}pushSegmentHistory(e){this.segmentHistory.length>=this.settings.maxHistorySegments&&(this.debug("segment history auto shrink"),this.segmentHistory.splice(0,.2*this.settings.maxHistorySegments)),this.segmentHistory.length>0&&this.segmentHistory[this.segmentHistory.length-1].start>e.start&&(this.debug("segment history reset due to playhead seek back"),this.segmentHistory.splice(0)),this.segmentHistory.push(e)}reportSuccess(e,t){if(e.resolve){let s=0;if(t.downloadSpeed>0&&t.data&&t.data.byteLength>0){const r=Math.trunc(t.data.byteLength/t.downloadSpeed);s=Date.now()-e.timeCreated+r}setTimeout(()=>{this.debug("report success",e.id),e.resolve(t.data)},s)}}reportError(e,t){e.reject&&(this.debug("report error",e.id),e.reject(t))}};class o{constructor(e,t,s){this.id=e,this.resolve=t,this.reject=s,this.timeCreated=Date.now()}}},{debug:"debug","p2p-media-loader-core":"p2p-media-loader-core"}],7:[function(e,t,s){"use strict";Object.defineProperty(s,"__esModule",{value:!0}),s.getSchemedUri=function(e){return e.startsWith("//")?window.location.protocol+e:e}},{}],"p2p-media-loader-shaka":[function(e,t,s){"use strict";Object.defineProperty(s,"__esModule",{value:!0});var r=e("./engine");s.Engine=r.Engine,s.version="undefined"==typeof __P2PML_VERSION__?"0.3.0":__P2PML_VERSION__},{"./engine":2}]},{},[1]); | ||
require=function(){return function e(t,s,r){function i(a,o){if(!s[a]){if(!t[a]){var h="function"==typeof require&&require;if(!o&&h)return h(a,!0);if(n)return n(a,!0);var d=new Error("Cannot find module '"+a+"'");throw d.code="MODULE_NOT_FOUND",d}var g=s[a]={exports:{}};t[a][0].call(g.exports,function(e){return i(t[a][1][e]||e)},g,g.exports,e,t,s,r)}return s[a].exports}for(var n="function"==typeof require&&require,a=0;a<r.length;a++)i(r[a]);return i}}()({1:[function(e,t,s){window.p2pml||(window.p2pml={}),window.p2pml.shaka=e("p2p-media-loader-shaka")},{"p2p-media-loader-shaka":"p2p-media-loader-shaka"}],2:[function(e,t,s){"use strict";Object.defineProperty(s,"__esModule",{value:!0});const r=e("events"),i=e("p2p-media-loader-core"),n=e("./segment-manager"),a=e("./integration");s.Engine=class extends r.EventEmitter{static isSupported(){return i.HybridLoader.isSupported()}constructor(e={}){super(),this.loader=new i.HybridLoader(e.loader),this.segmentManager=new n.SegmentManager(this.loader,e.segments),Object.keys(i.Events).map(e=>i.Events[e]).forEach(e=>this.loader.on(e,(...t)=>this.emit(e,...t)))}destroy(){this.loader.destroy(),this.segmentManager.destroy()}getSettings(){return{segments:this.segmentManager.getSettings(),loader:this.loader.getSettings()}}getDetails(){return{loader:this.loader.getDetails()}}initShakaPlayer(e){a.initShakaPlayer(e,this.segmentManager)}}},{"./integration":3,"./segment-manager":6,events:"events","p2p-media-loader-core":"p2p-media-loader-core"}],3:[function(e,t,s){"use strict";var r=this&&this.__awaiter||function(e,t,s,r){return new(s||(s=Promise))(function(i,n){function a(e){try{h(r.next(e))}catch(e){n(e)}}function o(e){try{h(r.throw(e))}catch(e){n(e)}}function h(e){e.done?i(e.value):new s(function(t){t(e.value)}).then(a,o)}h((r=r.apply(e,t||[])).next())})};Object.defineProperty(s,"__esModule",{value:!0});const i=e("debug"),n=e("./manifest-parser-proxy"),a=e("./utils"),o=i("p2pml:shaka:index");function h(e,t,s){if(!t.p2pml||s!==shaka.net.NetworkingEngine.RequestType.SEGMENT)return shaka.net.HttpXHRPlugin(e,t,s);const{player:i,segmentManager:n}=t.p2pml,h=i.getManifest();if(!h||!h.p2pml)return shaka.net.HttpXHRPlugin(e,t,s);const g=h.p2pml.parser.find(e,t.headers.Range);if(!g||"video"!==g.streamType)return shaka.net.HttpXHRPlugin(e,t,s);o("request","load",g.identity);const u=n.load(g,a.getSchemedUri(i.getManifestUri()),d(i));return new shaka.util.AbortableOperation(u,()=>r(this,void 0,void 0,function*(){o("request","abort",g.identity)}))}function d(e){let t=0;const s=e.getPlayheadTimeAsDate();return s&&(t=s.valueOf(),e.isLive()&&(t-=e.getPresentationStartTimeAsDate().valueOf()),t/=1e3),t}s.initShakaPlayer=function(e,t){o("register parser proxies"),shaka.media.ManifestParser.registerParserByExtension("mpd",n.ShakaDashManifestParserProxy),shaka.media.ManifestParser.registerParserByMime("application/dash+xml",n.ShakaDashManifestParserProxy),shaka.media.ManifestParser.registerParserByExtension("m3u8",n.ShakaHlsManifestParserProxy),shaka.media.ManifestParser.registerParserByMime("application/x-mpegurl",n.ShakaHlsManifestParserProxy),shaka.media.ManifestParser.registerParserByMime("application/vnd.apple.mpegurl",n.ShakaHlsManifestParserProxy),o("init networking engine"),shaka.net.NetworkingEngine.registerScheme("http",h),shaka.net.NetworkingEngine.registerScheme("https",h);let s=0,r=0;e.addEventListener("loading",()=>{s>0&&(clearInterval(s),s=0),r=0;const i=e.getManifest();i&&i.p2pml&&i.p2pml.parser.reset(),t.destroy(),s=setInterval(()=>{const s=d(e);(s!==r||e.isBuffering())&&(t.setPlayheadTime(s),r=s)},500)}),o("register request filter"),e.getNetworkingEngine().registerRequestFilter((s,r)=>{r.p2pml={player:e,segmentManager:t}})}},{"./manifest-parser-proxy":4,"./utils":7,debug:"debug"}],4:[function(e,t,s){"use strict";Object.defineProperty(s,"__esModule",{value:!0});const r=e("./parser-segment");class i{constructor(e){this.cache=new r.ParserSegmentCache(200),this.originalManifestParser=e}isHls(){return this.originalManifestParser instanceof shaka.hls.HlsParser}isDash(){return this.originalManifestParser instanceof shaka.dash.DashParser}start(e,t){return this.originalManifestParser.start(e,t).then(e=>{this.manifest=e;for(const t of e.periods){const e=[];for(const s of t.variants)null!=s.video&&-1==e.indexOf(s.video)&&(this.hookGetSegmentReference(s.video),e.push(s.video)),null!=s.audio&&-1==e.indexOf(s.audio)&&(this.hookGetSegmentReference(s.audio),e.push(s.audio))}return e.p2pml={parser:this},e})}configure(e){return this.originalManifestParser.configure(e)}stop(){return this.originalManifestParser.stop()}update(){return this.originalManifestParser.update()}onExpirationUpdated(){return this.originalManifestParser.onExpirationUpdated()}find(e,t){return this.cache.find(e,t)}reset(){this.cache.clear()}hookGetSegmentReference(e){e.getSegmentReferenceOriginal=e.getSegmentReference,e.getSegmentReference=(t=>(this.cache.add(e,t),e.getSegmentReferenceOriginal(t))),e.getPosition=(()=>this.isHls()&&"video"===e.type?this.manifest.periods[0].variants.reduce((e,t)=>(t.video&&t.video.id&&!e.includes(t.video.id)&&e.push(t.video.id),e),[]).indexOf(e.id):-1)}}s.ShakaManifestParserProxy=i;s.ShakaDashManifestParserProxy=class extends i{constructor(){super(new shaka.dash.DashParser)}};s.ShakaHlsManifestParserProxy=class extends i{constructor(){super(new shaka.hls.HlsParser)}}},{"./parser-segment":5}],5:[function(e,t,s){"use strict";Object.defineProperty(s,"__esModule",{value:!0});const r=e("./utils");class i{constructor(e,t,s,r,i,n,a,o,h,d,g,u){this.streamId=e,this.streamType=t,this.streamPosition=s,this.streamIdentity=r,this.identity=i,this.position=n,this.start=a,this.end=o,this.uri=h,this.range=d,this.prev=g,this.next=u}static create(e,t){const s=e.getSegmentReferenceOriginal(t);if(!s)return;const n=s.createUris();if(!n||0===n.length)return;const a=s.getStartTime(),o=s.getEndTime(),h=s.getStartByte(),d=s.getEndByte(),g=h||d?`bytes=${h||""}-${d||""}`:void 0,u=e.type.substring(0,1).toUpperCase(),l=e.getPosition(),c=l>=0,m=c?`${u}${l}`:`${u}${e.id}`,p=c?`${m}+${t}`:`${m}+${Number(a).toFixed(3)}`;return new i(e.id,e.type,l,m,p,t,a,o,r.getSchemedUri(n[0]),g,()=>i.create(e,t-1),()=>i.create(e,t+1))}}s.ParserSegment=i;s.ParserSegmentCache=class{constructor(e){this.segments=[],this.maxSegments=e}find(e,t){return this.segments.find(s=>s.uri===e&&s.range===t)}add(e,t){const s=i.create(e,t);s&&!this.find(s.uri,s.range)&&(this.segments.push(s),this.segments.length>this.maxSegments&&this.segments.splice(0,.2*this.maxSegments))}clear(){this.segments.splice(0)}}},{"./utils":7}],6:[function(e,t,s){"use strict";var r=this&&this.__awaiter||function(e,t,s,r){return new(s||(s=Promise))(function(i,n){function a(e){try{h(r.next(e))}catch(e){n(e)}}function o(e){try{h(r.throw(e))}catch(e){n(e)}}function h(e){e.done?i(e.value):new s(function(t){t(e.value)}).then(a,o)}h((r=r.apply(e,t||[])).next())})};Object.defineProperty(s,"__esModule",{value:!0});const i=e("debug"),n=e("p2p-media-loader-core"),a={forwardSegmentCount:20,maxHistorySegments:50,swarmId:void 0};s.SegmentManager=class{constructor(e,t={}){this.debug=i("p2pml:shaka:sm"),this.requests=new Map,this.manifestUri="",this.playheadTime=0,this.segmentHistory=[],this.onSegmentLoaded=(e=>{this.requests.has(e.id)&&(this.reportSuccess(this.requests.get(e.id),e),this.debug("request delete",e.id),this.requests.delete(e.id))}),this.onSegmentError=((e,t)=>{this.requests.has(e.id)&&(this.reportError(this.requests.get(e.id),t),this.debug("request delete from error",e.id),this.requests.delete(e.id))}),this.onSegmentAbort=(e=>{this.requests.has(e.id)&&(this.reportError(this.requests.get(e.id),"Internal abort"),this.debug("request delete from abort",e.id),this.requests.delete(e.id))}),this.settings=Object.assign(a,t),this.loader=e,this.loader.on(n.Events.SegmentLoaded,this.onSegmentLoaded),this.loader.on(n.Events.SegmentError,this.onSegmentError),this.loader.on(n.Events.SegmentAbort,this.onSegmentAbort)}destroy(){0!==this.requests.size&&(console.error("Destroying segment manager with active request(s)!"),this.requests.clear()),this.playheadTime=0,this.segmentHistory.splice(0),this.loader.destroy()}getSettings(){return this.settings}load(e,t,s){return r(this,void 0,void 0,function*(){this.manifestUri=t,this.playheadTime=s,this.pushSegmentHistory(e);const r=this.refreshLoad(),i=this.loader.getSegment(r.id);return new Promise((e,t)=>{const s=new o(r.id,e,t);i?this.reportSuccess(s,i):(this.debug("request add",s.id),this.requests.set(s.id,s))})})}setPlayheadTime(e){this.playheadTime=e,this.segmentHistory.length>0&&this.refreshLoad()}refreshLoad(){const e=this.segmentHistory[this.segmentHistory.length-1],t=this.playheadTime>.1?this.playheadTime:e.start,s=this.segmentHistory.reduce((e,s)=>(s.start>=t&&e.push(s),e),[]);0===s.length&&s.push(e);const r=s.length-1;do{const e=s[s.length-1].next();if(!e)break;s.push(e)}while(s.length<this.settings.forwardSegmentCount);const i=this.settings.swarmId&&0!==this.settings.swarmId.length?this.settings.swarmId:this.manifestUri.split("?")[0],a=s.map((e,t)=>new n.Segment(`${i}+${e.identity}`,e.uri,e.range,t));return this.loader.load(a,`${i}+${e.streamIdentity}`),a[r]}pushSegmentHistory(e){this.segmentHistory.length>=this.settings.maxHistorySegments&&(this.debug("segment history auto shrink"),this.segmentHistory.splice(0,.2*this.settings.maxHistorySegments)),this.segmentHistory.length>0&&this.segmentHistory[this.segmentHistory.length-1].start>e.start&&(this.debug("segment history reset due to playhead seek back"),this.segmentHistory.splice(0)),this.segmentHistory.push(e)}reportSuccess(e,t){let s=void 0;t.downloadSpeed>0&&t.data&&t.data.byteLength>0&&(s=Math.trunc(t.data.byteLength/t.downloadSpeed)),this.debug("report success",e.id),e.resolve({data:t.data,timeMs:s})}reportError(e,t){e.reject&&(this.debug("report error",e.id),e.reject(t))}};class o{constructor(e,t,s){this.id=e,this.resolve=t,this.reject=s}}},{debug:"debug","p2p-media-loader-core":"p2p-media-loader-core"}],7:[function(e,t,s){"use strict";Object.defineProperty(s,"__esModule",{value:!0}),s.getSchemedUri=function(e){return e.startsWith("//")?window.location.protocol+e:e}},{}],"p2p-media-loader-shaka":[function(e,t,s){"use strict";Object.defineProperty(s,"__esModule",{value:!0});var r=e("./engine");s.Engine=r.Engine,s.version="undefined"==typeof __P2PML_VERSION__?"0.4.0":__P2PML_VERSION__},{"./engine":2}]},{},[1]); |
@@ -24,3 +24,4 @@ /** | ||
getSettings(): any; | ||
getDetails(): any; | ||
initShakaPlayer(player: any): void; | ||
} |
@@ -44,2 +44,7 @@ "use strict"; | ||
} | ||
getDetails() { | ||
return { | ||
loader: this.loader.getDetails() | ||
}; | ||
} | ||
initShakaPlayer(player) { | ||
@@ -46,0 +51,0 @@ integration.initShakaPlayer(player, this.segmentManager); |
@@ -17,2 +17,10 @@ "use strict"; | ||
*/ | ||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||
return new (P || (P = Promise))(function (resolve, reject) { | ||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | ||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | ||
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } | ||
step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||
}); | ||
}; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
@@ -80,14 +88,8 @@ const Debug = require("debug"); | ||
} | ||
let rejectCallback = null; | ||
debug("request", "load", segment.identity); | ||
const promise = new Promise((resolve, reject) => { | ||
rejectCallback = reject; | ||
segmentManager | ||
.load(segment, utils_1.getSchemedUri(player.getManifestUri()), getPlayheadTime(player)) | ||
.then((data) => resolve({ data })); | ||
const promise = segmentManager.load(segment, utils_1.getSchemedUri(player.getManifestUri()), getPlayheadTime(player)); | ||
const abort = () => __awaiter(this, void 0, void 0, function* () { | ||
debug("request", "abort", segment.identity); | ||
// TODO: implement abort in SegmentManager | ||
}); | ||
const abort = () => { | ||
debug("request", "abort", segment.identity); | ||
return rejectCallback(new shaka.util.Error(shaka.util.Error.Severity.RECOVERABLE, shaka.util.Error.Category.NETWORK, shaka.util.Error.Code.OPERATION_ABORTED)); | ||
}; | ||
return new shaka.util.AbortableOperation(promise, abort); | ||
@@ -94,0 +96,0 @@ } |
@@ -29,3 +29,6 @@ /** | ||
getSettings(): Settings; | ||
load(parserSegment: ParserSegment, manifestUri: string, playheadTime: number): Promise<any>; | ||
load(parserSegment: ParserSegment, manifestUri: string, playheadTime: number): Promise<{ | ||
data: ArrayBuffer; | ||
timeMs: number | undefined; | ||
}>; | ||
setPlayheadTime(time: number): void; | ||
@@ -32,0 +35,0 @@ private refreshLoad; |
@@ -146,13 +146,8 @@ "use strict"; | ||
reportSuccess(request, loaderSegment) { | ||
if (request.resolve) { | ||
let timeDelation = 0; | ||
if (loaderSegment.downloadSpeed > 0 && loaderSegment.data && loaderSegment.data.byteLength > 0) { | ||
const downloadTime = Math.trunc(loaderSegment.data.byteLength / loaderSegment.downloadSpeed); | ||
timeDelation = Date.now() - request.timeCreated + downloadTime; | ||
} | ||
setTimeout(() => { | ||
this.debug("report success", request.id); | ||
request.resolve(loaderSegment.data); | ||
}, timeDelation); | ||
let timeMs = undefined; | ||
if (loaderSegment.downloadSpeed > 0 && loaderSegment.data && loaderSegment.data.byteLength > 0) { | ||
timeMs = Math.trunc(loaderSegment.data.byteLength / loaderSegment.downloadSpeed); | ||
} | ||
this.debug("report success", request.id); | ||
request.resolve({ data: loaderSegment.data, timeMs }); | ||
} | ||
@@ -172,4 +167,3 @@ reportError(request, error) { | ||
this.reject = reject; | ||
this.timeCreated = Date.now(); | ||
} | ||
} |
{ | ||
"name": "p2p-media-loader-shaka", | ||
"description": "P2P Media Loader Shaka Player integration", | ||
"version": "0.3.0", | ||
"version": "0.4.0", | ||
"license": "Apache-2.0", | ||
@@ -38,9 +38,9 @@ "author": "Novage", | ||
"dependencies": { | ||
"debug": "^4.1.0", | ||
"debug": "^4.1.1", | ||
"events": "^3.0.0", | ||
"p2p-media-loader-core": "^0.3.0" | ||
"p2p-media-loader-core": "^0.4.0" | ||
}, | ||
"devDependencies": { | ||
"@types/debug": "^0.0.31", | ||
"@types/events": "^1.2.0", | ||
"@types/events": "^3.0.0", | ||
"browserify": "^16.2.3", | ||
@@ -50,8 +50,8 @@ "browserify-versionify": "^1.0.6", | ||
"mkdirp": "^0.5.1", | ||
"terser": "^3.11.0", | ||
"ts-loader": "^5.3.1", | ||
"tslint": "^5.11.0", | ||
"typescript": "^3.2.1", | ||
"webpack": "^4.26.1", | ||
"webpack-cli": "^3.1.2" | ||
"terser": "^3.14.1", | ||
"ts-loader": "^5.3.3", | ||
"tslint": "^5.12.1", | ||
"typescript": "^3.2.4", | ||
"webpack": "^4.29.0", | ||
"webpack-cli": "^3.2.1" | ||
}, | ||
@@ -58,0 +58,0 @@ "browserify": { |
@@ -13,3 +13,3 @@ # P2P Media Loader - Shaka Player integration | ||
- [Core](https://cdn.jsdelivr.net/npm/p2p-media-loader-core@latest/build/) | ||
- [Shaka integration](https://cdn.jsdelivr.net/npm/p2p-media-loader-shaka@latest/build/) | ||
- [Shaka Player integration](https://cdn.jsdelivr.net/npm/p2p-media-loader-shaka@latest/build/) | ||
- [Hls.js integration](https://cdn.jsdelivr.net/npm/p2p-media-loader-hlsjs@latest/build/) | ||
@@ -88,2 +88,9 @@ | ||
### `engine.on(event, handler)` | ||
Registers an event handler. | ||
- `event` - Event you want to handle; available events you can find [here](../p2p-media-loader-core/README.md#events). | ||
- `handler` - Function to handle the event | ||
### `engine.getSettings()` | ||
@@ -93,2 +100,6 @@ | ||
### `engine.getDetails()` | ||
Returns engine instance details. | ||
### `engine.destroy()` | ||
@@ -95,0 +106,0 @@ |
84626
1418
125
+ Addedp2p-media-loader-core@0.4.0(transitive)
- Removedp2p-media-loader-core@0.3.0(transitive)
Updateddebug@^4.1.1
Updatedp2p-media-loader-core@^0.4.0