Skip to content

Commit eaaadd4

Browse files
Made some major changes to make this usable with webpack
1 parent 4682270 commit eaaadd4

13 files changed

Lines changed: 187 additions & 126 deletions

bin/build.js

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#!/usr/bin/env node
2+
3+
var uglify = require("uglify-es");
4+
5+
process.chdir(__dirname+"/../dist");
6+
7+
var FastSourcemapConcat = require("fast-sourcemap-concat");
8+
var fastSourcemapConcat = new FastSourcemapConcat({
9+
outputFile: "protocolloadfallbackhandler.js"
10+
});
11+
12+
var dir = '../lib/';
13+
14+
var fs = require('fs');
15+
var files = fs.readdirSync(dir).filter(x=>/\.js/.test(x)).sort();
16+
for( let file of files )
17+
fastSourcemapConcat.addFile(dir+file);
18+
19+
fastSourcemapConcat.end().then(()=>{
20+
var result = uglify.minify({
21+
"protocolloadfallbackhandler.js": fs.readFileSync("protocolloadfallbackhandler.js", "utf8")
22+
}, {
23+
sourceMap: {
24+
content: fs.readFileSync("protocolloadfallbackhandler.map", "utf8"),
25+
filename: "protocolloadfallbackhandler.min.js",
26+
url: "protocolloadfallbackhandler.min.map"
27+
}
28+
});
29+
fs.writeFileSync("protocolloadfallbackhandler.min.js",result.code);
30+
fs.writeFileSync("protocolloadfallbackhandler.min.map",result.map);
31+
});

