@bluelibs/runner 4.6.1 → 4.7.0-alpha

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.
Files changed (156) hide show
  1. package/AI.md +319 -579
  2. package/README.md +886 -731
  3. package/dist/browser/index.cjs +1438 -251
  4. package/dist/browser/index.cjs.map +1 -1
  5. package/dist/browser/index.mjs +1433 -252
  6. package/dist/browser/index.mjs.map +1 -1
  7. package/dist/context.d.ts +31 -0
  8. package/dist/define.d.ts +9 -0
  9. package/dist/definers/builders/core.d.ts +30 -0
  10. package/dist/definers/builders/event.d.ts +12 -0
  11. package/dist/definers/builders/hook.d.ts +20 -0
  12. package/dist/definers/builders/middleware.d.ts +39 -0
  13. package/dist/definers/builders/resource.d.ts +40 -0
  14. package/dist/definers/builders/tag.d.ts +10 -0
  15. package/dist/definers/builders/task.d.ts +37 -0
  16. package/dist/definers/builders/task.phantom.d.ts +27 -0
  17. package/dist/definers/builders/utils.d.ts +4 -0
  18. package/dist/definers/defineEvent.d.ts +2 -0
  19. package/dist/definers/defineHook.d.ts +6 -0
  20. package/dist/definers/defineOverride.d.ts +17 -0
  21. package/dist/definers/defineResource.d.ts +2 -0
  22. package/dist/definers/defineResourceMiddleware.d.ts +2 -0
  23. package/dist/definers/defineTag.d.ts +12 -0
  24. package/dist/definers/defineTask.d.ts +18 -0
  25. package/dist/definers/defineTaskMiddleware.d.ts +2 -0
  26. package/dist/definers/tools.d.ts +47 -0
  27. package/dist/defs.d.ts +29 -0
  28. package/dist/edge/index.cjs +1438 -251
  29. package/dist/edge/index.cjs.map +1 -1
  30. package/dist/edge/index.mjs +1433 -252
  31. package/dist/edge/index.mjs.map +1 -1
  32. package/dist/errors.d.ts +104 -0
  33. package/dist/globals/globalEvents.d.ts +8 -0
  34. package/dist/globals/globalMiddleware.d.ts +31 -0
  35. package/dist/globals/globalResources.d.ts +32 -0
  36. package/dist/globals/globalTags.d.ts +11 -0
  37. package/dist/globals/middleware/cache.middleware.d.ts +27 -0
  38. package/dist/globals/middleware/requireContext.middleware.d.ts +6 -0
  39. package/dist/globals/middleware/retry.middleware.d.ts +21 -0
  40. package/dist/globals/middleware/timeout.middleware.d.ts +9 -0
  41. package/dist/globals/middleware/tunnel.middleware.d.ts +2 -0
  42. package/dist/globals/resources/debug/debug.resource.d.ts +7 -0
  43. package/dist/globals/resources/debug/debug.tag.d.ts +2 -0
  44. package/dist/globals/resources/debug/debugConfig.resource.d.ts +22 -0
  45. package/dist/globals/resources/debug/executionTracker.middleware.d.ts +50 -0
  46. package/dist/globals/resources/debug/globalEvent.hook.d.ts +27 -0
  47. package/dist/globals/resources/debug/hook.hook.d.ts +30 -0
  48. package/dist/globals/resources/debug/index.d.ts +6 -0
  49. package/dist/globals/resources/debug/middleware.hook.d.ts +30 -0
  50. package/dist/globals/resources/debug/types.d.ts +25 -0
  51. package/dist/globals/resources/debug/utils.d.ts +2 -0
  52. package/dist/globals/resources/queue.resource.d.ts +10 -0
  53. package/dist/globals/resources/tunnel/ejson-extensions.d.ts +1 -0
  54. package/dist/globals/resources/tunnel/error-utils.d.ts +1 -0
  55. package/dist/globals/resources/tunnel/plan.d.ts +19 -0
  56. package/dist/globals/resources/tunnel/protocol.d.ts +40 -0
  57. package/dist/globals/resources/tunnel/serializer.d.ts +9 -0
  58. package/dist/globals/resources/tunnel/tunnel.policy.tag.d.ts +18 -0
  59. package/dist/globals/resources/tunnel/tunnel.tag.d.ts +2 -0
  60. package/dist/globals/resources/tunnel/types.d.ts +17 -0
  61. package/dist/globals/tunnels/index.d.ts +23 -0
  62. package/dist/globals/types.d.ts +1 -0
  63. package/dist/http-client.d.ts +23 -0
  64. package/dist/http-fetch-tunnel.resource.d.ts +22 -0
  65. package/dist/index.d.ts +99 -0
  66. package/dist/models/DependencyProcessor.d.ts +48 -0
  67. package/dist/models/EventManager.d.ts +153 -0
  68. package/dist/models/LogPrinter.d.ts +55 -0
  69. package/dist/models/Logger.d.ts +85 -0
  70. package/dist/models/MiddlewareManager.d.ts +86 -0
  71. package/dist/models/OverrideManager.d.ts +13 -0
  72. package/dist/models/Queue.d.ts +26 -0
  73. package/dist/models/ResourceInitializer.d.ts +20 -0
  74. package/dist/models/RunResult.d.ts +35 -0
  75. package/dist/models/Semaphore.d.ts +61 -0
  76. package/dist/models/Store.d.ts +69 -0
  77. package/dist/models/StoreRegistry.d.ts +43 -0
  78. package/dist/models/StoreValidator.d.ts +8 -0
  79. package/dist/models/TaskRunner.d.ts +27 -0
  80. package/dist/models/UnhandledError.d.ts +11 -0
  81. package/dist/models/index.d.ts +11 -0
  82. package/dist/models/utils/findCircularDependencies.d.ts +16 -0
  83. package/dist/models/utils/safeStringify.d.ts +3 -0
  84. package/dist/node/exposure/allowList.d.ts +3 -0
  85. package/dist/node/exposure/authenticator.d.ts +6 -0
  86. package/dist/node/exposure/cors.d.ts +4 -0
  87. package/dist/node/exposure/createNodeExposure.d.ts +2 -0
  88. package/dist/node/exposure/exposureServer.d.ts +18 -0
  89. package/dist/node/exposure/httpResponse.d.ts +10 -0
  90. package/dist/node/exposure/logging.d.ts +4 -0
  91. package/dist/node/exposure/multipart.d.ts +27 -0
  92. package/dist/node/exposure/requestBody.d.ts +11 -0
  93. package/dist/node/exposure/requestContext.d.ts +17 -0
  94. package/dist/node/exposure/requestHandlers.d.ts +24 -0
  95. package/dist/node/exposure/resourceTypes.d.ts +60 -0
  96. package/dist/node/exposure/router.d.ts +17 -0
  97. package/dist/node/exposure/serverLifecycle.d.ts +13 -0
  98. package/dist/node/exposure/types.d.ts +31 -0
  99. package/dist/node/exposure/utils.d.ts +17 -0
  100. package/dist/node/exposure.resource.d.ts +12 -0
  101. package/dist/node/files.d.ts +9 -0
  102. package/dist/node/http-smart-client.model.d.ts +22 -0
  103. package/dist/node/index.d.ts +1 -0
  104. package/dist/node/inputFile.model.d.ts +22 -0
  105. package/dist/node/inputFile.utils.d.ts +14 -0
  106. package/dist/node/mixed-http-client.node.d.ts +27 -0
  107. package/dist/node/node.cjs +11168 -0
  108. package/dist/node/node.cjs.map +1 -0
  109. package/dist/node/node.d.ts +6 -0
  110. package/dist/node/node.mjs +11099 -0
  111. package/dist/node/node.mjs.map +1 -0
  112. package/dist/node/platform/createFile.d.ts +9 -0
  113. package/dist/node/tunnel.allowlist.d.ts +7 -0
  114. package/dist/node/upload/manifest.d.ts +22 -0
  115. package/dist/platform/adapters/browser.d.ts +14 -0
  116. package/dist/platform/adapters/edge.d.ts +5 -0
  117. package/dist/platform/adapters/node-als.d.ts +1 -0
  118. package/dist/platform/adapters/node.d.ts +15 -0
  119. package/dist/platform/adapters/universal-generic.d.ts +14 -0
  120. package/dist/platform/adapters/universal.d.ts +17 -0
  121. package/dist/platform/createFile.d.ts +10 -0
  122. package/dist/platform/createWebFile.d.ts +11 -0
  123. package/dist/platform/factory.d.ts +2 -0
  124. package/dist/platform/index.d.ts +27 -0
  125. package/dist/platform/types.d.ts +29 -0
  126. package/dist/processHooks.d.ts +2 -0
  127. package/dist/run.d.ts +14 -0
  128. package/dist/testing.d.ts +25 -0
  129. package/dist/tools/getCallerFile.d.ts +1 -0
  130. package/dist/tunnels/buildUniversalManifest.d.ts +24 -0
  131. package/dist/types/contracts.d.ts +63 -0
  132. package/dist/types/event.d.ts +74 -0
  133. package/dist/types/hook.d.ts +23 -0
  134. package/dist/types/inputFile.d.ts +34 -0
  135. package/dist/types/meta.d.ts +18 -0
  136. package/dist/types/resource.d.ts +87 -0
  137. package/dist/types/resourceMiddleware.d.ts +47 -0
  138. package/dist/types/runner.d.ts +55 -0
  139. package/dist/types/storeTypes.d.ts +40 -0
  140. package/dist/types/symbols.d.ts +28 -0
  141. package/dist/types/tag.d.ts +46 -0
  142. package/dist/types/task.d.ts +50 -0
  143. package/dist/types/taskMiddleware.d.ts +48 -0
  144. package/dist/types/utilities.d.ts +111 -0
  145. package/dist/universal/index.cjs +1438 -251
  146. package/dist/universal/index.cjs.map +1 -1
  147. package/dist/universal/index.mjs +1433 -252
  148. package/dist/universal/index.mjs.map +1 -1
  149. package/package.json +32 -4
  150. package/dist/index.d.mts +0 -1747
  151. package/dist/index.unused.js +0 -4466
  152. package/dist/index.unused.js.map +0 -1
  153. package/dist/node/index.cjs +0 -4498
  154. package/dist/node/index.cjs.map +0 -1
  155. package/dist/node/index.mjs +0 -4466
  156. package/dist/node/index.mjs.map +0 -1
@@ -1,7 +1,15 @@
1
1
  import { LRUCache } from 'lru-cache';
2
+ import { EJSON } from '@bluelibs/ejson';
3
+ export { EJSON } from '@bluelibs/ejson';
2
4
 
3
5
  var __defProp = Object.defineProperty;
