@kairos-es/core 1.0.0-alpha.2 → 1.0.0-alpha.4

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.
package/README.md CHANGED
@@ -8,7 +8,7 @@ DCB-first event-sourcing contract and in-memory store for Effect v3.
8
8
  Effect instance (per [ADR-0003](../../docs/adr)):
9
9
 
10
10
  ```sh
11
- pnpm add @kairos-es/core@alpha effect
11
+ pnpm add @kairos-es/core@alpha effect@^3.22.0
12
12
  ```
13
13
 
14
14
  Provides the `DcbEventStore` contract (branded `Position` / `Tag` / `EventType`,
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.makeContractStore = void 0;
7
7
  var _effect = require("effect");
8
+ var _AppendCondition = require("./AppendCondition.js");
8
9
  var _AppendIsOwned = require("./AppendIsOwned.js");
9
10
  var _Event = require("./Event.js");
10
11
  var _Query = require("./Query.js");
@@ -26,7 +27,7 @@ const makeContractStore = raw => ({
26
27
  }),
27
28
  append: (events, condition) =>
28
29
  // The ownership refusal runs FIRST and sits OUTSIDE the suspend, because it is
29
- // the only one of append's four checks that is EFFECTFUL: it consults a
30
+ // the only one of append's checks that is EFFECTFUL: it consults a
30
31
  // `Context.Tag` rather than inspecting the arguments. `Effect.flatMap` over an
31
32
  // already-lazy effect defers it exactly as the suspend defers the throws below,
32
33
  // so nothing runs at the call site either way; what it buys is that the
@@ -47,8 +48,16 @@ const makeContractStore = raw => ({
47
48
  if (events.length === 0) {
48
49
  throw new Error('makeContractStore.append: the events batch is empty; append requires ' + 'at least one event (a NonEmptyReadonlyArray). An empty batch is a ' + 'plain-data caller bypassing the type — a defect, not a conflict.');
49
50
  }
50
- // A non-servable guard query is a defect in every engine.
51
+ // A non-servable guard query is a defect in every engine, and so is a
52
+ // condition carrying a key `AppendCondition` does not define: an author
53
+ // who wrote one believes they added a condition, and every engine would
54
+ // ignore it. Known keys come off the schema, as `servableQueryFault`
55
+ // reads its own (`Query.ts` owns the argument).
51
56
  if (condition !== undefined) {
57
+ const unknown = Object.keys(condition).find(key => !Object.hasOwn(_AppendCondition.AppendCondition.fields, key));
58
+ if (unknown !== undefined) {
59
+ throw new Error(`makeContractStore.append: the append condition carries the key ${JSON.stringify(unknown)}, ` + 'which `AppendCondition` does not define; an unknown key would be ' + 'silently ignored by every engine rather than honoured, so it is refused');
60
+ }
52
61
  (0, _Query.assertServableQuery)(condition.failIfEventsMatch);
53
62
  }
54
63
  // Only `AppendConditionFailed` belongs on the contract error channel;
@@ -1 +1 @@
1
- {"version":3,"file":"ContractStore.js","names":["_effect","require","_AppendIsOwned","_Event","_Query","decodeReadLimit","Schema","decodeUnknownSync","ReadLimit","makeContractStore","raw","read","query","options","Effect","suspend","assertServableQuery","limit","undefined","orDie","append","events","condition","flatMap","assertAppendNotOwned","length","Error","failIfEventsMatch","catchAll","error","Predicate","isTagged","fail","die","subscribe","after","Stream","unwrap","sync","exports"],"sources":["../../src/ContractStore.ts"],"sourcesContent":[null],"mappings":";;;;;;AAmCA,IAAAA,OAAA,GAAAC,OAAA;AAEA,IAAAC,cAAA,GAAAD,OAAA;AAGA,IAAAE,MAAA,GAAAF,OAAA;AAEA,IAAAG,MAAA,GAAAH,OAAA;AAEA;AACA,MAAMI,eAAe,gBAAGC,cAAM,CAACC,iBAAiB,CAACC,gBAAS,CAAC;AAwB3D;;;;AAIO,MAAMC,iBAAiB,GAC5BC,GAAwB,KACG;EAC3BC,IAAI,EAAEA,CAACC,KAAK,EAAEC,OAAO,KACnBC,cAAM,CAACC,OAAO,CAAC,MAAK;IAClB;IACA,IAAAC,0BAAmB,EAACJ,KAAK,CAAC;IAC1B,IAAIC,OAAO,EAAEI,KAAK,KAAKC,SAAS,EAAE;MAChCb,eAAe,CAACQ,OAAO,CAACI,KAAK,CAAC;IAChC;IACA;IACA,OAAOH,cAAM,CAACK,KAAK,CAACT,GAAG,CAACC,IAAI,CAACC,KAAK,EAAEC,OAAO,CAAC,CAAC;EAC/C,CAAC,CAAC;EAEJO,MAAM,EAAEA,CAACC,MAAM,EAAEC,SAAS;EACxB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACAR,cAAM,CAACS,OAAO,CAACC,mCAAoB,EAAE,MACnCV,cAAM,CAACC,OAAO,CAAC,MAAK;IAClB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA,IAAIM,MAAM,CAACI,MAAM,KAAK,CAAC,EAAE;MACvB,MAAM,IAAIC,KAAK,CACb,uEAAuE,GACrE,oEAAoE,GACpE,kEAAkE,CACrE;IACH;IACA;IACA,IAAIJ,SAAS,KAAKJ,SAAS,EAAE;MAC3B,IAAAF,0BAAmB,EAACM,SAAS,CAACK,iBAAiB,CAAC;IAClD;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA,OAAOb,cAAM,CAACc,QAAQ,CAAClB,GAAG,CAACU,MAAM,CAACC,MAAM,EAAEC,SAAS,CAAC,EAAGO,KAAK,IAC1DC,iBAAS,CAACC,QAAQ,CAAC,uBAAuB,CAAC,CAACF,KAAK,CAAC,GAC9Cf,cAAM,CAACkB,IAAI,CAACH,KAAK,CAAC,GAClBf,cAAM,CAACmB,GAAG,CAACJ,KAAK,CAAC,CACtB;EACH,CAAC,CAAC,CACH;EAEHK,SAAS,EAAEA,CAACtB,KAAK,EAAEuB,KAAK;EACtB;EACA;EACA;EACA;EACAC,cAAM,CAACC,MAAM,CACXvB,cAAM,CAACwB,IAAI,CAAC,MAAK;IACf,IAAAtB,0BAAmB,EAACJ,KAAK,CAAC;IAC1B,OAAOwB,cAAM,CAACjB,KAAK,CAACT,GAAG,CAACwB,SAAS,CAACtB,KAAK,EAAEuB,KAAK,CAAC,CAAC;EAClD,CAAC,CAAC;CAEP,CAAC;AAAAI,OAAA,CAAA9B,iBAAA,GAAAA,iBAAA","ignoreList":[]}
1
+ {"version":3,"file":"ContractStore.js","names":["_effect","require","_AppendCondition","_AppendIsOwned","_Event","_Query","decodeReadLimit","Schema","decodeUnknownSync","ReadLimit","makeContractStore","raw","read","query","options","Effect","suspend","assertServableQuery","limit","undefined","orDie","append","events","condition","flatMap","assertAppendNotOwned","length","Error","unknown","Object","keys","find","key","hasOwn","AppendCondition","fields","JSON","stringify","failIfEventsMatch","catchAll","error","Predicate","isTagged","fail","die","subscribe","after","Stream","unwrap","sync","exports"],"sources":["../../src/ContractStore.ts"],"sourcesContent":[null],"mappings":";;;;;;AAqCA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,gBAAA,GAAAD,OAAA;AACA,IAAAE,cAAA,GAAAF,OAAA;AAGA,IAAAG,MAAA,GAAAH,OAAA;AAEA,IAAAI,MAAA,GAAAJ,OAAA;AAEA;AACA,MAAMK,eAAe,gBAAGC,cAAM,CAACC,iBAAiB,CAACC,gBAAS,CAAC;AAwB3D;;;;AAIO,MAAMC,iBAAiB,GAC5BC,GAAwB,KACG;EAC3BC,IAAI,EAAEA,CAACC,KAAK,EAAEC,OAAO,KACnBC,cAAM,CAACC,OAAO,CAAC,MAAK;IAClB;IACA,IAAAC,0BAAmB,EAACJ,KAAK,CAAC;IAC1B,IAAIC,OAAO,EAAEI,KAAK,KAAKC,SAAS,EAAE;MAChCb,eAAe,CAACQ,OAAO,CAACI,KAAK,CAAC;IAChC;IACA;IACA,OAAOH,cAAM,CAACK,KAAK,CAACT,GAAG,CAACC,IAAI,CAACC,KAAK,EAAEC,OAAO,CAAC,CAAC;EAC/C,CAAC,CAAC;EAEJO,MAAM,EAAEA,CAACC,MAAM,EAAEC,SAAS;EACxB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACAR,cAAM,CAACS,OAAO,CAACC,mCAAoB,EAAE,MACnCV,cAAM,CAACC,OAAO,CAAC,MAAK;IAClB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA,IAAIM,MAAM,CAACI,MAAM,KAAK,CAAC,EAAE;MACvB,MAAM,IAAIC,KAAK,CACb,uEAAuE,GACrE,oEAAoE,GACpE,kEAAkE,CACrE;IACH;IACA;IACA;IACA;IACA;IACA;IACA,IAAIJ,SAAS,KAAKJ,SAAS,EAAE;MAC3B,MAAMS,OAAO,GAAGC,MAAM,CAACC,IAAI,CAACP,SAAS,CAAC,CAACQ,IAAI,CACxCC,GAAG,IAAK,CAACH,MAAM,CAACI,MAAM,CAACC,gCAAe,CAACC,MAAM,EAAEH,GAAG,CAAC,CACrD;MACD,IAAIJ,OAAO,KAAKT,SAAS,EAAE;QACzB,MAAM,IAAIQ,KAAK,CACb,kEAAkES,IAAI,CAACC,SAAS,CAACT,OAAO,CAAC,IAAI,GAC3F,mEAAmE,GACnE,yEAAyE,CAC5E;MACH;MACA,IAAAX,0BAAmB,EAACM,SAAS,CAACe,iBAAiB,CAAC;IAClD;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA,OAAOvB,cAAM,CAACwB,QAAQ,CAAC5B,GAAG,CAACU,MAAM,CAACC,MAAM,EAAEC,SAAS,CAAC,EAAGiB,KAAK,IAC1DC,iBAAS,CAACC,QAAQ,CAAC,uBAAuB,CAAC,CAACF,KAAK,CAAC,GAC9CzB,cAAM,CAAC4B,IAAI,CAACH,KAAK,CAAC,GAClBzB,cAAM,CAAC6B,GAAG,CAACJ,KAAK,CAAC,CACtB;EACH,CAAC,CAAC,CACH;EAEHK,SAAS,EAAEA,CAAChC,KAAK,EAAEiC,KAAK;EACtB;EACA;EACA;EACA;EACAC,cAAM,CAACC,MAAM,CACXjC,cAAM,CAACkC,IAAI,CAAC,MAAK;IACf,IAAAhC,0BAAmB,EAACJ,KAAK,CAAC;IAC1B,OAAOkC,cAAM,CAAC3B,KAAK,CAACT,GAAG,CAACkC,SAAS,CAAChC,KAAK,EAAEiC,KAAK,CAAC,CAAC;EAClD,CAAC,CAAC;CAEP,CAAC;AAAAI,OAAA,CAAAxC,iBAAA,GAAAA,iBAAA","ignoreList":[]}
package/dist/cjs/Event.js CHANGED
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.tagIdentity = exports.Tag = exports.SequencedEvent = exports.ReadLimit = exports.Position = exports.ORIGIN = exports.EventType = exports.DcbEvent = void 0;
6
+ exports.tagIdentity = exports.Tag = exports.SequencedEvent = exports.ReadLimit = exports.Position = exports.ORIGIN = exports.Metadata = exports.EventType = exports.DcbEvent = void 0;
7
7
  var _effect = require("effect");
8
8
  /**
9
9
  * Core domain types for the DCB event log: branded scalars and the wire
@@ -66,20 +66,80 @@ const ReadLimit = exports.ReadLimit = /*#__PURE__*/_effect.Schema.Int.pipe(/*#__
66
66
  * in the name (e.g. `course-registered.v2`); only non-emptiness is enforced.
67
67
  */
68
68
  const EventType = exports.EventType = /*#__PURE__*/_effect.Schema.String.pipe(/*#__PURE__*/_effect.Schema.nonEmptyString(), /*#__PURE__*/_effect.Schema.brand('EventType'));
69
+ /**
70
+ * An event's metadata: a flat bag of strings carrying the circumstances under
71
+ * which the event was RECORDED, never anything the business asserts (ADR-0017).
72
+ * Payload is what happened; metadata is the context of the recording — a
73
+ * `traceparent`, a correlation or causation id, a deployment revision.
74
+ *
75
+ * Values are strings, not `unknown`, for cross-engine parity rather than taste:
76
+ * both SQL engines carry the bag as a JSON document, and `JSON.stringify` drops
77
+ * `undefined`, throws on `bigint` and turns `NaN` into `null`, none of which the
78
+ * in-memory oracle does.
79
+ *
80
+ * The key schema carries no refinement, deliberately: a refinement on a
81
+ * `Schema.Record` key acts as a FILTER on decode, silently dropping a key that
82
+ * fails it rather than failing the decode. Constraining keys, if ever wanted,
83
+ * has to be a validating step of its own.
84
+ *
85
+ * Two engine limits a consumer must know, because the bag is typically filled
86
+ * from outside the application at a request edge. Postgres refuses a NUL
87
+ * character (U+0000) and an unpaired surrogate in any string it stores, so an
88
+ * event whose bag holds one fails to append there while the in-memory and
89
+ * SQLite engines accept it; sanitise untrusted values before they reach the
90
+ * bag. And key ORDER is not preserved: Postgres stores an object's keys in an
91
+ * order of its own, so compare bags as unordered and never rely on the order
92
+ * `Object.keys` returns.
93
+ *
94
+ * Metadata is never part of a `Query` or an `AppendCondition` — a store refuses
95
+ * either when it carries a key the grammar does not define, so a metadata
96
+ * predicate cannot be written and silently ignored — never reaches a codec's
97
+ * `tagsFor`, and no store offers a way to rewrite it once appended. ADR-0017
98
+ * owns why each of those is mechanical rather than preferential.
99
+ *
100
+ * ## The one home of the shape rule
101
+ *
102
+ * The bag is a JSON OBJECT whose every value is a STRING, and this schema is
103
+ * where that rule is stated. At runtime it is checked in ONE place, at write: the
104
+ * codec's `toEvent` decodes every bag through this schema and refuses one that
105
+ * fails on its own error channel, so a value smuggled past the type (through an
106
+ * `any`) stops there. The schema judges a bag's OWN enumerable keys, so an object
107
+ * that keeps its entries anywhere else — a `Map`, a `Date` — reads as the empty
108
+ * bag rather than failing. A store checks no values: an event built by hand and handed
109
+ * to `append` directly carries whatever it carries, and what each engine then does
110
+ * with a non-string value differs — one may store it and read it back differently
111
+ * from another, and a `bigint` makes a SQL engine's append fail. Each
112
+ * SQL engine keeps a container check of its own on read — the column must hold a
113
+ * JSON object — because that defends against a writer outside the library and is
114
+ * about the column, not the values. A VALUE check must never be added on read
115
+ * alone: it would make an event the store accepted unreadable for ever, so a
116
+ * value check belongs at write or nowhere.
117
+ */
118
+ const Metadata = exports.Metadata = /*#__PURE__*/_effect.Schema.Record({
119
+ key: _effect.Schema.String,
120
+ value: _effect.Schema.String
121
+ });
69
122
  /**
70
123
  * An event as stored: an opaque payload plus its type, tags, a
71
- * producer-supplied `uuid`, and producer-supplied `occurredAt` domain time.
124
+ * producer-supplied `uuid`, producer-supplied `occurredAt` domain time, and its
125
+ * `metadata` bag.
72
126
  *
73
127
  * `data` is `Uint8Array` (opaque bytes); the store does not interpret it.
74
128
  * `uuid` is producer-supplied to keep `core` deterministic (no RNG in core).
75
129
  * `occurredAt` is informational only; ordering is by position alone.
130
+ * `metadata` mirrors `tags` rather than `data`: REQUIRED, with an empty bag
131
+ * legal. Required because an absent-versus-empty divergence between engines is
132
+ * invisible to `toEqual`, which ignores `undefined` properties, so an optional
133
+ * field could drift across the three engines with the round-trip suite green.
134
+ * Core only carries it; the codec's `toEvent` is where it is resolved.
76
135
  */
77
136
  const DcbEvent = exports.DcbEvent = /*#__PURE__*/_effect.Schema.Struct({
78
137
  type: EventType,
79
138
  data: _effect.Schema.Uint8ArrayFromSelf,
80
139
  tags: /*#__PURE__*/_effect.Schema.Array(Tag),
81
140
  uuid: _effect.Schema.UUID,
82
- occurredAt: _effect.Schema.DateTimeUtc
141
+ occurredAt: _effect.Schema.DateTimeUtc,
142
+ metadata: Metadata
83
143
  });
84
144
  /** A persisted event: the event together with the position it was written at. */
85
145
  const SequencedEvent = exports.SequencedEvent = /*#__PURE__*/_effect.Schema.Struct({
@@ -1 +1 @@
1
- {"version":3,"file":"Event.js","names":["_effect","require","Position","exports","Schema","BigInt","pipe","nonNegativeBigInt","brand","ORIGIN","make","Tag","String","pattern","identifier","tagIdentity","key","length","includes","Error","JSON","stringify","value","ReadLimit","Int","greaterThanOrEqualTo","EventType","nonEmptyString","DcbEvent","Struct","type","data","Uint8ArrayFromSelf","tags","Array","uuid","UUID","occurredAt","DateTimeUtc","SequencedEvent","event","position"],"sources":["../../src/Event.ts"],"sourcesContent":[null],"mappings":";;;;;;AAQA,IAAAA,OAAA,GAAAC,OAAA;AARA;;;;;;;;;AAUA;;;;;;;;;AASO,MAAMC,QAAQ,GAAAC,OAAA,CAAAD,QAAA,gBAAGE,cAAM,CAACC,MAAM,CAACC,IAAI,cACxCF,cAAM,CAACG,iBAAiB,EAAE,eAC1BH,cAAM,CAACI,KAAK,CAAC,UAAU,CAAC,CACzB;AAGD;AACO,MAAMC,MAAM,GAAAN,OAAA,CAAAM,MAAA,gBAAaP,QAAQ,CAACQ,IAAI,CAAC,EAAE,CAAC;AAEjD;;;;;;AAMO,MAAMC,GAAG,GAAAR,OAAA,CAAAQ,GAAA,gBAAGP,cAAM,CAACQ,MAAM,CAACN,IAAI,cACnCF,cAAM,CAACS,OAAO,CAAC,WAAW,EAAE;EAAEC,UAAU,EAAE;AAAK,CAAE,CAAC,eAClDV,cAAM,CAACI,KAAK,CAAC,KAAK,CAAC,CACpB;AA8BM,MAAMO,WAAW,GAAIC,GAAW,IAAiB;EACtD,IAAIA,GAAG,CAACC,MAAM,KAAK,CAAC,IAAID,GAAG,CAACE,QAAQ,CAAC,GAAG,CAAC,EAAE;IACzC,MAAM,IAAIC,KAAK,CACb,8DAA8DC,IAAI,CAACC,SAAS,CAACL,GAAG,CAAC,GAAG,CACrF;EACH;EACA,OAAO;IACLA,GAAG;IACHN,IAAI,EAAGY,KAAK,IAAI;MACd,IAAIA,KAAK,CAACL,MAAM,KAAK,CAAC,IAAIK,KAAK,CAACJ,QAAQ,CAAC,GAAG,CAAC,EAAE;QAC7C,MAAM,IAAIC,KAAK,CACb,eAAeC,IAAI,CAACC,SAAS,CAACL,GAAG,CAAC,2DAA2DI,IAAI,CAACC,SAAS,CAACC,KAAK,CAAC,GAAG,CACtH;MACH;MACA,OAAOX,GAAG,CAACD,IAAI,CAAC,GAAGM,GAAG,IAAIM,KAAK,EAAE,CAAC;IACpC;GACD;AACH,CAAC;AAED;;;;;;;;;;AAAAnB,OAAA,CAAAY,WAAA,GAAAA,WAAA;AAUO,MAAMQ,SAAS,GAAApB,OAAA,CAAAoB,SAAA,gBAAGnB,cAAM,CAACoB,GAAG,CAAClB,IAAI,cACtCF,cAAM,CAACqB,oBAAoB,CAAC,CAAC,CAAC,eAC9BrB,cAAM,CAACI,KAAK,CAAC,WAAW,CAAC,CAC1B;AAGD;;;;AAIO,MAAMkB,SAAS,GAAAvB,OAAA,CAAAuB,SAAA,gBAAGtB,cAAM,CAACQ,MAAM,CAACN,IAAI,cACzCF,cAAM,CAACuB,cAAc,EAAE,eACvBvB,cAAM,CAACI,KAAK,CAAC,WAAW,CAAC,CAC1B;AAGD;;;;;;;;AAQO,MAAMoB,QAAQ,GAAAzB,OAAA,CAAAyB,QAAA,gBAAGxB,cAAM,CAACyB,MAAM,CAAC;EACpCC,IAAI,EAAEJ,SAAS;EACfK,IAAI,EAAE3B,cAAM,CAAC4B,kBAAkB;EAC/BC,IAAI,eAAE7B,cAAM,CAAC8B,KAAK,CAACvB,GAAG,CAAC;EACvBwB,IAAI,EAAE/B,cAAM,CAACgC,IAAI;EACjBC,UAAU,EAAEjC,cAAM,CAACkC;CACpB,CAAC;AAGF;AACO,MAAMC,cAAc,GAAApC,OAAA,CAAAoC,cAAA,gBAAGnC,cAAM,CAACyB,MAAM,CAAC;EAC1CW,KAAK,EAAEZ,QAAQ;EACfa,QAAQ,EAAEvC;CACX,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"Event.js","names":["_effect","require","Position","exports","Schema","BigInt","pipe","nonNegativeBigInt","brand","ORIGIN","make","Tag","String","pattern","identifier","tagIdentity","key","length","includes","Error","JSON","stringify","value","ReadLimit","Int","greaterThanOrEqualTo","EventType","nonEmptyString","Metadata","Record","DcbEvent","Struct","type","data","Uint8ArrayFromSelf","tags","Array","uuid","UUID","occurredAt","DateTimeUtc","metadata","SequencedEvent","event","position"],"sources":["../../src/Event.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -24,15 +24,21 @@ const AnyProjection = exports.AnyProjection = {
24
24
  */
25
25
  of: projection => projection
26
26
  };
27
- /** Merge two queries by OR-ing their items; either wildcard yields a wildcard. */
28
- const mergeQuery = (left, right) => {
29
- if (left.items.length === 0 || right.items.length === 0) {
30
- return WILDCARD;
31
- }
32
- return {
33
- items: [...left.items, ...right.items]
34
- };
35
- };
27
+ /**
28
+ * Merge two queries by OR-ing their items; either wildcard yields a wildcard.
29
+ *
30
+ * Every other key on either envelope is carried into the result. The grammar's
31
+ * envelope has no key but `items`, so anything else is a key the store boundary
32
+ * refuses (`servableQueryFault`); a merge that rebuilt the envelope from `items`
33
+ * alone would drop that key before the boundary saw it, and a slice composed with
34
+ * another would then have its smuggled predicate ignored in silence — the outcome
35
+ * the refusal exists to prevent.
36
+ */
37
+ const mergeQuery = (left, right) => ({
38
+ ...left,
39
+ ...right,
40
+ items: left.items.length === 0 || right.items.length === 0 ? WILDCARD.items : [...left.items, ...right.items]
41
+ });
36
42
  /**
37
43
  * OR-merge a list of queries into one. The empty list is the wildcard.
38
44
  *
@@ -1 +1 @@
1
- {"version":3,"file":"Projection.js","names":["_Query","require","WILDCARD","items","AnyProjection","exports","of","projection","mergeQuery","left","right","length","unionQueries","queries","reduce","acc","q","composeProjections","projections","keys","Object","initialState","fromEntries","map","key","mergedQuery","query","evolve","state","decoded","next","matchesSequenced","sequenced"],"sources":["../../src/Projection.ts"],"sourcesContent":[null],"mappings":";;;;;;AA4BA,IAAAA,MAAA,GAAAC,OAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,QAAQ,GAAU;EAAEC,KAAK,EAAE;AAAE,CAAE;AAqD9B,MAAMC,aAAa,GAAAC,OAAA,CAAAD,aAAA,GAAG;EAC3B;;;;;;;EAOAE,EAAE,EAAMC,UAAyB,IAC/BA;CACM;AAaV;AACA,MAAMC,UAAU,GAAGA,CAACC,IAAW,EAAEC,KAAY,KAAW;EACtD,IAAID,IAAI,CAACN,KAAK,CAACQ,MAAM,KAAK,CAAC,IAAID,KAAK,CAACP,KAAK,CAACQ,MAAM,KAAK,CAAC,EAAE;IACvD,OAAOT,QAAQ;EACjB;EACA,OAAO;IAAEC,KAAK,EAAE,CAAC,GAAGM,IAAI,CAACN,KAAK,EAAE,GAAGO,KAAK,CAACP,KAAK;EAAC,CAAE;AACnD,CAAC;AAED;;;;;;;;;;;;;;;AAeO,MAAMS,YAAY,GAAIC,OAA6B,IACxDA,OAAO,CAACF,MAAM,KAAK,CAAC,GAChBT,QAAQ,GACRW,OAAO,CAACC,MAAM,CAAC,CAACC,GAAG,EAAEC,CAAC,KAAKR,UAAU,CAACO,GAAG,EAAEC,CAAC,CAAC,CAAC;AAEpD;;;;;;;;;;;AAAAX,OAAA,CAAAO,YAAA,GAAAA,YAAA;AAWO,MAAMK,kBAAkB,GAC7BC,WAAc,IACmB;EACjC,MAAMC,IAAI,GAAGC,MAAM,CAACD,IAAI,CAACD,WAAW,CAAoC;EAExE,MAAMG,YAAY,GAAGD,MAAM,CAACE,WAAW,CACrCH,IAAI,CAACI,GAAG,CAAEC,GAAG,IAAK,CAACA,GAAG,EAAEN,WAAW,CAACM,GAAG,CAAC,CAACH,YAAY,CAAC,CAAC,CACnC;EAEtB,MAAMI,WAAW,GAAGb,YAAY,CAACO,IAAI,CAACI,GAAG,CAAEC,GAAG,IAAKN,WAAW,CAACM,GAAG,CAAC,CAACE,KAAK,CAAC,CAAC;EAE3E,OAAO;IACLL,YAAY;IACZK,KAAK,EAAED,WAAW;IAClBE,MAAM,EAAEA,CAACC,KAAK,EAAEC,OAAO,KAAI;MACzB,MAAMC,IAAI,GAAG;QAAE,GAAGF;MAAK,CAAuC;MAC9D,KAAK,MAAMJ,GAAG,IAAIL,IAAI,EAAE;QACtB,MAAMZ,UAAU,GAAGW,WAAW,CAACM,GAAG,CAAC;QACnC,IAAI,CAAC,IAAAO,uBAAgB,EAACF,OAAO,CAACG,SAAS,EAAEzB,UAAU,CAACmB,KAAK,CAAC,EAAE;UAC1D;QACF;QACAI,IAAI,CAACN,GAAG,CAAC,GAAGjB,UAAU,CAACoB,MAAM,CAACC,KAAK,CAACJ,GAAG,CAAC,EAAEK,OAAO,CAEhD;MACH;MACA,OAAOC,IAAI;IACb;GACD;AACH,CAAC;AAAAzB,OAAA,CAAAY,kBAAA,GAAAA,kBAAA","ignoreList":[]}
1
+ {"version":3,"file":"Projection.js","names":["_Query","require","WILDCARD","items","AnyProjection","exports","of","projection","mergeQuery","left","right","length","unionQueries","queries","reduce","acc","q","composeProjections","projections","keys","Object","initialState","fromEntries","map","key","mergedQuery","query","evolve","state","decoded","next","matchesSequenced","sequenced"],"sources":["../../src/Projection.ts"],"sourcesContent":[null],"mappings":";;;;;;AA4BA,IAAAA,MAAA,GAAAC,OAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,QAAQ,GAAU;EAAEC,KAAK,EAAE;AAAE,CAAE;AAqD9B,MAAMC,aAAa,GAAAC,OAAA,CAAAD,aAAA,GAAG;EAC3B;;;;;;;EAOAE,EAAE,EAAMC,UAAyB,IAC/BA;CACM;AAaV;;;;;;;;;;AAUA,MAAMC,UAAU,GAAGA,CAACC,IAAW,EAAEC,KAAY,MAAa;EACxD,GAAGD,IAAI;EACP,GAAGC,KAAK;EACRP,KAAK,EACHM,IAAI,CAACN,KAAK,CAACQ,MAAM,KAAK,CAAC,IAAID,KAAK,CAACP,KAAK,CAACQ,MAAM,KAAK,CAAC,GAC/CT,QAAQ,CAACC,KAAK,GACd,CAAC,GAAGM,IAAI,CAACN,KAAK,EAAE,GAAGO,KAAK,CAACP,KAAK;CACrC,CAAC;AAEF;;;;;;;;;;;;;;;AAeO,MAAMS,YAAY,GAAIC,OAA6B,IACxDA,OAAO,CAACF,MAAM,KAAK,CAAC,GAChBT,QAAQ,GACRW,OAAO,CAACC,MAAM,CAAC,CAACC,GAAG,EAAEC,CAAC,KAAKR,UAAU,CAACO,GAAG,EAAEC,CAAC,CAAC,CAAC;AAEpD;;;;;;;;;;;AAAAX,OAAA,CAAAO,YAAA,GAAAA,YAAA;AAWO,MAAMK,kBAAkB,GAC7BC,WAAc,IACmB;EACjC,MAAMC,IAAI,GAAGC,MAAM,CAACD,IAAI,CAACD,WAAW,CAAoC;EAExE,MAAMG,YAAY,GAAGD,MAAM,CAACE,WAAW,CACrCH,IAAI,CAACI,GAAG,CAAEC,GAAG,IAAK,CAACA,GAAG,EAAEN,WAAW,CAACM,GAAG,CAAC,CAACH,YAAY,CAAC,CAAC,CACnC;EAEtB,MAAMI,WAAW,GAAGb,YAAY,CAACO,IAAI,CAACI,GAAG,CAAEC,GAAG,IAAKN,WAAW,CAACM,GAAG,CAAC,CAACE,KAAK,CAAC,CAAC;EAE3E,OAAO;IACLL,YAAY;IACZK,KAAK,EAAED,WAAW;IAClBE,MAAM,EAAEA,CAACC,KAAK,EAAEC,OAAO,KAAI;MACzB,MAAMC,IAAI,GAAG;QAAE,GAAGF;MAAK,CAAuC;MAC9D,KAAK,MAAMJ,GAAG,IAAIL,IAAI,EAAE;QACtB,MAAMZ,UAAU,GAAGW,WAAW,CAACM,GAAG,CAAC;QACnC,IAAI,CAAC,IAAAO,uBAAgB,EAACF,OAAO,CAACG,SAAS,EAAEzB,UAAU,CAACmB,KAAK,CAAC,EAAE;UAC1D;QACF;QACAI,IAAI,CAACN,GAAG,CAAC,GAAGjB,UAAU,CAACoB,MAAM,CAACC,KAAK,CAACJ,GAAG,CAAC,EAAEK,OAAO,CAEhD;MACH;MACA,OAAOC,IAAI;IACb;GACD;AACH,CAAC;AAAAzB,OAAA,CAAAY,kBAAA,GAAAA,kBAAA","ignoreList":[]}
package/dist/cjs/Query.js CHANGED
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.servableQueryFault = exports.query = exports.matchesSequenced = exports.matchesQueryItem = exports.matchesQuery = exports.classifyServableQuery = exports.assertServableQuery = exports.QueryItem = exports.Query = void 0;
6
+ exports.unknownQueryKeyFault = exports.servableQueryFault = exports.query = exports.matchesSequenced = exports.matchesQueryItem = exports.matchesQuery = exports.classifyServableQuery = exports.assertServableQuery = exports.QueryItem = exports.Query = void 0;
7
7
  var _effect = require("effect");
8
8
  var _Event = require("./Event.js");
9
9
  /**
@@ -77,6 +77,9 @@ const matchesSequenced = (sequenced, query) => matchesQuery(sequenced.event, que
77
77
  * (`Query.ts` module docs) but which plain-data assembly — e.g. decision-model
78
78
  * composition, `Projection.ts:31-36` — can still bypass.
79
79
  *
80
+ * A query, or any of its items, carrying a key the grammar does not define is
81
+ * refused before anything else is judged (`unknownKeyFault` below says why).
82
+ *
80
83
  * The servable grammar is exactly one of:
81
84
  * - the wildcard (`items.length === 0`), which matches every event;
82
85
  * - a *single* item (`items.length === 1`), any types/tags, including a
@@ -103,6 +106,55 @@ const assertServableQuery = query => {
103
106
  throw new Error(fault);
104
107
  }
105
108
  };
109
+ /**
110
+ * The refusal of a key `schemaFields` does not define, or `undefined` when `value`
111
+ * carries none. `where` names the level for the message.
112
+ *
113
+ * ## Why an unknown key is refused rather than ignored
114
+ *
115
+ * A `Query` is plain data, so nothing at runtime stops a caller adding a key the
116
+ * grammar does not have — a `metadata` predicate on an item is the one this repo
117
+ * expects, since metadata is the field an author most plausibly wants to filter on
118
+ * and must not (ADR-0017). Ignored, that key is a predicate the author believes they
119
+ * wrote and no engine honours, and on the append side it is worse: the Postgres
120
+ * guard embeds its match as literal plpgsql text that no type reaches, so a key a
121
+ * read path one day learned to honour would still be dropped by the guard, and the
122
+ * optimistic-concurrency check would escape in silence. Refusing every key the
123
+ * grammar does not define closes that route — a SMUGGLED key — at the one boundary
124
+ * every engine shares, before any engine could disagree. "Every key" means every
125
+ * key `Object.keys` returns: an own, enumerable, string key, which is what a plain
126
+ * object literal or a spread builds. A symbol key, a non-enumerable key or an
127
+ * inherited one is not judged, and no engine reads one either. Core's own query
128
+ * merge (`unionQueries`, `composeProjections`) carries an envelope's unknown key
129
+ * into the merged query rather than dropping it, so composing slices cannot launder
130
+ * a smuggled key past this check.
131
+ *
132
+ * It does not close the neighbouring one, and cannot: a field ADDED to the grammar's
133
+ * schema is a known key from that edit on and passes here, while the plpgsql guard
134
+ * still has to be taught it by hand. That exposure is the Postgres guard's, and its
135
+ * own comment in that engine's DDL says so.
136
+ *
137
+ * The known keys are read off the SCHEMA's own `fields` rather than listed here, so
138
+ * a field added to the grammar is admitted by the same edit that adds it. Only key
139
+ * NAMES are judged: an exact-optional key written as `undefined` is a known key and
140
+ * passes, because which values a key admits is the type's business, not this rule's.
141
+ */
142
+ exports.assertServableQuery = assertServableQuery;
143
+ const unknownKeyFault = (where, value, schemaFields) => {
144
+ const unknown = Object.keys(value).find(key => !Object.hasOwn(schemaFields, key));
145
+ return unknown === undefined ? undefined : `assertServableQuery: ${where} carries the key ${JSON.stringify(unknown)}, which ` + 'the query grammar does not define; an unknown key would be silently ignored ' + 'by every engine rather than honoured, so it is refused';
146
+ };
147
+ /**
148
+ * The unknown-key half of `servableQueryFault`, on its own: the refusal of a key the
149
+ * grammar does not define on the envelope or on any item, or `undefined`.
150
+ *
151
+ * It is the same rule and not a second statement of it — `servableQueryFault` calls
152
+ * this first. It is exported because ONE caller has to tell the two halves apart:
153
+ * the codec's read ledger refuses an unservable SHAPE on its own error channel, and
154
+ * must not report an unknown key as one. An unknown key is not something a slice's
155
+ * tags can fix, so the ledger leaves it to the store, which refuses it as a defect.
156
+ */
157
+ const unknownQueryKeyFault = query => unknownKeyFault('a query', query, Query.fields) ?? query.items.reduce((fault, item) => fault ?? unknownKeyFault('a query item', item, QueryItem.fields), undefined);
106
158
  /**
107
159
  * The servable grammar as a TOTAL function: the reason `query` cannot be served,
108
160
  * or `undefined` when it can.
@@ -123,8 +175,12 @@ const assertServableQuery = query => {
123
175
  * side's own (`projectionWiringFault` returns `string | undefined` for the same
124
176
  * reason), so a fault is one exit route and one return type.
125
177
  */
126
- exports.assertServableQuery = assertServableQuery;
178
+ exports.unknownQueryKeyFault = unknownQueryKeyFault;
127
179
  const servableQueryFault = query => {
180
+ const unknownKey = unknownQueryKeyFault(query);
181
+ if (unknownKey !== undefined) {
182
+ return unknownKey;
183
+ }
128
184
  const {
129
185
  items
130
186
  } = query;
@@ -1 +1 @@
1
- {"version":3,"file":"Query.js","names":["_effect","require","_Event","QueryItem","exports","Schema","Struct","types","Array","EventType","tags","Tag","Query","items","matchesQueryItem","event","item","typeOk","length","includes","type","eventTags","Set","every","tag","has","matchesQuery","query","some","matchesSequenced","sequenced","assertServableQuery","fault","servableQueryFault","undefined","Error","classifyServableQuery","kind","only","Arr","isNonEmptyReadonlyArray","fields","all","or"],"sources":["../../src/Query.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"Query.js","names":["_effect","require","_Event","QueryItem","exports","Schema","Struct","types","Array","EventType","tags","Tag","Query","items","matchesQueryItem","event","item","typeOk","length","includes","type","eventTags","Set","every","tag","has","matchesQuery","query","some","matchesSequenced","sequenced","assertServableQuery","fault","servableQueryFault","undefined","Error","unknownKeyFault","where","value","schemaFields","unknown","Object","keys","find","key","hasOwn","JSON","stringify","unknownQueryKeyFault","fields","reduce","unknownKey","classifyServableQuery","kind","only","Arr","isNonEmptyReadonlyArray","all","or"],"sources":["../../src/Query.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -11,6 +11,67 @@ var _Event = require("./Event.js");
11
11
  var _errors = require("./errors.js");
12
12
  var _Query = require("./Query.js");
13
13
  var _SubscribeMachine = require("./SubscribeMachine.js");
14
+ /**
15
+ * A copy of `event` that shares no mutable structure with it: fresh `data` bytes, a
16
+ * fresh `tags` array, a fresh `metadata` bag and a fresh `occurredAt`. Only `type`
17
+ * and `uuid`, which are strings, are carried as they are.
18
+ *
19
+ * Each copy is chosen for what it does on EVERY input the type admits, not on the
20
+ * common one. `data` is copied through the `Uint8Array` constructor and not with
21
+ * `slice`, because `DcbEvent` admits any `Uint8Array` subclass and a subclass may
22
+ * answer `slice` with a VIEW of the same memory — Node's `Buffer` does. A
23
+ * `DateTime.Utc` is an ordinary object whose fields can be written past its
24
+ * `readonly` type, so `occurredAt` is rebuilt from its instant rather than shared.
25
+ *
26
+ * ## Why the oracle copies at BOTH edges
27
+ *
28
+ * This store is the reference the SQL engines are judged against, and a SQL engine
29
+ * shares nothing with its caller: it serialises on the way in and builds fresh objects
30
+ * on the way out. A store that kept the caller's objects instead would let a caller
31
+ * rewrite the log AFTER the append — mutate a `Uint8Array`, push to a `tags` array,
32
+ * assign into a `metadata` bag — and every later read would see the rewritten event
33
+ * with no append, no position and no wake behind it. A reference that can be edited
34
+ * after the fact judges nothing.
35
+ *
36
+ * So `append` stores a copy (the log never holds a caller's object) and every read
37
+ * path hands out a copy (a reader cannot reach the log through what it was given).
38
+ * Copying on the way in alone would close the first route and leave the second open:
39
+ * the same object would then be shared by every reader of the log.
40
+ */
41
+ const copyEvent = event => ({
42
+ type: event.type,
43
+ data: new Uint8Array(event.data),
44
+ tags: [...event.tags],
45
+ uuid: event.uuid,
46
+ occurredAt: _effect.DateTime.unsafeMake(_effect.DateTime.toEpochMillis(event.occurredAt)),
47
+ metadata: {
48
+ ...event.metadata
49
+ }
50
+ });
51
+ /**
52
+ * A copy of `query` that shares no array with it, taking only the keys the grammar
53
+ * defines.
54
+ *
55
+ * `subscribe` is the one verb that holds a query beyond its own call: the fetch seam
56
+ * judges it again on every page for as long as the subscription runs. Each SQL engine
57
+ * compiles its plan once, when the subscription starts, so an edit the caller makes
58
+ * to its own object afterwards reaches nothing there. The oracle has to answer the
59
+ * same, for the reason it copies events (above): a reference that the caller can
60
+ * change mid-stream judges nothing. Only `types` and `tags` are carried because they
61
+ * are all `matchesQueryItem` reads, and a key the grammar does not define was
62
+ * already refused at the contract decorator before this runs.
63
+ */
64
+ const copyQuery = query => ({
65
+ items: query.items.map(item => ({
66
+ types: [...item.types],
67
+ tags: [...item.tags]
68
+ }))
69
+ });
70
+ /** A `SequencedEvent` whose event is a `copyEvent` of the stored one. */
71
+ const copySequenced = sequenced => ({
72
+ event: copyEvent(sequenced.event),
73
+ position: sequenced.position
74
+ });
14
75
  /** Filter a snapshot by `query` and `after` (strict `position > after`). */
15
76
  const filterLog = (log, query, after) => log.filter(sequenced => (after === undefined || sequenced.position > after) && (0, _Query.matchesSequenced)(sequenced, query));
16
77
  /** The position of the last event in a slice, or `undefined` when empty. */
@@ -28,7 +89,7 @@ const readSnapshot = (log, query, options) => {
28
89
  // when there is nothing to report.
29
90
  const head = (options?.limit === undefined ? lastPosition(log) : lastPosition(limited)) ?? _Event.ORIGIN;
30
91
  return {
31
- events: _effect.Stream.fromIterable(limited),
92
+ events: _effect.Stream.fromIterable(limited.map(copySequenced)),
32
93
  head
33
94
  };
34
95
  };
@@ -80,7 +141,7 @@ const fetchPage = (log, query, from, limit) => {
80
141
  for (let index = firstIndexAfter(log, from); index < log.length && page.length < limit; index += 1) {
81
142
  const sequenced = log[index];
82
143
  if ((0, _Query.matchesSequenced)(sequenced, query)) {
83
- page.push(sequenced);
144
+ page.push(copySequenced(sequenced));
84
145
  }
85
146
  }
86
147
  return page;
@@ -105,45 +166,51 @@ const make = options => _effect.Effect.gen(function* () {
105
166
  // is reentrant, so append's inner read re-enters. Here append inlines the
106
167
  // read logic instead, so a plain lock suffices.
107
168
  mutex.withPermits(1)(_effect.Effect.map(_effect.Ref.get(log), snapshot => readSnapshot(snapshot, query, options)));
108
- const append = (events, condition) =>
109
- // Critical section: check + commit are atomic (the exactly-one-wins guarantee).
110
- mutex.withPermits(1)(_effect.Effect.gen(function* () {
111
- const snapshot = yield* _effect.Ref.get(log);
112
- if (condition !== undefined) {
113
- const conflicts = filterLog(snapshot, condition.failIfEventsMatch, condition.after);
114
- // Detect by presence: any matching event after `condition.after`
115
- // fails the append. The error carries only the condition (see
116
- // `AppendConditionFailed`); a correct retry re-reads to the new head.
117
- if (conflicts.length > 0) {
118
- return yield* new _errors.AppendConditionFailed({
119
- condition
120
- });
169
+ const append = (events, condition) => _effect.Effect.suspend(() => {
170
+ // The events are copied when the append STARTS, before it waits for the
171
+ // permit, as each SQL engine serialises them before its first suspension:
172
+ // an edit the caller makes while this append is queued must not reach the
173
+ // log here when it could not reach theirs.
174
+ const owned = events.map(copyEvent);
175
+ // Critical section: check + commit are atomic (the exactly-one-wins guarantee).
176
+ return mutex.withPermits(1)(_effect.Effect.gen(function* () {
177
+ const snapshot = yield* _effect.Ref.get(log);
178
+ if (condition !== undefined) {
179
+ const conflicts = filterLog(snapshot, condition.failIfEventsMatch, condition.after);
180
+ // Detect by presence: any matching event after `condition.after`
181
+ // fails the append. The error carries only the condition (see
182
+ // `AppendConditionFailed`); a correct retry re-reads to the new head.
183
+ if (conflicts.length > 0) {
184
+ return yield* new _errors.AppendConditionFailed({
185
+ condition
186
+ });
187
+ }
121
188
  }
122
- }
123
- // Optional test seam between the conflict-check and the commit (see
124
- // `InMemoryStoreOptions.beforeCommit`). Defaults to `Effect.void`, a
125
- // synchronous no-op, so the shipped critical section stays atomic by
126
- // construction; the concurrency contract test injects `Effect.yieldNow()`
127
- // here to make the exactly-one-wins guard genuinely depend on the mutex.
128
- yield* beforeCommit;
129
- const start = yield* _effect.Ref.get(nextPosition);
130
- const appended = events.map((event, index) => ({
131
- event,
132
- position: start + BigInt(index)
189
+ // Optional test seam between the conflict-check and the commit (see
190
+ // `InMemoryStoreOptions.beforeCommit`). Defaults to `Effect.void`, a
191
+ // synchronous no-op, so the shipped critical section stays atomic by
192
+ // construction; the concurrency contract test injects `Effect.yieldNow()`
193
+ // here to make the exactly-one-wins guard genuinely depend on the mutex.
194
+ yield* beforeCommit;
195
+ const start = yield* _effect.Ref.get(nextPosition);
196
+ const appended = owned.map((event, index) => ({
197
+ event,
198
+ position: start + BigInt(index)
199
+ }));
200
+ const end = start + BigInt(events.length);
201
+ yield* _effect.Ref.set(log, [...snapshot, ...appended]);
202
+ yield* _effect.Ref.set(nextPosition, end);
203
+ // The hub is a WAKE SOURCE and nothing else: the subscribe machine never
204
+ // reads what it carries, and its poll delivers with or without one. That
205
+ // is why suppressing the publish is a legitimate test seam rather than a
206
+ // broken store (see `InMemoryStoreOptions.suppressWake`).
207
+ if (!suppressWake) {
208
+ yield* _effect.PubSub.publishAll(hub, appended);
209
+ }
210
+ // `events` is non-empty, so the last new position is `end - 1`.
211
+ return end - 1n;
133
212
  }));
134
- const end = start + BigInt(events.length);
135
- yield* _effect.Ref.set(log, [...snapshot, ...appended]);
136
- yield* _effect.Ref.set(nextPosition, end);
137
- // The hub is a WAKE SOURCE and nothing else: the subscribe machine never
138
- // reads what it carries, and its poll delivers with or without one. That
139
- // is why suppressing the publish is a legitimate test seam rather than a
140
- // broken store (see `InMemoryStoreOptions.suppressWake`).
141
- if (!suppressWake) {
142
- yield* _effect.PubSub.publishAll(hub, appended);
143
- }
144
- // `events` is non-empty, so the last new position is `end - 1`.
145
- return end - 1n;
146
- }));
213
+ });
147
214
  const subscribe = (query, after) =>
148
215
  // Take the hub seat HERE, before handing the machine its wake source, so the
149
216
  // subscription is established no later than the machine's first `fetch`. That
@@ -159,9 +226,12 @@ const make = options => _effect.Effect.gen(function* () {
159
226
  // is nothing left here for a critical section to protect. `append` keeps its
160
227
  // permit, which is the whole exactly-one-wins guarantee.
161
228
  _effect.Stream.unwrapScoped(_effect.Effect.gen(function* () {
229
+ // Taken when the subscription starts, as the SQL engines compile theirs
230
+ // (see `copyQuery`).
231
+ const judged = copyQuery(query);
162
232
  const wakes = yield* _effect.PubSub.subscribe(hub);
163
233
  return (0, _SubscribeMachine.subscribeStream)({
164
- fetch: (from, limit) => _effect.Effect.map(_effect.Ref.get(log), snapshot => fetchPage(snapshot, query, from, limit)),
234
+ fetch: (from, limit) => _effect.Effect.map(_effect.Ref.get(log), snapshot => fetchPage(snapshot, judged, from, limit)),
165
235
  listen: _effect.Stream.fromQueue(wakes),
166
236
  pollInterval,
167
237
  catchUpPageSize
@@ -1 +1 @@
1
- {"version":3,"file":"inMemory.js","names":["_effect","require","_ContractStore","_DcbEventStore","_Event","_errors","_Query","_SubscribeMachine","filterLog","log","query","after","filter","sequenced","undefined","position","matchesSequenced","lastPosition","events","at","readSnapshot","options","matched","limited","limit","slice","head","ORIGIN","Stream","fromIterable","firstIndexAfter","low","high","length","mid","fetchPage","from","page","index","push","make","Effect","gen","beforeCommit","void","suppressWake","catchUpPageSize","DEFAULT_CATCH_UP_PAGE_SIZE","pollInterval","DEFAULT_POLL_INTERVAL_MILLIS","Ref","mutex","makeSemaphore","hub","PubSub","unbounded","nextPosition","read","withPermits","map","get","snapshot","append","condition","conflicts","failIfEventsMatch","AppendConditionFailed","start","appended","event","BigInt","end","set","publishAll","subscribe","unwrapScoped","wakes","subscribeStream","fetch","listen","fromQueue","DcbEventStoreInMemory","exports","Layer","effect","DcbEventStore","makeContractStore","makeInMemoryTestLayer"],"sources":["../../src/inMemory.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"inMemory.js","names":["_effect","require","_ContractStore","_DcbEventStore","_Event","_errors","_Query","_SubscribeMachine","copyEvent","event","type","data","Uint8Array","tags","uuid","occurredAt","DateTime","unsafeMake","toEpochMillis","metadata","copyQuery","query","items","map","item","types","copySequenced","sequenced","position","filterLog","log","after","filter","undefined","matchesSequenced","lastPosition","events","at","readSnapshot","options","matched","limited","limit","slice","head","ORIGIN","Stream","fromIterable","firstIndexAfter","low","high","length","mid","fetchPage","from","page","index","push","make","Effect","gen","beforeCommit","void","suppressWake","catchUpPageSize","DEFAULT_CATCH_UP_PAGE_SIZE","pollInterval","DEFAULT_POLL_INTERVAL_MILLIS","Ref","mutex","makeSemaphore","hub","PubSub","unbounded","nextPosition","read","withPermits","get","snapshot","append","condition","suspend","owned","conflicts","failIfEventsMatch","AppendConditionFailed","start","appended","BigInt","end","set","publishAll","subscribe","unwrapScoped","judged","wakes","subscribeStream","fetch","listen","fromQueue","DcbEventStoreInMemory","exports","Layer","effect","DcbEventStore","makeContractStore","makeInMemoryTestLayer"],"sources":["../../src/inMemory.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -11,7 +11,9 @@
11
11
  * needing a bespoke `catchAll`/`instanceof`:
12
12
  *
13
13
  * - `assertServableQuery` at every verb's entry (read, the append condition's
14
- * guard query, subscribe) — a non-servable query is a DEFECT in every engine;
14
+ * guard query, subscribe) — a non-servable query, or one carrying a key the
15
+ * grammar does not define, is a DEFECT in every engine, and an append condition
16
+ * carrying a key `AppendCondition` does not define is refused alongside it;
15
17
  * - `ReadLimit` decode on `read`'s `limit` — a negative/non-integer limit is a
16
18
  * DEFECT (so `read` keeps `E = never`), validated through the branded schema
17
19
  * even at an untyped boundary that reaches the store as `unknown`;
@@ -34,7 +36,7 @@
34
36
  */
35
37
  import type { Array as Arr, Scope } from 'effect';
36
38
  import { Effect, Stream } from 'effect';
37
- import type { AppendCondition } from './AppendCondition.js';
39
+ import { AppendCondition } from './AppendCondition.js';
38
40
  import type { DcbEventStore, ReadOptions, ReadResponse } from './DcbEventStore.js';
39
41
  import type { DcbEvent, Position, SequencedEvent } from './Event.js';
40
42
  import type { AppendConditionFailed } from './errors.js';
@@ -1 +1 @@
1
- {"version":3,"file":"ContractStore.d.ts","sourceRoot":"","sources":["../../src/ContractStore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,OAAO,KAAK,EAAE,KAAK,IAAI,GAAG,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AACjD,OAAO,EAAE,MAAM,EAAqB,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAExD,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC/E,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAEjE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAA;AACrD,OAAO,EAAuB,KAAK,KAAK,EAAE,MAAM,SAAS,CAAA;AAKzD;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB,CAAC,CAAC;IACjC,QAAQ,CAAC,IAAI,EAAE,CACb,KAAK,EAAE,KAAK,EACZ,OAAO,CAAC,EAAE,WAAW,KAClB,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,CAAA;IACnC,QAAQ,CAAC,MAAM,EAAE,CACf,MAAM,EAAE,GAAG,CAAC,qBAAqB,CAAC,QAAQ,CAAC,EAC3C,SAAS,CAAC,EAAE,eAAe,KACxB,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,qBAAqB,GAAG,CAAC,CAAC,CAAA;IACvD,QAAQ,CAAC,SAAS,EAAE,CAClB,KAAK,EAAE,KAAK,EACZ,KAAK,CAAC,EAAE,QAAQ,KACb,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;CACnD;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAI,CAAC,EACjC,KAAK,gBAAgB,CAAC,CAAC,CAAC,KACvB,aAAa,CAAC,MAAM,CAsFrB,CAAA"}
1
+ {"version":3,"file":"ContractStore.d.ts","sourceRoot":"","sources":["../../src/ContractStore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,OAAO,KAAK,EAAE,KAAK,IAAI,GAAG,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AACjD,OAAO,EAAE,MAAM,EAAqB,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAEnD,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC/E,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAEjE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAA;AACrD,OAAO,EAAuB,KAAK,KAAK,EAAE,MAAM,SAAS,CAAA;AAKzD;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB,CAAC,CAAC;IACjC,QAAQ,CAAC,IAAI,EAAE,CACb,KAAK,EAAE,KAAK,EACZ,OAAO,CAAC,EAAE,WAAW,KAClB,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,CAAA;IACnC,QAAQ,CAAC,MAAM,EAAE,CACf,MAAM,EAAE,GAAG,CAAC,qBAAqB,CAAC,QAAQ,CAAC,EAC3C,SAAS,CAAC,EAAE,eAAe,KACxB,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,qBAAqB,GAAG,CAAC,CAAC,CAAA;IACvD,QAAQ,CAAC,SAAS,EAAE,CAClB,KAAK,EAAE,KAAK,EACZ,KAAK,CAAC,EAAE,QAAQ,KACb,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;CACnD;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAI,CAAC,EACjC,KAAK,gBAAgB,CAAC,CAAC,CAAC,KACvB,aAAa,CAAC,MAAM,CAoGrB,CAAA"}