@fireproof/core 0.19.8-dev → 0.19.8-dev-alldocs

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. package/{chunk-QHSXUST7.js → chunk-5UFCF36O.js} +3 -3
  2. package/{chunk-HCXR2M5B.js → chunk-DG6XSV44.js} +175 -7
  3. package/chunk-DG6XSV44.js.map +1 -0
  4. package/{chunk-H3A2HMMM.js → chunk-OWQAHX2V.js} +2 -2
  5. package/chunk-OWQAHX2V.js.map +1 -0
  6. package/{chunk-7OGPZSGT.js → chunk-PRQHQG4I.js} +2 -2
  7. package/index.cjs +248 -191
  8. package/index.cjs.map +1 -1
  9. package/index.d.cts +174 -68
  10. package/index.d.ts +174 -68
  11. package/index.global.js +24688 -0
  12. package/index.global.js.map +1 -0
  13. package/index.js +60 -127
  14. package/index.js.map +1 -1
  15. package/metafile-cjs.json +1 -1
  16. package/metafile-esm.json +1 -1
  17. package/metafile-iife.json +1 -0
  18. package/{node-sys-container-E7LADX2Z.js → node-sys-container-TTGEC66A.js} +2 -2
  19. package/package.json +1 -1
  20. package/{sqlite-data-store-YS4U7AQ4.js → sqlite-data-store-MA55LVQE.js} +4 -4
  21. package/{sqlite-meta-store-FJZSZG4R.js → sqlite-meta-store-UNQKVYRM.js} +4 -4
  22. package/{sqlite-wal-store-6JZ4URNS.js → sqlite-wal-store-KVUOC4PO.js} +4 -4
  23. package/{store-file-HMHPQTUV.js → store-file-WD746RSY.js} +3 -3
  24. package/{store-indexdb-MRVZG4OG.js → store-indexdb-NG45BU3Q.js} +4 -4
  25. package/{store-sql-5XMJ5OWJ.js → store-sql-QVFNIGND.js} +7 -69
  26. package/store-sql-QVFNIGND.js.map +1 -0
  27. package/tests/blockstore/loader.test.ts +265 -0
  28. package/tests/blockstore/store.test.ts +164 -0
  29. package/tests/blockstore/transaction.test.ts +121 -0
  30. package/tests/fireproof/config.test.ts +212 -0
  31. package/tests/fireproof/crdt.test.ts +434 -0
  32. package/tests/fireproof/database.test.ts +466 -0
  33. package/tests/fireproof/fireproof.test.ts +602 -0
  34. package/tests/fireproof/hello.test.ts +54 -0
  35. package/tests/fireproof/indexer.test.ts +389 -0
  36. package/tests/helpers.ts +81 -0
  37. package/tests/react/useFireproof.test.tsx +19 -0
  38. package/tests/www/gallery.html +132 -0
  39. package/tests/www/iife.html +42 -0
  40. package/tests/www/todo-aws.html +232 -0
  41. package/tests/www/todo-ipfs.html +213 -0
  42. package/tests/www/todo-local.html +214 -0
  43. package/tests/www/todo-netlify.html +227 -0
  44. package/tests/www/todo.html +236 -0
  45. package/chunk-H3A2HMMM.js.map +0 -1
  46. package/chunk-HCXR2M5B.js.map +0 -1
  47. package/store-sql-5XMJ5OWJ.js.map +0 -1
  48. /package/{chunk-QHSXUST7.js.map → chunk-5UFCF36O.js.map} +0 -0
  49. /package/{chunk-7OGPZSGT.js.map → chunk-PRQHQG4I.js.map} +0 -0
  50. /package/{node-sys-container-E7LADX2Z.js.map → node-sys-container-TTGEC66A.js.map} +0 -0
  51. /package/{sqlite-data-store-YS4U7AQ4.js.map → sqlite-data-store-MA55LVQE.js.map} +0 -0
  52. /package/{sqlite-meta-store-FJZSZG4R.js.map → sqlite-meta-store-UNQKVYRM.js.map} +0 -0
  53. /package/{sqlite-wal-store-6JZ4URNS.js.map → sqlite-wal-store-KVUOC4PO.js.map} +0 -0
  54. /package/{store-file-HMHPQTUV.js.map → store-file-WD746RSY.js.map} +0 -0
  55. /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-H3A2HMMM.js";
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-E7LADX2Z.js.map
29
+ //# sourceMappingURL=node-sys-container-TTGEC66A.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fireproof/core",
3
- "version": "0.19.8-dev",
3
+ "version": "0.19.8-dev-alldocs",
4
4
  "description": "Live database for the web.",
5
5
  "type": "module",
6
6
  "module": "./index.js",
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  ensureSQLiteVersion
3
- } from "./chunk-7OGPZSGT.js";
3
+ } from "./chunk-PRQHQG4I.js";
4
4
  import {
5
5
  ensureLogger,
6
6
  exception2Result,
7
7
  getStore
8
- } from "./chunk-HCXR2M5B.js";
9
- import "./chunk-H3A2HMMM.js";
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-YS4U7AQ4.js.map
120
+ //# sourceMappingURL=sqlite-data-store-MA55LVQE.js.map
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  ensureSQLiteVersion
3
- } from "./chunk-7OGPZSGT.js";
3
+ } from "./chunk-PRQHQG4I.js";
4
4
  import {
5
5
  ensureLogger,
6
6
  exception2Result,
7
7
  getStore
8
- } from "./chunk-HCXR2M5B.js";
9
- import "./chunk-H3A2HMMM.js";
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-FJZSZG4R.js.map
137
+ //# sourceMappingURL=sqlite-meta-store-UNQKVYRM.js.map
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  ensureSQLiteVersion
3
- } from "./chunk-7OGPZSGT.js";
3
+ } from "./chunk-PRQHQG4I.js";
4
4
  import {
5
5
  ensureLogger,
6
6
  exception2Result,
7
7
  getStore
8
- } from "./chunk-HCXR2M5B.js";
9
- import "./chunk-H3A2HMMM.js";
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-6JZ4URNS.js.map
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-HCXR2M5B.js";
14
+ } from "./chunk-DG6XSV44.js";
15
15
  import {
16
16
  SysContainer
17
- } from "./chunk-H3A2HMMM.js";
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-HMHPQTUV.js.map
193
+ //# sourceMappingURL=store-file-WD746RSY.js.map
@@ -5,10 +5,10 @@ import {
5
5
  IndexDBWalGateway,
6
6
  getIndexDBName,
7
7
  guardVersion
8
- } from "./chunk-QHSXUST7.js";
8
+ } from "./chunk-5UFCF36O.js";
9
9
  import "./chunk-VZGT7ZYP.js";
10
- import "./chunk-HCXR2M5B.js";
11
- import "./chunk-H3A2HMMM.js";
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-MRVZG4OG.js.map
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-HCXR2M5B.js";
11
+ } from "./chunk-DG6XSV44.js";
11
12
  import {
12
13
  SysContainer
13
- } from "./chunk-H3A2HMMM.js";
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-6JZ4URNS.js");
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-YS4U7AQ4.js");
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-FJZSZG4R.js");
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-5XMJ5OWJ.js.map
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
+ });