browser-sqlite 1.0.0-rc.3 → 1.0.0-rc.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/NOTICE +56 -0
  2. package/README.md +112 -104
  3. package/dist/LICENSE +21 -0
  4. package/dist/NOTICE +56 -0
  5. package/dist/abandon.d.ts +77 -0
  6. package/dist/api.d.ts +426 -0
  7. package/dist/bulk.d.ts +57 -0
  8. package/dist/capabilities.d.ts +23 -0
  9. package/dist/client.d.ts +221 -0
  10. package/dist/credits.d.ts +31 -0
  11. package/dist/{esm/src/debug.d.ts → debug.d.ts} +21 -10
  12. package/dist/delete.d.ts +48 -0
  13. package/dist/epochs.d.ts +85 -0
  14. package/dist/errors.d.ts +76 -0
  15. package/dist/index.d.ts +8 -0
  16. package/dist/index.js +5 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/inspect.d.ts +96 -0
  19. package/dist/locks.d.ts +172 -0
  20. package/dist/logger.d.ts +24 -0
  21. package/dist/pool.d.ts +191 -0
  22. package/dist/queries.d.ts +65 -0
  23. package/dist/scheduler.d.ts +145 -0
  24. package/dist/sqlite-codes.d.ts +154 -0
  25. package/dist/supervisor.d.ts +17 -0
  26. package/dist/transaction.d.ts +61 -0
  27. package/dist/types.d.ts +642 -0
  28. package/dist/utils.d.ts +156 -0
  29. package/dist/worker/cloneable.d.ts +25 -0
  30. package/dist/worker/probes.d.ts +26 -0
  31. package/dist/worker/sqlite-code.d.ts +9 -0
  32. package/dist/worker/statement-cache.d.ts +36 -0
  33. package/dist/worker/wa-sqlite-async.wasm +0 -0
  34. package/dist/worker/wa-sqlite-jspi.wasm +0 -0
  35. package/dist/worker/wa-sqlite.wasm +0 -0
  36. package/dist/worker/worker.js +11 -0
  37. package/dist/worker/worker.js.map +1 -0
  38. package/package.json +46 -22
  39. package/dist/esm/index.js +0 -424
  40. package/dist/esm/rslib.config.d.ts +0 -2
  41. package/dist/esm/rstest.config.d.ts +0 -2
  42. package/dist/esm/src/client.d.ts +0 -332
  43. package/dist/esm/src/index.d.ts +0 -1
  44. package/dist/esm/src/orchestrator.d.ts +0 -87
  45. package/dist/esm/src/types.d.ts +0 -83
  46. package/dist/esm/src/utils.d.ts +0 -6
  47. /package/dist/{esm/src → worker}/worker.d.ts +0 -0