4
6
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
7
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
8
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
9
+ }) : x)(function(x) {
10
+ if (typeof require !== "undefined") return require.apply(this, arguments);
11
+ throw Error('Dynamic require of "' + x + '" is not supported');
12
+ });
5
13
  var __export = (target, all) => {
6
14
  for (var name in all)
7
15
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -18,17 +26,22 @@ __export(defs_exports, {
18
26
  symbolMiddleware: () => symbolMiddleware,
19
27
  symbolMiddlewareConfigured: () => symbolMiddlewareConfigured,
20
28
  symbolOptionalDependency: () => symbolOptionalDependency,
29
+ symbolPhantomTask: () => symbolPhantomTask,
21
30
  symbolResource: () => symbolResource,
22
31
  symbolResourceMiddleware: () => symbolResourceMiddleware,
23
32
  symbolResourceWithConfig: () => symbolResourceWithConfig,
24
33
  symbolTag: () => symbolTag,
25
34
  symbolTagConfigured: () => symbolTagConfigured,
26
35
  symbolTask: () => symbolTask,
27
- symbolTaskMiddleware: () => symbolTaskMiddleware
36
+ symbolTaskMiddleware: () => symbolTaskMiddleware,
37
+ symbolTunneledTask: () => symbolTunneledTask
28
38
  });
29
39
 
30
40
  // src/types/symbols.ts
31
41
  var symbolTask = Symbol.for("runner.task");
42
+ var symbolPhantomTask = Symbol.for(
43
+ "runner.task.phantom"
44
+ );
32
45
  var symbolResource = Symbol.for("runner.resource");
33
46
  var symbolResourceWithConfig = Symbol.for(
34
47
  "runner.resourceWithConfig"
@@ -44,6 +57,9 @@ var symbolResourceMiddleware = Symbol.for(
44
57
  var symbolMiddlewareConfigured = Symbol.for(
45
58
  "runner.middlewareConfigured"
46
59
  );
60
+ var symbolTunneledTask = Symbol.for(
61
+ "runner.tunneledTask"
62
+ );
47
63
  var symbolHook = Symbol.for("runner.hook");
48
64
  var symbolTag = Symbol.for("runner.tag");
49
65
  var symbolTagConfigured = Symbol.for(
@@ -99,7 +115,7 @@ var defaultKeyBuilder = /* @__PURE__ */ __name((taskId, input) => `${taskId}-${J
99
115
  var cacheMiddleware = defineTaskMiddleware({
100
116
  id: "globals.middleware.cache",
101
117
  dependencies: { cache: cacheResource },
102
- async run({ task, next }, deps, config) {
118
+ async run({ task: task2, next }, deps, config) {
103
119
  const { cache } = deps;
104
120
  config = {
105
121
  keyBuilder: defaultKeyBuilder,
@@ -110,7 +126,7 @@ var cacheMiddleware = defineTaskMiddleware({
110
126
  // Automatically purge expired items
111
127
  ...config
112
128
  };
113
- const taskId = task.definition.id;
129
+ const taskId = task2.definition.id;
114
130
  let cacheHolderForTask = cache.map.get(taskId);
115
131
  if (!cacheHolderForTask) {
116
132
  const { keyBuilder, ...lruOptions } = config;
@@ -121,12 +137,12 @@ var cacheMiddleware = defineTaskMiddleware({
121
137
  cacheHolderForTask = await cache.cacheFactoryTask(cacheOptions);
122
138
  cache.map.set(taskId, cacheHolderForTask);
123
139
  }
124
- const key = config.keyBuilder(taskId, task.input);
140
+ const key = config.keyBuilder(taskId, task2.input);
125
141
  const cachedValue = await cacheHolderForTask.get(key);
126
142
  if (cachedValue) {
127
143
  return cachedValue;
128
144
  }
129
- const result = await next(task.input);
145
+ const result = await next(task2.input);
130
146
  await cacheHolderForTask.set(key, result);
131
147
  return result;
132
148
  }
@@ -176,6 +192,16 @@ function defineTask(taskConfig) {
176
192
  };
177
193
  }
178
194
  __name(defineTask, "defineTask");
195
+ defineTask.phantom = (taskConfig) => {
196
+ const taskDef = defineTask({
197
+ ...taskConfig,
198
+ run: /* @__PURE__ */ __name(async (input) => {
199
+ return void 0;
200
+ }, "run")
201
+ });
202
+ taskDef[symbolPhantomTask] = true;
203
+ return taskDef;
204
+ };
179
205
 
180
206
  // src/definers/defineHook.ts
181
207
  function defineHook(hookDef) {
@@ -197,6 +223,7 @@ __name(defineHook, "defineHook");
197
223
  // src/errors.ts
198
224
  var errors_exports = {};
199
225
  __export(errors_exports, {
226
+ CancellationError: () => CancellationError,
200
227
  CircularDependenciesError: () => CircularDependenciesError,
201
228
  ContextError: () => ContextError,
202
229
  DependencyNotFoundError: () => DependencyNotFoundError,
@@ -212,7 +239,8 @@ __export(errors_exports, {
212
239
  StoreAlreadyInitializedError: () => StoreAlreadyInitializedError,
213
240
  TagNotFoundError: () => TagNotFoundError,
214
241
  UnknownItemTypeError: () => UnknownItemTypeError,
215
- ValidationError: () => ValidationError
242
+ ValidationError: () => ValidationError,
243
+ isCancellationError: () => isCancellationError
216
244
  });
217
245
 
218
246
  // src/platform/adapters/node-als.ts
@@ -265,9 +293,27 @@ var NodePlatformAdapter = class {
265
293
  let instance;
266
294
  const ensure = /* @__PURE__ */ __name(() => {
267
295
  if (!this.alsClass) {
268
- throw new PlatformUnsupportedFunction(
269
- "createAsyncLocalStorage: Platform not initialized"
270
- );
296
+ let als;
297
+ const forceNoop = typeof process !== "undefined" && !!process.env?.RUNNER_FORCE_NOOP_ALS;
298
+ if (!forceNoop) {
299
+ try {
300
+ const mod = __require("async_hooks");
301
+ als = mod?.AsyncLocalStorage;
302
+ } catch (_) {
303
+ als = void 0;
304
+ }
305
+ }
306
+ this.alsClass = als ? als : class NoopAsyncLocalStorage {
307
+ static {
308
+ __name(this, "NoopAsyncLocalStorage");
309
+ }
310
+ getStore() {
311
+ return void 0;
312
+ }
313
+ run(_store, callback) {
314
+ return callback();
315
+ }
316
+ };
271
317
  }
272
318
  return instance ??= new this.alsClass();
273
319
  }, "ensure");
@@ -454,6 +500,9 @@ function detectEnvironment() {
454
500
  if (typeof globalThis.Bun !== "undefined" || typeof process !== "undefined" && process.versions?.bun) {
455
501
  return "universal";
456
502
  }
503
+ if (typeof globalThis.importScripts === "function" && typeof window === "undefined") {
504
+ return "edge";
505
+ }
457
506
  if (typeof globalThis.WorkerGlobalScope !== "undefined" && typeof self !== "undefined" && self instanceof globalThis.WorkerGlobalScope) {
458
507
  return "edge";
459
508
  }
@@ -569,6 +618,63 @@ function getPlatform() {
569
618
  return platformInstance;
570
619
  }
571
620
  __name(getPlatform, "getPlatform");
621
+ function setPlatform(adapter) {
622
+ platformInstance = adapter;
623
+ adapter.id;
624
+ }
625
+ __name(setPlatform, "setPlatform");
626
+ var PlatformAdapter = class {
627
+ constructor(env) {
628
+ this.setTimeout = globalThis.setTimeout;
629
+ this.clearTimeout = globalThis.clearTimeout;
630
+ const kind = env ?? detectEnvironment();
631
+ this.env = kind;
632
+ switch (kind) {
633
+ case "node":
634
+ this.inner = new NodePlatformAdapter();
635
+ break;
636
+ case "browser":
637
+ this.inner = new BrowserPlatformAdapter();
638
+ break;
639
+ case "edge":
640
+ this.inner = new EdgePlatformAdapter();
641
+ break;
642
+ case "universal":
643
+ this.inner = new GenericUniversalPlatformAdapter();
644
+ break;
645
+ default:
646
+ this.inner = new UniversalPlatformAdapter();
647
+ }
648
+ this.id = this.inner.id;
649
+ }
650
+ static {
651
+ __name(this, "PlatformAdapter");
652
+ }
653
+ async init() {
654
+ return this.inner.init();
655
+ }
656
+ onUncaughtException(handler) {
657
+ return this.inner.onUncaughtException(handler);
658
+ }
659
+ onUnhandledRejection(handler) {
660
+ return this.inner.onUnhandledRejection(handler);
661
+ }
662
+ onShutdownSignal(handler) {
663
+ return this.inner.onShutdownSignal(handler);
664
+ }
665
+ exit(code) {
666
+ return this.inner.exit(code);
667
+ }
668
+ getEnv(key) {
669
+ return this.inner.getEnv(key);
670
+ }
671
+ hasAsyncLocalStorage() {
672
+ return this.inner.hasAsyncLocalStorage();
673
+ }
674
+ createAsyncLocalStorage() {
675
+ return this.inner.createAsyncLocalStorage();
676
+ }
677
+ };
572
678
 
573
679
  // src/errors.ts
574
680
  var RuntimeError = class extends Error {
@@ -752,6 +858,19 @@ var PlatformUnsupportedFunction = class extends RuntimeError {
752
858
  this.name = "PlatformUnsupportedFunction";
753
859
  }
754
860
  };
861
+ var CancellationError = class extends RuntimeError {
862
+ static {
863
+ __name(this, "CancellationError");
864
+ }
865
+ constructor(message = "Operation cancelled") {
866
+ super(message);
867
+ this.name = "CancellationError";
868
+ }
869
+ };
870
+ function isCancellationError(err) {
871
+ return !!err && err.name === "CancellationError";
872
+ }
873
+ __name(isCancellationError, "isCancellationError");
755
874
 
756
875
  // src/definers/defineResource.ts
757
876
  function defineResource(constConfig) {
@@ -1044,14 +1163,14 @@ __name(isOptional, "isOptional");
1044
1163
  // src/globals/middleware/requireContext.middleware.ts
1045
1164
  var requireContextTaskMiddleware = defineTaskMiddleware({
1046
1165
  id: "globals.middleware.requireContext",
1047
- async run({ task, next }, deps, config) {
1166
+ async run({ task: task2, next }, deps, config) {
1048
1167
  if (!config.context) {
1049
1168
  throw new Error(
1050
1169
  "Context not available. Did you forget to pass 'context' to the middleware?"
1051
1170
  );
1052
1171
  }
1053
1172
  config.context.use();
1054
- return next(task?.input);
1173
+ return next(task2?.input);
1055
1174
  }
1056
1175
  });
1057
1176
 
@@ -1105,6 +1224,24 @@ var debugTag = defineTag({
1105
1224
  }
1106
1225
  });
1107
1226
 
1227
+ // src/globals/resources/tunnel/tunnel.tag.ts
1228
+ var tunnelTag = defineTag({
1229
+ id: "globals.tags.tunnel",
1230
+ meta: {
1231
+ title: "Tunnel",
1232
+ description: "Marks a resource that exposes a runner to tunnel selected tasks (override task run() with resource.run(taskId, input))."
1233
+ }
1234
+ });
1235
+
1236
+ // src/globals/resources/tunnel/tunnel.policy.tag.ts
1237
+ var tunnelPolicyTag = defineTag({
1238
+ id: "globals.tags.tunnel.middlewarePolicy",
1239
+ meta: {
1240
+ title: "Tunnel Middleware Policy",
1241
+ description: "Controls which middlewares run on caller vs executor when a task is tunneled (whitelist)."
1242
+ }
1243
+ });
1244
+
1108
1245
  // src/globals/globalTags.ts
1109
1246
  var globalTags = {
1110
1247
  system: defineTag({
@@ -1121,7 +1258,9 @@ var globalTags = {
1121
1258
  description: "Marks events that should not be dispatched to global hooks (on: '*')."
1122
1259
  }
1123
1260
  }),
1124
- debug: debugTag
1261
+ debug: debugTag,
1262
+ tunnel: tunnelTag,
1263
+ tunnelPolicy: tunnelPolicyTag
1125
1264
  };
1126
1265
 
1127
1266
  // src/globals/globalEvents.ts
@@ -1158,7 +1297,7 @@ var Queue = class {
1158
1297
  * Schedule an asynchronous task.
1159
1298
  * @param task – receives an AbortSignal so it can cancel early if desired.
1160
1299
  */
1161
- run(task) {
1300
+ run(task2) {
1162
1301
  if (this.disposed) {
1163
1302
  return Promise.reject(new Error("Queue has been disposed"));
1164
1303
  }
@@ -1171,7 +1310,7 @@ var Queue = class {
1171
1310
  }
1172
1311
  const { signal } = this.abortController;
1173
1312
  const result = this.tail.then(
1174
- () => this.hasAsyncLocalStorage ? this.executionContext.run(true, () => task(signal)) : task(signal)
1313
+ () => this.hasAsyncLocalStorage ? this.executionContext.run(true, () => task2(signal)) : task2(signal)
1175
1314
  );
1176
1315
  this.tail = result.catch(() => {
1177
1316
  });
@@ -1203,11 +1342,11 @@ var queueResource = defineResource({
1203
1342
  const map = context.map;
1204
1343
  return {
1205
1344
  map,
1206
- run: /* @__PURE__ */ __name((id2, task) => {
1345
+ run: /* @__PURE__ */ __name((id2, task2) => {
1207
1346
  if (!map.has(id2)) {
1208
1347
  map.set(id2, new Queue());
1209
1348
  }
1210
- return map.get(id2).run(task);
1349
+ return map.get(id2).run(task2);
1211
1350
  }, "run")
1212
1351
  };
1213
1352
  }, "init"),
@@ -1265,6 +1404,14 @@ var globalResources = {
1265
1404
  },
1266
1405
  tags: [systemTag2]
1267
1406
  }),
1407
+ serializer: defineResource({
1408
+ id: "globals.resources.serializer",
1409
+ meta: {
1410
+ title: "Serializer",
1411
+ description: "Serializes and deserializes data. Provides EJSON-compatible stringify/parse and custom type registration via addType."
1412
+ },
1413
+ tags: [systemTag2]
1414
+ }),
1268
1415
  cache: cacheResource,
1269
1416
  queue: queueResource
1270
1417
  };
@@ -1272,8 +1419,8 @@ var globalResources = {
1272
1419
  // src/globals/middleware/retry.middleware.ts
1273
1420
  var retryTaskMiddleware = defineTaskMiddleware({
1274
1421
  id: "globals.middleware.retry.task",
1275
- async run({ task, next }, deps, config) {
1276
- const input = task?.input;
1422
+ async run({ task: task2, next }, deps, config) {
1423
+ const input = task2?.input;
1277
1424
  let attempts = 0;
1278
1425
  const maxRetries = config.retries ?? 3;
1279
1426
  const shouldStop = config.stopRetryIf ?? (() => false);
@@ -1296,8 +1443,8 @@ var retryTaskMiddleware = defineTaskMiddleware({
1296
1443
  });
1297
1444
  var retryResourceMiddleware = defineResourceMiddleware({
1298
1445
  id: "globals.middleware.retry.resource",
1299
- async run({ resource, next }, deps, config) {
1300
- const input = resource?.config;
1446
+ async run({ resource: resource2, next }, deps, config) {
1447
+ const input = resource2?.config;
1301
1448
  let attempts = 0;
1302
1449
  const maxRetries = config.retries ?? 3;
1303
1450
  const shouldStop = config.stopRetryIf ?? (() => false);
@@ -1322,8 +1469,8 @@ var retryResourceMiddleware = defineResourceMiddleware({
1322
1469
  // src/globals/middleware/timeout.middleware.ts
1323
1470
  var timeoutTaskMiddleware = defineTaskMiddleware({
1324
1471
  id: "globals.middleware.timeout.task",
1325
- async run({ task, next }, _deps, config) {
1326
- const input = task?.input;
1472
+ async run({ task: task2, next }, _deps, config) {
1473
+ const input = task2?.input;
1327
1474
  const ttl = Math.max(0, config.ttl);
1328
1475
  const message = `Operation timed out after ${ttl}ms`;
1329
1476
  if (ttl === 0) {
@@ -1348,8 +1495,8 @@ var timeoutTaskMiddleware = defineTaskMiddleware({
1348
1495
  });
1349
1496
  var timeoutResourceMiddleware = defineResourceMiddleware({
1350
1497
  id: "globals.middleware.timeout.resource",
1351
- async run({ resource, next }, _deps, config) {
1352
- const input = resource?.config;
1498
+ async run({ resource: resource2, next }, _deps, config) {
1499
+ const input = resource2?.config;
1353
1500
  const ttl = Math.max(0, config.ttl);
1354
1501
  const message = `Operation timed out after ${ttl}ms`;
1355
1502
  if (ttl === 0) {
@@ -1407,11 +1554,11 @@ var TaskRunner = class {
1407
1554
  * @param task the task to be run
1408
1555
  * @param input the input to be passed to the task
1409
1556
  */
1410
- async run(task, input) {
1411
- let runner = this.runnerStore.get(task.id);
1557
+ async run(task2, input) {
1558
+ let runner = this.runnerStore.get(task2.id);
1412
1559
  if (!runner) {
1413
- runner = this.createRunnerWithMiddleware(task);
1414
- this.runnerStore.set(task.id, runner);
1560
+ runner = this.createRunnerWithMiddleware(task2);
1561
+ this.runnerStore.set(task2.id, runner);
1415
1562
  }
1416
1563
  try {
1417
1564
  return await runner(input);
@@ -1420,7 +1567,7 @@ var TaskRunner = class {
1420
1567
  await this.store.onUnhandledError({
1421
1568
  error,
1422
1569
  kind: "task",
1423
- source: task.id
1570
+ source: task2.id
1424
1571
  });
1425
1572
  } catch (_) {
1426
1573
  }
@@ -1434,8 +1581,8 @@ var TaskRunner = class {
1434
1581
  * @param taskDependencies
1435
1582
  * @returns
1436
1583
  */
1437
- createRunnerWithMiddleware(task) {
1438
- return this.middlewareManager.composeTaskRunner(task);
1584
+ createRunnerWithMiddleware(task2) {
1585
+ return this.middlewareManager.composeTaskRunner(task2);
1439
1586
  }
1440
1587
  };
1441
1588
 
@@ -1583,28 +1730,31 @@ var MiddlewareManager = class {
1583
1730
  * Compose a runner for a task with its local interceptors and applicable middlewares.
1584
1731
  * Returns a function that accepts the task input and resolves to the task output.
1585
1732
  */
1586
- composeTaskRunner(task) {
1587
- const storeTask = this.store.tasks.get(task.id);
1733
+ composeTaskRunner(task2) {
1734
+ const storeTask = this.store.tasks.get(task2.id);
1735
+ const tDef = storeTask.task;
1588
1736
  let next = /* @__PURE__ */ __name(async (input) => {
1589
1737
  let rawInput = input;
1590
- if (task.inputSchema) {
1738
+ const isLocallyTunneled = task2[symbolTunneledTask] === "client" || tDef[symbolTunneledTask] === "client";
1739
+ const runnerTask = isLocallyTunneled ? tDef : task2;
1740
+ if (runnerTask.inputSchema) {
1591
1741
  try {
1592
- rawInput = task.inputSchema.parse(rawInput);
1742
+ rawInput = runnerTask.inputSchema.parse(rawInput);
1593
1743
  } catch (error) {
1594
1744
  throw new ValidationError(
1595
1745
  "Task input",
1596
- task.id,
1746
+ runnerTask.id,
1597
1747
  error instanceof Error ? error : new Error(String(error))
1598
1748
  );
1599
1749
  }
1600
1750
  }
1601
1751
  const deps = storeTask.computedDependencies;
1602
- const rawResult = await task.run.call(null, rawInput, deps);
1603
- if (task.resultSchema) {
1752
+ const rawResult = await runnerTask.run.call(null, rawInput, deps);
1753
+ if (runnerTask.resultSchema) {
1604
1754
  try {
1605
- return task.resultSchema.parse(rawResult);
1755
+ return runnerTask.resultSchema.parse(rawResult);
1606
1756
  } catch (error) {
1607
- throw new ValidationError("Task result", task.id, error);
1757
+ throw new ValidationError("Task result", runnerTask.id, error);
1608
1758
  }
1609
1759
  }
1610
1760
  return rawResult;
@@ -1622,7 +1772,7 @@ var MiddlewareManager = class {
1622
1772
  ].reverse();
1623
1773
  const createExecutionInput = /* @__PURE__ */ __name((input, nextFunc) => ({
1624
1774
  task: {
1625
- definition: task,
1775
+ definition: task2,
1626
1776
  input
1627
1777
  },
1628
1778
  next: nextFunc
@@ -1641,7 +1791,19 @@ var MiddlewareManager = class {
1641
1791
  }
1642
1792
  next = currentNext;
1643
1793
  }
1644
- const createdMiddlewares = this.getApplicableTaskMiddlewares(task);
1794
+ let createdMiddlewares = this.getApplicableTaskMiddlewares(task2);
1795
+ const isLocallyTunneledPolicy = task2[symbolTunneledTask] === "client" || tDef[symbolTunneledTask] === "client";
1796
+ if (isLocallyTunneledPolicy && globalTags.tunnelPolicy.exists(tDef)) {
1797
+ const cfg = globalTags.tunnelPolicy.extract(task2);
1798
+ const allowList = cfg?.client || void 0;
1799
+ if (Array.isArray(allowList)) {
1800
+ const toId = /* @__PURE__ */ __name((x) => typeof x === "string" ? x : x?.id, "toId");
1801
+ const allowed = new Set(allowList.map(toId).filter(Boolean));
1802
+ createdMiddlewares = createdMiddlewares.filter(
1803
+ (m) => allowed.has(m.id)
1804
+ );
1805
+ }
1806
+ }
1645
1807
  if (createdMiddlewares.length === 0) {
1646
1808
  return next;
1647
1809
  }
@@ -1653,7 +1815,7 @@ var MiddlewareManager = class {
1653
1815
  return storeMiddleware.middleware.run(
1654
1816
  {
1655
1817
  task: {
1656
- definition: task,
1818
+ definition: task2,
1657
1819
  input
1658
1820
  },
1659
1821
  next: nextFunction
@@ -1675,29 +1837,29 @@ var MiddlewareManager = class {
1675
1837
  /**
1676
1838
  * Run a resource init wrapped with its applicable middlewares.
1677
1839
  */
1678
- async runResourceInit(resource, config, dependencies, context) {
1840
+ async runResourceInit(resource2, config, dependencies, context) {
1679
1841
  let next = /* @__PURE__ */ __name(async (cfg) => {
1680
- if (!resource.init) return void 0;
1681
- const rawValue = await resource.init.call(
1842
+ if (!resource2.init) return void 0;
1843
+ const rawValue = await resource2.init.call(
1682
1844
  null,
1683
1845
  cfg,
1684
1846
  dependencies,
1685
1847
  context
1686
1848
  );
1687
- if (resource.resultSchema) {
1849
+ if (resource2.resultSchema) {
1688
1850
  try {
1689
- return resource.resultSchema.parse(rawValue);
1851
+ return resource2.resultSchema.parse(rawValue);
1690
1852
  } catch (error) {
1691
1853
  throw new ValidationError(
1692
1854
  "Resource result",
1693
- resource.id,
1855
+ resource2.id,
1694
1856
  error
1695
1857
  );
1696
1858
  }
1697
1859
  }
1698
1860
  return rawValue;
1699
1861
  }, "next");
1700
- const createdMiddlewares = this.getApplicableResourceMiddlewares(resource);
1862
+ const createdMiddlewares = this.getApplicableResourceMiddlewares(resource2);
1701
1863
  for (let i = createdMiddlewares.length - 1; i >= 0; i--) {
1702
1864
  const middleware = createdMiddlewares[i];
1703
1865
  const storeMiddleware = this.store.resourceMiddlewares.get(
@@ -1709,7 +1871,7 @@ var MiddlewareManager = class {
1709
1871
  const result = await storeMiddleware.middleware.run(
1710
1872
  {
1711
1873
  resource: {
1712
- definition: resource,
1874
+ definition: resource2,
1713
1875
  config: cfg
1714
1876
  },
1715
1877
  next: nextFunction
@@ -1723,7 +1885,7 @@ var MiddlewareManager = class {
1723
1885
  await this.store.onUnhandledError({
1724
1886
  error,
1725
1887
  kind: "resourceInit",
1726
- source: resource.id
1888
+ source: resource2.id
1727
1889
  });
1728
1890
  } catch (_) {
1729
1891
  }
@@ -1744,7 +1906,7 @@ var MiddlewareManager = class {
1744
1906
  ].reverse();
1745
1907
  const createExecutionInput = /* @__PURE__ */ __name((config2, nextFunc) => ({
1746
1908
  resource: {
1747
- definition: resource,
1909
+ definition: resource2,
1748
1910
  config: config2
1749
1911
  },
1750
1912
  next: nextFunc
@@ -1765,19 +1927,19 @@ var MiddlewareManager = class {
1765
1927
  }
1766
1928
  return next(config);
1767
1929
  }
1768
- getApplicableTaskMiddlewares(task) {
1769
- const existingMiddlewares = task.middleware;
1930
+ getApplicableTaskMiddlewares(task2) {
1931
+ const existingMiddlewares = task2.middleware;
1770
1932
  const existingMiddlewareIds = existingMiddlewares.map((x) => x.id);
1771
- const globalMiddlewares2 = this.getEverywhereMiddlewareForTasks(task).filter(
1933
+ const globalMiddlewares2 = this.getEverywhereMiddlewareForTasks(task2).filter(
1772
1934
  (x) => !existingMiddlewareIds.includes(x.id)
1773
1935
  );
1774
1936
  return [...globalMiddlewares2, ...existingMiddlewares];
1775
1937
  }
1776
- getApplicableResourceMiddlewares(resource) {
1777
- const existingMiddlewares = resource.middleware;
1938
+ getApplicableResourceMiddlewares(resource2) {
1939
+ const existingMiddlewares = resource2.middleware;
1778
1940
  const existingMiddlewareIds = existingMiddlewares.map((x) => x.id);
1779
1941
  const globalMiddlewares2 = this.getEverywhereMiddlewareForResources(
1780
- resource
1942
+ resource2
1781
1943
  ).filter((x) => !existingMiddlewareIds.includes(x.id));
1782
1944
  return [...globalMiddlewares2, ...existingMiddlewares];
1783
1945
  }
@@ -1785,10 +1947,10 @@ var MiddlewareManager = class {
1785
1947
  * @param task
1786
1948
  * @returns
1787
1949
  */
1788
- getEverywhereMiddlewareForTasks(task) {
1950
+ getEverywhereMiddlewareForTasks(task2) {
1789
1951
  return Array.from(this.store.taskMiddlewares.values()).filter((x) => Boolean(x.middleware.everywhere)).filter((x) => {
1790
1952
  if (typeof x.middleware.everywhere === "function") {
1791
- return x.middleware.everywhere(task);
1953
+ return x.middleware.everywhere(task2);
1792
1954
  }
1793
1955
  return true;
1794
1956
  }).map((x) => x.middleware);
@@ -1825,15 +1987,15 @@ var ResourceInitializer = class {
1825
1987
  * Begins the execution of an task. These are registered tasks and all sanity checks have been performed at this stage to ensure consistency of the object.
1826
1988
  * This function can throw only if any of the event listeners or run function throws
1827
1989
  */
1828
- async initializeResource(resource, config, dependencies) {
1829
- const context = resource.context?.();
1990
+ async initializeResource(resource2, config, dependencies) {
1991
+ const context = resource2.context?.();
1830
1992
  let value;
1831
- if (!resource.init) {
1832
- resource.init = (async () => void 0);
1993
+ if (!resource2.init) {
1994
+ resource2.init = (async () => void 0);
1833
1995
  }
1834
- if (resource.init) {
1996
+ if (resource2.init) {
1835
1997
  value = await this.initWithMiddleware(
1836
- resource,
1998
+ resource2,
1837
1999
  config,
1838
2000
  dependencies,
1839
2001
  context
@@ -1842,9 +2004,9 @@ var ResourceInitializer = class {
1842
2004
  return { value, context };
1843
2005
  }
1844
2006
  // Lifecycle emissions removed
1845
- async initWithMiddleware(resource, config, dependencies, context) {
2007
+ async initWithMiddleware(resource2, config, dependencies, context) {
1846
2008
  return this.middlewareManager.runResourceInit(
1847
- resource,
2009
+ resource2,
1848
2010
  config,
1849
2011
  dependencies,
1850
2012
  context
@@ -2310,45 +2472,45 @@ var DependencyProcessor = class {
2310
2472
  middleware.computedDependencies = computedDependencies;
2311
2473
  middleware.isInitialized = true;
2312
2474
  }
2313
- for (const resource of this.store.resources.values()) {
2314
- await this.processResourceDependencies(resource);
2475
+ for (const resource2 of this.store.resources.values()) {
2476
+ await this.processResourceDependencies(resource2);
2315
2477
  }
2316
- for (const task of this.store.tasks.values()) {
2317
- await this.computeTaskDependencies(task);
2478
+ for (const task2 of this.store.tasks.values()) {
2479
+ await this.computeTaskDependencies(task2);
2318
2480
  }
2319
2481
  for (const hookStoreElement of this.store.hooks.values()) {
2320
- const hook = hookStoreElement.hook;
2321
- const deps = hook.dependencies;
2482
+ const hook2 = hookStoreElement.hook;
2483
+ const deps = hook2.dependencies;
2322
2484
  hookStoreElement.computedDependencies = await this.extractDependencies(
2323
2485
  deps,
2324
- hook.id
2486
+ hook2.id
2325
2487
  );
2326
2488
  }
2327
2489
  await this.initializeUninitializedResources();
2328
2490
  }
2329
- async computeTaskDependencies(task) {
2330
- const deps = task.task.dependencies;
2331
- task.computedDependencies = await this.extractDependencies(
2491
+ async computeTaskDependencies(task2) {
2492
+ const deps = task2.task.dependencies;
2493
+ task2.computedDependencies = await this.extractDependencies(
2332
2494
  deps,
2333
- task.task.id
2495
+ task2.task.id
2334
2496
  );
2335
- task.isInitialized = true;
2497
+ task2.isInitialized = true;
2336
2498
  }
2337
2499
  // Most likely these are resources that no-one has dependencies towards
2338
2500
  // We need to ensure they work too!
2339
2501
  async initializeUninitializedResources() {
2340
- for (const resource of this.store.resources.values()) {
2341
- if (resource.isInitialized === false && // The root is the last one to be initialized and is done in a separate process.
2342
- resource.resource.id !== this.store.root.resource.id) {
2343
- await this.processResourceDependencies(resource);
2502
+ for (const resource2 of this.store.resources.values()) {
2503
+ if (resource2.isInitialized === false && // The root is the last one to be initialized and is done in a separate process.
2504
+ resource2.resource.id !== this.store.root.resource.id) {
2505
+ await this.processResourceDependencies(resource2);
2344
2506
  const { value, context } = await this.resourceInitializer.initializeResource(
2345
- resource.resource,
2346
- resource.config,
2347
- resource.computedDependencies
2507
+ resource2.resource,
2508
+ resource2.config,
2509
+ resource2.computedDependencies
2348
2510
  );
2349
- resource.context = context;
2350
- resource.value = value;
2351
- resource.isInitialized = true;
2511
+ resource2.context = context;
2512
+ resource2.value = value;
2513
+ resource2.isInitialized = true;
2352
2514
  }
2353
2515
  }
2354
2516
  }
@@ -2356,13 +2518,13 @@ var DependencyProcessor = class {
2356
2518
  * Processes dependencies and hooks
2357
2519
  * @param resource
2358
2520
  */
2359
- async processResourceDependencies(resource) {
2360
- const deps = resource.resource.dependencies || {};
2521
+ async processResourceDependencies(resource2) {
2522
+ const deps = resource2.resource.dependencies || {};
2361
2523
  const extracted = await this.extractDependencies(
2362
2524
  deps,
2363
- resource.resource.id
2525
+ resource2.resource.id
2364
2526
  );
2365
- resource.computedDependencies = this.wrapResourceDependencies(
2527
+ resource2.computedDependencies = this.wrapResourceDependencies(
2366
2528
  deps,
2367
2529
  extracted
2368
2530
  );
@@ -2422,20 +2584,20 @@ var DependencyProcessor = class {
2422
2584
  */
2423
2585
  attachListeners() {
2424
2586
  for (const hookStoreElement of this.store.hooks.values()) {
2425
- const hook = hookStoreElement.hook;
2426
- if (hook.on) {
2427
- const eventDefinition = hook.on;
2587
+ const hook2 = hookStoreElement.hook;
2588
+ if (hook2.on) {
2589
+ const eventDefinition = hook2.on;
2428
2590
  const handler = /* @__PURE__ */ __name(async (receivedEvent) => {
2429
- if (receivedEvent.source === hook.id) {
2591
+ if (receivedEvent.source === hook2.id) {
2430
2592
  return;
2431
2593
  }
2432
2594
  return this.eventManager.executeHookWithInterceptors(
2433
- hook,
2595
+ hook2,
2434
2596
  receivedEvent,
2435
2597
  hookStoreElement.computedDependencies
2436
2598
  );
2437
2599
  }, "handler");
2438
- const order = hook.order ?? 0;
2600
+ const order = hook2.order ?? 0;
2439
2601
  if (eventDefinition === "*") {
2440
2602
  this.eventManager.addGlobalListener(handler, { order });
2441
2603
  } else if (Array.isArray(eventDefinition)) {
@@ -2535,14 +2697,14 @@ var DependencyProcessor = class {
2535
2697
  if (storeResource === void 0) {
2536
2698
  throw new DependencyNotFoundError(`Resource ${object.id}`);
2537
2699
  }
2538
- const { resource, config } = storeResource;
2700
+ const { resource: resource2, config } = storeResource;
2539
2701
  if (!storeResource.isInitialized) {
2540
- if (resource.init) {
2541
- const depMap = resource.dependencies || {};
2542
- const raw = await this.extractDependencies(depMap, resource.id);
2702
+ if (resource2.init) {
2703
+ const depMap = resource2.dependencies || {};
2704
+ const raw = await this.extractDependencies(depMap, resource2.id);
2543
2705
  const wrapped = this.wrapResourceDependencies(depMap, raw);
2544
2706
  const { value, context } = await this.resourceInitializer.initializeResource(
2545
- resource,
2707
+ resource2,
2546
2708
  config,
2547
2709
  wrapped
2548
2710
  );
@@ -2622,7 +2784,7 @@ var EventManager = class {
2622
2784
  const excludeFromGlobal = globalTags.excludeFromGlobalHooks.exists(eventDefinition);
2623
2785
  const allListeners = excludeFromGlobal ? this.listeners.get(eventDefinition.id) || [] : this.getCachedMergedListeners(eventDefinition.id);
2624
2786
  let propagationStopped = false;
2625
- const event = {
2787
+ const event2 = {
2626
2788
  id: eventDefinition.id,
2627
2789
  data,
2628
2790
  timestamp: /* @__PURE__ */ new Date(),
@@ -2657,7 +2819,7 @@ var EventManager = class {
2657
2819
  const nextFunction = emitWithInterceptors;
2658
2820
  emitWithInterceptors = /* @__PURE__ */ __name(async (eventToEmit) => interceptor(nextFunction, eventToEmit), "emitWithInterceptors");
2659
2821
  }
2660
- await emitWithInterceptors(event);
2822
+ await emitWithInterceptors(event2);
2661
2823
  }, "processEmission");
2662
2824
  if (this.runtimeCycleDetection && this.emissionStack && this.currentHookIdContext) {
2663
2825
  const currentStack = this.emissionStack.getStore();
@@ -2691,7 +2853,7 @@ var EventManager = class {
2691
2853
  * @param handler - The callback function to handle the event
2692
2854
  * @param options - Configuration options for the listener
2693
2855
  */
2694
- addListener(event, handler, options = HandlerOptionsDefaults) {
2856
+ addListener(event2, handler, options = HandlerOptionsDefaults) {
2695
2857
  this.checkLock();
2696
2858
  const newListener = {
2697
2859
  handler,
@@ -2700,10 +2862,10 @@ var EventManager = class {
2700
2862
  id: options.id,
2701
2863
  isGlobal: false
2702
2864
  };
2703
- if (Array.isArray(event)) {
2704
- event.forEach((id2) => this.addListener(id2, handler, options));
2865
+ if (Array.isArray(event2)) {
2866
+ event2.forEach((id2) => this.addListener(id2, handler, options));
2705
2867
  } else {
2706
- const eventId = event.id;
2868
+ const eventId = event2.id;
2707
2869
  const listeners = this.listeners.get(eventId);
2708
2870
  if (listeners) {
2709
2871
  this.insertListener(listeners, newListener);
@@ -2780,7 +2942,7 @@ var EventManager = class {
2780
2942
  * @param computedDependencies - The computed dependencies for the hook
2781
2943
  * @returns Promise resolving to the hook execution result
2782
2944
  */
2783
- async executeHookWithInterceptors(hook, event, computedDependencies) {
2945
+ async executeHookWithInterceptors(hook2, event2, computedDependencies) {
2784
2946
  const baseExecute = /* @__PURE__ */ __name(async (hookToExecute, eventForHook) => {
2785
2947
  try {
2786
2948
  const result = await hookToExecute.run(
@@ -2800,11 +2962,11 @@ var EventManager = class {
2800
2962
  }
2801
2963
  if (this.runtimeCycleDetection) {
2802
2964
  return await this.currentHookIdContext?.run(
2803
- hook.id,
2804
- async () => await executeWithInterceptors(hook, event)
2965
+ hook2.id,
2966
+ async () => await executeWithInterceptors(hook2, event2)
2805
2967
  );
2806
2968
  } else {
2807
- return await executeWithInterceptors(hook, event);
2969
+ return await executeWithInterceptors(hook2, event2);
2808
2970
  }
2809
2971
  }
2810
2972
  // ==================== PRIVATE METHODS ====================
@@ -2865,8 +3027,8 @@ var EventManager = class {
2865
3027
  * @param event - The event emission to check
2866
3028
  * @returns true if event should exclude global listeners
2867
3029
  */
2868
- isExcludedFromGlobal(event) {
2869
- return globalTags.excludeFromGlobalHooks.exists(event);
3030
+ isExcludedFromGlobal(event2) {
3031
+ return globalTags.excludeFromGlobalHooks.exists(event2);
2870
3032
  }
2871
3033
  /**
2872
3034
  * Retrieves cached merged listeners for an event, or creates them if not cached.
@@ -2991,25 +3153,25 @@ var StoreValidator = class {
2991
3153
  }
2992
3154
  }
2993
3155
  runSanityChecks() {
2994
- for (const task of this.registry.tasks.values()) {
2995
- const middlewares = task.task.middleware;
3156
+ for (const task2 of this.registry.tasks.values()) {
3157
+ const middlewares = task2.task.middleware;
2996
3158
  middlewares.forEach((middlewareAttachment) => {
2997
3159
  if (!this.registry.taskMiddlewares.has(middlewareAttachment.id)) {
2998
3160
  throw new MiddlewareNotRegisteredError(
2999
3161
  "task",
3000
- task.task.id,
3162
+ task2.task.id,
3001
3163
  middlewareAttachment.id
3002
3164
  );
3003
3165
  }
3004
3166
  });
3005
3167
  }
3006
- for (const resource of this.registry.resources.values()) {
3007
- const middlewares = resource.resource.middleware;
3168
+ for (const resource2 of this.registry.resources.values()) {
3169
+ const middlewares = resource2.resource.middleware;
3008
3170
  middlewares.forEach((middlewareAttachment) => {
3009
3171
  if (!this.registry.resourceMiddlewares.has(middlewareAttachment.id)) {
3010
3172
  throw new MiddlewareNotRegisteredError(
3011
3173
  "resource",
3012
- resource.resource.id,
3174
+ resource2.resource.id,
3013
3175
  middlewareAttachment.id
3014
3176
  );
3015
3177
  }
@@ -3033,9 +3195,9 @@ var StoreValidator = class {
3033
3195
  for (const taggable of taggables) {
3034
3196
  const tags = taggable.tags;
3035
3197
  if (tags) {
3036
- for (const tag of tags) {
3037
- if (!this.registry.tags.has(tag.id)) {
3038
- throw new TagNotFoundError(tag.id);
3198
+ for (const tag2 of tags) {
3199
+ if (!this.registry.tags.has(tag2.id)) {
3200
+ throw new TagNotFoundError(tag2.id);
3039
3201
  }
3040
3202
  }
3041
3203
  }
@@ -3089,9 +3251,9 @@ var StoreRegistry = class {
3089
3251
  }
3090
3252
  storeHook(item, overrideMode = "normal") {
3091
3253
  overrideMode === "normal" && this.validator.checkIfIDExists(item.id);
3092
- const hook = this.getFreshValue(item, this.hooks, "hook", overrideMode);
3093
- this.hooks.set(hook.id, {
3094
- hook,
3254
+ const hook2 = this.getFreshValue(item, this.hooks, "hook", overrideMode);
3255
+ this.hooks.set(hook2.id, {
3256
+ hook: hook2,
3095
3257
  computedDependencies: {}
3096
3258
  });
3097
3259
  }
@@ -3173,9 +3335,9 @@ var StoreRegistry = class {
3173
3335
  }
3174
3336
  storeTask(item, storingMode = "normal") {
3175
3337
  storingMode === "normal" && this.validator.checkIfIDExists(item.id);
3176
- const task = this.getFreshValue(item, this.tasks, "task", storingMode);
3177
- this.tasks.set(task.id, {
3178
- task,
3338
+ const task2 = this.getFreshValue(item, this.tasks, "task", storingMode);
3339
+ this.tasks.set(task2.id, {
3340
+ task: task2,
3179
3341
  computedDependencies: {},
3180
3342
  isInitialized: false
3181
3343
  });
@@ -3185,11 +3347,11 @@ var StoreRegistry = class {
3185
3347
  const depenedants = [];
3186
3348
  const nodeMap = /* @__PURE__ */ new Map();
3187
3349
  this.setupBlankNodes(nodeMap, depenedants);
3188
- for (const task of this.tasks.values()) {
3189
- const node = nodeMap.get(task.task.id);
3190
- if (task.task.dependencies) {
3350
+ for (const task2 of this.tasks.values()) {
3351
+ const node = nodeMap.get(task2.task.id);
3352
+ if (task2.task.dependencies) {
3191
3353
  for (const [depKey, depItem] of Object.entries(
3192
- task.task.dependencies
3354
+ task2.task.dependencies
3193
3355
  )) {
3194
3356
  const candidate = isOptional(depItem) ? depItem.inner : depItem;
3195
3357
  const depNode = nodeMap.get(candidate.id);
@@ -3198,7 +3360,7 @@ var StoreRegistry = class {
3198
3360
  }
3199
3361
  }
3200
3362
  }
3201
- const t = task.task;
3363
+ const t = task2.task;
3202
3364
  for (const middleware of t.middleware) {
3203
3365
  const middlewareNode = nodeMap.get(middleware.id);
3204
3366
  if (middlewareNode) {
@@ -3222,9 +3384,9 @@ var StoreRegistry = class {
3222
3384
  }
3223
3385
  if (middleware.everywhere) {
3224
3386
  const filter = typeof middleware.everywhere === "function" ? middleware.everywhere : () => true;
3225
- for (const task of this.tasks.values()) {
3226
- if (filter(task.task)) {
3227
- const taskNode = nodeMap.get(task.task.id);
3387
+ for (const task2 of this.tasks.values()) {
3388
+ if (filter(task2.task)) {
3389
+ const taskNode = nodeMap.get(task2.task.id);
3228
3390
  taskNode.dependencies[`__middleware.${middleware.id}`] = node;
3229
3391
  }
3230
3392
  }
@@ -3246,19 +3408,19 @@ var StoreRegistry = class {
3246
3408
  }
3247
3409
  if (middleware.everywhere) {
3248
3410
  const filter = typeof middleware.everywhere === "function" ? middleware.everywhere : () => true;
3249
- for (const resource of this.resources.values()) {
3250
- if (filter(resource.resource)) {
3251
- const resourceNode = nodeMap.get(resource.resource.id);
3411
+ for (const resource2 of this.resources.values()) {
3412
+ if (filter(resource2.resource)) {
3413
+ const resourceNode = nodeMap.get(resource2.resource.id);
3252
3414
  resourceNode.dependencies[`__middleware.${middleware.id}`] = node;
3253
3415
  }
3254
3416
  }
3255
3417
  }
3256
3418
  }
3257
- for (const resource of this.resources.values()) {
3258
- const node = nodeMap.get(resource.resource.id);
3259
- if (resource.resource.dependencies) {
3419
+ for (const resource2 of this.resources.values()) {
3420
+ const node = nodeMap.get(resource2.resource.id);
3421
+ if (resource2.resource.dependencies) {
3260
3422
  for (const [depKey, depItem] of Object.entries(
3261
- resource.resource.dependencies
3423
+ resource2.resource.dependencies
3262
3424
  )) {
3263
3425
  const candidate = isOptional(depItem) ? depItem.inner : depItem;
3264
3426
  const depNode = nodeMap.get(candidate.id);
@@ -3267,18 +3429,18 @@ var StoreRegistry = class {
3267
3429
  }
3268
3430
  }
3269
3431
  }
3270
- for (const middleware of resource.resource.middleware) {
3432
+ for (const middleware of resource2.resource.middleware) {
3271
3433
  const middlewareNode = nodeMap.get(middleware.id);
3272
3434
  if (middlewareNode) {
3273
3435
  node.dependencies[middleware.id] = middlewareNode;
3274
3436
  }
3275
3437
  }
3276
3438
  }
3277
- for (const hook of this.hooks.values()) {
3278
- const node = nodeMap.get(hook.hook.id);
3279
- if (hook.hook.dependencies) {
3439
+ for (const hook2 of this.hooks.values()) {
3440
+ const node = nodeMap.get(hook2.hook.id);
3441
+ if (hook2.hook.dependencies) {
3280
3442
  for (const [depKey, depItem] of Object.entries(
3281
- hook.hook.dependencies
3443
+ hook2.hook.dependencies
3282
3444
  )) {
3283
3445
  const candidate = isOptional(depItem) ? depItem.inner : depItem;
3284
3446
  const depNode = nodeMap.get(candidate.id);
@@ -3330,12 +3492,12 @@ var StoreRegistry = class {
3330
3492
  return Array.from(nodes.values());
3331
3493
  }
3332
3494
  setupBlankNodes(nodeMap, depenedants) {
3333
- for (const task of this.tasks.values()) {
3495
+ for (const task2 of this.tasks.values()) {
3334
3496
  const node = {
3335
- id: task.task.id,
3497
+ id: task2.task.id,
3336
3498
  dependencies: {}
3337
3499
  };
3338
- nodeMap.set(task.task.id, node);
3500
+ nodeMap.set(task2.task.id, node);
3339
3501
  depenedants.push(node);
3340
3502
  }
3341
3503
  for (const middleware of this.taskMiddlewares.values()) {
@@ -3354,31 +3516,31 @@ var StoreRegistry = class {
3354
3516
  nodeMap.set(middleware.middleware.id, node);
3355
3517
  depenedants.push(node);
3356
3518
  }
3357
- for (const resource of this.resources.values()) {
3519
+ for (const resource2 of this.resources.values()) {
3358
3520
  const node = {
3359
- id: resource.resource.id,
3521
+ id: resource2.resource.id,
3360
3522
  dependencies: {}
3361
3523
  };
3362
- nodeMap.set(resource.resource.id, node);
3524
+ nodeMap.set(resource2.resource.id, node);
3363
3525
  depenedants.push(node);
3364
3526
  }
3365
- for (const hook of this.hooks.values()) {
3527
+ for (const hook2 of this.hooks.values()) {
3366
3528
  const node = {
3367
- id: hook.hook.id,
3529
+ id: hook2.hook.id,
3368
3530
  dependencies: {}
3369
3531
  };
3370
- nodeMap.set(hook.hook.id, node);
3532
+ nodeMap.set(hook2.hook.id, node);
3371
3533
  depenedants.push(node);
3372
3534
  }
3373
3535
  }
3374
- getTasksWithTag(tag) {
3375
- const tagId = typeof tag === "string" ? tag : tag.id;
3536
+ getTasksWithTag(tag2) {
3537
+ const tagId = typeof tag2 === "string" ? tag2 : tag2.id;
3376
3538
  return Array.from(this.tasks.values()).filter((x) => {
3377
3539
  return x.task.tags.some((t) => t.id === tagId);
3378
3540
  }).map((x) => x.task);
3379
3541
  }
3380
- getResourcesWithTag(tag) {
3381
- const tagId = typeof tag === "string" ? tag : tag.id;
3542
+ getResourcesWithTag(tag2) {
3543
+ const tagId = typeof tag2 === "string" ? tag2 : tag2.id;
3382
3544
  return Array.from(this.resources.values()).filter((x) => {
3383
3545
  return x.resource.tags.some((t) => t.id === tagId);
3384
3546
  }).map((x) => x.resource);
@@ -3467,7 +3629,132 @@ var OverrideManager = class {
3467
3629
  }
3468
3630
  };
3469
3631
 
3470
- // src/models/Store.ts
3632
+ // src/globals/middleware/tunnel.middleware.ts
3633
+ var originalRuns = /* @__PURE__ */ new WeakMap();
3634
+ var tunnelResourceMiddleware = defineResourceMiddleware({
3635
+ id: "globals.middleware.resource.tunnel",
3636
+ dependencies: {
3637
+ store: globalResources.store,
3638
+ eventManager: globalResources.eventManager
3639
+ },
3640
+ // Only applies to resources tagged with globals.tags.tunnel
3641
+ everywhere: /* @__PURE__ */ __name((resource2) => globalTags.tunnel.exists(resource2), "everywhere"),
3642
+ run: /* @__PURE__ */ __name(async ({ resource: resource2, next }, { store: store2, eventManager }) => {
3643
+ const value = await next(resource2.config);
3644
+ const mode = value.mode || "none";
3645
+ const delivery = value.eventDeliveryMode || "mirror";
3646
+ const tasks = value.tasks ? resolveTasks(store2, value.tasks) : [];
3647
+ const events = value.events ? resolveEvents(store2, value.events) : [];
3648
+ if (mode === "client" || mode === "both") {
3649
+ if (tasks.length > 0 && typeof value.run !== "function") {
3650
+ throw new Error(
3651
+ "Tunnel resource value must implement run(task, input) when tasks[] is configured."
3652
+ );
3653
+ }
3654
+ if (events.length > 0 && typeof value.emit !== "function") {
3655
+ throw new Error(
3656
+ "Tunnel resource value must implement emit(event, payload) when events[] is configured."
3657
+ );
3658
+ }
3659
+ }
3660
+ if (mode === "none" || mode === "server") {
3661
+ return value;
3662
+ }
3663
+ for (const t of tasks) {
3664
+ if (!originalRuns.has(t)) {
3665
+ originalRuns.set(t, t.run);
3666
+ }
3667
+ t.run = (async (input) => {
3668
+ return value.run(t, input);
3669
+ });
3670
+ t[symbolTunneledTask] = "client";
3671
+ }
3672
+ if (events.length > 0) {
3673
+ const selectedEventIds = new Set(events.map((e) => e.id));
3674
+ eventManager.intercept(
3675
+ async (next2, emission) => {
3676
+ if (!selectedEventIds.has(emission.id)) {
3677
+ return next2(emission);
3678
+ }
3679
+ if (delivery === "local-only") {
3680
+ return next2(emission);
3681
+ }
3682
+ if (delivery === "remote-only") {
3683
+ return value.emit(emission);
3684
+ }
3685
+ if (delivery === "remote-first") {
3686
+ try {
3687
+ await value.emit(emission);
3688
+ } catch (_) {
3689
+ return next2(emission);
3690
+ }
3691
+ return;
3692
+ }
3693
+ await next2(emission);
3694
+ return value.emit(emission);
3695
+ }
3696
+ );
3697
+ }
3698
+ return value;
3699
+ }, "run"),
3700
+ tags: [globalTags.system]
3701
+ });
3702
+ function resolveTasks(store2, selector) {
3703
+ const out = [];
3704
+ if (typeof selector === "function") {
3705
+ for (const t of store2.tasks.values()) {
3706
+ if (selector(t.task)) {
3707
+ out.push(t.task);
3708
+ }
3709
+ }
3710
+ return out;
3711
+ }
3712
+ for (const item of selector) {
3713
+ if (typeof item === "string") {
3714
+ const st = store2.tasks.get(item);
3715
+ if (!st)
3716
+ throw new Error(
3717
+ `Task ${item} not found while trying to resolve tasks for tunnel.`
3718
+ );
3719
+ out.push(st.task);
3720
+ } else if (item && typeof item === "object") {
3721
+ const st = store2.tasks.get(item.id);
3722
+ if (!st)
3723
+ throw new Error(
3724
+ `Task ${item} not found while trying to resolve tasks for tunnel.`
3725
+ );
3726
+ out.push(st.task);
3727
+ }
3728
+ }
3729
+ return out;
3730
+ }
3731
+ __name(resolveTasks, "resolveTasks");
3732
+ function resolveEvents(store2, selector) {
3733
+ const out = [];
3734
+ if (typeof selector === "function") {
3735
+ for (const e of store2.events.values()) {
3736
+ if (selector(e.event)) {
3737
+ out.push(e.event);
3738
+ }
3739
+ }
3740
+ return out;
3741
+ }
3742
+ for (const item of selector) {
3743
+ let st;
3744
+ if (typeof item === "string") {
3745
+ st = store2.events.get(item);
3746
+ } else if (item && typeof item === "object") {
3747
+ st = store2.events.get(item.id);
3748
+ }
3749
+ if (!st)
3750
+ throw new Error(
3751
+ `Event ${item} not found while trying to resolve events for tunnel.`
3752
+ );
3753
+ out.push(st.event);
3754
+ }
3755
+ return out;
3756
+ }
3757
+ __name(resolveEvents, "resolveEvents");
3471
3758
  var Store = class {
3472
3759
  constructor(eventManager, logger, onUnhandledError) {
3473
3760
  this.eventManager = eventManager;
@@ -3533,24 +3820,25 @@ var Store = class {
3533
3820
  builtInResourcesMap.set(globalResources.eventManager, this.eventManager);
3534
3821
  builtInResourcesMap.set(globalResources.logger, this.logger);
3535
3822
  builtInResourcesMap.set(globalResources.taskRunner, this.taskRunner);
3823
+ builtInResourcesMap.set(globalResources.serializer, EJSON);
3536
3824
  builtInResourcesMap.set(
3537
3825
  globalResources.middlewareManager,
3538
3826
  this.middlewareManager
3539
3827
  );
3540
3828
  this.registry.storeGenericItem(globalResources.queue);
3541
- for (const [resource, value] of builtInResourcesMap.entries()) {
3542
- this.registry.storeGenericItem(resource);
3543
- const entry = this.resources.get(resource.id);
3829
+ for (const [resource2, value] of builtInResourcesMap.entries()) {
3830
+ this.registry.storeGenericItem(resource2);
3831
+ const entry = this.resources.get(resource2.id);
3544
3832
  if (entry) {
3545
3833
  entry.value = value;
3546
3834
  entry.isInitialized = true;
3547
3835
  }
3548
3836
  }
3549
- Object.values(globalTags).forEach((tag) => {
3550
- this.registry.storeTag(tag);
3837
+ Object.values(globalTags).forEach((tag2) => {
3838
+ this.registry.storeTag(tag2);
3551
3839
  });
3552
- globalEventsArray.forEach((event) => {
3553
- this.registry.storeEvent(event);
3840
+ globalEventsArray.forEach((event2) => {
3841
+ this.registry.storeEvent(event2);
3554
3842
  });
3555
3843
  const builtInTaskMiddlewares = [
3556
3844
  requireContextTaskMiddleware,
@@ -3566,7 +3854,8 @@ var Store = class {
3566
3854
  });
3567
3855
  const builtInResourceMiddlewares = [
3568
3856
  retryResourceMiddleware,
3569
- timeoutResourceMiddleware
3857
+ timeoutResourceMiddleware,
3858
+ tunnelResourceMiddleware
3570
3859
  ];
3571
3860
  builtInResourceMiddlewares.forEach((middleware) => {
3572
3861
  this.registry.resourceMiddlewares.set(middleware.id, {
@@ -3613,19 +3902,19 @@ var Store = class {
3613
3902
  this.registerGlobalComponents();
3614
3903
  this.setupRootResource(root, config);
3615
3904
  this.validator.runSanityChecks();
3616
- for (const resource of this.resources.values()) {
3617
- this.overrideManager.storeOverridesDeeply(resource.resource);
3905
+ for (const resource2 of this.resources.values()) {
3906
+ this.overrideManager.storeOverridesDeeply(resource2.resource);
3618
3907
  }
3619
3908
  this.#isInitialized = true;
3620
3909
  }
3621
3910
  async dispose() {
3622
- for (const resource of this.resources.values()) {
3623
- if (resource.isInitialized && resource.resource.dispose) {
3624
- await resource.resource.dispose(
3625
- resource.value,
3626
- resource.config,
3627
- resource.computedDependencies,
3628
- resource.context
3911
+ for (const resource2 of this.resources.values()) {
3912
+ if (resource2.isInitialized && resource2.resource.dispose) {
3913
+ await resource2.resource.dispose(
3914
+ resource2.value,
3915
+ resource2.config,
3916
+ resource2.computedDependencies,
3917
+ resource2.context
3629
3918
  );
3630
3919
  }
3631
3920
  }
@@ -3649,16 +3938,16 @@ var Store = class {
3649
3938
  * @param tag - The tag to filter by.
3650
3939
  * @returns The tasks with the given tag.
3651
3940
  */
3652
- getTasksWithTag(tag) {
3653
- return this.registry.getTasksWithTag(tag);
3941
+ getTasksWithTag(tag2) {
3942
+ return this.registry.getTasksWithTag(tag2);
3654
3943
  }
3655
3944
  /**
3656
3945
  * Returns all resources with the given tag.
3657
3946
  * @param tag - The tag to filter by.
3658
3947
  * @returns The resources with the given tag.
3659
3948
  */
3660
- getResourcesWithTag(tag) {
3661
- return this.registry.getResourcesWithTag(tag);
3949
+ getResourcesWithTag(tag2) {
3950
+ return this.registry.getResourcesWithTag(tag2);
3662
3951
  }
3663
3952
  };
3664
3953
 
@@ -3756,16 +4045,16 @@ var globalEventListener = defineHook({
3756
4045
  logger: globalResources.logger,
3757
4046
  debugConfig
3758
4047
  },
3759
- run: /* @__PURE__ */ __name(async (event, { logger, debugConfig: debugConfig2 }) => {
3760
- if (hasSystemTag(event)) {
4048
+ run: /* @__PURE__ */ __name(async (event2, { logger, debugConfig: debugConfig2 }) => {
4049
+ if (hasSystemTag(event2)) {
3761
4050
  return;
3762
4051
  }
3763
- debugConfig2 = getConfig(debugConfig2, event);
4052
+ debugConfig2 = getConfig(debugConfig2, event2);
3764
4053
  if (debugConfig2.logEventEmissionOnRun) {
3765
- const message = `Event ${String(event.id)} emitted`;
4054
+ const message = `Event ${String(event2.id)} emitted`;
3766
4055
  await logger.info(message, {
3767
4056
  source: "globals.debug.hooks.onAnyEvent",
3768
- data: debugConfig2.logEventEmissionInput ? { data: event.data } : void 0
4057
+ data: debugConfig2.logEventEmissionInput ? { data: event2.data } : void 0
3769
4058
  });
3770
4059
  }
3771
4060
  }, "run"),
@@ -3779,26 +4068,26 @@ var globalEventListener = defineHook({
3779
4068
  // src/globals/resources/debug/executionTracker.middleware.ts
3780
4069
  var tasksTrackerMiddleware = defineTaskMiddleware({
3781
4070
  id: "globals.debug.middleware.task.executionTracker",
3782
- everywhere: /* @__PURE__ */ __name((task) => !globalTags.system.exists(task), "everywhere"),
4071
+ everywhere: /* @__PURE__ */ __name((task2) => !globalTags.system.exists(task2), "everywhere"),
3783
4072
  dependencies: {
3784
4073
  logger: globalResources.logger,
3785
4074
  debugConfig,
3786
4075
  store: globalResources.store
3787
4076
  },
3788
- run: /* @__PURE__ */ __name(async ({ task, next }, { logger, debugConfig: debugConfig2, store: store2 }) => {
4077
+ run: /* @__PURE__ */ __name(async ({ task: task2, next }, { logger, debugConfig: debugConfig2, store: store2 }) => {
3789
4078
  const start = Date.now();
3790
4079
  logger = logger.with({
3791
4080
  source: tasksTrackerMiddleware.id
3792
4081
  });
3793
- debugConfig2 = getConfig(debugConfig2, task?.definition);
3794
- const taskStartMessage = `Task ${task.definition.id} is running...`;
3795
- const shouldShowData = debugConfig2.logTaskInput && task.input;
4082
+ debugConfig2 = getConfig(debugConfig2, task2?.definition);
4083
+ const taskStartMessage = `Task ${task2.definition.id} is running...`;
4084
+ const shouldShowData = debugConfig2.logTaskInput && task2.input;
3796
4085
  await logger.info(taskStartMessage, {
3797
- data: shouldShowData ? { input: task.input } : void 0
4086
+ data: shouldShowData ? { input: task2.input } : void 0
3798
4087
  });
3799
- const result = await next(task.input);
4088
+ const result = await next(task2.input);
3800
4089
  const duration = Date.now() - start;
3801
- const taskCompleteMessage = `Task ${task.definition.id} completed in ${duration}ms`;
4090
+ const taskCompleteMessage = `Task ${task2.definition.id} completed in ${duration}ms`;
3802
4091
  const shouldShowResult = debugConfig2.logTaskOutput && result;
3803
4092
  await logger.info(taskCompleteMessage, {
3804
4093
  data: shouldShowResult ? { result } : void 0
@@ -3818,23 +4107,23 @@ var resourcesTrackerMiddleware = defineResourceMiddleware({
3818
4107
  debugConfig,
3819
4108
  store: globalResources.store
3820
4109
  },
3821
- everywhere: /* @__PURE__ */ __name((resource) => !globalTags.system.exists(resource), "everywhere"),
3822
- run: /* @__PURE__ */ __name(async ({ resource, next }, { logger, debugConfig: debugConfig2, store: store2 }) => {
4110
+ everywhere: /* @__PURE__ */ __name((resource2) => !globalTags.system.exists(resource2), "everywhere"),
4111
+ run: /* @__PURE__ */ __name(async ({ resource: resource2, next }, { logger, debugConfig: debugConfig2, store: store2 }) => {
3823
4112
  const start = Date.now();
3824
4113
  logger = logger.with({
3825
4114
  source: resourcesTrackerMiddleware.id
3826
4115
  });
3827
- debugConfig2 = getConfig(debugConfig2, resource?.definition);
3828
- const resourceStartMessage = `Resource ${resource.definition.id} is initializing...`;
3829
- const isConfigEmpty = Object.keys(resource.config || {}).length === 0;
4116
+ debugConfig2 = getConfig(debugConfig2, resource2?.definition);
4117
+ const resourceStartMessage = `Resource ${resource2.definition.id} is initializing...`;
4118
+ const isConfigEmpty = Object.keys(resource2.config || {}).length === 0;
3830
4119
  const shouldShowConfig = debugConfig2.logResourceConfig && !isConfigEmpty;
3831
4120
  await logger.info(resourceStartMessage, {
3832
- data: shouldShowConfig ? { config: resource.config } : void 0
4121
+ data: shouldShowConfig ? { config: resource2.config } : void 0
3833
4122
  });
3834
- const result = await next(resource.config);
4123
+ const result = await next(resource2.config);
3835
4124
  const duration = Date.now() - start;
3836
4125
  const resourceCompleteMessage = `Resource ${String(
3837
- resource.definition.id
4126
+ resource2.definition.id
3838
4127
  )} initialized in ${duration}ms`;
3839
4128
  const shouldShowResult = debugConfig2.logResourceValue && result !== void 0;
3840
4129
  await logger.info(resourceCompleteMessage, {
@@ -3863,14 +4152,14 @@ var middlewareInterceptorResource = defineResource({
3863
4152
  debugConfig,
3864
4153
  middlewareManager: globalResources.middlewareManager
3865
4154
  },
3866
- init: /* @__PURE__ */ __name(async (event, deps) => {
4155
+ init: /* @__PURE__ */ __name(async (event2, deps) => {
3867
4156
  const { logger, debugConfig: debugConfig2, middlewareManager } = deps;
3868
4157
  middlewareManager.intercept(
3869
4158
  "task",
3870
4159
  async (next, input) => {
3871
4160
  const taskDef = input.task.definition;
3872
4161
  if (!hasSystemTag(taskDef)) {
3873
- const cfg = getConfig(debugConfig2, event);
4162
+ const cfg = getConfig(debugConfig2, event2);
3874
4163
  if (cfg.logMiddlewareBeforeRun) {
3875
4164
  const msg = `Middleware triggered for task ${String(taskDef.id)}`;
3876
4165
  await logger.info(msg, {
@@ -3880,7 +4169,7 @@ var middlewareInterceptorResource = defineResource({
3880
4169
  }
3881
4170
  const result = await next(input);
3882
4171
  if (!hasSystemTag(taskDef)) {
3883
- const cfg = getConfig(debugConfig2, event);
4172
+ const cfg = getConfig(debugConfig2, event2);
3884
4173
  if (cfg.logMiddlewareAfterRun) {
3885
4174
  const msg = `Middleware completed for task ${String(taskDef.id)}`;
3886
4175
  await logger.info(msg, {
@@ -3896,7 +4185,7 @@ var middlewareInterceptorResource = defineResource({
3896
4185
  async (next, input) => {
3897
4186
  const resourceDef = input.resource.definition;
3898
4187
  if (!hasSystemTag(resourceDef)) {
3899
- const cfg = getConfig(debugConfig2, event);
4188
+ const cfg = getConfig(debugConfig2, event2);
3900
4189
  if (cfg.logMiddlewareBeforeRun) {
3901
4190
  const msg = `Middleware triggered for resource ${String(
3902
4191
  resourceDef.id
@@ -3908,7 +4197,7 @@ var middlewareInterceptorResource = defineResource({
3908
4197
  }
3909
4198
  const result = await next(input);
3910
4199
  if (!hasSystemTag(resourceDef)) {
3911
- const cfg = getConfig(debugConfig2, event);
4200
+ const cfg = getConfig(debugConfig2, event2);
3912
4201
  if (cfg.logMiddlewareAfterRun) {
3913
4202
  const msg = `Middleware completed for resource ${String(
3914
4203
  resourceDef.id
@@ -3937,23 +4226,23 @@ var hookInterceptorResource = defineResource({
3937
4226
  debugConfig,
3938
4227
  eventManager: globalResources.eventManager
3939
4228
  },
3940
- init: /* @__PURE__ */ __name(async (event, deps) => {
3941
- deps.eventManager.interceptHook(async (next, hook, event2) => {
4229
+ init: /* @__PURE__ */ __name(async (event2, deps) => {
4230
+ deps.eventManager.interceptHook(async (next, hook2, event3) => {
3942
4231
  const { logger, debugConfig: debugConfig2 } = deps;
3943
- if (hasSystemTag(hook)) {
3944
- return await next(hook, event2);
4232
+ if (hasSystemTag(hook2)) {
4233
+ return await next(hook2, event3);
3945
4234
  }
3946
- const resolved = getConfig(debugConfig2, event2);
4235
+ const resolved = getConfig(debugConfig2, event3);
3947
4236
  if (resolved.logHookTriggered) {
3948
- const hookId = hook.id;
4237
+ const hookId = hook2.id;
3949
4238
  let logString = `Hook triggered for ${String(hookId)}`;
3950
4239
  await logger.info(logString, {
3951
4240
  source: "globals.debug.resources.hookInterceptor"
3952
4241
  });
3953
4242
  }
3954
- await next(hook, event2);
4243
+ await next(hook2, event3);
3955
4244
  if (resolved.logHookCompleted) {
3956
- const hookId = hook.id;
4245
+ const hookId = hook2.id;
3957
4246
  let logString = `Hook completed for ${String(hookId)}`;
3958
4247
  await logger.info(logString, {
3959
4248
  source: "globals.debug.resources.hookInterceptor"
@@ -4034,13 +4323,7 @@ function installGlobalShutdownHooksOnce() {
4034
4323
  activeDisposers.delete(d);
4035
4324
  }
4036
4325
  } finally {
4037
- try {
4038
- platform2.exit(0);
4039
- } catch (e) {
4040
- if (!(e instanceof PlatformUnsupportedFunction)) {
4041
- throw e;
4042
- }
4043
- }
4326
+ platform2.exit(0);
4044
4327
  }
4045
4328
  }, "handler");
4046
4329
  platform2.onShutdownSignal(handler);
@@ -4101,38 +4384,38 @@ var RunResult = class {
4101
4384
  * @param args - The arguments to pass to the task.
4102
4385
  * @returns The result of the task.
4103
4386
  */
4104
- this.runTask = /* @__PURE__ */ __name((task, ...args) => {
4105
- if (typeof task === "string") {
4106
- const taskId = task;
4387
+ this.runTask = /* @__PURE__ */ __name((task2, ...args) => {
4388
+ if (typeof task2 === "string") {
4389
+ const taskId = task2;
4107
4390
  if (!this.store.tasks.has(taskId)) {
4108
4391
  throw new RuntimeError(`Task "${taskId}" not found.`);
4109
4392
  }
4110
- task = this.store.tasks.get(taskId).task;
4393
+ task2 = this.store.tasks.get(taskId).task;
4111
4394
  }
4112
- return this.taskRunner.run(task, ...args);
4395
+ return this.taskRunner.run(task2, ...args);
4113
4396
  }, "runTask");
4114
4397
  /**
4115
4398
  * Emit an event within the context of the run result.
4116
4399
  * @param event - The event to emit.
4117
4400
  * @param payload - The payload to emit.
4118
4401
  */
4119
- this.emitEvent = /* @__PURE__ */ __name((event, payload) => {
4120
- if (typeof event === "string") {
4121
- const eventId = event;
4402
+ this.emitEvent = /* @__PURE__ */ __name((event2, payload) => {
4403
+ if (typeof event2 === "string") {
4404
+ const eventId = event2;
4122
4405
  if (!this.store.events.has(eventId)) {
4123
4406
  throw new RuntimeError(`Event "${eventId}" not found.`);
4124
4407
  }
4125
- event = this.store.events.get(eventId).event;
4408
+ event2 = this.store.events.get(eventId).event;
4126
4409
  }
4127
- return this.eventManager.emit(event, payload, "outside");
4410
+ return this.eventManager.emit(event2, payload, "outside");
4128
4411
  }, "emitEvent");
4129
4412
  /**
4130
4413
  * Get the value of a resource from the run result.
4131
4414
  * @param resource - The resource to get the value of.
4132
4415
  * @returns The value of the resource.
4133
4416
  */
4134
- this.getResourceValue = /* @__PURE__ */ __name((resource) => {
4135
- const resourceId = typeof resource === "string" ? resource : resource.id;
4417
+ this.getResourceValue = /* @__PURE__ */ __name((resource2) => {
4418
+ const resourceId = typeof resource2 === "string" ? resource2 : resource2.id;
4136
4419
  if (!this.store.resources.has(resourceId)) {
4137
4420
  throw new ResourceNotFoundError(resourceId);
4138
4421
  }
@@ -4167,7 +4450,7 @@ async function run(resourceOrResourceWithConfig, options) {
4167
4450
  const eventManager = new EventManager({
4168
4451
  runtimeCycleDetection
4169
4452
  });
4170
- let { resource, config } = extractResourceAndConfig(
4453
+ let { resource: resource2, config } = extractResourceAndConfig(
4171
4454
  resourceOrResourceWithConfig
4172
4455
  );
4173
4456
  const logger = new Logger({
@@ -4210,7 +4493,7 @@ async function run(resourceOrResourceWithConfig, options) {
4210
4493
  if (debug) {
4211
4494
  store2.storeGenericItem(debugResource.with(debug));
4212
4495
  }
4213
- store2.initializeStore(resource, config);
4496
+ store2.initializeStore(resource2, config);
4214
4497
  await store2.processOverrides();
4215
4498
  store2.validateDependencyGraph();
4216
4499
  store2.validateEventEmissionGraph();
@@ -4257,19 +4540,152 @@ async function run(resourceOrResourceWithConfig, options) {
4257
4540
  }
4258
4541
  __name(run, "run");
4259
4542
  function extractResourceAndConfig(resourceOrResourceWithConfig) {
4260
- let resource;
4543
+ let resource2;
4261
4544
  let config;
4262
4545
  if (isResourceWithConfig(resourceOrResourceWithConfig)) {
4263
- resource = resourceOrResourceWithConfig.resource;
4546
+ resource2 = resourceOrResourceWithConfig.resource;
4264
4547
  config = resourceOrResourceWithConfig.config;
4265
4548
  } else {
4266
- resource = resourceOrResourceWithConfig;
4549
+ resource2 = resourceOrResourceWithConfig;
4267
4550
  config = void 0;
4268
4551
  }
4269
- return { resource, config };
4552
+ return { resource: resource2, config };
4270
4553
  }
4271
4554
  __name(extractResourceAndConfig, "extractResourceAndConfig");
4272
4555
 
4556
+ // src/globals/resources/tunnel/protocol.ts
4557
+ var TunnelError = class extends Error {
4558
+ static {
4559
+ __name(this, "TunnelError");
4560
+ }
4561
+ constructor(code, message, details) {
4562
+ super(message);
4563
+ this.name = "TunnelError";
4564
+ this.code = code;
4565
+ this.details = details;
4566
+ }
4567
+ };
4568
+ function toTunnelError(input, fallbackMessage) {
4569
+ if (input instanceof Error) {
4570
+ return new TunnelError("UNKNOWN", input.message);
4571
+ }
4572
+ if (input && typeof input === "object" && "code" in input && "message" in input && typeof input.message === "string" && typeof input.code === "string") {
4573
+ const pe = input;
4574
+ const msg = pe.message || fallbackMessage || "Tunnel error";
4575
+ return new TunnelError(pe.code, msg, pe.details);
4576
+ }
4577
+ if (input && typeof input === "object" && "message" in input && typeof input.message === "string") {
4578
+ return new TunnelError("UNKNOWN", input.message);
4579
+ }
4580
+ return new TunnelError(
4581
+ "UNKNOWN",
4582
+ typeof input === "string" && input || fallbackMessage || "Tunnel error"
4583
+ );
4584
+ }
4585
+ __name(toTunnelError, "toTunnelError");
4586
+ function assertOkEnvelope(envelope, opts) {
4587
+ if (!envelope || typeof envelope !== "object") {
4588
+ throw new TunnelError(
4589
+ "INVALID_RESPONSE",
4590
+ opts?.fallbackMessage || "Invalid or empty response"
4591
+ );
4592
+ }
4593
+ if (envelope.ok) {
4594
+ return envelope.result;
4595
+ }
4596
+ if (envelope.error) {
4597
+ return (() => {
4598
+ throw toTunnelError(envelope.error, opts?.fallbackMessage);
4599
+ })();
4600
+ }
4601
+ throw new TunnelError("UNKNOWN", opts?.fallbackMessage || "Tunnel error");
4602
+ }
4603
+ __name(assertOkEnvelope, "assertOkEnvelope");
4604
+
4605
+ // src/http-fetch-tunnel.resource.ts
4606
+ async function postSerialized(fetchFn, url, body, headers, timeoutMs, serializer, onRequest) {
4607
+ const controller = timeoutMs && timeoutMs > 0 ? new AbortController() : void 0;
4608
+ let timeout;
4609
+ try {
4610
+ if (controller) {
4611
+ timeout = setTimeout(() => controller.abort(), timeoutMs);
4612
+ }
4613
+ const reqHeaders = {
4614
+ "content-type": "application/json; charset=utf-8",
4615
+ ...headers
4616
+ };
4617
+ if (onRequest) await onRequest({ url, headers: reqHeaders });
4618
+ const res = await fetchFn(url, {
4619
+ method: "POST",
4620
+ headers: reqHeaders,
4621
+ body: serializer.stringify(body),
4622
+ signal: controller?.signal
4623
+ });
4624
+ const text = await res.text();
4625
+ const json = text ? serializer.parse(text) : void 0;
4626
+ return json;
4627
+ } finally {
4628
+ if (timeout) clearTimeout(timeout);
4629
+ }
4630
+ }
4631
+ __name(postSerialized, "postSerialized");
4632
+ function createExposureFetch(cfg) {
4633
+ const baseUrl = (cfg?.baseUrl).replace(/\/$/, "");
4634
+ if (!baseUrl) throw new Error("createExposureFetch requires baseUrl");
4635
+ const headerName = (cfg?.auth?.header ?? "x-runner-token").toLowerCase();
4636
+ const buildHeaders = /* @__PURE__ */ __name(() => {
4637
+ const headers = {};
4638
+ if (cfg?.auth?.token) headers[headerName] = cfg.auth.token;
4639
+ return headers;
4640
+ }, "buildHeaders");
4641
+ const fetchImpl = cfg.fetchImpl ?? globalThis.fetch;
4642
+ if (typeof fetchImpl !== "function") {
4643
+ throw new Error(
4644
+ "global fetch is not available; provide fetchImpl in config"
4645
+ );
4646
+ }
4647
+ return {
4648
+ async task(id2, input) {
4649
+ const url = `${baseUrl}/task/${encodeURIComponent(id2)}`;
4650
+ const r2 = await postSerialized(
4651
+ fetchImpl,
4652
+ url,
4653
+ { input },
4654
+ buildHeaders(),
4655
+ cfg?.timeoutMs,
4656
+ cfg.serializer,
4657
+ cfg?.onRequest
4658
+ );
4659
+ return assertOkEnvelope(r2, { fallbackMessage: "Tunnel task error" });
4660
+ },
4661
+ async event(id2, payload) {
4662
+ const url = `${baseUrl}/event/${encodeURIComponent(id2)}`;
4663
+ const r2 = await postSerialized(
4664
+ fetchImpl,
4665
+ url,
4666
+ { payload },
4667
+ buildHeaders(),
4668
+ cfg?.timeoutMs,
4669
+ cfg.serializer,
4670
+ cfg?.onRequest
4671
+ );
4672
+ assertOkEnvelope(r2, { fallbackMessage: "Tunnel event error" });
4673
+ }
4674
+ };
4675
+ }
4676
+ __name(createExposureFetch, "createExposureFetch");
4677
+
4678
+ // src/globals/tunnels/index.ts
4679
+ var http = Object.freeze({
4680
+ createClient(cfg) {
4681
+ const { url, ...rest } = cfg;
4682
+ return createExposureFetch({ baseUrl: url, ...rest });
4683
+ }
4684
+ });
4685
+ var tunnels = Object.freeze({
4686
+ http
4687
+ });
4688
+
4273
4689
  // src/testing.ts
4274
4690
  var testResourceCounter = 0;
4275
4691
  function createTestResource(root, options) {
@@ -4292,7 +4708,7 @@ __name(createTestResource, "createTestResource");
4292
4708
  function buildTestFacade(deps) {
4293
4709
  return {
4294
4710
  // Run a task within the fully initialized ecosystem
4295
- runTask: /* @__PURE__ */ __name((task, ...args) => deps.taskRunner.run(task, ...args), "runTask"),
4711
+ runTask: /* @__PURE__ */ __name((task2, ...args) => deps.taskRunner.run(task2, ...args), "runTask"),
4296
4712
  // Access a resource value by id (string or symbol)
4297
4713
  getResource: /* @__PURE__ */ __name((id2) => deps.store.resources.get(id2)?.value, "getResource"),
4298
4714
  // Expose internals when needed in tests (not recommended for app usage)
@@ -4304,6 +4720,761 @@ function buildTestFacade(deps) {
4304
4720
  }
4305
4721
  __name(buildTestFacade, "buildTestFacade");
4306
4722
 
4723
+ // src/definers/builders/resource.ts
4724
+ function clone(s, patch) {
4725
+ return Object.freeze({
4726
+ // We reuse the frozen state while widening generics, hence the temporary cast.
4727
+ ...s,
4728
+ ...patch
4729
+ });
4730
+ }
4731
+ __name(clone, "clone");
4732
+ function toRegisterArray(items) {
4733
+ return Array.isArray(items) ? [...items] : [items];
4734
+ }
4735
+ __name(toRegisterArray, "toRegisterArray");
4736
+ function normalizeRegisterFunction(fn) {
4737
+ return (config) => toRegisterArray(fn(config));
4738
+ }
4739
+ __name(normalizeRegisterFunction, "normalizeRegisterFunction");
4740
+ function mergeRegister(existing, addition, override) {
4741
+ const isFunctionAddition = typeof addition === "function";
4742
+ const normalizedAddition = isFunctionAddition ? normalizeRegisterFunction(
4743
+ addition
4744
+ ) : toRegisterArray(addition);
4745
+ if (override || !existing) {
4746
+ return isFunctionAddition ? normalizedAddition : normalizedAddition;
4747
+ }
4748
+ if (typeof existing === "function") {
4749
+ if (isFunctionAddition) {
4750
+ const additionFn = normalizedAddition;
4751
+ return (config) => [...existing(config), ...additionFn(config)];
4752
+ }
4753
+ const additionArray = normalizedAddition;
4754
+ return (config) => [...existing(config), ...additionArray];
4755
+ }
4756
+ const existingArray = existing;
4757
+ if (isFunctionAddition) {
4758
+ const additionFn = normalizedAddition;
4759
+ return (config) => [...existingArray, ...additionFn(config)];
4760
+ }
4761
+ return [
4762
+ ...existingArray,
4763
+ ...normalizedAddition
4764
+ ];
4765
+ }
4766
+ __name(mergeRegister, "mergeRegister");
4767
+ function mergeArray(existing, addition, override) {
4768
+ const toArray = [...addition];
4769
+ if (override || !existing) {
4770
+ return toArray;
4771
+ }
4772
+ return [...existing, ...toArray];
4773
+ }
4774
+ __name(mergeArray, "mergeArray");
4775
+ function mergeDependencies(existing, addition, override) {
4776
+ const isFnExisting = typeof existing === "function";
4777
+ const isFnAddition = typeof addition === "function";
4778
+ if (override || !existing) {
4779
+ return addition;
4780
+ }
4781
+ if (isFnExisting && isFnAddition) {
4782
+ const e2 = existing;
4783
+ const a2 = addition;
4784
+ return ((config) => ({
4785
+ ...e2(config),
4786
+ ...a2(config)
4787
+ }));
4788
+ }
4789
+ if (isFnExisting && !isFnAddition) {
4790
+ const e2 = existing;
4791
+ const a2 = addition;
4792
+ return ((config) => ({
4793
+ ...e2(config),
4794
+ ...a2
4795
+ }));
4796
+ }
4797
+ if (!isFnExisting && isFnAddition) {
4798
+ const e2 = existing;
4799
+ const a2 = addition;
4800
+ return ((config) => ({
4801
+ ...e2,
4802
+ ...a2(config)
4803
+ }));
4804
+ }
4805
+ const e = existing;
4806
+ const a = addition;
4807
+ return { ...e, ...a };
4808
+ }
4809
+ __name(mergeDependencies, "mergeDependencies");
4810
+ function makeResourceBuilder(state) {
4811
+ const builder = {
4812
+ id: state.id,
4813
+ dependencies(deps, options) {
4814
+ const override = options?.override ?? false;
4815
+ const next = clone(state, {
4816
+ dependencies: mergeDependencies(
4817
+ state.dependencies,
4818
+ deps,
4819
+ override
4820
+ )
4821
+ });
4822
+ if (override) {
4823
+ return makeResourceBuilder(next);
4824
+ }
4825
+ return makeResourceBuilder(next);
4826
+ },
4827
+ register(items, options) {
4828
+ const override = options?.override ?? false;
4829
+ const next = clone(state, {
4830
+ register: mergeRegister(state.register, items, override)
4831
+ });
4832
+ return makeResourceBuilder(next);
4833
+ },
4834
+ middleware(mw, options) {
4835
+ const override = options?.override ?? false;
4836
+ const next = clone(state, {
4837
+ middleware: mergeArray(state.middleware, mw, override)
4838
+ });
4839
+ return makeResourceBuilder(next);
4840
+ },
4841
+ tags(tags, options) {
4842
+ const override = options?.override ?? false;
4843
+ const next = clone(state, { tags: mergeArray(state.tags, tags, override) });
4844
+ return makeResourceBuilder(next);
4845
+ },
4846
+ context(factory) {
4847
+ const next = clone(state, { context: factory });
4848
+ return makeResourceBuilder(next);
4849
+ },
4850
+ configSchema(schema) {
4851
+ const next = clone(state, { configSchema: schema });
4852
+ return makeResourceBuilder(next);
4853
+ },
4854
+ resultSchema(schema) {
4855
+ const next = clone(state, { resultSchema: schema });
4856
+ return makeResourceBuilder(next);
4857
+ },
4858
+ init(fn) {
4859
+ const next = clone(state, { init: fn });
4860
+ return makeResourceBuilder(next);
4861
+ },
4862
+ dispose(fn) {
4863
+ const next = clone(state, { dispose: fn });
4864
+ return makeResourceBuilder(next);
4865
+ },
4866
+ meta(m) {
4867
+ const next = clone(state, { meta: m });
4868
+ return makeResourceBuilder(next);
4869
+ },
4870
+ overrides(o, options) {
4871
+ const override = options?.override ?? false;
4872
+ const next = clone(state, {
4873
+ overrides: mergeArray(state.overrides, o, override)
4874
+ });
4875
+ return makeResourceBuilder(next);
4876
+ },
4877
+ build() {
4878
+ const definition = {
4879
+ id: state.id,
4880
+ dependencies: state.dependencies,
4881
+ register: state.register,
4882
+ middleware: state.middleware,
4883
+ tags: state.tags,
4884
+ context: state.context,
4885
+ init: state.init,
4886
+ dispose: state.dispose,
4887
+ configSchema: state.configSchema,
4888
+ resultSchema: state.resultSchema,
4889
+ meta: state.meta,
4890
+ overrides: state.overrides
4891
+ };
4892
+ return defineResource(definition);
4893
+ }
4894
+ };
4895
+ return builder;
4896
+ }
4897
+ __name(makeResourceBuilder, "makeResourceBuilder");
4898
+ function resourceBuilder(id2) {
4899
+ const initial = Object.freeze({
4900
+ id: id2,
4901
+ dependencies: void 0,
4902
+ register: void 0,
4903
+ middleware: [],
4904
+ tags: [],
4905
+ context: void 0,
4906
+ init: void 0,
4907
+ dispose: void 0,
4908
+ configSchema: void 0,
4909
+ resultSchema: void 0,
4910
+ meta: void 0,
4911
+ overrides: void 0
4912
+ });
4913
+ return makeResourceBuilder(initial);
4914
+ }
4915
+ __name(resourceBuilder, "resourceBuilder");
4916
+ var resource = resourceBuilder;
4917
+
4918
+ // src/definers/builders/utils.ts
4919
+ function cloneState(s, patch) {
4920
+ return Object.freeze({ ...s, ...patch });
4921
+ }
4922
+ __name(cloneState, "cloneState");
4923
+ function mergeArray2(existing, addition, override) {
4924
+ const toArray = [...addition];
4925
+ if (override || !existing) {
4926
+ return toArray;
4927
+ }
4928
+ return [...existing, ...toArray];
4929
+ }
4930
+ __name(mergeArray2, "mergeArray");
4931
+ function mergeDepsNoConfig(existing, addition, override) {
4932
+ const isFnExisting = typeof existing === "function";
4933
+ const isFnAddition = typeof addition === "function";
4934
+ if (override || !existing) {
4935
+ return addition;
4936
+ }
4937
+ if (isFnExisting && isFnAddition) {
4938
+ const e2 = existing;
4939
+ const a2 = addition;
4940
+ return (() => ({ ...e2(), ...a2() }));
4941
+ }
4942
+ if (isFnExisting && !isFnAddition) {
4943
+ const e2 = existing;
4944
+ const a2 = addition;
4945
+ return (() => ({ ...e2(), ...a2 }));
4946
+ }
4947
+ if (!isFnExisting && isFnAddition) {
4948
+ const e2 = existing;
4949
+ const a2 = addition;
4950
+ return (() => ({ ...e2, ...a2() }));
4951
+ }
4952
+ const e = existing;
4953
+ const a = addition;
4954
+ return { ...e, ...a };
4955
+ }
4956
+ __name(mergeDepsNoConfig, "mergeDepsNoConfig");
4957
+
4958
+ // src/definers/builders/task.phantom.ts
4959
+ function clone2(s, patch) {
4960
+ return cloneState(s, patch);
4961
+ }
4962
+ __name(clone2, "clone");
4963
+ function makePhantomTaskBuilder(state) {
4964
+ const builder = {
4965
+ id: state.id,
4966
+ dependencies(deps, options) {
4967
+ const override = options?.override ?? false;
4968
+ const next = clone2(state, {
4969
+ dependencies: mergeDepsNoConfig(
4970
+ state.dependencies,
4971
+ deps,
4972
+ override
4973
+ )
4974
+ });
4975
+ if (override) {
4976
+ return makePhantomTaskBuilder(next);
4977
+ }
4978
+ return makePhantomTaskBuilder(next);
4979
+ },
4980
+ middleware(mw, options) {
4981
+ const override = options?.override ?? false;
4982
+ const next = clone2(state, {
4983
+ middleware: mergeArray2(state.middleware, mw, override)
4984
+ });
4985
+ return makePhantomTaskBuilder(next);
4986
+ },
4987
+ tags(t, options) {
4988
+ const override = options?.override ?? false;
4989
+ const next = clone2(state, { tags: mergeArray2(state.tags, t, override) });
4990
+ return makePhantomTaskBuilder(next);
4991
+ },
4992
+ inputSchema(schema) {
4993
+ const next = clone2(state, { inputSchema: schema });
4994
+ return makePhantomTaskBuilder(next);
4995
+ },
4996
+ resultSchema(schema) {
4997
+ const next = clone2(state, { resultSchema: schema });
4998
+ return makePhantomTaskBuilder(next);
4999
+ },
5000
+ meta(m) {
5001
+ const next = clone2(state, { meta: m });
5002
+ return makePhantomTaskBuilder(next);
5003
+ },
5004
+ build() {
5005
+ const built = defineTask.phantom({
5006
+ id: state.id,
5007
+ dependencies: state.dependencies,
5008
+ middleware: state.middleware,
5009
+ inputSchema: state.inputSchema,
5010
+ resultSchema: state.resultSchema,
5011
+ meta: state.meta,
5012
+ tags: state.tags
5013
+ });
5014
+ return built;
5015
+ }
5016
+ };
5017
+ return builder;
5018
+ }
5019
+ __name(makePhantomTaskBuilder, "makePhantomTaskBuilder");
5020
+ function phantomTaskBuilder(id2) {
5021
+ const initial = Object.freeze({
5022
+ id: id2,
5023
+ dependencies: {},
5024
+ middleware: [],
5025
+ meta: {},
5026
+ inputSchema: void 0,
5027
+ resultSchema: void 0,
5028
+ tags: []
5029
+ });
5030
+ return makePhantomTaskBuilder(initial);
5031
+ }
5032
+ __name(phantomTaskBuilder, "phantomTaskBuilder");
5033
+
5034
+ // src/definers/builders/task.ts
5035
+ function clone3(s, patch) {
5036
+ return cloneState(s, patch);
5037
+ }
5038
+ __name(clone3, "clone");
5039
+ function makeTaskBuilder(state) {
5040
+ const builder = {
5041
+ id: state.id,
5042
+ dependencies(deps, options) {
5043
+ const override = options?.override ?? false;
5044
+ const next = clone3(state, {
5045
+ dependencies: mergeDepsNoConfig(
5046
+ state.dependencies,
5047
+ deps,
5048
+ override
5049
+ )
5050
+ });
5051
+ if (override) {
5052
+ return makeTaskBuilder(next);
5053
+ }
5054
+ return makeTaskBuilder(next);
5055
+ },
5056
+ middleware(mw, options) {
5057
+ const override = options?.override ?? false;
5058
+ const next = clone3(state, {
5059
+ middleware: mergeArray2(state.middleware, mw, override)
5060
+ });
5061
+ return makeTaskBuilder(next);
5062
+ },
5063
+ tags(t, options) {
5064
+ const override = options?.override ?? false;
5065
+ const next = clone3(state, { tags: mergeArray2(state.tags, t, override) });
5066
+ return makeTaskBuilder(next);
5067
+ },
5068
+ inputSchema(schema) {
5069
+ const next = clone3(state, { inputSchema: schema });
5070
+ return makeTaskBuilder(next);
5071
+ },
5072
+ resultSchema(schema) {
5073
+ const next = clone3(state, { resultSchema: schema });
5074
+ return makeTaskBuilder(next);
5075
+ },
5076
+ run(fn) {
5077
+ const wrapped = /* @__PURE__ */ __name((input, deps) => fn(
5078
+ input,
5079
+ deps
5080
+ ), "wrapped");
5081
+ const next = clone3(state, { run: wrapped });
5082
+ return makeTaskBuilder(next);
5083
+ },
5084
+ meta(m) {
5085
+ const next = clone3(state, { meta: m });
5086
+ return makeTaskBuilder(next);
5087
+ },
5088
+ build() {
5089
+ return defineTask({
5090
+ ...state
5091
+ });
5092
+ }
5093
+ };
5094
+ return builder;
5095
+ }
5096
+ __name(makeTaskBuilder, "makeTaskBuilder");
5097
+ function taskBuilder(id2) {
5098
+ const initial = Object.freeze({
5099
+ id: id2,
5100
+ dependencies: {},
5101
+ middleware: [],
5102
+ meta: {},
5103
+ inputSchema: void 0,
5104
+ resultSchema: void 0,
5105
+ run: void 0,
5106
+ tags: []
5107
+ });
5108
+ return makeTaskBuilder(initial);
5109
+ }
5110
+ __name(taskBuilder, "taskBuilder");
5111
+ var task = Object.assign(taskBuilder, {
5112
+ phantom: phantomTaskBuilder
5113
+ });
5114
+
5115
+ // src/definers/builders/event.ts
5116
+ function clone4(s, patch) {
5117
+ return Object.freeze({ ...s, ...patch });
5118
+ }
5119
+ __name(clone4, "clone");
5120
+ function makeEventBuilder(state) {
5121
+ const b = {
5122
+ id: state.id,
5123
+ payloadSchema(schema) {
5124
+ const next = clone4(state, { payloadSchema: schema });
5125
+ return makeEventBuilder(next);
5126
+ },
5127
+ tags(t, options) {
5128
+ const override = options?.override ?? false;
5129
+ const tags = mergeArray2(state.tags, t, override);
5130
+ const next = clone4(state, { tags });
5131
+ return makeEventBuilder(next);
5132
+ },
5133
+ meta(m) {
5134
+ const next = clone4(state, { meta: m });
5135
+ return makeEventBuilder(next);
5136
+ },
5137
+ build() {
5138
+ return defineEvent({
5139
+ ...state
5140
+ });
5141
+ }
5142
+ };
5143
+ return b;
5144
+ }
5145
+ __name(makeEventBuilder, "makeEventBuilder");
5146
+ function eventBuilder(id2) {
5147
+ const initial = Object.freeze({
5148
+ id: id2,
5149
+ meta: {},
5150
+ payloadSchema: void 0,
5151
+ tags: []
5152
+ });
5153
+ return makeEventBuilder(initial);
5154
+ }
5155
+ __name(eventBuilder, "eventBuilder");
5156
+ var event = eventBuilder;
5157
+
5158
+ // src/definers/builders/hook.ts
5159
+ function clone5(s, patch) {
5160
+ return Object.freeze({ ...s, ...patch });
5161
+ }
5162
+ __name(clone5, "clone");
5163
+ function makeHookBuilder(state) {
5164
+ const b = {
5165
+ id: state.id,
5166
+ on(on) {
5167
+ const next = clone5(state, { on });
5168
+ return makeHookBuilder(
5169
+ next
5170
+ );
5171
+ },
5172
+ order(order) {
5173
+ const next = clone5(state, { order });
5174
+ return makeHookBuilder(next);
5175
+ },
5176
+ dependencies(deps, options) {
5177
+ const override = options?.override ?? false;
5178
+ const isFnExisting = typeof state.dependencies === "function";
5179
+ const isFnAddition = typeof deps === "function";
5180
+ let merged;
5181
+ if (override || !state.dependencies) {
5182
+ merged = deps;
5183
+ } else if (isFnExisting && isFnAddition) {
5184
+ const e = state.dependencies;
5185
+ const a = deps;
5186
+ merged = /* @__PURE__ */ __name((() => ({ ...e(), ...a() })), "merged");
5187
+ } else if (isFnExisting && !isFnAddition) {
5188
+ const e = state.dependencies;
5189
+ const a = deps;
5190
+ merged = /* @__PURE__ */ __name((() => ({ ...e(), ...a })), "merged");
5191
+ } else if (!isFnExisting && isFnAddition) {
5192
+ const e = state.dependencies;
5193
+ const a = deps;
5194
+ merged = /* @__PURE__ */ __name((() => ({ ...e, ...a() })), "merged");
5195
+ } else {
5196
+ const e = state.dependencies;
5197
+ const a = deps;
5198
+ merged = { ...e, ...a };
5199
+ }
5200
+ const next = clone5(state, { dependencies: merged });
5201
+ if (override) {
5202
+ return makeHookBuilder(
5203
+ next
5204
+ );
5205
+ }
5206
+ return makeHookBuilder(
5207
+ next
5208
+ );
5209
+ },
5210
+ tags(t, options) {
5211
+ const override = options?.override ?? false;
5212
+ const tags = mergeArray2(state.tags, t, override);
5213
+ const next = clone5(state, { tags });
5214
+ return makeHookBuilder(next);
5215
+ },
5216
+ meta(m) {
5217
+ const next = clone5(state, { meta: m });
5218
+ return makeHookBuilder(
5219
+ next
5220
+ );
5221
+ },
5222
+ run(fn) {
5223
+ const next = clone5(state, { run: fn });
5224
+ return makeHookBuilder(next);
5225
+ },
5226
+ build() {
5227
+ return defineHook({
5228
+ ...state
5229
+ });
5230
+ }
5231
+ };
5232
+ return b;
5233
+ }
5234
+ __name(makeHookBuilder, "makeHookBuilder");
5235
+ function hookBuilder(id2) {
5236
+ const initial = Object.freeze({
5237
+ id: id2,
5238
+ dependencies: {},
5239
+ on: "*",
5240
+ order: void 0,
5241
+ meta: {},
5242
+ run: void 0,
5243
+ tags: []
5244
+ });
5245
+ return makeHookBuilder(initial);
5246
+ }
5247
+ __name(hookBuilder, "hookBuilder");
5248
+ var hook = hookBuilder;
5249
+
5250
+ // src/definers/builders/middleware.ts
5251
+ function cloneTask(s, patch) {
5252
+ return Object.freeze({ ...s, ...patch });
5253
+ }
5254
+ __name(cloneTask, "cloneTask");
5255
+ function makeTaskMiddlewareBuilder(state) {
5256
+ const b = {
5257
+ id: state.id,
5258
+ dependencies(deps, options) {
5259
+ const override = options?.override ?? false;
5260
+ const isFnExisting = typeof state.dependencies === "function";
5261
+ const isFnAddition = typeof deps === "function";
5262
+ let merged;
5263
+ if (override || !state.dependencies) {
5264
+ merged = deps;
5265
+ } else if (isFnExisting && isFnAddition) {
5266
+ const e = state.dependencies;
5267
+ const a = deps;
5268
+ merged = /* @__PURE__ */ __name(((cfg) => ({ ...e(cfg), ...a(cfg) })), "merged");
5269
+ } else if (isFnExisting && !isFnAddition) {
5270
+ const e = state.dependencies;
5271
+ const a = deps;
5272
+ merged = /* @__PURE__ */ __name(((cfg) => ({ ...e(cfg), ...a })), "merged");
5273
+ } else if (!isFnExisting && isFnAddition) {
5274
+ const e = state.dependencies;
5275
+ const a = deps;
5276
+ merged = /* @__PURE__ */ __name(((cfg) => ({ ...e, ...a(cfg) })), "merged");
5277
+ } else {
5278
+ const e = state.dependencies;
5279
+ const a = deps;
5280
+ merged = { ...e, ...a };
5281
+ }
5282
+ const next = cloneTask(state, { dependencies: merged });
5283
+ if (override) {
5284
+ return makeTaskMiddlewareBuilder(
5285
+ next
5286
+ );
5287
+ }
5288
+ return makeTaskMiddlewareBuilder(
5289
+ next
5290
+ );
5291
+ },
5292
+ configSchema(schema) {
5293
+ const next = cloneTask(state, { configSchema: schema });
5294
+ return makeTaskMiddlewareBuilder(
5295
+ next
5296
+ );
5297
+ },
5298
+ run(fn) {
5299
+ const next = cloneTask(state, { run: fn });
5300
+ return makeTaskMiddlewareBuilder(next);
5301
+ },
5302
+ meta(m) {
5303
+ const next = cloneTask(state, { meta: m });
5304
+ return makeTaskMiddlewareBuilder(next);
5305
+ },
5306
+ tags(t, options) {
5307
+ const override = options?.override ?? false;
5308
+ const tags = mergeArray2(state.tags, t, override);
5309
+ const next = cloneTask(state, { tags });
5310
+ return makeTaskMiddlewareBuilder(next);
5311
+ },
5312
+ everywhere(flag) {
5313
+ const next = cloneTask(state, { everywhere: flag });
5314
+ return makeTaskMiddlewareBuilder(next);
5315
+ },
5316
+ build() {
5317
+ return defineTaskMiddleware({
5318
+ ...state
5319
+ });
5320
+ }
5321
+ };
5322
+ return b;
5323
+ }
5324
+ __name(makeTaskMiddlewareBuilder, "makeTaskMiddlewareBuilder");
5325
+ function taskMiddlewareBuilder(id2) {
5326
+ const initial = Object.freeze({
5327
+ id: id2,
5328
+ dependencies: {},
5329
+ configSchema: void 0,
5330
+ run: void 0,
5331
+ meta: {},
5332
+ tags: [],
5333
+ everywhere: void 0
5334
+ });
5335
+ return makeTaskMiddlewareBuilder(initial);
5336
+ }
5337
+ __name(taskMiddlewareBuilder, "taskMiddlewareBuilder");
5338
+ function cloneRes(s, patch) {
5339
+ return Object.freeze({ ...s, ...patch });
5340
+ }
5341
+ __name(cloneRes, "cloneRes");
5342
+ function makeResourceMiddlewareBuilder(state) {
5343
+ const b = {
5344
+ id: state.id,
5345
+ dependencies(deps, options) {
5346
+ const override = options?.override ?? false;
5347
+ const isFnExisting = typeof state.dependencies === "function";
5348
+ const isFnAddition = typeof deps === "function";
5349
+ let merged;
5350
+ if (override || !state.dependencies) {
5351
+ merged = deps;
5352
+ } else if (isFnExisting && isFnAddition) {
5353
+ const e = state.dependencies;
5354
+ const a = deps;
5355
+ merged = /* @__PURE__ */ __name(((cfg) => ({ ...e(cfg), ...a(cfg) })), "merged");
5356
+ } else if (isFnExisting && !isFnAddition) {
5357
+ const e = state.dependencies;
5358
+ const a = deps;
5359
+ merged = /* @__PURE__ */ __name(((cfg) => ({ ...e(cfg), ...a })), "merged");
5360
+ } else if (!isFnExisting && isFnAddition) {
5361
+ const e = state.dependencies;
5362
+ const a = deps;
5363
+ merged = /* @__PURE__ */ __name(((cfg) => ({ ...e, ...a(cfg) })), "merged");
5364
+ } else {
5365
+ const e = state.dependencies;
5366
+ const a = deps;
5367
+ merged = { ...e, ...a };
5368
+ }
5369
+ const next = cloneRes(state, { dependencies: merged });
5370
+ if (override) {
5371
+ return makeResourceMiddlewareBuilder(
5372
+ next
5373
+ );
5374
+ }
5375
+ return makeResourceMiddlewareBuilder(
5376
+ next
5377
+ );
5378
+ },
5379
+ configSchema(schema) {
5380
+ const next = cloneRes(state, { configSchema: schema });
5381
+ return makeResourceMiddlewareBuilder(
5382
+ next
5383
+ );
5384
+ },
5385
+ run(fn) {
5386
+ const next = cloneRes(state, { run: fn });
5387
+ return makeResourceMiddlewareBuilder(next);
5388
+ },
5389
+ meta(m) {
5390
+ const next = cloneRes(state, { meta: m });
5391
+ return makeResourceMiddlewareBuilder(next);
5392
+ },
5393
+ tags(t, options) {
5394
+ const override = options?.override ?? false;
5395
+ const tags = mergeArray2(state.tags, t, override);
5396
+ const next = cloneRes(state, { tags });
5397
+ return makeResourceMiddlewareBuilder(next);
5398
+ },
5399
+ everywhere(flag) {
5400
+ const next = cloneRes(state, { everywhere: flag });
5401
+ return makeResourceMiddlewareBuilder(next);
5402
+ },
5403
+ build() {
5404
+ return defineResourceMiddleware({
5405
+ ...state
5406
+ });
5407
+ }
5408
+ };
5409
+ return b;
5410
+ }
5411
+ __name(makeResourceMiddlewareBuilder, "makeResourceMiddlewareBuilder");
5412
+ function resourceMiddlewareBuilder(id2) {
5413
+ const initial = Object.freeze({
5414
+ id: id2,
5415
+ dependencies: {},
5416
+ configSchema: void 0,
5417
+ run: void 0,
5418
+ meta: {},
5419
+ tags: [],
5420
+ everywhere: void 0
5421
+ });
5422
+ return makeResourceMiddlewareBuilder(initial);
5423
+ }
5424
+ __name(resourceMiddlewareBuilder, "resourceMiddlewareBuilder");
5425
+ var taskMiddleware = taskMiddlewareBuilder;
5426
+ var resourceMiddleware = resourceMiddlewareBuilder;
5427
+
5428
+ // src/definers/builders/tag.ts
5429
+ function clone6(s, patch) {
5430
+ return Object.freeze({ ...s, ...patch });
5431
+ }
5432
+ __name(clone6, "clone");
5433
+ function makeTagBuilder(state) {
5434
+ const b = {
5435
+ id: state.id,
5436
+ meta(m) {
5437
+ const next = clone6(state, { meta: m });
5438
+ return makeTagBuilder(next);
5439
+ },
5440
+ configSchema(schema) {
5441
+ const next = clone6(state, { configSchema: schema });
5442
+ return makeTagBuilder(
5443
+ next
5444
+ );
5445
+ },
5446
+ config(config) {
5447
+ const next = clone6(state, { config });
5448
+ return makeTagBuilder(
5449
+ next
5450
+ );
5451
+ },
5452
+ build() {
5453
+ return defineTag({
5454
+ id: state.id,
5455
+ meta: state.meta,
5456
+ configSchema: state.configSchema,
5457
+ config: state.config
5458
+ });
5459
+ }
5460
+ };
5461
+ return b;
5462
+ }
5463
+ __name(makeTagBuilder, "makeTagBuilder");
5464
+ function tagBuilder(id2) {
5465
+ const initial = Object.freeze(
5466
+ {
5467
+ id: id2,
5468
+ meta: {},
5469
+ configSchema: void 0,
5470
+ config: void 0
5471
+ }
5472
+ );
5473
+ return makeTagBuilder(initial);
5474
+ }
5475
+ __name(tagBuilder, "tagBuilder");
5476
+ var tag = tagBuilder;
5477
+
4307
5478
  // src/models/Semaphore.ts
4308
5479
  var Semaphore = class {
4309
5480
  constructor(maxPermits) {
@@ -4452,15 +5623,25 @@ var Semaphore = class {
4452
5623
  };
4453
5624
  }
4454
5625
  };
4455
-
4456
- // src/index.ts
4457
5626
  var globals = {
4458
5627
  events: globalEvents,
4459
5628
  resources: globalResources,
4460
5629
  middleware: globalMiddlewares,
4461
- tags: globalTags
5630
+ tags: globalTags,
5631
+ tunnels
4462
5632
  };
5633
+ var r = Object.freeze({
5634
+ resource,
5635
+ task,
5636
+ event,
5637
+ hook,
5638
+ tag,
5639
+ middleware: Object.freeze({
5640
+ task: taskMiddleware,
5641
+ resource: resourceMiddleware
5642
+ })
5643
+ });
4463
5644
 
4464
- export { DependencyProcessor, errors_exports as Errors, EventManager, Logger, MiddlewareManager, Queue, ResourceInitializer, RunResult, Semaphore, Store, TaskRunner, allFalse, bindProcessErrorHandler, createContext, createDefaultUnhandledError, createTestResource, defs_exports as definitions, defineEvent as event, getConfig, globals, defineHook as hook, levelNormal, levelVerbose, defineOverride as override, defineResource as resource, defineResourceMiddleware as resourceMiddleware, run, safeReportUnhandledError, defineTag as tag, defineTask as task, defineTaskMiddleware as taskMiddleware };
5645
+ export { DependencyProcessor, errors_exports as Errors, EventManager, Logger, MiddlewareManager, PlatformAdapter, Queue, ResourceInitializer, RunResult, Semaphore, Store, TaskRunner, allFalse, bindProcessErrorHandler, createContext, createDefaultUnhandledError, createTestResource, defs_exports as definitions, defineEvent as event, getConfig, globals, defineHook as hook, levelNormal, levelVerbose, defineOverride as override, r, defineResource as resource, defineResourceMiddleware as resourceMiddleware, run, safeReportUnhandledError, setPlatform, defineTag as tag, defineTask as task, defineTaskMiddleware as taskMiddleware };
4465
5646
  //# sourceMappingURL=index.mjs.map
4466
5647
  //# sourceMappingURL=index.mjs.map