Skip to content

Commit 192561b

Browse files
authored
fix: browser detection (#8315)
Update browser detection logic: Detect either window or web worker (WorkerGlobalScope). This updates the implementation to `isBrowser()` and adds a new function `isWebWorker()`. Fixes #8299 #8284
1 parent ecadbe3 commit 192561b

File tree

4 files changed

+34
-3
lines changed

4 files changed

+34
-3
lines changed

.changeset/chilly-moons-play.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@firebase/util': patch
3+
---
4+
5+
fix: browser detection (detect either window or web worker)

.changeset/fifty-mayflies-hug.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@firebase/app': patch
3+
---
4+
5+
fix: server app should initialize in web workers

packages/app/src/api.ts

+7-2
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,12 @@ import {
4848
LogOptions,
4949
setUserLogHandler
5050
} from '@firebase/logger';
51-
import { deepEqual, getDefaultAppConfig, isBrowser } from '@firebase/util';
51+
import {
52+
deepEqual,
53+
getDefaultAppConfig,
54+
isBrowser,
55+
isWebWorker
56+
} from '@firebase/util';
5257

5358
export { FirebaseError } from '@firebase/util';
5459

@@ -230,7 +235,7 @@ export function initializeServerApp(
230235
_options: FirebaseOptions | FirebaseApp,
231236
_serverAppConfig: FirebaseServerAppSettings
232237
): FirebaseServerApp {
233-
if (isBrowser()) {
238+
if (isBrowser() && !isWebWorker()) {
234239
// FirebaseServerApp isn't designed to be run in browsers.
235240
throw ERROR_FACTORY.create(AppError.INVALID_SERVER_APP_ENVIRONMENT);
236241
}

packages/util/src/environment.ts

+17-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@
1818
import { CONSTANTS } from './constants';
1919
import { getDefaults } from './defaults';
2020

21+
/**
22+
* Type placeholder for `WorkerGlobalScope` from `webworker`
23+
*/
24+
declare class WorkerGlobalScope {}
25+
2126
/**
2227
* Returns navigator.userAgent string or '' if it's not defined.
2328
* @return user agent string
@@ -77,7 +82,18 @@ export function isNode(): boolean {
7782
* Detect Browser Environment
7883
*/
7984
export function isBrowser(): boolean {
80-
return typeof self === 'object' && self.self === self;
85+
return typeof window !== 'undefined' || isWebWorker();
86+
}
87+
88+
/**
89+
* Detect Web Worker context
90+
*/
91+
export function isWebWorker(): boolean {
92+
return (
93+
typeof WorkerGlobalScope !== 'undefined' &&
94+
typeof self !== 'undefined' &&
95+
self instanceof WorkerGlobalScope
96+
);
8197
}
8298

8399
/**

0 commit comments

Comments
 (0)