From 2d22f14782d9c018a380ba08e50c7360c2f6cdaa Mon Sep 17 00:00:00 2001 From: hyungchulc <64293163+hyungchulc@users.noreply.github.com> Date: Wed, 22 Jul 2026 06:29:15 +0200 Subject: [PATCH 1/3] ci: add release verification --- .github/workflows/ci.yml | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 .github/workflows/ci.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..bf8218d --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,25 @@ +name: ci + +on: + push: + pull_request: + +permissions: + contents: read + +concurrency: + group: ci-${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + test: + runs-on: macos-latest + timeout-minutes: 15 + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + - run: npm ci + - run: npm run check From 283463cbaeaae691e2c41fe623faac0ec12d09c1 Mon Sep 17 00:00:00 2001 From: hyungchulc Date: Wed, 22 Jul 2026 06:36:53 +0200 Subject: [PATCH 2/3] fix: keep request timeout active until abort --- src/transports/whatsapp.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/transports/whatsapp.js b/src/transports/whatsapp.js index 109f653..a88959c 100644 --- a/src/transports/whatsapp.js +++ b/src/transports/whatsapp.js @@ -357,7 +357,6 @@ export class WhatsAppCloudApiClient { timedOut = true; controller.abort(); }, this.#requestTimeoutMs); - timer.unref?.(); let response; let responseBody; From c1f7ce1f9ca013d70dab99d4a995788ac95e3406 Mon Sep 17 00:00:00 2001 From: hyungchulc Date: Wed, 22 Jul 2026 06:39:53 +0200 Subject: [PATCH 3/3] fix: keep awaited deadline timers referenced --- src/bluebubbles.js | 1 - src/context-helpers.js | 1 - src/server-runtime.js | 3 --- src/transports/slack.js | 1 - src/transports/telegram.js | 1 - 5 files changed, 7 deletions(-) diff --git a/src/bluebubbles.js b/src/bluebubbles.js index 3f095fd..f20dc75 100644 --- a/src/bluebubbles.js +++ b/src/bluebubbles.js @@ -125,7 +125,6 @@ export class BlueBubblesClient { const timeout = controller ? setTimeout(() => controller.abort(), Math.max(1, Number(timeoutMs))) : null; - timeout?.unref?.(); let response; try { response = await fetch(this.authUrl(this.sendTextPath), { diff --git a/src/context-helpers.js b/src/context-helpers.js index a0ac6dd..f36b5c2 100644 --- a/src/context-helpers.js +++ b/src/context-helpers.js @@ -154,7 +154,6 @@ function runCommandHelper(helper, input, { child.kill("SIGKILL"); finish(reject, new Error(`helper_timeout:${helper.id}`)); }, timeoutMs); - timer.unref?.(); child.stdout.on("data", (chunk) => { stdout = Buffer.concat([stdout, chunk]); if (stdout.length > maxBytes) { diff --git a/src/server-runtime.js b/src/server-runtime.js index 46d9f19..1cdb6db 100644 --- a/src/server-runtime.js +++ b/src/server-runtime.js @@ -2776,7 +2776,6 @@ async function buildPreflightRichLinkDecisionWithTimeout(text) { timer = setTimeout(() => { resolve(null); }, nativeLinkPreviewPreflightTimeoutMs); - timer.unref?.(); }), ]); if (decision?.route === "native") return decision; @@ -3103,7 +3102,6 @@ function withTimeout(promise, timeoutMs, message) { let timer; const timeout = new Promise((_, reject) => { timer = setTimeout(() => reject(new Error(message)), timeoutMs); - timer.unref?.(); }); return Promise.race([promise, timeout]).finally(() => clearTimeout(timer)); } @@ -3205,7 +3203,6 @@ async function getFaceTimeLinkPageState(debugUrl) { async function fetchJsonWithTimeout(url, timeoutMs) { const controller = new AbortController(); const timer = setTimeout(() => controller.abort(), timeoutMs); - timer.unref?.(); try { const response = await fetch(url, { signal: controller.signal }); return await response.json(); diff --git a/src/transports/slack.js b/src/transports/slack.js index 4dad6b6..3f81b31 100644 --- a/src/transports/slack.js +++ b/src/transports/slack.js @@ -219,7 +219,6 @@ export class SlackTransport { let data; const controller = new AbortController(); const timeout = setTimeout(() => controller.abort(), this.requestTimeoutMs); - timeout.unref?.(); try { response = await this.fetchImpl(SLACK_POST_MESSAGE_URL, { method: "POST", diff --git a/src/transports/telegram.js b/src/transports/telegram.js index ae80d50..eed401c 100644 --- a/src/transports/telegram.js +++ b/src/transports/telegram.js @@ -218,7 +218,6 @@ export class TelegramTransport { let data; const controller = new AbortController(); const timeout = setTimeout(() => controller.abort(), this.requestTimeoutMs); - timeout.unref?.(); try { response = await this.fetchImpl(endpoint, { method: "POST",