Skip to content

Commit 013e074

Browse files
committed
polyfill getGlobalObject
1 parent 143dcaf commit 013e074

File tree

2 files changed

+41
-21
lines changed

2 files changed

+41
-21
lines changed

packages/core/src/tools/getGlobalObject.ts

Lines changed: 33 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,26 +6,39 @@ export function getGlobalObject<T = typeof globalThis>(): T {
66
if (typeof globalThis === 'object') {
77
return globalThis as unknown as T
88
}
9-
Object.defineProperty(Object.prototype, '_dd_temp_', {
10-
get() {
11-
return this as object
12-
},
13-
configurable: true,
14-
})
15-
// @ts-ignore _dd_temp is defined using defineProperty
16-
let globalObject: unknown = _dd_temp_
17-
// @ts-ignore _dd_temp is defined using defineProperty
18-
delete Object.prototype._dd_temp_
19-
if (typeof globalObject !== 'object') {
20-
// on safari _dd_temp_ is available on window but not globally
21-
// fallback on other browser globals check
22-
if (typeof self === 'object') {
23-
globalObject = self
24-
} else if (typeof window === 'object') {
25-
globalObject = window
26-
} else {
27-
globalObject = {}
9+
10+
// Polyfill globalThis if it doesn't exist
11+
if (typeof globalThis === 'undefined') {
12+
Object.defineProperty(Object.prototype, '_dd_temp_', {
13+
get() {
14+
return this as object
15+
},
16+
configurable: true,
17+
})
18+
// @ts-ignore _dd_temp is defined using defineProperty
19+
let globalObject: unknown = _dd_temp_
20+
// @ts-ignore _dd_temp is defined using defineProperty
21+
delete Object.prototype._dd_temp_
22+
if (typeof globalObject !== 'object') {
23+
// on safari _dd_temp_ is available on window but not globally
24+
// fallback on other browser globals check
25+
if (typeof self === 'object') {
26+
globalObject = self
27+
} else if (typeof window === 'object') {
28+
globalObject = window
29+
} else {
30+
globalObject = {}
31+
}
2832
}
33+
34+
// Define globalThis if it doesn't exist
35+
Object.defineProperty(globalObject as object, 'globalThis', {
36+
value: globalObject,
37+
writable: true,
38+
enumerable: false,
39+
configurable: true,
40+
})
2941
}
30-
return globalObject as T
42+
43+
return globalThis as unknown as T
3144
}

packages/flagging/src/entries/main.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
11
import { defineGlobal, getGlobalObject } from '@datadog/browser-core'
22

3+
// Apply globalThis polyfill before importing OpenFeature
4+
// The OpenFeature web SDK uses globalThis which is not available in older browsers (like Chrome 63).
5+
// Our getGlobalObject() utility provides a polyfill that makes globalThis available by using
6+
// fallbacks like window or self. We need to call it before importing OpenFeature to ensure
7+
// the polyfill is in place when OpenFeature tries to use globalThis.
8+
getGlobalObject()
9+
310
import { DatadogProvider } from '../openfeature/provider'
411

5-
export { DatadogProvider }
612
export { configurationFromString, configurationToString } from '../configuration'
13+
export { DatadogProvider }
714

815
interface BrowserWindow extends Window {
916
DD_FLAGGING?: {

0 commit comments

Comments
 (0)