js-streaming
Version:
Unified streaming client for WebSocket, SSE, HTTP streaming, long-polling, HLS, and WebRTC.
1 lines • 18.3 kB
Source Map (JSON)
{"version":3,"sources":["../src/core/Stream.ts","../src/adapters/websocket.ts","../src/adapters/sse.ts","../src/adapters/http.ts","../src/adapters/longPolling.ts","../src/adapters/hls.ts","../src/adapters/webrtc.ts","../src/adapters/socketio.ts","../src/index.ts"],"sourcesContent":["import { BaseOptions, ListenerMap, StreamState, StreamStatus } from \"./types\";\r\n\r\nexport class StreamCore {\r\n // نخليها loose جوه الكلاس\r\n private listeners: Record<string, Function[]> = {};\r\n\r\n public state: StreamState = {\r\n status: \"idle\",\r\n retries: 0,\r\n };\r\n\r\n constructor(private adapter: any, private opts: BaseOptions) {}\r\n\r\n public emit<T extends keyof ListenerMap>(event: T, ...args: ListenerMap[T]) {\r\n const cbs = this.listeners[event as string];\r\n if (!cbs) return;\r\n for (const cb of cbs) {\r\n (cb as (...a: ListenerMap[T]) => void)(...args);\r\n }\r\n }\r\n\r\n public on<T extends keyof ListenerMap>(\r\n evt: T,\r\n cb: (...args: ListenerMap[T]) => void\r\n ): () => void {\r\n if (!this.listeners[evt as string]) {\r\n this.listeners[evt as string] = [];\r\n }\r\n this.listeners[evt as string].push(cb as Function);\r\n return () => this.off(evt, cb);\r\n }\r\n\r\n public off<T extends keyof ListenerMap>(\r\n evt: T,\r\n cb: (...args: ListenerMap[T]) => void\r\n ) {\r\n const arr = this.listeners[evt as string];\r\n if (!arr) return;\r\n this.listeners[evt as string] = arr.filter((fn) => fn !== cb);\r\n }\r\n\r\n async open() {\r\n this.state.status = \"connecting\";\r\n this.emit(\"status\", \"connecting\");\r\n await this.adapter.open();\r\n this.state.status = \"open\";\r\n this.emit(\"status\", \"open\");\r\n }\r\n\r\n async close() {\r\n this.state.status = \"closed\";\r\n this.emit(\"status\", \"closed\");\r\n await this.adapter.close();\r\n }\r\n\r\n send(data: unknown) {\r\n this.adapter.send(data);\r\n }\r\n}\r\n","import { StreamCore } from \"../core/Stream\";\r\nimport { BaseOptions, StreamAPI } from \"../core/types\";\r\n\r\nexport interface WebSocketOptions extends BaseOptions {\r\n type: \"websocket\";\r\n}\r\n\r\nexport function websocketAdapter(\r\n core: StreamCore,\r\n opts: WebSocketOptions\r\n): StreamAPI {\r\n let socket: WebSocket | null = null;\r\n\r\n return {\r\n open: async () => {\r\n socket = new WebSocket(opts.url);\r\n\r\n socket.onopen = () => core.emit(\"open\");\r\n socket.onclose = () => core.emit(\"close\");\r\n socket.onerror = (err) => core.emit(\"error\", err as any);\r\n socket.onmessage = (msg) => core.emit(\"message\", msg.data);\r\n },\r\n close: async () => {\r\n socket?.close();\r\n },\r\n send: (d: unknown) => {\r\n socket?.send(typeof d === \"string\" ? d : JSON.stringify(d));\r\n },\r\n on: core.on.bind(core),\r\n off: core.off.bind(core),\r\n get state() {\r\n return core.state;\r\n },\r\n };\r\n}\r\n","import { StreamCore } from \"../core/Stream\";\r\nimport { BaseOptions, StreamAPI } from \"../core/types\";\r\n\r\nexport interface SSEOptions extends BaseOptions {\r\n type: \"sse\";\r\n}\r\n\r\nexport function sseAdapter(core: StreamCore, opts: SSEOptions): StreamAPI {\r\n let es: EventSource | null = null;\r\n\r\n return {\r\n open: async () => {\r\n es = new EventSource(opts.url);\r\n\r\n es.onopen = () => core.emit(\"open\");\r\n es.onerror = (err) => core.emit(\"error\", err as any);\r\n es.onmessage = (msg) => core.emit(\"message\", msg.data);\r\n },\r\n close: async () => {\r\n es?.close();\r\n core.emit(\"close\");\r\n },\r\n send: () => {\r\n throw new Error(\"SSE does not support send()\");\r\n },\r\n on: core.on.bind(core),\r\n off: core.off.bind(core),\r\n get state() {\r\n return core.state;\r\n },\r\n };\r\n}\r\n","import { StreamCore } from \"../core/Stream\";\r\nimport { BaseOptions, StreamAPI } from \"../core/types\";\r\n\r\nexport interface HTTPStreamOptions extends BaseOptions {\r\n type: \"http\";\r\n}\r\n\r\nexport function httpStreamAdapter(\r\n core: StreamCore,\r\n opts: HTTPStreamOptions\r\n): StreamAPI {\r\n let controller: AbortController | null = null;\r\n\r\n return {\r\n open: async () => {\r\n controller = new AbortController();\r\n const res = await fetch(opts.url, { signal: controller.signal });\r\n\r\n if (!res.body) throw new Error(\"No response body\");\r\n\r\n const reader = res.body.getReader();\r\n core.emit(\"open\");\r\n\r\n while (true) {\r\n const { done, value } = await reader.read();\r\n if (done) break;\r\n core.emit(\"message\", new TextDecoder().decode(value));\r\n }\r\n\r\n core.emit(\"close\");\r\n },\r\n close: async () => {\r\n controller?.abort();\r\n core.emit(\"close\");\r\n },\r\n send: () => {\r\n throw new Error(\"HTTP streaming does not support send()\");\r\n },\r\n on: core.on.bind(core),\r\n off: core.off.bind(core),\r\n get state() {\r\n return core.state;\r\n },\r\n };\r\n}\r\n","import { StreamCore } from \"../core/Stream\";\r\nimport { BaseOptions, StreamAPI } from \"../core/types\";\r\n\r\nexport interface LongPollingOptions extends BaseOptions {\r\n type: \"long-polling\";\r\n interval?: number;\r\n}\r\n\r\nexport function longPollingAdapter(\r\n core: StreamCore,\r\n opts: LongPollingOptions\r\n): StreamAPI {\r\n let active = false;\r\n\r\n const poll = async () => {\r\n while (active) {\r\n try {\r\n const res = await fetch(opts.url);\r\n const data = await res.json();\r\n core.emit(\"message\", data);\r\n } catch (err) {\r\n core.emit(\"error\", err as any);\r\n }\r\n await new Promise((r) => setTimeout(r, opts.interval ?? 2000));\r\n }\r\n };\r\n\r\n return {\r\n open: async () => {\r\n active = true;\r\n core.emit(\"open\");\r\n poll();\r\n },\r\n close: async () => {\r\n active = false;\r\n core.emit(\"close\");\r\n },\r\n send: () => {\r\n throw new Error(\"Long polling does not support send()\");\r\n },\r\n on: core.on.bind(core),\r\n off: core.off.bind(core),\r\n get state() {\r\n return core.state;\r\n },\r\n };\r\n}\r\n","import { StreamCore } from \"../core/Stream\";\r\nimport { BaseOptions, StreamAPI } from \"../core/types\";\r\nimport Hls from \"hls.js\";\r\n\r\nexport interface HLSOptions extends BaseOptions {\r\n type: \"hls\";\r\n url: string;\r\n video: HTMLVideoElement;\r\n}\r\n\r\nexport function hlsAdapter(core: StreamCore, opts: HLSOptions): StreamAPI {\r\n let hls: Hls | null = null;\r\n\r\n return {\r\n open: async () => {\r\n if (!opts.video) {\r\n throw new Error(\"HLS requires a video element in options.video\");\r\n }\r\n\r\n // Native HLS support\r\n if (opts.video.canPlayType(\"application/vnd.apple.mpegurl\")) {\r\n opts.video.src = opts.url;\r\n } else if (Hls.isSupported()) {\r\n // hls.js fallback\r\n hls = new Hls();\r\n hls.loadSource(opts.url);\r\n hls.attachMedia(opts.video);\r\n } else {\r\n core.emit(\"error\", new Error(\"HLS not supported in this browser\"));\r\n return;\r\n }\r\n\r\n core.emit(\"open\");\r\n core.emit(\"message\", { url: opts.url });\r\n },\r\n\r\n close: async () => {\r\n if (hls) {\r\n hls.destroy();\r\n hls = null;\r\n }\r\n if (opts.video) {\r\n opts.video.src = \"\";\r\n }\r\n core.emit(\"close\");\r\n },\r\n\r\n send: () => {\r\n throw new Error(\"HLS does not support send()\");\r\n },\r\n\r\n on: core.on.bind(core),\r\n off: core.off.bind(core),\r\n\r\n get state() {\r\n return core.state;\r\n },\r\n };\r\n}\r\n","import { StreamCore } from \"../core/Stream\";\r\nimport { WebRTCOptions, StreamAPI } from \"../core/types\";\r\n\r\nexport function webrtcAdapter(\r\n core: StreamCore,\r\n opts: WebRTCOptions\r\n): StreamAPI {\r\n let pc: RTCPeerConnection | null = null;\r\n let channel: RTCDataChannel | null = null; // 🟢 fix: بدل sendChannel\r\n\r\n return {\r\n open: async () => {\r\n pc = new RTCPeerConnection();\r\n channel = pc.createDataChannel(\"data\");\r\n\r\n channel.onopen = () => core.emit(\"open\");\r\n channel.onclose = () => core.emit(\"close\");\r\n channel.onerror = (e) => core.emit(\"error\", e as any);\r\n channel.onmessage = (e) => core.emit(\"message\", e.data);\r\n },\r\n close: async () => {\r\n pc?.close();\r\n core.emit(\"close\");\r\n },\r\n send: (d: unknown) => {\r\n if (channel && channel.readyState === \"open\") {\r\n channel.send(typeof d === \"string\" ? d : JSON.stringify(d));\r\n }\r\n },\r\n on: core.on.bind(core),\r\n off: core.off.bind(core),\r\n get state() {\r\n return core.state;\r\n },\r\n };\r\n}\r\n","import { io, Socket } from \"socket.io-client\";\r\nimport { StreamCore } from \"../core/Stream\";\r\nimport { BaseOptions, StreamAPI, ListenerMap } from \"../core/types\";\r\n\r\nexport interface SocketIOOptions extends BaseOptions {\r\n type: \"socketio\";\r\n}\r\n\r\nexport function socketioAdapter(\r\n core: StreamCore,\r\n opts: SocketIOOptions\r\n): StreamAPI {\r\n const socket: Socket = io(opts.url, {\r\n reconnection: opts.autoReconnect ?? true,\r\n reconnectionAttempts: opts.maxRetries ?? 5,\r\n });\r\n\r\n socket.on(\"connect\", () => core.emit(\"open\"));\r\n socket.on(\"disconnect\", (reason: string) => core.emit(\"close\", reason));\r\n socket.on(\"connect_error\", (err: Error) => core.emit(\"error\", err));\r\n socket.onAny((event: string, data: unknown) => {\r\n core.emit(\"message\", { event, data });\r\n });\r\n\r\n return {\r\n open: async () => {\r\n socket.connect();\r\n },\r\n close: async () => {\r\n socket.disconnect();\r\n },\r\n send: (d: unknown) => {\r\n socket.emit(\"message\", d);\r\n },\r\n on: core.on.bind(core),\r\n off: core.off.bind(core),\r\n get state() {\r\n return core.state;\r\n },\r\n };\r\n}\r\n","import { StreamCore } from \"./core/Stream\";\r\nimport { BaseOptions, StreamAPI, ListenerMap } from \"./core/types\";\r\n\r\nimport { websocketAdapter, WebSocketOptions } from \"./adapters/websocket\";\r\nimport { sseAdapter, SSEOptions } from \"./adapters/sse\";\r\nimport { httpStreamAdapter, HTTPStreamOptions } from \"./adapters/http\";\r\nimport { longPollingAdapter, LongPollingOptions } from \"./adapters/longPolling\";\r\nimport { hlsAdapter, HLSOptions } from \"./adapters/hls\";\r\nimport { webrtcAdapter } from \"./adapters/webrtc\";\r\nimport { WebRTCOptions } from \"./core/types\";\r\nimport { socketioAdapter, SocketIOOptions } from \"./adapters/socketio\";\r\n\r\ntype AnyOptions =\r\n | WebSocketOptions\r\n | SSEOptions\r\n | HTTPStreamOptions\r\n | LongPollingOptions\r\n | HLSOptions\r\n | WebRTCOptions\r\n | SocketIOOptions;\r\n\r\nexport function createStream(opts: AnyOptions): StreamAPI {\r\n let adapter;\r\n const dummy = {} as any;\r\n const core = new StreamCore(dummy, opts as BaseOptions);\r\n\r\n switch (opts.type) {\r\n case \"websocket\":\r\n adapter = websocketAdapter(core, opts);\r\n break;\r\n case \"sse\":\r\n adapter = sseAdapter(core, opts);\r\n break;\r\n case \"http\":\r\n adapter = httpStreamAdapter(core, opts);\r\n break;\r\n case \"long-polling\":\r\n adapter = longPollingAdapter(core, opts);\r\n break;\r\n case \"hls\":\r\n adapter = hlsAdapter(core, opts);\r\n break;\r\n case \"webrtc\":\r\n adapter = webrtcAdapter(core, opts);\r\n break;\r\n case \"socketio\":\r\n adapter = socketioAdapter(core, opts);\r\n break;\r\n default:\r\n throw new Error(`Unknown stream type: ${(opts as any).type}`);\r\n }\r\n\r\n (core as any).adapter = adapter;\r\n\r\n return adapter;\r\n}\r\n\r\nexport * from \"./core/types\";\r\n"],"mappings":"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","names":[]}