@fireproof/core 0.18.0 → 0.19.0-dev-publish

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.
Files changed (67) hide show
  1. package/README.md +29 -15
  2. package/chunk-5X6APJDY.js +39 -0
  3. package/chunk-5X6APJDY.js.map +1 -0
  4. package/chunk-EVSZA26U.js +208 -0
  5. package/chunk-EVSZA26U.js.map +1 -0
  6. package/chunk-H3A2HMMM.js +164 -0
  7. package/chunk-H3A2HMMM.js.map +1 -0
  8. package/chunk-UCMXU3DH.js +268 -0
  9. package/chunk-UCMXU3DH.js.map +1 -0
  10. package/chunk-VZGT7ZYP.js +22 -0
  11. package/chunk-VZGT7ZYP.js.map +1 -0
  12. package/index.cjs +4676 -0
  13. package/index.cjs.map +1 -0
  14. package/index.d.cts +992 -0
  15. package/index.d.ts +992 -0
  16. package/index.js +2937 -0
  17. package/index.js.map +1 -0
  18. package/metafile-cjs.json +1 -0
  19. package/metafile-esm.json +1 -0
  20. package/node-sys-container-E7LADX2Z.js +29 -0
  21. package/node-sys-container-E7LADX2Z.js.map +1 -0
  22. package/package.json +23 -109
  23. package/sqlite-data-store-RIH56645.js +120 -0
  24. package/sqlite-data-store-RIH56645.js.map +1 -0
  25. package/sqlite-meta-store-6347MWOR.js +137 -0
  26. package/sqlite-meta-store-6347MWOR.js.map +1 -0
  27. package/sqlite-wal-store-G5YGK77N.js +123 -0
  28. package/sqlite-wal-store-G5YGK77N.js.map +1 -0
  29. package/store-file-D472VFCS.js +193 -0
  30. package/store-file-D472VFCS.js.map +1 -0
  31. package/store-indexdb-FRX5PTKR.js +20 -0
  32. package/store-indexdb-FRX5PTKR.js.map +1 -0
  33. package/store-sql-MDSU23Y7.js +344 -0
  34. package/store-sql-MDSU23Y7.js.map +1 -0
  35. package/dist/browser/fireproof.cjs +0 -1172
  36. package/dist/browser/fireproof.cjs.map +0 -1
  37. package/dist/browser/fireproof.d.cts +0 -268
  38. package/dist/browser/fireproof.d.ts +0 -268
  39. package/dist/browser/fireproof.global.js +0 -24178
  40. package/dist/browser/fireproof.global.js.map +0 -1
  41. package/dist/browser/fireproof.js +0 -1147
  42. package/dist/browser/fireproof.js.map +0 -1
  43. package/dist/browser/metafile-cjs.json +0 -1
  44. package/dist/browser/metafile-esm.json +0 -1
  45. package/dist/browser/metafile-iife.json +0 -1
  46. package/dist/memory/fireproof.cjs +0 -1172
  47. package/dist/memory/fireproof.cjs.map +0 -1
  48. package/dist/memory/fireproof.d.cts +0 -268
  49. package/dist/memory/fireproof.d.ts +0 -268
  50. package/dist/memory/fireproof.global.js +0 -24178
  51. package/dist/memory/fireproof.global.js.map +0 -1
  52. package/dist/memory/fireproof.js +0 -1147
  53. package/dist/memory/fireproof.js.map +0 -1
  54. package/dist/memory/metafile-cjs.json +0 -1
  55. package/dist/memory/metafile-esm.json +0 -1
  56. package/dist/memory/metafile-iife.json +0 -1
  57. package/dist/node/fireproof.cjs +0 -1172
  58. package/dist/node/fireproof.cjs.map +0 -1
  59. package/dist/node/fireproof.d.cts +0 -268
  60. package/dist/node/fireproof.d.ts +0 -268
  61. package/dist/node/fireproof.global.js +0 -38540
  62. package/dist/node/fireproof.global.js.map +0 -1
  63. package/dist/node/fireproof.js +0 -1138
  64. package/dist/node/fireproof.js.map +0 -1
  65. package/dist/node/metafile-cjs.json +0 -1
  66. package/dist/node/metafile-esm.json +0 -1
  67. package/dist/node/metafile-iife.json +0 -1
@@ -0,0 +1,137 @@
1
+ import {
2
+ ensureSQLiteVersion
3
+ } from "./chunk-5X6APJDY.js";
4
+ import {
5
+ ensureLogger,
6
+ exception2Result,
7
+ getStore
8
+ } from "./chunk-UCMXU3DH.js";
9
+ import "./chunk-H3A2HMMM.js";
10
+
11
+ // src/runtime/store-sql/v0.19-sqlite/sqlite-meta-store.ts
12
+ import { KeyedResolvOnce, Result } from "@adviser/cement";
13
+ var MetaSQLRecordBuilder = class _MetaSQLRecordBuilder {
14
+ constructor(record, textEncoder) {
15
+ this.record = record;
16
+ this.textEncoder = textEncoder;
17
+ }
18
+ static fromUploadMetaFnParams(data, params, textEncoder) {
19
+ return new _MetaSQLRecordBuilder(
20
+ {
21
+ name: params.name,
22
+ branch: params.branch,
23
+ meta: data,
24
+ updated_at: /* @__PURE__ */ new Date()
25
+ },
26
+ textEncoder
27
+ );
28
+ }
29
+ static fromBytes(str, name, branch, textEncoder) {
30
+ return new _MetaSQLRecordBuilder(
31
+ {
32
+ name,
33
+ branch,
34
+ meta: textEncoder.encode(str),
35
+ updated_at: /* @__PURE__ */ new Date()
36
+ },
37
+ textEncoder
38
+ );
39
+ }
40
+ build() {
41
+ return this.record;
42
+ }
43
+ };
44
+ var V0_18_0SQLiteMetaStore = class {
45
+ constructor(dbConn) {
46
+ this.dbConn = dbConn;
47
+ this.logger = ensureLogger(dbConn.opts, "SQLiteMetaStore");
48
+ this.logger.Debug().Msg("constructor");
49
+ }
50
+ async start(url) {
51
+ this.logger.Debug().Url(url).Msg("starting");
52
+ await this.dbConn.connect();
53
+ await ensureSQLiteVersion(url, this.dbConn);
54
+ this.logger.Debug().Url(url).Msg("started");
55
+ }
56
+ table(url) {
57
+ return getStore(url, this.logger, (...x) => x.join("_"));
58
+ }
59
+ #createTable = new KeyedResolvOnce();
60
+ async createTable(url) {
61
+ return this.#createTable.get(this.table(url)).once(async (table) => {
62
+ await this.dbConn.client.prepare(
63
+ `CREATE TABLE IF NOT EXISTS ${table} (
64
+ name TEXT not null,
65
+ branch TEXT not null,
66
+ meta BLOB NOT NULL,
67
+ updated_at TEXT NOT NULL,
68
+ PRIMARY KEY (name, branch)
69
+ )`
70
+ ).run();
71
+ });
72
+ }
73
+ #insertStmt = new KeyedResolvOnce();
74
+ async insertStmt(url) {
75
+ return this.#insertStmt.get(this.table(url)).once(async (table) => {
76
+ await this.createTable(url);
77
+ return this.dbConn.client.prepare(`insert into ${table}
78
+ (name, branch, meta, updated_at)
79
+ values (?, ?, ?, ?)
80
+ ON CONFLICT(name, branch) DO UPDATE SET meta=?, updated_at=?
81
+ `);
82
+ });
83
+ }
84
+ #selectStmt = new KeyedResolvOnce();
85
+ async selectStmt(url) {
86
+ return this.#selectStmt.get(this.table(url)).once(async (table) => {
87
+ await this.createTable(url);
88
+ return this.dbConn.client.prepare(`select name, branch, meta, updated_at from ${table} where name = ? and branch = ?`);
89
+ });
90
+ }
91
+ #deleteStmt = new KeyedResolvOnce();
92
+ async deleteStmt(url) {
93
+ return this.#deleteStmt.get(this.table(url)).once(async (table) => {
94
+ await this.createTable(url);
95
+ return this.dbConn.client.prepare(`delete from ${table} where name = ? and branch = ?`);
96
+ });
97
+ }
98
+ async insert(url, ose) {
99
+ this.logger.Debug().Str("name", ose.name).Str("branch", ose.branch).Uint64("data-len", ose.meta.length).Msg("insert");
100
+ const bufMeta = Buffer.from(ose.meta);
101
+ return this.insertStmt(url).then(
102
+ (i) => i.run(ose.name, ose.branch, bufMeta, ose.updated_at.toISOString(), bufMeta, ose.updated_at.toISOString())
103
+ );
104
+ }
105
+ async select(url, key) {
106
+ this.logger.Debug().Str("name", key.name).Str("branch", key.branch).Msg("select");
107
+ return (await this.selectStmt(url).then((i) => i.all(key.name, key.branch))).map((irow) => {
108
+ const row = irow;
109
+ return {
110
+ name: row.name,
111
+ branch: row.branch,
112
+ meta: Uint8Array.from(row.meta),
113
+ updated_at: new Date(row.updated_at)
114
+ };
115
+ });
116
+ }
117
+ async delete(url, key) {
118
+ this.logger.Debug().Str("name", key.name).Str("branch", key.branch).Msg("delete");
119
+ return this.deleteStmt(url).then((i) => i.run(key.name, key.branch));
120
+ }
121
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
122
+ async close(url) {
123
+ this.logger.Debug().Msg("close");
124
+ return Result.Ok(void 0);
125
+ }
126
+ async destroy(url) {
127
+ return exception2Result(async () => {
128
+ this.logger.Debug().Msg("destroy");
129
+ await this.dbConn.client.prepare(`delete from ${this.table(url)}`).run();
130
+ });
131
+ }
132
+ };
133
+ export {
134
+ MetaSQLRecordBuilder,
135
+ V0_18_0SQLiteMetaStore
136
+ };
137
+ //# sourceMappingURL=sqlite-meta-store-6347MWOR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/runtime/store-sql/v0.19-sqlite/sqlite-meta-store.ts"],"sourcesContent":["import type { RunResult, Statement } from \"better-sqlite3\";\nimport { DBConnection, MetaRecord, MetaRecordKey, MetaSQLStore } from \"../types.js\";\nimport { SQLiteConnection } from \"../sqlite-adapter-better-sqlite3.js\";\nimport { KeyedResolvOnce, Logger, Result } from \"@adviser/cement\";\nimport { UploadMetaFnParams } from \"../../../blockstore/types.js\";\nimport { ensureSQLiteVersion } from \"./sqlite-ensure-version.js\";\nimport { ensureLogger, exception2Result, getStore } from \"../../../utils.js\";\n\nexport class MetaSQLRecordBuilder {\n readonly record: MetaRecord;\n readonly textEncoder: TextEncoder;\n\n constructor(record: MetaRecord, textEncoder: TextEncoder) {\n this.record = record;\n this.textEncoder = textEncoder;\n }\n\n static fromUploadMetaFnParams(data: Uint8Array, params: UploadMetaFnParams, textEncoder: TextEncoder): MetaSQLRecordBuilder {\n return new MetaSQLRecordBuilder(\n {\n name: params.name,\n branch: params.branch,\n meta: data,\n updated_at: new Date(),\n },\n textEncoder,\n );\n }\n\n static fromBytes(str: string, name: string, branch: string, textEncoder: TextEncoder): MetaSQLRecordBuilder {\n return new MetaSQLRecordBuilder(\n {\n name: name,\n branch: branch,\n meta: textEncoder.encode(str),\n updated_at: new Date(),\n },\n textEncoder,\n );\n }\n\n build(): MetaRecord {\n return this.record;\n }\n}\n\ninterface SQLiteMetaRecord {\n name: string;\n branch: string;\n meta: Buffer;\n updated_at: string;\n}\n\nexport class V0_18_0SQLiteMetaStore implements MetaSQLStore {\n readonly dbConn: SQLiteConnection;\n readonly logger: Logger;\n constructor(dbConn: DBConnection) {\n this.dbConn = dbConn as SQLiteConnection;\n this.logger = ensureLogger(dbConn.opts, \"SQLiteMetaStore\");\n this.logger.Debug().Msg(\"constructor\");\n }\n async start(url: URL): Promise<void> {\n this.logger.Debug().Url(url).Msg(\"starting\");\n await this.dbConn.connect();\n await ensureSQLiteVersion(url, this.dbConn);\n this.logger.Debug().Url(url).Msg(\"started\");\n }\n\n table(url: URL): string {\n return getStore(url, this.logger, (...x: string[]) => x.join(\"_\"));\n }\n\n readonly #createTable = new KeyedResolvOnce();\n async createTable(url: URL) {\n return this.#createTable.get(this.table(url)).once(async (table) => {\n await this.dbConn.client\n .prepare(\n `CREATE TABLE IF NOT EXISTS ${table} (\n name TEXT not null,\n branch TEXT not null,\n meta BLOB NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (name, branch)\n )`,\n )\n .run();\n });\n }\n\n readonly #insertStmt = new KeyedResolvOnce<Statement>();\n private async insertStmt(url: URL) {\n return this.#insertStmt.get(this.table(url)).once(async (table) => {\n await this.createTable(url);\n return this.dbConn.client.prepare(`insert into ${table}\n (name, branch, meta, updated_at)\n values (?, ?, ?, ?)\n ON CONFLICT(name, branch) DO UPDATE SET meta=?, updated_at=?\n `);\n });\n }\n\n readonly #selectStmt = new KeyedResolvOnce<Statement>();\n private async selectStmt(url: URL) {\n return this.#selectStmt.get(this.table(url)).once(async (table) => {\n await this.createTable(url);\n return this.dbConn.client.prepare(`select name, branch, meta, updated_at from ${table} where name = ? and branch = ?`);\n });\n }\n\n readonly #deleteStmt = new KeyedResolvOnce<Statement>();\n private async deleteStmt(url: URL) {\n return this.#deleteStmt.get(this.table(url)).once(async (table) => {\n await this.createTable(url);\n return this.dbConn.client.prepare(`delete from ${table} where name = ? and branch = ?`);\n });\n }\n\n async insert(url: URL, ose: MetaRecord): Promise<RunResult> {\n this.logger.Debug().Str(\"name\", ose.name).Str(\"branch\", ose.branch).Uint64(\"data-len\", ose.meta.length).Msg(\"insert\");\n const bufMeta = Buffer.from(ose.meta);\n return this.insertStmt(url).then((i) =>\n i.run(ose.name, ose.branch, bufMeta, ose.updated_at.toISOString(), bufMeta, ose.updated_at.toISOString()),\n );\n }\n async select(url: URL, key: MetaRecordKey): Promise<MetaRecord[]> {\n this.logger.Debug().Str(\"name\", key.name).Str(\"branch\", key.branch).Msg(\"select\");\n return (await this.selectStmt(url).then((i) => i.all(key.name, key.branch))).map((irow) => {\n const row = irow as SQLiteMetaRecord;\n return {\n name: row.name,\n branch: row.branch,\n meta: Uint8Array.from(row.meta),\n updated_at: new Date(row.updated_at),\n };\n });\n }\n\n async delete(url: URL, key: MetaRecordKey): Promise<RunResult> {\n this.logger.Debug().Str(\"name\", key.name).Str(\"branch\", key.branch).Msg(\"delete\");\n return this.deleteStmt(url).then((i) => i.run(key.name, key.branch));\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async close(url: URL): Promise<Result<void>> {\n this.logger.Debug().Msg(\"close\");\n // await this.dbConn.close();\n return Result.Ok(undefined);\n }\n async destroy(url: URL): Promise<Result<void>> {\n return exception2Result(async () => {\n this.logger.Debug().Msg(\"destroy\");\n await this.dbConn.client.prepare(`delete from ${this.table(url)}`).run();\n });\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,123 @@
1
+ import {
2
+ ensureSQLiteVersion
3
+ } from "./chunk-5X6APJDY.js";
4
+ import {
5
+ ensureLogger,
6
+ exception2Result,
7
+ getStore
8
+ } from "./chunk-UCMXU3DH.js";
9
+ import "./chunk-H3A2HMMM.js";
10
+
11
+ // src/runtime/store-sql/v0.19-sqlite/sqlite-wal-store.ts
12
+ import { KeyedResolvOnce, Result } from "@adviser/cement";
13
+ var WalSQLRecordBuilder = class _WalSQLRecordBuilder {
14
+ #record;
15
+ constructor(record) {
16
+ this.#record = record;
17
+ }
18
+ static fromRecord(record) {
19
+ return new _WalSQLRecordBuilder(record);
20
+ }
21
+ build() {
22
+ return this.#record;
23
+ }
24
+ };
25
+ var V0_18_0SQLiteWalStore = class {
26
+ constructor(dbConn) {
27
+ this.dbConn = dbConn;
28
+ this.textEncoder = dbConn.opts.textEncoder;
29
+ this.logger = ensureLogger(dbConn.opts, "SQLiteWalStore");
30
+ this.logger.Debug().Msg("constructor");
31
+ }
32
+ async start(url) {
33
+ this.logger.Debug().Msg("start");
34
+ await this.dbConn.connect();
35
+ await ensureSQLiteVersion(url, this.dbConn);
36
+ }
37
+ table(url) {
38
+ return getStore(url, this.logger, (...x) => x.join("_"));
39
+ }
40
+ #createTable = new KeyedResolvOnce();
41
+ async createTable(url) {
42
+ return this.#createTable.get(this.table(url)).once(async (table) => {
43
+ await this.dbConn.client.prepare(
44
+ `CREATE TABLE IF NOT EXISTS ${table} (
45
+ name TEXT not null,
46
+ branch TEXT not null,
47
+ state BLOB NOT NULL,
48
+ updated_at TEXT NOT NULL,
49
+ PRIMARY KEY (name, branch)
50
+ )`
51
+ ).run();
52
+ });
53
+ }
54
+ #insertStmt = new KeyedResolvOnce();
55
+ async insertStmt(url) {
56
+ return this.#insertStmt.get(this.table(url)).once(async (table) => {
57
+ await this.createTable(url);
58
+ return this.dbConn.client.prepare(`insert into ${table}
59
+ (name, branch, state, updated_at)
60
+ values (?, ?, ?, ?)
61
+ ON CONFLICT(name, branch) DO UPDATE SET state=?, updated_at=?
62
+ `);
63
+ });
64
+ }
65
+ #selectStmt = new KeyedResolvOnce();
66
+ async selectStmt(url) {
67
+ return this.#selectStmt.get(this.table(url)).once(async (table) => {
68
+ await this.createTable(url);
69
+ return this.dbConn.client.prepare(
70
+ `select name, branch, state, updated_at from ${table}
71
+ where name = ? and branch = ?`
72
+ );
73
+ });
74
+ }
75
+ #deleteStmt = new KeyedResolvOnce();
76
+ async deleteStmt(url) {
77
+ return this.#deleteStmt.get(this.table(url)).once(async (table) => {
78
+ await this.createTable(url);
79
+ return this.dbConn.client.prepare(`delete from ${table} where name = ? and branch = ?`);
80
+ });
81
+ }
82
+ async insert(url, ose) {
83
+ const wal = WalSQLRecordBuilder.fromRecord(ose).build();
84
+ const bufState = Buffer.from(this.textEncoder.encode(JSON.stringify(wal.state)));
85
+ return this.insertStmt(url).then(
86
+ (i) => i.run(ose.name, ose.branch, bufState, wal.updated_at.toISOString(), bufState, wal.updated_at.toISOString())
87
+ );
88
+ }
89
+ async select(url, key) {
90
+ const res = (await this.selectStmt(url).then((i) => i.all(key.name, key.branch))).map((irow) => {
91
+ const row = irow;
92
+ return {
93
+ name: row.name,
94
+ branch: row.branch,
95
+ state: Uint8Array.from(row.state),
96
+ updated_at: new Date(row.updated_at)
97
+ };
98
+ });
99
+ this.logger.Debug().Str("name", key.name).Str("branch", key.branch).Uint64("res", res.length).Msg("select");
100
+ return res;
101
+ }
102
+ async delete(url, key) {
103
+ this.logger.Debug().Str("name", key.name).Str("branch", key.branch).Msg("delete");
104
+ return this.deleteStmt(url).then((i) => i.run(key.name, key.branch));
105
+ }
106
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
107
+ async close(url) {
108
+ this.logger.Debug().Msg("close");
109
+ return Result.Ok(void 0);
110
+ }
111
+ async destroy(url) {
112
+ return exception2Result(async () => {
113
+ this.logger.Debug().Msg("destroy");
114
+ await this.createTable(url);
115
+ await this.dbConn.client.prepare(`delete from ${this.table(url)}`).run();
116
+ });
117
+ }
118
+ };
119
+ export {
120
+ V0_18_0SQLiteWalStore,
121
+ WalSQLRecordBuilder
122
+ };
123
+ //# sourceMappingURL=sqlite-wal-store-G5YGK77N.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/runtime/store-sql/v0.19-sqlite/sqlite-wal-store.ts"],"sourcesContent":["import type { RunResult, Statement } from \"better-sqlite3\";\nimport { DBConnection, WalKey, WalRecord, WalSQLStore } from \"../types.js\";\nimport { SQLiteConnection } from \"../sqlite-adapter-better-sqlite3.js\";\nimport { KeyedResolvOnce, Logger, Result } from \"@adviser/cement\";\nimport { ensureSQLiteVersion } from \"./sqlite-ensure-version.js\";\nimport { ensureLogger, exception2Result, getStore } from \"../../../utils.js\";\n\nexport class WalSQLRecordBuilder {\n readonly #record: WalRecord;\n\n constructor(record: WalRecord) {\n this.#record = record;\n }\n\n static fromRecord(record: WalRecord): WalSQLRecordBuilder {\n return new WalSQLRecordBuilder(record);\n }\n\n build(): WalRecord {\n return this.#record;\n }\n}\n\ninterface SQLiteWalRecord {\n readonly name: string;\n readonly branch: string;\n readonly state: Buffer;\n readonly updated_at: string;\n}\n\nexport class V0_18_0SQLiteWalStore implements WalSQLStore {\n readonly dbConn: SQLiteConnection;\n readonly logger: Logger;\n readonly textEncoder: TextEncoder;\n constructor(dbConn: DBConnection) {\n this.dbConn = dbConn as SQLiteConnection;\n this.textEncoder = dbConn.opts.textEncoder;\n this.logger = ensureLogger(dbConn.opts, \"SQLiteWalStore\");\n this.logger.Debug().Msg(\"constructor\");\n }\n async start(url: URL): Promise<void> {\n this.logger.Debug().Msg(\"start\");\n await this.dbConn.connect();\n await ensureSQLiteVersion(url, this.dbConn);\n\n // this._insertStmt =\n // this._selectStmt = this.dbConn.client.prepare(\n // `select name, branch, state, updated_at from ${this.table} where name = ? and branch = ?`,\n // );\n // this._deleteStmt = this.dbConn.client.prepare(`delete from ${this.table} where name = ? and branch = ?`);\n }\n\n table(url: URL): string {\n return getStore(url, this.logger, (...x: string[]) => x.join(\"_\"));\n }\n\n readonly #createTable = new KeyedResolvOnce();\n async createTable(url: URL) {\n return this.#createTable.get(this.table(url)).once(async (table) => {\n await this.dbConn.client\n .prepare(\n `CREATE TABLE IF NOT EXISTS ${table} (\n name TEXT not null,\n branch TEXT not null,\n state BLOB NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (name, branch)\n )`,\n )\n .run();\n });\n }\n\n readonly #insertStmt = new KeyedResolvOnce<Statement>();\n private async insertStmt(url: URL) {\n return this.#insertStmt.get(this.table(url)).once(async (table) => {\n await this.createTable(url);\n return this.dbConn.client.prepare(`insert into ${table}\n (name, branch, state, updated_at)\n values (?, ?, ?, ?)\n ON CONFLICT(name, branch) DO UPDATE SET state=?, updated_at=?\n `);\n });\n }\n\n readonly #selectStmt = new KeyedResolvOnce<Statement>();\n private async selectStmt(url: URL) {\n return this.#selectStmt.get(this.table(url)).once(async (table) => {\n await this.createTable(url);\n return this.dbConn.client.prepare(\n `select name, branch, state, updated_at from ${table}\n where name = ? and branch = ?`,\n );\n });\n }\n\n readonly #deleteStmt = new KeyedResolvOnce<Statement>();\n private async deleteStmt(url: URL) {\n return this.#deleteStmt.get(this.table(url)).once(async (table) => {\n await this.createTable(url);\n return this.dbConn.client.prepare(`delete from ${table} where name = ? and branch = ?`);\n });\n }\n async insert(url: URL, ose: WalRecord): Promise<RunResult> {\n const wal = WalSQLRecordBuilder.fromRecord(ose).build();\n const bufState = Buffer.from(this.textEncoder.encode(JSON.stringify(wal.state)));\n return this.insertStmt(url).then((i) =>\n i.run(ose.name, ose.branch, bufState, wal.updated_at.toISOString(), bufState, wal.updated_at.toISOString()),\n );\n }\n async select(url: URL, key: WalKey): Promise<WalRecord[]> {\n const res = (await this.selectStmt(url).then((i) => i.all(key.name, key.branch))).map((irow) => {\n const row = irow as SQLiteWalRecord;\n return {\n name: row.name,\n branch: row.branch,\n state: Uint8Array.from(row.state),\n updated_at: new Date(row.updated_at),\n };\n });\n this.logger.Debug().Str(\"name\", key.name).Str(\"branch\", key.branch).Uint64(\"res\", res.length).Msg(\"select\");\n return res;\n }\n async delete(url: URL, key: WalKey): Promise<RunResult> {\n this.logger.Debug().Str(\"name\", key.name).Str(\"branch\", key.branch).Msg(\"delete\");\n return this.deleteStmt(url).then((i) => i.run(key.name, key.branch));\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async close(url: URL): Promise<Result<void>> {\n this.logger.Debug().Msg(\"close\");\n return Result.Ok(undefined);\n // await this.dbConn.close();\n }\n async destroy(url: URL): Promise<Result<void>> {\n return exception2Result(async () => {\n this.logger.Debug().Msg(\"destroy\");\n await this.createTable(url);\n await this.dbConn.client.prepare(`delete from ${this.table(url)}`).run();\n });\n }\n}\n"],"mappings":";;;;;;;;;;;AAGA,SAAS,iBAAyB,cAAc;AAIzC,IAAM,sBAAN,MAAM,qBAAoB;AAAA,EACtB;AAAA,EAET,YAAY,QAAmB;AAC7B,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,OAAO,WAAW,QAAwC;AACxD,WAAO,IAAI,qBAAoB,MAAM;AAAA,EACvC;AAAA,EAEA,QAAmB;AACjB,WAAO,KAAK;AAAA,EACd;AACF;AASO,IAAM,wBAAN,MAAmD;AAAA,EAIxD,YAAY,QAAsB;AAChC,SAAK,SAAS;AACd,SAAK,cAAc,OAAO,KAAK;AAC/B,SAAK,SAAS,aAAa,OAAO,MAAM,gBAAgB;AACxD,SAAK,OAAO,MAAM,EAAE,IAAI,aAAa;AAAA,EACvC;AAAA,EACA,MAAM,MAAM,KAAyB;AACnC,SAAK,OAAO,MAAM,EAAE,IAAI,OAAO;AAC/B,UAAM,KAAK,OAAO,QAAQ;AAC1B,UAAM,oBAAoB,KAAK,KAAK,MAAM;AAAA,EAO5C;AAAA,EAEA,MAAM,KAAkB;AACtB,WAAO,SAAS,KAAK,KAAK,QAAQ,IAAI,MAAgB,EAAE,KAAK,GAAG,CAAC;AAAA,EACnE;AAAA,EAES,eAAe,IAAI,gBAAgB;AAAA,EAC5C,MAAM,YAAY,KAAU;AAC1B,WAAO,KAAK,aAAa,IAAI,KAAK,MAAM,GAAG,CAAC,EAAE,KAAK,OAAO,UAAU;AAClE,YAAM,KAAK,OAAO,OACf;AAAA,QACC,8BAA8B,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOrC,EACC,IAAI;AAAA,IACT,CAAC;AAAA,EACH;AAAA,EAES,cAAc,IAAI,gBAA2B;AAAA,EACtD,MAAc,WAAW,KAAU;AACjC,WAAO,KAAK,YAAY,IAAI,KAAK,MAAM,GAAG,CAAC,EAAE,KAAK,OAAO,UAAU;AACjE,YAAM,KAAK,YAAY,GAAG;AAC1B,aAAO,KAAK,OAAO,OAAO,QAAQ,eAAe,KAAK;AAAA;AAAA;AAAA;AAAA,OAIrD;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAES,cAAc,IAAI,gBAA2B;AAAA,EACtD,MAAc,WAAW,KAAU;AACjC,WAAO,KAAK,YAAY,IAAI,KAAK,MAAM,GAAG,CAAC,EAAE,KAAK,OAAO,UAAU;AACjE,YAAM,KAAK,YAAY,GAAG;AAC1B,aAAO,KAAK,OAAO,OAAO;AAAA,QACxB,+CAA+C,KAAK;AAAA;AAAA,MAEtD;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAES,cAAc,IAAI,gBAA2B;AAAA,EACtD,MAAc,WAAW,KAAU;AACjC,WAAO,KAAK,YAAY,IAAI,KAAK,MAAM,GAAG,CAAC,EAAE,KAAK,OAAO,UAAU;AACjE,YAAM,KAAK,YAAY,GAAG;AAC1B,aAAO,KAAK,OAAO,OAAO,QAAQ,eAAe,KAAK,gCAAgC;AAAA,IACxF,CAAC;AAAA,EACH;AAAA,EACA,MAAM,OAAO,KAAU,KAAoC;AACzD,UAAM,MAAM,oBAAoB,WAAW,GAAG,EAAE,MAAM;AACtD,UAAM,WAAW,OAAO,KAAK,KAAK,YAAY,OAAO,KAAK,UAAU,IAAI,KAAK,CAAC,CAAC;AAC/E,WAAO,KAAK,WAAW,GAAG,EAAE;AAAA,MAAK,CAAC,MAChC,EAAE,IAAI,IAAI,MAAM,IAAI,QAAQ,UAAU,IAAI,WAAW,YAAY,GAAG,UAAU,IAAI,WAAW,YAAY,CAAC;AAAA,IAC5G;AAAA,EACF;AAAA,EACA,MAAM,OAAO,KAAU,KAAmC;AACxD,UAAM,OAAO,MAAM,KAAK,WAAW,GAAG,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,IAAI,MAAM,IAAI,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS;AAC9F,YAAM,MAAM;AACZ,aAAO;AAAA,QACL,MAAM,IAAI;AAAA,QACV,QAAQ,IAAI;AAAA,QACZ,OAAO,WAAW,KAAK,IAAI,KAAK;AAAA,QAChC,YAAY,IAAI,KAAK,IAAI,UAAU;AAAA,MACrC;AAAA,IACF,CAAC;AACD,SAAK,OAAO,MAAM,EAAE,IAAI,QAAQ,IAAI,IAAI,EAAE,IAAI,UAAU,IAAI,MAAM,EAAE,OAAO,OAAO,IAAI,MAAM,EAAE,IAAI,QAAQ;AAC1G,WAAO;AAAA,EACT;AAAA,EACA,MAAM,OAAO,KAAU,KAAiC;AACtD,SAAK,OAAO,MAAM,EAAE,IAAI,QAAQ,IAAI,IAAI,EAAE,IAAI,UAAU,IAAI,MAAM,EAAE,IAAI,QAAQ;AAChF,WAAO,KAAK,WAAW,GAAG,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,IAAI,MAAM,IAAI,MAAM,CAAC;AAAA,EACrE;AAAA;AAAA,EAEA,MAAM,MAAM,KAAiC;AAC3C,SAAK,OAAO,MAAM,EAAE,IAAI,OAAO;AAC/B,WAAO,OAAO,GAAG,MAAS;AAAA,EAE5B;AAAA,EACA,MAAM,QAAQ,KAAiC;AAC7C,WAAO,iBAAiB,YAAY;AAClC,WAAK,OAAO,MAAM,EAAE,IAAI,SAAS;AACjC,YAAM,KAAK,YAAY,GAAG;AAC1B,YAAM,KAAK,OAAO,OAAO,QAAQ,eAAe,KAAK,MAAM,GAAG,CAAC,EAAE,EAAE,IAAI;AAAA,IACzE,CAAC;AAAA,EACH;AACF;","names":[]}
@@ -0,0 +1,193 @@
1
+ import {
2
+ NotFoundError,
3
+ isNotFoundError
4
+ } from "./chunk-VZGT7ZYP.js";
5
+ import {
6
+ FILESTORE_VERSION,
7
+ ensureIndexName,
8
+ ensureLogger,
9
+ exception2Result,
10
+ exceptionWrapper,
11
+ getFileName,
12
+ getPath,
13
+ getStore
14
+ } from "./chunk-UCMXU3DH.js";
15
+ import {
16
+ SysContainer
17
+ } from "./chunk-H3A2HMMM.js";
18
+
19
+ // src/runtime/store-file.ts
20
+ import { ResolveOnce, Result } from "@adviser/cement";
21
+ var versionFiles = /* @__PURE__ */ new Map();
22
+ async function ensureVersionFile(path, logger) {
23
+ let once = versionFiles.get(path);
24
+ if (!once) {
25
+ once = new ResolveOnce();
26
+ versionFiles.set(path, once);
27
+ }
28
+ await once.once(async () => {
29
+ await SysContainer.mkdir(path, { recursive: true });
30
+ const vFile = SysContainer.join(path, "version");
31
+ const vFileStat = await SysContainer.stat(vFile).catch(() => void 0);
32
+ if (!vFileStat) {
33
+ await SysContainer.writefile(SysContainer.join(path, "version"), FILESTORE_VERSION);
34
+ return;
35
+ } else if (!vFileStat.isFile()) {
36
+ throw logger.Error().Str("file", vFile).Msg(`version file is a directory`).AsError();
37
+ }
38
+ const v = await SysContainer.readfile(vFile);
39
+ if (v.toString() !== FILESTORE_VERSION) {
40
+ console.warn(`version mismatch:${vFile}: ${v.toString()}!=${FILESTORE_VERSION}`);
41
+ }
42
+ });
43
+ return path;
44
+ }
45
+ var FileGateway = class {
46
+ constructor(logger) {
47
+ this.logger = logger;
48
+ }
49
+ start(baseURL) {
50
+ return exception2Result(async () => {
51
+ await SysContainer.start();
52
+ baseURL.searchParams.set("version", baseURL.searchParams.get("version") || FILESTORE_VERSION);
53
+ const url = await this.buildUrl(baseURL, "dummy");
54
+ if (url.isErr()) return url;
55
+ const dbdir = this.getFilePath(url.Ok());
56
+ await SysContainer.mkdir(SysContainer.dirname(dbdir), { recursive: true });
57
+ const dbroot = SysContainer.dirname(dbdir);
58
+ this.logger.Debug().Str("url", url.Ok().toString()).Str("dbroot", SysContainer.dirname(dbroot)).Msg("start");
59
+ await ensureVersionFile(dbroot, this.logger);
60
+ });
61
+ }
62
+ async close() {
63
+ return Result.Ok(void 0);
64
+ }
65
+ getFilePath(url) {
66
+ const path = url.toString().replace(/^file:\/\//, "").replace(/\?.*$/, "");
67
+ this.logger.Debug().Str("url", url.toString()).Str("path", path).Msg("getFilePath");
68
+ return path;
69
+ }
70
+ async put(url, body) {
71
+ return exception2Result(async () => {
72
+ const file = this.getFilePath(url);
73
+ this.logger.Debug().Str("url", url.toString()).Str("file", file).Msg("put");
74
+ await SysContainer.writefile(file, body);
75
+ });
76
+ }
77
+ async get(url) {
78
+ return exceptionWrapper(async () => {
79
+ const file = this.getFilePath(url);
80
+ try {
81
+ const res = await SysContainer.readfile(file);
82
+ this.logger.Debug().Url(url).Str("file", file).Msg("get");
83
+ return Result.Ok(new Uint8Array(res));
84
+ } catch (e) {
85
+ if (isNotFoundError(e)) {
86
+ return Result.Err(new NotFoundError(`file not found: ${file}`));
87
+ }
88
+ return Result.Err(e);
89
+ }
90
+ });
91
+ }
92
+ async delete(url) {
93
+ return exception2Result(async () => {
94
+ await SysContainer.unlink(this.getFilePath(url));
95
+ });
96
+ }
97
+ async destroyDir(baseURL) {
98
+ const url = await this.buildUrl(baseURL, "x");
99
+ if (url.isErr()) return url;
100
+ const filepath = SysContainer.dirname(this.getFilePath(url.Ok()));
101
+ let dir = [];
102
+ try {
103
+ dir = await SysContainer.readdir(filepath);
104
+ } catch (e) {
105
+ if (!isNotFoundError(e)) {
106
+ throw this.logger.Error().Err(e).Str("dir", filepath).Msg("destroy:readdir").AsError();
107
+ }
108
+ }
109
+ for (const file of dir) {
110
+ const pathed = SysContainer.join(filepath, file);
111
+ try {
112
+ await SysContainer.unlink(pathed);
113
+ } catch (e) {
114
+ if (!isNotFoundError(e)) {
115
+ throw this.logger.Error().Err(e).Str("file", pathed).Msg("destroy:unlink").AsError();
116
+ }
117
+ }
118
+ }
119
+ return Result.Ok(void 0);
120
+ }
121
+ };
122
+ var FileWALGateway = class extends FileGateway {
123
+ constructor(logger) {
124
+ super(ensureLogger(logger, "FileWALGateway"));
125
+ }
126
+ async destroy(baseURL) {
127
+ return this.destroyDir(baseURL);
128
+ }
129
+ async buildUrl(baseUrl, key) {
130
+ const url = new URL(baseUrl.toString());
131
+ url.pathname = SysContainer.join(await getPath(baseUrl, this.logger), ensureIndexName(baseUrl, "wal"), key + ".json");
132
+ return Result.Ok(url);
133
+ }
134
+ };
135
+ var FileMetaGateway = class extends FileGateway {
136
+ constructor(logger) {
137
+ super(ensureLogger(logger, "FileMetaGateway"));
138
+ }
139
+ async destroy(baseURL) {
140
+ return this.destroyDir(baseURL);
141
+ }
142
+ async buildUrl(baseUrl, key) {
143
+ const url = new URL(baseUrl.toString());
144
+ url.pathname = SysContainer.join(await getPath(baseUrl, this.logger), ensureIndexName(baseUrl, "meta"), key + ".json");
145
+ return Result.Ok(url);
146
+ }
147
+ };
148
+ var FileDataGateway = class extends FileGateway {
149
+ constructor(logger) {
150
+ super(ensureLogger(logger, "FileDataGateway"));
151
+ this.branches = /* @__PURE__ */ new Set();
152
+ }
153
+ async destroy(baseURL) {
154
+ return this.destroyDir(baseURL);
155
+ }
156
+ async buildUrl(baseUrl, key) {
157
+ const url = new URL(baseUrl.toString());
158
+ url.pathname = SysContainer.join(await getPath(baseUrl, this.logger), ensureIndexName(baseUrl, "data"), key + ".car");
159
+ return Result.Ok(url);
160
+ }
161
+ };
162
+ function toArrayBuffer(buffer) {
163
+ const ab = new ArrayBuffer(buffer.length);
164
+ const view = new Uint8Array(ab);
165
+ for (let i = 0; i < buffer.length; ++i) {
166
+ view[i] = buffer[i];
167
+ }
168
+ return view;
169
+ }
170
+ var FileTestStore = class {
171
+ constructor(logger) {
172
+ this.logger = ensureLogger(logger, "FileTestStore");
173
+ }
174
+ async get(url, key) {
175
+ const logger = ensureLogger(this.logger, "get", { url: url.toString(), key });
176
+ const dbFile = SysContainer.join(
177
+ await getPath(url, this.logger),
178
+ getStore(url, this.logger, SysContainer.join),
179
+ getFileName(url, key, this.logger)
180
+ );
181
+ logger.Debug().Str("dbFile", dbFile).Msg("get");
182
+ const buffer = await SysContainer.readfile(dbFile);
183
+ logger.Debug().Str("dbFile", dbFile).Len(buffer).Msg("got");
184
+ return toArrayBuffer(buffer);
185
+ }
186
+ };
187
+ export {
188
+ FileDataGateway,
189
+ FileMetaGateway,
190
+ FileTestStore,
191
+ FileWALGateway
192
+ };
193
+ //# sourceMappingURL=store-file-D472VFCS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/runtime/store-file.ts"],"sourcesContent":["import { SysContainer } from \"./sys-container.js\";\nimport { TestStore } from \"../blockstore/types.js\";\nimport { FILESTORE_VERSION } from \"./store-file-version.js\";\nimport { Logger, ResolveOnce, Result } from \"@adviser/cement\";\nimport { ensureLogger, exception2Result, exceptionWrapper, getStore } from \"../utils.js\";\nimport { Gateway, GetResult, isNotFoundError, NotFoundError } from \"../blockstore/gateway.js\";\nimport { ensureIndexName, getFileName, getPath } from \"./store-file-utils.js\";\n\nconst versionFiles = new Map<string, ResolveOnce<void>>();\nasync function ensureVersionFile(path: string, logger: Logger): Promise<string> {\n let once = versionFiles.get(path);\n if (!once) {\n once = new ResolveOnce<void>();\n versionFiles.set(path, once);\n }\n await once.once(async () => {\n await SysContainer.mkdir(path, { recursive: true });\n const vFile = SysContainer.join(path, \"version\");\n const vFileStat = await SysContainer.stat(vFile).catch(() => undefined);\n if (!vFileStat) {\n await SysContainer.writefile(SysContainer.join(path, \"version\"), FILESTORE_VERSION);\n return;\n } else if (!vFileStat.isFile()) {\n throw logger.Error().Str(\"file\", vFile).Msg(`version file is a directory`).AsError();\n }\n const v = await SysContainer.readfile(vFile);\n if (v.toString() !== FILESTORE_VERSION) {\n console.warn(`version mismatch:${vFile}: ${v.toString()}!=${FILESTORE_VERSION}`);\n }\n });\n return path;\n}\n\nabstract class FileGateway implements Gateway {\n readonly logger: Logger;\n constructor(logger: Logger) {\n this.logger = logger;\n }\n start(baseURL: URL): Promise<Result<void>> {\n return exception2Result(async () => {\n await SysContainer.start();\n baseURL.searchParams.set(\"version\", baseURL.searchParams.get(\"version\") || FILESTORE_VERSION);\n const url = await this.buildUrl(baseURL, \"dummy\");\n if (url.isErr()) return url;\n const dbdir = this.getFilePath(url.Ok());\n // remove dummy\n await SysContainer.mkdir(SysContainer.dirname(dbdir), { recursive: true });\n const dbroot = SysContainer.dirname(dbdir);\n this.logger.Debug().Str(\"url\", url.Ok().toString()).Str(\"dbroot\", SysContainer.dirname(dbroot)).Msg(\"start\");\n await ensureVersionFile(dbroot, this.logger);\n });\n }\n async close(): Promise<Result<void>> {\n return Result.Ok(undefined);\n }\n abstract destroy(baseUrl: URL): Promise<Result<void>>;\n abstract buildUrl(baseUrl: URL, key: string): Promise<Result<URL>>;\n\n getFilePath(url: URL): string {\n const path = url\n .toString()\n .replace(/^file:\\/\\//, \"\")\n .replace(/\\?.*$/, \"\");\n this.logger.Debug().Str(\"url\", url.toString()).Str(\"path\", path).Msg(\"getFilePath\");\n return path;\n }\n\n async put(url: URL, body: Uint8Array): Promise<Result<void>> {\n return exception2Result(async () => {\n const file = this.getFilePath(url);\n this.logger.Debug().Str(\"url\", url.toString()).Str(\"file\", file).Msg(\"put\");\n await SysContainer.writefile(file, body);\n });\n }\n async get(url: URL): Promise<GetResult> {\n return exceptionWrapper(async () => {\n const file = this.getFilePath(url);\n try {\n const res = await SysContainer.readfile(file);\n this.logger.Debug().Url(url).Str(\"file\", file).Msg(\"get\");\n return Result.Ok(new Uint8Array(res));\n } catch (e: unknown) {\n // this.logger.Error().Err(e).Str(\"file\", file).Msg(\"get\");\n if (isNotFoundError(e)) {\n return Result.Err(new NotFoundError(`file not found: ${file}`));\n }\n return Result.Err(e as Error);\n }\n });\n }\n async delete(url: URL): Promise<Result<void>> {\n return exception2Result(async () => {\n await SysContainer.unlink(this.getFilePath(url));\n });\n }\n\n async destroyDir(baseURL: URL): Promise<Result<void>> {\n const url = await this.buildUrl(baseURL, \"x\");\n if (url.isErr()) return url;\n const filepath = SysContainer.dirname(this.getFilePath(url.Ok()));\n let dir: string[] = [];\n try {\n dir = await SysContainer.readdir(filepath);\n } catch (e: unknown) {\n if (!isNotFoundError(e)) {\n throw this.logger.Error().Err(e).Str(\"dir\", filepath).Msg(\"destroy:readdir\").AsError();\n }\n }\n for (const file of dir) {\n const pathed = SysContainer.join(filepath, file);\n try {\n await SysContainer.unlink(pathed);\n } catch (e: unknown) {\n if (!isNotFoundError(e)) {\n throw this.logger.Error().Err(e).Str(\"file\", pathed).Msg(\"destroy:unlink\").AsError();\n }\n }\n }\n return Result.Ok(undefined);\n }\n}\n\nexport class FileWALGateway extends FileGateway {\n constructor(logger: Logger) {\n super(ensureLogger(logger, \"FileWALGateway\"));\n }\n\n async destroy(baseURL: URL): Promise<Result<void>> {\n return this.destroyDir(baseURL);\n }\n async buildUrl(baseUrl: URL, key: string): Promise<Result<URL>> {\n const url = new URL(baseUrl.toString());\n url.pathname = SysContainer.join(await getPath(baseUrl, this.logger), ensureIndexName(baseUrl, \"wal\"), key + \".json\");\n return Result.Ok(url);\n }\n}\n\nexport class FileMetaGateway extends FileGateway {\n constructor(logger: Logger) {\n super(ensureLogger(logger, \"FileMetaGateway\"));\n }\n\n async destroy(baseURL: URL): Promise<Result<void>> {\n return this.destroyDir(baseURL);\n }\n async buildUrl(baseUrl: URL, key: string): Promise<Result<URL>> {\n const url = new URL(baseUrl.toString());\n url.pathname = SysContainer.join(await getPath(baseUrl, this.logger), ensureIndexName(baseUrl, \"meta\"), key + \".json\");\n return Result.Ok(url);\n }\n}\n\nexport class FileDataGateway extends FileGateway {\n readonly branches = new Set<string>();\n constructor(logger: Logger) {\n // console.log(\"FileDataGateway->\", logger);\n super(ensureLogger(logger, \"FileDataGateway\"));\n }\n\n async destroy(baseURL: URL): Promise<Result<void>> {\n return this.destroyDir(baseURL);\n }\n async buildUrl(baseUrl: URL, key: string): Promise<Result<URL>> {\n const url = new URL(baseUrl.toString());\n url.pathname = SysContainer.join(await getPath(baseUrl, this.logger), ensureIndexName(baseUrl, \"data\"), key + \".car\");\n return Result.Ok(url);\n }\n}\n\nfunction toArrayBuffer(buffer: Buffer) {\n const ab = new ArrayBuffer(buffer.length);\n const view = new Uint8Array(ab);\n for (let i = 0; i < buffer.length; ++i) {\n view[i] = buffer[i];\n }\n return view;\n}\n\nexport class FileTestStore implements TestStore {\n readonly logger: Logger;\n constructor(\n // readonly url: URL,\n logger: Logger,\n ) {\n this.logger = ensureLogger(logger, \"FileTestStore\");\n }\n\n async get(url: URL, key: string) {\n const logger = ensureLogger(this.logger, \"get\", { url: url.toString(), key });\n const dbFile = SysContainer.join(\n await getPath(url, this.logger),\n getStore(url, this.logger, SysContainer.join),\n getFileName(url, key, this.logger),\n );\n logger.Debug().Str(\"dbFile\", dbFile).Msg(\"get\");\n const buffer = await SysContainer.readfile(dbFile);\n logger.Debug().Str(\"dbFile\", dbFile).Len(buffer).Msg(\"got\");\n return toArrayBuffer(buffer);\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,20 @@
1
+ import {
2
+ IndexDBDataGateway,
3
+ IndexDBMetaGateway,
4
+ IndexDBTestStore,
5
+ IndexDBWalGateway,
6
+ getIndexDBName,
7
+ guardVersion
8
+ } from "./chunk-EVSZA26U.js";
9
+ import "./chunk-VZGT7ZYP.js";
10
+ import "./chunk-UCMXU3DH.js";
11
+ import "./chunk-H3A2HMMM.js";
12
+ export {
13
+ IndexDBDataGateway,
14
+ IndexDBMetaGateway,
15
+ IndexDBTestStore,
16
+ IndexDBWalGateway,
17
+ getIndexDBName,
18
+ guardVersion
19
+ };
20
+ //# sourceMappingURL=store-indexdb-FRX5PTKR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}