From cdf4393091d93e326c20f30caf310aeda68dd74c Mon Sep 17 00:00:00 2001 From: Dmytro Demchenko Date: Wed, 14 Aug 2024 04:13:27 -0700 Subject: [PATCH] Add files via upload --- docs/v1.0/assets/icons.js | 31 ++-- docs/v1.0/assets/icons.svg | 2 +- docs/v1.0/assets/main.js | 9 +- docs/v1.0/assets/search.js | 2 +- docs/v1.0/assets/style.css | 98 +++++++++---- .../classes/p2p_media_loader_core.Core.html | 69 ++++----- ...2p_media_loader_core.CoreRequestError.html | 14 +- .../p2p_media_loader_core.RequestError.html | 16 +-- ...p2p_media_loader_hlsjs.HlsJsP2PEngine.html | 60 ++++---- ...p2p_media_loader_shaka.ShakaP2PEngine.html | 53 +++---- docs/v1.0/index.html | 132 +++++++++++------- docs/v1.0/modules/p2p_media_loader_core.html | 6 +- docs/v1.0/modules/p2p_media_loader_hlsjs.html | 6 +- docs/v1.0/modules/p2p_media_loader_shaka.html | 6 +- .../p2p_media_loader_core.ByteRange.html | 8 +- ...2p_media_loader_core.CommonCoreConfig.html | 20 +-- .../p2p_media_loader_core.CoreConfig.html | 22 +-- .../p2p_media_loader_core.CoreEventMap.html | 33 ++--- ...p_media_loader_core.DefinedCoreConfig.html | 8 +- .../p2p_media_loader_core.DownloadSource.html | 8 +- ...p_media_loader_core.DynamicCoreConfig.html | 17 +-- ...a_loader_core.DynamicStreamProperties.html | 8 +- ...p2p_media_loader_core.EngineCallbacks.html | 12 +- ...edia_loader_core.HttpRequestErrorType.html | 8 +- .../p2p_media_loader_core.PeerDetails.html | 8 +- ...2p_media_loader_core.PeerErrorDetails.html | 8 +- ...edia_loader_core.PeerRequestErrorType.html | 8 +- ...dia_loader_core.RequestAbortErrorType.html | 8 +- ...2p_media_loader_core.RequestErrorType.html | 8 +- .../types/p2p_media_loader_core.Segment.html | 20 +-- ...media_loader_core.SegmentAbortDetails.html | 8 +- ...media_loader_core.SegmentErrorDetails.html | 8 +- ..._media_loader_core.SegmentLoadDetails.html | 8 +- ...p2p_media_loader_core.SegmentResponse.html | 8 +- ...media_loader_core.SegmentStartDetails.html | 8 +- ...p_media_loader_core.SegmentWithStream.html | 8 +- .../types/p2p_media_loader_core.Stream.html | 14 +- .../p2p_media_loader_core.StreamConfig.html | 114 ++++++++------- .../p2p_media_loader_core.StreamType.html | 8 +- ..._media_loader_core.StreamWithSegments.html | 8 +- ...media_loader_core.TrackerErrorDetails.html | 8 +- ...dia_loader_core.TrackerWarningDetails.html | 8 +- ...der_hlsjs.DynamicHlsJsP2PEngineConfig.html | 10 +- ...dia_loader_hlsjs.HlsJsP2PEngineConfig.html | 8 +- ...p_media_loader_hlsjs.HlsWithP2PConfig.html | 8 +- ...media_loader_hlsjs.HlsWithP2PInstance.html | 10 +- ...der_hlsjs.PartialHlsJsP2PEngineConfig.html | 10 +- ...der_shaka.DynamicShakaP2PEngineConfig.html | 10 +- ...loader_shaka.PartialShakaEngineConfig.html | 10 +- ...dia_loader_shaka.ShakaP2PEngineConfig.html | 8 +- 50 files changed, 548 insertions(+), 442 deletions(-) diff --git a/docs/v1.0/assets/icons.js b/docs/v1.0/assets/icons.js index b79c9e89..e88e8ca7 100644 --- a/docs/v1.0/assets/icons.js +++ b/docs/v1.0/assets/icons.js @@ -1,15 +1,18 @@ -(function(svg) { - svg.innerHTML = ``; - svg.style.display = 'none'; - if (location.protocol === 'file:') { - if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', updateUseElements); - else updateUseElements() - function updateUseElements() { - document.querySelectorAll('use').forEach(el => { - if (el.getAttribute('href').includes('#icon-')) { - el.setAttribute('href', el.getAttribute('href').replace(/.*#/, '#')); - } - }); - } +(function() { + addIcons(); + function addIcons() { + if (document.readyState === "loading") return document.addEventListener("DOMContentLoaded", addIcons); + const svg = document.body.appendChild(document.createElementNS("http://www.w3.org/2000/svg", "svg")); + svg.innerHTML = `""`; + svg.style.display = "none"; + if (location.protocol === "file:") updateUseElements(); } -})(document.body.appendChild(document.createElementNS('http://www.w3.org/2000/svg', 'svg'))) \ No newline at end of file + + function updateUseElements() { + document.querySelectorAll("use").forEach(el => { + if (el.getAttribute("href").includes("#icon-")) { + el.setAttribute("href", el.getAttribute("href").replace(/.*#/, "#")); + } + }); + } +})() \ No newline at end of file diff --git a/docs/v1.0/assets/icons.svg b/docs/v1.0/assets/icons.svg index 7dead611..e371b8b5 100644 --- a/docs/v1.0/assets/icons.svg +++ b/docs/v1.0/assets/icons.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/docs/v1.0/assets/main.js b/docs/v1.0/assets/main.js index d6f13886..35728810 100644 --- a/docs/v1.0/assets/main.js +++ b/docs/v1.0/assets/main.js @@ -1,8 +1,9 @@ "use strict"; -"use strict";(()=>{var Ce=Object.create;var ne=Object.defineProperty;var Pe=Object.getOwnPropertyDescriptor;var Oe=Object.getOwnPropertyNames;var _e=Object.getPrototypeOf,Re=Object.prototype.hasOwnProperty;var Me=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var Fe=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Oe(e))!Re.call(t,i)&&i!==n&&ne(t,i,{get:()=>e[i],enumerable:!(r=Pe(e,i))||r.enumerable});return t};var De=(t,e,n)=>(n=t!=null?Ce(_e(t)):{},Fe(e||!t||!t.__esModule?ne(n,"default",{value:t,enumerable:!0}):n,t));var ae=Me((se,oe)=>{(function(){var t=function(e){var n=new t.Builder;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),n.searchPipeline.add(t.stemmer),e.call(n,n),n.build()};t.version="2.3.9";t.utils={},t.utils.warn=function(e){return function(n){e.console&&console.warn&&console.warn(n)}}(this),t.utils.asString=function(e){return e==null?"":e.toString()},t.utils.clone=function(e){if(e==null)return e;for(var n=Object.create(null),r=Object.keys(e),i=0;i0){var d=t.utils.clone(n)||{};d.position=[a,u],d.index=s.length,s.push(new t.Token(r.slice(a,o),d))}a=o+1}}return s},t.tokenizer.separator=/[\s\-]+/;t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions=Object.create(null),t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn(`Function is not registered with pipeline. This may cause problems when serialising the index. -`,e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(r){var i=t.Pipeline.registeredFunctions[r];if(i)n.add(i);else throw new Error("Cannot load unregistered function: "+r)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(n){t.Pipeline.warnIfFunctionNotRegistered(n),this._stack.push(n)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");r=r+1,this._stack.splice(r,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");this._stack.splice(r,0,n)},t.Pipeline.prototype.remove=function(e){var n=this._stack.indexOf(e);n!=-1&&this._stack.splice(n,1)},t.Pipeline.prototype.run=function(e){for(var n=this._stack.length,r=0;r1&&(oe&&(r=s),o!=e);)i=r-n,s=n+Math.floor(i/2),o=this.elements[s*2];if(o==e||o>e)return s*2;if(ol?d+=2:a==l&&(n+=r[u+1]*i[d+1],u+=2,d+=2);return n},t.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},t.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),n=1,r=0;n0){var o=s.str.charAt(0),a;o in s.node.edges?a=s.node.edges[o]:(a=new t.TokenSet,s.node.edges[o]=a),s.str.length==1&&(a.final=!0),i.push({node:a,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(s.editsRemaining!=0){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new t.TokenSet;s.node.edges["*"]=l}if(s.str.length==0&&(l.final=!0),i.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&i.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),s.str.length==1&&(s.node.final=!0),s.str.length>=1){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new t.TokenSet;s.node.edges["*"]=u}s.str.length==1&&(u.final=!0),i.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var d=s.str.charAt(0),y=s.str.charAt(1),p;y in s.node.edges?p=s.node.edges[y]:(p=new t.TokenSet,s.node.edges[y]=p),s.str.length==1&&(p.final=!0),i.push({node:p,editsRemaining:s.editsRemaining-1,str:d+s.str.slice(2)})}}}return r},t.TokenSet.fromString=function(e){for(var n=new t.TokenSet,r=n,i=0,s=e.length;i=e;n--){var r=this.uncheckedNodes[n],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r.char]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}};t.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},t.Index.prototype.search=function(e){return this.query(function(n){var r=new t.QueryParser(e,n);r.parse()})},t.Index.prototype.query=function(e){for(var n=new t.Query(this.fields),r=Object.create(null),i=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),l=0;l1?this._b=1:this._b=e},t.Builder.prototype.k1=function(e){this._k1=e},t.Builder.prototype.add=function(e,n){var r=e[this._ref],i=Object.keys(this._fields);this._documents[r]=n||{},this.documentCount+=1;for(var s=0;s=this.length)return t.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},t.QueryLexer.prototype.width=function(){return this.pos-this.start},t.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},t.QueryLexer.prototype.backup=function(){this.pos-=1},t.QueryLexer.prototype.acceptDigitRun=function(){var e,n;do e=this.next(),n=e.charCodeAt(0);while(n>47&&n<58);e!=t.QueryLexer.EOS&&this.backup()},t.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(t.QueryLexer.TERM)),e.ignore(),e.more())return t.QueryLexer.lexText},t.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.EDIT_DISTANCE),t.QueryLexer.lexText},t.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.BOOST),t.QueryLexer.lexText},t.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(t.QueryLexer.TERM)},t.QueryLexer.termSeparator=t.tokenizer.separator,t.QueryLexer.lexText=function(e){for(;;){var n=e.next();if(n==t.QueryLexer.EOS)return t.QueryLexer.lexEOS;if(n.charCodeAt(0)==92){e.escapeCharacter();continue}if(n==":")return t.QueryLexer.lexField;if(n=="~")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexEditDistance;if(n=="^")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexBoost;if(n=="+"&&e.width()===1||n=="-"&&e.width()===1)return e.emit(t.QueryLexer.PRESENCE),t.QueryLexer.lexText;if(n.match(t.QueryLexer.termSeparator))return t.QueryLexer.lexTerm}},t.QueryParser=function(e,n){this.lexer=new t.QueryLexer(e),this.query=n,this.currentClause={},this.lexemeIdx=0},t.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=t.QueryParser.parseClause;e;)e=e(this);return this.query},t.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},t.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},t.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},t.QueryParser.parseClause=function(e){var n=e.peekLexeme();if(n!=null)switch(n.type){case t.QueryLexer.PRESENCE:return t.QueryParser.parsePresence;case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expected either a field or a term, found "+n.type;throw n.str.length>=1&&(r+=" with value '"+n.str+"'"),new t.QueryParseError(r,n.start,n.end)}},t.QueryParser.parsePresence=function(e){var n=e.consumeLexeme();if(n!=null){switch(n.str){case"-":e.currentClause.presence=t.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=t.Query.presence.REQUIRED;break;default:var r="unrecognised presence operator'"+n.str+"'";throw new t.QueryParseError(r,n.start,n.end)}var i=e.peekLexeme();if(i==null){var r="expecting term or field, found nothing";throw new t.QueryParseError(r,n.start,n.end)}switch(i.type){case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expecting term or field, found '"+i.type+"'";throw new t.QueryParseError(r,i.start,i.end)}}},t.QueryParser.parseField=function(e){var n=e.consumeLexeme();if(n!=null){if(e.query.allFields.indexOf(n.str)==-1){var r=e.query.allFields.map(function(o){return"'"+o+"'"}).join(", "),i="unrecognised field '"+n.str+"', possible fields: "+r;throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.fields=[n.str];var s=e.peekLexeme();if(s==null){var i="expecting term, found nothing";throw new t.QueryParseError(i,n.start,n.end)}switch(s.type){case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var i="expecting term, found '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseTerm=function(e){var n=e.consumeLexeme();if(n!=null){e.currentClause.term=n.str.toLowerCase(),n.str.indexOf("*")!=-1&&(e.currentClause.usePipeline=!1);var r=e.peekLexeme();if(r==null){e.nextClause();return}switch(r.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+r.type+"'";throw new t.QueryParseError(i,r.start,r.end)}}},t.QueryParser.parseEditDistance=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="edit distance must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.editDistance=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseBoost=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="boost must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.boost=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},function(e,n){typeof define=="function"&&define.amd?define(n):typeof se=="object"?oe.exports=n():e.lunr=n()}(this,function(){return t})})()});var re=[];function G(t,e){re.push({selector:e,constructor:t})}var U=class{constructor(){this.alwaysVisibleMember=null;this.createComponents(document.body),this.ensureFocusedElementVisible(),this.listenForCodeCopies(),window.addEventListener("hashchange",()=>this.ensureFocusedElementVisible()),document.body.style.display||(this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}createComponents(e){re.forEach(n=>{e.querySelectorAll(n.selector).forEach(r=>{r.dataset.hasInstance||(new n.constructor({el:r,app:this}),r.dataset.hasInstance=String(!0))})})}filterChanged(){this.ensureFocusedElementVisible()}showPage(){document.body.style.display&&(console.log("Show page"),document.body.style.removeProperty("display"),this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}scrollToHash(){if(location.hash){console.log("Scorlling");let e=document.getElementById(location.hash.substring(1));if(!e)return;e.scrollIntoView({behavior:"instant",block:"start"})}}ensureActivePageVisible(){let e=document.querySelector(".tsd-navigation .current"),n=e?.parentElement;for(;n&&!n.classList.contains(".tsd-navigation");)n instanceof HTMLDetailsElement&&(n.open=!0),n=n.parentElement;if(e&&!e.checkVisibility()){let r=e.getBoundingClientRect().top-document.documentElement.clientHeight/4;document.querySelector(".site-menu").scrollTop=r}}updateIndexVisibility(){let e=document.querySelector(".tsd-index-content"),n=e?.open;e&&(e.open=!0),document.querySelectorAll(".tsd-index-section").forEach(r=>{r.style.display="block";let i=Array.from(r.querySelectorAll(".tsd-index-link")).every(s=>s.offsetParent==null);r.style.display=i?"none":"block"}),e&&(e.open=n)}ensureFocusedElementVisible(){if(this.alwaysVisibleMember&&(this.alwaysVisibleMember.classList.remove("always-visible"),this.alwaysVisibleMember.firstElementChild.remove(),this.alwaysVisibleMember=null),!location.hash)return;let e=document.getElementById(location.hash.substring(1));if(!e)return;let n=e.parentElement;for(;n&&n.tagName!=="SECTION";)n=n.parentElement;if(n&&n.offsetParent==null){this.alwaysVisibleMember=n,n.classList.add("always-visible");let r=document.createElement("p");r.classList.add("warning"),r.textContent="This member is normally hidden due to your filter settings.",n.prepend(r)}}listenForCodeCopies(){document.querySelectorAll("pre > button").forEach(e=>{let n;e.addEventListener("click",()=>{e.previousElementSibling instanceof HTMLElement&&navigator.clipboard.writeText(e.previousElementSibling.innerText.trim()),e.textContent="Copied!",e.classList.add("visible"),clearTimeout(n),n=setTimeout(()=>{e.classList.remove("visible"),n=setTimeout(()=>{e.textContent="Copy"},100)},1e3)})})}};var ie=(t,e=100)=>{let n;return()=>{clearTimeout(n),n=setTimeout(()=>t(),e)}};var de=De(ae());async function le(t,e){if(!window.searchData)return;let n=await fetch(window.searchData),r=new Blob([await n.arrayBuffer()]).stream().pipeThrough(new DecompressionStream("gzip")),i=await new Response(r).json();t.data=i,t.index=de.Index.load(i.index),e.classList.remove("loading"),e.classList.add("ready")}function he(){let t=document.getElementById("tsd-search");if(!t)return;let e={base:t.dataset.base+"/"},n=document.getElementById("tsd-search-script");t.classList.add("loading"),n&&(n.addEventListener("error",()=>{t.classList.remove("loading"),t.classList.add("failure")}),n.addEventListener("load",()=>{le(e,t)}),le(e,t));let r=document.querySelector("#tsd-search input"),i=document.querySelector("#tsd-search .results");if(!r||!i)throw new Error("The input field or the result list wrapper was not found");let s=!1;i.addEventListener("mousedown",()=>s=!0),i.addEventListener("mouseup",()=>{s=!1,t.classList.remove("has-focus")}),r.addEventListener("focus",()=>t.classList.add("has-focus")),r.addEventListener("blur",()=>{s||(s=!1,t.classList.remove("has-focus"))}),Ae(t,i,r,e)}function Ae(t,e,n,r){n.addEventListener("input",ie(()=>{Ve(t,e,n,r)},200));let i=!1;n.addEventListener("keydown",s=>{i=!0,s.key=="Enter"?Ne(e,n):s.key=="Escape"?n.blur():s.key=="ArrowUp"?ue(e,-1):s.key==="ArrowDown"?ue(e,1):i=!1}),n.addEventListener("keypress",s=>{i&&s.preventDefault()}),document.body.addEventListener("keydown",s=>{s.altKey||s.ctrlKey||s.metaKey||!n.matches(":focus")&&s.key==="/"&&(n.focus(),s.preventDefault())})}function Ve(t,e,n,r){if(!r.index||!r.data)return;e.textContent="";let i=n.value.trim(),s;if(i){let o=i.split(" ").map(a=>a.length?`*${a}*`:"").join(" ");s=r.index.search(o)}else s=[];for(let o=0;oa.score-o.score);for(let o=0,a=Math.min(10,s.length);o`,d=ce(l.name,i);globalThis.DEBUG_SEARCH_WEIGHTS&&(d+=` (score: ${s[o].score.toFixed(2)})`),l.parent&&(d=` - ${ce(l.parent,i)}.${d}`);let y=document.createElement("li");y.classList.value=l.classes??"";let p=document.createElement("a");p.href=r.base+l.url,p.innerHTML=u+d,y.append(p),e.appendChild(y)}}function ue(t,e){let n=t.querySelector(".current");if(!n)n=t.querySelector(e==1?"li:first-child":"li:last-child"),n&&n.classList.add("current");else{let r=n;if(e===1)do r=r.nextElementSibling??void 0;while(r instanceof HTMLElement&&r.offsetParent==null);else do r=r.previousElementSibling??void 0;while(r instanceof HTMLElement&&r.offsetParent==null);r&&(n.classList.remove("current"),r.classList.add("current"))}}function Ne(t,e){let n=t.querySelector(".current");if(n||(n=t.querySelector("li:first-child")),n){let r=n.querySelector("a");r&&(window.location.href=r.href),e.blur()}}function ce(t,e){if(e==="")return t;let n=t.toLocaleLowerCase(),r=e.toLocaleLowerCase(),i=[],s=0,o=n.indexOf(r);for(;o!=-1;)i.push(K(t.substring(s,o)),`${K(t.substring(o,o+r.length))}`),s=o+r.length,o=n.indexOf(r,s);return i.push(K(t.substring(s))),i.join("")}var He={"&":"&","<":"<",">":">","'":"'",'"':"""};function K(t){return t.replace(/[&<>"'"]/g,e=>He[e])}var I=class{constructor(e){this.el=e.el,this.app=e.app}};var F="mousedown",fe="mousemove",H="mouseup",J={x:0,y:0},pe=!1,ee=!1,Be=!1,D=!1,me=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);document.documentElement.classList.add(me?"is-mobile":"not-mobile");me&&"ontouchstart"in document.documentElement&&(Be=!0,F="touchstart",fe="touchmove",H="touchend");document.addEventListener(F,t=>{ee=!0,D=!1;let e=F=="touchstart"?t.targetTouches[0]:t;J.y=e.pageY||0,J.x=e.pageX||0});document.addEventListener(fe,t=>{if(ee&&!D){let e=F=="touchstart"?t.targetTouches[0]:t,n=J.x-(e.pageX||0),r=J.y-(e.pageY||0);D=Math.sqrt(n*n+r*r)>10}});document.addEventListener(H,()=>{ee=!1});document.addEventListener("click",t=>{pe&&(t.preventDefault(),t.stopImmediatePropagation(),pe=!1)});var X=class extends I{constructor(e){super(e),this.className=this.el.dataset.toggle||"",this.el.addEventListener(H,n=>this.onPointerUp(n)),this.el.addEventListener("click",n=>n.preventDefault()),document.addEventListener(F,n=>this.onDocumentPointerDown(n)),document.addEventListener(H,n=>this.onDocumentPointerUp(n))}setActive(e){if(this.active==e)return;this.active=e,document.documentElement.classList.toggle("has-"+this.className,e),this.el.classList.toggle("active",e);let n=(this.active?"to-has-":"from-has-")+this.className;document.documentElement.classList.add(n),setTimeout(()=>document.documentElement.classList.remove(n),500)}onPointerUp(e){D||(this.setActive(!0),e.preventDefault())}onDocumentPointerDown(e){if(this.active){if(e.target.closest(".col-sidebar, .tsd-filter-group"))return;this.setActive(!1)}}onDocumentPointerUp(e){if(!D&&this.active&&e.target.closest(".col-sidebar")){let n=e.target.closest("a");if(n){let r=window.location.href;r.indexOf("#")!=-1&&(r=r.substring(0,r.indexOf("#"))),n.href.substring(0,r.length)==r&&setTimeout(()=>this.setActive(!1),250)}}}};var te;try{te=localStorage}catch{te={getItem(){return null},setItem(){}}}var Q=te;var ye=document.head.appendChild(document.createElement("style"));ye.dataset.for="filters";var Y=class extends I{constructor(e){super(e),this.key=`filter-${this.el.name}`,this.value=this.el.checked,this.el.addEventListener("change",()=>{this.setLocalStorage(this.el.checked)}),this.setLocalStorage(this.fromLocalStorage()),ye.innerHTML+=`html:not(.${this.key}) .tsd-is-${this.el.name} { display: none; } -`,this.app.updateIndexVisibility()}fromLocalStorage(){let e=Q.getItem(this.key);return e?e==="true":this.el.checked}setLocalStorage(e){Q.setItem(this.key,e.toString()),this.value=e,this.handleValueChange()}handleValueChange(){this.el.checked=this.value,document.documentElement.classList.toggle(this.key,this.value),this.app.filterChanged(),this.app.updateIndexVisibility()}};var Z=class extends I{constructor(e){super(e),this.summary=this.el.querySelector(".tsd-accordion-summary"),this.icon=this.summary.querySelector("svg"),this.key=`tsd-accordion-${this.summary.dataset.key??this.summary.textContent.trim().replace(/\s+/g,"-").toLowerCase()}`;let n=Q.getItem(this.key);this.el.open=n?n==="true":this.el.open,this.el.addEventListener("toggle",()=>this.update());let r=this.summary.querySelector("a");r&&r.addEventListener("click",()=>{location.assign(r.href)}),this.update()}update(){this.icon.style.transform=`rotate(${this.el.open?0:-90}deg)`,Q.setItem(this.key,this.el.open.toString())}};function ge(t){let e=Q.getItem("tsd-theme")||"os";t.value=e,ve(e),t.addEventListener("change",()=>{Q.setItem("tsd-theme",t.value),ve(t.value)})}function ve(t){document.documentElement.dataset.theme=t}var Le;function be(){let t=document.getElementById("tsd-nav-script");t&&(t.addEventListener("load",xe),xe())}async function xe(){let t=document.getElementById("tsd-nav-container");if(!t||!window.navigationData)return;let n=await(await fetch(window.navigationData)).arrayBuffer(),r=new Blob([n]).stream().pipeThrough(new DecompressionStream("gzip")),i=await new Response(r).json();Le=t.dataset.base+"/",t.innerHTML="";for(let s of i)we(s,t,[]);window.app.createComponents(t),window.app.showPage(),window.app.ensureActivePageVisible()}function we(t,e,n){let r=e.appendChild(document.createElement("li"));if(t.children){let i=[...n,t.text],s=r.appendChild(document.createElement("details"));s.className=t.class?`${t.class} tsd-index-accordion`:"tsd-index-accordion",s.dataset.key=i.join("$");let o=s.appendChild(document.createElement("summary"));o.className="tsd-accordion-summary",o.innerHTML='',Ee(t,o);let a=s.appendChild(document.createElement("div"));a.className="tsd-accordion-details";let l=a.appendChild(document.createElement("ul"));l.className="tsd-nested-navigation";for(let u of t.children)we(u,l,i)}else Ee(t,r,t.class)}function Ee(t,e,n){if(t.path){let r=e.appendChild(document.createElement("a"));r.href=Le+t.path,n&&(r.className=n),location.pathname===r.pathname&&r.classList.add("current"),t.kind&&(r.innerHTML=``),r.appendChild(document.createElement("span")).textContent=t.text}else e.appendChild(document.createElement("span")).textContent=t.text}G(X,"a[data-toggle]");G(Z,".tsd-index-accordion");G(Y,".tsd-filter-item input[type=checkbox]");var Se=document.getElementById("tsd-theme");Se&&ge(Se);var je=new U;Object.defineProperty(window,"app",{value:je});he();be();})(); +window.translations={"copy":"Copy","copied":"Copied!","normally_hidden":"This member is normally hidden due to your filter settings."}; +"use strict";(()=>{var Pe=Object.create;var ie=Object.defineProperty;var Oe=Object.getOwnPropertyDescriptor;var _e=Object.getOwnPropertyNames;var Re=Object.getPrototypeOf,Me=Object.prototype.hasOwnProperty;var Fe=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var De=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of _e(e))!Me.call(t,i)&&i!==n&&ie(t,i,{get:()=>e[i],enumerable:!(r=Oe(e,i))||r.enumerable});return t};var Ae=(t,e,n)=>(n=t!=null?Pe(Re(t)):{},De(e||!t||!t.__esModule?ie(n,"default",{value:t,enumerable:!0}):n,t));var ue=Fe((ae,le)=>{(function(){var t=function(e){var n=new t.Builder;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),n.searchPipeline.add(t.stemmer),e.call(n,n),n.build()};t.version="2.3.9";t.utils={},t.utils.warn=function(e){return function(n){e.console&&console.warn&&console.warn(n)}}(this),t.utils.asString=function(e){return e==null?"":e.toString()},t.utils.clone=function(e){if(e==null)return e;for(var n=Object.create(null),r=Object.keys(e),i=0;i0){var d=t.utils.clone(n)||{};d.position=[a,u],d.index=s.length,s.push(new t.Token(r.slice(a,o),d))}a=o+1}}return s},t.tokenizer.separator=/[\s\-]+/;t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions=Object.create(null),t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn(`Function is not registered with pipeline. This may cause problems when serialising the index. +`,e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(r){var i=t.Pipeline.registeredFunctions[r];if(i)n.add(i);else throw new Error("Cannot load unregistered function: "+r)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(n){t.Pipeline.warnIfFunctionNotRegistered(n),this._stack.push(n)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");r=r+1,this._stack.splice(r,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");this._stack.splice(r,0,n)},t.Pipeline.prototype.remove=function(e){var n=this._stack.indexOf(e);n!=-1&&this._stack.splice(n,1)},t.Pipeline.prototype.run=function(e){for(var n=this._stack.length,r=0;r1&&(oe&&(r=s),o!=e);)i=r-n,s=n+Math.floor(i/2),o=this.elements[s*2];if(o==e||o>e)return s*2;if(ol?d+=2:a==l&&(n+=r[u+1]*i[d+1],u+=2,d+=2);return n},t.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},t.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),n=1,r=0;n0){var o=s.str.charAt(0),a;o in s.node.edges?a=s.node.edges[o]:(a=new t.TokenSet,s.node.edges[o]=a),s.str.length==1&&(a.final=!0),i.push({node:a,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(s.editsRemaining!=0){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new t.TokenSet;s.node.edges["*"]=l}if(s.str.length==0&&(l.final=!0),i.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&i.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),s.str.length==1&&(s.node.final=!0),s.str.length>=1){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new t.TokenSet;s.node.edges["*"]=u}s.str.length==1&&(u.final=!0),i.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var d=s.str.charAt(0),m=s.str.charAt(1),p;m in s.node.edges?p=s.node.edges[m]:(p=new t.TokenSet,s.node.edges[m]=p),s.str.length==1&&(p.final=!0),i.push({node:p,editsRemaining:s.editsRemaining-1,str:d+s.str.slice(2)})}}}return r},t.TokenSet.fromString=function(e){for(var n=new t.TokenSet,r=n,i=0,s=e.length;i=e;n--){var r=this.uncheckedNodes[n],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r.char]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}};t.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},t.Index.prototype.search=function(e){return this.query(function(n){var r=new t.QueryParser(e,n);r.parse()})},t.Index.prototype.query=function(e){for(var n=new t.Query(this.fields),r=Object.create(null),i=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),l=0;l1?this._b=1:this._b=e},t.Builder.prototype.k1=function(e){this._k1=e},t.Builder.prototype.add=function(e,n){var r=e[this._ref],i=Object.keys(this._fields);this._documents[r]=n||{},this.documentCount+=1;for(var s=0;s=this.length)return t.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},t.QueryLexer.prototype.width=function(){return this.pos-this.start},t.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},t.QueryLexer.prototype.backup=function(){this.pos-=1},t.QueryLexer.prototype.acceptDigitRun=function(){var e,n;do e=this.next(),n=e.charCodeAt(0);while(n>47&&n<58);e!=t.QueryLexer.EOS&&this.backup()},t.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(t.QueryLexer.TERM)),e.ignore(),e.more())return t.QueryLexer.lexText},t.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.EDIT_DISTANCE),t.QueryLexer.lexText},t.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.BOOST),t.QueryLexer.lexText},t.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(t.QueryLexer.TERM)},t.QueryLexer.termSeparator=t.tokenizer.separator,t.QueryLexer.lexText=function(e){for(;;){var n=e.next();if(n==t.QueryLexer.EOS)return t.QueryLexer.lexEOS;if(n.charCodeAt(0)==92){e.escapeCharacter();continue}if(n==":")return t.QueryLexer.lexField;if(n=="~")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexEditDistance;if(n=="^")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexBoost;if(n=="+"&&e.width()===1||n=="-"&&e.width()===1)return e.emit(t.QueryLexer.PRESENCE),t.QueryLexer.lexText;if(n.match(t.QueryLexer.termSeparator))return t.QueryLexer.lexTerm}},t.QueryParser=function(e,n){this.lexer=new t.QueryLexer(e),this.query=n,this.currentClause={},this.lexemeIdx=0},t.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=t.QueryParser.parseClause;e;)e=e(this);return this.query},t.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},t.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},t.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},t.QueryParser.parseClause=function(e){var n=e.peekLexeme();if(n!=null)switch(n.type){case t.QueryLexer.PRESENCE:return t.QueryParser.parsePresence;case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expected either a field or a term, found "+n.type;throw n.str.length>=1&&(r+=" with value '"+n.str+"'"),new t.QueryParseError(r,n.start,n.end)}},t.QueryParser.parsePresence=function(e){var n=e.consumeLexeme();if(n!=null){switch(n.str){case"-":e.currentClause.presence=t.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=t.Query.presence.REQUIRED;break;default:var r="unrecognised presence operator'"+n.str+"'";throw new t.QueryParseError(r,n.start,n.end)}var i=e.peekLexeme();if(i==null){var r="expecting term or field, found nothing";throw new t.QueryParseError(r,n.start,n.end)}switch(i.type){case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expecting term or field, found '"+i.type+"'";throw new t.QueryParseError(r,i.start,i.end)}}},t.QueryParser.parseField=function(e){var n=e.consumeLexeme();if(n!=null){if(e.query.allFields.indexOf(n.str)==-1){var r=e.query.allFields.map(function(o){return"'"+o+"'"}).join(", "),i="unrecognised field '"+n.str+"', possible fields: "+r;throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.fields=[n.str];var s=e.peekLexeme();if(s==null){var i="expecting term, found nothing";throw new t.QueryParseError(i,n.start,n.end)}switch(s.type){case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var i="expecting term, found '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseTerm=function(e){var n=e.consumeLexeme();if(n!=null){e.currentClause.term=n.str.toLowerCase(),n.str.indexOf("*")!=-1&&(e.currentClause.usePipeline=!1);var r=e.peekLexeme();if(r==null){e.nextClause();return}switch(r.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+r.type+"'";throw new t.QueryParseError(i,r.start,r.end)}}},t.QueryParser.parseEditDistance=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="edit distance must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.editDistance=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseBoost=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="boost must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.boost=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},function(e,n){typeof define=="function"&&define.amd?define(n):typeof ae=="object"?le.exports=n():e.lunr=n()}(this,function(){return t})})()});var se=[];function G(t,e){se.push({selector:e,constructor:t})}var U=class{constructor(){this.alwaysVisibleMember=null;this.createComponents(document.body),this.ensureFocusedElementVisible(),this.listenForCodeCopies(),window.addEventListener("hashchange",()=>this.ensureFocusedElementVisible()),document.body.style.display||(this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}createComponents(e){se.forEach(n=>{e.querySelectorAll(n.selector).forEach(r=>{r.dataset.hasInstance||(new n.constructor({el:r,app:this}),r.dataset.hasInstance=String(!0))})})}filterChanged(){this.ensureFocusedElementVisible()}showPage(){document.body.style.display&&(document.body.style.removeProperty("display"),this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}scrollToHash(){if(location.hash){let e=document.getElementById(location.hash.substring(1));if(!e)return;e.scrollIntoView({behavior:"instant",block:"start"})}}ensureActivePageVisible(){let e=document.querySelector(".tsd-navigation .current"),n=e?.parentElement;for(;n&&!n.classList.contains(".tsd-navigation");)n instanceof HTMLDetailsElement&&(n.open=!0),n=n.parentElement;if(e&&!Ve(e)){let r=e.getBoundingClientRect().top-document.documentElement.clientHeight/4;document.querySelector(".site-menu").scrollTop=r,document.querySelector(".col-sidebar").scrollTop=r}}updateIndexVisibility(){let e=document.querySelector(".tsd-index-content"),n=e?.open;e&&(e.open=!0),document.querySelectorAll(".tsd-index-section").forEach(r=>{r.style.display="block";let i=Array.from(r.querySelectorAll(".tsd-index-link")).every(s=>s.offsetParent==null);r.style.display=i?"none":"block"}),e&&(e.open=n)}ensureFocusedElementVisible(){if(this.alwaysVisibleMember&&(this.alwaysVisibleMember.classList.remove("always-visible"),this.alwaysVisibleMember.firstElementChild.remove(),this.alwaysVisibleMember=null),!location.hash)return;let e=document.getElementById(location.hash.substring(1));if(!e)return;let n=e.parentElement;for(;n&&n.tagName!=="SECTION";)n=n.parentElement;if(!n)return;let r=n.offsetParent==null,i=n;for(;i!==document.body;)i instanceof HTMLDetailsElement&&(i.open=!0),i=i.parentElement;if(n.offsetParent==null){this.alwaysVisibleMember=n,n.classList.add("always-visible");let s=document.createElement("p");s.classList.add("warning"),s.textContent=window.translations.normally_hidden,n.prepend(s)}r&&e.scrollIntoView()}listenForCodeCopies(){document.querySelectorAll("pre > button").forEach(e=>{let n;e.addEventListener("click",()=>{e.previousElementSibling instanceof HTMLElement&&navigator.clipboard.writeText(e.previousElementSibling.innerText.trim()),e.textContent=window.translations.copied,e.classList.add("visible"),clearTimeout(n),n=setTimeout(()=>{e.classList.remove("visible"),n=setTimeout(()=>{e.textContent=window.translations.copy},100)},1e3)})})}};function Ve(t){let e=t.getBoundingClientRect(),n=Math.max(document.documentElement.clientHeight,window.innerHeight);return!(e.bottom<0||e.top-n>=0)}var oe=(t,e=100)=>{let n;return()=>{clearTimeout(n),n=setTimeout(()=>t(),e)}};var pe=Ae(ue());async function ce(t,e){if(!window.searchData)return;let n=await fetch(window.searchData),r=new Blob([await n.arrayBuffer()]).stream().pipeThrough(new DecompressionStream("gzip")),i=await new Response(r).json();t.data=i,t.index=pe.Index.load(i.index),e.classList.remove("loading"),e.classList.add("ready")}function fe(){let t=document.getElementById("tsd-search");if(!t)return;let e={base:t.dataset.base+"/"},n=document.getElementById("tsd-search-script");t.classList.add("loading"),n&&(n.addEventListener("error",()=>{t.classList.remove("loading"),t.classList.add("failure")}),n.addEventListener("load",()=>{ce(e,t)}),ce(e,t));let r=document.querySelector("#tsd-search input"),i=document.querySelector("#tsd-search .results");if(!r||!i)throw new Error("The input field or the result list wrapper was not found");i.addEventListener("mouseup",()=>{te(t)}),r.addEventListener("focus",()=>t.classList.add("has-focus")),He(t,i,r,e)}function He(t,e,n,r){n.addEventListener("input",oe(()=>{Ne(t,e,n,r)},200)),n.addEventListener("keydown",i=>{i.key=="Enter"?Be(e,t):i.key=="ArrowUp"?(de(e,n,-1),i.preventDefault()):i.key==="ArrowDown"&&(de(e,n,1),i.preventDefault())}),document.body.addEventListener("keypress",i=>{i.altKey||i.ctrlKey||i.metaKey||!n.matches(":focus")&&i.key==="/"&&(i.preventDefault(),n.focus())}),document.body.addEventListener("keyup",i=>{t.classList.contains("has-focus")&&(i.key==="Escape"||!e.matches(":focus-within")&&!n.matches(":focus"))&&(n.blur(),te(t))})}function te(t){t.classList.remove("has-focus")}function Ne(t,e,n,r){if(!r.index||!r.data)return;e.textContent="";let i=n.value.trim(),s;if(i){let o=i.split(" ").map(a=>a.length?`*${a}*`:"").join(" ");s=r.index.search(o)}else s=[];for(let o=0;oa.score-o.score);for(let o=0,a=Math.min(10,s.length);o`,d=he(l.name,i);globalThis.DEBUG_SEARCH_WEIGHTS&&(d+=` (score: ${s[o].score.toFixed(2)})`),l.parent&&(d=` + ${he(l.parent,i)}.${d}`);let m=document.createElement("li");m.classList.value=l.classes??"";let p=document.createElement("a");p.href=r.base+l.url,p.innerHTML=u+d,m.append(p),p.addEventListener("focus",()=>{e.querySelector(".current")?.classList.remove("current"),m.classList.add("current")}),e.appendChild(m)}}function de(t,e,n){let r=t.querySelector(".current");if(!r)r=t.querySelector(n==1?"li:first-child":"li:last-child"),r&&r.classList.add("current");else{let i=r;if(n===1)do i=i.nextElementSibling??void 0;while(i instanceof HTMLElement&&i.offsetParent==null);else do i=i.previousElementSibling??void 0;while(i instanceof HTMLElement&&i.offsetParent==null);i?(r.classList.remove("current"),i.classList.add("current")):n===-1&&(r.classList.remove("current"),e.focus())}}function Be(t,e){let n=t.querySelector(".current");if(n||(n=t.querySelector("li:first-child")),n){let r=n.querySelector("a");r&&(window.location.href=r.href),te(e)}}function he(t,e){if(e==="")return t;let n=t.toLocaleLowerCase(),r=e.toLocaleLowerCase(),i=[],s=0,o=n.indexOf(r);for(;o!=-1;)i.push(ee(t.substring(s,o)),`${ee(t.substring(o,o+r.length))}`),s=o+r.length,o=n.indexOf(r,s);return i.push(ee(t.substring(s))),i.join("")}var je={"&":"&","<":"<",">":">","'":"'",'"':"""};function ee(t){return t.replace(/[&<>"'"]/g,e=>je[e])}var I=class{constructor(e){this.el=e.el,this.app=e.app}};var F="mousedown",ye="mousemove",N="mouseup",J={x:0,y:0},me=!1,ne=!1,qe=!1,D=!1,ve=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);document.documentElement.classList.add(ve?"is-mobile":"not-mobile");ve&&"ontouchstart"in document.documentElement&&(qe=!0,F="touchstart",ye="touchmove",N="touchend");document.addEventListener(F,t=>{ne=!0,D=!1;let e=F=="touchstart"?t.targetTouches[0]:t;J.y=e.pageY||0,J.x=e.pageX||0});document.addEventListener(ye,t=>{if(ne&&!D){let e=F=="touchstart"?t.targetTouches[0]:t,n=J.x-(e.pageX||0),r=J.y-(e.pageY||0);D=Math.sqrt(n*n+r*r)>10}});document.addEventListener(N,()=>{ne=!1});document.addEventListener("click",t=>{me&&(t.preventDefault(),t.stopImmediatePropagation(),me=!1)});var X=class extends I{constructor(e){super(e),this.className=this.el.dataset.toggle||"",this.el.addEventListener(N,n=>this.onPointerUp(n)),this.el.addEventListener("click",n=>n.preventDefault()),document.addEventListener(F,n=>this.onDocumentPointerDown(n)),document.addEventListener(N,n=>this.onDocumentPointerUp(n))}setActive(e){if(this.active==e)return;this.active=e,document.documentElement.classList.toggle("has-"+this.className,e),this.el.classList.toggle("active",e);let n=(this.active?"to-has-":"from-has-")+this.className;document.documentElement.classList.add(n),setTimeout(()=>document.documentElement.classList.remove(n),500)}onPointerUp(e){D||(this.setActive(!0),e.preventDefault())}onDocumentPointerDown(e){if(this.active){if(e.target.closest(".col-sidebar, .tsd-filter-group"))return;this.setActive(!1)}}onDocumentPointerUp(e){if(!D&&this.active&&e.target.closest(".col-sidebar")){let n=e.target.closest("a");if(n){let r=window.location.href;r.indexOf("#")!=-1&&(r=r.substring(0,r.indexOf("#"))),n.href.substring(0,r.length)==r&&setTimeout(()=>this.setActive(!1),250)}}}};var re;try{re=localStorage}catch{re={getItem(){return null},setItem(){}}}var Q=re;var ge=document.head.appendChild(document.createElement("style"));ge.dataset.for="filters";var Y=class extends I{constructor(e){super(e),this.key=`filter-${this.el.name}`,this.value=this.el.checked,this.el.addEventListener("change",()=>{this.setLocalStorage(this.el.checked)}),this.setLocalStorage(this.fromLocalStorage()),ge.innerHTML+=`html:not(.${this.key}) .tsd-is-${this.el.name} { display: none; } +`,this.app.updateIndexVisibility()}fromLocalStorage(){let e=Q.getItem(this.key);return e?e==="true":this.el.checked}setLocalStorage(e){Q.setItem(this.key,e.toString()),this.value=e,this.handleValueChange()}handleValueChange(){this.el.checked=this.value,document.documentElement.classList.toggle(this.key,this.value),this.app.filterChanged(),this.app.updateIndexVisibility()}};var Z=class extends I{constructor(e){super(e),this.summary=this.el.querySelector(".tsd-accordion-summary"),this.icon=this.summary.querySelector("svg"),this.key=`tsd-accordion-${this.summary.dataset.key??this.summary.textContent.trim().replace(/\s+/g,"-").toLowerCase()}`;let n=Q.getItem(this.key);this.el.open=n?n==="true":this.el.open,this.el.addEventListener("toggle",()=>this.update());let r=this.summary.querySelector("a");r&&r.addEventListener("click",()=>{location.assign(r.href)}),this.update()}update(){this.icon.style.transform=`rotate(${this.el.open?0:-90}deg)`,Q.setItem(this.key,this.el.open.toString())}};function Ee(t){let e=Q.getItem("tsd-theme")||"os";t.value=e,xe(e),t.addEventListener("change",()=>{Q.setItem("tsd-theme",t.value),xe(t.value)})}function xe(t){document.documentElement.dataset.theme=t}var K;function we(){let t=document.getElementById("tsd-nav-script");t&&(t.addEventListener("load",Le),Le())}async function Le(){let t=document.getElementById("tsd-nav-container");if(!t||!window.navigationData)return;let n=await(await fetch(window.navigationData)).arrayBuffer(),r=new Blob([n]).stream().pipeThrough(new DecompressionStream("gzip")),i=await new Response(r).json();K=t.dataset.base,K.endsWith("/")||(K+="/"),t.innerHTML="";for(let s of i)Se(s,t,[]);window.app.createComponents(t),window.app.showPage(),window.app.ensureActivePageVisible()}function Se(t,e,n){let r=e.appendChild(document.createElement("li"));if(t.children){let i=[...n,t.text],s=r.appendChild(document.createElement("details"));s.className=t.class?`${t.class} tsd-accordion`:"tsd-accordion";let o=s.appendChild(document.createElement("summary"));o.className="tsd-accordion-summary",o.dataset.key=i.join("$"),o.innerHTML='',be(t,o);let a=s.appendChild(document.createElement("div"));a.className="tsd-accordion-details";let l=a.appendChild(document.createElement("ul"));l.className="tsd-nested-navigation";for(let u of t.children)Se(u,l,i)}else be(t,r,t.class)}function be(t,e,n){if(t.path){let r=e.appendChild(document.createElement("a"));r.href=K+t.path,n&&(r.className=n),location.pathname===r.pathname&&r.classList.add("current"),t.kind&&(r.innerHTML=``),r.appendChild(document.createElement("span")).textContent=t.text}else e.appendChild(document.createElement("span")).textContent=t.text}G(X,"a[data-toggle]");G(Z,".tsd-accordion");G(Y,".tsd-filter-item input[type=checkbox]");var Te=document.getElementById("tsd-theme");Te&&Ee(Te);var $e=new U;Object.defineProperty(window,"app",{value:$e});fe();we();})(); /*! Bundled license information: lunr/lunr.js: diff --git a/docs/v1.0/assets/search.js b/docs/v1.0/assets/search.js index a3264f38..28b7c268 100644 --- a/docs/v1.0/assets/search.js +++ b/docs/v1.0/assets/search.js @@ -1 +1 @@ -window.searchData = "data:application/octet-stream;base64,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"; \ No newline at end of file +window.searchData = "data:application/octet-stream;base64,H4sIAAAAAAAAA9VdXZPbNrL9L8qromWD337L2t4b37ITl51sHqZcLlrCzHAjkbokNWOvy//9FkBSagANCfxQxnkazQy7ddA4aAB9QPLroiof68Wzm6+LP/Nis3jGlosi2/HFs8We7X/c8U2e/bgtsw2vflyXFV8sF4dqu3i22JWbw5bX/9iz/Ud51cf2qo/iqtV9s9sulov1NqtrXi+eLRbflv03AEuO3/Ecu+yutrh8TvtdLvZZxYvGChh9sceC4ze/ePmvn35//dvH57++efPrLx+f//ru5cfnv/7yr1f/MxTPD2ddDYAqXV7C+/63dy9/ejMVqu5lAsoQTpRZl0XdVId1U1aDoam2EwAxLzgR7I43z8viNr8bjAdbzoUm2++3X158KbJdvh4Ji3QxG77N5uUDL5rXed3wgg/vRMLBXNgqvisf+DR4tI+5ENa8eZMV+S2vm3e83pdFzX+vtoNBWt3MhfM+q9/zu50wH4pNMZ1xjL5vKp7txozRo+WMY6D1+er2l7LgLz/ndVOPGQikl7lQHvabrOEjw6YZz4VJXDeWWKrtbH35qayazu3rMtvkxYiES/qYtx/fbrMvn7L1nyN7EpnPmMt+Wjf5A3/NH/j2n3lTZc3gldoPNi8zonxVv84fRiE7Ws6FJq8RTbJP2+GoKA9zodvwuqnKL4MxnewmIUljCE8LxTb3/PZlf4pR82VvRXO6fNoOQIfxzy8Nf5cVd24ojldPAxGFoR8dIXz82LhGQf3+H46WQ/rl1GLLPqNusqoZD2fV248CteraZMHGi80EZK31TLgMQmvz3lk2t9c+EYvwt4/jUN9WSy9Vh6LJd/yVW18RcFbYwwhgl1j0ueFVkW0nAFRczI/wgHYNQ6EdBm8V3DB9GpQqKWTYw/z4ZN75Ld+Nx4c9XIF1xWYSupP9LNgs+euPvLnXNhUOQE9W807PrU/pvf2iesBqAZtdA9YAKE+V6U9fPjLRtw2dJ88bYMan+dbV+fE2IUqr0aG6gCkvNvzzWFC98RyodEa/4Ld5wTdi0a6VJc+BNKzmHWZdkbNtw9uq3POqyblbCrDYXgXg0KjpVvOCel7udmUxEJNu9EQJi4QxLnUZYbAMyXW2vud95enl531eZU1eFpPhruyOpzTjQoJRvrR+Xh4cdyTuLTk6nbcVJosH8vc6g6nNHwOAYIMnnfUnDyCl6bb5rH7L3r7Ia1GpGrIKIEimuxoL9cIAuc/v7l/wXdYupv/Ii035OA24xeO18DfN/kX5WAjz2Vpg83mlNuzZ7E2wubxSC+p8d9g2WcHLQ/0zit6Q7QnRinNu/4KWiAE4f0M0r1dqxyP/9K5Zv8k+v+F1nd3x9/l/p2XLlcXj9cbEL2Xzjq95/pAXd6LwWAsml4fmzcTOuOT6ei16VWSt+CM9vGh1hPladdH9FXPwtTrrou8rtullVZXVO95Urpuss63QvF2PZfPBNp1dCXVWFOWhWPPfqmz9J68mwia8XQl31einlkYBxm6uhLRpY/F8m/Oi+Tev6rws3lb8Nh9SfiGgn/V7rTn6Mat2g6ps1JR8dHIllA/ZNpdnEdjbQVqYDTDpbz7ss2+vCMDdt/4I05FT4TiTyt/x/zvwunnPm8N+eirXvH3PnaDD7bvAn6ELjFCcqQx2K9735aFauzVJNZm5jNEy5r0QuF7wJsu3jlOOafe0orWBZJKArcTDlnyH6/o2kKt6XB4jvJ5PxZvh7LsE3XB53RbsOa+GyfNW5EdXsyO2jDK5hBwxyrDd044yA8mkUabEwyaOi2vmgLjqPU0EemlJNjwrWBFPygoDMI/PClboc2SFAS0YnhWsyKdkhSE8GXjM8RJVsLvZkVvy2U/i/POIfIbtnjafGUgm5TMlHvPlBxvIaflB8Xqt/GCFPkd+GNCC4fnBinxKfhiAeFx+sFNlYn44j9ySH0T5dUR6QGZPmx10IJOSAw7G+dzw+7AznhaUK8XbNMAOB0Dr17y4a+7nAK66uyry8ZnNBn6OxOaOf3hes+Gektbc8Y7LalaGT0xqZ3HrOe0t54P2buj6J8piOoJx6Qu3ezoLLZjG0Q87m5V3NpSjCXcWKcW0waUC3egJOTdTkcAIwzzsm3fjZ3icnYfzb/kGYnavwJyFO6b8chmpPnY6pXPw8CHsnmgE2ZCMG0RUPObh5gWc4+lJOZ6LoZdAjyGpE14LT//IqiIv7kYwVbV8Wq4SWCaxVYvKrHy1Y53MWM31hWNp7cUzQT95uwJu6gS2fFDKm8xNQsYGT3b/gAZh7L0DqOmWni0LtL1wPPxsg7cynY2FO6PG7op27CkHArYRiEvBf+k8J1xuzcsRs8KThV6CHXu44Wzk2zBcCrysFM7Ult7X3yLwEmwf+HDOwLdhuBT4986PZ7jclvcjHtXwZIGXYPvAx3MGvg2DNfBie/K8LAq+nhx31dX3HXaEtY96OkvUcRDOB31b1vM0o3P0Nwi4QHqcUOeZUU8ROBvtWaZS7Oj7j7YyicI8s+gpAtZoP78/FH/2x/2mLx1Nd9935DW8x/jPM5nq0TjfC7/vZ+wD5Oxv0AM92mP855lT1UhYo4/LKVObo/n6vmOPwR5DP8/EqsThUuT/GFCZuNycP0ZVJp4s+h3cPv5snolWi4W9tNIdIpcLftlbzuUt0nLes+I/n065D8NGGc4LTcyto6BRhvNCGwVrXkj4serYs+MDH7HJRCDKjVj5jtdNttuPhfED9jBkkCoxOKGb9rhyE974x5ZbANqfYjQ4csNLnxZMlqNf/eOphxzz6G2e9tCXgmLSia9jDGyHj7Imm4ps1TmZAO/S4a6s2Dzmm2FHu0io2NO8eLXXRozIcbrZNA5Of/HBnNnECMn0jEJDHCmoOGaWl8VdXvDn2XYrHmjtJpZqNk+UWSgU4zKLHgN7TfiwXvN6fJBQkfXoaQLQGdfwTmjHKk80bBQFa8Dd96vnGzBmr/pUwZ4kNVlDbeQB/EgH1dH9tv7PiePW9w7Jy4ixf2ars63/VzyfpgPp9GSD9lsoy4Fpp23VtN67AGZw9rH7sz5wDr+/aRLKVedqMlSHo5dZ1eTZdnz3n3EwkQWWR0yOh3rGwZMR9hKmkbw9F6vJ9HXEPIrF53xfJPPP21o86fgte/uqqJusuHyDw3HoaHYzU/f0BQMzq2I1ERTeNKjxvbwGplLM5Bjh14UU/+Hr5k3+OS8mgPlBdTMhfVq2NtrInoZwhT7/CKs5JqiVxf0cOzV7m0Zt1C5EfeKr2Oxgx7+VbQjiUS9os4Oe9K62IbiPL/r7V1lJiymoKWfzYD47386BdGX85ThCh2yxyG90+DLbHH3bPt/vr2vq6vSNV27ypfv+/vKW75+u5WPf2unQ9isl6BHv8jyToie81nMI6k95sfl5OynFnVxcAZ/zW8rs+Aa/sOwSPntpor7P/swulybkZYNKE/37C4ThwH1f+2VnHAxcw7ZtnLbvc8M0eN930e2Ufd8gzAP3fZd9X9z3jafGd8WJuclwHRZcpfvH9XtXe5LGw/veZj2x//E2W23W5UROBWMinNH7PSuWcfs9yt25ibm9cpt9cVn02bGarq6Ad8zyxw55yvJnCOoBC0s72BELy0GRHbzzPxPX0Tv/IYhH7fztoCft/Ifgdl5s2rEOXmwOi+udaH/1dnu4ywuHRfu5mOquroD3UMyImHI2CfOHZfcCtmdfFw/to7sXzxZs5a/E+dvbnG839eLZTduY5WJd7rrnrm3K9UF+/NBd9m8u5gFxcXv1P7zF8sZbQrJKltD+YO0PfwnhKvXhw4flTe9RXi3/0Ds+/UV6g8Xyxl/6wSqNE8UQDENQDNlieRMsg3SVer5iyAxDphj6i+VNSBn6hqGvGAaL5U209KNVpEENDMNAMQwXy5t4GcCKxaliGBqGoWIYLZY3CWUYGYaRYhgvljcpZRgbhrFimCyWN+BRlolhmSiWqbAEKq6pYZmqFBCMAEaZgkkf0PgjWAE+aUxQSOUQCGYAySIwaQQqj8RNNDdAMglMKoHKJRAMgYg0NukEKp/E7SM3EJPGJqVA5RQIpkBCGpu0ApVX4saJG0hJY5NaoHILBGGYRxqb7AKVXuK+gRtG8gtMgoHKMCY4wxhFa2YyjKkMEyfmb5i/9NmKBbFqbDKMaVlKcIYFyyBYxV6gGhOJSmUYE5xh4RLiFWi2JsGYSjAmKMNIgjGTYEwlGBOUYSTBmEkwphKMCcqwZOknq5ipkwEzCcZUgrHY2mSTX0zlF5P8SslYm/xiKr+YYIxPkpOZ/GIqv3zBGJ8kp2/yy1f55YOVIr7JL1/lly8Y45O50zf55WszoaCMT+ZOn5gMVYL5gjI+mTt9k2C+SjBfUManZ2GTYL5KMF9Qxiep7ZsE81WC+VaC+SbBfJVgvp1gvkkwXyWYLwlGLgN8k2C+SrBAEoxM2oFJsEAlWCDXWGTSDkyCBSrBArnOIsdFYBIsUAkWCMoE5LgITIIF2nJLUCYgqR0QKy6VYEFo6+bA5Feg8isQjAnIYRGY/ApUfgWCMgE5LAKTYIFKsEBQJiCHRWASLFAJFgjKBOSwCEyCBSrBQs8Wr9DkV6jyKxSMCcjZIjT5Far8CiW/SGaHJr9ClV+h5BfJ7NDkV6jyKxSMCUlmhya/Qm1JLygTkswOiVW9SrBQUCYkmR2aBAtVgoWCMiHJztAkWKgSLBSUCUl2hibBQpVgoaBMSLIzNAkWqgSLBGdCkp2RybBIZVgkOBOSDItMhkUqwyLBmZBkWGQyLFIZFsndIsmwyGRYpDIskjtGkmGRybBIZVgkOBORDItMhkXaxlFwJiIZFhF7R5VhkeBMRDIsMhkWqQyLElsiiUyCRSrBIkGZiGRnZBIsUgkWWzNYbPIrVvkVC8ZEIbW3j01+xSq/YsGYiGR2bPIrVvkVW5f4sUmvWKVXHFgX2rFJr1ilVxzam2zSK1bpFUt6xVTZJjbpFWu1CUkvcjzGRHlCpVdspVds0itW6RVLetFlEZNesUqvxLMGOzH5laj8Suz8Skx+JSq/EmYNdmLyK1H5lfjWzWtiEixRCZYIysRk/kpMgiUqwRLrCiwx+ZWo/ErsW8jE5Fei8iuJ7cE2+ZVo9a/EHmyiAqYSLEntwTYJlqgESwVlYrqAZhIsVQmWgi3YqcmvVOVXKhgTk3NFavIrVfmVCsbE5FyRmvxKVX6lgbWnUpNfqcqvNLT2VGoSLFUJlkbWnkpNgqUqwVJBmZicplKTYKlKsNSawFKTX6lWYk3tTSaKrHqV1bO2uf2fao7+1tkL2sR0vdMjSq2eVmv1mK3l7b90c63a6vnWxrf/0+21gqsXnGk+UXL1tJqrF1pnj/Z/ur1WdvUEiWK64usRhVdPq7x61sJF+y/dXKu9esmZ5hPVV08rv3r2ybP9n26vsU+W7WO6Zk1V+Y0yvzXDAVnn18gna/eW5lOlfr3WL8v3MV01p6r9erlfVvBjunBOFfz1ij9YZ1OgSv56zV+W8RO69E5V/fWyP9jJR9X99cK/rOUndPGeKv3rtf+2+E9/PcE9rfoPsqCf0AITUf8HTQAAZuceoQCAJgGArOontERFiACgqQBglwGA0AFAEwJA1vYTi8hFUE/TAoDZqUeIAaCpASAL/Ak9bRB6AGiCANgVASAkAdA0AZBl/oROu4QqAJosAMxOPUIXAE0YAFnrT+i0R0gDoGkD4NupR4gDoKkDIAv+CZ22CH0ANIEAfDv1CIUANIkAZNU/obMeIRKAphKAb6ceIROAphOALP2ndNYjlALQpAKwawVAiAWgqQUgBYCUznqEXgCaYABSA0jptEVIBqBpBiBlgJTOO4RqAJpsAFIJSOnEQQgHoCkHIMWAlB75hHYAmngAUg9ILRo5wT5NP4DAemADCAEBNAUBpCpACzZAiAigqQgghYGUHvqEjgCakACBnX2EkgCalABSHUjpoU+ICaCpCSAFgpQeu4SeAJqgAFIkAI8efYSoAJqqAFIooLuPkBVA0xVASgWW7iOUBdCkBZBqAXj08CXUBdDkBZCKAd1/hL4AmsAAUjMAjx7+hMYAmsgAUjewfD9BP01mAKkcgEenD0JpAE1qgNC60wVCawBNbACpH5DnzMALloytYqazgmClpkJA1LKSTkqEEAGaEgGRfUImpAjQtAiQ8gJ93o0QI0BTIyBqSUnnREKQAE2RACkygEdnJUKUAE2VgMg+JROyBGi6BEipwdJ+6vSRRsqoJaXl9BJBSk2dgKg94EanNUKhAE2igKg950anNUKlAE2mACk9AH1SDgipAjStAmI7AwmxAjS1Alq5gkyrhFwBml4BUoOgywCEYgGaZAFxYD1gCIRoAZpqAVKIAMthQUK4AE25gNieFQnpAjTtAqQcAZbzhoR8AZp+AVKTAMuZQ0LDAE3EAKlL0NMaoWKAJmOAVCbIM6VA6BigCRkgtQmwnHoktAzQxAyQ+gR9FA8IOQM0PQOkREFPCxCR0wKhc4AmdIDULsBypJLQOkATO8CudgAhd4Cmd0BiT4uE4AGa4gFJy0o6LRKiB2iqByT2uZqQPUDTPUBKGRb4BCc15QPSNiXSSZkQP0BTP0AqGmA5WkooIKBJIJDakyKhgYAmgoDUNcB2OpXgnyaEgNQ26FFJKCGgSSGQWk+YA6GFgCaGgNQ36JxOqCGgySGQxvacTggioCki0EoidEogRBHQVBGQQgcwek4ghBHQlBHmtQfQyaTOCGmk/5u8yeKBVw3fvGpvtri5Od4Q+nXxsbsDg4X9TSNfF8xfPPv6bblgcfvT734GYfsz9NqfUdL+jLvf484u7v6edNen0P3s/i5kk+5D51mUwrsPYf/h+K+0+8D6a3p8oozXfegvZv3Ffn+x31/s9xf3zRG70fZDGPQfov5DDzXq/US9edz/Je4v7tspUs6zr9++nW5VkX/uu0T+T/RRJp4W3r0nXNwgIx/UfuoKiE9d0YbjssfNhou7s7bHu7NO7tKTt769fUeJUeLovn1LX35blAXnn/O6qRXIAYLM3HwWRXko1rxpH9KuuAsR5sh3cyfuV9y09yuuu3sBTw4T5K/vK6+PQeD0Begxuii2CKgoLjg5yovN/VYNH6DRJ1Yjrn7kfVX77qZS5I8B8pe6RVC8/73Kijs1LaCOZd2o9R3xiffJb7v3yZ88xv7JoyOydba+55tuwPDP+7zKGnGvGPIaIK+BG6kVr/W6PIhby5BH1PI2UVz2WO52ZSHuPDcZGDDkzo1xyh3OJ08RctQnsmP+OuamPsOmbqOxvV3+9CUonP046fNg7zk6jqTjB7cBYAkQGgKBWx4VjmTa24k3YiKK4VEJrsGueNU+Ebl7Gy0aTp6HM7Ln5LB9QjhKFQlOFW4N3PDb7LBtPrbEks+G/UhEDg3RQW7bnE54RF3hNkI3/DYv+IbuWR91R+CWO4438aJMhAYQ6zmZHGnuGNDuPUR1eajWCuEj1OZ+ho+7eT3pfk+6+dNxxjjORiTdUYYOHIPc+pMPx9mzPZd30ZqeReHsxLRoENZ2PjnjW1mbJMN8S7btq3LPqybnygQYoAEWuJGYFxuFHggYc1s08WIjXmWhUBXlPd+tV7pQnZ6PjnsCT8Ohoz89+0R4Adcvb71+yem55Vz+ueFVkW1zJWg+Cjtzc3S77R5IhkmBoiZqSS5+7nhj0gv14XG13bc4devUo9/bsuqeU42RMozU2WNLXcUTbrJbTrsXd8rLxYa6VEOO3GaW+/zufsN3WUvfx7zYlI/KYEIzTeg2mMxIeXhFH7pxQ81MauDxDBqNcUclOrxqjhyDt60f8+Z+z/aUQ7xwiNymlJPD/Pi4X+wST/uR29i4b5p9P1NZuhgBdcwrwqnMLRVvKi39hmjgRY5sbpp9UTYVX/P8IS/u5GpfgC0PzU51jhasrp3UNHu8GNOLFSkeNL4jm04+a94clAVjhMjuSM7WEudS1NGBWzPbZ+Pu2gcF48GCp43Y0ZcYKZu8zj5tuZLjA5xU3fo2r1FxQjhUJlpla+nkz5wyUP/1S7mwT/SJG5/lMo7Ip4htjkt/+aQSxcd0dGWxFu9d3KC3gKJqBF5E+W792zk87Al3OMX4bgm/LIhdDp7TQrdUVRZ7zqt1+z5fBAlnZua2H+9c9W9jRs6U4pJbn7bOjDYmmB3MLcGLlx9JmmXta9GRN5yGmGs/9nUMAxseWDAQG8EKPOOCaxf05ZD2ReTIG+YGc+VY3b/EBrMMBy10W4KVRVclNIOGZ2zflRudt8f+JZloZsFR892itmfKZOJNzx4ilZ+d/0P0JaFbq8VCyjb94/KoW9/K5U62bvIH3mb3bsdOrwBQNnBcSu6Z6+oCJYfQbdDs20cuXl5e4mThWIbufMt9tH0TjUmbuuUNkc42vMlytXIco+anbin7mBgpdzhve26rBeFP3VZGaH7rRZK+UpN0wkraa0PHHa1jgDmvzi4NcaJyXIftqT0tnnRiN2L1j0fb949Hw9s8nPZSt0HQPnbPKuzgPVUvV8V9JdiRDF0o5dRGxxPPSr5rHOg6aorZ5VjmOdvXuI8cK4tVQ8hDEYqkY8GsOhQiH6nEZ2hgs65LHGNGLGUZSsusG0Z9//bqVeI2ReEVDDXsMZPc2o9XMYTHCGF3rAihlQwFEfHQMWV2DqvjO1ERc/AK3FEvwksjqsVotojduN15FA9kxC1FmcJRvekciTqEWary0ShxXCHVvOnmdv7At5/ypsoatayBZzDX7m3yeps/qJtJvNxyHSjNLivyW7He6HpWCyDePrsl2u6p8dgFnvsdV21q8VzN/ridqVumulyLx/u+xLEX8t1h22QFLw81LjOpayoUQMcVOvaLVq+qW0Ts0HHM6fsQhvrFcSsofRiFfoTFcctMjCwExnGv0Doh5CCs6jqSVroyzvGg9U9/YCbpjnsk3Vor7QVbr9+geP2ywesXEo6nOFoQMvF06VEJEBYSHYn0mFU7bTmJ+ipyCzN6RTlK+kppyG1MdzvF9TbnRdM9o3Zf8dtcqf1FaMBEbu3EG1pqusNYPcdGK7tayime9RzFBp1fPvLh92v3/mAYOMoNpycJk0tlTGHPDeZhv8kaLk7CCBVOcacU4Ac4I0QfvH514482NfmIKI6Fvwch2om2sT2xRoxQrBzVBaLqEeMYObbskX+qmvUu+7zjdZ3d8Tr/r0KUECFzKSZ+WC72+Z5vxdT57ObDt2//D0hNGtkJ3wAA"; \ No newline at end of file diff --git a/docs/v1.0/assets/style.css b/docs/v1.0/assets/style.css index 778b9492..9d619a64 100644 --- a/docs/v1.0/assets/style.css +++ b/docs/v1.0/assets/style.css @@ -10,6 +10,7 @@ --light-color-text: #222; --light-color-text-aside: #6e6e6e; --light-color-link: #1f70c2; + --light-color-focus-outline: #3584e4; --light-color-ts-keyword: #056bd6; --light-color-ts-project: #b111c9; @@ -35,6 +36,7 @@ --light-color-ts-set-signature: var(--light-color-ts-accessor); --light-color-ts-type-alias: #d51270; /* reference not included as links will be colored with the kind that it points to */ + --light-color-document: #000000; --light-external-icon: url("data:image/svg+xml;utf8,"); --light-color-scheme: light; @@ -50,6 +52,7 @@ --dark-color-text: #f5f5f5; --dark-color-text-aside: #dddddd; --dark-color-link: #00aff4; + --dark-color-focus-outline: #4c97f2; --dark-color-ts-keyword: #3399ff; --dark-color-ts-project: #e358ff; @@ -75,6 +78,7 @@ --dark-color-ts-set-signature: var(--dark-color-ts-accessor); --dark-color-ts-type-alias: #ff6492; /* reference not included as links will be colored with the kind that it points to */ + --dark-color-document: #ffffff; --dark-external-icon: url("data:image/svg+xml;utf8,"); --dark-color-scheme: dark; @@ -92,6 +96,7 @@ --color-text: var(--light-color-text); --color-text-aside: var(--light-color-text-aside); --color-link: var(--light-color-link); + --color-focus-outline: var(--light-color-focus-outline); --color-ts-keyword: var(--light-color-ts-keyword); --color-ts-module: var(--light-color-ts-module); @@ -116,6 +121,7 @@ --color-ts-get-signature: var(--light-color-ts-get-signature); --color-ts-set-signature: var(--light-color-ts-set-signature); --color-ts-type-alias: var(--light-color-ts-type-alias); + --color-document: var(--light-color-document); --external-icon: var(--light-external-icon); --color-scheme: var(--light-color-scheme); @@ -134,6 +140,7 @@ --color-text: var(--dark-color-text); --color-text-aside: var(--dark-color-text-aside); --color-link: var(--dark-color-link); + --color-focus-outline: var(--dark-color-focus-outline); --color-ts-keyword: var(--dark-color-ts-keyword); --color-ts-module: var(--dark-color-ts-module); @@ -158,6 +165,7 @@ --color-ts-get-signature: var(--dark-color-ts-get-signature); --color-ts-set-signature: var(--dark-color-ts-set-signature); --color-ts-type-alias: var(--dark-color-ts-type-alias); + --color-document: var(--dark-color-document); --external-icon: var(--dark-external-icon); --color-scheme: var(--dark-color-scheme); @@ -183,6 +191,7 @@ body { --color-text: var(--light-color-text); --color-text-aside: var(--light-color-text-aside); --color-link: var(--light-color-link); + --color-focus-outline: var(--light-color-focus-outline); --color-ts-keyword: var(--light-color-ts-keyword); --color-ts-module: var(--light-color-ts-module); @@ -207,6 +216,7 @@ body { --color-ts-get-signature: var(--light-color-ts-get-signature); --color-ts-set-signature: var(--light-color-ts-set-signature); --color-ts-type-alias: var(--light-color-ts-type-alias); + --color-document: var(--light-color-document); --external-icon: var(--light-external-icon); --color-scheme: var(--light-color-scheme); @@ -223,6 +233,7 @@ body { --color-text: var(--dark-color-text); --color-text-aside: var(--dark-color-text-aside); --color-link: var(--dark-color-link); + --color-focus-outline: var(--dark-color-focus-outline); --color-ts-keyword: var(--dark-color-ts-keyword); --color-ts-module: var(--dark-color-ts-module); @@ -247,11 +258,17 @@ body { --color-ts-get-signature: var(--dark-color-ts-get-signature); --color-ts-set-signature: var(--dark-color-ts-set-signature); --color-ts-type-alias: var(--dark-color-ts-type-alias); + --color-document: var(--dark-color-document); --external-icon: var(--dark-external-icon); --color-scheme: var(--dark-color-scheme); } +*:focus-visible, +.tsd-accordion-summary:focus-visible svg { + outline: 2px solid var(--color-focus-outline); +} + .always-visible, .always-visible .tsd-signatures { display: inherit !important; @@ -266,16 +283,6 @@ h6 { line-height: 1.2; } -h1 > a:not(.link), -h2 > a:not(.link), -h3 > a:not(.link), -h4 > a:not(.link), -h5 > a:not(.link), -h6 > a:not(.link) { - text-decoration: none; - color: var(--color-text); -} - h1 { font-size: 1.875rem; margin: 0.67rem 0; @@ -306,10 +313,6 @@ h6 { margin: 2.33rem 0; } -.uppercase { - text-transform: uppercase; -} - dl, menu, ol, @@ -333,7 +336,7 @@ footer { padding-bottom: 1rem; max-height: 3.5rem; } -.tsd-generator { +footer > p { margin: 0 1em; } @@ -421,6 +424,9 @@ a.external[target="_blank"] { background-repeat: no-repeat; padding-right: 13px; } +a.tsd-anchor-link { + color: var(--color-text); +} code, pre { @@ -580,13 +586,13 @@ dl.tsd-comment-tag-group p { } .tsd-filter-input { display: flex; - width: fit-content; width: -moz-fit-content; + width: fit-content; align-items: center; - user-select: none; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; + user-select: none; cursor: pointer; } .tsd-filter-input input[type="checkbox"] { @@ -609,11 +615,8 @@ dl.tsd-comment-tag-group p { Don't remove unless you know what you're doing. */ opacity: 0.99; } -.tsd-filter-input input[type="checkbox"]:focus + svg { - transform: scale(0.95); -} -.tsd-filter-input input[type="checkbox"]:focus:not(:focus-visible) + svg { - transform: scale(1); +.tsd-filter-input input[type="checkbox"]:focus-visible + svg { + outline: 2px solid var(--color-focus-outline); } .tsd-checkbox-background { fill: var(--color-accent); @@ -630,13 +633,18 @@ input[type="checkbox"]:checked ~ svg .tsd-checkbox-checkmark { stroke: var(--color-accent); } -.tsd-theme-toggle { - padding-top: 0.75rem; +.settings-label { + font-weight: bold; + text-transform: uppercase; + display: inline-block; } -.tsd-theme-toggle > h4 { - display: inline; - vertical-align: middle; - margin-right: 0.75rem; + +.tsd-filter-visibility .settings-label { + margin: 0.75rem 0 0.5rem 0; +} + +.tsd-theme-toggle .settings-label { + margin: 0.75rem 0.75rem 0 0; } .tsd-hierarchy { @@ -769,6 +777,9 @@ input[type="checkbox"]:checked ~ svg .tsd-checkbox-checkmark { padding: 0; max-width: 100%; } +.tsd-navigation .tsd-nav-link { + display: none; +} .tsd-nested-navigation { margin-left: 3rem; } @@ -782,6 +793,15 @@ input[type="checkbox"]:checked ~ svg .tsd-checkbox-checkmark { margin-left: -1.5rem; } +.tsd-page-navigation-section { + margin-left: 10px; +} +.tsd-page-navigation-section > summary { + padding: 0.25rem; +} +.tsd-page-navigation-section > div { + margin-left: 20px; +} .tsd-page-navigation ul { padding-left: 1.75rem; } @@ -812,10 +832,10 @@ a.tsd-index-link { } .tsd-accordion-summary, .tsd-accordion-summary a { - user-select: none; -moz-user-select: none; -webkit-user-select: none; -ms-user-select: none; + user-select: none; cursor: pointer; } @@ -828,8 +848,9 @@ a.tsd-index-link { padding-top: 0; padding-bottom: 0; } -.tsd-index-accordion .tsd-accordion-summary > svg { +.tsd-accordion .tsd-accordion-summary > svg { margin-left: 0.25rem; + vertical-align: text-top; } .tsd-index-content > :not(:first-child) { margin-top: 0.75rem; @@ -877,7 +898,7 @@ a.tsd-index-link { } .tsd-panel-group { - margin: 4rem 0; + margin: 2rem 0; } .tsd-panel-group.tsd-index-group { margin: 2rem 0; @@ -885,6 +906,9 @@ a.tsd-index-link { .tsd-panel-group.tsd-index-group details { margin: 2rem 0; } +.tsd-panel-group > .tsd-accordion-summary { + margin-bottom: 1rem; +} #tsd-search { transition: background-color 0.2s; @@ -1034,6 +1058,12 @@ a.tsd-index-link { border-width: 1px 0; transition: background-color 0.1s; } +.tsd-signatures .tsd-index-signature:not(:last-child) { + margin-bottom: 1em; +} +.tsd-signatures .tsd-index-signature .tsd-signature { + border-width: 1px; +} .tsd-description .tsd-signatures .tsd-signature { border-width: 1px; } @@ -1347,6 +1377,12 @@ img { .has-menu .tsd-navigation { max-height: 100%; } + #tsd-toolbar-links { + display: none; + } + .tsd-navigation .tsd-nav-link { + display: flex; + } } /* one sidebar */ diff --git a/docs/v1.0/classes/p2p_media_loader_core.Core.html b/docs/v1.0/classes/p2p_media_loader_core.Core.html index e9909f69..a2b717b2 100644 --- a/docs/v1.0/classes/p2p_media_loader_core.Core.html +++ b/docs/v1.0/classes/p2p_media_loader_core.Core.html @@ -1,4 +1,4 @@ -Core | P2P Media Loader Documentation

Core class for managing media streams loading via P2P.

-

Type Parameters

Constructors

Type Parameters

Constructors

  • Constructs a new Core instance with optional initial configuration.

    -

    Type Parameters

    Parameters

    • Optional config: Partial<CoreConfig>

      Optional partial configuration to override default settings.

      -

    Returns Core<TStream>

    Example

    // Create a Core instance with custom configuration for HTTP and P2P downloads.
    const core = new Core({
    simultaneousHttpDownloads: 5,
    simultaneousP2PDownloads: 5,
    httpErrorRetries: 5,
    p2pErrorRetries: 5
    }); -
    -

    Example

    // Create a Core instance using the default configuration.
    const core = new Core(); -
    -

Properties

DEFAULT_COMMON_CORE_CONFIG: CommonCoreConfig = ...

Default configuration for common core settings.

-
DEFAULT_STREAM_CONFIG: StreamConfig = ...

Default configuration for stream settings.

-

Methods

  • Retrieves the current configuration for the core instance, ensuring immutability.

    +

Constructors

  • Constructs a new Core instance with optional initial configuration.

    +

    Type Parameters

    Parameters

    • Optionalconfig: Partial<CoreConfig>

      Optional partial configuration to override default settings.

      +

    Returns Core<TStream>

    // Create a Core instance with custom configuration for HTTP and P2P downloads.
    const core = new Core({
    simultaneousHttpDownloads: 5,
    simultaneousP2PDownloads: 5,
    httpErrorRetries: 5,
    p2pErrorRetries: 5
    }); +
    + +
    // Create a Core instance using the default configuration.
    const core = new Core(); +
    + +

Properties

DEFAULT_COMMON_CORE_CONFIG: CommonCoreConfig = ...

Default configuration for common core settings.

+
DEFAULT_STREAM_CONFIG: StreamConfig = ...

Default configuration for stream settings.

+

Methods

  • Applies a set of dynamic configuration updates to the core, merging with the existing configuration.

    +
  • Applies a set of dynamic configuration updates to the core, merging with the existing configuration.

    Parameters

    Returns void

    Example

    // Example of dynamically updating the download time windows and timeout settings.
    const dynamicConfig = {
    httpDownloadTimeWindowMs: 60, // Set HTTP download time window to 60 seconds
    p2pDownloadTimeWindowMs: 60, // Set P2P download time window to 60 seconds
    httpNotReceivingBytesTimeoutMs: 1500, // Set HTTP timeout to 1500 milliseconds
    p2pNotReceivingBytesTimeoutMs: 1500 // Set P2P timeout to 1500 milliseconds
    };
    core.applyDynamicConfig(dynamicConfig); -
    -
  • Adds an event listener for the specified event type on the core event target.

    +

Returns void

// Example of dynamically updating the download time windows and timeout settings.
const dynamicConfig = {
httpDownloadTimeWindowMs: 60, // Set HTTP download time window to 60 seconds
p2pDownloadTimeWindowMs: 60, // Set P2P download time window to 60 seconds
httpNotReceivingBytesTimeoutMs: 1500, // Set HTTP timeout to 1500 milliseconds
p2pNotReceivingBytesTimeoutMs: 1500 // Set P2P timeout to 1500 milliseconds
};
core.applyDynamicConfig(dynamicConfig); +
+ +
  • Adds an event listener for the specified event type on the core event target.

    Type Parameters

    Parameters

    • eventName: K

      The name of the event to listen for.

    • listener: CoreEventMap[K]

      The callback function to invoke when the event is fired.

      -

    Returns void

  • Removes an event listener for the specified event type on the core event target.

    +

Returns void

  • Removes an event listener for the specified event type on the core event target.

    Type Parameters

    Parameters

    • eventName: K

      The name of the event to listen for.

    • listener: CoreEventMap[K]

      The callback function to be removed.

      -

    Returns void

  • Sets the response URL for the manifest, stripping any query parameters.

    +

Returns void

  • Sets the response URL for the manifest, stripping any query parameters.

    Parameters

    • url: string

      The full URL to the manifest response.

      -

    Returns void

  • Checks if a segment is already stored within the core.

    +

Returns void

  • Checks if a segment is already stored within the core.

    Parameters

    • segmentRuntimeId: string

      The runtime identifier of the segment to check.

    Returns boolean

    true if the segment is present, otherwise false.

    -
  • Retrieves a specific stream by its runtime identifier, if it exists.

    Parameters

    • streamRuntimeId: string

      The runtime identifier of the stream to retrieve.

    Returns undefined | StreamWithSegments<TStream>

    The stream with its segments, or undefined if not found.

    -
  • Ensures a stream exists in the map; adds it if it does not.

    +
  • Ensures a stream exists in the map; adds it if it does not.

    Parameters

    • stream: TStream

      The stream to potentially add to the map.

      -

    Returns void

  • Updates the segments associated with a specific stream.

    +

Returns void

  • Updates the segments associated with a specific stream.

    Parameters

    • streamRuntimeId: string

      The runtime identifier of the stream to update.

      -
    • Optional addSegments: Iterable<Segment>

      Optional segments to add to the stream.

      -
    • Optional removeSegmentIds: Iterable<string>

      Optional segment IDs to remove from the stream.

      -

    Returns void

  • Loads a segment given its runtime identifier and invokes the provided callbacks during the process. +

  • OptionaladdSegments: Iterable<Segment>

    Optional segments to add to the stream.

    +
  • OptionalremoveSegmentIds: Iterable<string>

    Optional segment IDs to remove from the stream.

    +

Returns void

  • Loads a segment given its runtime identifier and invokes the provided callbacks during the process. Initializes segment storage if it has not been initialized yet.

    Parameters

    • segmentRuntimeId: string

      The runtime identifier of the segment to load.

    • callbacks: EngineCallbacks

      The callbacks to be invoked during segment loading.

      -

    Returns Promise<void>

    Throws

      +

Returns Promise<void>

  • Throws if the manifest response URL is not defined.
-
  • Aborts the loading of a segment specified by its runtime identifier.

    +
  • Aborts the loading of a segment specified by its runtime identifier.

    Parameters

    • segmentRuntimeId: string

      The runtime identifier of the segment whose loading is to be aborted.

      -

    Returns void

  • Updates the playback parameters while play head moves, specifically position and playback rate, for stream loaders.

    +

Returns void

  • Updates the playback parameters while play head moves, specifically position and playback rate, for stream loaders.

    Parameters

    • position: number

      The new position in the stream, in seconds.

    • rate: number

      The new playback rate.

      -

    Returns void

  • Sets the active level bitrate, used for adjusting quality levels in adaptive streaming. +

Returns void

  • Sets the active level bitrate, used for adjusting quality levels in adaptive streaming. Notifies the stream loaders if a change occurs.

    Parameters

    • bitrate: number

      The new bitrate to set as active.

      -

    Returns void

  • Updates the 'isLive' status of the stream.

    +

Returns void

  • Updates the 'isLive' status of the stream.

    Parameters

    • isLive: boolean

      Boolean indicating whether the stream is live.

      -

    Returns void

  • Identify if a segment is loadable by the P2P core based on the segment's stream type and configuration.

    +

Returns void

  • Identify if a segment is loadable by the P2P core based on the segment's stream type and configuration.

    Parameters

    • segmentRuntimeId: string

      Segment runtime identifier to check.

    Returns boolean

    true if the segment is loadable by the P2P core, otherwise false.

    -
  • Cleans up resources used by the Core instance, including destroying any active stream loaders +

  • Cleans up resources used by the Core instance, including destroying any active stream loaders and clearing stored segments.

    -

    Returns void

\ No newline at end of file + diff --git a/docs/v1.0/classes/p2p_media_loader_core.CoreRequestError.html b/docs/v1.0/classes/p2p_media_loader_core.CoreRequestError.html index 7ebd7db1..299ae0d8 100644 --- a/docs/v1.0/classes/p2p_media_loader_core.CoreRequestError.html +++ b/docs/v1.0/classes/p2p_media_loader_core.CoreRequestError.html @@ -1,4 +1,4 @@ -CoreRequestError | P2P Media Loader Documentation

Custom error class for errors that occur during core network requests.

-

Hierarchy

  • Error
    • CoreRequestError

Constructors

Hierarchy

  • Error
    • CoreRequestError

Constructors

Properties

Constructors

  • Constructs a new CoreRequestError.

    -

    Parameters

    • type: "failed" | "aborted"

      The type of the error, either 'failed' or 'aborted'.

      -

    Returns CoreRequestError

Properties

type: "failed" | "aborted"

The type of the error, either 'failed' or 'aborted'.

-
\ No newline at end of file + diff --git a/docs/v1.0/classes/p2p_media_loader_core.RequestError.html b/docs/v1.0/classes/p2p_media_loader_core.RequestError.html index 1e65b941..a2196333 100644 --- a/docs/v1.0/classes/p2p_media_loader_core.RequestError.html +++ b/docs/v1.0/classes/p2p_media_loader_core.RequestError.html @@ -1,4 +1,4 @@ -RequestError | P2P Media Loader Documentation

Represents an error that can occur during the request process, with a timestamp for when the error occurred.

Type Parameters

Hierarchy

  • Error
    • RequestError

Constructors

Hierarchy

  • Error
    • RequestError

Constructors

Properties

Constructors

  • Constructs a new RequestError.

    +

Constructors

Properties

timestamp: number

Error timestamp.

-
type: T

The specific error type.

-
\ No newline at end of file + diff --git a/docs/v1.0/classes/p2p_media_loader_hlsjs.HlsJsP2PEngine.html b/docs/v1.0/classes/p2p_media_loader_hlsjs.HlsJsP2PEngine.html index 9e73fb01..91b5a2b0 100644 --- a/docs/v1.0/classes/p2p_media_loader_hlsjs.HlsJsP2PEngine.html +++ b/docs/v1.0/classes/p2p_media_loader_hlsjs.HlsJsP2PEngine.html @@ -1,4 +1,4 @@ -HlsJsP2PEngine | P2P Media Loader Documentation

P2P Media Loader Documentation

  • GitHub
  • -
  • NPM Packages
      +
    • NPM Packages +

      P2P Media Loader is an open-source JavaScript library that leverages modern web browser features, such as HTML5 video and WebRTC, to enable media delivery over peer-to-peer (P2P) networks. It integrates smoothly with many popular HTML5 video players and works entirely without browser plugins or add-ons. Experience it in action with the demo.

      P2P Media Loader can be bundled in your project as an npm package or used through a CDN. Below are examples of both methods.

      -

      Using P2P Media Loader with npm

      To include P2P Media Loader in your project using npm, follow these steps:

      +

      To include P2P Media Loader in your project using npm, follow these steps:

        -
      1. Install the package via npm:

        +
      2. +

        Install the package via npm:

          -
        • For HLS.js integration:

          -
          npm install p2p-media-loader-hlsjs
          -
          +
        • +

          For HLS.js integration:

          +
          npm install p2p-media-loader-hlsjs
          +
          +
        • -
        • For Shaka Player integration:

          -
          npm install p2p-media-loader-shaka
          -
          +
        • +

          For Shaka Player integration:

          +
          npm install p2p-media-loader-shaka
          +
          +
      3. -
      4. Provide Node.js polyfills

        +
      5. +

        Provide Node.js polyfills

        To ensure the P2P Media Loader works correctly in a browser environment, you must provide Node.js polyfills required by bittorrent-tracker dependency.

          -
        • Vite configuration example:

          -
          // vite.config.ts
          import { defineConfig } from "vite";
          import { nodePolyfills } from "vite-plugin-node-polyfills";

          export default defineConfig({
          plugins: [nodePolyfills()],
          }); -
          +
        • +

          Vite configuration example:

          +
          // vite.config.ts
          import { defineConfig } from "vite";
          import { nodePolyfills } from "vite-plugin-node-polyfills";

          export default defineConfig({
          plugins: [nodePolyfills()],
          }); +
          +
        • -
        • Webpack configuration example:

          -
          // webpack.config.mjs
          import NodePolyfillPlugin from "node-polyfill-webpack-plugin";

          export default {
          plugins: [new NodePolyfillPlugin({ additionalAliases: ["process"] })],
          }; -
          +
        • +

          Webpack configuration example:

          +
          // webpack.config.mjs
          import NodePolyfillPlugin from "node-polyfill-webpack-plugin";

          export default {
          plugins: [new NodePolyfillPlugin({ additionalAliases: ["process"] })],
          }; +
          +
      6. -
      7. Import and use it in your project:

        +
      8. +

        Import and use it in your project:

          -
        • HLS.js integration:

          -
          import Hls from "hls.js";
          import { HlsJsP2PEngine } from "p2p-media-loader-hlsjs";

          const HlsWithP2P = HlsJsP2PEngine.injectMixin(Hls); -
          +
        • +

          HLS.js integration:

          +
          import Hls from "hls.js";
          import { HlsJsP2PEngine } from "p2p-media-loader-hlsjs";

          const HlsWithP2P = HlsJsP2PEngine.injectMixin(Hls); +
          +
        • -
        • Shaka Player integration:

          -
          import shaka from "shaka-player/dist/shaka-player.ui";
          import { ShakaP2PEngine } from "p2p-media-loader-shaka";

          ShakaP2PEngine.registerPlugins(shaka); -
          +
        • +

          Shaka Player integration:

          +
          import shaka from "shaka-player/dist/shaka-player.ui";
          import { ShakaP2PEngine } from "p2p-media-loader-shaka";

          ShakaP2PEngine.registerPlugins(shaka); +
          +

      For more examples with npm packages, you may check our React demo

      -

      Using P2P Media Loader with CDN via JavaScript Modules

      P2P Media Loader supports many players that use Hls.js as media engine. Lets pick Vidstack player for extended hlsjs example:

      -

      Integrating P2P with Vidstack and Hls.js

      <!doctype html>
      <html>
      <head>
      <!-- Include Hls.js library from CDN -->
      <script src="https://cdn.jsdelivr.net/npm/hls.js@~1/dist/hls.min.js"></script>

      <!-- Import map for P2P Media Loader modules -->
      <script type="importmap">
      {
      "imports": {
      "p2p-media-loader-core": "https://cdn.jsdelivr.net/npm/p2p-media-loader-core@^1/dist/p2p-media-loader-core.es.min.js",
      "p2p-media-loader-hlsjs": "https://cdn.jsdelivr.net/npm/p2p-media-loader-hlsjs@^1/dist/p2p-media-loader-hlsjs.es.min.js"
      }
      }
      </script>

      <!-- Include Vidstack player stylesheets -->
      <link rel="stylesheet" href="https://cdn.vidstack.io/player/theme.css" />
      <link rel="stylesheet" href="https://cdn.vidstack.io/player/video.css" />

      <!-- Include Vidstack player library from CDN -->
      <script src="https://cdn.vidstack.io/player" type="module"></script>

      <!-- Module script to initialize Vidstack player with P2P Media Loader -->
      <script type="module">
      import { HlsJsP2PEngine } from "p2p-media-loader-hlsjs";

      const player = document.querySelector("media-player");
      // Inject P2P capabilities into Hls.js
      const HlsWithP2P = HlsJsP2PEngine.injectMixin(window.Hls);

      player.addEventListener("provider-change", (event) => {
      const provider = event.detail;

      // Check if the provider is HLS
      if (provider?.type === "hls") {
      provider.library = HlsWithP2P;

      provider.config = {
      p2p: {
      core: {
      swarmId: "Optional custom swarm ID for stream",
      // other P2P engine config parameters go here
      },
      onHlsJsCreated: (hls) => {
      hls.p2pEngine.addEventListener("onPeerConnect", (params) => {
      console.log("Peer connected:", params.peerId);
      });
      // Subscribe to P2P engine and Hls.js events here
      },
      },
      };
      }
      });
      </script>
      </head>

      <body>
      <div style="width: 800px">
      <!-- Vidstack media player with HLS stream -->
      <media-player src="streamUrl">
      <media-provider></media-provider>
      <media-video-layout></media-video-layout>
      </media-player>
      </div>
      </body>
      </html> -
      -

      Integrating P2P with raw Hls.js player

      <script type="module">
      import { HlsJsP2PEngine } from "p2p-media-loader-hlsjs";

      const videoElement = document.querySelector("#video");

      const HlsWithP2P = HlsJsP2PEngine.injectMixin(window.Hls);

      const hls = new HlsWithP2P({
      p2p: {
      core: {
      swarmId: "Optional custom swarm ID for stream",
      // Other P2P engine config parameters go here
      },
      onHlsJsCreated(hls) {
      hls.p2pEngine.addEventListener("onPeerConnect", (params) => {
      console.log("Peer connected:", params.peerId);
      });
      // Subscribe to P2P engine and Hls.js events here
      },
      },
      });

      hls.attachMedia(videoElement);
      hls.loadSource(streamUrl);
      </script> -
      -

      Integrating P2P with PlayerJS and Hls.js

      <script type="module">
      import { HlsJsP2PEngine } from "p2p-media-loader-hlsjs";

      window.Hls = HlsJsP2PEngine.injectMixin(window.Hls);

      const player = new Playerjs({
      id: "player",
      hlsconfig: {
      p2p: {
      core: {
      swarmId: "Optional custom swarm ID for stream",
      // Other P2P engine config parameters go here
      },
      onHlsJsCreated: (hls) => {
      // Subscribe to P2P engine and Hls.js events here
      hls.p2pEngine.addEventListener("onPeerConnect", (details) => {
      console.log(`Connected to peer ${details.peerId})`);
      });
      },
      },
      },
      });
      </script> -
      -

      Integrating P2P with DPlayer and Hls.js

      <script type="module">
      import { HlsJsP2PEngine } from "p2p-media-loader-hlsjs";

      const videoContainer = document.querySelector("#player");

      const player = new DPlayer({
      container: videoContainer,
      video: {
      url: "",
      type: "customHls",
      customType: {
      customHls: (video) => {
      const HlsWithP2P = HlsJsP2PEngine.injectMixin(window.Hls);

      const hls = new HlsWithP2P({
      p2p: {
      core: {
      swarmId: "Optional custom swarm ID for stream",
      // Other P2P engine config parameters go here
      },
      },
      });

      hls.attachMedia(video);
      hls.loadSource(streamUrl);
      },
      },
      },
      });

      player.play();
      </script> -
      -

      Integrating P2P with Clappr and Hls.js

      <script type="module">
      import { HlsJsP2PEngine } from "p2p-media-loader-hlsjs";

      const engine = new HlsJsP2PEngine({
      p2p: {
      core: {
      swarmId: "Optional custom swarm ID for stream",
      // Other P2P engine config parameters go here
      },
      },
      });

      const player = new Clappr.Player({
      source: streamUrl,
      plugins: [LevelSelector], // https://cdn.jsdelivr.net/gh/clappr/clappr-level-selector-plugin@~0/dist/level-selector.min.js
      height: "100%",
      width: "100%",
      parentId: `#player`,
      playback: {
      hlsjsConfig: {
      ...engine.getConfigForHlsJs(),
      },
      },
      });

      engine.bindHls(() => clapprPlayer.core.getCurrentPlayback()?._hls);
      </script> -
      -

      Integrating P2P with MediaElement and Hls.js

      <script type="module">
      import { HlsJsP2PEngine } from "p2p-media-loader-hlsjs";

      const videoElement = document.querySelector("#video");

      window.Hls = HlsJsP2PEngine.injectMixin(window.Hls);

      const player = new MediaElementPlayer(videoElement.id, {
      videoHeight: "100%",
      hls: {
      p2p: {
      core: {
      swarmId: "Optional custom swarm ID for stream",
      // Other P2P engine config parameters go here
      },
      onHlsJsCreated: (hls) => {
      // Subscribe to P2P engine and Hls.js events here
      },
      },
      },
      });

      player.setSrc(streamUrl);
      player.load();
      </script> -
      -

      Integrating P2P with Plyr and Hls.js

      <script type="module">
      import { HlsJsP2PEngine } from "p2p-media-loader-hlsjs";

      const videoElement = document.querySelector("#video");

      const HlsWithP2P = HlsJsP2PEngine.injectMixin(window.Hls);

      const hls = new HlsWithP2P({
      p2p: {
      core: {
      swarmId: "Optional custom swarm ID for stream",
      // Other P2P engine config parameters go here
      },
      onHlsJsCreated(hls) {
      // Subscribe to P2P engine and Hls.js events here
      },
      },
      });

      hls.on(Hls.Events.MANIFEST_PARSED, () => {
      const levels = hls.levels;

      const quality = {
      default: levels[levels.length - 1].height,
      options: levels.map((level) => level.height),
      forced: true,
      onChange: (newQuality) => {
      levels.forEach((level, levelIndex) => {
      if (level.height === newQuality) {
      hls.currentLevel = levelIndex;
      }
      });
      },
      };

      player = new Plyr(videoElement, {
      quality,
      autoplay: true,
      muted: true,
      });
      });

      hls.attachMedia(videoElement);
      hls.loadSource(streamUrl);
      </script> -
      -

      Integrating P2P with OpenPlayerJS and Hls.js

      <script type="module">
      import { HlsJsP2PEngine } from "p2p-media-loader-hlsjs";

      const videoElement = document.querySelector("#video");
      const HlsWithP2P = HlsJsP2PEngine.injectMixin(window.Hls);

      const player = new OpenPlayerJS(videoElement, {
      hls: {
      p2p: {
      core: {
      swarmId: "Optional custom swarm ID for stream",
      // Other P2P engine config parameters go here
      },
      onHlsJsCreated: (hls) => {
      // Subscribe to P2P engine and Hls.js events here
      },
      },
      },
      controls: {
      layers: {
      left: ["play", "time", "volume"],
      right: ["settings", "fullscreen", "levels"],
      middle: ["progress"],
      },
      },
      });

      player.src = [
      {
      src: streamUrl,
      type: "application/x-mpegURL",
      },
      ];

      player.init();
      </script> -
      -

      Integrating P2P with Shaka Player

      Shaka player is used for an extended example:

      -
      <!doctype html>
      <html>
      <head>
      <!-- Link to Shaka Player's CSS for controls -->
      <link
      rel="stylesheet"
      type="text/css"
      href="https://unpkg.com/shaka-player/dist/controls.css"
      />

      <!-- Link to Shaka Player's compiled UI script -->
      <script src="https://unpkg.com/shaka-player/dist/shaka-player.ui.js"></script>

      <!-- Import map for P2P Media Loader modules -->
      <script type="importmap">
      {
      "imports": {
      "p2p-media-loader-core": "https://cdn.jsdelivr.net/npm/p2p-media-loader-core@^1/dist/p2p-media-loader-core.es.min.js",
      "p2p-media-loader-shaka": "https://cdn.jsdelivr.net/npm/p2p-media-loader-shaka@^1/dist/p2p-media-loader-shaka.es.min.js"
      }
      }
      </script>

      <!-- Module script to initialize Shaka Player with P2P Media Loader -->
      <script type="module">
      import { ShakaP2PEngine } from "p2p-media-loader-shaka";

      // Register P2P Media Loader plugins with Shaka
      ShakaP2PEngine.registerPlugins();

      async function init() {
      // Get the video element by its ID
      const video = document.getElementById("video");

      // Get Shaka UI controls and player
      const ui = video["ui"];
      const controls = ui.getControls();
      const player = controls.getPlayer();

      // Initialize P2P Media Loader with custom config
      const shakaP2PEngine = new ShakaP2PEngine({
      core: {
      swarmId: "Optional custom swarm ID for stream",
      // Other P2P engine config parameters go here
      },
      });

      //Subscribe to P2P engine events here
      shakaP2PEngine.addEventListener("onPeerConnect", (params) => {
      console.log("Peer connected:", params.peerId);
      });

      // Configure and initialize Shaka Player with P2P Media Loader
      shakaP2PEngine.bindShakaPlayer(player);

      // Load the stream URL into the player
      player.load(streamUrl);
      }

      // Add event listener for Shaka UI loaded event to trigger initialization
      document.addEventListener("shaka-ui-loaded", init);
      </script>
      </head>

      <body>
      <div data-shaka-player-container style="max-width:40em">
      <!-- Video element with Shaka Player UI -->
      <video
      autoplay
      data-shaka-player
      id="video"
      style="width:100%;height:100%"
      ></video>
      </div>
      </body>
      </html> -
      -

      Integrating P2P with Clappr and Shaka Player

      <script type="module">
      import { ShakaP2PEngine } from "p2p-media-loader-shaka";

      const container = document.getElementById("container");

      ShakaP2PEngine.registerPlugins();

      const shakaP2PEngine = new ShakaP2PEngine({
      core: {
      swarmId: "Optional custom swarm ID for stream",
      // Other P2P Media Loader Core options
      },
      });

      const player = new Clappr.Player({
      parentId: `#${container.id}`,
      source: streamUrl,
      plugins: [window.DashShakaPlayback, window.LevelSelector],
      shakaOnBeforeLoad: (shakaPlayerInstance) => {
      subscribeToUiEvents({
      engine: shakaP2PEngine,
      onPeerConnect,
      onPeerDisconnect,
      onChunkDownloaded,
      onChunkUploaded,
      });

      shakaP2PEngine.bindShakaPlayer(shakaPlayerInstance);
      },
      });
      </script> -
      -

      Integrating P2P with DPlayer and Shaka Player

      <script type="module">
      import { ShakaP2PEngine } from "p2p-media-loader-shaka";

      const container = document.getElementById("container");

      ShakaP2PEngine.registerPlugins();

      const shakaP2PEngine = new ShakaP2PEngine({
      core: {
      swarmId: "Optional custom swarm ID for stream",
      // Other P2P Media Loader Core options
      },
      });

      const player = new DPlayer({
      container,
      video: {
      url: "",
      type: "customHlsOrDash",
      customType: {
      customHlsOrDash: (video) => {
      const shakaPlayer = new shaka.Player();
      void shakaPlayer.attach(video);

      shakaP2PEngine.bindShakaPlayer(shakaPlayer);
      void shakaPlayer.load(streamUrl);
      },
      },
      },
      });
      </script> -
      -

      Integrating P2P with Plyr and Shaka Player

      <script type="module">
      import { ShakaP2PEngine } from "p2p-media-loader-shaka";

      ShakaP2PEngine.registerPlugins();

      const videoElement = document.getElementById("video");

      const initPlayer = () => {
      const shakaP2PEngine = new ShakaP2PEngine({
      core: {
      swarmId: "Optional custom swarm ID for stream",
      // Other P2P Media Loader Core options
      },
      });
      const shakaPlayer = new shaka.Player();

      shakaPlayer.attach(videoElement);

      shakaP2PEngine.bindShakaPlayer(shakaPlayer);

      shakaPlayer.load(streamUrl);

      const plyrPlayer = new Plyr(videoElement);
      };

      initPlayer();
      </script> -
      -
\ No newline at end of file + diff --git a/docs/v1.0/modules/p2p_media_loader_core.html b/docs/v1.0/modules/p2p_media_loader_core.html index 41fabee2..9b661a93 100644 --- a/docs/v1.0/modules/p2p_media_loader_core.html +++ b/docs/v1.0/modules/p2p_media_loader_core.html @@ -1,4 +1,4 @@ -p2p-media-loader-core | P2P Media Loader Documentation
ByteRange: {
    start: number;
    end: number;
}

Represents a range of bytes, used for specifying a segment of data to download.

+
ByteRange: {
    start: number;
    end: number;
}

Represents a range of bytes, used for specifying a segment of data to download.

Type declaration

  • start: number

    The starting byte index of the range.

  • end: number

    The ending byte index of the range.

    -
\ No newline at end of file + diff --git a/docs/v1.0/types/p2p_media_loader_core.CommonCoreConfig.html b/docs/v1.0/types/p2p_media_loader_core.CommonCoreConfig.html index 390e3cfc..7e428be8 100644 --- a/docs/v1.0/types/p2p_media_loader_core.CommonCoreConfig.html +++ b/docs/v1.0/types/p2p_media_loader_core.CommonCoreConfig.html @@ -1,4 +1,4 @@ -CommonCoreConfig | P2P Media Loader Documentation
CommonCoreConfig: {
    cachedSegmentExpiration?: number;
    cachedSegmentsCount: number;
}

Represents the configuration for the Core functionality that is common to all streams.

-

Type declaration

  • Optional cachedSegmentExpiration?: number

    Time after which a cached segment expires, in seconds. +

    CommonCoreConfig: {
        cachedSegmentExpiration?: number;
        cachedSegmentsCount: number;
    }

    Represents the configuration for the Core functionality that is common to all streams.

    +

    Type declaration

    • OptionalcachedSegmentExpiration?: number

      Time after which a cached segment expires, in seconds. If set to undefined, the cacheSegmentExpiration is disabled for VOD streams, and a default value (20 minutes) is used for live streams.

      -

      Default

      cachedSegmentExpiration: undefined
      -
      +
      cachedSegmentExpiration: undefined
      +
      +
    • cachedSegmentsCount: number

      Maximum number of segments to store in the cache. Has to be less then httpDownloadTimeWindow and p2pDownloadTimeWindow. If set to 0, the cache is unlimited.

      -

      Default

      cachedSegmentsCount: 0
      -
      -
    \ No newline at end of file + diff --git a/docs/v1.0/types/p2p_media_loader_core.CoreConfig.html b/docs/v1.0/types/p2p_media_loader_core.CoreConfig.html index 43b2c17e..d588c511 100644 --- a/docs/v1.0/types/p2p_media_loader_core.CoreConfig.html +++ b/docs/v1.0/types/p2p_media_loader_core.CoreConfig.html @@ -1,4 +1,4 @@ -CoreConfig | P2P Media Loader Documentation
    CoreConfig: Partial<StreamConfig> & Partial<CommonCoreConfig> & {
        mainStream?: Partial<StreamConfig>;
        secondaryStream?: Partial<StreamConfig>;
    }

    Represents a set of configuration parameters that can be used to override or extend the +

    CoreConfig: Partial<StreamConfig> & Partial<CommonCoreConfig> & {
        mainStream?: Partial<StreamConfig>;
        secondaryStream?: Partial<StreamConfig>;
    }

    Represents a set of configuration parameters that can be used to override or extend the default configuration settings for a specific stream (main or secondary).

    -

    Type declaration

    • Optional mainStream?: Partial<StreamConfig>

      Optional configuration for the main stream.

      -
    • Optional secondaryStream?: Partial<StreamConfig>

      Optional configuration for the secondary stream.

      -

    Example: Configuration for basic video stream

    const config: CoreConfig = {
    highDemandTimeWindow: 15,
    httpDownloadTimeWindow: 3000,
    p2pDownloadTimeWindow: 6000,
    swarmId: "custom swarm ID for video stream",
    cashedSegmentsCount: 1000,
    } -
    -

    Example: Configuration for advanced video stream

    const config: CoreConfig = {
    // Configuration for both streams
    highDemandTimeWindow: 20,
    httpDownloadTimeWindow: 3000,
    p2pDownloadTimeWindow: 6000,
    mainStream: {
    // Optional configuration for the main stream
    swarmId: "custom swarm ID for video stream",
    },
    secondaryStream: {
    // Optional configuration for the secondary stream
    swarmId: "custom swarm ID for audio stream",
    }, -
    -
    \ No newline at end of file + diff --git a/docs/v1.0/types/p2p_media_loader_core.CoreEventMap.html b/docs/v1.0/types/p2p_media_loader_core.CoreEventMap.html index f7f48be8..03342079 100644 --- a/docs/v1.0/types/p2p_media_loader_core.CoreEventMap.html +++ b/docs/v1.0/types/p2p_media_loader_core.CoreEventMap.html @@ -1,4 +1,4 @@ -CoreEventMap | P2P Media Loader Documentation
    CoreEventMap: {
        onSegmentLoaded: ((params) => void);
        onSegmentError: ((params) => void);
        onSegmentAbort: ((params) => void);
        onSegmentStart: ((params) => void);
        onPeerConnect: ((params) => void);
        onPeerClose: ((params) => void);
        onPeerError: ((params) => void);
        onChunkDownloaded: ((bytesLength, downloadSource, peerId?) => void);
        onChunkUploaded: ((bytesLength, peerId) => void);
        onTrackerError: ((params) => void);
        onTrackerWarning: ((params) => void);
    }

    The CoreEventMap defines a comprehensive suite of event handlers crucial for monitoring and controlling the lifecycle +

    CoreEventMap: {
        onSegmentLoaded: ((params: SegmentLoadDetails) => void);
        onSegmentError: ((params: SegmentErrorDetails) => void);
        onSegmentAbort: ((params: SegmentAbortDetails) => void);
        onSegmentStart: ((params: SegmentStartDetails) => void);
        onPeerConnect: ((params: PeerDetails) => void);
        onPeerClose: ((params: PeerDetails) => void);
        onPeerError: ((params: PeerErrorDetails) => void);
        onChunkDownloaded: ((bytesLength: number, downloadSource: DownloadSource, peerId?: string) => void);
        onChunkUploaded: ((bytesLength: number, peerId: string) => void);
        onTrackerError: ((params: TrackerErrorDetails) => void);
        onTrackerWarning: ((params: TrackerWarningDetails) => void);
    }

    The CoreEventMap defines a comprehensive suite of event handlers crucial for monitoring and controlling the lifecycle of segment downloading and uploading processes.

    -

    Type declaration

    • onSegmentLoaded: ((params) => void)

      Invoked when a segment is fully downloaded and available for use.

      +

      Type declaration

      • onSegmentLoaded: ((params: SegmentLoadDetails) => void)

        Invoked when a segment is fully downloaded and available for use.

          • (params): void
          • Parameters

            Returns void

      • onSegmentError: ((params) => void)

        Triggered when an error occurs during the download of a segment.

        +

      Returns void

  • onSegmentError: ((params: SegmentErrorDetails) => void)

    Triggered when an error occurs during the download of a segment.

      • (params): void
      • Parameters

        Returns void

  • onSegmentAbort: ((params) => void)

    Called if the download of a segment is aborted before completion.

    +
  • Returns void

  • onSegmentAbort: ((params: SegmentAbortDetails) => void)

    Called if the download of a segment is aborted before completion.

      • (params): void
      • Parameters

        Returns void

  • onSegmentStart: ((params) => void)

    Fired at the beginning of a segment download process.

    +
  • Returns void

  • onSegmentStart: ((params: SegmentStartDetails) => void)

    Fired at the beginning of a segment download process.

      • (params): void
      • Parameters

        Returns void

  • onPeerConnect: ((params) => void)

    Occurs when a new peer-to-peer connection is established.

    +
  • Returns void

  • onPeerConnect: ((params: PeerDetails) => void)

    Occurs when a new peer-to-peer connection is established.

      • (params): void
      • Parameters

        • params: PeerDetails

          Contains details about the peer that the event is about.

          -

        Returns void

  • onPeerClose: ((params) => void)

    Triggered when an existing peer-to-peer connection is closed.

    +
  • Returns void

  • onPeerClose: ((params: PeerDetails) => void)

    Triggered when an existing peer-to-peer connection is closed.

      • (params): void
      • Parameters

        • params: PeerDetails

          Contains details about the peer that the event is about.

          -

        Returns void

  • onPeerError: ((params) => void)

    Triggered when an error occurs during a peer-to-peer connection.

    +
  • Returns void

  • onPeerError: ((params: PeerErrorDetails) => void)

    Triggered when an error occurs during a peer-to-peer connection.

      • (params): void
      • Parameters

        • params: PeerErrorDetails

          Contains details about the error and the peer that the event is about.

          -

        Returns void

  • onChunkDownloaded: ((bytesLength, downloadSource, peerId?) => void)

    Invoked after a chunk of data from a segment has been successfully downloaded.

    +
  • Returns void

  • onChunkDownloaded: ((bytesLength: number, downloadSource: DownloadSource, peerId?: string) => void)

    Invoked after a chunk of data from a segment has been successfully downloaded.

      • (bytesLength, downloadSource, peerId?): void
      • Parameters

        • bytesLength: number

          The size of the downloaded chunk in bytes.

          -
        • downloadSource: DownloadSource
        • Optional peerId: string

          The peer ID of the peer that the event is about, if applicable.

          -

        Returns void

  • onChunkUploaded: ((bytesLength, peerId) => void)

    Called when a chunk of data has been successfully uploaded to a peer.

    +
  • downloadSource: DownloadSource

    The source of the download.

    +
  • OptionalpeerId: string

    The peer ID of the peer that the event is about, if applicable.

    +
  • Returns void

  • onChunkUploaded: ((bytesLength: number, peerId: string) => void)

    Called when a chunk of data has been successfully uploaded to a peer.

      • (bytesLength, peerId): void
      • Parameters

        • bytesLength: number

          The length of the segment in bytes.

        • peerId: string

          The peer ID, if the segment was downloaded from a peer

          -

        Returns void

  • onTrackerError: ((params) => void)

    Called when an error occurs during the tracker request process.

    +
  • Returns void

  • onTrackerError: ((params: TrackerErrorDetails) => void)

    Called when an error occurs during the tracker request process.

      • (params): void
      • Parameters

        Returns void

  • onTrackerWarning: ((params) => void)

    Called when a warning occurs during the tracker request process.

    +
  • Returns void

  • onTrackerWarning: ((params: TrackerWarningDetails) => void)

    Called when a warning occurs during the tracker request process.

      • (params): void
      • Parameters

        Returns void

  • \ No newline at end of file + diff --git a/docs/v1.0/types/p2p_media_loader_core.DefinedCoreConfig.html b/docs/v1.0/types/p2p_media_loader_core.DefinedCoreConfig.html index 103d0d93..8d6cafe6 100644 --- a/docs/v1.0/types/p2p_media_loader_core.DefinedCoreConfig.html +++ b/docs/v1.0/types/p2p_media_loader_core.DefinedCoreConfig.html @@ -1,4 +1,4 @@ -DefinedCoreConfig | P2P Media Loader Documentation
    DefinedCoreConfig: CommonCoreConfig & {
        mainStream: StreamConfig;
        secondaryStream: StreamConfig;
    }

    Represents a defined Core configuration with specific settings for the main and secondary streams.

    +
    DefinedCoreConfig: CommonCoreConfig & {
        mainStream: StreamConfig;
        secondaryStream: StreamConfig;
    }

    Represents a defined Core configuration with specific settings for the main and secondary streams.

    Type declaration

    • mainStream: StreamConfig

      Configuration for the main stream.

    • secondaryStream: StreamConfig

      Configuration for the secondary stream.

      -
    \ No newline at end of file + diff --git a/docs/v1.0/types/p2p_media_loader_core.DownloadSource.html b/docs/v1.0/types/p2p_media_loader_core.DownloadSource.html index a34343e0..6c57081d 100644 --- a/docs/v1.0/types/p2p_media_loader_core.DownloadSource.html +++ b/docs/v1.0/types/p2p_media_loader_core.DownloadSource.html @@ -1,4 +1,4 @@ -DownloadSource | P2P Media Loader Documentation
    DownloadSource: "http" | "p2p"

    Specifies the source of a download within a media streaming context.

    +
    DownloadSource: "http" | "p2p"

    Specifies the source of a download within a media streaming context.

    "http" - Indicates that the segment was downloaded using the HTTP protocol.

    "p2p"- Indicates that the segment was downloaded through a peer-to-peer network.

    -
    \ No newline at end of file + diff --git a/docs/v1.0/types/p2p_media_loader_core.DynamicCoreConfig.html b/docs/v1.0/types/p2p_media_loader_core.DynamicCoreConfig.html index 5f10bba7..69b9eb7e 100644 --- a/docs/v1.0/types/p2p_media_loader_core.DynamicCoreConfig.html +++ b/docs/v1.0/types/p2p_media_loader_core.DynamicCoreConfig.html @@ -1,4 +1,4 @@ -DynamicCoreConfig | P2P Media Loader Documentation
    DynamicCoreConfig: Partial<Pick<CoreConfig, DynamicStreamProperties>> & Partial<CommonCoreConfig> & {
        mainStream?: Partial<Pick<StreamConfig, DynamicStreamProperties>>;
        secondaryStream?: Partial<Pick<StreamConfig, DynamicStreamProperties>>;
    }

    Represents a dynamically modifiable configuration, allowing updates to selected CoreConfig properties at runtime.

    -

    Type declaration

    Example

    const dynamicConfig: DynamicCoreConfig = {
    core: {
    cachedSegmentsCount: 200,
    },
    mainStream: {
    swarmId: "custom swarm ID for video stream",
    p2pDownloadTimeWindow: 6000,
    },
    secondaryStream: {
    swarmId: "custom swarm ID for audio stream",
    p2pDownloadTimeWindow: 3000,
    }
    }; -
    -
    DynamicCoreConfig: Partial<Pick<CoreConfig, DynamicStreamProperties>> & Partial<CommonCoreConfig> & {
        mainStream?: Partial<Pick<StreamConfig, DynamicStreamProperties>>;
        secondaryStream?: Partial<Pick<StreamConfig, DynamicStreamProperties>>;
    }

    Represents a dynamically modifiable configuration, allowing updates to selected CoreConfig properties at runtime.

    +

    Type declaration

    const dynamicConfig: DynamicCoreConfig = {
    core: {
    cachedSegmentsCount: 200,
    },
    mainStream: {
    swarmId: "custom swarm ID for video stream",
    p2pDownloadTimeWindow: 6000,
    },
    secondaryStream: {
    swarmId: "custom swarm ID for audio stream",
    p2pDownloadTimeWindow: 3000,
    }
    }; +
    + +
    \ No newline at end of file + diff --git a/docs/v1.0/types/p2p_media_loader_core.DynamicStreamProperties.html b/docs/v1.0/types/p2p_media_loader_core.DynamicStreamProperties.html index 0112f24b..dcca5006 100644 --- a/docs/v1.0/types/p2p_media_loader_core.DynamicStreamProperties.html +++ b/docs/v1.0/types/p2p_media_loader_core.DynamicStreamProperties.html @@ -1,4 +1,4 @@ -DynamicStreamProperties | P2P Media Loader Documentation
    DynamicStreamProperties: "highDemandTimeWindow" | "httpDownloadTimeWindow" | "p2pDownloadTimeWindow" | "simultaneousHttpDownloads" | "simultaneousP2PDownloads" | "webRtcMaxMessageSize" | "p2pNotReceivingBytesTimeoutMs" | "p2pInactiveLoaderDestroyTimeoutMs" | "httpNotReceivingBytesTimeoutMs" | "httpErrorRetries" | "p2pErrorRetries" | "validateP2PSegment" | "httpRequestSetup" | "isP2PDisabled"

    Represents a set of properties that can be dynamically modified at runtime.

    -
    DynamicStreamProperties:
        | "highDemandTimeWindow"
        | "httpDownloadTimeWindow"
        | "p2pDownloadTimeWindow"
        | "simultaneousHttpDownloads"
        | "simultaneousP2PDownloads"
        | "webRtcMaxMessageSize"
        | "p2pNotReceivingBytesTimeoutMs"
        | "p2pInactiveLoaderDestroyTimeoutMs"
        | "httpNotReceivingBytesTimeoutMs"
        | "httpErrorRetries"
        | "p2pErrorRetries"
        | "validateP2PSegment"
        | "httpRequestSetup"
        | "isP2PDisabled"

    Represents a set of properties that can be dynamically modified at runtime.

    +
    \ No newline at end of file + diff --git a/docs/v1.0/types/p2p_media_loader_core.EngineCallbacks.html b/docs/v1.0/types/p2p_media_loader_core.EngineCallbacks.html index 3fd92524..2d46381a 100644 --- a/docs/v1.0/types/p2p_media_loader_core.EngineCallbacks.html +++ b/docs/v1.0/types/p2p_media_loader_core.EngineCallbacks.html @@ -1,4 +1,4 @@ -EngineCallbacks | P2P Media Loader Documentation
    EngineCallbacks: {
        onSuccess: ((response) => void);
        onError: ((reason) => void);
    }

    Callbacks for handling the success or failure of an engine operation.

    -

    Type declaration

    • onSuccess: ((response) => void)

      Called when the operation is successful.

      +
      EngineCallbacks: {
          onSuccess: ((response: SegmentResponse) => void);
          onError: ((reason: CoreRequestError) => void);
      }

      Callbacks for handling the success or failure of an engine operation.

      +

      Type declaration

      • onSuccess: ((response: SegmentResponse) => void)

        Called when the operation is successful.

          • (response): void
          • Parameters

            Returns void

      • onError: ((reason) => void)

        Called when the operation encounters an error.

        +

      Returns void

  • onError: ((reason: CoreRequestError) => void)

    Called when the operation encounters an error.

      • (reason): void
      • Parameters

        Returns void

  • \ No newline at end of file + diff --git a/docs/v1.0/types/p2p_media_loader_core.HttpRequestErrorType.html b/docs/v1.0/types/p2p_media_loader_core.HttpRequestErrorType.html index 93bc8eff..e52467d5 100644 --- a/docs/v1.0/types/p2p_media_loader_core.HttpRequestErrorType.html +++ b/docs/v1.0/types/p2p_media_loader_core.HttpRequestErrorType.html @@ -1,4 +1,4 @@ -HttpRequestErrorType | P2P Media Loader Documentation
    HttpRequestErrorType: "http-error" | "http-bytes-mismatch" | "http-unexpected-status-code"

    Defines the types of errors specific to HTTP requests.

    -
    HttpRequestErrorType: "http-error" | "http-bytes-mismatch" | "http-unexpected-status-code"

    Defines the types of errors specific to HTTP requests.

    +
    \ No newline at end of file + diff --git a/docs/v1.0/types/p2p_media_loader_core.PeerDetails.html b/docs/v1.0/types/p2p_media_loader_core.PeerDetails.html index 2d38de8e..b34ddaf2 100644 --- a/docs/v1.0/types/p2p_media_loader_core.PeerDetails.html +++ b/docs/v1.0/types/p2p_media_loader_core.PeerDetails.html @@ -1,4 +1,4 @@ -PeerDetails | P2P Media Loader Documentation
    PeerDetails: {
        peerId: string;
        streamType: StreamType;
    }

    Represents the details of a peer in a peer-to-peer network.

    +
    PeerDetails: {
        peerId: string;
        streamType: StreamType;
    }

    Represents the details of a peer in a peer-to-peer network.

    Type declaration

    • peerId: string

      The unique identifier for a peer in the network.

    • streamType: StreamType

      The type of stream that the peer is connected to.

      -
    \ No newline at end of file + diff --git a/docs/v1.0/types/p2p_media_loader_core.PeerErrorDetails.html b/docs/v1.0/types/p2p_media_loader_core.PeerErrorDetails.html index 175cadec..580c7cf8 100644 --- a/docs/v1.0/types/p2p_media_loader_core.PeerErrorDetails.html +++ b/docs/v1.0/types/p2p_media_loader_core.PeerErrorDetails.html @@ -1,4 +1,4 @@ -PeerErrorDetails | P2P Media Loader Documentation
    PeerErrorDetails: {
        peerId: string;
        streamType: StreamType;
        error: Error;
    }

    Represents the details of a peer error event.

    +
    PeerErrorDetails: {
        peerId: string;
        streamType: StreamType;
        error: Error;
    }

    Represents the details of a peer error event.

    Type declaration

    • peerId: string

      The unique identifier for a peer in the network.

    • streamType: StreamType

      The type of stream that the peer is connected to.

    • error: Error

      The error that occurred during the peer-to-peer connection.

      -
    \ No newline at end of file + diff --git a/docs/v1.0/types/p2p_media_loader_core.PeerRequestErrorType.html b/docs/v1.0/types/p2p_media_loader_core.PeerRequestErrorType.html index 44af5c6d..8d2e9287 100644 --- a/docs/v1.0/types/p2p_media_loader_core.PeerRequestErrorType.html +++ b/docs/v1.0/types/p2p_media_loader_core.PeerRequestErrorType.html @@ -1,4 +1,4 @@ -PeerRequestErrorType | P2P Media Loader Documentation
    PeerRequestErrorType: "peer-response-bytes-length-mismatch" | "peer-protocol-violation" | "peer-segment-absent" | "peer-closed" | "p2p-segment-validation-failed"

    Defines the types of errors specific to peer-to-peer requests.

    -
    PeerRequestErrorType:
        | "peer-response-bytes-length-mismatch"
        | "peer-protocol-violation"
        | "peer-segment-absent"
        | "peer-closed"
        | "p2p-segment-validation-failed"

    Defines the types of errors specific to peer-to-peer requests.

    +
    \ No newline at end of file + diff --git a/docs/v1.0/types/p2p_media_loader_core.RequestAbortErrorType.html b/docs/v1.0/types/p2p_media_loader_core.RequestAbortErrorType.html index 20df685c..b3edb4e6 100644 --- a/docs/v1.0/types/p2p_media_loader_core.RequestAbortErrorType.html +++ b/docs/v1.0/types/p2p_media_loader_core.RequestAbortErrorType.html @@ -1,4 +1,4 @@ -RequestAbortErrorType | P2P Media Loader Documentation
    RequestAbortErrorType: "abort" | "bytes-receiving-timeout"

    Defines the types of errors that can occur during a request abortion process.

    -
    RequestAbortErrorType: "abort" | "bytes-receiving-timeout"

    Defines the types of errors that can occur during a request abortion process.

    +
    \ No newline at end of file + diff --git a/docs/v1.0/types/p2p_media_loader_core.RequestErrorType.html b/docs/v1.0/types/p2p_media_loader_core.RequestErrorType.html index 467dbaee..56206276 100644 --- a/docs/v1.0/types/p2p_media_loader_core.RequestErrorType.html +++ b/docs/v1.0/types/p2p_media_loader_core.RequestErrorType.html @@ -1,4 +1,4 @@ -RequestErrorType | P2P Media Loader Documentation

    Enumerates all possible request error types, including HTTP and peer-related errors.

    -

    Enumerates all possible request error types, including HTTP and peer-related errors.

    +
    \ No newline at end of file + diff --git a/docs/v1.0/types/p2p_media_loader_core.Segment.html b/docs/v1.0/types/p2p_media_loader_core.Segment.html index 3894e3e3..8c667937 100644 --- a/docs/v1.0/types/p2p_media_loader_core.Segment.html +++ b/docs/v1.0/types/p2p_media_loader_core.Segment.html @@ -1,4 +1,4 @@ -Segment | P2P Media Loader Documentation
    Segment: {
        runtimeId: string;
        externalId: number;
        url: string;
        byteRange?: ByteRange;
        startTime: number;
        endTime: number;
    }

    Describes a media segment with its unique identifiers, location, and timing information.

    -

    Type declaration

    • Readonly runtimeId: string

      A runtime identifier for the segment that includes URL and byte range from its manifest.

      -
    • Readonly externalId: number

      An unique identifier of the segment in its stream used for P2P communications: sequence number for HLS or playtime for MPEG-DASH.

      -
    • Readonly url: string

      The URL from which the segment can be downloaded.

      -
    • Optional Readonly byteRange?: ByteRange

      An optional property specifying the range of bytes that represent the segment.

      -
    • Readonly startTime: number

      The start time of the segment in seconds, relative to the beginning of the stream.

      -
    • Readonly endTime: number

      The end time of the segment in seconds, relative to the beginning of the stream.

      -
    Segment: {
        runtimeId: string;
        externalId: number;
        url: string;
        byteRange?: ByteRange;
        startTime: number;
        endTime: number;
    }

    Describes a media segment with its unique identifiers, location, and timing information.

    +

    Type declaration

    • ReadonlyruntimeId: string

      A runtime identifier for the segment that includes URL and byte range from its manifest.

      +
    • ReadonlyexternalId: number

      An unique identifier of the segment in its stream used for P2P communications: sequence number for HLS or playtime for MPEG-DASH.

      +
    • Readonlyurl: string

      The URL from which the segment can be downloaded.

      +
    • Optional ReadonlybyteRange?: ByteRange

      An optional property specifying the range of bytes that represent the segment.

      +
    • ReadonlystartTime: number

      The start time of the segment in seconds, relative to the beginning of the stream.

      +
    • ReadonlyendTime: number

      The end time of the segment in seconds, relative to the beginning of the stream.

      +
    \ No newline at end of file + diff --git a/docs/v1.0/types/p2p_media_loader_core.SegmentAbortDetails.html b/docs/v1.0/types/p2p_media_loader_core.SegmentAbortDetails.html index bbc86740..12cc4dd2 100644 --- a/docs/v1.0/types/p2p_media_loader_core.SegmentAbortDetails.html +++ b/docs/v1.0/types/p2p_media_loader_core.SegmentAbortDetails.html @@ -1,4 +1,4 @@ -SegmentAbortDetails | P2P Media Loader Documentation
    SegmentAbortDetails: {
        segment: Segment;
        downloadSource: DownloadSource | undefined;
        peerId: string | undefined;
        streamType: StreamType;
    }

    Represents details about a segment abort event.

    +
    SegmentAbortDetails: {
        segment: Segment;
        downloadSource: DownloadSource | undefined;
        peerId: string | undefined;
        streamType: StreamType;
    }

    Represents details about a segment abort event.

    Type declaration

    • segment: Segment

      The segment that the event is about.

    • downloadSource: DownloadSource | undefined

      The source of the download.

    • peerId: string | undefined

      The peer ID, if the segment was downloaded from a peer.

    • streamType: StreamType

      The type of stream that the segment is associated with.

      -
    \ No newline at end of file + diff --git a/docs/v1.0/types/p2p_media_loader_core.SegmentErrorDetails.html b/docs/v1.0/types/p2p_media_loader_core.SegmentErrorDetails.html index ebfa3e4d..8ee8188a 100644 --- a/docs/v1.0/types/p2p_media_loader_core.SegmentErrorDetails.html +++ b/docs/v1.0/types/p2p_media_loader_core.SegmentErrorDetails.html @@ -1,4 +1,4 @@ -SegmentErrorDetails | P2P Media Loader Documentation
    SegmentErrorDetails: {
        error: RequestError;
        segment: Segment;
        downloadSource: DownloadSource;
        peerId: string | undefined;
        streamType: StreamType;
    }

    Represents details about a segment error event.

    +
    SegmentErrorDetails: {
        error: RequestError;
        segment: Segment;
        downloadSource: DownloadSource;
        peerId: string | undefined;
        streamType: StreamType;
    }

    Represents details about a segment error event.

    Type declaration

    • error: RequestError

      The error that occurred during the segment download.

    • segment: Segment

      The segment that the event is about.

    • downloadSource: DownloadSource

      The source of the download.

    • peerId: string | undefined

      The peer ID, if the segment was downloaded from a peer.

    • streamType: StreamType

      The type of stream that the segment is associated with.

      -
    \ No newline at end of file + diff --git a/docs/v1.0/types/p2p_media_loader_core.SegmentLoadDetails.html b/docs/v1.0/types/p2p_media_loader_core.SegmentLoadDetails.html index 3a278868..a1aa3c55 100644 --- a/docs/v1.0/types/p2p_media_loader_core.SegmentLoadDetails.html +++ b/docs/v1.0/types/p2p_media_loader_core.SegmentLoadDetails.html @@ -1,4 +1,4 @@ -SegmentLoadDetails | P2P Media Loader Documentation
    SegmentLoadDetails: {
        segmentUrl: string;
        bytesLength: number;
        downloadSource: DownloadSource;
        peerId: string | undefined;
        streamType: StreamType;
    }

    Represents the details about a loaded segment.

    +
    SegmentLoadDetails: {
        segmentUrl: string;
        bytesLength: number;
        downloadSource: DownloadSource;
        peerId: string | undefined;
        streamType: StreamType;
    }

    Represents the details about a loaded segment.

    Type declaration

    • segmentUrl: string

      The URL of the loaded segment

    • bytesLength: number

      The length of the segment in bytes.

    • downloadSource: DownloadSource

      The source of the download.

    • peerId: string | undefined

      The peer ID, if the segment was downloaded from a peer.

    • streamType: StreamType

      The segment that the event is about.

      -
    \ No newline at end of file + diff --git a/docs/v1.0/types/p2p_media_loader_core.SegmentResponse.html b/docs/v1.0/types/p2p_media_loader_core.SegmentResponse.html index 437530ea..c7f57840 100644 --- a/docs/v1.0/types/p2p_media_loader_core.SegmentResponse.html +++ b/docs/v1.0/types/p2p_media_loader_core.SegmentResponse.html @@ -1,4 +1,4 @@ -SegmentResponse | P2P Media Loader Documentation
    SegmentResponse: {
        data: ArrayBuffer;
        bandwidth: number;
    }

    Represents the response from a segment request, including the data and measured bandwidth.

    +
    SegmentResponse: {
        data: ArrayBuffer;
        bandwidth: number;
    }

    Represents the response from a segment request, including the data and measured bandwidth.

    Type declaration

    • data: ArrayBuffer

      Segment data as an ArrayBuffer.

    • bandwidth: number

      Measured bandwidth for the segment download, in bytes per second.

      -
    \ No newline at end of file + diff --git a/docs/v1.0/types/p2p_media_loader_core.SegmentStartDetails.html b/docs/v1.0/types/p2p_media_loader_core.SegmentStartDetails.html index 40eec929..d4df5c20 100644 --- a/docs/v1.0/types/p2p_media_loader_core.SegmentStartDetails.html +++ b/docs/v1.0/types/p2p_media_loader_core.SegmentStartDetails.html @@ -1,4 +1,4 @@ -SegmentStartDetails | P2P Media Loader Documentation
    SegmentStartDetails: {
        segment: Segment;
        downloadSource: DownloadSource;
        peerId: string | undefined;
    }

    Represents details about a segment event.

    +
    SegmentStartDetails: {
        segment: Segment;
        downloadSource: DownloadSource;
        peerId: string | undefined;
    }

    Represents details about a segment event.

    Type declaration

    • segment: Segment

      The segment that the event is about.

    • downloadSource: DownloadSource

      The origin of the segment download.

    • peerId: string | undefined

      The peer ID, if the segment is downloaded from a peer.

      -
    \ No newline at end of file + diff --git a/docs/v1.0/types/p2p_media_loader_core.SegmentWithStream.html b/docs/v1.0/types/p2p_media_loader_core.SegmentWithStream.html index 8286e2ac..b40f8855 100644 --- a/docs/v1.0/types/p2p_media_loader_core.SegmentWithStream.html +++ b/docs/v1.0/types/p2p_media_loader_core.SegmentWithStream.html @@ -1,4 +1,4 @@ -SegmentWithStream | P2P Media Loader Documentation
    SegmentWithStream<TStream>: Segment & {
        stream: StreamWithSegments<TStream>;
    }

    Extends a Segment with a reference to its associated stream.

    -

    Type Parameters

    Type declaration

    SegmentWithStream<TStream>: Segment & {
        stream: StreamWithSegments<TStream>;
    }

    Extends a Segment with a reference to its associated stream.

    +

    Type Parameters

    \ No newline at end of file + diff --git a/docs/v1.0/types/p2p_media_loader_core.Stream.html b/docs/v1.0/types/p2p_media_loader_core.Stream.html index bc4e6376..eba0789d 100644 --- a/docs/v1.0/types/p2p_media_loader_core.Stream.html +++ b/docs/v1.0/types/p2p_media_loader_core.Stream.html @@ -1,4 +1,4 @@ -Stream | P2P Media Loader Documentation
    Stream: {
        runtimeId: string;
        type: StreamType;
        index: number;
    }

    Represents a media stream with various defining characteristics.

    -

    Type declaration

    • Readonly runtimeId: string

      Runtime identifier of the stream from an engine.

      -
    • Readonly type: StreamType

      Stream type.

      -
    • Readonly index: number

      Stream index in the manifest.

      -
    Stream: {
        runtimeId: string;
        type: StreamType;
        index: number;
    }

    Represents a media stream with various defining characteristics.

    +

    Type declaration

    • ReadonlyruntimeId: string

      Runtime identifier of the stream from an engine.

      +
    • Readonlytype: StreamType

      Stream type.

      +
    • Readonlyindex: number

      Stream index in the manifest.

      +
    \ No newline at end of file + diff --git a/docs/v1.0/types/p2p_media_loader_core.StreamConfig.html b/docs/v1.0/types/p2p_media_loader_core.StreamConfig.html index 1f177596..81c50364 100644 --- a/docs/v1.0/types/p2p_media_loader_core.StreamConfig.html +++ b/docs/v1.0/types/p2p_media_loader_core.StreamConfig.html @@ -1,4 +1,4 @@ -StreamConfig | P2P Media Loader Documentation
    StreamConfig: {
        isP2PDisabled: boolean;
        highDemandTimeWindow: number;
        httpDownloadTimeWindow: number;
        p2pDownloadTimeWindow: number;
        simultaneousHttpDownloads: number;
        simultaneousP2PDownloads: number;
        webRtcMaxMessageSize: number;
        p2pNotReceivingBytesTimeoutMs: number;
        p2pInactiveLoaderDestroyTimeoutMs: number;
        httpNotReceivingBytesTimeoutMs: number;
        httpErrorRetries: number;
        p2pErrorRetries: number;
        announceTrackers: string[];
        rtcConfig: RTCConfiguration;
        trackerClientVersionPrefix: string;
        swarmId?: string;
        validateP2PSegment?: ((url, byteRange?) => Promise<boolean>);
        httpRequestSetup?: ((segmentUrl, segmentByteRange, requestAbortSignal, requestByteRange) => Promise<Request | undefined | null>);
    }

    Configuration options for the Core functionality, including network and processing parameters.

    +
    StreamConfig: {
        isP2PDisabled: boolean;
        highDemandTimeWindow: number;
        httpDownloadTimeWindow: number;
        p2pDownloadTimeWindow: number;
        simultaneousHttpDownloads: number;
        simultaneousP2PDownloads: number;
        webRtcMaxMessageSize: number;
        p2pNotReceivingBytesTimeoutMs: number;
        p2pInactiveLoaderDestroyTimeoutMs: number;
        httpNotReceivingBytesTimeoutMs: number;
        httpErrorRetries: number;
        p2pErrorRetries: number;
        announceTrackers: string[];
        rtcConfig: RTCConfiguration;
        trackerClientVersionPrefix: string;
        swarmId?: string;
        validateP2PSegment?: ((url: string, byteRange?: ByteRange) => Promise<boolean>);
        httpRequestSetup?: ((segmentUrl: string, segmentByteRange: ByteRange | undefined, requestAbortSignal: AbortSignal, requestByteRange: {
            start: number;
            end?: number;
        } | undefined) => Promise<Request | undefined | null>);
    }

    Configuration options for the Core functionality, including network and processing parameters.

    Type declaration

    • isP2PDisabled: boolean

      Indicates whether Peer-to-Peer (P2P) functionality is disabled for the stream. If set to true, P2P functionality is disabled for the stream.

      -

      Default

      isP2PDisabled: false
      -
      +
      isP2PDisabled: false
      +
      +
    • highDemandTimeWindow: number

      Defines the duration of the time window, in seconds, during which segments are pre-loaded to ensure smooth playback. This window helps prioritize the fetching of media segments that are imminent to playback.

      -

      Default

      highDemandTimeWindow: 15
      -
      +
      highDemandTimeWindow: 15
      +
      +
    • httpDownloadTimeWindow: number

      Defines the time window, in seconds, for HTTP segment downloads. This property specifies the duration over which media segments are pre-fetched using HTTP requests.

      For a better P2P ratio, it is recommended to set this httpDownloadTimeWindow to be lower than p2pDownloadTimeWindow.

      NOTE: This setting only takes effect if there is at least one peer connection and the connected peer does not have the requested segments available to share via P2P.

      -

      Default

      httpDownloadTimeWindow: 3000
      -
      +
      httpDownloadTimeWindow: 3000
      +
      +
    • p2pDownloadTimeWindow: number

      Defines the time window, in seconds, dedicated to pre-fetching media segments via Peer-to-Peer (P2P) downloads. This duration determines how much content is downloaded in advance using P2P connections to ensure smooth playback and reduce reliance on HTTP downloads.

      For a better P2P ratio, it is recommended to set this time window to be greater than httpDownloadTimeWindow to maximize P2P usage.

      -

      Default

      p2pDownloadTimeWindow: 6000
      -
      +
      p2pDownloadTimeWindow: 6000
      +
      +
    • simultaneousHttpDownloads: number

      Maximum number of simultaneous HTTP downloads allowed.

      -

      Default

      simultaneousHttpDownloads: 2
      -
      +
      simultaneousHttpDownloads: 2
      +
      +
    • simultaneousP2PDownloads: number

      Maximum number of simultaneous P2P downloads allowed.

      -

      Default

      simultaneousP2PDownloads: 3
      -
      +
      simultaneousP2PDownloads: 3
      +
      +
    • webRtcMaxMessageSize: number

      Maximum message size for WebRTC communications, in bytes.

      -

      Default

      webRtcMaxMessageSize: 64 * 1024 - 1
      -
      +
      webRtcMaxMessageSize: 64 * 1024 - 1
      +
      +
    • p2pNotReceivingBytesTimeoutMs: number

      Timeout for not receiving bytes from P2P, in milliseconds.

      -

      Default

      p2pNotReceivingBytesTimeoutMs: 2000
      -
      +
      p2pNotReceivingBytesTimeoutMs: 2000
      +
      +
    • p2pInactiveLoaderDestroyTimeoutMs: number

      Timeout for destroying the P2P loader if inactive, in milliseconds.

      -

      Default

      p2pInactiveLoaderDestroyTimeoutMs: 30 * 1000
      -
      +
      p2pInactiveLoaderDestroyTimeoutMs: 30 * 1000
      +
      +
    • httpNotReceivingBytesTimeoutMs: number

      Timeout for not receiving bytes from HTTP downloads, in milliseconds.

      -

      Default

      httpNotReceivingBytesTimeoutMs: 3000
      -
      +
      httpNotReceivingBytesTimeoutMs: 3000
      +
      +
    • httpErrorRetries: number

      Number of retries allowed after an HTTP error.

      -

      Default

      httpErrorRetries: 3
      -
      +
      httpErrorRetries: 3
      +
      +
    • p2pErrorRetries: number

      Number of retries allowed after a P2P error.

      -

      Default

      p2pErrorRetries: 3
      -
      +
      p2pErrorRetries: 3
      +
      +
    • announceTrackers: string[]

      List of URLs to the WebTorrent trackers used for announcing and discovering peers (i.e. WebRTC signaling).

      WARNING: In the Safari browser, only the first tracker will be used. Safari has issues with multiple trackers, leading to problems with sending SDP messages for WebRTC signaling.

      -

      Default

      The default trackers used are:

      -
      [
      "wss://tracker.novage.com.ua",
      "wss://tracker.webtorrent.dev",
      "wss://tracker.openwebtorrent.com",
      ] -
      +

      The default trackers used are:

      +
      [
      "wss://tracker.novage.com.ua",
      "wss://tracker.webtorrent.dev",
      "wss://tracker.openwebtorrent.com",
      ] +
      +
    • rtcConfig: RTCConfiguration

      Configuration for the RTC layer, used in WebRTC communication. This configuration specifies the STUN/TURN servers used by WebRTC to establish connections through NATs and firewalls.

      -

      See

      https://developer.mozilla.org/en-US/docs/Web/API/RTCConfiguration

      -

      Default

      {
      "rtcConfig": {
      "iceServers": [
      { "urls": "stun:stun.l.google.com:19302" },
      { "urls": "stun:global.stun.twilio.com:3478" }
      ]
      }
      } -
      +

      https://developer.mozilla.org/en-US/docs/Web/API/RTCConfiguration

      +
      {
      "rtcConfig": {
      "iceServers": [
      { "urls": "stun:stun.l.google.com:19302" },
      { "urls": "stun:global.stun.twilio.com:3478" }
      ]
      }
      } +
      +
    • trackerClientVersionPrefix: string

      Prefix to use for the WebTorrent client version in tracker communications. If undefined, the default version prefix is used, which is calculated based on the package version.

      -

      Default

      trackerClientVersionPrefix: undefined
      -
      -
    • Optional swarmId?: string

      Optional unique identifier for the swarm, used to isolate peer pools by media stream. +

      trackerClientVersionPrefix: undefined
      +
      + +
    • OptionalswarmId?: string

      Optional unique identifier for the swarm, used to isolate peer pools by media stream. If undefined, the URL of the manifest is used as the swarm ID.

      -

      Default

      swarmId: undefined
      -
      -
    • Optional validateP2PSegment?: ((url, byteRange?) => Promise<boolean>)

      Optional function to validate a P2P segment before fully integrating it into the playback buffer.

      -

      Returns

      A promise that resolves with a boolean indicating if the segment is valid.

      -

      Default

      validateP2PSegment: undefined
      -
      +
      swarmId: undefined
      +
      + +
    • OptionalvalidateP2PSegment?: ((url: string, byteRange?: ByteRange) => Promise<boolean>)

      Optional function to validate a P2P segment before fully integrating it into the playback buffer.

      +
      validateP2PSegment: undefined
      +
      +
        • (url, byteRange?): Promise<boolean>
        • Parameters

          • url: string

            URL of the segment to validate.

            -
          • Optional byteRange: ByteRange

            Optional byte range of the segment.

            -

          Returns Promise<boolean>

    • Optional httpRequestSetup?: ((segmentUrl, segmentByteRange, requestAbortSignal, requestByteRange) => Promise<Request | undefined | null>)

      Optional function to customize the setup of HTTP requests for segment downloads.

      -

      Returns

      A promise that resolves with the configured request, or undefined if no customization should be made.

      -

      Default

      httpRequestSetup: undefined
      -
      +
    • OptionalbyteRange: ByteRange

      Optional byte range of the segment.

      +

    Returns Promise<boolean>

    A promise that resolves with a boolean indicating if the segment is valid.

    +
  • OptionalhttpRequestSetup?: ((segmentUrl: string, segmentByteRange: ByteRange | undefined, requestAbortSignal: AbortSignal, requestByteRange: {
        start: number;
        end?: number;
    } | undefined) => Promise<Request | undefined | null>)

    Optional function to customize the setup of HTTP requests for segment downloads.

    +
    httpRequestSetup: undefined
    +
    +
      • (segmentUrl, segmentByteRange, requestAbortSignal, requestByteRange): Promise<Request | undefined | null>
      • Parameters

        • segmentUrl: string

          URL of the segment.

        • segmentByteRange: ByteRange | undefined

          The range of bytes requested for the segment.

        • requestAbortSignal: AbortSignal

          An abort signal to cancel the request if needed.

        • requestByteRange: {
              start: number;
              end?: number;
          } | undefined

          Additional byte range for partial requests, if required.

          -

        Returns Promise<Request | undefined | null>

  • \ No newline at end of file + diff --git a/docs/v1.0/types/p2p_media_loader_core.StreamType.html b/docs/v1.0/types/p2p_media_loader_core.StreamType.html index 846e55c5..38747b5d 100644 --- a/docs/v1.0/types/p2p_media_loader_core.StreamType.html +++ b/docs/v1.0/types/p2p_media_loader_core.StreamType.html @@ -1,4 +1,4 @@ -StreamType | P2P Media Loader Documentation
    StreamType: "main" | "secondary"

    Represents the types of streams available, either primary (main) or secondary.

    -
    StreamType: "main" | "secondary"

    Represents the types of streams available, either primary (main) or secondary.

    +
    \ No newline at end of file + diff --git a/docs/v1.0/types/p2p_media_loader_core.StreamWithSegments.html b/docs/v1.0/types/p2p_media_loader_core.StreamWithSegments.html index 4635e5b7..a0452f7f 100644 --- a/docs/v1.0/types/p2p_media_loader_core.StreamWithSegments.html +++ b/docs/v1.0/types/p2p_media_loader_core.StreamWithSegments.html @@ -1,4 +1,4 @@ -StreamWithSegments | P2P Media Loader Documentation
    StreamWithSegments<TStream>: TStream & {
        segments: Map<string, SegmentWithStream<TStream>>;
    }

    Represents a stream that includes multiple segments, each associated with the stream.

    +
    StreamWithSegments<TStream>: TStream & {
        segments: Map<string, SegmentWithStream<TStream>>;
    }

    Represents a stream that includes multiple segments, each associated with the stream.

    Type Parameters

    • TStream extends Stream = Stream

      Type of the underlying stream data structure.

      -

    Type declaration

    \ No newline at end of file + diff --git a/docs/v1.0/types/p2p_media_loader_core.TrackerErrorDetails.html b/docs/v1.0/types/p2p_media_loader_core.TrackerErrorDetails.html index 86bc2299..9ed69350 100644 --- a/docs/v1.0/types/p2p_media_loader_core.TrackerErrorDetails.html +++ b/docs/v1.0/types/p2p_media_loader_core.TrackerErrorDetails.html @@ -1,4 +1,4 @@ -TrackerErrorDetails | P2P Media Loader Documentation
    TrackerErrorDetails: {
        streamType: StreamType;
        error: unknown;
    }

    Represents the details of a tracker error event.

    +
    TrackerErrorDetails: {
        streamType: StreamType;
        error: unknown;
    }

    Represents the details of a tracker error event.

    Type declaration

    • streamType: StreamType

      The type of stream that the tracker is for.

    • error: unknown

      The error that occurred during the tracker request.

      -
    \ No newline at end of file + diff --git a/docs/v1.0/types/p2p_media_loader_core.TrackerWarningDetails.html b/docs/v1.0/types/p2p_media_loader_core.TrackerWarningDetails.html index 44c6f766..590f46e5 100644 --- a/docs/v1.0/types/p2p_media_loader_core.TrackerWarningDetails.html +++ b/docs/v1.0/types/p2p_media_loader_core.TrackerWarningDetails.html @@ -1,4 +1,4 @@ -TrackerWarningDetails | P2P Media Loader Documentation
    TrackerWarningDetails: {
        streamType: StreamType;
        warning: unknown;
    }

    Type declaration

    • streamType: StreamType

      The type of stream that the tracker is for.

      +
      TrackerWarningDetails: {
          streamType: StreamType;
          warning: unknown;
      }

      Type declaration

      • streamType: StreamType

        The type of stream that the tracker is for.

      • warning: unknown

        The warning that occurred during the tracker request.

        -
      \ No newline at end of file + diff --git a/docs/v1.0/types/p2p_media_loader_hlsjs.DynamicHlsJsP2PEngineConfig.html b/docs/v1.0/types/p2p_media_loader_hlsjs.DynamicHlsJsP2PEngineConfig.html index d22c93d7..2f99d03d 100644 --- a/docs/v1.0/types/p2p_media_loader_hlsjs.DynamicHlsJsP2PEngineConfig.html +++ b/docs/v1.0/types/p2p_media_loader_hlsjs.DynamicHlsJsP2PEngineConfig.html @@ -1,4 +1,4 @@ -DynamicHlsJsP2PEngineConfig | P2P Media Loader Documentation
      DynamicHlsJsP2PEngineConfig: {
          core?: DynamicCoreConfig;
      }

      Type for specifying dynamic configuration options that can be changed at runtime for the P2P engine's core.

      -

      Type declaration

      DynamicHlsJsP2PEngineConfig: {
          core?: DynamicCoreConfig;
      }

      Type for specifying dynamic configuration options that can be changed at runtime for the P2P engine's core.

      +

      Type declaration

      \ No newline at end of file + diff --git a/docs/v1.0/types/p2p_media_loader_hlsjs.HlsJsP2PEngineConfig.html b/docs/v1.0/types/p2p_media_loader_hlsjs.HlsJsP2PEngineConfig.html index aa5fe968..c7279cfe 100644 --- a/docs/v1.0/types/p2p_media_loader_hlsjs.HlsJsP2PEngineConfig.html +++ b/docs/v1.0/types/p2p_media_loader_hlsjs.HlsJsP2PEngineConfig.html @@ -1,4 +1,4 @@ -HlsJsP2PEngineConfig | P2P Media Loader Documentation
      HlsJsP2PEngineConfig: {
          core: DefinedCoreConfig;
      }

      Represents the complete configuration for HlsJsP2PEngine.

      +
      HlsJsP2PEngineConfig: {
          core: DefinedCoreConfig;
      }

      Represents the complete configuration for HlsJsP2PEngine.

      Type declaration

      \ No newline at end of file + diff --git a/docs/v1.0/types/p2p_media_loader_hlsjs.HlsWithP2PConfig.html b/docs/v1.0/types/p2p_media_loader_hlsjs.HlsWithP2PConfig.html index 5a30e6a7..7bfa5e55 100644 --- a/docs/v1.0/types/p2p_media_loader_hlsjs.HlsWithP2PConfig.html +++ b/docs/v1.0/types/p2p_media_loader_hlsjs.HlsWithP2PConfig.html @@ -1,4 +1,4 @@ -HlsWithP2PConfig | P2P Media Loader Documentation
      HlsWithP2PConfig<HlsType>: ConstructorParameters<HlsType>[0] & {
          p2p?: PartialHlsJsP2PEngineConfig & {
              onHlsJsCreated?: ((hls) => void);
          };
      }

      Configuration type for HLS instances that includes P2P settings, augmenting standard HLS configuration with P2P capabilities.

      +
      HlsWithP2PConfig<HlsType>: ConstructorParameters<HlsType>[0] & {
          p2p?: PartialHlsJsP2PEngineConfig & {
              onHlsJsCreated?: ((hls: HlsWithP2PInstance<HlsType>) => void);
          };
      }

      Configuration type for HLS instances that includes P2P settings, augmenting standard HLS configuration with P2P capabilities.

      Type Parameters

      • HlsType extends (abstract new () => unknown)

        A constructor type that produces an HLS instance.

        -

      Type declaration

      \ No newline at end of file + diff --git a/docs/v1.0/types/p2p_media_loader_hlsjs.HlsWithP2PInstance.html b/docs/v1.0/types/p2p_media_loader_hlsjs.HlsWithP2PInstance.html index 46ba546e..edb9c7ef 100644 --- a/docs/v1.0/types/p2p_media_loader_hlsjs.HlsWithP2PInstance.html +++ b/docs/v1.0/types/p2p_media_loader_hlsjs.HlsWithP2PInstance.html @@ -1,4 +1,4 @@ -HlsWithP2PInstance | P2P Media Loader Documentation
      HlsWithP2PInstance<HlsType>: HlsType & {
          p2pEngine: HlsJsP2PEngine;
      }

      Extends a generic HLS type to include the P2P engine, integrating P2P capabilities directly into the HLS instance.

      +
      HlsWithP2PInstance<HlsType>: HlsType & {
          p2pEngine: HlsJsP2PEngine;
      }

      Extends a generic HLS type to include the P2P engine, integrating P2P capabilities directly into the HLS instance.

      Type Parameters

      • HlsType

        The base HLS type that is being extended.

        -

      Type declaration

      \ No newline at end of file + diff --git a/docs/v1.0/types/p2p_media_loader_hlsjs.PartialHlsJsP2PEngineConfig.html b/docs/v1.0/types/p2p_media_loader_hlsjs.PartialHlsJsP2PEngineConfig.html index 5069bbca..3b8ffe52 100644 --- a/docs/v1.0/types/p2p_media_loader_hlsjs.PartialHlsJsP2PEngineConfig.html +++ b/docs/v1.0/types/p2p_media_loader_hlsjs.PartialHlsJsP2PEngineConfig.html @@ -1,4 +1,4 @@ -PartialHlsJsP2PEngineConfig | P2P Media Loader Documentation
      PartialHlsJsP2PEngineConfig: Partial<Omit<HlsJsP2PEngineConfig, "core">> & {
          core?: Partial<CoreConfig>;
      }

      Allows for partial configuration of HlsJsP2PEngine, useful for providing overrides or partial updates.

      -

      Type declaration

      • Optional core?: Partial<CoreConfig>

        Partial core config

        -
      PartialHlsJsP2PEngineConfig: Partial<Omit<HlsJsP2PEngineConfig, "core">> & {
          core?: Partial<CoreConfig>;
      }

      Allows for partial configuration of HlsJsP2PEngine, useful for providing overrides or partial updates.

      +

      Type declaration

      • Optionalcore?: Partial<CoreConfig>

        Partial core config

        +
      \ No newline at end of file + diff --git a/docs/v1.0/types/p2p_media_loader_shaka.DynamicShakaP2PEngineConfig.html b/docs/v1.0/types/p2p_media_loader_shaka.DynamicShakaP2PEngineConfig.html index 5969179d..2beea44c 100644 --- a/docs/v1.0/types/p2p_media_loader_shaka.DynamicShakaP2PEngineConfig.html +++ b/docs/v1.0/types/p2p_media_loader_shaka.DynamicShakaP2PEngineConfig.html @@ -1,4 +1,4 @@ -DynamicShakaP2PEngineConfig | P2P Media Loader Documentation
      DynamicShakaP2PEngineConfig: {
          core?: DynamicCoreConfig;
      }

      Type for specifying dynamic configuration options that can be changed at runtime for the P2P engine's core.

      -

      Type declaration

      DynamicShakaP2PEngineConfig: {
          core?: DynamicCoreConfig;
      }

      Type for specifying dynamic configuration options that can be changed at runtime for the P2P engine's core.

      +

      Type declaration

      \ No newline at end of file + diff --git a/docs/v1.0/types/p2p_media_loader_shaka.PartialShakaEngineConfig.html b/docs/v1.0/types/p2p_media_loader_shaka.PartialShakaEngineConfig.html index 8819d600..86771137 100644 --- a/docs/v1.0/types/p2p_media_loader_shaka.PartialShakaEngineConfig.html +++ b/docs/v1.0/types/p2p_media_loader_shaka.PartialShakaEngineConfig.html @@ -1,4 +1,4 @@ -PartialShakaEngineConfig | P2P Media Loader Documentation
      PartialShakaEngineConfig: Partial<Omit<ShakaP2PEngineConfig, "core">> & {
          core?: Partial<CoreConfig>;
      }

      Allows for partial configuration settings for the Shaka P2P Engine.

      -

      Type declaration

      • Optional core?: Partial<CoreConfig>

        Partial core config

        -
      PartialShakaEngineConfig: Partial<Omit<ShakaP2PEngineConfig, "core">> & {
          core?: Partial<CoreConfig>;
      }

      Allows for partial configuration settings for the Shaka P2P Engine.

      +

      Type declaration

      • Optionalcore?: Partial<CoreConfig>

        Partial core config

        +
      \ No newline at end of file + diff --git a/docs/v1.0/types/p2p_media_loader_shaka.ShakaP2PEngineConfig.html b/docs/v1.0/types/p2p_media_loader_shaka.ShakaP2PEngineConfig.html index 60c9afff..b9e8a3ba 100644 --- a/docs/v1.0/types/p2p_media_loader_shaka.ShakaP2PEngineConfig.html +++ b/docs/v1.0/types/p2p_media_loader_shaka.ShakaP2PEngineConfig.html @@ -1,4 +1,4 @@ -ShakaP2PEngineConfig | P2P Media Loader Documentation
      ShakaP2PEngineConfig: {
          core: DefinedCoreConfig;
      }

      Represents the complete configuration for ShakaP2PEngine.

      +
      ShakaP2PEngineConfig: {
          core: DefinedCoreConfig;
      }

      Represents the complete configuration for ShakaP2PEngine.

      Type declaration

      \ No newline at end of file +