@nitrostack/core 1.0.17 → 1.1.0-beta.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 (199) hide show
  1. package/dist/core/app-decorator.d.ts +5 -0
  2. package/dist/core/app-decorator.d.ts.map +1 -1
  3. package/dist/core/app-decorator.js +2 -1
  4. package/dist/core/app-decorator.js.map +1 -1
  5. package/dist/core/builders.d.ts.map +1 -1
  6. package/dist/core/builders.js +2 -0
  7. package/dist/core/builders.js.map +1 -1
  8. package/dist/core/decorators.d.ts +11 -0
  9. package/dist/core/decorators.d.ts.map +1 -1
  10. package/dist/core/decorators.js.map +1 -1
  11. package/dist/core/health/health-checks.resource.d.ts +4 -3
  12. package/dist/core/health/health-checks.resource.d.ts.map +1 -1
  13. package/dist/core/health/health-checks.resource.js +35 -8
  14. package/dist/core/health/health-checks.resource.js.map +1 -1
  15. package/dist/core/health/health.interface.d.ts +40 -0
  16. package/dist/core/health/health.interface.d.ts.map +1 -0
  17. package/dist/core/health/health.interface.js +2 -0
  18. package/dist/core/health/health.interface.js.map +1 -0
  19. package/dist/core/index.d.ts +11 -2
  20. package/dist/core/index.d.ts.map +1 -1
  21. package/dist/core/index.js +9 -1
  22. package/dist/core/index.js.map +1 -1
  23. package/dist/core/interceptors/data-spillover.interceptor.d.ts +30 -0
  24. package/dist/core/interceptors/data-spillover.interceptor.d.ts.map +1 -0
  25. package/dist/core/interceptors/data-spillover.interceptor.js +174 -0
  26. package/dist/core/interceptors/data-spillover.interceptor.js.map +1 -0
  27. package/dist/core/interceptors/interceptor.decorator.d.ts +17 -8
  28. package/dist/core/interceptors/interceptor.decorator.d.ts.map +1 -1
  29. package/dist/core/interceptors/interceptor.decorator.js +36 -11
  30. package/dist/core/interceptors/interceptor.decorator.js.map +1 -1
  31. package/dist/core/interceptors/interceptor.interface.d.ts +4 -0
  32. package/dist/core/interceptors/interceptor.interface.d.ts.map +1 -1
  33. package/dist/core/interceptors/spillover/fs-spillover.store.d.ts +54 -0
  34. package/dist/core/interceptors/spillover/fs-spillover.store.d.ts.map +1 -0
  35. package/dist/core/interceptors/spillover/fs-spillover.store.js +302 -0
  36. package/dist/core/interceptors/spillover/fs-spillover.store.js.map +1 -0
  37. package/dist/core/interceptors/spillover/index.d.ts +6 -0
  38. package/dist/core/interceptors/spillover/index.d.ts.map +1 -0
  39. package/dist/core/interceptors/spillover/index.js +6 -0
  40. package/dist/core/interceptors/spillover/index.js.map +1 -0
  41. package/dist/core/interceptors/spillover/memory-spillover.store.d.ts +25 -0
  42. package/dist/core/interceptors/spillover/memory-spillover.store.d.ts.map +1 -0
  43. package/dist/core/interceptors/spillover/memory-spillover.store.js +115 -0
  44. package/dist/core/interceptors/spillover/memory-spillover.store.js.map +1 -0
  45. package/dist/core/interceptors/spillover/preview-generator.d.ts +7 -0
  46. package/dist/core/interceptors/spillover/preview-generator.d.ts.map +1 -0
  47. package/dist/core/interceptors/spillover/preview-generator.js +79 -0
  48. package/dist/core/interceptors/spillover/preview-generator.js.map +1 -0
  49. package/dist/core/interceptors/spillover/spillover-store.interface.d.ts +20 -0
  50. package/dist/core/interceptors/spillover/spillover-store.interface.d.ts.map +1 -0
  51. package/dist/core/interceptors/spillover/spillover-store.interface.js +2 -0
  52. package/dist/core/interceptors/spillover/spillover-store.interface.js.map +1 -0
  53. package/dist/core/interceptors/spillover/types.d.ts +71 -0
  54. package/dist/core/interceptors/spillover/types.d.ts.map +1 -0
  55. package/dist/core/interceptors/spillover/types.js +12 -0
  56. package/dist/core/interceptors/spillover/types.js.map +1 -0
  57. package/dist/core/protocol/adapter.d.ts +7 -1
  58. package/dist/core/protocol/adapter.d.ts.map +1 -1
  59. package/dist/core/protocol/modern-v2.adapter.d.ts +95 -2
  60. package/dist/core/protocol/modern-v2.adapter.d.ts.map +1 -1
  61. package/dist/core/protocol/modern-v2.adapter.js +688 -157
  62. package/dist/core/protocol/modern-v2.adapter.js.map +1 -1
  63. package/dist/core/server.d.ts +104 -4
  64. package/dist/core/server.d.ts.map +1 -1
  65. package/dist/core/server.js +450 -44
  66. package/dist/core/server.js.map +1 -1
  67. package/dist/core/task.d.ts.map +1 -1
  68. package/dist/core/task.js +8 -7
  69. package/dist/core/task.js.map +1 -1
  70. package/dist/core/tool.d.ts +12 -3
  71. package/dist/core/tool.d.ts.map +1 -1
  72. package/dist/core/tool.js +21 -3
  73. package/dist/core/tool.js.map +1 -1
  74. package/dist/core/transforms/catalog.transform.d.ts +40 -0
  75. package/dist/core/transforms/catalog.transform.d.ts.map +1 -0
  76. package/dist/core/transforms/catalog.transform.js +52 -0
  77. package/dist/core/transforms/catalog.transform.js.map +1 -0
  78. package/dist/core/transforms/code-mode/code-mode.transform.d.ts +75 -0
  79. package/dist/core/transforms/code-mode/code-mode.transform.d.ts.map +1 -0
  80. package/dist/core/transforms/code-mode/code-mode.transform.js +226 -0
  81. package/dist/core/transforms/code-mode/code-mode.transform.js.map +1 -0
  82. package/dist/core/transforms/code-mode/destructive-guard.d.ts +7 -0
  83. package/dist/core/transforms/code-mode/destructive-guard.d.ts.map +1 -0
  84. package/dist/core/transforms/code-mode/destructive-guard.js +18 -0
  85. package/dist/core/transforms/code-mode/destructive-guard.js.map +1 -0
  86. package/dist/core/transforms/code-mode/guest-evaluator.d.ts +17 -0
  87. package/dist/core/transforms/code-mode/guest-evaluator.d.ts.map +1 -0
  88. package/dist/core/transforms/code-mode/guest-evaluator.js +277 -0
  89. package/dist/core/transforms/code-mode/guest-evaluator.js.map +1 -0
  90. package/dist/core/transforms/code-mode/index.d.ts +11 -0
  91. package/dist/core/transforms/code-mode/index.d.ts.map +1 -0
  92. package/dist/core/transforms/code-mode/index.js +11 -0
  93. package/dist/core/transforms/code-mode/index.js.map +1 -0
  94. package/dist/core/transforms/code-mode/ipc-messages.d.ts +31 -0
  95. package/dist/core/transforms/code-mode/ipc-messages.d.ts.map +1 -0
  96. package/dist/core/transforms/code-mode/ipc-messages.js +2 -0
  97. package/dist/core/transforms/code-mode/ipc-messages.js.map +1 -0
  98. package/dist/core/transforms/code-mode/legible-error.d.ts +8 -0
  99. package/dist/core/transforms/code-mode/legible-error.d.ts.map +1 -0
  100. package/dist/core/transforms/code-mode/legible-error.js +17 -0
  101. package/dist/core/transforms/code-mode/legible-error.js.map +1 -0
  102. package/dist/core/transforms/code-mode/quickjs-wasm.provider.d.ts +25 -0
  103. package/dist/core/transforms/code-mode/quickjs-wasm.provider.d.ts.map +1 -0
  104. package/dist/core/transforms/code-mode/quickjs-wasm.provider.js +31 -0
  105. package/dist/core/transforms/code-mode/quickjs-wasm.provider.js.map +1 -0
  106. package/dist/core/transforms/code-mode/sandbox.interface.d.ts +10 -0
  107. package/dist/core/transforms/code-mode/sandbox.interface.d.ts.map +1 -0
  108. package/dist/core/transforms/code-mode/sandbox.interface.js +2 -0
  109. package/dist/core/transforms/code-mode/sandbox.interface.js.map +1 -0
  110. package/dist/core/transforms/code-mode/sandbox.worker.d.ts +2 -0
  111. package/dist/core/transforms/code-mode/sandbox.worker.d.ts.map +1 -0
  112. package/dist/core/transforms/code-mode/sandbox.worker.js +69 -0
  113. package/dist/core/transforms/code-mode/sandbox.worker.js.map +1 -0
  114. package/dist/core/transforms/code-mode/synthetic-tools.d.ts +23 -0
  115. package/dist/core/transforms/code-mode/synthetic-tools.d.ts.map +1 -0
  116. package/dist/core/transforms/code-mode/synthetic-tools.js +112 -0
  117. package/dist/core/transforms/code-mode/synthetic-tools.js.map +1 -0
  118. package/dist/core/transforms/code-mode/types.d.ts +32 -0
  119. package/dist/core/transforms/code-mode/types.d.ts.map +1 -0
  120. package/dist/core/transforms/code-mode/types.js +2 -0
  121. package/dist/core/transforms/code-mode/types.js.map +1 -0
  122. package/dist/core/transforms/code-mode/worker-pool.d.ts +71 -0
  123. package/dist/core/transforms/code-mode/worker-pool.d.ts.map +1 -0
  124. package/dist/core/transforms/code-mode/worker-pool.js +435 -0
  125. package/dist/core/transforms/code-mode/worker-pool.js.map +1 -0
  126. package/dist/core/transforms/index.d.ts +6 -0
  127. package/dist/core/transforms/index.d.ts.map +1 -0
  128. package/dist/core/transforms/index.js +6 -0
  129. package/dist/core/transforms/index.js.map +1 -0
  130. package/dist/core/transforms/search/base-search.transform.d.ts +59 -0
  131. package/dist/core/transforms/search/base-search.transform.d.ts.map +1 -0
  132. package/dist/core/transforms/search/base-search.transform.js +166 -0
  133. package/dist/core/transforms/search/base-search.transform.js.map +1 -0
  134. package/dist/core/transforms/search/bm25-search.transform.d.ts +27 -0
  135. package/dist/core/transforms/search/bm25-search.transform.d.ts.map +1 -0
  136. package/dist/core/transforms/search/bm25-search.transform.js +37 -0
  137. package/dist/core/transforms/search/bm25-search.transform.js.map +1 -0
  138. package/dist/core/transforms/search/bm25.engine.d.ts +46 -0
  139. package/dist/core/transforms/search/bm25.engine.d.ts.map +1 -0
  140. package/dist/core/transforms/search/bm25.engine.js +160 -0
  141. package/dist/core/transforms/search/bm25.engine.js.map +1 -0
  142. package/dist/core/transforms/search/index.d.ts +9 -0
  143. package/dist/core/transforms/search/index.d.ts.map +1 -0
  144. package/dist/core/transforms/search/index.js +9 -0
  145. package/dist/core/transforms/search/index.js.map +1 -0
  146. package/dist/core/transforms/search/regex-match.worker.d.ts +2 -0
  147. package/dist/core/transforms/search/regex-match.worker.d.ts.map +1 -0
  148. package/dist/core/transforms/search/regex-match.worker.js +19 -0
  149. package/dist/core/transforms/search/regex-match.worker.js.map +1 -0
  150. package/dist/core/transforms/search/regex-search.transform.d.ts +41 -0
  151. package/dist/core/transforms/search/regex-search.transform.d.ts.map +1 -0
  152. package/dist/core/transforms/search/regex-search.transform.js +237 -0
  153. package/dist/core/transforms/search/regex-search.transform.js.map +1 -0
  154. package/dist/core/transforms/search/synthetic-tools.d.ts +11 -0
  155. package/dist/core/transforms/search/synthetic-tools.d.ts.map +1 -0
  156. package/dist/core/transforms/search/synthetic-tools.js +76 -0
  157. package/dist/core/transforms/search/synthetic-tools.js.map +1 -0
  158. package/dist/core/transforms/search/tokenizer.d.ts +11 -0
  159. package/dist/core/transforms/search/tokenizer.d.ts.map +1 -0
  160. package/dist/core/transforms/search/tokenizer.js +38 -0
  161. package/dist/core/transforms/search/tokenizer.js.map +1 -0
  162. package/dist/core/transforms/search/tool-serializer.d.ts +6 -0
  163. package/dist/core/transforms/search/tool-serializer.d.ts.map +1 -0
  164. package/dist/core/transforms/search/tool-serializer.js +41 -0
  165. package/dist/core/transforms/search/tool-serializer.js.map +1 -0
  166. package/dist/core/transforms/search/types.d.ts +36 -0
  167. package/dist/core/transforms/search/types.d.ts.map +1 -0
  168. package/dist/core/transforms/search/types.js +2 -0
  169. package/dist/core/transforms/search/types.js.map +1 -0
  170. package/dist/core/transforms/tool-cache-key.d.ts +15 -0
  171. package/dist/core/transforms/tool-cache-key.d.ts.map +1 -0
  172. package/dist/core/transforms/tool-cache-key.js +61 -0
  173. package/dist/core/transforms/tool-cache-key.js.map +1 -0
  174. package/dist/core/transforms/transform.interface.d.ts +34 -0
  175. package/dist/core/transforms/transform.interface.d.ts.map +1 -0
  176. package/dist/core/transforms/transform.interface.js +2 -0
  177. package/dist/core/transforms/transform.interface.js.map +1 -0
  178. package/dist/core/transforms/validate-tool-arguments.d.ts +10 -0
  179. package/dist/core/transforms/validate-tool-arguments.d.ts.map +1 -0
  180. package/dist/core/transforms/validate-tool-arguments.js +62 -0
  181. package/dist/core/transforms/validate-tool-arguments.js.map +1 -0
  182. package/dist/core/transforms/visibility/index.d.ts +3 -0
  183. package/dist/core/transforms/visibility/index.d.ts.map +1 -0
  184. package/dist/core/transforms/visibility/index.js +3 -0
  185. package/dist/core/transforms/visibility/index.js.map +1 -0
  186. package/dist/core/transforms/visibility/session-store.d.ts +132 -0
  187. package/dist/core/transforms/visibility/session-store.d.ts.map +1 -0
  188. package/dist/core/transforms/visibility/session-store.js +330 -0
  189. package/dist/core/transforms/visibility/session-store.js.map +1 -0
  190. package/dist/core/transforms/visibility/visibility.transform.d.ts +42 -0
  191. package/dist/core/transforms/visibility/visibility.transform.d.ts.map +1 -0
  192. package/dist/core/transforms/visibility/visibility.transform.js +109 -0
  193. package/dist/core/transforms/visibility/visibility.transform.js.map +1 -0
  194. package/dist/core/types.d.ts +60 -0
  195. package/dist/core/types.d.ts.map +1 -1
  196. package/dist/testing/index.d.ts.map +1 -1
  197. package/dist/testing/index.js +3 -0
  198. package/dist/testing/index.js.map +1 -1
  199. package/package.json +8 -2
