@vielzeug/courier 1.1.4 → 2.0.0

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.
Files changed (131) hide show
  1. package/README.md +10 -12
  2. package/dist/_dev.cjs +1 -1
  3. package/dist/_dev.cjs.map +1 -1
  4. package/dist/_dev.js +1 -1
  5. package/dist/_dev.js.map +1 -1
  6. package/dist/api.cjs +1 -1
  7. package/dist/api.cjs.map +1 -1
  8. package/dist/api.d.ts +4 -7
  9. package/dist/api.d.ts.map +1 -1
  10. package/dist/api.js +1 -1
  11. package/dist/api.js.map +1 -1
  12. package/dist/courier.cjs +5 -6
  13. package/dist/courier.cjs.map +1 -1
  14. package/dist/courier.d.ts +20 -142
  15. package/dist/courier.d.ts.map +1 -1
  16. package/dist/courier.iife.js +5 -6
  17. package/dist/courier.iife.js.map +1 -1
  18. package/dist/courier.js +5 -6
  19. package/dist/courier.js.map +1 -1
  20. package/dist/devtools.cjs.map +1 -1
  21. package/dist/devtools.d.ts +0 -28
  22. package/dist/devtools.d.ts.map +1 -1
  23. package/dist/devtools.js.map +1 -1
  24. package/dist/errors.cjs +1 -1
  25. package/dist/errors.cjs.map +1 -1
  26. package/dist/errors.d.ts +0 -3
  27. package/dist/errors.d.ts.map +1 -1
  28. package/dist/errors.js +1 -1
  29. package/dist/errors.js.map +1 -1
  30. package/dist/index.cjs +1 -1
  31. package/dist/index.d.ts +6 -22
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +1 -1
  34. package/dist/interceptors.cjs +1 -1
  35. package/dist/interceptors.cjs.map +1 -1
  36. package/dist/interceptors.js +1 -1
  37. package/dist/interceptors.js.map +1 -1
  38. package/dist/query.cjs +1 -1
  39. package/dist/query.cjs.map +1 -1
  40. package/dist/query.d.ts +8 -101
  41. package/dist/query.d.ts.map +1 -1
  42. package/dist/query.js +1 -1
  43. package/dist/query.js.map +1 -1
  44. package/dist/serialize.cjs +1 -1
  45. package/dist/serialize.cjs.map +1 -1
  46. package/dist/serialize.d.ts +1 -1
  47. package/dist/serialize.d.ts.map +1 -1
  48. package/dist/serialize.js +1 -1
  49. package/dist/serialize.js.map +1 -1
  50. package/dist/stream.cjs +5 -1
  51. package/dist/stream.cjs.map +1 -1
  52. package/dist/stream.d.ts +22 -39
  53. package/dist/stream.d.ts.map +1 -1
  54. package/dist/stream.js +5 -1
  55. package/dist/stream.js.map +1 -1
  56. package/dist/transport.cjs.map +1 -1
  57. package/dist/transport.d.ts +1 -1
  58. package/dist/transport.js.map +1 -1
  59. package/dist/types.d.ts +38 -46
  60. package/dist/types.d.ts.map +1 -1
  61. package/dist/url.cjs.map +1 -1
  62. package/dist/url.d.ts +0 -9
  63. package/dist/url.d.ts.map +1 -1
  64. package/dist/url.js.map +1 -1
  65. package/package.json +4 -4
  66. package/dist/batcher.cjs +0 -2
  67. package/dist/batcher.cjs.map +0 -1
  68. package/dist/batcher.d.ts +0 -66
  69. package/dist/batcher.d.ts.map +0 -1
  70. package/dist/batcher.js +0 -2
  71. package/dist/batcher.js.map +0 -1
  72. package/dist/focus.cjs +0 -2
  73. package/dist/focus.cjs.map +0 -1
  74. package/dist/focus.d.ts +0 -25
  75. package/dist/focus.d.ts.map +0 -1
  76. package/dist/focus.js +0 -2
  77. package/dist/focus.js.map +0 -1
  78. package/dist/mutation.cjs +0 -2
  79. package/dist/mutation.cjs.map +0 -1
  80. package/dist/mutation.d.ts +0 -81
  81. package/dist/mutation.d.ts.map +0 -1
  82. package/dist/mutation.js +0 -2
  83. package/dist/mutation.js.map +0 -1
  84. package/dist/persist.cjs +0 -2
  85. package/dist/persist.cjs.map +0 -1
  86. package/dist/persist.d.ts +0 -86
  87. package/dist/persist.d.ts.map +0 -1
  88. package/dist/persist.js +0 -2
  89. package/dist/persist.js.map +0 -1
  90. package/dist/query-cache.cjs +0 -2
  91. package/dist/query-cache.cjs.map +0 -1
  92. package/dist/query-cache.d.ts +0 -88
  93. package/dist/query-cache.d.ts.map +0 -1
  94. package/dist/query-cache.js +0 -2
  95. package/dist/query-cache.js.map +0 -1
  96. package/dist/query-observe.cjs +0 -2
  97. package/dist/query-observe.cjs.map +0 -1
  98. package/dist/query-observe.d.ts +0 -17
  99. package/dist/query-observe.d.ts.map +0 -1
  100. package/dist/query-observe.js +0 -2
  101. package/dist/query-observe.js.map +0 -1
  102. package/dist/retry.cjs +0 -2
  103. package/dist/retry.cjs.map +0 -1
  104. package/dist/retry.d.ts +0 -34
  105. package/dist/retry.d.ts.map +0 -1
  106. package/dist/retry.js +0 -2
  107. package/dist/retry.js.map +0 -1
  108. package/dist/stream-readable.cjs +0 -3
  109. package/dist/stream-readable.cjs.map +0 -1
  110. package/dist/stream-readable.d.ts +0 -46
  111. package/dist/stream-readable.d.ts.map +0 -1
  112. package/dist/stream-readable.js +0 -3
  113. package/dist/stream-readable.js.map +0 -1
  114. package/dist/stream-shared.cjs +0 -2
  115. package/dist/stream-shared.cjs.map +0 -1
  116. package/dist/stream-shared.d.ts +0 -41
  117. package/dist/stream-shared.d.ts.map +0 -1
  118. package/dist/stream-shared.js +0 -2
  119. package/dist/stream-shared.js.map +0 -1
  120. package/dist/stream-sse.cjs +0 -6
  121. package/dist/stream-sse.cjs.map +0 -1
  122. package/dist/stream-sse.d.ts +0 -59
  123. package/dist/stream-sse.d.ts.map +0 -1
  124. package/dist/stream-sse.js +0 -6
  125. package/dist/stream-sse.js.map +0 -1
  126. package/dist/sync-store.cjs +0 -2
  127. package/dist/sync-store.cjs.map +0 -1
  128. package/dist/sync-store.d.ts +0 -20
  129. package/dist/sync-store.d.ts.map +0 -1
  130. package/dist/sync-store.js +0 -2
  131. package/dist/sync-store.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"stream-sse.js","names":[],"sources":["../src/stream-sse.ts"],"sourcesContent":["import { sleep } from '@vielzeug/arsenal';\n\nimport type { Params } from './url';\n\nimport { CourierDisposedError } from './errors';\nimport { fullJitterDelay } from './retry';\nimport { openStreamWith, type ReconnectOptions, type StreamRequestConfig } from './stream-shared';\nimport { type TransportCore, validateTimeout } from './transport';\n\nexport type SseOptions<P extends string = string> = StreamRequestConfig<P> & {\n /**\n * Called when the connection is permanently lost (reconnect budget exhausted due to error).\n * Not called on `dispose()`.\n */\n onError?: (error: Error) => void;\n /**\n * Auto-reconnect on connection loss with exponential backoff.\n * `true` uses defaults (5 attempts). Defaults to `false`.\n */\n reconnect?: boolean | ReconnectOptions;\n};\n\n/** Connection lifecycle status for an SSE source. */\nexport type SseStatus = 'connecting' | 'open' | 'reconnecting' | 'closed';\n\n/**\n * Typed SSE event source. `TEvents` maps event name → data type.\n * Non-string data values are automatically JSON-parsed from the raw `data:` field.\n * If parsing fails the raw string is delivered instead.\n */\nexport type SseSource<TEvents extends Record<string, unknown> = Record<string, string>> = {\n [Symbol.dispose](): void;\n /** `true` after `dispose()` is called or the reconnect budget is exhausted. */\n readonly closed: boolean;\n /** Permanently closes the SSE connection. No further events will be dispatched. */\n dispose(): void;\n /**\n * Registers a handler for a named SSE event. Returns an unsubscribe function.\n * The special name `'message'` matches events without an explicit `event:` field.\n * Calling `on()` after `dispose()` returns a no-op unsubscribe.\n */\n on<K extends keyof TEvents & string>(event: K, handler: (data: TEvents[K]) => void): () => void;\n /** Current connection lifecycle status. Useful for displaying a live-connection indicator. */\n readonly status: SseStatus;\n};\n\n/** Parse a raw SSE data string: try JSON, fall back to raw string. */\nfunction parseEventData(raw: string): unknown {\n try {\n return JSON.parse(raw);\n } catch {\n return raw;\n }\n}\n\n/**\n * Opens a Server-Sent Events connection and returns a typed source.\n *\n * - Intercepts request through the same pipeline as `createApi` (auth, logging, etc.)\n * - Auto-reconnects with exponential backoff when `reconnect` is set\n * - Sends `Last-Event-ID` header on reconnect to resume from last received event\n * - Non-string event data is automatically JSON-parsed\n *\n * @example\n * ```ts\n * const src = stream.sse<{ message: { text: string }; ping: null }>('/events', {\n * reconnect: true,\n * onError: (err) => console.error(err),\n * });\n *\n * src.on('message', (data) => console.log(data.text));\n * src.on('ping', () => {});\n * // later:\n * src.dispose();\n * ```\n */\nexport function sse<TEvents extends Record<string, unknown> = Record<string, string>, P extends string = string>(\n transport: TransportCore,\n url: P,\n config: SseOptions<P> = {} as SseOptions<P>,\n): SseSource<TEvents> {\n if (transport.disposed) throw new CourierDisposedError('StreamClient');\n\n const {\n body,\n fetchInit,\n headers: perRequestHeaders,\n method = body !== undefined ? 'POST' : 'GET',\n onError,\n params,\n query,\n reconnect = false,\n signal: extSignal,\n timeout: cfgTimeout,\n } = config as SseOptions;\n\n if (cfgTimeout !== undefined) validateTimeout(cfgTimeout);\n\n const listeners = new Map<string, Set<(data: unknown) => void>>();\n const ac = new AbortController();\n // Track `ac` once for the entire SSE lifetime — covers active connections AND\n // reconnect sleep windows, so cancelAll()/dispose() always reach it.\n const untrack = transport.track(ac);\n let closed = false;\n let sseStatus: SseStatus = 'connecting';\n let lastEventId = '';\n\n const reconnectOpts: ReconnectOptions = reconnect === true ? {} : reconnect === false ? { times: 0 } : reconnect;\n const maxReconnects = reconnectOpts.times ?? (reconnect ? 5 : 0);\n // `activeReconnectDelay` is mutable so the server's `retry:` field can update\n // the reconnection interval without the caller needing to handle it manually.\n let activeReconnectDelay: number | ((attempt: number) => number) = reconnectOpts.delay ?? fullJitterDelay;\n\n function dispatchEvent(event: string, rawData: string): void {\n const handlers = listeners.get(event);\n\n if (!handlers?.size) return;\n\n const data = parseEventData(rawData);\n\n for (const handler of handlers) handler(data);\n }\n\n async function connect(): Promise<void> {\n const res = await openStreamWith(\n transport,\n url,\n ac,\n {\n body,\n extSignal,\n fetchInit,\n headers: perRequestHeaders as Record<string, string> | undefined,\n method,\n params: params as Params | undefined,\n query,\n timeout: cfgTimeout,\n },\n {\n accept: 'text/event-stream',\n 'cache-control': 'no-cache',\n ...(lastEventId ? { 'last-event-id': lastEventId } : {}),\n },\n );\n\n const reader = res.body!.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n let currentEvent = 'message';\n let currentData = '';\n let currentId = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) break;\n\n // Normalise \\r\\n and \\r to \\n before processing\n buffer += decoder.decode(value, { stream: true }).replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n\n let nlIdx: number;\n\n while ((nlIdx = buffer.indexOf('\\n')) !== -1) {\n const line = buffer.slice(0, nlIdx);\n\n buffer = buffer.slice(nlIdx + 1);\n\n if (line === '') {\n // Empty line → dispatch event\n if (currentData !== '') {\n if (currentId) lastEventId = currentId;\n\n dispatchEvent(currentEvent, currentData.replace(/\\n$/, ''));\n }\n\n currentEvent = 'message';\n currentData = '';\n currentId = '';\n } else if (line.startsWith(':')) {\n // Comment — ignore\n } else {\n const colonIdx = line.indexOf(':');\n const field = colonIdx === -1 ? line : line.slice(0, colonIdx);\n const value = colonIdx === -1 ? '' : line.slice(colonIdx + 1).replace(/^ /, '');\n\n if (field === 'event') currentEvent = value;\n else if (field === 'data') currentData += (currentData ? '\\n' : '') + value;\n else if (field === 'id' && !value.includes('\\0')) currentId = value;\n else if (field === 'retry') {\n // Honor the server's advised reconnect interval (SSE spec §9.2.6).\n const ms = parseInt(value, 10);\n\n if (!Number.isNaN(ms)) activeReconnectDelay = ms;\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n async function run(): Promise<void> {\n let attempt = 0;\n\n try {\n while (!closed && !transport.disposed && !ac.signal.aborted) {\n let connectError: Error | undefined;\n\n sseStatus = 'connecting';\n\n try {\n sseStatus = 'open';\n await connect();\n // Clean server-side close — falls through to reconnect logic below.\n // The attempt counter is intentionally NOT reset here: `times`\n // bounds total reconnects regardless of whether the close was clean or an\n // error, preventing infinite reconnection against servers that always close\n // after a response window (e.g. SSE keepalive patterns).\n } catch (err) {\n if (closed || transport.disposed || ac.signal.aborted) break;\n\n connectError = err instanceof Error ? err : new Error(String(err));\n }\n\n if (closed || transport.disposed || ac.signal.aborted) break;\n\n // No reconnect budget → fire onError for errors, stop either way\n if (maxReconnects === 0) {\n if (connectError) onError?.(connectError);\n\n break;\n }\n\n // Budget exhausted → always signal via onError so the caller knows\n // the reconnect cycle has ended (whether the close was clean or not).\n if (attempt >= maxReconnects) {\n onError?.(connectError ?? new Error('[courier] SSE reconnect budget exhausted'));\n\n break;\n }\n\n // Budget available → sleep and retry\n sseStatus = 'reconnecting';\n\n const delay = typeof activeReconnectDelay === 'function' ? activeReconnectDelay(attempt) : activeReconnectDelay;\n\n attempt++;\n await sleep(delay, ac.signal).catch(() => {});\n }\n } finally {\n sseStatus = 'closed';\n untrack();\n }\n }\n\n // Surface unexpected programming errors (not network failures) via onError\n run().catch((err) => {\n if (!closed && !transport.disposed) {\n onError?.(err instanceof Error ? err : new Error(String(err)));\n }\n });\n\n return {\n get closed(): boolean {\n return closed;\n },\n\n dispose(): void {\n closed = true;\n ac.abort();\n listeners.clear();\n },\n\n on<K extends keyof TEvents & string>(event: K, handler: (data: TEvents[K]) => void): () => void {\n // After dispose(), return a no-op to avoid silent dead-listener bugs\n if (closed) return () => {};\n\n let set = listeners.get(event);\n\n if (!set) {\n set = new Set<(data: unknown) => void>();\n listeners.set(event, set);\n }\n\n set.add(handler as (data: unknown) => void);\n\n return () => set.delete(handler as (data: unknown) => void);\n },\n\n get status(): SseStatus {\n return sseStatus;\n },\n\n [Symbol.dispose](): void {\n this.dispose();\n },\n };\n}\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- function e(e){return{peek:()=>e.peek(),subscribe:t=>e.subscribe(t)}}exports.toSyncStore=e;
2
- //# sourceMappingURL=sync-store.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sync-store.cjs","names":[],"sources":["../src/sync-store.ts"],"sourcesContent":["import type { SyncStore, Unsubscribe } from './types';\n\n/**\n * Converts any object with `peek()` and `subscribe()` methods into a plain\n * `SyncStore<T>` suitable for framework integration adapters.\n *\n * @example\n * ```ts\n * // React\n * const store = toSyncStore(mutation);\n * const state = useSyncExternalStore(store.subscribe, store.peek);\n *\n * // Svelte\n * const readable = toSyncStore(mutation);\n * ```\n */\nexport function toSyncStore<T>(source: { peek(): T; subscribe(cb: () => void): Unsubscribe }): SyncStore<T> {\n return {\n peek: () => source.peek(),\n subscribe: (cb) => source.subscribe(cb),\n };\n}\n"],"mappings":"AAgBA,SAAgB,EAAe,EAA6E,CAC1G,MAAO,CACL,SAAY,EAAO,KAAK,EACxB,UAAY,GAAO,EAAO,UAAU,CAAE,CACxC,CACF"}
@@ -1,20 +0,0 @@
1
- import type { SyncStore, Unsubscribe } from './types';
2
- /**
3
- * Converts any object with `peek()` and `subscribe()` methods into a plain
4
- * `SyncStore<T>` suitable for framework integration adapters.
5
- *
6
- * @example
7
- * ```ts
8
- * // React
9
- * const store = toSyncStore(mutation);
10
- * const state = useSyncExternalStore(store.subscribe, store.peek);
11
- *
12
- * // Svelte
13
- * const readable = toSyncStore(mutation);
14
- * ```
15
- */
16
- export declare function toSyncStore<T>(source: {
17
- peek(): T;
18
- subscribe(cb: () => void): Unsubscribe;
19
- }): SyncStore<T>;
20
- //# sourceMappingURL=sync-store.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sync-store.d.ts","sourceRoot":"","sources":["../src/sync-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEtD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE;IAAE,IAAI,IAAI,CAAC,CAAC;IAAC,SAAS,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,WAAW,CAAA;CAAE,GAAG,SAAS,CAAC,CAAC,CAAC,CAK1G"}
@@ -1,2 +0,0 @@
1
- function e(e){return{peek:()=>e.peek(),subscribe:t=>e.subscribe(t)}}export{e as toSyncStore};
2
- //# sourceMappingURL=sync-store.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sync-store.js","names":[],"sources":["../src/sync-store.ts"],"sourcesContent":["import type { SyncStore, Unsubscribe } from './types';\n\n/**\n * Converts any object with `peek()` and `subscribe()` methods into a plain\n * `SyncStore<T>` suitable for framework integration adapters.\n *\n * @example\n * ```ts\n * // React\n * const store = toSyncStore(mutation);\n * const state = useSyncExternalStore(store.subscribe, store.peek);\n *\n * // Svelte\n * const readable = toSyncStore(mutation);\n * ```\n */\nexport function toSyncStore<T>(source: { peek(): T; subscribe(cb: () => void): Unsubscribe }): SyncStore<T> {\n return {\n peek: () => source.peek(),\n subscribe: (cb) => source.subscribe(cb),\n };\n}\n"],"mappings":"AAgBA,SAAgB,EAAe,EAA6E,CAC1G,MAAO,CACL,SAAY,EAAO,KAAK,EACxB,UAAY,GAAO,EAAO,UAAU,CAAE,CACxC,CACF"}