@toa.io/extensions.convergence 1.0.0-alpha.321 → 1.0.0-alpha.322

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@toa.io/extensions.convergence",
3
- "version": "1.0.0-alpha.321",
3
+ "version": "1.0.0-alpha.322",
4
4
  "type": "module",
5
5
  "description": "Toa Convergence extension",
6
6
  "author": "temich <tema.gurtovoy@gmail.com>",
@@ -28,11 +28,11 @@
28
28
  "transpile": "tsc"
29
29
  },
30
30
  "dependencies": {
31
- "@toa.io/core": "1.0.0-alpha.321",
32
- "@toa.io/definitions": "1.0.0-alpha.321",
31
+ "@toa.io/core": "1.0.0-alpha.322",
32
+ "@toa.io/definitions": "1.0.0-alpha.322",
33
33
  "@toa.io/generic": "1.0.0-alpha.311",
34
34
  "@toa.io/pointer": "1.0.0-alpha.311",
35
35
  "openspan": "1.0.0-alpha.305"
36
36
  },
37
- "gitHead": "fa850e861a0c748d7364ccf7c8a09ce26973fc04"
37
+ "gitHead": "ef65352a8bd7bc0ef400fcc8cde0e19a3bb92199"
38
38
  }
package/readme.md CHANGED
@@ -133,6 +133,10 @@ go is logged rather than dropped in silence.
133
133
  value, and the record that arrives second cannot be stored at all. It is logged and dropped;
134
134
  redelivery would not help.
135
135
 
136
+ **[`once`](/documentation/inbox.md) holds within a region.** A duplicate is answered with the
137
+ first reply where it arrives in the region that made the call, and made again where it arrives in
138
+ another, so a caller that retries against a different region is not deduplicated.
139
+
136
140
  ## What a record carries
137
141
 
