From c3de3acee6f2660e74f91c909f03a9ed7625cd59 Mon Sep 17 00:00:00 2001 From: Dmytro Demchenko Date: Tue, 21 Jan 2025 10:05:25 +0200 Subject: [PATCH] docs: Update API doc v2.1.0 --- docs/v2.1.0/assets/hierarchy.js | 1 + docs/v2.1.0/assets/icons.js | 2 +- docs/v2.1.0/assets/icons.svg | 2 +- docs/v2.1.0/assets/main.js | 10 +- docs/v2.1.0/assets/material-style.css | 116 +- docs/v2.1.0/assets/navigation.js | 2 +- docs/v2.1.0/assets/search.js | 2 +- docs/v2.1.0/assets/style.css | 2693 +++++++++-------- .../classes/p2p-media-loader-core.Core.html | 253 ++ ...2p-media-loader-core.CoreRequestError.html | 180 ++ .../p2p-media-loader-core.RequestError.html | 184 ++ ...p2p-media-loader-hlsjs.HlsJsP2PEngine.html | 228 ++ ...p2p-media-loader-shaka.ShakaP2PEngine.html | 225 ++ docs/v2.1.0/index.html | 48 +- .../p2p-media-loader-core.SegmentStorage.html | 224 ++ docs/v2.1.0/modules.html | 4 +- .../v2.1.0/modules/p2p-media-loader-core.html | 174 ++ .../modules/p2p-media-loader-hlsjs.html | 174 ++ .../modules/p2p-media-loader-shaka.html | 174 ++ .../p2p-media-loader-core.ByteRange.html | 177 ++ ...2p-media-loader-core.CommonCoreConfig.html | 194 ++ .../p2p-media-loader-core.CoreConfig.html | 184 ++ .../p2p-media-loader-core.CoreEventMap.html | 187 ++ ...p-media-loader-core.DefinedCoreConfig.html | 177 ++ .../p2p-media-loader-core.DownloadSource.html | 177 ++ ...p-media-loader-core.DynamicCoreConfig.html | 180 ++ ...media-loader-core.DynamicStreamConfig.html | 175 ++ ...a-loader-core.DynamicStreamProperties.html | 175 ++ ...p2p-media-loader-core.EngineCallbacks.html | 177 ++ ...edia-loader-core.HttpRequestErrorType.html | 175 ++ .../p2p-media-loader-core.PeerDetails.html | 177 ++ ...2p-media-loader-core.PeerErrorDetails.html | 178 ++ ...edia-loader-core.PeerRequestErrorType.html | 175 ++ ...dia-loader-core.RequestAbortErrorType.html | 175 ++ ...2p-media-loader-core.RequestErrorType.html | 175 ++ .../types/p2p-media-loader-core.Segment.html | 181 ++ ...media-loader-core.SegmentAbortDetails.html | 179 ++ ...media-loader-core.SegmentErrorDetails.html | 180 ++ ...-media-loader-core.SegmentLoadDetails.html | 180 ++ ...p2p-media-loader-core.SegmentResponse.html | 177 ++ ...media-loader-core.SegmentStartDetails.html | 178 ++ ...p-media-loader-core.SegmentWithStream.html | 175 ++ .../types/p2p-media-loader-core.Stream.html | 178 ++ .../p2p-media-loader-core.StreamConfig.html | 266 ++ .../p2p-media-loader-core.StreamType.html | 175 ++ ...-media-loader-core.StreamWithSegments.html | 176 ++ ...media-loader-core.TrackerErrorDetails.html | 177 ++ ...dia-loader-core.TrackerWarningDetails.html | 176 ++ ...der-hlsjs.DynamicHlsJsP2PEngineConfig.html | 176 ++ ...dia-loader-hlsjs.HlsJsP2PEngineConfig.html | 176 ++ ...p-media-loader-hlsjs.HlsWithP2PConfig.html | 176 ++ ...media-loader-hlsjs.HlsWithP2PInstance.html | 177 ++ ...der-hlsjs.PartialHlsJsP2PEngineConfig.html | 176 ++ ...der-shaka.DynamicShakaP2PEngineConfig.html | 176 ++ ...loader-shaka.PartialShakaEngineConfig.html | 176 ++ ...dia-loader-shaka.ShakaP2PEngineConfig.html | 176 ++ 56 files changed, 10024 insertions(+), 1337 deletions(-) create mode 100644 docs/v2.1.0/assets/hierarchy.js create mode 100644 docs/v2.1.0/classes/p2p-media-loader-core.Core.html create mode 100644 docs/v2.1.0/classes/p2p-media-loader-core.CoreRequestError.html create mode 100644 docs/v2.1.0/classes/p2p-media-loader-core.RequestError.html create mode 100644 docs/v2.1.0/classes/p2p-media-loader-hlsjs.HlsJsP2PEngine.html create mode 100644 docs/v2.1.0/classes/p2p-media-loader-shaka.ShakaP2PEngine.html create mode 100644 docs/v2.1.0/interfaces/p2p-media-loader-core.SegmentStorage.html create mode 100644 docs/v2.1.0/modules/p2p-media-loader-core.html create mode 100644 docs/v2.1.0/modules/p2p-media-loader-hlsjs.html create mode 100644 docs/v2.1.0/modules/p2p-media-loader-shaka.html create mode 100644 docs/v2.1.0/types/p2p-media-loader-core.ByteRange.html create mode 100644 docs/v2.1.0/types/p2p-media-loader-core.CommonCoreConfig.html create mode 100644 docs/v2.1.0/types/p2p-media-loader-core.CoreConfig.html create mode 100644 docs/v2.1.0/types/p2p-media-loader-core.CoreEventMap.html create mode 100644 docs/v2.1.0/types/p2p-media-loader-core.DefinedCoreConfig.html create mode 100644 docs/v2.1.0/types/p2p-media-loader-core.DownloadSource.html create mode 100644 docs/v2.1.0/types/p2p-media-loader-core.DynamicCoreConfig.html create mode 100644 docs/v2.1.0/types/p2p-media-loader-core.DynamicStreamConfig.html create mode 100644 docs/v2.1.0/types/p2p-media-loader-core.DynamicStreamProperties.html create mode 100644 docs/v2.1.0/types/p2p-media-loader-core.EngineCallbacks.html create mode 100644 docs/v2.1.0/types/p2p-media-loader-core.HttpRequestErrorType.html create mode 100644 docs/v2.1.0/types/p2p-media-loader-core.PeerDetails.html create mode 100644 docs/v2.1.0/types/p2p-media-loader-core.PeerErrorDetails.html create mode 100644 docs/v2.1.0/types/p2p-media-loader-core.PeerRequestErrorType.html create mode 100644 docs/v2.1.0/types/p2p-media-loader-core.RequestAbortErrorType.html create mode 100644 docs/v2.1.0/types/p2p-media-loader-core.RequestErrorType.html create mode 100644 docs/v2.1.0/types/p2p-media-loader-core.Segment.html create mode 100644 docs/v2.1.0/types/p2p-media-loader-core.SegmentAbortDetails.html create mode 100644 docs/v2.1.0/types/p2p-media-loader-core.SegmentErrorDetails.html create mode 100644 docs/v2.1.0/types/p2p-media-loader-core.SegmentLoadDetails.html create mode 100644 docs/v2.1.0/types/p2p-media-loader-core.SegmentResponse.html create mode 100644 docs/v2.1.0/types/p2p-media-loader-core.SegmentStartDetails.html create mode 100644 docs/v2.1.0/types/p2p-media-loader-core.SegmentWithStream.html create mode 100644 docs/v2.1.0/types/p2p-media-loader-core.Stream.html create mode 100644 docs/v2.1.0/types/p2p-media-loader-core.StreamConfig.html create mode 100644 docs/v2.1.0/types/p2p-media-loader-core.StreamType.html create mode 100644 docs/v2.1.0/types/p2p-media-loader-core.StreamWithSegments.html create mode 100644 docs/v2.1.0/types/p2p-media-loader-core.TrackerErrorDetails.html create mode 100644 docs/v2.1.0/types/p2p-media-loader-core.TrackerWarningDetails.html create mode 100644 docs/v2.1.0/types/p2p-media-loader-hlsjs.DynamicHlsJsP2PEngineConfig.html create mode 100644 docs/v2.1.0/types/p2p-media-loader-hlsjs.HlsJsP2PEngineConfig.html create mode 100644 docs/v2.1.0/types/p2p-media-loader-hlsjs.HlsWithP2PConfig.html create mode 100644 docs/v2.1.0/types/p2p-media-loader-hlsjs.HlsWithP2PInstance.html create mode 100644 docs/v2.1.0/types/p2p-media-loader-hlsjs.PartialHlsJsP2PEngineConfig.html create mode 100644 docs/v2.1.0/types/p2p-media-loader-shaka.DynamicShakaP2PEngineConfig.html create mode 100644 docs/v2.1.0/types/p2p-media-loader-shaka.PartialShakaEngineConfig.html create mode 100644 docs/v2.1.0/types/p2p-media-loader-shaka.ShakaP2PEngineConfig.html diff --git a/docs/v2.1.0/assets/hierarchy.js b/docs/v2.1.0/assets/hierarchy.js new file mode 100644 index 00000000..fb85f0ad --- /dev/null +++ b/docs/v2.1.0/assets/hierarchy.js @@ -0,0 +1 @@ +window.hierarchyData = "eJyrVirKzy8pVrKKjtVRKkpNy0lNLsnMzytWsqqurQUAmx4Kpg==" \ No newline at end of file diff --git a/docs/v2.1.0/assets/icons.js b/docs/v2.1.0/assets/icons.js index 3dfbd322..58882d76 100644 --- a/docs/v2.1.0/assets/icons.js +++ b/docs/v2.1.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 = `MMNEPVFCICPMFPCPTTAAATR`; + svg.innerHTML = `MMNEPVFCICPMFPCPTTAAATR`; svg.style.display = "none"; if (location.protocol === "file:") updateUseElements(); } diff --git a/docs/v2.1.0/assets/icons.svg b/docs/v2.1.0/assets/icons.svg index a19417dc..50ad5799 100644 --- a/docs/v2.1.0/assets/icons.svg +++ b/docs/v2.1.0/assets/icons.svg @@ -1 +1 @@ -MMNEPVFCICPMFPCPTTAAATR \ No newline at end of file +MMNEPVFCICPMFPCPTTAAATR \ No newline at end of file diff --git a/docs/v2.1.0/assets/main.js b/docs/v2.1.0/assets/main.js index 99097a05..4f59cd95 100644 --- a/docs/v2.1.0/assets/main.js +++ b/docs/v2.1.0/assets/main.js @@ -1,9 +1,9 @@ "use strict"; -window.translations={"copy":"Copy","copied":"Copied!","normally_hidden":"This member is normally hidden due to your filter settings."}; -"use strict";(()=>{var Pe=Object.create;var ie=Object.defineProperty;var Oe=Object.getOwnPropertyDescriptor;var _e=Object.getOwnPropertyNames;var Re=Object.getPrototypeOf,Me=Object.prototype.hasOwnProperty;var Fe=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var De=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of _e(e))!Me.call(t,i)&&i!==n&&ie(t,i,{get:()=>e[i],enumerable:!(r=Oe(e,i))||r.enumerable});return t};var Ae=(t,e,n)=>(n=t!=null?Pe(Re(t)):{},De(e||!t||!t.__esModule?ie(n,"default",{value:t,enumerable:!0}):n,t));var ue=Fe((ae,le)=>{(function(){var t=function(e){var n=new t.Builder;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),n.searchPipeline.add(t.stemmer),e.call(n,n),n.build()};t.version="2.3.9";t.utils={},t.utils.warn=function(e){return function(n){e.console&&console.warn&&console.warn(n)}}(this),t.utils.asString=function(e){return e==null?"":e.toString()},t.utils.clone=function(e){if(e==null)return e;for(var n=Object.create(null),r=Object.keys(e),i=0;i0){var d=t.utils.clone(n)||{};d.position=[a,u],d.index=s.length,s.push(new t.Token(r.slice(a,o),d))}a=o+1}}return s},t.tokenizer.separator=/[\s\-]+/;t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions=Object.create(null),t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn(`Function is not registered with pipeline. This may cause problems when serialising the index. -`,e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(r){var i=t.Pipeline.registeredFunctions[r];if(i)n.add(i);else throw new Error("Cannot load unregistered function: "+r)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(n){t.Pipeline.warnIfFunctionNotRegistered(n),this._stack.push(n)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");r=r+1,this._stack.splice(r,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");this._stack.splice(r,0,n)},t.Pipeline.prototype.remove=function(e){var n=this._stack.indexOf(e);n!=-1&&this._stack.splice(n,1)},t.Pipeline.prototype.run=function(e){for(var n=this._stack.length,r=0;r1&&(oe&&(r=s),o!=e);)i=r-n,s=n+Math.floor(i/2),o=this.elements[s*2];if(o==e||o>e)return s*2;if(ol?d+=2:a==l&&(n+=r[u+1]*i[d+1],u+=2,d+=2);return n},t.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},t.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),n=1,r=0;n0){var o=s.str.charAt(0),a;o in s.node.edges?a=s.node.edges[o]:(a=new t.TokenSet,s.node.edges[o]=a),s.str.length==1&&(a.final=!0),i.push({node:a,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(s.editsRemaining!=0){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new t.TokenSet;s.node.edges["*"]=l}if(s.str.length==0&&(l.final=!0),i.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&i.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),s.str.length==1&&(s.node.final=!0),s.str.length>=1){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new t.TokenSet;s.node.edges["*"]=u}s.str.length==1&&(u.final=!0),i.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var d=s.str.charAt(0),m=s.str.charAt(1),p;m in s.node.edges?p=s.node.edges[m]:(p=new t.TokenSet,s.node.edges[m]=p),s.str.length==1&&(p.final=!0),i.push({node:p,editsRemaining:s.editsRemaining-1,str:d+s.str.slice(2)})}}}return r},t.TokenSet.fromString=function(e){for(var n=new t.TokenSet,r=n,i=0,s=e.length;i=e;n--){var r=this.uncheckedNodes[n],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r.char]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}};t.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},t.Index.prototype.search=function(e){return this.query(function(n){var r=new t.QueryParser(e,n);r.parse()})},t.Index.prototype.query=function(e){for(var n=new t.Query(this.fields),r=Object.create(null),i=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),l=0;l1?this._b=1:this._b=e},t.Builder.prototype.k1=function(e){this._k1=e},t.Builder.prototype.add=function(e,n){var r=e[this._ref],i=Object.keys(this._fields);this._documents[r]=n||{},this.documentCount+=1;for(var s=0;s=this.length)return t.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},t.QueryLexer.prototype.width=function(){return this.pos-this.start},t.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},t.QueryLexer.prototype.backup=function(){this.pos-=1},t.QueryLexer.prototype.acceptDigitRun=function(){var e,n;do e=this.next(),n=e.charCodeAt(0);while(n>47&&n<58);e!=t.QueryLexer.EOS&&this.backup()},t.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(t.QueryLexer.TERM)),e.ignore(),e.more())return t.QueryLexer.lexText},t.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.EDIT_DISTANCE),t.QueryLexer.lexText},t.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.BOOST),t.QueryLexer.lexText},t.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(t.QueryLexer.TERM)},t.QueryLexer.termSeparator=t.tokenizer.separator,t.QueryLexer.lexText=function(e){for(;;){var n=e.next();if(n==t.QueryLexer.EOS)return t.QueryLexer.lexEOS;if(n.charCodeAt(0)==92){e.escapeCharacter();continue}if(n==":")return t.QueryLexer.lexField;if(n=="~")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexEditDistance;if(n=="^")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexBoost;if(n=="+"&&e.width()===1||n=="-"&&e.width()===1)return e.emit(t.QueryLexer.PRESENCE),t.QueryLexer.lexText;if(n.match(t.QueryLexer.termSeparator))return t.QueryLexer.lexTerm}},t.QueryParser=function(e,n){this.lexer=new t.QueryLexer(e),this.query=n,this.currentClause={},this.lexemeIdx=0},t.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=t.QueryParser.parseClause;e;)e=e(this);return this.query},t.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},t.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},t.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},t.QueryParser.parseClause=function(e){var n=e.peekLexeme();if(n!=null)switch(n.type){case t.QueryLexer.PRESENCE:return t.QueryParser.parsePresence;case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expected either a field or a term, found "+n.type;throw n.str.length>=1&&(r+=" with value '"+n.str+"'"),new t.QueryParseError(r,n.start,n.end)}},t.QueryParser.parsePresence=function(e){var n=e.consumeLexeme();if(n!=null){switch(n.str){case"-":e.currentClause.presence=t.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=t.Query.presence.REQUIRED;break;default:var r="unrecognised presence operator'"+n.str+"'";throw new t.QueryParseError(r,n.start,n.end)}var i=e.peekLexeme();if(i==null){var r="expecting term or field, found nothing";throw new t.QueryParseError(r,n.start,n.end)}switch(i.type){case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expecting term or field, found '"+i.type+"'";throw new t.QueryParseError(r,i.start,i.end)}}},t.QueryParser.parseField=function(e){var n=e.consumeLexeme();if(n!=null){if(e.query.allFields.indexOf(n.str)==-1){var r=e.query.allFields.map(function(o){return"'"+o+"'"}).join(", "),i="unrecognised field '"+n.str+"', possible fields: "+r;throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.fields=[n.str];var s=e.peekLexeme();if(s==null){var i="expecting term, found nothing";throw new t.QueryParseError(i,n.start,n.end)}switch(s.type){case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var i="expecting term, found '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseTerm=function(e){var n=e.consumeLexeme();if(n!=null){e.currentClause.term=n.str.toLowerCase(),n.str.indexOf("*")!=-1&&(e.currentClause.usePipeline=!1);var r=e.peekLexeme();if(r==null){e.nextClause();return}switch(r.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+r.type+"'";throw new t.QueryParseError(i,r.start,r.end)}}},t.QueryParser.parseEditDistance=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="edit distance must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.editDistance=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseBoost=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="boost must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.boost=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},function(e,n){typeof define=="function"&&define.amd?define(n):typeof ae=="object"?le.exports=n():e.lunr=n()}(this,function(){return t})})()});var se=[];function G(t,e){se.push({selector:e,constructor:t})}var U=class{constructor(){this.alwaysVisibleMember=null;this.createComponents(document.body),this.ensureFocusedElementVisible(),this.listenForCodeCopies(),window.addEventListener("hashchange",()=>this.ensureFocusedElementVisible()),document.body.style.display||(this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}createComponents(e){se.forEach(n=>{e.querySelectorAll(n.selector).forEach(r=>{r.dataset.hasInstance||(new n.constructor({el:r,app:this}),r.dataset.hasInstance=String(!0))})})}filterChanged(){this.ensureFocusedElementVisible()}showPage(){document.body.style.display&&(document.body.style.removeProperty("display"),this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}scrollToHash(){if(location.hash){let e=document.getElementById(location.hash.substring(1));if(!e)return;e.scrollIntoView({behavior:"instant",block:"start"})}}ensureActivePageVisible(){let e=document.querySelector(".tsd-navigation .current"),n=e?.parentElement;for(;n&&!n.classList.contains(".tsd-navigation");)n instanceof HTMLDetailsElement&&(n.open=!0),n=n.parentElement;if(e&&!Ve(e)){let r=e.getBoundingClientRect().top-document.documentElement.clientHeight/4;document.querySelector(".site-menu").scrollTop=r,document.querySelector(".col-sidebar").scrollTop=r}}updateIndexVisibility(){let e=document.querySelector(".tsd-index-content"),n=e?.open;e&&(e.open=!0),document.querySelectorAll(".tsd-index-section").forEach(r=>{r.style.display="block";let i=Array.from(r.querySelectorAll(".tsd-index-link")).every(s=>s.offsetParent==null);r.style.display=i?"none":"block"}),e&&(e.open=n)}ensureFocusedElementVisible(){if(this.alwaysVisibleMember&&(this.alwaysVisibleMember.classList.remove("always-visible"),this.alwaysVisibleMember.firstElementChild.remove(),this.alwaysVisibleMember=null),!location.hash)return;let e=document.getElementById(location.hash.substring(1));if(!e)return;let n=e.parentElement;for(;n&&n.tagName!=="SECTION";)n=n.parentElement;if(!n)return;let r=n.offsetParent==null,i=n;for(;i!==document.body;)i instanceof HTMLDetailsElement&&(i.open=!0),i=i.parentElement;if(n.offsetParent==null){this.alwaysVisibleMember=n,n.classList.add("always-visible");let s=document.createElement("p");s.classList.add("warning"),s.textContent=window.translations.normally_hidden,n.prepend(s)}r&&e.scrollIntoView()}listenForCodeCopies(){document.querySelectorAll("pre > button").forEach(e=>{let n;e.addEventListener("click",()=>{e.previousElementSibling instanceof HTMLElement&&navigator.clipboard.writeText(e.previousElementSibling.innerText.trim()),e.textContent=window.translations.copied,e.classList.add("visible"),clearTimeout(n),n=setTimeout(()=>{e.classList.remove("visible"),n=setTimeout(()=>{e.textContent=window.translations.copy},100)},1e3)})})}};function Ve(t){let e=t.getBoundingClientRect(),n=Math.max(document.documentElement.clientHeight,window.innerHeight);return!(e.bottom<0||e.top-n>=0)}var oe=(t,e=100)=>{let n;return()=>{clearTimeout(n),n=setTimeout(()=>t(),e)}};var pe=Ae(ue());async function ce(t,e){if(!window.searchData)return;let n=await fetch(window.searchData),r=new Blob([await n.arrayBuffer()]).stream().pipeThrough(new DecompressionStream("gzip")),i=await new Response(r).json();t.data=i,t.index=pe.Index.load(i.index),e.classList.remove("loading"),e.classList.add("ready")}function fe(){let t=document.getElementById("tsd-search");if(!t)return;let e={base:t.dataset.base+"/"},n=document.getElementById("tsd-search-script");t.classList.add("loading"),n&&(n.addEventListener("error",()=>{t.classList.remove("loading"),t.classList.add("failure")}),n.addEventListener("load",()=>{ce(e,t)}),ce(e,t));let r=document.querySelector("#tsd-search input"),i=document.querySelector("#tsd-search .results");if(!r||!i)throw new Error("The input field or the result list wrapper was not found");i.addEventListener("mouseup",()=>{te(t)}),r.addEventListener("focus",()=>t.classList.add("has-focus")),He(t,i,r,e)}function He(t,e,n,r){n.addEventListener("input",oe(()=>{Ne(t,e,n,r)},200)),n.addEventListener("keydown",i=>{i.key=="Enter"?Be(e,t):i.key=="ArrowUp"?(de(e,n,-1),i.preventDefault()):i.key==="ArrowDown"&&(de(e,n,1),i.preventDefault())}),document.body.addEventListener("keypress",i=>{i.altKey||i.ctrlKey||i.metaKey||!n.matches(":focus")&&i.key==="/"&&(i.preventDefault(),n.focus())}),document.body.addEventListener("keyup",i=>{t.classList.contains("has-focus")&&(i.key==="Escape"||!e.matches(":focus-within")&&!n.matches(":focus"))&&(n.blur(),te(t))})}function te(t){t.classList.remove("has-focus")}function Ne(t,e,n,r){if(!r.index||!r.data)return;e.textContent="";let i=n.value.trim(),s;if(i){let o=i.split(" ").map(a=>a.length?`*${a}*`:"").join(" ");s=r.index.search(o)}else s=[];for(let o=0;oa.score-o.score);for(let o=0,a=Math.min(10,s.length);o`,d=he(l.name,i);globalThis.DEBUG_SEARCH_WEIGHTS&&(d+=` (score: ${s[o].score.toFixed(2)})`),l.parent&&(d=` - ${he(l.parent,i)}.${d}`);let m=document.createElement("li");m.classList.value=l.classes??"";let p=document.createElement("a");p.href=r.base+l.url,p.innerHTML=u+d,m.append(p),p.addEventListener("focus",()=>{e.querySelector(".current")?.classList.remove("current"),m.classList.add("current")}),e.appendChild(m)}}function de(t,e,n){let r=t.querySelector(".current");if(!r)r=t.querySelector(n==1?"li:first-child":"li:last-child"),r&&r.classList.add("current");else{let i=r;if(n===1)do i=i.nextElementSibling??void 0;while(i instanceof HTMLElement&&i.offsetParent==null);else do i=i.previousElementSibling??void 0;while(i instanceof HTMLElement&&i.offsetParent==null);i?(r.classList.remove("current"),i.classList.add("current")):n===-1&&(r.classList.remove("current"),e.focus())}}function Be(t,e){let n=t.querySelector(".current");if(n||(n=t.querySelector("li:first-child")),n){let r=n.querySelector("a");r&&(window.location.href=r.href),te(e)}}function he(t,e){if(e==="")return t;let n=t.toLocaleLowerCase(),r=e.toLocaleLowerCase(),i=[],s=0,o=n.indexOf(r);for(;o!=-1;)i.push(ee(t.substring(s,o)),`${ee(t.substring(o,o+r.length))}`),s=o+r.length,o=n.indexOf(r,s);return i.push(ee(t.substring(s))),i.join("")}var je={"&":"&","<":"<",">":">","'":"'",'"':"""};function ee(t){return t.replace(/[&<>"'"]/g,e=>je[e])}var I=class{constructor(e){this.el=e.el,this.app=e.app}};var F="mousedown",ye="mousemove",N="mouseup",J={x:0,y:0},me=!1,ne=!1,qe=!1,D=!1,ve=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);document.documentElement.classList.add(ve?"is-mobile":"not-mobile");ve&&"ontouchstart"in document.documentElement&&(qe=!0,F="touchstart",ye="touchmove",N="touchend");document.addEventListener(F,t=>{ne=!0,D=!1;let e=F=="touchstart"?t.targetTouches[0]:t;J.y=e.pageY||0,J.x=e.pageX||0});document.addEventListener(ye,t=>{if(ne&&!D){let e=F=="touchstart"?t.targetTouches[0]:t,n=J.x-(e.pageX||0),r=J.y-(e.pageY||0);D=Math.sqrt(n*n+r*r)>10}});document.addEventListener(N,()=>{ne=!1});document.addEventListener("click",t=>{me&&(t.preventDefault(),t.stopImmediatePropagation(),me=!1)});var X=class extends I{constructor(e){super(e),this.className=this.el.dataset.toggle||"",this.el.addEventListener(N,n=>this.onPointerUp(n)),this.el.addEventListener("click",n=>n.preventDefault()),document.addEventListener(F,n=>this.onDocumentPointerDown(n)),document.addEventListener(N,n=>this.onDocumentPointerUp(n))}setActive(e){if(this.active==e)return;this.active=e,document.documentElement.classList.toggle("has-"+this.className,e),this.el.classList.toggle("active",e);let n=(this.active?"to-has-":"from-has-")+this.className;document.documentElement.classList.add(n),setTimeout(()=>document.documentElement.classList.remove(n),500)}onPointerUp(e){D||(this.setActive(!0),e.preventDefault())}onDocumentPointerDown(e){if(this.active){if(e.target.closest(".col-sidebar, .tsd-filter-group"))return;this.setActive(!1)}}onDocumentPointerUp(e){if(!D&&this.active&&e.target.closest(".col-sidebar")){let n=e.target.closest("a");if(n){let r=window.location.href;r.indexOf("#")!=-1&&(r=r.substring(0,r.indexOf("#"))),n.href.substring(0,r.length)==r&&setTimeout(()=>this.setActive(!1),250)}}}};var re;try{re=localStorage}catch{re={getItem(){return null},setItem(){}}}var Q=re;var ge=document.head.appendChild(document.createElement("style"));ge.dataset.for="filters";var Y=class extends I{constructor(e){super(e),this.key=`filter-${this.el.name}`,this.value=this.el.checked,this.el.addEventListener("change",()=>{this.setLocalStorage(this.el.checked)}),this.setLocalStorage(this.fromLocalStorage()),ge.innerHTML+=`html:not(.${this.key}) .tsd-is-${this.el.name} { display: none; } -`,this.app.updateIndexVisibility()}fromLocalStorage(){let e=Q.getItem(this.key);return e?e==="true":this.el.checked}setLocalStorage(e){Q.setItem(this.key,e.toString()),this.value=e,this.handleValueChange()}handleValueChange(){this.el.checked=this.value,document.documentElement.classList.toggle(this.key,this.value),this.app.filterChanged(),this.app.updateIndexVisibility()}};var Z=class extends I{constructor(e){super(e),this.summary=this.el.querySelector(".tsd-accordion-summary"),this.icon=this.summary.querySelector("svg"),this.key=`tsd-accordion-${this.summary.dataset.key??this.summary.textContent.trim().replace(/\s+/g,"-").toLowerCase()}`;let n=Q.getItem(this.key);this.el.open=n?n==="true":this.el.open,this.el.addEventListener("toggle",()=>this.update());let r=this.summary.querySelector("a");r&&r.addEventListener("click",()=>{location.assign(r.href)}),this.update()}update(){this.icon.style.transform=`rotate(${this.el.open?0:-90}deg)`,Q.setItem(this.key,this.el.open.toString())}};function Ee(t){let e=Q.getItem("tsd-theme")||"os";t.value=e,xe(e),t.addEventListener("change",()=>{Q.setItem("tsd-theme",t.value),xe(t.value)})}function xe(t){document.documentElement.dataset.theme=t}var K;function we(){let t=document.getElementById("tsd-nav-script");t&&(t.addEventListener("load",Le),Le())}async function Le(){let t=document.getElementById("tsd-nav-container");if(!t||!window.navigationData)return;let n=await(await fetch(window.navigationData)).arrayBuffer(),r=new Blob([n]).stream().pipeThrough(new DecompressionStream("gzip")),i=await new Response(r).json();K=t.dataset.base,K.endsWith("/")||(K+="/"),t.innerHTML="";for(let s of i)Se(s,t,[]);window.app.createComponents(t),window.app.showPage(),window.app.ensureActivePageVisible()}function Se(t,e,n){let r=e.appendChild(document.createElement("li"));if(t.children){let i=[...n,t.text],s=r.appendChild(document.createElement("details"));s.className=t.class?`${t.class} tsd-accordion`:"tsd-accordion";let o=s.appendChild(document.createElement("summary"));o.className="tsd-accordion-summary",o.dataset.key=i.join("$"),o.innerHTML='',be(t,o);let a=s.appendChild(document.createElement("div"));a.className="tsd-accordion-details";let l=a.appendChild(document.createElement("ul"));l.className="tsd-nested-navigation";for(let u of t.children)Se(u,l,i)}else be(t,r,t.class)}function be(t,e,n){if(t.path){let r=e.appendChild(document.createElement("a"));r.href=K+t.path,n&&(r.className=n),location.pathname===r.pathname&&!r.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();})(); +window.translations={"copy":"Copy","copied":"Copied!","normally_hidden":"This member is normally hidden due to your filter settings.","hierarchy_expand":"Expand","hierarchy_collapse":"Collapse"}; +"use strict";(()=>{var De=Object.create;var le=Object.defineProperty;var Fe=Object.getOwnPropertyDescriptor;var Ne=Object.getOwnPropertyNames;var Ve=Object.getPrototypeOf,Be=Object.prototype.hasOwnProperty;var qe=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var je=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Ne(e))!Be.call(t,i)&&i!==n&&le(t,i,{get:()=>e[i],enumerable:!(r=Fe(e,i))||r.enumerable});return t};var $e=(t,e,n)=>(n=t!=null?De(Ve(t)):{},je(e||!t||!t.__esModule?le(n,"default",{value:t,enumerable:!0}):n,t));var pe=qe((de,he)=>{(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,c],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[c+1]*i[d+1],c+=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 c=s.node.edges["*"];else{var c=new t.TokenSet;s.node.edges["*"]=c}s.str.length==1&&(c.final=!0),i.push({node:c,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 de=="object"?he.exports=n():e.lunr=n()}(this,function(){return t})})()});window.translations||={copy:"Copy",copied:"Copied!",normally_hidden:"This member is normally hidden due to your filter settings.",hierarchy_expand:"Expand",hierarchy_collapse:"Collapse"};var ce=[];function G(t,e){ce.push({selector:e,constructor:t})}var J=class{alwaysVisibleMember=null;constructor(){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){ce.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&&!ze(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 ze(t){let e=t.getBoundingClientRect(),n=Math.max(document.documentElement.clientHeight,window.innerHeight);return!(e.bottom<0||e.top-n>=0)}var ue=(t,e=100)=>{let n;return()=>{clearTimeout(n),n=setTimeout(()=>t(),e)}};var ge=$e(pe(),1);async function H(t){let e=Uint8Array.from(atob(t),s=>s.charCodeAt(0)),r=new Blob([e]).stream().pipeThrough(new DecompressionStream("deflate")),i=await new Response(r).text();return JSON.parse(i)}async function fe(t,e){if(!window.searchData)return;let n=await H(window.searchData);t.data=n,t.index=ge.Index.load(n.index),e.classList.remove("loading"),e.classList.add("ready")}function ve(){let t=document.getElementById("tsd-search");if(!t)return;let e={base:document.documentElement.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",()=>{fe(e,t)}),fe(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",()=>{re(t)}),r.addEventListener("focus",()=>t.classList.add("has-focus")),We(t,i,r,e)}function We(t,e,n,r){n.addEventListener("input",ue(()=>{Ue(t,e,n,r)},200)),n.addEventListener("keydown",i=>{i.key=="Enter"?Je(e,t):i.key=="ArrowUp"?(me(e,n,-1),i.preventDefault()):i.key==="ArrowDown"&&(me(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(),re(t))})}function re(t){t.classList.remove("has-focus")}function Ue(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=ye(l.name,i);globalThis.DEBUG_SEARCH_WEIGHTS&&(d+=` (score: ${s[o].score.toFixed(2)})`),l.parent&&(d=` + ${ye(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=c+d,m.append(p),p.addEventListener("focus",()=>{e.querySelector(".current")?.classList.remove("current"),m.classList.add("current")}),e.appendChild(m)}}function me(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 Je(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),re(e)}}function ye(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(ne(t.substring(s,o)),`${ne(t.substring(o,o+r.length))}`),s=o+r.length,o=n.indexOf(r,s);return i.push(ne(t.substring(s))),i.join("")}var Ge={"&":"&","<":"<",">":">","'":"'",'"':"""};function ne(t){return t.replace(/[&<>"'"]/g,e=>Ge[e])}var I=class{el;app;constructor(e){this.el=e.el,this.app=e.app}};var A="mousedown",Ee="mousemove",B="mouseup",X={x:0,y:0},xe=!1,ie=!1,Xe=!1,D=!1,Le=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);document.documentElement.classList.add(Le?"is-mobile":"not-mobile");Le&&"ontouchstart"in document.documentElement&&(Xe=!0,A="touchstart",Ee="touchmove",B="touchend");document.addEventListener(A,t=>{ie=!0,D=!1;let e=A=="touchstart"?t.targetTouches[0]:t;X.y=e.pageY||0,X.x=e.pageX||0});document.addEventListener(Ee,t=>{if(ie&&!D){let e=A=="touchstart"?t.targetTouches[0]:t,n=X.x-(e.pageX||0),r=X.y-(e.pageY||0);D=Math.sqrt(n*n+r*r)>10}});document.addEventListener(B,()=>{ie=!1});document.addEventListener("click",t=>{xe&&(t.preventDefault(),t.stopImmediatePropagation(),xe=!1)});var Y=class extends I{active;className;constructor(e){super(e),this.className=this.el.dataset.toggle||"",this.el.addEventListener(B,n=>this.onPointerUp(n)),this.el.addEventListener("click",n=>n.preventDefault()),document.addEventListener(A,n=>this.onDocumentPointerDown(n)),document.addEventListener(B,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 se;try{se=localStorage}catch{se={getItem(){return null},setItem(){}}}var C=se;var be=document.head.appendChild(document.createElement("style"));be.dataset.for="filters";var Z=class extends I{key;value;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()),be.innerHTML+=`html:not(.${this.key}) .tsd-is-${this.el.name} { display: none; } +`,this.app.updateIndexVisibility()}fromLocalStorage(){let e=C.getItem(this.key);return e?e==="true":this.el.checked}setLocalStorage(e){C.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 oe=new Map,ae=class{open;accordions=[];key;constructor(e,n){this.key=e,this.open=n}add(e){this.accordions.push(e),e.open=this.open,e.addEventListener("toggle",()=>{this.toggle(e.open)})}toggle(e){for(let n of this.accordions)n.open=e;C.setItem(this.key,e.toString())}},K=class extends I{constructor(e){super(e);let n=this.el.querySelector("summary"),r=n.querySelector("a");r&&r.addEventListener("click",()=>{location.assign(r.href)});let i=`tsd-accordion-${n.dataset.key??n.textContent.trim().replace(/\s+/g,"-").toLowerCase()}`,s;if(oe.has(i))s=oe.get(i);else{let o=C.getItem(i),a=o?o==="true":this.el.open;s=new ae(i,a),oe.set(i,s)}s.add(this.el)}};function Se(t){let e=C.getItem("tsd-theme")||"os";t.value=e,we(e),t.addEventListener("change",()=>{C.setItem("tsd-theme",t.value),we(t.value)})}function we(t){document.documentElement.dataset.theme=t}var ee;function Ce(){let t=document.getElementById("tsd-nav-script");t&&(t.addEventListener("load",Te),Te())}async function Te(){let t=document.getElementById("tsd-nav-container");if(!t||!window.navigationData)return;let e=await H(window.navigationData);ee=document.documentElement.dataset.base,ee.endsWith("/")||(ee+="/"),t.innerHTML="";for(let n of e)Ie(n,t,[]);window.app.createComponents(t),window.app.showPage(),window.app.ensureActivePageVisible()}function Ie(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='',ke(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 c of t.children)Ie(c,l,i)}else ke(t,r,t.class)}function ke(t,e,n){if(t.path){let r=e.appendChild(document.createElement("a"));r.href=ee+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}}var te=document.documentElement.dataset.base;te.endsWith("/")||(te+="/");function Pe(){document.querySelector(".tsd-full-hierarchy")?Ye():document.querySelector(".tsd-hierarchy")&&Ze()}function Ye(){document.addEventListener("click",r=>{let i=r.target;for(;i.parentElement&&i.parentElement.tagName!="LI";)i=i.parentElement;i.dataset.dropdown&&(i.dataset.dropdown=String(i.dataset.dropdown!=="true"))});let t=new Map,e=new Set;for(let r of document.querySelectorAll(".tsd-full-hierarchy [data-refl]")){let i=r.querySelector("ul");t.has(r.dataset.refl)?e.add(r.dataset.refl):i&&t.set(r.dataset.refl,i)}for(let r of e)n(r);function n(r){let i=t.get(r).cloneNode(!0);i.querySelectorAll("[id]").forEach(s=>{s.removeAttribute("id")}),i.querySelectorAll("[data-dropdown]").forEach(s=>{s.dataset.dropdown="false"});for(let s of document.querySelectorAll(`[data-refl="${r}"]`)){let o=tt(),a=s.querySelector("ul");s.insertBefore(o,a),o.dataset.dropdown=String(!!a),a||s.appendChild(i.cloneNode(!0))}}}function Ze(){let t=document.getElementById("tsd-hierarchy-script");t&&(t.addEventListener("load",Qe),Qe())}async function Qe(){let t=document.querySelector(".tsd-panel.tsd-hierarchy:has(h4 a)");if(!t||!window.hierarchyData)return;let e=+t.dataset.refl,n=await H(window.hierarchyData),r=t.querySelector("ul"),i=document.createElement("ul");if(i.classList.add("tsd-hierarchy"),Ke(i,n,e),r.querySelectorAll("li").length==i.querySelectorAll("li").length)return;let s=document.createElement("span");s.classList.add("tsd-hierarchy-toggle"),s.textContent=window.translations.hierarchy_expand,t.querySelector("h4 a")?.insertAdjacentElement("afterend",s),s.insertAdjacentText("beforebegin",", "),s.addEventListener("click",()=>{s.textContent===window.translations.hierarchy_expand?(r.insertAdjacentElement("afterend",i),r.remove(),s.textContent=window.translations.hierarchy_collapse):(i.insertAdjacentElement("afterend",r),i.remove(),s.textContent=window.translations.hierarchy_expand)})}function Ke(t,e,n){let r=e.roots.filter(i=>et(e,i,n));for(let i of r)t.appendChild(Oe(e,i,n))}function Oe(t,e,n,r=new Set){if(r.has(e))return;r.add(e);let i=t.reflections[e],s=document.createElement("li");if(s.classList.add("tsd-hierarchy-item"),e===n){let o=s.appendChild(document.createElement("span"));o.textContent=i.name,o.classList.add("tsd-hierarchy-target")}else{for(let a of i.uniqueNameParents||[]){let l=t.reflections[a],c=s.appendChild(document.createElement("a"));c.textContent=l.name,c.href=te+l.url,c.className=l.class+" tsd-signature-type",s.append(document.createTextNode("."))}let o=s.appendChild(document.createElement("a"));o.textContent=t.reflections[e].name,o.href=te+i.url,o.className=i.class+" tsd-signature-type"}if(i.children){let o=s.appendChild(document.createElement("ul"));o.classList.add("tsd-hierarchy");for(let a of i.children){let l=Oe(t,a,n,r);l&&o.appendChild(l)}}return r.delete(e),s}function et(t,e,n){if(e===n)return!0;let r=new Set,i=[t.reflections[e]];for(;i.length;){let s=i.pop();if(!r.has(s)){r.add(s);for(let o of s.children||[]){if(o===n)return!0;i.push(t.reflections[o])}}}return!1}function tt(){let t=document.createElementNS("http://www.w3.org/2000/svg","svg");return t.setAttribute("width","20"),t.setAttribute("height","20"),t.setAttribute("viewBox","0 0 24 24"),t.setAttribute("fill","none"),t.innerHTML='',t}G(Y,"a[data-toggle]");G(K,".tsd-accordion");G(Z,".tsd-filter-item input[type=checkbox]");var _e=document.getElementById("tsd-theme");_e&&Se(_e);var nt=new J;Object.defineProperty(window,"app",{value:nt});ve();Ce();Pe();})(); /*! Bundled license information: lunr/lunr.js: diff --git a/docs/v2.1.0/assets/material-style.css b/docs/v2.1.0/assets/material-style.css index b7e1d318..754d865f 100644 --- a/docs/v2.1.0/assets/material-style.css +++ b/docs/v2.1.0/assets/material-style.css @@ -49,7 +49,16 @@ --color-scheme: var(--md-sys-color-scheme); */ --top-app-bar-height: 4.5rem; + --top-app-bar-padding-vertical: .5rem; + --top-app-bar-table-cell-gutter: 1.5rem; + --top-app-bar-search-icon-width: 4rem; + --top-app-bar-search-padding-inset: 1.5rem; + --top-app-bar-search-padding-inset-mobile: 1rem; + --top-app-bar-search-font-size: 1.125rem; + --top-app-bar-search-font-size-mobile: 1rem; --footer-height: 3.5rem; + + --safe-area-inset-top: env(safe-area-inset-top); } body { @@ -64,15 +73,33 @@ img { max-width: 100%; } -*::-webkit-scrollbar { - width: 8px; - height: 8px; -} -*::-webkit-scrollbar-track { - background: none; +@supports not selector(::-webkit-scrollbar) { + * { + scrollbar-width: thin; + scrollbar-color: var(--color-accent) transparent; + } } -*::-webkit-scrollbar-thumb { - border: none; + +@supports selector(::-webkit-scrollbar) { + *::-webkit-scrollbar { + width: 8px; + height: 8px; + } + *::-webkit-scrollbar-track { + background: none; + margin: 4px; + } + *::-webkit-scrollbar-thumb { + border: none; + } + *::-webkit-scrollbar-thumb:hover, + *::-webkit-scrollbar-thumb:active { + background-color: var(--md-sys-color-secondary); + } + * { + scrollbar-width: unset; + scrollbar-color: unset; + } } .container-main { @@ -96,16 +123,17 @@ img { position: relative; } .title { - display: block; - max-width: calc(100% - 5rem); + display: inline-block; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-size: 22px; } - +.tsd-page-title { + word-break: break-all; +} .tsd-page-toolbar { - padding: 8px 0; + padding: var(--top-app-bar-padding-vertical) 0; height: calc(var(--top-app-bar-height) - 16px); background-color: var(--color-background); border-bottom: none; @@ -115,18 +143,68 @@ img { } .tsd-page-toolbar .table-cell { height: 56px; - margin-left: 1.5rem; + padding-left: var(--top-app-bar-table-cell-gutter); } .tsd-page-toolbar .tsd-toolbar-icon { padding: 20px 0; } #tsd-search { + display: flex; + flex-direction: row-reverse; + justify-content: space-between; line-height: 56px; border-radius: 22px; + padding-right: var(--top-app-bar-search-icon-width); + box-sizing: border-box; + padding-left: 0; + margin-left: var(--top-app-bar-table-cell-gutter); + max-width: calc(100% - var(--top-app-bar-table-cell-gutter) - var(--top-app-bar-table-cell-gutter)); +} +#tsd-search .field, +#tsd-search .field label, +#tsd-search .field #tsd-toolbar-links { + position: relative; + top: unset; + right: unset; + bottom: unset; + left: unset; +} +#tsd-search .field { + position: relative; + flex: 0 0 0; +} +#tsd-search .field:first-child { + display: flex; + flex-direction: row-reverse; + width: 100%; + position: absolute; + left: 0; +} +#tsd-search.has-focus .field:first-child { + z-index: 2; +} +#tsd-search .field label, +#tsd-search .field .tsd-toolbar-icon { + height: 100%; + margin: 0 auto; +} +#tsd-search .field .tsd-toolbar-icon { + display: flex; + justify-content: center; + flex: none; +} +#tsd-search .field .tsd-widget.no-caption { + width: var(--top-app-bar-search-icon-width); +} +#tsd-search .field input { + padding: var(--top-app-bar-search-padding-inset); + font-size: var(--top-app-bar-search-font-size); + top: calc(-100% - var(--top-app-bar-padding-vertical) - var(--safe-area-inset-top)); } #tsd-search .results { z-index: -1; top: calc(56px - 22px); + left: 0; padding-top: 22px; box-shadow: 0px 4px 2px rgba(0, 0, 0, 0.125); background-color: var(--color-background-secondary); @@ -189,10 +267,10 @@ img { .tsd-navigation .tsd-accordion-summary { width: 100%; } +.tsd-accordion .tsd-accordion-summary > svg, .tsd-index-accordion .tsd-accordion-summary > svg { position: absolute; right: 1.5rem; - margin-top: 1rem; } .tsd-accordion-summary .tsd-kind-icon ~ span { margin-right: 2.5rem; @@ -217,6 +295,13 @@ img { } @media (max-width: 769px) { + #tsd-search { + max-width: calc(100% - var(--top-app-bar-search-icon-width) - var(--top-app-bar-table-cell-gutter)); + } + #tsd-search .field input { + font-size: var(--top-app-bar-search-font-size); + padding: var(--top-app-bar-search-padding-inset-mobile); + } .container { padding: 1rem; } @@ -238,6 +323,9 @@ img { max-height: calc(100vh - var(--footer-height) - var(--top-app-bar-height)); top: var(--top-app-bar-height); } + .site-menu { + margin-top: 0; + } .page-menu { margin-left: 1rem; } diff --git a/docs/v2.1.0/assets/navigation.js b/docs/v2.1.0/assets/navigation.js index e5c359f8..604839e4 100644 --- a/docs/v2.1.0/assets/navigation.js +++ b/docs/v2.1.0/assets/navigation.js @@ -1 +1 @@ -window.navigationData = "data:application/octet-stream;base64,H4sIAAAAAAAAA6WXXW/TMBSG/4uvO2CRxkfvoK00EEhRO2kX01SdJaeJqWMH2wUqxH9HTbripEl97N2f5318TmzLefjDLP62bMrqpL6qMOdwJRTkqK8ypZFNWA22ZFNWqXwn0Lyuk3rdlK3bsvWh7FVpK8EmbMtlzqbJhGUlF7lGyaYPJ8Gsk5cJMGY0b3YWep28/zs5Za2wqFDalVUaCieVS4t6A9locBfsrfvmrauwGqG629dOvN3X48mn+l7qmw/vrm8SJ/nT3uISZEEMPpX7co+9EZfbFhMz77kt2waD0v9jXk9T1dS3qAmZusvRTCHpvsQ5brjE/LBnZ0pueEELP8O8nr2EimftolKtatSWI3FQIzDRGdxbHwvqLcLkgj7XTFWVkqEt9Sm/JTSfmhw+pJDpzNUveWBXaqcz4hXVZYh3ysqCtnO0wAX1sJ+DRNdCa6VjXC5IdH18UnF9uSDR9VVBHqNyOJ8pRQybnANQssM/TZ/yWe40ZNsY0QBIdN2DllwWMbYuSrllFj9R2m9Q0++ZZ8KXvsQfOzTtxmymQH8ODaI+36219REM1A2RlN0XZxsiibOMG2OUhfrYdhnCo3uJplbSUJ/FXYiyn2N66HOX+ljIgkucgRBPkG2Jp7MHDffx6FjO/qdKYb47stEfqqaO9Ed1K8wXkybpcW20B0EbP4R6zwtoy0G8wHohgfhAfIH8QoL3XhLm8IuRJulnaSxIwrvoNOYeSFeFfs8ORtA4UyCcsqFtc37ILh4AU8IWCAegqSMdgOfH/wEI3RSt5UKC9wkWb43RHc9Og0Yox/CwLgkbZajDoY3y+A8U38c7exIAAA==" \ No newline at end of file +window.navigationData = "eJyll1Fv0zAQx7+Ln1tgkTagb9BW2hBIUTtpD9Mebsk1MXXsYLtAhfjuqElXnDSpz967f/+f7+KznMc/zOJvy2asTupphTmHqVCQo55mSiObsBpsyWasUvlOoHk7uOxNaSvBJmzLZc5myYRlJRe5RslmjyfBvJOXCTBmNG9+FnqVfPg7OWWtsahQ2rVVGgonlUuLegPZaHAX7O37+sZVWI1Q3e9rJ97u6/Hk0/pe6ruP76+uEyf5897iCmRBDD4t9+UeayNut11MzHzgtmwLDEr/j3k9zapmfYuakK67HM0Uku5LXOCGS8wPZ3au5IYXtPAzzOvZS6h41m4q1apGbTkSGzUCE53BtfWxoNoiTC7oc81VVSkZWlKf8ltC86nJ4U0K6c5C/ZIHdq12OiNeUV2GeKesLWi7QAtcUIf9HCS6llorHeNyQaLr07OKq8sFia6vCvIYlcP5TCliWOccgJId/mn6lM9yryHbxogGQKLrAbTksoixdVHKLbP8idJ+g5p+z7wQvvQV/tihaQ9m0wX6c2gQ9flura2PYKBuiKScvjjbEEnsZVwboyzUx7bLEB7dKzS1kob6LO5ClPMcU0Ofu1THUhZc4hyEeIZsS5zOHjRcx5NjOYsphfnuyEZ/qJp1pD+qW2G+mDRJj3ujPQja+CHUOy+gLQfxCuuFBOID8RXyCwnee0mYwy9GmqR30liQhHfRqc09kK4K/Z4djKBxukCYsqFjcz5kFwfAlLAFwgA060gD8PL4PwChh6K1XEjwPsHirTG64+w0aIRyDA+rknBQhiocOihP/wDoclOn" \ No newline at end of file diff --git a/docs/v2.1.0/assets/search.js b/docs/v2.1.0/assets/search.js index e173926b..2f8c0238 100644 --- a/docs/v2.1.0/assets/search.js +++ b/docs/v2.1.0/assets/search.js @@ -1 +1 @@ -window.searchData = "data:application/octet-stream;base64,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"; \ No newline at end of file +window.searchData = "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"; \ No newline at end of file diff --git a/docs/v2.1.0/assets/style.css b/docs/v2.1.0/assets/style.css index 178bfb02..7f80f3dc 100644 --- a/docs/v2.1.0/assets/style.css +++ b/docs/v2.1.0/assets/style.css @@ -1,115 +1,256 @@ -:root { - /* Light */ - --light-color-background: #f2f4f8; - --light-color-background-secondary: #eff0f1; - --light-color-warning-text: #222; - --light-color-background-warning: #e6e600; - --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; - - --light-color-ts-keyword: #056bd6; - --light-color-ts-project: #b111c9; - --light-color-ts-module: var(--light-color-ts-project); - --light-color-ts-namespace: var(--light-color-ts-project); - --light-color-ts-enum: #7e6f15; - --light-color-ts-enum-member: var(--light-color-ts-enum); - --light-color-ts-variable: #4760ec; - --light-color-ts-function: #572be7; - --light-color-ts-class: #1f70c2; - --light-color-ts-interface: #108024; - --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: #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; - /* reference not included as links will be colored with the kind that it points to */ - --light-color-document: #000000; - - --light-external-icon: url("data:image/svg+xml;utf8,"); - --light-color-scheme: light; - - /* Dark */ - --dark-color-background: #2b2e33; - --dark-color-background-secondary: #1e2024; - --dark-color-background-warning: #bebe00; - --dark-color-warning-text: #222; - --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; - - --dark-color-ts-keyword: #3399ff; - --dark-color-ts-project: #e358ff; - --dark-color-ts-module: var(--dark-color-ts-project); - --dark-color-ts-namespace: var(--dark-color-ts-project); - --dark-color-ts-enum: #f4d93e; - --dark-color-ts-enum-member: var(--dark-color-ts-enum); - --dark-color-ts-variable: #798dff; - --dark-color-ts-function: #a280ff; - --dark-color-ts-class: #8ac4ff; - --dark-color-ts-interface: #6cff87; - --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: #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; - /* reference not included as links will be colored with the kind that it points to */ - --dark-color-document: #ffffff; - - --dark-external-icon: url("data:image/svg+xml;utf8,"); - --dark-color-scheme: dark; -} - -@media (prefers-color-scheme: light) { +@layer typedoc { :root { + /* Light */ + --light-color-background: #f2f4f8; + --light-color-background-secondary: #eff0f1; + --light-color-warning-text: #222; + --light-color-background-warning: #e6e600; + --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; + + --light-color-ts-keyword: #056bd6; + --light-color-ts-project: #b111c9; + --light-color-ts-module: var(--light-color-ts-project); + --light-color-ts-namespace: var(--light-color-ts-project); + --light-color-ts-enum: #7e6f15; + --light-color-ts-enum-member: var(--light-color-ts-enum); + --light-color-ts-variable: #4760ec; + --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: #9f5f30; + --light-color-ts-method: #be3989; + --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: #c73c3c; + --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; + /* reference not included as links will be colored with the kind that it points to */ + --light-color-document: #000000; + + --light-color-alert-note: #0969d9; + --light-color-alert-tip: #1a7f37; + --light-color-alert-important: #8250df; + --light-color-alert-warning: #9a6700; + --light-color-alert-caution: #cf222e; + + --light-external-icon: url("data:image/svg+xml;utf8,"); + --light-color-scheme: light; + + /* Dark */ + --dark-color-background: #2b2e33; + --dark-color-background-secondary: #1e2024; + --dark-color-background-warning: #bebe00; + --dark-color-warning-text: #222; + --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; + + --dark-color-ts-keyword: #3399ff; + --dark-color-ts-project: #e358ff; + --dark-color-ts-module: var(--dark-color-ts-project); + --dark-color-ts-namespace: var(--dark-color-ts-project); + --dark-color-ts-enum: #f4d93e; + --dark-color-ts-enum-member: var(--dark-color-ts-enum); + --dark-color-ts-variable: #798dff; + --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: #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: #ff6060; + --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; + /* reference not included as links will be colored with the kind that it points to */ + --dark-color-document: #ffffff; + + --dark-color-alert-note: #0969d9; + --dark-color-alert-tip: #1a7f37; + --dark-color-alert-important: #8250df; + --dark-color-alert-warning: #9a6700; + --dark-color-alert-caution: #cf222e; + + --dark-external-icon: url("data:image/svg+xml;utf8,"); + --dark-color-scheme: dark; + } + + @media (prefers-color-scheme: light) { + :root { + --color-background: var(--light-color-background); + --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-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); + --color-ts-enum-member: var(--light-color-ts-enum-member); + --color-ts-variable: var(--light-color-ts-variable); + --color-ts-function: var(--light-color-ts-function); + --color-ts-class: var(--light-color-ts-class); + --color-ts-interface: var(--light-color-ts-interface); + --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( + --light-color-ts-constructor-signature + ); + --color-ts-parameter: var(--light-color-ts-parameter); + --color-ts-type-parameter: var(--light-color-ts-type-parameter); + --color-ts-accessor: var(--light-color-ts-accessor); + --color-ts-get-signature: var(--light-color-ts-get-signature); + --color-ts-set-signature: var(--light-color-ts-set-signature); + --color-ts-type-alias: var(--light-color-ts-type-alias); + --color-document: var(--light-color-document); + + --color-alert-note: var(--light-color-alert-note); + --color-alert-tip: var(--light-color-alert-tip); + --color-alert-important: var(--light-color-alert-important); + --color-alert-warning: var(--light-color-alert-warning); + --color-alert-caution: var(--light-color-alert-caution); + + --external-icon: var(--light-external-icon); + --color-scheme: var(--light-color-scheme); + } + } + + @media (prefers-color-scheme: dark) { + :root { + --color-background: var(--dark-color-background); + --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-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); + --color-ts-enum-member: var(--dark-color-ts-enum-member); + --color-ts-variable: var(--dark-color-ts-variable); + --color-ts-function: var(--dark-color-ts-function); + --color-ts-class: var(--dark-color-ts-class); + --color-ts-interface: var(--dark-color-ts-interface); + --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( + --dark-color-ts-constructor-signature + ); + --color-ts-parameter: var(--dark-color-ts-parameter); + --color-ts-type-parameter: var(--dark-color-ts-type-parameter); + --color-ts-accessor: var(--dark-color-ts-accessor); + --color-ts-get-signature: var(--dark-color-ts-get-signature); + --color-ts-set-signature: var(--dark-color-ts-set-signature); + --color-ts-type-alias: var(--dark-color-ts-type-alias); + --color-document: var(--dark-color-document); + + --color-alert-note: var(--dark-color-alert-note); + --color-alert-tip: var(--dark-color-alert-tip); + --color-alert-important: var(--dark-color-alert-important); + --color-alert-warning: var(--dark-color-alert-warning); + --color-alert-caution: var(--dark-color-alert-caution); + + --external-icon: var(--dark-external-icon); + --color-scheme: var(--dark-color-scheme); + } + } + + html { + color-scheme: var(--color-scheme); + } + + body { + margin: 0; + } + + :root[data-theme="light"] { --color-background: var(--light-color-background); --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); @@ -145,23 +286,26 @@ --color-ts-type-alias: var(--light-color-ts-type-alias); --color-document: var(--light-color-document); + --color-note: var(--light-color-note); + --color-tip: var(--light-color-tip); + --color-important: var(--light-color-important); + --color-warning: var(--light-color-warning); + --color-caution: var(--light-color-caution); + --external-icon: var(--light-external-icon); --color-scheme: var(--light-color-scheme); } -} -@media (prefers-color-scheme: dark) { - :root { + :root[data-theme="dark"] { --color-background: var(--dark-color-background); --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); @@ -197,1297 +341,1270 @@ --color-ts-type-alias: var(--dark-color-ts-type-alias); --color-document: var(--dark-color-document); + --color-note: var(--dark-color-note); + --color-tip: var(--dark-color-tip); + --color-important: var(--dark-color-important); + --color-warning: var(--dark-color-warning); + --color-caution: var(--dark-color-caution); + --external-icon: var(--dark-external-icon); --color-scheme: var(--dark-color-scheme); } -} -html { - color-scheme: var(--color-scheme); -} - -body { - margin: 0; -} + *:focus-visible, + .tsd-accordion-summary:focus-visible svg { + outline: 2px solid var(--color-focus-outline); + } -:root[data-theme="light"] { - --color-background: var(--light-color-background); - --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-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); - --color-ts-enum-member: var(--light-color-ts-enum-member); - --color-ts-variable: var(--light-color-ts-variable); - --color-ts-function: var(--light-color-ts-function); - --color-ts-class: var(--light-color-ts-class); - --color-ts-interface: var(--light-color-ts-interface); - --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( - --light-color-ts-constructor-signature - ); - --color-ts-parameter: var(--light-color-ts-parameter); - --color-ts-type-parameter: var(--light-color-ts-type-parameter); - --color-ts-accessor: var(--light-color-ts-accessor); - --color-ts-get-signature: var(--light-color-ts-get-signature); - --color-ts-set-signature: var(--light-color-ts-set-signature); - --color-ts-type-alias: var(--light-color-ts-type-alias); - --color-document: var(--light-color-document); - - --external-icon: var(--light-external-icon); - --color-scheme: var(--light-color-scheme); -} + .always-visible, + .always-visible .tsd-signatures { + display: inherit !important; + } -:root[data-theme="dark"] { - --color-background: var(--dark-color-background); - --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-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); - --color-ts-enum-member: var(--dark-color-ts-enum-member); - --color-ts-variable: var(--dark-color-ts-variable); - --color-ts-function: var(--dark-color-ts-function); - --color-ts-class: var(--dark-color-ts-class); - --color-ts-interface: var(--dark-color-ts-interface); - --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( - --dark-color-ts-constructor-signature - ); - --color-ts-parameter: var(--dark-color-ts-parameter); - --color-ts-type-parameter: var(--dark-color-ts-type-parameter); - --color-ts-accessor: var(--dark-color-ts-accessor); - --color-ts-get-signature: var(--dark-color-ts-get-signature); - --color-ts-set-signature: var(--dark-color-ts-set-signature); - --color-ts-type-alias: var(--dark-color-ts-type-alias); - --color-document: var(--dark-color-document); - - --external-icon: var(--dark-external-icon); - --color-scheme: var(--dark-color-scheme); -} + h1, + h2, + h3, + h4, + h5, + h6 { + line-height: 1.2; + } -*:focus-visible, -.tsd-accordion-summary:focus-visible svg { - outline: 2px solid var(--color-focus-outline); -} + h1 { + font-size: 1.875rem; + margin: 0.67rem 0; + } -.always-visible, -.always-visible .tsd-signatures { - display: inherit !important; -} + h2 { + font-size: 1.5rem; + margin: 0.83rem 0; + } -h1, -h2, -h3, -h4, -h5, -h6 { - line-height: 1.2; -} + h3 { + font-size: 1.25rem; + margin: 1rem 0; + } -h1 { - font-size: 1.875rem; - margin: 0.67rem 0; -} + h4 { + font-size: 1.05rem; + margin: 1.33rem 0; + } -h2 { - font-size: 1.5rem; - margin: 0.83rem 0; -} + h5 { + font-size: 1rem; + margin: 1.5rem 0; + } -h3 { - font-size: 1.25rem; - margin: 1rem 0; -} + h6 { + font-size: 0.875rem; + margin: 2.33rem 0; + } -h4 { - font-size: 1.05rem; - margin: 1.33rem 0; -} + dl, + menu, + ol, + ul { + margin: 1em 0; + } -h5 { - font-size: 1rem; - margin: 1.5rem 0; -} + dd { + margin: 0 0 0 34px; + } -h6 { - font-size: 0.875rem; - margin: 2.33rem 0; -} + .container { + max-width: 1700px; + padding: 0 2rem; + } -dl, -menu, -ol, -ul { - margin: 1em 0; -} + /* Footer */ + footer { + border-top: 1px solid var(--color-accent); + padding-top: 1rem; + padding-bottom: 1rem; + max-height: 3.5rem; + } + footer > p { + margin: 0 1em; + } -dd { - margin: 0 0 0 40px; -} + .container-main { + margin: 0 auto; + /* toolbar, footer, margin */ + min-height: calc(100vh - 41px - 56px - 4rem); + } -.container { - max-width: 1700px; - padding: 0 2rem; -} + @keyframes fade-in { + from { + opacity: 0; + } + to { + opacity: 1; + } + } + @keyframes fade-out { + from { + opacity: 1; + visibility: visible; + } + to { + opacity: 0; + } + } + @keyframes fade-in-delayed { + 0% { + opacity: 0; + } + 33% { + opacity: 0; + } + 100% { + opacity: 1; + } + } + @keyframes fade-out-delayed { + 0% { + opacity: 1; + visibility: visible; + } + 66% { + opacity: 0; + } + 100% { + opacity: 0; + } + } + @keyframes pop-in-from-right { + from { + transform: translate(100%, 0); + } + to { + transform: translate(0, 0); + } + } + @keyframes pop-out-to-right { + from { + transform: translate(0, 0); + visibility: visible; + } + to { + transform: translate(100%, 0); + } + } + body { + background: var(--color-background); + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", + Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; + font-size: 16px; + color: var(--color-text); + } -/* Footer */ -footer { - border-top: 1px solid var(--color-accent); - padding-top: 1rem; - padding-bottom: 1rem; - max-height: 3.5rem; -} -footer > p { - margin: 0 1em; -} + a { + color: var(--color-link); + text-decoration: none; + } + a:hover { + text-decoration: underline; + } + a.external[target="_blank"] { + background-image: var(--external-icon); + background-position: top 3px right; + background-repeat: no-repeat; + padding-right: 13px; + } + a.tsd-anchor-link { + color: var(--color-text); + } -.container-main { - margin: 0 auto; - /* toolbar, footer, margin */ - min-height: calc(100vh - 41px - 56px - 4rem); -} + code, + pre { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + padding: 0.2em; + margin: 0; + font-size: 0.875rem; + border-radius: 0.8em; + } -@keyframes fade-in { - from { + pre { + position: relative; + white-space: pre-wrap; + word-wrap: break-word; + padding: 10px; + border: 1px solid var(--color-accent); + margin-bottom: 8px; + } + pre code { + padding: 0; + font-size: 100%; + } + pre > button { + position: absolute; + top: 10px; + right: 10px; opacity: 0; + transition: opacity 0.1s; + box-sizing: border-box; } - to { + pre:hover > button, + pre > button.visible { opacity: 1; } -} -@keyframes fade-out { - from { - opacity: 1; - visibility: visible; + + blockquote { + margin: 1em 0; + padding-left: 1em; + border-left: 4px solid gray; } - to { - opacity: 0; + + .tsd-typography { + line-height: 1.333em; } -} -@keyframes fade-in-delayed { - 0% { - opacity: 0; + .tsd-typography ul { + list-style: square; + padding: 0 0 0 20px; + margin: 0; } - 33% { - opacity: 0; + .tsd-typography .tsd-index-panel h3, + .tsd-index-panel .tsd-typography h3, + .tsd-typography h4, + .tsd-typography h5, + .tsd-typography h6 { + font-size: 1em; } - 100% { - opacity: 1; + .tsd-typography h5, + .tsd-typography h6 { + font-weight: normal; } -} -@keyframes fade-out-delayed { - 0% { - opacity: 1; - visibility: visible; + .tsd-typography p, + .tsd-typography ul, + .tsd-typography ol { + margin: 1em 0; } - 66% { - opacity: 0; + .tsd-typography table { + border-collapse: collapse; + border: none; } - 100% { - opacity: 0; + .tsd-typography td, + .tsd-typography th { + padding: 6px 13px; + border: 1px solid var(--color-accent); } -} -@keyframes pop-in-from-right { - from { - transform: translate(100%, 0); + .tsd-typography thead, + .tsd-typography tr:nth-child(even) { + background-color: var(--color-background-secondary); } - to { - transform: translate(0, 0); + + .tsd-alert { + padding: 8px 16px; + margin-bottom: 16px; + border-left: 0.25em solid var(--alert-color); } -} -@keyframes pop-out-to-right { - from { - transform: translate(0, 0); - visibility: visible; + .tsd-alert blockquote > :last-child, + .tsd-alert > :last-child { + margin-bottom: 0; } - to { - transform: translate(100%, 0); + .tsd-alert-title { + color: var(--alert-color); + display: inline-flex; + align-items: center; + } + .tsd-alert-title span { + margin-left: 4px; } -} -body { - background: var(--color-background); - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", - Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; - font-size: 16px; - color: var(--color-text); -} -a { - color: var(--color-link); - text-decoration: none; -} -a:hover { - text-decoration: underline; -} -a.external[target="_blank"] { - background-image: var(--external-icon); - background-position: top 3px right; - background-repeat: no-repeat; - padding-right: 13px; -} -a.tsd-anchor-link { - color: var(--color-text); -} + .tsd-alert-note { + --alert-color: var(--color-alert-note); + } + .tsd-alert-tip { + --alert-color: var(--color-alert-tip); + } + .tsd-alert-important { + --alert-color: var(--color-alert-important); + } + .tsd-alert-warning { + --alert-color: var(--color-alert-warning); + } + .tsd-alert-caution { + --alert-color: var(--color-alert-caution); + } -code, -pre { - font-family: Menlo, Monaco, Consolas, "Courier New", monospace; - padding: 0.2em; - margin: 0; - font-size: 0.875rem; - border-radius: 0.8em; -} + .tsd-breadcrumb { + margin: 0; + padding: 0; + color: var(--color-text-aside); + } + .tsd-breadcrumb a { + color: var(--color-text-aside); + text-decoration: none; + } + .tsd-breadcrumb a:hover { + text-decoration: underline; + } + .tsd-breadcrumb li { + display: inline; + } + .tsd-breadcrumb li:after { + content: " / "; + } -pre { - position: relative; - white-space: pre-wrap; - word-wrap: break-word; - padding: 10px; - border: 1px solid var(--color-accent); -} -pre code { - padding: 0; - font-size: 100%; -} -pre > button { - position: absolute; - top: 10px; - right: 10px; - opacity: 0; - transition: opacity 0.1s; - box-sizing: border-box; -} -pre:hover > button, -pre > button.visible { - opacity: 1; -} + .tsd-comment-tags { + display: flex; + flex-direction: column; + } + dl.tsd-comment-tag-group { + display: flex; + align-items: center; + overflow: hidden; + margin: 0.5em 0; + } + dl.tsd-comment-tag-group dt { + display: flex; + margin-right: 0.5em; + font-size: 0.875em; + font-weight: normal; + } + dl.tsd-comment-tag-group dd { + margin: 0; + } + code.tsd-tag { + padding: 0.25em 0.4em; + border: 0.1em solid var(--color-accent); + margin-right: 0.25em; + font-size: 70%; + } + h1 code.tsd-tag:first-of-type { + margin-left: 0.25em; + } -blockquote { - margin: 1em 0; - padding-left: 1em; - border-left: 4px solid gray; -} + dl.tsd-comment-tag-group dd:before, + dl.tsd-comment-tag-group dd:after { + content: " "; + } + dl.tsd-comment-tag-group dd pre, + dl.tsd-comment-tag-group dd:after { + clear: both; + } + dl.tsd-comment-tag-group p { + margin: 0; + } -.tsd-typography { - line-height: 1.333em; -} -.tsd-typography ul { - list-style: square; - padding: 0 0 0 20px; - margin: 0; -} -.tsd-typography .tsd-index-panel h3, -.tsd-index-panel .tsd-typography h3, -.tsd-typography h4, -.tsd-typography h5, -.tsd-typography h6 { - font-size: 1em; -} -.tsd-typography h5, -.tsd-typography h6 { - font-weight: normal; -} -.tsd-typography p, -.tsd-typography ul, -.tsd-typography ol { - margin: 1em 0; -} -.tsd-typography table { - border-collapse: collapse; - border: none; -} -.tsd-typography td, -.tsd-typography th { - padding: 6px 13px; - border: 1px solid var(--color-accent); -} -.tsd-typography thead, -.tsd-typography tr:nth-child(even) { - background-color: var(--color-background-secondary); -} + .tsd-panel.tsd-comment .lead { + font-size: 1.1em; + line-height: 1.333em; + margin-bottom: 2em; + } + .tsd-panel.tsd-comment .lead:last-child { + margin-bottom: 0; + } -.tsd-breadcrumb { - margin: 0; - padding: 0; - color: var(--color-text-aside); -} -.tsd-breadcrumb a { - color: var(--color-text-aside); - text-decoration: none; -} -.tsd-breadcrumb a:hover { - text-decoration: underline; -} -.tsd-breadcrumb li { - display: inline; -} -.tsd-breadcrumb li:after { - content: " / "; -} + .tsd-filter-visibility h4 { + font-size: 1rem; + padding-top: 0.75rem; + padding-bottom: 0.5rem; + margin: 0; + } + .tsd-filter-item:not(:last-child) { + margin-bottom: 0.5rem; + } + .tsd-filter-input { + display: flex; + width: -moz-fit-content; + width: fit-content; + align-items: center; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + } + .tsd-filter-input input[type="checkbox"] { + cursor: pointer; + position: absolute; + width: 1.5em; + height: 1.5em; + opacity: 0; + } + .tsd-filter-input input[type="checkbox"]:disabled { + pointer-events: none; + } + .tsd-filter-input svg { + cursor: pointer; + width: 1.5em; + height: 1.5em; + margin-right: 0.5em; + border-radius: 0.33em; + /* Leaving this at full opacity breaks event listeners on Firefox. + Don't remove unless you know what you're doing. */ + opacity: 0.99; + } + .tsd-filter-input input[type="checkbox"]:focus-visible + svg { + outline: 2px solid var(--color-focus-outline); + } + .tsd-checkbox-background { + fill: var(--color-accent); + } + input[type="checkbox"]:checked ~ svg .tsd-checkbox-checkmark { + stroke: var(--color-text); + } + .tsd-filter-input input:disabled ~ svg > .tsd-checkbox-background { + fill: var(--color-background); + stroke: var(--color-accent); + stroke-width: 0.25rem; + } + .tsd-filter-input input:disabled ~ svg > .tsd-checkbox-checkmark { + stroke: var(--color-accent); + } -.tsd-comment-tags { - display: flex; - flex-direction: column; -} -dl.tsd-comment-tag-group { - display: flex; - align-items: center; - overflow: hidden; - margin: 0.5em 0; -} -dl.tsd-comment-tag-group dt { - display: flex; - margin-right: 0.5em; - font-size: 0.875em; - font-weight: normal; -} -dl.tsd-comment-tag-group dd { - margin: 0; -} -code.tsd-tag { - padding: 0.25em 0.4em; - border: 0.1em solid var(--color-accent); - margin-right: 0.25em; - font-size: 70%; -} -h1 code.tsd-tag:first-of-type { - margin-left: 0.25em; -} + .settings-label { + font-weight: bold; + text-transform: uppercase; + display: inline-block; + } -dl.tsd-comment-tag-group dd:before, -dl.tsd-comment-tag-group dd:after { - content: " "; -} -dl.tsd-comment-tag-group dd pre, -dl.tsd-comment-tag-group dd:after { - clear: both; -} -dl.tsd-comment-tag-group p { - margin: 0; -} + .tsd-filter-visibility .settings-label { + margin: 0.75rem 0 0.5rem 0; + } -.tsd-panel.tsd-comment .lead { - font-size: 1.1em; - line-height: 1.333em; - margin-bottom: 2em; -} -.tsd-panel.tsd-comment .lead:last-child { - margin-bottom: 0; -} + .tsd-theme-toggle .settings-label { + margin: 0.75rem 0.75rem 0 0; + } -.tsd-filter-visibility h4 { - font-size: 1rem; - padding-top: 0.75rem; - padding-bottom: 0.5rem; - margin: 0; -} -.tsd-filter-item:not(:last-child) { - margin-bottom: 0.5rem; -} -.tsd-filter-input { - display: flex; - width: -moz-fit-content; - width: fit-content; - align-items: center; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - cursor: pointer; -} -.tsd-filter-input input[type="checkbox"] { - cursor: pointer; - position: absolute; - width: 1.5em; - height: 1.5em; - opacity: 0; -} -.tsd-filter-input input[type="checkbox"]:disabled { - pointer-events: none; -} -.tsd-filter-input svg { - cursor: pointer; - width: 1.5em; - height: 1.5em; - margin-right: 0.5em; - border-radius: 0.33em; - /* Leaving this at full opacity breaks event listeners on Firefox. - Don't remove unless you know what you're doing. */ - opacity: 0.99; -} -.tsd-filter-input input[type="checkbox"]:focus-visible + svg { - outline: 2px solid var(--color-focus-outline); -} -.tsd-checkbox-background { - fill: var(--color-accent); -} -input[type="checkbox"]:checked ~ svg .tsd-checkbox-checkmark { - stroke: var(--color-text); -} -.tsd-filter-input input:disabled ~ svg > .tsd-checkbox-background { - fill: var(--color-background); - stroke: var(--color-accent); - stroke-width: 0.25rem; -} -.tsd-filter-input input:disabled ~ svg > .tsd-checkbox-checkmark { - stroke: var(--color-accent); -} + .tsd-hierarchy h4 label:hover span { + text-decoration: underline; + } -.settings-label { - font-weight: bold; - text-transform: uppercase; - display: inline-block; -} + .tsd-hierarchy { + list-style: square; + margin: 0; + } + .tsd-hierarchy-target { + font-weight: bold; + } + .tsd-hierarchy-toggle { + color: var(--color-link); + cursor: pointer; + } -.tsd-filter-visibility .settings-label { - margin: 0.75rem 0 0.5rem 0; -} + .tsd-full-hierarchy:not(:last-child) { + margin-bottom: 1em; + padding-bottom: 1em; + border-bottom: 1px solid var(--color-accent); + } + .tsd-full-hierarchy, + .tsd-full-hierarchy ul { + list-style: none; + margin: 0; + padding: 0; + } + .tsd-full-hierarchy ul { + padding-left: 1.5rem; + } + .tsd-full-hierarchy a { + padding: 0.25rem 0 !important; + font-size: 1rem; + display: inline-flex; + align-items: center; + color: var(--color-text); + } + .tsd-full-hierarchy svg[data-dropdown] { + cursor: pointer; + } + .tsd-full-hierarchy svg[data-dropdown="false"] { + transform: rotate(-90deg); + } + .tsd-full-hierarchy svg[data-dropdown="false"] ~ ul { + display: none; + } -.tsd-theme-toggle .settings-label { - margin: 0.75rem 0.75rem 0 0; -} + .tsd-panel-group.tsd-index-group { + margin-bottom: 0; + } + .tsd-index-panel .tsd-index-list { + list-style: none; + line-height: 1.333em; + margin: 0; + padding: 0.25rem 0 0 0; + overflow: hidden; + display: grid; + grid-template-columns: repeat(3, 1fr); + column-gap: 1rem; + grid-template-rows: auto; + } + @media (max-width: 1024px) { + .tsd-index-panel .tsd-index-list { + grid-template-columns: repeat(2, 1fr); + } + } + @media (max-width: 768px) { + .tsd-index-panel .tsd-index-list { + grid-template-columns: repeat(1, 1fr); + } + } + .tsd-index-panel .tsd-index-list li { + -webkit-page-break-inside: avoid; + -moz-page-break-inside: avoid; + -ms-page-break-inside: avoid; + -o-page-break-inside: avoid; + page-break-inside: avoid; + } -.tsd-hierarchy { - list-style: square; - margin: 0; -} -.tsd-hierarchy .target { - font-weight: bold; -} + .tsd-flag { + display: inline-block; + padding: 0.25em 0.4em; + border-radius: 4px; + color: var(--color-comment-tag-text); + background-color: var(--color-comment-tag); + text-indent: 0; + font-size: 75%; + line-height: 1; + font-weight: normal; + } -.tsd-full-hierarchy:not(:last-child) { - margin-bottom: 1em; - padding-bottom: 1em; - border-bottom: 1px solid var(--color-accent); -} -.tsd-full-hierarchy, -.tsd-full-hierarchy ul { - list-style: none; - margin: 0; - padding: 0; -} -.tsd-full-hierarchy ul { - padding-left: 1.5rem; -} -.tsd-full-hierarchy a { - padding: 0.25rem 0 !important; - font-size: 1rem; - display: inline-flex; - align-items: center; - color: var(--color-text); -} + .tsd-anchor { + position: relative; + top: -100px; + } -.tsd-panel-group.tsd-index-group { - margin-bottom: 0; -} -.tsd-index-panel .tsd-index-list { - list-style: none; - line-height: 1.333em; - margin: 0; - padding: 0.25rem 0 0 0; - overflow: hidden; - display: grid; - grid-template-columns: repeat(3, 1fr); - column-gap: 1rem; - grid-template-rows: auto; -} -@media (max-width: 1024px) { - .tsd-index-panel .tsd-index-list { - grid-template-columns: repeat(2, 1fr); + .tsd-member { + position: relative; } -} -@media (max-width: 768px) { - .tsd-index-panel .tsd-index-list { - grid-template-columns: repeat(1, 1fr); + .tsd-member .tsd-anchor + h3 { + display: flex; + align-items: center; + margin-top: 0; + margin-bottom: 0; + border-bottom: none; } -} -.tsd-index-panel .tsd-index-list li { - -webkit-page-break-inside: avoid; - -moz-page-break-inside: avoid; - -ms-page-break-inside: avoid; - -o-page-break-inside: avoid; - page-break-inside: avoid; -} -.tsd-flag { - display: inline-block; - padding: 0.25em 0.4em; - border-radius: 4px; - color: var(--color-comment-tag-text); - background-color: var(--color-comment-tag); - text-indent: 0; - font-size: 75%; - line-height: 1; - font-weight: normal; -} + .tsd-navigation.settings { + margin: 1rem 0; + } + .tsd-navigation > a, + .tsd-navigation .tsd-accordion-summary { + width: calc(100% - 0.25rem); + display: flex; + align-items: center; + } + .tsd-navigation a, + .tsd-navigation summary > span, + .tsd-page-navigation a { + display: flex; + width: calc(100% - 0.25rem); + align-items: center; + padding: 0.25rem; + color: var(--color-text); + text-decoration: none; + box-sizing: border-box; + } + .tsd-navigation a.current, + .tsd-page-navigation a.current { + background: var(--color-active-menu-item); + } + .tsd-navigation a:hover, + .tsd-page-navigation a:hover { + text-decoration: underline; + } + .tsd-navigation ul, + .tsd-page-navigation ul { + margin-top: 0; + margin-bottom: 0; + padding: 0; + list-style: none; + } + .tsd-navigation li, + .tsd-page-navigation li { + padding: 0; + max-width: 100%; + } + .tsd-navigation .tsd-nav-link { + display: none; + } + .tsd-nested-navigation { + margin-left: 3rem; + } + .tsd-nested-navigation > li > details { + margin-left: -1.5rem; + } + .tsd-small-nested-navigation { + margin-left: 1.5rem; + } + .tsd-small-nested-navigation > li > details { + margin-left: -1.5rem; + } -.tsd-anchor { - position: relative; - top: -100px; -} + .tsd-page-navigation-section { + margin-left: 10px; + } + .tsd-page-navigation-section > summary { + padding: 0.25rem; + } + .tsd-page-navigation-section > div { + margin-left: 20px; + } + .tsd-page-navigation ul { + padding-left: 1.75rem; + } -.tsd-member { - position: relative; -} -.tsd-member .tsd-anchor + h3 { - display: flex; - align-items: center; - margin-top: 0; - margin-bottom: 0; - border-bottom: none; -} + #tsd-sidebar-links a { + margin-top: 0; + margin-bottom: 0.5rem; + line-height: 1.25rem; + } + #tsd-sidebar-links a:last-of-type { + margin-bottom: 0; + } -.tsd-navigation.settings { - margin: 1rem 0; -} -.tsd-navigation > a, -.tsd-navigation .tsd-accordion-summary { - width: calc(100% - 0.25rem); - display: flex; - align-items: center; -} -.tsd-navigation a, -.tsd-navigation summary > span, -.tsd-page-navigation a { - display: flex; - width: calc(100% - 0.25rem); - align-items: center; - padding: 0.25rem; - color: var(--color-text); - text-decoration: none; - box-sizing: border-box; -} -.tsd-navigation a.current, -.tsd-page-navigation a.current { - background: var(--color-active-menu-item); -} -.tsd-navigation a:hover, -.tsd-page-navigation a:hover { - text-decoration: underline; -} -.tsd-navigation ul, -.tsd-page-navigation ul { - margin-top: 0; - margin-bottom: 0; - padding: 0; - list-style: none; -} -.tsd-navigation li, -.tsd-page-navigation li { - padding: 0; - max-width: 100%; -} -.tsd-navigation .tsd-nav-link { - display: none; -} -.tsd-nested-navigation { - margin-left: 3rem; -} -.tsd-nested-navigation > li > details { - margin-left: -1.5rem; -} -.tsd-small-nested-navigation { - margin-left: 1.5rem; -} -.tsd-small-nested-navigation > li > details { - margin-left: -1.5rem; -} - -.tsd-page-navigation-section { - margin-left: 10px; -} -.tsd-page-navigation-section > summary { - padding: 0.25rem; -} -.tsd-page-navigation-section > div { - margin-left: 20px; -} -.tsd-page-navigation ul { - padding-left: 1.75rem; -} - -#tsd-sidebar-links a { - margin-top: 0; - margin-bottom: 0.5rem; - line-height: 1.25rem; -} -#tsd-sidebar-links a:last-of-type { - margin-bottom: 0; -} - -a.tsd-index-link { - padding: 0.25rem 0 !important; - font-size: 1rem; - line-height: 1.25rem; - display: inline-flex; - align-items: center; - color: var(--color-text); -} -.tsd-accordion-summary { - list-style-type: none; /* hide marker on non-safari */ - outline: none; /* broken on safari, so just hide it */ -} -.tsd-accordion-summary::-webkit-details-marker { - display: none; /* hide marker on safari */ -} -.tsd-accordion-summary, -.tsd-accordion-summary a { - -moz-user-select: none; - -webkit-user-select: none; - -ms-user-select: none; - user-select: none; - - cursor: pointer; -} -.tsd-accordion-summary a { - width: calc(100% - 1.5rem); -} -.tsd-accordion-summary > * { - margin-top: 0; - margin-bottom: 0; - padding-top: 0; - padding-bottom: 0; -} -.tsd-accordion .tsd-accordion-summary > svg { - margin-left: 0.25rem; - vertical-align: text-top; -} -.tsd-index-content > :not(:first-child) { - margin-top: 0.75rem; -} -.tsd-index-heading { - margin-top: 1.5rem; - 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; - height: 1.25rem; - min-width: 1.25rem; - min-height: 1.25rem; -} -.tsd-signature > .tsd-kind-icon { - margin-right: 0.8rem; -} - -.tsd-panel { - margin-bottom: 2.5rem; -} -.tsd-panel.tsd-member { - margin-bottom: 4rem; -} -.tsd-panel:empty { - display: none; -} -.tsd-panel > h1, -.tsd-panel > h2, -.tsd-panel > h3 { - margin: 1.5rem -1.5rem 0.75rem -1.5rem; - padding: 0 1.5rem 0.75rem 1.5rem; -} -.tsd-panel > h1.tsd-before-signature, -.tsd-panel > h2.tsd-before-signature, -.tsd-panel > h3.tsd-before-signature { - margin-bottom: 0; - border-bottom: none; -} - -.tsd-panel-group { - margin: 2rem 0; -} -.tsd-panel-group.tsd-index-group { - margin: 2rem 0; -} -.tsd-panel-group.tsd-index-group details { - margin: 2rem 0; -} -.tsd-panel-group > .tsd-accordion-summary { - margin-bottom: 1rem; -} - -#tsd-search { - transition: background-color 0.2s; -} -#tsd-search .title { - position: relative; - z-index: 2; -} -#tsd-search .field { - position: absolute; - left: 0; - top: 0; - right: 2.5rem; - height: 100%; -} -#tsd-search .field input { - box-sizing: border-box; - position: relative; - top: -50px; - z-index: 1; - width: 100%; - padding: 0 10px; - opacity: 0; - outline: 0; - border: 0; - background: transparent; - color: var(--color-text); -} -#tsd-search .field label { - position: absolute; - overflow: hidden; - right: -40px; -} -#tsd-search .field input, -#tsd-search .title, -#tsd-toolbar-links a { - transition: opacity 0.2s; -} -#tsd-search .results { - position: absolute; - visibility: hidden; - top: 40px; - width: 100%; - margin: 0; - padding: 0; - list-style: none; - box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); -} -#tsd-search .results li { - background-color: var(--color-background); - line-height: initial; - padding: 4px; -} -#tsd-search .results li:nth-child(even) { - background-color: var(--color-background-secondary); -} -#tsd-search .results li.state { - display: none; -} -#tsd-search .results li.current:not(.no-results), -#tsd-search .results li:hover:not(.no-results) { - background-color: var(--color-accent); -} -#tsd-search .results a { - display: flex; - align-items: center; - padding: 0.25rem; - box-sizing: border-box; -} -#tsd-search .results a:before { - top: 10px; -} -#tsd-search .results span.parent { - color: var(--color-text-aside); - font-weight: normal; -} -#tsd-search.has-focus { - background-color: var(--color-accent); -} -#tsd-search.has-focus .field input { - top: 0; - opacity: 1; -} -#tsd-search.has-focus .title, -#tsd-search.has-focus #tsd-toolbar-links a { - z-index: 0; - opacity: 0; -} -#tsd-search.has-focus .results { - visibility: visible; -} -#tsd-search.loading .results li.state.loading { - display: block; -} -#tsd-search.failure .results li.state.failure { - display: block; -} - -#tsd-toolbar-links { - position: absolute; - top: 0; - right: 2rem; - height: 100%; - display: flex; - align-items: center; - justify-content: flex-end; -} -#tsd-toolbar-links a { - margin-left: 1.5rem; -} -#tsd-toolbar-links a:hover { - text-decoration: underline; -} - -.tsd-signature { - margin: 0 0 1rem 0; - padding: 1rem 0.5rem; - border: 1px solid var(--color-accent); - font-family: Menlo, Monaco, Consolas, "Courier New", monospace; - font-size: 14px; - overflow-x: auto; -} - -.tsd-signature-keyword { - color: var(--color-ts-keyword); - font-weight: normal; -} - -.tsd-signature-symbol { - color: var(--color-text-aside); - font-weight: normal; -} - -.tsd-signature-type { - font-style: italic; - font-weight: normal; -} - -.tsd-signatures { - padding: 0; - margin: 0 0 1em 0; - list-style-type: none; -} -.tsd-signatures .tsd-signature { - margin: 0; - border-color: var(--color-accent); - border-width: 1px 0; - transition: background-color 0.1s; -} -.tsd-signatures .tsd-index-signature:not(:last-child) { - margin-bottom: 1em; -} -.tsd-signatures .tsd-index-signature .tsd-signature { - border-width: 1px; -} -.tsd-description .tsd-signatures .tsd-signature { - border-width: 1px; -} - -ul.tsd-parameter-list, -ul.tsd-type-parameter-list { - list-style: square; - margin: 0; - padding-left: 20px; -} -ul.tsd-parameter-list > li.tsd-parameter-signature, -ul.tsd-type-parameter-list > li.tsd-parameter-signature { - list-style: none; - margin-left: -20px; -} -ul.tsd-parameter-list h5, -ul.tsd-type-parameter-list h5 { - font-size: 16px; - margin: 1em 0 0.5em 0; -} -.tsd-sources { - margin-top: 1rem; - font-size: 0.875em; -} -.tsd-sources a { - color: var(--color-text-aside); - text-decoration: underline; -} -.tsd-sources ul { - list-style: none; - padding: 0; -} - -.tsd-page-toolbar { - position: sticky; - z-index: 1; - top: 0; - left: 0; - width: 100%; - color: var(--color-text); - background: var(--color-background-secondary); - border-bottom: 1px var(--color-accent) solid; - transition: transform 0.3s ease-in-out; -} -.tsd-page-toolbar a { - color: var(--color-text); - text-decoration: none; -} -.tsd-page-toolbar a.title { - font-weight: bold; -} -.tsd-page-toolbar a.title:hover { - text-decoration: underline; -} -.tsd-page-toolbar .tsd-toolbar-contents { - display: flex; - justify-content: space-between; - height: 2.5rem; - margin: 0 auto; -} -.tsd-page-toolbar .table-cell { - position: relative; - white-space: nowrap; - line-height: 40px; -} -.tsd-page-toolbar .table-cell:first-child { - width: 100%; -} -.tsd-page-toolbar .tsd-toolbar-icon { - box-sizing: border-box; - line-height: 0; - padding: 12px 0; -} - -.tsd-widget { - display: inline-block; - overflow: hidden; - opacity: 0.8; - height: 40px; - transition: - opacity 0.1s, - background-color 0.2s; - vertical-align: bottom; - cursor: pointer; -} -.tsd-widget:hover { - opacity: 0.9; -} -.tsd-widget.active { - opacity: 1; - background-color: var(--color-accent); -} -.tsd-widget.no-caption { - width: 40px; -} -.tsd-widget.no-caption:before { - margin: 0; -} + a.tsd-index-link { + padding: 0.25rem 0 !important; + font-size: 1rem; + line-height: 1.25rem; + display: inline-flex; + align-items: center; + color: var(--color-text); + } + .tsd-accordion-summary { + list-style-type: none; /* hide marker on non-safari */ + outline: none; /* broken on safari, so just hide it */ + } + .tsd-accordion-summary::-webkit-details-marker { + display: none; /* hide marker on safari */ + } + .tsd-accordion-summary, + .tsd-accordion-summary a { + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; + + cursor: pointer; + } + .tsd-accordion-summary a { + width: calc(100% - 1.5rem); + } + .tsd-accordion-summary > * { + margin-top: 0; + margin-bottom: 0; + padding-top: 0; + padding-bottom: 0; + } + .tsd-accordion .tsd-accordion-summary > svg { + margin-left: 0.25rem; + vertical-align: text-top; + } + /* + We need to be careful to target the arrow indicating whether the accordion + is open, but not any other SVGs included in the details element. +*/ + .tsd-accordion:not([open]) > .tsd-accordion-summary > svg:first-child, + .tsd-accordion:not([open]) > .tsd-accordion-summary > h1 > svg:first-child, + .tsd-accordion:not([open]) > .tsd-accordion-summary > h2 > svg:first-child, + .tsd-accordion:not([open]) > .tsd-accordion-summary > h3 > svg:first-child, + .tsd-accordion:not([open]) > .tsd-accordion-summary > h4 > svg:first-child { + transform: rotate(-90deg); + } + .tsd-index-content > :not(:first-child) { + margin-top: 0.75rem; + } + .tsd-index-heading { + margin-top: 1.5rem; + margin-bottom: 0.75rem; + } -.tsd-widget.options, -.tsd-widget.menu { - display: none; -} -input[type="checkbox"] + .tsd-widget:before { - background-position: -120px 0; -} -input[type="checkbox"]:checked + .tsd-widget:before { - background-position: -160px 0; -} + .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; + height: 1.25rem; + min-width: 1.25rem; + min-height: 1.25rem; + } + .tsd-signature > .tsd-kind-icon { + margin-right: 0.8rem; + } -img { - max-width: 100%; -} + .tsd-panel { + margin-bottom: 2.5rem; + } + .tsd-panel.tsd-member { + margin-bottom: 4rem; + } + .tsd-panel:empty { + display: none; + } + .tsd-panel > h1, + .tsd-panel > h2, + .tsd-panel > h3 { + margin: 1.5rem -1.5rem 0.75rem -1.5rem; + padding: 0 1.5rem 0.75rem 1.5rem; + } + .tsd-panel > h1.tsd-before-signature, + .tsd-panel > h2.tsd-before-signature, + .tsd-panel > h3.tsd-before-signature { + margin-bottom: 0; + border-bottom: none; + } -.tsd-anchor-icon { - display: inline-flex; - align-items: center; - margin-left: 0.5rem; - vertical-align: middle; - color: var(--color-text); -} + .tsd-panel-group { + margin: 2rem 0; + } + .tsd-panel-group.tsd-index-group { + margin: 2rem 0; + } + .tsd-panel-group.tsd-index-group details { + margin: 2rem 0; + } + .tsd-panel-group > .tsd-accordion-summary { + margin-bottom: 1rem; + } -.tsd-anchor-icon svg { - width: 1em; - height: 1em; - visibility: hidden; -} + #tsd-search { + transition: background-color 0.2s; + } + #tsd-search .title { + position: relative; + z-index: 2; + } + #tsd-search .field { + position: absolute; + left: 0; + top: 0; + right: 2.5rem; + height: 100%; + } + #tsd-search .field input { + box-sizing: border-box; + position: relative; + top: -50px; + z-index: 1; + width: 100%; + padding: 0 10px; + opacity: 0; + outline: 0; + border: 0; + background: transparent; + color: var(--color-text); + } + #tsd-search .field label { + position: absolute; + overflow: hidden; + right: -40px; + } + #tsd-search .field input, + #tsd-search .title, + #tsd-toolbar-links a { + transition: opacity 0.2s; + } + #tsd-search .results { + position: absolute; + visibility: hidden; + top: 40px; + width: 100%; + margin: 0; + padding: 0; + list-style: none; + box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); + } + #tsd-search .results li { + background-color: var(--color-background); + line-height: initial; + padding: 4px; + } + #tsd-search .results li:nth-child(even) { + background-color: var(--color-background-secondary); + } + #tsd-search .results li.state { + display: none; + } + #tsd-search .results li.current:not(.no-results), + #tsd-search .results li:hover:not(.no-results) { + background-color: var(--color-accent); + } + #tsd-search .results a { + display: flex; + align-items: center; + padding: 0.25rem; + box-sizing: border-box; + } + #tsd-search .results a:before { + top: 10px; + } + #tsd-search .results span.parent { + color: var(--color-text-aside); + font-weight: normal; + } + #tsd-search.has-focus { + background-color: var(--color-accent); + } + #tsd-search.has-focus .field input { + top: 0; + opacity: 1; + } + #tsd-search.has-focus .title, + #tsd-search.has-focus #tsd-toolbar-links a { + z-index: 0; + opacity: 0; + } + #tsd-search.has-focus .results { + visibility: visible; + } + #tsd-search.loading .results li.state.loading { + display: block; + } + #tsd-search.failure .results li.state.failure { + display: block; + } -.tsd-anchor-link:hover > .tsd-anchor-icon svg { - visibility: visible; -} + #tsd-toolbar-links { + position: absolute; + top: 0; + right: 2rem; + height: 100%; + display: flex; + align-items: center; + justify-content: flex-end; + } + #tsd-toolbar-links a { + margin-left: 1.5rem; + } + #tsd-toolbar-links a:hover { + text-decoration: underline; + } -.deprecated { - text-decoration: line-through !important; -} + .tsd-signature { + margin: 0 0 1rem 0; + padding: 1rem 0.5rem; + border: 1px solid var(--color-accent); + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + font-size: 14px; + overflow-x: auto; + } -.warning { - padding: 1rem; - color: var(--color-warning-text); - background: var(--color-background-warning); -} + .tsd-signature-keyword { + color: var(--color-ts-keyword); + font-weight: normal; + } -.tsd-kind-project { - color: var(--color-ts-project); -} -.tsd-kind-module { - color: var(--color-ts-module); -} -.tsd-kind-namespace { - color: var(--color-ts-namespace); -} -.tsd-kind-enum { - color: var(--color-ts-enum); -} -.tsd-kind-enum-member { - color: var(--color-ts-enum-member); -} -.tsd-kind-variable { - color: var(--color-ts-variable); -} -.tsd-kind-function { - color: var(--color-ts-function); -} -.tsd-kind-class { - color: var(--color-ts-class); -} -.tsd-kind-interface { - color: var(--color-ts-interface); -} -.tsd-kind-constructor { - color: var(--color-ts-constructor); -} -.tsd-kind-property { - color: var(--color-ts-property); -} -.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); -} -.tsd-kind-index-signature { - color: var(--color-ts-index-signature); -} -.tsd-kind-constructor-signature { - color: var(--color-ts-constructor-signature); -} -.tsd-kind-parameter { - color: var(--color-ts-parameter); -} -.tsd-kind-type-parameter { - color: var(--color-ts-type-parameter); -} -.tsd-kind-accessor { - color: var(--color-ts-accessor); -} -.tsd-kind-get-signature { - color: var(--color-ts-get-signature); -} -.tsd-kind-set-signature { - color: var(--color-ts-set-signature); -} -.tsd-kind-type-alias { - color: var(--color-ts-type-alias); -} + .tsd-signature-symbol { + color: var(--color-text-aside); + font-weight: normal; + } -/* if we have a kind icon, don't color the text by kind */ -.tsd-kind-icon ~ span { - color: var(--color-text); -} + .tsd-signature-type { + font-style: italic; + font-weight: normal; + } -* { - scrollbar-width: thin; - scrollbar-color: var(--color-accent) var(--color-icon-background); -} + .tsd-signatures { + padding: 0; + margin: 0 0 1em 0; + list-style-type: none; + } + .tsd-signatures .tsd-signature { + margin: 0; + border-color: var(--color-accent); + border-width: 1px 0; + transition: background-color 0.1s; + } + .tsd-signatures .tsd-index-signature:not(:last-child) { + margin-bottom: 1em; + } + .tsd-signatures .tsd-index-signature .tsd-signature { + border-width: 1px; + } + .tsd-description .tsd-signatures .tsd-signature { + border-width: 1px; + } -*::-webkit-scrollbar { - width: 0.75rem; -} + ul.tsd-parameter-list, + ul.tsd-type-parameter-list { + list-style: square; + margin: 0; + padding-left: 20px; + } + ul.tsd-parameter-list > li.tsd-parameter-signature, + ul.tsd-type-parameter-list > li.tsd-parameter-signature { + list-style: none; + margin-left: -20px; + } + ul.tsd-parameter-list h5, + ul.tsd-type-parameter-list h5 { + font-size: 16px; + margin: 1em 0 0.5em 0; + } + .tsd-sources { + margin-top: 1rem; + font-size: 0.875em; + } + .tsd-sources a { + color: var(--color-text-aside); + text-decoration: underline; + } + .tsd-sources ul { + list-style: none; + padding: 0; + } -*::-webkit-scrollbar-track { - background: var(--color-icon-background); -} + .tsd-page-toolbar { + position: sticky; + z-index: 1; + top: 0; + left: 0; + width: 100%; + color: var(--color-text); + background: var(--color-background-secondary); + border-bottom: 1px var(--color-accent) solid; + transition: transform 0.3s ease-in-out; + } + .tsd-page-toolbar a { + color: var(--color-text); + text-decoration: none; + } + .tsd-page-toolbar a.title { + font-weight: bold; + } + .tsd-page-toolbar a.title:hover { + text-decoration: underline; + } + .tsd-page-toolbar .tsd-toolbar-contents { + display: flex; + justify-content: space-between; + height: 2.5rem; + margin: 0 auto; + } + .tsd-page-toolbar .table-cell { + position: relative; + white-space: nowrap; + line-height: 40px; + } + .tsd-page-toolbar .table-cell:first-child { + width: 100%; + } + .tsd-page-toolbar .tsd-toolbar-icon { + box-sizing: border-box; + line-height: 0; + padding: 12px 0; + } -*::-webkit-scrollbar-thumb { - background-color: var(--color-accent); - border-radius: 999rem; - border: 0.25rem solid var(--color-icon-background); -} + .tsd-widget { + display: inline-block; + overflow: hidden; + opacity: 0.8; + height: 40px; + transition: + opacity 0.1s, + background-color 0.2s; + vertical-align: bottom; + cursor: pointer; + } + .tsd-widget:hover { + opacity: 0.9; + } + .tsd-widget.active { + opacity: 1; + background-color: var(--color-accent); + } + .tsd-widget.no-caption { + width: 40px; + } + .tsd-widget.no-caption:before { + margin: 0; + } -/* mobile */ -@media (max-width: 769px) { .tsd-widget.options, .tsd-widget.menu { - display: inline-block; + display: none; } - - .container-main { - display: flex; + input[type="checkbox"] + .tsd-widget:before { + background-position: -120px 0; + } + input[type="checkbox"]:checked + .tsd-widget:before { + background-position: -160px 0; } - html .col-content { - float: none; + + img { max-width: 100%; - width: 100%; } - html .col-sidebar { - position: fixed !important; - overflow-y: auto; - -webkit-overflow-scrolling: touch; - z-index: 1024; - top: 0 !important; - bottom: 0 !important; - left: auto !important; - right: 0 !important; - padding: 1.5rem 1.5rem 0 0; - width: 75vw; - visibility: hidden; - background-color: var(--color-background); - transform: translate(100%, 0); + + .tsd-member-summary-name { + display: inline-flex; + align-items: center; + padding: 0.25rem; + text-decoration: none; } - html .col-sidebar > *:last-child { - padding-bottom: 20px; + + .tsd-anchor-icon { + display: inline-flex; + align-items: center; + margin-left: 0.5rem; + color: var(--color-text); } - html .overlay { - content: ""; - display: block; - position: fixed; - z-index: 1023; - top: 0; - left: 0; - right: 0; - bottom: 0; - background-color: rgba(0, 0, 0, 0.75); + + .tsd-anchor-icon svg { + width: 1em; + height: 1em; visibility: hidden; } - .to-has-menu .overlay { - animation: fade-in 0.4s; + .tsd-member-summary-name:hover > .tsd-anchor-icon svg, + .tsd-anchor-link:hover > .tsd-anchor-icon svg { + visibility: visible; } - .to-has-menu .col-sidebar { - animation: pop-in-from-right 0.4s; + .deprecated { + text-decoration: line-through !important; } - .from-has-menu .overlay { - animation: fade-out 0.4s; + .warning { + padding: 1rem; + color: var(--color-warning-text); + background: var(--color-background-warning); } - .from-has-menu .col-sidebar { - animation: pop-out-to-right 0.4s; + .tsd-kind-project { + color: var(--color-ts-project); } - - .has-menu body { - overflow: hidden; + .tsd-kind-module { + color: var(--color-ts-module); } - .has-menu .overlay { - visibility: visible; + .tsd-kind-namespace { + color: var(--color-ts-namespace); } - .has-menu .col-sidebar { - visibility: visible; - transform: translate(0, 0); - display: flex; - flex-direction: column; - gap: 1.5rem; - max-height: 100vh; - padding: 1rem 2rem; + .tsd-kind-enum { + color: var(--color-ts-enum); } - .has-menu .tsd-navigation { - max-height: 100%; + .tsd-kind-enum-member { + color: var(--color-ts-enum-member); } - #tsd-toolbar-links { - display: none; + .tsd-kind-variable { + color: var(--color-ts-variable); } - .tsd-navigation .tsd-nav-link { - display: flex; + .tsd-kind-function { + color: var(--color-ts-function); } -} - -/* one sidebar */ -@media (min-width: 770px) { - .container-main { - display: grid; - grid-template-columns: minmax(0, 1fr) minmax(0, 2fr); - grid-template-areas: "sidebar content"; - margin: 2rem auto; + .tsd-kind-class { + color: var(--color-ts-class); } - - .col-sidebar { - grid-area: sidebar; + .tsd-kind-interface { + color: var(--color-ts-interface); } - .col-content { - grid-area: content; - padding: 0 1rem; + .tsd-kind-constructor { + color: var(--color-ts-constructor); } -} -@media (min-width: 770px) and (max-width: 1399px) { - .col-sidebar { - max-height: calc(100vh - 2rem - 42px); - overflow: auto; - position: sticky; - top: 42px; - padding-top: 1rem; + .tsd-kind-property { + color: var(--color-ts-property); } - .site-menu { - margin-top: 1rem; + .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); + } + .tsd-kind-index-signature { + color: var(--color-ts-index-signature); + } + .tsd-kind-constructor-signature { + color: var(--color-ts-constructor-signature); + } + .tsd-kind-parameter { + color: var(--color-ts-parameter); + } + .tsd-kind-type-parameter { + color: var(--color-ts-type-parameter); + } + .tsd-kind-accessor { + color: var(--color-ts-accessor); + } + .tsd-kind-get-signature { + color: var(--color-ts-get-signature); + } + .tsd-kind-set-signature { + color: var(--color-ts-set-signature); + } + .tsd-kind-type-alias { + color: var(--color-ts-type-alias); } -} -/* two sidebars */ -@media (min-width: 1200px) { - .container-main { - grid-template-columns: minmax(0, 1fr) minmax(0, 2.5fr) minmax(0, 20rem); - grid-template-areas: "sidebar content toc"; + /* if we have a kind icon, don't color the text by kind */ + .tsd-kind-icon ~ span { + color: var(--color-text); } - .col-sidebar { - display: contents; + * { + scrollbar-width: thin; + scrollbar-color: var(--color-accent) var(--color-icon-background); } - .page-menu { - grid-area: toc; - padding-left: 1rem; + *::-webkit-scrollbar { + width: 0.75rem; } - .site-menu { - grid-area: sidebar; + + *::-webkit-scrollbar-track { + background: var(--color-icon-background); } - .site-menu { - margin-top: 1rem; + *::-webkit-scrollbar-thumb { + background-color: var(--color-accent); + border-radius: 999rem; + border: 0.25rem solid var(--color-icon-background); } - .page-menu, - .site-menu { - max-height: calc(100vh - 2rem - 42px); - overflow: auto; - position: sticky; - top: 42px; + /* mobile */ + @media (max-width: 769px) { + .tsd-widget.options, + .tsd-widget.menu { + display: inline-block; + } + + .container-main { + display: flex; + } + html .col-content { + float: none; + max-width: 100%; + width: 100%; + } + html .col-sidebar { + position: fixed !important; + overflow-y: auto; + -webkit-overflow-scrolling: touch; + z-index: 1024; + top: 0 !important; + bottom: 0 !important; + left: auto !important; + right: 0 !important; + padding: 1.5rem 1.5rem 0 0; + width: 75vw; + visibility: hidden; + background-color: var(--color-background); + transform: translate(100%, 0); + } + html .col-sidebar > *:last-child { + padding-bottom: 20px; + } + html .overlay { + content: ""; + display: block; + position: fixed; + z-index: 1023; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.75); + visibility: hidden; + } + + .to-has-menu .overlay { + animation: fade-in 0.4s; + } + + .to-has-menu .col-sidebar { + animation: pop-in-from-right 0.4s; + } + + .from-has-menu .overlay { + animation: fade-out 0.4s; + } + + .from-has-menu .col-sidebar { + animation: pop-out-to-right 0.4s; + } + + .has-menu body { + overflow: hidden; + } + .has-menu .overlay { + visibility: visible; + } + .has-menu .col-sidebar { + visibility: visible; + transform: translate(0, 0); + display: flex; + flex-direction: column; + gap: 1.5rem; + max-height: 100vh; + padding: 1rem 2rem; + } + .has-menu .tsd-navigation { + max-height: 100%; + } + #tsd-toolbar-links { + display: none; + } + .tsd-navigation .tsd-nav-link { + display: flex; + } + } + + /* one sidebar */ + @media (min-width: 770px) { + .container-main { + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(0, 2fr); + grid-template-areas: "sidebar content"; + margin: 2rem auto; + } + + .col-sidebar { + grid-area: sidebar; + } + .col-content { + grid-area: content; + padding: 0 1rem; + } + } + @media (min-width: 770px) and (max-width: 1399px) { + .col-sidebar { + max-height: calc(100vh - 2rem - 42px); + overflow: auto; + position: sticky; + top: 42px; + padding-top: 1rem; + } + .site-menu { + margin-top: 1rem; + } + } + + /* two sidebars */ + @media (min-width: 1200px) { + .container-main { + grid-template-columns: minmax(0, 1fr) minmax(0, 2.5fr) minmax( + 0, + 20rem + ); + grid-template-areas: "sidebar content toc"; + } + + .col-sidebar { + display: contents; + } + + .page-menu { + grid-area: toc; + padding-left: 1rem; + } + .site-menu { + grid-area: sidebar; + } + + .site-menu { + margin-top: 1rem; + } + + .page-menu, + .site-menu { + max-height: calc(100vh - 2rem - 42px); + overflow: auto; + position: sticky; + top: 42px; + } } } diff --git a/docs/v2.1.0/classes/p2p-media-loader-core.Core.html b/docs/v2.1.0/classes/p2p-media-loader-core.Core.html new file mode 100644 index 00000000..c64ca68a --- /dev/null +++ b/docs/v2.1.0/classes/p2p-media-loader-core.Core.html @@ -0,0 +1,253 @@ +Core | P2P Media Loader Documentation

Core class for managing media streams loading via P2P.

+

Type Parameters

Constructors

  • Constructs a new Core instance with optional initial configuration.

    +

    Type Parameters

    Parameters

    • Optionalconfig: Partial<CoreConfig>

      Optional partial configuration to override default settings.

      +

    Returns Core<TStream>

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

Properties

DEFAULT_COMMON_CORE_CONFIG: CommonCoreConfig = ...

Default configuration for common core settings.

+
DEFAULT_STREAM_CONFIG: StreamConfig = ...

Default configuration for stream settings.

+

Methods

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

    +

    Parameters

    Returns void

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

    +

    Type Parameters

    Parameters

    • eventName: K

      The name of the event to listen for.

      +
    • listener: CoreEventMap[K]

      The callback function to invoke when the event is fired.

      +

    Returns void

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

    +

    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.

    +

    Parameters

    • url: string

      The full URL to the manifest response.

      +

    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.

    +

    Parameters

    • stream: TStream

      The stream to potentially add to the map.

      +

    Returns void

  • Updates the segments associated with a specific stream.

    +

    Parameters

    • streamRuntimeId: string

      The runtime identifier of the stream to update.

      +
    • OptionaladdSegments: Iterable<Segment>

      Optional segments to add to the stream.

      +
    • OptionalremoveSegmentIds: Iterable<string>

      Optional segment IDs to remove from the stream.

      +

    Returns void

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

    +

    Parameters

    • segmentRuntimeId: string

      The runtime identifier of the segment to load.

      +
    • callbacks: EngineCallbacks

      The callbacks to be invoked during segment loading.

      +

    Returns Promise<void>

      +
    • Throws if the manifest response URL is not defined.
    • +
    +
  • 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.

    +

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

    +

    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.

    +

    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 +and clearing stored segments.

    +

    Returns void

diff --git a/docs/v2.1.0/classes/p2p-media-loader-core.CoreRequestError.html b/docs/v2.1.0/classes/p2p-media-loader-core.CoreRequestError.html new file mode 100644 index 00000000..d7f521ee --- /dev/null +++ b/docs/v2.1.0/classes/p2p-media-loader-core.CoreRequestError.html @@ -0,0 +1,180 @@ +CoreRequestError | P2P Media Loader Documentation

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

+
diff --git a/docs/v2.1.0/classes/p2p-media-loader-core.RequestError.html b/docs/v2.1.0/classes/p2p-media-loader-core.RequestError.html new file mode 100644 index 00000000..19f32a2f --- /dev/null +++ b/docs/v2.1.0/classes/p2p-media-loader-core.RequestError.html @@ -0,0 +1,184 @@ +RequestError | P2P Media Loader Documentation

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

+

Type Parameters

Hierarchy

  • Error
    • RequestError

Constructors

Properties

Constructors

Properties

timestamp: number

Error timestamp.

+
type: T

The specific error type.

+
diff --git a/docs/v2.1.0/classes/p2p-media-loader-hlsjs.HlsJsP2PEngine.html b/docs/v2.1.0/classes/p2p-media-loader-hlsjs.HlsJsP2PEngine.html new file mode 100644 index 00000000..5bceef9b --- /dev/null +++ b/docs/v2.1.0/classes/p2p-media-loader-hlsjs.HlsJsP2PEngine.html @@ -0,0 +1,228 @@ +HlsJsP2PEngine | P2P Media Loader Documentation

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

Constructors

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
    },
    },
    }); +
    + +
  • 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);
    }); +
    + +
    // 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'}`);
    }); +
    + +
  • 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.

    +

    Returns { fLoader: unknown; pLoader: unknown }

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

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

diff --git a/docs/v2.1.0/classes/p2p-media-loader-shaka.ShakaP2PEngine.html b/docs/v2.1.0/classes/p2p-media-loader-shaka.ShakaP2PEngine.html new file mode 100644 index 00000000..43dabdda --- /dev/null +++ b/docs/v2.1.0/classes/p2p-media-loader-shaka.ShakaP2PEngine.html @@ -0,0 +1,225 @@ +ShakaP2PEngine | P2P Media Loader Documentation

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

Constructors

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.

    +

    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); +
    + +
  • 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);
    }); +
    + +
    // 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'}`);
    }); +
    + +
  • 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. +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.

    +

    Parameters

    • shaka: typeof shaka = window.shaka

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

      +

    Returns void

