forked from unom/punktfunk
fix(plugin-kit): SSE keepalive must outpace Bun's idle timeout (0.1.4)
servePluginUi's Bun.serve leaves idleTimeout at Bun's 10s default, so the old 15s keepalive could never arrive — an idle status feed was closed before its first ping, which is exactly what a live host showed. Default is now 5s. Also adds the regression suite that should have caught it: the original test only covered a finite, self-driving stream. The new one exercises the production shape (PubSub-backed, published after the response opens) plus the keepalive — with a reader that does not re-enter read(), which is what made the first version of this test lie. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -12,7 +12,11 @@ export interface SseRouteOptions<A> {
|
||||
readonly event?: string;
|
||||
/** Serialize one item (default JSON.stringify). */
|
||||
readonly encode?: (a: A) => string;
|
||||
/** Keepalive comment cadence in seconds (default 15; 0 disables). */
|
||||
/**
|
||||
* Keepalive comment cadence in seconds (0 disables). Default 5 — deliberately below
|
||||
* Bun's 10 s default `idleTimeout`, which `servePluginUi`'s server does not raise:
|
||||
* a slower ping never arrives, because the idle connection is closed first.
|
||||
*/
|
||||
readonly pingSeconds?: number;
|
||||
}
|
||||
|
||||
@@ -27,7 +31,7 @@ export const sseRoute = <A>(
|
||||
): Layer.Layer<never, never, HttpRouter.HttpRouter> => {
|
||||
const event = opts?.event ?? "message";
|
||||
const encode = opts?.encode ?? ((a: A) => JSON.stringify(a));
|
||||
const pingSeconds = opts?.pingSeconds ?? 15;
|
||||
const pingSeconds = opts?.pingSeconds ?? 5;
|
||||
|
||||
const frames = stream.pipe(
|
||||
Stream.map((a) => `event: ${event}\ndata: ${encode(a)}\n\n`),
|
||||
|
||||
Reference in New Issue
Block a user