From 189c7dc922debc3f02fac2a5fe3b4529706be61b Mon Sep 17 00:00:00 2001 From: NitroRCr Date: Wed, 9 Apr 2025 14:50:35 +0800 Subject: [PATCH 1/2] feat(client/sse): allow custom `fetch` implementation --- src/client/sse.ts | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/client/sse.ts b/src/client/sse.ts index 5e9f0cf0..df04c39e 100644 --- a/src/client/sse.ts +++ b/src/client/sse.ts @@ -13,6 +13,8 @@ export class SseError extends Error { } } +type FetchLike = (url: string | URL, init?: RequestInit) => Promise; + /** * Configuration options for the `SSEClientTransport`. */ @@ -47,6 +49,11 @@ export type SSEClientTransportOptions = { * Customizes recurring POST requests to the server. */ requestInit?: RequestInit; + + /** + * Customizes the fetch implementation. + */ + fetch?: FetchLike; }; /** @@ -61,6 +68,7 @@ export class SSEClientTransport implements Transport { private _eventSourceInit?: EventSourceInit; private _requestInit?: RequestInit; private _authProvider?: OAuthClientProvider; + private _fetch: FetchLike; onclose?: () => void; onerror?: (error: Error) => void; @@ -74,6 +82,7 @@ export class SSEClientTransport implements Transport { this._eventSourceInit = opts?.eventSourceInit; this._requestInit = opts?.requestInit; this._authProvider = opts?.authProvider; + this._fetch = opts?.fetch ?? fetch; } private async _authThenStart(): Promise { @@ -113,7 +122,7 @@ export class SSEClientTransport implements Transport { this._eventSource = new EventSource( this._url.href, this._eventSourceInit ?? { - fetch: (url, init) => this._commonHeaders().then((headers) => fetch(url, { + fetch: (url, init) => this._commonHeaders().then((headers) => this._fetch(url, { ...init, headers: { ...headers, @@ -222,7 +231,7 @@ export class SSEClientTransport implements Transport { signal: this._abortController?.signal, }; - const response = await fetch(this._endpoint, init); + const response = await this._fetch(this._endpoint, init); if (!response.ok) { if (response.status === 401 && this._authProvider) { const result = await auth(this._authProvider, { serverUrl: this._url }); From dc172d752db0999d4777b3cef885ace6774da017 Mon Sep 17 00:00:00 2001 From: NitroRCr Date: Wed, 9 Apr 2025 15:26:21 +0800 Subject: [PATCH 2/2] fix to pass sse test --- src/client/sse.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/client/sse.ts b/src/client/sse.ts index df04c39e..f1b1bd38 100644 --- a/src/client/sse.ts +++ b/src/client/sse.ts @@ -68,7 +68,7 @@ export class SSEClientTransport implements Transport { private _eventSourceInit?: EventSourceInit; private _requestInit?: RequestInit; private _authProvider?: OAuthClientProvider; - private _fetch: FetchLike; + private _fetch?: FetchLike; onclose?: () => void; onerror?: (error: Error) => void; @@ -82,7 +82,7 @@ export class SSEClientTransport implements Transport { this._eventSourceInit = opts?.eventSourceInit; this._requestInit = opts?.requestInit; this._authProvider = opts?.authProvider; - this._fetch = opts?.fetch ?? fetch; + this._fetch = opts?.fetch; } private async _authThenStart(): Promise { @@ -122,7 +122,7 @@ export class SSEClientTransport implements Transport { this._eventSource = new EventSource( this._url.href, this._eventSourceInit ?? { - fetch: (url, init) => this._commonHeaders().then((headers) => this._fetch(url, { + fetch: (url, init) => this._commonHeaders().then((headers) => (this._fetch ?? fetch)(url, { ...init, headers: { ...headers, @@ -231,7 +231,7 @@ export class SSEClientTransport implements Transport { signal: this._abortController?.signal, }; - const response = await this._fetch(this._endpoint, init); + const response = await (this._fetch ?? fetch)(this._endpoint, init); if (!response.ok) { if (response.status === 401 && this._authProvider) { const result = await auth(this._authProvider, { serverUrl: this._url });