lib/00-start.js

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
"use strict";
2+
3+
(function(){
4+
if(typeof module != "undefined"){
5+
module.exports = (...x)=>module.exports.init(...x)
6+
module.exports.init = init;
7+
}else{
8+
init();
9+
}
10+
function init(options){
11+
12+
options = options || {};
13+
14+
var pfh;
15+
16+
if(typeof module != "undefined"){
17+
pfh = module.exports;
18+
pfh.options = {};
19+
}else{
20+
pfh = self;
21+
}
22+
23+
for(let [name,val] of [
24+
['replaceFetch', true],
25+
['replaceXMLHttpRequest', true],
26+
['serviceWorkerDoesHandleLoadFallbackHandlers', false],
27+
['serviceWorkerPrefix', location.origin + "/proxy/"],
28+
['fallbackProxyAvailable', false],
29+
['proxybase', location.origin + "/proxy/"]
30+
]){
31+
if(typeof self[name] == 'undefined'){
32+
if(name in options){
33+
self[name] = options[name];
34+
}else{
35+
self[name] = val;
36+
}
37+
}
38+
if(pfh != self && typeof pfh.options[name] == 'undefined')
39+
Object.defineProperty(pfh.options,name,{
40+
enumerable: true,
41+
configurable: true,
42+
get: ()=>self[name],
43+
set(val){self[name]=val;}
44+
});
45+
}
46+
47+
function exportGlobal(name,value,keep){
48+
if(name in self && keep)
49+
return;
50+
self[name] = value;
51+
if(pfh != self){
52+
Object.defineProperty(pfh,name,{
53+
enumerable: true,
54+
configurable: true,
55+
get: ()=>self[name],
56+
set(val){self[name]=val;}
57+
});
58+
}
59+
}
60+
61+
// See ~~-end.js for the end of the function that wraps everything

lib/01-eventsource-constructor-polyfill.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ try {
33
} catch(e) {
44
// If the EventTarget constructor isn't supported, replace it with a polyfill
55
let listeners = Symbol("listeners");
6-
self.nativeEventTarget = EventTarget;
7-
self.EventTarget = function EventTarget(){
6+
exportGlobal('nativeEventTarget',EventTarget,true);
7+
exportGlobal('EventTarget', function EventTarget(){
88
if(!new.target)
99
throw new TypeError("class constructors must be invoked with |new|");
1010
function EventTarget(){
@@ -36,7 +36,7 @@ try {
3636
// Correct prototype from new
3737
Object.setPrototypeOf(Object.getPrototypeOf(this),EventTarget.prototype);
3838
EventTarget.apply(this);
39-
};
39+
});
4040
// fake the instanceof check for nativeEventTarget instances with this function to return true
4141
EventTarget.prototype = nativeEventTarget.prototype;
4242
}

lib/02-utils.js

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
2+
exportGlobal("PFHUtils",{
3+
4+
logStack(){
5+
console.log(new Error().stack);
6+
},
7+
8+
ucfirst(string){
9+
return string.charAt(0).toUpperCase() + string.slice(1);
10+
},
11+
12+
parseRange(str){
13+
let ranges = str.split(/ *, */);
14+
var result = [];
15+
for(let range of ranges){
16+
var r=null, a=[];
17+
if(r=range.match(/^(\d+)-(\d+)$/)){
18+
a = Array.from(new Uint32Array(r[2]-r[1]+1)).map((x,i)=>(i+ +r[1]).toString());
19+
}else if(r=range.match(/^(\d+)$/)){
20+
a = [r[1]];
21+
}
22+
result = result.concat(a);
23+
}
24+
return Array.from(new Set(result));
25+
},
26+
27+
readStreamToReadableStream(stream){
28+
if(!stream.readable)
29+
throw new Error("Stream isn't readable");
30+
return new ReadableStream({
31+
start(controller){
32+
stream.on("data",chunk=>{
33+
controller.enqueue(chunk);
34+
});
35+
stream.on("end",()=>{
36+
controller.close();
37+
});
38+
}
39+
});
40+
}
41+
42+
});

lib/10-URIMapCacher.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ new (class URIMapCacher extends EventTarget {
55
if(self.URIMapCacher){
66
this.list = self.URIMapCacher.list;
77
}
8-
self.URIMapCacher = this;
8+
exportGlobal('URIMapCacher',this);
99
}
1010
getURL(uri){
1111
for(let entry of this.list){

lib/20-CSSStyleSheetDetector.js

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,23 @@
11
(function(){
2-
if(!self.$lastCheckStyleSheets)
3-
self.$lastCheckStyleSheets = [];
4-
if(self.$interval)
5-
clearInterval(self.$interval);
6-
self.$interval = setInterval(function(){
2+
if(!self.$pfh_lastCheckStyleSheets)
3+
self.$pfh_lastCheckStyleSheets = [];
4+
if(self.$pfh_interval)
5+
clearInterval(self.$pfh_interval);
6+
self.$pfh_interval = setInterval(function(){
77
var checked = Symbol('checked');
88
for( stylesheet of Array.from(document.styleSheets) ){
9-
var i = $lastCheckStyleSheets.indexOf(stylesheet);
9+
var i = $pfh_lastCheckStyleSheets.indexOf(stylesheet);
1010
if(i == -1){
11-
$lastCheckStyleSheets.push(stylesheet);
11+
$pfh_lastCheckStyleSheets.push(stylesheet);
1212
dispatchEvent(new CustomEvent("stylesheetadded",{detail:stylesheet}));
1313
}
1414
stylesheet[checked] = true;
1515
}
16-
for( var i=0; i<$lastCheckStyleSheets.length; i++ ){
17-
if($lastCheckStyleSheets[i][checked]){
18-
delete $lastCheckStyleSheets[i][checked];
16+
for( var i=0; i<$pfh_lastCheckStyleSheets.length; i++ ){
17+
if($pfh_lastCheckStyleSheets[i][checked]){
18+
delete $pfh_lastCheckStyleSheets[i][checked];
1919
}else{
20-
var stylesheet = $lastCheckStyleSheets.splice(i--,1)[0];
20+
var stylesheet = $pfh_lastCheckStyleSheets.splice(i--,1)[0];
2121
dispatchEvent(new CustomEvent("stylesheetremoved",{detail:stylesheet}));
2222
}
2323
}

lib/csssourceinterceptor.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ new (class CSSSourceIntercepter {
66
constructor(){
77

88
if(!self.CSSSourceIntercepter){
9-
self.CSSSourceIntercepter = this;
9+
exportGlobal('CSSSourceIntercepter',this);
1010

1111
let subject = document.createElement("div");
1212

@@ -26,9 +26,9 @@ new (class CSSSourceIntercepter {
2626
styleinterface = styleinterface.prototype;
2727
if(!styleinterface[method])
2828
continue;
29-
if(("native"+ucfirst(method)) in styleinterface)
29+
if(("native"+PFHUtils.ucfirst(method)) in styleinterface)
3030
continue;
31-
Object.defineProperty(styleinterface,"native"+ucfirst(method),{
31+
Object.defineProperty(styleinterface,"native"+PFHUtils.ucfirst(method),{
3232
enumerable: false,
3333
configurable: true,
3434
value: styleinterface[method]
@@ -140,7 +140,7 @@ new (class CSSSourceIntercepter {
140140
for(let stylesheet of Array.from(document.styleSheets))
141141
this.processStyleSheet(stylesheet);
142142

143-
self.CSSSourceIntercepter = this;
143+
exportGlobal('CSSSourceIntercepter',this);
144144
}
145145

146146
processStyle(style){

lib/protocolloadfallbackhandler.js

Lines changed: 14 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,29 @@
1-
if(typeof replaceFetch == 'undefined')
2-
self.replaceFetch = true;
3-
if(typeof replaceXMLHttpRequest == 'undefined')
4-
self.replaceXMLHttpRequest = true;
5-
if(typeof serviceWorkerDoesHandleLoadFallbackHandlers == 'undefined')
6-
self.serviceWorkerDoesHandleLoadFallbackHandlers = false;
7-
if(typeof serviceWorkerPrefix == 'undefined')
8-
self.serviceWorkerPrefix = location.origin + "/proxy/";
9-
if(typeof fallbackProxyAvailable == 'undefined')
10-
self.fallbackProxyAvailable = false;
11-
if(typeof proxybase == 'undefined')
12-
self.proxybase = location.origin + "/proxy/";
131

14-
15-
self.ProtocolLoadFallbackHandlerError = class ProtocolLoadFallbackHandlerError extends Error {
16-
constructor(messageOrError,soft){
17-
super(messageOrError && (messageOrError.message || messageOrError));
18-
if(messageOrError instanceof Error)
19-
Object.setPrototypeOf(this,messageOrError);
20-
this.soft = soft || false;
2+
exportGlobal('ProtocolLoadFallbackHandlerError',
3+
class ProtocolLoadFallbackHandlerError extends Error {
4+
constructor(messageOrError,soft){
5+
super(messageOrError && (messageOrError.message || messageOrError));
6+
if(messageOrError instanceof Error)
7+
Object.setPrototypeOf(this,messageOrError);
8+
this.soft = soft || false;
9+
}
2110
}
22-
};
11+
);
2312

2413
new (class ProtocolLoadFallbackHandler {
2514
constructor(){
26-
if(!self.nativeFetch)
27-
self.nativeFetch = fetch;
28-
if(!self.nativeXMLHttpRequest)
29-
self.nativeXMLHttpRequest = XMLHttpRequest;
15+
exportGlobal('nativeFetch',fetch,true);
16+
exportGlobal('nativeXMLHttpRequest',XMLHttpRequest,true);
3017
if(replaceXMLHttpRequest)
31-
self.XMLHttpRequest = this.XMLHttpRequest;
18+
exportGlobal('XMLHttpRequest',this.XMLHttpRequest);
3219
if(replaceFetch)
33-
self.fetch = (...args)=>this.fetch(...args);
20+
exportGlobal('fetch', (...args)=>this.fetch(...args));
3421
this.handlers = new Map();
3522
if(self.protocolLoadFallbackHandler){
3623
this.handlers = protocolLoadFallbackHandler.handlers;
3724
removeEventListener("error",self.protocolLoadFallbackHandler.$onerror);
3825
}
39-
self.protocolLoadFallbackHandler = this;
26+
exportGlobal('protocolLoadFallbackHandler', this);
4027
this.$onerror = (...args) => this.onerror(...args);
4128
addEventListener("error",this.$onerror,true);
4229
}

lib/sourceinterceptor.js

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,17 @@
11
new (class SourceIntercepter {
22
constructor(){
33
var that = this;
4-
if(!self.nodeTypes){
5-
self.nodeTypes = new Map();
6-
for( let desc of Object.values(Object.getOwnPropertyDescriptors(window)) )
7-
try {
8-
if(desc.value.prototype instanceof Node)
9-
nodeTypes.set(desc.value.name, desc.value);
10-
} catch(e) {}
11-
}
4+
this.nodeTypes = new Map();
5+
for( let desc of Object.values(Object.getOwnPropertyDescriptors(window)) )
6+
try {
7+
if(desc.value.prototype instanceof Node)
8+
this.nodeTypes.set(desc.value.name, desc.value);
9+
} catch(e) {}
1210
var excludeList = [
1311
HTMLAnchorElement,
1412
HTMLAreaElement
1513
];
16-
for(let [name,type] of nodeTypes){
14+
for(let [name,type] of this.nodeTypes){
1715
let hasLoadableKeys = [];
1816
for(let key of ['src','href','srcset'])
1917
if(key in type.prototype)
@@ -48,7 +46,7 @@ new (class SourceIntercepter {
4846
}
4947
});
5048
this.checkDocument(document);
51-
self.sourceIntercepter = this;
49+
exportGlobal('sourceIntercepter', this);
5250
}
5351
control(type){
5452
var that = this;
@@ -77,14 +75,14 @@ new (class SourceIntercepter {
7775
);
7876
}
7977
intercept(obj,key,getter,setter){
80-
var desc = Object.getOwnPropertyDescriptor(obj, 'native'+ucfirst(key))
78+
var desc = Object.getOwnPropertyDescriptor(obj, 'native'+PFHUtils.ucfirst(key))
8179
|| Object.getOwnPropertyDescriptor(obj, key);
8280
if(!desc)
8381
return false;
8482
var tmp = Object.create(desc);
8583
tmp.enumerable = false;
8684
tmp.configurable = true;
87-
Object.defineProperty(obj,'native'+ucfirst(key),desc);
85+
Object.defineProperty(obj,'native'+PFHUtils.ucfirst(key),desc);
8886
delete obj[key];
8987
Object.defineProperty(obj,key,{
9088
enumerable: desc.enumerable,
@@ -187,7 +185,7 @@ new (class SourceIntercepter {
187185
}
188186
getSource(target,key){
189187
if(key){
190-
return target.realSource || target['native'+ucfirst(key)];
188+
return target.realSource || target['native'+PFHUtils.ucfirst(key)];
191189
}else{
192190
return target.realSource || target.nativeSrc || target.nativeHref;
193191
}
@@ -215,7 +213,7 @@ new (class SourceIntercepter {
215213
target.addEventListener("load",this.$onload,true);
216214
target.addEventListener("canplaythrough",this.$onload,true);
217215
target.addEventListener("loadeddata",this.$onready,true);
218-
target['native'+ucfirst(key)] = uri;
216+
target['native'+PFHUtils.ucfirst(key)] = uri;
219217
}
220218
})();
221219

lib/utils.js

Lines changed: 0 additions & 37 deletions
This file was deleted.

0 commit comments

Comments
 (0)