-
Notifications
You must be signed in to change notification settings - Fork 0
/
shim.js
84 lines (75 loc) · 3.22 KB
/
shim.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
((toolName)=>{
if(typeof window[toolName] === 'undefined'){
const loaderUtilities = { //This is exactly the same between shim.html and shim.js.
domReady: new Promise((resolve, reject)=>{
if(document.readyState === "loading"){
document.addEventListener('DOMContentLoaded', resolve);
}
else{
resolve();
} // add error handler?
}),
origin: (uri)=>{
const parser = window.document.createElement('a');
parser.href = uri;
return `${parser.protocol}//${parser.host}`;
},
loadTool: (uri)=>{
return new Promise((resolve, reject)=>{
const tag = window.document.createElement('iframe');
tag.src = uri;
tag.width = 0;
tag.height = 0;
tag.style = "visibility: hidden";
window.addEventListener("message",
(e)=>{
if(e.origin == loaderUtilities.origin(uri)){ //is it possible to refine the origin check?
resolve(e.data);
}
},
false);
loaderUtilities.domReady.then(()=>{
document.body.appendChild(tag);
});
}); // add error handler?
},
requestOverPort: (port, resource)=>{
return new Promise((resolve, reject)=>{
const disposableChannel = new MessageChannel();
disposableChannel.port1.onmessage = (e)=>{
resolve(e.data);
disposableChannel.port1.close();
};
port.postMessage(
{
resource: resource,
port: disposableChannel.port2
},
[disposableChannel.port2]);
});
},
};
const defaultClient = document.currentScript.getAttribute("data-default") || '';
const gotClientPort = loaderUtilities.loadTool(`https://dhmnmivhwb1gk.cloudfront.net/dev/shim.html#${defaultClient}`);
window[toolName] = {
fetch: (request)=>{
return gotClientPort
.then((clientPort)=>{
return loaderUtilities.requestOverPort(
clientPort,
{
url: request.url,
method: request.method
});
})
.then((receipt)=>{
return window.fetch(
request,
{
headers: new Headers({ 'Receipts-Receipt': receipt }),
});
});
}
}
}
})(document.currentScript.getAttribute("data-name") || "FOTR")