@dudousxd/nestjs-durable 0.51.0 → 0.52.1

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/index.cjs CHANGED
@@ -58,7 +58,8 @@ __export(index_exports, {
58
58
  ProxyRunGateway: () => ProxyRunGateway,
59
59
  RUN_GATEWAY: () => RUN_GATEWAY,
60
60
  RUN_REDIS_WORKER: () => RUN_REDIS_WORKER,
61
- RunGateway: () => import_nestjs_durable_core18.RunGateway,
61
+ RunGateway: () => import_nestjs_durable_core19.RunGateway,
62
+ RunGatewayError: () => RunGatewayError,
62
63
  RunRequestResponder: () => RunRequestResponder,
63
64
  STEP_INTERCEPTOR_METADATA: () => STEP_INTERCEPTOR_METADATA,
64
65
  Step: () => Step,
@@ -71,7 +72,7 @@ __export(index_exports, {
71
72
  UNSUPPORTED_RUN_REQUEST: () => UNSUPPORTED_RUN_REQUEST,
72
73
  WORKFLOW_METADATA: () => WORKFLOW_METADATA,
73
74
  Workflow: () => Workflow,
74
- WorkflowEngine: () => import_nestjs_durable_core18.WorkflowEngine,
75
+ WorkflowEngine: () => import_nestjs_durable_core19.WorkflowEngine,
75
76
  WorkflowService: () => WorkflowService,
76
77
  attributesOf: () => attributesOf,
77
78
  entityConfigFor: () => entityConfigFor,
@@ -79,17 +80,19 @@ __export(index_exports, {
79
80
  getEntityMeta: () => getEntityMeta,
80
81
  getOnEvents: () => getOnEvents,
81
82
  getWorkflowMeta: () => getWorkflowMeta,
83
+ hmacTenantVerifier: () => import_nestjs_durable_core19.hmacTenantVerifier,
82
84
  inAppWorkerProviders: () => inAppWorkerProviders,
83
85
  isDeadLetterHandler: () => isDeadLetterHandler,
84
86
  isDrivingOperator: () => isDrivingOperator,
85
87
  isOperatorRole: () => isOperatorRole,
86
88
  isStepInterceptor: () => isStepInterceptor,
87
89
  onErrorCodesOf: () => onErrorCodesOf,
88
- prevCronFireMs: () => import_nestjs_durable_core18.prevCronFireMs,
89
- readSearchAttributes: () => import_nestjs_durable_core18.readSearchAttributes,
90
- runSchedules: () => import_nestjs_durable_core18.runSchedules,
91
- scheduleRunIdAt: () => import_nestjs_durable_core18.scheduleRunIdAt,
92
- scheduledRunId: () => import_nestjs_durable_core18.scheduledRunId,
90
+ prevCronFireMs: () => import_nestjs_durable_core19.prevCronFireMs,
91
+ readSearchAttributes: () => import_nestjs_durable_core19.readSearchAttributes,
92
+ runSchedules: () => import_nestjs_durable_core19.runSchedules,
93
+ scheduleRunIdAt: () => import_nestjs_durable_core19.scheduleRunIdAt,
94
+ scheduledRunId: () => import_nestjs_durable_core19.scheduledRunId,
95
+ signTenantToken: () => import_nestjs_durable_core19.signTenantToken,
93
96
  thinWorkerProviders: () => thinWorkerProviders,
94
97
  unavailableRunGateway: () => unavailableRunGateway
95
98
  });
@@ -416,7 +419,9 @@ var DurableStartClient = class {
416
419
  async start(workflow, input, runId = globalThis.crypto.randomUUID(), opts) {
417
420
  const name = (0, import_nestjs_durable_core3.workflowName)(workflow);
418
421
  await startRun(this.options.connection, {
419
- tenant: this.tenant,
422
+ // The signed token (when configured) rides in the `tenant` field, as on every run request; an
423
+ // operator with `verifyTenant` derives the run's namespace from it.
424
+ tenant: this.options.tenantToken !== void 0 ? await (0, import_nestjs_durable_core3.resolveTenantToken)(this.options.tenantToken) : this.tenant,
420
425
  workflow: name,
421
426
  input,
422
427
  runId,
@@ -917,7 +922,7 @@ function unavailableRunGateway() {
917
922
  __name(unavailableRunGateway, "unavailableRunGateway");
918
923
 
919
924
  // src/durable.module.ts
920
- var import_nestjs_durable_core17 = require("@dudousxd/nestjs-durable-core");
925
+ var import_nestjs_durable_core18 = require("@dudousxd/nestjs-durable-core");
921
926
  var import_common12 = require("@nestjs/common");
922
927
  var import_core5 = require("@nestjs/core");
923
928
 
@@ -1253,10 +1258,11 @@ function inAppWorkerProviders() {
1253
1258
  __name(inAppWorkerProviders, "inAppWorkerProviders");
1254
1259
 
1255
1260
  // src/proxy-run-gateway.ts
1256
- var import_nestjs_durable_core10 = require("@dudousxd/nestjs-durable-core");
1261
+ var import_nestjs_durable_core11 = require("@dudousxd/nestjs-durable-core");
1257
1262
  var import_common6 = require("@nestjs/common");
1258
1263
 
1259
1264
  // src/run-request-responder.ts
1265
+ var import_nestjs_durable_core10 = require("@dudousxd/nestjs-durable-core");
1260
1266
  var UNSUPPORTED_RUN_REQUEST = "unsupported-request";
1261
1267
  var KNOWN_KINDS = /* @__PURE__ */ new Set([
1262
1268
  "getRunDetail",
@@ -1278,9 +1284,14 @@ var RunRequestResponder = class {
1278
1284
  }
1279
1285
  transport;
1280
1286
  gateway;
1281
- constructor(transport, gateway) {
1287
+ verifyTenant;
1288
+ constructor(transport, gateway, options = {}) {
1282
1289
  this.transport = transport;
1283
1290
  this.gateway = gateway;
1291
+ this.verifyTenant = options.verifyTenant;
1292
+ if (!this.verifyTenant && options.warnWithoutVerifier !== false) {
1293
+ console.warn("[nestjs-durable] run-request responder started WITHOUT a tenant verifier: the wire `tenant` claim is trusted verbatim (prefix/network isolation only). Any broker client can act as any tenant. Configure `verifyTenant` (e.g. hmacTenantVerifier(secret)) and signed tenant tokens unless your broker is fully isolated per tenant.");
1294
+ }
1284
1295
  }
1285
1296
  /** Register the consumer on the transport. Each request is answered independently; a handler
1286
1297
  * failure never throws back into the transport (errors are captured into an error reply). */
@@ -1303,7 +1314,24 @@ var RunRequestResponder = class {
1303
1314
  await this.transport.publishRunReply(reply);
1304
1315
  });
1305
1316
  }
1306
- async handle(msg) {
1317
+ async handle(wire) {
1318
+ const tenant = await (0, import_nestjs_durable_core10.resolveWireTenant)(wire.tenant, this.verifyTenant);
1319
+ if (tenant === null) {
1320
+ return {
1321
+ requestId: wire.requestId,
1322
+ result: {
1323
+ ok: false,
1324
+ error: {
1325
+ message: "invalid or unauthorized tenant token",
1326
+ code: "unauthorized"
1327
+ }
1328
+ }
1329
+ };
1330
+ }
1331
+ const msg = {
1332
+ ...wire,
1333
+ tenant
1334
+ };
1307
1335
  const { body } = msg;
1308
1336
  if (!KNOWN_KINDS.has(body.kind)) {
1309
1337
  return {
@@ -1479,7 +1507,18 @@ function _ts_metadata6(metadataKey, metadataValue) {
1479
1507
  }
1480
1508
  }
1481
1509
  __name(_ts_metadata6, "_ts_metadata");
1482
- var UnsupportedRunRequestError = class UnsupportedRunRequestError2 extends Error {
1510
+ var RunGatewayError = class extends Error {
1511
+ static {
1512
+ __name(this, "RunGatewayError");
1513
+ }
1514
+ code;
1515
+ constructor(message, code) {
1516
+ super(message);
1517
+ this.name = "RunGatewayError";
1518
+ this.code = code;
1519
+ }
1520
+ };
1521
+ var UnsupportedRunRequestError = class UnsupportedRunRequestError2 extends RunGatewayError {
1483
1522
  static {
1484
1523
  __name(this, "UnsupportedRunRequestError");
1485
1524
  }
@@ -1496,17 +1535,19 @@ var ProxyRunGateway = class {
1496
1535
  tenant;
1497
1536
  timeoutMs;
1498
1537
  capabilityTtlMs;
1538
+ tenantToken;
1499
1539
  pending = /* @__PURE__ */ new Map();
1500
1540
  /** Verb → when to ask the control plane for it again, after it answered that it does not know it.
1501
1541
  * During a rolling upgrade the control plane is several pods of mixed versions behind one queue,
1502
1542
  * and a reply does not say which pod sent it, so the whole control plane is assumed old until the
1503
1543
  * entry expires. */
1504
1544
  unsupportedUntil = /* @__PURE__ */ new Map();
1505
- constructor(transport, tenant, timeoutMs = 1e4, capabilityTtlMs = 6e4) {
1545
+ constructor(transport, tenant, timeoutMs = 1e4, capabilityTtlMs = 6e4, tenantToken) {
1506
1546
  this.transport = transport;
1507
1547
  this.tenant = tenant;
1508
1548
  this.timeoutMs = timeoutMs;
1509
1549
  this.capabilityTtlMs = capabilityTtlMs;
1550
+ this.tenantToken = tenantToken;
1510
1551
  this.transport.onRunReply?.((reply) => this.handleReply(reply));
1511
1552
  }
1512
1553
  handleReply(reply) {
@@ -1517,12 +1558,17 @@ var ProxyRunGateway = class {
1517
1558
  if (reply.result.ok) {
1518
1559
  pending.resolve(reply.result.data);
1519
1560
  } else if (reply.result.error.code === UNSUPPORTED_RUN_REQUEST) {
1520
- pending.reject(new UnsupportedRunRequestError(reply.result.error.message));
1561
+ pending.reject(new UnsupportedRunRequestError(reply.result.error.message, UNSUPPORTED_RUN_REQUEST));
1521
1562
  } else {
1522
- pending.reject(new Error(reply.result.error.message));
1563
+ pending.reject(new RunGatewayError(reply.result.error.message, reply.result.error.code));
1523
1564
  }
1524
1565
  }
1525
1566
  request(body) {
1567
+ const source = this.tenantToken;
1568
+ if (typeof source !== "function") return this.send(source ?? this.tenant, body);
1569
+ return (0, import_nestjs_durable_core11.resolveTenantToken)(source).then((tenant) => this.send(tenant, body));
1570
+ }
1571
+ send(tenant, body) {
1526
1572
  return new Promise((resolve, reject) => {
1527
1573
  const requestId = globalThis.crypto.randomUUID();
1528
1574
  const timer = setTimeout(() => {
@@ -1536,9 +1582,9 @@ var ProxyRunGateway = class {
1536
1582
  });
1537
1583
  this.transport.dispatchRunRequest?.({
1538
1584
  requestId,
1539
- tenant: this.tenant,
1585
+ tenant,
1540
1586
  body
1541
- }).catch((error) => {
1587
+ })?.catch((error) => {
1542
1588
  const stillPending = this.pending.get(requestId);
1543
1589
  if (!stillPending) return;
1544
1590
  clearTimeout(stillPending.timer);
@@ -1568,12 +1614,12 @@ var ProxyRunGateway = class {
1568
1614
  });
1569
1615
  const over = options?.summarizeFansOver;
1570
1616
  if (over === void 0 || !detail || detail.fans !== void 0) return detail;
1571
- const { timeline, fans } = (0, import_nestjs_durable_core10.summarizeTimeline)(detail.timeline, over);
1572
- const ids = (0, import_nestjs_durable_core10.childIdsOf)(detail.timeline);
1617
+ const { timeline, fans } = (0, import_nestjs_durable_core11.summarizeTimeline)(detail.timeline, over);
1618
+ const ids = (0, import_nestjs_durable_core11.childIdsOf)(detail.timeline);
1573
1619
  return {
1574
1620
  ...detail,
1575
1621
  timeline,
1576
- children: ids.slice(0, import_nestjs_durable_core10.SUMMARY_CHILD_LIMIT),
1622
+ children: ids.slice(0, import_nestjs_durable_core11.SUMMARY_CHILD_LIMIT),
1577
1623
  fans,
1578
1624
  childCount: ids.length
1579
1625
  };
@@ -1598,7 +1644,7 @@ var ProxyRunGateway = class {
1598
1644
  kind: "getRunDetail",
1599
1645
  runId
1600
1646
  });
1601
- return detail ? (0, import_nestjs_durable_core10.pageFan)(detail.timeline, group, query) : null;
1647
+ return detail ? (0, import_nestjs_durable_core11.pageFan)(detail.timeline, group, query) : null;
1602
1648
  }
1603
1649
  knownUnsupported(kind) {
1604
1650
  const until = this.unsupportedUntil.get(kind);
@@ -1696,12 +1742,13 @@ ProxyRunGateway = _ts_decorate6([
1696
1742
  typeof Transport === "undefined" ? Object : Transport,
1697
1743
  String,
1698
1744
  void 0,
1699
- void 0
1745
+ void 0,
1746
+ typeof TenantTokenSource === "undefined" ? Object : TenantTokenSource
1700
1747
  ])
1701
1748
  ], ProxyRunGateway);
1702
1749
 
1703
1750
  // src/retention-poller.ts
1704
- var import_nestjs_durable_core11 = require("@dudousxd/nestjs-durable-core");
1751
+ var import_nestjs_durable_core12 = require("@dudousxd/nestjs-durable-core");
1705
1752
  var import_common7 = require("@nestjs/common");
1706
1753
 
1707
1754
  // src/settle-within.ts
@@ -1767,10 +1814,10 @@ function validateRetention(retention) {
1767
1814
  if (policy.maxAge == null && policy.maxCount == null) {
1768
1815
  throw new Error("durable retention: each policy must set maxAge and/or maxCount");
1769
1816
  }
1770
- if (policy.maxAge != null) (0, import_nestjs_durable_core11.parseDuration)(policy.maxAge);
1817
+ if (policy.maxAge != null) (0, import_nestjs_durable_core12.parseDuration)(policy.maxAge);
1771
1818
  for (const status of policy.statuses) {
1772
- if (!import_nestjs_durable_core11.TERMINAL_RUN_STATUSES.includes(status)) {
1773
- throw new Error(`durable retention: status "${status}" is not terminal; only ${import_nestjs_durable_core11.TERMINAL_RUN_STATUSES.join(", ")} can be pruned`);
1819
+ if (!import_nestjs_durable_core12.TERMINAL_RUN_STATUSES.includes(status)) {
1820
+ throw new Error(`durable retention: status "${status}" is not terminal; only ${import_nestjs_durable_core12.TERMINAL_RUN_STATUSES.join(", ")} can be pruned`);
1774
1821
  }
1775
1822
  const key = `${scopeKey}|${status}`;
1776
1823
  if (seen.has(key)) {
@@ -1822,7 +1869,7 @@ var RetentionPoller = class {
1822
1869
  return;
1823
1870
  }
1824
1871
  await this.sweep();
1825
- const intervalMs = retention.sweepInterval != null ? (0, import_nestjs_durable_core11.parseDuration)(retention.sweepInterval) : DEFAULT_SWEEP_INTERVAL_MS;
1872
+ const intervalMs = retention.sweepInterval != null ? (0, import_nestjs_durable_core12.parseDuration)(retention.sweepInterval) : DEFAULT_SWEEP_INTERVAL_MS;
1826
1873
  if (intervalMs > 0) {
1827
1874
  this.timer = setInterval(() => void this.sweep(), intervalMs);
1828
1875
  this.timer.unref?.();
@@ -1884,8 +1931,8 @@ var RetentionPoller = class {
1884
1931
  };
1885
1932
  RetentionPoller = _ts_decorate7([
1886
1933
  (0, import_common7.Injectable)(),
1887
- _ts_param4(0, (0, import_common7.Inject)(import_nestjs_durable_core11.STATE_STORE_CANONICAL)),
1888
- _ts_param4(1, (0, import_common7.Inject)(import_nestjs_durable_core11.DURABLE_OPTIONS_CANONICAL)),
1934
+ _ts_param4(0, (0, import_common7.Inject)(import_nestjs_durable_core12.STATE_STORE_CANONICAL)),
1935
+ _ts_param4(1, (0, import_common7.Inject)(import_nestjs_durable_core12.DURABLE_OPTIONS_CANONICAL)),
1889
1936
  _ts_metadata7("design:type", Function),
1890
1937
  _ts_metadata7("design:paramtypes", [
1891
1938
  Object,
@@ -1894,7 +1941,7 @@ RetentionPoller = _ts_decorate7([
1894
1941
  ], RetentionPoller);
1895
1942
 
1896
1943
  // src/store-run-gateway.ts
1897
- var import_nestjs_durable_core12 = require("@dudousxd/nestjs-durable-core");
1944
+ var import_nestjs_durable_core13 = require("@dudousxd/nestjs-durable-core");
1898
1945
  var import_common8 = require("@nestjs/common");
1899
1946
  function _ts_decorate8(decorators, target, key, desc) {
1900
1947
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
@@ -1952,10 +1999,10 @@ var StoreRunGateway = class {
1952
1999
  children
1953
2000
  };
1954
2001
  }
1955
- if ((0, import_nestjs_durable_core12.aggregatesCheckpoints)(this.store)) {
2002
+ if ((0, import_nestjs_durable_core13.aggregatesCheckpoints)(this.store)) {
1956
2003
  const stats = await this.store.checkpointStats(runId);
1957
- const etag = (0, import_nestjs_durable_core12.runDetailEtag)(run, stats, over);
1958
- if ((0, import_nestjs_durable_core12.etagMatches)(options?.ifNoneMatch, etag)) {
2004
+ const etag = (0, import_nestjs_durable_core13.runDetailEtag)(run, stats, over);
2005
+ if ((0, import_nestjs_durable_core13.etagMatches)(options?.ifNoneMatch, etag)) {
1959
2006
  return {
1960
2007
  run,
1961
2008
  timeline: [],
@@ -1966,17 +2013,17 @@ var StoreRunGateway = class {
1966
2013
  }
1967
2014
  return {
1968
2015
  run,
1969
- ...await (0, import_nestjs_durable_core12.summarizeRunFromStore)(this.store, runId, over, stats),
2016
+ ...await (0, import_nestjs_durable_core13.summarizeRunFromStore)(this.store, runId, over, stats),
1970
2017
  etag
1971
2018
  };
1972
2019
  }
1973
2020
  const full = await this.store.listCheckpoints(runId);
1974
- const { timeline, fans } = (0, import_nestjs_durable_core12.summarizeTimeline)(full, over);
1975
- const ids = (0, import_nestjs_durable_core12.childIdsOf)(full);
2021
+ const { timeline, fans } = (0, import_nestjs_durable_core13.summarizeTimeline)(full, over);
2022
+ const ids = (0, import_nestjs_durable_core13.childIdsOf)(full);
1976
2023
  return {
1977
2024
  run,
1978
2025
  timeline,
1979
- children: ids.slice(0, import_nestjs_durable_core12.SUMMARY_CHILD_LIMIT),
2026
+ children: ids.slice(0, import_nestjs_durable_core13.SUMMARY_CHILD_LIMIT),
1980
2027
  fans,
1981
2028
  childCount: ids.length
1982
2029
  };
@@ -1986,12 +2033,12 @@ var StoreRunGateway = class {
1986
2033
  }
1987
2034
  async getFanMembers(runId, group, query) {
1988
2035
  if (!await this.store.getRun(runId)) return null;
1989
- if ((0, import_nestjs_durable_core12.aggregatesCheckpoints)(this.store)) {
2036
+ if ((0, import_nestjs_durable_core13.aggregatesCheckpoints)(this.store)) {
1990
2037
  const stats = await this.store.checkpointStats(runId, {
1991
2038
  group
1992
2039
  });
1993
- const etag = (0, import_nestjs_durable_core12.fanPageEtag)(group, stats, query);
1994
- if ((0, import_nestjs_durable_core12.etagMatches)(query.ifNoneMatch, etag)) {
2040
+ const etag = (0, import_nestjs_durable_core13.fanPageEtag)(group, stats, query);
2041
+ if ((0, import_nestjs_durable_core13.etagMatches)(query.ifNoneMatch, etag)) {
1995
2042
  return {
1996
2043
  items: [],
1997
2044
  total: 0,
@@ -2000,17 +2047,17 @@ var StoreRunGateway = class {
2000
2047
  };
2001
2048
  }
2002
2049
  return {
2003
- ...await (0, import_nestjs_durable_core12.pageFanFromStore)(this.store, runId, group, query, stats),
2050
+ ...await (0, import_nestjs_durable_core13.pageFanFromStore)(this.store, runId, group, query, stats),
2004
2051
  etag
2005
2052
  };
2006
2053
  }
2007
- return (0, import_nestjs_durable_core12.pageFan)(await this.store.listCheckpoints(runId), group, query);
2054
+ return (0, import_nestjs_durable_core13.pageFan)(await this.store.listCheckpoints(runId), group, query);
2008
2055
  }
2009
2056
  async listRuns(query) {
2010
2057
  const runs = await this.store.listRuns(query);
2011
- const waiterByRun = (0, import_nestjs_durable_core12.indexWaitersByRun)(await (0, import_nestjs_durable_core12.listSignalWaitersOfRuns)(this.store, runs.filter((run) => run.status === "suspended").map((run) => run.id)));
2058
+ const waiterByRun = (0, import_nestjs_durable_core13.indexWaitersByRun)(await (0, import_nestjs_durable_core13.listSignalWaitersOfRuns)(this.store, runs.filter((run) => run.status === "suspended").map((run) => run.id)));
2012
2059
  return runs.map((run) => {
2013
- const waiting = (0, import_nestjs_durable_core12.resolveRunWaiting)(run, waiterByRun);
2060
+ const waiting = (0, import_nestjs_durable_core13.resolveRunWaiting)(run, waiterByRun);
2014
2061
  return waiting ? {
2015
2062
  ...run,
2016
2063
  waiting
@@ -2026,7 +2073,7 @@ var StoreRunGateway = class {
2026
2073
  async runFacets(query) {
2027
2074
  if (this.store.runFacets) return this.store.runFacets(query);
2028
2075
  const runs = await this.store.listRuns(query);
2029
- return (0, import_nestjs_durable_core12.mergeRunFacetRows)(runs.map((r) => ({
2076
+ return (0, import_nestjs_durable_core13.mergeRunFacetRows)(runs.map((r) => ({
2030
2077
  status: r.status,
2031
2078
  origin: r.origin,
2032
2079
  count: 1
@@ -2061,13 +2108,13 @@ var StoreRunGateway = class {
2061
2108
  "suspended"
2062
2109
  ]
2063
2110
  }),
2064
- (0, import_nestjs_durable_core12.listSignalWaitersOfRuns)(this.store, runIds)
2111
+ (0, import_nestjs_durable_core13.listSignalWaitersOfRuns)(this.store, runIds)
2065
2112
  ]);
2066
- const waiterByRun = (0, import_nestjs_durable_core12.indexWaitersByRun)(waiters);
2113
+ const waiterByRun = (0, import_nestjs_durable_core13.indexWaitersByRun)(waiters);
2067
2114
  const result = {};
2068
2115
  for (const run of suspended) {
2069
2116
  if (!idSet.has(run.id)) continue;
2070
- const waiting = (0, import_nestjs_durable_core12.resolveRunWaiting)(run, waiterByRun);
2117
+ const waiting = (0, import_nestjs_durable_core13.resolveRunWaiting)(run, waiterByRun);
2071
2118
  if (waiting) result[run.id] = waiting;
2072
2119
  }
2073
2120
  return result;
@@ -2101,11 +2148,11 @@ var StoreRunGateway = class {
2101
2148
  };
2102
2149
  StoreRunGateway = _ts_decorate8([
2103
2150
  (0, import_common8.Injectable)(),
2104
- _ts_param5(0, (0, import_common8.Inject)(import_nestjs_durable_core12.STATE_STORE_CANONICAL)),
2151
+ _ts_param5(0, (0, import_common8.Inject)(import_nestjs_durable_core13.STATE_STORE_CANONICAL)),
2105
2152
  _ts_metadata8("design:type", Function),
2106
2153
  _ts_metadata8("design:paramtypes", [
2107
2154
  typeof StateStore === "undefined" ? Object : StateStore,
2108
- typeof import_nestjs_durable_core12.WorkflowEngine === "undefined" ? Object : import_nestjs_durable_core12.WorkflowEngine
2155
+ typeof import_nestjs_durable_core13.WorkflowEngine === "undefined" ? Object : import_nestjs_durable_core13.WorkflowEngine
2109
2156
  ])
2110
2157
  ], StoreRunGateway);
2111
2158
 
@@ -2151,7 +2198,7 @@ var TenantEventRepublisher = class {
2151
2198
  };
2152
2199
 
2153
2200
  // src/timer-poller.ts
2154
- var import_nestjs_durable_core13 = require("@dudousxd/nestjs-durable-core");
2201
+ var import_nestjs_durable_core14 = require("@dudousxd/nestjs-durable-core");
2155
2202
  var import_common9 = require("@nestjs/common");
2156
2203
  function _ts_decorate9(decorators, target, key, desc) {
2157
2204
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
@@ -2195,7 +2242,7 @@ var TimerPoller = class {
2195
2242
  this.options = options;
2196
2243
  }
2197
2244
  async onApplicationBootstrap() {
2198
- for (const s of this.options.schedules ?? []) (0, import_nestjs_durable_core13.workflowName)(s.workflow);
2245
+ for (const s of this.options.schedules ?? []) (0, import_nestjs_durable_core14.workflowName)(s.workflow);
2199
2246
  if (!isDrivingOperator(this.options)) return;
2200
2247
  this.unsubscribeEnqueued = this.engine.onEnqueued((runId) => {
2201
2248
  void this.engine.runOne(runId).catch((error) => {
@@ -2265,7 +2312,7 @@ var TimerPoller = class {
2265
2312
  await this.sweep("sweepStalled", async () => this.engine.sweepStalled?.());
2266
2313
  const schedules = this.options.schedules;
2267
2314
  if (schedules && schedules.length > 0) {
2268
- await this.sweep("schedules", () => (0, import_nestjs_durable_core13.runSchedules)(this.engine, schedules, Date.now()));
2315
+ await this.sweep("schedules", () => (0, import_nestjs_durable_core14.runSchedules)(this.engine, schedules, Date.now()));
2269
2316
  }
2270
2317
  if (this.options.persistedSchedules) {
2271
2318
  await this.sweep("persistedSchedules", () => this.engine.schedules.tick());
@@ -2283,21 +2330,21 @@ var TimerPoller = class {
2283
2330
  };
2284
2331
  TimerPoller = _ts_decorate9([
2285
2332
  (0, import_common9.Injectable)(),
2286
- _ts_param6(1, (0, import_common9.Inject)(import_nestjs_durable_core13.DURABLE_OPTIONS_CANONICAL)),
2333
+ _ts_param6(1, (0, import_common9.Inject)(import_nestjs_durable_core14.DURABLE_OPTIONS_CANONICAL)),
2287
2334
  _ts_metadata9("design:type", Function),
2288
2335
  _ts_metadata9("design:paramtypes", [
2289
- typeof import_nestjs_durable_core13.WorkflowEngine === "undefined" ? Object : import_nestjs_durable_core13.WorkflowEngine,
2336
+ typeof import_nestjs_durable_core14.WorkflowEngine === "undefined" ? Object : import_nestjs_durable_core14.WorkflowEngine,
2290
2337
  typeof DurableModuleOptions === "undefined" ? Object : DurableModuleOptions
2291
2338
  ])
2292
2339
  ], TimerPoller);
2293
2340
 
2294
2341
  // src/tokens.ts
2295
- var import_nestjs_durable_core14 = require("@dudousxd/nestjs-durable-core");
2342
+ var import_nestjs_durable_core15 = require("@dudousxd/nestjs-durable-core");
2296
2343
  var CONTEXT_ACCESSOR = Symbol.for("@dudousxd/nestjs-context:accessor");
2297
- var RUN_GATEWAY = import_nestjs_durable_core14.RunGateway;
2344
+ var RUN_GATEWAY = import_nestjs_durable_core15.RunGateway;
2298
2345
 
2299
2346
  // src/workflow.registrar.ts
2300
- var import_nestjs_durable_core15 = require("@dudousxd/nestjs-durable-core");
2347
+ var import_nestjs_durable_core16 = require("@dudousxd/nestjs-durable-core");
2301
2348
  var import_common10 = require("@nestjs/common");
2302
2349
  var import_core4 = require("@nestjs/core");
2303
2350
 
@@ -2407,11 +2454,11 @@ var WorkflowRegistrar = class {
2407
2454
  const body = io.wrap((ctx, input) => workflow.run(ctx, input));
2408
2455
  const eventBatch = meta.debounce ? {
2409
2456
  mode: "debounce",
2410
- windowMs: (0, import_nestjs_durable_core15.parseDuration)(meta.debounce)
2457
+ windowMs: (0, import_nestjs_durable_core16.parseDuration)(meta.debounce)
2411
2458
  } : meta.batch ? {
2412
2459
  mode: "batch",
2413
2460
  maxSize: meta.batch.maxSize,
2414
- windowMs: (0, import_nestjs_durable_core15.parseDuration)(meta.batch.within)
2461
+ windowMs: (0, import_nestjs_durable_core16.parseDuration)(meta.batch.within)
2415
2462
  } : void 0;
2416
2463
  const workflowCtor = workflow.constructor;
2417
2464
  const onError = onErrorHandlersOf(meta, workflow, this.metadataScanner);
@@ -2445,11 +2492,11 @@ var WorkflowRegistrar = class {
2445
2492
  // so a turn dispatched under the wrong token would never be consumed. Absent → the inline fast
2446
2493
  // path (unchanged).
2447
2494
  ...this.inAppWorker ? {
2448
- group: (0, import_nestjs_durable_core15.tenantGroup)((0, import_nestjs_durable_core15.sanitizeQueueToken)(meta.name), this.inAppWorker.partition),
2449
- executor: new import_nestjs_durable_core15.RemoteWorkflowExecutor(this.inAppWorker.transport, meta.name, this.inAppWorker.partition)
2495
+ group: (0, import_nestjs_durable_core16.tenantGroup)((0, import_nestjs_durable_core16.sanitizeQueueToken)(meta.name), this.inAppWorker.partition),
2496
+ executor: new import_nestjs_durable_core16.RemoteWorkflowExecutor(this.inAppWorker.transport, meta.name, this.inAppWorker.partition)
2450
2497
  } : {}
2451
2498
  });
2452
- (0, import_nestjs_durable_core15.bindWorkflowClass)(workflowCtor, {
2499
+ (0, import_nestjs_durable_core16.bindWorkflowClass)(workflowCtor, {
2453
2500
  start: /* @__PURE__ */ __name((name, input, runId, opts) => this.engine.start(name, input, runId, opts), "start"),
2454
2501
  waitForRun: /* @__PURE__ */ __name((runId, opts) => this.engine.waitForRun(runId, opts), "waitForRun")
2455
2502
  });
@@ -2464,7 +2511,7 @@ var WorkflowRegistrar = class {
2464
2511
  });
2465
2512
  deadLetterByWorkflow.set(meta.name, dlqName);
2466
2513
  } else if (meta.deadLetterWorkflow) {
2467
- deadLetterByWorkflow.set(meta.name, (0, import_nestjs_durable_core15.workflowName)(meta.deadLetterWorkflow));
2514
+ deadLetterByWorkflow.set(meta.name, (0, import_nestjs_durable_core16.workflowName)(meta.deadLetterWorkflow));
2468
2515
  }
2469
2516
  });
2470
2517
  this.reportUnattributed(unattributed);
@@ -2512,7 +2559,7 @@ var WorkflowRegistrar = class {
2512
2559
  * a `dlq:<runId>` id, so re-recovery never double-dispatches.
2513
2560
  */
2514
2561
  installDeadLetterRouting(byWorkflow) {
2515
- const fallback = this.options.deadLetterWorkflow ? (0, import_nestjs_durable_core15.workflowName)(this.options.deadLetterWorkflow) : void 0;
2562
+ const fallback = this.options.deadLetterWorkflow ? (0, import_nestjs_durable_core16.workflowName)(this.options.deadLetterWorkflow) : void 0;
2516
2563
  if (byWorkflow.size === 0 && !fallback) return;
2517
2564
  this.engine.onDead((run) => {
2518
2565
  const target = byWorkflow.get(run.workflow) ?? fallback;
@@ -2537,14 +2584,14 @@ var WorkflowRegistrar = class {
2537
2584
  };
2538
2585
  WorkflowRegistrar = _ts_decorate10([
2539
2586
  (0, import_common10.Injectable)(),
2540
- _ts_param7(3, (0, import_common10.Inject)(import_nestjs_durable_core15.STATE_STORE_CANONICAL)),
2541
- _ts_param7(4, (0, import_common10.Inject)(import_nestjs_durable_core15.DURABLE_OPTIONS_CANONICAL)),
2587
+ _ts_param7(3, (0, import_common10.Inject)(import_nestjs_durable_core16.STATE_STORE_CANONICAL)),
2588
+ _ts_param7(4, (0, import_common10.Inject)(import_nestjs_durable_core16.DURABLE_OPTIONS_CANONICAL)),
2542
2589
  _ts_param7(5, (0, import_common10.Inject)(IN_APP_WORKER_BINDING)),
2543
2590
  _ts_metadata10("design:type", Function),
2544
2591
  _ts_metadata10("design:paramtypes", [
2545
2592
  typeof import_core4.DiscoveryService === "undefined" ? Object : import_core4.DiscoveryService,
2546
2593
  typeof import_core4.MetadataScanner === "undefined" ? Object : import_core4.MetadataScanner,
2547
- typeof import_nestjs_durable_core15.WorkflowEngine === "undefined" ? Object : import_nestjs_durable_core15.WorkflowEngine,
2594
+ typeof import_nestjs_durable_core16.WorkflowEngine === "undefined" ? Object : import_nestjs_durable_core16.WorkflowEngine,
2548
2595
  Object,
2549
2596
  typeof DurableModuleOptions === "undefined" ? Object : DurableModuleOptions,
2550
2597
  Object
@@ -2553,7 +2600,7 @@ WorkflowRegistrar = _ts_decorate10([
2553
2600
 
2554
2601
  // src/workflow.service.ts
2555
2602
  var import_node_crypto = require("crypto");
2556
- var import_nestjs_durable_core16 = require("@dudousxd/nestjs-durable-core");
2603
+ var import_nestjs_durable_core17 = require("@dudousxd/nestjs-durable-core");
2557
2604
  var import_common11 = require("@nestjs/common");
2558
2605
  function _ts_decorate11(decorators, target, key, desc) {
2559
2606
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
@@ -2624,7 +2671,7 @@ WorkflowService = _ts_decorate11([
2624
2671
  (0, import_common11.Injectable)(),
2625
2672
  _ts_metadata11("design:type", Function),
2626
2673
  _ts_metadata11("design:paramtypes", [
2627
- typeof import_nestjs_durable_core16.WorkflowEngine === "undefined" ? Object : import_nestjs_durable_core16.WorkflowEngine
2674
+ typeof import_nestjs_durable_core17.WorkflowEngine === "undefined" ? Object : import_nestjs_durable_core17.WorkflowEngine
2628
2675
  ])
2629
2676
  ], WorkflowService);
2630
2677
 
@@ -2821,7 +2868,15 @@ var RunGatewayBootstrap = class RunGatewayBootstrap2 {
2821
2868
  onRunRequest: onRunRequest.bind(this.transport),
2822
2869
  publishRunReply: publishRunReply.bind(this.transport)
2823
2870
  };
2824
- new RunRequestResponder(runRequestTransport, this.gateway).start();
2871
+ new RunRequestResponder(runRequestTransport, this.gateway, {
2872
+ verifyTenant: this.options.verifyTenant,
2873
+ // Mirrors Agora's rule (`warnWithoutVerifier: role === 'control-plane'`): only a deployment
2874
+ // that EXPLICITLY names itself the control plane is told it runs without tenant auth. A plain
2875
+ // operator (role inferred from `store`) is Agora's `standalone`: anyone with broker access
2876
+ // can already enqueue steps and results there, so the warning would be noise on every boot
2877
+ // of an app that never serves tenants.
2878
+ warnWithoutVerifier: this.options.topology?.role === "control-plane"
2879
+ }).start();
2825
2880
  }
2826
2881
  if (typeof publishTenantEvent === "function") {
2827
2882
  const republisher = new TenantEventRepublisher(store, publishTenantEvent.bind(this.transport));
@@ -2836,14 +2891,14 @@ var RunGatewayBootstrap = class RunGatewayBootstrap2 {
2836
2891
  };
2837
2892
  RunGatewayBootstrap = _ts_decorate12([
2838
2893
  (0, import_common12.Injectable)(),
2839
- _ts_param8(1, (0, import_common12.Inject)(import_nestjs_durable_core17.TRANSPORT_CANONICAL)),
2840
- _ts_param8(3, (0, import_common12.Inject)(import_nestjs_durable_core17.STATE_STORE_CANONICAL)),
2841
- _ts_param8(4, (0, import_common12.Inject)(import_nestjs_durable_core17.DURABLE_OPTIONS_CANONICAL)),
2894
+ _ts_param8(1, (0, import_common12.Inject)(import_nestjs_durable_core18.TRANSPORT_CANONICAL)),
2895
+ _ts_param8(3, (0, import_common12.Inject)(import_nestjs_durable_core18.STATE_STORE_CANONICAL)),
2896
+ _ts_param8(4, (0, import_common12.Inject)(import_nestjs_durable_core18.DURABLE_OPTIONS_CANONICAL)),
2842
2897
  _ts_metadata12("design:type", Function),
2843
2898
  _ts_metadata12("design:paramtypes", [
2844
- typeof import_nestjs_durable_core17.WorkflowEngine === "undefined" ? Object : import_nestjs_durable_core17.WorkflowEngine,
2899
+ typeof import_nestjs_durable_core18.WorkflowEngine === "undefined" ? Object : import_nestjs_durable_core18.WorkflowEngine,
2845
2900
  Object,
2846
- typeof import_nestjs_durable_core17.RunGateway === "undefined" ? Object : import_nestjs_durable_core17.RunGateway,
2901
+ typeof import_nestjs_durable_core18.RunGateway === "undefined" ? Object : import_nestjs_durable_core18.RunGateway,
2847
2902
  Object,
2848
2903
  typeof DurableModuleOptions === "undefined" ? Object : DurableModuleOptions
2849
2904
  ])
@@ -2855,13 +2910,13 @@ var DurableModule = class _DurableModule {
2855
2910
  static forRoot(options) {
2856
2911
  _DurableModule.assertValid(options);
2857
2912
  return _DurableModule.build({
2858
- provide: import_nestjs_durable_core17.DURABLE_OPTIONS_CANONICAL,
2913
+ provide: import_nestjs_durable_core18.DURABLE_OPTIONS_CANONICAL,
2859
2914
  useValue: resolveTopology(options)
2860
2915
  });
2861
2916
  }
2862
2917
  static forRootAsync(options) {
2863
2918
  return _DurableModule.build({
2864
- provide: import_nestjs_durable_core17.DURABLE_OPTIONS_CANONICAL,
2919
+ provide: import_nestjs_durable_core18.DURABLE_OPTIONS_CANONICAL,
2865
2920
  useFactory: /* @__PURE__ */ __name(async (...args) => {
2866
2921
  const resolved = await options.useFactory(...args);
2867
2922
  _DurableModule.assertValid(resolved);
@@ -2894,41 +2949,41 @@ var DurableModule = class _DurableModule {
2894
2949
  providers: [
2895
2950
  optionsProvider,
2896
2951
  {
2897
- provide: import_nestjs_durable_core17.STATE_STORE_CANONICAL,
2952
+ provide: import_nestjs_durable_core18.STATE_STORE_CANONICAL,
2898
2953
  useFactory: /* @__PURE__ */ __name((options) => options.store !== void 0 ? scopedStore(options.store, options) : null, "useFactory"),
2899
2954
  inject: [
2900
- import_nestjs_durable_core17.DURABLE_OPTIONS_CANONICAL
2955
+ import_nestjs_durable_core18.DURABLE_OPTIONS_CANONICAL
2901
2956
  ]
2902
2957
  },
2903
2958
  {
2904
- provide: import_nestjs_durable_core17.TRANSPORT_CANONICAL,
2959
+ provide: import_nestjs_durable_core18.TRANSPORT_CANONICAL,
2905
2960
  // With a POOL (`transports`) and no singular `transport`, the canonical transport is the
2906
2961
  // pool's PRIMARY — the same one the engine dispatches on first. Leaving it null starved
2907
2962
  // the step registrar / in-app worker of a transport, so a pool-configured operator
2908
2963
  // registered NO step handlers and its own steps parked in `wait` with no consumer.
2909
2964
  useFactory: /* @__PURE__ */ __name((options) => options.transport ?? options.transports?.[0]?.transport ?? null, "useFactory"),
2910
2965
  inject: [
2911
- import_nestjs_durable_core17.DURABLE_OPTIONS_CANONICAL
2966
+ import_nestjs_durable_core18.DURABLE_OPTIONS_CANONICAL
2912
2967
  ]
2913
2968
  },
2914
2969
  // Legacy back-compat aliases (deprecated tokens still resolve to the same instances):
2915
2970
  {
2916
- provide: import_nestjs_durable_core17.STATE_STORE,
2917
- useExisting: import_nestjs_durable_core17.STATE_STORE_CANONICAL
2971
+ provide: import_nestjs_durable_core18.STATE_STORE,
2972
+ useExisting: import_nestjs_durable_core18.STATE_STORE_CANONICAL
2918
2973
  },
2919
2974
  {
2920
- provide: import_nestjs_durable_core17.TRANSPORT,
2921
- useExisting: import_nestjs_durable_core17.TRANSPORT_CANONICAL
2975
+ provide: import_nestjs_durable_core18.TRANSPORT,
2976
+ useExisting: import_nestjs_durable_core18.TRANSPORT_CANONICAL
2922
2977
  },
2923
2978
  {
2924
- provide: import_nestjs_durable_core17.DURABLE_OPTIONS,
2925
- useExisting: import_nestjs_durable_core17.DURABLE_OPTIONS_CANONICAL
2979
+ provide: import_nestjs_durable_core18.DURABLE_OPTIONS,
2980
+ useExisting: import_nestjs_durable_core18.DURABLE_OPTIONS_CANONICAL
2926
2981
  },
2927
2982
  {
2928
2983
  // Shared token, bound EXACTLY once: a real engine for the operator role, or a store-less
2929
2984
  // `DurableStartClient` facade for a thin worker (no `store`) — either way, `WorkflowService`
2930
2985
  // and app code call `engine.start(...)` unchanged.
2931
- provide: import_nestjs_durable_core17.WorkflowEngine,
2986
+ provide: import_nestjs_durable_core18.WorkflowEngine,
2932
2987
  useFactory: /* @__PURE__ */ __name(async (options, store, transport, moduleRef) => {
2933
2988
  if (options.store === void 0) {
2934
2989
  return new DurableStartClient(options);
@@ -2949,7 +3004,7 @@ var DurableModule = class _DurableModule {
2949
3004
  if (t) deferTransportConsumers(t);
2950
3005
  }
2951
3006
  }
2952
- const engine = new import_nestjs_durable_core17.WorkflowEngine({
3007
+ const engine = new import_nestjs_durable_core18.WorkflowEngine({
2953
3008
  store,
2954
3009
  transport: transport ?? void 0,
2955
3010
  transports: options.transports,
@@ -2973,6 +3028,7 @@ var DurableModule = class _DurableModule {
2973
3028
  context,
2974
3029
  rehydrate: rehydrate || void 0,
2975
3030
  compensationRetries: options.compensationRetries,
3031
+ verifyTenant: options.verifyTenant,
2976
3032
  // A non-driving (dashboard/API) operator must not run workflows: enqueue-only, leaving
2977
3033
  // each `pending` run in the store for a DRIVING instance's poll. A driving operator gets
2978
3034
  // the engine's default in-process dispatcher: for a body registered inline, it runs
@@ -2989,9 +3045,9 @@ var DurableModule = class _DurableModule {
2989
3045
  return engine;
2990
3046
  }, "useFactory"),
2991
3047
  inject: [
2992
- import_nestjs_durable_core17.DURABLE_OPTIONS_CANONICAL,
2993
- import_nestjs_durable_core17.STATE_STORE_CANONICAL,
2994
- import_nestjs_durable_core17.TRANSPORT_CANONICAL,
3048
+ import_nestjs_durable_core18.DURABLE_OPTIONS_CANONICAL,
3049
+ import_nestjs_durable_core18.STATE_STORE_CANONICAL,
3050
+ import_nestjs_durable_core18.TRANSPORT_CANONICAL,
2995
3051
  import_core5.ModuleRef
2996
3052
  ]
2997
3053
  },
@@ -3005,7 +3061,7 @@ var DurableModule = class _DurableModule {
3005
3061
  // or (for a thin worker, no `store`) a `ProxyRunGateway` over `transport` when given, else a
3006
3062
  // gateway whose every method rejects with a clear tenant error.
3007
3063
  {
3008
- provide: import_nestjs_durable_core17.RunGateway,
3064
+ provide: import_nestjs_durable_core18.RunGateway,
3009
3065
  useFactory: /* @__PURE__ */ __name((options, store, engine) => {
3010
3066
  if (options.store !== void 0) {
3011
3067
  if (!store) {
@@ -3013,12 +3069,12 @@ var DurableModule = class _DurableModule {
3013
3069
  }
3014
3070
  return new StoreRunGateway(store, engine);
3015
3071
  }
3016
- return options.transport ? new ProxyRunGateway(options.transport, options.partition ?? "default", options.runGatewayTimeoutMs) : unavailableRunGateway();
3072
+ return options.transport ? new ProxyRunGateway(options.transport, options.partition ?? "default", options.runGatewayTimeoutMs, void 0, options.tenantToken) : unavailableRunGateway();
3017
3073
  }, "useFactory"),
3018
3074
  inject: [
3019
- import_nestjs_durable_core17.DURABLE_OPTIONS_CANONICAL,
3020
- import_nestjs_durable_core17.STATE_STORE_CANONICAL,
3021
- import_nestjs_durable_core17.WorkflowEngine
3075
+ import_nestjs_durable_core18.DURABLE_OPTIONS_CANONICAL,
3076
+ import_nestjs_durable_core18.STATE_STORE_CANONICAL,
3077
+ import_nestjs_durable_core18.WorkflowEngine
3022
3078
  ]
3023
3079
  },
3024
3080
  RunGatewayBootstrap,
@@ -3032,13 +3088,13 @@ var DurableModule = class _DurableModule {
3032
3088
  exports: [
3033
3089
  WorkflowService,
3034
3090
  EntityService,
3035
- import_nestjs_durable_core17.WorkflowEngine,
3036
- import_nestjs_durable_core17.STATE_STORE,
3037
- import_nestjs_durable_core17.STATE_STORE_CANONICAL,
3038
- import_nestjs_durable_core17.TRANSPORT,
3039
- import_nestjs_durable_core17.TRANSPORT_CANONICAL,
3040
- import_nestjs_durable_core17.DURABLE_OPTIONS_CANONICAL,
3041
- import_nestjs_durable_core17.RunGateway
3091
+ import_nestjs_durable_core18.WorkflowEngine,
3092
+ import_nestjs_durable_core18.STATE_STORE,
3093
+ import_nestjs_durable_core18.STATE_STORE_CANONICAL,
3094
+ import_nestjs_durable_core18.TRANSPORT,
3095
+ import_nestjs_durable_core18.TRANSPORT_CANONICAL,
3096
+ import_nestjs_durable_core18.DURABLE_OPTIONS_CANONICAL,
3097
+ import_nestjs_durable_core18.RunGateway
3042
3098
  ]
3043
3099
  };
3044
3100
  }
@@ -3048,7 +3104,7 @@ DurableModule = _ts_decorate12([
3048
3104
  ], DurableModule);
3049
3105
 
3050
3106
  // src/index.ts
3051
- var import_nestjs_durable_core18 = require("@dudousxd/nestjs-durable-core");
3107
+ var import_nestjs_durable_core19 = require("@dudousxd/nestjs-durable-core");
3052
3108
  // Annotate the CommonJS export names for ESM import in node:
3053
3109
  0 && (module.exports = {
3054
3110
  CONTEXT_ACCESSOR,
@@ -3079,6 +3135,7 @@ var import_nestjs_durable_core18 = require("@dudousxd/nestjs-durable-core");
3079
3135
  RUN_GATEWAY,
3080
3136
  RUN_REDIS_WORKER,
3081
3137
  RunGateway,
3138
+ RunGatewayError,
3082
3139
  RunRequestResponder,
3083
3140
  STEP_INTERCEPTOR_METADATA,
3084
3141
  Step,
@@ -3099,6 +3156,7 @@ var import_nestjs_durable_core18 = require("@dudousxd/nestjs-durable-core");
3099
3156
  getEntityMeta,
3100
3157
  getOnEvents,
3101
3158
  getWorkflowMeta,
3159
+ hmacTenantVerifier,
3102
3160
  inAppWorkerProviders,
3103
3161
  isDeadLetterHandler,
3104
3162
  isDrivingOperator,
@@ -3110,6 +3168,7 @@ var import_nestjs_durable_core18 = require("@dudousxd/nestjs-durable-core");
3110
3168
  runSchedules,
3111
3169
  scheduleRunIdAt,
3112
3170
  scheduledRunId,
3171
+ signTenantToken,
3113
3172
  thinWorkerProviders,
3114
3173
  unavailableRunGateway
3115
3174
  });