@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,5 +1,5 @@
1
1
  import type { Token } from '@fluojs/core';
2
- import type { Provider } from '@fluojs/di';
2
+ import { type Provider } from '@fluojs/di/internal';
3
3
  import type { BootstrapModuleOptions, CompiledModule, ModuleType } from './types.js';
4
4
  /**
5
5
  * Returns the public token represented by a provider declaration.
@@ -8,6 +8,47 @@ import type { BootstrapModuleOptions, CompiledModule, ModuleType } from './types
8
8
  * @returns The token that should be registered and resolved for the provider.
9
9
  */
10
10
  export declare function providerToken(provider: Provider): Token;
11
+ /**
12
+ * Bounds retained module graph compile snapshots for an owning application or host.
13
+ *
14
+ * @remarks
15
+ * Cache reads update recency. Call {@link dispose} when the owner no longer needs
16
+ * cache hits so retained module constructors and compiled graph snapshots are released.
17
+ */
18
+ export declare class ModuleGraphCompileCache {
19
+ private readonly maxEntries;
20
+ private disposed;
21
+ private readonly entries;
22
+ /**
23
+ * Creates a bounded module graph compile cache.
24
+ *
25
+ * @param maxEntries Maximum successful compile snapshots retained by this cache.
26
+ * @throws {RangeError} When `maxEntries` is not a positive safe integer.
27
+ */
28
+ constructor(maxEntries?: number);
29
+ /**
30
+ * Reads a snapshot and updates its recency.
31
+ *
32
+ * @param key Cache key for the requested compile input.
33
+ * @returns The retained snapshot when available and not disposed.
34
+ *
35
+ * @internal
36
+ */
37
+ get(key: string): readonly CompiledModule[] | undefined;
38
+ /**
39
+ * Retains a successful snapshot and evicts the least-recently-used entry when full.
40
+ *
41
+ * @param key Cache key for the compile input.
42
+ * @param snapshot Isolated successful compile snapshot to retain.
43
+ *
44
+ * @internal
45
+ */
46
+ set(key: string, snapshot: readonly CompiledModule[]): void;
47
+ /** Releases every retained snapshot and permanently disables future cache retention. */
48
+ dispose(): void;
49
+ /** Returns the number of compile snapshots currently retained. */
50
+ get size(): number;
51
+ }
11
52
  /** Clears the process-local module graph compile cache for isolated regression tests. */
12
53
  export declare function clearModuleGraphCompileCacheForTesting(): void;
