Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
titaniumnetwork-dev
GitHub Repository: titaniumnetwork-dev/Ultraviolet
Path: blob/main/src/client/worker.js
304 views
1
import EventEmitter from "events";
2
import HookEvent from "./hook.js";
3
import { BareMuxConnection } from "@mercuryworkshop/bare-mux";
4
5
/**
6
* @typedef {import('./index').default} UVClient
7
*/
8
9
class Workers extends EventEmitter {
10
/**
11
*
12
* @param {UVClient} ctx
13
*/
14
constructor(ctx) {
15
super();
16
this.ctx = ctx;
17
this.window = ctx.window;
18
this.Worker = this.window.Worker || {};
19
this.Worklet = this.window.Worklet || {};
20
this.workletProto = this.Worklet.prototype || {};
21
this.workerProto = this.Worker.prototype || {};
22
this.postMessage = this.workerProto.postMessage;
23
this.terminate = this.workerProto.terminate;
24
this.addModule = this.workletProto.addModule;
25
}
26
overrideWorker() {
27
this.ctx.override(
28
this.window,
29
"Worker",
30
(target, that, args) => {
31
if (!args.length) return new target(...args);
32
let [url, options = {}] = args;
33
34
const event = new HookEvent({ url, options }, target, that);
35
this.emit("worker", event);
36
37
if (event.intercepted) return event.returnValue;
38
const worker = new event.target(
39
...[event.data.url, event.data.options]
40
);
41
42
const conn = new BareMuxConnection();
43
(async () => {
44
const port = await conn.getInnerPort();
45
worker.postMessage(
46
{
47
__uv$type: "baremuxinit",
48
port,
49
},
50
[port]
51
);
52
})();
53
54
return worker;
55
},
56
true
57
);
58
}
59
overrideAddModule() {
60
this.ctx.override(this.workletProto, "addModule", (target, that, args) => {
61
if (!args.length) return target.apply(that, args);
62
let [url, options = {}] = args;
63
64
const event = new HookEvent({ url, options }, target, that);
65
this.emit("addModule", event);
66
67
if (event.intercepted) return event.returnValue;
68
return event.target.call(event.that, event.data.url, event.data.options);
69
});
70
}
71
overridePostMessage() {
72
this.ctx.override(this.workerProto, "postMessage", (target, that, args) => {
73
if (!args.length) return target.apply(that, args);
74
let [message, transfer = []] = args;
75
76
const event = new HookEvent({ message, transfer }, target, that);
77
this.emit("postMessage", event);
78
79
if (event.intercepted) return event.returnValue;
80
return event.target.call(
81
event.that,
82
event.data.message,
83
event.data.transfer
84
);
85
});
86
}
87
overrideImportScripts() {
88
this.ctx.override(this.window, "importScripts", (target, that, scripts) => {
89
if (!scripts.length) return target.apply(that, scripts);
90
91
const event = new HookEvent({ scripts }, target, that);
92
this.emit("importScripts", event);
93
94
if (event.intercepted) return event.returnValue;
95
return event.target.apply(event.that, event.data.scripts);
96
});
97
}
98
}
99
100
export default Workers;
101
102