From fa8934f504c5ed2155172c63622208c4e3a241e0 Mon Sep 17 00:00:00 2001 From: Beau Cameron Date: Fri, 12 Jan 2024 12:10:22 -0700 Subject: [PATCH] Node response fixes Removing emit of rawData from queryable and instead moving it into the parser. This would allow us to handle the recommended fix for larger responses in node. Also allows to remove unnecessary clone from BlobParse. Update caching.ts Update parsers.ts Update parsers.ts Update parsers.ts --- packages/queryable/behaviors/caching.ts | 2 +- packages/queryable/behaviors/parsers.ts | 9 +++++++-- packages/queryable/queryable.ts | 4 ---- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/packages/queryable/behaviors/caching.ts b/packages/queryable/behaviors/caching.ts index d5baabd82..c88d402b4 100644 --- a/packages/queryable/behaviors/caching.ts +++ b/packages/queryable/behaviors/caching.ts @@ -97,7 +97,7 @@ export function Caching(props?: ICachingProps): TimelinePipe { if (cached === null) { // if we don't have a cached result we need to get it after the request is sent. Get the raw value (un-parsed) to store into cache - this.on.rawData(noInherit(async function (response) { + instance.on.rawData(noInherit(async function (response) { setCachedValue(response); })); diff --git a/packages/queryable/behaviors/parsers.ts b/packages/queryable/behaviors/parsers.ts index 5313faa38..6fe2fe264 100644 --- a/packages/queryable/behaviors/parsers.ts +++ b/packages/queryable/behaviors/parsers.ts @@ -26,7 +26,7 @@ export function TextParse(): TimelinePipe { export function BlobParse(): TimelinePipe { return parseBinderWithErrorCheck( async (response) => { - const binaryResponseBody = parseToAtob(await response.clone().text()); + const binaryResponseBody = parseToAtob(await response.text()); // handle batch responses for things that are base64, like photos https://github.com/pnp/pnpjs/issues/2825 if(binaryResponseBody){ // Create an array buffer from the binary string @@ -123,7 +123,12 @@ export function parseBinderWithErrorCheck(impl: (r: Response) => Promise): instance.on.parse(async (url: URL, response: Response, result: any): Promise<[URL, Response, any]> => { if (response.ok && typeof result === "undefined") { - result = await impl(response); + const respClone = response.clone(); + + // https://github.com/node-fetch/node-fetch?tab=readme-ov-file#custom-highwatermark + const [implResult, raw] = await Promise.all([impl(response), respClone.text()]); + result = implResult; + (instance).emit.rawData(raw); } return [url, response, result]; diff --git a/packages/queryable/queryable.ts b/packages/queryable/queryable.ts index bc30a0158..b1db19f6f 100644 --- a/packages/queryable/queryable.ts +++ b/packages/queryable/queryable.ts @@ -180,10 +180,6 @@ export class Queryable extends Timeline implements IQu let response = await this.emit.send(requestUrl, init); log("Emitted send"); - log("Emitting rawData"); - this.emit.rawData(await response.clone().text()); - log("Emitted rawData"); - log("Emitting parse"); [requestUrl, response, result] = await this.emit.parse(requestUrl, response, result); log("Emitted parse");