@vielzeug/vault 2.5.0 → 3.0.1

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 (75) hide show
  1. package/README.md +25 -32
  2. package/dist/adapter-core.cjs +1 -1
  3. package/dist/adapter-core.cjs.map +1 -1
  4. package/dist/adapter-core.d.ts +32 -7
  5. package/dist/adapter-core.d.ts.map +1 -1
  6. package/dist/adapter-core.js +204 -120
  7. package/dist/adapter-core.js.map +1 -1
  8. package/dist/adapters/indexeddb.cjs +1 -1
  9. package/dist/adapters/indexeddb.cjs.map +1 -1
  10. package/dist/adapters/indexeddb.d.ts +7 -4
  11. package/dist/adapters/indexeddb.d.ts.map +1 -1
  12. package/dist/adapters/indexeddb.js +204 -172
  13. package/dist/adapters/indexeddb.js.map +1 -1
  14. package/dist/adapters/memory.cjs +1 -1
  15. package/dist/adapters/memory.cjs.map +1 -1
  16. package/dist/adapters/memory.d.ts +2 -4
  17. package/dist/adapters/memory.d.ts.map +1 -1
  18. package/dist/adapters/memory.js +30 -52
  19. package/dist/adapters/memory.js.map +1 -1
  20. package/dist/adapters/sqlite.cjs +21 -21
  21. package/dist/adapters/sqlite.cjs.map +1 -1
  22. package/dist/adapters/sqlite.d.ts +4 -4
  23. package/dist/adapters/sqlite.d.ts.map +1 -1
  24. package/dist/adapters/sqlite.js +246 -248
  25. package/dist/adapters/sqlite.js.map +1 -1
  26. package/dist/adapters/webstorage.cjs +1 -1
  27. package/dist/adapters/webstorage.cjs.map +1 -1
  28. package/dist/adapters/webstorage.d.ts +4 -4
  29. package/dist/adapters/webstorage.d.ts.map +1 -1
  30. package/dist/adapters/webstorage.js +100 -119
  31. package/dist/adapters/webstorage.js.map +1 -1
  32. package/dist/codec.cjs +2 -0
  33. package/dist/codec.cjs.map +1 -0
  34. package/dist/codec.d.ts +5 -0
  35. package/dist/codec.d.ts.map +1 -0
  36. package/dist/codec.js +6 -0
  37. package/dist/codec.js.map +1 -0
  38. package/dist/errors.cjs +1 -1
  39. package/dist/errors.cjs.map +1 -1
  40. package/dist/errors.d.ts +5 -0
  41. package/dist/errors.d.ts.map +1 -1
  42. package/dist/errors.js +10 -2
  43. package/dist/errors.js.map +1 -1
  44. package/dist/index.cjs +1 -1
  45. package/dist/index.d.ts +3 -2
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +3 -2
  48. package/dist/internal.cjs +1 -1
  49. package/dist/internal.cjs.map +1 -1
  50. package/dist/internal.d.ts.map +1 -1
  51. package/dist/internal.js +16 -13
  52. package/dist/internal.js.map +1 -1
  53. package/dist/query.cjs +1 -1
  54. package/dist/query.cjs.map +1 -1
  55. package/dist/query.d.ts +8 -24
  56. package/dist/query.d.ts.map +1 -1
  57. package/dist/query.js +23 -35
  58. package/dist/query.js.map +1 -1
  59. package/dist/ttl.cjs +1 -1
  60. package/dist/ttl.cjs.map +1 -1
  61. package/dist/ttl.js +1 -1
  62. package/dist/ttl.js.map +1 -1
  63. package/dist/types.cjs +1 -1
  64. package/dist/types.cjs.map +1 -1
  65. package/dist/types.d.ts +46 -33
  66. package/dist/types.d.ts.map +1 -1
  67. package/dist/types.js +8 -2
  68. package/dist/types.js.map +1 -1
  69. package/dist/vault.cjs +1 -1
  70. package/dist/vault.cjs.map +1 -1
  71. package/dist/vault.iife.js +1 -1
  72. package/dist/vault.iife.js.map +1 -1
  73. package/dist/vault.js +1 -1
  74. package/dist/vault.js.map +1 -1
  75. package/package.json +11 -9
