From 8a64d6e02789128f4b43ff7a204191dfd2dfd46a Mon Sep 17 00:00:00 2001 From: Kamil Listopad Date: Tue, 28 Jul 2026 11:57:29 +0200 Subject: [PATCH 1/2] feat(pic): add ttl option to PocketIcServer.start Passes --ttl to the spawned pocket-ic process to control how long the server stays alive after the last completed operation. When omitted, no flag is passed and the server default applies. --- packages/pic/src/pocket-ic-server-types.ts | 7 +++++++ packages/pic/src/pocket-ic-server.ts | 7 ++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/packages/pic/src/pocket-ic-server-types.ts b/packages/pic/src/pocket-ic-server-types.ts index 8d94e2b..1b7182a 100644 --- a/packages/pic/src/pocket-ic-server-types.ts +++ b/packages/pic/src/pocket-ic-server-types.ts @@ -18,4 +18,11 @@ export interface StartServerOptions { * otherwise the binary downloaded by this package's install script. */ binPath?: string; + + /** + * Time to live of the server in seconds since the last completed operation, + * after which the server shuts down gracefully. + * If not provided, the server's default time to live is used. + */ + ttl?: number; } diff --git a/packages/pic/src/pocket-ic-server.ts b/packages/pic/src/pocket-ic-server.ts index 80065d3..9e7460d 100644 --- a/packages/pic/src/pocket-ic-server.ts +++ b/packages/pic/src/pocket-ic-server.ts @@ -70,7 +70,12 @@ export class PocketIcServer { const picFilePrefix = `pocket_ic_${pid}`; const portFilePath = tmpFile(`${picFilePrefix}.port`); - const serverProcess = spawn(binPath, ['--port-file', portFilePath]); + const serverArgs = ['--port-file', portFilePath]; + if (options.ttl !== undefined) { + serverArgs.push('--ttl', options.ttl.toString()); + } + + const serverProcess = spawn(binPath, serverArgs); if (options.showRuntimeLogs) { serverProcess.stdout.pipe(process.stdout); From 3bc0209529194a55301d1e445a6c075736aa68bb Mon Sep 17 00:00:00 2001 From: Kamil Listopad Date: Wed, 29 Jul 2026 10:46:42 +0200 Subject: [PATCH 2/2] fix(pic): validate ttl before spawning the server Rejects NaN, Infinity, floats and negatives with an InvalidTtlError instead of passing an invalid --ttl arg to the pocket-ic process. --- packages/pic/src/error.ts | 10 ++++++++++ packages/pic/src/pocket-ic-server-types.ts | 1 + packages/pic/src/pocket-ic-server.ts | 5 +++++ 3 files changed, 16 insertions(+) diff --git a/packages/pic/src/error.ts b/packages/pic/src/error.ts index 4158a31..01bc8cf 100644 --- a/packages/pic/src/error.ts +++ b/packages/pic/src/error.ts @@ -67,6 +67,16 @@ export class TopologyValidationError extends Error { } } +export class InvalidTtlError extends Error { + override name = 'InvalidTtlError'; + + constructor(ttl: number) { + super( + `Invalid ttl value ${ttl}. The ttl must be a non-negative integer representing seconds.`, + ); + } +} + export class RetryableError extends Error { override name: string = 'RetryableError'; } diff --git a/packages/pic/src/pocket-ic-server-types.ts b/packages/pic/src/pocket-ic-server-types.ts index 1b7182a..e5c1362 100644 --- a/packages/pic/src/pocket-ic-server-types.ts +++ b/packages/pic/src/pocket-ic-server-types.ts @@ -22,6 +22,7 @@ export interface StartServerOptions { /** * Time to live of the server in seconds since the last completed operation, * after which the server shuts down gracefully. + * Must be a non-negative integer. * If not provided, the server's default time to live is used. */ ttl?: number; diff --git a/packages/pic/src/pocket-ic-server.ts b/packages/pic/src/pocket-ic-server.ts index 9e7460d..b599c2e 100644 --- a/packages/pic/src/pocket-ic-server.ts +++ b/packages/pic/src/pocket-ic-server.ts @@ -6,6 +6,7 @@ import { BinStartError, BinStartMacOSArmError, BinTimeoutError, + InvalidTtlError, } from './error'; import { exists, @@ -72,6 +73,10 @@ export class PocketIcServer { const serverArgs = ['--port-file', portFilePath]; if (options.ttl !== undefined) { + if (!Number.isInteger(options.ttl) || options.ttl < 0) { + throw new InvalidTtlError(options.ttl); + } + serverArgs.push('--ttl', options.ttl.toString()); }