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