@songfreedom/sse-client 0.0.0-stage → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/client.js ADDED
@@ -0,0 +1,625 @@
1
+ import { SSEError, isRetryableStatus, toSSEError } from "./errors.js";
2
+ import { DEFAULT_MAX_BUFFER_SIZE, createSSEParser, } from "./parser.js";
3
+ const EVENT_STREAM_CONTENT_TYPE = "text/event-stream";
4
+ /** Prevents tight reconnect loops when the server drops the connection immediately. */
5
+ const MIN_RETRY_DELAY = 200;
6
+ /**
7
+ * Server-Sent Events client.
8
+ *
9
+ * - Built on `fetch` + `ReadableStream`, so custom headers and POST bodies work
10
+ * - Reconnects automatically (exponential backoff with jitter); terminal errors
11
+ * such as 401 stop immediately
12
+ * - Resumes with `Last-Event-ID`
13
+ * - Routes events by name to multiple subscribers, so one connection serves many components
14
+ * - Idle watchdog, proactive rotation, offline/background suspension, shared
15
+ * connections (see `acquireSSEClient`)
16
+ */
17
+ export class SSEClient {
18
+ options;
19
+ parser;
20
+ eventFilter;
21
+ state = "idle";
22
+ finished = false;
23
+ running = false;
24
+ suspended = null;
25
+ attempt = 0;
26
+ lastEventIdValue = "";
27
+ serverRetryDelay;
28
+ idleTimedOut = false;
29
+ rotating = false;
30
+ idleTimer = null;
31
+ rotateTimer = null;
32
+ cancelController = new AbortController();
33
+ attemptController = null;
34
+ runPromise = null;
35
+ resumeWaiter = null;
36
+ lifecycleBound = false;
37
+ onVisibilityChange;
38
+ onOffline;
39
+ onOnline;
40
+ messageHandlers = new Set();
41
+ eventHandlers = new Map();
42
+ statusHandlers = new Set();
43
+ errorHandlers = new Set();
44
+ openHandlers = new Set();
45
+ closeHandlers = new Set();
46
+ constructor(options) {
47
+ if (!options?.url) {
48
+ throw new Error("[sse-client] missing required option: url");
49
+ }
50
+ this.options = options;
51
+ this.parser = createSSEParser({
52
+ maxBufferSize: options.maxBufferSize ?? DEFAULT_MAX_BUFFER_SIZE,
53
+ onEvent: (event) => this.handleParsedEvent(event),
54
+ onRetry: (delay) => {
55
+ this.serverRetryDelay = delay;
56
+ },
57
+ });
58
+ this.eventFilter = options.events?.length ? new Set(options.events) : null;
59
+ if (options.onMessage)
60
+ this.onMessage(options.onMessage);
61
+ if (options.onStatus)
62
+ this.onStatus(options.onStatus);
63
+ if (options.onError)
64
+ this.onError(options.onError);
65
+ if (options.onOpen)
66
+ this.onOpen(options.onOpen);
67
+ if (options.onClose)
68
+ this.onClose(options.onClose);
69
+ if (options.autoStart !== false) {
70
+ this.start();
71
+ }
72
+ }
73
+ /** Current state. */
74
+ get status() {
75
+ return this.state;
76
+ }
77
+ /** Whether the client is finally closed and will not reconnect. */
78
+ get closed() {
79
+ return this.finished;
80
+ }
81
+ /** Consecutive retry count; resets once a connection proves stable. */
82
+ get attempts() {
83
+ return this.attempt;
84
+ }
85
+ /** Latest event id, sent back as `Last-Event-ID` on reconnect. */
86
+ get lastEventId() {
87
+ return this.lastEventIdValue;
88
+ }
89
+ /** Resolves when the connection terminates (closed or retries exhausted). Never rejects. */
90
+ get done() {
91
+ return this.runPromise ?? Promise.resolve();
92
+ }
93
+ /** Open the connection. No-op while already running or suspended. */
94
+ start() {
95
+ if (this.running || this.suspended) {
96
+ return this;
97
+ }
98
+ if (this.finished) {
99
+ this.reset();
100
+ }
101
+ // Do not request anything while the page is hidden; wait for visibilitychange.
102
+ // This is the usual case for WebView preloading.
103
+ if (this.options.pauseWhenHidden &&
104
+ typeof document !== "undefined" &&
105
+ document.hidden) {
106
+ this.suspended = "hidden";
107
+ this.setState("idle");
108
+ return this;
109
+ }
110
+ this.running = true;
111
+ this.bindLifecycle();
112
+ this.runPromise = this.connect()
113
+ .catch((error) => {
114
+ // Safety net: a throwing callback must not become an unhandled rejection.
115
+ this.finish("error", toSSEError(error));
116
+ })
117
+ .finally(() => {
118
+ this.running = false;
119
+ });
120
+ return this;
121
+ }
122
+ /** Close the connection and stop reconnecting. */
123
+ close() {
124
+ if (this.finished) {
125
+ return;
126
+ }
127
+ this.finish("user");
128
+ }
129
+ /** Reconnect after closing, keeping `lastEventId` so the server can resume. */
130
+ restart() {
131
+ this.close();
132
+ return this.start();
133
+ }
134
+ on(event, handler) {
135
+ let handlers = this.eventHandlers.get(event);
136
+ if (!handlers) {
137
+ handlers = new Set();
138
+ this.eventHandlers.set(event, handlers);
139
+ }
140
+ handlers.add(handler);
141
+ return () => {
142
+ const current = this.eventHandlers.get(event);
143
+ if (!current) {
144
+ return;
145
+ }
146
+ current.delete(handler);
147
+ if (!current.size) {
148
+ this.eventHandlers.delete(event);
149
+ }
150
+ };
151
+ }
152
+ /** Subscribe to one event name for a single delivery. */
153
+ once(event, handler) {
154
+ const off = this.on(event, (data, message) => {
155
+ off();
156
+ handler(data, message);
157
+ });
158
+ return off;
159
+ }
160
+ /** Subscribe to every message regardless of event name. */
161
+ onMessage(handler) {
162
+ return subscribe(this.messageHandlers, handler);
163
+ }
164
+ onStatus(handler) {
165
+ return subscribe(this.statusHandlers, handler);
166
+ }
167
+ onError(handler) {
168
+ return subscribe(this.errorHandlers, handler);
169
+ }
170
+ onOpen(handler) {
171
+ return subscribe(this.openHandlers, handler);
172
+ }
173
+ onClose(handler) {
174
+ return subscribe(this.closeHandlers, handler);
175
+ }
176
+ // ---------------------------------------------------------------------------
177
+ // Internals
178
+ // ---------------------------------------------------------------------------
179
+ get retryBaseDelay() {
180
+ return this.options.retryBaseDelay ?? 1000;
181
+ }
182
+ get retryMaxDelay() {
183
+ return this.options.retryMaxDelay ?? 30_000;
184
+ }
185
+ get maxRetry() {
186
+ return this.options.maxRetry ?? Infinity;
187
+ }
188
+ get stableAfter() {
189
+ return this.options.stableAfter ?? 10_000;
190
+ }
191
+ get reconnectOnEnd() {
192
+ return this.options.reconnectOnEnd ?? true;
193
+ }
194
+ reset() {
195
+ this.finished = false;
196
+ this.attempt = 0;
197
+ this.idleTimedOut = false;
198
+ this.rotating = false;
199
+ this.suspended = null;
200
+ this.serverRetryDelay = undefined;
201
+ this.clearTimers();
202
+ this.cancelController = new AbortController();
203
+ this.attemptController = null;
204
+ this.parser.reset();
205
+ }
206
+ async connect() {
207
+ while (!this.finished) {
208
+ if (this.suspended) {
209
+ // Do not reconnect while suspended; wait for resume() to wake us up.
210
+ await this.waitForResume();
211
+ continue;
212
+ }
213
+ const startedAt = Date.now();
214
+ this.setState(this.attempt === 0 ? "connecting" : "reconnecting");
215
+ this.attemptController = new AbortController();
216
+ const signal = this.attemptController.signal;
217
+ let failure = null;
218
+ try {
219
+ await this.openOnce(signal);
220
+ }
221
+ catch (error) {
222
+ failure = toSSEError(error);
223
+ }
224
+ this.clearIdle();
225
+ this.clearRotate();
226
+ if (this.finished) {
227
+ return;
228
+ }
229
+ if (this.suspended) {
230
+ this.setState("idle");
231
+ continue;
232
+ }
233
+ // Proactive rotation: reconnect immediately, keeping lastEventId and skipping backoff.
234
+ if (this.rotating) {
235
+ this.rotating = false;
236
+ this.attempt = 0;
237
+ continue;
238
+ }
239
+ // Treat an idle timeout as a retryable network error so a missing
240
+ // heartbeat cannot leave a zombie connection behind.
241
+ if (this.idleTimedOut) {
242
+ this.idleTimedOut = false;
243
+ failure = new SSEError("SSE idle timeout, reconnecting", {
244
+ kind: "heartbeat",
245
+ retryable: true,
246
+ });
247
+ }
248
+ const elapsed = Date.now() - startedAt;
249
+ // A connection that lived long enough means the failure was transient,
250
+ // so reset the retry budget.
251
+ if (elapsed >= this.stableAfter) {
252
+ this.attempt = 0;
253
+ }
254
+ this.attempt += 1;
255
+ if (failure) {
256
+ this.emit(this.errorHandlers, failure, this.attempt);
257
+ }
258
+ if (!failure && !this.reconnectOnEnd) {
259
+ this.finish("end");
260
+ return;
261
+ }
262
+ const delay = await this.decideDelay({
263
+ attempt: this.attempt,
264
+ error: failure ?? undefined,
265
+ elapsed,
266
+ });
267
+ if (delay === false) {
268
+ this.finish(failure ? "error" : "end", failure ?? undefined);
269
+ return;
270
+ }
271
+ this.setState("reconnecting");
272
+ await this.sleep(delay);
273
+ }
274
+ }
275
+ /** Open one connection and read it until the stream ends (throws on failure). */
276
+ async openOnce(signal) {
277
+ const { url, method = "POST", body, fetch: fetchImpl } = this.options;
278
+ const init = {
279
+ method,
280
+ headers: await this.resolveHeaders(),
281
+ body: method === "GET" || body === undefined ? undefined : serializeBody(body),
282
+ signal,
283
+ cache: "no-store",
284
+ credentials: "same-origin",
285
+ };
286
+ const response = fetchImpl ? await fetchImpl(url, init) : await fetch(url, init);
287
+ if (!response.ok) {
288
+ throw new SSEError(`SSE request failed: HTTP ${response.status}`, {
289
+ kind: "http",
290
+ status: response.status,
291
+ retryable: isRetryableStatus(response.status),
292
+ });
293
+ }
294
+ if (this.options.strictContentType !== false) {
295
+ const contentType = (response.headers.get("content-type") ?? "").toLowerCase();
296
+ if (!contentType.startsWith(EVENT_STREAM_CONTENT_TYPE)) {
297
+ // Two usual causes: a gateway/auth page returned HTML, or the backend
298
+ // did not declare produces.
299
+ throw new SSEError(`SSE response content-type is not ${EVENT_STREAM_CONTENT_TYPE} (got "${contentType || "(empty)"}")`, { kind: "protocol", status: response.status, retryable: false });
300
+ }
301
+ }
302
+ if (!response.body) {
303
+ throw new SSEError("Streaming is not supported in this environment (response.body is null)", {
304
+ kind: "protocol",
305
+ status: response.status,
306
+ retryable: false,
307
+ });
308
+ }
309
+ this.setState("open");
310
+ this.armRotate();
311
+ this.emit(this.openHandlers, response);
312
+ this.parser.reset();
313
+ const reader = response.body.getReader();
314
+ // Decode in streaming mode so multi-byte characters split across chunks survive.
315
+ const decoder = new TextDecoder("utf-8");
316
+ this.armIdle();
317
+ try {
318
+ for (;;) {
319
+ const { done, value } = await reader.read();
320
+ if (done) {
321
+ break;
322
+ }
323
+ this.armIdle();
324
+ this.parser.feed(decoder.decode(value, { stream: true }));
325
+ if (this.parser.overflowed) {
326
+ // The server never terminates a line, or a single message is huge;
327
+ // reconnecting would not help.
328
+ throw new SSEError("SSE buffer size limit exceeded, connection reset", {
329
+ kind: "protocol",
330
+ retryable: false,
331
+ });
332
+ }
333
+ }
334
+ this.parser.feed(decoder.decode());
335
+ }
336
+ finally {
337
+ try {
338
+ reader.releaseLock();
339
+ }
340
+ catch {
341
+ // releaseLock can throw after an abort; that is fine.
342
+ }
343
+ this.clearIdle();
344
+ this.clearRotate();
345
+ }
346
+ }
347
+ async resolveHeaders() {
348
+ const { headers, method = "POST" } = this.options;
349
+ const extra = typeof headers === "function" ? await headers() : headers;
350
+ const resolved = new Headers(extra);
351
+ if (!resolved.has("Accept")) {
352
+ resolved.set("Accept", EVENT_STREAM_CONTENT_TYPE);
353
+ }
354
+ if (method !== "GET" && !resolved.has("Content-Type")) {
355
+ resolved.set("Content-Type", "application/json");
356
+ }
357
+ if (this.lastEventIdValue) {
358
+ resolved.set("Last-Event-ID", this.lastEventIdValue);
359
+ }
360
+ return resolved;
361
+ }
362
+ handleParsedEvent(event) {
363
+ // Check the end sentinel before parsing: `[DONE]` is not valid JSON and
364
+ // would make the parser throw.
365
+ if (this.options.endSignal !== undefined && event.data === this.options.endSignal) {
366
+ this.finish("end");
367
+ return;
368
+ }
369
+ let data = event.data;
370
+ if (this.options.parse) {
371
+ try {
372
+ data = this.options.parse(event.data);
373
+ }
374
+ catch (error) {
375
+ this.reportHandlerError(error);
376
+ return;
377
+ }
378
+ }
379
+ const id = event.id || this.lastEventIdValue;
380
+ if (id) {
381
+ this.lastEventIdValue = id;
382
+ }
383
+ const name = event.event || "message";
384
+ // Filter after updating the id so the resume position never moves backwards.
385
+ if (this.eventFilter && !this.eventFilter.has(name)) {
386
+ return;
387
+ }
388
+ this.dispatch({
389
+ id,
390
+ event: name,
391
+ data,
392
+ raw: event.data,
393
+ receivedAt: Date.now(),
394
+ });
395
+ }
396
+ dispatch(message) {
397
+ this.emit(this.messageHandlers, message);
398
+ const named = this.eventHandlers.get(message.event);
399
+ if (named) {
400
+ for (const handler of [...named]) {
401
+ this.safeCall(handler, message.data, message);
402
+ }
403
+ }
404
+ if (message.event !== "*") {
405
+ const wildcard = this.eventHandlers.get("*");
406
+ if (wildcard) {
407
+ for (const handler of [...wildcard]) {
408
+ this.safeCall(handler, message.data, message);
409
+ }
410
+ }
411
+ }
412
+ }
413
+ emit(handlers, ...args) {
414
+ for (const handler of [...handlers]) {
415
+ this.safeCall(handler, ...args);
416
+ }
417
+ }
418
+ safeCall(handler, ...args) {
419
+ try {
420
+ handler(...args);
421
+ }
422
+ catch (error) {
423
+ this.reportHandlerError(error);
424
+ }
425
+ }
426
+ reportHandlerError(error) {
427
+ if (this.options.onHandlerError) {
428
+ this.options.onHandlerError(error);
429
+ return;
430
+ }
431
+ console.error("[sse-client] a callback threw", error);
432
+ }
433
+ async decideDelay(context) {
434
+ if (this.options.retry) {
435
+ return await this.options.retry(context);
436
+ }
437
+ if (context.error && !context.error.retryable) {
438
+ return false;
439
+ }
440
+ if (context.attempt > this.maxRetry) {
441
+ return false;
442
+ }
443
+ return this.nextDelay(context.attempt);
444
+ }
445
+ /** Reconnect delay: the server's `retry:` wins, otherwise exponential backoff with ±20% jitter. */
446
+ nextDelay(attempt) {
447
+ if (this.serverRetryDelay !== undefined) {
448
+ return Math.max(Math.min(this.serverRetryDelay, this.retryMaxDelay), MIN_RETRY_DELAY);
449
+ }
450
+ const exponential = Math.min(this.retryMaxDelay, this.retryBaseDelay * 2 ** (attempt - 1));
451
+ const jittered = Math.round(exponential * (0.8 + Math.random() * 0.4));
452
+ return Math.max(jittered, MIN_RETRY_DELAY);
453
+ }
454
+ sleep(delay) {
455
+ return new Promise((resolve) => {
456
+ if (this.finished) {
457
+ resolve();
458
+ return;
459
+ }
460
+ const onCancel = () => {
461
+ clearTimeout(timer);
462
+ resolve();
463
+ };
464
+ const timer = setTimeout(() => {
465
+ this.cancelController.signal.removeEventListener("abort", onCancel);
466
+ resolve();
467
+ }, delay);
468
+ this.cancelController.signal.addEventListener("abort", onCancel, { once: true });
469
+ });
470
+ }
471
+ waitForResume() {
472
+ if (this.finished) {
473
+ return Promise.resolve();
474
+ }
475
+ return new Promise((resolve) => {
476
+ // Only resume() / finish() wake this up, so the loop never exits while suspended.
477
+ this.resumeWaiter = resolve;
478
+ });
479
+ }
480
+ armIdle() {
481
+ const timeout = this.options.idleTimeout ?? 0;
482
+ if (!timeout) {
483
+ return;
484
+ }
485
+ this.clearIdle();
486
+ this.idleTimer = setTimeout(() => {
487
+ this.idleTimedOut = true;
488
+ this.attemptController?.abort();
489
+ }, timeout);
490
+ }
491
+ armRotate() {
492
+ const interval = this.options.rotateInterval ?? 0;
493
+ if (!interval) {
494
+ return;
495
+ }
496
+ this.clearRotate();
497
+ this.rotateTimer = setTimeout(() => {
498
+ this.rotating = true;
499
+ this.attemptController?.abort();
500
+ }, interval);
501
+ }
502
+ clearIdle() {
503
+ if (this.idleTimer) {
504
+ clearTimeout(this.idleTimer);
505
+ this.idleTimer = null;
506
+ }
507
+ }
508
+ clearRotate() {
509
+ if (this.rotateTimer) {
510
+ clearTimeout(this.rotateTimer);
511
+ this.rotateTimer = null;
512
+ }
513
+ }
514
+ clearTimers() {
515
+ this.clearIdle();
516
+ this.clearRotate();
517
+ }
518
+ setState(next) {
519
+ if (this.state === next) {
520
+ return;
521
+ }
522
+ this.state = next;
523
+ this.emit(this.statusHandlers, next);
524
+ }
525
+ // ---------------------------------------------------------------------------
526
+ // Offline / background handling
527
+ // ---------------------------------------------------------------------------
528
+ /** Network state is always observed: no reconnects while offline, an immediate one when back online. */
529
+ bindLifecycle() {
530
+ if (this.lifecycleBound) {
531
+ return;
532
+ }
533
+ this.lifecycleBound = true;
534
+ if (typeof window !== "undefined" && typeof window.addEventListener === "function") {
535
+ this.onOffline = () => this.suspend("offline");
536
+ this.onOnline = () => {
537
+ if (this.suspended === "offline") {
538
+ this.resume();
539
+ }
540
+ };
541
+ window.addEventListener("offline", this.onOffline);
542
+ window.addEventListener("online", this.onOnline);
543
+ }
544
+ if (this.options.pauseWhenHidden &&
545
+ typeof document !== "undefined" &&
546
+ typeof document.addEventListener === "function") {
547
+ this.onVisibilityChange = () => {
548
+ if (document.hidden) {
549
+ this.suspend("hidden");
550
+ }
551
+ else if (this.suspended === "hidden") {
552
+ this.resume();
553
+ }
554
+ };
555
+ document.addEventListener("visibilitychange", this.onVisibilityChange);
556
+ }
557
+ }
558
+ unbindLifecycle() {
559
+ if (typeof window !== "undefined" && typeof window.removeEventListener === "function") {
560
+ if (this.onOffline)
561
+ window.removeEventListener("offline", this.onOffline);
562
+ if (this.onOnline)
563
+ window.removeEventListener("online", this.onOnline);
564
+ }
565
+ if (this.onVisibilityChange && typeof document !== "undefined") {
566
+ document.removeEventListener("visibilitychange", this.onVisibilityChange);
567
+ }
568
+ this.onOffline = undefined;
569
+ this.onOnline = undefined;
570
+ this.onVisibilityChange = undefined;
571
+ this.lifecycleBound = false;
572
+ }
573
+ suspend(reason) {
574
+ if (this.finished || this.suspended) {
575
+ return;
576
+ }
577
+ this.suspended = reason;
578
+ this.clearTimers();
579
+ this.attemptController?.abort();
580
+ this.setState("idle");
581
+ }
582
+ resume() {
583
+ if (this.finished) {
584
+ return;
585
+ }
586
+ this.suspended = null;
587
+ this.attempt = 0;
588
+ if (this.running) {
589
+ this.resumeWaiter?.();
590
+ this.resumeWaiter = null;
591
+ return;
592
+ }
593
+ this.start();
594
+ }
595
+ finish(reason, error) {
596
+ if (this.finished) {
597
+ return;
598
+ }
599
+ this.finished = true;
600
+ this.clearTimers();
601
+ this.unbindLifecycle();
602
+ this.cancelController.abort();
603
+ this.attemptController?.abort();
604
+ // Wake the connection loop in case it is waiting on a suspended state.
605
+ this.resumeWaiter?.();
606
+ this.resumeWaiter = null;
607
+ this.setState("closed");
608
+ this.emit(this.closeHandlers, reason, error);
609
+ }
610
+ }
611
+ /** Serialize the body: strings / Blob / FormData pass through, everything else becomes JSON. */
612
+ function serializeBody(body) {
613
+ if (typeof body === "string" || body instanceof Blob || body instanceof FormData) {
614
+ return body;
615
+ }
616
+ return JSON.stringify(body);
617
+ }
618
+ /** Shared subscribe/unsubscribe implementation. */
619
+ function subscribe(handlers, handler) {
620
+ handlers.add(handler);
621
+ return () => {
622
+ handlers.delete(handler);
623
+ };
624
+ }
625
+ //# sourceMappingURL=client.js.map
package/client.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}