diff --git a/docs/v2.1.0/index.html b/docs/v2.1.0/index.html index 9bced54d..cd3da839 100644 --- a/docs/v2.1.0/index.html +++ b/docs/v2.1.0/index.html @@ -1,4 +1,4 @@ -P2P Media Loader Documentation

P2P Media Loader Documentation

    -
  • GitHub
  • +

    P2P Media Loader Documentation

    -

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

    +

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

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

    -

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

    +

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

    1. Install the package via npm:

      @@ -189,7 +189,7 @@
    2. Provide Node.js polyfills

      -

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

      +

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

      • Vite configuration example:

        @@ -223,46 +223,46 @@
    -

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

    -

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

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

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

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

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

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

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

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

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

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

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

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

    +

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

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

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

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

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

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

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

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

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

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

    <body>
    <div style="width: 800px">
    <!-- Vidstack media player with HLS stream -->
    <media-player src="streamUrl">
    <media-provider></media-provider>
    <media-video-layout></media-video-layout>
    </media-player>
    </div>
    </body>
    </html>
    -
    <script type="module">
    import { HlsJsP2PEngine } from "p2p-media-loader-hlsjs";

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

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

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

    hls.attachMedia(videoElement);
    hls.loadSource(streamUrl);
    </script> +
    <script type="module">
    import { HlsJsP2PEngine } from "p2p-media-loader-hlsjs";

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

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

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

    hls.attachMedia(videoElement);
    hls.loadSource(streamUrl);
    </script>
    -
    <script type="module">
    import { HlsJsP2PEngine } from "p2p-media-loader-hlsjs";

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

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

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

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

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

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

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

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

    player.play();
    </script> +
    <script type="module">
    import { HlsJsP2PEngine } from "p2p-media-loader-hlsjs";

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

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

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

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

    player.play();
    </script>
    -
    <script type="module">
    import { HlsJsP2PEngine } from "p2p-media-loader-hlsjs";

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

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

    engine.bindHls(() => clapprPlayer.core.getCurrentPlayback()?._hls);
    </script> +
    <script type="module">
    import { HlsJsP2PEngine } from "p2p-media-loader-hlsjs";

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

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

    engine.bindHls(() => clapprPlayer.core.getCurrentPlayback()?._hls);
    </script>
    -
    <script type="module">
    import { HlsJsP2PEngine } from "p2p-media-loader-hlsjs";

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

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

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

    player.setSrc(streamUrl);
    player.load();
    </script> +
    <script type="module">
    import { HlsJsP2PEngine } from "p2p-media-loader-hlsjs";

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

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

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

    player.setSrc(streamUrl);
    player.load();
    </script>
    -
    <script type="module">
    import { HlsJsP2PEngine } from "p2p-media-loader-hlsjs";

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

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

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

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

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

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

    hls.attachMedia(videoElement);
    hls.loadSource(streamUrl);
    </script> +
    <script type="module">
    import { HlsJsP2PEngine } from "p2p-media-loader-hlsjs";

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

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

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

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

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

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

    hls.attachMedia(videoElement);
    hls.loadSource(streamUrl);
    </script>
    -
    <script type="module">
    import { HlsJsP2PEngine } from "p2p-media-loader-hlsjs";

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

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

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

    player.init();
    </script> +
    <script type="module">
    import { HlsJsP2PEngine } from "p2p-media-loader-hlsjs";

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

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

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

    player.init();
    </script>
    -

    Shaka player is used for an extended example:

    +

    Shaka player is used for an extended example:

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

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

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

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

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

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

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

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

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

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

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

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

    <body>
    <div data-shaka-player-container style="max-width:40em">
    <!-- Video element with Shaka Player UI -->
    <video
    autoplay
    data-shaka-player
    id="video"
    style="width:100%;height:100%"
    ></video>
    </div>
    </body>
    </html>
    -
    <script type="module">
    import { ShakaP2PEngine } from "p2p-media-loader-shaka";

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

    ShakaP2PEngine.registerPlugins();

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

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

    shakaP2PEngine.bindShakaPlayer(shakaPlayerInstance);
    },
    });
    </script> +
    <script type="module">
    import { ShakaP2PEngine } from "p2p-media-loader-shaka";

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

    ShakaP2PEngine.registerPlugins();

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

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

    shakaP2PEngine.bindShakaPlayer(shakaPlayerInstance);
    },
    });
    </script>
    -
    <script type="module">
    import { ShakaP2PEngine } from "p2p-media-loader-shaka";

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

    ShakaP2PEngine.registerPlugins();

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

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

    shakaP2PEngine.bindShakaPlayer(shakaPlayer);
    void shakaPlayer.load(streamUrl);
    },
    },
    },
    });
    </script> +
    <script type="module">
    import { ShakaP2PEngine } from "p2p-media-loader-shaka";

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

    ShakaP2PEngine.registerPlugins();

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

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

    shakaP2PEngine.bindShakaPlayer(shakaPlayer);
    void shakaPlayer.load(streamUrl);
    },
    },
    },
    });
    </script>
    -
    <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> +
    <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

    • Provides playback position from player

      +

      Parameters

      • position: number

        Playback position

        +
      • rate: number

        Playback rate

        +

      Returns void

    • Provides segment request information from player

      +

      Parameters

      • swarmId: string

        Swarm identifier

        +
      • streamId: string

        Stream identifier

        +
      • segmentId: number

        Segment identifier

        +
      • startTime: number

        Segment start time

        +
      • endTime: number

        Segment end time

        +
      • streamType: StreamType

        Stream type

        +
      • isLiveStream: boolean

        Is live stream

        +

      Returns void

    • Stores segment data

      +

      Parameters

      • swarmId: string

        Swarm identifier

        +
      • streamId: string

        Stream identifier

        +
      • segmentId: number

        Segment identifier

        +
      • data: ArrayBuffer

        Segment data

        +
      • startTime: number

        Segment start time

        +
      • endTime: number

        Segment end time

        +
      • streamType: StreamType

        Stream type

        +
      • isLiveStream: boolean

        Is live stream

        +

      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 }

    • 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

      +

      Parameters

      • swarmId: string

        Swarm identifier

        +
      • streamId: string

        Stream identifier

        +

      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

        +

      Returns void

    diff --git a/docs/v2.1.0/modules.html b/docs/v2.1.0/modules.html index 1d0e482e..f38a0fa7 100644 --- a/docs/v2.1.0/modules.html +++ b/docs/v2.1.0/modules.html @@ -1,4 +1,4 @@ -P2P Media Loader Documentation

    P2P Media Loader Documentation

    Index

    diff --git a/docs/v2.1.0/modules/p2p-media-loader-hlsjs.html b/docs/v2.1.0/modules/p2p-media-loader-hlsjs.html new file mode 100644 index 00000000..291c19bf --- /dev/null +++ b/docs/v2.1.0/modules/p2p-media-loader-hlsjs.html @@ -0,0 +1,174 @@ +p2p-media-loader-hlsjs | P2P Media Loader Documentation
    diff --git a/docs/v2.1.0/modules/p2p-media-loader-shaka.html b/docs/v2.1.0/modules/p2p-media-loader-shaka.html new file mode 100644 index 00000000..ffb5ea04 --- /dev/null +++ b/docs/v2.1.0/modules/p2p-media-loader-shaka.html @@ -0,0 +1,174 @@ +p2p-media-loader-shaka | P2P Media Loader Documentation
    diff --git a/docs/v2.1.0/types/p2p-media-loader-core.ByteRange.html b/docs/v2.1.0/types/p2p-media-loader-core.ByteRange.html new file mode 100644 index 00000000..654aea58 --- /dev/null +++ b/docs/v2.1.0/types/p2p-media-loader-core.ByteRange.html @@ -0,0 +1,177 @@ +ByteRange | P2P Media Loader Documentation
    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.

      +
    diff --git a/docs/v2.1.0/types/p2p-media-loader-core.CommonCoreConfig.html b/docs/v2.1.0/types/p2p-media-loader-core.CommonCoreConfig.html new file mode 100644 index 00000000..f71f80b4 --- /dev/null +++ b/docs/v2.1.0/types/p2p-media-loader-core.CommonCoreConfig.html @@ -0,0 +1,194 @@ +CommonCoreConfig | P2P Media Loader Documentation
    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
      +
      + +
        +
      • When undefined, the default limit is determined based on the device type and browser: +
          +
        • Desktop: 4096 MiB
        • +
        • Android: 2048 MiB
        • +
        • iOS: 1024 MiB
        • +
        • Android WebView: 1024 MiB
        • +
        • iOS WebView: 1024 MiB
        • +
        +
      • +
      +
    • OptionalcustomSegmentStorageFactory?: (isLive: boolean) => SegmentStorage

      Optional custom storage factory for the segments storage.

      +
      customSegmentStorageFactory: undefined
      +
      + +
    diff --git a/docs/v2.1.0/types/p2p-media-loader-core.CoreConfig.html b/docs/v2.1.0/types/p2p-media-loader-core.CoreConfig.html new file mode 100644 index 00000000..270fc65e --- /dev/null +++ b/docs/v2.1.0/types/p2p-media-loader-core.CoreConfig.html @@ -0,0 +1,184 @@ +CoreConfig | P2P Media Loader Documentation
    CoreConfig: Partial<StreamConfig> & Partial<CommonCoreConfig> & {
        mainStream?: Partial<StreamConfig>;
        secondaryStream?: Partial<StreamConfig>;
    }

    Represents a set of configuration parameters that can be used to override or extend the +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",
    } +
    + +
    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",
    }, +
    + +
    diff --git a/docs/v2.1.0/types/p2p-media-loader-core.CoreEventMap.html b/docs/v2.1.0/types/p2p-media-loader-core.CoreEventMap.html new file mode 100644 index 00000000..453ae431 --- /dev/null +++ b/docs/v2.1.0/types/p2p-media-loader-core.CoreEventMap.html @@ -0,0 +1,187 @@ +CoreEventMap | P2P Media Loader Documentation
    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.

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

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

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

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

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

      Fired at the beginning of a segment download process.

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

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

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

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

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

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

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

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

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

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

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

      Called when an error occurs during the tracker request process.

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

      Called when a warning occurs during the tracker request process.

      +
    diff --git a/docs/v2.1.0/types/p2p-media-loader-core.DefinedCoreConfig.html b/docs/v2.1.0/types/p2p-media-loader-core.DefinedCoreConfig.html new file mode 100644 index 00000000..29c2d15e --- /dev/null +++ b/docs/v2.1.0/types/p2p-media-loader-core.DefinedCoreConfig.html @@ -0,0 +1,177 @@ +DefinedCoreConfig | P2P Media Loader Documentation
    DefinedCoreConfig: CommonCoreConfig & {
        mainStream: StreamConfig;
        secondaryStream: StreamConfig;
    }

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

    +

    Type declaration

    • mainStream: StreamConfig

      Configuration for the main stream.

      +
    • secondaryStream: StreamConfig

      Configuration for the secondary stream.

      +
    diff --git a/docs/v2.1.0/types/p2p-media-loader-core.DownloadSource.html b/docs/v2.1.0/types/p2p-media-loader-core.DownloadSource.html new file mode 100644 index 00000000..a61d3c0e --- /dev/null +++ b/docs/v2.1.0/types/p2p-media-loader-core.DownloadSource.html @@ -0,0 +1,177 @@ +DownloadSource | P2P Media Loader Documentation
    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.

    +
    diff --git a/docs/v2.1.0/types/p2p-media-loader-core.DynamicCoreConfig.html b/docs/v2.1.0/types/p2p-media-loader-core.DynamicCoreConfig.html new file mode 100644 index 00000000..91196b57 --- /dev/null +++ b/docs/v2.1.0/types/p2p-media-loader-core.DynamicCoreConfig.html @@ -0,0 +1,180 @@ +DynamicCoreConfig | P2P Media Loader Documentation
    DynamicCoreConfig: Partial<Pick<CoreConfig, DynamicStreamProperties>> & Partial<
        CommonCoreConfig,
    > & {
        mainStream?: DynamicStreamConfig;
        secondaryStream?: DynamicStreamConfig;
    }

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

    +

    Type declaration

    • OptionalmainStream?: DynamicStreamConfig

      Optional dynamic configuration for the main stream.

      +
    • OptionalsecondaryStream?: DynamicStreamConfig

      Optional dynamic configuration for the secondary stream.

      +
    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,
    }
    }; +
    + +
    diff --git a/docs/v2.1.0/types/p2p-media-loader-core.DynamicStreamConfig.html b/docs/v2.1.0/types/p2p-media-loader-core.DynamicStreamConfig.html new file mode 100644 index 00000000..70d35db9 --- /dev/null +++ b/docs/v2.1.0/types/p2p-media-loader-core.DynamicStreamConfig.html @@ -0,0 +1,175 @@ +DynamicStreamConfig | P2P Media Loader Documentation
    DynamicStreamConfig: Partial<Pick<StreamConfig, DynamicStreamProperties>>

    Represents a partial configuration for a stream with dynamic properties.

    +
    diff --git a/docs/v2.1.0/types/p2p-media-loader-core.DynamicStreamProperties.html b/docs/v2.1.0/types/p2p-media-loader-core.DynamicStreamProperties.html new file mode 100644 index 00000000..74967338 --- /dev/null +++ b/docs/v2.1.0/types/p2p-media-loader-core.DynamicStreamProperties.html @@ -0,0 +1,175 @@ +DynamicStreamProperties | P2P Media Loader Documentation
    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.

    +
    diff --git a/docs/v2.1.0/types/p2p-media-loader-core.EngineCallbacks.html b/docs/v2.1.0/types/p2p-media-loader-core.EngineCallbacks.html new file mode 100644 index 00000000..57c34390 --- /dev/null +++ b/docs/v2.1.0/types/p2p-media-loader-core.EngineCallbacks.html @@ -0,0 +1,177 @@ +EngineCallbacks | P2P Media Loader Documentation
    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.

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

      Called when the operation encounters an error.

      +
    diff --git a/docs/v2.1.0/types/p2p-media-loader-core.HttpRequestErrorType.html b/docs/v2.1.0/types/p2p-media-loader-core.HttpRequestErrorType.html new file mode 100644 index 00000000..45e75cbc --- /dev/null +++ b/docs/v2.1.0/types/p2p-media-loader-core.HttpRequestErrorType.html @@ -0,0 +1,175 @@ +HttpRequestErrorType | P2P Media Loader Documentation
    HttpRequestErrorType:
        | "http-error"
        | "http-bytes-mismatch"
        | "http-unexpected-status-code"

    Defines the types of errors specific to HTTP requests.

    +
    diff --git a/docs/v2.1.0/types/p2p-media-loader-core.PeerDetails.html b/docs/v2.1.0/types/p2p-media-loader-core.PeerDetails.html new file mode 100644 index 00000000..9a955659 --- /dev/null +++ b/docs/v2.1.0/types/p2p-media-loader-core.PeerDetails.html @@ -0,0 +1,177 @@ +PeerDetails | P2P Media Loader Documentation
    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.

      +
    diff --git a/docs/v2.1.0/types/p2p-media-loader-core.PeerErrorDetails.html b/docs/v2.1.0/types/p2p-media-loader-core.PeerErrorDetails.html new file mode 100644 index 00000000..8cb36d7d --- /dev/null +++ b/docs/v2.1.0/types/p2p-media-loader-core.PeerErrorDetails.html @@ -0,0 +1,178 @@ +PeerErrorDetails | P2P Media Loader Documentation
    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.

      +
    diff --git a/docs/v2.1.0/types/p2p-media-loader-core.PeerRequestErrorType.html b/docs/v2.1.0/types/p2p-media-loader-core.PeerRequestErrorType.html new file mode 100644 index 00000000..838d5006 --- /dev/null +++ b/docs/v2.1.0/types/p2p-media-loader-core.PeerRequestErrorType.html @@ -0,0 +1,175 @@ +PeerRequestErrorType | P2P Media Loader Documentation
    PeerRequestErrorType:
        | "peer-response-bytes-length-mismatch"
        | "peer-protocol-violation"
        | "peer-segment-absent"
        | "peer-closed"
        | "p2p-segment-validation-failed"

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

    +
    diff --git a/docs/v2.1.0/types/p2p-media-loader-core.RequestAbortErrorType.html b/docs/v2.1.0/types/p2p-media-loader-core.RequestAbortErrorType.html new file mode 100644 index 00000000..5eb01e98 --- /dev/null +++ b/docs/v2.1.0/types/p2p-media-loader-core.RequestAbortErrorType.html @@ -0,0 +1,175 @@ +RequestAbortErrorType | P2P Media Loader Documentation
    RequestAbortErrorType: "abort" | "bytes-receiving-timeout"

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

    +
    diff --git a/docs/v2.1.0/types/p2p-media-loader-core.RequestErrorType.html b/docs/v2.1.0/types/p2p-media-loader-core.RequestErrorType.html new file mode 100644 index 00000000..a94bb00e --- /dev/null +++ b/docs/v2.1.0/types/p2p-media-loader-core.RequestErrorType.html @@ -0,0 +1,175 @@ +RequestErrorType | P2P Media Loader Documentation
    RequestErrorType:
        | RequestAbortErrorType
        | PeerRequestErrorType
        | HttpRequestErrorType

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

    +
    diff --git a/docs/v2.1.0/types/p2p-media-loader-core.Segment.html b/docs/v2.1.0/types/p2p-media-loader-core.Segment.html new file mode 100644 index 00000000..1840d281 --- /dev/null +++ b/docs/v2.1.0/types/p2p-media-loader-core.Segment.html @@ -0,0 +1,181 @@ +Segment | P2P Media Loader Documentation
    Segment: {
        runtimeId: string;
        externalId: number;
        url: string;
        byteRange?: ByteRange;
        startTime: number;
        endTime: number;
    }

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

    +

    Type declaration

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

      +
    diff --git a/docs/v2.1.0/types/p2p-media-loader-core.SegmentAbortDetails.html b/docs/v2.1.0/types/p2p-media-loader-core.SegmentAbortDetails.html new file mode 100644 index 00000000..8e7ccf8e --- /dev/null +++ b/docs/v2.1.0/types/p2p-media-loader-core.SegmentAbortDetails.html @@ -0,0 +1,179 @@ +SegmentAbortDetails | P2P Media Loader Documentation
    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.

      +
    diff --git a/docs/v2.1.0/types/p2p-media-loader-core.SegmentErrorDetails.html b/docs/v2.1.0/types/p2p-media-loader-core.SegmentErrorDetails.html new file mode 100644 index 00000000..46c8d2ff --- /dev/null +++ b/docs/v2.1.0/types/p2p-media-loader-core.SegmentErrorDetails.html @@ -0,0 +1,180 @@ +SegmentErrorDetails | P2P Media Loader Documentation
    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.

      +
    diff --git a/docs/v2.1.0/types/p2p-media-loader-core.SegmentLoadDetails.html b/docs/v2.1.0/types/p2p-media-loader-core.SegmentLoadDetails.html new file mode 100644 index 00000000..657ec8aa --- /dev/null +++ b/docs/v2.1.0/types/p2p-media-loader-core.SegmentLoadDetails.html @@ -0,0 +1,180 @@ +SegmentLoadDetails | P2P Media Loader Documentation
    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.

      +
    diff --git a/docs/v2.1.0/types/p2p-media-loader-core.SegmentResponse.html b/docs/v2.1.0/types/p2p-media-loader-core.SegmentResponse.html new file mode 100644 index 00000000..dc890dab --- /dev/null +++ b/docs/v2.1.0/types/p2p-media-loader-core.SegmentResponse.html @@ -0,0 +1,177 @@ +SegmentResponse | P2P Media Loader Documentation
    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.

      +
    diff --git a/docs/v2.1.0/types/p2p-media-loader-core.SegmentStartDetails.html b/docs/v2.1.0/types/p2p-media-loader-core.SegmentStartDetails.html new file mode 100644 index 00000000..d002b480 --- /dev/null +++ b/docs/v2.1.0/types/p2p-media-loader-core.SegmentStartDetails.html @@ -0,0 +1,178 @@ +SegmentStartDetails | P2P Media Loader Documentation
    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.

      +
    diff --git a/docs/v2.1.0/types/p2p-media-loader-core.SegmentWithStream.html b/docs/v2.1.0/types/p2p-media-loader-core.SegmentWithStream.html new file mode 100644 index 00000000..9718f11e --- /dev/null +++ b/docs/v2.1.0/types/p2p-media-loader-core.SegmentWithStream.html @@ -0,0 +1,175 @@ +SegmentWithStream | P2P Media Loader Documentation
    SegmentWithStream: Segment & { stream: StreamWithSegments<TStream> }

    Extends a Segment with a reference to its associated stream.

    +

    Type Parameters

    diff --git a/docs/v2.1.0/types/p2p-media-loader-core.Stream.html b/docs/v2.1.0/types/p2p-media-loader-core.Stream.html new file mode 100644 index 00000000..41902d19 --- /dev/null +++ b/docs/v2.1.0/types/p2p-media-loader-core.Stream.html @@ -0,0 +1,178 @@ +Stream | P2P Media Loader Documentation
    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.

      +
    diff --git a/docs/v2.1.0/types/p2p-media-loader-core.StreamConfig.html b/docs/v2.1.0/types/p2p-media-loader-core.StreamConfig.html new file mode 100644 index 00000000..f5778891 --- /dev/null +++ b/docs/v2.1.0/types/p2p-media-loader-core.StreamConfig.html @@ -0,0 +1,266 @@ +StreamConfig | P2P Media Loader Documentation
    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

      Controls if peer-to-peer upload is disabled for the stream. +If true, the stream only downloads segments without uploading to peers.

      +
      isP2PUploadDisabled: false
      +
      + +
    • isP2PDisabled: boolean

      Controls whether peer-to-peer functionality is disabled for the stream.

      +
      isP2PDisabled: false
      +
      + +
    • highDemandTimeWindow: number

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

      +
      highDemandTimeWindow: 15
      +
      + +
    • httpDownloadTimeWindow: number

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

      +

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

      +

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

      +
      httpDownloadTimeWindow: 3000
      +
      + +
    • p2pDownloadTimeWindow: number

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

      +

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

      +
      p2pDownloadTimeWindow: 6000
      +
      + +
    • simultaneousHttpDownloads: number

      Maximum number of simultaneous HTTP downloads allowed.

      +
      simultaneousHttpDownloads: 2
      +
      + +
    • 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
      +
      + +
    • 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
      +
      + +
    • 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
      +
      + +
    • 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).

      +

      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:

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

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

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

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

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

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

      +
      swarmId: 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
      +
      + +
    • 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
      +
      + +
    diff --git a/docs/v2.1.0/types/p2p-media-loader-core.StreamType.html b/docs/v2.1.0/types/p2p-media-loader-core.StreamType.html new file mode 100644 index 00000000..c96c9795 --- /dev/null +++ b/docs/v2.1.0/types/p2p-media-loader-core.StreamType.html @@ -0,0 +1,175 @@ +StreamType | P2P Media Loader Documentation
    StreamType: "main" | "secondary"

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

    +
    diff --git a/docs/v2.1.0/types/p2p-media-loader-core.StreamWithSegments.html b/docs/v2.1.0/types/p2p-media-loader-core.StreamWithSegments.html new file mode 100644 index 00000000..ee6cb955 --- /dev/null +++ b/docs/v2.1.0/types/p2p-media-loader-core.StreamWithSegments.html @@ -0,0 +1,176 @@ +StreamWithSegments | P2P Media Loader Documentation
    StreamWithSegments: 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.

      +
    diff --git a/docs/v2.1.0/types/p2p-media-loader-core.TrackerErrorDetails.html b/docs/v2.1.0/types/p2p-media-loader-core.TrackerErrorDetails.html new file mode 100644 index 00000000..c436ead2 --- /dev/null +++ b/docs/v2.1.0/types/p2p-media-loader-core.TrackerErrorDetails.html @@ -0,0 +1,177 @@ +TrackerErrorDetails | P2P Media Loader Documentation
    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.

      +
    diff --git a/docs/v2.1.0/types/p2p-media-loader-core.TrackerWarningDetails.html b/docs/v2.1.0/types/p2p-media-loader-core.TrackerWarningDetails.html new file mode 100644 index 00000000..8b9a6be7 --- /dev/null +++ b/docs/v2.1.0/types/p2p-media-loader-core.TrackerWarningDetails.html @@ -0,0 +1,176 @@ +TrackerWarningDetails | P2P Media Loader Documentation
    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.

      +
    diff --git a/docs/v2.1.0/types/p2p-media-loader-hlsjs.DynamicHlsJsP2PEngineConfig.html b/docs/v2.1.0/types/p2p-media-loader-hlsjs.DynamicHlsJsP2PEngineConfig.html new file mode 100644 index 00000000..7a6f984a --- /dev/null +++ b/docs/v2.1.0/types/p2p-media-loader-hlsjs.DynamicHlsJsP2PEngineConfig.html @@ -0,0 +1,176 @@ +DynamicHlsJsP2PEngineConfig | P2P Media Loader Documentation
    DynamicHlsJsP2PEngineConfig: { core?: DynamicCoreConfig }

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

    +

    Type declaration

    diff --git a/docs/v2.1.0/types/p2p-media-loader-hlsjs.HlsJsP2PEngineConfig.html b/docs/v2.1.0/types/p2p-media-loader-hlsjs.HlsJsP2PEngineConfig.html new file mode 100644 index 00000000..97297700 --- /dev/null +++ b/docs/v2.1.0/types/p2p-media-loader-hlsjs.HlsJsP2PEngineConfig.html @@ -0,0 +1,176 @@ +HlsJsP2PEngineConfig | P2P Media Loader Documentation
    HlsJsP2PEngineConfig: { core: DefinedCoreConfig }

    Represents the complete configuration for HlsJsP2PEngine.

    +

    Type declaration

    diff --git a/docs/v2.1.0/types/p2p-media-loader-hlsjs.HlsWithP2PConfig.html b/docs/v2.1.0/types/p2p-media-loader-hlsjs.HlsWithP2PConfig.html new file mode 100644 index 00000000..766f8fbc --- /dev/null +++ b/docs/v2.1.0/types/p2p-media-loader-hlsjs.HlsWithP2PConfig.html @@ -0,0 +1,176 @@ +HlsWithP2PConfig | P2P Media Loader Documentation
    HlsWithP2PConfig: 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.

      +
    diff --git a/docs/v2.1.0/types/p2p-media-loader-hlsjs.HlsWithP2PInstance.html b/docs/v2.1.0/types/p2p-media-loader-hlsjs.HlsWithP2PInstance.html new file mode 100644 index 00000000..8a26f3c2 --- /dev/null +++ b/docs/v2.1.0/types/p2p-media-loader-hlsjs.HlsWithP2PInstance.html @@ -0,0 +1,177 @@ +HlsWithP2PInstance | P2P Media Loader Documentation
    HlsWithP2PInstance: 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

    diff --git a/docs/v2.1.0/types/p2p-media-loader-hlsjs.PartialHlsJsP2PEngineConfig.html b/docs/v2.1.0/types/p2p-media-loader-hlsjs.PartialHlsJsP2PEngineConfig.html new file mode 100644 index 00000000..1459fe8d --- /dev/null +++ b/docs/v2.1.0/types/p2p-media-loader-hlsjs.PartialHlsJsP2PEngineConfig.html @@ -0,0 +1,176 @@ +PartialHlsJsP2PEngineConfig | P2P Media Loader Documentation
    PartialHlsJsP2PEngineConfig: Partial<Omit<HlsJsP2PEngineConfig, "core">> & {
        core?: Partial<CoreConfig>;
    }

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

    +

    Type declaration

    • Optionalcore?: Partial<CoreConfig>

      Partial core config

      +
    diff --git a/docs/v2.1.0/types/p2p-media-loader-shaka.DynamicShakaP2PEngineConfig.html b/docs/v2.1.0/types/p2p-media-loader-shaka.DynamicShakaP2PEngineConfig.html new file mode 100644 index 00000000..2df6295d --- /dev/null +++ b/docs/v2.1.0/types/p2p-media-loader-shaka.DynamicShakaP2PEngineConfig.html @@ -0,0 +1,176 @@ +DynamicShakaP2PEngineConfig | P2P Media Loader Documentation
    DynamicShakaP2PEngineConfig: { core?: DynamicCoreConfig }

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

    +

    Type declaration

    diff --git a/docs/v2.1.0/types/p2p-media-loader-shaka.PartialShakaEngineConfig.html b/docs/v2.1.0/types/p2p-media-loader-shaka.PartialShakaEngineConfig.html new file mode 100644 index 00000000..8cc48d60 --- /dev/null +++ b/docs/v2.1.0/types/p2p-media-loader-shaka.PartialShakaEngineConfig.html @@ -0,0 +1,176 @@ +PartialShakaEngineConfig | P2P Media Loader Documentation
    PartialShakaEngineConfig: Partial<Omit<ShakaP2PEngineConfig, "core">> & {
        core?: Partial<CoreConfig>;
    }

    Allows for partial configuration settings for the Shaka P2P Engine.

    +

    Type declaration

    • Optionalcore?: Partial<CoreConfig>

      Partial core config

      +
    diff --git a/docs/v2.1.0/types/p2p-media-loader-shaka.ShakaP2PEngineConfig.html b/docs/v2.1.0/types/p2p-media-loader-shaka.ShakaP2PEngineConfig.html new file mode 100644 index 00000000..febc6cd4 --- /dev/null +++ b/docs/v2.1.0/types/p2p-media-loader-shaka.ShakaP2PEngineConfig.html @@ -0,0 +1,176 @@ +ShakaP2PEngineConfig | P2P Media Loader Documentation
    ShakaP2PEngineConfig: { core: DefinedCoreConfig }

    Represents the complete configuration for ShakaP2PEngine.

    +

    Type declaration