@@ -1,9 +1,10 @@
1
- import { VaultDisposedError as e, VaultError as t } from "../errors.js";
2
- import { isExpired as n } from "../ttl.js";
3
- import { encodeVaultKey as r, getRecordKey as i } from "../internal.js";
4
- import { assertBatchTables as a, buildAdapterOps as o, buildTxContext as s } from "../adapter-core.js";
1
+ import { decodeRecord as e, encodeRecord as t } from "../codec.js";
2
+ import { VaultDisposedError as n, VaultError as r } from "../errors.js";
3
+ import { encodeVaultKey as i, getRecordKey as a } from "../internal.js";
4
+ import { isExpired as o } from "../ttl.js";
5
+ import { assertBatchTables as s, buildDocumentStore as c, buildTxContext as l, withBatch as u } from "../adapter-core.js";
5
6
  //#region src/adapters/sqlite.ts
6
- var c = /* @__PURE__ */ new WeakMap(), l = "\"__vielzeug_vault_records\"", u = "\"__vielzeug_vault_metadata\"", d = 1, f = 100, p = class {
7
+ var d = /* @__PURE__ */ new WeakMap(), f = "\"__vielzeug_vault_records\"", p = "\"__vielzeug_vault_metadata\"", m = 1, h = 100, g = class {
7
8
  tail = Promise.resolve();
8
9
  async acquire() {
9
10
  let e, t = this.tail;
@@ -20,24 +21,24 @@ var c = /* @__PURE__ */ new WeakMap(), l = "\"__vielzeug_vault_records\"", u = "
20
21
  }
21
22
  }
22
23
  };
