Skip to content

feat(core): accept Fusor JSON webhooks - #205

Draft
Tom Tang (qwerzl) wants to merge 2 commits into
mainfrom
codex/fusor-json-webhooks
Draft

feat(core): accept Fusor JSON webhooks#205
Tom Tang (qwerzl) wants to merge 2 commits into
mainfrom
codex/fusor-json-webhooks

Conversation

@qwerzl

@qwerzl Tom Tang (qwerzl) commented Jul 19, 2026

Copy link
Copy Markdown
Member

Summary

  • recognize Fusor HTTP deliveries by ce-type: dev.spctrm.fusor.delivery
  • validate the additive schemaVersion: 1 JSON envelope and reject legacy protobuf or invalid payloads with 400
  • pass exact decoded rawBodyBase64 bytes plus method, path, and lowercase headers into the existing Fusor provider pipeline
  • keep native Spectrum HMAC verification and WebSocket protobuf handling unchanged
  • add Node/Bun core coverage plus Hono, Express, Fastify, and Elysia JSON delivery tests
  • document all four body encodings and low-code/signature-aware consumption

Why

Fusor customer webhook fanout is moving from protobuf to plain JSON so low-code platforms such as n8n can consume it. The SDK must accept the new public contract without reconstructing provider request bytes.

Impact

This is a hard cut: legacy Fusor protobuf webhook bodies now return 400. Publish this SDK change before deploying the coordinated photon-hq/fusor branch codex/fanout-webhook-json. Native Spectrum webhooks and Fusor WebSocket events are unchanged. Package versions remain at 11.2.0 in source because the lockstep release workflow owns versioning.

Validation

  • bun run check
  • bun run typecheck — 13 tasks
  • bun run test — 32/32 Node+Bun tasks
  • bun run build — 12/12 tasks
  • all four framework adapter JSON-delivery tests
  • cross-repository binary round-trip audit against the Fusor producer
  • git diff --check

View with Codesmith Autofix with Codesmith
Need help on this PR? Tag /codesmith with what you need. Autofix is disabled.

Summary by CodeRabbit

  • New Features

    • Added support for versioned Fusor webhook envelopes (schema v1) with JSON, form, text, and base64-encoded binary body handling.
    • Fusor requests are now routed by CloudEvents ce-type.
    • Provider verification uses the exact original POST bytes plus normalized method/path/headers.
  • Bug Fixes

    • Malformed/invalid Fusor envelopes are rejected with client-error responses.
    • Improved preservation of empty and canonical base64 bodies, and more reliable repeated-header handling.
  • Documentation

    • Updated webhook delivery/verification guidance, including how request bodies map to bodyEncoding.

@coderabbitai

coderabbitai Bot commented Jul 19, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 0b9a3655-867d-4273-86e7-b695577cb514

📥 Commits

Reviewing files that changed from the base of the PR and between acd5c89 and 1770a89.

📒 Files selected for processing (6)
  • packages/core/src/fusor/parse.ts
  • packages/core/src/fusor/types.ts
  • packages/core/src/fusor/webhook.ts
  • packages/core/src/spectrum.ts
  • packages/core/test/core/fusor/parse.test.ts
  • packages/core/test/core/fusor/webhook.test.ts
🚧 Files skipped from review as they are similar to previous changes (5)
  • packages/core/src/fusor/types.ts
  • packages/core/src/fusor/parse.ts
  • packages/core/src/fusor/webhook.ts
  • packages/core/src/spectrum.ts
  • packages/core/test/core/fusor/webhook.test.ts
📜 Recent review details
🧰 Additional context used
📓 Path-based instructions (4)
**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

Use explicit function parameter and return types when they improve clarity; prefer unknown over any; use as const for immutable literal values; and rely on TypeScript narrowing instead of assertions.

Files:

  • packages/core/test/core/fusor/parse.test.ts
**/*.{js,jsx,ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{js,jsx,ts,tsx}: Use meaningful variable names and extract magic numbers into descriptively named constants.
Use arrow functions for callbacks and short functions.
Prefer for...of loops over .forEach() and indexed for loops.
Use optional chaining and nullish coalescing for safer property access.
Prefer template literals over string concatenation and use destructuring for object and array assignments.
Use const by default, let only when reassignment is needed, and never use var.
Always await promises in async functions and use the returned value; prefer async/await over promise chains.
Handle async errors appropriately with try-catch blocks and do not use async functions as Promise executors.
Remove console.log, debugger, and alert statements from production code.
Throw Error objects with descriptive messages rather than strings or other values.
Use try-catch blocks meaningfully and do not catch errors solely to rethrow them.
Prefer early returns for error cases and to reduce nesting; use simple conditionals instead of nested ternaries.
Keep functions focused and within reasonable cognitive-complexity limits, extract complex conditions into named booleans, and group related code while separating concerns.
Avoid dangerouslySetInnerHTML unless absolutely necessary; do not use eval() or assign directly to document.cookie; validate and sanitize user input.
Avoid spread syntax in accumulators within loops, use top-level regex literals instead of creating them in loops, prefer specific imports over namespace imports, and avoid barrel files that re-export everything.

Files:

  • packages/core/test/core/fusor/parse.test.ts
**/*.{tsx,ts}

