@fireproof/core 0.18.0 → 0.19.5-dev

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. package/README.md +29 -15
  2. package/chunk-7OGPZSGT.js +39 -0
  3. package/chunk-7OGPZSGT.js.map +1 -0
  4. package/chunk-H3A2HMMM.js +164 -0
  5. package/chunk-H3A2HMMM.js.map +1 -0
  6. package/chunk-HCXR2M5B.js +202 -0
  7. package/chunk-HCXR2M5B.js.map +1 -0
  8. package/chunk-QHSXUST7.js +208 -0
  9. package/chunk-QHSXUST7.js.map +1 -0
  10. package/chunk-VZGT7ZYP.js +22 -0
  11. package/chunk-VZGT7ZYP.js.map +1 -0
  12. package/index.cjs +4649 -0
  13. package/index.cjs.map +1 -0
  14. package/index.d.cts +911 -0
  15. package/index.d.ts +911 -0
  16. package/index.js +2923 -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-YS4U7AQ4.js +120 -0
  24. package/sqlite-data-store-YS4U7AQ4.js.map +1 -0
  25. package/sqlite-meta-store-FJZSZG4R.js +137 -0
  26. package/sqlite-meta-store-FJZSZG4R.js.map +1 -0
  27. package/sqlite-wal-store-6JZ4URNS.js +123 -0
  28. package/sqlite-wal-store-6JZ4URNS.js.map +1 -0
  29. package/store-file-HMHPQTUV.js +193 -0
  30. package/store-file-HMHPQTUV.js.map +1 -0
  31. package/store-indexdb-MRVZG4OG.js +20 -0
  32. package/store-indexdb-MRVZG4OG.js.map +1 -0
  33. package/store-sql-5XMJ5OWJ.js +406 -0
  34. package/store-sql-5XMJ5OWJ.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,406 @@