package/package.json CHANGED
@@ -1,9 +1,15 @@
1
1
  {
2
2
  "name": "browser-sqlite",
3
- "version": "1.0.0-rc.3",
3
+ "version": "1.0.0-rc.5",
4
4
  "description": "Browser SQLite with concurrent read / serial write isolation, backed by Web Workers and wa-sqlite",
5
5
  "author": "LAlex",
6
6
  "license": "MIT",
7
+ "sideEffects": [
8
+ "./dist/worker/worker.js"
9
+ ],
10
+ "engines": {
11
+ "node": ">=18"
12
+ },
7
13
  "repository": {
8
14
  "type": "git",
9
15
  "url": "git+https://github.com/lalexdotcom/browser-sqlite.git"
@@ -24,14 +30,17 @@
24
30
  "type": "module",
25
31
  "exports": {
26
32
  ".": {
27
- "types": "./dist/esm/index.d.ts",
28
- "import": "./dist/esm/index.js",
29
- "default": "./dist/esm/index.js"
30
- }
33
+ "types": "./dist/index.d.ts",
34
+ "import": "./dist/index.js",
35
+ "default": "./dist/index.js"
36
+ },
37
+ "./worker": "./dist/worker/worker.js"
31
38
  },
32
- "types": "./dist/esm/index.d.ts",
39
+ "main": "./dist/index.js",
40
+ "types": "./dist/index.d.ts",
33
41
  "files": [
34
- "dist"
42
+ "dist",
43
+ "NOTICE"
35
44
  ],
36
45
  "scripts": {
37
46
  "build": "rslib build",
@@ -40,22 +49,36 @@
40
49
  "dev": "rslib build --watch",
41
50
  "format": "biome format --write",
42
51
  "prepare": "simple-git-hooks",
43
- "test": "rstest",
52
+ "test": "node scripts/bounded.mjs 900 rstest && node scripts/bounded.mjs 900 rstest --config rstest.firefox.config.ts && node scripts/bounded.mjs 600 rstest --config rstest.isolated.config.ts",
53
+ "test:isolated": "node scripts/bounded.mjs 600 rstest --config rstest.isolated.config.ts",
44
54
  "test:watch": "rstest --watch",
45
55
  "test:unit": "rstest --project unit",
46
- "test:browser": "rstest --project browser"
56
+ "test:browser": "node scripts/bounded.mjs 900 rstest --project 'chromium*' && node scripts/bounded.mjs 900 rstest --config rstest.firefox.config.ts",
57
+ "test:chromium": "node scripts/bounded.mjs 900 rstest --project 'chromium*'",
58
+ "test:firefox": "node scripts/bounded.mjs 900 rstest --config rstest.firefox.config.ts",
59
+ "test:consumer": "node scripts/consumer-smoke.mjs",
60
+ "test:conformance": "node scripts/bounded.mjs 900 rstest --config rstest.conformance.config.ts && node scripts/bounded.mjs 900 rstest --config rstest.conformance.firefox.config.ts",
61
+ "test:conformance:chromium": "node scripts/bounded.mjs 900 rstest --config rstest.conformance.config.ts",
62
+ "test:conformance:firefox": "node scripts/bounded.mjs 900 rstest --config rstest.conformance.firefox.config.ts",
63
+ "test:matrix": "node scripts/test-matrix.mjs",
64
+ "docs:vfs": "node scripts/render-vfs-matrix.ts",
65
+ "bench:build": "pnpm build && node scripts/bench/assemble.mjs _site",
66
+ "bench:serve": "npx --yes kill-port 8099 && pnpm bench:build && node scripts/static-server.mjs _site 8099",
67
+ "bench:dev": "npx --yes kill-port 8099 && node scripts/bench/dev.mjs 8099"
47
68
  },
48
69
  "devDependencies": {
49
- "@biomejs/biome": "2.4.6",
50
- "@rslib/core": "^0.20.0",
51
- "@rstest/adapter-rslib": "^0.2.1",
52
- "@rstest/browser": "0.9.4",
53
- "@rstest/core": "^0.9.0",
70
+ "@biomejs/biome": "2.5.8",
71
+ "@mdn/browser-compat-data": "^8.0.13",
72
+ "@rslib/core": "^0.23.2",
73
+ "@rstest/adapter-rslib": "0.11.8",
74
+ "@rstest/browser": "0.11.8",
75
+ "@rstest/core": "0.11.8",
54
76
  "@types/node": "^24.12.0",
55
77
  "lint-staged": "^16.4.0",
56
- "playwright": "1.58.2",
78
+ "playwright": "1.62.1",
57
79
  "simple-git-hooks": "^2.13.1",
58
- "typescript": "^5.9.3"
80
+ "typescript": "^7.0.2",
81
+ "wa-sqlite": "github:rhashimoto/wa-sqlite#93b9230892a4c440ddbc06936bcd8500e2d6e6cf"
59
82
  },
60
83
  "lint-staged": {
61
84
  "*.{js,ts,jsx,tsx,mjs,cjs}": [
@@ -63,17 +86,18 @@
63
86
  ]
64
87
  },
65
88
  "simple-git-hooks": {
66
- "pre-commit": "npx lint-staged && pnpm test && pnpm exec tsc --noEmit"
89
+ "pre-commit": "pnpm exec tsc --noEmit && npx lint-staged && if [ -f \"$(git rev-parse --git-path MERGE_HEAD)\" ]; then pnpm test; else pnpm test:unit; fi",
90
+ "pre-merge-commit": "pnpm exec tsc --noEmit && pnpm exec biome ci . && pnpm test",
91
+ "pre-push": "pnpm exec tsc --noEmit && pnpm exec biome ci . && pnpm docs:vfs && git diff --exit-code VFS.md && pnpm test"
67
92
  },
68
93
  "pnpm": {
69
94
  "onlyBuiltDependencies": [
70
95
  "simple-git-hooks"
71
- ]
96
+ ],
97
+ "patchedDependencies": {
98
+ "wa-sqlite@1.1.2": "patches/wa-sqlite@1.1.2.patch"
99
+ }
72
100
  },
