PreviewService
Defined in: src/preview.ts:445
Constructors
Section titled “Constructors”Constructor
Section titled “Constructor”new PreviewService(
opts):PreviewService
Defined in: src/preview.ts:456
Parameters
Section titled “Parameters”Returns
Section titled “Returns”PreviewService
Methods
Section titled “Methods”converge()
Section titled “converge()”converge(
active):void
Defined in: src/preview.ts:532
Reconcile to active: ensure each entry, release any bound session absent from it.
Parameters
Section titled “Parameters”active
Section titled “active”object[]
Returns
Section titled “Returns”void
devPortFor()
Section titled “devPortFor()”devPortFor(
sessionId):number|null
Defined in: src/preview.ts:639
Returns the live dev port that the bound listener for sessionId is
currently targeting, or null when the session is not bound.
Parameters
Section titled “Parameters”sessionId
Section titled “sessionId”string
Returns
Section titled “Returns”number | null
ensure()
Section titled “ensure()”ensure(
sessionId,devPort):number|null
Defined in: src/preview.ts:473
Ensure a listener exists for sessionId proxying to devPort.
- Already bound → UPDATE the stored devPort live (no rebind, no onChange); returns the existing preview port.
- Not bound → allocate a free slot, bind a loopback
Bun.serve, fireonChange(sessionId, previewPort), return the port. - Range exhausted → log + return null (never throws).
- Bind error on a slot → try the next free slot; null if all fail.
Parameters
Section titled “Parameters”sessionId
Section titled “sessionId”string
devPort
Section titled “devPort”number
Returns
Section titled “Returns”number | null
idleSince()
Section titled “idleSince()”idleSince(
sessionId,now):number|null
Defined in: src/preview.ts:629
Returns the number of milliseconds since the last proxied HTTP request or
relayed WS frame for sessionId, measured against now. Returns null
when the session is not bound (no listener exists).
CALLER CONTRACT: now MUST share a time base with the clock this service
stamps lastActivityAt with (the injectable now in PreviewServiceOptions).
In production both are Date.now, so callers (the poller) just pass their own
Date.now(). In tests, inject the SAME clock into PreviewService AND pass its
value here — mixing a fake service clock with a real Date.now() here yields
a nonsense delta (a test footgun, not a prod bug).
Parameters
Section titled “Parameters”sessionId
Section titled “sessionId”string
number
Returns
Section titled “Returns”number | null
release()
Section titled “release()”release(
sessionId):void
Defined in: src/preview.ts:514
Tear down a session’s listener and reclaim its slot. Idempotent.
Parameters
Section titled “Parameters”sessionId
Section titled “sessionId”string
Returns
Section titled “Returns”void
snapshot()
Section titled “snapshot()”snapshot():
Record<string,SessionPreviewState>
Defined in: src/preview.ts:541
Live preview snapshot for client bootstrap: bound sessions only.
Returns
Section titled “Returns”Record<string, SessionPreviewState>
stopAll()
Section titled “stopAll()”stopAll():
void
Defined in: src/preview.ts:550
Stop every listener (shutdown / tests). Does NOT fire onChange.
Returns
Section titled “Returns”void