@@ -0,0 +1,174 @@
1
+ import { v4 as uuidv4 } from 'uuid';
2
+ import { DIContainer } from '../di/container.js';
3
+ import { MemorySpilloverStore } from './spillover/memory-spillover.store.js';
4
+ import { FsSpilloverStore } from './spillover/fs-spillover.store.js';
5
+ import { generatePreview } from './spillover/preview-generator.js';
6
+ class PayloadTooLargeError extends Error {
7
+ constructor(sizeBytes, maxBytes) {
8
+ super(`Spillover payload of ${sizeBytes} bytes exceeds the store limit of ${maxBytes} bytes. ` +
9
+ `Raise the store maxSizeBytes or use a larger spillover driver.`);
10
+ this.name = 'PayloadTooLargeError';
11
+ }
12
+ }
13
+ /** JSON.stringify that aborts once the output would exceed maxBytes. */
14
+ function stringifyCapped(value, maxBytes) {
15
+ let accounted = 0;
16
+ const json = JSON.stringify(value, (_key, val) => {
17
+ if (typeof val === 'string')
18
+ accounted += val.length;
19
+ else if (typeof val === 'number' || typeof val === 'boolean' || val === null)
20
+ accounted += 16;
21
+ if (accounted > maxBytes) {
22
+ throw new PayloadTooLargeError(accounted, maxBytes);
23
+ }
24
+ return val;
25
+ });
26
+ if (json == null)
27
+ return 'null';
28
+ const size = Buffer.byteLength(json, 'utf8');
29
+ if (size > maxBytes)
30
+ throw new PayloadTooLargeError(size, maxBytes);
31
+ return json;
32
+ }
33
+ export class DataSpilloverInterceptor {
34
+ maxPayloadBytes;
35
+ spilloverTtlSeconds;
36
+ previewItems;
37
+ previewChars;
38
+ uriPrefix;
39
+ explicitStore;
40
+ filesystemRequested;
41
+ fallbackStore;
42
+ constructor(options = {}) {
43
+ this.maxPayloadBytes = options.maxPayloadBytes ?? 10 * 1024; // 10KB
44
+ this.spilloverTtlSeconds = options.spilloverTtlSeconds ?? 3600; // 1 hr
45
+ this.previewItems = options.previewItems ?? 3;
46
+ this.previewChars = options.previewStringChars ?? 500;
47
+ this.uriPrefix = options.resourceUriPrefix ?? 'resource://data-spillover/';
48
+ this.filesystemRequested = options.storage === 'filesystem';
49
+ if (options.storage && typeof options.storage === 'object') {
50
+ this.explicitStore = options.storage;
51
+ }
52
+ }
53
+ /**
54
+ * Static factory helper for @UseInterceptors decorator:
55
+ */
56
+ static configure(options) {
57
+ return class ConfiguredDataSpilloverInterceptor extends DataSpilloverInterceptor {
58
+ constructor() {
59
+ super(options);
60
+ }
61
+ };
62
+ }
63
+ /**
64
+ * The store this interceptor writes to.
65
+ *
66
+ * Defaults to the server's store rather than a private one: the envelope's
67
+ * `resourceUri` is served by the server's `resource://data-spillover/{id}` handler,
68
+ * so writing anywhere else produces URIs that can never be read back.
69
+ */
70
+ serverHost() {
71
+ const container = DIContainer.getInstance();
72
+ if (!container.has('NitroStackServer'))
73
+ return undefined;
74
+ const server = container.resolve('NitroStackServer');
75
+ if (typeof server?.getSpilloverStore !== 'function')
76
+ return undefined;
77
+ return server;
78
+ }
79
+ getStore() {
80
+ const host = this.serverHost();
81
+ if (this.explicitStore) {
82
+ if (host && host.getSpilloverStore() !== this.explicitStore) {
83
+ throw new Error('DataSpilloverInterceptor storage instance is not the server spillover store. ' +
84
+ 'Omit storage to use the server store, or point the server at this instance with setSpilloverStore().');
85
+ }
86
+ return this.explicitStore;
87
+ }
88
+ if (this.filesystemRequested) {
89
+ const current = host?.getSpilloverStore();
90
+ if (current instanceof FsSpilloverStore)
91
+ return current;
92
+ throw new Error('DataSpilloverInterceptor requested filesystem storage, but the server spillover store is not a filesystem store. ' +
93
+ 'Set the server spillover driver to filesystem.');
94
+ }
95
+ // Read through on every call rather than memoizing, so setSpilloverStore() on the
96
+ // server does not leave this interceptor writing to a disposed store.
97
+ if (host)
98
+ return host.getSpilloverStore();
99
+ this.fallbackStore ??= new MemorySpilloverStore();
100
+ return this.fallbackStore;
101
+ }
102
+ async intercept(context, next) {
103
+ const result = await next();
104
+ if (result === undefined || result === null) {
105
+ return result;
106
+ }
107
+ const store = this.getStore();
108
+ const quota = store.getMaxSizeBytes?.() ?? 100 * 1024 * 1024;
109
+ // Measure serialized size
110
+ let serialized;
111
+ let mimeType = 'application/json';
112
+ if (typeof result === 'string') {
113
+ serialized = result;
114
+ mimeType = 'text/plain';
115
+ }
116
+ else if (Buffer.isBuffer(result)) {
117
+ if (result.length > quota)
118
+ throw new PayloadTooLargeError(result.length, quota);
119
+ serialized = result.toString('base64');
120
+ mimeType = 'application/octet-stream';
121
+ }
122
+ else {
123
+ try {
124
+ serialized = stringifyCapped(result, quota);
125
+ }
126
+ catch (err) {
127
+ if (err instanceof PayloadTooLargeError)
128
+ throw err;
129
+ // Not serializable; pass through
130
+ return result;
131
+ }
132
+ }
133
+ const sizeBytes = Buffer.byteLength(serialized, 'utf8');
134
+ // If within limit, pass through unmodified
135
+ if (sizeBytes <= this.maxPayloadBytes) {
136
+ return result;
137
+ }
138
+ if (sizeBytes > quota) {
139
+ throw new PayloadTooLargeError(sizeBytes, quota);
140
+ }
141
+ // Exceeded threshold: spillover to storage.
142
+ // With visibility installed, a row without a session would be readable by
143
+ // anyone who learned the URI, so refuse the write instead.
144
+ if (!context?.sessionId && this.serverHost()?.hasSessionVisibility?.()) {
145
+ throw new Error('Spillover requires a session when visibility is enabled. ' +
146
+ 'Call this tool with a server-issued session id.');
147
+ }
148
+ const spilloverId = `spill-${uuidv4()}`;
149
+ const resourceUri = `${this.uriPrefix}${spilloverId}`;
150
+ await store.save(spilloverId, serialized, mimeType, this.spilloverTtlSeconds, context?.sessionId);
151
+ const { preview, summary, totalItems } = generatePreview(result, sizeBytes, this.previewItems, this.previewChars);
152
+ if (context?.logger?.info) {
153
+ context.logger.info(`Spilled tool output exceeding threshold (${sizeBytes} bytes) to ${resourceUri}`);
154
+ }
155
+ const envelope = {
156
+ _spillover: true,
157
+ resourceUri,
158
+ mimeType,
159
+ sizeBytes,
160
+ totalItems,
161
+ summary,
162
+ preview,
163
+ hint: `Full dataset (${summary}) exceeded prompt limit. Read full data via MCP resources/read with URI '${resourceUri}'.`,
164
+ };
165
+ // A nested value (for example `{ rows: [...] }`) can still exceed the limit
166
+ // after preview slicing. Drop that preview rather than re-inline the payload.
167
+ const previewBytes = Buffer.byteLength(JSON.stringify(envelope.preview) ?? '', 'utf8');
168
+ if (previewBytes > this.maxPayloadBytes) {
169
+ envelope.preview = '[preview omitted]';
170
+ }
171
+ return envelope;
172
+ }
173
+ }
174
+ //# sourceMappingURL=data-spillover.interceptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-spillover.interceptor.js","sourceRoot":"","sources":["../../../src/core/interceptors/data-spillover.interceptor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AAGpC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AASnE,MAAM,oBAAqB,SAAQ,KAAK;IACtC,YAAY,SAAiB,EAAE,QAAgB;QAC7C,KAAK,CACH,wBAAwB,SAAS,qCAAqC,QAAQ,UAAU;YACtF,gEAAgE,CACnE,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AAED,wEAAwE;AACxE,SAAS,eAAe,CAAC,KAAc,EAAE,QAAgB;IACvD,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QAC/C,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,SAAS,IAAI,GAAG,CAAC,MAAM,CAAC;aAChD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI;YAAE,SAAS,IAAI,EAAE,CAAC;QAC9F,IAAI,SAAS,GAAG,QAAQ,EAAE,CAAC;YACzB,MAAM,IAAI,oBAAoB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QACtD,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CAAC;IACH,IAAI,IAAI,IAAI,IAAI;QAAE,OAAO,MAAM,CAAC;IAChC,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC7C,IAAI,IAAI,GAAG,QAAQ;QAAE,MAAM,IAAI,oBAAoB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACpE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,OAAO,wBAAwB;IAClB,eAAe,CAAS;IACxB,mBAAmB,CAAS;IAC5B,YAAY,CAAS;IACrB,YAAY,CAAS;IACrB,SAAS,CAAS;IAClB,aAAa,CAAkB;IAC/B,mBAAmB,CAAU;IACtC,aAAa,CAAkB;IAEvC,YAAY,UAAgC,EAAE;QAC5C,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,eAAe,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC,OAAO;QACpE,IAAI,CAAC,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,IAAI,IAAI,CAAC,CAAC,OAAO;QACvE,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,CAAC,CAAC;QAC9C,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,kBAAkB,IAAI,GAAG,CAAC;QACtD,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,iBAAiB,IAAI,4BAA4B,CAAC;QAC3E,IAAI,CAAC,mBAAmB,GAAG,OAAO,CAAC,OAAO,KAAK,YAAY,CAAC;QAE5D,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC3D,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;QACvC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,OAA6B;QAC5C,OAAO,MAAM,kCAAmC,SAAQ,wBAAwB;YAC9E;gBACE,KAAK,CAAC,OAAO,CAAC,CAAC;YACjB,CAAC;SACF,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACK,UAAU;QAChB,MAAM,SAAS,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC;QAC5C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,kBAAkB,CAAC;YAAE,OAAO,SAAS,CAAC;QACzD,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAqB,kBAAkB,CAAC,CAAC;QACzE,IAAI,OAAO,MAAM,EAAE,iBAAiB,KAAK,UAAU;YAAE,OAAO,SAAS,CAAC;QACtE,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,QAAQ;QACN,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAE/B,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,IAAI,IAAI,IAAI,IAAI,CAAC,iBAAiB,EAAE,KAAK,IAAI,CAAC,aAAa,EAAE,CAAC;gBAC5D,MAAM,IAAI,KAAK,CACb,+EAA+E;oBAC7E,sGAAsG,CACzG,CAAC;YACJ,CAAC;YACD,OAAO,IAAI,CAAC,aAAa,CAAC;QAC5B,CAAC;QAED,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC7B,MAAM,OAAO,GAAG,IAAI,EAAE,iBAAiB,EAAE,CAAC;YAC1C,IAAI,OAAO,YAAY,gBAAgB;gBAAE,OAAO,OAAO,CAAC;YACxD,MAAM,IAAI,KAAK,CACb,mHAAmH;gBACjH,gDAAgD,CACnD,CAAC;QACJ,CAAC;QAED,kFAAkF;QAClF,sEAAsE;QACtE,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAE1C,IAAI,CAAC,aAAa,KAAK,IAAI,oBAAoB,EAAE,CAAC;QAClD,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,OAAyB,EAAE,IAA4B;QACrE,MAAM,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;QAC5B,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YAC5C,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,eAAe,EAAE,EAAE,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;QAE7D,0BAA0B;QAC1B,IAAI,UAAkB,CAAC;QACvB,IAAI,QAAQ,GAAG,kBAAkB,CAAC;QAElC,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,UAAU,GAAG,MAAM,CAAC;YACpB,QAAQ,GAAG,YAAY,CAAC;QAC1B,CAAC;aAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACnC,IAAI,MAAM,CAAC,MAAM,GAAG,KAAK;gBAAE,MAAM,IAAI,oBAAoB,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAChF,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACvC,QAAQ,GAAG,0BAA0B,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC;gBACH,UAAU,GAAG,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC9C,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,GAAG,YAAY,oBAAoB;oBAAE,MAAM,GAAG,CAAC;gBACnD,iCAAiC;gBACjC,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAExD,2CAA2C;QAC3C,IAAI,SAAS,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACtC,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,IAAI,SAAS,GAAG,KAAK,EAAE,CAAC;YACtB,MAAM,IAAI,oBAAoB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACnD,CAAC;QAED,4CAA4C;QAC5C,0EAA0E;QAC1E,2DAA2D;QAC3D,IAAI,CAAC,OAAO,EAAE,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,CAAC;YACvE,MAAM,IAAI,KAAK,CACb,2DAA2D;gBACzD,iDAAiD,CACpD,CAAC;QACJ,CAAC;QAED,MAAM,WAAW,GAAG,SAAS,MAAM,EAAE,EAAE,CAAC;QACxC,MAAM,WAAW,GAAG,GAAG,IAAI,CAAC,SAAS,GAAG,WAAW,EAAE,CAAC;QAEtD,MAAM,KAAK,CAAC,IAAI,CACd,WAAW,EACX,UAAU,EACV,QAAQ,EACR,IAAI,CAAC,mBAAmB,EACxB,OAAO,EAAE,SAAS,CACnB,CAAC;QAEF,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,eAAe,CACtD,MAAM,EACN,SAAS,EACT,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,YAAY,CAClB,CAAC;QAEF,IAAI,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;YAC1B,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,4CAA4C,SAAS,cAAc,WAAW,EAAE,CAAC,CAAC;QACxG,CAAC;QAED,MAAM,QAAQ,GAAsB;YAClC,UAAU,EAAE,IAAI;YAChB,WAAW;YACX,QAAQ;YACR,SAAS;YACT,UAAU;YACV,OAAO;YACP,OAAO;YACP,IAAI,EAAE,iBAAiB,OAAO,4EAA4E,WAAW,IAAI;SAC1H,CAAC;QAEF,4EAA4E;QAC5E,8EAA8E;QAC9E,MAAM,YAAY,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;QACvF,IAAI,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;YACxC,QAAQ,CAAC,OAAO,GAAG,mBAAmB,CAAC;QACzC,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF"}
@@ -1,5 +1,7 @@
1
1
  import 'reflect-metadata';
