Skip to content

Commit eb7f364

Browse files
committed
message bus
1 parent cb5e394 commit eb7f364

File tree

4 files changed

+108
-15
lines changed

4 files changed

+108
-15
lines changed

src/lib/sqlite/loadWorker.ts

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
1-
import { WorkerMessageTypes, type WorkerMessage } from './types';
1+
import { initMsgBus, sendMsgToWorker } from './messageBus';
2+
import { WorkerMessageTypes } from './types';
23

34
const workerImp = await import('./worker/worker.ts?worker');
45

5-
export default function initWorker() {
6+
export default async function initWorker() {
67
const worker = new workerImp.default();
8+
initMsgBus(worker);
79

8-
const msg: WorkerMessage = { type: WorkerMessageTypes.INIT_DB };
9-
console.log(`Sending message to worker:`, msg);
10-
worker.postMessage(msg);
11-
12-
worker.addEventListener('message', async ({ data }: { data: WorkerMessage }) => {
13-
console.log('Received message from worker:', data.type);
10+
const res = await sendMsgToWorker({
11+
storageId: 'db',
12+
type: WorkerMessageTypes.INIT_DB,
13+
expectedType: WorkerMessageTypes.INIT_DB_RESPONSE,
14+
data: undefined
1415
});
16+
17+
console.log('Init worker response:', res);
1518
}

src/lib/sqlite/messageBus.ts

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
import type { WorkerMessage, WorkerMessageBase, WorkerMessageTypes } from './types';
2+
3+
export type WorkerMsgCb = (data: WorkerMessage<unknown>) => unknown;
4+
const cbMap = new Map<string, WorkerMsgCb>();
5+
6+
let worker: Worker;
7+
8+
const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
9+
10+
function randomId() {
11+
let result = '';
12+
for (let i = 0; i < 10; i++) {
13+
result += characters.charAt(Math.floor(Math.random() * characters.length));
14+
}
15+
return result;
16+
}
17+
18+
/**
19+
* Initialize event listener for messages from worker
20+
*
21+
*/
22+
export function initMsgBus(_worker: Worker) {
23+
worker = _worker;
24+
25+
worker.addEventListener('message', ({ data }: { data: WorkerMessage<unknown> }) => {
26+
console.log(`Message received from Worker: ${data.messageId} - ${data.type}`, data.data);
27+
28+
if (cbMap.has(data.messageId)) {
29+
const cb = cbMap.get(data.messageId) as WorkerMsgCb;
30+
cbMap.delete(data.messageId);
31+
cb(data);
32+
} else {
33+
console.error(`Could not find callback for message type: ${data.messageId} - ${data.type}`);
34+
}
35+
});
36+
}
37+
38+
function addCallback({ messageId, cb }: { messageId: string; cb: WorkerMsgCb }) {
39+
cbMap.set(messageId, cb);
40+
}
41+
42+
export function sendMsgToWorker({
43+
storageId,
44+
type,
45+
data,
46+
expectedType
47+
}: {
48+
storageId: string;
49+
type: WorkerMessageTypes;
50+
data: unknown;
51+
expectedType?: WorkerMessageTypes;
52+
}): Promise<WorkerMessage<unknown>> {
53+
return new Promise((resolve, reject) => {
54+
const messageId = `${storageId}-${randomId()}`;
55+
56+
const cb = (data: WorkerMessage<unknown>) => {
57+
if (expectedType && data.type !== expectedType) {
58+
const reason = `Excpected message type ${expectedType} but got: ${data.type}. MessageId: ${messageId}`;
59+
console.error(reason);
60+
reject(reason);
61+
}
62+
63+
resolve(data);
64+
};
65+
66+
addCallback({
67+
messageId,
68+
cb
69+
});
70+
71+
const msgData: WorkerMessageBase = { messageId, storageId, type };
72+
if (typeof data == 'object') {
73+
Object.assign(msgData, data);
74+
}
75+
76+
worker.postMessage(msgData);
77+
});
78+
}

src/lib/sqlite/types.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@ export enum WorkerMessageTypes {
33
INIT_DB_RESPONSE
44
}
55

6-
export type WorkerMessage = {
6+
export type WorkerMessageBase = {
7+
messageId: string;
78
type: WorkerMessageTypes;
9+
storageId: string;
810
};
11+
12+
export type WorkerMessage<T> = { data: T } & WorkerMessageBase;

src/lib/sqlite/worker/worker.ts

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,29 @@ import { initDb } from './initDb';
44

55
console.log('worker loaded');
66

7+
function sendMsgToMain(obj: WorkerMessage<unknown>) {
8+
postMessage(obj);
9+
}
10+
711
(async function () {
8-
addEventListener('message', async function ({ data }: { data: WorkerMessage }) {
12+
addEventListener('message', async function ({ data }: { data: WorkerMessage<unknown> }) {
913
console.log('worker received message:', data.type);
1014

11-
let res: WorkerMessage;
12-
1315
switch (data.type) {
1416
case WorkerMessageTypes.INIT_DB:
1517
await import('../jswasm/sqlite3.mjs');
1618

1719
const initRes = await initDb();
1820
console.log('worker initDb result:', initRes);
19-
res = { type: WorkerMessageTypes.INIT_DB_RESPONSE };
20-
console.log('worker sending message back to main:', res);
21-
this.postMessage(res);
21+
22+
const initResult: WorkerMessage<undefined> = {
23+
type: WorkerMessageTypes.INIT_DB_RESPONSE,
24+
messageId: data.messageId,
25+
storageId: data.storageId,
26+
data: undefined
27+
};
28+
sendMsgToMain(initResult);
29+
2230
break;
2331

2432
default:

0 commit comments

Comments
 (0)