Skip to content

Commit 35cb0ae

Browse files
committed
More robust error handling.
1 parent 43cfd09 commit 35cb0ae

File tree

3 files changed

+48
-26
lines changed

3 files changed

+48
-26
lines changed

packages/wa-sqlite-driver/src/pool.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,14 @@ import { WorkerDriverConnection } from './worker_threads';
1111

1212
export function waSqliteWorkerPool(path: string): SqliteDriverConnectionPool {
1313
return new LazyConnectionPool(async () => {
14-
return new WorkerDriverConnection(
14+
const connection = new WorkerDriverConnection(
1515
new Worker(new URL('./wa-sqlite-worker.js', import.meta.url), {
1616
type: 'module'
1717
}),
1818
{ path }
1919
);
20+
await connection.open();
21+
return connection;
2022
// return await WaSqliteConnection.open(path);
2123
});
2224
}

packages/wa-sqlite-driver/src/worker_threads/setup.ts

Lines changed: 35 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ export function setupDriverWorker(config: WorkerDriverConfig) {
1919

2020
export function setupDriverPort(config: WorkerDriverConfig) {
2121
let db: WorkerDriver | null = null;
22-
let opened = new Deferred<void>();
22+
let opened: Promise<void> | undefined = undefined;
2323
const port = {
2424
postMessage: self.postMessage.bind(self)
2525
};
@@ -30,47 +30,60 @@ export function setupDriverPort(config: WorkerDriverConfig) {
3030
console.log('received', message, id, args);
3131

3232
if (message == 'open') {
33+
const open = new Deferred<void>();
34+
opened = open.promise;
3335
try {
3436
const connection = await config.openConnection(
3537
args as WorkerDriverConnectionOptions
3638
);
3739
db = new WorkerConnectionAdapter(connection);
3840
port.postMessage({ id });
39-
opened.resolve();
41+
open.resolve();
4042
} catch (e: any) {
41-
opened.reject(e);
43+
open.reject(e);
4244
port.postMessage({ id, value: { error: { message: e.message } } });
4345
}
4446
} else if (message == 'close') {
4547
try {
46-
await opened.promise;
48+
await opened;
4749
await db?.close();
4850
port.postMessage({ id });
4951
} catch (e: any) {
5052
port.postMessage({ id, value: { error: { message: e.message } } });
5153
}
5254
} else if (message == 'execute') {
53-
await opened.promise;
54-
const commands = args;
55+
try {
56+
await opened;
57+
const commands = args;
5558

56-
const results = (await db!.execute(commands)).map((r) => {
57-
if (isErrorResponse(r)) {
58-
const error = r.error;
59-
return {
59+
const results = (await db!.execute(commands)).map((r) => {
60+
if (isErrorResponse(r)) {
61+
const error = r.error;
62+
return {
63+
error: {
64+
code: error.code,
65+
message: error.message,
66+
stack: error.stack
67+
}
68+
};
69+
} else {
70+
return r;
71+
}
72+
});
73+
port.postMessage({
74+
id,
75+
value: results
76+
});
77+
} catch (e) {
78+
port.postMessage({
79+
id,
80+
value: args.map((c) => ({
6081
error: {
61-
code: error.code,
62-
message: error.message,
63-
stack: error.stack
82+
message: e.message
6483
}
65-
};
66-
} else {
67-
return r;
68-
}
69-
});
70-
port.postMessage({
71-
id,
72-
value: results
73-
});
84+
}))
85+
});
86+
}
7487
} else {
7588
throw new Error(`Unknown message: ${message}`);
7689
}

packages/wa-sqlite-driver/src/worker_threads/worker-driver.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,13 @@ export class WorkerDriverConnection implements SqliteDriverConnection {
3838
private ready: Promise<void>;
3939
private closing = false;
4040
private nextId = 1;
41+
private options: WorkerDriverConnectionOptions;
4142

4243
buffer: CommandQueueItem[] = [];
4344

4445
constructor(worker: Worker, options: WorkerDriverConnectionOptions) {
4546
this.worker = worker;
47+
this.options = options;
4648
worker.addEventListener('error', (err) => {
4749
console.error('worker error', err.message, err);
4850
});
@@ -62,10 +64,13 @@ export class WorkerDriverConnection implements SqliteDriverConnection {
6264
callback(value);
6365
});
6466
});
65-
this.post('open', options);
6667
this.worker = worker;
6768
}
6869

70+
open() {
71+
return this.post('open', this.options);
72+
}
73+
6974
prepare(sql: string, options?: PrepareOptions): WorkerDriverStatement {
7075
const id = this.nextId++;
7176
this.buffer.push({
@@ -125,7 +130,7 @@ export class WorkerDriverConnection implements SqliteDriverConnection {
125130
error: new SqliteError(error)
126131
} as any;
127132
}
128-
return p;
133+
return result;
129134
}
130135

131136
async close() {
@@ -153,7 +158,9 @@ export class WorkerDriverConnection implements SqliteDriverConnection {
153158
for (let i = 0; i < commands.length; i++) {
154159
const c = commands[i];
155160
const rr = r[i];
156-
if (isErrorResponse(rr)) {
161+
if (rr == null) {
162+
c.reject?.({ message: 'no result received', code: '' });
163+
} else if (isErrorResponse(rr)) {
157164
c.reject?.(rr.error);
158165
} else if (c.resolve) {
159166
c.resolve!(rr.value);

0 commit comments

Comments
 (0)