2
- import { InterceptorConstructor } from './interceptor.interface.js';
2
+ import { InterceptorType } from './interceptor.interface.js';
3
+ export declare const INTERCEPTOR_KEY = "nitrostack:interceptor";
4
+ export declare const IS_INTERCEPTOR_KEY = "nitrostack:is_interceptor";
3
5
  /**
4
6
  * Marks a class as an interceptor
5
7
  *
@@ -16,20 +18,27 @@ import { InterceptorConstructor } from './interceptor.interface.js';
16
18
  */
17
19
  export declare function Interceptor(): ClassDecorator;
18
20
  /**
19
- * Apply interceptors to a tool method
21
+ * Apply interceptors to a tool method or to an entire controller class.
22
+ * Supports both class constructors and pre-configured instances.
20
23
  *
21
24
  * @example
22
25
  * ```typescript
23
- * @Tool({ name: 'get_user', ... })
24
- * @UseInterceptors(TransformInterceptor, CacheInterceptor)
25
- * async getUser(input: Record<string, unknown>) { }
26
+ * // Method-level with instance
27
+ * @Tool({ name: 'large_query' })
28
+ * @UseInterceptors(new DataSpilloverInterceptor({ maxPayloadBytes: 10240 }))
29
+ * async getLargeData() { ... }
30
+ *
31
+ * // Class-level with factory
32
+ * @Controller()
33
+ * @UseInterceptors(DataSpilloverInterceptor.configure({ maxPayloadBytes: 20480 }))
34
+ * export class EnterpriseDataController { ... }
26
35
  * ```
27
36
  */
