@rotorsoft/act 0.26.0 → 0.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -286,6 +286,25 @@ export interface Store extends Disposable {
286
286
  }>) => Promise<Array<Lease & {
287
287
  error: string;
288
288
  }>>;
289
+ /**
290
+ * Resets watermarks for the given streams to -1, making them eligible
291
+ * for replay from the beginning. Also clears retry, blocked, error,
292
+ * and lease state so the streams can be claimed immediately.
293
+ *
294
+ * Used by `Act.rebuild()` to replay events through updated projections.
295
+ *
296
+ * @param streams - Stream names to reset
297
+ * @returns Count of streams that were actually reset
298
+ *
299
+ * @example
300
+ * ```typescript
301
+ * const count = await store().reset(["my-projection"]);
302
+ * console.log(`Reset ${count} streams for replay`);
303
+ * ```
304
+ *
305
+ * @see {@link Act.rebuild} for the high-level rebuild API
306
+ */
307
+ reset: (streams: string[]) => Promise<number>;
289
308
  }
290
309
  /**
291
310
  * A cached snapshot entry for a stream.
@@ -1 +1 @@
1
- {"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../../../src/types/ports.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../../../src/types/ports.ts"],"names":[],"mappings":"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"}
package/dist/index.cjs CHANGED
@@ -379,7 +379,7 @@ var InMemoryStream = class {
379
379
  _error = "";
380
380
  _leased_by = void 0;
381
381
  _leased_until = void 0;
382
- get is_avaliable() {
382
+ get is_available() {
383
383
  return !this._blocked && (!this._leased_until || this._leased_until <= /* @__PURE__ */ new Date());
384
384
  }
385
385
  get at() {
@@ -446,6 +446,17 @@ var InMemoryStream = class {
446
446
  };
447
447
  }
448
448
  }
449
+ /**
450
+ * Reset this stream's watermark and state for replay.
451
+ */
452
+ reset() {
453
+ this._at = -1;
454
+ this._retry = 0;
455
+ this._blocked = false;
456
+ this._error = "";
457
+ this._leased_by = void 0;
458
+ this._leased_until = void 0;
459
+ }
449
460
  };
