@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
@@ -0,0 +1,35 @@
1
+ import { DependencyMapType, IEvent, ITask } from "../defs";
2
+ import { IResource } from "../defs";
3
+ import { EventManager } from "./EventManager";
4
+ import { Logger } from "./Logger";
5
+ import { Store } from "./Store";
6
+ import { TaskRunner } from "./TaskRunner";
7
+ export declare class RunResult<V> {
8
+ readonly value: V;
9
+ readonly logger: Logger;
10
+ readonly store: Store;
11
+ private readonly eventManager;
12
+ private readonly taskRunner;
13
+ private readonly disposeFn;
14
+ constructor(value: V, logger: Logger, store: Store, eventManager: EventManager, taskRunner: TaskRunner, disposeFn: () => Promise<void>);
15
+ /**
16
+ * Run a task within the context of the run result.
17
+ * @param task - The task to run.
18
+ * @param args - The arguments to pass to the task.
19
+ * @returns The result of the task.
20
+ */
21
+ runTask: <I = undefined, O extends Promise<any> = any, D extends DependencyMapType = any>(task: ITask<I, O, D> | string, ...args: I extends undefined | void ? [] : [I]) => Promise<O | undefined>;
22
+ /**
23
+ * Emit an event within the context of the run result.
24
+ * @param event - The event to emit.
25
+ * @param payload - The payload to emit.
26
+ */
27
+ emitEvent: <P>(event: IEvent<P> | string, payload?: P extends undefined | void ? undefined : P) => Promise<void>;
28
+ /**
29
+ * Get the value of a resource from the run result.
30
+ * @param resource - The resource to get the value of.
31
+ * @returns The value of the resource.
32
+ */
33
+ getResourceValue: <Output extends Promise<any>>(resource: string | IResource<any, Output, any, any, any>) => Output extends Promise<infer U> ? U : Output;
34
+ dispose: () => Promise<void>;
35
+ }
@@ -0,0 +1,61 @@
1
+ /**
2
+ * A semaphore that limits the number of concurrent operations.
3
+ * Used to prevent connection pool exhaustion by limiting concurrent
4
+ * database operations to the pool size.
5
+ */
6
+ export declare class Semaphore {
7
+ private permits;
8
+ private readonly waitingQueue;
9
+ private disposed;
10
+ private readonly maxPermits;
11
+ constructor(maxPermits: number);
12
+ /**
13
+ * Acquire a permit. If no permits are available, waits until one becomes available.
14
+ */
15
+ acquire(options?: {
16
+ timeout?: number;
17
+ signal?: AbortSignal;
18
+ }): Promise<void>;
19
+ /**
20
+ * Release a permit, allowing waiting operations to proceed.
21
+ */
22
+ release(): void;
23
+ private removeFromQueue;
24
+ /**
25
+ * Execute a function with a permit, automatically releasing it afterwards.
26
+ */
27
+ withPermit<T>(fn: () => Promise<T>, options?: {
28
+ timeout?: number;
29
+ signal?: AbortSignal;
30
+ }): Promise<T>;
31
+ /**
32
+ * Dispose the semaphore, rejecting all waiting operations and preventing new ones.
33
+ */
34
+ dispose(): void;
35
+ /**
36
+ * Get current number of available permits (for debugging)
37
+ */
38
+ getAvailablePermits(): number;
39
+ /**
40
+ * Get current number of waiting operations (for debugging)
41
+ */
42
+ getWaitingCount(): number;
43
+ /**
44
+ * Get maximum number of permits
45
+ */
46
+ getMaxPermits(): number;
47
+ /**
48
+ * Check if the semaphore has been disposed
49
+ */
50
+ isDisposed(): boolean;
51
+ /**
52
+ * Get metrics about the current state of the semaphore
53
+ */
54
+ getMetrics(): {
55
+ availablePermits: number;
56
+ waitingCount: number;
57
+ maxPermits: number;
58
+ utilization: number;
59
+ disposed: boolean;
60
+ };
61
+ }
@@ -0,0 +1,69 @@
1
+ import { IResource, ITask, RegisterableItems, ITaskMiddleware, IResourceMiddleware, ITag } from "../defs";
2
+ import { EventManager } from "./EventManager";
3
+ import { Logger } from "./Logger";
4
+ import { ResourceStoreElementType, TaskStoreElementType, TaskMiddlewareStoreElementType, ResourceMiddlewareStoreElementType, EventStoreElementType } from "../types/storeTypes";
5
+ import { TaskRunner } from "./TaskRunner";
6
+ import { OnUnhandledError } from "./UnhandledError";
7
+ import { MiddlewareManager } from "./MiddlewareManager";
8
+ export { ResourceStoreElementType, TaskStoreElementType, EventStoreElementType, };
9
+ /**
10
+ * Store class which is used to store all the resources, tasks, middleware and events.
11
+ */
12
+ export declare class Store {
13
+ #private;
14
+ protected readonly eventManager: EventManager;
15
+ protected readonly logger: Logger;
16
+ readonly onUnhandledError: OnUnhandledError;
17
+ root: ResourceStoreElementType;
18
+ private registry;
19
+ private overrideManager;
20
+ private validator;
21
+ private taskRunner?;
22
+ private middlewareManager;
23
+ constructor(eventManager: EventManager, logger: Logger, onUnhandledError: OnUnhandledError);
24
+ get tasks(): Map<string, TaskStoreElementType>;
25
+ get hooks(): Map<string, import("..").HookStoreElementType>;
26
+ get resources(): Map<string, ResourceStoreElementType>;
27
+ get events(): Map<string, EventStoreElementType>;
28
+ get taskMiddlewares(): Map<string, TaskMiddlewareStoreElementType>;
29
+ get resourceMiddlewares(): Map<string, ResourceMiddlewareStoreElementType>;
30
+ get tags(): Map<string, ITag<void, void, void>>;
31
+ get overrides(): Map<string, IResourceMiddleware<any, void, void, any> | ITask<any, any, {}, any, import("..").TagType[], import("..").TaskMiddlewareAttachmentType[]> | IResource<void, Promise<any>, any, any, any, import("..").TagType[], import("..").ResourceMiddlewareAttachmentType[]> | import("..").IResourceWithConfig<any, Promise<any>, any, any, any, import("..").TagType[], IResourceMiddleware<any, void, void, any>[]> | import("..").IHook<{}, any, any> | ITaskMiddleware<any, void, void, any>>;
32
+ get overrideRequests(): Set<{
33
+ source: string;
34
+ override: RegisterableItems;
35
+ }>;
36
+ getMiddlewareManager(): MiddlewareManager;
37
+ get isLocked(): boolean;
38
+ lock(): void;
39
+ checkLock(): void;
40
+ private registerGlobalComponents;
41
+ setTaskRunner(taskRunner: TaskRunner): void;
42
+ private setupRootResource;
43
+ validateDependencyGraph(): void;
44
+ validateEventEmissionGraph(): void;
45
+ initializeStore(root: IResource<any, any, any, any, any>, config: any): void;
46
+ dispose(): Promise<void>;
47
+ /**
48
+ * Internal, avoid using this method directly.
49
+ */
50
+ processOverrides(): void;
51
+ /**
52
+ * Internal, avoid using this method directly.
53
+ * @param item
54
+ * @returns
55
+ */
56
+ storeGenericItem<C>(item: RegisterableItems): void;
57
+ /**
58
+ * Returns all tasks with the given tag.
59
+ * @param tag - The tag to filter by.
60
+ * @returns The tasks with the given tag.
61
+ */
62
+ getTasksWithTag(tag: string | ITag<any, any, any>): ITask<any, any, any, any, import("..").TagType[], import("..").TaskMiddlewareAttachmentType[]>[];
63
+ /**
64
+ * Returns all resources with the given tag.
65
+ * @param tag - The tag to filter by.
66
+ * @returns The resources with the given tag.
67
+ */
68
+ getResourcesWithTag(tag: string | ITag<any, any, any>): IResource<any, any, {}, any, any, import("..").TagType[], import("..").ResourceMiddlewareAttachmentType[]>[];
69
+ }
@@ -0,0 +1,43 @@
1
+ import { IResource, ITask, IResourceWithConfig, RegisterableItems, ITaskMiddleware, IResourceMiddleware, IEvent, ITag, IHook } from "../defs";
2
+ import { TaskStoreElementType, TaskMiddlewareStoreElementType, ResourceMiddlewareStoreElementType, ResourceStoreElementType, EventStoreElementType, HookStoreElementType } from "../defs";
3
+ import { StoreValidator } from "./StoreValidator";
4
+ import { Store } from "./Store";
5
+ import { IDependentNode } from "./utils/findCircularDependencies";
6
+ type StoringMode = "normal" | "override";
7
+ export declare class StoreRegistry {
8
+ protected readonly store: Store;
9
+ tasks: Map<string, TaskStoreElementType>;
10
+ resources: Map<string, ResourceStoreElementType>;
11
+ events: Map<string, EventStoreElementType>;
12
+ taskMiddlewares: Map<string, TaskMiddlewareStoreElementType>;
13
+ resourceMiddlewares: Map<string, ResourceMiddlewareStoreElementType>;
14
+ hooks: Map<string, HookStoreElementType>;
15
+ tags: Map<string, ITag>;
16
+ private validator;
17
+ constructor(store: Store);
18
+ getValidator(): StoreValidator;
19
+ storeGenericItem<C>(item: RegisterableItems): void;
20
+ storeTag(item: ITag<any, any, any>): void;
21
+ storeHook<C>(item: IHook<any, any>, overrideMode?: StoringMode): void;
22
+ storeTaskMiddleware<C>(item: ITaskMiddleware<any>, storingMode?: StoringMode): void;
23
+ storeResourceMiddleware<C>(item: IResourceMiddleware<any>, overrideMode?: StoringMode): void;
24
+ storeEvent<C>(item: IEvent<void>): void;
25
+ storeResourceWithConfig<C>(item: IResourceWithConfig<any, any, any>, storingMode?: StoringMode): IResource<any, any, any, any, any, import("..").TagType[], IResourceMiddleware<any, void, void, any>[]>;
26
+ computeRegistrationDeeply<C>(element: IResource<C>, config?: C): void;
27
+ storeResource<C>(item: IResource<any, any, any>, overrideMode?: StoringMode): IResource<any, any, any, any, any, import("..").TagType[], import("..").ResourceMiddlewareAttachmentType[]>;
28
+ storeTask<C>(item: ITask<any, any, {}>, storingMode?: StoringMode): void;
29
+ getDependentNodes(): IDependentNode[];
30
+ /**
31
+ * Builds a directed graph of event emissions based on hooks listening to events
32
+ * and their dependencies on events (emission capability). Ignores wildcard hooks by default.
33
+ */
34
+ buildEventEmissionGraph(): IDependentNode[];
35
+ private setupBlankNodes;
36
+ getTasksWithTag(tag: string | ITag): ITask<any, any, any, any, import("..").TagType[], import("..").TaskMiddlewareAttachmentType[]>[];
37
+ getResourcesWithTag(tag: string | ITag): IResource<any, any, {}, any, any, import("..").TagType[], import("..").ResourceMiddlewareAttachmentType[]>[];
38
+ /**
39
+ * Used to fetch the value cloned, and if we're dealing with an override, we need to extend the previous value.
40
+ */
41
+ private getFreshValue;
42
+ }
43
+ export {};
@@ -0,0 +1,8 @@
1
+ import { StoreRegistry } from "./StoreRegistry";
2
+ export declare class StoreValidator {
3
+ private registry;
4
+ constructor(registry: StoreRegistry);
5
+ checkIfIDExists(id: string): void | never;
6
+ runSanityChecks(): void;
7
+ ensureAllTagsUsedAreRegistered(): void;
8
+ }
@@ -0,0 +1,27 @@
1
+ import { DependencyMapType, ITask } from "../defs";
2
+ import { EventManager } from "./EventManager";
3
+ import { Store } from "./Store";
4
+ import { Logger } from "./Logger";
5
+ export declare class TaskRunner {
6
+ protected readonly store: Store;
7
+ protected readonly eventManager: EventManager;
8
+ protected readonly logger: Logger;
9
+ protected readonly runnerStore: Map<string | symbol, (input: any) => Promise<any>>;
10
+ constructor(store: Store, eventManager: EventManager, logger: Logger);
11
+ private readonly middlewareManager;
12
+ /**
13
+ * 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.
14
+ * This function can throw only if any of the event listeners or run function throws
15
+ * @param task the task to be run
16
+ * @param input the input to be passed to the task
17
+ */
18
+ run<TInput, TOutput extends Promise<any>, TDeps extends DependencyMapType>(task: ITask<TInput, TOutput, TDeps>, input?: TInput): Promise<TOutput | undefined>;
19
+ /**
20
+ * Creates the function with the chain of middleware.
21
+ * @param task
22
+ * @param input
23
+ * @param taskDependencies
24
+ * @returns
25
+ */
26
+ protected createRunnerWithMiddleware<TInput, TOutput extends Promise<any>, TDeps extends DependencyMapType>(task: ITask<TInput, TOutput, TDeps>): (input: any) => Promise<TOutput | (TOutput extends Promise<infer U> ? U : never)>;
27
+ }
@@ -0,0 +1,11 @@
1
+ import { Logger } from "./Logger";
2
+ export type UnhandledErrorKind = "process" | "task" | "middleware" | "resourceInit" | "hook" | "run";
3
+ export interface OnUnhandledErrorInfo {
4
+ error: unknown;
5
+ kind?: UnhandledErrorKind;
6
+ source?: string;
7
+ }
8
+ export type OnUnhandledError = (info: OnUnhandledErrorInfo) => void | Promise<void>;
9
+ export declare function createDefaultUnhandledError(logger: Logger): OnUnhandledError;
10
+ export declare function bindProcessErrorHandler(handler: OnUnhandledError): (error: unknown, source: "uncaughtException" | "unhandledRejection") => void | Promise<void>;
11
+ export declare function safeReportUnhandledError(handler: OnUnhandledError, info: OnUnhandledErrorInfo): Promise<void>;
@@ -0,0 +1,11 @@
1
+ export * from "./DependencyProcessor";
2
+ export * from "./EventManager";
3
+ export * from "./Logger";
4
+ export * from "./Store";
5
+ export * from "./TaskRunner";
6
+ export * from "./ResourceInitializer";
7
+ export * from "./MiddlewareManager";
8
+ export * from "./Semaphore";
9
+ export * from "./Queue";
10
+ export * from "./UnhandledError";
11
+ export * from "./RunResult";
@@ -0,0 +1,16 @@
1
+ /**
2
+ * A node that has dependencies.
3
+ */
4
+ export interface IDependentNode {
5
+ id: string;
6
+ dependencies: Record<string, IDependentNode>;
7
+ }
8
+ interface FindCircularDependenciesResult {
9
+ cycles: string[];
10
+ missingDependencies: Array<{
11
+ nodeId: string;
12
+ dependencyId: string;
13
+ }>;
14
+ }
15
+ export declare function findCircularDependencies(nodes: IDependentNode[]): FindCircularDependenciesResult;
16
+ export {};
@@ -0,0 +1,3 @@
1
+ export declare function safeStringify(value: unknown, space?: number, options?: {
2
+ maxDepth?: number;
3
+ }): string;
@@ -0,0 +1,3 @@
1
+ import type { Store } from "../../models/Store";
2
+ import type { AllowListGuard } from "./types";
3
+ export declare function createAllowListGuard(store: Store): AllowListGuard;
@@ -0,0 +1,6 @@
1
+ import type { Authenticator } from "./types";
2
+ export interface NodeExposureHttpAuthConfig {
3
+ header?: string;
4
+ token: string;
5
+ }
6
+ export declare function createAuthenticator(authCfg?: NodeExposureHttpAuthConfig): Authenticator;
@@ -0,0 +1,4 @@
1
+ import type { IncomingMessage, ServerResponse } from "http";
2
+ import type { NodeExposureHttpCorsConfig } from "./resourceTypes";
3
+ export declare function applyCorsActual(req: IncomingMessage, res: ServerResponse, cfg: NodeExposureHttpCorsConfig | undefined): void;
4
+ export declare function handleCorsPreflight(req: IncomingMessage, res: ServerResponse, cfg: NodeExposureHttpCorsConfig | undefined): boolean;
@@ -0,0 +1,2 @@
1
+ import type { NodeExposureConfig, NodeExposureDeps, NodeExposureHandlers } from "./resourceTypes";
2
+ export declare function createNodeExposure(cfg: NodeExposureConfig | undefined, deps: NodeExposureDeps): Promise<NodeExposureHandlers>;
@@ -0,0 +1,18 @@
1
+ import * as http from "http";
2
+ import type { RequestHandler } from "./types";
3
+ import type { NodeExposureDeps, NodeExposureHttpConfig } from "./resourceTypes";
4
+ interface ExposureServerOptions {
5
+ httpConfig?: NodeExposureHttpConfig;
6
+ handler: RequestHandler;
7
+ logger: NodeExposureDeps["logger"];
8
+ basePath: string;
9
+ }
10
+ interface ExposureServerControls {
11
+ server: http.Server | null;
12
+ createRequestListener(): http.RequestListener;
13
+ createServer(): http.Server;
14
+ attachTo(server: http.Server): () => void;
15
+ close(): Promise<void>;
16
+ }
17
+ export declare function createExposureServer(options: ExposureServerOptions): Promise<ExposureServerControls>;
18
+ export {};
@@ -0,0 +1,10 @@
1
+ import type { ServerResponse } from "http";
2
+ import type { Serializer } from "../../globals/resources/tunnel/serializer";
3
+ import type { JsonResponse, StreamingResponse } from "./types";
4
+ export declare const EJSON_CONTENT_TYPE = "application/json; charset=utf-8";
5
+ export declare const NOT_FOUND_RESPONSE: JsonResponse;
6
+ export declare const METHOD_NOT_ALLOWED_RESPONSE: JsonResponse;
7
+ export declare function jsonOkResponse(data?: Record<string, unknown>): JsonResponse;
8
+ export declare function jsonErrorResponse(status: number, message: string, code?: string): JsonResponse;
9
+ export declare function respondJson(res: ServerResponse, response: JsonResponse, serializer?: Serializer): void;
10
+ export declare function respondStream(res: ServerResponse, value: StreamingResponse | NodeJS.ReadableStream): void;
@@ -0,0 +1,4 @@
1
+ import type { Logger } from "../../models/Logger";
2
+ export declare function safeLogError(logger: Logger, message: string, data: Record<string, unknown>): void;
3
+ export declare function safeLogInfo(logger: Logger, message: string, data: Record<string, unknown>): void;
4
+ export declare function errorMessage(error: unknown): string;
@@ -0,0 +1,27 @@
1
+ import type { IncomingHttpHeaders } from "http";
2
+ import type { Serializer } from "../../globals/resources/tunnel/serializer";
3
+ import type { JsonResponse } from "./types";
4
+ interface MultipartFinalizeOk {
5
+ ok: true;
6
+ }
7
+ interface MultipartFinalizeError {
8
+ ok: false;
9
+ response: JsonResponse;
10
+ }
11
+ export type MultipartFinalizeResult = MultipartFinalizeOk | MultipartFinalizeError;
12
+ interface MultipartSuccess {
13
+ ok: true;
14
+ value: unknown;
15
+ finalize: Promise<MultipartFinalizeResult>;
16
+ }
17
+ type MultipartResult = MultipartSuccess | {
18
+ ok: false;
19
+ response: JsonResponse;
20
+ };
21
+ export interface MultipartRequest extends NodeJS.ReadableStream {
22
+ headers: IncomingHttpHeaders;
23
+ method?: string;
24
+ }
25
+ export declare function parseMultipartInput(req: MultipartRequest, signal?: AbortSignal, serializer?: Serializer): Promise<MultipartResult>;
26
+ export declare function isMultipart(contentType: string): boolean;
27
+ export {};
@@ -0,0 +1,11 @@
1
+ import type { IncomingMessage } from "http";
2
+ import type { Serializer } from "../../globals/resources/tunnel/serializer";
3
+ import type { JsonResponse } from "./types";
4
+ export declare function readRequestBody(req: IncomingMessage, signal?: AbortSignal): Promise<Buffer>;
5
+ export declare function readJsonBody<T>(req: IncomingMessage, signal?: AbortSignal, serializer?: Serializer): Promise<{
6
+ ok: true;
7
+ value: T | undefined;
8
+ } | {
9
+ ok: false;
10
+ response: JsonResponse;
11
+ }>;
@@ -0,0 +1,17 @@
1
+ import type { IncomingMessage, ServerResponse } from "http";
2
+ export interface ExposureRequestContextValue {
3
+ req: IncomingMessage;
4
+ res: ServerResponse;
5
+ url: URL;
6
+ basePath: string;
7
+ headers: IncomingMessage["headers"];
8
+ method?: string;
9
+ signal: AbortSignal;
10
+ }
11
+ export declare const ExposureRequestContext: import("..").Context<ExposureRequestContextValue>;
12
+ export declare function useExposureContext(): ExposureRequestContextValue;
13
+ /**
14
+ * Checks if the exposure request context is currently available without throwing an error.
15
+ * Useful for conditional logic in tasks that may or may not be exposed.
16
+ */
17
+ export declare function hasExposureContext(): boolean;
@@ -0,0 +1,24 @@
1
+ import type { IncomingMessage, ServerResponse } from "http";
2
+ import type { Serializer } from "../../globals/resources/tunnel/serializer";
3
+ import type { Authenticator, AllowListGuard, RequestHandler } from "./types";
4
+ import type { ExposureRouter } from "./router";
5
+ import type { NodeExposureDeps, NodeExposureHttpCorsConfig } from "./resourceTypes";
6
+ interface RequestProcessingDeps {
7
+ store: NodeExposureDeps["store"];
8
+ taskRunner: NodeExposureDeps["taskRunner"];
9
+ eventManager: NodeExposureDeps["eventManager"];
10
+ logger: NodeExposureDeps["logger"];
11
+ authenticator: Authenticator;
12
+ allowList: AllowListGuard;
13
+ router: ExposureRouter;
14
+ cors?: NodeExposureHttpCorsConfig;
15
+ serializer: Serializer;
16
+ }
17
+ export interface NodeExposureRequestHandlers {
18
+ handleTask: (req: IncomingMessage, res: ServerResponse) => Promise<void>;
19
+ handleEvent: (req: IncomingMessage, res: ServerResponse) => Promise<void>;
20
+ handleDiscovery: (req: IncomingMessage, res: ServerResponse) => Promise<void>;
21
+ handleRequest: RequestHandler;
22
+ }
23
+ export declare function createRequestHandlers(deps: RequestProcessingDeps): NodeExposureRequestHandlers;
24
+ export {};
@@ -0,0 +1,60 @@
1
+ import type * as http from "http";
2
+ import type { IncomingMessage, ServerResponse } from "http";
3
+ import { globalResources } from "../../globals/globalResources";
4
+ import type { ResourceDependencyValuesType } from "../../defs";
5
+ import type { NodeExposureHttpAuthConfig } from "./authenticator";
6
+ export type NodeExposureDependencyMap = {
7
+ store: typeof globalResources.store;
8
+ taskRunner: typeof globalResources.taskRunner;
9
+ eventManager: typeof globalResources.eventManager;
10
+ logger: typeof globalResources.logger;
11
+ serializer: typeof globalResources.serializer;
12
+ };
13
+ export type NodeExposureDeps = ResourceDependencyValuesType<NodeExposureDependencyMap>;
14
+ export interface NodeExposureHttpConfig {
15
+ basePath?: string;
16
+ server?: http.Server;
17
+ listen?: {
18
+ port: number;
19
+ host?: string;
20
+ };
21
+ auth?: NodeExposureHttpAuthConfig;
22
+ cors?: NodeExposureHttpCorsConfig;
23
+ }
24
+ export interface NodeExposureConfig {
25
+ http?: NodeExposureHttpConfig;
26
+ }
27
+ export interface NodeExposureHandlers {
28
+ handleRequest: (req: IncomingMessage, res: ServerResponse) => Promise<boolean>;
29
+ handleTask: (req: IncomingMessage, res: ServerResponse) => Promise<void>;
30
+ handleEvent: (req: IncomingMessage, res: ServerResponse) => Promise<void>;
31
+ handleDiscovery: (req: IncomingMessage, res: ServerResponse) => Promise<void>;
32
+ createRequestListener: () => http.RequestListener;
33
+ createServer: () => http.Server;
34
+ attachTo: (server: http.Server) => () => void;
35
+ server?: http.Server | null;
36
+ basePath: string;
37
+ close: () => Promise<void>;
38
+ }
39
+ export interface NodeExposureHttpCorsConfig {
40
+ /**
41
+ * Allowed origin(s). When omitted, defaults to "*".
42
+ * - string: exact origin value to send
43
+ * - string[]: allow-list; request origin must match an item
44
+ * - RegExp: allow when test(origin) is true
45
+ * - function: returns the origin to send or null to disallow
46
+ */
47
+ origin?: string | string[] | RegExp | ((origin: string | undefined) => string | null | undefined);
48
+ /** Which methods are allowed on preflight; defaults to ["POST", "OPTIONS"]. */
49
+ methods?: string[];
50
+ /** Access-Control-Allow-Headers value. If omitted, echoes Access-Control-Request-Headers. */
51
+ allowedHeaders?: string[];
52
+ /** Expose response headers for actual requests. */
53
+ exposedHeaders?: string[];
54
+ /** Whether to include Access-Control-Allow-Credentials: true. */
55
+ credentials?: boolean;
56
+ /** Max age in seconds for preflight caching. */
57
+ maxAge?: number;
58
+ /** Whether to append Vary: Origin when a specific origin is returned. Default true. */
59
+ varyOrigin?: boolean;
60
+ }
@@ -0,0 +1,17 @@
1
+ import type { IncomingMessage } from "http";
2
+ import type { JsonResponse, RequestKind, RequestTarget } from "./types";
3
+ export interface ExposureRouter {
4
+ basePath: string;
5
+ isUnderBase(pathname: string): boolean;
6
+ extract(pathname: string): RequestTarget | null;
7
+ }
8
+ export declare function resolveBasePath(basePath?: string): string;
9
+ export declare function createRouter(basePath: string): ExposureRouter;
10
+ export declare function resolveTargetFromRequest(req: IncomingMessage, router: ExposureRouter, expected: RequestKind): {
11
+ ok: true;
12
+ id: string;
13
+ } | {
14
+ ok: false;
15
+ response: JsonResponse;
16
+ };
17
+ export declare function requestUrl(req: IncomingMessage): URL;
@@ -0,0 +1,13 @@
1
+ import * as http from "http";
2
+ import type { RequestHandler } from "./types";
3
+ import type { Logger } from "../../models/Logger";
4
+ export declare function makeRequestListener(options: {
5
+ handler: RequestHandler;
6
+ respondOnMiss: boolean;
7
+ logger: Logger;
8
+ }): http.RequestListener;
9
+ export declare function startHttpServer(server: http.Server, listen: {
10
+ port: number;
11
+ host?: string;
12
+ }): Promise<void>;
13
+ export declare function stopHttpServer(server: http.Server): Promise<void>;
@@ -0,0 +1,31 @@
1
+ import type { IncomingMessage, ServerResponse } from "http";
2
+ export type RequestKind = "task" | "event" | "discovery";
3
+ export interface RequestTarget {
4
+ kind: RequestKind;
5
+ id: string;
6
+ }
7
+ export type JsonBody = {
8
+ ok: boolean;
9
+ [key: string]: unknown;
10
+ };
11
+ export interface JsonResponse {
12
+ status: number;
13
+ body: JsonBody;
14
+ }
15
+ export type RequestHandler = (req: IncomingMessage, res: ServerResponse) => Promise<boolean>;
16
+ export type Authenticator = (req: IncomingMessage) => {
17
+ ok: true;
18
+ } | {
19
+ ok: false;
20
+ response: JsonResponse;
21
+ };
22
+ export interface AllowListGuard {
23
+ ensureTask(id: string): JsonResponse | null;
24
+ ensureEvent(id: string): JsonResponse | null;
25
+ }
26
+ export interface StreamingResponse {
27
+ stream: NodeJS.ReadableStream;
28
+ status?: number;
29
+ contentType?: string;
30
+ headers?: Record<string, string>;
31
+ }
@@ -0,0 +1,17 @@
1
+ import type { IncomingHttpHeaders, IncomingMessage, ServerResponse } from "http";
2
+ /**
3
+ * Extract a normalized Content-Type header value from request headers.
4
+ * Returns an empty string if not present. If multiple values are present,
5
+ * the first one is used.
6
+ */
7
+ export declare function getContentType(headers: IncomingHttpHeaders): string;
8
+ /**
9
+ * Attach an event listener to a Node-style emitter that may expose either
10
+ * `once` or `on`. Returns true if attached, false otherwise.
11
+ */
12
+ export declare function attachRequestListener(target: unknown, event: string, handler: (...args: unknown[]) => void): boolean;
13
+ /**
14
+ * Wires an AbortController to abort when the client disconnects.
15
+ * Attaches to `req` aborted and `res` close events using robust listener attachment.
16
+ */
17
+ export declare function createAbortControllerForRequest(req: IncomingMessage, res: ServerResponse): AbortController;
@@ -0,0 +1,12 @@
1
+ import type { NodeExposureConfig, NodeExposureHandlers } from "./exposure/resourceTypes";
2
+ export type { NodeExposureHttpAuthConfig } from "./exposure/authenticator";
3
+ export declare const nodeExposure: import("..").IResource<NodeExposureConfig, Promise<NodeExposureHandlers>, {
4
+ store: import("..").IResource<void, Promise<import("..").Store>, {}, any, any, import("..").TagType[], import("..").ResourceMiddlewareAttachmentType[]>;
5
+ taskRunner: import("..").IResource<void, Promise<import("..").TaskRunner>, {}, any, any, import("..").TagType[], import("..").ResourceMiddlewareAttachmentType[]>;
6
+ eventManager: import("..").IResource<void, Promise<import("..").EventManager>, {}, any, any, import("..").TagType[], import("..").ResourceMiddlewareAttachmentType[]>;
7
+ logger: import("..").IResource<void, Promise<import("..").Logger>, {}, any, any, import("..").TagType[], import("..").ResourceMiddlewareAttachmentType[]>;
8
+ serializer: import("..").IResource<void, Promise<import("../globals/resources/tunnel/serializer").Serializer>, {}, any, any, import("..").TagType[], import("..").ResourceMiddlewareAttachmentType[]>;
9
+ }, any, {
10
+ title: string;
11
+ description: string;
12
+ }, import("..").TagType[], import("..").ResourceMiddlewareAttachmentType[]>;
@@ -0,0 +1,9 @@
1
+ import type { Readable } from "stream";
2
+ import type { InputFileMeta, EjsonFileSentinel } from "../types/inputFile";
3
+ export interface NodeFileSource {
4
+ stream?: Readable;
5
+ buffer?: Buffer;
6
+ }
7
+ export declare function createNodeFile(meta: InputFileMeta, source: NodeFileSource, id?: string): EjsonFileSentinel & {
8
+ _node: NodeFileSource;
9
+ };
@@ -0,0 +1,22 @@
1
+ import { Readable } from "stream";
2
+ import type { Serializer } from "../globals/resources/tunnel/serializer";
3
+ export interface HttpSmartClientAuthConfig {
4
+ header?: string;
5
+ token: string;
6
+ }
7
+ export interface HttpSmartClientConfig {
8
+ baseUrl: string;
9
+ auth?: HttpSmartClientAuthConfig;
10
+ timeoutMs?: number;
11
+ serializer: Serializer;
12
+ onRequest?: (ctx: {
13
+ url: string;
14
+ headers: Record<string, string>;
15
+ }) => void | Promise<void>;
16
+ }
17
+ export interface HttpSmartClient {
18
+ task<I = unknown, O = unknown>(id: string, input?: I): Promise<O | Readable>;
19
+ event<P = unknown>(id: string, payload?: P): Promise<void>;
20
+ }
21
+ export declare function createHttpSmartClient(cfg: HttpSmartClientConfig): HttpSmartClient;
22
+ export type { Readable };
@@ -0,0 +1 @@
1
+ export * from "./node";