@coinbase/cdp-sdk
Version:
SDK for interacting with the Coinbase Developer Platform Wallet API
71 lines (65 loc) • 2.18 kB
text/typescript
import { fromJson } from "../json.js";
import { getBinaryResponse } from "./BinaryResponse.js";
// Pins the upstream Response so undici's FinalizationRegistry can't GC it and cancel the body stream.
function retainResponse(target: object, response: Response): void {
Object.defineProperty(target, "__fern_response_ref", {
value: response,
enumerable: false,
configurable: true,
writable: false,
});
}
export async function getResponseBody(response: Response, responseType?: string): Promise<unknown> {
switch (responseType) {
case "binary-response":
return getBinaryResponse(response);
case "blob":
return await response.blob();
case "arrayBuffer":
return await response.arrayBuffer();
case "sse":
if (response.body == null) {
return {
ok: false,
error: {
reason: "body-is-null",
statusCode: response.status,
},
};
}
retainResponse(response.body, response);
return response.body;
case "streaming":
if (response.body == null) {
return {
ok: false,
error: {
reason: "body-is-null",
statusCode: response.status,
},
};
}
retainResponse(response.body, response);
return response.body;
case "text":
return await response.text();
}
// if responseType is "json" or not specified, try to parse as JSON
const text = await response.text();
if (text.length > 0) {
try {
const responseBody = fromJson(text);
return responseBody;
} catch (_err) {
return {
ok: false,
error: {
reason: "non-json",
statusCode: response.status,
rawBody: text,
},
};
}
}
return undefined;
}