23
- function m(e) {
24
- let t = c.get(e);
24
+ function _(e) {
25
+ let t = d.get(e);
25
26
  if (t) return t;
26
- let n = new p(), r = {
27
+ let n = new g(), r = {
27
28
  batchActive: !1,
28
29
  executor: n,
29
- initialized: n.run(() => h(e)),
30
+ initialized: n.run(() => v(e)),
30
31
  listeners: /* @__PURE__ */ new Set()
31
32
  };
32
- return c.set(e, r), r;
33
+ return d.set(e, r), r;
33
34
  }
34
- function h(e) {
35
+ function v(e) {
35
36
  e.exec(`
36
- CREATE TABLE IF NOT EXISTS ${u} (
37
+ CREATE TABLE IF NOT EXISTS ${p} (
37
38
  namespace TEXT PRIMARY KEY,
38
39
  format_version INTEGER NOT NULL
39
40
  );
40
- CREATE TABLE IF NOT EXISTS ${l} (
41
+ CREATE TABLE IF NOT EXISTS ${f} (
41
42
  namespace TEXT NOT NULL,
42
43
  table_name TEXT NOT NULL,
43
44
  key_tag TEXT NOT NULL,
@@ -49,58 +50,56 @@ function h(e) {
49
50
  PRIMARY KEY (namespace, table_name, key_tag)
50
51
  );
51
52
  CREATE INDEX IF NOT EXISTS "__vielzeug_vault_records_expiration"
52
- ON ${l} (namespace, table_name, expires_at);
53
+ ON ${f} (namespace, table_name, expires_at);
53
54
  CREATE INDEX IF NOT EXISTS "__vielzeug_vault_records_number_key"
54
- ON ${l} (namespace, table_name, key_kind, key_number);
55
+ ON ${f} (namespace, table_name, key_kind, key_number);
55
56
  CREATE INDEX IF NOT EXISTS "__vielzeug_vault_records_string_key"
56
- ON ${l} (namespace, table_name, key_kind, key_string);
57
+ ON ${f} (namespace, table_name, key_kind, key_string);
57
58
  `);
58
59
  }
59
- function g(e, n) {
60
- let r = T(e, `SELECT format_version FROM ${u} WHERE namespace = ?`, [n]);
61
- if (r === void 0) {
62
- w(e, `INSERT INTO ${u} (namespace, format_version) VALUES (?, ?)`, [n, d]);
60
+ function y(e, t) {
61
+ let n = O(e, `SELECT format_version FROM ${p} WHERE namespace = ?`, [t]);
62
+ if (n === void 0) {
63
+ D(e, `INSERT INTO ${p} (namespace, format_version) VALUES (?, ?)`, [t, m]);
63
64
  return;
64
65
  }
65
- if (r.format_version !== d) throw new t(`SQLite storage format for "${n}" is not supported`);
66
+ if (n.format_version !== m) throw new r(`SQLite storage format for "${t}" is not supported`);
66
67
  }
67
- function _(e) {
68
- if (e.length === 0) throw new t("createSQLite: name must not be empty");
68
+ function b(e) {
69
+ if (e.length === 0) throw new r("createSQLite: name must not be empty");
69
70
  }
70
- function v(e, n, r) {
71
+ function x(e, t, n) {
71
72
  if (e === null || typeof e == "boolean" || typeof e == "string") return;
72
73
  if (typeof e == "number") {
73
74
  if (Number.isFinite(e)) return;
74
- throw new t(`SQLite serialization failed at ${r}: numbers must be finite`);
75
+ throw new r(`SQLite serialization failed at ${n}: numbers must be finite`);
75
76
  }
76
- if (typeof e != "object") throw new t(`SQLite serialization failed at ${r}: expected a JSON-compatible value`);
77
- if (n.has(e)) throw new t(`SQLite serialization failed at ${r}: circular references are not supported`);
77
+ if (typeof e != "object") throw new r(`SQLite serialization failed at ${n}: expected a JSON-compatible value`);
78
+ if (t.has(e)) throw new r(`SQLite serialization failed at ${n}: circular references are not supported`);
78
79
  if (Array.isArray(e)) {
79
- n.add(e);
80
- for (let t = 0; t < e.length; t += 1) v(e[t], n, `${r}[${String(t)}]`);
81
- n.delete(e);
80
+ t.add(e);
81
+ for (let r = 0; r < e.length; r += 1) x(e[r], t, `${n}[${String(r)}]`);
82
+ t.delete(e);
82
83
  return;
83
84
  }
84
85
  let i = Object.getPrototypeOf(e);
85
- if (i !== null && i !== Object.prototype) throw new t(`SQLite serialization failed at ${r}: expected a plain object`);
86
- n.add(e);
87
- for (let [t, i] of Object.entries(e)) v(i, n, `${r}.${t}`);
88
- n.delete(e);
86
+ if (i !== null && i !== Object.prototype) throw new r(`SQLite serialization failed at ${n}: expected a plain object`);
87
+ t.add(e);
88
+ for (let [r, i] of Object.entries(e)) x(i, t, `${n}.${r}`);
89
+ t.delete(e);
89
90
  }
90
- function y(e) {
91
- return v(e, /* @__PURE__ */ new Set(), "record"), JSON.stringify(e);
91
+ function S(e) {
92
+ return x(e, /* @__PURE__ */ new Set(), "record"), JSON.stringify(e);
92
93
  }
93
- function b(e) {
94
+ function C(e) {
94
95
  try {
95
- let n = JSON.parse(e);
96
- if (typeof n != "object" || !n || Array.isArray(n)) throw new t("stored record is not a JSON object");
97
- return n;
96
+ return JSON.parse(e);
98
97
  } catch (e) {
99
- throw e instanceof t ? e : new t("stored record contains invalid JSON", { cause: e });
98
+ throw e instanceof r ? e : new r("stored record contains invalid JSON", { cause: e });
100
99
  }
101
100
  }
102
- function x(e) {
103
- let t = r(e);
101
+ function w(e) {
102
+ let t = i(e);
104
103
  return typeof e == "number" ? {
105
104
  encoded: t,
106
105
  kind: "number",
@@ -113,17 +112,17 @@ function x(e) {
113
112
  string: e
114
113
  };
115
114
  }
116
- function S(e) {
117
- let n = e.value_json, r = e.expires_at, i = e.row_id;
118
- if (typeof n != "string" || typeof i != "number" || !Number.isInteger(i)) throw new t("SQLite storage contains a malformed record");
119
- if (r !== null && (typeof r != "number" || !Number.isFinite(r))) throw new t("SQLite storage contains a malformed expiration timestamp");
115
+ function T(e) {
116
+ let t = e.value_json, n = e.expires_at, i = e.row_id;
117
+ if (typeof t != "string" || typeof i != "number" || !Number.isInteger(i)) throw new r("SQLite storage contains a malformed record");
118
+ if (n !== null && (typeof n != "number" || !Number.isFinite(n))) throw new r("SQLite storage contains a malformed expiration timestamp");
120
119
  return {
121
- expiresAt: typeof r == "number" ? r : void 0,
122
- json: n,
120
+ expiresAt: typeof n == "number" ? n : void 0,
121
+ json: t,
123
122
  rowId: i
124
123
  };
125
124
  }
126
- function C(e, t, n) {
125
+ function E(e, t, n) {
127
126
  let r = e.prepare(t);
128
127
  try {
129
128
  return n(r);
@@ -131,122 +130,111 @@ function C(e, t, n) {
131
130
  r.finalize?.();
132
131
  }
133
132
  }
134
- function w(e, t, n = []) {
135
- return C(e, t, (e) => e.run(...n));
133
+ function D(e, t, n = []) {
134
+ return E(e, t, (e) => e.run(...n));
136
135
  }
137
- function T(e, t, n = []) {
138
- return C(e, t, (e) => e.get(...n));
136
+ function O(e, t, n = []) {
137
+ return E(e, t, (e) => e.get(...n) ?? void 0);
139
138
  }
140
- function E(e, t, n = []) {
141
- return C(e, t, (e) => e.all(...n));
139
+ function k(e, t, n = []) {
140
+ return E(e, t, (e) => e.all(...n));
142
141
  }
143
- function D(e, t, n) {
144
- w(e, `DELETE FROM ${l}
142
+ function A(e, t, n) {
143
+ D(e, `DELETE FROM ${f}
145
144
  WHERE namespace = ? AND table_name = ? AND expires_at IS NOT NULL AND expires_at <= ?`, [
146
145
  t,
147
146
  n,
148
147
  Date.now()
149
148
  ]);
150
149
  }
151
- function O(e, t) {
152
- let r = S(t);
153
- if (n(r.expiresAt)) {
154
- w(e, `DELETE FROM ${l} WHERE rowid = ?`, [r.rowId]);
155
- return;
156
- }
157
- return b(r.json);
158
- }
159
- function k(e, t, n, r = "", i = []) {
160
- return D(e, t, n), E(e, `SELECT rowid AS row_id, expires_at, value_json
161
- FROM ${l}
162
- WHERE namespace = ? AND table_name = ?${r}
163
- ORDER BY rowid`, [
164
- t,
165
- n,
166
- ...i
167
- ]).flatMap((t) => {
168
- let n = O(e, t);
169
- return n === void 0 ? [] : [n];
170
- });
171
- }
172
- function A(e, n, r, a = !1) {
173
- let o = (t, r) => {
174
- let i = x(r), a = T(e, `SELECT rowid AS row_id, expires_at, value_json
175
- FROM ${l}
150
+ function j(n, i, s, c, l = !1) {
151
+ let u = (t, a) => {
152
+ let s = w(a), l = O(n, `SELECT rowid AS row_id, expires_at, value_json
153
+ FROM ${f}
176
154
  WHERE namespace = ? AND table_name = ? AND key_tag = ?`, [
177
- n,
155
+ i,
178
156
  t,
179
- i.encoded
157
+ s.encoded
180
158
  ]);
181
- return a === void 0 ? void 0 : O(e, a);
182
- }, s = {
183
- async clear(t) {
184
- w(e, `DELETE FROM ${l} WHERE namespace = ? AND table_name = ?`, [n, t]);
185
- },
186
- async count(r) {
187
- D(e, n, r);
188
- let i = T(e, `SELECT COUNT(*) AS count FROM ${l} WHERE namespace = ? AND table_name = ?`, [n, r])?.count;
189
- if (typeof i != "number") throw new t("SQLite storage returned an invalid count");
190
- return i;
159
+ if (l === void 0) return;
160
+ let u = T(l);
161
+ if (o(u.expiresAt)) {
162
+ D(n, `DELETE FROM ${f} WHERE rowid = ?`, [u.rowId]);
163
+ return;
164
+ }
165
+ try {
166
+ let n = C(u.json);
167
+ return e(c[t], n);
168
+ } catch (e) {
169
+ throw e instanceof r ? e : new r(`validation failed for table "${String(t)}"`, { cause: e });
170
+ }
171
+ }, d = {
172
+ async clear(e) {
173
+ D(n, `DELETE FROM ${f} WHERE namespace = ? AND table_name = ?`, [i, e]);
191
174
  },
192
- async delete(t, r) {
193
- let i = x(r);
194
- return (w(e, `DELETE FROM ${l}
175
+ async delete(e, t) {
176
+ let r = w(t);
177
+ return (D(n, `DELETE FROM ${f}
195
178
  WHERE namespace = ? AND table_name = ? AND key_tag = ?
196
179
  AND (expires_at IS NULL OR expires_at > ?)`, [
197
- n,
198
- t,
199
- i.encoded,
180
+ i,
181
+ e,
182
+ r.encoded,
200
183
  Date.now()
201
184
  ])?.changes ?? 0) > 0;
202
185
  },
203
- async deleteMany(t, r) {
204
- if (r.length === 0) return 0;
205
- let i = 0, a = r.map((e) => x(e).encoded);
206
- for (let r = 0; r < a.length; r += 996) {
207
- let o = a.slice(r, r + 996), s = w(e, `DELETE FROM ${l}
186
+ async deleteMany(e, t) {
187
+ let r = 0, a = t.map((e) => w(e).encoded);
188
+ for (let t = 0; t < a.length; t += 996) {
189
+ let o = a.slice(t, t + 996), s = D(n, `DELETE FROM ${f}
208
190
  WHERE namespace = ? AND table_name = ? AND key_tag IN (${o.map(() => "?").join(", ")})
209
191
  AND (expires_at IS NULL OR expires_at > ?)`, [
210
- n,
211
- t,
192
+ i,
193
+ e,
212
194
  ...o,
213
195
  Date.now()
214
196
  ]);
215
- i += s?.changes ?? 0;
197
+ r += s?.changes ?? 0;
216
198
  }
217
- return i;
199
+ return r;
218
200
  },
219
201
  async get(e, t) {
220
- return o(e, t);
202
+ return u(e, t);
221
203
  },
222
204
  async getAll(t) {
223
- return k(e, n, t);
224
- },
225
- async getAllKeys(e) {
226
- return (await s.getAll(e)).map((t) => i(r, e, t));
205
+ return A(n, i, t), k(n, `SELECT rowid AS row_id, expires_at, value_json
206
+ FROM ${f}
207
+ WHERE namespace = ? AND table_name = ?
208
+ ORDER BY rowid`, [i, t]).flatMap((i) => {
209
+ let a = T(i);
210
+ if (o(a.expiresAt)) return D(n, `DELETE FROM ${f} WHERE rowid = ?`, [a.rowId]), [];
211
+ try {
212
+ let n = C(a.json);
213
+ return [e(c[t], n)];
214
+ } catch (e) {
215
+ throw e instanceof r ? e : new r(`validation failed for table "${String(t)}"`, { cause: e });
216
+ }
217
+ });
227
218
  },
228
219
  async getMany(e, t) {
229
- return t.map((t) => o(e, t));
230
- },
231
- async has(e, t) {
232
- return o(e, t) !== void 0;
220
+ return t.map((t) => u(e, t));
233
221
  },
234
222
  async pruneAllExpired() {
235
223
  let e = {};
236
- for (let t of Object.keys(r)) e[t] = await s.pruneExpiredInTable(t);
224
+ for (let t of Object.keys(s)) e[t] = await d.pruneExpiredInTable(t);
237
225
  return e;
238
226
  },
239
- async pruneExpiredInTable(r) {
240
- let i = T(e, `SELECT COUNT(*) AS count FROM ${l} WHERE namespace = ? AND table_name = ?`, [n, r])?.count;
241
- if (typeof i != "number") throw new t("SQLite storage returned an invalid count");
242
- D(e, n, r);
243
- let a = T(e, `SELECT COUNT(*) AS count FROM ${l} WHERE namespace = ? AND table_name = ?`, [n, r])?.count;
244
- if (typeof a != "number") throw new t("SQLite storage returned an invalid count");
245
- return i - a;
227
+ async pruneExpiredInTable(e) {
228
+ let t = O(n, `SELECT COUNT(*) AS count FROM ${f} WHERE namespace = ? AND table_name = ?`, [i, e])?.count;
229
+ if (typeof t != "number") throw new r("SQLite storage returned an invalid count");
230
+ A(n, i, e);
231
+ let a = O(n, `SELECT COUNT(*) AS count FROM ${f} WHERE namespace = ? AND table_name = ?`, [i, e])?.count;
232
+ if (typeof a != "number") throw new r("SQLite storage returned an invalid count");
233
+ return t - a;
246
234
  },
247
- async put(t, a, o) {
248
- let s = x(i(r, t, a)), c = o === void 0 ? null : Date.now() + o;
249
- w(e, `INSERT INTO ${l}
235
+ async put(e, r, o) {
236
+ let l = w(a(s, e, r)), u = o === void 0 ? null : Date.now() + o, d = t(c[e], r);
237
+ D(n, `INSERT INTO ${f}
250
238
  (namespace, table_name, key_tag, key_kind, key_number, key_string, value_json, expires_at)
251
239
  VALUES (?, ?, ?, ?, ?, ?, ?, ?)
252
240
  ON CONFLICT(namespace, table_name, key_tag) DO UPDATE SET
@@ -255,22 +243,22 @@ function A(e, n, r, a = !1) {
255
243
  key_string = excluded.key_string,
256
244
  value_json = excluded.value_json,
257
245
  expires_at = excluded.expires_at`, [
258
- n,
259
- t,
260
- s.encoded,
261
- s.kind,
262
- s.number,
263
- s.string,
264
- y(a),
265
- c
246
+ i,
247
+ e,
248
+ l.encoded,
249
+ l.kind,
250
+ l.number,
251
+ l.string,
252
+ S(d),
253
+ u
266
254
  ]);
267
255
  },
268
- async putAll(o, s, c) {
269
- if (s.length === 0) return;
270
- let u = c === void 0 ? null : Date.now() + c, d = s.map((e) => y(e)), f = s.map((e) => x(i(r, o, e))), p = () => {
271
- for (let t = 0; t < s.length; t++) {
272
- let r = f[t];
273
- w(e, `INSERT INTO ${l}
256
+ async putAll(e, o, u) {
257
+ if (o.length === 0) return;
258
+ let d = u === void 0 ? null : Date.now() + u, p = o.map((n) => S(t(c[e], n))), m = o.map((t) => w(a(s, e, t))), h = () => {
259
+ for (let t = 0; t < o.length; t++) {
260
+ let r = m[t];
261
+ D(n, `INSERT INTO ${f}
274
262
  (namespace, table_name, key_tag, key_kind, key_number, key_string, value_json, expires_at)
275
263
  VALUES (?, ?, ?, ?, ?, ?, ?, ?)
276
264
  ON CONFLICT(namespace, table_name, key_tag) DO UPDATE SET
@@ -279,155 +267,165 @@ function A(e, n, r, a = !1) {
279
267
  key_string = excluded.key_string,
280
268
  value_json = excluded.value_json,
281
269
  expires_at = excluded.expires_at`, [
282
- n,
283
- o,
270
+ i,
271
+ e,
284
272
  r.encoded,
285
273
  r.kind,
286
274
  r.number,
287
275
  r.string,
288
- d[t],
289
- u
276
+ p[t],
277
+ d
290
278
  ]);
291
279
  }
292
280
  };
293
- if (a) {
294
- p();
281
+ if (l) {
282
+ h();
295
283
  return;
296
284
  }
297
- e.exec("BEGIN");
285
+ n.exec("BEGIN");
298
286
  try {
299
- p(), e.exec("COMMIT");
300
- } catch (n) {
287
+ h(), n.exec("COMMIT");
288
+ } catch (e) {
301
289
  try {
302
- e.exec("ROLLBACK");
290
+ n.exec("ROLLBACK");
303
291
  } catch (e) {
304
- throw new t("SQLite putAll rollback failed", { cause: e });
292
+ throw new r("SQLite putAll rollback failed", { cause: e });
305
293
  }
306
- throw n;
294
+ throw e;
307
295
  }
308
296
  }
309
297
  };
310
- return s;
298
+ return d;
311
299
  }
312
- function j(n) {
313
- let { closeOnDispose: r = !1, database: i, name: c, schema: u, validators: d } = n;
314
- _(c);
315
- let p = m(i), h = p.executor.run(async () => {
316
- await p.initialized, g(i, c);
317
- }), v, y = A(i, c, u), b = (e) => p.executor.run(async () => (await p.initialized, await h, e())), x = Object.fromEntries(Object.entries(y).map(([e, n]) => [e, (...e) => {
318
- if (p.batchActive) throw new t("cannot call a SQLite store sharing this connection from batch(); use the transaction context instead");
319
- return b(() => n(...e));
320
- }])), C, w = o(u, x, {
300
+ function M(t) {
301
+ let { closeOnDispose: i = !1, database: a, name: d, schema: p, codecs: m } = t;
302
+ if (b(d), !m) throw new r("createSQLite: codecs are required for durable persistence");
303
+ let g = _(a), v = g.executor.run(async () => {
304
+ await g.initialized, y(a, d);
305
+ }), x, S = j(a, d, p, m), w = (e) => g.executor.run(async () => (await g.initialized, await v, e())), E = Object.fromEntries(Object.entries(S).map(([e, t]) => [e, (...e) => {
306
+ if (g.batchActive) throw new r("cannot call a SQLite store sharing this connection from batch(); use the transaction context instead");
307
+ return w(() => t(...e));
308
+ }])), O, A = c(p, E, {
309
+ codecs: m,
321
310
  onCrossTabMessage(e) {
322
311
  let t = (t, n) => {
323
- t === c && Object.hasOwn(u, n) && e(n);
312
+ t === d && Object.hasOwn(p, n) && e(n);
324
313
  };
325
- return v = t, p.listeners.add(t), () => {
326
- p.listeners.delete(t), v === t && (v = void 0);
314
+ return x = t, g.listeners.add(t), () => {
315
+ g.listeners.delete(t), x === t && (x = void 0);
327
316
  };
328
317
  },
329
318
  onMutation(e) {
330
- for (let t of p.listeners) t !== v && t(c, e);
319
+ for (let t of g.listeners) t !== x && t(d, e);
331
320
  },
332
321
  onTransactions: (e) => {
333
- C = async (n, r) => {
334
- if (a(n), p.batchActive) throw new t("cannot call a SQLite store sharing this connection from batch(); use the transaction context instead");
335
- return p.executor.run(async () => {
336
- await p.initialized, await h;
337
- let a = /* @__PURE__ */ new Set(), o = A(i, c, u, !0), l = s(u, o, (e) => a.add(e), e.validate, new Set(n)), d = !1, f = !1;
338
- p.batchActive = !0;
322
+ O = async (t, n) => {
323
+ if (s(t), g.batchActive) throw new r("cannot call a SQLite store sharing this connection from batch(); use the transaction context instead");
324
+ return g.executor.run(async () => {
325
+ await g.initialized, await v;
326
+ let i = /* @__PURE__ */ new Set(), o = j(a, d, p, m, !0), s = !0, c = l(p, o, (e) => i.add(e), e.validate, new Set(t), () => s), u = !1, f = !1;
327
+ g.batchActive = !0;
339
328
  try {
340
- i.exec("BEGIN IMMEDIATE"), d = !0;
341
- let t = await r(l);
342
- i.exec("COMMIT"), f = !0;
343
- for (let t of a) e.notifyMutation(t);
329
+ a.exec("BEGIN IMMEDIATE"), u = !0;
330
+ let t = await n(c);
331
+ a.exec("COMMIT"), f = !0;
332
+ for (let t of i) e.notifyMutation(t);
344
333
  return t;
345
334
  } catch (e) {
346
- if (d && !f) try {
347
- i.exec("ROLLBACK");
335
+ if (u && !f) try {
336
+ a.exec("ROLLBACK");
348
337
  } catch (e) {
349
- throw new t("SQLite batch rollback failed", { cause: e });
338
+ throw new r("SQLite batch rollback failed", { cause: e });
350
339
  }
351
340
  throw e;
352
341
  } finally {
353
- p.batchActive = !1;
342
+ s = !1, g.batchActive = !1;
354
343
  }
355
344
  });
356
345
  };
357
346
  },
358
- schema: u,
359
- validators: d
347
+ schema: p
360
348
  });
361
- if (!C) throw new t("SQLite transaction capability was not initialized");
362
- let T = {
363
- ...w,
364
- batch: C,
365
- iterate(n) {
366
- if (w.disposed) throw new e(`"${c}" is disposed`);
367
- return { [Symbol.asyncIterator]() {
368
- let e = !1, r = 0, a, o = [], s = 0, u = () => {
369
- a?.(), a = void 0;
370
- }, d = () => {
371
- o = E(i, `SELECT rowid AS row_id, expires_at, value_json
372
- FROM ${l}
373
- WHERE namespace = ? AND table_name = ? AND rowid > ?
374
- ORDER BY rowid
375
- LIMIT ?`, [
376
- c,
377
- n,
378
- r,
379
- f
380
- ]), s = 0;
381
- };
382
- return {
383
- async next() {
384
- if (e) return {
385
- done: !0,
386
- value: void 0
387
- };
388
- if (p.batchActive) throw new t("cannot call a SQLite store sharing this connection from batch(); use the transaction context instead");
349
+ if (!O) throw new r("SQLite transaction capability was not initialized");
350
+ let M = u(A, O, p), N = Object.assign(M, { iterate(t) {
351
+ if (A.disposed) throw new n(`"${d}" is disposed`);
352
+ return { [Symbol.asyncIterator]() {
353
+ let i = !1, s = 0, c = [], l = 0, u = async () => {
354
+ let n = await g.executor.run(async () => {
355
+ await g.initialized, await v;
356
+ let n = k(a, `SELECT rowid AS row_id, expires_at, value_json
357
+ FROM ${f}
358
+ WHERE namespace = ? AND table_name = ? AND rowid > ?
359
+ ORDER BY rowid
360
+ LIMIT ?`, [
361
+ d,
362
+ t,
363
+ s,
364
+ h
365
+ ]), i = [];
366
+ for (let c of n) {
367
+ let n = T(c);
368
+ if (s = n.rowId, o(n.expiresAt)) {
369
+ D(a, `DELETE FROM ${f} WHERE rowid = ?`, [n.rowId]);
370
+ continue;
371
+ }
389
372
  try {
390
- for (a || (a = await p.executor.acquire(), await p.initialized, await h);;) {
391
- if (s >= o.length && (d(), o.length === 0)) return e = !0, u(), {
392
- done: !0,
393
- value: void 0
394
- };
395
- let t = o[s++];
396
- r = S(t).rowId;
397
- let n = O(i, t);
398
- if (n !== void 0) return {
399
- done: !1,
400
- value: n
401
- };
402
- }
403
- } catch (t) {
404
- throw e = !0, u(), t;
373
+ i.push(e(m[t], C(n.json)));
374
+ } catch (e) {
375
+ throw e instanceof r ? e : new r(`validation failed for table "${String(t)}"`, { cause: e });
405
376
  }
406
- },
407
- async return(t) {
408
- return e = !0, u(), {
377
+ }
378
+ return {
379
+ done: n.length === 0,
380
+ values: i
381
+ };
382
+ });
383
+ return c = n.values, l = 0, n.done;
384
+ };
385
+ return {
386
+ async next() {
387
+ if (i) return {
388
+ done: !0,
389
+ value: void 0
390
+ };
391
+ if (A.disposed) throw new n(`"${d}" is disposed`);
392
+ if (g.batchActive) throw new r("cannot call a SQLite store sharing this connection from batch(); use the transaction context instead");
393
+ try {
394
+ for (; l >= c.length;) if (await u()) return i = !0, {
409
395
  done: !0,
410
- value: t
396
+ value: void 0
411
397
  };
412
- },
413
- async throw(t) {
414
- throw e = !0, u(), t;
398
+ return {
399
+ done: !1,
400
+ value: c[l++]
401
+ };
402
+ } catch (e) {
403
+ throw i = !0, e;
415
404
  }
416
- };
417
- } };
418
- }
419
- };
420
- if (r) {
421
- let e = T.dispose.bind(T), t;
422
- T.dispose = async () => {
423
- await e(), t ??= p.executor.run(() => i.close?.()), await t;
424
- }, T[Symbol.asyncDispose] = async () => {
425
- await T.dispose();
405
+ },
406
+ async return(e) {
407
+ return i = !0, {
408
+ done: !0,
409
+ value: e
410
+ };
411
+ },
412
+ async throw(e) {
413
+ throw i = !0, e;
414
+ }
415
+ };
416
+ } };
417
+ } });
418
+ if (i) {
419
+ let e = N.dispose.bind(N), t;
420
+ N.dispose = async () => {
421
+ await e(), t ??= g.executor.run(() => a.close?.()), await t;
422
+ }, N[Symbol.asyncDispose] = async () => {
423
+ await N.dispose();
426
424
  };
427
425
  }
428
- return T;
426
+ return N;
429
427
  }
430
428
  //#endregion
431
- export { j as createSQLite };
429
+ export { M as createSQLite };
432
430
 
433
431
  //# sourceMappingURL=sqlite.js.map