@rotorsoft/act 0.32.3 → 0.32.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.
@@ -1 +1 @@
1
- {"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../../src/ports.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAI5D,OAAO,KAAK,EACV,KAAK,EACL,UAAU,EACV,QAAQ,EACR,MAAM,EACN,KAAK,EACN,MAAM,kBAAkB,CAAC;AAE1B;;;;;;;;;;;;;GAaG;AAEH;;GAEG;AACH,eAAO,MAAM,SAAS,4BAA6B,CAAC;AAEpD;;;;;GAKG;AACH,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;AAMlD;;;GAGG;AACH,KAAK,QAAQ,CAAC,IAAI,SAAS,UAAU,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,KAAK,IAAI,CAAC;AAKlE;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,IAAI,CAAC,IAAI,SAAS,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,IACnD,UAAU,IAAI,KAAG,IAAI,CAQvC;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,eAAO,MAAM,GAAG,0EASd,CAAC;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,eAAO,MAAM,KAAK,wCAEhB,CAAC;AAEH;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,KAAK,wCAEhB,CAAC;AASH;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,cAAc,CAAC,IAAI,GAAE,QAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAe3E;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,OAAO,CACrB,QAAQ,CAAC,EAAE,QAAQ,GAClB,CAAC,IAAI,CAAC,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAGpC;AAMD;;;;GAIG;AACH,eAAO,MAAM,UAAU,iBAAiB,CAAC;AAEzC;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,kBAAkB,CAAC"}
1
+ {"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../../src/ports.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAI5D,OAAO,KAAK,EACV,KAAK,EACL,UAAU,EACV,QAAQ,EACR,MAAM,EACN,KAAK,EACN,MAAM,kBAAkB,CAAC;AAE1B;;;;;;;;;;;;;GAaG;AAEH;;GAEG;AACH,eAAO,MAAM,SAAS,4BAA6B,CAAC;AAEpD;;;;;GAKG;AACH,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;AAMlD;;;GAGG;AACH,KAAK,QAAQ,CAAC,IAAI,SAAS,UAAU,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,KAAK,IAAI,CAAC;AAKlE;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,IAAI,CAAC,IAAI,SAAS,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,IACnD,UAAU,IAAI,KAAG,IAAI,CAWvC;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,eAAO,MAAM,GAAG,0EASd,CAAC;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,eAAO,MAAM,KAAK,wCAEhB,CAAC;AAEH;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,KAAK,wCAEhB,CAAC;AASH;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,cAAc,CAAC,IAAI,GAAE,QAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAe3E;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,OAAO,CACrB,QAAQ,CAAC,EAAE,QAAQ,GAClB,CAAC,IAAI,CAAC,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAGpC;AAMD;;;;GAIG;AACH,eAAO,MAAM,UAAU,iBAAiB,CAAC;AAEzC;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,kBAAkB,CAAC"}
package/dist/index.cjs CHANGED
@@ -345,12 +345,19 @@ var BaseSchema = PackageSchema.extend({
345
345
  });
346
346
  var { NODE_ENV, LOG_LEVEL, LOG_SINGLE_LINE, SLEEP_MS } = process.env;
347
347
  var env = NODE_ENV || "development";
348
- var logLevel = LOG_LEVEL || (NODE_ENV === "test" ? "error" : NODE_ENV === "production" ? "info" : "trace");
348
+ var logLevel = LOG_LEVEL || (NODE_ENV === "test" ? "fatal" : NODE_ENV === "production" ? "info" : "trace");
349
349
  var logSingleLine = (LOG_SINGLE_LINE || "true") === "true";
350
350
  var sleepMs = parseInt(NODE_ENV === "test" ? "0" : SLEEP_MS ?? "100", 10);
351
351
  var pkg = getPackage();
352
+ var _validated;
352
353
  var config = () => {
353
- return extend({ ...pkg, env, logLevel, logSingleLine, sleepMs }, BaseSchema);
354
+ if (!_validated) {
355
+ _validated = extend(
356
+ { ...pkg, env, logLevel, logSingleLine, sleepMs },
357
+ BaseSchema
358
+ );
359
+ }
360
+ return _validated;
354
361
  };
355
362
 
356
363
  // src/utils.ts
@@ -773,7 +780,7 @@ function port(injector) {
773
780
  if (!adapters.has(injector.name)) {
774
781
  const injected = injector(adapter);
775
782
  adapters.set(injector.name, injected);
776
- console.log(`[act] + ${injector.name}:${injected.constructor.name}`);
783
+ log().info(`[act] + ${injector.name}:${injected.constructor.name}`);
777
784
  }
778
785
  return adapters.get(injector.name);
779
786
  };
@@ -799,7 +806,7 @@ async function disposeAndExit(code = "EXIT") {
799
806
  }
800
807
  for (const adapter of [...adapters.values()].reverse()) {
801
808
  await adapter.dispose();
802
- console.log(`[act] - ${adapter.constructor.name}`);
809
+ log().info(`[act] - ${adapter.constructor.name}`);
803
810
  }
804
811
  adapters.clear();
