feat(response): Add streamNode() method for Node.js stream support; update tests

This commit is contained in:
2025-08-19 01:20:19 +00:00
parent d455a34632
commit 35867d9148
5 changed files with 33 additions and 6 deletions

27
test/test.streamnode.ts Normal file
View File

@@ -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();

View File

@@ -42,4 +42,9 @@ export abstract class CoreResponse<T = any> implements types.ICoreResponse<T> {
* Get response as a web-style ReadableStream * Get response as a web-style ReadableStream
*/ */
abstract stream(): ReadableStream<Uint8Array> | null; abstract stream(): ReadableStream<Uint8Array> | null;
/**
* Get response as a Node.js stream (throws in browser)
*/
abstract streamNode(): NodeJS.ReadableStream | never;
} }

View File

@@ -86,4 +86,5 @@ export interface ICoreResponse<T = any> {
text(): Promise<string>; text(): Promise<string>;
arrayBuffer(): Promise<ArrayBuffer>; arrayBuffer(): Promise<ArrayBuffer>;
stream(): ReadableStream<Uint8Array> | null; // Always returns web-style stream stream(): ReadableStream<Uint8Array> | null; // Always returns web-style stream
streamNode(): NodeJS.ReadableStream | never; // Returns Node.js stream or throws in browser
} }

View File

@@ -7,9 +7,6 @@ export * from '../core_base/types.js';
* Fetch-specific response extensions * Fetch-specific response extensions
*/ */
export interface IFetchResponse<T = any> extends baseTypes.ICoreResponse<T> { export interface IFetchResponse<T = any> extends baseTypes.ICoreResponse<T> {
// Node.js stream method that throws in browser
streamNode(): never;
// Access to raw Response object // Access to raw Response object
raw(): Response; raw(): Response;
} }

View File

@@ -16,9 +16,6 @@ export interface IExtendedIncomingMessage<T = any>
* Node.js specific response extensions * Node.js specific response extensions
*/ */
export interface INodeResponse<T = any> extends baseTypes.ICoreResponse<T> { export interface INodeResponse<T = any> extends baseTypes.ICoreResponse<T> {
// Node.js specific methods
streamNode(): NodeJS.ReadableStream; // Returns Node.js style stream
// Legacy compatibility // Legacy compatibility
raw(): plugins.http.IncomingMessage; raw(): plugins.http.IncomingMessage;
} }