73
101
  "private": false,
74
- "dependencies": {
75
- "@lalex/promises": "^1.2.0",
76
- "wa-sqlite": "github:rhashimoto/wa-sqlite#v1.0.9"
77
- },
78
102
  "packageManager": "pnpm@10.31.0"
79
103
  }
package/dist/esm/index.js DELETED
@@ -1,424 +0,0 @@
1
- import { defer } from "@lalex/promises";
2
- const FlagsIndexes = {
3
- INIT_LOCK: 0
4
- };
5
- const WorkerLock = {
6
- FREE: 0,
7
- LOCKED: 1
8
- };
9
- const WorkerStatuses = {
10
- EMPTY: -3,
11
- NEW: -2,
12
- INITIALIZING: -1,
13
- INITIALIZED: 0,
14
- READY: 10,
15
- RESERVED: 49,
16
- RUNNING: 50,
17
- ABORTING: 99,
18
- DONE: 100
19
- };
20
- const FLAGS_WORKER_STATUS_OFFSET = Math.max(...Object.values(FlagsIndexes)) + 1;
21
- class WorkerOrchestrator {
22
- sharedArrayBuffer;
23
- flags;
24
- size;
25
- constructor(init){
26
- if ('number' == typeof init) this.sharedArrayBuffer = new SharedArrayBuffer((init + FLAGS_WORKER_STATUS_OFFSET) * Int32Array.BYTES_PER_ELEMENT);
27
- else this.sharedArrayBuffer = init;
28
- this.flags = new Int32Array(this.sharedArrayBuffer);
29
- if ('number' == typeof init) {
30
- this.size = init;
31
- this.flags[FlagsIndexes.INIT_LOCK] = WorkerLock.FREE;
32
- this.flags.fill(WorkerStatuses.EMPTY, FLAGS_WORKER_STATUS_OFFSET);
33
- } else this.size = init.byteLength / Int32Array.BYTES_PER_ELEMENT - FLAGS_WORKER_STATUS_OFFSET;
34
- }
35
- lock() {
36
- while(Atomics.compareExchange(this.flags, FlagsIndexes.INIT_LOCK, WorkerLock.FREE, WorkerLock.LOCKED) !== WorkerLock.FREE)Atomics.wait(this.flags, FlagsIndexes.INIT_LOCK, WorkerLock.LOCKED);
37
- }
38
- unlock() {
39
- if (Atomics.compareExchange(this.flags, FlagsIndexes.INIT_LOCK, WorkerLock.LOCKED, WorkerLock.FREE) === WorkerLock.LOCKED) Atomics.notify(this.flags, FlagsIndexes.INIT_LOCK, 1);
40
- }
41
- setStatus(index, status, from) {
42
- let oldValue;
43
- const workerStatusIndex = index + FLAGS_WORKER_STATUS_OFFSET;
44
- if (void 0 !== from) {
45
- if (Atomics.compareExchange(this.flags, workerStatusIndex, from, status) === from) oldValue = from;
46
- } else {
47
- const oldStatus = Atomics.exchange(this.flags, workerStatusIndex, status);
48
- if (oldStatus !== status) oldValue = oldStatus;
49
- }
50
- const success = void 0 !== oldValue;
51
- return success;
52
- }
53
- getStatus(index) {
54
- return Atomics.load(this.flags, index + FLAGS_WORKER_STATUS_OFFSET);
55
- }
56
- }
57
- const isWriteQuery = (sql)=>/(INSERT|REPLACE|UPDATE|DELETE|CREATE|DROP|PRAGMA|ATTACH|DETACH)\s/gim.test(sql);
58
- const DEFAULT_POOL_SIZE = 2;
59
- let clientCount = 0;
60
- const DEFAULT_VFS = 'OPFSPermutedVFS';
61
- const createSQLiteClient = (file, clientOptions)=>{
62
- const clientIndex = ++clientCount;
63
- const clientPrefix = `${clientOptions?.name ?? 'SQLite'} ${clientIndex}`;
64
- const poolSize = clientOptions?.poolSize ?? DEFAULT_POOL_SIZE;
65
- const pool = [];
66
- const orchestrator = new WorkerOrchestrator(poolSize);
67
- const vfs = clientOptions?.vfs ?? DEFAULT_VFS;
68
- if ('AccessHandlePoolVFS' === vfs && poolSize > 1) throw new Error('AccessHandlePoolVFS does not support pool sizes greater than 1');
69
- const { state: debug, createRequestDebugState, createWorkerDebugState, createQueryDebugState } = {};
70
- const createWorker = ()=>{
71
- const deferredInit = defer();
72
- const workerName = `${clientPrefix} / Worker ${pool.length + 1}`;
73
- const index = pool.push(new Worker(new URL('./worker.ts', import.meta.url), {
74
- name: workerName
75
- })) - 1;
76
- const worker = Object.assign(pool[index], {
77
- index,
78
- available: false
79
- });
80
- const state = createWorkerDebugState?.(index, workerName);
81
- let currentCallId = 0;
82
- let deferredChunk;
83
- worker.onmessage = ({ data })=>{
84
- const { callId, type } = data;
85
- if (0 === callId && 'ready' === type) {
86
- worker.available = true;
87
- if (state) state.initializationTime = Date.now();
88
- deferredInit.resolve(worker);
89
- }
90
- if (deferredChunk && callId === currentCallId) switch(type){
91
- case 'chunk':
92
- if (state?.currentRequest?.currentQuery) state.currentRequest.currentQuery.firstRowTime ??= Date.now();
93
- deferredChunk.resolve(data.data);
94
- deferredChunk = defer();
95
- break;
96
- case 'done':
97
- {
98
- const affected = data.affected;
99
- if (state?.currentRequest?.currentQuery) {
100
- state.currentRequest.currentQuery.affectedRows = affected;
101
- state.currentRequest.affectedRows += affected;
102
- state.currentRequest.currentQuery.endTime = Date.now();
103
- }
104
- deferredChunk.resolve(affected);
105
- deferredChunk = void 0;
106
- break;
107
- }
108
- case 'error':
109
- {
110
- const error = new Error(data.message, {
111
- cause: data.cause
112
- });
113
- if (state?.currentRequest?.currentQuery) {
114
- state.currentRequest.currentQuery.error = error;
115
- state.currentRequest.currentQuery.endTime = Date.now();
116
- }
117
- deferredChunk.reject(error);
118
- deferredChunk = void 0;
119
- break;
120
- }
121
- }
122
- };
123
- const query = async function*(sql, params, options) {
124
- try {
125
- worker.available = false;
126
- if (deferredChunk) {
127
- console.error(`Previous query not finished on worker ${index + 1}`);
128
- throw new Error('Worker is already processing a query');
129
- }
130
- if (state?.currentRequest) {
131
- const queryState = createQueryDebugState?.(index, sql, params);
132
- state.currentRequest.currentQuery = queryState;
133
- }
134
- const { chunkSize = 500, signal } = options ?? {};
135
- const signalAbortHandler = ()=>{
136
- orchestrator.setStatus(index, WorkerStatuses.ABORTING, WorkerStatuses.RUNNING);
137
- };
138
- signal?.addEventListener('abort', signalAbortHandler);
139
- deferredChunk = defer();
140
- worker.postMessage({
141
- type: 'query',
142
- callId: ++currentCallId,
143
- sql,
144
- params,
145
- options: {
146
- chunkSize
147
- }
148
- });
149
- while(deferredChunk){
150
- const chunk = await deferredChunk.promise;
151
- yield chunk;
152
- }
153
- signal?.removeEventListener('abort', signalAbortHandler);
154
- } finally{
155
- deferredChunk = void 0;
156
- worker.available = true;
157
- }
158
- };
159
- Object.assign(worker, {
160
- query
161
- });
162
- worker.postMessage({
163
- callId: 0,
164
- type: 'open',
165
- file,
166
- flags: orchestrator.sharedArrayBuffer,
167
- index,
168
- vfs,
169
- pragmas: clientOptions?.pragmas
170
- });
171
- return deferredInit.promise;
172
- };
173
- const readerRequestQueue = [];
174
- const writerRequestQueue = [];
175
- let currentWriterIndex = -1;
176
- const acquireWorker = (write = false)=>{
177
- if (write && currentWriterIndex > -1) {
178
- const writer = pool[currentWriterIndex];
179
- if (writer.available) return writer;
180
- return;
181
- }
182
- const availableWorker = pool.find((w)=>{
183
- if (w.available) return true;
184
- return false;
185
- });
186
- if (availableWorker && write) currentWriterIndex = availableWorker.index;
187
- return availableWorker;
188
- };
189
- const acquireNextWorker = async (write = false)=>{
190
- const availableWorker = acquireWorker(write);
191
- if (availableWorker) {
192
- availableWorker.available = false;
193
- return availableWorker;
194
- }
195
- const { promise, resolve } = defer();
196
- if (write) {
197
- if (debug) debug.queue.write++;
198
- writerRequestQueue.push((worker)=>{
199
- worker.available = false;
200
- resolve(worker);
201
- });
202
- } else {
203
- if (debug) debug.queue.read++;
204
- readerRequestQueue.push((worker)=>{
205
- worker.available = false;
206
- resolve(worker);
207
- });
208
- }
209
- return promise;
210
- };
211
- const getNextAvailableWorker = async (write = false)=>{
212
- const requestState = createRequestDebugState?.();
213
- const availableWorker = await acquireNextWorker(write);
214
- requestState?.assign(availableWorker.index);
215
- return pool[availableWorker.index];
216
- };
217
- const releaseWorker = (worker)=>{
218
- const requestState = debug?.workers[worker.index]?.currentRequest;
219
- if (requestState) requestState.releaseTime = Date.now();
220
- if (writerRequestQueue.length) {
221
- if (currentWriterIndex === worker.index || -1 === currentWriterIndex) {
222
- if (debug) debug.queue.write--;
223
- writerRequestQueue.shift()?.(worker);
224
- return;
225
- }
226
- }
227
- if (readerRequestQueue.length) {
228
- if (currentWriterIndex === worker.index) currentWriterIndex = -1;
229
- if (debug) debug.queue.read--;
230
- readerRequestQueue.shift()?.(worker);
231
- return;
232
- }
233
- orchestrator.setStatus(worker.index, WorkerStatuses.READY);
234
- };
235
- const readWorker = async (worker, sql, params, options)=>{
236
- const result = [];
237
- for await (const chunk of worker.query(sql, params, options))if ('number' != typeof chunk) result.push(...chunk);
238
- return result;
239
- };
240
- const read = async (sql, params, options)=>{
241
- const worker = await getNextAvailableWorker(isWriteQuery(sql));
242
- try {
243
- return await readWorker(worker, sql, params, options);
244
- } finally{
245
- releaseWorker(worker);
246
- }
247
- };
248
- const streamWorker = async function*(worker, sql, params, options) {
249
- for await (const chunk of worker.query(sql, params, options))if ('number' != typeof chunk) yield chunk;
250
- };
251
- const stream = async function*(sql, params, options) {
252
- const worker = await getNextAvailableWorker(isWriteQuery(sql));
253
- try {
254
- for await (const chunk of streamWorker(worker, sql, params, options))yield chunk;
255
- } finally{
256
- releaseWorker(worker);
257
- }
258
- };
259
- const writeWorker = async (worker, sql, params, options)=>{
260
- const result = [];
261
- let affected = 0;
262
- for await (const chunk of worker.query(sql, params, options))if ('number' != typeof chunk) result.push(...chunk);
263
- else affected = chunk;
264
- return {
265
- result,
266
- affected
267
- };
268
- };
269
- const write = async (sql, params, options)=>{
270
- const worker = await getNextAvailableWorker(isWriteQuery(sql));
271
- try {
272
- return await writeWorker(worker, sql, params, options);
273
- } finally{
274
- releaseWorker(worker);
275
- }
276
- };
277
- const oneWorker = async (worker, sql, params, options)=>{
278
- let result;
279
- const abortController = new AbortController();
280
- for await (const chunk of streamWorker(worker, sql, params, {
281
- ...options,
282
- signal: abortController.signal,
283
- chunkSize: 1
284
- })){
285
- result = chunk[0];
286
- abortController.abort();
287
- break;
288
- }
289
- return result;
290
- };
291
- const one = async (sql, params, options)=>{
292
- const worker = await getNextAvailableWorker(isWriteQuery(sql));
293
- try {
294
- return await oneWorker(worker, sql, params, options);
295
- } finally{
296
- releaseWorker(worker);
297
- }
298
- };
299
- const bulkWrite = (table, keys)=>{
300
- const SQLITE_MAX_VARS = 32766;
301
- const maxBufferSize = Math.floor(SQLITE_MAX_VARS / keys.length);
302
- const buffer = [];
303
- let writePromise = Promise.resolve(0);
304
- const flush = ()=>{
305
- const toInsert = [
306
- ...buffer
307
- ];
308
- buffer.length = 0;
309
- writePromise = writePromise.then((currentAffected)=>write(`INSERT INTO ${table} (${keys.join(',')}) VALUES ${toInsert.map(()=>`(${keys.map(()=>'?')})`)}`, toInsert.flatMap((data)=>keys.map((k)=>data[k]))).then(({ affected: chunkAffected })=>currentAffected + chunkAffected));
310
- };
311
- return {
312
- enqueue: (data)=>{
313
- buffer.push(data);
314
- if (buffer.length >= maxBufferSize) flush();
315
- },
316
- close: ()=>{
317
- if (buffer.length) flush();
318
- return writePromise;
319
- }
320
- };
321
- };
322
- const output = (table, schema, options)=>{
323
- const { enqueue, close } = bulkWrite(table, Object.keys(schema).filter((col)=>'object' != typeof schema[col] || !schema[col].generated));
324
- const normalizedSchema = Object.entries(schema).map(([k, v])=>{
325
- const type = 'string' == typeof v ? v : v.type;
326
- const unique = 'object' == typeof v && !!v.unique;
327
- const notnull = 'object' == typeof v && !!v.required;
328
- const generated = 'object' == typeof v ? v.generated : void 0;
329
- return {
330
- name: k,
331
- type,
332
- unique,
333
- notnull,
334
- generated
335
- };
336
- });
337
- const createTablePromise = write(`
338
- DROP TABLE IF EXISTS ${table}
339
- `).then(async ()=>{
340
- await write(`
341
- CREATE ${options?.temp ? 'TEMPORARY' : ''} TABLE ${table}(
342
- ${normalizedSchema.map(({ name, type, unique, notnull, generated })=>`${name} ${type} ${unique ? 'UNIQUE' : ''} ${notnull ? 'NOT NULL' : ''} ${generated ? `GENERATED ALWAYS AS ${generated}` : ''}`).join(',')}
343
- )
344
- `);
345
- });
346
- return {
347
- enqueue: (data)=>{
348
- createTablePromise.then(()=>enqueue(data));
349
- },
350
- close: ()=>createTablePromise.then(()=>close()).then(async (affected)=>{
351
- if (options?.indexes) for (const index of options.indexes){
352
- const columns = 'string' == typeof index ? [
353
- index
354
- ] : Array.isArray(index) ? index : 'object' == typeof index ? 'column' in index ? [
355
- index.column
356
- ] : index.columns : void 0;
357
- const unique = !Array.isArray(index) && 'object' == typeof index && !!index.unique;
358
- if (columns) await write(`CREATE ${unique ? 'UNIQUE' : ''} INDEX IF NOT EXISTS ${table}_${columns.join('_')}_${unique ? 'U' : 'IDX'} ON ${table}(${columns.join(',')})`);
359
- }
360
- return affected;
361
- })
362
- };
363
- };
364
- const transaction = async (callback, options)=>{
365
- const { readOnly = false, autoCommit = true } = options ?? {};
366
- const worker = await getNextAvailableWorker(!readOnly);
367
- const checksql = (sql)=>{
368
- if (readOnly && isWriteQuery(sql)) throw new Error('Cannot werite in read-only transaction');
369
- return sql;
370
- };
371
- let done = false;
372
- const db = {
373
- read: (sql, ...args)=>readWorker(worker, checksql(sql), ...args),
374
- write: (sql, ...args)=>writeWorker(worker, checksql(sql), ...args),
375
- stream: (sql, ...args)=>streamWorker(worker, checksql(sql), ...args),
376
- one: (sql, ...args)=>oneWorker(worker, checksql(sql), ...args),
377
- commit: async ()=>{
378
- done = true;
379
- await oneWorker(worker, 'COMMIT');
380
- },
381
- rollback: async ()=>{
382
- done = true;
383
- await oneWorker(worker, 'ROLLBACK');
384
- }
385
- };
386
- try {
387
- await db.read('BEGIN');
388
- const result = await callback(db);
389
- if (!done) if (autoCommit) await db.commit();
390
- else await db.rollback();
391
- return result;
392
- } catch (e) {
393
- await db.rollback();
394
- throw e;
395
- } finally{
396
- releaseWorker(worker);
397
- }
398
- };
399
- const close = ()=>{
400
- let worker = pool.shift();
401
- while(void 0 !== worker){
402
- worker.terminate();
403
- worker = pool.shift();
404
- }
405
- };
406
- Promise.all(Array.from({
407
- length: poolSize
408
- }).map(()=>createWorker().then((worker)=>worker))).then((allWorkers)=>{
409
- for (const worker of allWorkers)releaseWorker(worker);
410
- });
411
- const api = {
412
- read,
413
- write,
414
- stream,
415
- one,
416
- transaction,
417
- bulkWrite,
418
- output,
419
- close,
420
- debug
421
- };
422
- return api;
423
- };
424
- export { createSQLiteClient };
@@ -1,2 +0,0 @@
1
- declare const _default: import("@rslib/core").RslibConfig;
2
- export default _default;
@@ -1,2 +0,0 @@
1
- declare const _default: import("@rstest/core").RstestConfig;
2
- export default _default;