diff --git a/packages/standard-server-fetch/src/body.ts b/packages/standard-server-fetch/src/body.ts index 08223ec22..0f11ac031 100644 --- a/packages/standard-server-fetch/src/body.ts +++ b/packages/standard-server-fetch/src/body.ts @@ -5,14 +5,6 @@ import { generateContentDisposition, getFilenameFromContentDisposition } from '@ import { toEventIterator, toEventStream } from './event-iterator' export async function toStandardBody(re: Request | Response): Promise { - /** - * In native environments like React Native, the body may be `undefined` due to lack of streaming support. - * Therefore, we explicitly check for `null` to indicate an intentionally empty body. - */ - if (re.body === null) { - return undefined - } - const contentDisposition = re.headers.get('content-disposition') if (typeof contentDisposition === 'string') { diff --git a/packages/standard-server-fetch/src/event-iterator.test.ts b/packages/standard-server-fetch/src/event-iterator.test.ts index 86a83b5cc..a4f0b5bcf 100644 --- a/packages/standard-server-fetch/src/event-iterator.test.ts +++ b/packages/standard-server-fetch/src/event-iterator.test.ts @@ -82,6 +82,13 @@ describe('toEventIterator', () => { await expect(stream.getReader().closed).resolves.toBe(undefined) }) + it('with empty stream', async () => { + const generator = toEventIterator(null) + expect(generator).toSatisfy(isAsyncIteratorObject) + expect(await generator.next()).toEqual({ done: true, value: undefined }) + expect(await generator.next()).toEqual({ done: true, value: undefined }) + }) + it('with error event', async () => { const stream = new ReadableStream({ async pull(controller) { diff --git a/packages/standard-server-fetch/src/event-iterator.ts b/packages/standard-server-fetch/src/event-iterator.ts index 3bd81c311..2847b69e8 100644 --- a/packages/standard-server-fetch/src/event-iterator.ts +++ b/packages/standard-server-fetch/src/event-iterator.ts @@ -8,16 +8,20 @@ import { } from '@orpc/standard-server' export function toEventIterator( - stream: ReadableStream, + stream: ReadableStream | null, ): AsyncIteratorObject & AsyncGenerator { const eventStream = stream - .pipeThrough(new TextDecoderStream()) + ?.pipeThrough(new TextDecoderStream()) .pipeThrough(new EventDecoderStream()) - const reader = eventStream.getReader() + const reader = eventStream?.getReader() return createAsyncIteratorObject(async () => { while (true) { + if (reader === undefined) { + return { done: true, value: undefined } + } + const { done, value } = await reader.read() if (done) { @@ -57,7 +61,7 @@ export function toEventIterator( } } }, async () => { - await reader.cancel() + await reader?.cancel() }) } diff --git a/packages/standard-server-node/src/body.ts b/packages/standard-server-node/src/body.ts index 758e3c95b..550100b31 100644 --- a/packages/standard-server-node/src/body.ts +++ b/packages/standard-server-node/src/body.ts @@ -8,12 +8,6 @@ import { flattenHeader, generateContentDisposition, getFilenameFromContentDispos import { toEventIterator, toEventStream } from './event-iterator' export async function toStandardBody(req: NodeHttpRequest): Promise { - const method = req.method ?? 'GET' - - if (method === 'GET' || method === 'HEAD') { - return undefined - } - const contentDisposition = req.headers['content-disposition'] const contentType = req.headers['content-type']