Skip to content

Commit 3ab8bc0

Browse files
committed
Add additional environment checks
1 parent 9cc2187 commit 3ab8bc0

File tree

1 file changed

+32
-11
lines changed

1 file changed

+32
-11
lines changed

packages/ai/src/ws/websocket-handler.ts

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -83,25 +83,46 @@ export interface WebSocketHandler {
8383
* @internal
8484
*/
8585
export function createWebSocketHandler(): WebSocketHandler {
86-
// `isNode()` is replaced with a static boolean during build time to enable tree shaking
86+
// `isNode()` is replaced with a static boolean during build time so this block will be
87+
// tree-shaken in browser builds.
8788
if (isNode()) {
88-
const [major] = process.versions.node.split('.').map(Number);
89-
if (major < 22) {
89+
// At this point we're certain we're in a Node bundle, but we still need to have checks
90+
// to be certain we're in a Node environment, and not something like Deno, Bun, or Edge workers.
91+
if (typeof process === 'object' && process.versions?.node) {
92+
const [major] = process.versions.node.split('.').map(Number);
93+
if (major < 22) {
94+
throw new AIError(
95+
AIErrorCode.UNSUPPORTED,
96+
`The "Live" feature is being used in a Node environment, but the ` +
97+
`runtime version is ${process.versions.node}. This feature requires Node.js ` +
98+
`version 22 or higher for native WebSocket support.`
99+
);
100+
}
101+
return new NodeWebSocketHandler();
102+
}
103+
}
104+
105+
// `isBrowser()` is replaced with a static boolean during build time so this block will be
106+
// tree-shaken in Node builds.
107+
if (isBrowser()) {
108+
// At this point we're certain we're in a browser build, but we still need to check for the
109+
// existence of the `WebSocket` API. This check would fail in environments that use a browser
110+
// bundle, but don't support WebSockets (Web workers and SSR).
111+
if (typeof WebSocket !== 'undefined') {
112+
return new BrowserWebSocketHandler();
113+
} else {
90114
throw new AIError(
91115
AIErrorCode.UNSUPPORTED,
92-
'The Live feature requires Node version 22 or higher for native WebSocket support.'
116+
'The WebSocket API is not available in this browser-like environment. ' +
117+
'The Firebase AI "Live" feature is not supported here. It is supported in ' +
118+
'standard browser windows, Web Workers with WebSocket support, and Node >= 22.'
93119
);
94120
}
95-
return new NodeWebSocketHandler();
96-
}
97-
98-
// `isBrowser()` is replaced with a static boolean during build time to enable tree shaking
99-
if (isBrowser() && window.WebSocket) {
100-
return new BrowserWebSocketHandler();
101121
}
102122

103123
throw new AIError(
104124
AIErrorCode.UNSUPPORTED,
105-
'A WebSocket API is not available in this environment.'
125+
'This environment is not supported by the "Live" feature. ' +
126+
'Supported environments are modern web browsers and Node >= 22.'
106127
);
107128
}

0 commit comments

Comments
 (0)