diff --git a/.changeset/chilly-moons-play.md b/.changeset/chilly-moons-play.md new file mode 100644 index 00000000000..1d1db3c15c6 --- /dev/null +++ b/.changeset/chilly-moons-play.md @@ -0,0 +1,5 @@ +--- +'@firebase/util': patch +--- + +fix: browser detection (detect either window or web worker) diff --git a/.changeset/fifty-mayflies-hug.md b/.changeset/fifty-mayflies-hug.md new file mode 100644 index 00000000000..ad1970ce863 --- /dev/null +++ b/.changeset/fifty-mayflies-hug.md @@ -0,0 +1,5 @@ +--- +'@firebase/app': patch +--- + +fix: server app should initialize in web workers diff --git a/packages/app/src/api.ts b/packages/app/src/api.ts index 5928fd737a8..b8ec25fc509 100644 --- a/packages/app/src/api.ts +++ b/packages/app/src/api.ts @@ -48,7 +48,12 @@ import { LogOptions, setUserLogHandler } from '@firebase/logger'; -import { deepEqual, getDefaultAppConfig, isBrowser } from '@firebase/util'; +import { + deepEqual, + getDefaultAppConfig, + isBrowser, + isWebWorker +} from '@firebase/util'; export { FirebaseError } from '@firebase/util'; @@ -230,7 +235,7 @@ export function initializeServerApp( _options: FirebaseOptions | FirebaseApp, _serverAppConfig: FirebaseServerAppSettings ): FirebaseServerApp { - if (isBrowser()) { + if (isBrowser() && !isWebWorker()) { // FirebaseServerApp isn't designed to be run in browsers. throw ERROR_FACTORY.create(AppError.INVALID_SERVER_APP_ENVIRONMENT); } diff --git a/packages/util/src/environment.ts b/packages/util/src/environment.ts index f2afaede0f1..30fc661bfc6 100644 --- a/packages/util/src/environment.ts +++ b/packages/util/src/environment.ts @@ -18,6 +18,11 @@ import { CONSTANTS } from './constants'; import { getDefaults } from './defaults'; +/** + * Type placeholder for `WorkerGlobalScope` from `webworker` + */ +declare class WorkerGlobalScope {} + /** * Returns navigator.userAgent string or '' if it's not defined. * @return user agent string @@ -77,7 +82,18 @@ export function isNode(): boolean { * Detect Browser Environment */ export function isBrowser(): boolean { - return typeof self === 'object' && self.self === self; + return typeof window !== 'undefined' || isWebWorker(); +} + +/** + * Detect Web Worker context + */ +export function isWebWorker(): boolean { + return ( + typeof WorkerGlobalScope !== 'undefined' && + typeof self !== 'undefined' && + self instanceof WorkerGlobalScope + ); } /**