@fluojs/runtime 1.1.8 → 3.0.0

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 (130) hide show
  1. package/README.ko.md +292 -21
  2. package/README.md +292 -21
  3. package/dist/abort.d.ts +6 -1
  4. package/dist/abort.d.ts.map +1 -1
  5. package/dist/abort.js +18 -2
  6. package/dist/adapters/internal-request-response-factory.d.ts +1 -1
  7. package/dist/adapters/internal-request-response-factory.d.ts.map +1 -1
  8. package/dist/adapters/internal-request-response-factory.js +1 -1
  9. package/dist/adapters/request-response-factory.d.ts +20 -1
  10. package/dist/adapters/request-response-factory.d.ts.map +1 -1
  11. package/dist/adapters/request-response-factory.js +75 -22
  12. package/dist/bootstrap.d.ts +3 -9
  13. package/dist/bootstrap.d.ts.map +1 -1
  14. package/dist/bootstrap.js +181 -76
  15. package/dist/devtools/contracts.d.ts +3 -135
  16. package/dist/devtools/contracts.d.ts.map +1 -1
  17. package/dist/devtools/index.d.ts +2 -3
  18. package/dist/devtools/index.d.ts.map +1 -1
  19. package/dist/devtools/index.js +1 -2
  20. package/dist/devtools/snapshot.d.ts +1 -1
  21. package/dist/devtools/snapshot.d.ts.map +1 -1
  22. package/dist/devtools/snapshot.js +18 -17
  23. package/dist/devtools/studio-request-observer.d.ts +14 -0
  24. package/dist/devtools/studio-request-observer.d.ts.map +1 -0
  25. package/dist/devtools/studio-request-observer.js +112 -0
  26. package/dist/devtools/studio-runtime-config.d.ts +25 -0
  27. package/dist/devtools/studio-runtime-config.d.ts.map +1 -0
  28. package/dist/devtools/studio-runtime-config.js +59 -0
  29. package/dist/devtools/studio-runtime.d.ts +12 -18
  30. package/dist/devtools/studio-runtime.d.ts.map +1 -1
  31. package/dist/devtools/studio-runtime.js +25 -169
  32. package/dist/errors.d.ts +26 -0
  33. package/dist/errors.d.ts.map +1 -1
  34. package/dist/errors.js +38 -0
  35. package/dist/health/health.d.ts +18 -4
  36. package/dist/health/health.d.ts.map +1 -1
  37. package/dist/health/health.js +5 -2
  38. package/dist/http-adapter-shared.d.ts +1 -1
  39. package/dist/http-adapter-shared.d.ts.map +1 -1
  40. package/dist/http-adapter-shared.js +1 -1
  41. package/dist/index.d.ts +6 -3
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +4 -1
  44. package/dist/internal/route-inspection-metadata.d.ts +30 -0
  45. package/dist/internal/route-inspection-metadata.d.ts.map +1 -0
  46. package/dist/internal/route-inspection-metadata.js +68 -0
  47. package/dist/internal.d.ts +6 -1
  48. package/dist/internal.d.ts.map +1 -1
  49. package/dist/internal.js +4 -1
  50. package/dist/module-definition.d.ts +10 -0
  51. package/dist/module-definition.d.ts.map +1 -0
  52. package/dist/module-definition.js +12 -0
  53. package/dist/module-graph.d.ts +42 -1
  54. package/dist/module-graph.d.ts.map +1 -1
  55. package/dist/module-graph.js +112 -16
  56. package/dist/multipart.d.ts +68 -4
  57. package/dist/multipart.d.ts.map +1 -1
  58. package/dist/multipart.js +666 -103
  59. package/dist/platform-component-registry.d.ts +9 -0
  60. package/dist/platform-component-registry.d.ts.map +1 -0
  61. package/dist/platform-component-registry.js +70 -0
  62. package/dist/platform-diagnostic-retention.d.ts +13 -0
  63. package/dist/platform-diagnostic-retention.d.ts.map +1 -0
  64. package/dist/platform-diagnostic-retention.js +43 -0
  65. package/dist/platform-shell-probe-reports.d.ts +8 -0
  66. package/dist/platform-shell-probe-reports.d.ts.map +1 -0
  67. package/dist/platform-shell-probe-reports.js +95 -0
  68. package/dist/platform-shell-probes.d.ts +16 -0
  69. package/dist/platform-shell-probes.d.ts.map +1 -0
  70. package/dist/platform-shell-probes.js +141 -0
  71. package/dist/platform-shell.d.ts +7 -13
  72. package/dist/platform-shell.d.ts.map +1 -1
  73. package/dist/platform-shell.js +58 -310
  74. package/dist/retryable-shutdown.d.ts +7 -0
  75. package/dist/retryable-shutdown.d.ts.map +1 -0
  76. package/dist/retryable-shutdown.js +20 -0
  77. package/dist/route-inspection.d.ts +56 -0
  78. package/dist/route-inspection.d.ts.map +1 -0
  79. package/dist/route-inspection.js +80 -0
  80. package/dist/tokens.d.ts +6 -4
  81. package/dist/tokens.d.ts.map +1 -1
  82. package/dist/tokens.js +5 -0
  83. package/dist/types.d.ts +53 -8
  84. package/dist/types.d.ts.map +1 -1
  85. package/dist/web.d.ts +22 -9
  86. package/dist/web.d.ts.map +1 -1
  87. package/dist/web.js +80 -34
  88. package/package.json +13 -26
  89. package/dist/internal-node.d.ts +0 -2
  90. package/dist/internal-node.d.ts.map +0 -1
  91. package/dist/internal-node.js +0 -1
  92. package/dist/logging/json-logger.d.ts +0 -8
  93. package/dist/logging/json-logger.d.ts.map +0 -1
  94. package/dist/logging/json-logger.js +0 -45
  95. package/dist/logging/logger.d.ts +0 -37
  96. package/dist/logging/logger.d.ts.map +0 -1
  97. package/dist/logging/logger.js +0 -103
  98. package/dist/node/internal-node-compression.d.ts +0 -22
  99. package/dist/node/internal-node-compression.d.ts.map +0 -1
  100. package/dist/node/internal-node-compression.js +0 -84
  101. package/dist/node/internal-node-request.d.ts +0 -162
  102. package/dist/node/internal-node-request.d.ts.map +0 -1
  103. package/dist/node/internal-node-request.js +0 -475
  104. package/dist/node/internal-node-response.d.ts +0 -28
  105. package/dist/node/internal-node-response.d.ts.map +0 -1
  106. package/dist/node/internal-node-response.js +0 -205
  107. package/dist/node/internal-node-shutdown.d.ts +0 -34
  108. package/dist/node/internal-node-shutdown.d.ts.map +0 -1
  109. package/dist/node/internal-node-shutdown.js +0 -83
  110. package/dist/node/internal-node.d.ts +0 -117
  111. package/dist/node/internal-node.d.ts.map +0 -1
  112. package/dist/node/internal-node.js +0 -283
  113. package/dist/node/node-compression.d.ts +0 -2
  114. package/dist/node/node-compression.d.ts.map +0 -1
  115. package/dist/node/node-compression.js +0 -1
  116. package/dist/node/node-request.d.ts +0 -2
  117. package/dist/node/node-request.d.ts.map +0 -1
  118. package/dist/node/node-request.js +0 -1
  119. package/dist/node/node-response.d.ts +0 -2
  120. package/dist/node/node-response.d.ts.map +0 -1
  121. package/dist/node/node-response.js +0 -1
  122. package/dist/node/node-shutdown.d.ts +0 -2
  123. package/dist/node/node-shutdown.d.ts.map +0 -1
  124. package/dist/node/node-shutdown.js +0 -1
  125. package/dist/node/node.d.ts +0 -2
  126. package/dist/node/node.d.ts.map +0 -1
  127. package/dist/node/node.js +0 -1
  128. package/dist/node.d.ts +0 -5
  129. package/dist/node.d.ts.map +0 -1
  130. package/dist/node.js +0 -3
