@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.
- package/dist/.tsbuildinfo +1 -1
- package/dist/@types/act.d.ts +6 -0
- package/dist/@types/act.d.ts.map +1 -1
- package/dist/@types/config.d.ts.map +1 -1
- package/dist/@types/internal/tracing.d.ts +9 -2
- package/dist/@types/internal/tracing.d.ts.map +1 -1
- package/dist/@types/ports.d.ts.map +1 -1
- package/dist/index.cjs +68 -30
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +68 -30
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -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,
|
|
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" ? "
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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, "
|
|
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, "
|
|
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, "
|
|
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, "
|
|
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(
|
|
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
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
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.
|
|
1559
|
+
const doAction = this._bound_do;
|
|
1523
1560
|
const scopedApp = {
|
|
1524
1561
|
do: doAction,
|
|
1525
|
-
load: this.
|
|
1526
|
-
query: this.
|
|
1527
|
-
query_array: 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
|
|
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
|
-
|
|
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
|
-
|
|
1675
|
-
}
|
|
1712
|
+
fetchMap.set(stream, { fetch: f, payloads });
|
|
1713
|
+
}
|
|
1676
1714
|
const handled = await Promise.all(
|
|
1677
1715
|
leased.map((lease) => {
|
|
1678
|
-
const
|
|
1679
|
-
const at =
|
|
1680
|
-
const payloads =
|
|
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);
|