@vobs/http 1.2.1 → 1.2.2

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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../reactivity/src/debug.ts","../../reactivity/src/scheduler.ts","../../runtime/src/debug.ts","../../runtime/src/hmr.ts","../../vobs/src/app.ts","../src/stream.ts","../src/debug.ts","../src/index.ts"],"names":["effect","state"],"mappings":"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","file":"index.js","sourcesContent":["import type { Effect } from './effect'\nimport type { Owner } from './owner'\nimport type { Dependency, ReadableSignal, Subscriber } from './signal'\n\nexport interface ReactivityDebugHooks {\n ownerCreated?(owner: Owner): void\n ownerNamed?(owner: Owner, name: string): void\n ownerDisposed?(owner: Owner): void\n signalCreated?(signal: ReadableSignal<unknown>, owner: Owner | null): void\n signalNamed?(signal: ReadableSignal<unknown>, name: string): void\n signalRead?(signal: ReadableSignal<unknown>, subscriber: Subscriber): void\n signalChanged?(signal: ReadableSignal<unknown>, previousValue: unknown, nextValue: unknown): void\n signalDisposed?(signal: ReadableSignal<unknown>): void\n dependencyTracked?(dependency: Dependency, subscriber: Subscriber): void\n dependencyUntracked?(dependency: Dependency, subscriber: Subscriber): void\n effectCreated?(effect: Effect, owner: Owner | null): void\n effectInvalidated?(effect: Effect): void\n effectRunStart?(effect: Effect): void\n effectRunEnd?(effect: Effect, error?: unknown, handled?: boolean): void\n effectDisposed?(effect: Effect): void\n memoCreated?(signal: ReadableSignal<unknown>, subscriber: Subscriber, owner: Owner | null): void\n memoInvalidated?(signal: ReadableSignal<unknown>): void\n flushStart?(): void\n flushEnd?(): void\n}\n\nlet activeDebugHooks: ReactivityDebugHooks | null = null\nconst signalNames = new WeakMap<object, string>()\n\nexport function setDebugHooks(hooks: ReactivityDebugHooks | null): ReactivityDebugHooks | null {\n const previous = activeDebugHooks\n activeDebugHooks = hooks\n return previous\n}\n\nexport function getDebugHooks(): ReactivityDebugHooks | null {\n return activeDebugHooks\n}\n\n/** 热路径守卫:无 hooks 时跳过 invokeDebug 调用,避免 rest 参数数组分配。 */\nexport function hasDebugHooks(): boolean {\n return activeDebugHooks !== null\n}\n\nexport function setSignalDebugName(signal: ReadableSignal<unknown>, name: string): void {\n signalNames.set(signal, name)\n invokeDebug('signalNamed', signal, name)\n}\n\nexport function getSignalDebugName(signal: ReadableSignal<unknown>): string | undefined {\n return signalNames.get(signal)\n}\n\nexport function invokeDebug<K extends keyof ReactivityDebugHooks>(\n name: K,\n ...args: Parameters<NonNullable<ReactivityDebugHooks[K]>>\n): void {\n const callback = activeDebugHooks?.[name] as ((...values: unknown[]) => void) | undefined\n if (!callback) return\n try {\n callback(...args)\n } catch {\n // Debug tooling must never change application behavior.\n }\n}\n","import type { Effect } from './effect'\nimport { hasDebugHooks, invokeDebug } from './debug'\n\nexport class Scheduler {\n private readonly dirtyEffects = new Set<Effect>()\n private readonly lowPriorityEffects = new Set<Effect>()\n // flush 不可重入(flushing 标志保证),缓冲数组可在轮次间安全复用,避免每轮分配。\n private readonly normalBuffer: Effect[] = []\n private readonly lowBuffer: Effect[] = []\n private flushing = false\n private scheduled = false\n private batchDepth = 0\n\n schedule(effect: Effect): void {\n if (effect.disposed) return\n this.dirtyEffects.add(effect)\n this.lowPriorityEffects.delete(effect)\n this.ensureScheduled()\n }\n\n /** Queue an effect behind normal updates while preserving deterministic order. */\n scheduleLow(effect: Effect): void {\n if (effect.disposed) return\n if (!this.dirtyEffects.has(effect)) this.lowPriorityEffects.add(effect)\n this.ensureScheduled()\n }\n\n private ensureScheduled(): void {\n if (this.batchDepth === 0 && !this.flushing && !this.scheduled) {\n this.scheduled = true\n queueMicrotask(() => {\n this.scheduled = false\n this.flush()\n })\n }\n }\n\n remove(effect: Effect): void {\n this.dirtyEffects.delete(effect)\n this.lowPriorityEffects.delete(effect)\n }\n\n batch<T>(fn: () => T): T {\n this.batchDepth++\n try {\n return fn()\n } finally {\n this.batchDepth--\n if (this.batchDepth === 0) this.flush()\n }\n }\n\n flush(): void {\n if (this.flushing || this.batchDepth > 0) return\n this.flushing = true\n const debugEnabled = hasDebugHooks()\n if (debugEnabled) invokeDebug('flushStart')\n let rounds = 0\n let firstError: unknown\n let hasError = false\n try {\n while (this.dirtyEffects.size > 0 || this.lowPriorityEffects.size > 0) {\n if (++rounds > 100) {\n this.dirtyEffects.clear()\n this.lowPriorityEffects.clear()\n throw new Error('Vobs: 响应式更新超过 100 轮,可能存在循环依赖')\n }\n\n // normal 先、low 后,两组分别排序:与旧的合并排序语义一致\n // (旧比较器里 low 优先级本就高于 depth),但消除了比较器内的 Set 查找。\n this.collectRunnable(this.dirtyEffects, this.normalBuffer)\n this.collectRunnable(this.lowPriorityEffects, this.lowBuffer)\n sortEffects(this.normalBuffer)\n sortEffects(this.lowBuffer)\n for (const effect of this.normalBuffer) {\n try {\n effect.run()\n } catch (error) {\n // Isolate one failed effect from the rest of the flush. Re-throw\n // the first error after all runnable effects have had a chance.\n if (!hasError) {\n firstError = error\n hasError = true\n }\n }\n }\n for (const effect of this.lowBuffer) {\n try {\n effect.run()\n } catch (error) {\n if (!hasError) {\n firstError = error\n hasError = true\n }\n }\n }\n this.normalBuffer.length = 0\n this.lowBuffer.length = 0\n }\n } finally {\n this.normalBuffer.length = 0\n this.lowBuffer.length = 0\n this.flushing = false\n if (debugEnabled) invokeDebug('flushEnd')\n }\n if (hasError) throw firstError\n }\n\n /** 收集未 disposed 的 effect 并清空源集合;run() 期间新调度的 effect 留给下一轮。 */\n private collectRunnable(source: Set<Effect>, target: Effect[]): void {\n for (const effect of source) {\n if (!effect.disposed) target.push(effect)\n }\n source.clear()\n }\n}\n\n/** depth 深的先跑(子 effect 先于父),同深度按创建顺序。 */\nfunction sortEffects(effects: Effect[]): void {\n if (effects.length > 1) {\n effects.sort((a, b) => b.depth - a.depth || a.order - b.order)\n }\n}\n\nexport const scheduler = new Scheduler()\n\nexport function batch<T>(fn: () => T): T {\n return scheduler.batch(fn)\n}\n\n/** Schedule a low-priority effect explicitly. */\nexport function scheduleLow(effect: Effect): void {\n effect.scheduleLow()\n}\n","import type { Owner } from '@vobs/reactivity'\n\nexport type RuntimeDebugEnvironment = 'client' | 'server'\n\n/**\n * Lightweight context copied onto debug events created synchronously inside a\n * Router loader, Effect or SSR render. It is intentionally optional so the\n * runtime remains useful without DevTools.\n */\nexport interface RuntimeDebugContext {\n readonly environment?: RuntimeDebugEnvironment\n readonly sessionId?: string\n readonly route?: string\n readonly navigationId?: number\n readonly dataRequestId?: number\n readonly updateId?: string\n readonly effectId?: string\n readonly source?: string\n}\n\nexport interface RuntimeHydrationMismatch {\n readonly kind: 'missing-node' | 'extra-node' | 'position' | 'content'\n readonly expected: string\n readonly actual: string\n readonly path: string\n readonly message: string\n}\n\nexport type RuntimeDomMutationOperation = 'text' | 'property' | 'attribute' | 'insert' | 'remove'\n\nexport interface RuntimeDomMutation {\n readonly operation: RuntimeDomMutationOperation\n readonly target: string\n readonly parent?: string\n readonly key?: string\n readonly previousValue?: unknown\n readonly nextValue?: unknown\n}\n\nexport interface RuntimeErrorEvent {\n readonly error: unknown\n readonly owner: Owner\n readonly phase: 'event' | 'boundary'\n readonly handled: boolean\n readonly recovery: 'propagated' | 'handled' | 'fallback' | 'retrying' | 'recovered'\n}\n\nexport interface RuntimeDebugHooks {\n domMutation?(mutation: RuntimeDomMutation): void\n error?(event: RuntimeErrorEvent): void\n hydrationMismatch?(event: RuntimeHydrationMismatch): void\n}\n\nlet activeRuntimeDebugHooks: RuntimeDebugHooks | null = null\nlet activeRuntimeDebugContext: RuntimeDebugContext | null = null\n\nexport function setRuntimeDebugHooks(hooks: RuntimeDebugHooks | null): RuntimeDebugHooks | null {\n const previous = activeRuntimeDebugHooks\n activeRuntimeDebugHooks = hooks\n return previous\n}\n\nexport function getRuntimeDebugHooks(): RuntimeDebugHooks | null {\n return activeRuntimeDebugHooks\n}\n\nexport function getRuntimeDebugContext(): RuntimeDebugContext | null {\n return activeRuntimeDebugContext\n}\n\n/** Run a synchronous operation with trace context, preserving async renders. */\nexport function runWithRuntimeDebugContext<T>(context: RuntimeDebugContext, task: () => T): T {\n const previous = activeRuntimeDebugContext\n const next = { ...previous, ...context }\n activeRuntimeDebugContext = next\n let result: T\n try {\n result = task()\n } catch (error) {\n activeRuntimeDebugContext = previous\n throw error\n }\n if (isPromiseLike(result)) {\n return Promise.resolve(result).finally(() => {\n if (activeRuntimeDebugContext === next) activeRuntimeDebugContext = previous\n }) as T\n }\n activeRuntimeDebugContext = previous\n return result\n}\n\n/** Keep a context active across callback boundaries such as Effect execution. */\nexport function pushRuntimeDebugContext(context: RuntimeDebugContext): () => void {\n const previous = activeRuntimeDebugContext\n activeRuntimeDebugContext = { ...previous, ...context }\n let restored = false\n return () => {\n if (restored) return\n restored = true\n activeRuntimeDebugContext = previous\n }\n}\n\nexport function invokeRuntimeDebug<K extends keyof RuntimeDebugHooks>(\n name: K,\n ...args: Parameters<NonNullable<RuntimeDebugHooks[K]>>\n): void {\n const callback = activeRuntimeDebugHooks?.[name] as ((...values: unknown[]) => void) | undefined\n if (!callback) return\n try {\n callback(...args)\n } catch {\n // Debug tooling must never change runtime behavior.\n }\n}\n\nexport function readDebugValue(read: () => unknown): unknown {\n try {\n return read()\n } catch {\n return '[Uninspectable]'\n }\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n return Boolean(value) && (typeof value === 'object' || typeof value === 'function')\n && typeof (value as { then?: unknown }).then === 'function'\n}\n\nexport function describeDebugNode(node: unknown): string {\n if (!node || typeof node !== 'object') return 'node'\n const value = node as {\n readonly nodeName?: unknown\n readonly tagName?: unknown\n readonly id?: unknown\n readonly className?: unknown\n }\n const name = typeof value.tagName === 'string'\n ? value.tagName.toLowerCase()\n : typeof value.nodeName === 'string' ? value.nodeName.toLowerCase() : 'node'\n const id = typeof value.id === 'string' && value.id ? `#${value.id}` : ''\n const className = typeof value.className === 'string' && value.className\n ? `.${value.className.trim().split(/\\s+/).filter(Boolean).join('.')}`\n : ''\n return `${name}${id}${className}`\n}\n","import type { VobsNode } from './fragment'\n\nexport type HmrComponent<Props extends object = Record<string, unknown>> =\n (props: Props) => VobsNode\n\nexport interface HmrStateStore {\n get<T>(key: string, initial: T | (() => T)): T\n set<T>(key: string, value: T): void\n has(key: string): boolean\n delete(key: string): void\n clear(): void\n}\n\nexport interface HmrInstance {\n node: VobsNode\n parent: Node | null\n refresh(): void\n}\n\ninterface HmrModuleState {\n readonly components: Map<string, HmrComponent>\n readonly state: Map<string, unknown>\n readonly instances: Set<HmrInstance>\n}\n\ninterface HmrGlobal {\n modules: Map<string, HmrModuleState>\n}\n\nconst globalTarget = globalThis as typeof globalThis & { __VOBS_HMR__?: HmrGlobal }\nconst hmrGlobal = globalTarget.__VOBS_HMR__ ?? { modules: new Map<string, HmrModuleState>() }\nglobalTarget.__VOBS_HMR__ = hmrGlobal\n\nexport function resolveComponent<Props extends object>(\n component: HmrComponent<Props>,\n moduleId: string,\n exportName: string\n): HmrComponent<Props> {\n const module = getModule(moduleId)\n const existing = module.components.get(exportName)\n if (existing) return existing as HmrComponent<Props>\n\n const proxy = ((props: Props) => {\n const current = (proxy as HmrComponent<Props> & { current: HmrComponent<Props> }).current\n return current(props)\n }) as HmrComponent<Props> & { current: HmrComponent<Props> }\n proxy.current = component\n Object.defineProperties(proxy, {\n displayName: { configurable: true, value: component.name || exportName },\n hmrKey: { configurable: false, value: `${moduleId}:${exportName}` }\n })\n module.components.set(exportName, proxy as HmrComponent)\n return proxy\n}\n\nexport function updateHmrModule(_moduleId: string, nextModule: Record<string, unknown>): void {\n const modules = [...hmrGlobal.modules.values()]\n for (const module of modules) {\n let changed = false\n for (const [name, proxy] of module.components) {\n const next = nextModule[name]\n if (typeof next !== 'function') continue\n const hmrProxy = proxy as HmrComponent & { current: HmrComponent; displayName?: string }\n hmrProxy.current = next as HmrComponent\n Object.defineProperty(hmrProxy, 'displayName', { configurable: true, value: next.name || name })\n changed = true\n }\n if (!changed) continue\n for (const instance of module.instances) {\n try {\n instance.refresh()\n } catch {\n // HMR failures remain application errors on the next normal render.\n }\n }\n }\n}\n\nexport function disposeHmrModule(_moduleId: string): void {\n // State and component proxies intentionally survive module disposal.\n}\n\nexport function createHmrStateStore(moduleId: string): HmrStateStore {\n const state = getModule(moduleId).state\n return {\n get<T>(key: string, initial: T | (() => T)): T {\n if (!state.has(key)) state.set(key, typeof initial === 'function' ? (initial as () => T)() : initial)\n return state.get(key) as T\n },\n set<T>(key: string, value: T): void {\n state.set(key, value)\n },\n has: key => state.has(key),\n delete: key => { state.delete(key) },\n clear: () => { state.clear() }\n }\n}\n\nexport function registerHmrInstance(moduleId: string, instance: HmrInstance): () => void {\n const instances = getModule(moduleId).instances\n instances.add(instance)\n return () => instances.delete(instance)\n}\n\nexport function markHmrInstanceMounted(node: VobsNode, parent: Node): void {\n const instance = hmrInstances.get(node as object)\n if (instance) instance.parent = parent\n}\n\nfunction getModule(moduleId: string): HmrModuleState {\n let module = hmrGlobal.modules.get(moduleId)\n if (!module) {\n module = { components: new Map(), state: new Map(), instances: new Set() }\n hmrGlobal.modules.set(moduleId, module)\n }\n return module\n}\n\nconst hmrInstances = new WeakMap<object, HmrInstance>()\n\nexport function associateHmrInstance(node: VobsNode, instance: HmrInstance): void {\n hmrInstances.set(node as object, instance)\n}\n","import { createOwner, scheduler, setOwnerDebugName, type Owner } from '@vobs/reactivity'\nimport { createDOMRenderer } from '@vobs/dom'\nimport { insertBefore as insertRuntimeNode, setRenderer, type VobsFragment, type VobsRenderer } from '@vobs/runtime'\nimport { injectFromOwner, provideToOwner } from './context'\n\nexport type InjectionKey<T> = symbol & {\n readonly __vobsType?: T\n}\n\nexport interface ProvideOptions {\n override?: boolean\n}\n\nexport interface VobsPlugin {\n name: string\n version?: string\n requires?: readonly VobsPlugin[]\n optional?: readonly VobsPlugin[]\n install?: (ctx: VobsContext) => void | (() => void)\n}\n\nexport interface VobsContext {\n readonly app: VobsApp\n provide<T>(key: InjectionKey<T>, value: T, options?: ProvideOptions): void\n inject<T>(key: InjectionKey<T>): T | undefined\n injectRequired<T>(key: InjectionKey<T>, description?: string): T\n onDestroy(cleanup: () => void): void\n onError(handler: (error: unknown) => void): () => void\n}\n\nexport interface VobsConfig<\n NodeType = Node,\n TextNode extends NodeType = NodeType,\n ElementNode extends NodeType = NodeType,\n CommentNode extends NodeType = NodeType\n> {\n render: () => NodeType | VobsFragment | Node | null | undefined\n renderer?: VobsRenderer<NodeType, TextNode, ElementNode, CommentNode>\n plugins?: VobsPlugin[]\n /** Optional application-level error observer. Observers are isolated from the app. */\n onError?: (error: unknown) => void\n}\n\nexport interface VobsApp<NodeType = Node> {\n readonly mounted: boolean\n readonly destroyed: boolean\n use(plugin: VobsPlugin): VobsApp<NodeType>\n mount(target: string | NodeType): void\n hydrate(target: string | NodeType): void\n update(): void\n destroy(): void\n}\n\nexport function createInjectionKey<T>(description: string): InjectionKey<T> {\n return Symbol(description) as InjectionKey<T>\n}\n\nexport function createVobs(\n config: VobsConfig<Node, Text, Element, Comment>\n): VobsApp<Node>\nexport function createVobs<\n NodeType = Node,\n TextNode extends NodeType = NodeType,\n ElementNode extends NodeType = NodeType,\n CommentNode extends NodeType = NodeType\n>(\n config: VobsConfig<NodeType, TextNode, ElementNode, CommentNode> & {\n renderer: VobsRenderer<NodeType, TextNode, ElementNode, CommentNode>\n }\n): VobsApp<NodeType>\nexport function createVobs(\n config: VobsConfig<any, any, any, any>\n): VobsApp<any> {\n if (!config.render) throw new Error('createVobs: render 不能为空')\n\n const renderer = config.renderer ?? createDOMRenderer()\n const rootOwner: Owner = createOwner()\n setOwnerDebugName(rootOwner, 'App')\n const cleanups: Array<() => void> = []\n const errorHandlers = new Set<(error: unknown) => void>()\n const installed = new Set<string>()\n const installing = new Set<string>()\n let mounted = false\n let destroyed = false\n let container: any = null\n let app!: VobsApp<any>\n\n if (config.onError) {\n errorHandlers.add(config.onError)\n cleanups.push(() => errorHandlers.delete(config.onError!))\n }\n\n const context: VobsContext = {\n get app(): VobsApp<any> {\n return app\n },\n\n provide<T>(key: InjectionKey<T>, value: T, options: ProvideOptions = {}): void {\n provideToOwner(rootOwner, key, value, options)\n },\n\n inject<T>(key: InjectionKey<T>): T | undefined {\n return injectFromOwner(rootOwner, key)\n },\n\n injectRequired<T>(key: InjectionKey<T>, description?: string): T {\n const value = injectFromOwner(rootOwner, key)\n if (value === undefined) {\n throw new Error(`Vobs: 找不到必需注入项${description ? ` ${description}` : ''}`)\n }\n return value\n },\n\n onDestroy(cleanup: () => void): void {\n cleanups.push(cleanup)\n },\n\n onError(handler: (error: unknown) => void): () => void {\n errorHandlers.add(handler)\n const remove = () => errorHandlers.delete(handler)\n cleanups.push(remove)\n return remove\n }\n }\n\n function notifyError(error: unknown): void {\n for (const handler of [...errorHandlers]) {\n try {\n handler(error)\n } catch {\n // 错误处理器不能覆盖触发它的原始错误。\n }\n }\n }\n\n function installPlugin(plugin: VobsPlugin): void {\n if (installed.has(plugin.name)) return\n if (installing.has(plugin.name)) {\n throw new Error(`Vobs: 插件依赖存在循环:${plugin.name}`)\n }\n\n installing.add(plugin.name)\n try {\n for (const dependency of plugin.requires ?? []) installPlugin(dependency)\n const cleanup = plugin.install?.(context)\n if (cleanup) cleanups.push(cleanup)\n installed.add(plugin.name)\n } finally {\n installing.delete(plugin.name)\n }\n }\n\n function cleanup(clearContainer = true): unknown {\n let firstError: unknown\n for (let index = cleanups.length - 1; index >= 0; index--) {\n try {\n cleanups[index]()\n } catch (error) {\n firstError ??= error\n }\n }\n cleanups.length = 0\n\n try {\n rootOwner.dispose()\n } catch (error) {\n firstError ??= error\n }\n\n if (container && clearContainer) {\n try {\n renderer.clear(container)\n } catch (error) {\n firstError ??= error\n }\n }\n return firstError\n }\n\n function start(target: string | any, hydrating: boolean): void {\n if (destroyed) throw new Error('Vobs: 已销毁的应用不能挂载')\n if (mounted) return\n\n container = typeof target === 'string' ? document.querySelector(target) : target\n if (!container) throw new Error(`mount: 目标不存在: ${target}`)\n if (hydrating && !renderer.beginHydration) {\n throw new Error('Vobs: 当前渲染器不支持 Hydration')\n }\n\n setRenderer(renderer)\n try {\n if (hydrating) renderer.beginHydration?.()\n const rootNode = rootOwner.run(config.render)\n if (!hydrating) renderer.clear(container)\n if (rootNode) insertRuntimeNode(container, rootNode as any, null)\n if (hydrating) renderer.completeHydration?.()\n mounted = true\n } catch (error) {\n notifyError(error)\n const cleanupError = cleanup(!hydrating)\n destroyed = true\n throw cleanupError ?? error\n }\n }\n\n app = {\n get mounted(): boolean {\n return mounted\n },\n\n get destroyed(): boolean {\n return destroyed\n },\n\n use(plugin: VobsPlugin): VobsApp<any> {\n if (destroyed) throw new Error('Vobs: 已销毁的应用不能安装插件')\n installPlugin(plugin)\n return app\n },\n\n mount(target: string | any): void {\n start(target, false)\n },\n\n hydrate(target: string | any): void {\n start(target, true)\n },\n\n update(): void {\n if (destroyed) throw new Error('Vobs: 已销毁的应用不能更新')\n try {\n scheduler.flush()\n } catch (error) {\n notifyError(error)\n throw error\n }\n },\n\n destroy(): void {\n if (destroyed) return\n try {\n const cleanupError = cleanup()\n if (cleanupError) {\n notifyError(cleanupError)\n throw cleanupError\n }\n } finally {\n mounted = false\n destroyed = true\n }\n }\n }\n\n try {\n for (const plugin of config.plugins ?? []) app.use(plugin)\n } catch (error) {\n notifyError(error)\n cleanup()\n destroyed = true\n throw error\n }\n\n return app\n}\n","export interface SSEOptions {\n readonly withCredentials?: boolean\n readonly eventSource?: SSEConstructor\n readonly onOpen?: (event: Event) => void\n readonly onMessage?: (event: MessageEvent) => void\n readonly onError?: (event: Event) => void\n}\n\nexport interface SSEClient {\n readonly source: EventSource\n close(): void\n}\n\nexport type SSEConstructor = new (url: string, options?: EventSourceInit) => EventSource\n\nexport function createSSE(url: string, options: SSEOptions = {}): SSEClient {\n const EventSourceImpl = options.eventSource ?? globalThis.EventSource\n if (!EventSourceImpl) throw new Error('HTTP: 当前环境没有可用的 EventSource')\n const source = new EventSourceImpl(url, { withCredentials: options.withCredentials ?? false })\n if (options.onOpen) source.addEventListener('open', options.onOpen)\n if (options.onMessage) source.addEventListener('message', options.onMessage)\n if (options.onError) source.addEventListener('error', options.onError)\n return {\n source,\n close: () => source.close()\n }\n}\n\nexport interface WebSocketOptions {\n readonly protocols?: string | readonly string[]\n readonly webSocket?: WebSocketConstructor\n readonly autoReconnect?: boolean\n readonly reconnectDelay?: number\n}\n\nexport interface WebSocketClient {\n readonly socket: WebSocket | null\n readonly state: WebSocketState\n connect(): void\n send(data: string | ArrayBufferLike | Blob | ArrayBufferView): void\n close(code?: number, reason?: string): void\n on<K extends WebSocketEventName>(event: K, listener: WebSocketEventListener<K>): () => void\n}\n\nexport type WebSocketState = 'idle' | 'connecting' | 'open' | 'closed'\nexport type WebSocketEventName = 'open' | 'message' | 'error' | 'close'\nexport type WebSocketEventListener<K extends WebSocketEventName> =\n K extends 'message' ? (event: MessageEvent) => void\n : K extends 'close' ? (event: CloseEvent) => void\n : (event: Event) => void\nexport type WebSocketConstructor = new (\n url: string,\n protocols?: string | string[]\n) => WebSocket\n\nexport function createWebSocket(url: string, options: WebSocketOptions = {}): WebSocketClient {\n const WebSocketImpl = options.webSocket ?? globalThis.WebSocket\n if (!WebSocketImpl) throw new Error('HTTP: 当前环境没有可用的 WebSocket')\n const reconnectDelay = options.reconnectDelay ?? 1_000\n if (!Number.isFinite(reconnectDelay) || reconnectDelay < 0) {\n throw new Error('HTTP: reconnectDelay 必须是大于等于 0 的有限数字')\n }\n\n const listeners = new Map<WebSocketEventName, Set<(event: Event) => void>>()\n let socket: WebSocket | null = null\n let state: WebSocketState = 'idle'\n let manuallyClosed = false\n let reconnectTimer: ReturnType<typeof setTimeout> | undefined\n\n const client: WebSocketClient = {\n get socket(): WebSocket | null { return socket },\n get state(): WebSocketState { return state },\n connect,\n send(data) {\n if (!socket || state !== 'open') throw new Error('HTTP: WebSocket 尚未连接')\n socket.send(data)\n },\n close(code, reason) {\n manuallyClosed = true\n if (reconnectTimer !== undefined) clearTimeout(reconnectTimer)\n socket?.close(code, reason)\n if (!socket) state = 'closed'\n },\n on(event, listener) {\n let eventListeners = listeners.get(event)\n if (!eventListeners) {\n eventListeners = new Set()\n listeners.set(event, eventListeners)\n }\n eventListeners.add(listener as (event: Event) => void)\n return () => eventListeners?.delete(listener as (event: Event) => void)\n }\n }\n\n connect()\n return client\n\n function connect(): void {\n if (state === 'connecting' || state === 'open') return\n manuallyClosed = false\n state = 'connecting'\n const protocols = options.protocols === undefined\n ? undefined\n : typeof options.protocols === 'string' ? options.protocols : [...options.protocols]\n socket = new WebSocketImpl(url, protocols)\n socket.addEventListener('open', event => {\n state = 'open'\n notify('open', event)\n })\n socket.addEventListener('message', event => notify('message', event))\n socket.addEventListener('error', event => notify('error', event))\n socket.addEventListener('close', event => {\n state = 'closed'\n socket = null\n notify('close', event)\n if (options.autoReconnect && !manuallyClosed) {\n reconnectTimer = setTimeout(() => {\n reconnectTimer = undefined\n connect()\n }, reconnectDelay)\n }\n })\n }\n\n function notify(event: WebSocketEventName, value: Event): void {\n for (const listener of [...(listeners.get(event) ?? [])]) listener(value)\n }\n}\n","import type { HTTPMethod, HTTPHeaders } from './index'\nimport type { RuntimeDebugContext } from '@vobs/runtime'\n\nexport type HTTPDebugStatus = 'loading' | 'retrying' | 'success' | 'error' | 'cancelled'\n\nexport type HTTPDebugCacheStatus = 'hit' | 'miss' | 'revalidated'\n\nexport interface HTTPDebugContext extends RuntimeDebugContext {\n readonly cacheStatus?: HTTPDebugCacheStatus\n /** Marks a request created from the DevTools request tester. */\n readonly test?: boolean\n}\n\nexport interface HTTPDebugRequest {\n readonly id: number\n readonly phase: 'start' | 'retry' | 'end'\n readonly status: HTTPDebugStatus\n readonly url: string\n readonly method: HTTPMethod\n readonly headers: HTTPHeaders\n readonly requestBody?: unknown\n readonly startedAt: number\n readonly endedAt?: number\n readonly duration?: number\n readonly attempt: number\n readonly retries: number\n readonly responseStatus?: number\n readonly responseBody?: unknown\n readonly error?: { readonly name: string; readonly message: string }\n readonly context?: HTTPDebugContext\n}\n\nexport interface HTTPDebugHooks {\n request?(event: HTTPDebugRequest): void\n}\n\nlet activeHTTPDebugHooks: HTTPDebugHooks | null = null\nconst httpDebugListeners = new Set<NonNullable<HTTPDebugHooks['request']>>()\n\nexport function setHTTPDebugHooks(hooks: HTTPDebugHooks | null): HTTPDebugHooks | null {\n const previous = activeHTTPDebugHooks\n activeHTTPDebugHooks = hooks\n return previous\n}\n\nexport function getHTTPDebugHooks(): HTTPDebugHooks | null {\n return activeHTTPDebugHooks\n}\n\nexport function subscribeHTTPDebug(listener: NonNullable<HTTPDebugHooks['request']>): () => void {\n httpDebugListeners.add(listener)\n return () => httpDebugListeners.delete(listener)\n}\n\nexport function emitHTTPDebug(event: HTTPDebugRequest): void {\n try {\n activeHTTPDebugHooks?.request?.(event)\n } catch {\n // Debug tooling must never change request behavior.\n }\n for (const listener of [...httpDebugListeners]) {\n try { listener(event) } catch { /* Debug tooling must never change request behavior. */ }\n }\n}\n","import { createInjectionKey, type VobsPlugin } from '@vobs/vobs'\nimport axios from 'axios'\nexport { createSSE, createWebSocket } from './stream'\nimport { emitHTTPDebug } from './debug'\nimport { getRuntimeDebugContext } from '@vobs/runtime'\n\nexport { emitHTTPDebug, getHTTPDebugHooks, setHTTPDebugHooks, subscribeHTTPDebug } from './debug'\nexport type { HTTPDebugCacheStatus, HTTPDebugContext, HTTPDebugHooks, HTTPDebugRequest, HTTPDebugStatus } from './debug'\nexport type {\n SSEClient,\n SSEConstructor,\n SSEOptions,\n WebSocketClient,\n WebSocketConstructor,\n WebSocketEventListener,\n WebSocketEventName,\n WebSocketOptions,\n WebSocketState\n} from './stream'\n\nexport type HTTPMethod = 'DELETE' | 'GET' | 'HEAD' | 'OPTIONS' | 'PATCH' | 'POST' | 'PUT'\nexport type HTTPResponseType = 'arrayBuffer' | 'blob' | 'json' | 'response' | 'text'\nexport type HTTPHeaders = Record<string, string>\nexport type RetryDelay = number | ((attempt: number, error: Error) => number)\nexport interface HTTPProgress {\n readonly loaded: number\n readonly total: number | undefined\n readonly percent: number | undefined\n}\nexport type HTTPProgressHandler = (progress: HTTPProgress) => void\nconst PROGRESS_HANDLED = Symbol('vobs.http.progress-handled')\nlet nextHTTPDebugId = 1\n\nexport interface RequestOptions {\n url: string\n method?: HTTPMethod\n baseURL?: string\n headers?: HeadersInit\n params?: Record<string, unknown> | URLSearchParams\n body?: unknown\n signal?: AbortSignal\n /** @deprecated Use signal. */\n state?: AbortSignal\n timeout?: number\n retry?: number\n retryDelay?: RetryDelay\n shouldRetry?: (error: Error, attempt: number) => boolean | PromiseLike<boolean>\n cache?: RequestCache\n credentials?: RequestCredentials\n mode?: RequestMode\n responseType?: HTTPResponseType\n onUploadProgress?: HTTPProgressHandler\n onDownloadProgress?: HTTPProgressHandler\n /** Share an in-flight request with the same dedupe key. */\n dedupe?: boolean\n dedupeKey?: string\n /** Optional context copied into DevTools request traces. */\n debugContext?: import('./debug').HTTPDebugContext\n}\n\nexport interface RequestConfig extends Omit<RequestOptions, 'headers' | 'method'> {\n readonly method: HTTPMethod\n headers: HTTPHeaders\n readonly url: string\n}\n\nexport interface HTTPResponse<T = unknown> {\n readonly data: T\n readonly status: number\n readonly statusText: string\n readonly headers: Headers\n readonly config: RequestConfig\n readonly raw: Response | null\n}\n\n/** Adapt an HTTP request to the fetcher contract used by Resource. */\nexport type HTTPResourceRequest<T> = (\n signal: AbortSignal\n) => HTTPResponse<T> | PromiseLike<HTTPResponse<T>>\n\nexport function toResourceFetcher<T>(request: HTTPResourceRequest<T>): (signal: AbortSignal) => Promise<T> {\n return signal => Promise.resolve()\n .then(() => request(signal))\n .then(response => response.data)\n}\n\nexport type HTTPAdapter = (\n config: RequestConfig\n) => Response | HTTPResponse<unknown> | PromiseLike<Response | HTTPResponse<unknown>>\n\nexport interface AxiosResponseLike<T = unknown> {\n readonly data: T\n readonly status: number\n readonly statusText?: string\n readonly headers?: HeadersInit\n readonly raw?: Response | null\n}\n\nexport type AxiosRequestConfigLike = RequestConfig & { readonly data?: unknown }\nexport type AxiosRequest = <T = unknown>(config: AxiosRequestConfigLike) => PromiseLike<AxiosResponseLike<T>>\n\n/** Bridges an Axios request function while preserving HTTPResponse<T>.data typing. */\nexport function createAxiosAdapter(request: AxiosRequest = builtInAxiosRequest): HTTPAdapter {\n return async config => {\n // normalizeRequest has already serialized params into config.url. Omit\n // params before invoking a custom Axios request so spreading this config\n // into axios.request cannot append the query string a second time.\n const { params: _params, ...requestConfig } = config\n const response = await request<unknown>({ ...requestConfig, data: config.body })\n return {\n data: response.data,\n status: response.status,\n statusText: response.statusText ?? '',\n headers: new Headers(response.headers),\n config,\n raw: response.raw ?? null\n }\n }\n}\n\n/**\n * Creates an adapter for deterministic local handlers and test transports.\n * Returning a Response or HTTPResponse keeps full control over status and\n * headers; any other value becomes a successful 200 payload.\n */\nexport function createMockAdapter(\n handler: (config: RequestConfig) => unknown | PromiseLike<unknown>\n): HTTPAdapter {\n return async config => {\n const result = await handler(config)\n if (isResponse(result) || isHTTPResponse(result)) return result\n return {\n data: result,\n status: 200,\n statusText: 'OK',\n headers: new Headers(),\n config,\n raw: null\n }\n }\n}\n\n/** XMLHttpRequest adapter for upload and download progress events. */\nexport function createXHRAdapter(): HTTPAdapter {\n return config => new Promise<Response>((resolve, reject) => {\n if (typeof XMLHttpRequest === 'undefined') {\n reject(new Error('HTTP: 当前环境没有可用的 XMLHttpRequest'))\n return\n }\n const xhr = new XMLHttpRequest()\n xhr.open(config.method, config.url, true)\n if (config.responseType === 'arrayBuffer') xhr.responseType = 'arraybuffer'\n else if (config.responseType === 'blob') xhr.responseType = 'blob'\n const signal = config.signal ?? config.state\n const abort = (): void => xhr.abort()\n if (signal?.aborted) {\n reject(Object.assign(new Error('The operation was aborted'), { name: 'AbortError' }))\n return\n }\n const cleanup = (): void => signal?.removeEventListener('abort', abort)\n signal?.addEventListener('abort', abort, { once: true })\n xhr.upload.onprogress = event => config.onUploadProgress?.(toProgress(event.loaded, event.lengthComputable ? event.total : undefined))\n xhr.onprogress = event => config.onDownloadProgress?.(toProgress(event.loaded, event.lengthComputable ? event.total : undefined))\n xhr.onload = () => {\n cleanup()\n const headers = new Headers()\n xhr.getAllResponseHeaders().trim().split(/[\\r\\n]+/).forEach(line => {\n const separator = line.indexOf(':')\n if (separator > 0) headers.set(line.slice(0, separator).trim(), line.slice(separator + 1).trim())\n })\n const body = config.responseType === 'arrayBuffer' || config.responseType === 'blob'\n ? xhr.response\n : xhr.responseText\n const response = new Response(body, {\n status: xhr.status,\n statusText: xhr.statusText,\n headers\n })\n Object.defineProperty(response, PROGRESS_HANDLED, { value: true })\n resolve(response)\n }\n xhr.onerror = () => { cleanup(); reject(new Error('HTTP: XMLHttpRequest 网络错误')) }\n xhr.onabort = () => {\n cleanup()\n reject(Object.assign(new Error('The operation was aborted'), { name: 'AbortError' }))\n }\n try {\n const headers = new Headers(config.headers)\n const body = encodeBody(config.body, headers, config.method)\n headers.forEach((value, key) => xhr.setRequestHeader(key, value))\n xhr.send((body ?? null) as Document | XMLHttpRequestBodyInit | null)\n } catch (error) {\n cleanup()\n reject(error)\n }\n })\n}\n\n/** Explicit fetch transport for applications that do not want the built-in Axios transport. */\nexport function createFetchAdapter(): HTTPAdapter {\n return fetchAdapter\n}\n\nexport interface HTTPClientOptions {\n baseURL?: string\n headers?: HeadersInit\n timeout?: number\n adapter?: HTTPAdapter\n retry?: number\n retryDelay?: RetryDelay\n shouldRetry?: (error: Error, attempt: number) => boolean | PromiseLike<boolean>\n concurrency?: number\n dedupe?: boolean\n}\n\nexport interface InterceptorManager<T> {\n use<TResult = T>(\n onFulfilled?: (value: T) => TResult | PromiseLike<TResult>,\n onRejected?: (error: unknown) => TResult | PromiseLike<TResult>\n ): number\n eject(id: number): void\n clear(): void\n}\n\nexport interface HTTPInterceptors {\n readonly request: InterceptorManager<RequestConfig>\n readonly response: InterceptorManager<HTTPResponse<unknown>>\n}\n\nexport interface HTTPClient {\n readonly interceptors: HTTPInterceptors\n request<T = unknown>(options: RequestOptions): Promise<HTTPResponse<T>>\n get<T = unknown>(url: string, options?: Omit<RequestOptions, 'url' | 'method' | 'body'>): Promise<HTTPResponse<T>>\n delete<T = unknown>(url: string, options?: Omit<RequestOptions, 'url' | 'method' | 'body'>): Promise<HTTPResponse<T>>\n head<T = unknown>(url: string, options?: Omit<RequestOptions, 'url' | 'method' | 'body'>): Promise<HTTPResponse<T>>\n post<T = unknown>(url: string, body?: unknown, options?: Omit<RequestOptions, 'url' | 'method' | 'body'>): Promise<HTTPResponse<T>>\n put<T = unknown>(url: string, body?: unknown, options?: Omit<RequestOptions, 'url' | 'method' | 'body'>): Promise<HTTPResponse<T>>\n patch<T = unknown>(url: string, body?: unknown, options?: Omit<RequestOptions, 'url' | 'method' | 'body'>): Promise<HTTPResponse<T>>\n}\n\nexport interface ConcurrencyLimiter {\n <T>(task: () => T | PromiseLike<T>): Promise<T>\n}\n\nexport class HTTPError extends Error {\n readonly status: number\n readonly statusText: string\n readonly data: unknown\n readonly config: RequestConfig\n readonly response: HTTPResponse<unknown>\n\n constructor(response: HTTPResponse<unknown>) {\n super(`HTTP ${response.status}${response.statusText ? ` ${response.statusText}` : ''}`)\n this.name = 'HTTPError'\n this.status = response.status\n this.statusText = response.statusText\n this.data = response.data\n this.config = response.config\n this.response = response\n }\n}\n\nexport class TimeoutError extends Error {\n readonly code = 'ETIMEDOUT'\n\n constructor(timeout: number) {\n super(`HTTP 请求超过 ${timeout}ms 未完成`)\n this.name = 'TimeoutError'\n }\n}\n\nexport const HTTP_KEY = createInjectionKey<HTTPClient>('vobs.http')\n\nexport interface HTTPPluginOptions extends HTTPClientOptions {\n client?: HTTPClient\n}\n\nexport function createHTTPClient(options: HTTPClientOptions = {}): HTTPClient {\n const defaults = normalizeClientOptions(options)\n const requestInterceptors = createInterceptors<RequestConfig>()\n const responseInterceptors = createInterceptors<HTTPResponse<unknown>>()\n const adapter = options.adapter ?? createAxiosAdapter()\n const limiter = createConcurrencyLimiter(options.concurrency ?? Infinity)\n const pending = new Map<string, Promise<HTTPResponse<unknown>>>()\n\n async function request<T>(input: RequestOptions): Promise<HTTPResponse<T>> {\n const initial = normalizeRequest(input, defaults)\n const dedupeKey = getDedupeKey(initial, options.dedupe ?? false)\n if (dedupeKey) {\n const existing = pending.get(dedupeKey)\n if (existing) return existing as Promise<HTTPResponse<T>>\n const shared = executeDebugRequest(initial)\n pending.set(dedupeKey, shared)\n void shared.finally(() => pending.delete(dedupeKey)).catch(() => undefined)\n return shared as Promise<HTTPResponse<T>>\n }\n return executeDebugRequest(initial) as Promise<HTTPResponse<T>>\n }\n\n function executeDebugRequest(initial: RequestConfig): Promise<HTTPResponse<unknown>> {\n const id = nextHTTPDebugId++\n const startedAt = Date.now()\n const context = {\n ...getRuntimeDebugContext(),\n ...initial.debugContext\n }\n emitHTTPDebug({\n id,\n phase: 'start',\n status: 'loading',\n url: initial.url,\n method: initial.method,\n headers: debugHeaders(initial.headers),\n requestBody: debugValue(initial.body),\n startedAt,\n attempt: 0,\n retries: 0,\n context: Object.keys(context).length > 0 ? context : undefined\n })\n return executeRequest(initial, id).then(response => {\n const endedAt = Date.now()\n emitHTTPDebug({\n id,\n phase: 'end',\n status: 'success',\n url: response.config.url,\n method: response.config.method,\n headers: debugHeaders(response.config.headers),\n requestBody: debugValue(response.config.body),\n startedAt,\n endedAt,\n duration: endedAt - startedAt,\n attempt: 0,\n retries: 0,\n responseStatus: response.status,\n responseBody: debugValue(response.data),\n context: Object.keys(context).length > 0 ? context : undefined\n })\n return response\n }, error => {\n const endedAt = Date.now()\n const cancelled = isAbortError(error)\n emitHTTPDebug({\n id,\n phase: 'end',\n status: cancelled ? 'cancelled' : 'error',\n url: initial.url,\n method: initial.method,\n headers: debugHeaders(initial.headers),\n requestBody: debugValue(initial.body),\n startedAt,\n endedAt,\n duration: endedAt - startedAt,\n attempt: 0,\n retries: 0,\n responseStatus: error instanceof HTTPError ? error.status : undefined,\n responseBody: error instanceof HTTPError ? debugValue(error.data) : undefined,\n error: { name: error instanceof Error ? error.name : 'Error', message: error instanceof Error ? error.message : String(error) },\n context: Object.keys(context).length > 0 ? context : undefined\n })\n throw error\n })\n }\n\n async function executeRequest(initial: RequestConfig, debugId?: number): Promise<HTTPResponse<unknown>> {\n const requestChain = requestInterceptors.handlers()\n const responseChain = responseInterceptors.handlers().reverse()\n\n let chain: Promise<unknown> = Promise.resolve(initial)\n for (const handler of requestChain) {\n chain = chain.then(handler.onFulfilled, handler.onRejected)\n }\n chain = chain.then(config => limiter(() => executeWithRetry(config as RequestConfig, adapter, debugId)))\n for (const handler of responseChain) {\n chain = chain.then(handler.onFulfilled, handler.onRejected)\n }\n return chain as Promise<HTTPResponse<unknown>>\n }\n\n function method<T>(methodName: HTTPMethod, url: string, input: Omit<RequestOptions, 'url' | 'method' | 'body'> = {}): Promise<HTTPResponse<T>> {\n return request<T>({ ...input, url, method: methodName })\n }\n\n function methodWithBody<T>(methodName: HTTPMethod, url: string, body: unknown, input: Omit<RequestOptions, 'url' | 'method' | 'body'> = {}): Promise<HTTPResponse<T>> {\n return request<T>({ ...input, url, method: methodName, body })\n }\n\n const client: HTTPClient = {\n interceptors: {\n request: requestInterceptors,\n response: responseInterceptors\n },\n request,\n get: (url, input) => method('GET', url, input),\n delete: (url, input) => method('DELETE', url, input),\n head: (url, input) => method('HEAD', url, input),\n post: (url, body, input) => methodWithBody('POST', url, body, input),\n put: (url, body, input) => methodWithBody('PUT', url, body, input),\n patch: (url, body, input) => methodWithBody('PATCH', url, body, input)\n }\n return client\n\n async function executeWithRetry(config: RequestConfig, requestAdapter: HTTPAdapter, debugId?: number): Promise<HTTPResponse<unknown>> {\n const controller = new AbortController()\n const inputSignal = config.signal ?? config.state\n let timedOut = false\n let timeoutId: ReturnType<typeof setTimeout> | undefined\n const abortFromInput = (): void => controller.abort(inputSignal?.reason)\n\n if (inputSignal) {\n if (inputSignal.aborted) controller.abort(inputSignal.reason)\n else inputSignal.addEventListener('abort', abortFromInput, { once: true })\n }\n if (config.timeout !== undefined && config.timeout > 0) {\n timeoutId = setTimeout(() => {\n timedOut = true\n controller.abort()\n }, config.timeout)\n }\n\n const adapterConfig: RequestConfig = { ...config, signal: controller.signal }\n let attempt = 0\n try {\n while (true) {\n try {\n const result = await requestAdapter(adapterConfig)\n const response = isHTTPResponse(result)\n ? result\n : await parseResponse(result, adapterConfig)\n if (response.status < 200 || response.status >= 300) throw new HTTPError(response)\n return response\n } catch (error) {\n if (timedOut) throw new TimeoutError(config.timeout!)\n if (inputSignal?.aborted || isAbortError(error)) throw error\n const nextAttempt = attempt + 1\n if (nextAttempt > (config.retry ?? 0)) throw toError(error)\n const shouldRetry = config.shouldRetry\n ? await config.shouldRetry(toError(error), nextAttempt)\n : isRetryable(error)\n if (!shouldRetry) throw toError(error)\n attempt = nextAttempt\n const retryContext = {\n ...getRuntimeDebugContext(),\n ...config.debugContext\n }\n emitHTTPDebug({\n id: debugId ?? 0,\n phase: 'retry',\n status: 'retrying',\n url: config.url,\n method: config.method,\n headers: debugHeaders(config.headers),\n requestBody: debugValue(config.body),\n startedAt: Date.now(),\n attempt,\n retries: attempt,\n error: { name: toError(error).name, message: toError(error).message },\n context: Object.keys(retryContext).length > 0 ? retryContext : undefined\n })\n const delay = resolveRetryDelay(config.retryDelay ?? 0, attempt, toError(error))\n if (delay > 0) await wait(delay)\n }\n }\n } finally {\n if (timeoutId !== undefined) clearTimeout(timeoutId)\n inputSignal?.removeEventListener('abort', abortFromInput)\n }\n }\n}\n\nfunction debugHeaders(headers: HTTPHeaders): HTTPHeaders {\n const safe: HTTPHeaders = {}\n for (const [key, value] of Object.entries(headers)) {\n if (/authorization|cookie|token|password|secret|api[-_]?key/i.test(key)) continue\n safe[key] = value\n }\n return safe\n}\n\nfunction debugValue(value: unknown, depth = 0): unknown {\n if (value === null || typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') return value\n if (value === undefined) return undefined\n if (depth >= 2) return '[MaxDepth]'\n if (typeof value === 'bigint') return `${value}n`\n if (typeof value === 'function') return `[Function ${value.name || 'anonymous'}]`\n if (typeof value !== 'object') return String(value)\n if (Array.isArray(value)) return value.slice(0, 20).map(item => debugValue(item, depth + 1))\n try {\n return Object.fromEntries(Object.entries(value).slice(0, 30).map(([key, item]) => [key, debugValue(item, depth + 1)]))\n } catch {\n return '[Uninspectable]'\n }\n}\n\nexport function httpPlugin(options: HTTPPluginOptions = {}): VobsPlugin {\n return {\n name: '@vobs/http',\n version: '0.1.0',\n install(context) {\n const client = options.client ?? createHTTPClient(options)\n context.provide(HTTP_KEY, client)\n }\n }\n}\n\nfunction createInterceptors<T>(): InterceptorManager<T> & {\n handlers(): Array<{ onFulfilled: (value: unknown) => unknown; onRejected: (error: unknown) => unknown }>\n} {\n type Handler = {\n onFulfilled: (value: unknown) => unknown\n onRejected: (error: unknown) => unknown\n }\n const entries: Array<Handler | null> = []\n\n return {\n use(\n onFulfilled?: (value: T) => unknown | PromiseLike<unknown>,\n onRejected?: (error: unknown) => unknown | PromiseLike<unknown>\n ) {\n entries.push({\n onFulfilled: (value: unknown) => onFulfilled ? onFulfilled(value as T) : value,\n onRejected: (error: unknown) => onRejected ? onRejected(error) : Promise.reject(error)\n })\n return entries.length - 1\n },\n eject(id) {\n if (id >= 0 && id < entries.length) entries[id] = null\n },\n clear() {\n entries.fill(null)\n },\n handlers() {\n return entries.filter((entry): entry is Handler => entry !== null)\n }\n }\n}\n\nfunction normalizeClientOptions(options: HTTPClientOptions): Required<Pick<HTTPClientOptions, 'baseURL' | 'headers' | 'timeout' | 'retry' | 'retryDelay'>> & Pick<HTTPClientOptions, 'shouldRetry'> {\n return {\n baseURL: options.baseURL ?? '',\n headers: options.headers ?? {},\n timeout: validateTimeout(options.timeout ?? 0),\n retry: validateRetry(options.retry ?? 0),\n retryDelay: options.retryDelay ?? 0,\n shouldRetry: options.shouldRetry\n }\n}\n\nexport function createConcurrencyLimiter(limit: number): ConcurrencyLimiter {\n if (limit !== Infinity && (!Number.isFinite(limit) || limit < 1 || !Number.isInteger(limit))) {\n throw new Error('HTTP: concurrency 必须是大于等于 1 的整数')\n }\n let active = 0\n const queue: Array<() => void> = []\n\n return <T>(task: () => T | PromiseLike<T>): Promise<T> => new Promise<T>((resolve, reject) => {\n const run = (): void => {\n active++\n Promise.resolve().then(task).then(resolve, reject).finally(() => {\n active--\n queue.shift()?.()\n })\n }\n if (active < limit) run()\n else queue.push(run)\n })\n}\n\nfunction getDedupeKey(config: RequestConfig, defaultEnabled: boolean): string | undefined {\n if (config.dedupe === false) return undefined\n if (config.dedupeKey) return config.dedupeKey\n if (!(config.dedupe ?? defaultEnabled)) return undefined\n if (config.method !== 'GET' && config.method !== 'HEAD') return undefined\n return `${config.method} ${config.url}`\n}\n\nfunction normalizeRequest(input: RequestOptions, defaults: ReturnType<typeof normalizeClientOptions>): RequestConfig {\n if (!input.url) throw new Error('HTTP: url 不能为空')\n const method = (input.method ?? 'GET').toUpperCase() as HTTPMethod\n const timeout = validateTimeout(input.timeout ?? defaults.timeout)\n const retry = validateRetry(input.retry ?? defaults.retry)\n const retryDelay = input.retryDelay ?? defaults.retryDelay\n const signal = input.signal ?? input.state\n if (input.signal && input.state && input.signal !== input.state) {\n throw new Error('HTTP: signal 和 state 不能同时指向不同的 AbortSignal')\n }\n return {\n ...input,\n url: appendParams(resolveURL(input.url, input.baseURL ?? defaults.baseURL), input.params),\n method,\n headers: toHeaders(defaults.headers, input.headers),\n timeout,\n retry,\n retryDelay,\n shouldRetry: input.shouldRetry ?? defaults.shouldRetry,\n signal\n }\n}\n\nasync function fetchAdapter(config: RequestConfig): Promise<Response> {\n if (typeof fetch !== 'function') throw new Error('HTTP: 当前环境没有可用的 fetch')\n const headers = new Headers(config.headers)\n const body = encodeBody(config.body, headers, config.method)\n return fetch(config.url, {\n method: config.method,\n headers,\n body,\n signal: config.signal,\n cache: config.cache,\n credentials: config.credentials,\n mode: config.mode\n })\n}\n\nasync function parseResponse(response: Response, config: RequestConfig): Promise<HTTPResponse<unknown>> {\n const data = config.responseType === 'response'\n ? response\n : await parseBody(response, config.responseType, hasHandledProgress(response) ? undefined : config.onDownloadProgress)\n return {\n data,\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n config,\n raw: response\n }\n}\n\nconst builtInAxiosRequest: AxiosRequest = async <T = unknown>(config: AxiosRequestConfigLike) => {\n const responseType = config.responseType === 'response' ? 'arraybuffer' : toAxiosResponseType(config.responseType)\n const response = await axios.request<T>({\n url: config.url,\n method: config.method,\n headers: config.headers,\n data: config.method === 'GET' || config.method === 'HEAD' ? undefined : config.body,\n signal: config.signal,\n timeout: config.timeout,\n responseType,\n withCredentials: toAxiosCredentials(config.credentials),\n validateStatus: () => true,\n adapter: 'fetch',\n fetchOptions: compactFetchOptions(config),\n onUploadProgress: event => config.onUploadProgress?.(toAxiosProgress(event.loaded, event.total)),\n onDownloadProgress: event => config.onDownloadProgress?.(toAxiosProgress(event.loaded, event.total))\n })\n const raw = config.responseType === 'response'\n ? toRawResponse(response.data, response.status, response.statusText, response.headers as unknown as HeadersInit)\n : null\n return {\n data: (raw ?? response.data) as T,\n status: response.status,\n statusText: response.statusText,\n headers: (typeof response.headers?.toJSON === 'function' ? response.headers.toJSON() : response.headers) as HeadersInit,\n raw\n }\n}\n\nfunction toAxiosCredentials(credentials?: RequestCredentials): boolean | undefined {\n if (credentials === 'include') return true\n if (credentials === 'omit') return false\n return undefined\n}\n\nfunction toRawResponse(data: unknown, status: number, statusText: string | undefined, headers: HeadersInit | undefined): Response {\n if (typeof Response === 'undefined') throw new Error('HTTP: 当前环境没有可用的 Response')\n const body = status === 204 || status === 205 ? null : data as BodyInit | null | undefined\n return new Response(body, {\n status,\n statusText: statusText ?? '',\n headers: new Headers(headers)\n })\n}\n\nfunction toAxiosResponseType(responseType?: HTTPResponseType): 'arraybuffer' | 'blob' | 'json' | 'text' | undefined {\n if (responseType === 'arrayBuffer') return 'arraybuffer'\n if (responseType === 'response') return undefined\n return responseType\n}\n\nfunction compactFetchOptions(config: RequestConfig): Record<string, unknown> | undefined {\n const options = {\n cache: config.cache,\n credentials: config.credentials,\n mode: config.mode\n }\n const entries = Object.entries(options).filter(([, value]) => value !== undefined)\n return entries.length === 0 ? undefined : Object.fromEntries(entries)\n}\n\nfunction toAxiosProgress(loaded: number, total: number | undefined): HTTPProgress {\n return {\n loaded,\n total,\n percent: total && total > 0 ? loaded / total * 100 : undefined\n }\n}\n\nasync function parseBody(\n response: Response,\n responseType?: HTTPResponseType,\n onDownloadProgress?: HTTPProgressHandler\n): Promise<unknown> {\n if (response.status === 204 || response.status === 205) return null\n const bytes = onDownloadProgress && response.body\n ? await readResponseBytes(response, onDownloadProgress)\n : undefined\n if (responseType === 'blob') return bytes ? new Blob([bytes as unknown as BlobPart]) : response.blob()\n if (responseType === 'arrayBuffer') return bytes ? bytes.buffer : response.arrayBuffer()\n const text = bytes ? new TextDecoder().decode(bytes) : await response.text()\n if (responseType === 'text') return text\n if (!text) return null\n if (responseType === 'json' || response.headers.get('content-type')?.includes('json')) {\n try {\n return JSON.parse(text)\n } catch {\n throw new Error('HTTP: 响应不是有效 JSON')\n }\n }\n return text\n}\n\nasync function readResponseBytes(response: Response, onProgress: HTTPProgressHandler): Promise<Uint8Array> {\n const reader = response.body!.getReader()\n const chunks: Uint8Array[] = []\n const totalHeader = response.headers.get('content-length')\n const parsedTotal = totalHeader ? Number(totalHeader) : NaN\n const total = Number.isFinite(parsedTotal) && parsedTotal >= 0 ? parsedTotal : undefined\n let loaded = 0\n while (true) {\n const next = await reader.read()\n if (next.done) break\n chunks.push(next.value)\n loaded += next.value.byteLength\n onProgress(toProgress(loaded, total))\n }\n const result = new Uint8Array(loaded)\n let offset = 0\n for (const chunk of chunks) {\n result.set(chunk, offset)\n offset += chunk.byteLength\n }\n return result\n}\n\nfunction isHTTPResponse(value: unknown): value is HTTPResponse<unknown> {\n return typeof value === 'object' && value !== null && 'data' in value && 'status' in value && 'config' in value\n}\n\nfunction isResponse(value: unknown): value is Response {\n return typeof Response !== 'undefined' && value instanceof Response\n}\n\nfunction hasHandledProgress(response: Response): boolean {\n return Boolean((response as Response & { [PROGRESS_HANDLED]?: boolean })[PROGRESS_HANDLED])\n}\n\nfunction encodeBody(body: unknown, headers: Headers, method: HTTPMethod): BodyInit | undefined {\n if (body === undefined || body === null || method === 'GET' || method === 'HEAD') return undefined\n if (typeof body === 'string' || body instanceof Blob || body instanceof FormData\n || body instanceof ArrayBuffer || body instanceof URLSearchParams) return body as BodyInit\n if (!headers.has('content-type')) headers.set('content-type', 'application/json')\n return JSON.stringify(body)\n}\n\nfunction toHeaders(...inputs: Array<HeadersInit | undefined>): HTTPHeaders {\n const headers = new Headers()\n for (const input of inputs) {\n if (!input) continue\n new Headers(input).forEach((value, key) => headers.set(key, value))\n }\n const result: HTTPHeaders = {}\n headers.forEach((value, key) => { result[key] = value })\n return result\n}\n\nfunction resolveURL(url: string, baseURL: string): string {\n if (!baseURL || /^[a-z][a-z\\d+.-]*:/i.test(url) || url.startsWith('//')) return url\n if (!baseURL) return url\n return `${baseURL.replace(/\\/$/, '')}/${url.replace(/^\\//, '')}`\n}\n\nfunction appendParams(url: string, params?: Record<string, unknown> | URLSearchParams): string {\n if (!params) return url\n const query = params instanceof URLSearchParams ? params : toSearchParams(params)\n const serialized = query.toString()\n if (!serialized) return url\n return `${url}${url.includes('?') ? '&' : '?'}${serialized}`\n}\n\nfunction toSearchParams(params: Record<string, unknown>): URLSearchParams {\n const search = new URLSearchParams()\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined || value === null) continue\n if (Array.isArray(value)) {\n for (const item of value) search.append(key, String(item))\n } else if (typeof value === 'object') {\n search.set(key, JSON.stringify(value))\n } else {\n search.set(key, String(value))\n }\n }\n return search\n}\n\nfunction isRetryable(error: unknown): boolean {\n return error instanceof HTTPError\n ? error.status === 429 || error.status >= 500\n : !isAbortError(error)\n}\n\nfunction isAbortError(error: unknown): boolean {\n return Boolean(error) && typeof error === 'object'\n && ((error as { name?: unknown }).name === 'AbortError'\n || (error as { code?: unknown }).code === 'ERR_CANCELED')\n}\n\nfunction resolveRetryDelay(retryDelay: RetryDelay, attempt: number, error: Error): number {\n const delay = typeof retryDelay === 'function' ? retryDelay(attempt, error) : retryDelay\n if (!Number.isFinite(delay) || delay < 0) throw new Error('HTTP: retryDelay 必须是大于等于 0 的有限数字')\n return delay\n}\n\nfunction validateRetry(retry: number): number {\n if (!Number.isInteger(retry) || retry < 0) throw new Error('HTTP: retry 必须是大于等于 0 的整数')\n return retry\n}\n\nfunction validateTimeout(timeout: number): number {\n if (!Number.isFinite(timeout) || timeout < 0) throw new Error('HTTP: timeout 必须是大于等于 0 的有限数字')\n return timeout\n}\n\nfunction toError(error: unknown): Error {\n return error instanceof Error ? error : new Error(String(error))\n}\n\nfunction wait(delay: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, delay))\n}\n\nfunction toProgress(loaded: number, total: number | undefined): HTTPProgress {\n return {\n loaded,\n total,\n percent: total && total > 0 ? loaded / total * 100 : undefined\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/stream.ts","../src/debug.ts"],"sourcesContent":["import { createInjectionKey, type VobsPlugin } from '@vobs/vobs'\nimport axios from 'axios'\nexport { createSSE, createWebSocket } from './stream'\nimport { emitHTTPDebug } from './debug'\nimport { getRuntimeDebugContext } from '@vobs/runtime'\n\nexport { emitHTTPDebug, getHTTPDebugHooks, setHTTPDebugHooks, subscribeHTTPDebug } from './debug'\nexport type { HTTPDebugCacheStatus, HTTPDebugContext, HTTPDebugHooks, HTTPDebugRequest, HTTPDebugStatus } from './debug'\nexport type {\n SSEClient,\n SSEConstructor,\n SSEOptions,\n WebSocketClient,\n WebSocketConstructor,\n WebSocketEventListener,\n WebSocketEventName,\n WebSocketOptions,\n WebSocketState\n} from './stream'\n\nexport type HTTPMethod = 'DELETE' | 'GET' | 'HEAD' | 'OPTIONS' | 'PATCH' | 'POST' | 'PUT'\nexport type HTTPResponseType = 'arrayBuffer' | 'blob' | 'json' | 'response' | 'text'\nexport type HTTPHeaders = Record<string, string>\nexport type RetryDelay = number | ((attempt: number, error: Error) => number)\nexport interface HTTPProgress {\n readonly loaded: number\n readonly total: number | undefined\n readonly percent: number | undefined\n}\nexport type HTTPProgressHandler = (progress: HTTPProgress) => void\nconst PROGRESS_HANDLED = Symbol('vobs.http.progress-handled')\nlet nextHTTPDebugId = 1\n\nexport interface RequestOptions {\n url: string\n method?: HTTPMethod\n baseURL?: string\n headers?: HeadersInit\n params?: Record<string, unknown> | URLSearchParams\n body?: unknown\n signal?: AbortSignal\n /** @deprecated Use signal. */\n state?: AbortSignal\n timeout?: number\n retry?: number\n retryDelay?: RetryDelay\n shouldRetry?: (error: Error, attempt: number) => boolean | PromiseLike<boolean>\n cache?: RequestCache\n credentials?: RequestCredentials\n mode?: RequestMode\n responseType?: HTTPResponseType\n onUploadProgress?: HTTPProgressHandler\n onDownloadProgress?: HTTPProgressHandler\n /** Share an in-flight request with the same dedupe key. */\n dedupe?: boolean\n dedupeKey?: string\n /** Optional context copied into DevTools request traces. */\n debugContext?: import('./debug').HTTPDebugContext\n}\n\nexport interface RequestConfig extends Omit<RequestOptions, 'headers' | 'method'> {\n readonly method: HTTPMethod\n headers: HTTPHeaders\n readonly url: string\n}\n\nexport interface HTTPResponse<T = unknown> {\n readonly data: T\n readonly status: number\n readonly statusText: string\n readonly headers: Headers\n readonly config: RequestConfig\n readonly raw: Response | null\n}\n\n/** Adapt an HTTP request to the fetcher contract used by Resource. */\nexport type HTTPResourceRequest<T> = (\n signal: AbortSignal\n) => HTTPResponse<T> | PromiseLike<HTTPResponse<T>>\n\nexport function toResourceFetcher<T>(request: HTTPResourceRequest<T>): (signal: AbortSignal) => Promise<T> {\n return signal => Promise.resolve()\n .then(() => request(signal))\n .then(response => response.data)\n}\n\nexport type HTTPAdapter = (\n config: RequestConfig\n) => Response | HTTPResponse<unknown> | PromiseLike<Response | HTTPResponse<unknown>>\n\nexport interface AxiosResponseLike<T = unknown> {\n readonly data: T\n readonly status: number\n readonly statusText?: string\n readonly headers?: HeadersInit\n readonly raw?: Response | null\n}\n\nexport type AxiosRequestConfigLike = RequestConfig & { readonly data?: unknown }\nexport type AxiosRequest = <T = unknown>(config: AxiosRequestConfigLike) => PromiseLike<AxiosResponseLike<T>>\n\n/** Bridges an Axios request function while preserving HTTPResponse<T>.data typing. */\nexport function createAxiosAdapter(request: AxiosRequest = builtInAxiosRequest): HTTPAdapter {\n return async config => {\n // normalizeRequest has already serialized params into config.url. Omit\n // params before invoking a custom Axios request so spreading this config\n // into axios.request cannot append the query string a second time.\n const { params: _params, ...requestConfig } = config\n const response = await request<unknown>({ ...requestConfig, data: config.body })\n return {\n data: response.data,\n status: response.status,\n statusText: response.statusText ?? '',\n headers: new Headers(response.headers),\n config,\n raw: response.raw ?? null\n }\n }\n}\n\n/**\n * Creates an adapter for deterministic local handlers and test transports.\n * Returning a Response or HTTPResponse keeps full control over status and\n * headers; any other value becomes a successful 200 payload.\n */\nexport function createMockAdapter(\n handler: (config: RequestConfig) => unknown | PromiseLike<unknown>\n): HTTPAdapter {\n return async config => {\n const result = await handler(config)\n if (isResponse(result) || isHTTPResponse(result)) return result\n return {\n data: result,\n status: 200,\n statusText: 'OK',\n headers: new Headers(),\n config,\n raw: null\n }\n }\n}\n\n/** XMLHttpRequest adapter for upload and download progress events. */\nexport function createXHRAdapter(): HTTPAdapter {\n return config => new Promise<Response>((resolve, reject) => {\n if (typeof XMLHttpRequest === 'undefined') {\n reject(new Error('HTTP: 当前环境没有可用的 XMLHttpRequest'))\n return\n }\n const xhr = new XMLHttpRequest()\n xhr.open(config.method, config.url, true)\n if (config.responseType === 'arrayBuffer') xhr.responseType = 'arraybuffer'\n else if (config.responseType === 'blob') xhr.responseType = 'blob'\n const signal = config.signal ?? config.state\n const abort = (): void => xhr.abort()\n if (signal?.aborted) {\n reject(Object.assign(new Error('The operation was aborted'), { name: 'AbortError' }))\n return\n }\n const cleanup = (): void => signal?.removeEventListener('abort', abort)\n signal?.addEventListener('abort', abort, { once: true })\n xhr.upload.onprogress = event => config.onUploadProgress?.(toProgress(event.loaded, event.lengthComputable ? event.total : undefined))\n xhr.onprogress = event => config.onDownloadProgress?.(toProgress(event.loaded, event.lengthComputable ? event.total : undefined))\n xhr.onload = () => {\n cleanup()\n const headers = new Headers()\n xhr.getAllResponseHeaders().trim().split(/[\\r\\n]+/).forEach(line => {\n const separator = line.indexOf(':')\n if (separator > 0) headers.set(line.slice(0, separator).trim(), line.slice(separator + 1).trim())\n })\n const body = config.responseType === 'arrayBuffer' || config.responseType === 'blob'\n ? xhr.response\n : xhr.responseText\n const response = new Response(body, {\n status: xhr.status,\n statusText: xhr.statusText,\n headers\n })\n Object.defineProperty(response, PROGRESS_HANDLED, { value: true })\n resolve(response)\n }\n xhr.onerror = () => { cleanup(); reject(new Error('HTTP: XMLHttpRequest 网络错误')) }\n xhr.onabort = () => {\n cleanup()\n reject(Object.assign(new Error('The operation was aborted'), { name: 'AbortError' }))\n }\n try {\n const headers = new Headers(config.headers)\n const body = encodeBody(config.body, headers, config.method)\n headers.forEach((value, key) => xhr.setRequestHeader(key, value))\n xhr.send((body ?? null) as Document | XMLHttpRequestBodyInit | null)\n } catch (error) {\n cleanup()\n reject(error)\n }\n })\n}\n\n/** Explicit fetch transport for applications that do not want the built-in Axios transport. */\nexport function createFetchAdapter(): HTTPAdapter {\n return fetchAdapter\n}\n\nexport interface HTTPClientOptions {\n baseURL?: string\n headers?: HeadersInit\n timeout?: number\n adapter?: HTTPAdapter\n retry?: number\n retryDelay?: RetryDelay\n shouldRetry?: (error: Error, attempt: number) => boolean | PromiseLike<boolean>\n concurrency?: number\n dedupe?: boolean\n}\n\nexport interface InterceptorManager<T> {\n use<TResult = T>(\n onFulfilled?: (value: T) => TResult | PromiseLike<TResult>,\n onRejected?: (error: unknown) => TResult | PromiseLike<TResult>\n ): number\n eject(id: number): void\n clear(): void\n}\n\nexport interface HTTPInterceptors {\n readonly request: InterceptorManager<RequestConfig>\n readonly response: InterceptorManager<HTTPResponse<unknown>>\n}\n\nexport interface HTTPClient {\n readonly interceptors: HTTPInterceptors\n request<T = unknown>(options: RequestOptions): Promise<HTTPResponse<T>>\n get<T = unknown>(url: string, options?: Omit<RequestOptions, 'url' | 'method' | 'body'>): Promise<HTTPResponse<T>>\n delete<T = unknown>(url: string, options?: Omit<RequestOptions, 'url' | 'method' | 'body'>): Promise<HTTPResponse<T>>\n head<T = unknown>(url: string, options?: Omit<RequestOptions, 'url' | 'method' | 'body'>): Promise<HTTPResponse<T>>\n post<T = unknown>(url: string, body?: unknown, options?: Omit<RequestOptions, 'url' | 'method' | 'body'>): Promise<HTTPResponse<T>>\n put<T = unknown>(url: string, body?: unknown, options?: Omit<RequestOptions, 'url' | 'method' | 'body'>): Promise<HTTPResponse<T>>\n patch<T = unknown>(url: string, body?: unknown, options?: Omit<RequestOptions, 'url' | 'method' | 'body'>): Promise<HTTPResponse<T>>\n}\n\nexport interface ConcurrencyLimiter {\n <T>(task: () => T | PromiseLike<T>): Promise<T>\n}\n\nexport class HTTPError extends Error {\n readonly status: number\n readonly statusText: string\n readonly data: unknown\n readonly config: RequestConfig\n readonly response: HTTPResponse<unknown>\n\n constructor(response: HTTPResponse<unknown>) {\n super(`HTTP ${response.status}${response.statusText ? ` ${response.statusText}` : ''}`)\n this.name = 'HTTPError'\n this.status = response.status\n this.statusText = response.statusText\n this.data = response.data\n this.config = response.config\n this.response = response\n }\n}\n\nexport class TimeoutError extends Error {\n readonly code = 'ETIMEDOUT'\n\n constructor(timeout: number) {\n super(`HTTP 请求超过 ${timeout}ms 未完成`)\n this.name = 'TimeoutError'\n }\n}\n\nexport const HTTP_KEY = createInjectionKey<HTTPClient>('vobs.http')\n\nexport interface HTTPPluginOptions extends HTTPClientOptions {\n client?: HTTPClient\n}\n\nexport function createHTTPClient(options: HTTPClientOptions = {}): HTTPClient {\n const defaults = normalizeClientOptions(options)\n const requestInterceptors = createInterceptors<RequestConfig>()\n const responseInterceptors = createInterceptors<HTTPResponse<unknown>>()\n const adapter = options.adapter ?? createAxiosAdapter()\n const limiter = createConcurrencyLimiter(options.concurrency ?? Infinity)\n const pending = new Map<string, Promise<HTTPResponse<unknown>>>()\n\n async function request<T>(input: RequestOptions): Promise<HTTPResponse<T>> {\n const initial = normalizeRequest(input, defaults)\n const dedupeKey = getDedupeKey(initial, options.dedupe ?? false)\n if (dedupeKey) {\n const existing = pending.get(dedupeKey)\n if (existing) return existing as Promise<HTTPResponse<T>>\n const shared = executeDebugRequest(initial)\n pending.set(dedupeKey, shared)\n void shared.finally(() => pending.delete(dedupeKey)).catch(() => undefined)\n return shared as Promise<HTTPResponse<T>>\n }\n return executeDebugRequest(initial) as Promise<HTTPResponse<T>>\n }\n\n function executeDebugRequest(initial: RequestConfig): Promise<HTTPResponse<unknown>> {\n const id = nextHTTPDebugId++\n const startedAt = Date.now()\n const context = {\n ...getRuntimeDebugContext(),\n ...initial.debugContext\n }\n emitHTTPDebug({\n id,\n phase: 'start',\n status: 'loading',\n url: initial.url,\n method: initial.method,\n headers: debugHeaders(initial.headers),\n requestBody: debugValue(initial.body),\n startedAt,\n attempt: 0,\n retries: 0,\n context: Object.keys(context).length > 0 ? context : undefined\n })\n return executeRequest(initial, id).then(response => {\n const endedAt = Date.now()\n emitHTTPDebug({\n id,\n phase: 'end',\n status: 'success',\n url: response.config.url,\n method: response.config.method,\n headers: debugHeaders(response.config.headers),\n requestBody: debugValue(response.config.body),\n startedAt,\n endedAt,\n duration: endedAt - startedAt,\n attempt: 0,\n retries: 0,\n responseStatus: response.status,\n responseBody: debugValue(response.data),\n context: Object.keys(context).length > 0 ? context : undefined\n })\n return response\n }, error => {\n const endedAt = Date.now()\n const cancelled = isAbortError(error)\n emitHTTPDebug({\n id,\n phase: 'end',\n status: cancelled ? 'cancelled' : 'error',\n url: initial.url,\n method: initial.method,\n headers: debugHeaders(initial.headers),\n requestBody: debugValue(initial.body),\n startedAt,\n endedAt,\n duration: endedAt - startedAt,\n attempt: 0,\n retries: 0,\n responseStatus: error instanceof HTTPError ? error.status : undefined,\n responseBody: error instanceof HTTPError ? debugValue(error.data) : undefined,\n error: { name: error instanceof Error ? error.name : 'Error', message: error instanceof Error ? error.message : String(error) },\n context: Object.keys(context).length > 0 ? context : undefined\n })\n throw error\n })\n }\n\n async function executeRequest(initial: RequestConfig, debugId?: number): Promise<HTTPResponse<unknown>> {\n const requestChain = requestInterceptors.handlers()\n const responseChain = responseInterceptors.handlers().reverse()\n\n let chain: Promise<unknown> = Promise.resolve(initial)\n for (const handler of requestChain) {\n chain = chain.then(handler.onFulfilled, handler.onRejected)\n }\n chain = chain.then(config => limiter(() => executeWithRetry(config as RequestConfig, adapter, debugId)))\n for (const handler of responseChain) {\n chain = chain.then(handler.onFulfilled, handler.onRejected)\n }\n return chain as Promise<HTTPResponse<unknown>>\n }\n\n function method<T>(methodName: HTTPMethod, url: string, input: Omit<RequestOptions, 'url' | 'method' | 'body'> = {}): Promise<HTTPResponse<T>> {\n return request<T>({ ...input, url, method: methodName })\n }\n\n function methodWithBody<T>(methodName: HTTPMethod, url: string, body: unknown, input: Omit<RequestOptions, 'url' | 'method' | 'body'> = {}): Promise<HTTPResponse<T>> {\n return request<T>({ ...input, url, method: methodName, body })\n }\n\n const client: HTTPClient = {\n interceptors: {\n request: requestInterceptors,\n response: responseInterceptors\n },\n request,\n get: (url, input) => method('GET', url, input),\n delete: (url, input) => method('DELETE', url, input),\n head: (url, input) => method('HEAD', url, input),\n post: (url, body, input) => methodWithBody('POST', url, body, input),\n put: (url, body, input) => methodWithBody('PUT', url, body, input),\n patch: (url, body, input) => methodWithBody('PATCH', url, body, input)\n }\n return client\n\n async function executeWithRetry(config: RequestConfig, requestAdapter: HTTPAdapter, debugId?: number): Promise<HTTPResponse<unknown>> {\n const controller = new AbortController()\n const inputSignal = config.signal ?? config.state\n let timedOut = false\n let timeoutId: ReturnType<typeof setTimeout> | undefined\n const abortFromInput = (): void => controller.abort(inputSignal?.reason)\n\n if (inputSignal) {\n if (inputSignal.aborted) controller.abort(inputSignal.reason)\n else inputSignal.addEventListener('abort', abortFromInput, { once: true })\n }\n if (config.timeout !== undefined && config.timeout > 0) {\n timeoutId = setTimeout(() => {\n timedOut = true\n controller.abort()\n }, config.timeout)\n }\n\n const adapterConfig: RequestConfig = { ...config, signal: controller.signal }\n let attempt = 0\n try {\n while (true) {\n try {\n const result = await requestAdapter(adapterConfig)\n const response = isHTTPResponse(result)\n ? result\n : await parseResponse(result, adapterConfig)\n if (response.status < 200 || response.status >= 300) throw new HTTPError(response)\n return response\n } catch (error) {\n if (timedOut) throw new TimeoutError(config.timeout!)\n if (inputSignal?.aborted || isAbortError(error)) throw error\n const nextAttempt = attempt + 1\n if (nextAttempt > (config.retry ?? 0)) throw toError(error)\n const shouldRetry = config.shouldRetry\n ? await config.shouldRetry(toError(error), nextAttempt)\n : isRetryable(error)\n if (!shouldRetry) throw toError(error)\n attempt = nextAttempt\n const retryContext = {\n ...getRuntimeDebugContext(),\n ...config.debugContext\n }\n emitHTTPDebug({\n id: debugId ?? 0,\n phase: 'retry',\n status: 'retrying',\n url: config.url,\n method: config.method,\n headers: debugHeaders(config.headers),\n requestBody: debugValue(config.body),\n startedAt: Date.now(),\n attempt,\n retries: attempt,\n error: { name: toError(error).name, message: toError(error).message },\n context: Object.keys(retryContext).length > 0 ? retryContext : undefined\n })\n const delay = resolveRetryDelay(config.retryDelay ?? 0, attempt, toError(error))\n if (delay > 0) await wait(delay)\n }\n }\n } finally {\n if (timeoutId !== undefined) clearTimeout(timeoutId)\n inputSignal?.removeEventListener('abort', abortFromInput)\n }\n }\n}\n\nfunction debugHeaders(headers: HTTPHeaders): HTTPHeaders {\n const safe: HTTPHeaders = {}\n for (const [key, value] of Object.entries(headers)) {\n if (/authorization|cookie|token|password|secret|api[-_]?key/i.test(key)) continue\n safe[key] = value\n }\n return safe\n}\n\nfunction debugValue(value: unknown, depth = 0): unknown {\n if (value === null || typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') return value\n if (value === undefined) return undefined\n if (depth >= 2) return '[MaxDepth]'\n if (typeof value === 'bigint') return `${value}n`\n if (typeof value === 'function') return `[Function ${value.name || 'anonymous'}]`\n if (typeof value !== 'object') return String(value)\n if (Array.isArray(value)) return value.slice(0, 20).map(item => debugValue(item, depth + 1))\n try {\n return Object.fromEntries(Object.entries(value).slice(0, 30).map(([key, item]) => [key, debugValue(item, depth + 1)]))\n } catch {\n return '[Uninspectable]'\n }\n}\n\nexport function httpPlugin(options: HTTPPluginOptions = {}): VobsPlugin {\n return {\n name: '@vobs/http',\n version: '0.1.0',\n install(context) {\n const client = options.client ?? createHTTPClient(options)\n context.provide(HTTP_KEY, client)\n }\n }\n}\n\nfunction createInterceptors<T>(): InterceptorManager<T> & {\n handlers(): Array<{ onFulfilled: (value: unknown) => unknown; onRejected: (error: unknown) => unknown }>\n} {\n type Handler = {\n onFulfilled: (value: unknown) => unknown\n onRejected: (error: unknown) => unknown\n }\n const entries: Array<Handler | null> = []\n\n return {\n use(\n onFulfilled?: (value: T) => unknown | PromiseLike<unknown>,\n onRejected?: (error: unknown) => unknown | PromiseLike<unknown>\n ) {\n entries.push({\n onFulfilled: (value: unknown) => onFulfilled ? onFulfilled(value as T) : value,\n onRejected: (error: unknown) => onRejected ? onRejected(error) : Promise.reject(error)\n })\n return entries.length - 1\n },\n eject(id) {\n if (id >= 0 && id < entries.length) entries[id] = null\n },\n clear() {\n entries.fill(null)\n },\n handlers() {\n return entries.filter((entry): entry is Handler => entry !== null)\n }\n }\n}\n\nfunction normalizeClientOptions(options: HTTPClientOptions): Required<Pick<HTTPClientOptions, 'baseURL' | 'headers' | 'timeout' | 'retry' | 'retryDelay'>> & Pick<HTTPClientOptions, 'shouldRetry'> {\n return {\n baseURL: options.baseURL ?? '',\n headers: options.headers ?? {},\n timeout: validateTimeout(options.timeout ?? 0),\n retry: validateRetry(options.retry ?? 0),\n retryDelay: options.retryDelay ?? 0,\n shouldRetry: options.shouldRetry\n }\n}\n\nexport function createConcurrencyLimiter(limit: number): ConcurrencyLimiter {\n if (limit !== Infinity && (!Number.isFinite(limit) || limit < 1 || !Number.isInteger(limit))) {\n throw new Error('HTTP: concurrency 必须是大于等于 1 的整数')\n }\n let active = 0\n const queue: Array<() => void> = []\n\n return <T>(task: () => T | PromiseLike<T>): Promise<T> => new Promise<T>((resolve, reject) => {\n const run = (): void => {\n active++\n Promise.resolve().then(task).then(resolve, reject).finally(() => {\n active--\n queue.shift()?.()\n })\n }\n if (active < limit) run()\n else queue.push(run)\n })\n}\n\nfunction getDedupeKey(config: RequestConfig, defaultEnabled: boolean): string | undefined {\n if (config.dedupe === false) return undefined\n if (config.dedupeKey) return config.dedupeKey\n if (!(config.dedupe ?? defaultEnabled)) return undefined\n if (config.method !== 'GET' && config.method !== 'HEAD') return undefined\n return `${config.method} ${config.url}`\n}\n\nfunction normalizeRequest(input: RequestOptions, defaults: ReturnType<typeof normalizeClientOptions>): RequestConfig {\n if (!input.url) throw new Error('HTTP: url 不能为空')\n const method = (input.method ?? 'GET').toUpperCase() as HTTPMethod\n const timeout = validateTimeout(input.timeout ?? defaults.timeout)\n const retry = validateRetry(input.retry ?? defaults.retry)\n const retryDelay = input.retryDelay ?? defaults.retryDelay\n const signal = input.signal ?? input.state\n if (input.signal && input.state && input.signal !== input.state) {\n throw new Error('HTTP: signal 和 state 不能同时指向不同的 AbortSignal')\n }\n return {\n ...input,\n url: appendParams(resolveURL(input.url, input.baseURL ?? defaults.baseURL), input.params),\n method,\n headers: toHeaders(defaults.headers, input.headers),\n timeout,\n retry,\n retryDelay,\n shouldRetry: input.shouldRetry ?? defaults.shouldRetry,\n signal\n }\n}\n\nasync function fetchAdapter(config: RequestConfig): Promise<Response> {\n if (typeof fetch !== 'function') throw new Error('HTTP: 当前环境没有可用的 fetch')\n const headers = new Headers(config.headers)\n const body = encodeBody(config.body, headers, config.method)\n return fetch(config.url, {\n method: config.method,\n headers,\n body,\n signal: config.signal,\n cache: config.cache,\n credentials: config.credentials,\n mode: config.mode\n })\n}\n\nasync function parseResponse(response: Response, config: RequestConfig): Promise<HTTPResponse<unknown>> {\n const data = config.responseType === 'response'\n ? response\n : await parseBody(response, config.responseType, hasHandledProgress(response) ? undefined : config.onDownloadProgress)\n return {\n data,\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n config,\n raw: response\n }\n}\n\nconst builtInAxiosRequest: AxiosRequest = async <T = unknown>(config: AxiosRequestConfigLike) => {\n const responseType = config.responseType === 'response' ? 'arraybuffer' : toAxiosResponseType(config.responseType)\n const response = await axios.request<T>({\n url: config.url,\n method: config.method,\n headers: config.headers,\n data: config.method === 'GET' || config.method === 'HEAD' ? undefined : config.body,\n signal: config.signal,\n timeout: config.timeout,\n responseType,\n withCredentials: toAxiosCredentials(config.credentials),\n validateStatus: () => true,\n adapter: 'fetch',\n fetchOptions: compactFetchOptions(config),\n onUploadProgress: event => config.onUploadProgress?.(toAxiosProgress(event.loaded, event.total)),\n onDownloadProgress: event => config.onDownloadProgress?.(toAxiosProgress(event.loaded, event.total))\n })\n const raw = config.responseType === 'response'\n ? toRawResponse(response.data, response.status, response.statusText, response.headers as unknown as HeadersInit)\n : null\n return {\n data: (raw ?? response.data) as T,\n status: response.status,\n statusText: response.statusText,\n headers: (typeof response.headers?.toJSON === 'function' ? response.headers.toJSON() : response.headers) as HeadersInit,\n raw\n }\n}\n\nfunction toAxiosCredentials(credentials?: RequestCredentials): boolean | undefined {\n if (credentials === 'include') return true\n if (credentials === 'omit') return false\n return undefined\n}\n\nfunction toRawResponse(data: unknown, status: number, statusText: string | undefined, headers: HeadersInit | undefined): Response {\n if (typeof Response === 'undefined') throw new Error('HTTP: 当前环境没有可用的 Response')\n const body = status === 204 || status === 205 ? null : data as BodyInit | null | undefined\n return new Response(body, {\n status,\n statusText: statusText ?? '',\n headers: new Headers(headers)\n })\n}\n\nfunction toAxiosResponseType(responseType?: HTTPResponseType): 'arraybuffer' | 'blob' | 'json' | 'text' | undefined {\n if (responseType === 'arrayBuffer') return 'arraybuffer'\n if (responseType === 'response') return undefined\n return responseType\n}\n\nfunction compactFetchOptions(config: RequestConfig): Record<string, unknown> | undefined {\n const options = {\n cache: config.cache,\n credentials: config.credentials,\n mode: config.mode\n }\n const entries = Object.entries(options).filter(([, value]) => value !== undefined)\n return entries.length === 0 ? undefined : Object.fromEntries(entries)\n}\n\nfunction toAxiosProgress(loaded: number, total: number | undefined): HTTPProgress {\n return {\n loaded,\n total,\n percent: total && total > 0 ? loaded / total * 100 : undefined\n }\n}\n\nasync function parseBody(\n response: Response,\n responseType?: HTTPResponseType,\n onDownloadProgress?: HTTPProgressHandler\n): Promise<unknown> {\n if (response.status === 204 || response.status === 205) return null\n const bytes = onDownloadProgress && response.body\n ? await readResponseBytes(response, onDownloadProgress)\n : undefined\n if (responseType === 'blob') return bytes ? new Blob([bytes as unknown as BlobPart]) : response.blob()\n if (responseType === 'arrayBuffer') return bytes ? bytes.buffer : response.arrayBuffer()\n const text = bytes ? new TextDecoder().decode(bytes) : await response.text()\n if (responseType === 'text') return text\n if (!text) return null\n if (responseType === 'json' || response.headers.get('content-type')?.includes('json')) {\n try {\n return JSON.parse(text)\n } catch {\n throw new Error('HTTP: 响应不是有效 JSON')\n }\n }\n return text\n}\n\nasync function readResponseBytes(response: Response, onProgress: HTTPProgressHandler): Promise<Uint8Array> {\n const reader = response.body!.getReader()\n const chunks: Uint8Array[] = []\n const totalHeader = response.headers.get('content-length')\n const parsedTotal = totalHeader ? Number(totalHeader) : NaN\n const total = Number.isFinite(parsedTotal) && parsedTotal >= 0 ? parsedTotal : undefined\n let loaded = 0\n while (true) {\n const next = await reader.read()\n if (next.done) break\n chunks.push(next.value)\n loaded += next.value.byteLength\n onProgress(toProgress(loaded, total))\n }\n const result = new Uint8Array(loaded)\n let offset = 0\n for (const chunk of chunks) {\n result.set(chunk, offset)\n offset += chunk.byteLength\n }\n return result\n}\n\nfunction isHTTPResponse(value: unknown): value is HTTPResponse<unknown> {\n return typeof value === 'object' && value !== null && 'data' in value && 'status' in value && 'config' in value\n}\n\nfunction isResponse(value: unknown): value is Response {\n return typeof Response !== 'undefined' && value instanceof Response\n}\n\nfunction hasHandledProgress(response: Response): boolean {\n return Boolean((response as Response & { [PROGRESS_HANDLED]?: boolean })[PROGRESS_HANDLED])\n}\n\nfunction encodeBody(body: unknown, headers: Headers, method: HTTPMethod): BodyInit | undefined {\n if (body === undefined || body === null || method === 'GET' || method === 'HEAD') return undefined\n if (typeof body === 'string' || body instanceof Blob || body instanceof FormData\n || body instanceof ArrayBuffer || body instanceof URLSearchParams) return body as BodyInit\n if (!headers.has('content-type')) headers.set('content-type', 'application/json')\n return JSON.stringify(body)\n}\n\nfunction toHeaders(...inputs: Array<HeadersInit | undefined>): HTTPHeaders {\n const headers = new Headers()\n for (const input of inputs) {\n if (!input) continue\n new Headers(input).forEach((value, key) => headers.set(key, value))\n }\n const result: HTTPHeaders = {}\n headers.forEach((value, key) => { result[key] = value })\n return result\n}\n\nfunction resolveURL(url: string, baseURL: string): string {\n if (!baseURL || /^[a-z][a-z\\d+.-]*:/i.test(url) || url.startsWith('//')) return url\n if (!baseURL) return url\n return `${baseURL.replace(/\\/$/, '')}/${url.replace(/^\\//, '')}`\n}\n\nfunction appendParams(url: string, params?: Record<string, unknown> | URLSearchParams): string {\n if (!params) return url\n const query = params instanceof URLSearchParams ? params : toSearchParams(params)\n const serialized = query.toString()\n if (!serialized) return url\n return `${url}${url.includes('?') ? '&' : '?'}${serialized}`\n}\n\nfunction toSearchParams(params: Record<string, unknown>): URLSearchParams {\n const search = new URLSearchParams()\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined || value === null) continue\n if (Array.isArray(value)) {\n for (const item of value) search.append(key, String(item))\n } else if (typeof value === 'object') {\n search.set(key, JSON.stringify(value))\n } else {\n search.set(key, String(value))\n }\n }\n return search\n}\n\nfunction isRetryable(error: unknown): boolean {\n return error instanceof HTTPError\n ? error.status === 429 || error.status >= 500\n : !isAbortError(error)\n}\n\nfunction isAbortError(error: unknown): boolean {\n return Boolean(error) && typeof error === 'object'\n && ((error as { name?: unknown }).name === 'AbortError'\n || (error as { code?: unknown }).code === 'ERR_CANCELED')\n}\n\nfunction resolveRetryDelay(retryDelay: RetryDelay, attempt: number, error: Error): number {\n const delay = typeof retryDelay === 'function' ? retryDelay(attempt, error) : retryDelay\n if (!Number.isFinite(delay) || delay < 0) throw new Error('HTTP: retryDelay 必须是大于等于 0 的有限数字')\n return delay\n}\n\nfunction validateRetry(retry: number): number {\n if (!Number.isInteger(retry) || retry < 0) throw new Error('HTTP: retry 必须是大于等于 0 的整数')\n return retry\n}\n\nfunction validateTimeout(timeout: number): number {\n if (!Number.isFinite(timeout) || timeout < 0) throw new Error('HTTP: timeout 必须是大于等于 0 的有限数字')\n return timeout\n}\n\nfunction toError(error: unknown): Error {\n return error instanceof Error ? error : new Error(String(error))\n}\n\nfunction wait(delay: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, delay))\n}\n\nfunction toProgress(loaded: number, total: number | undefined): HTTPProgress {\n return {\n loaded,\n total,\n percent: total && total > 0 ? loaded / total * 100 : undefined\n }\n}\n","export interface SSEOptions {\n readonly withCredentials?: boolean\n readonly eventSource?: SSEConstructor\n readonly onOpen?: (event: Event) => void\n readonly onMessage?: (event: MessageEvent) => void\n readonly onError?: (event: Event) => void\n}\n\nexport interface SSEClient {\n readonly source: EventSource\n close(): void\n}\n\nexport type SSEConstructor = new (url: string, options?: EventSourceInit) => EventSource\n\nexport function createSSE(url: string, options: SSEOptions = {}): SSEClient {\n const EventSourceImpl = options.eventSource ?? globalThis.EventSource\n if (!EventSourceImpl) throw new Error('HTTP: 当前环境没有可用的 EventSource')\n const source = new EventSourceImpl(url, { withCredentials: options.withCredentials ?? false })\n if (options.onOpen) source.addEventListener('open', options.onOpen)\n if (options.onMessage) source.addEventListener('message', options.onMessage)\n if (options.onError) source.addEventListener('error', options.onError)\n return {\n source,\n close: () => source.close()\n }\n}\n\nexport interface WebSocketOptions {\n readonly protocols?: string | readonly string[]\n readonly webSocket?: WebSocketConstructor\n readonly autoReconnect?: boolean\n readonly reconnectDelay?: number\n}\n\nexport interface WebSocketClient {\n readonly socket: WebSocket | null\n readonly state: WebSocketState\n connect(): void\n send(data: string | ArrayBufferLike | Blob | ArrayBufferView): void\n close(code?: number, reason?: string): void\n on<K extends WebSocketEventName>(event: K, listener: WebSocketEventListener<K>): () => void\n}\n\nexport type WebSocketState = 'idle' | 'connecting' | 'open' | 'closed'\nexport type WebSocketEventName = 'open' | 'message' | 'error' | 'close'\nexport type WebSocketEventListener<K extends WebSocketEventName> =\n K extends 'message' ? (event: MessageEvent) => void\n : K extends 'close' ? (event: CloseEvent) => void\n : (event: Event) => void\nexport type WebSocketConstructor = new (\n url: string,\n protocols?: string | string[]\n) => WebSocket\n\nexport function createWebSocket(url: string, options: WebSocketOptions = {}): WebSocketClient {\n const WebSocketImpl = options.webSocket ?? globalThis.WebSocket\n if (!WebSocketImpl) throw new Error('HTTP: 当前环境没有可用的 WebSocket')\n const reconnectDelay = options.reconnectDelay ?? 1_000\n if (!Number.isFinite(reconnectDelay) || reconnectDelay < 0) {\n throw new Error('HTTP: reconnectDelay 必须是大于等于 0 的有限数字')\n }\n\n const listeners = new Map<WebSocketEventName, Set<(event: Event) => void>>()\n let socket: WebSocket | null = null\n let state: WebSocketState = 'idle'\n let manuallyClosed = false\n let reconnectTimer: ReturnType<typeof setTimeout> | undefined\n\n const client: WebSocketClient = {\n get socket(): WebSocket | null { return socket },\n get state(): WebSocketState { return state },\n connect,\n send(data) {\n if (!socket || state !== 'open') throw new Error('HTTP: WebSocket 尚未连接')\n socket.send(data)\n },\n close(code, reason) {\n manuallyClosed = true\n if (reconnectTimer !== undefined) clearTimeout(reconnectTimer)\n socket?.close(code, reason)\n if (!socket) state = 'closed'\n },\n on(event, listener) {\n let eventListeners = listeners.get(event)\n if (!eventListeners) {\n eventListeners = new Set()\n listeners.set(event, eventListeners)\n }\n eventListeners.add(listener as (event: Event) => void)\n return () => eventListeners?.delete(listener as (event: Event) => void)\n }\n }\n\n connect()\n return client\n\n function connect(): void {\n if (state === 'connecting' || state === 'open') return\n manuallyClosed = false\n state = 'connecting'\n const protocols = options.protocols === undefined\n ? undefined\n : typeof options.protocols === 'string' ? options.protocols : [...options.protocols]\n socket = new WebSocketImpl(url, protocols)\n socket.addEventListener('open', event => {\n state = 'open'\n notify('open', event)\n })\n socket.addEventListener('message', event => notify('message', event))\n socket.addEventListener('error', event => notify('error', event))\n socket.addEventListener('close', event => {\n state = 'closed'\n socket = null\n notify('close', event)\n if (options.autoReconnect && !manuallyClosed) {\n reconnectTimer = setTimeout(() => {\n reconnectTimer = undefined\n connect()\n }, reconnectDelay)\n }\n })\n }\n\n function notify(event: WebSocketEventName, value: Event): void {\n for (const listener of [...(listeners.get(event) ?? [])]) listener(value)\n }\n}\n","import type { HTTPMethod, HTTPHeaders } from './index'\nimport type { RuntimeDebugContext } from '@vobs/runtime'\n\nexport type HTTPDebugStatus = 'loading' | 'retrying' | 'success' | 'error' | 'cancelled'\n\nexport type HTTPDebugCacheStatus = 'hit' | 'miss' | 'revalidated'\n\nexport interface HTTPDebugContext extends RuntimeDebugContext {\n readonly cacheStatus?: HTTPDebugCacheStatus\n /** Marks a request created from the DevTools request tester. */\n readonly test?: boolean\n}\n\nexport interface HTTPDebugRequest {\n readonly id: number\n readonly phase: 'start' | 'retry' | 'end'\n readonly status: HTTPDebugStatus\n readonly url: string\n readonly method: HTTPMethod\n readonly headers: HTTPHeaders\n readonly requestBody?: unknown\n readonly startedAt: number\n readonly endedAt?: number\n readonly duration?: number\n readonly attempt: number\n readonly retries: number\n readonly responseStatus?: number\n readonly responseBody?: unknown\n readonly error?: { readonly name: string; readonly message: string }\n readonly context?: HTTPDebugContext\n}\n\nexport interface HTTPDebugHooks {\n request?(event: HTTPDebugRequest): void\n}\n\nlet activeHTTPDebugHooks: HTTPDebugHooks | null = null\nconst httpDebugListeners = new Set<NonNullable<HTTPDebugHooks['request']>>()\n\nexport function setHTTPDebugHooks(hooks: HTTPDebugHooks | null): HTTPDebugHooks | null {\n const previous = activeHTTPDebugHooks\n activeHTTPDebugHooks = hooks\n return previous\n}\n\nexport function getHTTPDebugHooks(): HTTPDebugHooks | null {\n return activeHTTPDebugHooks\n}\n\nexport function subscribeHTTPDebug(listener: NonNullable<HTTPDebugHooks['request']>): () => void {\n httpDebugListeners.add(listener)\n return () => httpDebugListeners.delete(listener)\n}\n\nexport function emitHTTPDebug(event: HTTPDebugRequest): void {\n try {\n activeHTTPDebugHooks?.request?.(event)\n } catch {\n // Debug tooling must never change request behavior.\n }\n for (const listener of [...httpDebugListeners]) {\n try { listener(event) } catch { /* Debug tooling must never change request behavior. */ }\n }\n}\n"],"mappings":"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","names":[]}
package/dist/stream.cjs CHANGED
@@ -1,9 +1,31 @@
1
- 'use strict';
2
-
1
+ var __VOBS_CJS_FILE_URL = require("url").pathToFileURL(__filename).href;
2
+ "use strict";
3
3
  var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
4
7
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
5
21
 
6
22
  // packages/http/src/stream.ts
23
+ var stream_exports = {};
24
+ __export(stream_exports, {
25
+ createSSE: () => createSSE,
26
+ createWebSocket: () => createWebSocket
27
+ });
28
+ module.exports = __toCommonJS(stream_exports);
7
29
  function createSSE(url, options = {}) {
8
30
  const EventSourceImpl = options.eventSource ?? globalThis.EventSource;
9
31
  if (!EventSourceImpl) throw new Error("HTTP: \u5F53\u524D\u73AF\u5883\u6CA1\u6709\u53EF\u7528\u7684 EventSource");
@@ -83,13 +105,16 @@ function createWebSocket(url, options = {}) {
83
105
  }
84
106
  });
85
107
  }
