(opts: { graceMs: number; onIdle: () => void })
| 377 | * timer (so a freshly-spawned daemon is not killed before anyone connects). |
| 378 | */ |
| 379 | export function createIdleShutdownHandler(opts: { graceMs: number; onIdle: () => void }): { |
| 380 | onConnectionCountChange(size: number): void; |
| 381 | cancel(): void; |
| 382 | } { |
| 383 | let timer: NodeJS.Timeout | undefined; |
| 384 | let seenClient = false; |
| 385 | |
| 386 | const cancel = (): void => { |
| 387 | if (timer !== undefined) { |
| 388 | clearTimeout(timer); |
| 389 | timer = undefined; |
| 390 | } |
| 391 | }; |
| 392 | |
| 393 | return { |
| 394 | onConnectionCountChange(size: number): void { |
| 395 | if (size > 0) { |
| 396 | seenClient = true; |
| 397 | cancel(); |
| 398 | return; |
| 399 | } |
| 400 | if (seenClient) { |
| 401 | cancel(); |
| 402 | timer = setTimeout(opts.onIdle, opts.graceMs); |
| 403 | } |
| 404 | }, |
| 405 | cancel, |
| 406 | }; |
| 407 | } |
| 408 | |
| 409 | function serverWebAssetsDir(): string { |
| 410 | return resolveServerWebAssetsDir(); |
no outgoing calls
no test coverage detected