450
461
  var InMemoryStore = class {
451
462
  // stored events
@@ -573,7 +584,7 @@ var InMemoryStore = class {
573
584
  async claim(lagging, leading, by, millis) {
574
585
  await sleep();
575
586
  const available = [...this._streams.values()].filter(
576
- (s) => s.is_avaliable && (s.at < 0 || this._events.some(
587
+ (s) => s.is_available && (s.at < 0 || this._events.some(
577
588
  (e) => e.id > s.at && e.name !== SNAP_EVENT && (!s.source || RegExp(s.source).test(e.stream))
578
589
  ))
579
590
  );
@@ -636,6 +647,24 @@ var InMemoryStore = class {
636
647
  await sleep();
637
648
  return leases.map((l) => this._streams.get(l.stream)?.block(l, l.error)).filter((l) => !!l);
638
649
  }
650
+ /**
651
+ * Reset watermarks for the given streams to -1, clearing retry, blocked,
652
+ * error, and lease state so they can be replayed from the beginning.
653
+ * @param streams - Stream names to reset.
654
+ * @returns Count of streams that were actually reset.
655
+ */
656
+ async reset(streams) {
657
+ await sleep();
658
+ let count = 0;
659
+ for (const name of streams) {
660
+ const s = this._streams.get(name);
661
+ if (s) {
662
+ s.reset();
663
+ count++;
664
+ }
665
+ }
666
+ return count;
667
+ }
639
668
  };
640
669
 
641
670
  // src/ports.ts
@@ -817,7 +846,7 @@ async function action(me, action2, target, payload, reactingTo, skipValidation =
817
846
  if (!stream) throw new Error("Missing target stream");
818
847
  payload = skipValidation ? payload : validate(action2, payload, me.actions[action2]);
819
848
  const snapshot = await load(me, stream);
820
- const expected = expectedVersion || snapshot.event?.version;
849
+ const expected = expectedVersion ?? snapshot.event?.version;
821
850
  logger2.trace(
822
851
  payload,
823
852
  `\u{1F535} ${stream}.${action2}${typeof expected === "number" ? `.${expected}` : ""}`
@@ -876,7 +905,7 @@ async function action(me, action2, target, payload, reactingTo, skipValidation =
876
905
  );
877
906
  } catch (error) {
878
907
  if (error.name === "ERR_CONCURRENCY") {
879
- void cache().invalidate(stream);
908
+ await cache().invalidate(stream);
880
909
  }
881
910
  throw error;
882
911
  }
@@ -1727,7 +1756,11 @@ function registerState(state2, states, actions, events) {
1727
1756
  patch: mergedPatch,
1728
1757
  on: { ...existing.on, ...state2.on },
1729
1758
  given: { ...existing.given, ...state2.given },
1730
- snap: state2.snap || existing.snap
1759
+ snap: state2.snap && existing.snap && state2.snap !== existing.snap ? (() => {
1760
+ throw new Error(
1761
+ `Duplicate snap strategy for state "${state2.name}"`
1762
+ );
1763
+ })() : state2.snap || existing.snap
1731
1764
  };
1732
1765
  states.set(state2.name, merged);
1733
1766
  for (const name of Object.keys(merged.actions)) {
@@ -1842,19 +1875,22 @@ function act(states = /* @__PURE__ */ new Map(), registry = {
1842
1875
  maxRetries: options?.maxRetries ?? 3
1843
1876
  }
1844
1877
  };
1845
- const name = handler.name || `${String(event)}_${registry.events[event].reactions.size}`;
1846
- registry.events[event].reactions.set(name, reaction);
1878
+ if (!handler.name)
1879
+ throw new Error(
1880
+ `Reaction handler for "${String(event)}" must be a named function`
1881
+ );
1882
+ registry.events[event].reactions.set(handler.name, reaction);
1847
1883
  return {
1848
1884
  ...builder,
1849
1885
  to(resolver) {
1850
- registry.events[event].reactions.set(name, {
1886
+ registry.events[event].reactions.set(handler.name, {
1851
1887
  ...reaction,
1852
1888
  resolver: typeof resolver === "string" ? { target: resolver } : resolver
1853
1889
  });
1854
1890
  return builder;
1855
1891
  },
1856
1892
  void() {
1857
- registry.events[event].reactions.set(name, {
1893
+ registry.events[event].reactions.set(handler.name, {
1858
1894
  ...reaction,
1859
1895
  resolver: _void_
1860
1896
  });
@@ -1907,20 +1943,23 @@ function _projection(target, events) {
1907
1943
  }
1908
1944
  };
1909
1945
  const register = events[event];
1910
- const name = handler.name || `${event}_${register.reactions.size}`;
1911
- register.reactions.set(name, reaction);
1946
+ if (!handler.name)
1947
+ throw new Error(
1948
+ `Projection handler for "${event}" must be a named function`
1949
+ );
1950
+ register.reactions.set(handler.name, reaction);
1912
1951
  const nextBuilder = _projection(target, events);
1913
1952
  return {
1914
1953
  ...nextBuilder,
1915
1954
  to(resolver) {
1916
- register.reactions.set(name, {
1955
+ register.reactions.set(handler.name, {
1917
1956
  ...reaction,
1918
1957
  resolver: typeof resolver === "string" ? { target: resolver } : resolver
1919
1958
  });
1920
1959
  return nextBuilder;
1921
1960
  },
1922
1961
  void() {
1923
- register.reactions.set(name, {
1962
+ register.reactions.set(handler.name, {
1924
1963
  ...reaction,
1925
1964
  resolver: _void_
1926
1965
  });
@@ -1987,19 +2026,22 @@ function slice(states = /* @__PURE__ */ new Map(), actions = {}, events = {}, pr
1987
2026
  maxRetries: options?.maxRetries ?? 3
1988
2027
  }
1989
2028
  };
1990
- const name = handler.name || `${String(event)}_${events[event].reactions.size}`;
1991
- events[event].reactions.set(name, reaction);
2029
+ if (!handler.name)
2030
+ throw new Error(
2031
+ `Reaction handler for "${String(event)}" must be a named function`
2032
+ );
2033
+ events[event].reactions.set(handler.name, reaction);
1992
2034
  return {
1993
2035
  ...builder,
1994
2036
  to(resolver) {
1995
- events[event].reactions.set(name, {
2037
+ events[event].reactions.set(handler.name, {
1996
2038
  ...reaction,
1997
2039
  resolver: typeof resolver === "string" ? { target: resolver } : resolver
1998
2040
  });
1999
2041
  return builder;
2000
2042
  },
2001
2043
  void() {
2002
- events[event].reactions.set(name, {
2044
+ events[event].reactions.set(handler.name, {
2003
2045
  ...reaction,
2004
2046
  resolver: _void_
2005
2047
  });