805
812
  config().env !== "test" && process.exit(code === "ERROR" ? 1 : 0);
@@ -1117,6 +1124,18 @@ async function action(me, action2, target, payload, reactingTo, skipValidation =
1117
1124
  }
1118
1125
 
1119
1126
  // src/internal/tracing.ts
1127
+ var PRETTY = config().env !== "production";
1128
+ var C_BLUE = "\x1B[38;5;39m";
1129
+ var C_ORANGE = "\x1B[38;5;208m";
1130
+ var C_GREEN = "\x1B[38;5;42m";
1131
+ var C_MAGENTA = "\x1B[38;5;165m";
1132
+ var C_DRAIN = "\x1B[38;5;244m";
1133
+ var C_RESET = "\x1B[0m";
1134
+ var es_caption = (caption, color, body) => PRETTY ? `${color}${body}${C_RESET}` : `${caption}: ${body}`;
1135
+ var drain_caption = (caption) => {
1136
+ const tag = `>> ${caption}`;
1137
+ return PRETTY ? `${C_DRAIN}${tag}${C_RESET}` : tag;
1138
+ };
1120
1139
  var traced = (inner, exit, entry) => (async (...args) => {
1121
1140
  entry?.(...args);
1122
1141
  const result = await inner(...args);
@@ -1130,11 +1149,17 @@ function buildEs(logger) {
1130
1149
  return {
1131
1150
  snap: traced(snap, void 0, (snapshot) => {
1132
1151
  logger.trace(
1133
- `\u{1F7E0} snap ${snapshot.event.stream}@${snapshot.event.version}`
1152
+ es_caption(
1153
+ "snap",
1154
+ C_MAGENTA,
1155
+ `${snapshot.event.stream}@${snapshot.event.version}`
1156
+ )
1134
1157
  );
1135
1158
  }),
1136
1159
  load: traced(load, void 0, (_me, stream, _cb, asOf) => {
1137
- logger.trace(`\u{1F7E2} load ${stream}${asOf ? " (as-of)" : ""}`);
1160
+ logger.trace(
1161
+ es_caption("load", C_GREEN, `${stream}${asOf ? " (as-of)" : ""}`)
1162
+ );
1138
1163
  }),
1139
1164
  action: traced(
1140
1165
  action,
@@ -1143,12 +1168,19 @@ function buildEs(logger) {
1143
1168
  if (committed.length) {
1144
1169
  logger.trace(
1145
1170
  committed.map((s) => s.event.data),
1146
- `\u{1F534} commit ${target.stream}.${committed.map((s) => s.event.name).join(", ")}`
1171
+ es_caption(
1172
+ "committed",
1173
+ C_ORANGE,
1174
+ `${target.stream}.${committed.map((s) => s.event.name).join(", ")}`
1175
+ )
1147
1176
  );
1148
1177
  }
1149
1178
  },
1150
1179
  (_me, action2, target, payload) => {
1151
- logger.trace(payload, `\u{1F535} ${target.stream}.${action2}`);
1180
+ logger.trace(
1181
+ payload,
1182
+ es_caption("action", C_BLUE, `${target.stream}.${action2}`)
1183
+ );
1152
1184
  }
1153
1185
  )
1154
1186
  };
@@ -1169,7 +1201,7 @@ function buildDrain(logger) {
1169
1201
  const data = Object.fromEntries(
1170
1202
  leased.map(({ stream, at, retry }) => [stream, { at, retry }])
1171
1203
  );
1172
- logger.trace(data, ">> lease");
1204
+ logger.trace(data, drain_caption("claimed"));
1173
1205
  }
1174
1206
  }),
1175
1207
  fetch: traced(fetch, (fetched) => {
@@ -1182,14 +1214,14 @@ function buildDrain(logger) {
1182
1214
  return [key, value];
1183
1215
  })
1184
1216
  );
1185
- logger.trace(data, ">> fetch");
1217
+ logger.trace(data, drain_caption("fetched"));
1186
1218
  }),
1187
1219
  ack: traced(ack, (acked) => {
1188
1220
  if (acked.length) {
1189
1221
  const data = Object.fromEntries(
1190
1222
  acked.map(({ stream, at, retry }) => [stream, { at, retry }])
1191
1223
  );
1192
- logger.trace(data, ">> ack");
1224
+ logger.trace(data, drain_caption("acked"));
1193
1225
  }
1194
1226
  }),
1195
1227
  block: traced(block, (blocked) => {
@@ -1200,13 +1232,13 @@ function buildDrain(logger) {
1200
1232
  { at, retry, error }
1201
1233
  ])
1202
1234
  );
1203
- logger.trace(data, ">> block");
1235
+ logger.trace(data, drain_caption("blocked"));
1204
1236
  }
1205
1237
  }),
1206
1238
  subscribe: traced(subscribe, (result, streams) => {
1207
1239
  if (result.subscribed) {
1208
1240
  const data = streams.map(({ stream }) => stream).join(" ");
1209
- logger.trace(`>> correlate ${data}`);
1241
+ logger.trace(`${drain_caption("correlated")} ${data}`);
1210
1242
  }
1211
1243
  })
1212
1244
  };
@@ -1220,7 +1252,7 @@ var Act = class {
1220
1252
  this._batch_handlers = batchHandlers;
1221
1253
  this._es = buildEs(this._logger);
1222
1254
  this._cd = buildDrain(this._logger);
1223
- const statics = [];
1255
+ const statics = /* @__PURE__ */ new Map();
1224
1256
  for (const [name, register] of Object.entries(this.registry.events)) {
1225
1257
  if (register.reactions.size > 0) {
1226
1258
  this._reactive_events.add(name);
@@ -1229,14 +1261,13 @@ var Act = class {
1229
1261
  if (typeof reaction.resolver === "function") {
1230
1262
  this._has_dynamic_resolvers = true;
1231
1263
  } else {
1232
- statics.push({
1233
- stream: reaction.resolver.target,
1234
- source: reaction.resolver.source
1235
- });
1264
+ const { target, source } = reaction.resolver;
1265
+ const key = `${target}|${source ?? ""}`;
1266
+ if (!statics.has(key)) statics.set(key, { stream: target, source });
1236
1267
  }
1237
1268
  }
1238
1269
  }
1239
- this._static_targets = statics;
1270
+ this._static_targets = [...statics.values()];
1240
1271
  for (const merged of this._states.values()) {
1241
1272
  for (const eventName of Object.keys(merged.events)) {
1242
1273
  this._event_to_state.set(eventName, merged);
@@ -1297,6 +1328,12 @@ var Act = class {
1297
1328
  _event_to_state = /* @__PURE__ */ new Map();
1298
1329
  /** Logger resolved at construction time (after user port configuration) */
1299
1330
  _logger = log();
1331
+ /** Pre-bound IAct methods reused across drain cycles. Only `do` varies per
1332
+ * payload (it captures the triggering event for reactingTo auto-inject). */
1333
+ _bound_do = this.do.bind(this);
1334
+ _bound_load = this.load.bind(this);
1335
+ _bound_query = this.query.bind(this);
1336
+ _bound_query_array = this.query_array.bind(this);
1300
1337
  /**
1301
1338
  * Executes an action on a state instance, committing resulting events.
1302
1339
  *
@@ -1519,12 +1556,12 @@ var Act = class {
1519
1556
  const stream = lease.stream;
1520
1557
  let at = payloads.at(0).event.id, handled = 0;
1521
1558
  lease.retry > 0 && this._logger.warn(`Retrying ${stream}@${at} (${lease.retry}).`);
1522
- const doAction = this.do.bind(this);
1559
+ const doAction = this._bound_do;
1523
1560
  const scopedApp = {
1524
1561
  do: doAction,
1525
- load: this.load.bind(this),
1526
- query: this.query.bind(this),
1527
- query_array: this.query_array.bind(this)
1562
+ load: this._bound_load,
1563
+ query: this._bound_query,
1564
+ query_array: this._bound_query_array
1528
1565
  };
1529
1566
  for (const payload of payloads) {
1530
1567
  const { event, handler, options } = payload;
@@ -1657,12 +1694,13 @@ var Act = class {
1657
1694
  return { fetched: [], leased: [], acked: [], blocked: [] };
1658
1695
  }
1659
1696
  const fetched = await this._cd.fetch(leased, eventLimit);
1660
- const payloadsMap = /* @__PURE__ */ new Map();
1697
+ const fetchMap = /* @__PURE__ */ new Map();
1661
1698
  const fetch_window_at = fetched.reduce(
1662
1699
  (max, { at, events }) => Math.max(max, events.at(-1)?.id || at),
1663
1700
  0
1664
1701
  );
1665
- fetched.forEach(({ stream, events }) => {
1702
+ for (const f of fetched) {
1703
+ const { stream, events } = f;
1666
1704
  const payloads = events.flatMap((event) => {
1667
1705
  const register = this.registry.events[event.name];
1668
1706
  if (!register) return [];
@@ -1671,13 +1709,13 @@ var Act = class {
1671
1709
  return resolved && resolved.target === stream;
1672
1710
  }).map((reaction) => ({ ...reaction, event }));
1673
1711
  });
1674
- payloadsMap.set(stream, payloads);
1675
- });
1712
+ fetchMap.set(stream, { fetch: f, payloads });
1713
+ }
1676
1714
  const handled = await Promise.all(
1677
1715
  leased.map((lease) => {
1678
- const streamFetch = fetched.find((f) => f.stream === lease.stream);
1679
- const at = streamFetch?.events.at(-1)?.id || fetch_window_at;
1680
- const payloads = payloadsMap.get(lease.stream);
1716
+ const entry = fetchMap.get(lease.stream);
1717
+ const at = entry?.fetch.events.at(-1)?.id || fetch_window_at;
1718
+ const payloads = entry?.payloads ?? [];
1681
1719
  const batchHandler = this._batch_handlers.get(lease.stream);
1682
1720
  if (batchHandler && payloads.length > 0) {
1683
1721
  return this.handleBatch({ ...lease, at }, payloads, batchHandler);