reflectdb 0.1.2 → 0.2.0

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 (48) hide show
  1. package/README.md +483 -17
  2. package/dist/cjs/client/index.cjs +0 -1
  3. package/dist/cjs/client/storage/indexeddb.cjs +0 -1
  4. package/dist/cjs/core/index.cjs +0 -1
  5. package/dist/cjs/htmx/index.cjs +1720 -0
  6. package/dist/cjs/htmx/index.d.cts +760 -0
  7. package/dist/cjs/react/index.cjs +0 -1
  8. package/dist/cjs/server/drizzle.cjs +15 -4
  9. package/dist/cjs/server/ephemeral/index.cjs +0 -1
  10. package/dist/cjs/server/ephemeral/redis.cjs +0 -1
  11. package/dist/cjs/server/index.cjs +34 -13
  12. package/dist/cjs/server/index.d.cts +14 -0
  13. package/dist/cjs/server/storage/object/index.cjs +2284 -0
  14. package/dist/cjs/server/storage/object/index.d.cts +578 -0
  15. package/dist/cjs/svelte/index.cjs +0 -1
  16. package/dist/cjs/transport/bun-ws.cjs +0 -1
  17. package/dist/cjs/transport/polling.cjs +0 -1
  18. package/dist/cjs/transport/sse.cjs +52 -2
  19. package/dist/cjs/transport/sse.d.cts +34 -0
  20. package/dist/cjs/transport/ws.cjs +0 -1
  21. package/dist/cjs/vanilla/index.cjs +0 -1
  22. package/dist/client/index.js +1 -1
  23. package/dist/client/storage/indexeddb.js +1 -1
  24. package/dist/core/index.js +1 -1
  25. package/dist/htmx/index.d.ts +760 -0
  26. package/dist/htmx/index.js +297 -0
  27. package/dist/react/index.js +1 -1
  28. package/dist/server/drizzle.js +3 -2
  29. package/dist/server/ephemeral/index.js +1 -1
  30. package/dist/server/ephemeral/redis.js +1 -1
  31. package/dist/server/index.d.ts +14 -0
  32. package/dist/server/index.js +19 -6
  33. package/dist/server/storage/object/index.d.ts +578 -0
  34. package/dist/server/storage/object/index.js +2232 -0
  35. package/dist/shared/{esm-z1xse19c.js → esm-5ahpq25j.js} +4 -4
  36. package/dist/shared/esm-dcs8qa5n.js +263 -0
  37. package/dist/shared/esm-f11s9zpb.js +15 -0
  38. package/dist/shared/esm-g5h4a88j.js +9 -0
  39. package/dist/shared/{esm-ck88h30s.js → esm-xtkhzxg2.js} +1 -1
  40. package/dist/svelte/index.js +1 -1
  41. package/dist/transport/bun-ws.js +1 -1
  42. package/dist/transport/polling.js +1 -1
  43. package/dist/transport/sse.d.ts +34 -0
  44. package/dist/transport/sse.js +53 -2
  45. package/dist/transport/ws.js +1 -1
  46. package/dist/vanilla/index.js +5 -261
  47. package/package.json +26 -3
  48. package/dist/shared/esm-k7kedp3y.js +0 -4
@@ -1,4 +1,3 @@
1
- var import_node_module = require("node:module");
2
1
  var __defProp = Object.defineProperty;
3
2
  var __getOwnPropNames = Object.getOwnPropertyNames;
4
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -1,4 +1,3 @@
1
- var import_node_module = require("node:module");
2
1
  var __defProp = Object.defineProperty;
3
2
  var __getOwnPropNames = Object.getOwnPropertyNames;
4
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -45,7 +44,20 @@ __export(exports_drizzle, {
45
44
  drizzleTxAtomic: () => drizzleTxAtomic
46
45
  });
47
46
  module.exports = __toCommonJS(exports_drizzle);
48
- var import_node_module2 = require("node:module");
47
+
48
+ // src/server/node-require.ts
49
+ var cached;
50
+ function nodeRequire(id) {
51
+ if (!cached) {
52
+ const proc = globalThis.process;
53
+ const mod = proc?.getBuiltinModule?.("node:module");
54
+ if (!mod?.createRequire) {
55
+ throw new Error(`Cannot resolve "${id}": this runtime has no CommonJS resolver (process.getBuiltinModule is unavailable). reflectdb requires Node >= 22.3 or Bun >= 1.1.30 on the server.`);
56
+ }
57
+ cached = mod.createRequire(module.filename);
58
+ }
59
+ return cached(id);
60
+ }
49
61
 
50
62
  // src/server/factory.ts
