import { NEXT_REQUEST_ID_HEADER } from '../components/app-router-headers' import { InvariantError } from '../../shared/lib/invariant-error' export interface DebugChannelReadableWriterPair { readonly readable: ReadableStream readonly writer: WritableStreamDefaultWriter } const pairs = new Map() export function getOrCreateDebugChannelReadableWriterPair( requestId: string ): DebugChannelReadableWriterPair { let pair = pairs.get(requestId) if (!pair) { const { readable, writable } = new TransformStream() pair = { readable, writer: writable.getWriter() } pairs.set(requestId, pair) pair.writer.closed.finally(() => pairs.delete(requestId)) } return pair } export function createDebugChannel( requestHeaders: Record | undefined ): { writable?: WritableStream readable?: ReadableStream } { let requestId: string | undefined if (requestHeaders) { requestId = requestHeaders[NEXT_REQUEST_ID_HEADER] ?? undefined if (!requestId) { throw new InvariantError( `Expected a ${JSON.stringify(NEXT_REQUEST_ID_HEADER)} request header.` ) } } else { requestId = self.__next_r if (!requestId) { throw new InvariantError( `Expected a request ID to be defined for the document via self.__next_r.` ) } } const { readable } = getOrCreateDebugChannelReadableWriterPair(requestId) return { readable } }