@reventlessdev/reventless-local 3.0.0-alpha.161 → 3.0.0-alpha.162

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 (78) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/package.json +10 -10
  3. package/src/Platform.res.mjs +8 -0
  4. package/src/adapter/CommandTopic/LocalCommandTopicChannel.res +1 -1
  5. package/src/adapter/CommandTopic/LocalCommandTopicChannel.res.mjs +1 -1
  6. package/src/adapter/DomainGraphQL_Server.res +17 -0
  7. package/src/adapter/DomainGraphQL_Server.res.mjs +5 -0
  8. package/src/adapter/EventCollector/LocalEventCollectorChannel.res +1 -1
  9. package/src/adapter/EventCollector/LocalEventCollectorChannel.res.mjs +2 -2
  10. package/src/adapter/EventLog/EventLogStorage_InMemory.res +1 -1
  11. package/src/adapter/EventLog/EventLogStorage_InMemory.res.mjs +1 -1
  12. package/src/adapter/EventLog/EventLogStorage_Sqlite.res +1 -1
  13. package/src/adapter/EventLog/EventLogStorage_Sqlite.res.mjs +1 -1
  14. package/src/adapter/EventLog/LocalEventLogStorage.res +1 -1
  15. package/src/adapter/EventLog/LocalEventLogStorage.res.mjs +1 -1
  16. package/src/adapter/EventTopic/LocalEventTopicPublisher.res +1 -1
  17. package/src/adapter/EventTopic/LocalEventTopicPublisher.res.mjs +1 -1
  18. package/src/adapter/QueryDb/LocalQueryDbStorage.res +2 -2
  19. package/src/adapter/QueryDb/LocalQueryDbStorage.res.mjs +2 -2
  20. package/src/adapter/QueryDb/QueryDbStorage_InMemory.res +1 -1
  21. package/src/adapter/QueryDb/QueryDbStorage_InMemory.res.mjs +1 -1
  22. package/src/adapter/QueryDb/QueryDbStorage_Sqlite.res +1 -1
  23. package/src/adapter/QueryDb/QueryDbStorage_Sqlite.res.mjs +1 -1
  24. package/src/adapter/Runtime/LocalAggregateRuntime_Builder.res +9 -1
  25. package/src/adapter/Runtime/LocalAggregateRuntime_Builder.res.mjs +5 -3
  26. package/src/adapter/Runtime/LocalEventCollectorRuntime_Builder.res +5 -1
  27. package/src/adapter/Runtime/LocalEventCollectorRuntime_Builder.res.mjs +3 -1
  28. package/src/adapter/Runtime/LocalPluginRuntime_Builder.res.mjs +2 -0
  29. package/src/adapter/Runtime/LocalRuntimeEnvironment.res +10 -0
  30. package/src/adapter/Runtime/LocalRuntimeEnvironment.res.mjs +10 -0
  31. package/src/components/Aggregate_Builder.res.mjs +4 -0
  32. package/src/components/AutomationSlice_Builder.res.mjs +2 -0
  33. package/src/components/ExtensionPoint_Builder.res.mjs +4 -0
  34. package/src/components/OutboundTranslationSlice_Builder.res.mjs +2 -0
  35. package/src/components/Plugin_Builder.res.mjs +2 -0
  36. package/src/components/ReadModel_Builder.res.mjs +4 -0
  37. package/src/components/StateViewSlice_Builder.res.mjs +2 -0
  38. package/src/components/Task_Builder.res.mjs +4 -0
  39. package/tests/adapter/BackendParityTest.res +5 -5
  40. package/tests/adapter/BackendParityTest.res.mjs +5 -5
  41. package/tests/adapter/CommandTopicChannelTest.res +4 -4
  42. package/tests/adapter/CommandTopicChannelTest.res.mjs +4 -4
  43. package/tests/adapter/EventCollectorChannelTest.res +11 -11
  44. package/tests/adapter/EventCollectorChannelTest.res.mjs +11 -11
  45. package/tests/adapter/EventLogSnapshotParityTest.res +2 -2
  46. package/tests/adapter/EventLogSnapshotParityTest.res.mjs +2 -2
  47. package/tests/adapter/EventLogStorageSqliteTest.res +11 -11
  48. package/tests/adapter/EventLogStorageSqliteTest.res.mjs +11 -11
  49. package/tests/adapter/EventTopicPublisherTest.res +4 -4
  50. package/tests/adapter/EventTopicPublisherTest.res.mjs +4 -4
  51. package/tests/adapter/LocalAuthHttpTest.res +5 -1
  52. package/tests/adapter/LocalAuthHttpTest.res.mjs +5 -5
  53. package/tests/adapter/LocalDispatchContextTest.res +83 -0
  54. package/tests/adapter/LocalDispatchContextTest.res.mjs +73 -0
  55. package/tests/adapter/ProjectionCheckpointTest.res +5 -5
  56. package/tests/adapter/ProjectionCheckpointTest.res.mjs +5 -5
  57. package/tests/adapter/QueryDbGsiTtlTest.res +12 -12
  58. package/tests/adapter/QueryDbGsiTtlTest.res.mjs +12 -12
  59. package/tests/adapter/QueryDbListPushdownParityTest.res +1 -1
  60. package/tests/adapter/QueryDbListPushdownParityTest.res.mjs +1 -1
  61. package/tests/adapter/QueryDbListResolverTest.res.mjs +1 -1
  62. package/tests/adapter/QueryDbStorageSqliteTest.res +6 -6
  63. package/tests/adapter/QueryDbStorageSqliteTest.res.mjs +6 -6
  64. package/tests/adapter/QueryDbStorageTest.res +10 -10
  65. package/tests/adapter/QueryDbStorageTest.res.mjs +10 -10
  66. package/tests/adapter/QueryEngineTest.res +8 -8
  67. package/tests/adapter/QueryEngineTest.res.mjs +8 -8
  68. package/tests/components/aggregate/AggregateTest.res +3 -3
  69. package/tests/components/aggregate/AggregateTest.res.mjs +3 -3
  70. package/tests/components/commandtopic/CommandTopicFixtures.res.mjs +1 -1
  71. package/tests/components/commandtopic/CommandTopicStreamFixtures.res.mjs +1 -1
  72. package/tests/components/eventcollector/EventCollectorFixtures.res.mjs +3 -1
  73. package/tests/components/eventlog/EventLogFixtures.res.mjs +1 -1
  74. package/tests/components/eventtopic/EventTopicFixtures.res.mjs +1 -1
  75. package/tests/components/eventtopic/EventTopicStreamFixtures.res.mjs +1 -1
  76. package/tests/components/querydb/QueryDbFixtures.res.mjs +1 -1
  77. package/tests/components/querydb/QueryDbSubIdFixtures.res.mjs +1 -1
  78. package/tests/components/sideeffecthandler/SideEffectHandlerFixtures.res.mjs +4 -0
