@fireproof/core 0.19.5-dev → 0.19.8-dev-alldocs
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/{chunk-QHSXUST7.js → chunk-5UFCF36O.js} +3 -3
- package/{chunk-HCXR2M5B.js → chunk-DG6XSV44.js} +175 -7
- package/chunk-DG6XSV44.js.map +1 -0
- package/{chunk-H3A2HMMM.js → chunk-OWQAHX2V.js} +2 -2
- package/chunk-OWQAHX2V.js.map +1 -0
- package/{chunk-7OGPZSGT.js → chunk-PRQHQG4I.js} +2 -2
- package/index.cjs +248 -191
- package/index.cjs.map +1 -1
- package/index.d.cts +174 -68
- package/index.d.ts +174 -68
- package/index.global.js +24688 -0
- package/index.global.js.map +1 -0
- package/index.js +60 -127
- package/index.js.map +1 -1
- package/metafile-cjs.json +1 -1
- package/metafile-esm.json +1 -1
- package/metafile-iife.json +1 -0
- package/{node-sys-container-E7LADX2Z.js → node-sys-container-TTGEC66A.js} +2 -2
- package/package.json +1 -1
- package/{sqlite-data-store-YS4U7AQ4.js → sqlite-data-store-MA55LVQE.js} +4 -4
- package/{sqlite-meta-store-FJZSZG4R.js → sqlite-meta-store-UNQKVYRM.js} +4 -4
- package/{sqlite-wal-store-6JZ4URNS.js → sqlite-wal-store-KVUOC4PO.js} +4 -4
- package/{store-file-HMHPQTUV.js → store-file-WD746RSY.js} +3 -3
- package/{store-indexdb-MRVZG4OG.js → store-indexdb-NG45BU3Q.js} +4 -4
- package/{store-sql-5XMJ5OWJ.js → store-sql-QVFNIGND.js} +7 -69
- package/store-sql-QVFNIGND.js.map +1 -0
- package/tests/blockstore/loader.test.ts +265 -0
- package/tests/blockstore/store.test.ts +164 -0
- package/tests/blockstore/transaction.test.ts +121 -0
- package/tests/fireproof/config.test.ts +212 -0
- package/tests/fireproof/crdt.test.ts +434 -0
- package/tests/fireproof/database.test.ts +466 -0
- package/tests/fireproof/fireproof.test.ts +602 -0
- package/tests/fireproof/hello.test.ts +54 -0
- package/tests/fireproof/indexer.test.ts +389 -0
- package/tests/helpers.ts +81 -0
- package/tests/react/useFireproof.test.tsx +19 -0
- package/tests/www/gallery.html +132 -0
- package/tests/www/iife.html +42 -0
- package/tests/www/todo-aws.html +232 -0
- package/tests/www/todo-ipfs.html +213 -0
- package/tests/www/todo-local.html +214 -0
- package/tests/www/todo-netlify.html +227 -0
- package/tests/www/todo.html +236 -0
- package/chunk-H3A2HMMM.js.map +0 -1
- package/chunk-HCXR2M5B.js.map +0 -1
- package/store-sql-5XMJ5OWJ.js.map +0 -1
- /package/{chunk-QHSXUST7.js.map → chunk-5UFCF36O.js.map} +0 -0
- /package/{chunk-7OGPZSGT.js.map → chunk-PRQHQG4I.js.map} +0 -0
- /package/{node-sys-container-E7LADX2Z.js.map → node-sys-container-TTGEC66A.js.map} +0 -0
- /package/{sqlite-data-store-YS4U7AQ4.js.map → sqlite-data-store-MA55LVQE.js.map} +0 -0
- /package/{sqlite-meta-store-FJZSZG4R.js.map → sqlite-meta-store-UNQKVYRM.js.map} +0 -0
- /package/{sqlite-wal-store-6JZ4URNS.js.map → sqlite-wal-store-KVUOC4PO.js.map} +0 -0
- /package/{store-file-HMHPQTUV.js.map → store-file-WD746RSY.js.map} +0 -0
- /package/{store-indexdb-MRVZG4OG.js.map → store-indexdb-NG45BU3Q.js.map} +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
import {
|
2
2
|
join
|
3
|
-
} from "./chunk-
|
3
|
+
} from "./chunk-OWQAHX2V.js";
|
4
4
|
|
5
5
|
// src/runtime/node-sys-container.ts
|
6
6
|
async function createNodeSysContainer() {
|
@@ -26,4 +26,4 @@ async function createNodeSysContainer() {
|
|
26
26
|
export {
|
27
27
|
createNodeSysContainer
|
28
28
|
};
|
29
|
-
//# sourceMappingURL=node-sys-container-
|
29
|
+
//# sourceMappingURL=node-sys-container-TTGEC66A.js.map
|
package/package.json
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
import {
|
2
2
|
ensureSQLiteVersion
|
3
|
-
} from "./chunk-
|
3
|
+
} from "./chunk-PRQHQG4I.js";
|
4
4
|
import {
|
5
5
|
ensureLogger,
|
6
6
|
exception2Result,
|
7
7
|
getStore
|
8
|
-
} from "./chunk-
|
9
|
-
import "./chunk-
|
8
|
+
} from "./chunk-DG6XSV44.js";
|
9
|
+
import "./chunk-OWQAHX2V.js";
|
10
10
|
|
11
11
|
// src/runtime/store-sql/v0.19-sqlite/sqlite-data-store.ts
|
12
12
|
import { KeyedResolvOnce, Result } from "@adviser/cement";
|
@@ -117,4 +117,4 @@ export {
|
|
117
117
|
DataSQLRecordBuilder,
|
118
118
|
V0_18_0SQLiteDataStore
|
119
119
|
};
|
120
|
-
//# sourceMappingURL=sqlite-data-store-
|
120
|
+
//# sourceMappingURL=sqlite-data-store-MA55LVQE.js.map
|
@@ -1,12 +1,12 @@
|
|
1
1
|
import {
|
2
2
|
ensureSQLiteVersion
|
3
|
-
} from "./chunk-
|
3
|
+
} from "./chunk-PRQHQG4I.js";
|
4
4
|
import {
|
5
5
|
ensureLogger,
|
6
6
|
exception2Result,
|
7
7
|
getStore
|
8
|
-
} from "./chunk-
|
9
|
-
import "./chunk-
|
8
|
+
} from "./chunk-DG6XSV44.js";
|
9
|
+
import "./chunk-OWQAHX2V.js";
|
10
10
|
|
11
11
|
// src/runtime/store-sql/v0.19-sqlite/sqlite-meta-store.ts
|
12
12
|
import { KeyedResolvOnce, Result } from "@adviser/cement";
|
@@ -134,4 +134,4 @@ export {
|
|
134
134
|
MetaSQLRecordBuilder,
|
135
135
|
V0_18_0SQLiteMetaStore
|
136
136
|
};
|
137
|
-
//# sourceMappingURL=sqlite-meta-store-
|
137
|
+
//# sourceMappingURL=sqlite-meta-store-UNQKVYRM.js.map
|
@@ -1,12 +1,12 @@
|
|
1
1
|
import {
|
2
2
|
ensureSQLiteVersion
|
3
|
-
} from "./chunk-
|
3
|
+
} from "./chunk-PRQHQG4I.js";
|
4
4
|
import {
|
5
5
|
ensureLogger,
|
6
6
|
exception2Result,
|
7
7
|
getStore
|
8
|
-
} from "./chunk-
|
9
|
-
import "./chunk-
|
8
|
+
} from "./chunk-DG6XSV44.js";
|
9
|
+
import "./chunk-OWQAHX2V.js";
|
10
10
|
|
11
11
|
// src/runtime/store-sql/v0.19-sqlite/sqlite-wal-store.ts
|
12
12
|
import { KeyedResolvOnce, Result } from "@adviser/cement";
|
@@ -120,4 +120,4 @@ export {
|
|
120
120
|
V0_18_0SQLiteWalStore,
|
121
121
|
WalSQLRecordBuilder
|
122
122
|
};
|
123
|
-
//# sourceMappingURL=sqlite-wal-store-
|
123
|
+
//# sourceMappingURL=sqlite-wal-store-KVUOC4PO.js.map
|
@@ -11,10 +11,10 @@ import {
|
|
11
11
|
getFileName,
|
12
12
|
getPath,
|
13
13
|
getStore
|
14
|
-
} from "./chunk-
|
14
|
+
} from "./chunk-DG6XSV44.js";
|
15
15
|
import {
|
16
16
|
SysContainer
|
17
|
-
} from "./chunk-
|
17
|
+
} from "./chunk-OWQAHX2V.js";
|
18
18
|
|
19
19
|
// src/runtime/store-file.ts
|
20
20
|
import { ResolveOnce, Result } from "@adviser/cement";
|
@@ -190,4 +190,4 @@ export {
|
|
190
190
|
FileTestStore,
|
191
191
|
FileWALGateway
|
192
192
|
};
|
193
|
-
//# sourceMappingURL=store-file-
|
193
|
+
//# sourceMappingURL=store-file-WD746RSY.js.map
|
@@ -5,10 +5,10 @@ import {
|
|
5
5
|
IndexDBWalGateway,
|
6
6
|
getIndexDBName,
|
7
7
|
guardVersion
|
8
|
-
} from "./chunk-
|
8
|
+
} from "./chunk-5UFCF36O.js";
|
9
9
|
import "./chunk-VZGT7ZYP.js";
|
10
|
-
import "./chunk-
|
11
|
-
import "./chunk-
|
10
|
+
import "./chunk-DG6XSV44.js";
|
11
|
+
import "./chunk-OWQAHX2V.js";
|
12
12
|
export {
|
13
13
|
IndexDBDataGateway,
|
14
14
|
IndexDBMetaGateway,
|
@@ -17,4 +17,4 @@ export {
|
|
17
17
|
getIndexDBName,
|
18
18
|
guardVersion
|
19
19
|
};
|
20
|
-
//# sourceMappingURL=store-indexdb-
|
20
|
+
//# sourceMappingURL=store-indexdb-NG45BU3Q.js.map
|
@@ -3,83 +3,21 @@ import {
|
|
3
3
|
} from "./chunk-VZGT7ZYP.js";
|
4
4
|
import {
|
5
5
|
ensureLogger,
|
6
|
+
ensureSQLOpts,
|
6
7
|
exception2Result,
|
7
8
|
exceptionWrapper,
|
8
9
|
getKey,
|
9
10
|
getName
|
10
|
-
} from "./chunk-
|
11
|
+
} from "./chunk-DG6XSV44.js";
|
11
12
|
import {
|
12
13
|
SysContainer
|
13
|
-
} from "./chunk-
|
14
|
+
} from "./chunk-OWQAHX2V.js";
|
14
15
|
|
15
16
|
// src/runtime/store-sql/store-sql.ts
|
16
17
|
import { Result } from "@adviser/cement";
|
17
18
|
|
18
19
|
// src/runtime/store-sql/sqlite-adapter-better-sqlite3.ts
|
19
20
|
import { KeyedResolvOnce } from "@adviser/cement";
|
20
|
-
|
21
|
-
// src/runtime/store-sql/types.ts
|
22
|
-
var DefaultSQLTableNames = {
|
23
|
-
data: "Datas",
|
24
|
-
meta: "Metas",
|
25
|
-
wal: "Wals"
|
26
|
-
};
|
27
|
-
|
28
|
-
// src/runtime/store-sql/ensurer.ts
|
29
|
-
function sqlTableName(...names) {
|
30
|
-
return names.map((name) => name.replace(/^[^a-zA-Z0-9]+/, "").replace(/[^a-zA-Z0-9]+/g, "_")).filter((i) => i.length).join("_");
|
31
|
-
}
|
32
|
-
function ensureTableNames(url, opts) {
|
33
|
-
let isIndex = "";
|
34
|
-
if (url.searchParams.has("index")) {
|
35
|
-
isIndex = url.searchParams.get("index") || ".idx";
|
36
|
-
}
|
37
|
-
const ret = opts?.tableNames || DefaultSQLTableNames;
|
38
|
-
if (isIndex.length) {
|
39
|
-
return {
|
40
|
-
data: sqlTableName(isIndex, ret.data),
|
41
|
-
meta: sqlTableName(isIndex, ret.meta),
|
42
|
-
wal: sqlTableName(isIndex, ret.wal)
|
43
|
-
};
|
44
|
-
}
|
45
|
-
return {
|
46
|
-
data: sqlTableName(ret.data),
|
47
|
-
meta: sqlTableName(ret.meta),
|
48
|
-
wal: sqlTableName(ret.wal)
|
49
|
-
};
|
50
|
-
}
|
51
|
-
var textEncoder = new TextEncoder();
|
52
|
-
function ensureTextEncoder(opts) {
|
53
|
-
return opts?.textEncoder || textEncoder;
|
54
|
-
}
|
55
|
-
var textDecoder = new TextDecoder();
|
56
|
-
function ensureTextDecoder(opts) {
|
57
|
-
return opts?.textDecoder || textDecoder;
|
58
|
-
}
|
59
|
-
function url2sqlFlavor(url, logger) {
|
60
|
-
const flavor = url.protocol.replace(/:.*$/, "");
|
61
|
-
switch (flavor) {
|
62
|
-
case "sqlite":
|
63
|
-
case "mysql":
|
64
|
-
case "postgres":
|
65
|
-
return flavor;
|
66
|
-
default:
|
67
|
-
throw logger.Error().Str("flavor", flavor).Msg("unsupported protocol").AsError();
|
68
|
-
}
|
69
|
-
}
|
70
|
-
function ensureSQLOpts(url, opts, componentName, ctx) {
|
71
|
-
const logger = ensureLogger(opts, componentName, ctx);
|
72
|
-
return {
|
73
|
-
url,
|
74
|
-
sqlFlavor: url2sqlFlavor(url, logger),
|
75
|
-
tableNames: ensureTableNames(url, opts),
|
76
|
-
logger,
|
77
|
-
textEncoder: ensureTextEncoder(opts),
|
78
|
-
textDecoder: ensureTextDecoder(opts)
|
79
|
-
};
|
80
|
-
}
|
81
|
-
|
82
|
-
// src/runtime/store-sql/sqlite-adapter-better-sqlite3.ts
|
83
21
|
var onceSQLiteConnections = new KeyedResolvOnce();
|
84
22
|
var SQLiteConnection = class _SQLiteConnection {
|
85
23
|
static fromURL(url, opts = {}) {
|
@@ -150,7 +88,7 @@ function SQLConnectionFactory(databaseURL, opts = {}) {
|
|
150
88
|
async function WalStoreFactory(db) {
|
151
89
|
switch (db.opts.sqlFlavor) {
|
152
90
|
case "sqlite": {
|
153
|
-
const { V0_18_0SQLiteWalStore } = await import("./sqlite-wal-store-
|
91
|
+
const { V0_18_0SQLiteWalStore } = await import("./sqlite-wal-store-KVUOC4PO.js");
|
154
92
|
const store = new V0_18_0SQLiteWalStore(db);
|
155
93
|
return store;
|
156
94
|
}
|
@@ -161,7 +99,7 @@ async function WalStoreFactory(db) {
|
|
161
99
|
async function DataStoreFactory(db) {
|
162
100
|
switch (db.opts.sqlFlavor) {
|
163
101
|
case "sqlite": {
|
164
|
-
const { V0_18_0SQLiteDataStore } = await import("./sqlite-data-store-
|
102
|
+
const { V0_18_0SQLiteDataStore } = await import("./sqlite-data-store-MA55LVQE.js");
|
165
103
|
const store = new V0_18_0SQLiteDataStore(db);
|
166
104
|
return store;
|
167
105
|
}
|
@@ -172,7 +110,7 @@ async function DataStoreFactory(db) {
|
|
172
110
|
async function MetaStoreFactory(db) {
|
173
111
|
switch (db.opts.sqlFlavor) {
|
174
112
|
case "sqlite": {
|
175
|
-
const { V0_18_0SQLiteMetaStore } = await import("./sqlite-meta-store-
|
113
|
+
const { V0_18_0SQLiteMetaStore } = await import("./sqlite-meta-store-UNQKVYRM.js");
|
176
114
|
const store = new V0_18_0SQLiteMetaStore(db);
|
177
115
|
return store;
|
178
116
|
}
|
@@ -403,4 +341,4 @@ export {
|
|
403
341
|
SQLTestStore,
|
404
342
|
SQLWalGateway
|
405
343
|
};
|
406
|
-
//# sourceMappingURL=store-sql-
|
344
|
+
//# sourceMappingURL=store-sql-QVFNIGND.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"sources":["../../src/runtime/store-sql/store-sql.ts","../../src/runtime/store-sql/sqlite-adapter-better-sqlite3.ts","../../src/runtime/store-sql/sql-connection-factory.ts","../../src/runtime/store-sql/store-version-factory.ts"],"sourcesContent":["import { Logger, Result } from \"@adviser/cement\";\n\nimport { TestStore } from \"../../blockstore/types.js\";\nimport { SQLConnectionFactory } from \"./sql-connection-factory.js\";\nimport { DataSQLStore, MetaSQLStore, WalSQLStore } from \"./types.js\";\nimport { DataStoreFactory, MetaStoreFactory, WalStoreFactory } from \"./store-version-factory.js\";\nimport { ensureLogger, exception2Result, exceptionWrapper, getKey, getName } from \"../../utils.js\";\nimport { Gateway, GetResult, NotFoundError } from \"../../blockstore/gateway.js\";\n\nexport class SQLWalGateway implements Gateway {\n readonly logger: Logger;\n walSQLStore: WalSQLStore = {} as WalSQLStore;\n constructor(logger: Logger) {\n this.logger = ensureLogger(logger, \"SQLWalGateway\");\n }\n\n buildUrl(baseUrl: URL, key: string): Promise<Result<URL>> {\n const url = new URL(baseUrl.toString());\n url.searchParams.set(\"key\", key);\n return Promise.resolve(Result.Ok(url));\n }\n\n async start(baseUrl: URL): Promise<Result<void>> {\n return exception2Result(async () => {\n this.logger.Debug().Url(baseUrl).Msg(\"start\");\n const conn = SQLConnectionFactory(baseUrl);\n const ws = await WalStoreFactory(conn);\n await ws.start(baseUrl);\n this.walSQLStore = ws;\n });\n }\n close(baseUrl: URL) {\n return this.walSQLStore.close(baseUrl);\n }\n destroy(baseUrl: URL) {\n return this.walSQLStore.destroy(baseUrl);\n }\n\n async put(url: URL, body: Uint8Array): Promise<Result<void>> {\n return exception2Result(async () => {\n const branch = getKey(url, this.logger);\n const name = getName(url, this.logger);\n await this.walSQLStore.insert(url, {\n state: body,\n updated_at: new Date(),\n name,\n branch,\n });\n });\n }\n async get(url: URL): Promise<GetResult> {\n return exceptionWrapper(async () => {\n const branch = getKey(url, this.logger);\n const name = getName(url, this.logger);\n const record = await this.walSQLStore.select(url, { name, branch });\n if (record.length === 0) {\n return Result.Err(new NotFoundError(`not found ${name} ${branch}`));\n }\n return Result.Ok(record[0].state);\n });\n }\n async delete(url: URL): Promise<Result<void>> {\n return exception2Result(async () => {\n const branch = getKey(url, this.logger);\n const name = getName(url, this.logger);\n await this.walSQLStore.delete(url, { name, branch });\n });\n }\n}\n\nexport class SQLMetaGateway implements Gateway {\n readonly logger: Logger;\n metaSQLStore: MetaSQLStore = {} as MetaSQLStore;\n constructor(logger: Logger) {\n this.logger = ensureLogger(logger, \"SQLMetaGateway\");\n }\n\n buildUrl(baseUrl: URL, key: string): Promise<Result<URL>> {\n const url = new URL(baseUrl.toString());\n url.searchParams.set(\"key\", key);\n return Promise.resolve(Result.Ok(url));\n }\n\n async start(baseUrl: URL): Promise<Result<void>> {\n return exception2Result(async () => {\n this.logger.Debug().Url(baseUrl).Msg(\"start\");\n const conn = SQLConnectionFactory(baseUrl);\n const ws = await MetaStoreFactory(conn);\n await ws.start(baseUrl);\n this.metaSQLStore = ws;\n this.logger.Debug().Url(baseUrl).Msg(\"started\");\n });\n }\n close(baseUrl: URL): Promise<Result<void>> {\n return this.metaSQLStore.close(baseUrl);\n }\n destroy(baseUrl: URL): Promise<Result<void>> {\n return this.metaSQLStore.destroy(baseUrl);\n }\n\n async put(url: URL, body: Uint8Array): Promise<Result<void>> {\n return exception2Result(async () => {\n const branch = getKey(url, this.logger);\n const name = getName(url, this.logger);\n await this.metaSQLStore.insert(url, {\n meta: body,\n updated_at: new Date(),\n name,\n branch,\n });\n });\n }\n async get(url: URL): Promise<GetResult> {\n return exceptionWrapper(async () => {\n const branch = getKey(url, this.logger);\n const name = getName(url, this.logger);\n const record = await this.metaSQLStore.select(url, {\n name,\n branch,\n });\n if (record.length === 0) {\n return Result.Err(new NotFoundError(`not found ${name} ${branch}`));\n }\n return Result.Ok(record[0].meta);\n });\n }\n async delete(url: URL): Promise<Result<void>> {\n return exception2Result(async () => {\n const branch = getKey(url, this.logger);\n const name = getName(url, this.logger);\n await this.metaSQLStore.delete(url, {\n name,\n branch,\n });\n });\n }\n}\n\nexport class SQLDataGateway implements Gateway {\n readonly logger: Logger;\n dataSQLStore: DataSQLStore = {} as DataSQLStore;\n constructor(logger: Logger) {\n this.logger = ensureLogger(logger, \"SQLDataGateway\");\n }\n\n buildUrl(baseUrl: URL, key: string): Promise<Result<URL>> {\n const url = new URL(baseUrl.toString());\n url.searchParams.set(\"key\", key);\n return Promise.resolve(Result.Ok(url));\n }\n\n async start(baseUrl: URL): Promise<Result<void>> {\n return exception2Result(async () => {\n this.logger.Debug().Url(baseUrl).Msg(\"pre-sql-connection\");\n const conn = SQLConnectionFactory(baseUrl);\n this.logger.Debug().Url(baseUrl).Msg(\"post-sql-connection\");\n const ws = await DataStoreFactory(conn);\n this.logger.Debug().Url(baseUrl).Msg(\"post-data-store-factory\");\n await ws.start(baseUrl);\n this.dataSQLStore = ws;\n this.logger.Debug().Url(baseUrl).Msg(\"started\");\n });\n }\n close(baseUrl: URL): Promise<Result<void>> {\n return this.dataSQLStore.close(baseUrl);\n }\n destroy(baseUrl: URL): Promise<Result<void>> {\n return this.dataSQLStore.destroy(baseUrl);\n }\n\n async put(url: URL, body: Uint8Array): Promise<Result<void>> {\n return exception2Result(async () => {\n const cid = getKey(url, this.logger);\n const name = getName(url, this.logger);\n await this.dataSQLStore.insert(url, {\n data: body,\n updated_at: new Date(),\n name: name,\n car: cid,\n });\n });\n }\n async get(url: URL): Promise<GetResult> {\n return exceptionWrapper(async () => {\n const branch = getKey(url, this.logger);\n const record = await this.dataSQLStore.select(url, branch);\n if (record.length === 0) {\n return Result.Err(new NotFoundError(`not found ${branch}`));\n }\n return Result.Ok(record[0].data);\n });\n }\n async delete(url: URL): Promise<Result<void>> {\n return exception2Result(async () => {\n const branch = getKey(url, this.logger);\n await this.dataSQLStore.delete(url, branch);\n return Result.Ok(undefined);\n });\n }\n}\n\nexport class SQLTestStore implements TestStore {\n readonly logger: Logger;\n constructor(ilogger: Logger) {\n const logger = ensureLogger(ilogger, \"SQLTestStore\");\n this.logger = logger;\n }\n async get(url: URL, key: string): Promise<Uint8Array> {\n const conn = SQLConnectionFactory(url);\n const name = getName(url, this.logger);\n switch (url.searchParams.get(\"store\")) {\n case \"wal\": {\n const sqlStore = await WalStoreFactory(conn);\n await sqlStore.start(url);\n const records = await sqlStore.select(url, {\n name,\n branch: key,\n });\n return records[0].state;\n }\n case \"meta\": {\n const sqlStore = await MetaStoreFactory(conn);\n await sqlStore.start(url);\n const records = await sqlStore.select(url, {\n name,\n branch: key,\n });\n return records[0].meta;\n }\n case \"data\": {\n const sqlStore = await DataStoreFactory(conn);\n await sqlStore.start(url);\n const records = await sqlStore.select(url, key);\n return records[0].data;\n }\n default:\n throw this.logger.Error().Str(\"key\", key).Msg(`Method not implemented`);\n }\n }\n}\n","import type { Database } from \"better-sqlite3\";\nimport { KeyedResolvOnce, Logger } from \"@adviser/cement\";\n\nimport { DBConnection, SQLOpts } from \"./types.js\";\nimport { SysContainer } from \"../sys-container.js\";\nimport { ensureSQLOpts } from \"./ensurer.js\";\n\n// export function SimpleSQLite(filename: string, opts?: Partial<SQLOpts>): StoreOpts {\n// ensureLogger(opts, \"SimpleSQLite\").Debug().Str(\"filename\", filename).Msg(\"SimpleSQLite\")\n// const db = SQLiteConnection.fromFilename(filename, opts)\n// return SQLiteStoreOptions({\n// data: DataStoreFactory(db, opts),\n// meta: MetaStoreFactory(db, opts),\n// wal: WalStoreFactory(db, opts)\n// }, opts)\n// }\n\nconst onceSQLiteConnections = new KeyedResolvOnce<Database>();\nexport class SQLiteConnection implements DBConnection {\n static fromURL(url: URL, opts: Partial<SQLOpts> = {}): DBConnection {\n return new SQLiteConnection(url, opts);\n }\n readonly url: URL;\n readonly logger: Logger;\n _client?: Database;\n\n readonly opts: SQLOpts;\n\n get client(): Database {\n if (!this._client) {\n throw this.logger.Error().Msg(\"client not connected\").AsError();\n }\n return this._client;\n }\n\n private constructor(url: URL, opts: Partial<SQLOpts>) {\n // console.log(\"better-sqlite3->url->\", url);\n this.opts = ensureSQLOpts(url, opts, \"SQLiteConnection\", { url });\n this.logger = this.opts.logger;\n this.url = url;\n this.logger.Debug().Msg(\"constructor\");\n }\n async connect(): Promise<void> {\n let fName = this.url.toString().replace(\"sqlite://\", \"\").replace(/\\?.*$/, \"\");\n if (!fName) {\n throw this.logger.Error().Str(\"url\", this.url.toString()).Msg(\"filename is empty\").AsError();\n }\n // const version = this.url.searchParams.get(\"version\");\n // if (!version) {\n // throw this.logger.Error().Str(\"url\", this.url.toString()).Msg(\"version not found\").AsError();\n // }\n const hasName = this.url.searchParams.get(\"name\");\n if (hasName) {\n fName = SysContainer.join(fName, hasName);\n if (!fName.endsWith(\".sqlite\")) {\n fName += \".sqlite\";\n }\n }\n this._client = await onceSQLiteConnections.get(fName).once(async () => {\n this.logger.Debug().Str(\"filename\", fName).Msg(\"connect\");\n const Sqlite3Database = (await import(\"better-sqlite3\")).default;\n if (hasName) {\n await SysContainer.mkdir(SysContainer.dirname(fName), { recursive: true });\n }\n const db = new Sqlite3Database(fName, {\n // verbose: console.log,\n nativeBinding: \"./node_modules/better-sqlite3/build/Release/better_sqlite3.node\",\n });\n // this.logger.Debug().Any(\"client\", this.client).Msg(\"connected\")\n if (!db) {\n throw this.logger.Error().Msg(\"connect failed\").AsError();\n }\n return db;\n });\n }\n async close(): Promise<void> {\n this.logger.Debug().Msg(\"close\");\n await this.client.close();\n }\n}\n","import { ensureLogger } from \"../../utils.js\";\nimport { SQLiteConnection } from \"./sqlite-adapter-better-sqlite3.js\";\nimport { DBConnection, SQLOpts } from \"./types.js\";\n\nexport function SQLConnectionFactory(databaseURL: URL, opts: Partial<SQLOpts> = {}): DBConnection {\n const logger = ensureLogger(opts, \"SQLFactory\");\n switch (databaseURL.protocol) {\n case \"sqlite:\":\n logger.Debug().Str(\"databaseURL\", databaseURL.toString()).Msg(\"connecting to sqlite\");\n return SQLiteConnection.fromURL(databaseURL, {\n ...opts,\n logger,\n });\n default:\n throw logger\n .Error()\n .Msg(\"unsupported protocol \" + databaseURL.protocol)\n .AsError();\n }\n}\n","import { Logger } from \"@adviser/cement\";\nimport { ensureLogger, LoggerOpts } from \"../../utils\";\nimport { DBConnection, DataSQLStore, MetaSQLStore, WalSQLStore } from \"./types\";\nimport { SQLITE_VERSION } from \"./v0.19-sqlite/version\";\n\nexport function prepareSQLVersion(iurl: URL, opts: LoggerOpts | Logger): URL {\n if (iurl.searchParams.get(\"version\")) return iurl;\n const url = new URL(iurl.toString());\n switch (url.protocol) {\n case \"sqlite:\":\n {\n url.searchParams.set(\"version\", SQLITE_VERSION);\n }\n break;\n default:\n throw ensureLogger(opts, \"ensureSQLVersion\").Error().Str(\"url\", url.toString()).Msg(\"unsupported protocol\").AsError();\n }\n return url;\n}\n\nexport async function WalStoreFactory(db: DBConnection): Promise<WalSQLStore> {\n switch (db.opts.sqlFlavor) {\n case \"sqlite\": {\n const { V0_18_0SQLiteWalStore } = await import(\"./v0.19-sqlite/sqlite-wal-store.js\");\n const store = new V0_18_0SQLiteWalStore(db);\n return store;\n }\n default:\n throw ensureLogger(db.opts, \"WalStoreFactory\").Error().Msg(\"unsupported db connection\").AsError();\n }\n}\n\nexport async function DataStoreFactory(db: DBConnection): Promise<DataSQLStore> {\n switch (db.opts.sqlFlavor) {\n case \"sqlite\": {\n const { V0_18_0SQLiteDataStore } = await import(\"./v0.19-sqlite/sqlite-data-store.js\");\n const store = new V0_18_0SQLiteDataStore(db);\n return store;\n }\n default:\n throw ensureLogger(db.opts, \"DataStoreFactory\").Error().Msg(\"unsupported db connection\").AsError();\n }\n}\n\nexport async function MetaStoreFactory(db: DBConnection): Promise<MetaSQLStore> {\n switch (db.opts.sqlFlavor) {\n case \"sqlite\": {\n const { V0_18_0SQLiteMetaStore } = await import(\"./v0.19-sqlite/sqlite-meta-store.js\");\n const store = new V0_18_0SQLiteMetaStore(db);\n return store;\n }\n default:\n throw ensureLogger(db.opts, \"MetaStoreFactory\").Error().Msg(\"unsupported db connection\").AsError();\n }\n}\n"],"mappings":"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","names":[]}
|
@@ -0,0 +1,265 @@
|
|
1
|
+
import * as codec from "@ipld/dag-cbor";
|
2
|
+
import { sha256 as hasher } from "multiformats/hashes/sha2";
|
3
|
+
import { BlockView } from "multiformats";
|
4
|
+
import { encode } from "multiformats/block";
|
5
|
+
import { CID } from "multiformats/cid";
|
6
|
+
import { MemoryBlockstore } from "@web3-storage/pail/block";
|
7
|
+
import { CRDTMeta, IndexTransactionMeta, bs, rt } from "@fireproof/core";
|
8
|
+
|
9
|
+
class MyMemoryBlockStore extends bs.EncryptedBlockstore {
|
10
|
+
readonly memblock = new MemoryBlockstore();
|
11
|
+
constructor() {
|
12
|
+
const ebOpts = {
|
13
|
+
name: "MyMemoryBlockStore",
|
14
|
+
};
|
15
|
+
super(ebOpts);
|
16
|
+
}
|
17
|
+
ready(): Promise<void> {
|
18
|
+
return Promise.resolve();
|
19
|
+
}
|
20
|
+
close(): Promise<void> {
|
21
|
+
return this.loader.close();
|
22
|
+
}
|
23
|
+
loader = new bs.Loader("MyMemoryBlockStore", {});
|
24
|
+
readonly transactions = new Set<bs.CarTransaction>();
|
25
|
+
// readonly lastTxMeta?: TransactionMeta;
|
26
|
+
readonly compacting: boolean = false;
|
27
|
+
|
28
|
+
override async put(cid: bs.AnyAnyLink, block: Uint8Array): Promise<void> {
|
29
|
+
return this.memblock.put(cid, block);
|
30
|
+
}
|
31
|
+
|
32
|
+
// transaction<M ext(fn: (t: CarTransaction) => Promise<MetaType>, opts?: { noLoader: boolean }): Promise<MetaType> {
|
33
|
+
// throw new Error("Method not implemented.");
|
34
|
+
// }
|
35
|
+
|
36
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
37
|
+
getFile(car: bs.AnyLink, cid: bs.AnyLink, isPublic?: boolean): Promise<Uint8Array> {
|
38
|
+
throw new Error("Method not implemented.");
|
39
|
+
}
|
40
|
+
compact(): Promise<void> {
|
41
|
+
throw new Error("Method not implemented.");
|
42
|
+
}
|
43
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
44
|
+
defaultCompact(blocks: bs.CompactionFetcher): Promise<bs.TransactionMeta> {
|
45
|
+
throw new Error("Method not implemented.");
|
46
|
+
}
|
47
|
+
}
|
48
|
+
|
49
|
+
describe("basic Loader simple", function () {
|
50
|
+
let loader: bs.Loader;
|
51
|
+
let block: BlockView;
|
52
|
+
let t: bs.CarTransaction;
|
53
|
+
|
54
|
+
afterEach(async function () {
|
55
|
+
await loader.close();
|
56
|
+
await loader.destroy();
|
57
|
+
});
|
58
|
+
|
59
|
+
beforeEach(async function () {
|
60
|
+
const testDbName = "test-loader-commit";
|
61
|
+
await rt.SysContainer.start();
|
62
|
+
const mockM = new MyMemoryBlockStore();
|
63
|
+
t = new bs.CarTransaction(mockM as bs.EncryptedBlockstore);
|
64
|
+
loader = new bs.Loader(testDbName, { public: true });
|
65
|
+
await loader.ready();
|
66
|
+
block = await encode({
|
67
|
+
value: { hello: "world" },
|
68
|
+
hasher,
|
69
|
+
codec,
|
70
|
+
});
|
71
|
+
await t.put(block.cid, block.bytes);
|
72
|
+
await mockM.put(block.cid, block.bytes);
|
73
|
+
});
|
74
|
+
it("should have an empty car log", function () {
|
75
|
+
expect(loader.carLog.length).toBe(0);
|
76
|
+
});
|
77
|
+
it("should commit", async function () {
|
78
|
+
const carGroup = await loader.commit(t, { head: [block.cid] });
|
79
|
+
expect(loader.carLog.length).toBe(1);
|
80
|
+
const reader = await loader.loadCar(carGroup[0]);
|
81
|
+
expect(reader).toBeTruthy();
|
82
|
+
const parsed = await bs.parseCarFile<CRDTMeta>(reader, loader.logger);
|
83
|
+
expect(parsed.cars).toBeTruthy();
|
84
|
+
expect(parsed.cars.length).toBe(0);
|
85
|
+
expect(parsed.meta).toBeTruthy();
|
86
|
+
expect(parsed.meta.head).toBeTruthy();
|
87
|
+
});
|
88
|
+
});
|
89
|
+
|
90
|
+
describe("basic Loader with two commits", function () {
|
91
|
+
let loader: bs.Loader;
|
92
|
+
let block: BlockView;
|
93
|
+
let block2: BlockView;
|
94
|
+
let block3: BlockView;
|
95
|
+
let block4: BlockView;
|
96
|
+
let t: bs.CarTransaction;
|
97
|
+
let carCid: bs.CarGroup;
|
98
|
+
let carCid0: bs.CarGroup;
|
99
|
+
|
100
|
+
afterEach(async function () {
|
101
|
+
await loader.close();
|
102
|
+
await loader.destroy();
|
103
|
+
});
|
104
|
+
|
105
|
+
beforeEach(async function () {
|
106
|
+
await rt.SysContainer.start();
|
107
|
+
const mockM = new MyMemoryBlockStore();
|
108
|
+
t = new bs.CarTransaction(mockM);
|
109
|
+
loader = new bs.Loader("test-loader-two-commit", { public: true });
|
110
|
+
block = await encode({
|
111
|
+
value: { hello: "world" },
|
112
|
+
hasher,
|
113
|
+
codec,
|
114
|
+
});
|
115
|
+
await t.put(block.cid, block.bytes);
|
116
|
+
carCid0 = await loader.commit(t, { head: [block.cid] });
|
117
|
+
|
118
|
+
block2 = await encode({
|
119
|
+
value: { hello: "universe" },
|
120
|
+
hasher,
|
121
|
+
codec,
|
122
|
+
});
|
123
|
+
await t.put(block2.cid, block2.bytes);
|
124
|
+
carCid = await loader.commit(t, { head: [block2.cid] });
|
125
|
+
|
126
|
+
block3 = await encode({
|
127
|
+
value: { hello: "multiverse" },
|
128
|
+
hasher,
|
129
|
+
codec,
|
130
|
+
});
|
131
|
+
await t.put(block3.cid, block3.bytes);
|
132
|
+
|
133
|
+
block4 = await encode({
|
134
|
+
value: { hello: "megaverse" },
|
135
|
+
hasher,
|
136
|
+
codec,
|
137
|
+
});
|
138
|
+
|
139
|
+
await t.put(block4.cid, block4.bytes);
|
140
|
+
});
|
141
|
+
|
142
|
+
it("should have a car log", function () {
|
143
|
+
expect(loader.carLog.length).toBe(2);
|
144
|
+
expect(loader.carLog[0].toString()).toBe(carCid.toString());
|
145
|
+
expect(loader.carLog[1].toString()).toBe(carCid0.toString());
|
146
|
+
});
|
147
|
+
|
148
|
+
it("should commit", async function () {
|
149
|
+
const reader = await loader.loadCar(carCid[0]);
|
150
|
+
expect(reader).toBeTruthy();
|
151
|
+
const parsed = await bs.parseCarFile<CRDTMeta>(reader, loader.logger);
|
152
|
+
expect(parsed.cars).toBeTruthy();
|
153
|
+
expect(parsed.compact.length).toBe(0);
|
154
|
+
expect(parsed.cars.length).toBe(1);
|
155
|
+
expect(parsed.meta).toBeTruthy();
|
156
|
+
expect(parsed.meta.head).toBeTruthy();
|
157
|
+
});
|
158
|
+
|
159
|
+
it("should compact", async function () {
|
160
|
+
const compactCid = await loader.commit(t, { head: [block2.cid] }, { compact: true });
|
161
|
+
expect(loader.carLog.length).toBe(1);
|
162
|
+
|
163
|
+
const reader = await loader.loadCar(compactCid[0]);
|
164
|
+
expect(reader).toBeTruthy();
|
165
|
+
const parsed = await bs.parseCarFile<CRDTMeta>(reader, loader.logger);
|
166
|
+
expect(parsed.cars).toBeTruthy();
|
167
|
+
expect(parsed.compact.length).toBe(2);
|
168
|
+
expect(parsed.cars.length).toBe(0);
|
169
|
+
expect(parsed.meta).toBeTruthy();
|
170
|
+
expect(parsed.meta.head).toBeTruthy();
|
171
|
+
});
|
172
|
+
|
173
|
+
it("compact should erase old files", async function () {
|
174
|
+
const cs = await loader.carStore();
|
175
|
+
await loader.commit(t, { head: [block2.cid] }, { compact: true });
|
176
|
+
expect(loader.carLog.length).toBe(1);
|
177
|
+
await loader.commit(t, { head: [block3.cid] }, { compact: false });
|
178
|
+
expect(loader.carLog.length).toBe(2);
|
179
|
+
expect(await cs.load(carCid[0])).toBeTruthy();
|
180
|
+
await loader.commit(t, { head: [block3.cid] }, { compact: true });
|
181
|
+
expect(loader.carLog.length).toBe(1);
|
182
|
+
const e0 = await cs.load(carCid[0]).catch((e) => e);
|
183
|
+
expect(e0 instanceof Error).toBeTruthy();
|
184
|
+
await loader.commit(t, { head: [block4.cid] }, { compact: false });
|
185
|
+
expect(loader.carLog.length).toBe(2);
|
186
|
+
|
187
|
+
const e = await loader.loadCar(carCid[0]).catch((e) => e);
|
188
|
+
expect(e).toBeTruthy();
|
189
|
+
expect(e instanceof Error).toBeTruthy();
|
190
|
+
expect(e.message).toMatch("missing car file");
|
191
|
+
}, 10000);
|
192
|
+
});
|
193
|
+
|
194
|
+
describe("basic Loader with index commits", function () {
|
195
|
+
let block: BlockView;
|
196
|
+
let ib: bs.EncryptedBlockstore;
|
197
|
+
let indexerResult: IndexTransactionMeta;
|
198
|
+
let cid: CID;
|
199
|
+
// let indexMap: Map<string, CID>;
|
200
|
+
|
201
|
+
afterEach(async function () {
|
202
|
+
await ib.close();
|
203
|
+
await ib.destroy();
|
204
|
+
});
|
205
|
+
|
206
|
+
beforeEach(async function () {
|
207
|
+
const name = "test-loader-index" + Math.random();
|
208
|
+
await rt.SysContainer.start();
|
209
|
+
// t = new CarTransaction()
|
210
|
+
ib = new bs.EncryptedBlockstore({ name });
|
211
|
+
block = await encode({
|
212
|
+
value: { hello: "world" },
|
213
|
+
hasher,
|
214
|
+
codec,
|
215
|
+
});
|
216
|
+
// console.log('block', block.cid)
|
217
|
+
|
218
|
+
cid = CID.parse("bafybeia4luuns6dgymy5kau5rm7r4qzrrzg6cglpzpogussprpy42cmcn4");
|
219
|
+
indexerResult = {
|
220
|
+
indexes: {
|
221
|
+
hello: {
|
222
|
+
byId: cid,
|
223
|
+
byKey: cid,
|
224
|
+
head: [cid as CID<unknown, number, number, 1>],
|
225
|
+
name: "hello",
|
226
|
+
map: "(doc) => doc.hello",
|
227
|
+
},
|
228
|
+
},
|
229
|
+
};
|
230
|
+
// indexMap = new Map();
|
231
|
+
});
|
232
|
+
|
233
|
+
it("should start with an empty car log", function () {
|
234
|
+
expect(ib.loader).toBeTruthy();
|
235
|
+
expect(ib.loader.carLog.length).toBe(0);
|
236
|
+
});
|
237
|
+
|
238
|
+
it("should commit the index metadata", async function () {
|
239
|
+
const { cars: carCid } = await ib.transaction<IndexTransactionMeta>(
|
240
|
+
async (t) => {
|
241
|
+
await t.put(block.cid, block.bytes);
|
242
|
+
return indexerResult;
|
243
|
+
} /* , indexMap */,
|
244
|
+
);
|
245
|
+
|
246
|
+
expect(carCid).toBeTruthy();
|
247
|
+
expect(ib.loader).toBeTruthy();
|
248
|
+
const carLog = ib.loader.carLog;
|
249
|
+
|
250
|
+
expect(carLog.length).toBe(1);
|
251
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
252
|
+
const reader = await ib.loader.loadCar(carCid![0]);
|
253
|
+
expect(reader).toBeTruthy();
|
254
|
+
const parsed = await bs.parseCarFile<IndexTransactionMeta>(reader, ib.loader.logger);
|
255
|
+
expect(parsed.cars).toBeTruthy();
|
256
|
+
expect(parsed.cars.length).toBe(0);
|
257
|
+
expect(parsed.meta).toBeTruthy();
|
258
|
+
expect(parsed.meta.indexes).toBeTruthy();
|
259
|
+
const indexes = parsed.meta.indexes;
|
260
|
+
expect(indexes).toBeTruthy();
|
261
|
+
expect(indexes.hello).toBeTruthy();
|
262
|
+
expect(indexes.hello.map).toBe("(doc) => doc.hello");
|
263
|
+
expect(indexes.hello.name).toBe("hello");
|
264
|
+
});
|
265
|
+
});
|