From 36aceddb14a6f50c765d085cf685f12c322bce4b Mon Sep 17 00:00:00 2001 From: Luke Melia Date: Mon, 17 Aug 2026 15:37:33 -0400 Subject: [PATCH 1/2] Allow Range through realm-server CORS and expose range response headers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Native audio/video elements cannot attach Authorization, so on protected realms the host's auth service worker re-issues media requests as mode:'cors' with the token injected. That rewrite turns the media element's Range header into an author header needing preflight approval, and the realm server's Access-Control-Allow-Headers did not include Range — the preflight failed and the native player errored before any bytes flowed. Range and If-Range join the CORS allow list, and Content-Range / Accept-Ranges / Content-Length join both expose lists — the @koa/cors exposeHeaders and the createResponse Access-Control-Expose-Headers, since the latter replaces rather than merges with the former on any response a realm handler produces. Co-Authored-By: Claude Fable 5 --- packages/realm-server/server.ts | 15 ++- .../realm-server/tests/cors-range-test.ts | 91 +++++++++++++++++++ packages/runtime-common/create-response.ts | 5 +- 3 files changed, 108 insertions(+), 3 deletions(-) create mode 100644 packages/realm-server/tests/cors-range-test.ts diff --git a/packages/realm-server/server.ts b/packages/realm-server/server.ts index c3cff5cff36..9f423041ade 100644 --- a/packages/realm-server/server.ts +++ b/packages/realm-server/server.ts @@ -1109,8 +1109,15 @@ export class RealmServer { .use( cors({ origin: '*', + // Range/If-Range are here for native media playback: