diff --git a/packages/experimental/liveshare-protocol/src/viewer-carrier.ts b/packages/experimental/liveshare-protocol/src/viewer-carrier.ts index fd4caeaa05..d1e43cde10 100644 --- a/packages/experimental/liveshare-protocol/src/viewer-carrier.ts +++ b/packages/experimental/liveshare-protocol/src/viewer-carrier.ts @@ -179,7 +179,7 @@ export function installViewerCarrier(options: ViewerCarrierOptions): void { pathname = undefined } const path = pathname === undefined ? undefined : forwardedRoute(pathname, method) - return path === undefined ? await pageFetch(input, init) : await forwardRoute(path, init) + return path === undefined ? await pageFetch.call(globalThis, input, init) : await forwardRoute(path, init) } globalThis.fetch = carrierFetch diff --git a/packages/experimental/liveshare-protocol/tests/viewer-carrier.client.spec.ts b/packages/experimental/liveshare-protocol/tests/viewer-carrier.client.spec.ts index 973652e4d0..04a39d3077 100644 --- a/packages/experimental/liveshare-protocol/tests/viewer-carrier.client.spec.ts +++ b/packages/experimental/liveshare-protocol/tests/viewer-carrier.client.spec.ts @@ -547,6 +547,18 @@ describe('viewer carrier forwarded page routes', () => { expect(direct).toHaveBeenCalledExactlyOnceWith('health', undefined) }) + it('keeps the receiver of the page fetch it replaced', async () => { + const receivers: unknown[] = [] + const direct = vi.fn(function (this: unknown, input: unknown) { + receivers.push(this) + return Promise.resolve(new Response(`direct:${String(input)}`)) + }) + vi.stubGlobal('fetch', direct) + installViewerCarrier(OPTIONS) + await globalThis.fetch('health') + expect(receivers).toEqual([globalThis]) + }) + it('does not forward a route that acts on the owner\u2019s machine', async () => { const direct = directFetch() expect(await (await globalThis.fetch('open-in-app/open', { method: 'POST', body: '{"app":"finder"}' })).text())