108
+ __name(connect, "connect");
86
109
  function notify(event, value) {
87
110
  for (const listener of [...listeners.get(event) ?? []]) listener(value);
88
111
  }
112
+ __name(notify, "notify");
89
113
  }
90
114
  __name(createWebSocket, "createWebSocket");
91
-
92
- exports.createSSE = createSSE;
93
- exports.createWebSocket = createWebSocket;
94
- //# sourceMappingURL=stream.cjs.map
115
+ // Annotate the CommonJS export names for ESM import in node:
116
+ 0 && (module.exports = {
117
+ createSSE,
118
+ createWebSocket
119
+ });
95
120
  //# sourceMappingURL=stream.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/stream.ts"],"names":[],"mappings":"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","file":"stream.cjs","sourcesContent":["export interface SSEOptions {\n readonly withCredentials?: boolean\n readonly eventSource?: SSEConstructor\n readonly onOpen?: (event: Event) => void\n readonly onMessage?: (event: MessageEvent) => void\n readonly onError?: (event: Event) => void\n}\n\nexport interface SSEClient {\n readonly source: EventSource\n close(): void\n}\n\nexport type SSEConstructor = new (url: string, options?: EventSourceInit) => EventSource\n\nexport function createSSE(url: string, options: SSEOptions = {}): SSEClient {\n const EventSourceImpl = options.eventSource ?? globalThis.EventSource\n if (!EventSourceImpl) throw new Error('HTTP: 当前环境没有可用的 EventSource')\n const source = new EventSourceImpl(url, { withCredentials: options.withCredentials ?? false })\n if (options.onOpen) source.addEventListener('open', options.onOpen)\n if (options.onMessage) source.addEventListener('message', options.onMessage)\n if (options.onError) source.addEventListener('error', options.onError)\n return {\n source,\n close: () => source.close()\n }\n}\n\nexport interface WebSocketOptions {\n readonly protocols?: string | readonly string[]\n readonly webSocket?: WebSocketConstructor\n readonly autoReconnect?: boolean\n readonly reconnectDelay?: number\n}\n\nexport interface WebSocketClient {\n readonly socket: WebSocket | null\n readonly state: WebSocketState\n connect(): void\n send(data: string | ArrayBufferLike | Blob | ArrayBufferView): void\n close(code?: number, reason?: string): void\n on<K extends WebSocketEventName>(event: K, listener: WebSocketEventListener<K>): () => void\n}\n\nexport type WebSocketState = 'idle' | 'connecting' | 'open' | 'closed'\nexport type WebSocketEventName = 'open' | 'message' | 'error' | 'close'\nexport type WebSocketEventListener<K extends WebSocketEventName> =\n K extends 'message' ? (event: MessageEvent) => void\n : K extends 'close' ? (event: CloseEvent) => void\n : (event: Event) => void\nexport type WebSocketConstructor = new (\n url: string,\n protocols?: string | string[]\n) => WebSocket\n\nexport function createWebSocket(url: string, options: WebSocketOptions = {}): WebSocketClient {\n const WebSocketImpl = options.webSocket ?? globalThis.WebSocket\n if (!WebSocketImpl) throw new Error('HTTP: 当前环境没有可用的 WebSocket')\n const reconnectDelay = options.reconnectDelay ?? 1_000\n if (!Number.isFinite(reconnectDelay) || reconnectDelay < 0) {\n throw new Error('HTTP: reconnectDelay 必须是大于等于 0 的有限数字')\n }\n\n const listeners = new Map<WebSocketEventName, Set<(event: Event) => void>>()\n let socket: WebSocket | null = null\n let state: WebSocketState = 'idle'\n let manuallyClosed = false\n let reconnectTimer: ReturnType<typeof setTimeout> | undefined\n\n const client: WebSocketClient = {\n get socket(): WebSocket | null { return socket },\n get state(): WebSocketState { return state },\n connect,\n send(data) {\n if (!socket || state !== 'open') throw new Error('HTTP: WebSocket 尚未连接')\n socket.send(data)\n },\n close(code, reason) {\n manuallyClosed = true\n if (reconnectTimer !== undefined) clearTimeout(reconnectTimer)\n socket?.close(code, reason)\n if (!socket) state = 'closed'\n },\n on(event, listener) {\n let eventListeners = listeners.get(event)\n if (!eventListeners) {\n eventListeners = new Set()\n listeners.set(event, eventListeners)\n }\n eventListeners.add(listener as (event: Event) => void)\n return () => eventListeners?.delete(listener as (event: Event) => void)\n }\n }\n\n connect()\n return client\n\n function connect(): void {\n if (state === 'connecting' || state === 'open') return\n manuallyClosed = false\n state = 'connecting'\n const protocols = options.protocols === undefined\n ? undefined\n : typeof options.protocols === 'string' ? options.protocols : [...options.protocols]\n socket = new WebSocketImpl(url, protocols)\n socket.addEventListener('open', event => {\n state = 'open'\n notify('open', event)\n })\n socket.addEventListener('message', event => notify('message', event))\n socket.addEventListener('error', event => notify('error', event))\n socket.addEventListener('close', event => {\n state = 'closed'\n socket = null\n notify('close', event)\n if (options.autoReconnect && !manuallyClosed) {\n reconnectTimer = setTimeout(() => {\n reconnectTimer = undefined\n connect()\n }, reconnectDelay)\n }\n })\n }\n\n function notify(event: WebSocketEventName, value: Event): void {\n for (const listener of [...(listeners.get(event) ?? [])]) listener(value)\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/stream.ts"],"sourcesContent":["export interface SSEOptions {\n readonly withCredentials?: boolean\n readonly eventSource?: SSEConstructor\n readonly onOpen?: (event: Event) => void\n readonly onMessage?: (event: MessageEvent) => void\n readonly onError?: (event: Event) => void\n}\n\nexport interface SSEClient {\n readonly source: EventSource\n close(): void\n}\n\nexport type SSEConstructor = new (url: string, options?: EventSourceInit) => EventSource\n\nexport function createSSE(url: string, options: SSEOptions = {}): SSEClient {\n const EventSourceImpl = options.eventSource ?? globalThis.EventSource\n if (!EventSourceImpl) throw new Error('HTTP: 当前环境没有可用的 EventSource')\n const source = new EventSourceImpl(url, { withCredentials: options.withCredentials ?? false })\n if (options.onOpen) source.addEventListener('open', options.onOpen)\n if (options.onMessage) source.addEventListener('message', options.onMessage)\n if (options.onError) source.addEventListener('error', options.onError)\n return {\n source,\n close: () => source.close()\n }\n}\n\nexport interface WebSocketOptions {\n readonly protocols?: string | readonly string[]\n readonly webSocket?: WebSocketConstructor\n readonly autoReconnect?: boolean\n readonly reconnectDelay?: number\n}\n\nexport interface WebSocketClient {\n readonly socket: WebSocket | null\n readonly state: WebSocketState\n connect(): void\n send(data: string | ArrayBufferLike | Blob | ArrayBufferView): void\n close(code?: number, reason?: string): void\n on<K extends WebSocketEventName>(event: K, listener: WebSocketEventListener<K>): () => void\n}\n\nexport type WebSocketState = 'idle' | 'connecting' | 'open' | 'closed'\nexport type WebSocketEventName = 'open' | 'message' | 'error' | 'close'\nexport type WebSocketEventListener<K extends WebSocketEventName> =\n K extends 'message' ? (event: MessageEvent) => void\n : K extends 'close' ? (event: CloseEvent) => void\n : (event: Event) => void\nexport type WebSocketConstructor = new (\n url: string,\n protocols?: string | string[]\n) => WebSocket\n\nexport function createWebSocket(url: string, options: WebSocketOptions = {}): WebSocketClient {\n const WebSocketImpl = options.webSocket ?? globalThis.WebSocket\n if (!WebSocketImpl) throw new Error('HTTP: 当前环境没有可用的 WebSocket')\n const reconnectDelay = options.reconnectDelay ?? 1_000\n if (!Number.isFinite(reconnectDelay) || reconnectDelay < 0) {\n throw new Error('HTTP: reconnectDelay 必须是大于等于 0 的有限数字')\n }\n\n const listeners = new Map<WebSocketEventName, Set<(event: Event) => void>>()\n let socket: WebSocket | null = null\n let state: WebSocketState = 'idle'\n let manuallyClosed = false\n let reconnectTimer: ReturnType<typeof setTimeout> | undefined\n\n const client: WebSocketClient = {\n get socket(): WebSocket | null { return socket },\n get state(): WebSocketState { return state },\n connect,\n send(data) {\n if (!socket || state !== 'open') throw new Error('HTTP: WebSocket 尚未连接')\n socket.send(data)\n },\n close(code, reason) {\n manuallyClosed = true\n if (reconnectTimer !== undefined) clearTimeout(reconnectTimer)\n socket?.close(code, reason)\n if (!socket) state = 'closed'\n },\n on(event, listener) {\n let eventListeners = listeners.get(event)\n if (!eventListeners) {\n eventListeners = new Set()\n listeners.set(event, eventListeners)\n }\n eventListeners.add(listener as (event: Event) => void)\n return () => eventListeners?.delete(listener as (event: Event) => void)\n }\n }\n\n connect()\n return client\n\n function connect(): void {\n if (state === 'connecting' || state === 'open') return\n manuallyClosed = false\n state = 'connecting'\n const protocols = options.protocols === undefined\n ? undefined\n : typeof options.protocols === 'string' ? options.protocols : [...options.protocols]\n socket = new WebSocketImpl(url, protocols)\n socket.addEventListener('open', event => {\n state = 'open'\n notify('open', event)\n })\n socket.addEventListener('message', event => notify('message', event))\n socket.addEventListener('error', event => notify('error', event))\n socket.addEventListener('close', event => {\n state = 'closed'\n socket = null\n notify('close', event)\n if (options.autoReconnect && !manuallyClosed) {\n reconnectTimer = setTimeout(() => {\n reconnectTimer = undefined\n connect()\n }, reconnectDelay)\n }\n })\n }\n\n function notify(event: WebSocketEventName, value: Event): void {\n for (const listener of [...(listeners.get(event) ?? [])]) listener(value)\n }\n}\n"],"mappings":"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","names":[]}