@@ -17,7 +17,7 @@ function postJson(path, body) {
17
17
  let bodyStr = JSON.stringify(body);
18
18
  let req = Nodehttp.request({
19
19
  hostname: "localhost",
20
- port: 4321,
20
+ port: 49321,
21
21
  path: path,
22
22
  method: "POST",
23
23
  headers: Object.fromEntries([
@@ -62,7 +62,7 @@ function postEmpty(path) {
62
62
  return new Promise((resolve, reject) => {
63
63
  let req = Nodehttp.request({
64
64
  hostname: "localhost",
65
- port: 4321,
65
+ port: 49321,
66
66
  path: path,
67
67
  method: "POST",
68
68
  headers: {}
@@ -80,7 +80,7 @@ function postRaw(path, body) {
80
80
  return new Promise((resolve, reject) => {
81
81
  let req = Nodehttp.request({
82
82
  hostname: "localhost",
83
- port: 4321,
83
+ port: 49321,
84
84
  path: path,
85
85
  method: "POST",
86
86
  headers: Object.fromEntries([
@@ -123,7 +123,7 @@ globalThis.beforeAll(async () => {
123
123
  provider: "InMemory"
124
124
  });
125
125
  DomainGraphQL_Server$ReventlessLocal.reset();
126
- DomainGraphQL_Server$ReventlessLocal.start(4321, undefined, undefined);
126
+ DomainGraphQL_Server$ReventlessLocal.start(49321, undefined, undefined);
127
127
  return await new Promise((resolve, param) => {
128
128
  setTimeout(() => resolve(), 50);
129
129
  });
@@ -224,7 +224,7 @@ globalThis.test("Bearer token issued via HTTP round-trips through authenticate",
224
224
  globalThis.expect(identity.groups).toEqual(["Editor"]);
225
225
  });
226
226
 
227
- let port = 4321;
227
+ let port = 49321;
228
228
 
229
229
  export {
230
230
  port,
@@ -0,0 +1,83 @@
1
+ // What a handler dispatched on the in-process platform sees in its RequestContext.
2
+ //
3
+ // The counterpart of reventless-aws's HandlerFactoryDispatchTest: that one covers
4
+ // the deployed entry-point shim, this one covers `Runtime.runEffectHandler` wired
5
+ // with `LocalRuntimeEnvironment`'s extractors — the exact composition every local
6
+ // runtime builder uses (LocalEventCollectorRuntime_Builder,
7
+ // LocalAggregateRuntime_Builder). Without it, the local half of "a handler can
8
+ // compute latency from RequestContext.timestamp and branch on retryCount on both
9
+ // platforms" rests on the extractors merely compiling.
10
+ //
11
+ // See docs/plans/entrypoint-dispatch-parity-and-latency-fields.md.
12
+
13
+ open JestGlobals
14
+
15
+ let _ = TestRunner.setup()
16
+
17
+ // Hand the provided context back as the handler's result — the assertions then
18
+ // see exactly what an application handler would.
19
+ let capture = (_event, _ctx) =>
20
+ Effect.serviceWith(ReventlessCore.RequestContext.tag, ctx => ctx)
21
+
22
+ let comp = "EventCollector(TestCollector)"
23
+
24
+ let dispatch = (event: JSON.t): promise<ReventlessCore.RequestContext.t> => {
25
+ let handler =
26
+ capture
27
+ ->LocalRuntimeEnvironment.asEffectHandler
28
+ ->ReventlessCore.Runtime.runEffectHandler(
29
+ ~extractCorrelationId=LocalRuntimeEnvironment.extractCorrelationId,
30
+ ~extractCausationId=LocalRuntimeEnvironment.extractCausationId,
31
+ ~extractSentTimestamp=LocalRuntimeEnvironment.extractSentTimestamp,
32
+ ~extractRetryCount=LocalRuntimeEnvironment.extractRetryCount,
33
+ ~comp,
34
+ )
35
+ handler(event, ())
36
+ }
37
+
38
+ let eventWithMeta = (~correlationId, ~causationId=?, ()) => {
39
+ let meta = Dict.fromArray([("correlationId", correlationId->JSON.Encode.string)])
40
+ switch causationId {
41
+ | Some(id) => meta->Dict.set("causationId", id->JSON.Encode.string)
42
+ | None => ()
43
+ }
44
+ Dict.fromArray([("meta", meta->JSON.Encode.object)])->JSON.Encode.object
45
+ }
46
+
47
+ describe("local dispatch boundary", () => {
48
+ testPromise("carries the envelope identity through to the handler", async () => {
49
+ let ctx = await dispatch(
50
+ eventWithMeta(~correlationId="corr-local", ~causationId="cause-local", ()),
51
+ )
52
+ expect(ctx.correlationId)->toBe("corr-local")
53
+ expect(ctx.causationId)->toEqual(Some("cause-local"))
54
+ expect(ctx.component)->toEqual(Some(comp))
55
+ })
56
+
57
+ testPromise("falls back to a placeholder when the event carries no correlationId", async () => {
58
+ let ctx = await dispatch(JSON.Encode.object(Dict.make()))
59
+ expect(ctx.correlationId)->toBe("unknown")
60
+ expect(ctx.causationId)->toEqual(None)
61
+ })
62
+
63
+ // In-process dispatch has no queue to dwell in, so send time *is* dispatch
64
+ // time — a handler computing `now - timestamp` measures its own processing
65
+ // latency here and end-to-end latency on a queue-backed platform, from the
66
+ // same expression.
67
+ testPromise("supplies a send time a handler can measure latency against", async () => {
68
+ let before = Date.now()
69
+ let ctx = await dispatch(eventWithMeta(~correlationId="corr-local", ()))
70
+ let after = Date.now()
71
+ switch ctx.timestamp {
72
+ | Some(t) => expect(t >= before && t <= after)->toBe(true)
73
+ | None => fail("expected RequestContext.timestamp to be populated on the local platform")
74
+ }
75
+ })
76
+
77
+ // The bus calls each handler once; a handler branching on redelivery must see
78
+ // a first delivery here rather than a missing field.
79
+ testPromise("reports a first delivery", async () => {
80
+ let ctx = await dispatch(eventWithMeta(~correlationId="corr-local", ()))
81
+ expect(ctx.retryCount)->toEqual(Some(1))
82
+ })
83
+ })
@@ -0,0 +1,73 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as Effect from "@reventlessdev/rescript-effect/src/Effect.res.mjs";
4
+ import * as JestGlobals from "@reventlessdev/rescript-jest/src/JestGlobals.res.mjs";
5
+ import * as Runtime$ReventlessCore from "@reventlessdev/reventless-core/src/adapter/Runtime/Runtime.res.mjs";
6
+ import * as TestRunner$ReventlessLocal from "../../src/test/TestRunner.res.mjs";
7
+ import * as RequestContext$ReventlessCore from "@reventlessdev/reventless-core/src/RequestContext.res.mjs";
8
+ import * as LocalRuntimeEnvironment$ReventlessLocal from "../../src/adapter/Runtime/LocalRuntimeEnvironment.res.mjs";
9
+
10
+ TestRunner$ReventlessLocal.setup();
11
+
12
+ function capture(_event, _ctx) {
13
+ return Effect.serviceWith(RequestContext$ReventlessCore.tag, ctx => ctx);
14
+ }
15
+
16
+ let comp = "EventCollector(TestCollector)";
17
+
18
+ function dispatch(event) {
19
+ let handler = Runtime$ReventlessCore.runEffectHandler(LocalRuntimeEnvironment$ReventlessLocal.extractCorrelationId, LocalRuntimeEnvironment$ReventlessLocal.extractCausationId, LocalRuntimeEnvironment$ReventlessLocal.extractSentTimestamp, LocalRuntimeEnvironment$ReventlessLocal.extractRetryCount, comp, undefined, capture);
20
+ return handler(event, undefined);
21
+ }
22
+
23
+ function eventWithMeta(correlationId, causationId, param) {
24
+ let meta = Object.fromEntries([[
25
+ "correlationId",
26
+ correlationId
27
+ ]]);
28
+ if (causationId !== undefined) {
29
+ meta["causationId"] = causationId;
30
+ }
31
+ return Object.fromEntries([[
32
+ "meta",
33
+ meta
34
+ ]]);
35
+ }
36
+
37
+ globalThis.describe("local dispatch boundary", () => {
38
+ globalThis.test("carries the envelope identity through to the handler", async () => {
39
+ let ctx = await dispatch(eventWithMeta("corr-local", "cause-local", undefined));
40
+ globalThis.expect(ctx.correlationId).toBe("corr-local");
41
+ globalThis.expect(ctx.causationId).toEqual("cause-local");
42
+ globalThis.expect(ctx.component).toEqual(comp);
43
+ });
44
+ globalThis.test("falls back to a placeholder when the event carries no correlationId", async () => {
45
+ let ctx = await dispatch({});
46
+ globalThis.expect(ctx.correlationId).toBe("unknown");
47
+ globalThis.expect(ctx.causationId).toEqual(undefined);
48
+ });
49
+ globalThis.test("supplies a send time a handler can measure latency against", async () => {
50
+ let before = Date.now();
51
+ let ctx = await dispatch(eventWithMeta("corr-local", undefined, undefined));
52
+ let after = Date.now();
53
+ let t = ctx.timestamp;
54
+ if (t !== undefined) {
55
+ globalThis.expect(t >= before && t <= after).toBe(true);
56
+ return;
57
+ } else {
58
+ return JestGlobals.fail("expected RequestContext.timestamp to be populated on the local platform");
59
+ }
60
+ });
61
+ globalThis.test("reports a first delivery", async () => {
62
+ let ctx = await dispatch(eventWithMeta("corr-local", undefined, undefined));
63
+ globalThis.expect(ctx.retryCount).toEqual(1);
64
+ });
65
+ });
66
+
67
+ export {
68
+ capture,
69
+ comp,
70
+ dispatch,
71
+ eventWithMeta,
72
+ }
73
+ /* Not a pure module */
@@ -92,7 +92,7 @@ describe("ProjectionCheckpoint", () => {
92
92
  let db = makeFreshDb()
93
93
  }
94
94
  module Storage = EventLogStorage_Sqlite.Make(TestBus, DbProvider)
95
- let s = Storage.make(~name="agg", ~opts)
95
+ let s = Storage.make(~name="agg", ~owner=None, ~opts)
96
96
  let ops = await s.operations->TestRunner.resolve
97
97
 
98
98
  // Batch A (rowids 1-2) appended before batch B (rowid 3).
@@ -132,7 +132,7 @@ describe("ProjectionCheckpoint", () => {
132
132
  let db = makeFreshDb()
133
133
  }
134
134
  module Storage = EventLogStorage_Sqlite.Make(TestBus, DbProvider)
135
- let s = Storage.make(~name="agg", ~opts)
135
+ let s = Storage.make(~name="agg", ~owner=None, ~opts)
136
136
  let ops = await s.operations->TestRunner.resolve
137
137
 
138
138
  // Bulk replay path: no publish cycle will ever resolve these, so they
@@ -217,7 +217,7 @@ describe("ProjectionCheckpoint", () => {
217
217
  let db = makeFreshDb()
218
218
  }
219
219
  module Storage = EventLogStorage_Sqlite.Make(TestBus, DbProvider)
220
- let s = Storage.make(~name="agg", ~opts)
220
+ let s = Storage.make(~name="agg", ~owner=None, ~opts)
221
221
  let ops = await s.operations->TestRunner.resolve
222
222
  let db = DbProvider.db
223
223
 
@@ -283,7 +283,7 @@ describe("ProjectionCheckpoint", () => {
283
283
  let db = makeFreshDb()
284
284
  }
285
285
  module Storage = EventLogStorage_Sqlite.Make(TestBus, DbProvider)
286
- let s = Storage.make(~name="agg", ~opts)
286
+ let s = Storage.make(~name="agg", ~owner=None, ~opts)
287
287
  let ops = await s.operations->TestRunner.resolve
288
288
  let db = DbProvider.db
289
289
 
@@ -390,7 +390,7 @@ describe("ProjectionCheckpoint", () => {
390
390
  let db = makeFreshDb()
391
391
  }
392
392
  module AggStorage = EventLogStorage_Sqlite.Make(TestBus, DbProvider)
393
- let aggS = AggStorage.make(~name="agg", ~opts)
393
+ let aggS = AggStorage.make(~name="agg", ~owner=None, ~opts)
394
394
  let aggOps = await aggS.operations->TestRunner.resolve
395
395
  let db = DbProvider.db
396
396
  let dcbOps = await makeDcbStorage(db, ~name="dcb-log")
@@ -119,7 +119,7 @@ globalThis.describe("ProjectionCheckpoint", () => {
119
119
  db: db
120
120
  };
121
121
  let Storage = EventLogStorage_Sqlite$ReventlessLocal.Make(TestBus)(DbProvider);
122
- let s = Storage.make("agg", opts);
122
+ let s = Storage.make("agg", undefined, opts);
123
123
  let ops = await TestRunner$ReventlessLocal.resolve(s.operations);
124
124
  await ops.append(0, "id-1", [
125
125
  flatEvent("id-1", 0, "Created", undefined, "a1", undefined),
@@ -145,7 +145,7 @@ globalThis.describe("ProjectionCheckpoint", () => {
145
145
  db: db
146
146
  };
147
147
  let Storage = EventLogStorage_Sqlite$ReventlessLocal.Make(TestBus)(DbProvider);
148
- let s = Storage.make("agg", opts);
148
+ let s = Storage.make("agg", undefined, opts);
149
149
  let ops = await TestRunner$ReventlessLocal.resolve(s.operations);
150
150
  await Effect.runPromise(ops.appendStream(0, "id-bulk", Stream.fromIterable([
151
151
  flatEvent("id-bulk", 0, "Created", undefined, "s1", undefined),
@@ -212,7 +212,7 @@ globalThis.describe("ProjectionCheckpoint", () => {
212
212
  db: db
213
213
  };
214
214
  let Storage = EventLogStorage_Sqlite$ReventlessLocal.Make(TestBus)(DbProvider);
215
- let s = Storage.make("agg", opts);
215
+ let s = Storage.make("agg", undefined, opts);
216
216
  let ops = await TestRunner$ReventlessLocal.resolve(s.operations);
217
217
  await ops.append(0, "id-1", [flatEvent("id-1", 0, "Created", undefined, "m1", undefined)]);
218
218
  await ops.append(0, "id-2", [flatEvent("id-2", 0, "Created", undefined, "m2", undefined)]);
@@ -280,7 +280,7 @@ globalThis.describe("ProjectionCheckpoint", () => {
280
280
  db: db
281
281
  };
282
282
  let Storage = EventLogStorage_Sqlite$ReventlessLocal.Make(TestBus)(DbProvider);
283
- let s = Storage.make("agg", opts);
283
+ let s = Storage.make("agg", undefined, opts);
284
284
  let ops = await TestRunner$ReventlessLocal.resolve(s.operations);
285
285
  await ops.append(0, "id-1", [flatEvent("id-1", 0, "Created", undefined, "m1", undefined)]);
286
286
  let match = makeHandler();
@@ -368,7 +368,7 @@ globalThis.describe("ProjectionCheckpoint", () => {
368
368
  db: db
369
369
  };
370
370
  let AggStorage = EventLogStorage_Sqlite$ReventlessLocal.Make(TestBus)(DbProvider);
371
- let aggS = AggStorage.make("agg", opts);
371
+ let aggS = AggStorage.make("agg", undefined, opts);
372
372
  let aggOps = await TestRunner$ReventlessLocal.resolve(aggS.operations);
373
373
  let dcbOps = await makeDcbStorage(db, "dcb-log");
374
374
  await aggOps.append(0, "id-1", [flatEvent("id-1", 0, "Created", undefined, "agg1", undefined)]);
@@ -41,7 +41,7 @@ describe("QueryDbStorage_Sqlite — GSI", () => {
41
41
  ~indexes=[byOwnerIdx, byOwnerCreatedIdx],
42
42
  ~api=(),
43
43
  ~apiRole=(),
44
- ~opts,
44
+ ~owner=None, ~opts,
45
45
  )
46
46
 
47
47
  // Verify the indexes were created in sqlite_master.
@@ -95,7 +95,7 @@ describe("QueryDbStorage_Sqlite — GSI", () => {
95
95
  ~indexes=[compositeIdx],
96
96
  ~api=(),
97
97
  ~apiRole=(),
98
- ~opts,
98
+ ~owner=None, ~opts,
99
99
  )
100
100
 
101
101
  let listSql = DbProvider.db->SqliteDriver.prepare(
@@ -129,7 +129,7 @@ describe("QueryDbStorage_Sqlite — GSI", () => {
129
129
  ~indexes=[weirdIdx],
130
130
  ~api=(),
131
131
  ~apiRole=(),
132
- ~opts,
132
+ ~owner=None, ~opts,
133
133
  )
134
134
  let listIndexes = DbProvider.db->SqliteDriver.prepare(
135
135
  "SELECT name FROM sqlite_master WHERE type='index' AND tbl_name='qdb_rm'",
@@ -166,7 +166,7 @@ describe("QueryDb — indexed equality lookup (B4 push-down)", () => {
166
166
  let db = openFreshDb()
167
167
  }
168
168
  module Storage = QueryDbStorage_Sqlite.Make(TestBus, DbProvider)
169
- let s = Storage.make(~name="orders", ~indexes=[byOwner], ~api=(), ~apiRole=(), ~opts)
169
+ let s = Storage.make(~name="orders", ~indexes=[byOwner], ~api=(), ~apiRole=(), ~owner=None, ~opts)
170
170
  let ops = await s.operations->TestRunner.resolve
171
171
  let _ = await ops.save("k1", item("o1"), ReventlessCore.QueryDb.Any, None)
172
172
  let _ = await ops.save("k2", item("o2"), ReventlessCore.QueryDb.Any, None)
@@ -184,7 +184,7 @@ describe("QueryDb — indexed equality lookup (B4 push-down)", () => {
184
184
  let db = openFreshDb()
185
185
  }
186
186
  module Storage = QueryDbStorage_Sqlite.Make(TestBus, DbProvider)
187
- let s = Storage.make(~name="orders", ~indexes=[byOwner], ~api=(), ~apiRole=(), ~opts)
187
+ let s = Storage.make(~name="orders", ~indexes=[byOwner], ~api=(), ~apiRole=(), ~owner=None, ~opts)
188
188
  let ops = await s.operations->TestRunner.resolve
189
189
  let aMinuteAgo = Float.toInt(Date.now() /. 1000.0) - 60
190
190
  let _ = await ops.save("k1", item("o1"), ReventlessCore.QueryDb.Any, None)
@@ -196,7 +196,7 @@ describe("QueryDb — indexed equality lookup (B4 push-down)", () => {
196
196
  testPromise("in-memory lookup matches the sqlite result (backend parity)", async () => {
197
197
  module TestBus = LocalBus.Make()
198
198
  module Storage = QueryDbStorage_InMemory.Make(TestBus)
199
- let s = Storage.make(~name="orders", ~indexes=[byOwner], ~api=(), ~apiRole=(), ~opts)
199
+ let s = Storage.make(~name="orders", ~indexes=[byOwner], ~api=(), ~apiRole=(), ~owner=None, ~opts)
200
200
  let ops = await s.operations->TestRunner.resolve
201
201
  let _ = await ops.save("k1", item("o1"), ReventlessCore.QueryDb.Any, None)
202
202
  let _ = await ops.save("k2", item("o2"), ReventlessCore.QueryDb.Any, None)
@@ -212,7 +212,7 @@ describe("QueryDbStorage_InMemory — lazy scan snapshot (B4 dirty-flag)", () =>
212
212
  testPromise("interleaved save/scan reflects each write without stale reads", async () => {
213
213
  module TestBus = LocalBus.Make()
214
214
  module Storage = LocalQueryDbStorage.Make(TestBus)
215
- let s = Storage.make(~name="lazy", ~indexes=[], ~api=(), ~apiRole=(), ~opts)
215
+ let s = Storage.make(~name="lazy", ~indexes=[], ~api=(), ~apiRole=(), ~owner=None, ~opts)
216
216
  let ops = await s.operations->TestRunner.resolve
217
217
  let scanFn = TestBus.getQueryDbScan("lazy")->Option.getOrThrow
218
218
  expect(scanFn()->Array.length)->toBe(0)
@@ -233,7 +233,7 @@ describe("QueryDbStorage_Sqlite — TTL", () => {
233
233
  }
234
234
  module Storage = QueryDbStorage_Sqlite.Make(TestBus, DbProvider)
235
235
 
236
- let s = Storage.make(~name="rt-future", ~indexes=[], ~api=(), ~apiRole=(), ~opts)
236
+ let s = Storage.make(~name="rt-future", ~indexes=[], ~api=(), ~apiRole=(), ~owner=None, ~opts)
237
237
  let ops = await s.operations->TestRunner.resolve
238
238
 
239
239
  let oneHourFromNow = Float.toInt(Date.now() /. 1000.0) + 3600
@@ -255,7 +255,7 @@ describe("QueryDbStorage_Sqlite — TTL", () => {
255
255
  }
256
256
  module Storage = QueryDbStorage_Sqlite.Make(TestBus, DbProvider)
257
257
 
258
- let s = Storage.make(~name="rt-past", ~indexes=[], ~api=(), ~apiRole=(), ~opts)
258
+ let s = Storage.make(~name="rt-past", ~indexes=[], ~api=(), ~apiRole=(), ~owner=None, ~opts)
259
259
  let ops = await s.operations->TestRunner.resolve
260
260
 
261
261
  let aMinuteAgo = Float.toInt(Date.now() /. 1000.0) - 60
@@ -277,7 +277,7 @@ describe("QueryDbStorage_Sqlite — TTL", () => {
277
277
  }
278
278
  module Storage = QueryDbStorage_Sqlite.Make(TestBus, DbProvider)
279
279
 
280
- let s = Storage.make(~name="rt-none", ~indexes=[], ~api=(), ~apiRole=(), ~opts)
280
+ let s = Storage.make(~name="rt-none", ~indexes=[], ~api=(), ~apiRole=(), ~owner=None, ~opts)
281
281
  let ops = await s.operations->TestRunner.resolve
282
282
 
283
283
  let _ = await ops.save("k", JSON.Encode.string("forever"), ReventlessCore.QueryDb.Any, None)
@@ -293,7 +293,7 @@ describe("QueryDbStorage_Sqlite — TTL", () => {
293
293
  }
294
294
  module Storage = QueryDbStorage_Sqlite.Make(TestBus, DbProvider)
295
295
 
296
- let s = Storage.make(~name="scan-ttl", ~indexes=[], ~api=(), ~apiRole=(), ~opts)
296
+ let s = Storage.make(~name="scan-ttl", ~indexes=[], ~api=(), ~apiRole=(), ~owner=None, ~opts)
297
297
  let ops = await s.operations->TestRunner.resolve
298
298
 
299
299
  let _ = await ops.save("alive", JSON.Encode.string("a"), ReventlessCore.QueryDb.Any, None)
@@ -319,7 +319,7 @@ describe("QueryDbStorage_Sqlite — TTL", () => {
319
319
  }
320
320
  module Storage = QueryDbStorage_Sqlite.Make(TestBus, DbProvider)
321
321
 
322
- let s = Storage.make(~name="overwrite-ttl", ~indexes=[], ~api=(), ~apiRole=(), ~opts)
322
+ let s = Storage.make(~name="overwrite-ttl", ~indexes=[], ~api=(), ~apiRole=(), ~owner=None, ~opts)
323
323
  let ops = await s.operations->TestRunner.resolve
324
324
 
325
325
  let aMinuteAgo = Float.toInt(Date.now() /. 1000.0) - 60
@@ -44,7 +44,7 @@ globalThis.describe("QueryDbStorage_Sqlite — GSI", () => {
44
44
  subIdField: "createdAt",
45
45
  projectionType: "KEYS_ONLY"
46
46
  }
47
- ], undefined, undefined, undefined, undefined, opts);
47
+ ], undefined, undefined, undefined, undefined, undefined, opts);
48
48
  let listIndexes = SqliteDriver$ReventlessLocal.prepare(db, "SELECT name, sql FROM sqlite_master WHERE type='index' AND tbl_name='qdb_orders' ORDER BY name");
49
49
  let rows = SqliteDriver$ReventlessLocal.all(listIndexes, []);
50
50
  let names = rows.map(row => {
@@ -89,7 +89,7 @@ globalThis.describe("QueryDbStorage_Sqlite — GSI", () => {
89
89
  pkSep: compositeIdx_pkSep,
90
90
  projectionType: "ALL"
91
91
  };
92
- Storage.make("composite", [compositeIdx], undefined, undefined, undefined, undefined, opts);
92
+ Storage.make("composite", [compositeIdx], undefined, undefined, undefined, undefined, undefined, opts);
93
93
  let listSql = SqliteDriver$ReventlessLocal.prepare(db, "SELECT sql FROM sqlite_master WHERE type='index' AND name='idx_qdb_composite_ByTenantOwner'");
94
94
  let row = Stdlib_Option.getOrThrow(SqliteDriver$ReventlessLocal.get(listSql, []), undefined);
95
95
  let match = row["sql"];
@@ -108,7 +108,7 @@ globalThis.describe("QueryDbStorage_Sqlite — GSI", () => {
108
108
  type_: "S",
109
109
  idField: "thing",
110
110
  projectionType: "ALL"
111
- }], undefined, undefined, undefined, undefined, opts);
111
+ }], undefined, undefined, undefined, undefined, undefined, opts);
112
112
  let listIndexes = SqliteDriver$ReventlessLocal.prepare(db, "SELECT name FROM sqlite_master WHERE type='index' AND tbl_name='qdb_rm'");
113
113
  let names = SqliteDriver$ReventlessLocal.all(listIndexes, []).map(row => {
114
114
  let match = row["name"];
@@ -141,7 +141,7 @@ globalThis.describe("QueryDb — indexed equality lookup (B4 push-down)", () =>
141
141
  db: db
142
142
  };
143
143
  let Storage = QueryDbStorage_Sqlite$ReventlessLocal.Make(TestBus)(DbProvider);
144
- let s = Storage.make("orders", [byOwner], undefined, undefined, undefined, undefined, opts);
144
+ let s = Storage.make("orders", [byOwner], undefined, undefined, undefined, undefined, undefined, opts);
145
145
  let ops = await TestRunner$ReventlessLocal.resolve(s.operations);
146
146
  await ops.save("k1", item("o1"), "Any", undefined);
147
147
  await ops.save("k2", item("o2"), "Any", undefined);
@@ -158,7 +158,7 @@ globalThis.describe("QueryDb — indexed equality lookup (B4 push-down)", () =>
158
158
  db: db
159
159
  };
160
160
  let Storage = QueryDbStorage_Sqlite$ReventlessLocal.Make(TestBus)(DbProvider);
161
- let s = Storage.make("orders", [byOwner], undefined, undefined, undefined, undefined, opts);
161
+ let s = Storage.make("orders", [byOwner], undefined, undefined, undefined, undefined, undefined, opts);
162
162
  let ops = await TestRunner$ReventlessLocal.resolve(s.operations);
163
163
  let aMinuteAgo = (Date.now() / 1000.0 | 0) - 60 | 0;
164
164
  await ops.save("k1", item("o1"), "Any", undefined);
@@ -169,7 +169,7 @@ globalThis.describe("QueryDb — indexed equality lookup (B4 push-down)", () =>
169
169
  globalThis.test("in-memory lookup matches the sqlite result (backend parity)", async () => {
170
170
  let TestBus = LocalBus$ReventlessLocal.Make({});
171
171
  let Storage = QueryDbStorage_InMemory$ReventlessLocal.Make(TestBus);
172
- let s = Storage.make("orders", [byOwner], undefined, undefined, undefined, undefined, opts);
172
+ let s = Storage.make("orders", [byOwner], undefined, undefined, undefined, undefined, undefined, opts);
173
173
  let ops = await TestRunner$ReventlessLocal.resolve(s.operations);
174
174
  await ops.save("k1", item("o1"), "Any", undefined);
175
175
  await ops.save("k2", item("o2"), "Any", undefined);
@@ -185,7 +185,7 @@ globalThis.describe("QueryDbStorage_InMemory — lazy scan snapshot (B4 dirty-fl
185
185
  globalThis.test("interleaved save/scan reflects each write without stale reads", async () => {
186
186
  let TestBus = LocalBus$ReventlessLocal.Make({});
187
187
  let Storage = LocalQueryDbStorage$ReventlessLocal.Make(TestBus);
188
- let s = Storage.make("lazy", [], undefined, undefined, undefined, undefined, opts);
188
+ let s = Storage.make("lazy", [], undefined, undefined, undefined, undefined, undefined, opts);
189
189
  let ops = await TestRunner$ReventlessLocal.resolve(s.operations);
190
190
  let scanFn = Stdlib_Option.getOrThrow(TestBus.getQueryDbScan("lazy"), undefined);
191
191
  globalThis.expect(scanFn().length).toBe(0);
@@ -206,7 +206,7 @@ globalThis.describe("QueryDbStorage_Sqlite — TTL", () => {
206
206
  db: db
207
207
  };
208
208
  let Storage = QueryDbStorage_Sqlite$ReventlessLocal.Make(TestBus)(DbProvider);
209
- let s = Storage.make("rt-future", [], undefined, undefined, undefined, undefined, opts);
209
+ let s = Storage.make("rt-future", [], undefined, undefined, undefined, undefined, undefined, opts);
210
210
  let ops = await TestRunner$ReventlessLocal.resolve(s.operations);
211
211
  let oneHourFromNow = (Date.now() / 1000.0 | 0) + 3600 | 0;
212
212
  await ops.save("k", "alive", "Any", oneHourFromNow);
@@ -220,7 +220,7 @@ globalThis.describe("QueryDbStorage_Sqlite — TTL", () => {
220
220
  db: db
221
221
  };
222
222
  let Storage = QueryDbStorage_Sqlite$ReventlessLocal.Make(TestBus)(DbProvider);
223
- let s = Storage.make("rt-past", [], undefined, undefined, undefined, undefined, opts);
223
+ let s = Storage.make("rt-past", [], undefined, undefined, undefined, undefined, undefined, opts);
224
224
  let ops = await TestRunner$ReventlessLocal.resolve(s.operations);
225
225
  let aMinuteAgo = (Date.now() / 1000.0 | 0) - 60 | 0;
226
226
  await ops.save("k", "expired", "Any", aMinuteAgo);
@@ -234,7 +234,7 @@ globalThis.describe("QueryDbStorage_Sqlite — TTL", () => {
234
234
  db: db
235
235
  };
236
236
  let Storage = QueryDbStorage_Sqlite$ReventlessLocal.Make(TestBus)(DbProvider);
237
- let s = Storage.make("rt-none", [], undefined, undefined, undefined, undefined, opts);
237
+ let s = Storage.make("rt-none", [], undefined, undefined, undefined, undefined, undefined, opts);
238
238
  let ops = await TestRunner$ReventlessLocal.resolve(s.operations);
239
239
  await ops.save("k", "forever", "Any", undefined);
240
240
  let items = await collect(ops.loadStream("k"));
@@ -247,7 +247,7 @@ globalThis.describe("QueryDbStorage_Sqlite — TTL", () => {
247
247
  db: db
248
248
  };
249
249
  let Storage = QueryDbStorage_Sqlite$ReventlessLocal.Make(TestBus)(DbProvider);
250
- let s = Storage.make("scan-ttl", [], undefined, undefined, undefined, undefined, opts);
250
+ let s = Storage.make("scan-ttl", [], undefined, undefined, undefined, undefined, undefined, opts);
251
251
  let ops = await TestRunner$ReventlessLocal.resolve(s.operations);
252
252
  await ops.save("alive", "a", "Any", undefined);
253
253
  let aMinuteAgo = (Date.now() / 1000.0 | 0) - 60 | 0;
@@ -266,7 +266,7 @@ globalThis.describe("QueryDbStorage_Sqlite — TTL", () => {
266
266
  db: db
267
267
  };
268
268
  let Storage = QueryDbStorage_Sqlite$ReventlessLocal.Make(TestBus)(DbProvider);
269
- let s = Storage.make("overwrite-ttl", [], undefined, undefined, undefined, undefined, opts);
269
+ let s = Storage.make("overwrite-ttl", [], undefined, undefined, undefined, undefined, undefined, opts);
270
270
  let ops = await TestRunner$ReventlessLocal.resolve(s.operations);
271
271
  let aMinuteAgo = (Date.now() / 1000.0 | 0) - 60 | 0;
272
272
  await ops.save("k", "expired", "Any", aMinuteAgo);
@@ -55,7 +55,7 @@ let build = async (): setup => {
55
55
  let db = SqliteDriver.openDb(~path=":memory:")
56
56
  }
57
57
  module Storage = QueryDbStorage_Sqlite.Make(TestBus, DbProvider)
58
- let s = Storage.make(~name="items", ~indexes=[], ~api=(), ~apiRole=(), ~opts)
58
+ let s = Storage.make(~name="items", ~indexes=[], ~api=(), ~apiRole=(), ~owner=None, ~opts)
59
59
  let ops = await s.operations->TestRunner.resolve
60
60
  for i in 0 to rows->Array.length - 1 {
61
61
  let (id, status, name, qty) = rows->Array.getUnsafe(i)
@@ -85,7 +85,7 @@ async function build() {
85
85
  db: db
86
86
  };
87
87
  let Storage = QueryDbStorage_Sqlite$ReventlessLocal.Make(TestBus)(DbProvider);
88
- let s = Storage.make("items", [], undefined, undefined, undefined, undefined, opts);
88
+ let s = Storage.make("items", [], undefined, undefined, undefined, undefined, undefined, opts);
89
89
  let ops = await TestRunner$ReventlessLocal.resolve(s.operations);
90
90
  for (let i = 0, i_finish = rows.length; i < i_finish; ++i) {
91
91
  let match = rows[i];
@@ -145,7 +145,7 @@ async function buildFixture(name) {
145
145
  connectionSpec: true
146
146
  };
147
147
  Plugin_Helpers$ReventlessCore.stateSchemaRegistry[name] = rowStateSchemaWithAnnotations;
148
- let queryDb = Maker.make(undefined, undefined, undefined, undefined);
148
+ let queryDb = Maker.make(undefined, undefined, undefined, undefined, undefined);
149
149
  let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(queryDb));
150
150
  Resolvers.make(name, undefined, undefined, Pulumi.output(""), [], undefined, [], [], "AllowAuthenticated", {});
151
151
  let r = DomainGraphQL_Server$ReventlessLocal.getQueryResolver(listFieldName);
@@ -15,7 +15,7 @@ describe("QueryDbStorage_Sqlite", () => {
15
15
  }
16
16
  module Storage = QueryDbStorage_Sqlite.Make(TestBus, DbProvider)
17
17
 
18
- let s = Storage.make(~name="rm1", ~indexes=[], ~api=(), ~apiRole=(), ~opts)
18
+ let s = Storage.make(~name="rm1", ~indexes=[], ~api=(), ~apiRole=(), ~owner=None, ~opts)
19
19
  let ops = await s.operations->TestRunner.resolve
20
20
 
21
21
  let _ = await ops.save(
@@ -42,7 +42,7 @@ describe("QueryDbStorage_Sqlite", () => {
42
42
  }
43
43
  module Storage = QueryDbStorage_Sqlite.Make(TestBus, DbProvider)
44
44
 
45
- let s = Storage.make(~name="rm2", ~indexes=[], ~api=(), ~apiRole=(), ~opts)
45
+ let s = Storage.make(~name="rm2", ~indexes=[], ~api=(), ~apiRole=(), ~owner=None, ~opts)
46
46
  let ops = await s.operations->TestRunner.resolve
47
47
 
48
48
  let _ = await ops.save("k", JSON.Encode.string("a"), ReventlessCore.QueryDb.Any, None)
@@ -65,7 +65,7 @@ describe("QueryDbStorage_Sqlite", () => {
65
65
  }
66
66
  module Storage = QueryDbStorage_Sqlite.Make(TestBus, DbProvider)
67
67
 
68
- let s = Storage.make(~name="rm3", ~indexes=[], ~api=(), ~apiRole=(), ~opts)
68
+ let s = Storage.make(~name="rm3", ~indexes=[], ~api=(), ~apiRole=(), ~owner=None, ~opts)
69
69
  let ops = await s.operations->TestRunner.resolve
70
70
 
71
71
  let _ = await ops.saveBatch([
@@ -102,7 +102,7 @@ describe("QueryDbStorage_Sqlite", () => {
102
102
  }
103
103
  module Storage = QueryDbStorage_Sqlite.Make(TestBus, DbProvider)
104
104
 
105
- let s = Storage.make(~name="rm4", ~indexes=[], ~api=(), ~apiRole=(), ~opts)
105
+ let s = Storage.make(~name="rm4", ~indexes=[], ~api=(), ~apiRole=(), ~owner=None, ~opts)
106
106
  let ops = await s.operations->TestRunner.resolve
107
107
 
108
108
  let _ = await ops.save("k", JSON.Encode.string("a"), ReventlessCore.QueryDb.Any, None)
@@ -127,7 +127,7 @@ describe("QueryDbStorage_Sqlite", () => {
127
127
  let db = SqliteDriver.openDb(~path)
128
128
  }
129
129
  module Storage = QueryDbStorage_Sqlite.Make(TestBus, DbProvider)
130
- let s = Storage.make(~name="persist", ~indexes=[], ~api=(), ~apiRole=(), ~opts)
130
+ let s = Storage.make(~name="persist", ~indexes=[], ~api=(), ~apiRole=(), ~owner=None, ~opts)
131
131
  let ops = await s.operations->TestRunner.resolve
132
132
  let _ = await ops.save(
133
133
  "k",
@@ -144,7 +144,7 @@ describe("QueryDbStorage_Sqlite", () => {
144
144
  let db = SqliteDriver.openDb(~path)
145
145
  }
146
146
  module Storage2 = QueryDbStorage_Sqlite.Make(TestBus2, DbProvider2)
147
- let s2 = Storage2.make(~name="persist", ~indexes=[], ~api=(), ~apiRole=(), ~opts)
147
+ let s2 = Storage2.make(~name="persist", ~indexes=[], ~api=(), ~apiRole=(), ~owner=None, ~opts)
148
148
  let ops2 = await s2.operations->TestRunner.resolve
149
149
  let items =
150
150
  await ops2.loadStream("k")
@@ -23,7 +23,7 @@ globalThis.describe("QueryDbStorage_Sqlite", () => {
23
23
  db: db
24
24
  };
25
25
  let Storage = QueryDbStorage_Sqlite$ReventlessLocal.Make(TestBus)(DbProvider);
26
- let s = Storage.make("rm1", [], undefined, undefined, undefined, undefined, opts);
26
+ let s = Storage.make("rm1", [], undefined, undefined, undefined, undefined, undefined, opts);
27
27
  let ops = await TestRunner$ReventlessLocal.resolve(s.operations);
28
28
  await ops.save("id1", "value1", "Any", undefined);
29
29
  let items = await Effect.runPromise(Effect.catchAll(Stream.runCollect(ops.loadStream("id1")), param => Effect.succeed([])));
@@ -37,7 +37,7 @@ globalThis.describe("QueryDbStorage_Sqlite", () => {
37
37
  db: db
38
38
  };
39
39
  let Storage = QueryDbStorage_Sqlite$ReventlessLocal.Make(TestBus)(DbProvider);
40
- let s = Storage.make("rm2", [], undefined, undefined, undefined, undefined, opts);
40
+ let s = Storage.make("rm2", [], undefined, undefined, undefined, undefined, undefined, opts);
41
41
  let ops = await TestRunner$ReventlessLocal.resolve(s.operations);
42
42
  await ops.save("k", "a", "Any", undefined);
43
43
  await ops.save("k", "b", "Any", undefined);
@@ -52,7 +52,7 @@ globalThis.describe("QueryDbStorage_Sqlite", () => {
52
52
  db: db
53
53
  };
54
54
  let Storage = QueryDbStorage_Sqlite$ReventlessLocal.Make(TestBus)(DbProvider);
55
- let s = Storage.make("rm3", [], undefined, undefined, undefined, undefined, opts);
55
+ let s = Storage.make("rm3", [], undefined, undefined, undefined, undefined, undefined, opts);
56
56
  let ops = await TestRunner$ReventlessLocal.resolve(s.operations);
57
57
  await ops.saveBatch([
58
58
  [
@@ -85,7 +85,7 @@ globalThis.describe("QueryDbStorage_Sqlite", () => {
85
85
  db: db
86
86
  };
87
87
  let Storage = QueryDbStorage_Sqlite$ReventlessLocal.Make(TestBus)(DbProvider);
88
- let s = Storage.make("rm4", [], undefined, undefined, undefined, undefined, opts);
88
+ let s = Storage.make("rm4", [], undefined, undefined, undefined, undefined, undefined, opts);
89
89
  let ops = await TestRunner$ReventlessLocal.resolve(s.operations);
90
90
  await ops.save("k", "a", "Any", undefined);
91
91
  await ops.delete("k", undefined);
@@ -100,7 +100,7 @@ globalThis.describe("QueryDbStorage_Sqlite", () => {
100
100
  db: db
101
101
  };
102
102
  let Storage = QueryDbStorage_Sqlite$ReventlessLocal.Make(TestBus)(DbProvider);
103
- let s = Storage.make("persist", [], undefined, undefined, undefined, undefined, opts);
103
+ let s = Storage.make("persist", [], undefined, undefined, undefined, undefined, undefined, opts);
104
104
  let ops = await TestRunner$ReventlessLocal.resolve(s.operations);
105
105
  await ops.save("k", "hello", "Any", undefined);
106
106
  SqliteDriver$ReventlessLocal.close(db);
@@ -110,7 +110,7 @@ globalThis.describe("QueryDbStorage_Sqlite", () => {
110
110
  db: db$1
111
111
  };
112
112
  let Storage2 = QueryDbStorage_Sqlite$ReventlessLocal.Make(TestBus2)(DbProvider2);
113
- let s2 = Storage2.make("persist", [], undefined, undefined, undefined, undefined, opts);
113
+ let s2 = Storage2.make("persist", [], undefined, undefined, undefined, undefined, undefined, opts);
114
114
  let ops2 = await TestRunner$ReventlessLocal.resolve(s2.operations);
115
115
  let items = await Effect.runPromise(Effect.catchAll(Stream.runCollect(ops2.loadStream("k")), param => Effect.succeed([])));
116
116
  globalThis.expect(items.length).toBe(1);