| import { NEXT_REQUEST_ID_HEADER } from '../components/app-router-headers' | |
| import { InvariantError } from '../../shared/lib/invariant-error' | |
| export interface DebugChannelReadableWriterPair { | |
| readonly readable: ReadableStream<Uint8Array> | |
| readonly writer: WritableStreamDefaultWriter<Uint8Array> | |
| } | |
| const pairs = new Map<string, DebugChannelReadableWriterPair>() | |
| export function getOrCreateDebugChannelReadableWriterPair( | |
| requestId: string | |
| ): DebugChannelReadableWriterPair { | |
| let pair = pairs.get(requestId) | |
| if (!pair) { | |
| const { readable, writable } = new TransformStream<Uint8Array, Uint8Array>() | |
| pair = { readable, writer: writable.getWriter() } | |
| pairs.set(requestId, pair) | |
| pair.writer.closed.finally(() => pairs.delete(requestId)) | |
| } | |
| return pair | |
| } | |
| export function createDebugChannel( | |
| requestHeaders: Record<string, string> | 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 } | |
| } | |