28
- export declare function UseInterceptors(...interceptors: InterceptorConstructor[]): MethodDecorator;
37
+ export declare function UseInterceptors(...interceptors: InterceptorType[]): (target: any, propertyKey?: string | symbol, descriptor?: PropertyDescriptor) => any;
29
38
  /**
30
- * Get interceptors for a method
39
+ * Retrieves interceptors for a method, combining class-level and method-level metadata.
31
40
  */
32
- export declare function getInterceptorMetadata(target: object, propertyKey: string | symbol): InterceptorConstructor[];
41
+ export declare function getInterceptorMetadata(target: object, propertyKey?: string | symbol): InterceptorType[];
33
42
  /**
34
43
  * Check if a class is marked as an interceptor
35
44
  */
@@ -1 +1 @@
1
- {"version":3,"file":"interceptor.decorator.d.ts","sourceRoot":"","sources":["../../../src/core/interceptors/interceptor.decorator.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAKpE;;;;;;;;;;;;;GAaG;AACH,wBAAgB,WAAW,IAAI,cAAc,CAI5C;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,GAAG,YAAY,EAAE,sBAAsB,EAAE,GAAG,eAAe,CAU1F;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,sBAAsB,EAAE,CAE7G;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAErD"}
1
+ {"version":3,"file":"interceptor.decorator.d.ts","sourceRoot":"","sources":["../../../src/core/interceptors/interceptor.decorator.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D,eAAO,MAAM,eAAe,2BAA2B,CAAC;AACxD,eAAO,MAAM,kBAAkB,8BAA8B,CAAC;AAE9D;;;;;;;;;;;;;GAaG;AACH,wBAAgB,WAAW,IAAI,cAAc,CAI5C;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,eAAe,CAAC,GAAG,YAAY,EAAE,eAAe,EAAE,IAC/C,QAAQ,GAAG,EAAE,cAAc,MAAM,GAAG,MAAM,EAAE,aAAa,kBAAkB,SAa7F;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,eAAe,EAAE,CAYvG;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAErD"}
@@ -1,6 +1,6 @@
1
1
  import 'reflect-metadata';
2
- const INTERCEPTOR_KEY = 'nitrostack:interceptor';
3
- const IS_INTERCEPTOR_KEY = 'nitrostack:is_interceptor';
2
+ export const INTERCEPTOR_KEY = 'nitrostack:interceptor';
3
+ export const IS_INTERCEPTOR_KEY = 'nitrostack:is_interceptor';
4
4
  /**
5
5
  * Marks a class as an interceptor
6
6
  *
@@ -21,26 +21,51 @@ export function Interceptor() {
21
21
  };
22
22
  }
23
23
  /**
24
- * Apply interceptors to a tool method
24
+ * Apply interceptors to a tool method or to an entire controller class.
25
+ * Supports both class constructors and pre-configured instances.
25
26
  *
26
27
  * @example
27
28
  * ```typescript
28
- * @Tool({ name: 'get_user', ... })
29
- * @UseInterceptors(TransformInterceptor, CacheInterceptor)
30
- * async getUser(input: Record<string, unknown>) { }
29
+ * // Method-level with instance
30
+ * @Tool({ name: 'large_query' })
31
+ * @UseInterceptors(new DataSpilloverInterceptor({ maxPayloadBytes: 10240 }))
32
+ * async getLargeData() { ... }
33
+ *
34
+ * // Class-level with factory
35
+ * @Controller()
36
+ * @UseInterceptors(DataSpilloverInterceptor.configure({ maxPayloadBytes: 20480 }))
37
+ * export class EnterpriseDataController { ... }
31
38
  * ```
32
39
  */
33
40
  export function UseInterceptors(...interceptors) {
34
- return (target, propertyKey, descriptor) => {
35
- const existingInterceptors = Reflect.getMetadata(INTERCEPTOR_KEY, target, propertyKey) || [];
36
- Reflect.defineMetadata(INTERCEPTOR_KEY, [...existingInterceptors, ...interceptors], target, propertyKey);
41
+ return function (target, propertyKey, descriptor) {
42
+ if (descriptor && propertyKey) {
43
+ // Method-level decorator
44
+ const existing = Reflect.getMetadata(INTERCEPTOR_KEY, target, propertyKey) || [];
45
+ Reflect.defineMetadata(INTERCEPTOR_KEY, [...existing, ...interceptors], target, propertyKey);
46
+ return descriptor;
47
+ }
48
+ else {
49
+ // Class-level decorator (target is constructor)
50
+ const existing = Reflect.getMetadata(INTERCEPTOR_KEY, target) || [];
51
+ Reflect.defineMetadata(INTERCEPTOR_KEY, [...existing, ...interceptors], target);
52
+ return target;
53
+ }
37
54
  };
38
55
  }
39
56
  /**
40
- * Get interceptors for a method
57
+ * Retrieves interceptors for a method, combining class-level and method-level metadata.
41
58
  */
42
59
  export function getInterceptorMetadata(target, propertyKey) {
43
- return Reflect.getMetadata(INTERCEPTOR_KEY, target, propertyKey) || [];
60
+ const methodInterceptors = propertyKey
61
+ ? Reflect.getMetadata(INTERCEPTOR_KEY, target, propertyKey) || []
62
+ : [];
63
+ // Class constructor metadata
64
+ const ctor = typeof target === 'function' ? target : target?.constructor;
65
+ const classInterceptors = ctor
66
+ ? Reflect.getMetadata(INTERCEPTOR_KEY, ctor) || []
67
+ : [];
68
+ return [...classInterceptors, ...methodInterceptors];
44
69
  }
45
70
  /**
46
71
  * Check if a class is marked as an interceptor
@@ -1 +1 @@
1
- {"version":3,"file":"interceptor.decorator.js","sourceRoot":"","sources":["../../../src/core/interceptors/interceptor.decorator.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAG1B,MAAM,eAAe,GAAG,wBAAwB,CAAC;AACjD,MAAM,kBAAkB,GAAG,2BAA2B,CAAC;AAEvD;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO,CAAC,MAAc,EAAE,EAAE;QACxB,OAAO,CAAC,cAAc,CAAC,kBAAkB,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3D,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,eAAe,CAAC,GAAG,YAAsC;IACvE,OAAO,CAAC,MAAc,EAAE,WAA4B,EAAE,UAA8B,EAAE,EAAE;QACtF,MAAM,oBAAoB,GAAG,OAAO,CAAC,WAAW,CAAC,eAAe,EAAE,MAAM,EAAE,WAAW,CAAC,IAAI,EAAE,CAAC;QAC7F,OAAO,CAAC,cAAc,CACpB,eAAe,EACf,CAAC,GAAG,oBAAoB,EAAE,GAAG,YAAY,CAAC,EAC1C,MAAM,EACN,WAAW,CACZ,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAc,EAAE,WAA4B;IACjF,OAAO,OAAO,CAAC,WAAW,CAAC,eAAe,EAAE,MAAM,EAAE,WAAW,CAAC,IAAI,EAAE,CAAC;AACzE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,OAAO,OAAO,CAAC,WAAW,CAAC,kBAAkB,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC;AAClE,CAAC"}
1
+ {"version":3,"file":"interceptor.decorator.js","sourceRoot":"","sources":["../../../src/core/interceptors/interceptor.decorator.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAG1B,MAAM,CAAC,MAAM,eAAe,GAAG,wBAAwB,CAAC;AACxD,MAAM,CAAC,MAAM,kBAAkB,GAAG,2BAA2B,CAAC;AAE9D;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO,CAAC,MAAc,EAAE,EAAE;QACxB,OAAO,CAAC,cAAc,CAAC,kBAAkB,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3D,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,eAAe,CAAC,GAAG,YAA+B;IAChE,OAAO,UAAU,MAAW,EAAE,WAA6B,EAAE,UAA+B;QAC1F,IAAI,UAAU,IAAI,WAAW,EAAE,CAAC;YAC9B,yBAAyB;YACzB,MAAM,QAAQ,GAAsB,OAAO,CAAC,WAAW,CAAC,eAAe,EAAE,MAAM,EAAE,WAAW,CAAC,IAAI,EAAE,CAAC;YACpG,OAAO,CAAC,cAAc,CAAC,eAAe,EAAE,CAAC,GAAG,QAAQ,EAAE,GAAG,YAAY,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;YAC7F,OAAO,UAAU,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,gDAAgD;YAChD,MAAM,QAAQ,GAAsB,OAAO,CAAC,WAAW,CAAC,eAAe,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;YACvF,OAAO,CAAC,cAAc,CAAC,eAAe,EAAE,CAAC,GAAG,QAAQ,EAAE,GAAG,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC;YAChF,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAc,EAAE,WAA6B;IAClF,MAAM,kBAAkB,GAAsB,WAAW;QACvD,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,eAAe,EAAE,MAAM,EAAE,WAAW,CAAC,IAAI,EAAE;QACjE,CAAC,CAAC,EAAE,CAAC;IAEP,6BAA6B;IAC7B,MAAM,IAAI,GAAG,OAAO,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAE,MAAc,EAAE,WAAW,CAAC;IAClF,MAAM,iBAAiB,GAAsB,IAAI;QAC/C,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,eAAe,EAAE,IAAI,CAAC,IAAI,EAAE;QAClD,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO,CAAC,GAAG,iBAAiB,EAAE,GAAG,kBAAkB,CAAC,CAAC;AACvD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,OAAO,OAAO,CAAC,WAAW,CAAC,kBAAkB,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC;AAClE,CAAC"}
@@ -28,4 +28,8 @@ export interface InterceptorInterface {
28
28
  * Interceptor constructor type
29
29
  */
30
30
  export type InterceptorConstructor = new (...args: unknown[]) => InterceptorInterface;
31
+ /**
32
+ * Union type permitting either a class constructor or an instantiated/configured instance.
33
+ */
34
+ export type InterceptorType = InterceptorConstructor | InterceptorInterface;
31
35
  //# sourceMappingURL=interceptor.interface.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"interceptor.interface.d.ts","sourceRoot":"","sources":["../../../src/core/interceptors/interceptor.interface.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,WAAW,oBAAoB;IACnC,SAAS,CAAC,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACtF;AAED;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,oBAAoB,CAAC"}
1
+ {"version":3,"file":"interceptor.interface.d.ts","sourceRoot":"","sources":["../../../src/core/interceptors/interceptor.interface.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,WAAW,oBAAoB;IACnC,SAAS,CAAC,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACtF;AAED;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,oBAAoB,CAAC;AAEtF;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,sBAAsB,GAAG,oBAAoB,CAAC"}
@@ -0,0 +1,54 @@
1
+ import { SpilloverRecord, SpilloverStore } from './spillover-store.interface.js';
2
+ export interface FsSpilloverOptions {
3
+ storageDir?: string;
4
+ sweepIntervalSeconds?: number;
5
+ /** Total bytes retained on disk (default: 512MB). A single record larger than this is refused. */
6
+ maxSizeBytes?: number;
7
+ }
8
+ /**
9
+ * Filesystem spillover store.
10
+ *
11
+ * Directory mode 0o700 and file mode 0o600 are enforced on Unix. Windows ignores
12
+ * those bits, so a shared temp directory is not private there; set `storageDir`
13
+ * to a directory only this process can read.
14
+ */
15
+ export declare class FsSpilloverStore implements SpilloverStore {
16
+ private storageDir;
17
+ private readonly explicitDir;
18
+ private readonly maxSizeBytes;
19
+ private readonly sweepTimer;
20
+ private initialized;
21
+ private usageReady;
22
+ private currentSizeBytes;
23
+ /** Serializes saves so two writers cannot both pass the capacity check. */
24
+ private writeChain;
25
+ constructor(options?: FsSpilloverOptions);
26
+ private ensureDir;
27
+ /**
28
+ * Refuse a symlink. mkdir({ recursive: true }) follows one, and chmod follows
29
+ * it too, so a planted link would receive the spilled files.
30
+ */
31
+ private assertRealDirectory;
32
+ private sanitizeId;
33
+ private getFilePath;
34
+ getStorageDir(): string;
35
+ getMaxSizeBytes(): number;
36
+ getCurrentSizeBytes(): number;
37
+ private enqueue;
38
+ save(id: string, data: string, mimeType: string, ttlSeconds: number, sessionId?: string): Promise<SpilloverRecord>;
39
+ private writeRecord;
40
+ get(id: string): Promise<SpilloverRecord | undefined>;
41
+ delete(id: string): Promise<boolean>;
42
+ private unlinkId;
43
+ private deleteIfStillExpired;
44
+ cleanup(): Promise<number>;
45
+ private cleanupNow;
46
+ private ensureUsage;
47
+ private fileSize;
48
+ /** Deletes the oldest payload file, excluding the path about to be replaced. */
49
+ private evictOldestFile;
50
+ /** First bytes of a record. `expiresAt` is written before the payload. */
51
+ private readExpiresAt;
52
+ dispose(): Promise<void>;
53
+ }
54
+ //# sourceMappingURL=fs-spillover.store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-spillover.store.d.ts","sourceRoot":"","sources":["../../../../src/core/interceptors/spillover/fs-spillover.store.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAEjF,MAAM,WAAW,kBAAkB;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,kGAAkG;IAClG,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAKD;;;;;;GAMG;AACH,qBAAa,gBAAiB,YAAW,cAAc;IACrD,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAU;IACtC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiB;IAC5C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,gBAAgB,CAAK;IAC7B,2EAA2E;IAC3E,OAAO,CAAC,UAAU,CAAoC;gBAE1C,OAAO,GAAE,kBAAuB;YAiB9B,SAAS;IAavB;;;OAGG;YACW,mBAAmB;IA8BjC,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,WAAW;IAInB,aAAa,IAAI,MAAM;IAIvB,eAAe,IAAI,MAAM;IAIzB,mBAAmB,IAAI,MAAM;IAI7B,OAAO,CAAC,OAAO;IAST,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;YAI1G,WAAW;IA0DnB,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC;IAkBrD,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;YAI5B,QAAQ;YAYR,oBAAoB;IAO5B,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;YAIlB,UAAU;YA4CV,WAAW;YAYX,QAAQ;IAKtB,gFAAgF;YAClE,eAAe;IAmB7B,0EAA0E;YAC5D,aAAa;IAcrB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B"}