Skip to content

Commit d5fef5f

Browse files
authored
feat(webworker): support onConnect for webworker (#4)
1 parent 8864e42 commit d5fef5f

File tree

3 files changed

+94
-6
lines changed

3 files changed

+94
-6
lines changed

examples/webworker/src/index.ts

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ import { Worker, Main } from './interface';
33

44
class MainTransport
55
extends WorkerTransport.Main<{ emit: Main }>
6-
implements Worker {
6+
implements Worker
7+
{
78
async help() {
89
const response = await this.emit('help', { text: 'SOS!!!' });
910
return response;
@@ -21,13 +22,19 @@ class MainTransport
2122

2223
const worker = new Worker('worker.bundle.js');
2324

24-
(window as any).mainTransport = new MainTransport({
25-
worker,
26-
});
27-
2825
document.getElementById('btn')?.addEventListener('click', async () => {
2926
const response = await (window as any).mainTransport.help();
3027
const div = document.createElement('div');
3128
div.innerText = `${new Date()}: ${JSON.stringify(response)}`;
3229
document.body.appendChild(div);
3330
});
31+
32+
// mock async init worker
33+
setTimeout(() => {
34+
(window as any).mainTransport = new MainTransport({
35+
worker,
36+
});
37+
(window as any).mainTransport.onConnect(() => {
38+
console.log('connected');
39+
});
40+
}, 1000);

examples/webworker/src/worker.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,11 @@ class WebWorkerTransport
1818
}
1919
}
2020

21-
(self as any).webWorkerTransport = new WebWorkerTransport();
21+
// mock async init worker
22+
setTimeout(() => {
23+
(self as any).webWorkerTransport = new WebWorkerTransport();
24+
25+
(self as any).webWorkerTransport.onConnect(() => {
26+
console.log('connected');
27+
});
28+
}, 2000);

src/transports/workerTransport.ts

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ import { Transport } from '../transport';
1010
// workaround: `tsc --skipLibCheck`.
1111
declare var self: WorkerGlobalScope;
1212

13+
type ClientCallback = () => void | Promise<void>;
14+
15+
const connectEventName = 'worker-connect';
16+
1317
export interface WorkerMainTransportOptions
1418
extends Partial<TransportOptions<TransferableWorker>> {
1519
/**
@@ -50,6 +54,41 @@ export abstract class WorkerMainTransport<
5054
listener,
5155
sender,
5256
});
57+
58+
this.emit({
59+
// @ts-ignore
60+
name: connectEventName,
61+
respond: true,
62+
silent: true,
63+
}).then(this._handleConnectCallbacks);
64+
65+
// @ts-ignore
66+
this.listen(connectEventName, this._handleConnectCallbacks);
67+
}
68+
69+
private _connected = false;
70+
71+
private _handleConnectCallbacks = async () => {
72+
if (this._connected) {
73+
return;
74+
}
75+
this._connected = true;
76+
this._onConnectCallback.forEach((callback) => {
77+
callback();
78+
});
79+
this._onConnectCallback.clear();
80+
};
81+
82+
private _onConnectCallback = new Set<ClientCallback>();
83+
84+
onConnect(callback: ClientCallback) {
85+
if (this._connected) {
86+
return callback();
87+
}
88+
this._onConnectCallback.add(callback);
89+
return () => {
90+
this._onConnectCallback.delete(callback);
91+
};
5392
}
5493
}
5594

@@ -79,6 +118,41 @@ export abstract class WorkerInternalTransport<
79118
listener,
80119
sender,
81120
});
121+
122+
this.emit({
123+
// @ts-ignore
124+
name: connectEventName,
125+
respond: true,
126+
silent: true,
127+
}).then(this._handleConnectCallbacks);
128+
129+
// @ts-ignore
130+
this.listen(connectEventName, this._handleConnectCallbacks);
131+
}
132+
133+
private _handleConnectCallbacks = async () => {
134+
if (this._connected) {
135+
return;
136+
}
137+
this._connected = true;
138+
this._onConnectCallback.forEach((callback) => {
139+
callback();
140+
});
141+
this._onConnectCallback.clear();
142+
};
143+
144+
private _connected = false;
145+
146+
private _onConnectCallback = new Set<ClientCallback>();
147+
148+
onConnect(callback: ClientCallback) {
149+
if (this._connected) {
150+
return callback();
151+
}
152+
this._onConnectCallback.add(callback);
153+
return () => {
154+
this._onConnectCallback.delete(callback);
155+
};
82156
}
83157
}
84158

0 commit comments

Comments
 (0)