diff --git a/.changeset/web-crypto-isolate-bundlers.md b/.changeset/web-crypto-isolate-bundlers.md new file mode 100644 index 00000000..f66766cc --- /dev/null +++ b/.changeset/web-crypto-isolate-bundlers.md @@ -0,0 +1,5 @@ +--- +'livekit-server-sdk': patch +--- + +Remove `node:crypto` fallbacks from Web Crypto helpers so isolate/edge bundlers can import the SDK. diff --git a/packages/livekit-server-sdk/package.json b/packages/livekit-server-sdk/package.json index 48c3b0fe..c51ab714 100644 --- a/packages/livekit-server-sdk/package.json +++ b/packages/livekit-server-sdk/package.json @@ -62,6 +62,6 @@ "vitest": "^4.0.0" }, "engines": { - "node": ">=18" + "node": ">=19" } } diff --git a/packages/livekit-server-sdk/src/crypto/digest.ts b/packages/livekit-server-sdk/src/crypto/digest.ts index f4cc9547..1bf069bf 100644 --- a/packages/livekit-server-sdk/src/crypto/digest.ts +++ b/packages/livekit-server-sdk/src/crypto/digest.ts @@ -2,13 +2,11 @@ // // SPDX-License-Identifier: Apache-2.0 -// Use the Web Crypto API if available, otherwise fallback to Node.js crypto +// Web Crypto only — no import('node:crypto') so isolate/edge bundlers can resolve this module export async function digest(data: string): Promise { - if (globalThis.crypto?.subtle) { - const encoder = new TextEncoder(); - return crypto.subtle.digest('SHA-256', encoder.encode(data)); - } else { - const nodeCrypto = await import('node:crypto'); - return nodeCrypto.createHash('sha256').update(data).digest(); + if (!globalThis.crypto?.subtle) { + throw new Error('Web Crypto API is required (globalThis.crypto.subtle)'); } + const encoder = new TextEncoder(); + return crypto.subtle.digest('SHA-256', encoder.encode(data)); } diff --git a/packages/livekit-server-sdk/src/crypto/uuid.ts b/packages/livekit-server-sdk/src/crypto/uuid.ts index 9ff8abd4..2b31a4cb 100644 --- a/packages/livekit-server-sdk/src/crypto/uuid.ts +++ b/packages/livekit-server-sdk/src/crypto/uuid.ts @@ -2,12 +2,10 @@ // // SPDX-License-Identifier: Apache-2.0 -// Use the Web Crypto API if available, otherwise fallback to Node.js crypto +// Web Crypto only — no import('node:crypto') so isolate/edge bundlers can resolve this module export async function getRandomBytes(size: number = 16): Promise { - if (globalThis.crypto) { - return crypto.getRandomValues(new Uint8Array(size)); - } else { - const nodeCrypto = await import('node:crypto'); - return nodeCrypto.getRandomValues(new Uint8Array(size)); + if (!globalThis.crypto?.getRandomValues) { + throw new Error('Web Crypto API is required (globalThis.crypto.getRandomValues)'); } + return crypto.getRandomValues(new Uint8Array(size)); }