mongolite-ts 0.7.2 → 0.8.0
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.
- package/README.md +75 -0
- package/dist/adapters/browser.d.ts +97 -0
- package/dist/adapters/browser.js +103 -0
- package/dist/adapters/browser.js.map +1 -0
- package/dist/adapters/cloudflare.d.ts +106 -0
- package/dist/adapters/cloudflare.js +94 -0
- package/dist/adapters/cloudflare.js.map +1 -0
- package/dist/changeStream.d.ts +2 -2
- package/dist/changeStream.js.map +1 -1
- package/dist/cloudflare.d.ts +39 -0
- package/dist/cloudflare.js +39 -0
- package/dist/cloudflare.js.map +1 -0
- package/dist/collection.d.ts +2 -2
- package/dist/collection.js.map +1 -1
- package/dist/cursors/findCursor.d.ts +2 -2
- package/dist/cursors/findCursor.js.map +1 -1
- package/dist/db.d.ts +16 -1
- package/dist/db.js.map +1 -1
- package/dist/index.d.ts +17 -38
- package/dist/index.js +26 -46
- package/dist/index.js.map +1 -1
- package/dist/mongo-client.d.ts +56 -0
- package/dist/mongo-client.js +55 -0
- package/dist/mongo-client.js.map +1 -0
- package/package.json +11 -1
package/README.md
CHANGED
|
@@ -70,6 +70,81 @@ main();
|
|
|
70
70
|
| [JSON Safety](./docs/JSON_SAFETY.md) | Document validation and corrupted data recovery |
|
|
71
71
|
| [Query Debugger](./docs/DEBUGGER.md) | Interactive CLI for debugging queries and inspecting SQL |
|
|
72
72
|
| [Benchmarks](./docs/BENCHMARKS.md) | Performance benchmarks and storage characteristics |
|
|
73
|
+
| [Cloudflare Durable Objects](./docs/CLOUDFLARE.md) | Using MongoLite inside a Cloudflare Durable Object |
|
|
74
|
+
|
|
75
|
+
## Backend Examples
|
|
76
|
+
|
|
77
|
+
### SQLite file (Node.js / Bun)
|
|
78
|
+
|
|
79
|
+
```typescript
|
|
80
|
+
import { MongoLite } from 'mongolite-ts';
|
|
81
|
+
|
|
82
|
+
const client = new MongoLite('./myapp.sqlite');
|
|
83
|
+
await client.connect();
|
|
84
|
+
const users = client.collection('users');
|
|
85
|
+
await users.insertOne({ name: 'Alice', age: 30 });
|
|
86
|
+
await client.close();
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### In-memory (tests / ephemeral)
|
|
90
|
+
|
|
91
|
+
```typescript
|
|
92
|
+
import { MongoLite } from 'mongolite-ts';
|
|
93
|
+
|
|
94
|
+
const client = new MongoLite(':memory:');
|
|
95
|
+
await client.connect();
|
|
96
|
+
const users = client.collection('users');
|
|
97
|
+
await users.insertOne({ name: 'Alice', age: 30 });
|
|
98
|
+
// Data is discarded when the process exits
|
|
99
|
+
await client.close();
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Browser (via sql.js)
|
|
103
|
+
|
|
104
|
+
Requires [sql.js](https://www.npmjs.com/package/sql.js) (`npm install sql.js`).
|
|
105
|
+
|
|
106
|
+
```typescript
|
|
107
|
+
import initSqlJs from 'sql.js';
|
|
108
|
+
import { MongoLite, BrowserSqliteAdapter } from 'mongolite-ts';
|
|
109
|
+
|
|
110
|
+
const SQL = await initSqlJs({
|
|
111
|
+
locateFile: (file) => `https://cdn.jsdelivr.net/npm/sql.js/dist/${file}`,
|
|
112
|
+
});
|
|
113
|
+
const sqlJsDb = new SQL.Database(); // in-memory; use OPFS/IndexedDB for persistence
|
|
114
|
+
|
|
115
|
+
const client = new MongoLite(new BrowserSqliteAdapter(sqlJsDb));
|
|
116
|
+
await client.connect();
|
|
117
|
+
const users = client.collection('users');
|
|
118
|
+
await users.insertOne({ name: 'Alice', age: 30 });
|
|
119
|
+
console.log(await users.findOne({ name: 'Alice' }));
|
|
120
|
+
await client.close();
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### Cloudflare Durable Objects
|
|
124
|
+
|
|
125
|
+
```typescript
|
|
126
|
+
import { DurableObject } from 'cloudflare:workers';
|
|
127
|
+
import { MongoLite, CloudflareDurableObjectAdapter } from 'mongolite-ts/cloudflare';
|
|
128
|
+
|
|
129
|
+
export class MyDurableObject extends DurableObject {
|
|
130
|
+
private client: MongoLite;
|
|
131
|
+
|
|
132
|
+
constructor(ctx: DurableObjectState, env: Env) {
|
|
133
|
+
super(ctx, env);
|
|
134
|
+
// Pass ctx.storage.sql — no file path needed
|
|
135
|
+
this.client = new MongoLite(new CloudflareDurableObjectAdapter(ctx.storage.sql));
|
|
136
|
+
ctx.blockConcurrencyWhile(() => this.client.collection('users').ensureTable());
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
async fetch(request: Request) {
|
|
140
|
+
const users = this.client.collection('users');
|
|
141
|
+
await users.insertOne({ name: 'Alice', age: 30 });
|
|
142
|
+
return Response.json(await users.findOne({ name: 'Alice' }));
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
> See [docs/CLOUDFLARE.md](./docs/CLOUDFLARE.md) for the full guide, supported operations, and limitations.
|
|
73
148
|
|
|
74
149
|
## Development
|
|
75
150
|
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import type { IDatabaseAdapter } from '../db.js';
|
|
2
|
+
type SqlJsColumnType = string | number | bigint | null | Uint8Array;
|
|
3
|
+
type SqlJsBindParams = SqlJsColumnType[] | Record<string, SqlJsColumnType> | null;
|
|
4
|
+
/**
|
|
5
|
+
* Minimal interface representing a sql.js Statement object.
|
|
6
|
+
* @see https://sql.js.org/documentation/Statement.html
|
|
7
|
+
*/
|
|
8
|
+
export interface SqlJsStatement {
|
|
9
|
+
bind(params?: SqlJsBindParams): boolean;
|
|
10
|
+
step(): boolean;
|
|
11
|
+
getAsObject(params?: SqlJsBindParams | null): Record<string, SqlJsColumnType>;
|
|
12
|
+
free(): boolean;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Minimal interface representing a sql.js Database object.
|
|
16
|
+
* @see https://sql.js.org/documentation/Database.html
|
|
17
|
+
*/
|
|
18
|
+
export interface SqlJsDatabase {
|
|
19
|
+
run(sql: string, params?: SqlJsBindParams): SqlJsDatabase;
|
|
20
|
+
exec(sql: string): Array<{
|
|
21
|
+
columns: string[];
|
|
22
|
+
values: SqlJsColumnType[][];
|
|
23
|
+
}>;
|
|
24
|
+
prepare(sql: string): SqlJsStatement;
|
|
25
|
+
close(): void;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Database adapter that wraps a {@link SqlJsDatabase} instance, enabling MongoLite
|
|
29
|
+
* to run in browser environments via [sql.js](https://sql.js.org/).
|
|
30
|
+
*
|
|
31
|
+
* ## Usage
|
|
32
|
+
*
|
|
33
|
+
* Install [sql.js](https://www.npmjs.com/package/sql.js) and initialise it before
|
|
34
|
+
* constructing the adapter:
|
|
35
|
+
*
|
|
36
|
+
* ```ts
|
|
37
|
+
* import initSqlJs from 'sql.js';
|
|
38
|
+
* import { MongoLite, BrowserSqliteAdapter } from 'mongolite-ts';
|
|
39
|
+
*
|
|
40
|
+
* const SQL = await initSqlJs({
|
|
41
|
+
* locateFile: (file) => `https://cdn.jsdelivr.net/npm/sql.js/dist/${file}`,
|
|
42
|
+
* });
|
|
43
|
+
* const sqlJsDb = new SQL.Database(); // in-memory; persist via OPFS or IndexedDB
|
|
44
|
+
*
|
|
45
|
+
* const client = new MongoLite(new BrowserSqliteAdapter(sqlJsDb));
|
|
46
|
+
* await client.connect();
|
|
47
|
+
* const users = client.collection('users');
|
|
48
|
+
* await users.insertOne({ name: 'Alice', age: 30 });
|
|
49
|
+
* await client.close();
|
|
50
|
+
* ```
|
|
51
|
+
*
|
|
52
|
+
* ## Limitations
|
|
53
|
+
*
|
|
54
|
+
* - **`$regex` queries are not supported** — sql.js does not ship with a `regexp()`
|
|
55
|
+
* SQL function. Use JS-side filtering as a workaround.
|
|
56
|
+
* - **`lastID` / `changes`** are not exposed by the sql.js API. `run()` always
|
|
57
|
+
* returns `{ lastID: 0, changes: 0 }`, which is safe because MongoLite does not
|
|
58
|
+
* use these values internally.
|
|
59
|
+
* - **Persistence** — by default sql.js stores data in memory. For durable storage
|
|
60
|
+
* use the OPFS back-end or export the database buffer to IndexedDB.
|
|
61
|
+
*/
|
|
62
|
+
export declare class BrowserSqliteAdapter implements IDatabaseAdapter {
|
|
63
|
+
private readonly db;
|
|
64
|
+
/**
|
|
65
|
+
* @param db An initialised sql.js `Database` instance.
|
|
66
|
+
*/
|
|
67
|
+
constructor(db: SqlJsDatabase);
|
|
68
|
+
/**
|
|
69
|
+
* No-op: sql.js Database is already open on construction.
|
|
70
|
+
*/
|
|
71
|
+
connect(): Promise<void>;
|
|
72
|
+
/**
|
|
73
|
+
* Closes the underlying sql.js Database and frees its WASM memory.
|
|
74
|
+
*/
|
|
75
|
+
close(): Promise<void>;
|
|
76
|
+
/**
|
|
77
|
+
* Executes a DML statement (INSERT, UPDATE, DELETE) with optional bound parameters.
|
|
78
|
+
* Returns `{ lastID: 0, changes: 0 }` — sql.js does not expose these values.
|
|
79
|
+
*/
|
|
80
|
+
run(sql: string, params?: unknown[]): Promise<{
|
|
81
|
+
lastID: number;
|
|
82
|
+
changes: number;
|
|
83
|
+
}>;
|
|
84
|
+
/**
|
|
85
|
+
* Executes a SQL query and returns the first matching row, or `undefined`.
|
|
86
|
+
*/
|
|
87
|
+
get<T>(sql: string, params?: unknown[]): Promise<T | undefined>;
|
|
88
|
+
/**
|
|
89
|
+
* Executes a SQL query and returns all matching rows.
|
|
90
|
+
*/
|
|
91
|
+
all<T>(sql: string, params?: unknown[]): Promise<T[]>;
|
|
92
|
+
/**
|
|
93
|
+
* Executes one or more SQL statements (DDL, transactions, etc.).
|
|
94
|
+
*/
|
|
95
|
+
exec(sql: string): Promise<void>;
|
|
96
|
+
}
|
|
97
|
+
export {};
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database adapter that wraps a {@link SqlJsDatabase} instance, enabling MongoLite
|
|
3
|
+
* to run in browser environments via [sql.js](https://sql.js.org/).
|
|
4
|
+
*
|
|
5
|
+
* ## Usage
|
|
6
|
+
*
|
|
7
|
+
* Install [sql.js](https://www.npmjs.com/package/sql.js) and initialise it before
|
|
8
|
+
* constructing the adapter:
|
|
9
|
+
*
|
|
10
|
+
* ```ts
|
|
11
|
+
* import initSqlJs from 'sql.js';
|
|
12
|
+
* import { MongoLite, BrowserSqliteAdapter } from 'mongolite-ts';
|
|
13
|
+
*
|
|
14
|
+
* const SQL = await initSqlJs({
|
|
15
|
+
* locateFile: (file) => `https://cdn.jsdelivr.net/npm/sql.js/dist/${file}`,
|
|
16
|
+
* });
|
|
17
|
+
* const sqlJsDb = new SQL.Database(); // in-memory; persist via OPFS or IndexedDB
|
|
18
|
+
*
|
|
19
|
+
* const client = new MongoLite(new BrowserSqliteAdapter(sqlJsDb));
|
|
20
|
+
* await client.connect();
|
|
21
|
+
* const users = client.collection('users');
|
|
22
|
+
* await users.insertOne({ name: 'Alice', age: 30 });
|
|
23
|
+
* await client.close();
|
|
24
|
+
* ```
|
|
25
|
+
*
|
|
26
|
+
* ## Limitations
|
|
27
|
+
*
|
|
28
|
+
* - **`$regex` queries are not supported** — sql.js does not ship with a `regexp()`
|
|
29
|
+
* SQL function. Use JS-side filtering as a workaround.
|
|
30
|
+
* - **`lastID` / `changes`** are not exposed by the sql.js API. `run()` always
|
|
31
|
+
* returns `{ lastID: 0, changes: 0 }`, which is safe because MongoLite does not
|
|
32
|
+
* use these values internally.
|
|
33
|
+
* - **Persistence** — by default sql.js stores data in memory. For durable storage
|
|
34
|
+
* use the OPFS back-end or export the database buffer to IndexedDB.
|
|
35
|
+
*/
|
|
36
|
+
export class BrowserSqliteAdapter {
|
|
37
|
+
/**
|
|
38
|
+
* @param db An initialised sql.js `Database` instance.
|
|
39
|
+
*/
|
|
40
|
+
constructor(db) {
|
|
41
|
+
this.db = db;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* No-op: sql.js Database is already open on construction.
|
|
45
|
+
*/
|
|
46
|
+
async connect() {
|
|
47
|
+
// Nothing to do — the sql.js Database is ready to use immediately.
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Closes the underlying sql.js Database and frees its WASM memory.
|
|
51
|
+
*/
|
|
52
|
+
async close() {
|
|
53
|
+
this.db.close();
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Executes a DML statement (INSERT, UPDATE, DELETE) with optional bound parameters.
|
|
57
|
+
* Returns `{ lastID: 0, changes: 0 }` — sql.js does not expose these values.
|
|
58
|
+
*/
|
|
59
|
+
async run(sql, params = []) {
|
|
60
|
+
this.db.run(sql, params);
|
|
61
|
+
return { lastID: 0, changes: 0 };
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Executes a SQL query and returns the first matching row, or `undefined`.
|
|
65
|
+
*/
|
|
66
|
+
async get(sql, params = []) {
|
|
67
|
+
const stmt = this.db.prepare(sql);
|
|
68
|
+
try {
|
|
69
|
+
stmt.bind(params);
|
|
70
|
+
if (stmt.step()) {
|
|
71
|
+
return stmt.getAsObject();
|
|
72
|
+
}
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
75
|
+
finally {
|
|
76
|
+
stmt.free();
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Executes a SQL query and returns all matching rows.
|
|
81
|
+
*/
|
|
82
|
+
async all(sql, params = []) {
|
|
83
|
+
const stmt = this.db.prepare(sql);
|
|
84
|
+
try {
|
|
85
|
+
stmt.bind(params);
|
|
86
|
+
const rows = [];
|
|
87
|
+
while (stmt.step()) {
|
|
88
|
+
rows.push(stmt.getAsObject());
|
|
89
|
+
}
|
|
90
|
+
return rows;
|
|
91
|
+
}
|
|
92
|
+
finally {
|
|
93
|
+
stmt.free();
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Executes one or more SQL statements (DDL, transactions, etc.).
|
|
98
|
+
*/
|
|
99
|
+
async exec(sql) {
|
|
100
|
+
this.db.exec(sql);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/adapters/browser.ts"],"names":[],"mappings":"AA2BA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,MAAM,OAAO,oBAAoB;IAG/B;;OAEG;IACH,YAAY,EAAiB;QAC3B,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACf,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO;QACX,mEAAmE;IACrE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,SAAoB,EAAE;QAC3C,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,MAA2B,CAAC,CAAC;QAC9C,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAI,GAAW,EAAE,SAAoB,EAAE;QAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,MAA2B,CAAC,CAAC;YACvC,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;gBAChB,OAAO,IAAI,CAAC,WAAW,EAAO,CAAC;YACjC,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAI,GAAW,EAAE,SAAoB,EAAE;QAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,MAA2B,CAAC,CAAC;YACvC,MAAM,IAAI,GAAQ,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;gBACnB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAO,CAAC,CAAC;YACrC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,GAAW;QACpB,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC;CACF"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { IDatabaseAdapter } from '../db.js';
|
|
2
|
+
/**
|
|
3
|
+
* Allowed scalar binding values accepted by Cloudflare's SqlStorage.exec().
|
|
4
|
+
*/
|
|
5
|
+
export type SqlStorageValue = string | number | boolean | null | ArrayBuffer;
|
|
6
|
+
/**
|
|
7
|
+
* Minimal interface for the cursor returned by SqlStorage.exec().
|
|
8
|
+
* This matches the Cloudflare Durable Objects SqlStorage API.
|
|
9
|
+
*/
|
|
10
|
+
export interface SqlStorageCursor<T = Record<string, SqlStorageValue>> {
|
|
11
|
+
toArray(): T[];
|
|
12
|
+
one(): T;
|
|
13
|
+
readonly rowsRead: number;
|
|
14
|
+
readonly rowsWritten: number;
|
|
15
|
+
readonly columnNames: readonly string[];
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Minimal interface for the Cloudflare Durable Objects SqlStorage API.
|
|
19
|
+
* Pass `ctx.storage.sql` from your Durable Object to the adapter constructor.
|
|
20
|
+
*
|
|
21
|
+
* @see https://developers.cloudflare.com/durable-objects/api/sqlite-storage-api/
|
|
22
|
+
*/
|
|
23
|
+
export interface SqlStorage {
|
|
24
|
+
exec<T = Record<string, SqlStorageValue>>(query: string, ...bindings: SqlStorageValue[]): SqlStorageCursor<T>;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Database adapter that wraps the Cloudflare Durable Objects `SqlStorage` API,
|
|
28
|
+
* allowing MongoLite to be used inside a Cloudflare Durable Object.
|
|
29
|
+
*
|
|
30
|
+
* ## Usage
|
|
31
|
+
*
|
|
32
|
+
* ```ts
|
|
33
|
+
* import { DurableObject } from 'cloudflare:workers';
|
|
34
|
+
* import { MongoLite, CloudflareDurableObjectAdapter } from 'mongolite-ts/cloudflare';
|
|
35
|
+
*
|
|
36
|
+
* export class MyDurableObject extends DurableObject {
|
|
37
|
+
* private client: MongoLite;
|
|
38
|
+
*
|
|
39
|
+
* constructor(ctx: DurableObjectState, env: Env) {
|
|
40
|
+
* super(ctx, env);
|
|
41
|
+
* const adapter = new CloudflareDurableObjectAdapter(ctx.storage.sql);
|
|
42
|
+
* this.client = new MongoLite(adapter);
|
|
43
|
+
* }
|
|
44
|
+
*
|
|
45
|
+
* async fetch(request: Request) {
|
|
46
|
+
* await this.client.connect();
|
|
47
|
+
* const users = this.client.collection('users');
|
|
48
|
+
* await users.insertOne({ name: 'Alice', age: 30 });
|
|
49
|
+
* const user = await users.findOne({ name: 'Alice' });
|
|
50
|
+
* return Response.json(user);
|
|
51
|
+
* }
|
|
52
|
+
* }
|
|
53
|
+
* ```
|
|
54
|
+
*
|
|
55
|
+
* ## Limitations
|
|
56
|
+
*
|
|
57
|
+
* - **`$regex` queries are not supported.** Cloudflare's SQLite does not allow custom
|
|
58
|
+
* SQL functions, so the `regexp()` UDF registered by the default Node.js adapter is
|
|
59
|
+
* unavailable. Queries using `$regex` will throw a SQL error at runtime.
|
|
60
|
+
* - `WAL` mode and most `PRAGMA` statements are not available in Cloudflare Durable
|
|
61
|
+
* Objects (Cloudflare manages this internally).
|
|
62
|
+
* - Change Streams (`collection.watch()`) use SQL triggers and a change-log table.
|
|
63
|
+
* They work in Cloudflare Durable Objects, but the polling mechanism relies on
|
|
64
|
+
* `setInterval`, which is supported in the Workers runtime.
|
|
65
|
+
*/
|
|
66
|
+
export declare class CloudflareDurableObjectAdapter implements IDatabaseAdapter {
|
|
67
|
+
private readonly sql;
|
|
68
|
+
/**
|
|
69
|
+
* @param sql The `SqlStorage` instance from a Cloudflare Durable Object context
|
|
70
|
+
* (i.e. `ctx.storage.sql`).
|
|
71
|
+
*/
|
|
72
|
+
constructor(sql: SqlStorage);
|
|
73
|
+
/**
|
|
74
|
+
* No-op: Cloudflare Durable Objects manage the storage lifecycle automatically.
|
|
75
|
+
*/
|
|
76
|
+
connect(): Promise<void>;
|
|
77
|
+
/**
|
|
78
|
+
* No-op: Cloudflare Durable Objects manage the storage lifecycle automatically.
|
|
79
|
+
*/
|
|
80
|
+
close(): Promise<void>;
|
|
81
|
+
/**
|
|
82
|
+
* Executes a SQL statement that does not return rows (INSERT, UPDATE, DELETE, DDL).
|
|
83
|
+
*/
|
|
84
|
+
run(sql: string, params?: unknown[]): Promise<{
|
|
85
|
+
lastID: number;
|
|
86
|
+
changes: number;
|
|
87
|
+
}>;
|
|
88
|
+
/**
|
|
89
|
+
* Executes a SQL query and returns the first matching row, or `undefined`.
|
|
90
|
+
*/
|
|
91
|
+
get<T>(sql: string, params?: unknown[]): Promise<T | undefined>;
|
|
92
|
+
/**
|
|
93
|
+
* Executes a SQL query and returns all matching rows.
|
|
94
|
+
*/
|
|
95
|
+
all<T>(sql: string, params?: unknown[]): Promise<T[]>;
|
|
96
|
+
/**
|
|
97
|
+
* Executes a single SQL statement (DDL, transactions, etc.).
|
|
98
|
+
*
|
|
99
|
+
* Cloudflare's `SqlStorage.exec` only supports one statement at a time, and
|
|
100
|
+
* some valid statements (e.g. `CREATE TRIGGER ... BEGIN ...; ...; END;`)
|
|
101
|
+
* contain internal semicolons. Callers must therefore pass exactly one
|
|
102
|
+
* statement per call; this method will not attempt to split multi-statement
|
|
103
|
+
* SQL strings.
|
|
104
|
+
*/
|
|
105
|
+
exec(sql: string): Promise<void>;
|
|
106
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database adapter that wraps the Cloudflare Durable Objects `SqlStorage` API,
|
|
3
|
+
* allowing MongoLite to be used inside a Cloudflare Durable Object.
|
|
4
|
+
*
|
|
5
|
+
* ## Usage
|
|
6
|
+
*
|
|
7
|
+
* ```ts
|
|
8
|
+
* import { DurableObject } from 'cloudflare:workers';
|
|
9
|
+
* import { MongoLite, CloudflareDurableObjectAdapter } from 'mongolite-ts/cloudflare';
|
|
10
|
+
*
|
|
11
|
+
* export class MyDurableObject extends DurableObject {
|
|
12
|
+
* private client: MongoLite;
|
|
13
|
+
*
|
|
14
|
+
* constructor(ctx: DurableObjectState, env: Env) {
|
|
15
|
+
* super(ctx, env);
|
|
16
|
+
* const adapter = new CloudflareDurableObjectAdapter(ctx.storage.sql);
|
|
17
|
+
* this.client = new MongoLite(adapter);
|
|
18
|
+
* }
|
|
19
|
+
*
|
|
20
|
+
* async fetch(request: Request) {
|
|
21
|
+
* await this.client.connect();
|
|
22
|
+
* const users = this.client.collection('users');
|
|
23
|
+
* await users.insertOne({ name: 'Alice', age: 30 });
|
|
24
|
+
* const user = await users.findOne({ name: 'Alice' });
|
|
25
|
+
* return Response.json(user);
|
|
26
|
+
* }
|
|
27
|
+
* }
|
|
28
|
+
* ```
|
|
29
|
+
*
|
|
30
|
+
* ## Limitations
|
|
31
|
+
*
|
|
32
|
+
* - **`$regex` queries are not supported.** Cloudflare's SQLite does not allow custom
|
|
33
|
+
* SQL functions, so the `regexp()` UDF registered by the default Node.js adapter is
|
|
34
|
+
* unavailable. Queries using `$regex` will throw a SQL error at runtime.
|
|
35
|
+
* - `WAL` mode and most `PRAGMA` statements are not available in Cloudflare Durable
|
|
36
|
+
* Objects (Cloudflare manages this internally).
|
|
37
|
+
* - Change Streams (`collection.watch()`) use SQL triggers and a change-log table.
|
|
38
|
+
* They work in Cloudflare Durable Objects, but the polling mechanism relies on
|
|
39
|
+
* `setInterval`, which is supported in the Workers runtime.
|
|
40
|
+
*/
|
|
41
|
+
export class CloudflareDurableObjectAdapter {
|
|
42
|
+
/**
|
|
43
|
+
* @param sql The `SqlStorage` instance from a Cloudflare Durable Object context
|
|
44
|
+
* (i.e. `ctx.storage.sql`).
|
|
45
|
+
*/
|
|
46
|
+
constructor(sql) {
|
|
47
|
+
this.sql = sql;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* No-op: Cloudflare Durable Objects manage the storage lifecycle automatically.
|
|
51
|
+
*/
|
|
52
|
+
async connect() {
|
|
53
|
+
// Nothing to do — the SqlStorage instance is already live.
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* No-op: Cloudflare Durable Objects manage the storage lifecycle automatically.
|
|
57
|
+
*/
|
|
58
|
+
async close() {
|
|
59
|
+
// Nothing to do — storage is managed by the Durable Object runtime.
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Executes a SQL statement that does not return rows (INSERT, UPDATE, DELETE, DDL).
|
|
63
|
+
*/
|
|
64
|
+
async run(sql, params = []) {
|
|
65
|
+
const cursor = this.sql.exec(sql, ...params);
|
|
66
|
+
return { lastID: 0, changes: cursor.rowsWritten };
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Executes a SQL query and returns the first matching row, or `undefined`.
|
|
70
|
+
*/
|
|
71
|
+
async get(sql, params = []) {
|
|
72
|
+
const rows = this.sql.exec(sql, ...params).toArray();
|
|
73
|
+
return rows[0];
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Executes a SQL query and returns all matching rows.
|
|
77
|
+
*/
|
|
78
|
+
async all(sql, params = []) {
|
|
79
|
+
return this.sql.exec(sql, ...params).toArray();
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Executes a single SQL statement (DDL, transactions, etc.).
|
|
83
|
+
*
|
|
84
|
+
* Cloudflare's `SqlStorage.exec` only supports one statement at a time, and
|
|
85
|
+
* some valid statements (e.g. `CREATE TRIGGER ... BEGIN ...; ...; END;`)
|
|
86
|
+
* contain internal semicolons. Callers must therefore pass exactly one
|
|
87
|
+
* statement per call; this method will not attempt to split multi-statement
|
|
88
|
+
* SQL strings.
|
|
89
|
+
*/
|
|
90
|
+
async exec(sql) {
|
|
91
|
+
this.sql.exec(sql);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=cloudflare.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloudflare.js","sourceRoot":"","sources":["../../src/adapters/cloudflare.ts"],"names":[],"mappings":"AAgCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,MAAM,OAAO,8BAA8B;IAGzC;;;OAGG;IACH,YAAY,GAAe;QACzB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO;QACX,2DAA2D;IAC7D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,oEAAoE;IACtE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,SAAoB,EAAE;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAI,MAA4B,CAAC,CAAC;QACpE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;IACpD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAI,GAAW,EAAE,SAAoB,EAAE;QAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAI,GAAG,EAAE,GAAI,MAA4B,CAAC,CAAC,OAAO,EAAE,CAAC;QAC/E,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAI,GAAW,EAAE,SAAoB,EAAE;QAC9C,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAI,GAAG,EAAE,GAAI,MAA4B,CAAC,CAAC,OAAO,EAAE,CAAC;IAC3E,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,IAAI,CAAC,GAAW;QACpB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;CACF"}
|
package/dist/changeStream.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { EventEmitter } from 'events';
|
|
2
|
-
import {
|
|
2
|
+
import type { IDatabaseAdapter } from './db.js';
|
|
3
3
|
import { DocumentWithId, Filter } from './types.js';
|
|
4
4
|
export type ChangeOperationType = 'insert' | 'update' | 'delete' | 'replace';
|
|
5
5
|
export interface ChangeStreamDocument<T extends DocumentWithId = DocumentWithId> {
|
|
@@ -51,7 +51,7 @@ export declare class ChangeStream<T extends DocumentWithId = DocumentWithId> ext
|
|
|
51
51
|
private lastProcessedId;
|
|
52
52
|
private buffer;
|
|
53
53
|
private readonly maxBufferSize;
|
|
54
|
-
constructor(db:
|
|
54
|
+
constructor(db: IDatabaseAdapter, collectionName: string, options?: ChangeStreamOptions<T>);
|
|
55
55
|
/**
|
|
56
56
|
* Sets up the change tracking infrastructure
|
|
57
57
|
*/
|
package/dist/changeStream.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"changeStream.js","sourceRoot":"","sources":["../src/changeStream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAkDtC,MAAM,OAAO,YAAwD,SAAQ,YAAY;IAOvF,YACmB,
|
|
1
|
+
{"version":3,"file":"changeStream.js","sourceRoot":"","sources":["../src/changeStream.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloudflare-safe entry point for MongoLite.
|
|
3
|
+
*
|
|
4
|
+
* Import from `mongolite-ts/cloudflare` inside Cloudflare Workers / Durable Objects.
|
|
5
|
+
* This module does **not** import `better-sqlite3`, so it bundles cleanly with `wrangler`.
|
|
6
|
+
*
|
|
7
|
+
* ## Requirements
|
|
8
|
+
*
|
|
9
|
+
* - Enable **Node.js compatibility** in your Worker configuration (e.g. `nodejs_compat`
|
|
10
|
+
* flag in `wrangler.toml`/`wrangler.jsonc`). The `ChangeStream` class depends on
|
|
11
|
+
* Node's built-in `events` module, which requires this flag even if you don't use
|
|
12
|
+
* change streams directly.
|
|
13
|
+
*
|
|
14
|
+
* ## Usage
|
|
15
|
+
*
|
|
16
|
+
* ```ts
|
|
17
|
+
* import { DurableObject } from 'cloudflare:workers';
|
|
18
|
+
* import { MongoLite, CloudflareDurableObjectAdapter } from 'mongolite-ts/cloudflare';
|
|
19
|
+
*
|
|
20
|
+
* export class MyDurableObject extends DurableObject {
|
|
21
|
+
* private client: MongoLite;
|
|
22
|
+
*
|
|
23
|
+
* constructor(ctx: DurableObjectState, env: Env) {
|
|
24
|
+
* super(ctx, env);
|
|
25
|
+
* this.client = new MongoLite(new CloudflareDurableObjectAdapter(ctx.storage.sql));
|
|
26
|
+
* ctx.blockConcurrencyWhile(() => this.client.collection('users').ensureTable());
|
|
27
|
+
* }
|
|
28
|
+
* }
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export { MongoLite } from './mongo-client.js';
|
|
32
|
+
export type { MongoLiteBaseOptions } from './mongo-client.js';
|
|
33
|
+
export { CloudflareDurableObjectAdapter } from './adapters/cloudflare.js';
|
|
34
|
+
export type { SqlStorage, SqlStorageCursor, SqlStorageValue, } from './adapters/cloudflare.js';
|
|
35
|
+
export type { IDatabaseAdapter } from './db.js';
|
|
36
|
+
export { MongoLiteCollection } from './collection.js';
|
|
37
|
+
export * from './types.js';
|
|
38
|
+
export { ChangeStream } from './changeStream.js';
|
|
39
|
+
export type { ChangeStreamDocument, ChangeStreamOptions, ChangeOperationType, } from './changeStream.js';
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloudflare-safe entry point for MongoLite.
|
|
3
|
+
*
|
|
4
|
+
* Import from `mongolite-ts/cloudflare` inside Cloudflare Workers / Durable Objects.
|
|
5
|
+
* This module does **not** import `better-sqlite3`, so it bundles cleanly with `wrangler`.
|
|
6
|
+
*
|
|
7
|
+
* ## Requirements
|
|
8
|
+
*
|
|
9
|
+
* - Enable **Node.js compatibility** in your Worker configuration (e.g. `nodejs_compat`
|
|
10
|
+
* flag in `wrangler.toml`/`wrangler.jsonc`). The `ChangeStream` class depends on
|
|
11
|
+
* Node's built-in `events` module, which requires this flag even if you don't use
|
|
12
|
+
* change streams directly.
|
|
13
|
+
*
|
|
14
|
+
* ## Usage
|
|
15
|
+
*
|
|
16
|
+
* ```ts
|
|
17
|
+
* import { DurableObject } from 'cloudflare:workers';
|
|
18
|
+
* import { MongoLite, CloudflareDurableObjectAdapter } from 'mongolite-ts/cloudflare';
|
|
19
|
+
*
|
|
20
|
+
* export class MyDurableObject extends DurableObject {
|
|
21
|
+
* private client: MongoLite;
|
|
22
|
+
*
|
|
23
|
+
* constructor(ctx: DurableObjectState, env: Env) {
|
|
24
|
+
* super(ctx, env);
|
|
25
|
+
* this.client = new MongoLite(new CloudflareDurableObjectAdapter(ctx.storage.sql));
|
|
26
|
+
* ctx.blockConcurrencyWhile(() => this.client.collection('users').ensureTable());
|
|
27
|
+
* }
|
|
28
|
+
* }
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
// Core MongoLite class — accepts any IDatabaseAdapter, no better-sqlite3 dependency.
|
|
32
|
+
export { MongoLite } from './mongo-client.js';
|
|
33
|
+
// Cloudflare-specific adapter
|
|
34
|
+
export { CloudflareDurableObjectAdapter } from './adapters/cloudflare.js';
|
|
35
|
+
export { MongoLiteCollection } from './collection.js';
|
|
36
|
+
export * from './types.js';
|
|
37
|
+
// Change streams (requires nodejs_compat in Workers)
|
|
38
|
+
export { ChangeStream } from './changeStream.js';
|
|
39
|
+
//# sourceMappingURL=cloudflare.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloudflare.js","sourceRoot":"","sources":["../src/cloudflare.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,qFAAqF;AACrF,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAG9C,8BAA8B;AAC9B,OAAO,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAC;AAS1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,cAAc,YAAY,CAAC;AAE3B,qDAAqD;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/collection.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { IDatabaseAdapter } from './db.js';
|
|
2
2
|
import { DocumentWithId, Filter, UpdateFilter, InsertOneResult, InsertManyResult, UpdateResult, DeleteResult, Projection, IndexSpecification, CreateIndexOptions, CreateIndexResult, DropIndexResult, IndexInfo, FindOneAndUpdateOptions, FindOneAndDeleteOptions, FindOneAndReplaceOptions, ReplaceOptions, AggregationPipeline } from './types.js';
|
|
3
3
|
import { FindCursor } from './cursors/findCursor.js';
|
|
4
4
|
import { ChangeStream, ChangeStreamOptions } from './changeStream.js';
|
|
@@ -10,7 +10,7 @@ export declare class MongoLiteCollection<T extends DocumentWithId> {
|
|
|
10
10
|
private db;
|
|
11
11
|
readonly name: string;
|
|
12
12
|
private readonly options;
|
|
13
|
-
constructor(db:
|
|
13
|
+
constructor(db: IDatabaseAdapter, name: string, options?: {
|
|
14
14
|
verbose?: boolean;
|
|
15
15
|
});
|
|
16
16
|
/**
|