Skip to content

Commit 611ad1c

Browse files
committed
feat(dialect-sqlite-worker): function to create custom OnMessageCallback in worker
1 parent 465419b commit 611ad1c

File tree

6 files changed

+101
-58
lines changed

6 files changed

+101
-58
lines changed

packages/dialect-sqlite-worker/README.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,30 @@ the type is also availiable for [`better-sqlite3-multiple-ciphers`](https://gith
1010
pnpm add kysely kysely-sqlite-worker better-sqlite3
1111
```
1212

13+
## Usage
14+
15+
```ts
16+
import { SqliteWorkerDialect } from 'kysely-sqlite-worker'
17+
18+
const dialect = new SqliteWorkerDialect({
19+
source: ':memory:',
20+
})
21+
```
22+
23+
### Custom Worker
24+
25+
in `worker.ts`
26+
27+
```ts
28+
import { createOnMessageCallback } from 'kysely-sqlite-worker'
29+
30+
createOnMessageCallback(
31+
async (db) => {
32+
db.loadExtension(/* ... */)
33+
}
34+
)
35+
```
36+
1337
## Config
1438

1539
```ts

packages/dialect-sqlite-worker/src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import type { SqliteWorkerDialectConfig } from './type'
33
import { SqliteAdapter, SqliteIntrospector, SqliteQueryCompiler } from 'kysely'
44
import { SqliteWorkerDriver } from './driver'
55

6+
export { createOnMessageCallback } from './worker/util'
7+
68
export class SqliteWorkerDialect implements Dialect {
79
/**
810
* dialect for better-sqlite, execute sql in `node:worker_threads`

packages/dialect-sqlite-worker/src/worker.ts

Lines changed: 0 additions & 54 deletions
This file was deleted.
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { createOnMessageCallback } from './util'
2+
3+
createOnMessageCallback()
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
import type { MainMsg, WorkerMsg } from '../type'
2+
import { parentPort, workerData } from 'node:worker_threads'
3+
import Database from 'better-sqlite3'
4+
5+
/**
6+
* Handle worker message, support custom callback on initialization
7+
* @example
8+
* // worker.ts
9+
* import { createOnMessageCallback } from 'kysely-sqlite-worker'
10+
*
11+
* createOnMessageCallback(
12+
* async (db) => {
13+
* db.loadExtension(...)
14+
* }
15+
* )
16+
*/
17+
export function createOnMessageCallback(onInit?: (db: typeof Database) => void): void {
18+
if (!parentPort) {
19+
throw new Error('Must be run in a worker thread')
20+
}
21+
22+
const { src, option } = workerData
23+
const db = new Database(src, option)
24+
onInit?.(db as any)
25+
parentPort.on('message', ([msg, data1, data2]: MainMsg) => {
26+
const ret: WorkerMsg = [
27+
msg,
28+
null,
29+
null,
30+
]
31+
32+
try {
33+
switch (msg) {
34+
case '0': {
35+
const stmt = db.prepare(data1)
36+
if (stmt.reader) {
37+
ret[1] = {
38+
rows: stmt.all(data2),
39+
}
40+
} else {
41+
const { changes, lastInsertRowid } = stmt.run(data2)
42+
ret[1] = {
43+
rows: [],
44+
numAffectedRows: BigInt(changes),
45+
insertId: BigInt(lastInsertRowid),
46+
}
47+
}
48+
break
49+
}
50+
case '1':
51+
db.close()
52+
break
53+
case '2': {
54+
const stmt = db.prepare(data1)
55+
const iter = stmt.iterate(data2)
56+
for (const row of iter) {
57+
parentPort!.postMessage([msg, [row as any], null] satisfies WorkerMsg)
58+
}
59+
ret[0] = '3'
60+
break
61+
}
62+
}
63+
} catch (error) {
64+
ret[2] = error
65+
}
66+
parentPort!.postMessage(ret)
67+
})
68+
}

packages/dialect-sqlite-worker/tsup.config.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ import { defineConfig } from 'tsup'
22

33
export default defineConfig([
44
{
5-
entry: [
6-
'src/index.ts',
7-
'src/worker.ts',
8-
],
5+
entry: {
6+
index: 'src/index.ts',
7+
worker: 'src/worker.ts',
8+
},
99
clean: true,
1010
format: ['cjs', 'esm'],
1111
shims: true,

0 commit comments

Comments
 (0)