package/dist/stream.js CHANGED
@@ -81,12 +81,15 @@ function createWebSocket(url, options = {}) {
81
81
  }
82
82
  });
83
83
  }
84
+ __name(connect, "connect");
84
85
  function notify(event, value) {
85
86
  for (const listener of [...listeners.get(event) ?? []]) listener(value);
86
87
  }
88
+ __name(notify, "notify");
87
89
  }
88
90
  __name(createWebSocket, "createWebSocket");
89
-
90
- export { createSSE, createWebSocket };
91
- //# sourceMappingURL=stream.js.map
91
+ export {
92
+ createSSE,
93
+ createWebSocket
94
+ };
92
95
  //# sourceMappingURL=stream.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/stream.ts"],"names":[],"mappings":"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","file":"stream.js","sourcesContent":["export interface SSEOptions {\n readonly withCredentials?: boolean\n readonly eventSource?: SSEConstructor\n readonly onOpen?: (event: Event) => void\n readonly onMessage?: (event: MessageEvent) => void\n readonly onError?: (event: Event) => void\n}\n\nexport interface SSEClient {\n readonly source: EventSource\n close(): void\n}\n\nexport type SSEConstructor = new (url: string, options?: EventSourceInit) => EventSource\n\nexport function createSSE(url: string, options: SSEOptions = {}): SSEClient {\n const EventSourceImpl = options.eventSource ?? globalThis.EventSource\n if (!EventSourceImpl) throw new Error('HTTP: 当前环境没有可用的 EventSource')\n const source = new EventSourceImpl(url, { withCredentials: options.withCredentials ?? false })\n if (options.onOpen) source.addEventListener('open', options.onOpen)\n if (options.onMessage) source.addEventListener('message', options.onMessage)\n if (options.onError) source.addEventListener('error', options.onError)\n return {\n source,\n close: () => source.close()\n }\n}\n\nexport interface WebSocketOptions {\n readonly protocols?: string | readonly string[]\n readonly webSocket?: WebSocketConstructor\n readonly autoReconnect?: boolean\n readonly reconnectDelay?: number\n}\n\nexport interface WebSocketClient {\n readonly socket: WebSocket | null\n readonly state: WebSocketState\n connect(): void\n send(data: string | ArrayBufferLike | Blob | ArrayBufferView): void\n close(code?: number, reason?: string): void\n on<K extends WebSocketEventName>(event: K, listener: WebSocketEventListener<K>): () => void\n}\n\nexport type WebSocketState = 'idle' | 'connecting' | 'open' | 'closed'\nexport type WebSocketEventName = 'open' | 'message' | 'error' | 'close'\nexport type WebSocketEventListener<K extends WebSocketEventName> =\n K extends 'message' ? (event: MessageEvent) => void\n : K extends 'close' ? (event: CloseEvent) => void\n : (event: Event) => void\nexport type WebSocketConstructor = new (\n url: string,\n protocols?: string | string[]\n) => WebSocket\n\nexport function createWebSocket(url: string, options: WebSocketOptions = {}): WebSocketClient {\n const WebSocketImpl = options.webSocket ?? globalThis.WebSocket\n if (!WebSocketImpl) throw new Error('HTTP: 当前环境没有可用的 WebSocket')\n const reconnectDelay = options.reconnectDelay ?? 1_000\n if (!Number.isFinite(reconnectDelay) || reconnectDelay < 0) {\n throw new Error('HTTP: reconnectDelay 必须是大于等于 0 的有限数字')\n }\n\n const listeners = new Map<WebSocketEventName, Set<(event: Event) => void>>()\n let socket: WebSocket | null = null\n let state: WebSocketState = 'idle'\n let manuallyClosed = false\n let reconnectTimer: ReturnType<typeof setTimeout> | undefined\n\n const client: WebSocketClient = {\n get socket(): WebSocket | null { return socket },\n get state(): WebSocketState { return state },\n connect,\n send(data) {\n if (!socket || state !== 'open') throw new Error('HTTP: WebSocket 尚未连接')\n socket.send(data)\n },\n close(code, reason) {\n manuallyClosed = true\n if (reconnectTimer !== undefined) clearTimeout(reconnectTimer)\n socket?.close(code, reason)\n if (!socket) state = 'closed'\n },\n on(event, listener) {\n let eventListeners = listeners.get(event)\n if (!eventListeners) {\n eventListeners = new Set()\n listeners.set(event, eventListeners)\n }\n eventListeners.add(listener as (event: Event) => void)\n return () => eventListeners?.delete(listener as (event: Event) => void)\n }\n }\n\n connect()\n return client\n\n function connect(): void {\n if (state === 'connecting' || state === 'open') return\n manuallyClosed = false\n state = 'connecting'\n const protocols = options.protocols === undefined\n ? undefined\n : typeof options.protocols === 'string' ? options.protocols : [...options.protocols]\n socket = new WebSocketImpl(url, protocols)\n socket.addEventListener('open', event => {\n state = 'open'\n notify('open', event)\n })\n socket.addEventListener('message', event => notify('message', event))\n socket.addEventListener('error', event => notify('error', event))\n socket.addEventListener('close', event => {\n state = 'closed'\n socket = null\n notify('close', event)\n if (options.autoReconnect && !manuallyClosed) {\n reconnectTimer = setTimeout(() => {\n reconnectTimer = undefined\n connect()\n }, reconnectDelay)\n }\n })\n }\n\n function notify(event: WebSocketEventName, value: Event): void {\n for (const listener of [...(listeners.get(event) ?? [])]) listener(value)\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/stream.ts"],"sourcesContent":["export interface SSEOptions {\n readonly withCredentials?: boolean\n readonly eventSource?: SSEConstructor\n readonly onOpen?: (event: Event) => void\n readonly onMessage?: (event: MessageEvent) => void\n readonly onError?: (event: Event) => void\n}\n\nexport interface SSEClient {\n readonly source: EventSource\n close(): void\n}\n\nexport type SSEConstructor = new (url: string, options?: EventSourceInit) => EventSource\n\nexport function createSSE(url: string, options: SSEOptions = {}): SSEClient {\n const EventSourceImpl = options.eventSource ?? globalThis.EventSource\n if (!EventSourceImpl) throw new Error('HTTP: 当前环境没有可用的 EventSource')\n const source = new EventSourceImpl(url, { withCredentials: options.withCredentials ?? false })\n if (options.onOpen) source.addEventListener('open', options.onOpen)\n if (options.onMessage) source.addEventListener('message', options.onMessage)\n if (options.onError) source.addEventListener('error', options.onError)\n return {\n source,\n close: () => source.close()\n }\n}\n\nexport interface WebSocketOptions {\n readonly protocols?: string | readonly string[]\n readonly webSocket?: WebSocketConstructor\n readonly autoReconnect?: boolean\n readonly reconnectDelay?: number\n}\n\nexport interface WebSocketClient {\n readonly socket: WebSocket | null\n readonly state: WebSocketState\n connect(): void\n send(data: string | ArrayBufferLike | Blob | ArrayBufferView): void\n close(code?: number, reason?: string): void\n on<K extends WebSocketEventName>(event: K, listener: WebSocketEventListener<K>): () => void\n}\n\nexport type WebSocketState = 'idle' | 'connecting' | 'open' | 'closed'\nexport type WebSocketEventName = 'open' | 'message' | 'error' | 'close'\nexport type WebSocketEventListener<K extends WebSocketEventName> =\n K extends 'message' ? (event: MessageEvent) => void\n : K extends 'close' ? (event: CloseEvent) => void\n : (event: Event) => void\nexport type WebSocketConstructor = new (\n url: string,\n protocols?: string | string[]\n) => WebSocket\n\nexport function createWebSocket(url: string, options: WebSocketOptions = {}): WebSocketClient {\n const WebSocketImpl = options.webSocket ?? globalThis.WebSocket\n if (!WebSocketImpl) throw new Error('HTTP: 当前环境没有可用的 WebSocket')\n const reconnectDelay = options.reconnectDelay ?? 1_000\n if (!Number.isFinite(reconnectDelay) || reconnectDelay < 0) {\n throw new Error('HTTP: reconnectDelay 必须是大于等于 0 的有限数字')\n }\n\n const listeners = new Map<WebSocketEventName, Set<(event: Event) => void>>()\n let socket: WebSocket | null = null\n let state: WebSocketState = 'idle'\n let manuallyClosed = false\n let reconnectTimer: ReturnType<typeof setTimeout> | undefined\n\n const client: WebSocketClient = {\n get socket(): WebSocket | null { return socket },\n get state(): WebSocketState { return state },\n connect,\n send(data) {\n if (!socket || state !== 'open') throw new Error('HTTP: WebSocket 尚未连接')\n socket.send(data)\n },\n close(code, reason) {\n manuallyClosed = true\n if (reconnectTimer !== undefined) clearTimeout(reconnectTimer)\n socket?.close(code, reason)\n if (!socket) state = 'closed'\n },\n on(event, listener) {\n let eventListeners = listeners.get(event)\n if (!eventListeners) {\n eventListeners = new Set()\n listeners.set(event, eventListeners)\n }\n eventListeners.add(listener as (event: Event) => void)\n return () => eventListeners?.delete(listener as (event: Event) => void)\n }\n }\n\n connect()\n return client\n\n function connect(): void {\n if (state === 'connecting' || state === 'open') return\n manuallyClosed = false\n state = 'connecting'\n const protocols = options.protocols === undefined\n ? undefined\n : typeof options.protocols === 'string' ? options.protocols : [...options.protocols]\n socket = new WebSocketImpl(url, protocols)\n socket.addEventListener('open', event => {\n state = 'open'\n notify('open', event)\n })\n socket.addEventListener('message', event => notify('message', event))\n socket.addEventListener('error', event => notify('error', event))\n socket.addEventListener('close', event => {\n state = 'closed'\n socket = null\n notify('close', event)\n if (options.autoReconnect && !manuallyClosed) {\n reconnectTimer = setTimeout(() => {\n reconnectTimer = undefined\n connect()\n }, reconnectDelay)\n }\n })\n }\n\n function notify(event: WebSocketEventName, value: Event): void {\n for (const listener of [...(listeners.get(event) ?? [])]) listener(value)\n }\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -11,7 +11,7 @@
11
11
  "type": "git",
12
12
  "url": "git+https://github.com/vobsjs/vobs.git"
13
13
  },
14
- "version": "1.2.1",
14
+ "version": "1.2.2",
15
15
  "publishConfig": {
16
16
  "access": "public"
17
17
  },
@@ -33,8 +33,8 @@
33
33
  "./source/*": "./src/*"
34
34
  },
35
35
  "dependencies": {
36
- "axios": "^1.20.0",
37
- "@vobs/vobs": "1.2.1",
38
- "@vobs/runtime": "1.2.1"
36
+ "@vobs/runtime": "1.2.2",
37
+ "@vobs/vobs": "1.2.2",
38
+ "axios": "^1.20.0"
39
39
  }
40
40
  }