@@ -1,34 +0,0 @@
1
- import type { Application, ApplicationLogger } from '../types.js';
2
- import type { HttpAdapterShutdownRegistration } from '../http-adapter-shared.js';
3
- type NodeShutdownSignal = 'SIGINT' | 'SIGTERM';
4
- /**
5
- * Returns the default POSIX shutdown signals used by Node-hosted runtime helpers.
6
- *
7
- * @returns The ordered list of signals that trigger graceful shutdown registration.
8
- */
9
- export declare function defaultNodeShutdownSignals(): readonly NodeShutdownSignal[];
10
- /**
11
- * Creates shutdown registration logic for Node-hosted adapters.
12
- *
13
- * The returned registration preserves graceful shutdown semantics while leaving
14
- * final process termination ownership to the surrounding host/runtime.
15
- *
16
- * @param signals Signals to register, or `false` to disable signal handling.
17
- * @returns Registration callback consumed by HTTP adapter startup helpers.
18
- */
19
- export declare function createNodeShutdownSignalRegistration(signals?: false | readonly NodeShutdownSignal[]): HttpAdapterShutdownRegistration;
20
- /**
21
- * Registers process signal handlers that attempt graceful shutdown.
22
- *
23
- * When the shutdown timeout elapses, the helper records failure via logging and
24
- * `process.exitCode` but does not terminate the host process directly.
25
- *
26
- * @param app Application instance to close when a signal arrives.
27
- * @param logger Logger used for shutdown diagnostics.
28
- * @param signals Signals to bind, or `false` to skip registration.
29
- * @param forceExitTimeoutMs Timeout window used to mark shutdown as failed.
30
- * @returns Unregister callback that removes the installed signal handlers.
31
- */
32
- export declare function registerShutdownSignals(app: Application, logger: ApplicationLogger, signals: false | readonly NodeShutdownSignal[], forceExitTimeoutMs?: number): () => void;
33
- export {};
34
- //# sourceMappingURL=internal-node-shutdown.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"internal-node-shutdown.d.ts","sourceRoot":"","sources":["../../src/node/internal-node-shutdown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,2BAA2B,CAAC;AAEjF,KAAK,kBAAkB,GAAG,QAAQ,GAAG,SAAS,CAAC;AAI/C;;;;GAIG;AACH,wBAAgB,0BAA0B,IAAI,SAAS,kBAAkB,EAAE,CAE1E;AAED;;;;;;;;GAQG;AACH,wBAAgB,oCAAoC,CAClD,OAAO,GAAE,KAAK,GAAG,SAAS,kBAAkB,EAAiC,GAC5E,+BAA+B,CAOjC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,KAAK,GAAG,SAAS,kBAAkB,EAAE,EAC9C,kBAAkB,GAAE,MAAsC,GACzD,MAAM,IAAI,CAqBZ"}
@@ -1,83 +0,0 @@
1
- const DEFAULT_FORCE_EXIT_TIMEOUT_MS = 30_000;
2
-
3
- /**
4
- * Returns the default POSIX shutdown signals used by Node-hosted runtime helpers.
5
- *
6
- * @returns The ordered list of signals that trigger graceful shutdown registration.
7
- */
8
- export function defaultNodeShutdownSignals() {
9
- return ['SIGINT', 'SIGTERM'];
10
- }
11
-
12
- /**
13
- * Creates shutdown registration logic for Node-hosted adapters.
14
- *
15
- * The returned registration preserves graceful shutdown semantics while leaving
16
- * final process termination ownership to the surrounding host/runtime.
17
- *
18
- * @param signals Signals to register, or `false` to disable signal handling.
19
- * @returns Registration callback consumed by HTTP adapter startup helpers.
20
- */
21
- export function createNodeShutdownSignalRegistration(signals = defaultNodeShutdownSignals()) {
22
- return (app, logger, forceExitTimeoutMs) => registerShutdownSignals(app, logger, signals, forceExitTimeoutMs);
23
- }
24
-
25
- /**
26
- * Registers process signal handlers that attempt graceful shutdown.
27
- *
28
- * When the shutdown timeout elapses, the helper records failure via logging and
29
- * `process.exitCode` but does not terminate the host process directly.
30
- *
31
- * @param app Application instance to close when a signal arrives.
32
- * @param logger Logger used for shutdown diagnostics.
33
- * @param signals Signals to bind, or `false` to skip registration.
34
- * @param forceExitTimeoutMs Timeout window used to mark shutdown as failed.
35
- * @returns Unregister callback that removes the installed signal handlers.
36
- */
37
- export function registerShutdownSignals(app, logger, signals, forceExitTimeoutMs = DEFAULT_FORCE_EXIT_TIMEOUT_MS) {
38
- if (signals === false) {
39
- return () => {};
40
- }
41
- const bindings = [];
42
- for (const signal of signals) {
43
- const handler = () => {
44
- void closeFromSignal(app, logger, signal, forceExitTimeoutMs);
45
- };
46
- bindings.push({
47
- signal,
48
- handler
49
- });
50
- process.once(signal, handler);
51
- }
52
- return () => {
53
- for (const binding of bindings) {
54
- process.off(binding.signal, binding.handler);
55
- }
56
- };
57
- }
58
- async function closeFromSignal(app, logger, signal, forceExitTimeoutMs) {
59
- if (app.state === 'closed') {
60
- process.exitCode = 0;
61
- return;
62
- }
63
- let timedOut = false;
64
- const forceExitTimer = setTimeout(() => {
65
- timedOut = true;
66
- logger.error(`Shutdown timeout exceeded after ${String(forceExitTimeoutMs)}ms; leaving process termination to the host.`, undefined, 'FluoFactory');
67
- process.exitCode = 1;
68
- }, forceExitTimeoutMs);
69
- if (forceExitTimer.unref) {
70
- forceExitTimer.unref();
71
- }
72
- try {
73
- await app.close(signal);
74
- clearTimeout(forceExitTimer);
75
- if (!timedOut) {
76
- process.exitCode = 0;
77
- }
78
- } catch (error) {
79
- clearTimeout(forceExitTimer);
80
- logger.error('Failed to shut down the application cleanly.', error, 'FluoFactory');
81
- process.exitCode = 1;
82
- }
83
- }
@@ -1,117 +0,0 @@
1
- import { createServer as createHttpServer } from 'node:http';
2
- import { createServer as createHttpsServer, type ServerOptions as HttpsServerOptions } from 'node:https';
3
- import { type CorsOptions, type Dispatcher, type HttpApplicationAdapter, type MiddlewareLike, type SecurityHeadersOptions } from '@fluojs/http';
4
- import type { MultipartOptions, UploadedFile } from '../multipart.js';
5
- import type { Application, ApplicationLogger, CreateApplicationOptions, ModuleType } from '../types.js';
6
- import { compressNodeResponse, createNodeResponseCompression } from './internal-node-compression.js';
7
- import { cloneHeaderValue, cloneRequestHeaders, createDeferredFrameworkRequestShell, createMemoizedAsyncValue, createMemoizedValue, createRequestSignal, normalizePrimaryContentType, parseCookieHeader, parseQueryParamsFromSearch, readPrimaryHeaderValue, resolveAbsoluteRequestUrl, resolveRequestIdFromHeaders, snapshotSimpleQueryRecord, splitRawRequestUrl } from './internal-node-request.js';
8
- import { createNodeShutdownSignalRegistration, defaultNodeShutdownSignals, registerShutdownSignals } from './internal-node-shutdown.js';
9
- declare module '@fluojs/http' {
10
- interface FrameworkRequest {
11
- files?: UploadedFile[];
12
- rawBody?: Uint8Array;
13
- }
14
- }
15
- /**
16
- * Describes the node http adapter options contract.
17
- */
18
- export interface NodeHttpAdapterOptions {
19
- host?: string;
20
- https?: HttpsServerOptions;
21
- maxBodySize?: number;
22
- port?: number;
23
- rawBody?: boolean;
24
- retryDelayMs?: number;
25
- retryLimit?: number;
26
- shutdownTimeoutMs?: number;
27
- }
28
- /**
29
- * Defines the node application signal type.
30
- */
31
- export type NodeApplicationSignal = 'SIGINT' | 'SIGTERM';
32
- /**
33
- * Defines the cors input type.
34
- */
35
- export type CorsInput = false | string | string[] | CorsOptions;
36
- /**
37
- * Describes the bootstrap node application options contract.
38
- */
39
- export interface BootstrapNodeApplicationOptions extends Omit<CreateApplicationOptions, 'adapter' | 'logger' | 'middleware'> {
40
- compression?: boolean;
41
- cors?: CorsInput;
42
- globalPrefix?: string;
43
- globalPrefixExclude?: readonly string[];
44
- host?: string;
45
- https?: HttpsServerOptions;
46
- logger?: ApplicationLogger;
47
- maxBodySize?: number;
48
- middleware?: MiddlewareLike[];
49
- multipart?: MultipartOptions;
50
- port?: number;
51
- rawBody?: boolean;
52
- retryDelayMs?: number;
53
- retryLimit?: number;
54
- securityHeaders?: false | SecurityHeadersOptions;
55
- shutdownTimeoutMs?: number;
56
- }
57
- /**
58
- * Describes the run node application options contract.
59
- */
60
- export interface RunNodeApplicationOptions extends BootstrapNodeApplicationOptions {
61
- forceExitTimeoutMs?: number;
62
- shutdownSignals?: false | readonly NodeApplicationSignal[];
63
- }
64
- interface NodeListenTarget {
65
- bindTarget: string;
66
- url: string;
67
- }
68
- type NodeServer = ReturnType<typeof createHttpServer> | ReturnType<typeof createHttpsServer>;
69
- /**
70
- * Represents the node http application adapter.
71
- */
72
- export declare class NodeHttpApplicationAdapter implements HttpApplicationAdapter {
73
- private readonly port;
74
- private readonly host;
75
- private readonly retryDelayMs;
76
- private readonly retryLimit;
77
- private readonly httpsOptions;
78
- private readonly shutdownTimeoutMs;
79
- private readonly server;
80
- private dispatcher?;
81
- private readonly requestResponseFactory;
82
- private readonly sockets;
83
- constructor(port: number, host: string | undefined, retryDelayMs: number | undefined, retryLimit: number | undefined, compression: boolean | undefined, httpsOptions: HttpsServerOptions | undefined, multipartOptions?: MultipartOptions, maxBodySize?: number, preserveRawBody?: boolean, shutdownTimeoutMs?: number);
84
- getServer(): NodeServer;
85
- getRealtimeCapability(): import("@fluojs/http").ServerBackedHttpAdapterRealtimeCapability;
86
- getListenTarget(): NodeListenTarget;
87
- listen(dispatcher: Dispatcher): Promise<void>;
88
- close(): Promise<void>;
89
- private handleRequest;
90
- }
91
- /**
92
- * Create node http adapter.
93
- *
94
- * @param options The options.
95
- * @param compression The compression.
96
- * @param multipartOptions The multipart options.
97
- * @returns The create node http adapter result.
98
- */
99
- export declare function createNodeHttpAdapter(options?: NodeHttpAdapterOptions, compression?: boolean, multipartOptions?: MultipartOptions): HttpApplicationAdapter;
100
- /**
101
- * Bootstrap node application.
102
- *
103
- * @param rootModule The root module.
104
- * @param options The options.
105
- * @returns The bootstrap node application result.
106
- */
107
- export declare function bootstrapNodeApplication(rootModule: ModuleType, options: BootstrapNodeApplicationOptions): Promise<Application>;
108
- /**
109
- * Run node application.
110
- *
111
- * @param rootModule The root module.
112
- * @param options The options.
113
- * @returns The run node application result.
114
- */
115
- export declare function runNodeApplication(rootModule: ModuleType, options: RunNodeApplicationOptions): Promise<Application>;
116
- export { cloneHeaderValue, cloneRequestHeaders, compressNodeResponse, createDeferredFrameworkRequestShell, createMemoizedAsyncValue, createMemoizedValue, createNodeResponseCompression, createNodeShutdownSignalRegistration, createRequestSignal, defaultNodeShutdownSignals, normalizePrimaryContentType, parseCookieHeader, parseQueryParamsFromSearch, readPrimaryHeaderValue, registerShutdownSignals, resolveAbsoluteRequestUrl, resolveRequestIdFromHeaders, snapshotSimpleQueryRecord, splitRawRequestUrl, };
117
- //# sourceMappingURL=internal-node.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"internal-node.d.ts","sourceRoot":"","sources":["../../src/node/internal-node.ts"],"names":[],"mappings":"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"}
@@ -1,283 +0,0 @@
1
- import { createServer as createHttpServer } from 'node:http';
2
- import { createServer as createHttpsServer } from 'node:https';
3
- import { createServerBackedHttpAdapterRealtimeCapability } from '@fluojs/http';
4
- import { dispatchWithRequestResponseFactory } from '../adapters/request-response-factory.js';
5
- import { bootstrapHttpAdapterApplication, runHttpAdapterApplication } from '../http-adapter-shared.js';
6
- import { createConsoleApplicationLogger } from '../logging/logger.js';
7
- import { compressNodeResponse, createNodeResponseCompression } from './internal-node-compression.js';
8
- import { cloneHeaderValue, cloneRequestHeaders, createDeferredFrameworkRequest, createDeferredFrameworkRequestShell, createMemoizedAsyncValue, createMemoizedValue, createRequestSignal, materializeFrameworkRequestBody, NodeRequestPayloadTooLargeException, normalizePrimaryContentType, parseCookieHeader, parseQueryParamsFromSearch, readPrimaryHeaderValue, resolveAbsoluteRequestUrl, resolveRequestIdFromHeaders, snapshotSimpleQueryRecord, splitRawRequestUrl } from './internal-node-request.js';
9
- import { createFrameworkResponse, writeNodeAdapterErrorResponse } from './internal-node-response.js';
10
- import { createNodeShutdownSignalRegistration, defaultNodeShutdownSignals, registerShutdownSignals } from './internal-node-shutdown.js';
11
-
12
- /**
13
- * Describes the node http adapter options contract.
14
- */
15
-
16
- /**
17
- * Defines the node application signal type.
18
- */
19
-
20
- /**
21
- * Defines the cors input type.
22
- */
23
-
24
- const DEFAULT_SHUTDOWN_TIMEOUT_MS = 10_000;
25
-
26
- /**
27
- * Describes the bootstrap node application options contract.
28
- */
29
-
30
- /**
31
- * Describes the run node application options contract.
32
- */
33
-
34
- /**
35
- * Represents the node http application adapter.
36
- */
37
- export class NodeHttpApplicationAdapter {
38
- server;
39
- dispatcher;
40
- requestResponseFactory;
41
- sockets = new Set();
42
- constructor(port, host, retryDelayMs = 150, retryLimit = 20, compression = false, httpsOptions, multipartOptions, maxBodySize = 1 * 1024 * 1024, preserveRawBody = false, shutdownTimeoutMs = DEFAULT_SHUTDOWN_TIMEOUT_MS) {
43
- this.port = port;
44
- this.host = host;
45
- this.retryDelayMs = retryDelayMs;
46
- this.retryLimit = retryLimit;
47
- this.httpsOptions = httpsOptions;
48
- this.shutdownTimeoutMs = shutdownTimeoutMs;
49
- validateNodeLifecycleOptions({
50
- retryDelayMs: this.retryDelayMs,
51
- retryLimit: this.retryLimit,
52
- shutdownTimeoutMs: this.shutdownTimeoutMs
53
- });
54
- this.requestResponseFactory = createNodeRequestResponseFactory(compression, multipartOptions, maxBodySize, preserveRawBody);
55
- this.server = createNodeServer(this.httpsOptions, (request, response) => {
56
- void this.handleRequest(request, response);
57
- });
58
- this.server.on('connection', socket => {
59
- this.sockets.add(socket);
60
- socket.once('close', () => {
61
- this.sockets.delete(socket);
62
- });
63
- });
64
- }
65
- getServer() {
66
- return this.server;
67
- }
68
- getRealtimeCapability() {
69
- return createServerBackedHttpAdapterRealtimeCapability(this.server);
70
- }
71
- getListenTarget() {
72
- return resolveNodeListenTarget(this.server.address() ?? null, this.port, this.host, this.httpsOptions !== undefined);
73
- }
74
- async listen(dispatcher) {
75
- this.dispatcher = dispatcher;
76
- await listenNodeServerWithRetry(this.server, {
77
- host: this.host,
78
- port: this.port,
79
- retryDelayMs: this.retryDelayMs,
80
- retryLimit: this.retryLimit
81
- });
82
- }
83
- async close() {
84
- const server = this.server;
85
- if (!server.listening) {
86
- this.dispatcher = undefined;
87
- return;
88
- }
89
- await closeNodeServerWithDrain(server, this.sockets, this.shutdownTimeoutMs);
90
- this.dispatcher = undefined;
91
- }
92
- async handleRequest(request, response) {
93
- await dispatchWithRequestResponseFactory({
94
- dispatcher: this.dispatcher,
95
- dispatcherNotReadyMessage: 'Node HTTP adapter received a request before dispatcher binding completed.',
96
- factory: this.requestResponseFactory,
97
- rawRequest: request,
98
- rawResponse: response
99
- });
100
- }
101
- }
102
- function createNodeRequestResponseFactory(compression, multipartOptions, maxBodySize, preserveRawBody) {
103
- return {
104
- async createRequest(request, signal) {
105
- return createDeferredFrameworkRequest(request, signal, multipartOptions, maxBodySize, preserveRawBody);
106
- },
107
- materializeRequest(request) {
108
- return materializeFrameworkRequestBody(request);
109
- },
110
- createRequestSignal(response) {
111
- return createRequestSignal(response);
112
- },
113
- createResponse(response, request) {
114
- return createFrameworkResponse(response, compression ? () => createNodeResponseCompression(response, request.headers['accept-encoding']) : undefined);
115
- },
116
- resolveRequestId(request) {
117
- return resolveRequestIdFromHeaders(request.headers);
118
- },
119
- async writeErrorResponse(error, response, requestId) {
120
- if (error instanceof NodeRequestPayloadTooLargeException) {
121
- error.prepareResponse(response.raw);
122
- }
123
- await writeNodeAdapterErrorResponse(error, response, requestId);
124
- }
125
- };
126
- }
127
-
128
- /**
129
- * Create node http adapter.
130
- *
131
- * @param options The options.
132
- * @param compression The compression.
133
- * @param multipartOptions The multipart options.
134
- * @returns The create node http adapter result.
135
- */
136
- export function createNodeHttpAdapter(options = {}, compression = false, multipartOptions) {
137
- return new NodeHttpApplicationAdapter(resolveNodePort(options.port), options.host, options.retryDelayMs, options.retryLimit, compression, options.https, multipartOptions, resolveNodeMaxBodySize(options.maxBodySize), options.rawBody, options.shutdownTimeoutMs);
138
- }
139
-
140
- /**
141
- * Bootstrap node application.
142
- *
143
- * @param rootModule The root module.
144
- * @param options The options.
145
- * @returns The bootstrap node application result.
146
- */
147
- export async function bootstrapNodeApplication(rootModule, options) {
148
- const logger = options.logger ?? createConsoleApplicationLogger();
149
- return bootstrapHttpAdapterApplication(rootModule, options, createNodeHttpAdapter(options, options.compression ?? false, options.multipart), logger);
150
- }
151
-
152
- /**
153
- * Run node application.
154
- *
155
- * @param rootModule The root module.
156
- * @param options The options.
157
- * @returns The run node application result.
158
- */
159
- export async function runNodeApplication(rootModule, options) {
160
- const logger = options.logger ?? createConsoleApplicationLogger();
161
- const adapter = createNodeHttpAdapter(options, options.compression ?? false, options.multipart);
162
- return runHttpAdapterApplication(rootModule, {
163
- ...options,
164
- shutdownRegistration: createNodeShutdownSignalRegistration(options.shutdownSignals ?? defaultNodeShutdownSignals())
165
- }, adapter, logger);
166
- }
167
- export { cloneHeaderValue, cloneRequestHeaders, compressNodeResponse, createDeferredFrameworkRequestShell, createMemoizedAsyncValue, createMemoizedValue, createNodeResponseCompression, createNodeShutdownSignalRegistration, createRequestSignal, defaultNodeShutdownSignals, normalizePrimaryContentType, parseCookieHeader, parseQueryParamsFromSearch, readPrimaryHeaderValue, registerShutdownSignals, resolveAbsoluteRequestUrl, resolveRequestIdFromHeaders, snapshotSimpleQueryRecord, splitRawRequestUrl };
168
- function createNodeServer(httpsOptions, handler) {
169
- return httpsOptions ? createHttpsServer(httpsOptions, handler) : createHttpServer(handler);
170
- }
171
- function listenNodeServerWithRetry(server, options) {
172
- return new Promise((resolve, reject) => {
173
- const tryListen = attempt => {
174
- const onError = error => {
175
- server.off('listening', onListening);
176
- if (error.code === 'EADDRINUSE' && attempt < options.retryLimit) {
177
- scheduleNodeListenRetry(server, attempt, options.retryDelayMs, tryListen);
178
- return;
179
- }
180
- reject(error);
181
- };
182
- const onListening = () => {
183
- server.off('error', onError);
184
- resolve();
185
- };
186
- server.once('error', onError);
187
- server.once('listening', onListening);
188
- server.listen({
189
- host: options.host,
190
- port: options.port
191
- });
192
- };
193
- tryListen(0);
194
- });
195
- }
196
- function scheduleNodeListenRetry(server, attempt, retryDelayMs, tryListen) {
197
- server.close(() => {
198
- setTimeout(() => {
199
- tryListen(attempt + 1);
200
- }, retryDelayMs);
201
- });
202
- }
203
- function closeNodeServerWithDrain(server, sockets, shutdownTimeoutMs) {
204
- return new Promise((resolve, reject) => {
205
- let settled = false;
206
- const timeout = setTimeout(() => {
207
- forceCloseConnections(server, sockets);
208
- }, shutdownTimeoutMs);
209
- const finish = error => {
210
- if (settled) {
211
- return;
212
- }
213
- settled = true;
214
- clearTimeout(timeout);
215
- if (error) {
216
- reject(error);
217
- return;
218
- }
219
- resolve();
220
- };
221
- server.close(error => {
222
- finish(error);
223
- });
224
- closeIdleConnections(server);
225
- });
226
- }
227
- function resolveNodeListenTarget(address, port, host, useHttps) {
228
- const protocol = useHttps ? 'https' : 'http';
229
- const resolvedPort = typeof address === 'object' && address !== null ? address.port : port;
230
- const bindHost = typeof address === 'object' && address !== null ? address.address : host ?? '0.0.0.0';
231
- const publicHost = resolvePublicHost(host ?? bindHost);
232
- const bindTarget = `${formatHostForAuthority(bindHost)}:${String(resolvedPort)}`;
233
- const url = `${protocol}://${formatHostForAuthority(publicHost)}:${String(resolvedPort)}`;
234
- return {
235
- bindTarget,
236
- url
237
- };
238
- }
239
- function resolvePublicHost(host) {
240
- return isWildcardHost(host) ? 'localhost' : host;
241
- }
242
- function isWildcardHost(host) {
243
- return host === '0.0.0.0' || host === '::' || host === '[::]';
244
- }
245
- function formatHostForAuthority(host) {
246
- return host.includes(':') && !host.startsWith('[') ? `[${host}]` : host;
247
- }
248
- function closeIdleConnections(server) {
249
- server.closeIdleConnections?.();
250
- }
251
- function validateNodeLifecycleOptions(options) {
252
- validateNonNegativeIntegerOption('retryDelayMs', options.retryDelayMs);
253
- validateNonNegativeIntegerOption('retryLimit', options.retryLimit);
254
- validateNonNegativeIntegerOption('shutdownTimeoutMs', options.shutdownTimeoutMs);
255
- }
256
- function validateNonNegativeIntegerOption(name, value) {
257
- if (!Number.isInteger(value) || value < 0) {
258
- throw new Error(`Invalid ${name} value: ${String(value)}. Expected a non-negative integer.`);
259
- }
260
- }
261
- function forceCloseConnections(server, sockets) {
262
- if (typeof server.closeAllConnections === 'function') {
263
- server.closeAllConnections();
264
- return;
265
- }
266
- for (const socket of sockets) {
267
- socket.destroy();
268
- }
269
- }
270
- function resolveNodePort(value) {
271
- const port = value ?? 3000;
272
- if (!Number.isInteger(port) || port < 0 || port > 65535) {
273
- throw new Error(`Invalid PORT value: ${String(value ?? 3000)}.`);
274
- }
275
- return port;
276
- }
277
- function resolveNodeMaxBodySize(value) {
278
- const maxBodySize = value ?? 1 * 1024 * 1024;
279
- if (!Number.isInteger(maxBodySize) || maxBodySize < 0) {
280
- throw new Error(`Invalid maxBodySize value: ${String(value ?? 1 * 1024 * 1024)}. Expected a non-negative integer number of bytes.`);
281
- }
282
- return maxBodySize;
283
- }
@@ -1,2 +0,0 @@
1
- export { compressNodeResponse, createNodeResponseCompression, } from './internal-node-compression.js';
2
- //# sourceMappingURL=node-compression.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"node-compression.d.ts","sourceRoot":"","sources":["../../src/node/node-compression.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,6BAA6B,GAC9B,MAAM,gCAAgC,CAAC"}
@@ -1 +0,0 @@
1
- export { compressNodeResponse, createNodeResponseCompression } from './internal-node-compression.js';
@@ -1,2 +0,0 @@
1
- export { createDeferredFrameworkRequest, createFrameworkRequest, createRequestSignal, materializeFrameworkRequestBody, resolveRequestIdFromHeaders, } from './internal-node-request.js';
2
- //# sourceMappingURL=node-request.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"node-request.d.ts","sourceRoot":"","sources":["../../src/node/node-request.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,8BAA8B,EAC9B,sBAAsB,EACtB,mBAAmB,EACnB,+BAA+B,EAC/B,2BAA2B,GAC5B,MAAM,4BAA4B,CAAC"}
@@ -1 +0,0 @@
1
- export { createDeferredFrameworkRequest, createFrameworkRequest, createRequestSignal, materializeFrameworkRequestBody, resolveRequestIdFromHeaders } from './internal-node-request.js';
@@ -1,2 +0,0 @@
1
- export { createFrameworkResponse, type MutableFrameworkResponse, writeNodeAdapterErrorResponse, } from './internal-node-response.js';
2
- //# sourceMappingURL=node-response.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"node-response.d.ts","sourceRoot":"","sources":["../../src/node/node-response.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,KAAK,wBAAwB,EAC7B,6BAA6B,GAC9B,MAAM,6BAA6B,CAAC"}
@@ -1 +0,0 @@
1
- export { createFrameworkResponse, writeNodeAdapterErrorResponse } from './internal-node-response.js';
@@ -1,2 +0,0 @@
1
- export { createNodeShutdownSignalRegistration, defaultNodeShutdownSignals, registerShutdownSignals, } from './internal-node-shutdown.js';
2
- //# sourceMappingURL=node-shutdown.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"node-shutdown.d.ts","sourceRoot":"","sources":["../../src/node/node-shutdown.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oCAAoC,EACpC,0BAA0B,EAC1B,uBAAuB,GACxB,MAAM,6BAA6B,CAAC"}
@@ -1 +0,0 @@
1
- export { createNodeShutdownSignalRegistration, defaultNodeShutdownSignals, registerShutdownSignals } from './internal-node-shutdown.js';
@@ -1,2 +0,0 @@
1
- export * from './internal-node.js';
2
- //# sourceMappingURL=node.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/node/node.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC"}
package/dist/node/node.js DELETED
@@ -1 +0,0 @@
1
- export * from './internal-node.js';
package/dist/node.d.ts DELETED
@@ -1,5 +0,0 @@
1
- export * from './logging/json-logger.js';
2
- export * from './logging/logger.js';
3
- export { bootstrapNodeApplication, createNodeHttpAdapter, NodeHttpApplicationAdapter, createNodeShutdownSignalRegistration, defaultNodeShutdownSignals, registerShutdownSignals, runNodeApplication, } from './node/internal-node.js';
4
- export type { BootstrapNodeApplicationOptions, CorsInput, NodeApplicationSignal, NodeHttpAdapterOptions, RunNodeApplicationOptions, } from './node/internal-node.js';
5
- //# sourceMappingURL=node.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,0BAA0B,EAC1B,oCAAoC,EACpC,0BAA0B,EAC1B,uBAAuB,EACvB,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACV,+BAA+B,EAC/B,SAAS,EACT,qBAAqB,EACrB,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,yBAAyB,CAAC"}
package/dist/node.js DELETED
@@ -1,3 +0,0 @@
1
- export * from './logging/json-logger.js';
2
- export * from './logging/logger.js';
3
- export { bootstrapNodeApplication, createNodeHttpAdapter, NodeHttpApplicationAdapter, createNodeShutdownSignalRegistration, defaultNodeShutdownSignals, registerShutdownSignals, runNodeApplication } from './node/internal-node.js';