Socket
Socket
Sign inDemoInstall

p2p-media-loader-shaka

Package Overview
Dependencies
51
Maintainers
2
Versions
8
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 0.6.1 to 0.6.2

144

build/p2p-media-loader-shaka.js

@@ -41,10 +41,2 @@ require=(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){

*/
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });

@@ -56,5 +48,2 @@ const events_1 = require("events");

class Engine extends events_1.EventEmitter {
static isSupported() {
return p2p_media_loader_core_1.HybridLoader.isSupported();
}
constructor(settings = {}) {

@@ -68,7 +57,8 @@ super();

}
destroy() {
return __awaiter(this, void 0, void 0, function* () {
yield this.segmentManager.destroy();
});
static isSupported() {
return p2p_media_loader_core_1.HybridLoader.isSupported();
}
async destroy() {
await this.segmentManager.destroy();
}
getSettings() {

@@ -108,10 +98,2 @@ return {

*/
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });

@@ -127,3 +109,3 @@ const Debug = require("debug");

let lastPlayheadTimeReported = 0;
player.addEventListener("loading", () => __awaiter(this, void 0, void 0, function* () {
player.addEventListener("loading", async () => {
if (intervalId > 0) {

@@ -138,3 +120,3 @@ clearInterval(intervalId);

}
yield segmentManager.destroy();
await segmentManager.destroy();
intervalId = setInterval(() => {

@@ -147,3 +129,3 @@ const time = getPlayheadTime(player);

}, 500);
}));
});
debug("register request filter");

@@ -196,11 +178,11 @@ player.getNetworkingEngine().registerRequestFilter((requestType, request) => {

const promise = segmentManager.load(segment, utils_1.getSchemedUri(player.getAssetUri ? player.getAssetUri() : player.getManifestUri()), getPlayheadTime(player));
const abort = () => __awaiter(this, void 0, void 0, function* () {
const abort = async () => {
debug("request", "abort", segment.identity);
// TODO: implement abort in SegmentManager
});
};
return new shaka.util.AbortableOperation(promise, abort);
}
else if (assetsStorage) { // load or store the asset using assets storage
const responsePromise = (() => __awaiter(this, void 0, void 0, function* () {
const asset = yield assetsStorage.getAsset(uri, request.headers.Range, masterSwarmId);
const responsePromise = (async () => {
const asset = await assetsStorage.getAsset(uri, request.headers.Range, masterSwarmId);
if (asset !== undefined) {

@@ -214,3 +196,3 @@ return {

else {
const response = yield shaka.net.HttpXHRPlugin(uri, request, requestType, progressUpdated).promise;
const response = await shaka.net.HttpXHRPlugin(uri, request, requestType, progressUpdated).promise;
assetsStorage.storeAsset({

@@ -226,4 +208,4 @@ masterManifestUri: masterManifestUri,

}
}))();
return new shaka.util.AbortableOperation(responsePromise, () => __awaiter(this, void 0, void 0, function* () { }));
})();
return new shaka.util.AbortableOperation(responsePromise, async () => { });
}

@@ -454,10 +436,2 @@ else { // load asset using default plugin

*/
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });

@@ -501,3 +475,3 @@ const Debug = require("debug");

};
this.settings = Object.assign({}, defaultSettings, settings);
this.settings = Object.assign(Object.assign({}, defaultSettings), settings);
this.loader = loader;

@@ -508,18 +482,16 @@ this.loader.on(p2p_media_loader_core_1.Events.SegmentLoaded, this.onSegmentLoaded);

}
destroy() {
return __awaiter(this, void 0, void 0, function* () {
if (this.requests.size !== 0) {
console.error("Destroying segment manager with active request(s)!");
for (const request of this.requests.values()) {
this.reportError(request, "Request aborted due to destroy call");
}
this.requests.clear();
async destroy() {
if (this.requests.size !== 0) {
console.error("Destroying segment manager with active request(s)!");
for (const request of this.requests.values()) {
this.reportError(request, "Request aborted due to destroy call");
}
this.playheadTime = 0;
this.segmentHistory.splice(0);
if (this.settings.assetsStorage !== undefined) {
yield this.settings.assetsStorage.destroy();
}
yield this.loader.destroy();
});
this.requests.clear();
}
this.playheadTime = 0;
this.segmentHistory.splice(0);
if (this.settings.assetsStorage !== undefined) {
await this.settings.assetsStorage.destroy();
}
await this.loader.destroy();
}

@@ -529,19 +501,17 @@ getSettings() {

}
load(parserSegment, manifestUri, playheadTime) {
return __awaiter(this, void 0, void 0, function* () {
this.manifestUri = manifestUri;
this.playheadTime = playheadTime;
this.pushSegmentHistory(parserSegment);
const lastRequestedSegment = this.refreshLoad();
const alreadyLoadedSegment = yield this.loader.getSegment(lastRequestedSegment.id);
return new Promise((resolve, reject) => {
const request = new Request(lastRequestedSegment.id, resolve, reject);
if (alreadyLoadedSegment) {
this.reportSuccess(request, alreadyLoadedSegment);
}
else {
this.debug("request add", request.id);
this.requests.set(request.id, request);
}
});
async load(parserSegment, manifestUri, playheadTime) {
this.manifestUri = manifestUri;
this.playheadTime = playheadTime;
this.pushSegmentHistory(parserSegment);
const lastRequestedSegment = this.refreshLoad();
const alreadyLoadedSegment = await this.loader.getSegment(lastRequestedSegment.id);
return new Promise((resolve, reject) => {
const request = new Request(lastRequestedSegment.id, resolve, reject);
if (alreadyLoadedSegment) {
this.reportSuccess(request, alreadyLoadedSegment);
}
else {
this.debug("request add", request.id);
this.requests.set(request.id, request);
}
});

@@ -578,5 +548,12 @@ }

const masterSwarmId = utils_1.getMasterSwarmId(this.manifestUri, this.settings);
const loaderSegments = sequence.map((s, i) => {
return new p2p_media_loader_core_1.Segment(`${masterSwarmId}+${s.streamIdentity}+${s.identity}`, s.uri, masterSwarmId, this.manifestUri, s.streamIdentity, s.identity, s.range, i);
});
const loaderSegments = sequence.map((s, i) => ({
id: `${masterSwarmId}+${s.streamIdentity}+${s.identity}`,
url: s.uri,
masterSwarmId: masterSwarmId,
masterManifestUri: this.manifestUri,
streamId: s.streamIdentity,
sequence: s.identity,
range: s.range,
priority: i,
}));
this.loader.load(loaderSegments, `${masterSwarmId}+${lastRequestedSegment.streamIdentity}`);

@@ -598,3 +575,3 @@ return loaderSegments[lastRequestedSegmentIndex];

let timeMs;
if (loaderSegment.downloadBandwidth > 0 && loaderSegment.data && loaderSegment.data.byteLength > 0) {
if (loaderSegment.downloadBandwidth !== undefined && loaderSegment.downloadBandwidth > 0 && loaderSegment.data && loaderSegment.data.byteLength > 0) {
timeMs = Math.trunc(loaderSegment.data.byteLength / loaderSegment.downloadBandwidth);

@@ -667,7 +644,10 @@ }

*/
function __export(m) {
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
}
Object.defineProperty(exports, "__esModule", { value: true });
exports.version = "0.6.1";
var engine_1 = require("./engine");
exports.Engine = engine_1.Engine;
exports.version = "0.6.2";
__export(require("./engine"));
__export(require("./segment-manager"));
},{"./engine":2}]},{},[1]);
},{"./engine":2,"./segment-manager":6}]},{},[1]);

@@ -1,1 +0,1 @@

require=function e(t,s,r){function i(a,o){if(!s[a]){if(!t[a]){var d="function"==typeof require&&require;if(!o&&d)return d(a,!0);if(n)return n(a,!0);var h=new Error("Cannot find module '"+a+"'");throw h.code="MODULE_NOT_FOUND",h}var g=s[a]={exports:{}};t[a][0].call(g.exports,function(e){return i(t[a][1][e]||e)},g,g.exports,e,t,s,r)}return s[a].exports}for(var n="function"==typeof require&&require,a=0;a<r.length;a++)i(r[a]);return i}({1:[function(e,t,s){window.p2pml||(window.p2pml={}),window.p2pml.shaka=e("p2p-media-loader-shaka")},{"p2p-media-loader-shaka":"p2p-media-loader-shaka"}],2:[function(e,t,s){"use strict";var r=this&&this.__awaiter||function(e,t,s,r){return new(s||(s=Promise))(function(i,n){function a(e){try{d(r.next(e))}catch(e){n(e)}}function o(e){try{d(r.throw(e))}catch(e){n(e)}}function d(e){e.done?i(e.value):new s(function(t){t(e.value)}).then(a,o)}d((r=r.apply(e,t||[])).next())})};Object.defineProperty(s,"__esModule",{value:!0});const i=e("events"),n=e("p2p-media-loader-core"),a=e("./segment-manager"),o=e("./integration");s.Engine=class extends i.EventEmitter{static isSupported(){return n.HybridLoader.isSupported()}constructor(e={}){super(),this.loader=new n.HybridLoader(e.loader),this.segmentManager=new a.SegmentManager(this.loader,e.segments),Object.keys(n.Events).map(e=>n.Events[e]).forEach(e=>this.loader.on(e,(...t)=>this.emit(e,...t)))}destroy(){return r(this,void 0,void 0,function*(){yield this.segmentManager.destroy()})}getSettings(){return{segments:this.segmentManager.getSettings(),loader:this.loader.getSettings()}}getDetails(){return{loader:this.loader.getDetails()}}initShakaPlayer(e){o.initShakaPlayer(e,this.segmentManager)}}},{"./integration":3,"./segment-manager":6,events:"events","p2p-media-loader-core":"p2p-media-loader-core"}],3:[function(e,t,s){"use strict";var r=this&&this.__awaiter||function(e,t,s,r){return new(s||(s=Promise))(function(i,n){function a(e){try{d(r.next(e))}catch(e){n(e)}}function o(e){try{d(r.throw(e))}catch(e){n(e)}}function d(e){e.done?i(e.value):new s(function(t){t(e.value)}).then(a,o)}d((r=r.apply(e,t||[])).next())})};Object.defineProperty(s,"__esModule",{value:!0});const i=e("debug"),n=e("./manifest-parser-proxy"),a=e("./utils"),o=i("p2pml:shaka:index");function d(e,t,s,i){if(!t.p2pml)return shaka.net.HttpXHRPlugin(e,t,s,i);const{player:n,segmentManager:d}=t.p2pml;let g,u,l,c=d.getSettings().assetsStorage;void 0!==c&&void 0!==n.getNetworkingEngine().p2pml&&void 0!==n.getNetworkingEngine().p2pml.masterManifestUri?(g=n.getNetworkingEngine().p2pml.masterManifestUri,u=a.getMasterSwarmId(g,d.getSettings())):c=void 0;const m=n.getManifest();if(s===shaka.net.NetworkingEngine.RequestType.SEGMENT&&null!==m&&void 0!==m.p2pml&&void 0!==m.p2pml.parser&&(l=m.p2pml.parser.find(e,t.headers.Range)),void 0!==l&&"video"===l.streamType){o("request","load",l.identity);const e=d.load(l,a.getSchemedUri(n.getAssetUri?n.getAssetUri():n.getManifestUri()),h(n)),t=()=>r(this,void 0,void 0,function*(){o("request","abort",l.identity)});return new shaka.util.AbortableOperation(e,t)}if(c){const n=(()=>r(this,void 0,void 0,function*(){const r=yield c.getAsset(e,t.headers.Range,u);if(void 0!==r)return{data:r.data,uri:r.responseUri,fromCache:!0};{const r=yield shaka.net.HttpXHRPlugin(e,t,s,i).promise;return c.storeAsset({masterManifestUri:g,masterSwarmId:u,requestUri:e,requestRange:t.headers.Range,responseUri:r.uri,data:r.data}),r}}))();return new shaka.util.AbortableOperation(n,()=>r(this,void 0,void 0,function*(){}))}return shaka.net.HttpXHRPlugin(e,t,s,i)}function h(e){let t=0;const s=e.getPlayheadTimeAsDate();return s&&(t=s.valueOf(),e.isLive()&&(t-=e.getPresentationStartTimeAsDate().valueOf()),t/=1e3),t}s.initShakaPlayer=function(e,t){o("register parser proxies"),shaka.media.ManifestParser.registerParserByExtension("mpd",n.ShakaDashManifestParserProxy),shaka.media.ManifestParser.registerParserByMime("application/dash+xml",n.ShakaDashManifestParserProxy),shaka.media.ManifestParser.registerParserByExtension("m3u8",n.ShakaHlsManifestParserProxy),shaka.media.ManifestParser.registerParserByMime("application/x-mpegurl",n.ShakaHlsManifestParserProxy),shaka.media.ManifestParser.registerParserByMime("application/vnd.apple.mpegurl",n.ShakaHlsManifestParserProxy),o("init networking engine"),shaka.net.NetworkingEngine.registerScheme("http",d),shaka.net.NetworkingEngine.registerScheme("https",d);let s=0,i=0;e.addEventListener("loading",()=>r(this,void 0,void 0,function*(){s>0&&(clearInterval(s),s=0),i=0;const r=e.getManifest();r&&r.p2pml&&r.p2pml.parser.reset(),yield t.destroy(),s=setInterval(()=>{const s=h(e);(s!==i||e.isBuffering())&&(t.setPlayheadTime(s),i=s)},500)})),o("register request filter"),e.getNetworkingEngine().registerRequestFilter((s,r)=>{r.p2pml={player:e,segmentManager:t}})}},{"./manifest-parser-proxy":4,"./utils":7,debug:"debug"}],4:[function(e,t,s){"use strict";Object.defineProperty(s,"__esModule",{value:!0});const r=e("./parser-segment");class i{constructor(e){this.cache=new r.ParserSegmentCache(200),this.originalManifestParser=e}isHls(){return this.originalManifestParser instanceof shaka.hls.HlsParser}isDash(){return this.originalManifestParser instanceof shaka.dash.DashParser}start(e,t){return void 0===t.networkingEngine.p2pml&&(t.networkingEngine.p2pml={}),t.networkingEngine.p2pml.masterManifestUri=e,this.originalManifestParser.start(e,t).then(e=>{this.manifest=e;for(const t of e.periods){const e=[];for(const s of t.variants)null!=s.video&&-1==e.indexOf(s.video)&&(this.hookGetSegmentReference(s.video),e.push(s.video)),null!=s.audio&&-1==e.indexOf(s.audio)&&(this.hookGetSegmentReference(s.audio),e.push(s.audio))}return e.p2pml={parser:this},e})}configure(e){return this.originalManifestParser.configure(e)}stop(){return this.originalManifestParser.stop()}update(){return this.originalManifestParser.update()}onExpirationUpdated(){return this.originalManifestParser.onExpirationUpdated()}find(e,t){return this.cache.find(e,t)}reset(){this.cache.clear()}hookGetSegmentReference(e){e.getSegmentReferenceOriginal=e.getSegmentReference,e.getSegmentReference=t=>(this.cache.add(e,t),e.getSegmentReferenceOriginal(t)),e.getPosition=()=>this.isHls()&&"video"===e.type?this.manifest.periods[0].variants.reduce((e,t)=>(t.video&&t.video.id&&!e.includes(t.video.id)&&e.push(t.video.id),e),[]).indexOf(e.id):-1}}s.ShakaManifestParserProxy=i;s.ShakaDashManifestParserProxy=class extends i{constructor(){super(new shaka.dash.DashParser)}};s.ShakaHlsManifestParserProxy=class extends i{constructor(){super(new shaka.hls.HlsParser)}}},{"./parser-segment":5}],5:[function(e,t,s){"use strict";Object.defineProperty(s,"__esModule",{value:!0});const r=e("./utils");class i{constructor(e,t,s,r,i,n,a,o,d,h,g,u){this.streamId=e,this.streamType=t,this.streamPosition=s,this.streamIdentity=r,this.identity=i,this.position=n,this.start=a,this.end=o,this.uri=d,this.range=h,this.prev=g,this.next=u}static create(e,t){const s=e.getSegmentReferenceOriginal(t);if(!s)return;const n=s.createUris();if(!n||0===n.length)return;const a=s.getStartTime(),o=s.getEndTime(),d=s.getStartByte(),h=s.getEndByte(),g=d||h?`bytes=${d||""}-${h||""}`:void 0,u=e.type.substring(0,1).toUpperCase(),l=e.getPosition(),c=l>=0,m=c?`${u}${l}`:`${u}${e.id}`,p=c?`${t}`:`${Number(a).toFixed(3)}`;return new i(e.id,e.type,l,m,p,t,a,o,r.getSchemedUri(n[0]),g,()=>i.create(e,t-1),()=>i.create(e,t+1))}}s.ParserSegment=i;s.ParserSegmentCache=class{constructor(e){this.segments=[],this.maxSegments=e}find(e,t){return this.segments.find(s=>s.uri===e&&s.range===t)}add(e,t){const s=i.create(e,t);s&&!this.find(s.uri,s.range)&&(this.segments.push(s),this.segments.length>this.maxSegments&&this.segments.splice(0,.2*this.maxSegments))}clear(){this.segments.splice(0)}}},{"./utils":7}],6:[function(e,t,s){"use strict";var r=this&&this.__awaiter||function(e,t,s,r){return new(s||(s=Promise))(function(i,n){function a(e){try{d(r.next(e))}catch(e){n(e)}}function o(e){try{d(r.throw(e))}catch(e){n(e)}}function d(e){e.done?i(e.value):new s(function(t){t(e.value)}).then(a,o)}d((r=r.apply(e,t||[])).next())})};Object.defineProperty(s,"__esModule",{value:!0});const i=e("debug"),n=e("p2p-media-loader-core"),a=e("./utils"),o={forwardSegmentCount:20,maxHistorySegments:50,swarmId:void 0,assetsStorage:void 0};s.SegmentManager=class{constructor(e,t={}){this.debug=i("p2pml:shaka:sm"),this.requests=new Map,this.manifestUri="",this.playheadTime=0,this.segmentHistory=[],this.onSegmentLoaded=e=>{this.requests.has(e.id)&&(this.reportSuccess(this.requests.get(e.id),e),this.debug("request delete",e.id),this.requests.delete(e.id))},this.onSegmentError=(e,t)=>{this.requests.has(e.id)&&(this.reportError(this.requests.get(e.id),t),this.debug("request delete from error",e.id),this.requests.delete(e.id))},this.onSegmentAbort=e=>{this.requests.has(e.id)&&(this.reportError(this.requests.get(e.id),"Internal abort"),this.debug("request delete from abort",e.id),this.requests.delete(e.id))},this.settings=Object.assign({},o,t),this.loader=e,this.loader.on(n.Events.SegmentLoaded,this.onSegmentLoaded),this.loader.on(n.Events.SegmentError,this.onSegmentError),this.loader.on(n.Events.SegmentAbort,this.onSegmentAbort)}destroy(){return r(this,void 0,void 0,function*(){if(0!==this.requests.size){console.error("Destroying segment manager with active request(s)!");for(const e of this.requests.values())this.reportError(e,"Request aborted due to destroy call");this.requests.clear()}this.playheadTime=0,this.segmentHistory.splice(0),void 0!==this.settings.assetsStorage&&(yield this.settings.assetsStorage.destroy()),yield this.loader.destroy()})}getSettings(){return this.settings}load(e,t,s){return r(this,void 0,void 0,function*(){this.manifestUri=t,this.playheadTime=s,this.pushSegmentHistory(e);const r=this.refreshLoad(),i=yield this.loader.getSegment(r.id);return new Promise((e,t)=>{const s=new d(r.id,e,t);i?this.reportSuccess(s,i):(this.debug("request add",s.id),this.requests.set(s.id,s))})})}setPlayheadTime(e){this.playheadTime=e,this.segmentHistory.length>0&&this.refreshLoad()}refreshLoad(){const e=this.segmentHistory[this.segmentHistory.length-1],t=this.playheadTime>.1?this.playheadTime:e.start,s=this.segmentHistory.reduce((e,s)=>(s.start>=t&&e.push(s),e),[]);0===s.length&&s.push(e);const r=s.length-1;do{const e=s[s.length-1].next();if(!e)break;s.push(e)}while(s.length<this.settings.forwardSegmentCount);const i=a.getMasterSwarmId(this.manifestUri,this.settings),o=s.map((e,t)=>new n.Segment(`${i}+${e.streamIdentity}+${e.identity}`,e.uri,i,this.manifestUri,e.streamIdentity,e.identity,e.range,t));return this.loader.load(o,`${i}+${e.streamIdentity}`),o[r]}pushSegmentHistory(e){this.segmentHistory.length>=this.settings.maxHistorySegments&&(this.debug("segment history auto shrink"),this.segmentHistory.splice(0,.2*this.settings.maxHistorySegments)),this.segmentHistory.length>0&&this.segmentHistory[this.segmentHistory.length-1].start>e.start&&(this.debug("segment history reset due to playhead seek back"),this.segmentHistory.splice(0)),this.segmentHistory.push(e)}reportSuccess(e,t){let s;t.downloadBandwidth>0&&t.data&&t.data.byteLength>0&&(s=Math.trunc(t.data.byteLength/t.downloadBandwidth)),this.debug("report success",e.id),e.resolve({data:t.data,timeMs:s})}reportError(e,t){e.reject&&(this.debug("report error",e.id),e.reject(t))}};class d{constructor(e,t,s){this.id=e,this.resolve=t,this.reject=s}}},{"./utils":7,debug:"debug","p2p-media-loader-core":"p2p-media-loader-core"}],7:[function(e,t,s){"use strict";Object.defineProperty(s,"__esModule",{value:!0}),s.getSchemedUri=function(e){return e.startsWith("//")?window.location.protocol+e:e},s.getMasterSwarmId=function(e,t){return t.swarmId&&0!==t.swarmId.length?t.swarmId:e.split("?")[0]}},{}],"p2p-media-loader-shaka":[function(e,t,s){"use strict";Object.defineProperty(s,"__esModule",{value:!0}),s.version="0.6.1";var r=e("./engine");s.Engine=r.Engine},{"./engine":2}]},{},[1]);
require=function e(t,s,r){function i(n,o){if(!s[n]){if(!t[n]){var d="function"==typeof require&&require;if(!o&&d)return d(n,!0);if(a)return a(n,!0);var h=new Error("Cannot find module '"+n+"'");throw h.code="MODULE_NOT_FOUND",h}var g=s[n]={exports:{}};t[n][0].call(g.exports,function(e){return i(t[n][1][e]||e)},g,g.exports,e,t,s,r)}return s[n].exports}for(var a="function"==typeof require&&require,n=0;n<r.length;n++)i(r[n]);return i}({1:[function(e,t,s){window.p2pml||(window.p2pml={}),window.p2pml.shaka=e("p2p-media-loader-shaka")},{"p2p-media-loader-shaka":"p2p-media-loader-shaka"}],2:[function(e,t,s){"use strict";Object.defineProperty(s,"__esModule",{value:!0});const r=e("events"),i=e("p2p-media-loader-core"),a=e("./segment-manager"),n=e("./integration");s.Engine=class extends r.EventEmitter{constructor(e={}){super(),this.loader=new i.HybridLoader(e.loader),this.segmentManager=new a.SegmentManager(this.loader,e.segments),Object.keys(i.Events).map(e=>i.Events[e]).forEach(e=>this.loader.on(e,(...t)=>this.emit(e,...t)))}static isSupported(){return i.HybridLoader.isSupported()}async destroy(){await this.segmentManager.destroy()}getSettings(){return{segments:this.segmentManager.getSettings(),loader:this.loader.getSettings()}}getDetails(){return{loader:this.loader.getDetails()}}initShakaPlayer(e){n.initShakaPlayer(e,this.segmentManager)}}},{"./integration":3,"./segment-manager":6,events:"events","p2p-media-loader-core":"p2p-media-loader-core"}],3:[function(e,t,s){"use strict";Object.defineProperty(s,"__esModule",{value:!0});const r=e("debug"),i=e("./manifest-parser-proxy"),a=e("./utils"),n=r("p2pml:shaka:index");function o(e,t,s,r){if(!t.p2pml)return shaka.net.HttpXHRPlugin(e,t,s,r);const{player:i,segmentManager:o}=t.p2pml;let h,g,u,l=o.getSettings().assetsStorage;void 0!==l&&void 0!==i.getNetworkingEngine().p2pml&&void 0!==i.getNetworkingEngine().p2pml.masterManifestUri?(h=i.getNetworkingEngine().p2pml.masterManifestUri,g=a.getMasterSwarmId(h,o.getSettings())):l=void 0;const m=i.getManifest();if(s===shaka.net.NetworkingEngine.RequestType.SEGMENT&&null!==m&&void 0!==m.p2pml&&void 0!==m.p2pml.parser&&(u=m.p2pml.parser.find(e,t.headers.Range)),void 0!==u&&"video"===u.streamType){n("request","load",u.identity);const e=o.load(u,a.getSchemedUri(i.getAssetUri?i.getAssetUri():i.getManifestUri()),d(i)),t=async()=>{n("request","abort",u.identity)};return new shaka.util.AbortableOperation(e,t)}if(l){const i=(async()=>{const i=await l.getAsset(e,t.headers.Range,g);if(void 0!==i)return{data:i.data,uri:i.responseUri,fromCache:!0};{const i=await shaka.net.HttpXHRPlugin(e,t,s,r).promise;return l.storeAsset({masterManifestUri:h,masterSwarmId:g,requestUri:e,requestRange:t.headers.Range,responseUri:i.uri,data:i.data}),i}})();return new shaka.util.AbortableOperation(i,async()=>{})}return shaka.net.HttpXHRPlugin(e,t,s,r)}function d(e){let t=0;const s=e.getPlayheadTimeAsDate();return s&&(t=s.valueOf(),e.isLive()&&(t-=e.getPresentationStartTimeAsDate().valueOf()),t/=1e3),t}s.initShakaPlayer=function(e,t){n("register parser proxies"),shaka.media.ManifestParser.registerParserByExtension("mpd",i.ShakaDashManifestParserProxy),shaka.media.ManifestParser.registerParserByMime("application/dash+xml",i.ShakaDashManifestParserProxy),shaka.media.ManifestParser.registerParserByExtension("m3u8",i.ShakaHlsManifestParserProxy),shaka.media.ManifestParser.registerParserByMime("application/x-mpegurl",i.ShakaHlsManifestParserProxy),shaka.media.ManifestParser.registerParserByMime("application/vnd.apple.mpegurl",i.ShakaHlsManifestParserProxy),n("init networking engine"),shaka.net.NetworkingEngine.registerScheme("http",o),shaka.net.NetworkingEngine.registerScheme("https",o);let s=0,r=0;e.addEventListener("loading",async()=>{s>0&&(clearInterval(s),s=0),r=0;const i=e.getManifest();i&&i.p2pml&&i.p2pml.parser.reset(),await t.destroy(),s=setInterval(()=>{const s=d(e);(s!==r||e.isBuffering())&&(t.setPlayheadTime(s),r=s)},500)}),n("register request filter"),e.getNetworkingEngine().registerRequestFilter((s,r)=>{r.p2pml={player:e,segmentManager:t}})}},{"./manifest-parser-proxy":4,"./utils":7,debug:"debug"}],4:[function(e,t,s){"use strict";Object.defineProperty(s,"__esModule",{value:!0});const r=e("./parser-segment");class i{constructor(e){this.cache=new r.ParserSegmentCache(200),this.originalManifestParser=e}isHls(){return this.originalManifestParser instanceof shaka.hls.HlsParser}isDash(){return this.originalManifestParser instanceof shaka.dash.DashParser}start(e,t){return void 0===t.networkingEngine.p2pml&&(t.networkingEngine.p2pml={}),t.networkingEngine.p2pml.masterManifestUri=e,this.originalManifestParser.start(e,t).then(e=>{this.manifest=e;for(const t of e.periods){const e=[];for(const s of t.variants)null!=s.video&&-1==e.indexOf(s.video)&&(this.hookGetSegmentReference(s.video),e.push(s.video)),null!=s.audio&&-1==e.indexOf(s.audio)&&(this.hookGetSegmentReference(s.audio),e.push(s.audio))}return e.p2pml={parser:this},e})}configure(e){return this.originalManifestParser.configure(e)}stop(){return this.originalManifestParser.stop()}update(){return this.originalManifestParser.update()}onExpirationUpdated(){return this.originalManifestParser.onExpirationUpdated()}find(e,t){return this.cache.find(e,t)}reset(){this.cache.clear()}hookGetSegmentReference(e){e.getSegmentReferenceOriginal=e.getSegmentReference,e.getSegmentReference=t=>(this.cache.add(e,t),e.getSegmentReferenceOriginal(t)),e.getPosition=()=>this.isHls()&&"video"===e.type?this.manifest.periods[0].variants.reduce((e,t)=>(t.video&&t.video.id&&!e.includes(t.video.id)&&e.push(t.video.id),e),[]).indexOf(e.id):-1}}s.ShakaManifestParserProxy=i;s.ShakaDashManifestParserProxy=class extends i{constructor(){super(new shaka.dash.DashParser)}};s.ShakaHlsManifestParserProxy=class extends i{constructor(){super(new shaka.hls.HlsParser)}}},{"./parser-segment":5}],5:[function(e,t,s){"use strict";Object.defineProperty(s,"__esModule",{value:!0});const r=e("./utils");class i{constructor(e,t,s,r,i,a,n,o,d,h,g,u){this.streamId=e,this.streamType=t,this.streamPosition=s,this.streamIdentity=r,this.identity=i,this.position=a,this.start=n,this.end=o,this.uri=d,this.range=h,this.prev=g,this.next=u}static create(e,t){const s=e.getSegmentReferenceOriginal(t);if(!s)return;const a=s.createUris();if(!a||0===a.length)return;const n=s.getStartTime(),o=s.getEndTime(),d=s.getStartByte(),h=s.getEndByte(),g=d||h?`bytes=${d||""}-${h||""}`:void 0,u=e.type.substring(0,1).toUpperCase(),l=e.getPosition(),m=l>=0,c=m?`${u}${l}`:`${u}${e.id}`,p=m?`${t}`:`${Number(n).toFixed(3)}`;return new i(e.id,e.type,l,c,p,t,n,o,r.getSchemedUri(a[0]),g,()=>i.create(e,t-1),()=>i.create(e,t+1))}}s.ParserSegment=i;s.ParserSegmentCache=class{constructor(e){this.segments=[],this.maxSegments=e}find(e,t){return this.segments.find(s=>s.uri===e&&s.range===t)}add(e,t){const s=i.create(e,t);s&&!this.find(s.uri,s.range)&&(this.segments.push(s),this.segments.length>this.maxSegments&&this.segments.splice(0,.2*this.maxSegments))}clear(){this.segments.splice(0)}}},{"./utils":7}],6:[function(e,t,s){"use strict";Object.defineProperty(s,"__esModule",{value:!0});const r=e("debug"),i=e("p2p-media-loader-core"),a=e("./utils"),n={forwardSegmentCount:20,maxHistorySegments:50,swarmId:void 0,assetsStorage:void 0};s.SegmentManager=class{constructor(e,t={}){this.debug=r("p2pml:shaka:sm"),this.requests=new Map,this.manifestUri="",this.playheadTime=0,this.segmentHistory=[],this.onSegmentLoaded=e=>{this.requests.has(e.id)&&(this.reportSuccess(this.requests.get(e.id),e),this.debug("request delete",e.id),this.requests.delete(e.id))},this.onSegmentError=(e,t)=>{this.requests.has(e.id)&&(this.reportError(this.requests.get(e.id),t),this.debug("request delete from error",e.id),this.requests.delete(e.id))},this.onSegmentAbort=e=>{this.requests.has(e.id)&&(this.reportError(this.requests.get(e.id),"Internal abort"),this.debug("request delete from abort",e.id),this.requests.delete(e.id))},this.settings=Object.assign(Object.assign({},n),t),this.loader=e,this.loader.on(i.Events.SegmentLoaded,this.onSegmentLoaded),this.loader.on(i.Events.SegmentError,this.onSegmentError),this.loader.on(i.Events.SegmentAbort,this.onSegmentAbort)}async destroy(){if(0!==this.requests.size){console.error("Destroying segment manager with active request(s)!");for(const e of this.requests.values())this.reportError(e,"Request aborted due to destroy call");this.requests.clear()}this.playheadTime=0,this.segmentHistory.splice(0),void 0!==this.settings.assetsStorage&&await this.settings.assetsStorage.destroy(),await this.loader.destroy()}getSettings(){return this.settings}async load(e,t,s){this.manifestUri=t,this.playheadTime=s,this.pushSegmentHistory(e);const r=this.refreshLoad(),i=await this.loader.getSegment(r.id);return new Promise((e,t)=>{const s=new o(r.id,e,t);i?this.reportSuccess(s,i):(this.debug("request add",s.id),this.requests.set(s.id,s))})}setPlayheadTime(e){this.playheadTime=e,this.segmentHistory.length>0&&this.refreshLoad()}refreshLoad(){const e=this.segmentHistory[this.segmentHistory.length-1],t=this.playheadTime>.1?this.playheadTime:e.start,s=this.segmentHistory.reduce((e,s)=>(s.start>=t&&e.push(s),e),[]);0===s.length&&s.push(e);const r=s.length-1;do{const e=s[s.length-1].next();if(!e)break;s.push(e)}while(s.length<this.settings.forwardSegmentCount);const i=a.getMasterSwarmId(this.manifestUri,this.settings),n=s.map((e,t)=>({id:`${i}+${e.streamIdentity}+${e.identity}`,url:e.uri,masterSwarmId:i,masterManifestUri:this.manifestUri,streamId:e.streamIdentity,sequence:e.identity,range:e.range,priority:t}));return this.loader.load(n,`${i}+${e.streamIdentity}`),n[r]}pushSegmentHistory(e){this.segmentHistory.length>=this.settings.maxHistorySegments&&(this.debug("segment history auto shrink"),this.segmentHistory.splice(0,.2*this.settings.maxHistorySegments)),this.segmentHistory.length>0&&this.segmentHistory[this.segmentHistory.length-1].start>e.start&&(this.debug("segment history reset due to playhead seek back"),this.segmentHistory.splice(0)),this.segmentHistory.push(e)}reportSuccess(e,t){let s;void 0!==t.downloadBandwidth&&t.downloadBandwidth>0&&t.data&&t.data.byteLength>0&&(s=Math.trunc(t.data.byteLength/t.downloadBandwidth)),this.debug("report success",e.id),e.resolve({data:t.data,timeMs:s})}reportError(e,t){e.reject&&(this.debug("report error",e.id),e.reject(t))}};class o{constructor(e,t,s){this.id=e,this.resolve=t,this.reject=s}}},{"./utils":7,debug:"debug","p2p-media-loader-core":"p2p-media-loader-core"}],7:[function(e,t,s){"use strict";Object.defineProperty(s,"__esModule",{value:!0}),s.getSchemedUri=function(e){return e.startsWith("//")?window.location.protocol+e:e},s.getMasterSwarmId=function(e,t){return t.swarmId&&0!==t.swarmId.length?t.swarmId:e.split("?")[0]}},{}],"p2p-media-loader-shaka":[function(e,t,s){"use strict";function r(e){for(var t in e)s.hasOwnProperty(t)||(s[t]=e[t])}Object.defineProperty(s,"__esModule",{value:!0}),s.version="0.6.2",r(e("./engine")),r(e("./segment-manager"))},{"./engine":2,"./segment-manager":6}]},{},[1]);

@@ -17,2 +17,8 @@ /**

import { EventEmitter } from "events";
import { HybridLoaderSettings } from "p2p-media-loader-core";
import { SegmentManagerSettings } from "./segment-manager";
export interface ShakaEngineSettings {
loader: Partial<HybridLoaderSettings>;
segments: Partial<SegmentManagerSettings>;
}
export declare class Engine extends EventEmitter {

@@ -22,3 +28,3 @@ static isSupported(): boolean;

private readonly segmentManager;
constructor(settings?: any);
constructor(settings?: Partial<ShakaEngineSettings>);
destroy(): Promise<void>;

@@ -25,0 +31,0 @@ getSettings(): any;

@@ -17,10 +17,2 @@ "use strict";

*/
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });

@@ -32,5 +24,2 @@ const events_1 = require("events");

class Engine extends events_1.EventEmitter {
static isSupported() {
return p2p_media_loader_core_1.HybridLoader.isSupported();
}
constructor(settings = {}) {

@@ -44,7 +33,8 @@ super();

}
destroy() {
return __awaiter(this, void 0, void 0, function* () {
yield this.segmentManager.destroy();
});
static isSupported() {
return p2p_media_loader_core_1.HybridLoader.isSupported();
}
async destroy() {
await this.segmentManager.destroy();
}
getSettings() {

@@ -51,0 +41,0 @@ return {

@@ -17,3 +17,4 @@ /**

*/
export declare const version = "0.6.1";
export { Engine, Asset, AssetsStorage } from "./engine";
export declare const version = "0.6.2";
export * from "./engine";
export * from "./segment-manager";

@@ -18,5 +18,8 @@ "use strict";

*/
function __export(m) {
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
}
Object.defineProperty(exports, "__esModule", { value: true });
exports.version = "0.6.1";
var engine_1 = require("./engine");
exports.Engine = engine_1.Engine;
exports.version = "0.6.2";
__export(require("./engine"));
__export(require("./segment-manager"));

@@ -17,10 +17,2 @@ "use strict";

*/
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });

@@ -36,3 +28,3 @@ const Debug = require("debug");

let lastPlayheadTimeReported = 0;
player.addEventListener("loading", () => __awaiter(this, void 0, void 0, function* () {
player.addEventListener("loading", async () => {
if (intervalId > 0) {

@@ -47,3 +39,3 @@ clearInterval(intervalId);

}
yield segmentManager.destroy();
await segmentManager.destroy();
intervalId = setInterval(() => {

@@ -56,3 +48,3 @@ const time = getPlayheadTime(player);

}, 500);
}));
});
debug("register request filter");

@@ -105,11 +97,11 @@ player.getNetworkingEngine().registerRequestFilter((requestType, request) => {

const promise = segmentManager.load(segment, utils_1.getSchemedUri(player.getAssetUri ? player.getAssetUri() : player.getManifestUri()), getPlayheadTime(player));
const abort = () => __awaiter(this, void 0, void 0, function* () {
const abort = async () => {
debug("request", "abort", segment.identity);
// TODO: implement abort in SegmentManager
});
};
return new shaka.util.AbortableOperation(promise, abort);
}
else if (assetsStorage) { // load or store the asset using assets storage
const responsePromise = (() => __awaiter(this, void 0, void 0, function* () {
const asset = yield assetsStorage.getAsset(uri, request.headers.Range, masterSwarmId);
const responsePromise = (async () => {
const asset = await assetsStorage.getAsset(uri, request.headers.Range, masterSwarmId);
if (asset !== undefined) {

@@ -123,3 +115,3 @@ return {

else {
const response = yield shaka.net.HttpXHRPlugin(uri, request, requestType, progressUpdated).promise;
const response = await shaka.net.HttpXHRPlugin(uri, request, requestType, progressUpdated).promise;
assetsStorage.storeAsset({

@@ -135,4 +127,4 @@ masterManifestUri: masterManifestUri,

}
}))();
return new shaka.util.AbortableOperation(responsePromise, () => __awaiter(this, void 0, void 0, function* () { }));
})();
return new shaka.util.AbortableOperation(responsePromise, async () => { });
}

@@ -139,0 +131,0 @@ else { // load asset using default plugin

@@ -27,5 +27,5 @@ /**

private readonly settings;
constructor(loader: LoaderInterface, settings?: any);
constructor(loader: LoaderInterface, settings?: Partial<SegmentManagerSettings>);
destroy(): Promise<void>;
getSettings(): Settings;
getSettings(): SegmentManagerSettings;
load(parserSegment: ParserSegment, manifestUri: string, playheadTime: number): Promise<{

@@ -44,3 +44,3 @@ data: ArrayBuffer;

}
interface Settings {
export interface SegmentManagerSettings {
/**

@@ -64,2 +64,1 @@ * Number of segments for building up predicted forward segments sequence; used to predownload and share via P2P

}
export {};

@@ -17,10 +17,2 @@ "use strict";

*/
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });

@@ -64,3 +56,3 @@ const Debug = require("debug");

};
this.settings = Object.assign({}, defaultSettings, settings);
this.settings = Object.assign(Object.assign({}, defaultSettings), settings);
this.loader = loader;

@@ -71,18 +63,16 @@ this.loader.on(p2p_media_loader_core_1.Events.SegmentLoaded, this.onSegmentLoaded);

}
destroy() {
return __awaiter(this, void 0, void 0, function* () {
if (this.requests.size !== 0) {
console.error("Destroying segment manager with active request(s)!");
for (const request of this.requests.values()) {
this.reportError(request, "Request aborted due to destroy call");
}
this.requests.clear();
async destroy() {
if (this.requests.size !== 0) {
console.error("Destroying segment manager with active request(s)!");
for (const request of this.requests.values()) {
this.reportError(request, "Request aborted due to destroy call");
}
this.playheadTime = 0;
this.segmentHistory.splice(0);
if (this.settings.assetsStorage !== undefined) {
yield this.settings.assetsStorage.destroy();
}
yield this.loader.destroy();
});
this.requests.clear();
}
this.playheadTime = 0;
this.segmentHistory.splice(0);
if (this.settings.assetsStorage !== undefined) {
await this.settings.assetsStorage.destroy();
}
await this.loader.destroy();
}

@@ -92,19 +82,17 @@ getSettings() {

}
load(parserSegment, manifestUri, playheadTime) {
return __awaiter(this, void 0, void 0, function* () {
this.manifestUri = manifestUri;
this.playheadTime = playheadTime;
this.pushSegmentHistory(parserSegment);
const lastRequestedSegment = this.refreshLoad();
const alreadyLoadedSegment = yield this.loader.getSegment(lastRequestedSegment.id);
return new Promise((resolve, reject) => {
const request = new Request(lastRequestedSegment.id, resolve, reject);
if (alreadyLoadedSegment) {
this.reportSuccess(request, alreadyLoadedSegment);
}
else {
this.debug("request add", request.id);
this.requests.set(request.id, request);
}
});
async load(parserSegment, manifestUri, playheadTime) {
this.manifestUri = manifestUri;
this.playheadTime = playheadTime;
this.pushSegmentHistory(parserSegment);
const lastRequestedSegment = this.refreshLoad();
const alreadyLoadedSegment = await this.loader.getSegment(lastRequestedSegment.id);
return new Promise((resolve, reject) => {
const request = new Request(lastRequestedSegment.id, resolve, reject);
if (alreadyLoadedSegment) {
this.reportSuccess(request, alreadyLoadedSegment);
}
else {
this.debug("request add", request.id);
this.requests.set(request.id, request);
}
});

@@ -141,5 +129,12 @@ }

const masterSwarmId = utils_1.getMasterSwarmId(this.manifestUri, this.settings);
const loaderSegments = sequence.map((s, i) => {
return new p2p_media_loader_core_1.Segment(`${masterSwarmId}+${s.streamIdentity}+${s.identity}`, s.uri, masterSwarmId, this.manifestUri, s.streamIdentity, s.identity, s.range, i);
});
const loaderSegments = sequence.map((s, i) => ({
id: `${masterSwarmId}+${s.streamIdentity}+${s.identity}`,
url: s.uri,
masterSwarmId: masterSwarmId,
masterManifestUri: this.manifestUri,
streamId: s.streamIdentity,
sequence: s.identity,
range: s.range,
priority: i,
}));
this.loader.load(loaderSegments, `${masterSwarmId}+${lastRequestedSegment.streamIdentity}`);

@@ -161,3 +156,3 @@ return loaderSegments[lastRequestedSegmentIndex];

let timeMs;
if (loaderSegment.downloadBandwidth > 0 && loaderSegment.data && loaderSegment.data.byteLength > 0) {
if (loaderSegment.downloadBandwidth !== undefined && loaderSegment.downloadBandwidth > 0 && loaderSegment.data && loaderSegment.data.byteLength > 0) {
timeMs = Math.trunc(loaderSegment.data.byteLength / loaderSegment.downloadBandwidth);

@@ -164,0 +159,0 @@ }

{
"name": "p2p-media-loader-shaka",
"description": "P2P Media Loader Shaka Player integration",
"version": "0.6.1",
"version": "0.6.2",
"license": "Apache-2.0",

@@ -40,17 +40,17 @@ "author": "Novage",

"events": "^3.0.0",
"p2p-media-loader-core": "^0.6.1"
"p2p-media-loader-core": "^0.6.2"
},
"devDependencies": {
"@types/debug": "^4.1.4",
"@types/debug": "^4.1.5",
"@types/events": "^3.0.0",
"browserify": "^16.3.0",
"browserify": "^16.5.0",
"copyfiles": "^2.1.1",
"mkdirp": "^0.5.1",
"terser": "^4.1.2",
"terser": "^4.2.1",
"ts-loader": "^6.0.4",
"tslint": "^5.18.0",
"typescript": "^3.5.3",
"webpack": "^4.36.1",
"webpack-cli": "^3.3.6"
"tslint": "^5.19.0",
"typescript": "^3.6.2",
"webpack": "^4.39.3",
"webpack-cli": "^3.3.7"
}
}
SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc