diff --git a/src/jrpc/postMessageStream.ts b/src/jrpc/postMessageStream.ts index 66de21c5..ba675338 100644 --- a/src/jrpc/postMessageStream.ts +++ b/src/jrpc/postMessageStream.ts @@ -4,10 +4,13 @@ import { cloneDeep } from "../utils"; import { BasePostMessageStream, isValidStreamMessage, type PostMessageEvent } from "./basePostMessageStream"; /* istanbul ignore next */ -const getSource = Object.getOwnPropertyDescriptor(MessageEvent.prototype, "source")?.get; +const messageEventPrototype = typeof MessageEvent === "undefined" ? undefined : MessageEvent.prototype; /* istanbul ignore next */ -const getOrigin = Object.getOwnPropertyDescriptor(MessageEvent.prototype, "origin")?.get; +const getSource = messageEventPrototype ? Object.getOwnPropertyDescriptor(messageEventPrototype, "source")?.get : undefined; + +/* istanbul ignore next */ +const getOrigin = messageEventPrototype ? Object.getOwnPropertyDescriptor(messageEventPrototype, "origin")?.get : undefined; export interface PostMessageStreamArgs extends DuplexOptions { name: string; diff --git a/test/postMessageStream.test.ts b/test/postMessageStream.test.ts index 5e133d68..6af0f5b4 100644 --- a/test/postMessageStream.test.ts +++ b/test/postMessageStream.test.ts @@ -72,4 +72,12 @@ describe("PostMessageStream", () => { expect(message.target).toBe("auth"); expect(message.data.data.params[0]._origin).toBe("https://current.example"); }); + + it("can be imported when MessageEvent is undefined", async () => { + vi.unstubAllGlobals(); + // Simulate Hermes/React Native where MessageEvent is absent. + Reflect.deleteProperty(globalThis, "MessageEvent"); + + await expect(import("../src/jrpc")).resolves.toHaveProperty("PostMessageStream"); + }); });