91 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			91 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import * as types from './types.js';
 | |
| import { CoreResponse as AbstractCoreResponse } from '../core_base/response.js';
 | |
| 
 | |
| /**
 | |
|  * Fetch-based implementation of Core Response class
 | |
|  */
 | |
| export class CoreResponse<T = any>
 | |
|   extends AbstractCoreResponse<T>
 | |
|   implements types.IFetchResponse<T>
 | |
| {
 | |
|   private response: Response;
 | |
|   private responseClone: Response;
 | |
| 
 | |
|   // Public properties
 | |
|   public readonly ok: boolean;
 | |
|   public readonly status: number;
 | |
|   public readonly statusText: string;
 | |
|   public readonly headers: types.Headers;
 | |
|   public readonly url: string;
 | |
| 
 | |
|   constructor(response: Response) {
 | |
|     super();
 | |
|     // Clone the response so we can read the body multiple times if needed
 | |
|     this.response = response;
 | |
|     this.responseClone = response.clone();
 | |
| 
 | |
|     this.ok = response.ok;
 | |
|     this.status = response.status;
 | |
|     this.statusText = response.statusText;
 | |
|     this.url = response.url;
 | |
| 
 | |
|     // Convert Headers to plain object
 | |
|     this.headers = {};
 | |
|     response.headers.forEach((value, key) => {
 | |
|       this.headers[key] = value;
 | |
|     });
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Parse response as JSON
 | |
|    */
 | |
|   async json(): Promise<T> {
 | |
|     this.ensureNotConsumed();
 | |
|     try {
 | |
|       return await this.response.json();
 | |
|     } catch (error) {
 | |
|       throw new Error(`Failed to parse JSON: ${error.message}`);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Get response as text
 | |
|    */
 | |
|   async text(): Promise<string> {
 | |
|     this.ensureNotConsumed();
 | |
|     return await this.response.text();
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Get response as ArrayBuffer
 | |
|    */
 | |
|   async arrayBuffer(): Promise<ArrayBuffer> {
 | |
|     this.ensureNotConsumed();
 | |
|     return await this.response.arrayBuffer();
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Get response as a readable stream (Web Streams API)
 | |
|    */
 | |
|   stream(): ReadableStream<Uint8Array> | null {
 | |
|     this.ensureNotConsumed();
 | |
|     return this.response.body;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Node.js stream method - not available in browser
 | |
|    */
 | |
|   streamNode(): never {
 | |
|     throw new Error(
 | |
|       'streamNode() is not available in browser/fetch environment. Use stream() for web-style ReadableStream.',
 | |
|     );
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Get the raw Response object
 | |
|    */
 | |
|   raw(): Response {
 | |
|     return this.responseClone;
 | |
|   }
 | |
| }
 |