1
+ import {
2
+ NotFoundError
3
+ } from "./chunk-VZGT7ZYP.js";
4
+ import {
5
+ ensureLogger,
6
+ exception2Result,
7
+ exceptionWrapper,
8
+ getKey,
9
+ getName
10
+ } from "./chunk-HCXR2M5B.js";
11
+ import {
12
+ SysContainer
13
+ } from "./chunk-H3A2HMMM.js";
14
+
15
+ // src/runtime/store-sql/store-sql.ts
16
+ import { Result } from "@adviser/cement";
17
+
18
+ // src/runtime/store-sql/sqlite-adapter-better-sqlite3.ts
19
+ 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
+ var onceSQLiteConnections = new KeyedResolvOnce();
84
+ var SQLiteConnection = class _SQLiteConnection {
85
+ static fromURL(url, opts = {}) {
86
+ return new _SQLiteConnection(url, opts);
87
+ }
88
+ get client() {
89
+ if (!this._client) {
90
+ throw this.logger.Error().Msg("client not connected").AsError();
91
+ }
92
+ return this._client;
93
+ }
94
+ constructor(url, opts) {
95
+ this.opts = ensureSQLOpts(url, opts, "SQLiteConnection", { url });
96
+ this.logger = this.opts.logger;
97
+ this.url = url;
98
+ this.logger.Debug().Msg("constructor");
99
+ }
100
+ async connect() {
101
+ let fName = this.url.toString().replace("sqlite://", "").replace(/\?.*$/, "");
102
+ if (!fName) {
103
+ throw this.logger.Error().Str("url", this.url.toString()).Msg("filename is empty").AsError();
104
+ }
105
+ const hasName = this.url.searchParams.get("name");
106
+ if (hasName) {
107
+ fName = SysContainer.join(fName, hasName);
108
+ if (!fName.endsWith(".sqlite")) {
109
+ fName += ".sqlite";
110
+ }
111
+ }
112
+ this._client = await onceSQLiteConnections.get(fName).once(async () => {
113
+ this.logger.Debug().Str("filename", fName).Msg("connect");
114
+ const Sqlite3Database = (await import("better-sqlite3")).default;
115
+ if (hasName) {
116
+ await SysContainer.mkdir(SysContainer.dirname(fName), { recursive: true });
117
+ }
118
+ const db = new Sqlite3Database(fName, {
119
+ // verbose: console.log,
120
+ nativeBinding: "./node_modules/better-sqlite3/build/Release/better_sqlite3.node"
121
+ });
122
+ if (!db) {
123
+ throw this.logger.Error().Msg("connect failed").AsError();
124
+ }
125
+ return db;
126
+ });
127
+ }
128
+ async close() {
129
+ this.logger.Debug().Msg("close");
130
+ await this.client.close();
131
+ }
132
+ };
133
+
134
+ // src/runtime/store-sql/sql-connection-factory.ts
135
+ function SQLConnectionFactory(databaseURL, opts = {}) {
136
+ const logger = ensureLogger(opts, "SQLFactory");
137
+ switch (databaseURL.protocol) {
138
+ case "sqlite:":
139
+ logger.Debug().Str("databaseURL", databaseURL.toString()).Msg("connecting to sqlite");
140
+ return SQLiteConnection.fromURL(databaseURL, {
141
+ ...opts,
142
+ logger
143
+ });
144
+ default:
145
+ throw logger.Error().Msg("unsupported protocol " + databaseURL.protocol).AsError();
146
+ }
147
+ }
148
+
149
+ // src/runtime/store-sql/store-version-factory.ts
150
+ async function WalStoreFactory(db) {
151
+ switch (db.opts.sqlFlavor) {
152
+ case "sqlite": {
153
+ const { V0_18_0SQLiteWalStore } = await import("./sqlite-wal-store-6JZ4URNS.js");
154
+ const store = new V0_18_0SQLiteWalStore(db);
155
+ return store;
156
+ }
157
+ default:
158
+ throw ensureLogger(db.opts, "WalStoreFactory").Error().Msg("unsupported db connection").AsError();
159
+ }
160
+ }
161
+ async function DataStoreFactory(db) {
162
+ switch (db.opts.sqlFlavor) {
163
+ case "sqlite": {
164
+ const { V0_18_0SQLiteDataStore } = await import("./sqlite-data-store-YS4U7AQ4.js");
165
+ const store = new V0_18_0SQLiteDataStore(db);
166
+ return store;
167
+ }
168
+ default:
169
+ throw ensureLogger(db.opts, "DataStoreFactory").Error().Msg("unsupported db connection").AsError();
170
+ }
171
+ }
172
+ async function MetaStoreFactory(db) {
173
+ switch (db.opts.sqlFlavor) {
174
+ case "sqlite": {
175
+ const { V0_18_0SQLiteMetaStore } = await import("./sqlite-meta-store-FJZSZG4R.js");
176
+ const store = new V0_18_0SQLiteMetaStore(db);
177
+ return store;
178
+ }
179
+ default:
180
+ throw ensureLogger(db.opts, "MetaStoreFactory").Error().Msg("unsupported db connection").AsError();
181
+ }
182
+ }
183
+
184
+ // src/runtime/store-sql/store-sql.ts
185
+ var SQLWalGateway = class {
186
+ constructor(logger) {
187
+ this.walSQLStore = {};
188
+ this.logger = ensureLogger(logger, "SQLWalGateway");
189
+ }
190
+ buildUrl(baseUrl, key) {
191
+ const url = new URL(baseUrl.toString());
192
+ url.searchParams.set("key", key);
193
+ return Promise.resolve(Result.Ok(url));
194
+ }
195
+ async start(baseUrl) {
196
+ return exception2Result(async () => {
197
+ this.logger.Debug().Url(baseUrl).Msg("start");
198
+ const conn = SQLConnectionFactory(baseUrl);
199
+ const ws = await WalStoreFactory(conn);
200
+ await ws.start(baseUrl);
201
+ this.walSQLStore = ws;
202
+ });
203
+ }
204
+ close(baseUrl) {
205
+ return this.walSQLStore.close(baseUrl);
206
+ }
207
+ destroy(baseUrl) {
208
+ return this.walSQLStore.destroy(baseUrl);
209
+ }
210
+ async put(url, body) {
211
+ return exception2Result(async () => {
212
+ const branch = getKey(url, this.logger);
213
+ const name = getName(url, this.logger);
214
+ await this.walSQLStore.insert(url, {
215
+ state: body,
216
+ updated_at: /* @__PURE__ */ new Date(),
217
+ name,
218
+ branch
219
+ });
220
+ });
221
+ }
222
+ async get(url) {
223
+ return exceptionWrapper(async () => {
224
+ const branch = getKey(url, this.logger);
225
+ const name = getName(url, this.logger);
226
+ const record = await this.walSQLStore.select(url, { name, branch });
227
+ if (record.length === 0) {
228
+ return Result.Err(new NotFoundError(`not found ${name} ${branch}`));
229
+ }
230
+ return Result.Ok(record[0].state);
231
+ });
232
+ }
233
+ async delete(url) {
234
+ return exception2Result(async () => {
235
+ const branch = getKey(url, this.logger);
236
+ const name = getName(url, this.logger);
237
+ await this.walSQLStore.delete(url, { name, branch });
238
+ });
239
+ }
240
+ };
241
+ var SQLMetaGateway = class {
242
+ constructor(logger) {
243
+ this.metaSQLStore = {};
244
+ this.logger = ensureLogger(logger, "SQLMetaGateway");
245
+ }
246
+ buildUrl(baseUrl, key) {
247
+ const url = new URL(baseUrl.toString());
248
+ url.searchParams.set("key", key);
249
+ return Promise.resolve(Result.Ok(url));
250
+ }
251
+ async start(baseUrl) {
252
+ return exception2Result(async () => {
253
+ this.logger.Debug().Url(baseUrl).Msg("start");
254
+ const conn = SQLConnectionFactory(baseUrl);
255
+ const ws = await MetaStoreFactory(conn);
256
+ await ws.start(baseUrl);
257
+ this.metaSQLStore = ws;
258
+ this.logger.Debug().Url(baseUrl).Msg("started");
259
+ });
260
+ }
261
+ close(baseUrl) {
262
+ return this.metaSQLStore.close(baseUrl);
263
+ }
264
+ destroy(baseUrl) {
265
+ return this.metaSQLStore.destroy(baseUrl);
266
+ }
267
+ async put(url, body) {
268
+ return exception2Result(async () => {
269
+ const branch = getKey(url, this.logger);
270
+ const name = getName(url, this.logger);
271
+ await this.metaSQLStore.insert(url, {
272
+ meta: body,
273
+ updated_at: /* @__PURE__ */ new Date(),
274
+ name,
275
+ branch
276
+ });
277
+ });
278
+ }
279
+ async get(url) {
280
+ return exceptionWrapper(async () => {
281
+ const branch = getKey(url, this.logger);
282
+ const name = getName(url, this.logger);
283
+ const record = await this.metaSQLStore.select(url, {
284
+ name,
285
+ branch
286
+ });
287
+ if (record.length === 0) {
288
+ return Result.Err(new NotFoundError(`not found ${name} ${branch}`));
289
+ }
290
+ return Result.Ok(record[0].meta);
291
+ });
292
+ }
293
+ async delete(url) {
294
+ return exception2Result(async () => {
295
+ const branch = getKey(url, this.logger);
296
+ const name = getName(url, this.logger);
297
+ await this.metaSQLStore.delete(url, {
298
+ name,
299
+ branch
300
+ });
301
+ });
302
+ }
303
+ };
304
+ var SQLDataGateway = class {
305
+ constructor(logger) {
306
+ this.dataSQLStore = {};
307
+ this.logger = ensureLogger(logger, "SQLDataGateway");
308
+ }
309
+ buildUrl(baseUrl, key) {
310
+ const url = new URL(baseUrl.toString());
311
+ url.searchParams.set("key", key);
312
+ return Promise.resolve(Result.Ok(url));
313
+ }
314
+ async start(baseUrl) {
315
+ return exception2Result(async () => {
316
+ this.logger.Debug().Url(baseUrl).Msg("pre-sql-connection");
317
+ const conn = SQLConnectionFactory(baseUrl);
318
+ this.logger.Debug().Url(baseUrl).Msg("post-sql-connection");
319
+ const ws = await DataStoreFactory(conn);
320
+ this.logger.Debug().Url(baseUrl).Msg("post-data-store-factory");
321
+ await ws.start(baseUrl);
322
+ this.dataSQLStore = ws;
323
+ this.logger.Debug().Url(baseUrl).Msg("started");
324
+ });
325
+ }
326
+ close(baseUrl) {
327
+ return this.dataSQLStore.close(baseUrl);
328
+ }
329
+ destroy(baseUrl) {
330
+ return this.dataSQLStore.destroy(baseUrl);
331
+ }
332
+ async put(url, body) {
333
+ return exception2Result(async () => {
334
+ const cid = getKey(url, this.logger);
335
+ const name = getName(url, this.logger);
336
+ await this.dataSQLStore.insert(url, {
337
+ data: body,
338
+ updated_at: /* @__PURE__ */ new Date(),
339
+ name,
340
+ car: cid
341
+ });
342
+ });
343
+ }
344
+ async get(url) {
345
+ return exceptionWrapper(async () => {
346
+ const branch = getKey(url, this.logger);
347
+ const record = await this.dataSQLStore.select(url, branch);
348
+ if (record.length === 0) {
349
+ return Result.Err(new NotFoundError(`not found ${branch}`));
350
+ }
351
+ return Result.Ok(record[0].data);
352
+ });
353
+ }
354
+ async delete(url) {
355
+ return exception2Result(async () => {
356
+ const branch = getKey(url, this.logger);
357
+ await this.dataSQLStore.delete(url, branch);
358
+ return Result.Ok(void 0);
359
+ });
360
+ }
361
+ };
362
+ var SQLTestStore = class {
363
+ constructor(ilogger) {
364
+ const logger = ensureLogger(ilogger, "SQLTestStore");
365
+ this.logger = logger;
366
+ }
367
+ async get(url, key) {
368
+ const conn = SQLConnectionFactory(url);
369
+ const name = getName(url, this.logger);
370
+ switch (url.searchParams.get("store")) {
371
+ case "wal": {
372
+ const sqlStore = await WalStoreFactory(conn);
373
+ await sqlStore.start(url);
374
+ const records = await sqlStore.select(url, {
375
+ name,
376
+ branch: key
377
+ });
378
+ return records[0].state;
379
+ }
380
+ case "meta": {
381
+ const sqlStore = await MetaStoreFactory(conn);
382
+ await sqlStore.start(url);
383
+ const records = await sqlStore.select(url, {
384
+ name,
385
+ branch: key
386
+ });
387
+ return records[0].meta;
388
+ }
389
+ case "data": {
390
+ const sqlStore = await DataStoreFactory(conn);
391
+ await sqlStore.start(url);
392
+ const records = await sqlStore.select(url, key);
393
+ return records[0].data;
394
+ }
395
+ default:
396
+ throw this.logger.Error().Str("key", key).Msg(`Method not implemented`);
397
+ }
398
+ }
399
+ };
400
+ export {
401
+ SQLDataGateway,
402
+ SQLMetaGateway,
403
+ SQLTestStore,
404
+ SQLWalGateway
405
+ };
406
+ //# sourceMappingURL=store-sql-5XMJ5OWJ.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/types.ts","../../src/runtime/store-sql/ensurer.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 { Logger, Result } from \"@adviser/cement\";\nimport type { RunResult } from \"better-sqlite3\";\n\nexport interface DBConnection {\n connect(): Promise<void>;\n readonly opts: SQLOpts;\n}\n\nexport interface SQLStore<IType, KType, OType = IType[]> {\n readonly dbConn: DBConnection;\n start(url: URL): Promise<void>;\n insert(url: URL, ose: IType): Promise<RunResult>;\n select(url: URL, car: KType): Promise<OType>;\n delete(url: URL, car: KType): Promise<RunResult>;\n close(url: URL): Promise<Result<void>>;\n destroy(url: URL): Promise<Result<void>>;\n}\n\nexport interface SQLTableNames {\n readonly data: string;\n readonly meta: string;\n readonly wal: string;\n}\n\nexport const DefaultSQLTableNames: SQLTableNames = {\n data: \"Datas\",\n meta: \"Metas\",\n wal: \"Wals\",\n};\n\nexport interface SQLOpts {\n readonly url: URL;\n readonly sqlFlavor: \"sqlite\" | \"mysql\" | \"postgres\";\n readonly tableNames: SQLTableNames;\n readonly logger: Logger;\n readonly textEncoder: TextEncoder;\n readonly textDecoder: TextDecoder;\n}\n\nexport interface WalKey {\n readonly name: string;\n readonly branch: string;\n}\n\nexport interface WalRecord extends WalKey {\n readonly state: Uint8Array;\n readonly updated_at: Date;\n}\n\nexport type WalSQLStore = SQLStore<WalRecord, WalKey>;\n\nexport interface MetaType {\n readonly name: string;\n readonly branch: string;\n readonly meta: Uint8Array;\n}\n\nexport interface MetaRecordKey {\n readonly name: string;\n readonly branch: string;\n}\n\nexport interface MetaRecord extends MetaRecordKey {\n readonly meta: Uint8Array;\n readonly updated_at: Date;\n}\n\nexport type MetaSQLStore = SQLStore<MetaRecord, MetaRecordKey>;\n\nexport interface DataRecord {\n readonly name: string;\n readonly car: string;\n readonly data: Uint8Array;\n readonly updated_at: Date;\n}\n\nexport type DataSQLStore = SQLStore<DataRecord, string>;\n","import { ensureLogger, type Logger } from \"../../utils\";\nimport { SQLOpts, SQLTableNames, DefaultSQLTableNames } from \"./types\";\n\nfunction sqlTableName(...names: string[]): string {\n return names\n .map((name) => name.replace(/^[^a-zA-Z0-9]+/, \"\").replace(/[^a-zA-Z0-9]+/g, \"_\"))\n .filter((i) => i.length)\n .join(\"_\");\n}\n\nfunction ensureTableNames(url: URL, opts?: Partial<SQLOpts>): SQLTableNames {\n let isIndex = \"\";\n if (url.searchParams.has(\"index\")) {\n isIndex = url.searchParams.get(\"index\") || \".idx\";\n }\n const ret = opts?.tableNames || DefaultSQLTableNames;\n // console.log(\"isIndex->\", opts?.url, isIndex, sqlTableName(isIndex, ret.data));\n if (isIndex.length) {\n return {\n data: sqlTableName(isIndex, ret.data),\n meta: sqlTableName(isIndex, ret.meta),\n wal: sqlTableName(isIndex, ret.wal),\n };\n }\n return {\n data: sqlTableName(ret.data),\n meta: sqlTableName(ret.meta),\n wal: sqlTableName(ret.wal),\n };\n}\n\nconst textEncoder = new TextEncoder();\nfunction ensureTextEncoder(opts?: Partial<SQLOpts>): TextEncoder {\n return opts?.textEncoder || textEncoder;\n}\n\nconst textDecoder = new TextDecoder();\nfunction ensureTextDecoder(opts?: Partial<SQLOpts>): TextDecoder {\n return opts?.textDecoder || textDecoder;\n}\n\nfunction url2sqlFlavor(url: URL, logger: Logger): \"sqlite\" | \"mysql\" | \"postgres\" {\n const flavor = url.protocol.replace(/:.*$/, \"\");\n switch (flavor) {\n case \"sqlite\":\n case \"mysql\":\n case \"postgres\":\n return flavor;\n default:\n throw logger.Error().Str(\"flavor\", flavor).Msg(\"unsupported protocol\").AsError();\n }\n}\n\nexport function ensureSQLOpts(url: URL, opts: Partial<SQLOpts>, componentName: string, ctx?: Record<string, unknown>): SQLOpts {\n const logger = ensureLogger(opts, componentName, ctx);\n return {\n url,\n sqlFlavor: url2sqlFlavor(url, logger),\n tableNames: ensureTableNames(url, opts),\n logger,\n textEncoder: ensureTextEncoder(opts),\n textDecoder: ensureTextDecoder(opts),\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":[]}