138
142
  [`REGION`](/documentation/component/declaration.md#entity) is which region wrote a record, as
@@ -1,7 +1,16 @@
1
1
  import { Connector } from '@toa.io/core';
2
2
  import type { Readable } from 'node:stream';
3
3
  import type { Connector as Link, Locator } from '@toa.io/core';
4
- import type { bindings, outbox, storages } from '@toa.io/core/types';
4
+ import type { bindings, inbox, outbox, storages } from '@toa.io/core/types';
5
+ /**
6
+ * Every member of `T`, the optional ones included, each as `T` types it. A member of the storage
7
+ * this does not delegate is lost to every component that converges, and nothing says so — an
8
+ * optional one is not required by `implements storages.Storage`, and the inbox went missing that
9
+ * way.
10
+ */
11
+ type Whole<T> = {
12
+ [K in keyof Required<T>]: T[K];
13
+ };
5
14
  /**
6
15
  * A record from another region is written as it stands: its version, its timestamps, its
7
16
  * region. That is neither a transition nor an assignment — it is not this region's version to
@@ -11,7 +20,7 @@ import type { bindings, outbox, storages } from '@toa.io/core/types';
11
20
  * Everything else it delegates. It decorates the storage because that is where a handle to one
12
21
  * is, not because it changes anything a component reads or writes.
13
22
  */
14
- export declare class Converging extends Connector implements storages.Storage, bindings.Inbound {
23
+ export declare class Converging extends Connector implements Whole<storages.Storage>, bindings.Inbound {
15
24
  private readonly storage;
16
25
  private readonly locator;
17
26
  private readonly subscribe;
@@ -27,14 +36,17 @@ export declare class Converging extends Connector implements storages.Storage, b
27
36
  protected open(): Promise<void>;
28
37
  get raw(): unknown;
29
38
  get outbox(): storages.Storage['outbox'];
39
+ get inbox(): storages.Storage['inbox'];
40
+ get claims(): boolean | undefined;
30
41
  get migrates(): boolean | undefined;
31
42
  get converges(): boolean | undefined;
32
43
  get(query: storages.Query): Promise<storages.Record | null>;
33
44
  find(query: storages.Query): Promise<storages.Record[]>;
34
45
  stream(query?: storages.Query): Promise<Readable>;
35
- store(record: storages.Record, row?: outbox.Row): Promise<boolean>;
46
+ store(record: storages.Record, row?: outbox.Row, call?: inbox.Call): Promise<boolean>;
36
47
  massStore(records: storages.Record[], rows?: outbox.Row[]): Promise<boolean>;
37
- upsert(query: storages.Query, changeset: object, row?: outbox.Row): Promise<storages.Record | null>;
38
- ensure(query: storages.Query | undefined, properties: object, record: storages.Record, row?: outbox.Row): Promise<storages.Record>;
48
+ upsert(query: storages.Query, changeset: object, row?: outbox.Row, call?: inbox.Call): Promise<storages.Record | null>;
49
+ ensure(query: storages.Query | undefined, properties: object, record: storages.Record, row?: outbox.Row, call?: inbox.Call): Promise<storages.Record>;
39
50
  converge(record: storages.Record): Promise<boolean>;
40
51
  }
52
+ export {};
@@ -100,6 +100,12 @@ export class Converging extends Connector {
100
100
  get outbox() {
101
101
  return this.storage.outbox;
102
102
  }
103
+ get inbox() {
104
+ return this.storage.inbox;
105
+ }
106
+ get claims() {
107
+ return this.storage.claims;
108
+ }
103
109
  get migrates() {
104
110
  return this.storage.migrates;
105
111
  }
@@ -115,18 +121,19 @@ export class Converging extends Connector {
115
121
  async stream(query) {
116
122
  return this.storage.stream(query);
117
123
  }
118
- async store(record, row) {
119
- return this.storage.store(record, row);
124
+ async store(record, row, call) {
125
+ return this.storage.store(record, row, call);
120
126
  }
121
127
  async massStore(records, rows) {
122
128
  return this.storage.massStore(records, rows);
123
129
  }
124
- async upsert(query, changeset, row) {
125
- return this.storage.upsert(query, changeset, row);
130
+ // eslint-disable-next-line max-params
131
+ async upsert(query, changeset, row, call) {
132
+ return this.storage.upsert(query, changeset, row, call);
126
133
  }
127
134
  // eslint-disable-next-line max-params
128
- async ensure(query, properties, record, row) {
129
- return this.storage.ensure(query, properties, record, row);
135
+ async ensure(query, properties, record, row, call) {
136
+ return this.storage.ensure(query, properties, record, row, call);
130
137
  }
131
138
  async converge(record) {
132
139
  return this.storage.converge(record);
@@ -1 +1 @@
1
- {"version":3,"file":"Storage.js","sourceRoot":"","sources":["../source/Storage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Storage.js","sourceRoot":"","sources":["../source/Storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAoB,MAAM,UAAU,CAAA;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,4CAA4C,CAAA;AAKpE,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAU1C;;;;;;;;GAQG;AACH,MAAM,OAAO,UAAW,SAAQ,SAAS;IACtB,OAAO,CAAkB;IACzB,OAAO,CAAS;IAChB,SAAS,CAA2C;IACpD,QAAQ,CAAmC;IAC3C,QAAQ,CAAa;IACrB,UAAU,CAAa;IAExC,sCAAsC;IACtC,YACE,OAAyB,EACzB,OAAgB,EAChB,OAAkD,EAClD,QAAQ,GAAsC,GAAG,EAAE,CAAC,SAAS;QAE7D,KAAK,EAAE,CAAA;QAEP,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,IAAI,CAAC,SAAS,GAAG,OAAO,CAAA;QACxB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QAExB,yFAAyF;QACzF,6BAA6B;QAC7B,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QAErB,IAAI,CAAC,QAAQ,GAAG;YACd,IAAI,EAAE,GAAG,OAAO,UAAU;YAC1B,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,OAAO;YAChB,UAAU,EAAE,EAAE,4BAA4B,EAAE,OAAO,EAAE;SACtD,CAAA;QAED,IAAI,CAAC,UAAU,GAAG;YAChB,IAAI,EAAE,GAAG,OAAO,UAAU;YAC1B,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,OAAO,CAAC,EAAE;YACnB,UAAU,EAAE,EAAE,4BAA4B,EAAE,OAAO,EAAE;SACtD,CAAA;IACH,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,MAAM,CAAC,OAAe;QACjC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,OAAkB,CAAA;QAErD;;;;;;WAMG;QACH,IAAK,MAA0B,CAAC,MAAM,KAAK,MAAM;YAC/C,OAAO,CAAC,KAAK,CAAC,yDAAyD,EAAE;gBACvE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE;gBAC1B,MAAM,EAAE,MAAM;aACf,CAAC,CAAA;QAEJ,MAAM,MAAM,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAEzD,MAAM,IAAI,GAAG,KAAK,IAAmB,EAAE,CACrC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE,CACrC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE;YACvC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,QAAS,CAAC,MAAyB,CAAC,CAAA;YAEvE,MAAM,CACH,MAA0B,CAAC,MAAM,EAClC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,EAC5B,MAA0B,CAAC,OAAO,CACpC,CAAA;YAED,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE;gBACrC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE;gBAC1B,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO;aACvC,CAAC,CAAA;YAEF;;;;eAIG;YACH,IAAI,OAAO,KAAK,SAAS;gBAAE,MAAM,IAAI,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;QACnE,CAAC,CAAC,CACH,CAAA;QAEH,IAAI,MAAM,KAAK,IAAI;YAAE,MAAM,IAAI,EAAE,CAAA;;YAC5B,MAAM,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IAC9B,CAAC;IAEkB,KAAK,CAAC,IAAI;QAC3B;;;;WAIG;QACH,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS;YACnC,MAAM,IAAI,KAAK,CACb,cAAc,IAAI,CAAC,OAAO,CAAC,EAAE,gDAAgD,CAC9E,CAAA;QAEH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;QAE1C,MAAM,OAAO,CAAC,OAAO,EAAE,CAAA;QAEvB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IACvB,CAAC;IAED,mBAAmB;IAEnB,IAAW,GAAG;QACZ,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAA;IACzB,CAAC;IAED,IAAW,MAAM;QACf,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAA;IAC5B,CAAC;IAED,IAAW,KAAK;QACd,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAA;IAC3B,CAAC;IAED,IAAW,MAAM;QACf,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAA;IAC5B,CAAC;IAED,IAAW,QAAQ;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAA;IAC9B,CAAC;IAED,IAAW,SAAS;QAClB,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAA;IAC/B,CAAC;IAEM,KAAK,CAAC,GAAG,CAAC,KAAqB;QACpC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IAChC,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,KAAqB;QACrC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACjC,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,KAAsB;QACxC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACnC,CAAC;IAEM,KAAK,CAAC,KAAK,CAChB,MAAuB,EACvB,GAAgB,EAChB,IAAiB;QAEjB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;IAC9C,CAAC;IAEM,KAAK,CAAC,SAAS,CACpB,OAA0B,EAC1B,IAAmB;QAEnB,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;IAC9C,CAAC;IAED,sCAAsC;IAC/B,KAAK,CAAC,MAAM,CACjB,KAAqB,EACrB,SAAiB,EACjB,GAAgB,EAChB,IAAiB;QAEjB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;IACzD,CAAC;IAED,sCAAsC;IAC/B,KAAK,CAAC,MAAM,CACjB,KAAiC,EACjC,UAAkB,EAClB,MAAuB,EACvB,GAAgB,EAChB,IAAiB;QAEjB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;IAClE,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,MAAuB;QAC3C,OAAO,IAAI,CAAC,OAAO,CAAC,QAAS,CAAC,MAAM,CAAC,CAAA;IACvC,CAAC;CAGF;AAED,8EAA8E;AAC9E,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAA"}