/
transferableStream.js
60 lines (60 loc) · 1.61 KB
/
transferableStream.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
onload = () => {
const { readable, writable } = new TransformStream({
transform(value, controller) {
controller.enqueue(value);
},
flush() {
console.log('Flush.');
},
});
const writer = writable.getWriter();
const id = 'capture_system_audio';
const port = chrome.runtime.connectNative(id);
port.name = id;
async function handleMessage(value, port) {
if (!Array.isArray(value)) {
value = JSON.parse(value);
}
try {
await writer.ready;
await writer.write(new Uint8Array(value));
} catch (e) {
console.error(e.message);
}
return true;
}
port.onDisconnect.addListener(async (e) => {
console.log(e.message);
await chrome.storage.local.clear();
});
port.onMessage.addListener(handleMessage);
onmessage = async (e) => {
const { type, message } = e.data;
if (type === 'start') {
port.postMessage(message);
parent.postMessage(readable, name, [readable]);
}
if (type === 'stop') {
try {
port.disconnect(id);
console.log(writer.desiredSize, message);
while (writer.desiredSize <= 1) {
await scheduler.postTask(() => {});
if (writer.desiredSize === 1) {
console.log('writable', writer.desiredSize);
break;
}
}
await writer.close();
await writer.closed;
console.log(writer.desiredSize);
parent.postMessage(0, name);
onmessage = null;
await chrome.storage.local.clear();
} catch (err) {
console.error(err.message);
}
}
};
parent.postMessage(1, name);
};