diff --git a/test/test.streamnode.ts b/test/test.streamnode.ts new file mode 100644 index 0000000..503ffff --- /dev/null +++ b/test/test.streamnode.ts @@ -0,0 +1,27 @@ +import { tap, expect } from '@git.zone/tstest/tapbundle'; +import { SmartRequest } from '../ts/index.js'; + +tap.test('should have streamNode() method available', async () => { + const response = await SmartRequest.create() + .url('https://httpbin.org/get') + .get(); + + // Verify streamNode() method exists + expect(response.streamNode).toBeDefined(); + expect(typeof response.streamNode).toEqual('function'); + + // In Node.js, it should return a stream + const nodeStream = response.streamNode(); + expect(nodeStream).toBeDefined(); + + // Verify it's a Node.js readable stream + expect(typeof nodeStream.pipe).toEqual('function'); + expect(typeof nodeStream.on).toEqual('function'); + + // Consume the stream to avoid hanging + nodeStream.resume(); +}); + + + +export default tap.start(); \ No newline at end of file diff --git a/ts/core_base/response.ts b/ts/core_base/response.ts index 562b81c..e5e4df8 100644 --- a/ts/core_base/response.ts +++ b/ts/core_base/response.ts @@ -42,4 +42,9 @@ export abstract class CoreResponse implements types.ICoreResponse { * Get response as a web-style ReadableStream */ abstract stream(): ReadableStream | null; + + /** + * Get response as a Node.js stream (throws in browser) + */ + abstract streamNode(): NodeJS.ReadableStream | never; } diff --git a/ts/core_base/types.ts b/ts/core_base/types.ts index e02e871..f38d06d 100644 --- a/ts/core_base/types.ts +++ b/ts/core_base/types.ts @@ -86,4 +86,5 @@ export interface ICoreResponse { text(): Promise; arrayBuffer(): Promise; stream(): ReadableStream | null; // Always returns web-style stream + streamNode(): NodeJS.ReadableStream | never; // Returns Node.js stream or throws in browser } diff --git a/ts/core_fetch/types.ts b/ts/core_fetch/types.ts index 03ed4b2..e217f09 100644 --- a/ts/core_fetch/types.ts +++ b/ts/core_fetch/types.ts @@ -7,9 +7,6 @@ export * from '../core_base/types.js'; * Fetch-specific response extensions */ export interface IFetchResponse extends baseTypes.ICoreResponse { - // Node.js stream method that throws in browser - streamNode(): never; - // Access to raw Response object raw(): Response; } diff --git a/ts/core_node/types.ts b/ts/core_node/types.ts index 655c2c5..0fa2e3d 100644 --- a/ts/core_node/types.ts +++ b/ts/core_node/types.ts @@ -16,9 +16,6 @@ export interface IExtendedIncomingMessage * Node.js specific response extensions */ export interface INodeResponse extends baseTypes.ICoreResponse { - // Node.js specific methods - streamNode(): NodeJS.ReadableStream; // Returns Node.js style stream - // Legacy compatibility raw(): plugins.http.IncomingMessage; }