51
63
  function getByDottedPath(root, path) {
@@ -272,12 +284,11 @@ function defineTable(adapter, opts = {}) {
272
284
  }
273
285
 
274
286
  // src/server/drizzle.ts
275
- var requireFn = import_node_module2.createRequire(module.filename);
276
287
  var cachedDrizzle;
277
288
  function loadDrizzleSync() {
278
289
  if (cachedDrizzle === undefined) {
279
290
  try {
280
- const mod = requireFn("drizzle-orm");
291
+ const mod = nodeRequire("drizzle-orm");
281
292
  cachedDrizzle = { eq: mod.eq, sql: mod.sql, getTableName: mod.getTableName };
282
293
  } catch {
283
294
  cachedDrizzle = null;
@@ -1,4 +1,3 @@
1
- var import_node_module = require("node:module");
2
1
  var __defProp = Object.defineProperty;
3
2
  var __getOwnPropNames = Object.getOwnPropertyNames;
4
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -1,4 +1,3 @@
1
- var import_node_module = require("node:module");
2
1
  var __defProp = Object.defineProperty;
3
2
  var __getOwnPropNames = Object.getOwnPropertyNames;
4
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -1,4 +1,3 @@
1
- var import_node_module = require("node:module");
2
1
  var __defProp = Object.defineProperty;
3
2
  var __getOwnPropNames = Object.getOwnPropertyNames;
4
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -111,7 +110,20 @@ __export(exports_drizzle, {
111
110
  drizzleTxAtomic: () => drizzleTxAtomic
112
111
  });
113
112
  module.exports = __toCommonJS(exports_drizzle);
114
- var import_node_module2 = require("node:module");
113
+
114
+ // src/server/node-require.ts
115
+ var cached;
116
+ function nodeRequire(id) {
117
+ if (!cached) {
118
+ const proc = globalThis.process;
119
+ const mod = proc?.getBuiltinModule?.("node:module");
120
+ if (!mod?.createRequire) {
121
+ throw new Error(`Cannot resolve "${id}": this runtime has no CommonJS resolver (process.getBuiltinModule is unavailable). reflectdb requires Node >= 22.3 or Bun >= 1.1.30 on the server.`);
122
+ }
123
+ cached = mod.createRequire(module.filename);
124
+ }
125
+ return cached(id);
126
+ }
115
127
 
116
128
  // src/server/factory.ts
117
129
  function getByDottedPath(root, path) {
@@ -338,12 +350,11 @@ function defineTable(adapter, opts = {}) {
338
350
  }
339
351
 
340
352
  // src/server/drizzle.ts
341
- var requireFn = import_node_module2.createRequire(module.filename);
342
353
  var cachedDrizzle;
343
354
  function loadDrizzleSync() {
344
355
  if (cachedDrizzle === undefined) {
345
356
  try {
346
- const mod = requireFn("drizzle-orm");
357
+ const mod = nodeRequire("drizzle-orm");
347
358
  cachedDrizzle = { eq: mod.eq, sql: mod.sql, getTableName: mod.getTableName };
348
359
  } catch {
349
360
  cachedDrizzle = null;
@@ -1664,9 +1675,9 @@ class OpProcessor {
1664
1675
  return { freshOpIds, rows };
1665
1676
  }
1666
1677
  async readRow(table, rowId, batchCtx) {
1667
- const cached = batchCtx?.rows.get(OpProcessor.rowKey(table, rowId));
1668
- if (cached)
1669
- return cached;
1678
+ const cached2 = batchCtx?.rows.get(OpProcessor.rowKey(table, rowId));
1679
+ if (cached2)
1680
+ return cached2;
1670
1681
  if (!this.storage)
1671
1682
  return { row: null, rowHlc: null, colClocks: {} };
1672
1683
  const existing = await this.storage.getRow(table, rowId);
@@ -2516,6 +2527,18 @@ class MessageHandler {
2516
2527
  storage = null;
2517
2528
  minSchemaVersion = 0;
2518
2529
  messageQueues = new Map;
2530
+ async whenIdle(clientId) {
2531
+ for (let i = 0;i < 100; i++) {
2532
+ const queue = this.messageQueues.get(clientId);
2533
+ if (!queue)
2534
+ return;
2535
+ await queue.catch(() => {
2536
+ return;
2537
+ });
2538
+ if (this.messageQueues.get(clientId) === queue)
2539
+ return;
2540
+ }
2541
+ }
2519
2542
  resultCache = new ResultCache;
2520
2543
  broadcast;
2521
2544
  ops;
@@ -3090,11 +3113,11 @@ class MessageHandler {
3090
3113
  return;
3091
3114
  if (this.authCallback) {
3092
3115
  try {
3093
- const cached = this.authCache.get(message.token);
3116
+ const cached2 = this.authCache.get(message.token);
3094
3117
  let auth;
3095
3118
  const now = Date.now();
3096
- if (cached && cached.expiresAt > now) {
3097
- auth = cached.auth;
3119
+ if (cached2 && cached2.expiresAt > now) {
3120
+ auth = cached2.auth;
3098
3121
  } else {
3099
3122
  const req = new Request("https://sync/ops", {
3100
3123
  headers: { authorization: `Bearer ${message.token}` }
@@ -3900,11 +3923,9 @@ function parseDuration(str) {
3900
3923
  init_types();
3901
3924
 
3902
3925
  // src/server/storage/sqlite.ts
3903
- var import_node_module3 = require("node:module");
3904
- var requireFn2 = import_node_module3.createRequire(module.filename);
3905
3926
  function loadDatabase() {
3906
3927
  try {
3907
- return requireFn2("bun:sqlite").Database;
3928
+ return nodeRequire("bun:sqlite").Database;
3908
3929
  } catch {
3909
3930
  throw new Error("createSqliteStorage requires the Bun runtime (bun:sqlite is unavailable). Use createPostgresStorage on Node.");
3910
3931
  }
@@ -769,6 +769,20 @@ declare class MessageHandler<TAuth extends AuthContext = AuthContext> {
769
769
  private storage;
770
770
  private minSchemaVersion;
771
771
  private messageQueues;
772
+ /**
773
+ * Resolves once every message queued for `clientId` has finished processing.
774
+ *
775
+ * Messages are handled on a per-client serial queue, and `onMessage` returns
776
+ * before that work settles — fine for a long-lived connection, where replies
777
+ * stream out whenever they are ready. A serverless HTTP handler has no such
778
+ * luxury: it must know when the replies to the request it is holding exist,
779
+ * or it returns an empty body and the client hangs. See the SSE transport's
780
+ * `serverless` mode.
781
+ *
782
+ * Never rejects: a failed message is the caller's concern via its own reply,
783
+ * not this barrier's.
784
+ */
785
+ whenIdle(clientId: string): Promise<void>;
772
786
  private resultCache;
773
787
  private broadcast;
774
788
  private ops;