From cc42052039fa652dd716fe009c48bbd1aea77af8 Mon Sep 17 00:00:00 2001 From: Jarred Sumner Date: Wed, 17 Jul 2024 18:57:03 -0700 Subject: [PATCH] `node-fetch` polyfill shouldn't break when web globals are overriden (#12634) --- src/bun.js/bindings/NodeFetch.cpp | 50 ++++++++++++++++++ src/bun.js/bindings/NodeFetch.h | 7 +++ src/js/thirdparty/node-fetch.ts | 16 +++--- test/bun.lockb | Bin 325027 -> 325186 bytes .../node/http/node-fetch-primordials.test.ts | 20 +++++++ test/package.json | 3 ++ 6 files changed, 88 insertions(+), 8 deletions(-) create mode 100644 src/bun.js/bindings/NodeFetch.cpp create mode 100644 src/bun.js/bindings/NodeFetch.h create mode 100644 test/js/node/http/node-fetch-primordials.test.ts diff --git a/src/bun.js/bindings/NodeFetch.cpp b/src/bun.js/bindings/NodeFetch.cpp new file mode 100644 index 0000000000..1b25af677d --- /dev/null +++ b/src/bun.js/bindings/NodeFetch.cpp @@ -0,0 +1,50 @@ +#include "root.h" +#include "JSDOMGlobalObjectInlines.h" +#include "ZigGlobalObject.h" + +#include "JSFetchHeaders.h" +#include "JSDOMFormData.h" +#include "JavaScriptCore/ObjectConstructor.h" + +#include "helpers.h" +#include "BunClientData.h" + +#include "JavaScriptCore/AggregateError.h" +#include "JavaScriptCore/JSFunction.h" +#include "JSDOMFile.h" + +namespace Bun { + +using namespace JSC; +using namespace WebCore; + +// Ensure overriding globals doesn't impact usages. +JSC::JSValue createNodeFetchInternalBinding(Zig::GlobalObject* globalObject) +{ + auto& vm = globalObject->vm(); + + auto* obj = constructEmptyObject(globalObject); + obj->putDirectIndex( + globalObject, 0, + globalObject->JSResponseConstructor()); + obj->putDirectIndex( + globalObject, 1, + globalObject->JSRequestConstructor()); + obj->putDirectIndex( + globalObject, 2, + globalObject->JSBlobConstructor()); + obj->putDirectIndex( + globalObject, 3, + WebCore::JSFetchHeaders::getConstructor(vm, globalObject)); + + obj->putDirectIndex( + globalObject, 4, + WebCore::JSDOMFormData::getConstructor(vm, globalObject)); + obj->putDirectIndex( + globalObject, 5, + globalObject->JSDOMFileConstructor()); + + return obj; +} + +} \ No newline at end of file diff --git a/src/bun.js/bindings/NodeFetch.h b/src/bun.js/bindings/NodeFetch.h new file mode 100644 index 0000000000..2b20c2d0be --- /dev/null +++ b/src/bun.js/bindings/NodeFetch.h @@ -0,0 +1,7 @@ +#include "config.h" + +namespace Bun { + +JSC::JSValue createNodeFetchInternalBinding(Zig::GlobalObject*); + +} \ No newline at end of file diff --git a/src/js/thirdparty/node-fetch.ts b/src/js/thirdparty/node-fetch.ts index 788ee6600f..d2b5831690 100644 --- a/src/js/thirdparty/node-fetch.ts +++ b/src/js/thirdparty/node-fetch.ts @@ -1,13 +1,13 @@ import type * as s from "stream"; -const { - Headers: WebHeaders, - Request: WebRequest, - Response: WebResponse, - Blob, - File = Blob, - FormData, -} = globalThis as any; +// Users may override the global fetch implementation, so we need to ensure these are the originals. +const bindings = $cpp("NodeFetch.cpp", "createNodeFetchInternalBinding"); +const WebResponse: typeof globalThis.Response = bindings[0]; +const WebRequest: typeof globalThis.Request = bindings[1]; +const Blob: typeof globalThis.Blob = bindings[2]; +const WebHeaders: typeof globalThis.Headers = bindings[3]; +const FormData: typeof globalThis.FormData = bindings[4]; +const File: typeof globalThis.File = bindings[5]; const nativeFetch = Bun.fetch; // node-fetch extends from URLSearchParams in their implementation... diff --git a/test/bun.lockb b/test/bun.lockb index b3cdc087159e70e93276956dad549dbec48565c4..b2294918f4e0c33be8a4cf4e74222a3002c556e4 100755 GIT binary patch delta 28247 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 TyKqscXfQ}zN_qOdf%d-uH(aQ7 delta 28201 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̯Dq_7gQ(xKTWlhokpP(g4{B>TX$sjcOOC5ae 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 diff --git a/test/js/node/http/node-fetch-primordials.test.ts b/test/js/node/http/node-fetch-primordials.test.ts new file mode 100644 index 0000000000..de674023c3 --- /dev/null +++ b/test/js/node/http/node-fetch-primordials.test.ts @@ -0,0 +1,20 @@ +import { test, expect } from "bun:test"; + +test("fetch, Response, Request can be overriden", async () => { + const { Response, Request } = globalThis; + globalThis.Response = class BadResponse {}; + globalThis.Request = class BadRequest {}; + globalThis.fetch = function badFetch() {}; + + const fetch = require("node-fetch").fetch; + + using server = Bun.serve({ + port: 0, + async fetch(req) { + return new Response("Hello, World!"); + }, + }); + + const response = await fetch(server.url); + expect(response).toBeInstanceOf(Response); +}); diff --git a/test/package.json b/test/package.json index 3008ded2ec..e0a9a275a3 100644 --- a/test/package.json +++ b/test/package.json @@ -61,5 +61,8 @@ "private": true, "scripts": { "typecheck": "tsc --noEmit" + }, + "resolutions": { + "react": "../node_modules/react" } }