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 8d94e2b..e5c1362 100644 --- a/packages/pic/src/pocket-ic-server-types.ts +++ b/packages/pic/src/pocket-ic-server-types.ts @@ -18,4 +18,12 @@ 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. + * 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 80065d3..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, @@ -70,7 +71,16 @@ 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) { + if (!Number.isInteger(options.ttl) || options.ttl < 0) { + throw new InvalidTtlError(options.ttl); + } + + serverArgs.push('--ttl', options.ttl.toString()); + } + + const serverProcess = spawn(binPath, serverArgs); if (options.showRuntimeLogs) { serverProcess.stdout.pipe(process.stdout);