@classytic/arc 2.8.5 → 2.10.3

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 (155) hide show
  1. package/README.md +50 -38
  2. package/dist/{BaseController-DAGGc5Xn.mjs → BaseController-CbKKIflT.mjs} +193 -143
  3. package/dist/EventTransport-CUw5NNWe.d.mts +293 -0
  4. package/dist/{ResourceRegistry-C6uXlWe3.mjs → ResourceRegistry-BPd6NQDm.mjs} +1 -1
  5. package/dist/adapters/index.d.mts +3 -3
  6. package/dist/adapters/index.mjs +2 -2
  7. package/dist/{adapters-BBqAVvPK.mjs → adapters-BXY4i-hw.mjs} +210 -41
  8. package/dist/audit/index.d.mts +135 -11
  9. package/dist/audit/index.mjs +107 -20
  10. package/dist/auth/index.d.mts +17 -9
  11. package/dist/auth/index.mjs +14 -7
  12. package/dist/auth/redis-session.d.mts +1 -1
  13. package/dist/{betterAuthOpenApi-BuUcUEJq.mjs → betterAuthOpenApi-BBRVhjQN.mjs} +1 -1
  14. package/dist/cache/index.d.mts +17 -15
  15. package/dist/cache/index.mjs +15 -14
  16. package/dist/{caching-IMuYVjTL.mjs → caching-CBpK_SCM.mjs} +8 -3
  17. package/dist/cli/commands/describe.mjs +1 -1
  18. package/dist/cli/commands/docs.mjs +2 -2
  19. package/dist/cli/commands/generate.mjs +1 -1
  20. package/dist/cli/commands/init.mjs +1 -1
  21. package/dist/cli/commands/introspect.mjs +1 -1
  22. package/dist/core/index.d.mts +3 -3
  23. package/dist/core/index.mjs +4 -6
  24. package/dist/{defineResource-tcgySDo1.mjs → core-CcR01lup.mjs} +58 -61
  25. package/dist/{createActionRouter-BORM8f17.mjs → createActionRouter-Bp_5c_2b.mjs} +3 -3
  26. package/dist/{createApp-B1EY8zxa.mjs → createApp-BuvPma24.mjs} +15 -14
  27. package/dist/docs/index.d.mts +2 -2
  28. package/dist/docs/index.mjs +2 -2
  29. package/dist/{elevation-DtFxrG0s.mjs → elevation-C7hgL_aI.mjs} +22 -8
  30. package/dist/{errorHandler-f869_8PQ.mjs → errorHandler-Bb49BvPD.mjs} +59 -7
  31. package/dist/{errorHandler-Bah5JhBd.d.mts → errorHandler-DRQ3EqfL.d.mts} +37 -2
  32. package/dist/{eventPlugin-D9DKB2zM.d.mts → eventPlugin-CxWgpd6K.d.mts} +14 -2
  33. package/dist/{eventPlugin-CDjVTM82.mjs → eventPlugin-DCUjuiQT.mjs} +83 -5
  34. package/dist/events/index.d.mts +150 -36
  35. package/dist/events/index.mjs +355 -101
  36. package/dist/events/transports/redis-stream-entry.d.mts +1 -1
  37. package/dist/events/transports/redis.d.mts +1 -1
  38. package/dist/factory/index.d.mts +1 -1
  39. package/dist/factory/index.mjs +2 -2
  40. package/dist/{types-DZi1aYhm.d.mts → fields-Lo1VUDpt.d.mts} +121 -1
  41. package/dist/{fields-ipsbIRPK.mjs → fields-bxkeltzz.mjs} +18 -5
  42. package/dist/{filesUpload-C7r7HIeA.mjs → filesUpload-t21LS-py.mjs} +65 -7
  43. package/dist/hooks/index.d.mts +1 -1
  44. package/dist/hooks/index.mjs +1 -1
  45. package/dist/idempotency/index.d.mts +32 -5
  46. package/dist/idempotency/index.mjs +119 -12
  47. package/dist/idempotency/redis.d.mts +1 -1
  48. package/dist/{index-DtDzOBn8.d.mts → index-8qw4y6ff.d.mts} +4 -135
  49. package/dist/{index-BLXBmWud.d.mts → index-ChIw3776.d.mts} +283 -408
  50. package/dist/{interface-CMRutPfe.d.mts → index-Cl0uoKd5.d.mts} +1758 -2506
  51. package/dist/{index-C1meYuDn.d.mts → index-DStwgFUK.d.mts} +81 -7
  52. package/dist/index.d.mts +7 -8
  53. package/dist/index.mjs +11 -12
  54. package/dist/integrations/event-gateway.d.mts +1 -1
  55. package/dist/integrations/event-gateway.mjs +1 -1
  56. package/dist/integrations/index.d.mts +1 -1
  57. package/dist/integrations/mcp/index.d.mts +26 -8
  58. package/dist/integrations/mcp/index.mjs +96 -17
  59. package/dist/integrations/mcp/testing.d.mts +1 -1
  60. package/dist/integrations/mcp/testing.mjs +1 -1
  61. package/dist/integrations/webhooks.d.mts +5 -0
  62. package/dist/integrations/webhooks.mjs +6 -0
  63. package/dist/interface-D218ikEo.d.mts +77 -0
  64. package/dist/{memory-Cp7_cAko.mjs → memory-B5Amv9A1.mjs} +23 -8
  65. package/dist/{openapi-CbKUJY_m.mjs → openapi-B5F8AddX.mjs} +3 -3
  66. package/dist/org/index.d.mts +2 -2
  67. package/dist/permissions/index.d.mts +3 -4
  68. package/dist/permissions/index.mjs +5 -5
  69. package/dist/{permissions-CH4cNwJi.mjs → permissions-Dk6mshja.mjs} +315 -397
  70. package/dist/plugins/index.d.mts +7 -7
  71. package/dist/plugins/index.mjs +14 -16
  72. package/dist/plugins/response-cache.mjs +2 -2
  73. package/dist/plugins/tracing-entry.d.mts +1 -1
  74. package/dist/plugins/tracing-entry.mjs +1 -1
  75. package/dist/presets/filesUpload.d.mts +27 -5
  76. package/dist/presets/filesUpload.mjs +1 -1
  77. package/dist/presets/index.d.mts +3 -2
  78. package/dist/presets/index.mjs +4 -3
  79. package/dist/presets/multiTenant.d.mts +1 -1
  80. package/dist/presets/multiTenant.mjs +2 -2
  81. package/dist/presets/search.d.mts +178 -0
  82. package/dist/presets/search.mjs +150 -0
  83. package/dist/{presets-C2xgzW6x.mjs → presets-fLJVXdVn.mjs} +1 -1
  84. package/dist/{queryCachePlugin-BJJGBTlu.d.mts → queryCachePlugin-BKbWjgDG.d.mts} +1 -1
  85. package/dist/{queryCachePlugin-BH-fidlv.mjs → queryCachePlugin-DQCEfJis.mjs} +9 -9
  86. package/dist/{queryParser-CgCtsjti.mjs → queryParser-DBqBB6AC.mjs} +1 -1
  87. package/dist/{redis-BM00zaPB.d.mts → redis-DqyeggCa.d.mts} +1 -1
  88. package/dist/{redis-stream-CrsfUmPt.d.mts → redis-stream-CakIQmwR.d.mts} +1 -1
  89. package/dist/registry/index.d.mts +1 -1
  90. package/dist/registry/index.mjs +2 -2
  91. package/dist/{resourceToTools-8s-EsCCe.mjs → resourceToTools-BElv3xPT.mjs} +65 -48
  92. package/dist/{schemaConverter-Y7nCYaLJ.mjs → schemaConverter-BxFDdtXu.mjs} +1 -1
  93. package/dist/scope/index.d.mts +1 -1
  94. package/dist/scope/index.mjs +2 -2
  95. package/dist/{sse-Ad7ypl9e.mjs → sse-yBCgOLGu.mjs} +1 -1
  96. package/dist/store-helpers-ZCSMJJAX.mjs +57 -0
  97. package/dist/testing/index.d.mts +9 -17
  98. package/dist/testing/index.mjs +27 -83
  99. package/dist/testing/storageContract.d.mts +1 -1
  100. package/dist/types/index.d.mts +4 -4
  101. package/dist/types/index.mjs +1 -31
  102. package/dist/types/storage.d.mts +1 -1
  103. package/dist/{types-BsbNMEDR.d.mts → types-Btdda02s.d.mts} +1 -1
  104. package/dist/{types-Ch9pTQbf.d.mts → types-Co8k3NyS.d.mts} +11 -9
  105. package/dist/types-Csi3FLfq.mjs +27 -0
  106. package/dist/utils/index.d.mts +208 -4
  107. package/dist/utils/index.mjs +5 -6
  108. package/dist/{utils-yYT3HDXt.mjs → utils-B2fNOD_i.mjs} +285 -2
  109. package/dist/{versioning-CDugduqI.mjs → versioning-C2U_bLY0.mjs} +3 -5
  110. package/package.json +20 -26
  111. package/skills/arc/SKILL.md +97 -23
  112. package/skills/arc/references/auth.md +94 -0
  113. package/skills/arc/references/events.md +200 -12
  114. package/skills/arc/references/mcp.md +4 -17
  115. package/skills/arc/references/multi-tenancy.md +43 -0
  116. package/skills/arc/references/production.md +34 -60
  117. package/dist/EventTransport-BXja8NOc.d.mts +0 -135
  118. package/dist/audit/mongodb.d.mts +0 -2
  119. package/dist/audit/mongodb.mjs +0 -2
  120. package/dist/circuitBreaker-cmi5XDv5.mjs +0 -284
  121. package/dist/circuitBreaker-dTtG-UyS.d.mts +0 -206
  122. package/dist/core-F0QoWBt2.mjs +0 -34
  123. package/dist/dynamic/index.d.mts +0 -93
  124. package/dist/dynamic/index.mjs +0 -122
  125. package/dist/fields-DpZQa_Q3.d.mts +0 -109
  126. package/dist/idempotency/mongodb.d.mts +0 -2
  127. package/dist/idempotency/mongodb.mjs +0 -123
  128. package/dist/interface-4y979v99.d.mts +0 -54
  129. package/dist/mongodb-BsP-WbhN.d.mts +0 -127
  130. package/dist/mongodb-CTcp0hQZ.d.mts +0 -80
  131. package/dist/mongodb-Utc5k_-0.mjs +0 -90
  132. package/dist/policies/index.d.mts +0 -432
  133. package/dist/policies/index.mjs +0 -318
  134. package/dist/rpc/index.d.mts +0 -90
  135. package/dist/rpc/index.mjs +0 -248
  136. /package/dist/{HookSystem-HprTmvVY.mjs → HookSystem-BNYKnrXF.mjs} +0 -0
  137. /package/dist/{applyPermissionResult-D6GPMsvh.mjs → applyPermissionResult-QhV1Pa-g.mjs} +0 -0
  138. /package/dist/{constants-Cxde4rpC.mjs → constants-BhY1OHoH.mjs} +0 -0
  139. /package/dist/{elevation-B6S5csVA.d.mts → elevation-C5SwtkAn.d.mts} +0 -0
  140. /package/dist/{errors-Ck2h67pm.d.mts → errors-CCSsMpXE.d.mts} +0 -0
  141. /package/dist/{errors-BF2bIOIS.mjs → errors-D5c-5BJL.mjs} +0 -0
  142. /package/dist/{externalPaths-BnkYrNzp.d.mts → externalPaths-BQ8QijNH.d.mts} +0 -0
  143. /package/dist/{interface-DfLGcus7.d.mts → interface-CSbZdv_3.d.mts} +0 -0
  144. /package/dist/{loadResources-PWd0OCpV.mjs → loadResources-BAzJItAJ.mjs} +0 -0
  145. /package/dist/{logger-D1YrIImS.mjs → logger-DLg8-Ueg.mjs} +0 -0
  146. /package/dist/{metrics-B-PU4-Yu.mjs → metrics-DuhiSEZI.mjs} +0 -0
  147. /package/dist/{pluralize-CWP6MB39.mjs → pluralize-A0tWEl1K.mjs} +0 -0
  148. /package/dist/{registry-BiTKT1Dg.mjs → registry-B3lRFBWo.mjs} +0 -0
  149. /package/dist/{replyHelpers-CxkYGT81.mjs → replyHelpers-CXtJDAZ0.mjs} +0 -0
  150. /package/dist/{requestContext-DYvHl113.mjs → requestContext-xHIKedG6.mjs} +0 -0
  151. /package/dist/{sessionManager-DDCmiNIo.d.mts → sessionManager-BkzVU8h2.d.mts} +0 -0
  152. /package/dist/{storage-Dfzt4VTl.d.mts → storage-CVk_SEn2.d.mts} +0 -0
  153. /package/dist/{tracing-DdN2-wHJ.d.mts → tracing-65B51Dw3.d.mts} +0 -0
  154. /package/dist/{typeGuards-CcFZXgU7.mjs → typeGuards-Cj5Rgvlg.mjs} +0 -0
  155. /package/dist/{types-ZUu_h0jp.mjs → types-DV9WDfeg.mjs} +0 -0
@@ -1,284 +0,0 @@
1
- //#region src/utils/circuitBreaker.ts
2
- /**
3
- * Circuit Breaker Pattern
4
- *
5
- * Wraps external service calls with failure protection.
6
- * Prevents cascading failures by "opening" the circuit when
7
- * a service is failing, allowing it time to recover.
8
- *
9
- * States:
10
- * - CLOSED: Normal operation, requests pass through
11
- * - OPEN: Too many failures, all requests fail fast
12
- * - HALF_OPEN: Testing if service recovered, limited requests
13
- *
14
- * @example
15
- * import { CircuitBreaker } from '@classytic/arc/utils';
16
- *
17
- * const paymentBreaker = new CircuitBreaker(async (amount) => {
18
- * return await stripe.charges.create({ amount });
19
- * }, {
20
- * failureThreshold: 5,
21
- * resetTimeout: 30000,
22
- * timeout: 5000,
23
- * });
24
- *
25
- * try {
26
- * const result = await paymentBreaker.call(100);
27
- * } catch (error) {
28
- * // Handle failure or circuit open
29
- * }
30
- */
31
- const CircuitState = {
32
- CLOSED: "CLOSED",
33
- OPEN: "OPEN",
34
- HALF_OPEN: "HALF_OPEN"
35
- };
36
- var CircuitBreakerError = class extends Error {
37
- state;
38
- constructor(message, state) {
39
- super(message);
40
- this.name = "CircuitBreakerError";
41
- this.state = state;
42
- }
43
- };
44
- var CircuitBreaker = class {
45
- state = CircuitState.CLOSED;
46
- failures = 0;
47
- successes = 0;
48
- totalCalls = 0;
49
- nextAttempt = 0;
50
- lastCallAt = null;
51
- openedAt = null;
52
- failureThreshold;
53
- resetTimeout;
54
- timeout;
55
- successThreshold;
56
- fallback;
57
- onStateChange;
58
- onError;
59
- name;
60
- fn;
61
- constructor(fn, options = {}) {
62
- this.fn = fn;
63
- this.failureThreshold = options.failureThreshold ?? 5;
64
- this.resetTimeout = options.resetTimeout ?? 6e4;
65
- this.timeout = options.timeout ?? 1e4;
66
- this.successThreshold = options.successThreshold ?? 1;
67
- this.fallback = options.fallback;
68
- this.onStateChange = options.onStateChange;
69
- this.onError = options.onError;
70
- this.name = options.name ?? "CircuitBreaker";
71
- }
72
- /**
73
- * Call the wrapped function with circuit breaker protection
74
- */
75
- async call(...args) {
76
- this.totalCalls++;
77
- this.lastCallAt = Date.now();
78
- if (this.state === CircuitState.OPEN) {
79
- if (Date.now() < this.nextAttempt) {
80
- const error = new CircuitBreakerError(`Circuit breaker is OPEN for ${this.name}`, CircuitState.OPEN);
81
- if (this.fallback) return this.fallback(...args);
82
- throw error;
83
- }
84
- this.setState(CircuitState.HALF_OPEN);
85
- }
86
- try {
87
- const result = await this.executeWithTimeout(args);
88
- this.onSuccess();
89
- return result;
90
- } catch (err) {
91
- this.onFailure(err instanceof Error ? err : new Error(String(err)));
92
- throw err;
93
- }
94
- }
95
- /**
96
- * Execute function with timeout
97
- */
98
- async executeWithTimeout(args) {
99
- return new Promise((resolve, reject) => {
100
- const timeoutId = setTimeout(() => {
101
- reject(/* @__PURE__ */ new Error(`Request timeout after ${this.timeout}ms`));
102
- }, this.timeout);
103
- this.fn(...args).then((result) => {
104
- clearTimeout(timeoutId);
105
- resolve(result);
106
- }).catch((error) => {
107
- clearTimeout(timeoutId);
108
- reject(error);
109
- });
110
- });
111
- }
112
- /**
113
- * Handle successful call
114
- */
115
- onSuccess() {
116
- this.failures = 0;
117
- this.successes++;
118
- if (this.state === CircuitState.HALF_OPEN) {
119
- if (this.successes >= this.successThreshold) {
120
- this.setState(CircuitState.CLOSED);
121
- this.successes = 0;
122
- }
123
- }
124
- }
125
- /**
126
- * Handle failed call
127
- */
128
- onFailure(error) {
129
- this.failures++;
130
- this.successes = 0;
131
- if (this.onError) this.onError(error);
132
- if (this.state === CircuitState.HALF_OPEN || this.failures >= this.failureThreshold) {
133
- this.setState(CircuitState.OPEN);
134
- this.nextAttempt = Date.now() + this.resetTimeout;
135
- this.openedAt = Date.now();
136
- }
137
- }
138
- /**
139
- * Change circuit state
140
- */
141
- setState(newState) {
142
- const oldState = this.state;
143
- if (oldState !== newState) {
144
- this.state = newState;
145
- if (this.onStateChange) this.onStateChange(oldState, newState);
146
- }
147
- }
148
- /**
149
- * Manually open the circuit
150
- */
151
- open() {
152
- this.setState(CircuitState.OPEN);
153
- this.nextAttempt = Date.now() + this.resetTimeout;
154
- this.openedAt = Date.now();
155
- }
156
- /**
157
- * Manually close the circuit
158
- */
159
- close() {
160
- this.failures = 0;
161
- this.successes = 0;
162
- this.setState(CircuitState.CLOSED);
163
- this.openedAt = null;
164
- }
165
- /**
166
- * Get current statistics
167
- */
168
- getStats() {
169
- return {
170
- name: this.name,
171
- state: this.state,
172
- failures: this.failures,
173
- successes: this.successes,
174
- totalCalls: this.totalCalls,
175
- openedAt: this.openedAt,
176
- lastCallAt: this.lastCallAt
177
- };
178
- }
179
- /**
180
- * Get current state
181
- */
182
- getState() {
183
- return this.state;
184
- }
185
- /**
186
- * Check if circuit is open
187
- */
188
- isOpen() {
189
- return this.state === CircuitState.OPEN;
190
- }
191
- /**
192
- * Check if circuit is closed
193
- */
194
- isClosed() {
195
- return this.state === CircuitState.CLOSED;
196
- }
197
- /**
198
- * Reset statistics
199
- */
200
- reset() {
201
- this.failures = 0;
202
- this.successes = 0;
203
- this.totalCalls = 0;
204
- this.lastCallAt = null;
205
- this.openedAt = null;
206
- this.setState(CircuitState.CLOSED);
207
- }
208
- };
209
- /**
210
- * Create a circuit breaker with sensible defaults
211
- *
212
- * @example
213
- * const emailBreaker = createCircuitBreaker(
214
- * async (to, subject, body) => sendEmail(to, subject, body),
215
- * { name: 'email-service' }
216
- * );
217
- */
218
- function createCircuitBreaker(fn, options) {
219
- return new CircuitBreaker(fn, options);
220
- }
221
- /**
222
- * Circuit breaker registry for managing multiple breakers
223
- */
224
- var CircuitBreakerRegistry = class {
225
- breakers = /* @__PURE__ */ new Map();
226
- /**
227
- * Register a circuit breaker
228
- */
229
- register(name, fn, options) {
230
- const breaker = new CircuitBreaker(fn, {
231
- ...options,
232
- name
233
- });
234
- this.breakers.set(name, breaker);
235
- return breaker;
236
- }
237
- /**
238
- * Get a circuit breaker by name
239
- */
240
- get(name) {
241
- return this.breakers.get(name);
242
- }
243
- /**
244
- * Get all breakers
245
- */
246
- getAll() {
247
- return this.breakers;
248
- }
249
- /**
250
- * Get statistics for all breakers
251
- */
252
- getAllStats() {
253
- const stats = {};
254
- for (const [name, breaker] of this.breakers.entries()) stats[name] = breaker.getStats();
255
- return stats;
256
- }
257
- /**
258
- * Reset all breakers
259
- */
260
- resetAll() {
261
- for (const breaker of this.breakers.values()) breaker.reset();
262
- }
263
- /**
264
- * Open all breakers
265
- */
266
- openAll() {
267
- for (const breaker of this.breakers.values()) breaker.open();
268
- }
269
- /**
270
- * Close all breakers
271
- */
272
- closeAll() {
273
- for (const breaker of this.breakers.values()) breaker.close();
274
- }
275
- };
276
- /**
277
- * Create a new CircuitBreakerRegistry instance.
278
- * Use this instead of a global singleton — attach to fastify.arc or pass explicitly.
279
- */
280
- function createCircuitBreakerRegistry() {
281
- return new CircuitBreakerRegistry();
282
- }
283
- //#endregion
284
- export { createCircuitBreaker as a, CircuitState as i, CircuitBreakerError as n, createCircuitBreakerRegistry as o, CircuitBreakerRegistry as r, CircuitBreaker as t };
@@ -1,206 +0,0 @@
1
- //#region src/utils/circuitBreaker.d.ts
2
- /**
3
- * Circuit Breaker Pattern
4
- *
5
- * Wraps external service calls with failure protection.
6
- * Prevents cascading failures by "opening" the circuit when
7
- * a service is failing, allowing it time to recover.
8
- *
9
- * States:
10
- * - CLOSED: Normal operation, requests pass through
11
- * - OPEN: Too many failures, all requests fail fast
12
- * - HALF_OPEN: Testing if service recovered, limited requests
13
- *
14
- * @example
15
- * import { CircuitBreaker } from '@classytic/arc/utils';
16
- *
17
- * const paymentBreaker = new CircuitBreaker(async (amount) => {
18
- * return await stripe.charges.create({ amount });
19
- * }, {
20
- * failureThreshold: 5,
21
- * resetTimeout: 30000,
22
- * timeout: 5000,
23
- * });
24
- *
25
- * try {
26
- * const result = await paymentBreaker.call(100);
27
- * } catch (error) {
28
- * // Handle failure or circuit open
29
- * }
30
- */
31
- declare const CircuitState: {
32
- readonly CLOSED: "CLOSED";
33
- readonly OPEN: "OPEN";
34
- readonly HALF_OPEN: "HALF_OPEN";
35
- };
36
- type CircuitState = (typeof CircuitState)[keyof typeof CircuitState];
37
- interface CircuitBreakerOptions {
38
- /**
39
- * Number of failures before opening circuit
40
- * @default 5
41
- */
42
- failureThreshold?: number;
43
- /**
44
- * Time in ms before attempting to close circuit
45
- * @default 60000 (60 seconds)
46
- */
47
- resetTimeout?: number;
48
- /**
49
- * Request timeout in ms
50
- * @default 10000 (10 seconds)
51
- */
52
- timeout?: number;
53
- /**
54
- * Number of successful requests in HALF_OPEN before closing
55
- * @default 1
56
- */
57
- successThreshold?: number;
58
- /**
59
- * Fallback function when circuit is open.
60
- * Receives the same arguments as the wrapped function.
61
- */
62
- fallback?: (...args: unknown[]) => Promise<unknown>;
63
- /**
64
- * Callback when state changes
65
- */
66
- onStateChange?: (from: CircuitState, to: CircuitState) => void;
67
- /**
68
- * Callback on error
69
- */
70
- onError?: (error: Error) => void;
71
- /**
72
- * Name for logging/monitoring
73
- */
74
- name?: string;
75
- }
76
- interface CircuitBreakerStats {
77
- name?: string;
78
- state: CircuitState;
79
- failures: number;
80
- successes: number;
81
- totalCalls: number;
82
- openedAt: number | null;
83
- lastCallAt: number | null;
84
- }
85
- declare class CircuitBreakerError extends Error {
86
- state: CircuitState;
87
- constructor(message: string, state: CircuitState);
88
- }
89
- declare class CircuitBreaker<T extends (...args: any[]) => Promise<any>> {
90
- private state;
91
- private failures;
92
- private successes;
93
- private totalCalls;
94
- private nextAttempt;
95
- private lastCallAt;
96
- private openedAt;
97
- private readonly failureThreshold;
98
- private readonly resetTimeout;
99
- private readonly timeout;
100
- private readonly successThreshold;
101
- private readonly fallback?;
102
- private readonly onStateChange?;
103
- private readonly onError?;
104
- private readonly name;
105
- private readonly fn;
106
- constructor(fn: T, options?: CircuitBreakerOptions);
107
- /**
108
- * Call the wrapped function with circuit breaker protection
109
- */
110
- call(...args: Parameters<T>): Promise<ReturnType<T>>;
111
- /**
112
- * Execute function with timeout
113
- */
114
- private executeWithTimeout;
115
- /**
116
- * Handle successful call
117
- */
118
- private onSuccess;
119
- /**
120
- * Handle failed call
121
- */
122
- private onFailure;
123
- /**
124
- * Change circuit state
125
- */
126
- private setState;
127
- /**
128
- * Manually open the circuit
129
- */
130
- open(): void;
131
- /**
132
- * Manually close the circuit
133
- */
134
- close(): void;
135
- /**
136
- * Get current statistics
137
- */
138
- getStats(): CircuitBreakerStats;
139
- /**
140
- * Get current state
141
- */
142
- getState(): CircuitState;
143
- /**
144
- * Check if circuit is open
145
- */
146
- isOpen(): boolean;
147
- /**
148
- * Check if circuit is closed
149
- */
150
- isClosed(): boolean;
151
- /**
152
- * Reset statistics
153
- */
154
- reset(): void;
155
- }
156
- /**
157
- * Create a circuit breaker with sensible defaults
158
- *
159
- * @example
160
- * const emailBreaker = createCircuitBreaker(
161
- * async (to, subject, body) => sendEmail(to, subject, body),
162
- * { name: 'email-service' }
163
- * );
164
- */
165
- declare function createCircuitBreaker<T extends (...args: any[]) => Promise<any>>(fn: T, options?: CircuitBreakerOptions): CircuitBreaker<T>;
166
- /**
167
- * Circuit breaker registry for managing multiple breakers
168
- */
169
- declare class CircuitBreakerRegistry {
170
- private breakers;
171
- /**
172
- * Register a circuit breaker
173
- */
174
- register<T extends (...args: any[]) => Promise<any>>(name: string, fn: T, options?: Omit<CircuitBreakerOptions, "name">): CircuitBreaker<T>;
175
- /**
176
- * Get a circuit breaker by name
177
- */
178
- get(name: string): CircuitBreaker<any> | undefined;
179
- /**
180
- * Get all breakers
181
- */
182
- getAll(): Map<string, CircuitBreaker<any>>;
183
- /**
184
- * Get statistics for all breakers
185
- */
186
- getAllStats(): Record<string, CircuitBreakerStats>;
187
- /**
188
- * Reset all breakers
189
- */
190
- resetAll(): void;
191
- /**
192
- * Open all breakers
193
- */
194
- openAll(): void;
195
- /**
196
- * Close all breakers
197
- */
198
- closeAll(): void;
199
- }
200
- /**
201
- * Create a new CircuitBreakerRegistry instance.
202
- * Use this instead of a global singleton — attach to fastify.arc or pass explicitly.
203
- */
204
- declare function createCircuitBreakerRegistry(): CircuitBreakerRegistry;
205
- //#endregion
206
- export { CircuitBreakerStats as a, createCircuitBreakerRegistry as c, CircuitBreakerRegistry as i, CircuitBreakerError as n, CircuitState as o, CircuitBreakerOptions as r, createCircuitBreaker as s, CircuitBreaker as t };
@@ -1,34 +0,0 @@
1
- import { n as defineResource } from "./defineResource-tcgySDo1.mjs";
2
- //#region src/core/defineResourceVariants.ts
3
- /**
4
- * Define multiple resources from a shared base config and per-variant overrides.
5
- *
6
- * Each variant is independently passed through `defineResource()` — the
7
- * returned `ResourceDefinition`s are real, fully-registered resources.
8
- * Register each one's plugin in your app:
9
- *
10
- * ```typescript
11
- * await app.register(articlePublic.toPlugin());
12
- * await app.register(articleAdmin.toPlugin());
13
- * ```
14
- *
15
- * @param base Shared config — adapter, queryParser, schemaOptions, hooks, etc.
16
- * Must NOT include `name` or `prefix` (those are per-variant).
17
- * @param variants Map of variant key → override. Each variant must declare
18
- * its own `name` and `prefix`. Other fields override the base.
19
- * @returns A record where each key from `variants` maps to a real
20
- * `ResourceDefinition` ready for `.toPlugin()` registration.
21
- */
22
- function defineResourceVariants(base, variants) {
23
- const out = {};
24
- for (const key of Object.keys(variants)) {
25
- const override = variants[key];
26
- out[key] = defineResource({
27
- ...base,
28
- ...override
29
- });
30
- }
31
- return out;
32
- }
33
- //#endregion
34
- export { defineResourceVariants as t };
@@ -1,93 +0,0 @@
1
- import { qt as ResourceDefinition, r as DataAdapter } from "../interface-CMRutPfe.mjs";
2
- import { t as PermissionCheck } from "../types-DZi1aYhm.mjs";
3
-
4
- //#region src/dynamic/ArcDynamicLoader.d.ts
5
- interface ArcArchitectureSchema {
6
- /** Application name */
7
- app: string;
8
- /** Resources to provision */
9
- resources: ArcResourceSchema[];
10
- }
11
- /** Field type — maps to JSON Schema / Zod types */
12
- type ArcFieldType = "string" | "number" | "boolean" | "date" | "object" | "array";
13
- /** Per-field definition — matches Arc's FieldRuleEntry for MCP compatibility */
14
- interface ArcFieldSchema {
15
- type: ArcFieldType;
16
- required?: boolean;
17
- description?: string;
18
- enum?: string[];
19
- min?: number;
20
- max?: number;
21
- minLength?: number;
22
- maxLength?: number;
23
- /** System-managed fields (createdAt, updatedAt) — excluded from create/update schemas */
24
- systemManaged?: boolean;
25
- /** Immutable after creation (e.g. slug, organizationId) */
26
- immutable?: boolean;
27
- }
28
- /** Permission preset name — matches Arc's built-in presets */
29
- type ArcPermissionPreset = "publicRead" | "publicReadAdminWrite" | "authenticated" | "adminOnly" | "ownerWithAdminBypass" | "fullPublic" | "readOnly";
30
- /** Fine-grained per-operation permission */
31
- interface ArcPermissionMap {
32
- list?: "public" | "auth" | "admin";
33
- get?: "public" | "auth" | "admin";
34
- create?: "auth" | "admin";
35
- update?: "auth" | "admin" | "owner";
36
- delete?: "auth" | "admin" | "owner";
37
- }
38
- interface ArcResourceSchema {
39
- /** Resource name (e.g., 'product', 'user') — used for URL prefix and tool names */
40
- name: string;
41
- /** Display name for docs and MCP descriptions (defaults to capitalized name) */
42
- displayName?: string;
43
- /** Custom URL prefix (defaults to `/${name}s`) */
44
- prefix?: string;
45
- /** Adapter resolution key — passed to adapterResolver */
46
- adapterPattern?: string;
47
- /** Permission preset name or fine-grained per-operation map */
48
- permissions: ArcPermissionPreset | ArcPermissionMap;
49
- /** Presets to apply (e.g., 'softDelete', 'slugLookup', 'bulk') */
50
- presets?: string[];
51
- /** Field definitions — drives schemaOptions.fieldRules for validation and MCP tool schemas */
52
- fields?: Record<string, ArcFieldSchema | ArcFieldType>;
53
- /** Fields allowed for filtering in list operations (drives queryParser + MCP) */
54
- filterable?: string[];
55
- /** Fields allowed for sorting (drives queryParser + MCP) */
56
- sortable?: string[];
57
- /** CRUD operations to disable (e.g., ['delete'] for append-only resources) */
58
- disabledRoutes?: string[];
59
- /** Tenant field name for multi-tenant resources */
60
- tenantField?: string;
61
- }
62
- interface DynamicLoaderContext {
63
- /** Resolve a data adapter for a resource — receives name and optional pattern key */
64
- adapterResolver: (resourceName: string, pattern?: string) => DataAdapter;
65
- /** Resolve custom permission checks beyond built-in presets */
66
- permissionResolver?: (policy: string) => PermissionCheck;
67
- }
68
- /**
69
- * Load an Arc Architecture Schema (JSON) and produce fully configured ResourceDefinitions.
70
- *
71
- * Each resource gets:
72
- * - Adapter from the resolver
73
- * - Permissions from presets or fine-grained map
74
- * - schemaOptions.fieldRules for validation and MCP tool schemas
75
- * - ArcQueryParser with allowedFilterFields/allowedSortFields for MCP auto-derive
76
- * - Presets applied
77
- */
78
- declare class ArcDynamicLoader {
79
- private context;
80
- constructor(context: DynamicLoaderContext);
81
- /**
82
- * Load an AAS definition and return fully constructed ResourceDefinitions.
83
- * Validates the schema before processing — throws on malformed input.
84
- */
85
- load(schema: ArcArchitectureSchema): ResourceDefinition<unknown>[];
86
- private buildFieldRules;
87
- private buildQueryParser;
88
- private resolvePermissions;
89
- private resolvePreset;
90
- private resolveFinGrained;
91
- }
92
- //#endregion
93
- export { ArcArchitectureSchema, ArcDynamicLoader, ArcFieldSchema, ArcFieldType, ArcPermissionMap, ArcPermissionPreset, ArcResourceSchema, DynamicLoaderContext };