Skip to content

feat!: use Fetch API for HTTP transport - #657

Open
kahirokunn wants to merge 5 commits into
cloudevents:mainfrom
kahirokunn:split/http-fetch
Open

kahirokunn wants to merge 5 commits into
cloudevents:mainfrom
kahirokunn:split/http-fetch

Conversation

@kahirokunn

Copy link
Copy Markdown
Contributor

Fixes: #534

Proposed Changes

Use the Fetch API for the built-in HTTP transport.

Description

This removes the Node-only HTTP imports that cause browser bundling failures. httpTransport() returns the native Fetch Response and the handled body. Non-2xx responses, aborts and network failures reject with HTTPTransportError. The transport also accepts Fetch options, response handlers and abort signals.

See API_TRANSITION_GUIDE.md for the breaking changes and migration examples.

Depends on #656.

Signed-off-by: kahirokunn <okinakahiro@gmail.com>
Signed-off-by: kahirokunn <okinakahiro@gmail.com>
Use the platform HTTP client in Node.js and browsers without importing
Node-only http and https modules into the SDK's public entry point.
Preserve CloudEvent serialization, URL credentials and per-send headers,
and expose transport-wide headers and Fetch request options.

Keep the transport result inferred through emitterFor(). HTTP status codes
still resolve at this point; delivery failure handling is a separate change.

BREAKING CHANGE: httpTransport() resolves with { response, body }, where
response is the native Fetch Response, instead of { body, headers }.
Node.js global HTTP agents no longer configure these requests; a Fetch
dispatcher configures proxies, client certificates and custom trust.

Signed-off-by: kahirokunn <okinakahiro@gmail.com>
Reject responses that did not accept the event and distinguish HTTP status
failures from requests that never produced a response. Keep an unreadable
body after a successful status separate from a failed delivery, so a caller
does not resend an event the receiver has already accepted.

Allow transport-wide and per-send response handlers, preserving their body
types through emitterFor(). Include text and discard handlers and clean up
the body after a handler fails.

BREAKING CHANGE: non-2xx HTTP responses reject with HTTPTransportError.
Successful responses resolve with either body or bodyError. Options.headers
is checked by TypeScript, and built-in HTTP transport annotations use
HTTPTransportFunction and HTTPEmitterFunction.

Signed-off-by: kahirokunn <okinakahiro@gmail.com>
Combine transport-wide and per-send abort signals while fetching and
handling a response. Preserve the first abort reason, support signals from
another realm and detach subscriptions when the operation finishes.

Keep the shared signal implementation in its final module so emitter
wrappers can reuse it without moving transport code in a later feature.

BREAKING CHANGE: Options.signal is checked as an AbortSignal. A cancelled
HTTP request rejects with HTTPTransportError of kind aborted; a body
failure after a successful status remains a successful delivery result.

Signed-off-by: kahirokunn <okinakahiro@gmail.com>
@kahirokunn
kahirokunn marked this pull request as ready for review October 13, 2026 12:29

This branch has not been deployed

No deployments
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.

Can't resolve 'http' error when using on React app

1 participant