📄 CodeRabbit inference engine (AGENTS.md)

In Next.js, use Server Components for async data fetching instead of async Client Components.

Files:

  • packages/core/test/core/fusor/parse.test.ts
**/*.{test,spec}.{js,jsx,ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{test,spec}.{js,jsx,ts,tsx}: Write assertions inside it() or test() blocks, avoid done callbacks in async tests, and do not commit tests containing .only or .skip.
Keep test suites reasonably flat and avoid excessive describe nesting.

Files:

  • packages/core/test/core/fusor/parse.test.ts
🔇 Additional comments (1)
packages/core/test/core/fusor/parse.test.ts (1)

1-15: LGTM!


📝 Walkthrough

Walkthrough

Fusor webhook delivery now uses schema v1 JSON envelopes with canonical raw-body preservation, CloudEvents ce-type routing, shared handler processing, expanded validation, and adapter-level integration coverage.

Changes

Fusor webhook delivery

Layer / File(s) Summary
Envelope validation and decoding
packages/core/src/fusor/webhook.ts, packages/core/src/fusor/types.ts, docs/webhooks.mdx.vel
Defines and documents schema v1 envelopes, body encodings, canonical base64 validation, normalized headers, and decoded raw-body handling.
Routing and shared processing
packages/core/src/spectrum.ts, packages/core/src/fusor/core.ts, packages/core/src/fusor/parse.ts
Routes Fusor requests using ce-type, rejects malformed envelopes with HTTP 400, and centralizes handler fan-out and reply combination.
Core webhook validation
packages/core/test/core/fusor/webhook.test.ts, packages/core/test/core/fusor/parse.test.ts, packages/core/test/webhook/spectrum.test.ts
Tests verification inputs, body preservation, envelope acceptance/rejection, routing, handler behavior, and provider failures.
Adapter integration and fixtures
packages/test-support/src/fusor.ts, packages/elysia/test/*, packages/express/*, packages/fastify/*, packages/hono/test/*
Updates test encoders and verifies Fusor envelope delivery through Elysia, Express, Fastify, and Hono integrations.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Client
  participant Adapter
  participant Spectrum
  participant FusorDecoder
  participant FusorCore
  participant Provider
  Client->>Adapter: POST Fusor JSON envelope
  Adapter->>Spectrum: raw bytes and headers
  Spectrum->>FusorDecoder: decode envelope
  FusorDecoder-->>Spectrum: parsed request and rawBody
  Spectrum->>FusorCore: processRequest
  FusorCore->>Provider: verify and handle request
  Provider-->>FusorCore: handler outcome
  FusorCore-->>Spectrum: combined reply
  Spectrum-->>Client: HTTP response
Loading

Possibly related PRs

Suggested reviewers: underthestars-zhy

Poem

I’m a rabbit with bytes in my paws,
Through JSON envelopes I hop without flaws.
Headers point the way, raw bodies stay true,
Handlers dance in parallel too.
“200!” cries the burrow—delivery is through!

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 40.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely captures the main change: adding support for Fusor JSON webhook deliveries.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/fusor-json-webhooks

Comment @coderabbitai help to get the list of available commands.

@pkg-pr-new

pkg-pr-new Bot commented Jul 19, 2026

Copy link
Copy Markdown

Open in StackBlitz

@spectrum-ts/core

npm i https://pkg.pr.new/@spectrum-ts/core@205

@spectrum-ts/elysia

npm i https://pkg.pr.new/@spectrum-ts/elysia@205

@spectrum-ts/express

npm i https://pkg.pr.new/@spectrum-ts/express@205

@spectrum-ts/fastify

npm i https://pkg.pr.new/@spectrum-ts/fastify@205

@spectrum-ts/hono

npm i https://pkg.pr.new/@spectrum-ts/hono@205

@spectrum-ts/imessage

npm i https://pkg.pr.new/@spectrum-ts/imessage@205

@spectrum-ts/imessage-local

npm i https://pkg.pr.new/@spectrum-ts/imessage-local@205

@spectrum-ts/slack

npm i https://pkg.pr.new/@spectrum-ts/slack@205

spectrum-ts

npm i https://pkg.pr.new/spectrum-ts@205

@spectrum-ts/telegram

npm i https://pkg.pr.new/@spectrum-ts/telegram@205

@spectrum-ts/terminal

npm i https://pkg.pr.new/@spectrum-ts/terminal@205

@spectrum-ts/whatsapp-business

npm i https://pkg.pr.new/@spectrum-ts/whatsapp-business@205

commit: 1770a89

@qwerzl
Tom Tang (qwerzl) marked this pull request as ready for review July 19, 2026 11:30

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Problem / solution review

Verdict: The problem is real, and this PR fixes the actual contract change — it is not papering over a deeper bug.

What problem is this trying to solve?

Fusor’s HTTP webhook fanout is moving from a protobuf envelope to a versioned JSON envelope so low-code tools (for example n8n) can read deliveries without a protobuf decoder.

That creates two concrete SDK problems:

  1. Both webhook kinds are now JSON. Native Spectrum webhooks were already JSON; Fusor used to be binary protobuf. The old “does the body start with {?” check can no longer tell them apart.
  2. Providers still need the exact original request bytes. Platform signature checks (verify()) must run on the provider’s real body, not on JSON that was parsed and re-serialized along the way.

So this is a coordinated public-contract change, not a local SDK quirk.

Is the proposed fix the right solution?

Yes. The design matches the constraints:

  • Explicit routing: ce-type: dev.spctrm.fusor.delivery selects the Fusor path; everything else stays on the native HMAC path. That is the right discriminator once both bodies are JSON.
  • Exact bytes preserved: The envelope carries rawBodyBase64, and the SDK always hands those decoded bytes to provider verify(). The normalized body / bodyEncoding fields are for human/low-code use, not for signature reconstruction. That avoids the classic “re-stringify JSON and break HMAC” failure mode.
  • Transport split stays clean: HTTP JSON goes through processRequest; WebSocket still uses protobuf/processEvent. The shared provider pipeline is reused without forcing one wire format onto both transports.
  • Hard cut of legacy protobuf HTTP bodies is intentional and called out as coordinated with the Fusor producer. That is a release-ordering choice, not a symptom patch.

Is there a deeper issue underneath?

Not really. Sharing one webhook endpoint for native Spectrum and Fusor deliveries is an existing product shape. Sniffing payload bytes was always a brittle stand-in for a real content type; switching to CloudEvents ce-type is an improvement, not a workaround.

The only operational risk is the hard cut itself: this SDK and the Fusor JSON fanout must ship together, or in-flight protobuf deliveries will start returning 400. The PR already documents that. A dual-accept migration window would be softer, but it is not required for correctness if the cutover is coordinated.

Bottom line

Ship this as the SDK half of the Fusor JSON webhook contract. The important invariant — exact provider bytes for verify(), with a clear header-based route into that path — is handled directly.

Open in Web View Automation 

Sent by Cursor Automation: PR analyze

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/core/src/fusor/types.ts (1)

87-99: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Doc says headers "are required" but the type keeps them optional.

The rewritten contract states headers are required for routing/verification, but WebhookRawRequest.headers is still typed headers?: Record<string, string>. Downstream (readWebhookInput in spectrum.ts) does handle a missing headers gracefully via raw.headers ?? {}, but it silently routes to the native path and then fails closed with a 400/401 — worth aligning the doc wording with the actual optionality instead of asserting a hard requirement the type doesn't enforce.

📝 Suggested wording fix
- * `headers` are required for routing and verification. Fusor deliveries carry
+ * `headers` (typed optional, but effectively required) drive routing and
+ * verification. Fusor deliveries carry
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/core/src/fusor/types.ts` around lines 87 - 99, Align the
WebhookRawRequest documentation with the optional headers?: Record<string,
string> contract. Update the comment above WebhookRawRequest to state that
headers are optional and describe the existing missing-header behavior handled
by readWebhookInput, without changing the type or routing logic.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@packages/core/src/fusor/webhook.ts`:
- Around line 86-100: The duplicate header normalization logic should use one
shared merge helper. In packages/core/src/fusor/webhook.ts:86-100, extract the
duplicate-value joining from normalizeHeaders into a shared helper; in
packages/core/src/fusor/parse.ts:54-71, replace the inline existing-value merge
with that helper while preserving lowercase names and RFC-compliant ", "
joining.

---

Outside diff comments:
In `@packages/core/src/fusor/types.ts`:
- Around line 87-99: Align the WebhookRawRequest documentation with the optional
headers?: Record<string, string> contract. Update the comment above
WebhookRawRequest to state that headers are optional and describe the existing
missing-header behavior handled by readWebhookInput, without changing the type
or routing logic.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 9cfaf56f-a390-4abb-a23a-51c1592afed4

📥 Commits

Reviewing files that changed from the base of the PR and between 9b8e927 and acd5c89.

📒 Files selected for processing (16)
  • docs/webhooks.mdx.vel
  • packages/core/src/fusor/core.ts
  • packages/core/src/fusor/parse.ts
  • packages/core/src/fusor/types.ts
  • packages/core/src/fusor/webhook.ts
  • packages/core/src/spectrum.ts
  • packages/core/src/webhook/types.ts
  • packages/core/test/core/fusor/webhook.test.ts
  • packages/core/test/webhook/spectrum.test.ts
  • packages/elysia/test/elysia.test.ts
  • packages/express/src/index.ts
  • packages/express/test/express.test.ts
  • packages/fastify/src/index.ts
  • packages/fastify/test/fastify.test.ts
  • packages/hono/test/hono.test.ts
  • packages/test-support/src/fusor.ts
📜 Review details
🧰 Additional context used
📓 Path-based instructions (4)
**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

Use explicit function parameter and return types when they improve clarity; prefer unknown over any; use as const for immutable literal values; and rely on TypeScript narrowing instead of assertions.

Files:

  • packages/core/src/fusor/parse.ts
  • packages/core/src/webhook/types.ts
  • packages/express/src/index.ts
  • packages/fastify/src/index.ts
  • packages/elysia/test/elysia.test.ts
  • packages/core/src/fusor/webhook.ts
  • packages/fastify/test/fastify.test.ts
  • packages/core/src/fusor/types.ts
  • packages/hono/test/hono.test.ts
  • packages/express/test/express.test.ts
  • packages/core/test/webhook/spectrum.test.ts
  • packages/core/src/spectrum.ts
  • packages/test-support/src/fusor.ts
  • packages/core/src/fusor/core.ts
  • packages/core/test/core/fusor/webhook.test.ts
**/*.{js,jsx,ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{js,jsx,ts,tsx}: Use meaningful variable names and extract magic numbers into descriptively named constants.
Use arrow functions for callbacks and short functions.
Prefer for...of loops over .forEach() and indexed for loops.
Use optional chaining and nullish coalescing for safer property access.
Prefer template literals over string concatenation and use destructuring for object and array assignments.
Use const by default, let only when reassignment is needed, and never use var.
Always await promises in async functions and use the returned value; prefer async/await over promise chains.
Handle async errors appropriately with try-catch blocks and do not use async functions as Promise executors.
Remove console.log, debugger, and alert statements from production code.
Throw Error objects with descriptive messages rather than strings or other values.
Use try-catch blocks meaningfully and do not catch errors solely to rethrow them.
Prefer early returns for error cases and to reduce nesting; use simple conditionals instead of nested ternaries.
Keep functions focused and within reasonable cognitive-complexity limits, extract complex conditions into named booleans, and group related code while separating concerns.
Avoid dangerouslySetInnerHTML unless absolutely necessary; do not use eval() or assign directly to document.cookie; validate and sanitize user input.
Avoid spread syntax in accumulators within loops, use top-level regex literals instead of creating them in loops, prefer specific imports over namespace imports, and avoid barrel files that re-export everything.

Files:

  • packages/core/src/fusor/parse.ts
  • packages/core/src/webhook/types.ts
  • packages/express/src/index.ts
  • packages/fastify/src/index.ts
  • packages/elysia/test/elysia.test.ts
  • packages/core/src/fusor/webhook.ts
  • packages/fastify/test/fastify.test.ts
  • packages/core/src/fusor/types.ts
  • packages/hono/test/hono.test.ts
  • packages/express/test/express.test.ts
  • packages/core/test/webhook/spectrum.test.ts
  • packages/core/src/spectrum.ts
  • packages/test-support/src/fusor.ts
  • packages/core/src/fusor/core.ts
  • packages/core/test/core/fusor/webhook.test.ts
**/*.{tsx,ts}

📄 CodeRabbit inference engine (AGENTS.md)

In Next.js, use Server Components for async data fetching instead of async Client Components.

Files:

  • packages/core/src/fusor/parse.ts
  • packages/core/src/webhook/types.ts
  • packages/express/src/index.ts
  • packages/fastify/src/index.ts
  • packages/elysia/test/elysia.test.ts
  • packages/core/src/fusor/webhook.ts
  • packages/fastify/test/fastify.test.ts
  • packages/core/src/fusor/types.ts
  • packages/hono/test/hono.test.ts
  • packages/express/test/express.test.ts
  • packages/core/test/webhook/spectrum.test.ts
  • packages/core/src/spectrum.ts
  • packages/test-support/src/fusor.ts
  • packages/core/src/fusor/core.ts
  • packages/core/test/core/fusor/webhook.test.ts
**/*.{test,spec}.{js,jsx,ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{test,spec}.{js,jsx,ts,tsx}: Write assertions inside it() or test() blocks, avoid done callbacks in async tests, and do not commit tests containing .only or .skip.
Keep test suites reasonably flat and avoid excessive describe nesting.

Files:

  • packages/elysia/test/elysia.test.ts
  • packages/fastify/test/fastify.test.ts
  • packages/hono/test/hono.test.ts
  • packages/express/test/express.test.ts
  • packages/core/test/webhook/spectrum.test.ts
  • packages/core/test/core/fusor/webhook.test.ts
🪛 ast-grep (0.44.1)
packages/express/test/express.test.ts

[warning] 125-125: Express application should use Helmet
Context: express()
Note: [CWE-693] Protection Mechanism Failure (Express app without Helmet security headers).

(missing-helmet-typescript)

🔇 Additional comments (20)
packages/core/src/fusor/webhook.ts (2)

1-49: LGTM!

Also applies to: 51-73, 81-84


75-79: 🗄️ Data Integrity & Integration

No issue: processRequest only consumes eventId and platform, so the extra envelope fields are intentionally not part of FusorWebhookEvent.

			> Likely an incorrect or invalid review comment.
packages/core/src/fusor/parse.ts (1)

26-28: LGTM!

packages/core/src/webhook/types.ts (1)

7-10: LGTM!

docs/webhooks.mdx.vel (3)

18-22: LGTM!


82-94: LGTM!


221-221: LGTM!

packages/test-support/src/fusor.ts (1)

2-7: LGTM!

Also applies to: 20-28, 70-89, 118-188

packages/fastify/src/index.ts (1)

8-8: LGTM!

Also applies to: 89-89

packages/fastify/test/fastify.test.ts (1)

3-7: LGTM!

Also applies to: 117-152

packages/hono/test/hono.test.ts (1)

3-7: LGTM!

Also applies to: 109-147

packages/express/test/express.test.ts (2)

126-126: Static-analysis Helmet hint doesn't apply here.

Flagged by static analysis as missing Helmet security headers, but this express() instance is a short-lived, in-process test server on a random localhost port used only for this test — not a production-facing app.

Source: Linters/SAST tools


4-8: LGTM!

Also applies to: 122-158

packages/core/src/fusor/core.ts (1)

41-45: LGTM!

Also applies to: 168-168, 324-346, 347-360, 364-370, 392-407

packages/core/src/spectrum.ts (2)

8-9: LGTM!

Also applies to: 21-25, 109-118, 1009-1010, 1072-1094, 1147-1151, 1302-1313, 1323-1328


1314-1321: 🎯 Functional Correctness | ⚡ Quick win

Malformed-envelope 400 returns an empty body, unlike every other 400/401 path here.

processWebhookEvent's poison branch and handleSpectrumWebhook's malformed-payload/signature-failure branches all return a descriptive text body via encodeText(...). The Fusor envelope decode-failure branch returns body: new Uint8Array(0) with no explanation, making it harder for API consumers to diagnose a bad envelope from the HTTP response alone.

🛠️ Suggested fix for consistency
     const event = decodeWebhookEvent(bodyBytes);
     if (!event) {
       return buildWebhookResult(asWeb, {
         status: 400,
         headers: {},
-        body: new Uint8Array(0),
+        body: encodeText("malformed Fusor envelope"),
       });
     }
packages/core/test/core/fusor/webhook.test.ts (1)

6-8: LGTM!

Also applies to: 22-22, 41-41, 79-79, 115-115, 141-141, 172-180, 198-204, 206-244, 246-299, 301-327, 329-345, 347-414, 416-426, 442-442, 466-466, 497-497, 531-531, 560-566, 584-584, 623-623, 665-665, 701-701, 729-729

packages/core/test/webhook/spectrum.test.ts (1)

1-6: LGTM!

Also applies to: 199-210, 229-261, 273-276

packages/elysia/test/elysia.test.ts (1)

3-7: LGTM!

Also applies to: 107-144

packages/express/src/index.ts (1)

10-10: LGTM!

Comment thread packages/core/src/fusor/webhook.ts
@qwerzl
Tom Tang (qwerzl) marked this pull request as draft July 19, 2026 14:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant