summaryrefslogtreecommitdiff
path: root/shared/logger/node_modules/@sentry/utils/esm/supports.js
diff options
context:
space:
mode:
authorrxliuli <rxliuli@gmail.com>2025-11-04 05:03:50 +0800
committerrxliuli <rxliuli@gmail.com>2025-11-04 05:03:50 +0800
commitbce557cc2dc767628bed6aac87301a1be7c5431b (patch)
treeb51a051228d01fe3306cd7626d4a96768aadb944 /shared/logger/node_modules/@sentry/utils/esm/supports.js
init commit
Diffstat (limited to 'shared/logger/node_modules/@sentry/utils/esm/supports.js')
-rw-r--r--shared/logger/node_modules/@sentry/utils/esm/supports.js161
1 files changed, 161 insertions, 0 deletions
diff --git a/shared/logger/node_modules/@sentry/utils/esm/supports.js b/shared/logger/node_modules/@sentry/utils/esm/supports.js
new file mode 100644
index 0000000..7a560a3
--- /dev/null
+++ b/shared/logger/node_modules/@sentry/utils/esm/supports.js
@@ -0,0 +1,161 @@
+import { logger } from './logger.js';
+import { getGlobalObject } from './worldwide.js';
+
+// eslint-disable-next-line deprecation/deprecation
+const WINDOW = getGlobalObject();
+
+/**
+ * Tells whether current environment supports ErrorEvent objects
+ * {@link supportsErrorEvent}.
+ *
+ * @returns Answer to the given question.
+ */
+function supportsErrorEvent() {
+ try {
+ new ErrorEvent('');
+ return true;
+ } catch (e) {
+ return false;
+ }
+}
+
+/**
+ * Tells whether current environment supports DOMError objects
+ * {@link supportsDOMError}.
+ *
+ * @returns Answer to the given question.
+ */
+function supportsDOMError() {
+ try {
+ // Chrome: VM89:1 Uncaught TypeError: Failed to construct 'DOMError':
+ // 1 argument required, but only 0 present.
+ // @ts-ignore It really needs 1 argument, not 0.
+ new DOMError('');
+ return true;
+ } catch (e) {
+ return false;
+ }
+}
+
+/**
+ * Tells whether current environment supports DOMException objects
+ * {@link supportsDOMException}.
+ *
+ * @returns Answer to the given question.
+ */
+function supportsDOMException() {
+ try {
+ new DOMException('');
+ return true;
+ } catch (e) {
+ return false;
+ }
+}
+
+/**
+ * Tells whether current environment supports Fetch API
+ * {@link supportsFetch}.
+ *
+ * @returns Answer to the given question.
+ */
+function supportsFetch() {
+ if (!('fetch' in WINDOW)) {
+ return false;
+ }
+
+ try {
+ new Headers();
+ new Request('http://www.example.com');
+ new Response();
+ return true;
+ } catch (e) {
+ return false;
+ }
+}
+/**
+ * isNativeFetch checks if the given function is a native implementation of fetch()
+ */
+// eslint-disable-next-line @typescript-eslint/ban-types
+function isNativeFetch(func) {
+ return func && /^function fetch\(\)\s+\{\s+\[native code\]\s+\}$/.test(func.toString());
+}
+
+/**
+ * Tells whether current environment supports Fetch API natively
+ * {@link supportsNativeFetch}.
+ *
+ * @returns true if `window.fetch` is natively implemented, false otherwise
+ */
+function supportsNativeFetch() {
+ if (!supportsFetch()) {
+ return false;
+ }
+
+ // Fast path to avoid DOM I/O
+ // eslint-disable-next-line @typescript-eslint/unbound-method
+ if (isNativeFetch(WINDOW.fetch)) {
+ return true;
+ }
+
+ // window.fetch is implemented, but is polyfilled or already wrapped (e.g: by a chrome extension)
+ // so create a "pure" iframe to see if that has native fetch
+ let result = false;
+ const doc = WINDOW.document;
+ // eslint-disable-next-line deprecation/deprecation
+ if (doc && typeof (doc.createElement ) === 'function') {
+ try {
+ const sandbox = doc.createElement('iframe');
+ sandbox.hidden = true;
+ doc.head.appendChild(sandbox);
+ if (sandbox.contentWindow && sandbox.contentWindow.fetch) {
+ // eslint-disable-next-line @typescript-eslint/unbound-method
+ result = isNativeFetch(sandbox.contentWindow.fetch);
+ }
+ doc.head.removeChild(sandbox);
+ } catch (err) {
+ (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) &&
+ logger.warn('Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ', err);
+ }
+ }
+
+ return result;
+}
+
+/**
+ * Tells whether current environment supports ReportingObserver API
+ * {@link supportsReportingObserver}.
+ *
+ * @returns Answer to the given question.
+ */
+function supportsReportingObserver() {
+ return 'ReportingObserver' in WINDOW;
+}
+
+/**
+ * Tells whether current environment supports Referrer Policy API
+ * {@link supportsReferrerPolicy}.
+ *
+ * @returns Answer to the given question.
+ */
+function supportsReferrerPolicy() {
+ // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default'
+ // (see https://caniuse.com/#feat=referrer-policy),
+ // it doesn't. And it throws an exception instead of ignoring this parameter...
+ // REF: https://github.com/getsentry/raven-js/issues/1233
+
+ if (!supportsFetch()) {
+ return false;
+ }
+
+ try {
+ new Request('_', {
+ referrerPolicy: 'origin' ,
+ });
+ return true;
+ } catch (e) {
+ return false;
+ }
+}
+
+export { isNativeFetch, supportsDOMError, supportsDOMException, supportsErrorEvent, supportsFetch, supportsNativeFetch, supportsReferrerPolicy, supportsReportingObserver };
+//# sourceMappingURL=supports.js.map