-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.html
114 lines (105 loc) · 3.37 KB
/
index.html
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
</head>
<body>
<div id="log"></div>
<output id="error" style="color: red;"></output>
<output id="result"></output>
<script>
function onError(e) {
document.getElementById('error').textContent = [
'ERROR: Line ', e.lineno, ' in ', e.filename, ': ', e.message
].join('');
}
function onMsg(e) {
document.getElementById('result').textContent = e.data;
}
if ('serviceWorker' in navigator) {
// TODO
navigator.serviceWorker.register("/sw.js")
.then(function(reg) {
console.log('Registration succeeded. Scope is ' + reg.scope);
if(reg.installing) {
console.log('Service worker installing');
} else if(reg.waiting) {
console.log('Service worker installed');
} else if(reg.active) {
console.log('Service worker active');
}
// reg.update(); // for development
console.log("sending msg to serviceworker");
const {port, answer} = msgToSw({filename: "test.txt", size: 10000000000});
answer.then(data => {
const url = data.downloadLink;
console.log(url);
let link = document.createElement('a');
let click = new MouseEvent('click');
link.href = url;
link.dispatchEvent(click);
setTimeout(() => sendData(port), 1000);
/*
const a = document.createElement('a');
a.href = url;
document.body.appendChild(a);
a.click();
setTimeout(() => sendData(port), 5000);
*/
});
}).catch(function(error) {
console.log('Registration failed with ' + error);
});
} else {
onError("ServiceWorkers are not supported");
}
function msgToSw(msg) {
const channel = new MessageChannel();
return {
port: channel.port1,
answer: new Promise((resolve, reject) => {
channel.port1.onmessage = function(event) {
if (event.data === undefined) {
reject('bad response from serviceWorker');
} else if (event.data.error !== undefined) {
reject(event.data.error);
} else {
// channel.port1.onmessage = undefined;
resolve(event.data);
}
};
channel.port1.onmessageerror = () => {
console.log("received onmessageerror");
};
navigator.serviceWorker.ready.then(reg => {
reg.active.postMessage(msg, [channel.port2]);
});
})
};
}
async function sendData(port) {
console.log("sending data");
for (var i=0; i<100; i++) {
// On Firefox the sw gets terminated without regular pokes at its interface
navigator.serviceWorker.controller.postMessage("ping");
let data = new Uint8Array(100000000);
data[0] = i;
await new Promise((resolve, reject) => {
port.onmessage = event => {
console.log(event.data);
if (event.data.enqueued) {
resolve();
port.onmessage = undefined;
} else {
reject();
}
};
port.postMessage({data: data.buffer}, [data.buffer]);
});
}
port.postMessage("end");
port.close();
}
</script>
</body>
</html>