spiceflow 1.17.5 → 1.17.7
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.
- package/README.md +28 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/middleware.test.js +21 -24
- package/dist/middleware.test.js.map +1 -1
- package/dist/prevent-process-exit-if-busy.d.ts +10 -9
- package/dist/prevent-process-exit-if-busy.d.ts.map +1 -1
- package/dist/prevent-process-exit-if-busy.js +10 -10
- package/dist/prevent-process-exit-if-busy.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +1 -1
- package/src/middleware.test.ts +60 -49
- package/src/prevent-process-exit-if-busy.ts +73 -0
- package/src/prevent-process-exit-if-busy.js +0 -60
package/README.md
CHANGED
|
@@ -1456,6 +1456,34 @@ async function trackPageView(path: string) {
|
|
|
1456
1456
|
|
|
1457
1457
|
**Note:** In non-Cloudflare environments, if no custom `waitUntil` function is provided, the default implementation is a no-op function that doesn't wait for the promises to complete.
|
|
1458
1458
|
|
|
1459
|
+
## Graceful Shutdown
|
|
1460
|
+
|
|
1461
|
+
The `preventProcessExitIfBusy` middleware prevents platforms like Fly.io from killing your app while processing long requests (e.g., AI payloads). Fly.io can wait up to 5 minutes for graceful shutdown.
|
|
1462
|
+
|
|
1463
|
+
```ts
|
|
1464
|
+
import { Spiceflow, preventProcessExitIfBusy } from 'spiceflow'
|
|
1465
|
+
|
|
1466
|
+
const app = new Spiceflow()
|
|
1467
|
+
.use(preventProcessExitIfBusy({
|
|
1468
|
+
maxWaitSeconds: 300, // 5 minutes max wait (default: 300)
|
|
1469
|
+
checkIntervalMs: 250 // Check interval (default: 250ms)
|
|
1470
|
+
}))
|
|
1471
|
+
.route({
|
|
1472
|
+
method: 'POST',
|
|
1473
|
+
path: '/ai/generate',
|
|
1474
|
+
async handler({ request }) {
|
|
1475
|
+
const prompt = await request.json()
|
|
1476
|
+
// Long-running AI generation
|
|
1477
|
+
const result = await generateAIResponse(prompt)
|
|
1478
|
+
return result
|
|
1479
|
+
},
|
|
1480
|
+
})
|
|
1481
|
+
|
|
1482
|
+
app.listen(3000)
|
|
1483
|
+
```
|
|
1484
|
+
|
|
1485
|
+
When receiving SIGTERM during deployment, the middleware waits for all active requests to complete before exiting. Perfect for AI workloads that may take minutes to process.
|
|
1486
|
+
|
|
1459
1487
|
### When using `createSpiceflowClient` and getting typescript error `The inferred type of 'pluginApiClient' cannot be named without a reference to '...'. This is likely not portable. A type annotation is necessary. (ts 2742)`
|
|
1460
1488
|
|
|
1461
1489
|
You can resolve this issue by adding an explicing type for the client:
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { Spiceflow } from './spiceflow.ts';
|
|
2
2
|
export type { AnySpiceflow, WaitUntil } from './spiceflow.ts';
|
|
3
3
|
export { ValidationError } from './error.ts';
|
|
4
|
-
export { preventProcessExitIfBusy } from './prevent-process-exit-if-busy.
|
|
4
|
+
export { preventProcessExitIfBusy } from './prevent-process-exit-if-busy.ts';
|
|
5
5
|
declare class Response extends globalThis.Response {
|
|
6
6
|
}
|
|
7
7
|
export { Response };
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { Spiceflow } from "./spiceflow.js";
|
|
2
2
|
export { ValidationError } from "./error.js";
|
|
3
|
-
export { preventProcessExitIfBusy } from
|
|
3
|
+
export { preventProcessExitIfBusy } from "./prevent-process-exit-if-busy.js";
|
|
4
4
|
// utility Response to be used in Cloudflare Workers to shut up the TypeScript errors (cloudflare Response is different than normal Response type)
|
|
5
5
|
class Response extends globalThis.Response {
|
|
6
6
|
}
|
package/dist/middleware.test.js
CHANGED
|
@@ -343,7 +343,7 @@ test('middleware with try/finally correctly tracks operations even when errors a
|
|
|
343
343
|
let operationCount = 0;
|
|
344
344
|
let finallyExecuted = false;
|
|
345
345
|
const createTrackingMiddleware = () => {
|
|
346
|
-
return async (_, next) => {
|
|
346
|
+
return new Spiceflow({ scoped: false }).use(async (_, next) => {
|
|
347
347
|
operationCount++;
|
|
348
348
|
try {
|
|
349
349
|
await next();
|
|
@@ -352,7 +352,7 @@ test('middleware with try/finally correctly tracks operations even when errors a
|
|
|
352
352
|
operationCount--;
|
|
353
353
|
finallyExecuted = true;
|
|
354
354
|
}
|
|
355
|
-
};
|
|
355
|
+
});
|
|
356
356
|
};
|
|
357
357
|
// Test 1: Normal successful request
|
|
358
358
|
operationCount = 0;
|
|
@@ -393,22 +393,22 @@ test('middleware with try/finally correctly tracks operations even when errors a
|
|
|
393
393
|
const app4 = new Spiceflow()
|
|
394
394
|
.use(createTrackingMiddleware())
|
|
395
395
|
.get('/concurrent', async () => {
|
|
396
|
-
await new Promise(resolve => setTimeout(resolve, 50));
|
|
396
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
397
397
|
return { ok: true };
|
|
398
398
|
});
|
|
399
399
|
// Start 3 concurrent requests
|
|
400
400
|
const concurrentRequests = Promise.all([
|
|
401
401
|
app4.handle(new Request('http://localhost/concurrent')),
|
|
402
402
|
app4.handle(new Request('http://localhost/concurrent')),
|
|
403
|
-
app4.handle(new Request('http://localhost/concurrent'))
|
|
403
|
+
app4.handle(new Request('http://localhost/concurrent')),
|
|
404
404
|
]);
|
|
405
405
|
// Wait a bit to ensure requests are in flight
|
|
406
|
-
await new Promise(resolve => setTimeout(resolve, 10));
|
|
406
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
407
407
|
// Operation count should be 3 while requests are in flight
|
|
408
408
|
expect(operationCount).toBe(3);
|
|
409
409
|
// Wait for all requests to complete
|
|
410
410
|
const results = await concurrentRequests;
|
|
411
|
-
results.forEach(res => expect(res.status).toBe(200));
|
|
411
|
+
results.forEach((res) => expect(res.status).toBe(200));
|
|
412
412
|
// Operation count should be back to 0
|
|
413
413
|
expect(operationCount).toBe(0);
|
|
414
414
|
});
|
|
@@ -430,8 +430,9 @@ test('middleware with try/finally tracks operations correctly with child apps',
|
|
|
430
430
|
// Test 1: Middleware on parent, route in child app
|
|
431
431
|
operationCount = 0;
|
|
432
432
|
finallyExecuted = false;
|
|
433
|
-
const childApp1 = new Spiceflow()
|
|
434
|
-
|
|
433
|
+
const childApp1 = new Spiceflow().get('/child/route', () => ({
|
|
434
|
+
message: 'from child',
|
|
435
|
+
}));
|
|
435
436
|
const parentApp1 = new Spiceflow()
|
|
436
437
|
.use(createTrackingMiddleware())
|
|
437
438
|
.use(childApp1);
|
|
@@ -442,8 +443,7 @@ test('middleware with try/finally tracks operations correctly with child apps',
|
|
|
442
443
|
// Test 2: Middleware on parent, error thrown in child route
|
|
443
444
|
operationCount = 0;
|
|
444
445
|
finallyExecuted = false;
|
|
445
|
-
const childApp2 = new Spiceflow()
|
|
446
|
-
.get('/child/error', () => {
|
|
446
|
+
const childApp2 = new Spiceflow().get('/child/error', () => {
|
|
447
447
|
throw new Error('Child route error');
|
|
448
448
|
});
|
|
449
449
|
const parentApp2 = new Spiceflow()
|
|
@@ -456,10 +456,10 @@ test('middleware with try/finally tracks operations correctly with child apps',
|
|
|
456
456
|
// Test 3: Multiple nested child apps with middleware
|
|
457
457
|
operationCount = 0;
|
|
458
458
|
finallyExecuted = false;
|
|
459
|
-
const grandchildApp = new Spiceflow()
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
459
|
+
const grandchildApp = new Spiceflow().get('/level3/route', () => ({
|
|
460
|
+
level: 3,
|
|
461
|
+
}));
|
|
462
|
+
const childApp3 = new Spiceflow({ basePath: '/level2' }).use(grandchildApp);
|
|
463
463
|
const parentApp3 = new Spiceflow()
|
|
464
464
|
.use(createTrackingMiddleware())
|
|
465
465
|
.use(childApp3);
|
|
@@ -481,8 +481,7 @@ test('middleware with try/finally tracks operations correctly with child apps',
|
|
|
481
481
|
// Test 5: Child app with basePath
|
|
482
482
|
operationCount = 0;
|
|
483
483
|
finallyExecuted = false;
|
|
484
|
-
const childApp5 = new Spiceflow({ basePath: '/api/v1' })
|
|
485
|
-
.get('/users', () => ({ users: [] }));
|
|
484
|
+
const childApp5 = new Spiceflow({ basePath: '/api/v1' }).get('/users', () => ({ users: [] }));
|
|
486
485
|
const parentApp5 = new Spiceflow()
|
|
487
486
|
.use(createTrackingMiddleware())
|
|
488
487
|
.use(childApp5);
|
|
@@ -492,9 +491,8 @@ test('middleware with try/finally tracks operations correctly with child apps',
|
|
|
492
491
|
expect(finallyExecuted).toBe(true);
|
|
493
492
|
// Test 6: Concurrent requests to child app routes
|
|
494
493
|
operationCount = 0;
|
|
495
|
-
const childApp6 = new Spiceflow()
|
|
496
|
-
|
|
497
|
-
await new Promise(resolve => setTimeout(resolve, 50));
|
|
494
|
+
const childApp6 = new Spiceflow().get('/child/slow', async () => {
|
|
495
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
498
496
|
return { ok: true };
|
|
499
497
|
});
|
|
500
498
|
const parentApp6 = new Spiceflow()
|
|
@@ -504,22 +502,21 @@ test('middleware with try/finally tracks operations correctly with child apps',
|
|
|
504
502
|
const concurrentRequests = Promise.all([
|
|
505
503
|
parentApp6.handle(new Request('http://localhost/child/slow')),
|
|
506
504
|
parentApp6.handle(new Request('http://localhost/child/slow')),
|
|
507
|
-
parentApp6.handle(new Request('http://localhost/child/slow'))
|
|
505
|
+
parentApp6.handle(new Request('http://localhost/child/slow')),
|
|
508
506
|
]);
|
|
509
507
|
// Wait a bit to ensure requests are in flight
|
|
510
|
-
await new Promise(resolve => setTimeout(resolve, 10));
|
|
508
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
511
509
|
// Operation count should be 3 while requests are in flight
|
|
512
510
|
expect(operationCount).toBe(3);
|
|
513
511
|
// Wait for all requests to complete
|
|
514
512
|
const results = await concurrentRequests;
|
|
515
|
-
results.forEach(res => expect(res.status).toBe(200));
|
|
513
|
+
results.forEach((res) => expect(res.status).toBe(200));
|
|
516
514
|
// Operation count should be back to 0
|
|
517
515
|
expect(operationCount).toBe(0);
|
|
518
516
|
// Test 7: Child app throws Response
|
|
519
517
|
operationCount = 0;
|
|
520
518
|
finallyExecuted = false;
|
|
521
|
-
const childApp7 = new Spiceflow()
|
|
522
|
-
.get('/child/response', () => {
|
|
519
|
+
const childApp7 = new Spiceflow().get('/child/response', () => {
|
|
523
520
|
throw new Response('Custom child response', { status: 403 });
|
|
524
521
|
});
|
|
525
522
|
const parentApp7 = new Spiceflow()
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.test.js","sourceRoot":"","sources":["../src/middleware.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"middleware.test.js","sourceRoot":"","sources":["../src/middleware.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,16 @@
|
|
|
1
|
+
interface GracefulShutdownOptions {
|
|
2
|
+
maxWaitSeconds?: number;
|
|
3
|
+
checkIntervalMs?: number;
|
|
4
|
+
}
|
|
1
5
|
/**
|
|
2
6
|
* Creates a Spiceflow middleware that tracks in-flight requests and prevents
|
|
3
7
|
* the process from exiting while requests are being processed.
|
|
4
8
|
*
|
|
5
|
-
* @param
|
|
6
|
-
* @param
|
|
7
|
-
* @param
|
|
8
|
-
* @returns
|
|
9
|
+
* @param options - Configuration options
|
|
10
|
+
* @param options.maxWaitSeconds - Maximum time to wait for requests to complete (default: 300)
|
|
11
|
+
* @param options.checkIntervalMs - Interval to check if requests are complete (default: 250)
|
|
12
|
+
* @returns Spiceflow app that can be mounted with .use()
|
|
9
13
|
*/
|
|
10
|
-
export function preventProcessExitIfBusy(options?:
|
|
11
|
-
|
|
12
|
-
checkIntervalMs?: number | undefined;
|
|
13
|
-
}): Spiceflow;
|
|
14
|
-
import { Spiceflow } from 'spiceflow';
|
|
14
|
+
export declare function preventProcessExitIfBusy(options?: GracefulShutdownOptions): any;
|
|
15
|
+
export {};
|
|
15
16
|
//# sourceMappingURL=prevent-process-exit-if-busy.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prevent-process-exit-if-busy.d.ts","sourceRoot":"","sources":["../src/prevent-process-exit-if-busy.
|
|
1
|
+
{"version":3,"file":"prevent-process-exit-if-busy.d.ts","sourceRoot":"","sources":["../src/prevent-process-exit-if-busy.ts"],"names":[],"mappings":"AAGA,UAAU,uBAAuB;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,GAAE,uBAA4B,GACpC,GAAG,CAqDL"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { Spiceflow } from 'spiceflow';
|
|
1
|
+
import { Spiceflow } from './spiceflow.js';
|
|
2
2
|
/**
|
|
3
3
|
* Creates a Spiceflow middleware that tracks in-flight requests and prevents
|
|
4
4
|
* the process from exiting while requests are being processed.
|
|
5
5
|
*
|
|
6
|
-
* @param
|
|
7
|
-
* @param
|
|
8
|
-
* @param
|
|
9
|
-
* @returns
|
|
6
|
+
* @param options - Configuration options
|
|
7
|
+
* @param options.maxWaitSeconds - Maximum time to wait for requests to complete (default: 300)
|
|
8
|
+
* @param options.checkIntervalMs - Interval to check if requests are complete (default: 250)
|
|
9
|
+
* @returns Spiceflow app that can be mounted with .use()
|
|
10
10
|
*/
|
|
11
11
|
export function preventProcessExitIfBusy(options = {}) {
|
|
12
12
|
const { maxWaitSeconds = 300, checkIntervalMs = 250 } = options;
|
|
@@ -14,14 +14,14 @@ export function preventProcessExitIfBusy(options = {}) {
|
|
|
14
14
|
let inFlightRequests = 0;
|
|
15
15
|
let isShuttingDown = false;
|
|
16
16
|
// Sleep utility
|
|
17
|
-
const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));
|
|
17
|
+
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
18
18
|
// Graceful shutdown handler
|
|
19
19
|
async function handleShutdown(signal) {
|
|
20
20
|
if (isShuttingDown)
|
|
21
21
|
return; // Prevent multiple shutdown attempts
|
|
22
22
|
isShuttingDown = true;
|
|
23
23
|
console.log(`${signal} received – waiting for ${inFlightRequests} request(s) to complete...`);
|
|
24
|
-
const deadline = Date.now() +
|
|
24
|
+
const deadline = Date.now() + maxWaitSeconds * 1000;
|
|
25
25
|
while (inFlightRequests > 0 && Date.now() < deadline) {
|
|
26
26
|
await sleep(checkIntervalMs);
|
|
27
27
|
}
|
|
@@ -36,12 +36,12 @@ export function preventProcessExitIfBusy(options = {}) {
|
|
|
36
36
|
// Register shutdown handlers only in Node.js environments
|
|
37
37
|
if (typeof process !== 'undefined' && process.prependListener) {
|
|
38
38
|
;
|
|
39
|
-
['SIGINT', 'SIGTERM'].forEach(sig => {
|
|
39
|
+
['SIGINT', 'SIGTERM'].forEach((sig) => {
|
|
40
40
|
process.prependListener(sig, handleShutdown);
|
|
41
41
|
});
|
|
42
42
|
}
|
|
43
|
-
// Return Spiceflow middleware
|
|
44
|
-
return new Spiceflow().use(async (_, next) => {
|
|
43
|
+
// Return Spiceflow middleware with scoped: false
|
|
44
|
+
return new Spiceflow({ scoped: false }).use(async (_, next) => {
|
|
45
45
|
inFlightRequests++;
|
|
46
46
|
try {
|
|
47
47
|
await next();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prevent-process-exit-if-busy.js","sourceRoot":"","sources":["../src/prevent-process-exit-if-busy.
|
|
1
|
+
{"version":3,"file":"prevent-process-exit-if-busy.js","sourceRoot":"","sources":["../src/prevent-process-exit-if-busy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAQ1C;;;;;;;;GAQG;AACH,MAAM,UAAU,wBAAwB,CACtC,UAAmC,EAAE;IAErC,MAAM,EAAE,cAAc,GAAG,GAAG,EAAE,eAAe,GAAG,GAAG,EAAE,GAAG,OAAO,CAAA;IAE/D,sCAAsC;IACtC,IAAI,gBAAgB,GAAG,CAAC,CAAA;IACxB,IAAI,cAAc,GAAG,KAAK,CAAA;IAE1B,gBAAgB;IAChB,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAE,CAC3B,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;IAEzD,4BAA4B;IAC5B,KAAK,UAAU,cAAc,CAAC,MAAsB;QAClD,IAAI,cAAc;YAAE,OAAM,CAAC,qCAAqC;QAChE,cAAc,GAAG,IAAI,CAAA;QAErB,OAAO,CAAC,GAAG,CACT,GAAG,MAAM,2BAA2B,gBAAgB,4BAA4B,CACjF,CAAA;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc,GAAG,IAAI,CAAA;QAEnD,OAAO,gBAAgB,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;YACrD,MAAM,KAAK,CAAC,eAAe,CAAC,CAAA;QAC9B,CAAC;QAED,IAAI,gBAAgB,GAAG,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CACT,6BAA6B,gBAAgB,+BAA+B,CAC7E,CAAA;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAA;QACvC,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC5C,CAAC;IAED,0DAA0D;IAC1D,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;QAC9D,CAAC;QAAA,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACrC,OAAO,CAAC,eAAe,CAAC,GAAqB,EAAE,cAAc,CAAC,CAAA;QAChE,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,iDAAiD;IACjD,OAAO,IAAI,SAAS,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QAC5D,gBAAgB,EAAE,CAAA;QAClB,IAAI,CAAC;YACH,MAAM,IAAI,EAAE,CAAA;QACd,CAAC;gBAAS,CAAC;YACT,gBAAgB,EAAE,CAAA;QACpB,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC"}
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { Spiceflow } from './spiceflow.ts'
|
|
2
2
|
export type { AnySpiceflow, WaitUntil } from './spiceflow.ts'
|
|
3
3
|
export { ValidationError } from './error.ts'
|
|
4
|
-
export { preventProcessExitIfBusy } from './prevent-process-exit-if-busy.
|
|
4
|
+
export { preventProcessExitIfBusy } from './prevent-process-exit-if-busy.ts'
|
|
5
5
|
|
|
6
6
|
// utility Response to be used in Cloudflare Workers to shut up the TypeScript errors (cloudflare Response is different than normal Response type)
|
|
7
7
|
class Response extends globalThis.Response {}
|
package/src/middleware.test.ts
CHANGED
|
@@ -385,9 +385,8 @@ test('each middleware and route is called exactly once if an error is thrown', a
|
|
|
385
385
|
test('middleware with try/finally correctly tracks operations even when errors are thrown', async () => {
|
|
386
386
|
let operationCount = 0
|
|
387
387
|
let finallyExecuted = false
|
|
388
|
-
|
|
389
388
|
const createTrackingMiddleware = () => {
|
|
390
|
-
return async (_: any, next: any) => {
|
|
389
|
+
return new Spiceflow({ scoped: false }).use(async (_: any, next: any) => {
|
|
391
390
|
operationCount++
|
|
392
391
|
try {
|
|
393
392
|
await next()
|
|
@@ -395,7 +394,7 @@ test('middleware with try/finally correctly tracks operations even when errors a
|
|
|
395
394
|
operationCount--
|
|
396
395
|
finallyExecuted = true
|
|
397
396
|
}
|
|
398
|
-
}
|
|
397
|
+
})
|
|
399
398
|
}
|
|
400
399
|
|
|
401
400
|
// Test 1: Normal successful request
|
|
@@ -443,7 +442,7 @@ test('middleware with try/finally correctly tracks operations even when errors a
|
|
|
443
442
|
const app4 = new Spiceflow()
|
|
444
443
|
.use(createTrackingMiddleware())
|
|
445
444
|
.get('/concurrent', async () => {
|
|
446
|
-
await new Promise(resolve => setTimeout(resolve, 50))
|
|
445
|
+
await new Promise((resolve) => setTimeout(resolve, 50))
|
|
447
446
|
return { ok: true }
|
|
448
447
|
})
|
|
449
448
|
|
|
@@ -451,19 +450,19 @@ test('middleware with try/finally correctly tracks operations even when errors a
|
|
|
451
450
|
const concurrentRequests = Promise.all([
|
|
452
451
|
app4.handle(new Request('http://localhost/concurrent')),
|
|
453
452
|
app4.handle(new Request('http://localhost/concurrent')),
|
|
454
|
-
app4.handle(new Request('http://localhost/concurrent'))
|
|
453
|
+
app4.handle(new Request('http://localhost/concurrent')),
|
|
455
454
|
])
|
|
456
455
|
|
|
457
456
|
// Wait a bit to ensure requests are in flight
|
|
458
|
-
await new Promise(resolve => setTimeout(resolve, 10))
|
|
459
|
-
|
|
457
|
+
await new Promise((resolve) => setTimeout(resolve, 10))
|
|
458
|
+
|
|
460
459
|
// Operation count should be 3 while requests are in flight
|
|
461
460
|
expect(operationCount).toBe(3)
|
|
462
461
|
|
|
463
462
|
// Wait for all requests to complete
|
|
464
463
|
const results = await concurrentRequests
|
|
465
|
-
results.forEach(res => expect(res.status).toBe(200))
|
|
466
|
-
|
|
464
|
+
results.forEach((res) => expect(res.status).toBe(200))
|
|
465
|
+
|
|
467
466
|
// Operation count should be back to 0
|
|
468
467
|
expect(operationCount).toBe(0)
|
|
469
468
|
})
|
|
@@ -487,14 +486,17 @@ test('middleware with try/finally tracks operations correctly with child apps',
|
|
|
487
486
|
// Test 1: Middleware on parent, route in child app
|
|
488
487
|
operationCount = 0
|
|
489
488
|
finallyExecuted = false
|
|
490
|
-
const childApp1 = new Spiceflow()
|
|
491
|
-
|
|
492
|
-
|
|
489
|
+
const childApp1 = new Spiceflow().get('/child/route', () => ({
|
|
490
|
+
message: 'from child',
|
|
491
|
+
}))
|
|
492
|
+
|
|
493
493
|
const parentApp1 = new Spiceflow()
|
|
494
494
|
.use(createTrackingMiddleware())
|
|
495
495
|
.use(childApp1)
|
|
496
496
|
|
|
497
|
-
const res1 = await parentApp1.handle(
|
|
497
|
+
const res1 = await parentApp1.handle(
|
|
498
|
+
new Request('http://localhost/child/route'),
|
|
499
|
+
)
|
|
498
500
|
expect(res1.status).toBe(200)
|
|
499
501
|
expect(operationCount).toBe(0)
|
|
500
502
|
expect(finallyExecuted).toBe(true)
|
|
@@ -502,16 +504,17 @@ test('middleware with try/finally tracks operations correctly with child apps',
|
|
|
502
504
|
// Test 2: Middleware on parent, error thrown in child route
|
|
503
505
|
operationCount = 0
|
|
504
506
|
finallyExecuted = false
|
|
505
|
-
const childApp2 = new Spiceflow()
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
507
|
+
const childApp2 = new Spiceflow().get('/child/error', () => {
|
|
508
|
+
throw new Error('Child route error')
|
|
509
|
+
})
|
|
510
|
+
|
|
510
511
|
const parentApp2 = new Spiceflow()
|
|
511
512
|
.use(createTrackingMiddleware())
|
|
512
513
|
.use(childApp2)
|
|
513
514
|
|
|
514
|
-
const res2 = await parentApp2.handle(
|
|
515
|
+
const res2 = await parentApp2.handle(
|
|
516
|
+
new Request('http://localhost/child/error'),
|
|
517
|
+
)
|
|
515
518
|
expect(res2.status).toBe(500)
|
|
516
519
|
expect(operationCount).toBe(0)
|
|
517
520
|
expect(finallyExecuted).toBe(true)
|
|
@@ -519,17 +522,19 @@ test('middleware with try/finally tracks operations correctly with child apps',
|
|
|
519
522
|
// Test 3: Multiple nested child apps with middleware
|
|
520
523
|
operationCount = 0
|
|
521
524
|
finallyExecuted = false
|
|
522
|
-
const grandchildApp = new Spiceflow()
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
525
|
+
const grandchildApp = new Spiceflow().get('/level3/route', () => ({
|
|
526
|
+
level: 3,
|
|
527
|
+
}))
|
|
528
|
+
|
|
529
|
+
const childApp3 = new Spiceflow({ basePath: '/level2' }).use(grandchildApp)
|
|
530
|
+
|
|
528
531
|
const parentApp3 = new Spiceflow()
|
|
529
532
|
.use(createTrackingMiddleware())
|
|
530
533
|
.use(childApp3)
|
|
531
534
|
|
|
532
|
-
const res3 = await parentApp3.handle(
|
|
535
|
+
const res3 = await parentApp3.handle(
|
|
536
|
+
new Request('http://localhost/level2/level3/route'),
|
|
537
|
+
)
|
|
533
538
|
expect(res3.status).toBe(200)
|
|
534
539
|
expect(operationCount).toBe(0)
|
|
535
540
|
expect(finallyExecuted).toBe(true)
|
|
@@ -539,38 +544,43 @@ test('middleware with try/finally tracks operations correctly with child apps',
|
|
|
539
544
|
const childApp4 = new Spiceflow()
|
|
540
545
|
.use(createTrackingMiddleware())
|
|
541
546
|
.get('/child/both', () => ({ from: 'both' }))
|
|
542
|
-
|
|
547
|
+
|
|
543
548
|
const parentApp4 = new Spiceflow()
|
|
544
549
|
.use(createTrackingMiddleware())
|
|
545
550
|
.use(childApp4)
|
|
546
551
|
|
|
547
|
-
const res4 = await parentApp4.handle(
|
|
552
|
+
const res4 = await parentApp4.handle(
|
|
553
|
+
new Request('http://localhost/child/both'),
|
|
554
|
+
)
|
|
548
555
|
expect(res4.status).toBe(200)
|
|
549
556
|
expect(operationCount).toBe(0) // Both middlewares increment and decrement
|
|
550
557
|
|
|
551
558
|
// Test 5: Child app with basePath
|
|
552
559
|
operationCount = 0
|
|
553
560
|
finallyExecuted = false
|
|
554
|
-
const childApp5 = new Spiceflow({ basePath: '/api/v1' })
|
|
555
|
-
|
|
556
|
-
|
|
561
|
+
const childApp5 = new Spiceflow({ basePath: '/api/v1' }).get(
|
|
562
|
+
'/users',
|
|
563
|
+
() => ({ users: [] }),
|
|
564
|
+
)
|
|
565
|
+
|
|
557
566
|
const parentApp5 = new Spiceflow()
|
|
558
567
|
.use(createTrackingMiddleware())
|
|
559
568
|
.use(childApp5)
|
|
560
569
|
|
|
561
|
-
const res5 = await parentApp5.handle(
|
|
570
|
+
const res5 = await parentApp5.handle(
|
|
571
|
+
new Request('http://localhost/api/v1/users'),
|
|
572
|
+
)
|
|
562
573
|
expect(res5.status).toBe(200)
|
|
563
574
|
expect(operationCount).toBe(0)
|
|
564
575
|
expect(finallyExecuted).toBe(true)
|
|
565
576
|
|
|
566
577
|
// Test 6: Concurrent requests to child app routes
|
|
567
578
|
operationCount = 0
|
|
568
|
-
const childApp6 = new Spiceflow()
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
579
|
+
const childApp6 = new Spiceflow().get('/child/slow', async () => {
|
|
580
|
+
await new Promise((resolve) => setTimeout(resolve, 50))
|
|
581
|
+
return { ok: true }
|
|
582
|
+
})
|
|
583
|
+
|
|
574
584
|
const parentApp6 = new Spiceflow()
|
|
575
585
|
.use(createTrackingMiddleware())
|
|
576
586
|
.use(childApp6)
|
|
@@ -579,35 +589,36 @@ test('middleware with try/finally tracks operations correctly with child apps',
|
|
|
579
589
|
const concurrentRequests = Promise.all([
|
|
580
590
|
parentApp6.handle(new Request('http://localhost/child/slow')),
|
|
581
591
|
parentApp6.handle(new Request('http://localhost/child/slow')),
|
|
582
|
-
parentApp6.handle(new Request('http://localhost/child/slow'))
|
|
592
|
+
parentApp6.handle(new Request('http://localhost/child/slow')),
|
|
583
593
|
])
|
|
584
594
|
|
|
585
595
|
// Wait a bit to ensure requests are in flight
|
|
586
|
-
await new Promise(resolve => setTimeout(resolve, 10))
|
|
587
|
-
|
|
596
|
+
await new Promise((resolve) => setTimeout(resolve, 10))
|
|
597
|
+
|
|
588
598
|
// Operation count should be 3 while requests are in flight
|
|
589
599
|
expect(operationCount).toBe(3)
|
|
590
600
|
|
|
591
601
|
// Wait for all requests to complete
|
|
592
602
|
const results = await concurrentRequests
|
|
593
|
-
results.forEach(res => expect(res.status).toBe(200))
|
|
594
|
-
|
|
603
|
+
results.forEach((res) => expect(res.status).toBe(200))
|
|
604
|
+
|
|
595
605
|
// Operation count should be back to 0
|
|
596
606
|
expect(operationCount).toBe(0)
|
|
597
607
|
|
|
598
608
|
// Test 7: Child app throws Response
|
|
599
609
|
operationCount = 0
|
|
600
610
|
finallyExecuted = false
|
|
601
|
-
const childApp7 = new Spiceflow()
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
611
|
+
const childApp7 = new Spiceflow().get('/child/response', () => {
|
|
612
|
+
throw new Response('Custom child response', { status: 403 })
|
|
613
|
+
})
|
|
614
|
+
|
|
606
615
|
const parentApp7 = new Spiceflow()
|
|
607
616
|
.use(createTrackingMiddleware())
|
|
608
617
|
.use(childApp7)
|
|
609
618
|
|
|
610
|
-
const res7 = await parentApp7.handle(
|
|
619
|
+
const res7 = await parentApp7.handle(
|
|
620
|
+
new Request('http://localhost/child/response'),
|
|
621
|
+
)
|
|
611
622
|
expect(res7.status).toBe(403)
|
|
612
623
|
expect(operationCount).toBe(0)
|
|
613
624
|
expect(finallyExecuted).toBe(true)
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { Spiceflow } from './spiceflow.js'
|
|
2
|
+
import type { AnySpiceflow } from './spiceflow.js'
|
|
3
|
+
|
|
4
|
+
interface GracefulShutdownOptions {
|
|
5
|
+
maxWaitSeconds?: number
|
|
6
|
+
checkIntervalMs?: number
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Creates a Spiceflow middleware that tracks in-flight requests and prevents
|
|
11
|
+
* the process from exiting while requests are being processed.
|
|
12
|
+
*
|
|
13
|
+
* @param options - Configuration options
|
|
14
|
+
* @param options.maxWaitSeconds - Maximum time to wait for requests to complete (default: 300)
|
|
15
|
+
* @param options.checkIntervalMs - Interval to check if requests are complete (default: 250)
|
|
16
|
+
* @returns Spiceflow app that can be mounted with .use()
|
|
17
|
+
*/
|
|
18
|
+
export function preventProcessExitIfBusy(
|
|
19
|
+
options: GracefulShutdownOptions = {},
|
|
20
|
+
): any {
|
|
21
|
+
const { maxWaitSeconds = 300, checkIntervalMs = 250 } = options
|
|
22
|
+
|
|
23
|
+
// Track in-flight requests in closure
|
|
24
|
+
let inFlightRequests = 0
|
|
25
|
+
let isShuttingDown = false
|
|
26
|
+
|
|
27
|
+
// Sleep utility
|
|
28
|
+
const sleep = (ms: number) =>
|
|
29
|
+
new Promise<void>((resolve) => setTimeout(resolve, ms))
|
|
30
|
+
|
|
31
|
+
// Graceful shutdown handler
|
|
32
|
+
async function handleShutdown(signal: NodeJS.Signals) {
|
|
33
|
+
if (isShuttingDown) return // Prevent multiple shutdown attempts
|
|
34
|
+
isShuttingDown = true
|
|
35
|
+
|
|
36
|
+
console.log(
|
|
37
|
+
`${signal} received – waiting for ${inFlightRequests} request(s) to complete...`,
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
const deadline = Date.now() + maxWaitSeconds * 1000
|
|
41
|
+
|
|
42
|
+
while (inFlightRequests > 0 && Date.now() < deadline) {
|
|
43
|
+
await sleep(checkIntervalMs)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (inFlightRequests > 0) {
|
|
47
|
+
console.log(
|
|
48
|
+
`Shutdown timeout reached; ${inFlightRequests} request(s) still in progress`,
|
|
49
|
+
)
|
|
50
|
+
} else {
|
|
51
|
+
console.log('All requests completed')
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
process.exit(inFlightRequests > 0 ? 1 : 0)
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Register shutdown handlers only in Node.js environments
|
|
58
|
+
if (typeof process !== 'undefined' && process.prependListener) {
|
|
59
|
+
;['SIGINT', 'SIGTERM'].forEach((sig) => {
|
|
60
|
+
process.prependListener(sig as NodeJS.Signals, handleShutdown)
|
|
61
|
+
})
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Return Spiceflow middleware with scoped: false
|
|
65
|
+
return new Spiceflow({ scoped: false }).use(async (_, next) => {
|
|
66
|
+
inFlightRequests++
|
|
67
|
+
try {
|
|
68
|
+
await next()
|
|
69
|
+
} finally {
|
|
70
|
+
inFlightRequests--
|
|
71
|
+
}
|
|
72
|
+
})
|
|
73
|
+
}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
import { Spiceflow } from 'spiceflow'
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Creates a Spiceflow middleware that tracks in-flight requests and prevents
|
|
5
|
-
* the process from exiting while requests are being processed.
|
|
6
|
-
*
|
|
7
|
-
* @param {Object} options - Configuration options
|
|
8
|
-
* @param {number} [options.maxWaitSeconds=300] - Maximum time to wait for requests to complete
|
|
9
|
-
* @param {number} [options.checkIntervalMs=250] - Interval to check if requests are complete
|
|
10
|
-
* @returns {Spiceflow} Spiceflow app that can be mounted with .use()
|
|
11
|
-
*/
|
|
12
|
-
export function preventProcessExitIfBusy(options = {}) {
|
|
13
|
-
const { maxWaitSeconds = 300, checkIntervalMs = 250 } = options
|
|
14
|
-
|
|
15
|
-
// Track in-flight requests in closure
|
|
16
|
-
let inFlightRequests = 0
|
|
17
|
-
let isShuttingDown = false
|
|
18
|
-
|
|
19
|
-
// Sleep utility
|
|
20
|
-
const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms))
|
|
21
|
-
|
|
22
|
-
// Graceful shutdown handler
|
|
23
|
-
async function handleShutdown(signal) {
|
|
24
|
-
if (isShuttingDown) return // Prevent multiple shutdown attempts
|
|
25
|
-
isShuttingDown = true
|
|
26
|
-
|
|
27
|
-
console.log(`${signal} received – waiting for ${inFlightRequests} request(s) to complete...`)
|
|
28
|
-
|
|
29
|
-
const deadline = Date.now() + (maxWaitSeconds * 1000)
|
|
30
|
-
|
|
31
|
-
while (inFlightRequests > 0 && Date.now() < deadline) {
|
|
32
|
-
await sleep(checkIntervalMs)
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
if (inFlightRequests > 0) {
|
|
36
|
-
console.log(`Shutdown timeout reached; ${inFlightRequests} request(s) still in progress`)
|
|
37
|
-
} else {
|
|
38
|
-
console.log('All requests completed')
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
process.exit(inFlightRequests > 0 ? 1 : 0)
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
// Register shutdown handlers only in Node.js environments
|
|
45
|
-
if (typeof process !== 'undefined' && process.prependListener) {
|
|
46
|
-
;['SIGINT', 'SIGTERM'].forEach(sig => {
|
|
47
|
-
process.prependListener(sig, handleShutdown)
|
|
48
|
-
})
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
// Return Spiceflow middleware
|
|
52
|
-
return new Spiceflow().use(async (_, next) => {
|
|
53
|
-
inFlightRequests++
|
|
54
|
-
try {
|
|
55
|
-
await next()
|
|
56
|
-
} finally {
|
|
57
|
-
inFlightRequests--
|
|
58
|
-
}
|
|
59
|
-
})
|
|
60
|
-
}
|