From 11aed333f101908d4fb50cb84bb0a981c656e1cc Mon Sep 17 00:00:00 2001 From: Dmytro Demchenko Date: Mon, 18 Nov 2024 13:27:10 +0200 Subject: [PATCH] Update doc --- docs/v2.0/assets/icons.js | 2 +- docs/v2.0/assets/icons.svg | 2 +- docs/v2.0/assets/main.js | 2 +- docs/v2.0/assets/search.js | 2 +- docs/v2.0/assets/style.css | 87 ++++++--- .../classes/p2p_media_loader_core.Core.html | 50 ++--- ...2p_media_loader_core.CoreRequestError.html | 8 +- .../p2p_media_loader_core.RequestError.html | 10 +- ...p2p_media_loader_hlsjs.HlsJsP2PEngine.html | 36 ++-- ...p2p_media_loader_shaka.ShakaP2PEngine.html | 32 ++-- docs/v2.0/index.html | 4 +- .../p2p_media_loader_core.SegmentStorage.html | 24 +-- docs/v2.0/modules.html | 174 ++++++++++++++++++ docs/v2.0/modules/p2p_media_loader_core.html | 4 +- docs/v2.0/modules/p2p_media_loader_hlsjs.html | 4 +- docs/v2.0/modules/p2p_media_loader_shaka.html | 4 +- .../p2p_media_loader_core.ByteRange.html | 4 +- ...2p_media_loader_core.CommonCoreConfig.html | 10 +- .../p2p_media_loader_core.CoreConfig.html | 8 +- .../p2p_media_loader_core.CoreEventMap.html | 4 +- ...p_media_loader_core.DefinedCoreConfig.html | 4 +- .../p2p_media_loader_core.DownloadSource.html | 4 +- ...p_media_loader_core.DynamicCoreConfig.html | 6 +- ...a_loader_core.DynamicStreamProperties.html | 4 +- ...p2p_media_loader_core.EngineCallbacks.html | 4 +- ...edia_loader_core.HttpRequestErrorType.html | 4 +- .../p2p_media_loader_core.PeerDetails.html | 4 +- ...2p_media_loader_core.PeerErrorDetails.html | 4 +- ...edia_loader_core.PeerRequestErrorType.html | 4 +- ...dia_loader_core.RequestAbortErrorType.html | 4 +- ...2p_media_loader_core.RequestErrorType.html | 4 +- .../types/p2p_media_loader_core.Segment.html | 4 +- ...media_loader_core.SegmentAbortDetails.html | 4 +- ...media_loader_core.SegmentErrorDetails.html | 4 +- ..._media_loader_core.SegmentLoadDetails.html | 4 +- ...p2p_media_loader_core.SegmentResponse.html | 4 +- ...media_loader_core.SegmentStartDetails.html | 4 +- ...p_media_loader_core.SegmentWithStream.html | 4 +- .../types/p2p_media_loader_core.Stream.html | 4 +- .../p2p_media_loader_core.StreamConfig.html | 88 ++++----- .../p2p_media_loader_core.StreamType.html | 4 +- ..._media_loader_core.StreamWithSegments.html | 4 +- ...media_loader_core.TrackerErrorDetails.html | 4 +- ...dia_loader_core.TrackerWarningDetails.html | 4 +- ...der_hlsjs.DynamicHlsJsP2PEngineConfig.html | 4 +- ...dia_loader_hlsjs.HlsJsP2PEngineConfig.html | 4 +- ...p_media_loader_hlsjs.HlsWithP2PConfig.html | 4 +- ...media_loader_hlsjs.HlsWithP2PInstance.html | 4 +- ...der_hlsjs.PartialHlsJsP2PEngineConfig.html | 4 +- ...der_shaka.DynamicShakaP2PEngineConfig.html | 4 +- ...loader_shaka.PartialShakaEngineConfig.html | 4 +- ...dia_loader_shaka.ShakaP2PEngineConfig.html | 4 +- 52 files changed, 455 insertions(+), 230 deletions(-) create mode 100644 docs/v2.0/modules.html diff --git a/docs/v2.0/assets/icons.js b/docs/v2.0/assets/icons.js index e88e8ca7..3dfbd322 100644 --- a/docs/v2.0/assets/icons.js +++ b/docs/v2.0/assets/icons.js @@ -3,7 +3,7 @@ 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.innerHTML = `MMNEPVFCICPMFPCPTTAAATR`; svg.style.display = "none"; if (location.protocol === "file:") updateUseElements(); } diff --git a/docs/v2.0/assets/icons.svg b/docs/v2.0/assets/icons.svg index e371b8b5..a19417dc 100644 --- a/docs/v2.0/assets/icons.svg +++ b/docs/v2.0/assets/icons.svg @@ -1 +1 @@ - \ No newline at end of file +MMNEPVFCICPMFPCPTTAAATR \ No newline at end of file diff --git a/docs/v2.0/assets/main.js b/docs/v2.0/assets/main.js index 21a5d74d..99097a05 100644 --- a/docs/v2.0/assets/main.js +++ b/docs/v2.0/assets/main.js @@ -3,7 +3,7 @@ window.translations={"copy":"Copy","copied":"Copied!","normally_hidden":"This me "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.href.includes("#")&&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();})(); +`,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.href.includes("#")&&r.classList.add("current"),t.kind&&(r.innerHTML=``),r.appendChild(document.createElement("span")).textContent=t.text}else{let r=e.appendChild(document.createElement("span"));r.innerHTML='',r.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/v2.0/assets/search.js b/docs/v2.0/assets/search.js index beab45ce..eebda90a 100644 --- a/docs/v2.0/assets/search.js +++ b/docs/v2.0/assets/search.js @@ -1 +1 @@ -window.searchData = "data:application/octet-stream;base64,H4sIAAAAAAAAA9VdXZPbNrL9L/KrolWD337Ljp0b37ITl51sHqZSLlrCzHAjkbokNfasK//9FkBSagANCvxQJvvk8QzRPGgcNBp9QPLboiy+VIuXt98Wf2T5dvGSLRd5uueLl4sDO3y359ss/W5XpFtefrcpSr5YLo7lbvFysS+2xx2v/nFgh0/yqk/NVZ/EVauHer9bLBebXVpVvFq8XCz+XHZ3ABaf7nGDTbZXW0ze0HaXi0Na8ry2AkY3XjP/dOdXr3/4/te3v3y6+fndu59/+nTz84fXn25+/umHN/8zFM+LXlMDoEqTl/B+/OXD6+/fTYWqW5mAMoAzZTZFXtXlcVMX5WBoatsJgNjaPxPsntc3RX6X3Q/Gg1vOhSY9HHZPr57ydJ9tRsIiTcyGb7t9/cjz+m1W1TznwweRMDAXtpLvi0c+DR5tYy6EFa/fpXl2x6v6A68ORV7xX8vdYJBWM3PhfEirj/x+L5oPxaY0nXGOfqxLnu7HzNFTyxnnQGPzzd1PRc5ff82quhozEUgrc6E8HrZpzUe6TWs8FyZx3VhiqW1nG8vPRVm3Zt8W6TbLRwRc0sa84/h+lz59Tjd/jBxJ1HzGWPb9ps4e+Vv+yHf/zOoyrQdnai9sVmZE+aZ6mz2OQnZqORearEI0ST/vhqOiLMyFbsuruiyeBmM6t5uCJAhPQNoufqyLMr0/+yjLa17epRsrJLXdtK2AOm55VmfpLvvPNDAvFDtDnKV5xAKzyLt5/quc9dtpaClz1wDdXveB/9+RVzOgJuzND7uqi5Lra9kowJql+aGKHKi58FVap9PAGrauAvfXauq8f4GszAIxDALvHKE+faqfDjMhXHU/fAerk93xmFeGXVvBoC7qdHeTHtJNVj9dqy8r/S5z9qzzl6WDx4pvr94/7SbX7d6lXdqozo3esrmHHxHiuuz9zbaaHoNMg1cI8adYd/OQ5vf8Jt3tlBx8XLi3W52/C3pKNwrxuPyuB2ASQXAuCTa7zF9wPBWstyI8XT41wVNh/POp5h/EgDihOF09DUTvquJ+/xej1o1zjy3xs6rTsh4PZ9W1HwXqQmzn+XYCsqb1TLgMQmtBuZfNzbXPxCJ893Ec6vpqGaXymNfZnr9xGysCzgpbGAHsEou+1rzM090EgIqJ+REeUX14KLTj4KKwG6bPg0IlhQxbmB+fjDu/ZPvx+LCFK7Au305Cd24/CzZL/Potqx+08rED0HOreZfnxqa03tyoGpAt4GbXgDUAynNF+vPNRwb6pqPzxHkDzPgw35jqn28TvLQa7aoLmLJ8y7+OBdU1ngOVzuhX/C7L+VaUZzUBug+k0WreadbK2U0f3pfFgZd1xt1CgKXtVQAO9Zreal5QN8V+X+QDMemNnilgkTDGhS7DDba0oVkh3vF9UT61+9a32T5zy+T7AK/6TE/pyoUgszlWdbFXd+I/pOIAzdP0PvUbn7dXV6FRXw9aCN/BPF3pdVbfBB44da8TR5rQOQAIbvCsCc/k2KF03baUV+/Z+1dZJeTYIQkQwUjd1FioF+LCQ3b/8Irv02Yf8VuWb4sv04BbLF4Lf10fXhVfctF8th7YbF6pDwc2exdsJq/UgyrbH3d1mvPiWP2IvDdkZ0atlT1m/4KeiAk4f0c0q1fqxxf++UO9eZd+fccrISB9xCcWRvXBYvF6c+Knov7ANzx7zPJ7UXOtBJOLY/1u4mBcMn29Hr3J0+aEk7TwqhFT5uvVRfNXjMHXGqyLtq/Yp9dlWZQfeF267i97e6FZux7L5oNtGrsS6jTPi2O+4b+U6eYPXk6ETVi7Eu6y1o/mjwKMzVwJad344maX8bz+Fy+rrMjfl/wuG1J5IqD32r3WGv0lLfeDCozUknwyciWUj+kukwdu2ftBMqANMGlvPuyzb68IwGO30gRyyh09obw9AfiR18fD9FCuWfs7D4IOtxsCb4YhMFzRUxRtM96PxbHcuHVJbTJzGaOrvqRl/YrXabZzXHLMds+r1xtIJmn3ij/6S6NzgFxV4+IYYbU/FG+Hs+8SdMPkdXtw4LwcdjLBivxkanbEllkmU8gRswy3e95ZZiCZNMsUf9jOBYhr5oC46ixNBHopJRseFayIJ0WFAZjHRwUr9DmiwoAeDI8KVuRTosIQngw84XmJKtjc7Mgt8ex78ZDfiHiG2z1vPDOQTIpnij/miw82kNPig2L1WvHBCn2O+DCgB8PjgxX5lPgwAPG4+GCnysT40I/cEh9E+XVEeEDNnjc66EAmBQfsjP7Y8Ouw460WlCvF2jTADmdfq7c8v68f5gCumrsq8vGRzQZ+jsDmjn94XLPhnhLW3PGOi2pWhk8Mar249Zj2nvNBezd0/TNFMR3BuPCF+z2dhRZM4+iHjc3KOxvK0YTrRUoxbXCpQG/0jJybqUhguGEe9s278TMszs7D+bd8AzG7V2B64Y4pv1xGqs+dVukcPH2Ids80g2xIxk0iyh/zcPMCzvH0pAzPxdBLoMeQ1Amvhae/pWWe5fcjmKq2fF6uElgmsVXzyqx8tWOdzFjN9IVjac3FM0E/W7sCbuoEtnwb4LvUTULGDZ7t0QkNwtjHJlDXLSN7etmOPH3mlpjY4K1MY2PhzvoAgRva8Q8MGLANR1xy/mvnNeFyb16PWBWezfUS7NjDDb2eb9xwyfGyUjhTXzpb/xWOl2A7xwdzOr5xwyXHf3R+M8Xlvnwc8ZaKZ3O8BNs5PprT8Y0brI4X25ObIs/5ZrLfVVN/b7cjrJ3Xk1m8jp3Q7/RdUc3TjdbQf4HDBdLTgjrPinr2QK+3Z1lKsaG/v7eVRRTmWUXPHrB6++bhmP/RHfebnjqa5v7entfwnvw/z2Kqe6N/FH49zDgGyNh/wQh0aE/+n2dNVT1h9T4up0ztjmbr7+17DPbk+nkWVsUPlzz/24DKxOXu/DaqMvFs3m/hdv5n8yy0mi/spZX2ELlM+OVoOZe3yJbznhX/8XzKfRg2quG80MTaOgoa1XBeaKNgzQsJfzsIWz5Bac06gJkIRHkQK9vzqk73h7EwXmALQyap4oMzumnf5DHhjf82jwWg/QVOgz03vPRpwWQ5+tV9g2XIMY+uzfMe+lJQTDrxdfKB7fARfvP4SGSr7ehXjp/MXTjclebbL9l22NEuEiq2NC9e7dtoI2Kc3mwaB6d/3WvOaGK4ZHpEoSGOFFQcI8vr/D7LT6+GdhNLtTbPFFkoFOMii+4De034uNnwaryTUJH1ZGkC0BlzeCe0Y5UnGjbygtXh7vvV/g6M2as+l7MnSU1WVxtxAL/SQTX0sKv+fea49eOa8jJi7vdsdXbV/4r307Qgnd5s0NyFajkw7DS9mjZ6F8AMjj52e9b37OGPlE5CuWpNTYbqcPQyLcXHiMYPf4+BiSywvF1zPNQeA89G2EuYRvK2z1eT6euIeRSL+2xfJPOPu0q85Pk9e/8mr+o0v/yAw2nqaO1mpu75BgMjq9JqIii8aVD9ezkHpkLMZB8p31b7N9/U77KvWT4BzAvVzITwadnaaDN7GsIV+nnEV5/Ie1jMz7FTs/dp1Ebtgtcnfm/YDnb8p4eHIB71FWI76EkfJB6C+/Q16x+KUraYgpoyNg/m3vV2DqQr4zenGTpki0Xe0eFmtjX6rnm/31/X1dX5jlfu8qXn/v7ynh+er+djP03v0PcrBegRH6zvCdETvl0/BPXnLN/+uJsU4s4mroDP+VO8dnyDv9p2CZ+9NFE9pH+kl0sT8rJBpYnu0w2i4cB9X3OzHgMDc9imj9P2fW6YBu/7Lpqdsu8bhHngvu+y7Yv7vvHU+FtxYm4yXIcFVxn+cePe1p5k4+Fjb2s9cfzxNlvt1uVATjljIpzR+z0rlnH7Pcpc38LcXLlLn1ySPjtW09QV8I5Jf+yQp6Q/Q1APSCztYEckloM8O3jn3+PX0Tv/IYhH7fztoCft/Ifgdk427VgHJ5vD/Hov+l++3x3vs9whae/zqW7qCniP+YyIKWOTMP++bL899/Lb4rF5dffi5YKtvJU4f3uX8d22Wry8bTqzXGyKffvetW2xOcoff28v+xcX64C4uLn6H+vF8na9hGS1TmAJ3Q+s+8FbQrhiLP799+VtZ1e2kb/ozJ9/I23CYnnrLb1gFYaB0hCMhqA0ZIvlrb8M1qsgYkpDZjRkSkNvsbwNqIae0dBTGvqL5W249KKVF3pKQ99o6CsNg8XyNlr6sEoC1TmB0TBQGoaL5W1MNQyNhqHSMFosbxOqYWQ0jJSG8WJ5C2uqZWy0jJWWiWgJlF8To2WiUkAwAtjSD1ZelKgkMOkDGn8EK8Cj7gsEhVQOgWAGkCwCk0ag8kg8SnMLJJPApBKoXALBEAjJxiadQOWTeIjkFiKysUkpUDkFgikQk41NWoHKK/H4xC0kZGOTWqByCwRh2JpsbLILVHqJpwduGckvMAkGKsOY4AxjSy9Z+Wt17jKTYUxlmDg3f8tIhjGTYUyLUoIzjI5TRKBSGcYEZxjJMGYyjKkMY4IzjGQYMxnGVIYxwRlGMoyZDGMqw5jgDCMZxkyGMZVhTHCGkQxjJsOYyjAmOOOtlxCtPFAjCTMZxlSGMcEZj2QYMxnGVIZ5gjMeI5cVk2GeyjAPrAHQMxnmqQzzBGc8kp6eyTBPWwsFZzySnh6xHKoM83zrrPJMhnkqwzzBGS9YemyVeJHa2GSYpzLME5zxQtJhJsM8lWFeZCWJZzLMUxnmSYaRE8MzGeapDPMkw8iJ4ZkM81SG+ZJhCeVt32SYrzLMB2uffZNhvsowX6Zaa8rbvskwX2WYLzjjk7PKNxnmaxmX4IxPziqfSLpUhvmBlSS+yTBfZZgvOOOTs8o3GearDPMFZ3xyVvkmw3yVYb7gjE8Gfd9kmK8yzBec8cmg75sM81WGBYIzPsntwGRYoDIssDMsMBkWqAwL7AwLTIYFKsMCyTAyTQ5MhgUqwwLJMHK5CUyGBVpeLzgTkAlNQKT2KsMCwZmAnBiBybBAZVggOBOQEyMwGRaoDAsEZwKS24HJsEBlWJDYx9lkWKAyLBScCciJEZoMC1WGhYIzATkxQpNhocqwkFlhhybDQpVhodwykrMqNBkWqgwLBWcCclaFJsNClWFhYIdtMizUdo+SYeRyExIbSJVhoWQYOTFCk2GhyrBQcCYkJ0ZoMixUGRYKzoTkxAhNhoUqwyLBmZCcGJHJsEhlWCQ4E5ITIzIZFqkMiwRnQpLbkcmwSGVYJDgTktyOTIZFKsMiWZgg6RmZDItUhkWCMyFJz8hkWKQyLBKcCUmGRSbDIq1GITgTkgyLiDKFyrBIcCYiGRaZDItUhkWCMxHJsMhkWKQyLBaciUiGxSbDYpVhseBMRDIsNhkWqwyLBWcikmGxybBYZVjsWSNJbDIsVhkWC85EJD1jk2GxyrDYHsNik2GxyrBYcCYiq26xybBYZVgsOBOR3I5NhsVaJcy+l4yJWpjKsDixJuuxybBYZViytvY5MRmWqAxLJMNiqqKamAxLVIYlkmHklExMhiUqwxI7wxKTYYnKsERwJiYLj4nJsERlWBJYvZ2YDEtUhiV2hiUmwxKVYUlk97bJsERlWBJbt8CJybBEK7cKzsR0vZUouOoV17V1rJq/qc3R79r2YPV48ze9vVZ3XTOr05u/6e210uvas/q9+ZveXqu+rn2r65u/6e21AuxacCgmF4Hmb3p7rQa7Dnv8T1Rh11oZdi2YFNNV7zVRiF1rldi1IFNMF77XRC12rRVj10nP+BHl2LXGP1nEt4wfVfM3iv5gHz+y7K/xT5byY7p2T1X+9dI/2GMdUMV/vfovC/q2/hP80wUAsFfPgJIAdA1AlvVjWn6gVABdBgB7DQ0oIUBXAmRx39Z/gn+6GCDr+7b+E/zT9ACQJX56uQFCEQBNEgBZ5Y9pBYYQBUBTBYDZt6NA6AKgCQMga/2W/hPSAGjaADD7cguEOgCaPACy4h/TIhIhEICmEADriX+ERgCaSACy7m/rP8E/TScAWfqPaR2LUApAkwpAVv8TWsoixALQ1ALwetZfQi8ATTAAqQEktBpGSAagaQbg9fCPUA1Akw1AKgEJvf4RwgFoygFIMcB2f4J/mngAUg9I6PWPkA9A0w/A6+EfoSCAJiGAVAUSev0kRATQVATw7JsLIHQE0IQEkNpAYtGeCf5pWgL4Pfwj1ATQ5ASQCkFika8J/mmKAvg9/CM0BdBEBZA6QULHX0JWAE1XAL+Hf4SyAJq0AFItSOj4R4gLoKkL4Pfwj9AXQBMYQGoGCR2/CIkBNI0B/B7+ESoDaDIDSOUA1nQAJJQG0KQGCHoISIgNoKkNIAUEWNMRkBAcQFMcIOhhIKE5gCY6gNQRYE2HQEJ3AE14AKklwJqOYYT2AJr4AFJPgDUdhAj9ATQBAqSmAGs6ihAaBGgiBEhdAdZ0GCB0CNCECAia40aWkywEDzUxAqS+QG9DCDUCNDkCpMJAS0dACBKgKRIQNiy0HKYhWKipEtAjSwChS4AmTEDYsJAOBIQ2AZo4AVJvAKAnMqFPgCZQgNQcgD74BYRGAZpIAVJ3oIeQUClAkylAKg+2ISQoqCkVIMUHAHoeE2IFaGoFhHZBDAi9AjTBAqQGAZYTbIRmAZpoAZFdeQVCtgBNtwApRYDlFBwhXYCmXUDUsxkm1AvQ5AuQikTPuVKAYMm81Ro00wQ7NXEDooaddIQi9A3QBA6IehZqQuIATeMAKVvQ51sJkQM0lQOihp10gCSEDtCUDoiaY5l0hCLEDtDUDoh7FmpC7wBN8IDYfsCXUDxAkzwgbshJBzhC9QBN9gCpZIDt1CHBTk36AKlmgOXkIaF+gCZ/gFQ0gNERhlBAQJNAIO7hICGCgKaCgBQ26AhLyCCg6SAgpQ3yMDEQQghoSgjEifVIMRBaCGhiCCTN6WA6PhJ6CGiCCCQ98ZGQREDTREDKHECf4QRCFgFNF4GkoSCdZxHSCGjaCEi5gzxADoQ4Apo6AlLwoFdIQh4BTR8BKXkAfZIUCIkENI0EpOxBnxMEQiUBTSYBqXz0rQ8sotYHQkMBTUQBqYsAfVYVCB0FNCGF9QgpjBBSmCaksLU1PDJCR2GajsLWDTfp47KEkMI0IYWt7Ws3I4QUpgkprBFSaPzEKWNNR2FSFwGPjM6MEFKYJqQwKYyA5dQuoaQwTUlha2twZISQwjQhhUlhBOiDv4xQUpimpDCpjJCTkxFCCtOEFNYIKWRzQkdhmo7CpC5CxnZGyChMk1FY8/wEGdsZIaMwTUZhUhaxnMsnZBSmySiseYqCPvzMCB2FaToKa56koA9AM0JI6X4nH7J65GXNt2+ah61ub08PhH9bfGqfwPLW3UNj3xYsXrz89udy4UXNvz40/wbdv0nzb8jaf4Pm39hr/+3+39pJ2t8Lbbb9IWx/gO5P0N5L6AftD901XtfK6/7k+d0Pp2vaW4nyX/tDd7HfXex3F/vdxUF3cdBdHJ5+aPso9iDtDx3UqLMTd83j7jdJezHreiqi0Mtvf/55fnpN/robJfk3MWyp+IBA1bxxWTwzJ7/dcB4diM6jA4Gbxe2Wiwc2d6cHNs/mkrO1zu3dWImJ42i++XBndpcXOedfs6quFMg+gszcbOZ5ccw3vG6+26CYixA/o9jNnHiEeds8wrxpHw8+G4zP9k6jF3SDljjdAL1ZG/UbEFJRg3CylOXbh53qPxYiO0nobEc+a3loHzRH9jyGZvjazYWfn2pepvm9GioQsG4C+m6kFPaqHc/vVZ/FmCuO0MRfi1y85sEc28A72wtczaHXCZwtoa52YaSLfqK+086dqONN5HivUnXo+SZdROlCzWl6ngLL6Qc3ZlkchPoVukUoYUgGlL34/CyKJZjuzG3iCFtl8/rx9tPPeP4Anj9uvNocq7rYt/Gzqosyved3qRjMJ6XbAeq2W5xrXvSP4K0TDM/Nd1t+lx539aeGs/Idz5/MQUGTwC1edmabQExYRN11BprlfGshDRrpwG1cTg/jn60wJQy1iUY3t5JuJoEj3va7YlVxLDfKnIoQw7vlOWlvl3QTd92t9o4B/7SYkO5BHQvcAkFrT77u6sAOXD4Xb1oWRbEz56JBWJvVoMc2w7aTYbYl7w5lceBlnXFl+QrQLA7cFi+eb5WoiIB5brh4vhUfp1EmFZpVvtuotK46f/EAjwTDs99taTFCXIwmUtJRv5sL4gCLk9WvNS/zdJcpTvOR2323OXS3a18xiEmBF+TELRrd89qkF8pbg26O+90cXw+ze1eU7ZvnMVIPI3W22C4VenTHk4G5sVYYq4uSb1uT2VYB6CF8nrMjm5mlpm+on25L1z2vj1Wq5m4MrV7MbTo8iDd8yK6pjscpWxvG3XA9ZPcPW75Pm8n6Jcu3xRcldCCMoSNGgxcQ4JDpNqXUOKz2Ficl8RhzVFjHGX7ktqI+7KovWf1wYAcqluNcLHab/meD2el15RgjTndiNwI/1PWhW5npIQ4RUMcoKozKSFryutQWmxBN28ht2gpzeVGXfMOzxyy/lzsTAbY41nvVOIphroNU1wec3+rFFnGWAu3nHel0Nlrx+qgk4RFiuyM7m5Z46UAj7QgpyzPx8rrsP2qMwYmsG2Oat4Tvm1emY0LjKBO7OT8Tc26bVennHVfWxgBv+d1YklWoJiMMKv3EMcEtQTGXWtTBLgGITtmw28yQCTARoXF0cRtP+c4mxcZ0dEW+EV+g3aLvIaPNI04+HWsIrcHjgTCHg5VjtlfkxBYUpz+RG4WL/MB5uWm+bI4gKaPgtkC2prrv0iNjeFFzzIkbY0YfE1xRdMwUi1yUlURSfDxs01r1PUPYmKu9lray+qmgw/HRc+VFa83sK44i3kBsBMvwvHfMeU7mumVB9R0iiWP6fzJY1anmO0xez3USVN33xvA0wKMQueXWRd5Wb81ZtcbZie/K3tbcl+6DxtggHojAbSAOTFk419MDnFht+pMdBDN067bIGm25Di7eu42uzO3STZ098mYBassydLqDuOiYNx+YayqFYkTkNg8PzftxL+fSOJ45CgStbVkisRpWhLG1WygSEXfL6zRTS/oxDt+OmsgpeFP28NoCbhmNsKeWDCK0Bnf6VVeHg/VJn+umB3TTAxydzHnZnwvjeOVYVzxQNQvs3cSNXd0LLQ/dCy3xwKPoxxwTqOZFqVbdDUtDnQYZt3ICcyRE60u5ZFocipe7wNURlmr8GnPMsazZP9x4mBwrg2VNCHgRCquONdHymIu4pJXM0KB0onHgNhZE1u2h8Nxp0d0Qd/oirN3WKpwdUdMfOcCxcIszJMJihMA7Vv1QlkRBVKpEbnO7tbjn+6J8arWcXbbPFDcHKGiEbpnJKQHrPpGNSYn3IY7KEM6/KF+iBSl2mzeqfqUkiEosGmJMvO0XDwhO6RzlytaSqBKZdUkfTWffbUWoeN0mI/yR7z5ndZnW6nDgbZwrxjqrdtmj6jWlHOZqZ5/m2Z1IkFqiaB7E8qTrpOvKzZsHoaV3yoISNhCfHXco7adO8AqIcyDH7FXVh9QFEHDm4xapL8tNuAC9dowx2f64q9OcF8cK1xbV3BKFGse9CraLsnjVLJowkePM03dkHhoXz3FYhA1Dy0JYfMfxENIEsUxhqjDHuGzOfazuOLpcGiHEU2TK8cxMY8o4x4Y173a9Tbpca33KXbsDFtAtydCd6mBdxusojzQwZHBsw7fiInyAxDFcfEnLvZaio4GP3UgouFPV6f6grnPKOTI3KtZFne426SHdZLWi5Cvxwa1v7WZ+s8t4XrevfD+U/C5TKtERmsqxG69w0YHKQ3C/HRdQtfBAGcVJg+Mk0unqIxtBx7yw22s5ql/nF/OT+xhcjnc8PNjU97pqn2JOyZQGGCMkTaWa6WZKXYt9RBTfLWocK74lyYxMeW6cexTiu3ATOxARNkJud9TNiBpXjFMh5jZhv/DPZb3Zp1/3vBL6b6XpMyFC5lLc/n25OGQHvhP5wcvb3//88/8BdQfxqIjxAAA="; \ No newline at end of file +window.searchData = "data:application/octet-stream;base64,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"; \ No newline at end of file diff --git a/docs/v2.0/assets/style.css b/docs/v2.0/assets/style.css index 9d619a64..178bfb02 100644 --- a/docs/v2.0/assets/style.css +++ b/docs/v2.0/assets/style.css @@ -4,11 +4,17 @@ --light-color-background-secondary: #eff0f1; --light-color-warning-text: #222; --light-color-background-warning: #e6e600; - --light-color-icon-background: var(--light-color-background); --light-color-accent: #c5c7c9; --light-color-active-menu-item: var(--light-color-accent); --light-color-text: #222; --light-color-text-aside: #6e6e6e; + + --light-color-icon-background: var(--light-color-background); + --light-color-icon-text: var(--light-color-text); + + --light-color-comment-tag-text: var(--light-color-text); + --light-color-comment-tag: var(--light-color-background); + --light-color-link: #1f70c2; --light-color-focus-outline: #3584e4; @@ -22,16 +28,17 @@ --light-color-ts-function: #572be7; --light-color-ts-class: #1f70c2; --light-color-ts-interface: #108024; - --light-color-ts-constructor: var(--light-color-ts-class); - --light-color-ts-property: var(--light-color-ts-variable); - --light-color-ts-method: var(--light-color-ts-function); + --light-color-ts-constructor: #4d7fff; + --light-color-ts-property: #ff984d; + --light-color-ts-method: #ff4db8; + --light-color-ts-reference: #ff4d82; --light-color-ts-call-signature: var(--light-color-ts-method); --light-color-ts-index-signature: var(--light-color-ts-property); --light-color-ts-constructor-signature: var(--light-color-ts-constructor); --light-color-ts-parameter: var(--light-color-ts-variable); /* type literal not included as links will never be generated to it */ --light-color-ts-type-parameter: #a55c0e; - --light-color-ts-accessor: var(--light-color-ts-property); + --light-color-ts-accessor: #ff4d4d; --light-color-ts-get-signature: var(--light-color-ts-accessor); --light-color-ts-set-signature: var(--light-color-ts-accessor); --light-color-ts-type-alias: #d51270; @@ -46,11 +53,17 @@ --dark-color-background-secondary: #1e2024; --dark-color-background-warning: #bebe00; --dark-color-warning-text: #222; - --dark-color-icon-background: var(--dark-color-background-secondary); --dark-color-accent: #9096a2; --dark-color-active-menu-item: #5d5d6a; --dark-color-text: #f5f5f5; --dark-color-text-aside: #dddddd; + + --dark-color-icon-background: var(--dark-color-background-secondary); + --dark-color-icon-text: var(--dark-color-text); + + --dark-color-comment-tag-text: var(--dark-color-text); + --dark-color-comment-tag: var(--dark-color-background); + --dark-color-link: #00aff4; --dark-color-focus-outline: #4c97f2; @@ -64,16 +77,17 @@ --dark-color-ts-function: #a280ff; --dark-color-ts-class: #8ac4ff; --dark-color-ts-interface: #6cff87; - --dark-color-ts-constructor: var(--dark-color-ts-class); - --dark-color-ts-property: var(--dark-color-ts-variable); - --dark-color-ts-method: var(--dark-color-ts-function); + --dark-color-ts-constructor: #4d7fff; + --dark-color-ts-property: #ff984d; + --dark-color-ts-method: #ff4db8; + --dark-color-ts-reference: #ff4d82; --dark-color-ts-call-signature: var(--dark-color-ts-method); --dark-color-ts-index-signature: var(--dark-color-ts-property); --dark-color-ts-constructor-signature: var(--dark-color-ts-constructor); --dark-color-ts-parameter: var(--dark-color-ts-variable); /* type literal not included as links will never be generated to it */ --dark-color-ts-type-parameter: #e07d13; - --dark-color-ts-accessor: var(--dark-color-ts-property); + --dark-color-ts-accessor: #ff4d4d; --dark-color-ts-get-signature: var(--dark-color-ts-accessor); --dark-color-ts-set-signature: var(--dark-color-ts-accessor); --dark-color-ts-type-alias: #ff6492; @@ -90,15 +104,22 @@ --color-background-secondary: var(--light-color-background-secondary); --color-background-warning: var(--light-color-background-warning); --color-warning-text: var(--light-color-warning-text); - --color-icon-background: var(--light-color-icon-background); --color-accent: var(--light-color-accent); --color-active-menu-item: var(--light-color-active-menu-item); --color-text: var(--light-color-text); --color-text-aside: var(--light-color-text-aside); + + --color-icon-background: var(--light-color-icon-background); + --color-icon-text: var(--light-color-icon-text); + + --color-comment-tag-text: var(--light-color-text); + --color-comment-tag: var(--light-color-background); + --color-link: var(--light-color-link); --color-focus-outline: var(--light-color-focus-outline); --color-ts-keyword: var(--light-color-ts-keyword); + --color-ts-project: var(--light-color-ts-project); --color-ts-module: var(--light-color-ts-module); --color-ts-namespace: var(--light-color-ts-namespace); --color-ts-enum: var(--light-color-ts-enum); @@ -110,6 +131,7 @@ --color-ts-constructor: var(--light-color-ts-constructor); --color-ts-property: var(--light-color-ts-property); --color-ts-method: var(--light-color-ts-method); + --color-ts-reference: var(--light-color-ts-reference); --color-ts-call-signature: var(--light-color-ts-call-signature); --color-ts-index-signature: var(--light-color-ts-index-signature); --color-ts-constructor-signature: var( @@ -134,15 +156,22 @@ --color-background-secondary: var(--dark-color-background-secondary); --color-background-warning: var(--dark-color-background-warning); --color-warning-text: var(--dark-color-warning-text); - --color-icon-background: var(--dark-color-icon-background); --color-accent: var(--dark-color-accent); --color-active-menu-item: var(--dark-color-active-menu-item); --color-text: var(--dark-color-text); --color-text-aside: var(--dark-color-text-aside); + + --color-icon-background: var(--dark-color-icon-background); + --color-icon-text: var(--dark-color-icon-text); + + --color-comment-tag-text: var(--dark-color-text); + --color-comment-tag: var(--dark-color-background); + --color-link: var(--dark-color-link); --color-focus-outline: var(--dark-color-focus-outline); --color-ts-keyword: var(--dark-color-ts-keyword); + --color-ts-project: var(--dark-color-ts-project); --color-ts-module: var(--dark-color-ts-module); --color-ts-namespace: var(--dark-color-ts-namespace); --color-ts-enum: var(--dark-color-ts-enum); @@ -154,6 +183,7 @@ --color-ts-constructor: var(--dark-color-ts-constructor); --color-ts-property: var(--dark-color-ts-property); --color-ts-method: var(--dark-color-ts-method); + --color-ts-reference: var(--dark-color-ts-reference); --color-ts-call-signature: var(--dark-color-ts-call-signature); --color-ts-index-signature: var(--dark-color-ts-index-signature); --color-ts-constructor-signature: var( @@ -190,10 +220,16 @@ body { --color-active-menu-item: var(--light-color-active-menu-item); --color-text: var(--light-color-text); --color-text-aside: var(--light-color-text-aside); + --color-icon-text: var(--light-color-icon-text); + + --color-comment-tag-text: var(--light-color-text); + --color-comment-tag: var(--light-color-background); + --color-link: var(--light-color-link); --color-focus-outline: var(--light-color-focus-outline); --color-ts-keyword: var(--light-color-ts-keyword); + --color-ts-project: var(--light-color-ts-project); --color-ts-module: var(--light-color-ts-module); --color-ts-namespace: var(--light-color-ts-namespace); --color-ts-enum: var(--light-color-ts-enum); @@ -205,6 +241,7 @@ body { --color-ts-constructor: var(--light-color-ts-constructor); --color-ts-property: var(--light-color-ts-property); --color-ts-method: var(--light-color-ts-method); + --color-ts-reference: var(--light-color-ts-reference); --color-ts-call-signature: var(--light-color-ts-call-signature); --color-ts-index-signature: var(--light-color-ts-index-signature); --color-ts-constructor-signature: var( @@ -232,10 +269,16 @@ body { --color-active-menu-item: var(--dark-color-active-menu-item); --color-text: var(--dark-color-text); --color-text-aside: var(--dark-color-text-aside); + --color-icon-text: var(--dark-color-icon-text); + + --color-comment-tag-text: var(--dark-color-text); + --color-comment-tag: var(--dark-color-background); + --color-link: var(--dark-color-link); --color-focus-outline: var(--dark-color-focus-outline); --color-ts-keyword: var(--dark-color-ts-keyword); + --color-ts-project: var(--dark-color-ts-project); --color-ts-module: var(--dark-color-ts-module); --color-ts-namespace: var(--dark-color-ts-namespace); --color-ts-enum: var(--dark-color-ts-enum); @@ -247,6 +290,7 @@ body { --color-ts-constructor: var(--dark-color-ts-constructor); --color-ts-property: var(--dark-color-ts-property); --color-ts-method: var(--dark-color-ts-method); + --color-ts-reference: var(--dark-color-ts-reference); --color-ts-call-signature: var(--dark-color-ts-call-signature); --color-ts-index-signature: var(--dark-color-ts-index-signature); --color-ts-constructor-signature: var( @@ -439,7 +483,6 @@ pre { pre { position: relative; - white-space: pre; white-space: pre-wrap; word-wrap: break-word; padding: 10px; @@ -860,6 +903,12 @@ a.tsd-index-link { margin-bottom: 0.75rem; } +.tsd-no-select { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} .tsd-kind-icon { margin-right: 0.5rem; width: 1.25rem; @@ -867,10 +916,6 @@ a.tsd-index-link { min-width: 1.25rem; min-height: 1.25rem; } -.tsd-kind-icon path { - transform-origin: center; - transform: scale(1.1); -} .tsd-signature > .tsd-kind-icon { margin-right: 0.8rem; } @@ -1242,6 +1287,9 @@ img { .tsd-kind-method { color: var(--color-ts-method); } +.tsd-kind-reference { + color: var(--color-ts-reference); +} .tsd-kind-call-signature { color: var(--color-ts-call-signature); } @@ -1254,9 +1302,6 @@ img { .tsd-kind-parameter { color: var(--color-ts-parameter); } -.tsd-kind-type-literal { - color: var(--color-ts-type-literal); -} .tsd-kind-type-parameter { color: var(--color-ts-type-parameter); } @@ -1435,7 +1480,7 @@ img { } .site-menu { - margin-top: 1rem 0; + margin-top: 1rem; } .page-menu, diff --git a/docs/v2.0/classes/p2p_media_loader_core.Core.html b/docs/v2.0/classes/p2p_media_loader_core.Core.html index 835587a1..06cc596b 100644 --- a/docs/v2.0/classes/p2p_media_loader_core.Core.html +++ b/docs/v2.0/classes/p2p_media_loader_core.Core.html @@ -156,8 +156,8 @@ --md-sys-color-surface-container-high: #efe7de; --md-sys-color-surface-container-highest: #e9e1d9 } -

Core class for managing media streams loading via P2P.

-

Type Parameters

Constructors

constructor +

Core class for managing media streams loading via P2P.

+

Type Parameters

Constructors

Properties

Methods

getConfig @@ -178,64 +178,64 @@ destroy

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
    }); +

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(); +
// 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.

    +

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 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); +

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.

    +
  • 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.

    • OptionaladdSegments: Iterable<Segment, any, any>

      Optional segments to add to the stream.

    • OptionalremoveSegmentIds: Iterable<string, any, any>

      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. +

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>

      +

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

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

-

Hierarchy

  • Error
    • CoreRequestError

Constructors

constructor +

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

+

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'.

-

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

+

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

Properties

timestamp: number

Error timestamp.

-
type: T

The specific error type.

-

Represents a P2P (peer-to-peer) engine for HLS (HTTP Live Streaming) to enhance media streaming efficiency. +

Represents a P2P (peer-to-peer) engine for HLS (HTTP Live Streaming) to enhance media streaming efficiency. This class integrates P2P technologies into HLS.js, enabling the distribution of media segments via a peer network alongside traditional HTTP fetching. It reduces server bandwidth costs and improves scalability by sharing the load across multiple clients.

The engine manages core functionalities such as segment fetching, segment management, peer connection management, and event handling related to the P2P and HLS processes.

-
// Creating an instance of HlsJsP2PEngine with custom configuration
const hlsP2PEngine = new HlsJsP2PEngine({
core: {
highDemandTimeWindow: 30, // 30 seconds
simultaneousHttpDownloads: 3,
webRtcMaxMessageSize: 64 * 1024, // 64 KB
p2pNotReceivingBytesTimeoutMs: 10000, // 10 seconds
p2pInactiveLoaderDestroyTimeoutMs: 15000, // 15 seconds
httpNotReceivingBytesTimeoutMs: 8000, // 8 seconds
httpErrorRetries: 2,
p2pErrorRetries: 2,
announceTrackers: ["wss://personal.tracker.com"],
rtcConfig: {
iceServers: [{ urls: "stun:personal.stun.com" }]
},
swarmId: "example-swarm-id"
}
}); +
// Creating an instance of HlsJsP2PEngine with custom configuration
const hlsP2PEngine = new HlsJsP2PEngine({
core: {
highDemandTimeWindow: 30, // 30 seconds
simultaneousHttpDownloads: 3,
webRtcMaxMessageSize: 64 * 1024, // 64 KB
p2pNotReceivingBytesTimeoutMs: 10000, // 10 seconds
p2pInactiveLoaderDestroyTimeoutMs: 15000, // 15 seconds
httpNotReceivingBytesTimeoutMs: 8000, // 8 seconds
httpErrorRetries: 2,
p2pErrorRetries: 2,
announceTrackers: ["wss://personal.tracker.com"],
rtcConfig: {
iceServers: [{ urls: "stun:personal.stun.com" }]
},
swarmId: "example-swarm-id"
}
});
-

Constructors

Constructors

Methods

Constructors

Methods

  • Enhances a given Hls.js class by injecting additional P2P (peer-to-peer) functionalities.

    +

Returns HlsJsP2PEngine

Methods

  • Enhances a given Hls.js class by injecting additional P2P (peer-to-peer) functionalities.

    Parameters

    • hls: typeof Hls

    Returns (new (config?: Partial<HlsConfig> & {
        p2p?: Partial<Omit<HlsJsP2PEngineConfig, "core">> & {
            core?: Partial<CoreConfig>;
        } & {
            onHlsJsCreated?: ((hls: HlsWithP2PInstance<typeof Hls>) => void);
        };
    }) => HlsWithP2PInstance<Hls>)

    • The enhanced Hls.js class with P2P functionalities.
    -
    const HlsWithP2P = HlsJsP2PEngine.injectMixin(Hls);

    const hls = new HlsWithP2P({
    // Hls.js configuration
    startLevel: 0, // Example of Hls.js config parameter
    p2p: {
    core: {
    // P2P core configuration
    },
    onHlsJsCreated(hls) {
    // Do something with the Hls.js instance
    },
    },
    }); +
    const HlsWithP2P = HlsJsP2PEngine.injectMixin(Hls);

    const hls = new HlsWithP2P({
    // Hls.js configuration
    startLevel: 0, // Example of Hls.js config parameter
    p2p: {
    core: {
    // P2P core configuration
    },
    onHlsJsCreated(hls) {
    // Do something with the Hls.js instance
    },
    },
    });
    -
  • Adds an event listener for the specified event.

    +
  • Adds an event listener for the specified event.

    Type Parameters

    Parameters

    • eventName: K

      The name of the event to listen for.

    • listener: CoreEventMap[K]

      The callback function to be invoked when the event is triggered.

      -

    Returns void

    // Listening for a segment being successfully loaded
    p2pEngine.addEventListener('onSegmentLoaded', (details) => {
    console.log('Segment Loaded:', details);
    }); +

Returns void

// Listening for a segment being successfully loaded
p2pEngine.addEventListener('onSegmentLoaded', (details) => {
console.log('Segment Loaded:', details);
});
-
// Handling segment load errors
p2pEngine.addEventListener('onSegmentError', (errorDetails) => {
console.error('Error loading segment:', errorDetails);
}); +
// Handling segment load errors
p2pEngine.addEventListener('onSegmentError', (errorDetails) => {
console.error('Error loading segment:', errorDetails);
});
-
// Tracking data downloaded from peers
p2pEngine.addEventListener('onChunkDownloaded', (bytesLength, downloadSource, peerId) => {
console.log(`Downloaded ${bytesLength} bytes from ${downloadSource} ${peerId ? 'from peer ' + peerId : 'from server'}`);
}); +
// Tracking data downloaded from peers
p2pEngine.addEventListener('onChunkDownloaded', (bytesLength, downloadSource, peerId) => {
console.log(`Downloaded ${bytesLength} bytes from ${downloadSource} ${peerId ? 'from peer ' + peerId : 'from server'}`);
});
-
  • Removes an event listener for the specified event.

    +
  • Removes an event listener for the specified event.

    Type Parameters

    Parameters

    • eventName: K

      The name of the event.

    • listener: CoreEventMap[K]

      The callback function that was previously added.

      -

    Returns void

  • provides the Hls.js P2P specific configuration for Hls.js loaders.

    -

    Type Parameters

    • F = unknown
    • P = unknown

    Returns {
        fLoader: F;
        pLoader: P;
    }

    An object with fragment loader (fLoader) and playlist loader (pLoader).

    -
    • fLoader: F
    • pLoader: P

Returns void

  • provides the Hls.js P2P specific configuration for Hls.js loaders.

    +

    Returns {
        fLoader: unknown;
        pLoader: unknown;
    }

    An object with fragment loader (fLoader) and playlist loader (pLoader).

    +
    • fLoader: unknown
    • pLoader: unknown
  • Applies dynamic configuration updates to the P2P engine.

    +
  • Applies dynamic configuration updates to the P2P engine.

    Parameters

    Returns void

    // Assuming `hlsP2PEngine` is an instance of HlsJsP2PEngine

    const newDynamicConfig = {
    core: {
    // Increase the number of cached segments to 1000
    cachedSegmentsCount: 1000,
    // 50 minutes of segments will be downloaded further through HTTP connections if P2P fails
    httpDownloadTimeWindow: 3000,
    // 100 minutes of segments will be downloaded further through P2P connections
    p2pDownloadTimeWindow: 6000,
    };

    hlsP2PEngine.applyDynamicConfig(newDynamicConfig); +

Returns void

// Assuming `hlsP2PEngine` is an instance of HlsJsP2PEngine

const newDynamicConfig = {
core: {
// Increase the number of cached segments to 1000
cachedSegmentsCount: 1000,
// 50 minutes of segments will be downloaded further through HTTP connections if P2P fails
httpDownloadTimeWindow: 3000,
// 100 minutes of segments will be downloaded further through P2P connections
p2pDownloadTimeWindow: 6000,
};

hlsP2PEngine.applyDynamicConfig(newDynamicConfig);
-
  • Sets the HLS instance for handling media.

    +
  • Sets the HLS instance for handling media.

    Type Parameters

    • T = unknown

    Parameters

    • hls: T | (() => T)

      The HLS instance or a function that returns an HLS instance.

      -

    Returns void

  • Clean up and release all resources. Unregister all event handlers.

    -

    Returns void

Represents a P2P (peer-to-peer) engine for HLS (HTTP Live Streaming) to enhance media streaming efficiency. +

Represents a P2P (peer-to-peer) engine for HLS (HTTP Live Streaming) to enhance media streaming efficiency. This class integrates P2P technologies into Shaka Player, enabling the distribution of media segments via a peer network alongside traditional HTTP fetching. It reduces server bandwidth costs and improves scalability by sharing the load across multiple clients.

The engine manages core functionalities such as segment fetching, segment management, peer connection management, and event handling related to the P2P and HLS processes.

-
// Initializing the ShakaP2PEngine with custom configuration
const shakaP2PEngine = new ShakaP2PEngine({
core: {
highDemandTimeWindow: 30, // 30 seconds
simultaneousHttpDownloads: 3,
webRtcMaxMessageSize: 64 * 1024, // 64 KB
p2pNotReceivingBytesTimeoutMs: 10000, // 10 seconds
p2pInactiveLoaderDestroyTimeoutMs: 15000, // 15 seconds
httpNotReceivingBytesTimeoutMs: 8000, // 8 seconds
httpErrorRetries: 2,
p2pErrorRetries: 2,
announceTrackers: ["wss://personal.tracker.com"],
rtcConfig: {
iceServers: [{ urls: "stun:personal.stun.com" }]
},
swarmId: "example-swarm-id"
}
}); +
// Initializing the ShakaP2PEngine with custom configuration
const shakaP2PEngine = new ShakaP2PEngine({
core: {
highDemandTimeWindow: 30, // 30 seconds
simultaneousHttpDownloads: 3,
webRtcMaxMessageSize: 64 * 1024, // 64 KB
p2pNotReceivingBytesTimeoutMs: 10000, // 10 seconds
p2pInactiveLoaderDestroyTimeoutMs: 15000, // 15 seconds
httpNotReceivingBytesTimeoutMs: 8000, // 8 seconds
httpErrorRetries: 2,
p2pErrorRetries: 2,
announceTrackers: ["wss://personal.tracker.com"],
rtcConfig: {
iceServers: [{ urls: "stun:personal.stun.com" }]
},
swarmId: "example-swarm-id"
}
});
-

Constructors

Constructors

Methods

Constructors

  • Constructs an instance of ShakaP2PEngine.

    Parameters

    • Optionalconfig: PartialShakaEngineConfig

      Optional configuration for customizing the P2P engine's behavior.

    • shaka: typeof shaka = window.shaka

      The Shaka Player library instance.

      -

    Returns ShakaP2PEngine

Methods

  • Configures and initializes the Shaka Player instance with predefined settings for optimal P2P performance.

    +

Returns ShakaP2PEngine

Methods

  • Configures and initializes the Shaka Player instance with predefined settings for optimal P2P performance.

    Parameters

    • player: Player

      The Shaka Player instance to configure.

      -

    Returns void

  • Applies dynamic configuration updates to the P2P engine.

    +

Returns void

  • Applies dynamic configuration updates to the P2P engine.

    Parameters

    Returns void

    // Assuming `shakaP2PEngine` is an instance of ShakaP2PEngine

    const newDynamicConfig = {
    core: {
    // Increase the number of cached segments to 1000
    cachedSegmentsCount: 1000,
    // 50 minutes of segments will be downloaded further through HTTP connections if P2P fails
    httpDownloadTimeWindow: 3000,
    // 100 minutes of segments will be downloaded further through P2P connections
    p2pDownloadTimeWindow: 6000,
    };

    shakaP2PEngine.applyDynamicConfig(newDynamicConfig); +

Returns void

// Assuming `shakaP2PEngine` is an instance of ShakaP2PEngine

const newDynamicConfig = {
core: {
// Increase the number of cached segments to 1000
cachedSegmentsCount: 1000,
// 50 minutes of segments will be downloaded further through HTTP connections if P2P fails
httpDownloadTimeWindow: 3000,
// 100 minutes of segments will be downloaded further through P2P connections
p2pDownloadTimeWindow: 6000,
};

shakaP2PEngine.applyDynamicConfig(newDynamicConfig);
-
  • Adds an event listener for the specified event.

    +
  • Adds an event listener for the specified event.

    Type Parameters

    Parameters

    • eventName: K

      The name of the event to listen for.

    • listener: CoreEventMap[K]

      The callback function to be invoked when the event is triggered.

      -

    Returns void

    // Listening for a segment being successfully loaded
    shakaP2PEngine.addEventListener('onSegmentLoaded', (details) => {
    console.log('Segment Loaded:', details);
    }); +

Returns void

// Listening for a segment being successfully loaded
shakaP2PEngine.addEventListener('onSegmentLoaded', (details) => {
console.log('Segment Loaded:', details);
});
-
// Handling segment load errors
shakaP2PEngine.addEventListener('onSegmentError', (errorDetails) => {
console.error('Error loading segment:', errorDetails);
}); +
// Handling segment load errors
shakaP2PEngine.addEventListener('onSegmentError', (errorDetails) => {
console.error('Error loading segment:', errorDetails);
});
-
// Tracking data downloaded from peers
shakaP2PEngine.addEventListener('onChunkDownloaded', (bytesLength, downloadSource, peerId) => {
console.log(`Downloaded ${bytesLength} bytes from ${downloadSource} ${peerId ? 'from peer ' + peerId : 'from server'}`);
}); +
// Tracking data downloaded from peers
shakaP2PEngine.addEventListener('onChunkDownloaded', (bytesLength, downloadSource, peerId) => {
console.log(`Downloaded ${bytesLength} bytes from ${downloadSource} ${peerId ? 'from peer ' + peerId : 'from server'}`);
});
-
  • Removes an event listener for the specified event.

    +
  • Removes an event listener for the specified event.

    Type Parameters

    Parameters

    • eventName: K

      The name of the event.

    • listener: CoreEventMap[K]

      The callback function that was previously added.

      -

    Returns void

  • Clean up and release all resources. Unregister all event handlers.

    -

    Returns void

  • Registers plugins related to P2P functionality into the Shaka Player. +

Returns void

  • Clean up and release all resources. Unregister all event handlers.

    +

    Returns void

  • Registers plugins related to P2P functionality into the Shaka Player. Plugins must be registered before initializing the player to ensure proper integration.

    Parameters

    • shaka: typeof shaka = window.shaka

      The Shaka Player library. Defaults to the global Shaka Player instance if not provided.

      -

    Returns void

  • Unregister plugins related to P2P functionality from the Shaka Player.

    +

Returns void

  • Unregister plugins related to P2P functionality from the Shaka Player.

    Parameters

    • shaka: typeof shaka = window.shaka

      The Shaka Player library. Defaults to the global Shaka Player instance if not provided.

      -

    Returns void

P2P Media Loader Documentation

    +

    P2P Media Loader Documentation

    • GitHub
    • NPM Packages
        @@ -262,7 +262,7 @@
        <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>
        -

    Segments storage interface

    -
    interface SegmentStorage {
        initialize(coreConfig: CommonCoreConfig, mainStreamConfig: StreamConfig, secondaryStreamConfig: StreamConfig): Promise<void>;
        onPlaybackUpdated(position: number, rate: number): void;
        onSegmentRequested(swarmId: string, streamId: string, segmentId: number, startTime: number, endTime: number, streamType: StreamType, isLiveStream: boolean): void;
        storeSegment(swarmId: string, streamId: string, segmentId: number, data: ArrayBuffer, startTime: number, endTime: number, streamType: StreamType, isLiveStream: boolean): Promise<void>;
        getSegmentData(swarmId: string, streamId: string, segmentId: number): Promise<undefined | ArrayBuffer>;
        getUsage(): {
            totalCapacity: number;
            usedCapacity: number;
        };
        hasSegment(swarmId: string, streamId: string, segmentId: number): boolean;
        getStoredSegmentIds(swarmId: string, streamId: string): number[];
        setSegmentChangeCallback(callback: ((streamId: string) => void)): void;
        destroy(): void;
    }

    Methods

    initialize +

    Segments storage interface

    +
    interface SegmentStorage {
        initialize(coreConfig: CommonCoreConfig, mainStreamConfig: StreamConfig, secondaryStreamConfig: StreamConfig): Promise<void>;
        onPlaybackUpdated(position: number, rate: number): void;
        onSegmentRequested(swarmId: string, streamId: string, segmentId: number, startTime: number, endTime: number, streamType: StreamType, isLiveStream: boolean): void;
        storeSegment(swarmId: string, streamId: string, segmentId: number, data: ArrayBuffer, startTime: number, endTime: number, streamType: StreamType, isLiveStream: boolean): Promise<void>;
        getSegmentData(swarmId: string, streamId: string, segmentId: number): Promise<undefined | ArrayBuffer>;
        getUsage(): {
            totalCapacity: number;
            usedCapacity: number;
        };
        hasSegment(swarmId: string, streamId: string, segmentId: number): boolean;
        getStoredSegmentIds(swarmId: string, streamId: string): number[];
        setSegmentChangeCallback(callback: ((streamId: string) => void)): void;
        destroy(): void;
    }

    Methods

    Parameters

    Returns Promise<void>

  • Provides playback position from player

    +

Returns Promise<void>

  • Provides playback position from player

    Parameters

    • position: number

      Playback position

    • rate: number

      Playback rate

      -

    Returns void

  • Provides segment request information from player

    +

Returns void

  • Provides segment request information from player

    Parameters

    • swarmId: string

      Swarm identifier

    • streamId: string

      Stream identifier

    • segmentId: number

      Segment identifier

      @@ -182,7 +182,7 @@
    • endTime: number

      Segment end time

    • streamType: StreamType

      Stream type

    • isLiveStream: boolean

      Is live stream

      -

    Returns void

  • Stores segment data

    +

Returns void

  • Stores segment data

    Parameters

    • swarmId: string

      Swarm identifier

    • streamId: string

      Stream identifier

    • segmentId: number

      Segment identifier

      @@ -191,22 +191,22 @@
    • endTime: number

      Segment end time

    • streamType: StreamType

      Stream type

    • isLiveStream: boolean

      Is live stream

      -

    Returns Promise<void>

  • Returns segment data

    +

Returns Promise<void>

  • Returns segment data

    Parameters

    • swarmId: string

      Swarm identifier

    • streamId: string

      Stream identifier

    • segmentId: number

      Segment identifier

      -

    Returns Promise<undefined | ArrayBuffer>

  • Returns used memory information in the storage

    -

    Returns {
        totalCapacity: number;
        usedCapacity: number;
    }

    • totalCapacity: number
    • usedCapacity: number
  • Returns true if segment is in storage

    +

Returns Promise<undefined | ArrayBuffer>

  • Returns used memory information in the storage

    +

    Returns {
        totalCapacity: number;
        usedCapacity: number;
    }

    • totalCapacity: number
    • usedCapacity: number
  • Returns true if segment is in storage

    Parameters

    • swarmId: string

      Swarm identifier

    • streamId: string

      Stream identifier

    • segmentId: number

      Segment identifier

      -

    Returns boolean

  • Returns segment IDs of a stream that are stored in the storage

    +

Returns boolean

  • Returns segment IDs of a stream that are stored in the storage

    Parameters

    • swarmId: string

      Swarm identifier

    • streamId: string

      Stream identifier

      -

    Returns number[]

  • Sets segment change callback function

    +

Returns number[]

  • Sets segment change callback function

    Parameters

    • callback: ((streamId: string) => void)

      Callback function that has to be called when segments appear or disappear in the storage

      -
        • (streamId): void
        • Parameters

          • streamId: string

          Returns void

    Returns void

P2P Media Loader Documentation

Index

diff --git a/docs/v2.0/modules/p2p_media_loader_core.html b/docs/v2.0/modules/p2p_media_loader_core.html index 8d41e119..eb812d7d 100644 --- a/docs/v2.0/modules/p2p_media_loader_core.html +++ b/docs/v2.0/modules/p2p_media_loader_core.html @@ -156,7 +156,7 @@ --md-sys-color-surface-container-high: #efe7de; --md-sys-color-surface-container-highest: #e9e1d9 } -

Index

Classes

Core +

Index

Classes

HlsJsP2PEngine +

Index

Classes

ShakaP2PEngine +
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.

    -
CommonCoreConfig: {
    segmentMemoryStorageLimit: number | undefined;
    customSegmentStorageFactory?: ((isLive: boolean) => SegmentStorage);
}

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

+
CommonCoreConfig: {
    segmentMemoryStorageLimit: number | undefined;
    customSegmentStorageFactory?: ((isLive: boolean) => SegmentStorage);
}

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

Type declaration

  • segmentMemoryStorageLimit: number | undefined

    Defines the memory storage limit for media segments, in MiB.

    -
    segmentMemoryStorageLimit: undefined
    +
    segmentMemoryStorageLimit: undefined
     
      @@ -172,11 +172,11 @@
-
  • OptionalcustomSegmentStorageFactory?: ((isLive: boolean) => SegmentStorage)

    Optional custom storage factory for the segments storage.

    -
    customSegmentStorageFactory: undefined
    +
  • OptionalcustomSegmentStorageFactory?: ((isLive: boolean) => SegmentStorage)

    Optional custom storage factory for the segments storage.

    +
    customSegmentStorageFactory: undefined
     
    -
  • 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

    • OptionalmainStream?: Partial<StreamConfig>

      Optional configuration for the main stream.

    • OptionalsecondaryStream?: Partial<StreamConfig>

      Optional configuration for the secondary stream.

      -
    const config: CoreConfig = {
    highDemandTimeWindow: 15,
    httpDownloadTimeWindow: 3000,
    p2pDownloadTimeWindow: 6000,
    swarmId: "custom swarm ID for video stream",
    cashedSegmentsCount: 1000,
    } +
    const config: CoreConfig = {
    highDemandTimeWindow: 15,
    httpDownloadTimeWindow: 3000,
    p2pDownloadTimeWindow: 6000,
    swarmId: "custom swarm ID for 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",
    }, +
    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",
    },
    -
    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 +

    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: SegmentLoadDetails) => void)

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

        • (params): void
        • Parameters

          • params: SegmentLoadDetails

            Contains information about the loaded segment.

            @@ -183,7 +183,7 @@
              • (params): void
              • Parameters

                Returns void

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

            Called when a warning occurs during the tracker request process.

              • (params): void
              • Parameters

                Returns void

    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.

      -
    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.

    -
    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.

    +
    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,
    }
    }; +
    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,
    }
    };
    -
    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"
        | "isP2PUploadDisabled"

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

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

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

    +
    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: CoreRequestError) => void)

      Called when the operation encounters an error.

        • (reason): void
        • Parameters

          Returns void

    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.

    +
    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.

      -
    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.

      -
    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.

    +
    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.

    +

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

    -

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

    +
    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.

    +
    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.

      -
    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.

      -
    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.

      -
    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.

      -
    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.

      -
    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.

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

    Extends a Segment with a reference to its associated stream.

    -

    Type Parameters

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

    Extends a Segment with a reference to its associated stream.

    +

    Type Parameters

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

    Represents a media stream with various defining characteristics.

    +
    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.

      -
    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. +

      StreamConfig: {
          isP2PUploadDisabled: boolean;
          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 | undefined, data: ArrayBuffer) => 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

      • isP2PUploadDisabled: boolean

        Indicates if Peer-to-Peer (P2P) upload is disabled for the stream. +If true, the stream only downloads segments without uploading to peers.

        +
        isP2PUploadDisabled: false
        +
        + +
      • 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.

        -
        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. +

    • 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.

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

      Defines the time window, in seconds, for HTTP segment downloads. This property specifies the duration +

  • 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.

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

    Defines the time window, in seconds, dedicated to pre-fetching media segments via Peer-to-Peer (P2P) downloads. +

  • 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.

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

    Maximum number of simultaneous HTTP downloads allowed.

    -
    simultaneousHttpDownloads: 2
    +
  • simultaneousHttpDownloads: number

    Maximum number of simultaneous HTTP downloads allowed.

    +
    simultaneousHttpDownloads: 2
     
    -
  • simultaneousP2PDownloads: number

    Maximum number of simultaneous P2P downloads allowed.

    -
    simultaneousP2PDownloads: 3
    +
  • simultaneousP2PDownloads: number

    Maximum number of simultaneous P2P downloads allowed.

    +
    simultaneousP2PDownloads: 3
     
    -
  • webRtcMaxMessageSize: number

    Maximum message size for WebRTC communications, in bytes.

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

    Maximum message size for WebRTC communications, in bytes.

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

    Timeout for not receiving bytes from P2P, in milliseconds.

    -
    p2pNotReceivingBytesTimeoutMs: 2000
    +
  • p2pNotReceivingBytesTimeoutMs: number

    Timeout for not receiving bytes from P2P, in milliseconds.

    +
    p2pNotReceivingBytesTimeoutMs: 2000
     
    -
  • p2pInactiveLoaderDestroyTimeoutMs: number

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

    -
    p2pInactiveLoaderDestroyTimeoutMs: 30 * 1000
    +
  • p2pInactiveLoaderDestroyTimeoutMs: number

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

    +
    p2pInactiveLoaderDestroyTimeoutMs: 30 * 1000
     
    -
  • httpNotReceivingBytesTimeoutMs: number

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

    -
    httpNotReceivingBytesTimeoutMs: 3000
    +
  • httpNotReceivingBytesTimeoutMs: number

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

    +
    httpNotReceivingBytesTimeoutMs: 3000
     
    -
  • httpErrorRetries: number

    Number of retries allowed after an HTTP error.

    -
    httpErrorRetries: 3
    +
  • httpErrorRetries: number

    Number of retries allowed after an HTTP error.

    +
    httpErrorRetries: 3
     
    -
  • p2pErrorRetries: number

    Number of retries allowed after a P2P error.

    -
    p2pErrorRetries: 3
    +
  • p2pErrorRetries: number

    Number of retries allowed after a P2P error.

    +
    p2pErrorRetries: 3
     
    -
  • announceTrackers: string[]

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

    +
  • 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.

    -

    The default trackers used are:

    +

    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. +

  • 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.

    -

    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" }
    ]
    }
    } +
    {
    "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. +

  • 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.

    -
    trackerClientVersionPrefix: undefined
    +
    trackerClientVersionPrefix: undefined
     
    -
  • OptionalswarmId?: string

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

  • 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.

    -
    swarmId: 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
    +
  • OptionalvalidateP2PSegment?: ((url: string, byteRange: ByteRange | undefined, data: ArrayBuffer) => 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.

          -
        • OptionalbyteRange: ByteRange

          Optional byte range of the segment.

          +
          • (url, byteRange, data): Promise<boolean>
          • Parameters

            • url: string

              URL of the segment to validate.

              +
            • byteRange: ByteRange | undefined

              Optional byte range of the segment.

              +
            • data: ArrayBuffer

              Downloaded segment data.

            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
        +
        httpRequestSetup: undefined
         
        -
          • (segmentUrl, segmentByteRange, requestAbortSignal, requestByteRange): Promise<Request | undefined | null>
          • Parameters

            • segmentUrl: string

              URL of the segment.

              +
              • (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>

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

                -
  • 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.

    +
    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.

      -
    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.

      -
    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.

        -
      DynamicHlsJsP2PEngineConfig: {
          core?: DynamicCoreConfig;
      }

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

      +
      DynamicHlsJsP2PEngineConfig: {
          core?: DynamicCoreConfig;
      }

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

      Type declaration

      HlsJsP2PEngineConfig: {
          core: DefinedCoreConfig;
      }

      Represents the complete configuration for HlsJsP2PEngine.

      +
      HlsJsP2PEngineConfig: {
          core: DefinedCoreConfig;
      }

      Represents the complete configuration for HlsJsP2PEngine.

      Type declaration

      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.

      +
      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.

        -
      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

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

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

      +
      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

        -
      DynamicShakaP2PEngineConfig: {
          core?: DynamicCoreConfig;
      }

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

      +
      DynamicShakaP2PEngineConfig: {
          core?: DynamicCoreConfig;
      }

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

      Type declaration

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

      Allows for partial configuration settings for the Shaka P2P Engine.

      +
      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

        -
      ShakaP2PEngineConfig: {
          core: DefinedCoreConfig;
      }

      Represents the complete configuration for ShakaP2PEngine.

      +
      ShakaP2PEngineConfig: {
          core: DefinedCoreConfig;
      }

      Represents the complete configuration for ShakaP2PEngine.

      Type declaration