| | import { createBufferedTransformStream } from '../stream-utils/node-web-streams-helper' |
| | import { |
| | HMR_MESSAGE_SENT_TO_BROWSER, |
| | type HmrMessageSentToBrowser, |
| | } from './hot-reloader-types' |
| |
|
| | export interface ReactDebugChannelForBrowser { |
| | readonly readable: ReadableStream<Uint8Array> |
| | |
| | } |
| |
|
| | const reactDebugChannelsByHtmlRequestId = new Map< |
| | string, |
| | ReactDebugChannelForBrowser |
| | >() |
| |
|
| | export function connectReactDebugChannel( |
| | requestId: string, |
| | debugChannel: ReactDebugChannelForBrowser, |
| | sendToClient: (message: HmrMessageSentToBrowser) => void |
| | ) { |
| | const reader = debugChannel.readable |
| | .pipeThrough( |
| | |
| | createBufferedTransformStream({ maxBufferByteLength: 128 * 1024 }) |
| | ) |
| | .getReader() |
| |
|
| | const stop = () => { |
| | sendToClient({ |
| | type: HMR_MESSAGE_SENT_TO_BROWSER.REACT_DEBUG_CHUNK, |
| | requestId, |
| | chunk: null, |
| | }) |
| | } |
| |
|
| | const onError = (err: unknown) => { |
| | console.error(new Error('React debug channel stream error', { cause: err })) |
| | stop() |
| | } |
| |
|
| | const progress = (entry: ReadableStreamReadResult<Uint8Array>) => { |
| | if (entry.done) { |
| | stop() |
| | } else { |
| | sendToClient({ |
| | type: HMR_MESSAGE_SENT_TO_BROWSER.REACT_DEBUG_CHUNK, |
| | requestId, |
| | chunk: entry.value, |
| | }) |
| |
|
| | reader.read().then(progress, onError) |
| | } |
| | } |
| |
|
| | reader.read().then(progress, onError) |
| | } |
| |
|
| | export function connectReactDebugChannelForHtmlRequest( |
| | htmlRequestId: string, |
| | sendToClient: (message: HmrMessageSentToBrowser) => void |
| | ) { |
| | const debugChannel = reactDebugChannelsByHtmlRequestId.get(htmlRequestId) |
| |
|
| | if (!debugChannel) { |
| | return |
| | } |
| |
|
| | reactDebugChannelsByHtmlRequestId.delete(htmlRequestId) |
| |
|
| | connectReactDebugChannel(htmlRequestId, debugChannel, sendToClient) |
| | } |
| |
|
| | export function setReactDebugChannelForHtmlRequest( |
| | htmlRequestId: string, |
| | debugChannel: ReactDebugChannelForBrowser |
| | ) { |
| | |
| | |
| | reactDebugChannelsByHtmlRequestId.set(htmlRequestId, debugChannel) |
| | } |
| |
|
| | export function deleteReactDebugChannelForHtmlRequest(htmlRequestId: string) { |
| | reactDebugChannelsByHtmlRequestId.delete(htmlRequestId) |
| | } |
| |
|