13
54
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"module-graph.d.ts","sourceRoot":"","sources":["../src/module-graph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAY3C,OAAO,KAAK,EACV,sBAAsB,EACtB,cAAc,EAGd,UAAU,EACX,MAAM,YAAY,CAAC;AAEpB;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,QAAQ,GAAG,KAAK,CAMvD;AAkBD,yFAAyF;AACzF,wBAAgB,sCAAsC,IAAI,IAAI,CAE7D;AAED;;;;GAIG;AACH,wBAAgB,wCAAwC,IAAI,MAAM,CAEjE;AA2FD;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,GAAE,sBAA2B,GAAG,MAAM,CAc9G;AAiRD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,GAAE,QAAQ,EAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAE5E;AAiXD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,GAAE,sBAA2B,GAAG,cAAc,EAAE,CA6BjH"}
1
+ {"version":3,"file":"module-graph.d.ts","sourceRoot":"","sources":["../src/module-graph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,KAAK,QAAQ,EAA0B,MAAM,qBAAqB,CAAC;AAe5E,OAAO,KAAK,EACV,sBAAsB,EACtB,cAAc,EAGd,UAAU,EACX,MAAM,YAAY,CAAC;AAEpB;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,QAAQ,GAAG,KAAK,CAMvD;AAkBD;;;;;;GAMG;AACH,qBAAa,uBAAuB;IAUtB,OAAO,CAAC,QAAQ,CAAC,UAAU;IATvC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgD;IAExE;;;;;OAKG;gBAC0B,UAAU,SAAqC;IAM5E;;;;;;;OAOG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,cAAc,EAAE,GAAG,SAAS;IAgBvD;;;;;;;OAOG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,cAAc,EAAE,GAAG,IAAI;IAkB3D,wFAAwF;IACxF,OAAO,IAAI,IAAI;IAKf,kEAAkE;IAClE,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF;AAID,yFAAyF;AACzF,wBAAgB,sCAAsC,IAAI,IAAI,CAE7D;AAED;;;;GAIG;AACH,wBAAgB,wCAAwC,IAAI,MAAM,CAEjE;AA2FD;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,GAAE,sBAA2B,GAAG,MAAM,CAc9G;AAqRD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,GAAE,QAAQ,EAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAE5E;AAgYD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,GAAE,sBAA2B,GAAG,cAAc,EAAE,CAkCjH"}
@@ -1,5 +1,6 @@
1
- import { getRuntimeClassDiMetadata, getRuntimeClassDiMetadataVersion, getOwnRuntimeClassDiMetadata, getRuntimeModuleMetadata, getRuntimeModuleMetadataVersion } from './internal/core-metadata.js';
1
+ import { validateProviderInputs } from '@fluojs/di/internal';
2
2
  import { ModuleGraphError, ModuleInjectionMetadataError, ModuleVisibilityError } from './errors.js';
3
+ import { getOwnRuntimeClassDiMetadata, getRuntimeClassDiMetadata, getRuntimeClassDiMetadataVersion, getRuntimeModuleMetadata, getRuntimeModuleMetadataVersion } from './internal/core-metadata.js';
3
4
  /**
4
5
  * Returns the public token represented by a provider declaration.
5
6
  *
@@ -15,13 +16,94 @@ export function providerToken(provider) {
15
16
  const objectTokenIds = new WeakMap();
16
17
  const symbolTokenIds = new Map();
17
18
  let nextTokenId = 0;
18
- const MODULE_GRAPH_COMPILE_ALGORITHM_VERSION = 1;
19
- const moduleGraphCompileCache = new Map();
19
+ const MODULE_GRAPH_COMPILE_ALGORITHM_VERSION = 2;
20
+ const DEFAULT_MODULE_GRAPH_CACHE_ENTRIES = 100;
20
21
  const EMPTY_MODULE_REPLACEMENTS = new Map();
21
22
 
23
+ /**
24
+ * Bounds retained module graph compile snapshots for an owning application or host.
25
+ *
26
+ * @remarks
27
+ * Cache reads update recency. Call {@link dispose} when the owner no longer needs
28
+ * cache hits so retained module constructors and compiled graph snapshots are released.
29
+ */
30
+ export class ModuleGraphCompileCache {
31
+ disposed = false;
32
+ entries = new Map();
33
+
34
+ /**
35
+ * Creates a bounded module graph compile cache.
36
+ *
37
+ * @param maxEntries Maximum successful compile snapshots retained by this cache.
38
+ * @throws {RangeError} When `maxEntries` is not a positive safe integer.
39
+ */
40
+ constructor(maxEntries = DEFAULT_MODULE_GRAPH_CACHE_ENTRIES) {
41
+ this.maxEntries = maxEntries;
42
+ if (!Number.isSafeInteger(maxEntries) || maxEntries <= 0) {
43
+ throw new RangeError('Module graph cache maxEntries must be a positive safe integer.');
44
+ }
45
+ }
46
+
47
+ /**
48
+ * Reads a snapshot and updates its recency.
49
+ *
50
+ * @param key Cache key for the requested compile input.
51
+ * @returns The retained snapshot when available and not disposed.
52
+ *
53
+ * @internal
54
+ */
55
+ get(key) {
56
+ if (this.disposed) {
57
+ return undefined;
58
+ }
59
+ const snapshot = this.entries.get(key);
60
+ if (snapshot === undefined) {
61
+ return undefined;
62
+ }
63
+ this.entries.delete(key);
64
+ this.entries.set(key, snapshot);
65
+ return snapshot;
66
+ }
67
+
68
+ /**
69
+ * Retains a successful snapshot and evicts the least-recently-used entry when full.
70
+ *
71
+ * @param key Cache key for the compile input.
72
+ * @param snapshot Isolated successful compile snapshot to retain.
73
+ *
74
+ * @internal
75
+ */
76
+ set(key, snapshot) {
77
+ if (this.disposed) {
78
+ return;
79
+ }
80
+ this.entries.delete(key);
81
+ this.entries.set(key, snapshot);
82
+ if (this.entries.size <= this.maxEntries) {
83
+ return;
84
+ }
85
+ const oldest = this.entries.keys().next();
86
+ if (!oldest.done) {
87
+ this.entries.delete(oldest.value);
88
+ }
89
+ }
90
+
91
+ /** Releases every retained snapshot and permanently disables future cache retention. */
92
+ dispose() {
93
+ this.entries.clear();
94
+ this.disposed = true;
95
+ }
96
+
97
+ /** Returns the number of compile snapshots currently retained. */
98
+ get size() {
99
+ return this.entries.size;
100
+ }
101
+ }
102
+ let moduleGraphCompileCache = new ModuleGraphCompileCache();
103
+
22
104
  /** Clears the process-local module graph compile cache for isolated regression tests. */
23
105
  export function clearModuleGraphCompileCacheForTesting() {
24
- moduleGraphCompileCache.clear();
106
+ moduleGraphCompileCache = new ModuleGraphCompileCache();
25
107
  }
26
108
 
27
109
  /**
@@ -103,7 +185,7 @@ function describeModuleReplacementsForCacheKey(moduleReplacements) {
103
185
  * @returns Process-local key that changes when metadata or runtime validation inputs change.
104
186
  */
105
187
  export function createModuleGraphCacheKey(rootModule, options = {}) {
106
- const runtimeProviders = (options.providers ?? []).map(describeProviderForCacheKey).join('|');
188
+ const runtimeProviders = validateProviderInputs(options.providers ?? []).map(describeProviderForCacheKey).join('|');
107
189
  const validationTokens = (options.validationTokens ?? []).map(describeTokenForCacheKey).join('|');
108
190
  const moduleReplacements = describeModuleReplacementsForCacheKey(options.moduleReplacements);
109
191
  return [`root:${describeTokenForCacheKey(rootModule)}`, `module:${getRuntimeModuleMetadataVersion()}`, `class-di:${getRuntimeClassDiMetadataVersion()}`, `algorithm:${MODULE_GRAPH_COMPILE_ALGORITHM_VERSION}`, `runtime:${runtimeProviders}`, `validation:${validationTokens}`, `replacements:${moduleReplacements}`].join(';');
@@ -324,6 +406,9 @@ function providerDependencies(provider) {
324
406
  if ('useClass' in provider) {
325
407
  return provider.inject ?? [...(getEffectiveClassDiMetadata(provider.useClass)?.inject ?? [])];
326
408
  }
409
+ if ('useExisting' in provider) {
410
+ return [provider.useExisting];
411
+ }
327
412
  return [];
328
413
  }
329
414
  function controllerDependencies(controller) {
@@ -385,7 +470,7 @@ function normalizeModuleDefinition(rawDefinition) {
385
470
  return {
386
471
  global: rawDefinition.global ?? false,
387
472
  imports: rawDefinition.imports ?? [],
388
- providers: rawDefinition.providers ?? [],
473
+ providers: validateProviderInputs(rawDefinition.providers ?? []),
389
474
  controllers: rawDefinition.controllers ?? [],
390
475
  exports: rawDefinition.exports ?? [],
391
476
  middleware: rawDefinition.middleware ?? []
@@ -473,11 +558,14 @@ function memoizeAccessibleTokenSet(compiledModule, importedModules, runtimeProvi
473
558
  compiledModule.importedExportedTokens = createImportedExportedTokenSet(importedModules);
474
559
  compiledModule.accessibleTokens = createAccessibleTokenSet(runtimeProviderTokens, compiledModule.providerTokens, compiledModule.importedExportedTokens, globalExportedTokens);
475
560
  }
476
- function validateProviderVisibility(compiledModule, scope, accessibleTokens) {
561
+ function validateProviderVisibility(compiledModule, scope, accessibleTokens, registeredTokens) {
477
562
  for (const provider of compiledModule.definition.providers ?? []) {
478
563
  validateProviderInjectionMetadata(provider, scope);
479
564
  for (const rawToken of providerDependencies(provider)) {
480
565
  const token = resolveInjectionToken(rawToken);
566
+ if (isOptionalToken(rawToken) && !accessibleTokens.has(token) && !registeredTokens.has(token)) {
567
+ continue;
568
+ }
481
569
  if (!accessibleTokens.has(token)) {
482
570
  throw new ModuleVisibilityError(`Provider ${String(providerToken(provider))} in module ${compiledModule.type.name} cannot access token ${String(token)} because it is not local, not exported by an imported module, and not visible through a global module.`, {
483
571
  module: compiledModule.type.name,
@@ -489,11 +577,14 @@ function validateProviderVisibility(compiledModule, scope, accessibleTokens) {
489
577
  }
490
578
  }
491
579
  }
492
- function validateControllerVisibility(compiledModule, scope, accessibleTokens) {
580
+ function validateControllerVisibility(compiledModule, scope, accessibleTokens, registeredTokens) {
493
581
  for (const controller of compiledModule.definition.controllers ?? []) {
494
582
  validateControllerInjectionMetadata(controller, scope);
495
583
  for (const rawToken of controllerDependencies(controller)) {
496
584
  const token = resolveInjectionToken(rawToken);
585
+ if (isOptionalToken(rawToken) && !accessibleTokens.has(token) && !registeredTokens.has(token)) {
586
+ continue;
587
+ }
497
588
  if (!accessibleTokens.has(token)) {
498
589
  throw new ModuleVisibilityError(`Controller ${controller.name} in module ${compiledModule.type.name} cannot access token ${String(token)} because it is not local, not exported by an imported module, and not visible through a global module.`, {
499
590
  module: compiledModule.type.name,
@@ -523,10 +614,14 @@ function createExportedTokenSet(compiledModule, importedExportedTokens) {
523
614
  function validateCompiledModules(modules, runtimeProviders, runtimeProviderTokens) {
524
615
  const compiledByType = new Map(modules.map(compiledModule => [compiledModule.type, compiledModule]));
525
616
  const globalExportedTokens = new Set();
617
+ const registeredTokens = new Set(runtimeProviderTokens);
526
618
  for (const provider of runtimeProviders) {
527
619
  validateProviderInjectionMetadata(provider, 'bootstrap runtime');
528
620
  }
529
621
  for (const compiledModule of modules) {
622
+ for (const token of compiledModule.providerTokens) {
623
+ registeredTokens.add(token);
624
+ }
530
625
  if (!compiledModule.definition.global) {
531
626
  continue;
532
627
  }
@@ -537,8 +632,8 @@ function validateCompiledModules(modules, runtimeProviders, runtimeProviderToken
537
632
  for (const compiledModule of modules) {
538
633
  const scope = `module ${compiledModule.type.name}`;
539
634
  memoizeAccessibleTokenSet(compiledModule, resolveImportedModules(compiledModule, compiledByType), runtimeProviderTokens, globalExportedTokens);
540
- validateProviderVisibility(compiledModule, scope, compiledModule.accessibleTokens);
541
- validateControllerVisibility(compiledModule, scope, compiledModule.accessibleTokens);
635
+ validateProviderVisibility(compiledModule, scope, compiledModule.accessibleTokens, registeredTokens);
636
+ validateControllerVisibility(compiledModule, scope, compiledModule.accessibleTokens, registeredTokens);
542
637
  compiledModule.exportedTokens = createExportedTokenSet(compiledModule, compiledModule.importedExportedTokens);
543
638
  }
544
639
  }
@@ -551,22 +646,23 @@ function validateCompiledModules(modules, runtimeProviders, runtimeProviderToken
551
646
  * @returns Compiled modules in dependency order after visibility and injection validation succeed.
552
647
  */
553
648
  export function compileModuleGraph(rootModule, options = {}) {
554
- const cacheKey = options.moduleGraphCache === true ? createModuleGraphCacheKey(rootModule, options) : undefined;
555
- if (cacheKey !== undefined) {
556
- const cachedModules = moduleGraphCompileCache.get(cacheKey);
649
+ const cache = options.moduleGraphCache === true ? moduleGraphCompileCache : options.moduleGraphCache instanceof ModuleGraphCompileCache ? options.moduleGraphCache : undefined;
650
+ const cacheKey = cache !== undefined ? createModuleGraphCacheKey(rootModule, options) : undefined;
651
+ if (cache !== undefined && cacheKey !== undefined) {
652
+ const cachedModules = cache.get(cacheKey);
557
653
  if (cachedModules !== undefined) {
558
654
  return cloneCompiledModules(cachedModules);
559
655
  }
560
656
  }
561
657
  const ordered = [];
562
- const runtimeProviders = options.providers ?? [];
658
+ const runtimeProviders = validateProviderInputs(options.providers ?? []);
563
659
  const runtimeProviderTokens = mergeRuntimeTokenSets(runtimeProviders, options.validationTokens ?? []);
564
660
  const moduleReplacements = options.moduleReplacements ?? EMPTY_MODULE_REPLACEMENTS;
565
661
  compileModule(rootModule, runtimeProviderTokens, moduleReplacements, new Map(), new Set(), ordered);
566
662
  validateCompiledModules(ordered, runtimeProviders, runtimeProviderTokens);
567
- if (cacheKey !== undefined) {
663
+ if (cache !== undefined && cacheKey !== undefined) {
568
664
  const cacheSnapshot = createModuleGraphCacheSnapshot(ordered);
569
- moduleGraphCompileCache.set(cacheKey, cacheSnapshot);
665
+ cache.set(cacheKey, cacheSnapshot);
570
666
  return cloneCompiledModules(cacheSnapshot);
571
667
  }
572
668
  return ordered;
@@ -5,15 +5,27 @@ export interface UploadedFile {
5
5
  fieldname: string;
6
6
  originalname: string;
7
7
  mimetype: string;
8
- buffer: Buffer;
8
+ buffer: Uint8Array;
9
9
  size: number;
10
10
  }
11
11
  /**
12
- * Configures multipart parsing limits for file size, file count, and total payload size.
12
+ * Configures multipart parsing limits for fields, files, headers, and total payload size.
13
13
  */
14
14
  export interface MultipartOptions {
15
+ /**
16
+ * Selects bounded streaming defaults when an application adapter exposes multipart parts through `request.body`.
17
+ *
18
+ * `parseMultipart(...)` remains buffered regardless of this option so its established acceptance defaults stay intact.
19
+ */
20
+ strategy?: 'buffered' | 'stream';
21
+ /** Maximum size in bytes for one non-file field. */
22
+ maxFieldSize?: number;
23
+ /** Maximum number of non-file fields. */
24
+ maxFields?: number;
15
25
  maxFileSize?: number;
16
26
  maxFiles?: number;
27
+ /** Maximum size in bytes for one part header block. */
28
+ maxHeaderSize?: number;
17
29
  maxTotalSize?: number;
18
30
  }
19
31
  /**
@@ -30,16 +42,68 @@ export interface MultipartRequestLike {
30
42
  body?: AsyncIterable<Uint8Array> | BodyInit | null;
31
43
  headers: Headers | Readonly<Record<string, string | string[] | undefined>>;
32
44
  method?: string;
45
+ signal?: AbortSignal;
33
46
  url?: string;
34
47
  [Symbol.asyncIterator]?(): AsyncIterator<Uint8Array>;
35
48
  }
49
+ /**
50
+ * A decoded non-file multipart field.
51
+ */
52
+ export interface MultipartFieldPart {
53
+ readonly headers: Readonly<Record<string, string>>;
54
+ readonly kind: 'field';
55
+ readonly name: string;
56
+ readonly value: string;
57
+ }
58
+ /**
59
+ * A multipart file whose bytes are read exactly once from a portable Web stream.
60
+ */
61
+ export interface MultipartFilePart {
62
+ readonly contentType: string;
63
+ readonly filename: string;
64
+ readonly headers: Readonly<Record<string, string>>;
65
+ readonly kind: 'file';
66
+ readonly name: string;
67
+ readonly stream: ReadableStream<Uint8Array>;
68
+ }
69
+ /**
70
+ * A typed item yielded by {@link parseMultipartStream}.
71
+ */
72
+ export type MultipartPart = MultipartFieldPart | MultipartFilePart;
73
+ /**
74
+ * Signals that a multipart body has already been selected for buffered or streaming consumption.
75
+ */
76
+ export declare class MultipartBodyConsumedError extends Error {
77
+ constructor();
78
+ }
36
79
  /**
37
80
  * Parses a multipart request into string fields and in-memory uploaded files.
38
81
  *
39
82
  * @param request - Web `Request` or request-like input carrying a multipart body.
40
- * @param options - Multipart limits for file size, file count, and total payload size.
83
+ * @param options - Multipart limits for file size, file count, total size, field count, field size, and header size.
41
84
  * @returns Parsed string fields plus uploaded files buffered in memory.
42
- * @throws {PayloadTooLargeException} When the multipart payload, file count, or file size exceeds the configured limits.
85
+ * @throws {PayloadTooLargeException} When any configured file-size, file-count, total-size, field-count, field-size,
86
+ * or header-size limit is exceeded.
43
87
  */
44
88
  export declare function parseMultipart(request: Request | MultipartRequestLike, options?: MultipartOptions): Promise<MultipartResult>;
89
+ /**
90
+ * Streams multipart fields and file parts from a request body.
91
+ *
92
+ * A yielded file stream must finish or be cancelled before requesting the next part. Calling
93
+ * this function selects the request body for streaming consumption; callers cannot also use
94
+ * {@link parseMultipart} for the same request body.
95
+ *
96
+ * @param request - Web `Request` or request-like input carrying a multipart body.
97
+ * @param options - Limits enforced while parsing headers, fields, files, and total input bytes.
98
+ * @returns An async iterator of typed field and file parts.
99
+ * @throws {MultipartBodyConsumedError} When buffered or streaming parsing already selected the body.
100
+ */
101
+ export declare function parseMultipartStream(request: Request | MultipartRequestLike, options?: MultipartOptions): AsyncIterableIterator<MultipartPart>;
102
+ /**
103
+ * Marks an input as selected for buffered or streaming multipart consumption.
104
+ *
105
+ * @param request - Request input whose body cannot be selected again.
106
+ * @internal
107
+ */
108
+ export declare function markMultipartBodyConsumed(request: Request | MultipartRequestLike): void;
45
109
  //# sourceMappingURL=multipart.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"multipart.d.ts","sourceRoot":"","sources":["../src/multipart.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IAC1C,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,aAAa,CAAC,UAAU,CAAC,GAAG,QAAQ,GAAG,IAAI,CAAC;IACnD,OAAO,EAAE,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC;IAC3E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,aAAa,CAAC,UAAU,CAAC,CAAC;CACtD;AAOD;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,OAAO,GAAG,oBAAoB,EACvC,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,eAAe,CAAC,CA8C1B"}
1
+ {"version":3,"file":"multipart.d.ts","sourceRoot":"","sources":["../src/multipart.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,UAAU,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,UAAU,GAAG,QAAQ,CAAC;IACjC,oDAAoD;IACpD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yCAAyC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IAC1C,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,aAAa,CAAC,UAAU,CAAC,GAAG,QAAQ,GAAG,IAAI,CAAC;IACnD,OAAO,EAAE,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC;IAC3E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,aAAa,CAAC,UAAU,CAAC,CAAC;CACtD;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;CAC7C;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,kBAAkB,GAAG,iBAAiB,CAAC;AAEnE;;GAEG;AACH,qBAAa,0BAA2B,SAAQ,KAAK;;CAKpD;AAaD;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,OAAO,GAAG,oBAAoB,EACvC,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,eAAe,CAAC,CAsB1B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,OAAO,GAAG,oBAAoB,EACvC,OAAO,GAAE,gBAAqB,GAC7B,qBAAqB,CAAC,aAAa,CAAC,CAEtC;AAWD;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,oBAAoB,GAAG,IAAI,CAkBvF"}