Skip to content

Commit fd4ba78

Browse files
committed
fix: fixed worker1Promiser types, replaced interfaces with types, added stricter tsconfig options, updated worker1Promiser example
1 parent d288f5e commit fd4ba78

7 files changed

Lines changed: 273 additions & 251 deletions

File tree

README.md

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,11 @@ storage back-end.
4949
>
5050
> `Cross-Origin-Embedder-Policy: require-corp`
5151
52-
```js
53-
import { sqlite3Worker1Promiser } from '@sqlite.org/sqlite-wasm';
52+
```ts
53+
import {
54+
sqlite3Worker1Promiser,
55+
type Worker1Promiser,
56+
} from '@sqlite.org/sqlite-wasm';
5457

5558
const log = console.log;
5659
const error = console.error;
@@ -59,15 +62,15 @@ const initializeSQLite = async () => {
5962
try {
6063
log('Loading and initializing SQLite3 module...');
6164

62-
const promiser = await new Promise((resolve) => {
63-
const _promiser = sqlite3Worker1Promiser({
64-
onready: () => resolve(_promiser),
65+
const promiser = await new Promise<Worker1Promiser>((resolve) => {
66+
sqlite3Worker1Promiser({
67+
onready: resolve,
6568
});
6669
});
6770

6871
log('Done initializing. Running demo...');
6972

70-
const configResponse = await promiser('config-get', {});
73+
const configResponse = await promiser('config-get');
7174
log('Running SQLite3 version', configResponse.result.version.libVersion);
7275

7376
const openResponse = await promiser('open', {
@@ -87,9 +90,13 @@ const initializeSQLite = async () => {
8790
}
8891
};
8992

90-
initializeSQLite();
93+
await initializeSQLite();
9194
```
9295

96+
For `config-get`, `promiser('config-get')` is the preferred form. For backward
97+
compatibility, `promiser('config-get', undefined)` and
98+
`promiser('config-get', {})` are also supported.
99+
93100
The `promiser` object above implements the
94101
[Worker1 API](https://sqlite.org/wasm/doc/trunk/api-worker1.md#worker1-methods).
95102

package-lock.json

Lines changed: 177 additions & 169 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,17 +64,17 @@
6464
},
6565
"devDependencies": {
6666
"@types/node": "^25.4.0",
67-
"@typescript/native-preview": "^7.0.0-dev.20260309.1",
67+
"@typescript/native-preview": "^7.0.0-dev.20260312.1",
6868
"@vitest/browser": "^4.0.18",
6969
"@vitest/browser-playwright": "^4.0.18",
7070
"happy-dom": "^20.8.3",
7171
"http-server": "github:vapier/http-server",
72-
"lefthook": "2.1.3",
72+
"lefthook": "2.1.4",
7373
"playwright": "^1.58.2",
7474
"prettier": "^3.8.1",
7575
"prettier-plugin-jsdoc": "^1.8.0",
7676
"publint": "^0.3.18",
77-
"tsdown": "^0.21.1",
77+
"tsdown": "^0.21.2",
7878
"typescript": "^5.9.3",
7979
"vitest": "^4.0.18"
8080
}

src/index.d.ts

Lines changed: 56 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1573,7 +1573,7 @@ export type WasmPointer = number;
15731573
export type NullPointer = 0 | null | undefined;
15741574

15751575
/** Common envelope for all Worker API #1 messages. */
1576-
interface Worker1MessageBusEnvelope {
1576+
type Worker1MessageBusEnvelope = {
15771577
/** One of: 'open', 'close', 'exec', 'export', 'config-get' */
15781578
type: string;
15791579

@@ -1589,33 +1589,33 @@ interface Worker1MessageBusEnvelope {
15891589
* used.
15901590
*/
15911591
dbId?: string;
1592-
}
1592+
};
15931593

15941594
/** Worker API #1 input message envelope. */
1595-
interface Worker1InputEnvelope<
1595+
type Worker1InputEnvelope<
15961596
T extends string,
15971597
Args = unknown,
1598-
> extends Worker1MessageBusEnvelope {
1598+
> = Worker1MessageBusEnvelope & {
15991599
type: T;
16001600
args?: Args;
16011601
/** Timestamp set by the promiser before posting a message. */
16021602
departureTime?: number;
1603-
}
1603+
};
16041604

16051605
/** Worker API #1 output message envelope. */
1606-
interface Worker1OutputEnvelope<
1606+
type Worker1OutputEnvelope<
16071607
T extends string,
16081608
Result = unknown,
1609-
> extends Worker1MessageBusEnvelope {
1609+
> = Worker1MessageBusEnvelope & {
16101610
type: T;
16111611
result: Result;
1612-
}
1612+
};
16131613

16141614
/**
16151615
* Worker API #1 per-row callback payload for promiser `exec()` callback
16161616
* functions.
16171617
*/
1618-
interface Worker1ExecRowMessage {
1618+
type Worker1ExecRowMessage = {
16191619
/** Internally synthesized callback message type. */
16201620
type: `${string}:row`;
16211621
/** Current row value in the shape implied by `rowMode`. */
@@ -1624,7 +1624,7 @@ interface Worker1ExecRowMessage {
16241624
rowNumber: number | null;
16251625
/** Column names populated when requested by options. */
16261626
columnNames?: string[];
1627-
}
1627+
};
16281628

16291629
/** Worker API #1 exec options accepted by the promiser wrapper. */
16301630
type Worker1ExecArgs = Omit<ExecOptions, 'callback'> & {
@@ -1635,36 +1635,16 @@ type Worker1ExecArgs = Omit<ExecOptions, 'callback'> & {
16351635
callback?: (row: Worker1ExecRowMessage) => void;
16361636
};
16371637

1638-
/** Worker API #1 error response result. */
1639-
interface Worker1ErrorResult {
1640-
/** Type of the triggering operation: 'open', 'close', ... */
1641-
operation: string;
1642-
/** Error message text */
1643-
message: string;
1644-
/** The ErrorClass.name property from the thrown exception. */
1645-
errorClass: string;
1646-
/** The message object which triggered the error. */
1647-
input: Worker1InputEnvelope<string, unknown>;
1648-
/** If available, a stack trace array. */
1649-
stack?: string[];
1650-
}
1651-
1652-
/** Worker API #1 error response envelope. */
1653-
interface Worker1ErrorEnvelope extends Worker1MessageBusEnvelope {
1654-
type: 'error';
1655-
result: Worker1ErrorResult;
1656-
}
1657-
16581638
/** Worker API #1 'open' arguments. */
1659-
interface Worker1OpenArgs {
1639+
type Worker1OpenArgs = {
16601640
/** The db filename. */
16611641
filename?: string;
16621642
/** Sqlite3_vfs name. */
16631643
vfs?: string;
1664-
}
1644+
};
16651645

16661646
/** Worker API #1 'open' result. */
1667-
interface Worker1OpenResult {
1647+
type Worker1OpenResult = {
16681648
/** Db filename, possibly differing from the input. */
16691649
filename: string;
16701650
/** Opaque ID value for the opened db. */
@@ -1673,40 +1653,40 @@ interface Worker1OpenResult {
16731653
persistent: boolean;
16741654
/** Name of the VFS the "main" db is using. */
16751655
vfs: string;
1676-
}
1656+
};
16771657

16781658
/** Worker API #1 'close' arguments. */
1679-
interface Worker1CloseArgs {
1659+
type Worker1CloseArgs = {
16801660
/** If truthy, the database will be unlinked (deleted) after closing it. */
16811661
unlink?: boolean;
1682-
}
1662+
};
16831663

16841664
/** Worker API #1 'close' result. */
1685-
interface Worker1CloseResult {
1665+
type Worker1CloseResult = {
16861666
/** Filename of closed db, or undefined if no db was closed. */
16871667
filename?: string;
1688-
}
1668+
};
16891669

16901670
/** Worker API #1 'exec' result. */
1691-
interface Worker1ExecResult extends ExecOptions {
1671+
type Worker1ExecResult = ExecOptions & {
16921672
/** Number of changes made by the SQL. (v3.43+) */
16931673
changeCount?: number | bigint;
16941674
/** Result of sqlite3_last_insert_rowid(). (v3.50.0+) */
16951675
lastInsertRowId?: bigint;
1696-
}
1676+
};
16971677

16981678
/** Worker API #1 'export' result. */
1699-
interface Worker1ExportResult {
1679+
type Worker1ExportResult = {
17001680
/** The exported database as a byte array. */
17011681
byteArray: Uint8Array;
17021682
/** The db filename. */
17031683
filename: string;
17041684
/** "application/x-sqlite3" */
17051685
mimetype: string;
1706-
}
1686+
};
17071687

17081688
/** Worker API #1 'config-get' result. */
1709-
interface Worker1ConfigGetResult {
1689+
type Worker1ConfigGetResult = {
17101690
/** Sqlite3.version object */
17111691
version: {
17121692
libVersion: string;
@@ -1718,48 +1698,66 @@ interface Worker1ConfigGetResult {
17181698
bigIntEnabled: boolean;
17191699
/** Result of sqlite3.capi.sqlite3_js_vfs_list() */
17201700
vfsList: string[];
1721-
}
1701+
};
17221702

17231703
/** Map of Worker API #1 operation types to their argument types. */
1724-
interface Worker1ArgsMap {
1704+
type Worker1ArgsMap = {
17251705
open: Worker1OpenArgs;
17261706
close: Worker1CloseArgs | undefined;
17271707
exec: Worker1ExecArgs | string;
17281708
export: undefined;
1729-
'config-get': undefined;
1730-
}
1709+
'config-get': undefined | Record<string, never>;
1710+
};
1711+
1712+
type Worker1OptionalArgsOp = {
1713+
[K in keyof Worker1ArgsMap]: undefined extends Worker1ArgsMap[K] ? K : never;
1714+
}[keyof Worker1ArgsMap];
1715+
1716+
type Worker1RequiredArgsOp = Exclude<
1717+
keyof Worker1ArgsMap,
1718+
Worker1OptionalArgsOp
1719+
>;
17311720

17321721
/** Map of Worker API #1 operation types to their result types. */
1733-
interface Worker1ResultMap {
1722+
type Worker1ResultMap = {
17341723
open: Worker1OpenResult;
17351724
close: Worker1CloseResult;
17361725
exec: Worker1ExecResult;
17371726
export: Worker1ExportResult;
17381727
'config-get': Worker1ConfigGetResult;
1739-
}
1728+
};
17401729

17411730
/** Function type returned by Worker1PromiserFactory. */
1742-
interface Worker1Promiser {
1731+
export type Worker1Promiser = {
17431732
/**
17441733
* Sends a message to the worker and returns a Promise which resolves to the
17451734
* response message.
17461735
*/
1747-
<T extends keyof Worker1ArgsMap>(
1736+
<T extends Worker1RequiredArgsOp>(
17481737
type: T,
17491738
args: Worker1ArgsMap[T],
17501739
): Promise<Worker1OutputEnvelope<T, Worker1ResultMap[T]>>;
17511740

1741+
/**
1742+
* Sends a message to the worker and returns a Promise which resolves to the
1743+
* response message.
1744+
*/
1745+
<T extends Worker1OptionalArgsOp>(
1746+
type: T,
1747+
args?: Worker1ArgsMap[T],
1748+
): Promise<Worker1OutputEnvelope<T, Worker1ResultMap[T]>>;
1749+
17521750
/**
17531751
* Sends a message to the worker and returns a Promise which resolves to the
17541752
* response message.
17551753
*/
17561754
<T extends keyof Worker1ArgsMap>(
17571755
msg: Worker1InputEnvelope<T, Worker1ArgsMap[T]>,
17581756
): Promise<Worker1OutputEnvelope<T, Worker1ResultMap[T]>>;
1759-
}
1757+
};
17601758

17611759
/** Configuration for Worker1PromiserFactory. */
1762-
interface Worker1PromiserConfig {
1760+
type Worker1PromiserConfig = {
17631761
/** A Worker instance or a function which returns one. */
17641762
worker?: Worker | (() => Worker);
17651763

@@ -1777,10 +1775,10 @@ interface Worker1PromiserConfig {
17771775

17781776
/** Optional error logging function (undocumented). */
17791777
onerror?: (...args: unknown[]) => void;
1780-
}
1778+
};
17811779

17821780
/** Factory for creating Worker1Promiser instances. */
1783-
interface Worker1PromiserFactory {
1781+
type Worker1PromiserFactory = {
17841782
/** Creates a Worker1Promiser. */
17851783
(config?: Worker1PromiserConfig): Worker1Promiser;
17861784

@@ -1796,7 +1794,7 @@ interface Worker1PromiserFactory {
17961794
(onready: (promiser: Worker1Promiser) => void): Promise<Worker1Promiser>;
17971795
defaultConfig: Worker1PromiserConfig;
17981796
};
1799-
}
1797+
};
18001798

18011799
export type StructPtrMapper<T> = {
18021800
StructType: T;
@@ -2636,6 +2634,8 @@ export type Sqlite3Static = {
26362634
*/
26372635
export default function init(): Promise<Sqlite3Static>;
26382636

2637+
export const sqlite3Worker1Promiser: Worker1PromiserFactory;
2638+
26392639
export type ListLike<T> = {
26402640
length: number;
26412641
forEach: (cb: (val: T) => void) => void;

src/index.js

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,2 @@
1-
import { default as sqlite3InitModule } from './bin/sqlite3-bundler-friendly.mjs';
2-
import { default as sqlite3Worker1Promiser } from './bin/sqlite3-worker1-promiser.mjs';
3-
4-
/** @type {import('./index.d.ts').Worker1PromiserFactory} */
5-
const typedWorker1Promiser = sqlite3Worker1Promiser;
6-
7-
export default sqlite3InitModule;
8-
9-
export { typedWorker1Promiser as sqlite3Worker1Promiser };
1+
export { default as sqlite3Worker1Promiser } from './bin/sqlite3-worker1-promiser.mjs';
2+
export default './bin/sqlite3-bundler-friendly.mjs';

src/node.js

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1 @@
1-
import { default as sqlite3InitModule } from './bin/sqlite3-node.mjs';
2-
3-
export default sqlite3InitModule;
1+
export default './bin/sqlite3-node.mjs';

tsconfig.json

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,27 @@
11
{
22
"compilerOptions": {
3-
"target": "es2023",
3+
"outDir": "dist",
4+
"target": "ES2023",
5+
"lib": ["ESNext", "DOM"],
6+
"types": ["vitest"],
7+
"allowJs": false,
8+
"declaration": true,
9+
"forceConsistentCasingInFileNames": true,
10+
"allowSyntheticDefaultImports": true,
11+
"esModuleInterop": true,
12+
"isolatedModules": true,
13+
"resolveJsonModule": true,
14+
"verbatimModuleSyntax": true,
15+
"erasableSyntaxOnly": true,
16+
"isolatedDeclarations": true,
17+
"strictPropertyInitialization": true,
18+
"noUnusedParameters": true,
19+
"noImplicitReturns": true,
20+
"moduleResolution": "bundler",
421
"noEmit": true,
522
"strict": true,
623
"skipLibCheck": true,
7-
"moduleResolution": "nodenext",
8-
"module": "NodeNext"
24+
"module": "ESNext"
925
},
10-
"include": ["tsdown.config.ts"]
26+
"include": ["src"]
1127
}

0 commit comments

Comments
 (0)