From 167a2abba109b661a8370560177bbfd9407702bc Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 11 Mar 2026 08:21:23 +0000 Subject: [PATCH 1/4] Initial plan From fd8c20d6a469143efd1cf7b1a52b0079183690ed Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 11 Mar 2026 08:33:01 +0000 Subject: [PATCH 2/4] fix: use static import for proxy-agent to fix Bun single executable bundling Co-authored-by: barjin <61918049+barjin@users.noreply.github.com> --- rsbuild.config.ts | 7 +++++++ src/http_client.ts | 11 +++-------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/rsbuild.config.ts b/rsbuild.config.ts index 336ab67d..794d9d63 100644 --- a/rsbuild.config.ts +++ b/rsbuild.config.ts @@ -14,6 +14,13 @@ export default defineConfig({ BROWSER_BUILD: true, }, }, + resolve: { + // proxy-agent is a Node.js-only package, exclude it from the browser bundle. + // The isNode() guard in http_client.ts ensures it's never called in browsers. + alias: { + 'proxy-agent': false, + }, + }, output: { distPath: { js: '.' }, filename: { js: 'bundle.js' }, diff --git a/src/http_client.ts b/src/http_client.ts index 773b4a64..bfe7f56d 100644 --- a/src/http_client.ts +++ b/src/http_client.ts @@ -1,11 +1,13 @@ import type http from 'node:http'; import type https from 'node:https'; import type { Socket } from 'node:net'; +import os from 'node:os'; import type { RetryFunction } from 'async-retry'; import retry from 'async-retry'; import type { AxiosError, AxiosInstance, AxiosRequestConfig, AxiosResponse, InternalAxiosRequestConfig } from 'axios'; import axios, { AxiosHeaders } from 'axios'; +import { ProxyAgent } from 'proxy-agent'; import { APIFY_ENV_VARS } from '@apify/consts'; import type { Log } from '@apify/log'; @@ -14,7 +16,7 @@ import { ApifyApiError } from './apify_api_error'; import type { RequestInterceptorFunction } from './interceptors'; import { InvalidResponseBodyError, requestInterceptors, responseInterceptors } from './interceptors'; import type { Statistics } from './statistics'; -import { asArray, cast, dynamicNodeImport, getVersionData, isNode, isStream } from './utils'; +import { asArray, cast, getVersionData, isNode, isStream } from './utils'; const { version } = getVersionData(); @@ -116,13 +118,6 @@ export class HttpClient { private async initNode(): Promise { if (!isNode()) return; - const [{ ProxyAgent }, os] = await Promise.all([ - // eslint-disable-next-line @typescript-eslint/consistent-type-imports - dynamicNodeImport('proxy-agent'), - // eslint-disable-next-line @typescript-eslint/consistent-type-imports - dynamicNodeImport('node:os'), - ]); - // We want to keep sockets alive for better performance. // Enhanced agent configuration based on agentkeepalive best practices: // - Nagle's algorithm disabled for lower latency From d4c1259a1ab8fee5387d21302b0565fd71536b7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jind=C5=99ich=20B=C3=A4r?= Date: Fri, 13 Mar 2026 16:53:17 +0100 Subject: [PATCH 3/4] Revert "fix: use static import for proxy-agent to fix Bun single executable bundling" This reverts commit fd8c20d6a469143efd1cf7b1a52b0079183690ed. --- rsbuild.config.ts | 7 ------- src/http_client.ts | 11 ++++++++--- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/rsbuild.config.ts b/rsbuild.config.ts index 794d9d63..336ab67d 100644 --- a/rsbuild.config.ts +++ b/rsbuild.config.ts @@ -14,13 +14,6 @@ export default defineConfig({ BROWSER_BUILD: true, }, }, - resolve: { - // proxy-agent is a Node.js-only package, exclude it from the browser bundle. - // The isNode() guard in http_client.ts ensures it's never called in browsers. - alias: { - 'proxy-agent': false, - }, - }, output: { distPath: { js: '.' }, filename: { js: 'bundle.js' }, diff --git a/src/http_client.ts b/src/http_client.ts index bfe7f56d..773b4a64 100644 --- a/src/http_client.ts +++ b/src/http_client.ts @@ -1,13 +1,11 @@ import type http from 'node:http'; import type https from 'node:https'; import type { Socket } from 'node:net'; -import os from 'node:os'; import type { RetryFunction } from 'async-retry'; import retry from 'async-retry'; import type { AxiosError, AxiosInstance, AxiosRequestConfig, AxiosResponse, InternalAxiosRequestConfig } from 'axios'; import axios, { AxiosHeaders } from 'axios'; -import { ProxyAgent } from 'proxy-agent'; import { APIFY_ENV_VARS } from '@apify/consts'; import type { Log } from '@apify/log'; @@ -16,7 +14,7 @@ import { ApifyApiError } from './apify_api_error'; import type { RequestInterceptorFunction } from './interceptors'; import { InvalidResponseBodyError, requestInterceptors, responseInterceptors } from './interceptors'; import type { Statistics } from './statistics'; -import { asArray, cast, getVersionData, isNode, isStream } from './utils'; +import { asArray, cast, dynamicNodeImport, getVersionData, isNode, isStream } from './utils'; const { version } = getVersionData(); @@ -118,6 +116,13 @@ export class HttpClient { private async initNode(): Promise { if (!isNode()) return; + const [{ ProxyAgent }, os] = await Promise.all([ + // eslint-disable-next-line @typescript-eslint/consistent-type-imports + dynamicNodeImport('proxy-agent'), + // eslint-disable-next-line @typescript-eslint/consistent-type-imports + dynamicNodeImport('node:os'), + ]); + // We want to keep sockets alive for better performance. // Enhanced agent configuration based on agentkeepalive best practices: // - Nagle's algorithm disabled for lower latency From fa77a876b06a8ef15c7b8941262616e41d1be54d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jind=C5=99ich=20B=C3=A4r?= Date: Fri, 13 Mar 2026 16:57:17 +0100 Subject: [PATCH 4/4] chore: simplify changes --- rsbuild.config.ts | 7 +++++++ src/http_client.ts | 10 +++------- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/rsbuild.config.ts b/rsbuild.config.ts index 336ab67d..794d9d63 100644 --- a/rsbuild.config.ts +++ b/rsbuild.config.ts @@ -14,6 +14,13 @@ export default defineConfig({ BROWSER_BUILD: true, }, }, + resolve: { + // proxy-agent is a Node.js-only package, exclude it from the browser bundle. + // The isNode() guard in http_client.ts ensures it's never called in browsers. + alias: { + 'proxy-agent': false, + }, + }, output: { distPath: { js: '.' }, filename: { js: 'bundle.js' }, diff --git a/src/http_client.ts b/src/http_client.ts index 773b4a64..77bc38b2 100644 --- a/src/http_client.ts +++ b/src/http_client.ts @@ -6,6 +6,7 @@ import type { RetryFunction } from 'async-retry'; import retry from 'async-retry'; import type { AxiosError, AxiosInstance, AxiosRequestConfig, AxiosResponse, InternalAxiosRequestConfig } from 'axios'; import axios, { AxiosHeaders } from 'axios'; +import { ProxyAgent } from 'proxy-agent'; import { APIFY_ENV_VARS } from '@apify/consts'; import type { Log } from '@apify/log'; @@ -115,13 +116,8 @@ export class HttpClient { private async initNode(): Promise { if (!isNode()) return; - - const [{ ProxyAgent }, os] = await Promise.all([ - // eslint-disable-next-line @typescript-eslint/consistent-type-imports - dynamicNodeImport('proxy-agent'), - // eslint-disable-next-line @typescript-eslint/consistent-type-imports - dynamicNodeImport('node:os'), - ]); + // eslint-disable-next-line @typescript-eslint/consistent-type-imports + const os = await dynamicNodeImport('node:os'); // We want to keep sockets alive for better performance. // Enhanced agent configuration based on agentkeepalive best practices: