@livestore/sqlite-wasm 0.3.0-dev.10 → 0.3.0-dev.12
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/dist/.tsbuildinfo +1 -1
- package/dist/browser/mod.d.ts +7 -7
- package/dist/browser/mod.d.ts.map +1 -1
- package/dist/browser/mod.js +4 -4
- package/dist/browser/mod.js.map +1 -1
- package/dist/index_.d.ts +1 -1
- package/dist/index_.d.ts.map +1 -1
- package/dist/index_.js +1 -1
- package/dist/index_.js.map +1 -1
- package/dist/make-sqlite-db.d.ts +11 -0
- package/dist/make-sqlite-db.d.ts.map +1 -0
- package/dist/make-sqlite-db.js +181 -0
- package/dist/make-sqlite-db.js.map +1 -0
- package/dist/node/mod.d.ts +7 -7
- package/dist/node/mod.d.ts.map +1 -1
- package/dist/node/mod.js +5 -5
- package/dist/node/mod.js.map +1 -1
- package/package.json +3 -3
- package/src/browser/mod.ts +10 -14
- package/src/index_.ts +1 -1
- package/src/{make-sync-db.ts → make-sqlite-db.ts} +16 -16
- package/src/node/mod.ts +10 -19
package/dist/browser/mod.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { MakeSqliteDb, PersistenceInfo, SqliteDb } from '@livestore/common';
|
|
2
2
|
import type { MemoryVFS } from '@livestore/wa-sqlite/src/examples/MemoryVFS.js';
|
|
3
3
|
import type { AccessHandlePoolVFS } from './opfs/AccessHandlePoolVFS.js';
|
|
4
4
|
export * from './opfs/opfs-sah-pool.js';
|
|
@@ -8,7 +8,7 @@ export type WebDatabaseMetadataInMemory = {
|
|
|
8
8
|
dbPointer: number;
|
|
9
9
|
persistenceInfo: PersistenceInfo;
|
|
10
10
|
deleteDb: () => void;
|
|
11
|
-
configureDb: (db:
|
|
11
|
+
configureDb: (db: SqliteDb) => void;
|
|
12
12
|
};
|
|
13
13
|
export type WebDatabaseMetadataOpfs = {
|
|
14
14
|
_tag: 'opfs';
|
|
@@ -20,24 +20,24 @@ export type WebDatabaseMetadataOpfs = {
|
|
|
20
20
|
opfsFileName: string;
|
|
21
21
|
}>;
|
|
22
22
|
deleteDb: () => void;
|
|
23
|
-
configureDb: (db:
|
|
23
|
+
configureDb: (db: SqliteDb) => void;
|
|
24
24
|
};
|
|
25
25
|
export type WebDatabaseMetadata = WebDatabaseMetadataInMemory | WebDatabaseMetadataOpfs;
|
|
26
26
|
export type WebDatabaseInputInMemory = {
|
|
27
27
|
_tag: 'in-memory';
|
|
28
|
-
configureDb?: (db:
|
|
28
|
+
configureDb?: (db: SqliteDb) => void;
|
|
29
29
|
};
|
|
30
30
|
export type WebDatabaseInputOpfs = {
|
|
31
31
|
_tag: 'opfs';
|
|
32
32
|
/** Filename of the database file (only used when exporting/downloading the database) */
|
|
33
33
|
fileName: string;
|
|
34
34
|
opfsDirectory: string;
|
|
35
|
-
configureDb?: (db:
|
|
35
|
+
configureDb?: (db: SqliteDb) => void;
|
|
36
36
|
};
|
|
37
37
|
export type WebDatabaseInput = WebDatabaseInputInMemory | WebDatabaseInputOpfs;
|
|
38
|
-
export declare const
|
|
38
|
+
export declare const sqliteDbFactory: ({ sqlite3, }: {
|
|
39
39
|
sqlite3: SQLiteAPI;
|
|
40
|
-
}) =>
|
|
40
|
+
}) => MakeSqliteDb<{
|
|
41
41
|
dbPointer: number;
|
|
42
42
|
persistenceInfo: PersistenceInfo;
|
|
43
43
|
}, WebDatabaseInput, WebDatabaseMetadata>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../src/browser/mod.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../src/browser/mod.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAEhF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gDAAgD,CAAA;AAI/E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAA;AAGxE,cAAc,yBAAyB,CAAA;AAEvC,MAAM,MAAM,2BAA2B,GAAG;IACxC,IAAI,EAAE,WAAW,CAAA;IACjB,GAAG,EAAE,SAAS,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,eAAe,EAAE,eAAe,CAAA;IAChC,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,WAAW,EAAE,CAAC,EAAE,EAAE,QAAQ,KAAK,IAAI,CAAA;CACpC,CAAA;AAED,MAAM,MAAM,uBAAuB,GAAG;IACpC,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,mBAAmB,CAAA;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,eAAe,EAAE,eAAe,CAAC;QAC/B,aAAa,EAAE,MAAM,CAAA;QACrB,mCAAmC;QACnC,YAAY,EAAE,MAAM,CAAA;KACrB,CAAC,CAAA;IACF,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,WAAW,EAAE,CAAC,EAAE,EAAE,QAAQ,KAAK,IAAI,CAAA;CACpC,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG,2BAA2B,GAAG,uBAAuB,CAAA;AAEvF,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,EAAE,WAAW,CAAA;IACjB,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,KAAK,IAAI,CAAA;CACrC,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,wFAAwF;IACxF,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,EAAE,MAAM,CAAA;IACrB,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,KAAK,IAAI,CAAA;CACrC,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG,wBAAwB,GAAG,oBAAoB,CAAA;AAE9E,eAAO,MAAM,eAAe,iBAGvB;IACD,OAAO,EAAE,SAAS,CAAA;CACnB,KAAG,YAAY,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,eAAe,CAAA;CAAE,EAAE,gBAAgB,EAAE,mBAAmB,CAqD3G,CAAA"}
|
package/dist/browser/mod.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { Effect, Hash } from '@livestore/utils/effect';
|
|
2
2
|
import { makeInMemoryDb } from '../in-memory-vfs.js';
|
|
3
|
-
import {
|
|
3
|
+
import { makeSqliteDb } from '../make-sqlite-db.js';
|
|
4
4
|
import { makeOpfsDb } from './opfs/index.js';
|
|
5
5
|
export * from './opfs/opfs-sah-pool.js';
|
|
6
|
-
export const
|
|
6
|
+
export const sqliteDbFactory = ({ sqlite3, }) => (input) => Effect.gen(function* () {
|
|
7
7
|
if (input._tag === 'in-memory') {
|
|
8
8
|
const { dbPointer, vfs } = makeInMemoryDb(sqlite3);
|
|
9
|
-
return
|
|
9
|
+
return makeSqliteDb({
|
|
10
10
|
sqlite3,
|
|
11
11
|
metadata: {
|
|
12
12
|
_tag: 'in-memory',
|
|
@@ -32,7 +32,7 @@ export const syncDbFactory = ({ sqlite3, }) => (input) => Effect.gen(function* (
|
|
|
32
32
|
directory: input.opfsDirectory,
|
|
33
33
|
fileName: dbFilename,
|
|
34
34
|
});
|
|
35
|
-
return
|
|
35
|
+
return makeSqliteDb({
|
|
36
36
|
sqlite3,
|
|
37
37
|
metadata: {
|
|
38
38
|
_tag: 'opfs',
|
package/dist/browser/mod.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mod.js","sourceRoot":"","sources":["../../src/browser/mod.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAA;AAGtD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"mod.js","sourceRoot":"","sources":["../../src/browser/mod.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAA;AAGtD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAEnD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAE5C,cAAc,yBAAyB,CAAA;AAyCvC,MAAM,CAAC,MAAM,eAAe,GAC1B,CAAC,EACC,OAAO,GAGR,EAAgH,EAAE,CACnH,CAAC,KAAuB,EAAE,EAAE,CAC1B,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAC/B,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC,CAAA;QAClD,OAAO,YAAY,CAA8B;YAC/C,OAAO;YACP,QAAQ,EAAE;gBACR,IAAI,EAAE,WAAW;gBACjB,GAAG;gBACH,SAAS;gBACT,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC;gBAClB,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;gBAC5C,eAAe,EAAE;oBACf,QAAQ,EAAE,UAAU;iBACrB;aACF;SACF,CAAQ,CAAA;IACX,CAAC;IAED,wCAAwC;IACxC,MAAM,sBAAsB,GAAG,EAAE,CAAA;IAEjC,IAAI,UAAU,GAAG,KAAK,CAAC,QAAQ,CAAA;IAE/B,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,sBAAsB,EAAE,CAAC;QACnD,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CACtB,yBAAyB,KAAK,CAAC,QAAQ,UAAU,sBAAsB,eAAe,KAAK,CAAC,QAAQ,CAAC,MAAM,cAAc,CAC1H,CAAA;QACD,UAAU,GAAG,QAAQ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAA;IACvD,CAAC;IAED,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC;QAC3C,OAAO;QACP,SAAS,EAAE,KAAK,CAAC,aAAa;QAC9B,QAAQ,EAAE,UAAU;KACrB,CAAC,CAAA;IAEF,OAAO,YAAY,CAA0B;QAC3C,OAAO;QACP,QAAQ,EAAE;YACR,IAAI,EAAE,MAAM;YACZ,GAAG;YACH,SAAS;YACT,QAAQ,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,iBAAiB,CAAC,KAAK,CAAC,QAAQ,CAAC;YACrD,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;YAC5C,eAAe,EAAE;gBACf,QAAQ,EAAE,UAAU;gBACpB,aAAa,EAAE,KAAK,CAAC,aAAa;gBAClC,YAAY,EAAE,GAAG,CAAC,eAAe,CAAC,UAAU,CAAC;aAC9C;SACF;KACF,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
package/dist/index_.d.ts
CHANGED
package/dist/index_.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index_.d.ts","sourceRoot":"","sources":["../src/index_.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAA;AACpC,cAAc,
|
|
1
|
+
{"version":3,"file":"index_.d.ts","sourceRoot":"","sources":["../src/index_.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAA;AACpC,cAAc,qBAAqB,CAAA"}
|
package/dist/index_.js
CHANGED
package/dist/index_.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index_.js","sourceRoot":"","sources":["../src/index_.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAA;AACpC,cAAc,
|
|
1
|
+
{"version":3,"file":"index_.js","sourceRoot":"","sources":["../src/index_.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAA;AACpC,cAAc,qBAAqB,CAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { PersistenceInfo, SqliteDb } from '@livestore/common';
|
|
2
|
+
export declare const makeSqliteDb: <TMetadata extends {
|
|
3
|
+
dbPointer: number;
|
|
4
|
+
persistenceInfo: PersistenceInfo;
|
|
5
|
+
deleteDb: () => void;
|
|
6
|
+
configureDb: (db: SqliteDb<TMetadata>) => void;
|
|
7
|
+
}>({ sqlite3, metadata, }: {
|
|
8
|
+
sqlite3: SQLiteAPI;
|
|
9
|
+
metadata: TMetadata;
|
|
10
|
+
}) => SqliteDb<TMetadata>;
|
|
11
|
+
//# sourceMappingURL=make-sqlite-db.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"make-sqlite-db.d.ts","sourceRoot":"","sources":["../src/make-sqlite-db.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EAGf,QAAQ,EAET,MAAM,mBAAmB,CAAA;AAM1B,eAAO,MAAM,YAAY,GACvB,SAAS,SAAS;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,eAAe,EAAE,eAAe,CAAA;IAChC,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,WAAW,EAAE,CAAC,EAAE,EAAE,QAAQ,CAAC,SAAS,CAAC,KAAK,IAAI,CAAA;CAC/C,0BAIA;IACD,OAAO,EAAE,SAAS,CAAA;IAClB,QAAQ,EAAE,SAAS,CAAA;CACpB,KAAG,QAAQ,CAAC,SAAS,CAkMrB,CAAA"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { SqliteError } from '@livestore/common';
|
|
2
|
+
import * as SqliteConstants from '@livestore/wa-sqlite/src/sqlite-constants.js';
|
|
3
|
+
import { makeInMemoryDb } from './in-memory-vfs.js';
|
|
4
|
+
export const makeSqliteDb = ({ sqlite3, metadata, }) => {
|
|
5
|
+
const preparedStmts = [];
|
|
6
|
+
const { dbPointer } = metadata;
|
|
7
|
+
let isClosed = false;
|
|
8
|
+
const sqliteDb = {
|
|
9
|
+
_tag: 'SqliteDb',
|
|
10
|
+
metadata,
|
|
11
|
+
prepare: (queryStr) => {
|
|
12
|
+
try {
|
|
13
|
+
const stmts = sqlite3.statements(dbPointer, queryStr.trim(), { unscoped: true });
|
|
14
|
+
let isFinalized = false;
|
|
15
|
+
const preparedStmt = {
|
|
16
|
+
execute: (bindValues, options) => {
|
|
17
|
+
for (const stmt of stmts) {
|
|
18
|
+
if (bindValues !== undefined && Object.keys(bindValues).length > 0) {
|
|
19
|
+
sqlite3.bind_collection(stmt, bindValues);
|
|
20
|
+
}
|
|
21
|
+
try {
|
|
22
|
+
sqlite3.step(stmt);
|
|
23
|
+
}
|
|
24
|
+
finally {
|
|
25
|
+
if (options?.onRowsChanged) {
|
|
26
|
+
options.onRowsChanged(sqlite3.changes(dbPointer));
|
|
27
|
+
}
|
|
28
|
+
sqlite3.reset(stmt); // Reset is needed for next execution
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
select: (bindValues) => {
|
|
33
|
+
if (stmts.length !== 1) {
|
|
34
|
+
throw new SqliteError({
|
|
35
|
+
query: { bindValues, sql: queryStr },
|
|
36
|
+
code: -1,
|
|
37
|
+
cause: 'Expected only one statement when using `select`',
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
const stmt = stmts[0];
|
|
41
|
+
if (bindValues !== undefined && Object.keys(bindValues).length > 0) {
|
|
42
|
+
sqlite3.bind_collection(stmt, bindValues);
|
|
43
|
+
}
|
|
44
|
+
const results = [];
|
|
45
|
+
try {
|
|
46
|
+
// NOTE `column_names` only works for `SELECT` statements, ignoring other statements for now
|
|
47
|
+
let columns = undefined;
|
|
48
|
+
try {
|
|
49
|
+
columns = sqlite3.column_names(stmt);
|
|
50
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
51
|
+
}
|
|
52
|
+
catch (_e) { }
|
|
53
|
+
while (sqlite3.step(stmt) === SqliteConstants.SQLITE_ROW) {
|
|
54
|
+
if (columns !== undefined) {
|
|
55
|
+
const obj = {};
|
|
56
|
+
for (let i = 0; i < columns.length; i++) {
|
|
57
|
+
obj[columns[i]] = sqlite3.column(stmt, i);
|
|
58
|
+
}
|
|
59
|
+
results.push(obj);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch (e) {
|
|
64
|
+
throw new SqliteError({
|
|
65
|
+
query: { bindValues, sql: queryStr },
|
|
66
|
+
code: e.code,
|
|
67
|
+
cause: e,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
finally {
|
|
71
|
+
// reset the cached statement so we can use it again in the future
|
|
72
|
+
sqlite3.reset(stmt);
|
|
73
|
+
}
|
|
74
|
+
return results;
|
|
75
|
+
},
|
|
76
|
+
finalize: () => {
|
|
77
|
+
// Avoid double finalization which leads to a crash
|
|
78
|
+
if (isFinalized) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
isFinalized = true;
|
|
82
|
+
for (const stmt of stmts) {
|
|
83
|
+
sqlite3.finalize(stmt);
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
sql: queryStr,
|
|
87
|
+
};
|
|
88
|
+
preparedStmts.push(preparedStmt);
|
|
89
|
+
return preparedStmt;
|
|
90
|
+
}
|
|
91
|
+
catch (e) {
|
|
92
|
+
throw new SqliteError({
|
|
93
|
+
query: { sql: queryStr, bindValues: {} },
|
|
94
|
+
code: e.code,
|
|
95
|
+
cause: e,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
},
|
|
99
|
+
export: () => sqlite3.serialize(dbPointer, 'main'),
|
|
100
|
+
execute: (queryStr, bindValues, options) => {
|
|
101
|
+
const stmt = sqliteDb.prepare(queryStr);
|
|
102
|
+
stmt.execute(bindValues, options);
|
|
103
|
+
stmt.finalize();
|
|
104
|
+
},
|
|
105
|
+
select: (queryStr, bindValues) => {
|
|
106
|
+
const stmt = sqliteDb.prepare(queryStr);
|
|
107
|
+
const results = stmt.select(bindValues);
|
|
108
|
+
stmt.finalize();
|
|
109
|
+
return results;
|
|
110
|
+
},
|
|
111
|
+
destroy: () => {
|
|
112
|
+
sqliteDb.close();
|
|
113
|
+
metadata.deleteDb();
|
|
114
|
+
// if (metadata._tag === 'opfs') {
|
|
115
|
+
// metadata.vfs.resetAccessHandle(metadata.fileName)
|
|
116
|
+
// }
|
|
117
|
+
},
|
|
118
|
+
close: () => {
|
|
119
|
+
if (isClosed) {
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
for (const stmt of preparedStmts) {
|
|
123
|
+
stmt.finalize();
|
|
124
|
+
}
|
|
125
|
+
sqlite3.close(dbPointer);
|
|
126
|
+
isClosed = true;
|
|
127
|
+
},
|
|
128
|
+
import: (source) => {
|
|
129
|
+
// https://www.sqlite.org/c3ref/c_deserialize_freeonclose.html
|
|
130
|
+
// #define SQLITE_DESERIALIZE_FREEONCLOSE 1 /* Call sqlite3_free() on close */
|
|
131
|
+
// #define SQLITE_DESERIALIZE_RESIZEABLE 2 /* Resize using sqlite3_realloc64() */
|
|
132
|
+
// #define SQLITE_DESERIALIZE_READONLY 4 /* Database is read-only */
|
|
133
|
+
const FREE_ON_CLOSE = 1;
|
|
134
|
+
const RESIZEABLE = 2;
|
|
135
|
+
// NOTE in case we'll have a future use-case where we need a read-only database, we can reuse this code below
|
|
136
|
+
// if (readOnly === true) {
|
|
137
|
+
// sqlite3.deserialize(db, 'main', bytes, bytes.length, bytes.length, FREE_ON_CLOSE | RESIZEABLE)
|
|
138
|
+
// } else {
|
|
139
|
+
if (source instanceof Uint8Array) {
|
|
140
|
+
const tmpDb = makeInMemoryDb(sqlite3);
|
|
141
|
+
// TODO find a way to do this more efficiently with sqlite to avoid either of the deserialize + backup call
|
|
142
|
+
// Maybe this can be done via the VFS API
|
|
143
|
+
sqlite3.deserialize(tmpDb.dbPointer, 'main', source, source.length, source.length, FREE_ON_CLOSE | RESIZEABLE);
|
|
144
|
+
sqlite3.backup(dbPointer, 'main', tmpDb.dbPointer, 'main');
|
|
145
|
+
sqlite3.close(tmpDb.dbPointer);
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
sqlite3.backup(dbPointer, 'main', source.metadata.dbPointer, 'main');
|
|
149
|
+
}
|
|
150
|
+
metadata.configureDb(sqliteDb);
|
|
151
|
+
},
|
|
152
|
+
session: () => {
|
|
153
|
+
const sessionPointer = sqlite3.session_create(dbPointer, 'main');
|
|
154
|
+
sqlite3.session_attach(sessionPointer, null);
|
|
155
|
+
return {
|
|
156
|
+
changeset: () => {
|
|
157
|
+
const res = sqlite3.session_changeset(sessionPointer);
|
|
158
|
+
return res.changeset ?? undefined;
|
|
159
|
+
},
|
|
160
|
+
finish: () => {
|
|
161
|
+
sqlite3.session_delete(sessionPointer);
|
|
162
|
+
},
|
|
163
|
+
};
|
|
164
|
+
},
|
|
165
|
+
makeChangeset: (data) => {
|
|
166
|
+
const changeset = {
|
|
167
|
+
invert: () => {
|
|
168
|
+
const inverted = sqlite3.changeset_invert(data);
|
|
169
|
+
return sqliteDb.makeChangeset(inverted);
|
|
170
|
+
},
|
|
171
|
+
apply: () => {
|
|
172
|
+
sqlite3.changeset_apply(dbPointer, data);
|
|
173
|
+
},
|
|
174
|
+
};
|
|
175
|
+
return changeset;
|
|
176
|
+
},
|
|
177
|
+
};
|
|
178
|
+
metadata.configureDb(sqliteDb);
|
|
179
|
+
return sqliteDb;
|
|
180
|
+
};
|
|
181
|
+
//# sourceMappingURL=make-sqlite-db.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"make-sqlite-db.js","sourceRoot":"","sources":["../src/make-sqlite-db.ts"],"names":[],"mappings":"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"}
|
package/dist/node/mod.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type MakeSqliteDb, type PersistenceInfo, type SqliteDb } from '@livestore/common';
|
|
2
2
|
import { Effect, FileSystem } from '@livestore/utils/effect';
|
|
3
3
|
import type { MemoryVFS } from '@livestore/wa-sqlite/src/examples/MemoryVFS.js';
|
|
4
4
|
import { NodeFS } from './NodeFS.js';
|
|
@@ -8,7 +8,7 @@ export type NodeDatabaseMetadataInMemory = {
|
|
|
8
8
|
dbPointer: number;
|
|
9
9
|
persistenceInfo: PersistenceInfo;
|
|
10
10
|
deleteDb: () => void;
|
|
11
|
-
configureDb: (db:
|
|
11
|
+
configureDb: (db: SqliteDb) => void;
|
|
12
12
|
};
|
|
13
13
|
export type NodeDatabaseMetadataFs = {
|
|
14
14
|
_tag: 'fs';
|
|
@@ -18,23 +18,23 @@ export type NodeDatabaseMetadataFs = {
|
|
|
18
18
|
directory: string;
|
|
19
19
|
}>;
|
|
20
20
|
deleteDb: () => void;
|
|
21
|
-
configureDb: (db:
|
|
21
|
+
configureDb: (db: SqliteDb) => void;
|
|
22
22
|
};
|
|
23
23
|
export type NodeDatabaseMetadata = NodeDatabaseMetadataInMemory | NodeDatabaseMetadataFs;
|
|
24
24
|
export type NodeDatabaseInputInMemory = {
|
|
25
25
|
_tag: 'in-memory';
|
|
26
|
-
configureDb?: (db:
|
|
26
|
+
configureDb?: (db: SqliteDb) => void;
|
|
27
27
|
};
|
|
28
28
|
export type NodeDatabaseInputFs = {
|
|
29
29
|
_tag: 'fs';
|
|
30
30
|
directory: string;
|
|
31
31
|
fileName: string;
|
|
32
|
-
configureDb?: (db:
|
|
32
|
+
configureDb?: (db: SqliteDb) => void;
|
|
33
33
|
};
|
|
34
34
|
export type NodeDatabaseInput = NodeDatabaseInputInMemory | NodeDatabaseInputFs;
|
|
35
|
-
export declare const
|
|
35
|
+
export declare const sqliteDbFactory: ({ sqlite3, }: {
|
|
36
36
|
sqlite3: SQLiteAPI;
|
|
37
|
-
}) => Effect.Effect<
|
|
37
|
+
}) => Effect.Effect<MakeSqliteDb<{
|
|
38
38
|
dbPointer: number;
|
|
39
39
|
persistenceInfo: PersistenceInfo;
|
|
40
40
|
}, NodeDatabaseInput, NodeDatabaseMetadata>, never, FileSystem.FileSystem>;
|
package/dist/node/mod.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../src/node/mod.ts"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../src/node/mod.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,eAAe,EAAE,KAAK,QAAQ,EAAmB,MAAM,mBAAmB,CAAA;AAC3G,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAE5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gDAAgD,CAAA;AAI/E,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,MAAM,MAAM,4BAA4B,GAAG;IACzC,IAAI,EAAE,WAAW,CAAA;IACjB,GAAG,EAAE,SAAS,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,eAAe,EAAE,eAAe,CAAA;IAChC,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,WAAW,EAAE,CAAC,EAAE,EAAE,QAAQ,KAAK,IAAI,CAAA;CACpC,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,IAAI,CAAA;IACV,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,EAAE,MAAM,CAAA;IACjB,eAAe,EAAE,eAAe,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACvD,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,WAAW,EAAE,CAAC,EAAE,EAAE,QAAQ,KAAK,IAAI,CAAA;CACpC,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG,4BAA4B,GAAG,sBAAsB,CAAA;AAExF,MAAM,MAAM,yBAAyB,GAAG;IACtC,IAAI,EAAE,WAAW,CAAA;IACjB,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,KAAK,IAAI,CAAA;CACrC,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,IAAI,CAAA;IACV,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,KAAK,IAAI,CAAA;CACrC,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG,yBAAyB,GAAG,mBAAmB,CAAA;AAE/E,eAAO,MAAM,eAAe,iBAEzB;IACD,OAAO,EAAE,SAAS,CAAA;CACnB,KAAG,MAAM,CAAC,MAAM,CACf,YAAY,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,eAAe,CAAA;CAAE,EAAE,iBAAiB,EAAE,oBAAoB,CAAC,EAC9G,KAAK,EACL,UAAU,CAAC,UAAU,CA0CpB,CAAA"}
|
package/dist/node/mod.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
|
-
import { UnexpectedError
|
|
2
|
+
import { UnexpectedError } from '@livestore/common';
|
|
3
3
|
import { Effect, FileSystem } from '@livestore/utils/effect';
|
|
4
4
|
import { makeInMemoryDb } from '../in-memory-vfs.js';
|
|
5
|
-
import {
|
|
5
|
+
import { makeSqliteDb } from '../make-sqlite-db.js';
|
|
6
6
|
import { NodeFS } from './NodeFS.js';
|
|
7
|
-
export const
|
|
7
|
+
export const sqliteDbFactory = ({ sqlite3, }) => Effect.andThen(FileSystem.FileSystem, (fs) => (input) => Effect.gen(function* () {
|
|
8
8
|
if (input._tag === 'in-memory') {
|
|
9
9
|
const { dbPointer, vfs } = makeInMemoryDb(sqlite3);
|
|
10
|
-
return
|
|
10
|
+
return makeSqliteDb({
|
|
11
11
|
sqlite3,
|
|
12
12
|
metadata: {
|
|
13
13
|
_tag: 'in-memory',
|
|
@@ -26,7 +26,7 @@ export const syncDbFactory = ({ sqlite3, }) => Effect.andThen(FileSystem.FileSys
|
|
|
26
26
|
fs,
|
|
27
27
|
});
|
|
28
28
|
const filePath = path.join(input.directory, input.fileName);
|
|
29
|
-
return
|
|
29
|
+
return makeSqliteDb({
|
|
30
30
|
sqlite3,
|
|
31
31
|
metadata: {
|
|
32
32
|
_tag: 'fs',
|
package/dist/node/mod.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mod.js","sourceRoot":"","sources":["../../src/node/mod.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,
|
|
1
|
+
{"version":3,"file":"mod.js","sourceRoot":"","sources":["../../src/node/mod.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@livestore/sqlite-wasm",
|
|
3
|
-
"version": "0.3.0-dev.
|
|
3
|
+
"version": "0.3.0-dev.12",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": {
|
|
@@ -23,8 +23,8 @@
|
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
25
|
"@livestore/wa-sqlite": "1.0.3-dev.7",
|
|
26
|
-
"@livestore/common": "0.3.0-dev.
|
|
27
|
-
"@livestore/utils": "0.3.0-dev.
|
|
26
|
+
"@livestore/common": "0.3.0-dev.12",
|
|
27
|
+
"@livestore/utils": "0.3.0-dev.12"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
30
|
"@types/chrome": "^0.0.299",
|
package/src/browser/mod.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { MakeSqliteDb, PersistenceInfo, SqliteDb } from '@livestore/common'
|
|
2
2
|
import { Effect, Hash } from '@livestore/utils/effect'
|
|
3
3
|
import type { MemoryVFS } from '@livestore/wa-sqlite/src/examples/MemoryVFS.js'
|
|
4
4
|
|
|
5
5
|
import { makeInMemoryDb } from '../in-memory-vfs.js'
|
|
6
|
-
import {
|
|
6
|
+
import { makeSqliteDb } from '../make-sqlite-db.js'
|
|
7
7
|
import type { AccessHandlePoolVFS } from './opfs/AccessHandlePoolVFS.js'
|
|
8
8
|
import { makeOpfsDb } from './opfs/index.js'
|
|
9
9
|
|
|
@@ -15,7 +15,7 @@ export type WebDatabaseMetadataInMemory = {
|
|
|
15
15
|
dbPointer: number
|
|
16
16
|
persistenceInfo: PersistenceInfo
|
|
17
17
|
deleteDb: () => void
|
|
18
|
-
configureDb: (db:
|
|
18
|
+
configureDb: (db: SqliteDb) => void
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
export type WebDatabaseMetadataOpfs = {
|
|
@@ -28,14 +28,14 @@ export type WebDatabaseMetadataOpfs = {
|
|
|
28
28
|
opfsFileName: string
|
|
29
29
|
}>
|
|
30
30
|
deleteDb: () => void
|
|
31
|
-
configureDb: (db:
|
|
31
|
+
configureDb: (db: SqliteDb) => void
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
export type WebDatabaseMetadata = WebDatabaseMetadataInMemory | WebDatabaseMetadataOpfs
|
|
35
35
|
|
|
36
36
|
export type WebDatabaseInputInMemory = {
|
|
37
37
|
_tag: 'in-memory'
|
|
38
|
-
configureDb?: (db:
|
|
38
|
+
configureDb?: (db: SqliteDb) => void
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
export type WebDatabaseInputOpfs = {
|
|
@@ -43,26 +43,22 @@ export type WebDatabaseInputOpfs = {
|
|
|
43
43
|
/** Filename of the database file (only used when exporting/downloading the database) */
|
|
44
44
|
fileName: string
|
|
45
45
|
opfsDirectory: string
|
|
46
|
-
configureDb?: (db:
|
|
46
|
+
configureDb?: (db: SqliteDb) => void
|
|
47
47
|
}
|
|
48
48
|
|
|
49
49
|
export type WebDatabaseInput = WebDatabaseInputInMemory | WebDatabaseInputOpfs
|
|
50
50
|
|
|
51
|
-
export const
|
|
51
|
+
export const sqliteDbFactory =
|
|
52
52
|
({
|
|
53
53
|
sqlite3,
|
|
54
54
|
}: {
|
|
55
55
|
sqlite3: SQLiteAPI
|
|
56
|
-
}):
|
|
57
|
-
{ dbPointer: number; persistenceInfo: PersistenceInfo },
|
|
58
|
-
WebDatabaseInput,
|
|
59
|
-
WebDatabaseMetadata
|
|
60
|
-
> =>
|
|
56
|
+
}): MakeSqliteDb<{ dbPointer: number; persistenceInfo: PersistenceInfo }, WebDatabaseInput, WebDatabaseMetadata> =>
|
|
61
57
|
(input: WebDatabaseInput) =>
|
|
62
58
|
Effect.gen(function* () {
|
|
63
59
|
if (input._tag === 'in-memory') {
|
|
64
60
|
const { dbPointer, vfs } = makeInMemoryDb(sqlite3)
|
|
65
|
-
return
|
|
61
|
+
return makeSqliteDb<WebDatabaseMetadataInMemory>({
|
|
66
62
|
sqlite3,
|
|
67
63
|
metadata: {
|
|
68
64
|
_tag: 'in-memory',
|
|
@@ -95,7 +91,7 @@ export const syncDbFactory =
|
|
|
95
91
|
fileName: dbFilename,
|
|
96
92
|
})
|
|
97
93
|
|
|
98
|
-
return
|
|
94
|
+
return makeSqliteDb<WebDatabaseMetadataOpfs>({
|
|
99
95
|
sqlite3,
|
|
100
96
|
metadata: {
|
|
101
97
|
_tag: 'opfs',
|
package/src/index_.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export * from '@livestore/wa-sqlite'
|
|
2
|
-
export * from './make-
|
|
2
|
+
export * from './make-sqlite-db.js'
|
|
@@ -2,20 +2,20 @@ import type {
|
|
|
2
2
|
PersistenceInfo,
|
|
3
3
|
PreparedBindValues,
|
|
4
4
|
PreparedStatement,
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
SqliteDb,
|
|
6
|
+
SqliteDbChangeset,
|
|
7
7
|
} from '@livestore/common'
|
|
8
8
|
import { SqliteError } from '@livestore/common'
|
|
9
9
|
import * as SqliteConstants from '@livestore/wa-sqlite/src/sqlite-constants.js'
|
|
10
10
|
|
|
11
11
|
import { makeInMemoryDb } from './in-memory-vfs.js'
|
|
12
12
|
|
|
13
|
-
export const
|
|
13
|
+
export const makeSqliteDb = <
|
|
14
14
|
TMetadata extends {
|
|
15
15
|
dbPointer: number
|
|
16
16
|
persistenceInfo: PersistenceInfo
|
|
17
17
|
deleteDb: () => void
|
|
18
|
-
configureDb: (db:
|
|
18
|
+
configureDb: (db: SqliteDb<TMetadata>) => void
|
|
19
19
|
},
|
|
20
20
|
>({
|
|
21
21
|
sqlite3,
|
|
@@ -23,14 +23,14 @@ export const makeSynchronousDatabase = <
|
|
|
23
23
|
}: {
|
|
24
24
|
sqlite3: SQLiteAPI
|
|
25
25
|
metadata: TMetadata
|
|
26
|
-
}):
|
|
26
|
+
}): SqliteDb<TMetadata> => {
|
|
27
27
|
const preparedStmts: PreparedStatement[] = []
|
|
28
28
|
const { dbPointer } = metadata
|
|
29
29
|
|
|
30
30
|
let isClosed = false
|
|
31
31
|
|
|
32
|
-
const
|
|
33
|
-
_tag: '
|
|
32
|
+
const sqliteDb: SqliteDb<TMetadata> = {
|
|
33
|
+
_tag: 'SqliteDb',
|
|
34
34
|
metadata,
|
|
35
35
|
prepare: (queryStr) => {
|
|
36
36
|
try {
|
|
@@ -131,18 +131,18 @@ export const makeSynchronousDatabase = <
|
|
|
131
131
|
},
|
|
132
132
|
export: () => sqlite3.serialize(dbPointer, 'main'),
|
|
133
133
|
execute: (queryStr, bindValues, options) => {
|
|
134
|
-
const stmt =
|
|
134
|
+
const stmt = sqliteDb.prepare(queryStr)
|
|
135
135
|
stmt.execute(bindValues, options)
|
|
136
136
|
stmt.finalize()
|
|
137
137
|
},
|
|
138
138
|
select: (queryStr, bindValues) => {
|
|
139
|
-
const stmt =
|
|
139
|
+
const stmt = sqliteDb.prepare(queryStr)
|
|
140
140
|
const results = stmt.select(bindValues)
|
|
141
141
|
stmt.finalize()
|
|
142
142
|
return results as ReadonlyArray<any>
|
|
143
143
|
},
|
|
144
144
|
destroy: () => {
|
|
145
|
-
|
|
145
|
+
sqliteDb.close()
|
|
146
146
|
|
|
147
147
|
metadata.deleteDb()
|
|
148
148
|
// if (metadata._tag === 'opfs') {
|
|
@@ -183,7 +183,7 @@ export const makeSynchronousDatabase = <
|
|
|
183
183
|
sqlite3.backup(dbPointer, 'main', source.metadata.dbPointer, 'main')
|
|
184
184
|
}
|
|
185
185
|
|
|
186
|
-
metadata.configureDb(
|
|
186
|
+
metadata.configureDb(sqliteDb)
|
|
187
187
|
},
|
|
188
188
|
session: () => {
|
|
189
189
|
const sessionPointer = sqlite3.session_create(dbPointer, 'main')
|
|
@@ -203,18 +203,18 @@ export const makeSynchronousDatabase = <
|
|
|
203
203
|
const changeset = {
|
|
204
204
|
invert: () => {
|
|
205
205
|
const inverted = sqlite3.changeset_invert(data)
|
|
206
|
-
return
|
|
206
|
+
return sqliteDb.makeChangeset(inverted)
|
|
207
207
|
},
|
|
208
208
|
apply: () => {
|
|
209
209
|
sqlite3.changeset_apply(dbPointer, data)
|
|
210
210
|
},
|
|
211
|
-
} satisfies
|
|
211
|
+
} satisfies SqliteDbChangeset
|
|
212
212
|
|
|
213
213
|
return changeset
|
|
214
214
|
},
|
|
215
|
-
} satisfies
|
|
215
|
+
} satisfies SqliteDb<TMetadata>
|
|
216
216
|
|
|
217
|
-
metadata.configureDb(
|
|
217
|
+
metadata.configureDb(sqliteDb)
|
|
218
218
|
|
|
219
|
-
return
|
|
219
|
+
return sqliteDb
|
|
220
220
|
}
|