diff --git a/LICENSE-3rdparty.csv b/LICENSE-3rdparty.csv index 8af282d6f5..891c1e071b 100644 --- a/LICENSE-3rdparty.csv +++ b/LICENSE-3rdparty.csv @@ -10,6 +10,10 @@ prod,@tabler/icons-react,MIT,Copyright (c) 2020-2023 Paweł Kuna prod,clsx,MIT,Copyright (c) Luke Edwards (lukeed.com) prod,react,MIT,Copyright (c) Facebook, Inc. and its affiliates. prod,react-dom,MIT,Copyright (c) Facebook, Inc. and its affiliates. +prod,@msgpack/msgpack,Apache-2.0,Copyright (c) 2010 Peter Griess +prod,dd-trace,Apache-2.0,Copyright (c) 2018, Datadog Inc. +prod,graphql,MIT,Copyright (c) GraphQL Contributors +prod,@openfeature/core,Apache-2.0,Copyright OpenFeature Maintainers dev,typedoc,Apache-2.0,TypeStrong dev,@eslint/js,MIT,Copyright OpenJS Foundation and other contributors, dev,@jsdevtools/coverage-istanbul-loader,MIT,Copyright (c) 2015 James Messinger @@ -84,3 +88,4 @@ dev,react-refresh-typescript,MIT,Copyright (c) Piotr Monwid-Olechnowicz dev,webpack-dev-server,MIT,Copyright JS Foundation and other contributors dev,http-server,MIT,Copyright http-party contributors dev,react-router,MIT,Copyright (c) React Training LLC 2015-2019 Copyright (c) Remix Software Inc. 2020-2021 Copyright (c) Shopify Inc. 2022-2023 +dev,electron,MIT,Copyright (c) Electron contributors Copyright (c) 2013-2020 GitHub Inc. diff --git a/developer-extension/src/panel/hooks/useEvents/useEvents.ts b/developer-extension/src/panel/hooks/useEvents/useEvents.ts index b54d048414..89ccbec762 100644 --- a/developer-extension/src/panel/hooks/useEvents/useEvents.ts +++ b/developer-extension/src/panel/hooks/useEvents/useEvents.ts @@ -31,7 +31,7 @@ export function useEvents({ }, [eventCollectionStrategy]) useEffect(() => { - if (!preserveEvents) { + if (!preserveEvents && 'webNavigation' in chrome) { const clearCurrentEvents = (details: chrome.webNavigation.WebNavigationTransitionCallbackDetails) => { if (details.transitionType === 'reload' && details.tabId === chrome.devtools.inspectedWindow.tabId) { clearEvents() diff --git a/eslint-local-rules/disallowSideEffects.js b/eslint-local-rules/disallowSideEffects.js index d7bfb91f1f..1d7f73006d 100644 --- a/eslint-local-rules/disallowSideEffects.js +++ b/eslint-local-rules/disallowSideEffects.js @@ -38,6 +38,7 @@ const packagesWithoutSideEffect = new Set([ '@datadog/browser-rum-core', 'react', 'react-router-dom', + 'electron', ]) /** diff --git a/eslint-local-rules/enforceProdDepsImports.js b/eslint-local-rules/enforceProdDepsImports.js index 42ca104bef..a475b1e202 100644 --- a/eslint-local-rules/enforceProdDepsImports.js +++ b/eslint-local-rules/enforceProdDepsImports.js @@ -38,7 +38,7 @@ export default { return moduleVisitor((source) => { const importTypeResult = importType(source.value, context) // Use an allow list instead of a deny list to make the rule more future-proof. - if (importTypeResult === 'parent' || importTypeResult === 'sibling') { + if (importTypeResult === 'parent' || importTypeResult === 'sibling' || importTypeResult === 'builtin') { return } diff --git a/eslint.config.mjs b/eslint.config.mjs index 770a09726b..e33e1beb78 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -418,6 +418,18 @@ export default tseslint.config( }, }, + { + files: ['packages/electron/src/**/*.ts'], + ignores: [SPEC_FILES], + rules: { + // TODO: verify this is safe + 'local-rules/disallow-side-effects': 'off', + + // TODO: remove before merging this to main: quick dev only + 'no-console': 'off', + }, + }, + { // Files executed by nodejs files: [ diff --git a/package.json b/package.json index 29db63d320..25ec764423 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "scripts": { "postinstall": "scripts/cli init_submodule", "build": "yarn workspaces foreach --all --parallel --topological run build", + "build:electron": "lerna run build:modules --scope=@datadog/electron", "build:bundle": "yarn workspaces foreach --all --parallel run build:bundle", "build:apps": "node scripts/build/build-test-apps.ts", "build:docs:json": "typedoc --logLevel Verbose --json ./docs.json", diff --git a/packages/core/package.json b/packages/core/package.json index 4b02061449..3648a1c3c5 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -7,6 +7,7 @@ "types": "cjs/index.d.ts", "sideEffects": false, "scripts": { + "pack": "yarn pack", "build": "node ../../scripts/build/build-package.ts --modules" }, "repository": { diff --git a/packages/core/src/browser/cookie.ts b/packages/core/src/browser/cookie.ts index bab3f49e93..3e47802fbf 100644 --- a/packages/core/src/browser/cookie.ts +++ b/packages/core/src/browser/cookie.ts @@ -7,6 +7,7 @@ import { generateUUID, } from '../tools/utils/stringUtils' import { buildUrl } from '../tools/utils/urlPolyfill' +import { getGlobalObject } from '../tools/globalObject' export interface CookieOptions { secure?: boolean @@ -65,7 +66,7 @@ export function deleteCookie(name: string, options?: CookieOptions) { } export function areCookiesAuthorized(options: CookieOptions): boolean { - if (document.cookie === undefined || document.cookie === null) { + if (getGlobalObject().document?.cookie === undefined || getGlobalObject().document?.cookie === null) { return false } try { diff --git a/packages/core/src/domain/resourceUtils.ts b/packages/core/src/domain/resourceUtils.ts index f5849134c0..34528a7e06 100644 --- a/packages/core/src/domain/resourceUtils.ts +++ b/packages/core/src/domain/resourceUtils.ts @@ -9,6 +9,7 @@ export const ResourceType = { FONT: 'font', MEDIA: 'media', OTHER: 'other', + NATIVE: 'native', } as const export type ResourceType = (typeof ResourceType)[keyof typeof ResourceType] diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index afe4af85c9..f9abd115b9 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,4 +1,4 @@ -export type { Configuration, InitConfiguration, EndpointBuilder, ProxyFn } from './domain/configuration' +export type { Configuration, InitConfiguration, EndpointBuilder, ProxyFn, TrackType } from './domain/configuration' export { validateAndBuildConfiguration, DefaultPrivacyLevel, @@ -7,6 +7,7 @@ export { isSampleRate, buildEndpointHost, isIntakeUrl, + createEndpointBuilder, } from './domain/configuration' export * from './domain/intakeSites' export type { TrackingConsentState } from './domain/trackingConsent' @@ -59,7 +60,17 @@ export { SESSION_NOT_TRACKED, SessionPersistence, } from './domain/session/sessionConstants' -export type { BandwidthStats, HttpRequest, HttpRequestEvent, Payload, FlushEvent, FlushReason } from './transport' +export type { + BandwidthStats, + HttpRequest, + HttpRequestEvent, + Payload, + FlushEvent, + FlushReason, + DatadogEventBridge, + BrowserWindowWithEventBridge, + Batch, +} from './transport' export { createHttpRequest, canUseEventBridge, diff --git a/packages/core/src/tools/utils/byteUtils.ts b/packages/core/src/tools/utils/byteUtils.ts index ed8071f858..57935566be 100644 --- a/packages/core/src/tools/utils/byteUtils.ts +++ b/packages/core/src/tools/utils/byteUtils.ts @@ -1,3 +1,5 @@ +import { globalObject } from '../globalObject' + export const ONE_KIBI_BYTE = 1024 export const ONE_MEBI_BYTE = 1024 * ONE_KIBI_BYTE @@ -16,8 +18,8 @@ export function computeBytesCount(candidate: string): number { return candidate.length } - if (window.TextEncoder !== undefined) { - return new TextEncoder().encode(candidate).length + if ('TextEncoder' in globalObject) { + return new (globalObject as { TextEncoder: typeof TextEncoder }).TextEncoder().encode(candidate).length } return new Blob([candidate]).size diff --git a/packages/core/src/transport/index.ts b/packages/core/src/transport/index.ts index ce6307356c..bf12615aa9 100644 --- a/packages/core/src/transport/index.ts +++ b/packages/core/src/transport/index.ts @@ -2,6 +2,7 @@ export type { BandwidthStats, HttpRequest, HttpRequestEvent, Payload, RetryInfo export { createHttpRequest } from './httpRequest' export type { BrowserWindowWithEventBridge, DatadogEventBridge } from './eventBridge' export { canUseEventBridge, bridgeSupports, getEventBridge, BridgeCapability } from './eventBridge' +export type { Batch } from './batch' export { createBatch } from './batch' export type { FlushController, FlushEvent, FlushReason } from './flushController' export { createFlushController, FLUSH_DURATION_LIMIT } from './flushController' diff --git a/packages/electron/.npmignore b/packages/electron/.npmignore new file mode 100644 index 0000000000..254b105e43 --- /dev/null +++ b/packages/electron/.npmignore @@ -0,0 +1,9 @@ +* +!/bundle/**/*.js +!/cjs/**/* +!/esm/**/* +!/src/**/* +/src/**/*.spec.ts +/src/**/*.specHelper.ts +!/internal/* +!/internal-synthetics/* diff --git a/packages/electron/.yarnrc b/packages/electron/.yarnrc new file mode 100644 index 0000000000..db15371515 --- /dev/null +++ b/packages/electron/.yarnrc @@ -0,0 +1,2 @@ +save-exact true + diff --git a/packages/electron/package.json b/packages/electron/package.json new file mode 100644 index 0000000000..4c9b9f819d --- /dev/null +++ b/packages/electron/package.json @@ -0,0 +1,47 @@ +{ + "name": "@datadog/electron", + "version": "6.23.0", + "license": "Apache-2.0", + "main": "cjs/entries/main.js", + "module": "esm/entries/main.js", + "types": "cjs/entries/main.d.ts", + "scripts": { + "pack": "yarn pack", + "build": "node ../../scripts/build/build-package.ts --modules --bundle datadog-electron.js", + "build:modules": "node ../../scripts/build/build-package.ts --modules", + "build:bundle": "node ../../scripts/build/build-package.ts --bundle datadog-electron.js" + }, + "dependencies": { + "@datadog/browser-core": "6.24.0", + "@datadog/browser-rum-core": "6.24.0", + "@msgpack/msgpack": "3.1.2", + "@openfeature/core": "1.9.1", + "dd-trace": "^5.76.0", + "graphql": "16.12.0" + }, + "peerDependencies": { + "@datadog/browser-logs": "6.24.0", + "electron": "39" + }, + "peerDependenciesMeta": { + "@datadog/browser-logs": { + "optional": true + } + }, + "repository": { + "type": "git", + "url": "https://github.com/DataDog/browser-sdk.git", + "directory": "packages/electron" + }, + "devDependencies": { + "@types/pako": "2.0.4", + "electron": "39", + "pako": "2.1.0" + }, + "volta": { + "extends": "../../package.json" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/packages/electron/plugin/package.json b/packages/electron/plugin/package.json new file mode 100644 index 0000000000..1033253946 --- /dev/null +++ b/packages/electron/plugin/package.json @@ -0,0 +1,6 @@ +{ + "private": true, + "main": "../cjs/entries/plugin.js", + "module": "../esm/entries/plugin.js", + "types": "../cjs/entries/plugin.d.ts" +} diff --git a/packages/electron/renderer/package.json b/packages/electron/renderer/package.json new file mode 100644 index 0000000000..ade81e8b79 --- /dev/null +++ b/packages/electron/renderer/package.json @@ -0,0 +1,6 @@ +{ + "private": true, + "main": "../cjs/entries/renderer.js", + "module": "../esm/entries/renderer.js", + "types": "../cjs/entries/renderer.d.ts" +} diff --git a/packages/electron/src/domain/main/bridge.ts b/packages/electron/src/domain/main/bridge.ts new file mode 100644 index 0000000000..95d775c585 --- /dev/null +++ b/packages/electron/src/domain/main/bridge.ts @@ -0,0 +1,24 @@ +import type { Observable } from '@datadog/browser-core' +import type { RumEvent } from '@datadog/browser-rum-core' +import { ipcMain } from 'electron' +import type { CollectedRumEvent } from '../rum/events' + +interface BridgeEvent { + eventType: 'rum' + event: RumEvent & { session: { id: string } } & { application: { id: string } } +} + +export function setupMainBridge(rumEventObservable: Observable) { + ipcMain.handle('datadog:send', (_event, msg: string) => { + const serverRumEvent = JSON.parse(msg) as BridgeEvent + + if (serverRumEvent.eventType !== 'rum') { + // TODO: handle other types of events (telemetry, session replays, Logs, ....) + console.log('not a rum event', serverRumEvent) + + return + } + + rumEventObservable.notify({ event: serverRumEvent.event, source: 'renderer' }) + }) +} diff --git a/packages/electron/src/domain/main/ipcMain.ts b/packages/electron/src/domain/main/ipcMain.ts new file mode 100644 index 0000000000..7341ad19e5 --- /dev/null +++ b/packages/electron/src/domain/main/ipcMain.ts @@ -0,0 +1,47 @@ +import type { IpcMain } from 'electron' +import { ipcMain } from 'electron' +import tracer from '../trace/tracer' +import type { DatadogCarrier } from '../trace/trace' + +const SPAN_NAME_PREFIX = 'ipcMain' + +const isDatadogCarrier = (arg: any): arg is DatadogCarrier => typeof arg === 'object' && arg?.__dd_carrier === true + +export function createIpcMain(): IpcMain { + const ddIpcMain = { ...ipcMain } + + ddIpcMain.on = withDatadogCarrier('on', ipcMain.on.bind(ipcMain)) + ddIpcMain.off = withDatadogCarrier('off', ipcMain.off.bind(ipcMain)) + ddIpcMain.once = withDatadogCarrier('once', ipcMain.once.bind(ipcMain)) + ddIpcMain.addListener = withDatadogCarrier('addListener', ipcMain.addListener.bind(ipcMain)) + ddIpcMain.removeListener = withDatadogCarrier('removeListener', ipcMain.removeListener.bind(ipcMain)) + ddIpcMain.handle = withDatadogCarrier('handle', ipcMain.handle.bind(ipcMain)) + ddIpcMain.handleOnce = withDatadogCarrier('handleOnce', ipcMain.handleOnce.bind(ipcMain)) + + ddIpcMain.removeAllListeners = ipcMain.removeAllListeners.bind(ipcMain) + ddIpcMain.removeHandler = ipcMain.removeHandler.bind(ipcMain) + + return ddIpcMain +} + +function withDatadogCarrier R, R>(name: string, fn: T): (...args: Parameters) => R { + return (...args: Parameters) => { + const channel = args[0] + const listener = args[1] as (...args: any[]) => R + const spanName = `${SPAN_NAME_PREFIX}.${name}.${channel}` + + return fn(channel, (...args: Parameters) => { + const lastArg = args[args.length - 1] + if (isDatadogCarrier(lastArg)) { + const parentContext = tracer.extract('text_map', lastArg) + args.pop() // remove the carrier from the args + + if (parentContext) { + return tracer.trace(spanName, { childOf: parentContext }, () => listener(...args)) + } + } + + return tracer.trace(spanName, () => listener(...args)) + }) + } +} diff --git a/packages/electron/src/domain/plugin/plugin.ts b/packages/electron/src/domain/plugin/plugin.ts new file mode 100644 index 0000000000..fb999055f0 --- /dev/null +++ b/packages/electron/src/domain/plugin/plugin.ts @@ -0,0 +1,130 @@ +import { generateUUID } from '@datadog/browser-core' +import type { RumPlugin, RumPublicApi, StartRumResult, RawRumResourceEvent } from '@datadog/browser-rum-core' +import type { SpanInfo } from '../trace/trace' + +let globalPublicApi: RumPublicApi | undefined +let globalConfiguration: ElectronPluginConfiguration | undefined +let globalAddEvent: StartRumResult['addEvent'] | undefined +type InitSubscriber = (configuration: ElectronPluginConfiguration, rumPublicApi: RumPublicApi) => void +type StartSubscriber = (addEvent: StartRumResult['addEvent']) => void + +const onRumInitSubscribers: InitSubscriber[] = [] +const onRumStartSubscribers: StartSubscriber[] = [] + +/** + * Electron plugin configuration. + * + * @category Main + */ +// eslint-disable-next-line @typescript-eslint/no-empty-object-type +export interface ElectronPluginConfiguration {} + +/** + * Electron plugin type. + * + * The plugins API is unstable and experimental, and may change without notice. Please don't use this type directly. + * + * @internal + */ +export type ElectronPlugin = Required + +// eslint-disable-next-line no-restricted-syntax +declare global { + interface Window { + dd_electron_internal_api: { + onSpan: (callback: (spanInfo: SpanInfo) => void) => void + } + } +} + +/** + * Electron plugin constructor. + * + * @category Main + * @example + * ```ts + * import { datadogRum } from '@datadog/browser-rum' + * import { electronPlugin } from '@datadog/electron/renderer' + * + * datadogRum.init({ + * applicationId: '', + * clientToken: '', + * site: '', + * plugins: [electronPlugin()], + * // ... + * }) + * ``` + */ +export function electronPlugin(configuration: ElectronPluginConfiguration = {}): ElectronPlugin { + return { + name: 'electron', + onInit({ publicApi }) { + globalPublicApi = publicApi + globalConfiguration = configuration + for (const subscriber of onRumInitSubscribers) { + subscriber(globalConfiguration, globalPublicApi) + } + }, + onRumStart({ addEvent }) { + globalAddEvent = addEvent + + if (!addEvent) { + return + } + + for (const subscriber of onRumStartSubscribers) { + subscriber(addEvent) + } + + window.dd_electron_internal_api.onSpan((spanInfo: SpanInfo) => { + const event: RawRumResourceEvent = { + date: spanInfo.startClocks.timeStamp, + type: 'resource', + _dd: { + span_id: spanInfo.spanId, + trace_id: spanInfo.traceId, + discarded: false, + rule_psr: 1, + }, + resource: { + type: 'native', + id: generateUUID(), + url: spanInfo.name, + method: 'GET', + duration: spanInfo.duration, + }, + } + + // @ts-expect-error - TODO: fix this - probably also due to deep imports - it break at build time + addEvent(spanInfo.startClocks.relative, event, {}, spanInfo.duration) + }) + }, + getConfigurationTelemetry() { + return {} + }, + } satisfies RumPlugin +} + +export function onRumInit(callback: InitSubscriber) { + if (globalConfiguration && globalPublicApi) { + callback(globalConfiguration, globalPublicApi) + } else { + onRumInitSubscribers.push(callback) + } +} + +export function onRumStart(callback: StartSubscriber) { + if (globalAddEvent) { + callback(globalAddEvent) + } else { + onRumStartSubscribers.push(callback) + } +} + +export function resetElectronPlugin() { + globalPublicApi = undefined + globalConfiguration = undefined + globalAddEvent = undefined + onRumInitSubscribers.length = 0 + onRumStartSubscribers.length = 0 +} diff --git a/packages/electron/src/domain/renderer/bridge.ts b/packages/electron/src/domain/renderer/bridge.ts new file mode 100644 index 0000000000..17e780052b --- /dev/null +++ b/packages/electron/src/domain/renderer/bridge.ts @@ -0,0 +1,24 @@ +import { contextBridge, ipcRenderer } from 'electron' +import type { DatadogEventBridge } from '@datadog/browser-core' + +export function setupRendererBridge() { + ;(window as any).DatadogEventBridge = { + getCapabilities() { + return '[]' + }, + getPrivacyLevel() { + return 'mask' + }, + getAllowedWebViewHosts() { + return JSON.stringify([location.hostname]) + }, + send(msg: string) { + void ipcRenderer.invoke('datadog:send', msg) + }, + } satisfies DatadogEventBridge + try { + contextBridge.exposeInMainWorld('DatadogEventBridge', (window as any).DatadogEventBridge) + } catch { + // contextBridge API can only be used when contextIsolation is enabled + } +} diff --git a/packages/electron/src/domain/renderer/ipcRenderer.ts b/packages/electron/src/domain/renderer/ipcRenderer.ts new file mode 100644 index 0000000000..be18869cd0 --- /dev/null +++ b/packages/electron/src/domain/renderer/ipcRenderer.ts @@ -0,0 +1,98 @@ +import type { IpcRenderer } from 'electron' +import { contextBridge, ipcRenderer } from 'electron' +import { createSpanIdentifier, createTraceIdentifier } from '@datadog/browser-rum-core' +import type { Observable } from '@datadog/browser-core' +import { BufferedObservable, clocksNow, elapsed, toServerDuration } from '@datadog/browser-core' +import type { DatadogCarrier, SpanInfo } from '../trace/trace' + +function isThenable(value: any): value is Promise { + return typeof value === 'object' && value !== null && 'then' in value +} + +const SPAN_NAME_PREFIX = 'ipcRenderer' + +function createDatadogCarrier(): DatadogCarrier { + const spanId = createSpanIdentifier().toString() + const traceId = createTraceIdentifier().toString() + + return { + __dd_carrier: true, + 'x-datadog-origin': 'rum', + 'x-datadog-parent-id': spanId, + 'x-datadog-sampling-priority': '1', + 'x-datadog-trace-id': traceId, + } +} + +function withDatadogCarrier R, R>( + observable: Observable, + method: string, + fn: T +): (...args: Parameters) => R { + return (...args: Parameters) => { + const carrier = createDatadogCarrier() + const startClock = clocksNow() + const channel = args[0] + + const result = fn(...args, carrier) + + const notifySpan = () => { + observable.notify({ + startClocks: startClock, + spanId: parseInt(carrier['x-datadog-parent-id'], 10).toString(), + traceId: parseInt(carrier['x-datadog-trace-id'], 10).toString(), + duration: toServerDuration(elapsed(startClock.timeStamp, clocksNow().timeStamp)), + name: `${SPAN_NAME_PREFIX}.${method}.${channel}`, + }) + } + + if (isThenable(result)) { + return result.then((data: any) => { + notifySpan() + + return data // eslint-disable-line @typescript-eslint/no-unsafe-return + }) as R + } + + notifySpan() + + return result + } +} + +export function createIpcRenderer(): IpcRenderer { + const ddIpcRenderer = { ...ipcRenderer } + const observable = new BufferedObservable(100) + + window.dd_electron_internal_api = { + onSpan: (callback: (spanInfo: SpanInfo) => void) => { + const subscription = observable.subscribe((spanInfo) => callback(spanInfo)) + + return () => subscription.unsubscribe() + }, + } + try { + contextBridge.exposeInMainWorld('dd_electron_internal_api', window.dd_electron_internal_api) + } catch { + // contextBridge API can only be used when contextIsolation is enabled + } + + ddIpcRenderer.on = withDatadogCarrier(observable, 'on', ipcRenderer.on.bind(ipcRenderer)) + ddIpcRenderer.off = withDatadogCarrier(observable, 'off', ipcRenderer.off.bind(ipcRenderer)) + ddIpcRenderer.once = withDatadogCarrier(observable, 'once', ipcRenderer.once.bind(ipcRenderer)) + ddIpcRenderer.addListener = withDatadogCarrier(observable, 'addListener', ipcRenderer.addListener.bind(ipcRenderer)) + ddIpcRenderer.removeListener = withDatadogCarrier( + observable, + 'removeListener', + ipcRenderer.removeListener.bind(ipcRenderer) + ) + ddIpcRenderer.send = withDatadogCarrier(observable, 'send', ipcRenderer.send.bind(ipcRenderer)) + ddIpcRenderer.invoke = withDatadogCarrier(observable, 'invoke', ipcRenderer.invoke.bind(ipcRenderer)) + ddIpcRenderer.sendSync = withDatadogCarrier(observable, 'sendSync', ipcRenderer.sendSync.bind(ipcRenderer)) + ddIpcRenderer.sendToHost = withDatadogCarrier(observable, 'sendToHost', ipcRenderer.sendToHost.bind(ipcRenderer)) + + // TODO: Do something for ipcRenderer.postMessage ?? + // see https://www.electronjs.org/docs/latest/api/ipc-renderer#ipcrendererpostmessagechannel-message-transfer + + return ddIpcRenderer +} diff --git a/packages/electron/src/domain/rum/activity.ts b/packages/electron/src/domain/rum/activity.ts new file mode 100644 index 0000000000..b555c65dcf --- /dev/null +++ b/packages/electron/src/domain/rum/activity.ts @@ -0,0 +1,17 @@ +import { Observable } from '@datadog/browser-core' +import { RumEventType } from '@datadog/browser-rum-core' +import type { CollectedRumEvent } from './events' + +export function startActivityTracking(onRumEventObservable: Observable) { + const onActivityObservable = new Observable() + const alreadySeenViewIds = new Set() + onRumEventObservable.subscribe(({ event }) => { + if (event.type === RumEventType.VIEW && !alreadySeenViewIds.has(event.view.id)) { + alreadySeenViewIds.add(event.view.id) + onActivityObservable.notify() + } else if (event.type === RumEventType.ACTION && event.action.type === 'click') { + onActivityObservable.notify() + } + }) + return onActivityObservable +} diff --git a/packages/electron/src/domain/rum/assembly.ts b/packages/electron/src/domain/rum/assembly.ts new file mode 100644 index 0000000000..86c96520dc --- /dev/null +++ b/packages/electron/src/domain/rum/assembly.ts @@ -0,0 +1,46 @@ +import type { Observable, Context, Batch } from '@datadog/browser-core' +import { HookNames, DISCARDED, combine } from '@datadog/browser-core' +import { RumEventType } from '@datadog/browser-rum-core' +import type { Hooks } from '../../hooks' +import type { CollectedRumEvent } from './events' + +export function startRumEventAssembleAndSend( + onRumEventObservable: Observable, + rumBatch: Batch, + hooks: Hooks +) { + onRumEventObservable.subscribe(({ event, source }) => { + const defaultRumEventAttributes = hooks.triggerHook(HookNames.Assemble, { + eventType: event.type, + })! + + if (defaultRumEventAttributes === DISCARDED) { + return + } + const commonContext = + source === 'renderer' + ? { + session: { id: defaultRumEventAttributes.session!.id }, + application: { id: defaultRumEventAttributes.application!.id }, + } + : combine(defaultRumEventAttributes, { + // TODO source electron + source: 'browser' as const, + application: { id: defaultRumEventAttributes.application!.id }, + session: { + type: 'user' as const, + }, + _dd: { + format_version: 2 as const, + }, + }) + + const serverRumEvent = combine(event, commonContext) + + if (serverRumEvent.type === RumEventType.VIEW) { + rumBatch.upsert(serverRumEvent as unknown as Context, serverRumEvent.view.id) + } else { + rumBatch.add(serverRumEvent as unknown as Context) + } + }) +} diff --git a/packages/electron/src/domain/rum/convertSpans.ts b/packages/electron/src/domain/rum/convertSpans.ts new file mode 100644 index 0000000000..41f2e8055d --- /dev/null +++ b/packages/electron/src/domain/rum/convertSpans.ts @@ -0,0 +1,52 @@ +import type { Observable } from '@datadog/browser-core' +import { ResourceType, generateUUID, ErrorHandling } from '@datadog/browser-core' +import type { RumErrorEvent, RumResourceEvent } from '@datadog/browser-rum-core' +import { RumEventType } from '@datadog/browser-rum-core' +import type { Trace } from '../trace/trace' +import { createIdentifier } from '../trace/id' +import type { CollectedRumEvent } from './events' + +export function startConvertSpanToRumEvent( + onTraceObservable: Observable, + onRumEventObservable: Observable +) { + onTraceObservable.subscribe((trace) => { + trace.forEach((span) => { + if (span.error) { + const rumError: Partial = { + type: RumEventType.ERROR, + date: span.start / 1e6, + error: { + id: generateUUID(), + message: span.meta['error.message'], + stack: span.meta['error.stack'], + type: span.meta['error.type'], + source: 'source', + handling: ErrorHandling.UNHANDLED, + }, + } + onRumEventObservable.notify({ event: rumError as RumErrorEvent, source: 'main-process' }) + } + if (span.name === 'http.request') { + const rumResource: Partial = { + type: RumEventType.RESOURCE, + date: span.start / 1e6, + resource: { + id: generateUUID(), + duration: span.duration, + type: ResourceType.NATIVE, + method: span.meta['http.method'], + status_code: span.meta['http.status'], + url: span.meta['http.url'], + }, + _dd: { + trace_id: createIdentifier(span.trace_id, 16).toString(10), + span_id: createIdentifier(span.span_id, 16).toString(10), + format_version: 2, + }, + } + onRumEventObservable.notify({ event: rumResource as RumResourceEvent, source: 'main-process' }) + } + }) + }) +} diff --git a/packages/electron/src/domain/rum/events.ts b/packages/electron/src/domain/rum/events.ts new file mode 100644 index 0000000000..e5b2615d08 --- /dev/null +++ b/packages/electron/src/domain/rum/events.ts @@ -0,0 +1,6 @@ +import { RumEvent } from '@datadog/browser-rum-core' + +export interface CollectedRumEvent { + source: 'main-process' | 'renderer' + event: RumEvent +} diff --git a/packages/electron/src/domain/rum/mainProcessTracking.ts b/packages/electron/src/domain/rum/mainProcessTracking.ts new file mode 100644 index 0000000000..860c999fcc --- /dev/null +++ b/packages/electron/src/domain/rum/mainProcessTracking.ts @@ -0,0 +1,102 @@ +import crypto from 'node:crypto' +import type { RumConfiguration, RumViewEvent } from '@datadog/browser-rum-core' +import { RumEventType } from '@datadog/browser-rum-core' +import type { Observable } from '@datadog/browser-core' +import { HookNames, timeStampNow, combine, toServerDuration, elapsed } from '@datadog/browser-core' +import type { Hooks } from '../../hooks' +import type { CollectedRumEvent } from './events' + +export function startMainProcessTracking( + hooks: Hooks, + configuration: RumConfiguration, + onRumEventObservable: Observable, + onActivityObservable: Observable +) { + const mainProcessContext = { + sessionId: crypto.randomUUID(), + viewId: crypto.randomUUID(), + } + hooks.register(HookNames.Assemble, ({ eventType }) => ({ + type: eventType, + application: { + id: configuration.applicationId, + }, + session: { + id: mainProcessContext.sessionId, + }, + view: { + id: mainProcessContext.viewId, + // TODO get customer package name + url: 'com/datadog/application-launch/view', + }, + service: configuration.service, + env: configuration.env, + version: configuration.version, + })) + console.log('sessionId', mainProcessContext.sessionId) + console.log( + '\x1b[34m%s\x1b[0m', + `https://app.datadoghq.com/rum/sessions?query=%40type%3Asession%20%40session.id%3A${mainProcessContext.sessionId}` + ) + console.log( + '\x1b[34m%s\x1b[0m', + `https://app.datadoghq.com/apm/traces?query=%40_dd.session.id%3A${mainProcessContext.sessionId}` + ) + const applicationStart = timeStampNow() + let applicationLaunch = { + type: RumEventType.VIEW, + date: applicationStart as number, + view: { + id: mainProcessContext.viewId, + is_active: true, + name: 'ApplicationLaunch', + time_spent: 0, + // TODO update counters + action: { + count: 0, + }, + resource: { + count: 0, + }, + error: { + count: 0, + }, + }, + _dd: { + document_version: 0, + }, + } as RumViewEvent + + onRumEventObservable.subscribe(({ event, source }) => { + if (source === 'renderer') { + return + } + switch (event.type) { + case RumEventType.RESOURCE: + ;(applicationLaunch.view.resource.count as any) += 1 + updateView() + break + case RumEventType.ERROR: + ;(applicationLaunch.view.error.count as any) += 1 + updateView() + break + } + }) + + updateView() + onActivityObservable.subscribe(updateView) + + function updateView() { + applicationLaunch = combine(applicationLaunch, { + view: { + time_spent: toServerDuration(elapsed(applicationStart, timeStampNow())), + }, + _dd: { + document_version: applicationLaunch._dd.document_version + 1, + }, + }) + onRumEventObservable.notify({ event: applicationLaunch, source: 'main-process' }) + } + // TODO session expiration / renewal + // TODO useragent +} diff --git a/packages/electron/src/domain/trace/id.ts b/packages/electron/src/domain/trace/id.ts new file mode 100644 index 0000000000..b68574b41b --- /dev/null +++ b/packages/electron/src/domain/trace/id.ts @@ -0,0 +1,198 @@ +// Duplicated from https://github.com/DataDog/dd-trace-js/blob/f40cdf96/packages/dd-trace/src/id.js + +'use strict' + +import crypto from 'node:crypto' + +const UINT_MAX = 4_294_967_296 + +const data = new Uint8Array(8 * 8192) +const zeroId = new Uint8Array(8) + +const map = Array.prototype.map +const pad = (byte: number) => `${byte < 16 ? '0' : ''}${byte.toString(16)}` + +let batch = 0 + +// Internal representation of a trace or span ID. +// eslint-disable-next-line no-restricted-syntax +class Identifier { + _buffer: any[] | Uint8Array + + constructor(value: string, radix = 16) { + this._buffer = radix === 16 ? createBuffer(value) : fromString(value, radix) + } + + toString(radix = 16) { + return radix === 16 ? toHexString(this._buffer) : toNumberString(this._buffer, radix) + } + + toBigInt() { + return Buffer.from(this._buffer).readBigUInt64BE(0) + } + + toBuffer() { + return this._buffer + } + + toArray() { + if (this._buffer.length === 8) { + return this._buffer + } + return this._buffer.slice(-8) + } + + toJSON() { + return this.toString() + } + + equals(other: Identifier) { + const length = this._buffer.length + const otherLength = other._buffer.length + + // Only compare the bytes available in both IDs. + for (let i = length, j = otherLength; i >= 0 && j >= 0; i--, j--) { + if (this._buffer[i] !== other._buffer[j]) { + return false + } + } + + return true + } +} + +// Create a buffer, using an optional hexadecimal value if provided. +function createBuffer(value: string) { + if (value === '0') { + return zeroId + } + if (!value) { + return pseudoRandom() + } + + const size = Math.ceil(value.length / 16) * 16 + const bytes = size / 2 + const buffer = [] + + value = value.padStart(size, '0') + + for (let i = 0; i < bytes; i++) { + buffer[i] = Number.parseInt(value.slice(i * 2, i * 2 + 2), 16) + } + + return buffer +} + +// Convert a numerical string to a buffer using the specified radix. +function fromString(str: string, raddix: number) { + const buffer = new Array(8) + const len = str.length + + let pos = 0 + let high = 0 + let low = 0 + + if (str[0] === '-') { + pos++ + } + + const sign = pos + + while (pos < len) { + const chr = Number.parseInt(str[pos++], raddix) + + if (!(chr >= 0)) { + break + } // NaN + + low = low * raddix + chr + high = high * raddix + Math.floor(low / UINT_MAX) + low %= UINT_MAX + } + + if (sign) { + // eslint-disable-next-line no-bitwise + high = ~high + + if (low) { + low = UINT_MAX - low + } else { + high++ + } + } + + writeUInt32BE(buffer, high, 0) + writeUInt32BE(buffer, low, 4) + + return buffer +} + +// Convert a buffer to a numerical string. +function toNumberString(buffer: any, radix: number) { + let high = readInt32(buffer, buffer.length - 8) + let low = readInt32(buffer, buffer.length - 4) + let str = '' + + radix = radix || 10 + + while (1) { + const mod = (high % radix) * UINT_MAX + low + + high = Math.floor(high / radix) + low = Math.floor(mod / radix) + str = (mod % radix).toString(radix) + str + + if (!high && !low) { + break + } + } + + return str +} + +// Convert a buffer to a hexadecimal string. +function toHexString(buffer: any) { + return map.call(buffer, pad).join('') +} + +// Simple pseudo-random 64-bit ID generator. +function pseudoRandom() { + if (batch === 0) { + crypto.randomFillSync(data) + } + + batch = (batch + 1) % 8192 + + const offset = batch * 8 + + return [ + data[offset] & 0x7f, // only positive int64, + data[offset + 1], + data[offset + 2], + data[offset + 3], + data[offset + 4], + data[offset + 5], + data[offset + 6], + data[offset + 7], + ] +} + +// Read a buffer to unsigned integer bytes. +function readInt32(buffer: any, offset: any) { + return buffer[offset + 0] * 16_777_216 + (buffer[offset + 1] << 16) + (buffer[offset + 2] << 8) + buffer[offset + 3] +} + +// Write unsigned integer bytes to a buffer. +function writeUInt32BE(buffer: any, value: any, offset: any) { + buffer[3 + offset] = value & 255 + value >>= 8 + buffer[2 + offset] = value & 255 + value >>= 8 + buffer[1 + offset] = value & 255 + value >>= 8 + buffer[0 + offset] = value & 255 +} + +export function createIdentifier(value: any, radix: number) { + return new Identifier(value, radix) +} diff --git a/packages/electron/src/domain/trace/trace.ts b/packages/electron/src/domain/trace/trace.ts new file mode 100644 index 0000000000..490ac59bc8 --- /dev/null +++ b/packages/electron/src/domain/trace/trace.ts @@ -0,0 +1,20 @@ +import type { ClocksState, ServerDuration } from '@datadog/browser-core' + +export interface DatadogCarrier { + __dd_carrier: true + 'x-datadog-origin': string + 'x-datadog-parent-id': string + 'x-datadog-sampling-priority': string + 'x-datadog-trace-id': string +} + +export interface SpanInfo { + spanId: string + traceId: string + startClocks: ClocksState + duration: ServerDuration + name: string +} + +export type Span = any +export type Trace = Span[] diff --git a/packages/electron/src/domain/trace/traceAgent.ts b/packages/electron/src/domain/trace/traceAgent.ts new file mode 100644 index 0000000000..2a310f0798 --- /dev/null +++ b/packages/electron/src/domain/trace/traceAgent.ts @@ -0,0 +1,94 @@ +import { createServer } from 'node:http' +import type { Observable } from '@datadog/browser-core' +import { HookNames, DISCARDED } from '@datadog/browser-core' +import { decode } from '@msgpack/msgpack' +import type { Hooks } from '../../hooks' +import type { Trace } from './trace' +import tracer from './tracer' +import { createIdentifier } from './id' + +export function createDdTraceAgent(onTraceObservable: Observable, hooks: Hooks) { + const server = createServer() + + server.on('request', (req, res) => { + // Collect binary data chunks + const chunks: Buffer[] = [] + req.on('data', (chunk: Buffer) => { + chunks.push(chunk) + }) + req.on('end', () => { + const buffer = Buffer.concat(chunks) + + const decoded = decode(buffer) as Array< + Array<{ name: string; type: string; meta: { [key: string]: unknown }; [key: string]: unknown }> + > + + const defaultRumEventAttributes = hooks.triggerHook(HookNames.Assemble, { + eventType: 'span' as any, + })! + + if (defaultRumEventAttributes === DISCARDED) { + return + } + + for (const trace of decoded) { + const filteredTrace = trace + .filter((span) => !isSdkRequest(span)) + .map((span) => ({ + // rewrite ids + ...span, + trace_id: createIdentifier(`${span.trace_id as number}`, 10).toString(16), + span_id: createIdentifier(`${span.span_id as number}`, 10).toString(16), + parent_id: createIdentifier(`${span.parent_id as number}`, 10).toString(16), + meta: { + ...span.meta, + '_dd.application.id': defaultRumEventAttributes.application!.id, + '_dd.session.id': defaultRumEventAttributes.session!.id, + '_dd.view.id': defaultRumEventAttributes.view!.id, + }, + })) + + if (filteredTrace.length > 0) { + onTraceObservable.notify(filteredTrace) + } + } + }) + + // Respond with the agent API format that dd-trace expects + res.writeHead(200, { 'Content-Type': 'application/json' }) + res.end( + JSON.stringify({ + rate_by_service: { + 'service:dd-trace,env:prod': 1, + }, + }) + ) + }) + + server.listen(0, () => { + const addressInfo = server.address() + if (!addressInfo) { + throw new Error('Failed to get server address') + } + + if (typeof addressInfo === 'string') { + throw new Error(`Address is a string: ${addressInfo}`) + } + + const { port } = addressInfo + const url = `http://127.0.0.1:${port}` + + // console.log('agents url', url) + tracer.setUrl(url) + }) +} + +function isSdkRequest(span: any) { + const spanRequestUrl = span.meta['http.url'] as string | undefined + return ( + (spanRequestUrl && + (spanRequestUrl.startsWith('http://127.0.0.1') || + spanRequestUrl.startsWith('https://browser-intake-datadoghq.com/'))) || + (span.resource as string).startsWith('browser-intake-datadoghq.com') + ) +} diff --git a/packages/electron/src/domain/trace/tracer.ts b/packages/electron/src/domain/trace/tracer.ts new file mode 100644 index 0000000000..d6991db208 --- /dev/null +++ b/packages/electron/src/domain/trace/tracer.ts @@ -0,0 +1,30 @@ +import tracer from 'dd-trace' +import { app } from 'electron' + +export function initTracer(service: string, env: string, version: string) { + tracer.init({ + service, + env, + version, + tags: { + electron: { + appName: app.getName(), + appVersion: app.getVersion(), + version: process.versions.electron, + }, + node: { + version: process.versions.node, + }, + os: { + platform: process.platform, + release: process.release, + }, + chrome: { + version: process.versions.chrome, + }, + env: 'prod', + }, + }) +} +// initialized in a different file to avoid hoisting. +export default tracer // eslint-disable-line import/no-default-export diff --git a/packages/electron/src/entries/main.ts b/packages/electron/src/entries/main.ts new file mode 100644 index 0000000000..b399e26ef0 --- /dev/null +++ b/packages/electron/src/entries/main.ts @@ -0,0 +1,149 @@ +/* eslint-disable jsdoc/check-indentation */ +/** + * TODO: + * - [ ] Basic session management + * - [x] Transport layer (for the bridge from webview, from dd-trace) + * - [x] handle rum events + * - [ ] handle routing for other type of events + * - [ ] telemetry + * - [ ] session replays + * - [ ] logs + * - [x] handle dd-trace events (forwards APM spans to trace intake) + * - [x] setup bridge client with ipc from webviews (renderer processes) + * - [x] use `exposeInMainWorld` to setup the bridge function that will setup the ipc to the main process + * - [ ] verify the IPCMain / IpcRenderer are generating correct spans (sync/async/callback/...) + * - [ ] check with APM for wraping IPCMain and net + * - [ ] crash reporting + * - [ ] Test bundling on Windows + * - [ ] Setup the build so we can measure the bundle sizes + * - [ ] check with APM how we can reduce the dd-trace-size + * - [ ] found a real world electron app to try and see how it looks + * - [ ] does the app uses IPC + * - [ ] look at all the TODOs around the electron SDK + * - [ ] add tests + * - [ ] source + user agent in the UI (electron app) + */ +import type { RawError, PageMayExitEvent, Encoder, InitConfiguration, TrackType } from '@datadog/browser-core' +import { + Observable, + DeflateEncoderStreamId, + createBatch, + createHttpRequest, + createFlushController, + createIdentityEncoder, + createEndpointBuilder, +} from '@datadog/browser-core' +import type { RumConfiguration, RumInitConfiguration } from '@datadog/browser-rum-core' +import { createHooks, validateAndBuildRumConfiguration } from '@datadog/browser-rum-core' +import tracer, { initTracer } from '../domain/trace/tracer' +import { createIpcMain } from '../domain/main/ipcMain' +import type { CollectedRumEvent } from '../domain/rum/events' +import { setupMainBridge } from '../domain/main/bridge' +import { startActivityTracking } from '../domain/rum/activity' +import { startRumEventAssembleAndSend } from '../domain/rum/assembly' +import { startMainProcessTracking } from '../domain/rum/mainProcessTracking' +import { startConvertSpanToRumEvent } from '../domain/rum/convertSpans' +import type { Trace } from '../domain/trace/trace' +import { createDdTraceAgent } from '../domain/trace/traceAgent' + +function makeDatadogElectron() { + return { + init(initConfiguration: RumInitConfiguration) { + console.log('init from SDK Electron') + + const configuration = validateAndBuildRumConfiguration(initConfiguration) + + if (!configuration) { + return + } + + const pageMayExitObservable = new Observable() + const sessionExpireObservable = new Observable() + const onRumEventObservable = new Observable() + const onTraceObservable = new Observable() + const hooks = createHooks() + const createEncoder = () => createIdentityEncoder() + + const rumBatch = startElectronRumBatch( + configuration, + () => { + console.error('Error reporting to Datadog') + }, + pageMayExitObservable, + sessionExpireObservable, + createEncoder + ) + + startRumEventAssembleAndSend(onRumEventObservable, rumBatch, hooks) + const onActivityObservable = startActivityTracking(onRumEventObservable) + startMainProcessTracking(hooks, configuration, onRumEventObservable, onActivityObservable) + startConvertSpanToRumEvent(onTraceObservable, onRumEventObservable) + + const spanBatch = startElectronSpanBatch( + initConfiguration, + () => { + console.error('Error reporting to Datadog') + }, + pageMayExitObservable, + sessionExpireObservable, + createEncoder + ) + onTraceObservable.subscribe((trace) => { + spanBatch.add({ env: 'prod', spans: trace }) + }) + setupMainBridge(onRumEventObservable) + initTracer(configuration.service!, configuration.env!, configuration.version!) + createDdTraceAgent(onTraceObservable, hooks) + + // eslint-disable-next-line + setInterval(() => { + pageMayExitObservable.notify({ reason: 'page_hide' }) + }, 1000) + }, + } +} + +export const ddElectron = makeDatadogElectron() +export { tracer } +export const ipcMain = createIpcMain() + +export function startElectronRumBatch( + configuration: RumConfiguration, + reportError: (error: RawError) => void, + pageMayExitObservable: Observable, + sessionExpireObservable: Observable, + createEncoder: (streamId: DeflateEncoderStreamId) => Encoder +) { + const batch = createBatch({ + encoder: createEncoder(DeflateEncoderStreamId.RUM), + request: createHttpRequest([configuration.rumEndpointBuilder], reportError), + flushController: createFlushController({ + pageMayExitObservable, + sessionExpireObservable, + }), + }) + + return batch +} + +// TODO change it by a single event fetch +export function startElectronSpanBatch( + initConfiguration: InitConfiguration, + reportError: (error: RawError) => void, + pageMayExitObservable: Observable, + sessionExpireObservable: Observable, + createEncoder: (streamId: DeflateEncoderStreamId) => Encoder +) { + const endpoints = [createEndpointBuilder(initConfiguration, 'spans' as TrackType)] + + const batch = createBatch({ + encoder: createEncoder(DeflateEncoderStreamId.RUM), + request: createHttpRequest(endpoints, reportError), + flushController: createFlushController({ + pageMayExitObservable, + sessionExpireObservable, + }), + }) + + return batch +} diff --git a/packages/electron/src/entries/plugin.ts b/packages/electron/src/entries/plugin.ts new file mode 100644 index 0000000000..8df927b5d0 --- /dev/null +++ b/packages/electron/src/entries/plugin.ts @@ -0,0 +1,2 @@ +export type * from './plugin' +export { electronPlugin } from '../domain/plugin/plugin' diff --git a/packages/electron/src/entries/renderer.ts b/packages/electron/src/entries/renderer.ts new file mode 100644 index 0000000000..450bf90c56 --- /dev/null +++ b/packages/electron/src/entries/renderer.ts @@ -0,0 +1,5 @@ +import { createIpcRenderer } from '../domain/renderer/ipcRenderer' +import { setupRendererBridge } from '../domain/renderer/bridge' + +setupRendererBridge() +export const ipcRenderer = createIpcRenderer() diff --git a/packages/electron/src/hooks.ts b/packages/electron/src/hooks.ts new file mode 100644 index 0000000000..50d635ee6e --- /dev/null +++ b/packages/electron/src/hooks.ts @@ -0,0 +1,28 @@ +import type { + DISCARDED, + HookNamesAsConst, + RecursivePartial, + RelativeTime, + SKIPPED, + TelemetryEvent, +} from '@datadog/browser-core' +import { abstractHooks } from '@datadog/browser-core' +import type { RumEvent } from '@datadog/browser-rum-core' + +// Define a partial RUM event type. +// Ensuring the `type` field is always present improves type checking, especially in conditional logic in hooks (e.g., `if (eventType === 'view')`). +export type DefaultRumEventAttributes = RecursivePartial & { type: RumEvent['type'] } +export type DefaultTelemetryEventAttributes = RecursivePartial + +export interface HookCallbackMap { + [HookNamesAsConst.ASSEMBLE]: (param: { + eventType: RumEvent['type'] + }) => DefaultRumEventAttributes | SKIPPED | DISCARDED + [HookNamesAsConst.ASSEMBLE_TELEMETRY]: (param: { + startTime: RelativeTime + }) => DefaultTelemetryEventAttributes | SKIPPED | DISCARDED +} + +export type Hooks = ReturnType + +export const createHooks = abstractHooks diff --git a/packages/electron/typedoc.json b/packages/electron/typedoc.json new file mode 100644 index 0000000000..002b26a53c --- /dev/null +++ b/packages/electron/typedoc.json @@ -0,0 +1,4 @@ +{ + "$schema": "https://typedoc.org/schema.json", + "entryPoints": ["src/entries/main.ts"] +} diff --git a/packages/flagging/package.json b/packages/flagging/package.json index 3bcfba8f64..523f64e9fe 100644 --- a/packages/flagging/package.json +++ b/packages/flagging/package.json @@ -6,6 +6,7 @@ "module": "esm/entries/main.js", "types": "cjs/entries/main.d.ts", "scripts": { + "pack": "yarn pack", "build": "node ../../scripts/build/build-package.ts --modules --bundle datadog-flagging.js", "build:bundle": "node ../../scripts/build/build-package.ts --bundle datadog-flagging.js" }, diff --git a/packages/logs/package.json b/packages/logs/package.json index 5fa4497263..8be49c1895 100644 --- a/packages/logs/package.json +++ b/packages/logs/package.json @@ -6,6 +6,7 @@ "module": "esm/entries/main.js", "types": "cjs/entries/main.d.ts", "scripts": { + "pack": "yarn pack", "build": "node ../../scripts/build/build-package.ts --modules --bundle datadog-logs.js", "build:bundle": "node ../../scripts/build/build-package.ts --bundle datadog-logs.js" }, diff --git a/packages/rum-core/package.json b/packages/rum-core/package.json index 960ed8b8bf..e062fd3848 100644 --- a/packages/rum-core/package.json +++ b/packages/rum-core/package.json @@ -6,6 +6,7 @@ "module": "esm/index.js", "types": "cjs/index.d.ts", "scripts": { + "pack": "yarn pack", "build": "node ../../scripts/build/build-package.ts --modules" }, "dependencies": { diff --git a/packages/rum-core/src/domain/tracing/identifier.ts b/packages/rum-core/src/domain/tracing/identifier.ts index e506016631..cc3e8b7d0a 100644 --- a/packages/rum-core/src/domain/tracing/identifier.ts +++ b/packages/rum-core/src/domain/tracing/identifier.ts @@ -1,4 +1,4 @@ -interface BaseIdentifier { +export interface BaseIdentifier { toString(radix?: number): string } diff --git a/packages/rum-core/src/index.ts b/packages/rum-core/src/index.ts index c00a6b0ff2..b30e908aa0 100644 --- a/packages/rum-core/src/index.ts +++ b/packages/rum-core/src/index.ts @@ -23,7 +23,7 @@ export type { RumEventDomainContext, RumVitalEventDomainContext, } from './domainContext.types' -export type { ReplayStats, RawRumActionEvent, RawRumEvent } from './rawRumEvent.types' +export type { ReplayStats, RawRumActionEvent, RawRumEvent, RawRumResourceEvent } from './rawRumEvent.types' export { ActionType, RumEventType, FrustrationType } from './rawRumEvent.types' export { startRum } from './boot/startRum' export type { RawRumEventCollectedData } from './domain/lifeCycle' @@ -48,6 +48,7 @@ export type { FeatureFlagsForEvents, RemoteConfiguration, } from './domain/configuration' +export { validateAndBuildRumConfiguration } from './domain/configuration' export { DEFAULT_PROGRAMMATIC_ACTION_NAME_ATTRIBUTE } from './domain/action/actionNameConstants' export { STABLE_ATTRIBUTES } from './domain/getSelectorFromElement' export * from './browser/htmlDomUtils' @@ -71,5 +72,7 @@ export type { Hooks, DefaultRumEventAttributes, DefaultTelemetryEventAttributes export { createHooks } from './domain/hooks' export { isSampled } from './domain/sampler/sampler' export type { TracingOption, PropagatorType } from './domain/tracing/tracer.types' +export type { BaseIdentifier, TraceIdentifier, SpanIdentifier } from './domain/tracing/identifier' +export { createTraceIdentifier, createSpanIdentifier } from './domain/tracing/identifier' export type { TransportPayload } from './transport/formDataTransport' export { createFormDataTransport } from './transport/formDataTransport' diff --git a/packages/rum-react/package.json b/packages/rum-react/package.json index e7d66a0875..cc1264f9e2 100644 --- a/packages/rum-react/package.json +++ b/packages/rum-react/package.json @@ -6,6 +6,7 @@ "module": "esm/entries/main.js", "types": "cjs/entries/main.d.ts", "scripts": { + "pack": "yarn pack", "build": "node ../../scripts/build/build-package.ts --modules", "prepack": "npm run build" }, diff --git a/packages/rum-slim/package.json b/packages/rum-slim/package.json index db20e6fae3..e371d22816 100644 --- a/packages/rum-slim/package.json +++ b/packages/rum-slim/package.json @@ -6,6 +6,7 @@ "module": "esm/entries/main.js", "types": "cjs/entries/main.d.ts", "scripts": { + "pack": "yarn pack", "build": "node ../../scripts/build/build-package.ts --modules --bundle datadog-rum-slim.js", "build:bundle": "node ../../scripts/build/build-package.ts --bundle datadog-rum-slim.js" }, diff --git a/packages/rum/package.json b/packages/rum/package.json index aa4d12b4a8..84f84d3f79 100644 --- a/packages/rum/package.json +++ b/packages/rum/package.json @@ -6,6 +6,7 @@ "module": "esm/entries/main.js", "types": "cjs/entries/main.d.ts", "scripts": { + "pack": "yarn pack", "build": "node ../../scripts/build/build-package.ts --modules --bundle datadog-rum.js", "build:bundle": "node ../../scripts/build/build-package.ts --bundle datadog-rum.js" }, diff --git a/packages/worker/package.json b/packages/worker/package.json index e4b1bff308..ade59a87c6 100644 --- a/packages/worker/package.json +++ b/packages/worker/package.json @@ -4,6 +4,7 @@ "license": "Apache-2.0", "main": "bundle/worker.js", "scripts": { + "pack": "yarn pack", "build": "node ../../scripts/build/build-package.ts --bundle worker.js", "build:bundle": "yarn build" }, diff --git a/scripts/lib/computeBundleSize.ts b/scripts/lib/computeBundleSize.ts index 407bbb8939..f0efa8c0a5 100644 --- a/scripts/lib/computeBundleSize.ts +++ b/scripts/lib/computeBundleSize.ts @@ -2,7 +2,7 @@ import path from 'node:path' import fs from 'node:fs' import zlib from 'node:zlib' -const packages = ['rum', 'logs', 'flagging', 'rum-slim', 'worker'] as const +const packages = ['rum', 'logs', 'flagging', 'rum-slim', 'worker', 'electron'] as const interface BundleSize { uncompressed: number diff --git a/yarn.lock b/yarn.lock index 5b5e0ed377..307bc876b5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -369,6 +369,122 @@ __metadata: languageName: unknown linkType: soft +"@datadog/electron@workspace:packages/electron": + version: 0.0.0-use.local + resolution: "@datadog/electron@workspace:packages/electron" + dependencies: + "@datadog/browser-core": "npm:6.24.0" + "@datadog/browser-rum-core": "npm:6.24.0" + "@msgpack/msgpack": "npm:3.1.2" + "@openfeature/core": "npm:1.9.1" + "@types/pako": "npm:2.0.4" + dd-trace: "npm:^5.76.0" + electron: "npm:39" + graphql: "npm:16.12.0" + pako: "npm:2.1.0" + peerDependencies: + "@datadog/browser-logs": 6.24.0 + electron: 39 + peerDependenciesMeta: + "@datadog/browser-logs": + optional: true + languageName: unknown + linkType: soft + +"@datadog/flagging-core@npm:0.2.0": + version: 0.2.0 + resolution: "@datadog/flagging-core@npm:0.2.0" + dependencies: + spark-md5: "npm:^3.0.2" + peerDependencies: + "@openfeature/core": ^1.8.1 + checksum: 10c0/e3a837bdb6186a0a0a22a692afc6289d8527b43f6fc9fe87c152d99a79ba546c1574d48fb84fe9cf05067c7a911844aa6708eddf60213eb5e1f029c0f9881e20 + languageName: node + linkType: hard + +"@datadog/libdatadog@npm:0.7.0": + version: 0.7.0 + resolution: "@datadog/libdatadog@npm:0.7.0" + checksum: 10c0/04ca10b1f3a393e3a6356c80ca257c79c9ebca98923b88fd55d11e732f3721b4fd6fba134737b19d56da1b579c8633824364c724303f33106db461ad7f61c669 + languageName: node + linkType: hard + +"@datadog/native-appsec@npm:10.3.0": + version: 10.3.0 + resolution: "@datadog/native-appsec@npm:10.3.0" + dependencies: + node-gyp: "npm:latest" + node-gyp-build: "npm:^3.9.0" + checksum: 10c0/a1c5eac27d566148c58559e1e3d481efb0bf336b14a2e2a4bcdef6d7137b3fd6401781deac0271b5aa71634796af3f6ffcc1608609268355d4632c6f99dc338f + languageName: node + linkType: hard + +"@datadog/native-iast-taint-tracking@npm:4.0.0": + version: 4.0.0 + resolution: "@datadog/native-iast-taint-tracking@npm:4.0.0" + dependencies: + node-gyp: "npm:latest" + node-gyp-build: "npm:^3.9.0" + checksum: 10c0/72a18959a9eccfeff4b791ff9929a384df84385596232685a65ca9a0225306f376e85bd44540e98467d8058e54bc776b3fd52ed029c04eebb9ef7d3ae73c5df7 + languageName: node + linkType: hard + +"@datadog/native-metrics@npm:3.1.1": + version: 3.1.1 + resolution: "@datadog/native-metrics@npm:3.1.1" + dependencies: + node-addon-api: "npm:^6.1.0" + node-gyp: "npm:latest" + node-gyp-build: "npm:^3.9.0" + checksum: 10c0/05757cd34fca5f129130dba95be32012a9693ac59e7517145560d71275dd9b7592aad60e8f0d1d805b99d74ea834d8ae1e5db00b0de75bc6faba84419cb35393 + languageName: node + linkType: hard + +"@datadog/openfeature-node-server@npm:^0.2.0": + version: 0.2.0 + resolution: "@datadog/openfeature-node-server@npm:0.2.0" + dependencies: + "@datadog/flagging-core": "npm:0.2.0" + "@openfeature/server-sdk": "npm:~1.18.0" + peerDependencies: + "@openfeature/server-sdk": ~1.18.0 + checksum: 10c0/9465f7b109bd39604cd62bfa184d6ea0fc4b526de566b010f2f0e6ebeac4d50773486b66a0adca340377538b30bb6fe875085acfce87c56f2ee1d7d431f413c1 + languageName: node + linkType: hard + +"@datadog/pprof@npm:5.12.0": + version: 5.12.0 + resolution: "@datadog/pprof@npm:5.12.0" + dependencies: + delay: "npm:^5.0.0" + node-gyp: "npm:latest" + node-gyp-build: "npm:<4.0" + p-limit: "npm:^3.1.0" + pprof-format: "npm:^2.2.1" + source-map: "npm:^0.7.4" + checksum: 10c0/e18e9e941fbd7ba6de52f3e8d92d7b4612ab054b302d2b2581932be41d1f4bb03d27b753ab9242364b897ba2773c105b1badb2d760db4b1fe633e1b8c23c1013 + languageName: node + linkType: hard + +"@datadog/sketches-js@npm:2.1.1": + version: 2.1.1 + resolution: "@datadog/sketches-js@npm:2.1.1" + checksum: 10c0/4b930240202e4e94ac49fc95298a7111202492566f76672e0ec43425a1710a0e3650a20f858a6358509ab08363d39fce5db210c88d94b4225f96b3bfe645cc5c + languageName: node + linkType: hard + +"@datadog/wasm-js-rewriter@npm:5.0.1": + version: 5.0.1 + resolution: "@datadog/wasm-js-rewriter@npm:5.0.1" + dependencies: + js-yaml: "npm:^4.1.0" + lru-cache: "npm:^7.14.0" + module-details-from-path: "npm:^1.0.3" + node-gyp-build: "npm:^4.5.0" + checksum: 10c0/e5f665f53b8d292efe85ac401f56923112860cfd14c5d84097ad22e1b86c8a30f3cd39cc92e1ec6e8f5f9de5fef028af46554752d8ae2d0f80b7c3a44827f0db + languageName: node + linkType: hard + "@discoveryjs/json-ext@npm:^0.6.1": version: 0.6.3 resolution: "@discoveryjs/json-ext@npm:0.6.3" @@ -376,6 +492,25 @@ __metadata: languageName: node linkType: hard +"@electron/get@npm:^2.0.0": + version: 2.0.3 + resolution: "@electron/get@npm:2.0.3" + dependencies: + debug: "npm:^4.1.1" + env-paths: "npm:^2.2.0" + fs-extra: "npm:^8.1.0" + global-agent: "npm:^3.0.0" + got: "npm:^11.8.5" + progress: "npm:^2.0.3" + semver: "npm:^6.2.0" + sumchecker: "npm:^3.0.1" + dependenciesMeta: + global-agent: + optional: true + checksum: 10c0/148957d531bac50c29541515f2483c3e5c9c6ba9f0269a5d536540d2b8d849188a89588f18901f3a84c2b4fd376d1e0c5ea2159eb2d17bda68558f57df19015e + languageName: node + linkType: hard + "@emnapi/core@npm:^1.1.0": version: 1.7.0 resolution: "@emnapi/core@npm:1.7.0" @@ -908,6 +1043,13 @@ __metadata: languageName: node linkType: hard +"@isaacs/ttlcache@npm:^2.0.1": + version: 2.1.1 + resolution: "@isaacs/ttlcache@npm:2.1.1" + checksum: 10c0/f02870024e7523da5d97a9a6c4d7e4a984dffa2896304ac4c48e9773cc624741238618733ae4eef206f21285990da994c2c88c3fb3ceb6cd91af46dd019228be + languageName: node + linkType: hard + "@istanbuljs/schema@npm:^0.1.2": version: 0.1.3 resolution: "@istanbuljs/schema@npm:0.1.3" @@ -1022,6 +1164,24 @@ __metadata: languageName: node linkType: hard +"@jsep-plugin/assignment@npm:^1.3.0": + version: 1.3.0 + resolution: "@jsep-plugin/assignment@npm:1.3.0" + peerDependencies: + jsep: ^0.4.0||^1.0.0 + checksum: 10c0/d749554dc691798116eb068eebe2d9bcb0b0d89ef6c7cc7c2a9f37d03da15fdbf8053407e97008090cd1bd6f256ea6c26abbada7399cf79f0b6b502e164b084b + languageName: node + linkType: hard + +"@jsep-plugin/regex@npm:^1.0.4": + version: 1.0.4 + resolution: "@jsep-plugin/regex@npm:1.0.4" + peerDependencies: + jsep: ^0.4.0||^1.0.0 + checksum: 10c0/bec7eb7ea6ab453a2672edc808644c5be3dc06b2a9d77182e18cd595b37deba6dcdb3760849d8684afc5779a86b7d2604dd525cb612a548f9ed9f31a8032ec24 + languageName: node + linkType: hard + "@jsonjoy.com/base64@npm:^1.1.2": version: 1.1.2 resolution: "@jsonjoy.com/base64@npm:1.1.2" @@ -1200,6 +1360,13 @@ __metadata: languageName: node linkType: hard +"@msgpack/msgpack@npm:3.1.2": + version: 3.1.2 + resolution: "@msgpack/msgpack@npm:3.1.2" + checksum: 10c0/4fee6dbea70a485d3a787ac76dd43687f489d662f22919237db1f2abbc3c88070c1d3ad78417ce6e764bcd041051680284654021f52068e0aff82d570cb942d5 + languageName: node + linkType: hard + "@napi-rs/wasm-runtime@npm:0.2.4": version: 0.2.4 resolution: "@napi-rs/wasm-runtime@npm:0.2.4" @@ -1747,6 +1914,68 @@ __metadata: languageName: node linkType: hard +"@openfeature/core@npm:1.9.1": + version: 1.9.1 + resolution: "@openfeature/core@npm:1.9.1" + checksum: 10c0/983c651484621e6e5a3b4bf83fce5398a1adc2ace6162ff5a13a8eaf6d285b7c6b15f5c0a477ece9010ca88b28799985d810047ea0c18324d7a51ac4d04e18d6 + languageName: node + linkType: hard + +"@openfeature/server-sdk@npm:~1.18.0": + version: 1.18.0 + resolution: "@openfeature/server-sdk@npm:1.18.0" + peerDependencies: + "@openfeature/core": ^1.7.0 + checksum: 10c0/5c3aa8fee5ec4ad9ec40ee74094fe0377b28cadfcc6f71414fa1762035cb994891184cc491a59dbaade71afe0139cd39c193e3897b05df8fa21f0e7b84b67c53 + languageName: node + linkType: hard + +"@opentelemetry/api-logs@npm:<1.0.0": + version: 0.208.0 + resolution: "@opentelemetry/api-logs@npm:0.208.0" + dependencies: + "@opentelemetry/api": "npm:^1.3.0" + checksum: 10c0/dc1fbee6219df4166509f43b74ea936bb18b6d594565b0bcf56b654a1c958b50d6046b8739dc36c98149fe890c02150ff3814e963f5ea439a07ff3c562555b99 + languageName: node + linkType: hard + +"@opentelemetry/api@npm:>=1.0.0 <1.10.0, @opentelemetry/api@npm:^1.3.0": + version: 1.9.0 + resolution: "@opentelemetry/api@npm:1.9.0" + checksum: 10c0/9aae2fe6e8a3a3eeb6c1fdef78e1939cf05a0f37f8a4fae4d6bf2e09eb1e06f966ece85805626e01ba5fab48072b94f19b835449e58b6d26720ee19a58298add + languageName: node + linkType: hard + +"@opentelemetry/core@npm:1.30.1, @opentelemetry/core@npm:>=1.14.0 <1.31.0": + version: 1.30.1 + resolution: "@opentelemetry/core@npm:1.30.1" + dependencies: + "@opentelemetry/semantic-conventions": "npm:1.28.0" + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.10.0" + checksum: 10c0/4c25ba50a6137c2ba9ca563fb269378f3c9ca6fd1b3f15dbb6eff78eebf5656f281997cbb7be8e51c01649fd6ad091083fcd8a42dd9b5dfac907dc06d7cfa092 + languageName: node + linkType: hard + +"@opentelemetry/resources@npm:>=1.0.0 <1.31.0": + version: 1.30.1 + resolution: "@opentelemetry/resources@npm:1.30.1" + dependencies: + "@opentelemetry/core": "npm:1.30.1" + "@opentelemetry/semantic-conventions": "npm:1.28.0" + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.10.0" + checksum: 10c0/688e73258283c80662bfa9a858aaf73bf3b832a18d96e546d0dddfa6dcec556cdfa087a1d0df643435293406009e4122d7fb7eeea69aa87b539d3bab756fba74 + languageName: node + linkType: hard + +"@opentelemetry/semantic-conventions@npm:1.28.0": + version: 1.28.0 + resolution: "@opentelemetry/semantic-conventions@npm:1.28.0" + checksum: 10c0/deb8a0f744198071e70fea27143cf7c9f7ecb7e4d7b619488c917834ea09b31543c1c2bcea4ec5f3cf68797f0ef3549609c14e859013d9376400ac1499c2b9cb + languageName: node + linkType: hard + "@pkgjs/parseargs@npm:^0.11.0": version: 0.11.0 resolution: "@pkgjs/parseargs@npm:0.11.0" @@ -1801,6 +2030,79 @@ __metadata: languageName: node linkType: hard +"@protobufjs/aspromise@npm:^1.1.1, @protobufjs/aspromise@npm:^1.1.2": + version: 1.1.2 + resolution: "@protobufjs/aspromise@npm:1.1.2" + checksum: 10c0/a83343a468ff5b5ec6bff36fd788a64c839e48a07ff9f4f813564f58caf44d011cd6504ed2147bf34835bd7a7dd2107052af755961c6b098fd8902b4f6500d0f + languageName: node + linkType: hard + +"@protobufjs/base64@npm:^1.1.2": + version: 1.1.2 + resolution: "@protobufjs/base64@npm:1.1.2" + checksum: 10c0/eec925e681081af190b8ee231f9bad3101e189abbc182ff279da6b531e7dbd2a56f1f306f37a80b1be9e00aa2d271690d08dcc5f326f71c9eed8546675c8caf6 + languageName: node + linkType: hard + +"@protobufjs/codegen@npm:^2.0.4": + version: 2.0.4 + resolution: "@protobufjs/codegen@npm:2.0.4" + checksum: 10c0/26ae337c5659e41f091606d16465bbcc1df1f37cc1ed462438b1f67be0c1e28dfb2ca9f294f39100c52161aef82edf758c95d6d75650a1ddf31f7ddee1440b43 + languageName: node + linkType: hard + +"@protobufjs/eventemitter@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/eventemitter@npm:1.1.0" + checksum: 10c0/1eb0a75180e5206d1033e4138212a8c7089a3d418c6dfa5a6ce42e593a4ae2e5892c4ef7421f38092badba4040ea6a45f0928869989411001d8c1018ea9a6e70 + languageName: node + linkType: hard + +"@protobufjs/fetch@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/fetch@npm:1.1.0" + dependencies: + "@protobufjs/aspromise": "npm:^1.1.1" + "@protobufjs/inquire": "npm:^1.1.0" + checksum: 10c0/cda6a3dc2d50a182c5865b160f72077aac197046600091dbb005dd0a66db9cce3c5eaed6d470ac8ed49d7bcbeef6ee5f0bc288db5ff9a70cbd003e5909065233 + languageName: node + linkType: hard + +"@protobufjs/float@npm:^1.0.2": + version: 1.0.2 + resolution: "@protobufjs/float@npm:1.0.2" + checksum: 10c0/18f2bdede76ffcf0170708af15c9c9db6259b771e6b84c51b06df34a9c339dbbeec267d14ce0bddd20acc142b1d980d983d31434398df7f98eb0c94a0eb79069 + languageName: node + linkType: hard + +"@protobufjs/inquire@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/inquire@npm:1.1.0" + checksum: 10c0/64372482efcba1fb4d166a2664a6395fa978b557803857c9c03500e0ac1013eb4b1aacc9ed851dd5fc22f81583670b4f4431bae186f3373fedcfde863ef5921a + languageName: node + linkType: hard + +"@protobufjs/path@npm:^1.1.2": + version: 1.1.2 + resolution: "@protobufjs/path@npm:1.1.2" + checksum: 10c0/cece0a938e7f5dfd2fa03f8c14f2f1cf8b0d6e13ac7326ff4c96ea311effd5fb7ae0bba754fbf505312af2e38500250c90e68506b97c02360a43793d88a0d8b4 + languageName: node + linkType: hard + +"@protobufjs/pool@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/pool@npm:1.1.0" + checksum: 10c0/eda2718b7f222ac6e6ad36f758a92ef90d26526026a19f4f17f668f45e0306a5bd734def3f48f51f8134ae0978b6262a5c517c08b115a551756d1a3aadfcf038 + languageName: node + linkType: hard + +"@protobufjs/utf8@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/utf8@npm:1.1.0" + checksum: 10c0/a3fe31fe3fa29aa3349e2e04ee13dc170cc6af7c23d92ad49e3eeaf79b9766264544d3da824dba93b7855bd6a2982fb40032ef40693da98a136d835752beb487 + languageName: node + linkType: hard + "@puppeteer/browsers@npm:2.10.13": version: 2.10.13 resolution: "@puppeteer/browsers@npm:2.10.13" @@ -2007,6 +2309,13 @@ __metadata: languageName: node linkType: hard +"@sindresorhus/is@npm:^4.0.0": + version: 4.6.0 + resolution: "@sindresorhus/is@npm:4.6.0" + checksum: 10c0/33b6fb1d0834ec8dd7689ddc0e2781c2bfd8b9c4e4bacbcb14111e0ae00621f2c264b8a7d36541799d74888b5dccdf422a891a5cb5a709ace26325eedc81e22e + languageName: node + linkType: hard + "@socket.io/component-emitter@npm:~3.1.0": version: 3.1.2 resolution: "@socket.io/component-emitter@npm:3.1.2" @@ -2146,6 +2455,15 @@ __metadata: languageName: node linkType: hard +"@szmarczak/http-timer@npm:^4.0.5": + version: 4.0.6 + resolution: "@szmarczak/http-timer@npm:4.0.6" + dependencies: + defer-to-connect: "npm:^2.0.0" + checksum: 10c0/73946918c025339db68b09abd91fa3001e87fc749c619d2e9c2003a663039d4c3cb89836c98a96598b3d47dec2481284ba85355392644911f5ecd2336536697f + languageName: node + linkType: hard + "@tabler/icons-react@npm:3.35.0": version: 3.35.0 resolution: "@tabler/icons-react@npm:3.35.0" @@ -2263,6 +2581,18 @@ __metadata: languageName: node linkType: hard +"@types/cacheable-request@npm:^6.0.1": + version: 6.0.3 + resolution: "@types/cacheable-request@npm:6.0.3" + dependencies: + "@types/http-cache-semantics": "npm:*" + "@types/keyv": "npm:^3.1.4" + "@types/node": "npm:*" + "@types/responselike": "npm:^1.0.0" + checksum: 10c0/10816a88e4e5b144d43c1d15a81003f86d649776c7f410c9b5e6579d0ad9d4ca71c541962fb403077388b446e41af7ae38d313e46692144985f006ac5e11fa03 + languageName: node + linkType: hard + "@types/chrome@npm:0.1.27": version: 0.1.27 resolution: "@types/chrome@npm:0.1.27" @@ -2452,6 +2782,13 @@ __metadata: languageName: node linkType: hard +"@types/http-cache-semantics@npm:*": + version: 4.0.4 + resolution: "@types/http-cache-semantics@npm:4.0.4" + checksum: 10c0/51b72568b4b2863e0fe8d6ce8aad72a784b7510d72dc866215642da51d84945a9459fa89f49ec48f1e9a1752e6a78e85a4cda0ded06b1c73e727610c925f9ce6 + languageName: node + linkType: hard + "@types/http-errors@npm:*": version: 2.0.5 resolution: "@types/http-errors@npm:2.0.5" @@ -2489,6 +2826,15 @@ __metadata: languageName: node linkType: hard +"@types/keyv@npm:^3.1.4": + version: 3.1.4 + resolution: "@types/keyv@npm:3.1.4" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/ff8f54fc49621210291f815fe5b15d809fd7d032941b3180743440bd507ecdf08b9e844625fa346af568c84bf34114eb378dcdc3e921a08ba1e2a08d7e3c809c + languageName: node + linkType: hard + "@types/lodash@npm:^4.14.182": version: 4.17.20 resolution: "@types/lodash@npm:4.17.20" @@ -2542,6 +2888,24 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:>=13.7.0": + version: 24.10.1 + resolution: "@types/node@npm:24.10.1" + dependencies: + undici-types: "npm:~7.16.0" + checksum: 10c0/d6bca7a78f550fbb376f236f92b405d676003a8a09a1b411f55920ef34286ee3ee51f566203920e835478784df52662b5b2af89159d9d319352e9ea21801c002 + languageName: node + linkType: hard + +"@types/node@npm:^22.7.7": + version: 22.19.1 + resolution: "@types/node@npm:22.19.1" + dependencies: + undici-types: "npm:~6.21.0" + checksum: 10c0/6edd93aea86da740cb7872626839cd6f4a67a049d3a3a6639cb592c620ec591408a30989ab7410008d1a0b2d4985ce50f1e488e79c033e4476d3bec6833b0a2f + languageName: node + linkType: hard + "@types/normalize-package-data@npm:^2.4.0": version: 2.4.4 resolution: "@types/normalize-package-data@npm:2.4.4" @@ -2595,6 +2959,15 @@ __metadata: languageName: node linkType: hard +"@types/responselike@npm:^1.0.0": + version: 1.0.3 + resolution: "@types/responselike@npm:1.0.3" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/a58ba341cb9e7d74f71810a88862da7b2a6fa42e2a1fc0ce40498f6ea1d44382f0640117057da779f74c47039f7166bf48fad02dc876f94e005c7afa50f5e129 + languageName: node + linkType: hard + "@types/retry@npm:0.12.2": version: 0.12.2 resolution: "@types/retry@npm:0.12.2" @@ -3114,6 +3487,15 @@ __metadata: languageName: node linkType: hard +"acorn-import-attributes@npm:^1.9.5": + version: 1.9.5 + resolution: "acorn-import-attributes@npm:1.9.5" + peerDependencies: + acorn: ^8 + checksum: 10c0/5926eaaead2326d5a86f322ff1b617b0f698aa61dc719a5baa0e9d955c9885cc71febac3fb5bacff71bbf2c4f9c12db2056883c68c53eb962c048b952e1e013d + languageName: node + linkType: hard + "acorn-import-phases@npm:^1.0.3": version: 1.0.4 resolution: "acorn-import-phases@npm:1.0.4" @@ -3141,7 +3523,7 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.11.0, acorn@npm:^8.15.0, acorn@npm:^8.4.1": +"acorn@npm:^8.11.0, acorn@npm:^8.14.0, acorn@npm:^8.15.0, acorn@npm:^8.4.1": version: 8.15.0 resolution: "acorn@npm:8.15.0" bin: @@ -3779,6 +4161,13 @@ __metadata: languageName: node linkType: hard +"boolean@npm:^3.0.1": + version: 3.2.0 + resolution: "boolean@npm:3.2.0" + checksum: 10c0/6a0dc9668f6f3dda42a53c181fcbdad223169c8d87b6c4011b87a8b14a21770efb2934a778f063d7ece17280f8c06d313c87f7b834bb1dd526a867ffcd00febf + languageName: node + linkType: hard + "brace-expansion@npm:^1.1.7": version: 1.1.12 resolution: "brace-expansion@npm:1.1.12" @@ -4012,6 +4401,28 @@ __metadata: languageName: node linkType: hard +"cacheable-lookup@npm:^5.0.3": + version: 5.0.4 + resolution: "cacheable-lookup@npm:5.0.4" + checksum: 10c0/a6547fb4954b318aa831cbdd2f7b376824bc784fb1fa67610e4147099e3074726072d9af89f12efb69121415a0e1f2918a8ddd4aafcbcf4e91fbeef4a59cd42c + languageName: node + linkType: hard + +"cacheable-request@npm:^7.0.2": + version: 7.0.4 + resolution: "cacheable-request@npm:7.0.4" + dependencies: + clone-response: "npm:^1.0.2" + get-stream: "npm:^5.1.0" + http-cache-semantics: "npm:^4.0.0" + keyv: "npm:^4.0.0" + lowercase-keys: "npm:^2.0.0" + normalize-url: "npm:^6.0.1" + responselike: "npm:^2.0.0" + checksum: 10c0/0834a7d17ae71a177bc34eab06de112a43f9b5ad05ebe929bec983d890a7d9f2bc5f1aa8bb67ea2b65e07a3bc74bea35fa62dd36dbac52876afe36fdcf83da41 + languageName: node + linkType: hard + "call-bind-apply-helpers@npm:^1.0.0, call-bind-apply-helpers@npm:^1.0.1, call-bind-apply-helpers@npm:^1.0.2": version: 1.0.2 resolution: "call-bind-apply-helpers@npm:1.0.2" @@ -4203,6 +4614,13 @@ __metadata: languageName: node linkType: hard +"cjs-module-lexer@npm:^1.2.2": + version: 1.4.3 + resolution: "cjs-module-lexer@npm:1.4.3" + checksum: 10c0/076b3af85adc4d65dbdab1b5b240fe5b45d44fcf0ef9d429044dd94d19be5589376805c44fb2d4b3e684e5fe6a9b7cf3e426476a6507c45283c5fc6ff95240be + languageName: node + linkType: hard + "clean-css@npm:^5.2.2": version: 5.3.3 resolution: "clean-css@npm:5.3.3" @@ -4304,6 +4722,15 @@ __metadata: languageName: node linkType: hard +"clone-response@npm:^1.0.2": + version: 1.0.3 + resolution: "clone-response@npm:1.0.3" + dependencies: + mimic-response: "npm:^1.0.0" + checksum: 10c0/06a2b611824efb128810708baee3bd169ec9a1bf5976a5258cd7eb3f7db25f00166c6eee5961f075c7e38e194f373d4fdf86b8166ad5b9c7e82bbd2e333a6087 + languageName: node + linkType: hard + "clone@npm:^1.0.2": version: 1.0.4 resolution: "clone@npm:1.0.4" @@ -4770,6 +5197,13 @@ __metadata: languageName: node linkType: hard +"crypto-randomuuid@npm:^1.0.0": + version: 1.0.0 + resolution: "crypto-randomuuid@npm:1.0.0" + checksum: 10c0/6c8f7513f3b0c38b876b5011d91e21c284f7a695d27b6ef25a2a1ca89c362af23e321bf47953069b9fe56bc384de7880a13c390a4663ac5dcf525a1b4f937a1f + languageName: node + linkType: hard + "css-loader@npm:7.1.2": version: 7.1.2 resolution: "css-loader@npm:7.1.2" @@ -4908,6 +5342,58 @@ __metadata: languageName: node linkType: hard +"dc-polyfill@npm:^0.1.10": + version: 0.1.10 + resolution: "dc-polyfill@npm:0.1.10" + checksum: 10c0/b4a847b5883fb3bc1173d48b98d2aa554af12b427b13d3f5fbd31a4d4cbfc733d8134e261e442ac890df3606f97e5440b603ff72d0c9cd62ac2e5f3cbc52aa6d + languageName: node + linkType: hard + +"dd-trace@npm:^5.76.0": + version: 5.79.0 + resolution: "dd-trace@npm:5.79.0" + dependencies: + "@datadog/libdatadog": "npm:0.7.0" + "@datadog/native-appsec": "npm:10.3.0" + "@datadog/native-iast-taint-tracking": "npm:4.0.0" + "@datadog/native-metrics": "npm:3.1.1" + "@datadog/openfeature-node-server": "npm:^0.2.0" + "@datadog/pprof": "npm:5.12.0" + "@datadog/sketches-js": "npm:2.1.1" + "@datadog/wasm-js-rewriter": "npm:5.0.1" + "@isaacs/ttlcache": "npm:^2.0.1" + "@opentelemetry/api": "npm:>=1.0.0 <1.10.0" + "@opentelemetry/api-logs": "npm:<1.0.0" + "@opentelemetry/core": "npm:>=1.14.0 <1.31.0" + "@opentelemetry/resources": "npm:>=1.0.0 <1.31.0" + crypto-randomuuid: "npm:^1.0.0" + dc-polyfill: "npm:^0.1.10" + escape-string-regexp: "npm:^5.0.0" + ignore: "npm:^7.0.5" + import-in-the-middle: "npm:^1.14.2" + istanbul-lib-coverage: "npm:^3.2.2" + jest-docblock: "npm:^29.7.0" + jsonpath-plus: "npm:^10.3.0" + limiter: "npm:^1.1.5" + lodash.sortby: "npm:^4.7.0" + lru-cache: "npm:^10.4.3" + module-details-from-path: "npm:^1.0.4" + mutexify: "npm:^1.4.0" + opentracing: "npm:>=0.14.7" + path-to-regexp: "npm:^0.1.12" + pprof-format: "npm:^2.1.1" + protobufjs: "npm:^7.5.3" + retry: "npm:^0.13.1" + rfdc: "npm:^1.4.1" + semifies: "npm:^1.0.0" + shell-quote: "npm:^1.8.2" + source-map: "npm:^0.7.4" + tlhunter-sorted-set: "npm:^0.1.0" + ttl-set: "npm:^1.0.0" + checksum: 10c0/999e637857f1c69504e27a15e60a978225292f61cd5480e645fae865dd1b3b66f2208011fb502838d87730669da1035d1c7b9e4d7a6880c8b15970f8746fd893 + languageName: node + linkType: hard + "debug@npm:2.6.9": version: 2.6.9 resolution: "debug@npm:2.6.9" @@ -4967,6 +5453,15 @@ __metadata: languageName: node linkType: hard +"decompress-response@npm:^6.0.0": + version: 6.0.0 + resolution: "decompress-response@npm:6.0.0" + dependencies: + mimic-response: "npm:^3.1.0" + checksum: 10c0/bd89d23141b96d80577e70c54fb226b2f40e74a6817652b80a116d7befb8758261ad073a8895648a29cc0a5947021ab66705cb542fa9c143c82022b27c5b175e + languageName: node + linkType: hard + "dedent@npm:1.5.3": version: 1.5.3 resolution: "dedent@npm:1.5.3" @@ -5012,6 +5507,13 @@ __metadata: languageName: node linkType: hard +"defer-to-connect@npm:^2.0.0": + version: 2.0.1 + resolution: "defer-to-connect@npm:2.0.1" + checksum: 10c0/625ce28e1b5ad10cf77057b9a6a727bf84780c17660f6644dab61dd34c23de3001f03cedc401f7d30a4ed9965c2e8a7336e220a329146f2cf85d4eddea429782 + languageName: node + linkType: hard + "define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.4": version: 1.1.4 resolution: "define-data-property@npm:1.1.4" @@ -5059,6 +5561,13 @@ __metadata: languageName: node linkType: hard +"delay@npm:^5.0.0": + version: 5.0.0 + resolution: "delay@npm:5.0.0" + checksum: 10c0/01cdc4cd0cd35fb622518a3df848e67e09763a38e7cdada2232b6fda9ddda72eddcf74f0e24211200fbe718434f2335f2a2633875a6c96037fefa6de42896ad7 + languageName: node + linkType: hard + "delayed-stream@npm:~1.0.0": version: 1.0.0 resolution: "delayed-stream@npm:1.0.0" @@ -5101,6 +5610,13 @@ __metadata: languageName: node linkType: hard +"detect-newline@npm:^3.0.0": + version: 3.1.0 + resolution: "detect-newline@npm:3.1.0" + checksum: 10c0/c38cfc8eeb9fda09febb44bcd85e467c970d4e3bf526095394e5a4f18bc26dd0cf6b22c69c1fa9969261521c593836db335c2795218f6d781a512aea2fb8209d + languageName: node + linkType: hard + "detect-node-es@npm:^1.1.0": version: 1.1.0 resolution: "detect-node-es@npm:1.1.0" @@ -5305,6 +5821,19 @@ __metadata: languageName: node linkType: hard +"electron@npm:39": + version: 39.2.1 + resolution: "electron@npm:39.2.1" + dependencies: + "@electron/get": "npm:^2.0.0" + "@types/node": "npm:^22.7.7" + extract-zip: "npm:^2.0.1" + bin: + electron: cli.js + checksum: 10c0/bb5356701d8dc36dfe49b916c39bf00161463b1e5c6c868a089616da68d7117ed32258c294281c8a7c266f50864ff3d815724d51e298ad38dd4e13ab1bab17fa + languageName: node + linkType: hard + "emoji-name-map@npm:2.0.3": version: 2.0.3 resolution: "emoji-name-map@npm:2.0.3" @@ -5620,6 +6149,13 @@ __metadata: languageName: node linkType: hard +"es6-error@npm:^4.1.1": + version: 4.1.1 + resolution: "es6-error@npm:4.1.1" + checksum: 10c0/357663fb1e845c047d548c3d30f86e005db71e122678f4184ced0693f634688c3f3ef2d7de7d4af732f734de01f528b05954e270f06aa7d133679fb9fe6600ef + languageName: node + linkType: hard + "es6-iterator@npm:^2.0.3": version: 2.0.3 resolution: "es6-iterator@npm:2.0.3" @@ -5697,6 +6233,13 @@ __metadata: languageName: node linkType: hard +"escape-string-regexp@npm:^5.0.0": + version: 5.0.0 + resolution: "escape-string-regexp@npm:5.0.0" + checksum: 10c0/6366f474c6f37a802800a435232395e04e9885919873e382b157ab7e8f0feb8fed71497f84a6f6a81a49aab41815522f5839112bd38026d203aea0c91622df95 + languageName: node + linkType: hard + "escodegen@npm:^2.1.0": version: 2.1.0 resolution: "escodegen@npm:2.1.0" @@ -6900,6 +7443,20 @@ __metadata: languageName: node linkType: hard +"global-agent@npm:^3.0.0": + version: 3.0.0 + resolution: "global-agent@npm:3.0.0" + dependencies: + boolean: "npm:^3.0.1" + es6-error: "npm:^4.1.1" + matcher: "npm:^3.0.0" + roarr: "npm:^2.15.3" + semver: "npm:^7.3.2" + serialize-error: "npm:^7.0.1" + checksum: 10c0/bb8750d026b25da437072762fd739098bad92ff72f66483c3929db4579e072f5523960f7e7fd70ee0d75db48898067b5dc1c9c1d17888128cff008fcc34d1bd3 + languageName: node + linkType: hard + "globals@npm:16.5.0, globals@npm:^16.4.0": version: 16.5.0 resolution: "globals@npm:16.5.0" @@ -6914,7 +7471,7 @@ __metadata: languageName: node linkType: hard -"globalthis@npm:^1.0.4": +"globalthis@npm:^1.0.1, globalthis@npm:^1.0.4": version: 1.0.4 resolution: "globalthis@npm:1.0.4" dependencies: @@ -6931,6 +7488,25 @@ __metadata: languageName: node linkType: hard +"got@npm:^11.8.5": + version: 11.8.6 + resolution: "got@npm:11.8.6" + dependencies: + "@sindresorhus/is": "npm:^4.0.0" + "@szmarczak/http-timer": "npm:^4.0.5" + "@types/cacheable-request": "npm:^6.0.1" + "@types/responselike": "npm:^1.0.0" + cacheable-lookup: "npm:^5.0.3" + cacheable-request: "npm:^7.0.2" + decompress-response: "npm:^6.0.0" + http2-wrapper: "npm:^1.0.0-beta.5.2" + lowercase-keys: "npm:^2.0.0" + p-cancelable: "npm:^2.0.0" + responselike: "npm:^2.0.0" + checksum: 10c0/754dd44877e5cf6183f1e989ff01c648d9a4719e357457bd4c78943911168881f1cfb7b2cb15d885e2105b3ad313adb8f017a67265dd7ade771afdb261ee8cb1 + languageName: node + linkType: hard + "graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.15, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.10, graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" @@ -6945,6 +7521,13 @@ __metadata: languageName: node linkType: hard +"graphql@npm:16.12.0": + version: 16.12.0 + resolution: "graphql@npm:16.12.0" + checksum: 10c0/b6fffa4e8a4e4a9933ebe85e7470b346dbf49050c1a482fac5e03e4a1a7bed2ecd3a4c97e29f04457af929464bc5e4f2aac991090c2f320111eef26e902a5c75 + languageName: node + linkType: hard + "handle-thing@npm:^2.0.0": version: 2.0.1 resolution: "handle-thing@npm:2.0.1" @@ -7169,7 +7752,7 @@ __metadata: languageName: node linkType: hard -"http-cache-semantics@npm:^4.1.1": +"http-cache-semantics@npm:^4.0.0, http-cache-semantics@npm:^4.1.1": version: 4.2.0 resolution: "http-cache-semantics@npm:4.2.0" checksum: 10c0/45b66a945cf13ec2d1f29432277201313babf4a01d9e52f44b31ca923434083afeca03f18417f599c9ab3d0e7b618ceb21257542338b57c54b710463b4a53e37 @@ -7277,6 +7860,16 @@ __metadata: languageName: node linkType: hard +"http2-wrapper@npm:^1.0.0-beta.5.2": + version: 1.0.3 + resolution: "http2-wrapper@npm:1.0.3" + dependencies: + quick-lru: "npm:^5.1.1" + resolve-alpn: "npm:^1.0.0" + checksum: 10c0/6a9b72a033e9812e1476b9d776ce2f387bc94bc46c88aea0d5dab6bd47d0a539b8178830e77054dd26d1142c866d515a28a4dc7c3ff4232c88ff2ebe4f5d12d1 + languageName: node + linkType: hard + "https-proxy-agent@npm:^2.2.1": version: 2.2.4 resolution: "https-proxy-agent@npm:2.2.4" @@ -7380,7 +7973,7 @@ __metadata: languageName: node linkType: hard -"ignore@npm:^7.0.0": +"ignore@npm:^7.0.0, ignore@npm:^7.0.5": version: 7.0.5 resolution: "ignore@npm:7.0.5" checksum: 10c0/ae00db89fe873064a093b8999fe4cc284b13ef2a178636211842cceb650b9c3e390d3339191acb145d81ed5379d2074840cf0c33a20bdbd6f32821f79eb4ad5d @@ -7397,6 +7990,18 @@ __metadata: languageName: node linkType: hard +"import-in-the-middle@npm:^1.14.2": + version: 1.15.0 + resolution: "import-in-the-middle@npm:1.15.0" + dependencies: + acorn: "npm:^8.14.0" + acorn-import-attributes: "npm:^1.9.5" + cjs-module-lexer: "npm:^1.2.2" + module-details-from-path: "npm:^1.0.3" + checksum: 10c0/43d4efbe75a89c04343fd052ca5d2193adc0e2df93325e50d8b32c31403b2f089a5e2b6e47f4e5413bc4058b9781aaaf61bfe3f0e5e6d7f9487eb112fd095e0d + languageName: node + linkType: hard + "import-local@npm:3.1.0": version: 3.1.0 resolution: "import-local@npm:3.1.0" @@ -8030,7 +8635,7 @@ __metadata: languageName: node linkType: hard -"istanbul-lib-coverage@npm:^3.0.0": +"istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.2": version: 3.2.2 resolution: "istanbul-lib-coverage@npm:3.2.2" checksum: 10c0/6c7ff2106769e5f592ded1fb418f9f73b4411fd5a084387a5410538332b6567cd1763ff6b6cadca9b9eb2c443cce2f7ea7d7f1b8d315f9ce58539793b1e0922b @@ -8137,6 +8742,15 @@ __metadata: languageName: node linkType: hard +"jest-docblock@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-docblock@npm:29.7.0" + dependencies: + detect-newline: "npm:^3.0.0" + checksum: 10c0/d932a8272345cf6b6142bb70a2bb63e0856cc0093f082821577ea5bdf4643916a98744dfc992189d2b1417c38a11fa42466f6111526bc1fb81366f56410f3be9 + languageName: node + linkType: hard + "jest-worker@npm:^27.4.5": version: 27.5.1 resolution: "jest-worker@npm:27.5.1" @@ -8185,6 +8799,13 @@ __metadata: languageName: node linkType: hard +"jsep@npm:^1.4.0": + version: 1.4.0 + resolution: "jsep@npm:1.4.0" + checksum: 10c0/fe60adf47e050e22eadced42514a51a15a3cf0e2d147896584486acd8ee670fc16641101b9aeb81f4aaba382043d29744b7aac41171e8106515b14f27e0c7116 + languageName: node + linkType: hard + "jsesc@npm:^3.0.2, jsesc@npm:^3.1.0, jsesc@npm:~3.1.0": version: 3.1.0 resolution: "jsesc@npm:3.1.0" @@ -8347,6 +8968,20 @@ __metadata: languageName: node linkType: hard +"jsonpath-plus@npm:^10.3.0": + version: 10.3.0 + resolution: "jsonpath-plus@npm:10.3.0" + dependencies: + "@jsep-plugin/assignment": "npm:^1.3.0" + "@jsep-plugin/regex": "npm:^1.0.4" + jsep: "npm:^1.4.0" + bin: + jsonpath: bin/jsonpath-cli.js + jsonpath-plus: bin/jsonpath-cli.js + checksum: 10c0/f5ff53078ecab98e8afd1dcdb4488e528653fa5a03a32d671f52db1ae9c3236e6e072d75e1949a80929fd21b07603924a586f829b40ad35993fa0247fa4f7506 + languageName: node + linkType: hard + "junk@npm:^4.0.1": version: 4.0.1 resolution: "junk@npm:4.0.1" @@ -8493,7 +9128,7 @@ __metadata: languageName: node linkType: hard -"keyv@npm:^4.5.4": +"keyv@npm:^4.0.0, keyv@npm:^4.5.4": version: 4.5.4 resolution: "keyv@npm:4.5.4" dependencies: @@ -8642,6 +9277,13 @@ __metadata: languageName: node linkType: hard +"limiter@npm:^1.1.5": + version: 1.1.5 + resolution: "limiter@npm:1.1.5" + checksum: 10c0/ebe2b20a820d1f67b8e1724051246434c419b2da041a7e9cd943f6daf113b8d17a52a1bd88fb79be5b624c10283ecb737f50edb5c1c88c71f4cd367108c97300 + languageName: node + linkType: hard + "lines-and-columns@npm:2.0.3": version: 2.0.3 resolution: "lines-and-columns@npm:2.0.3" @@ -8749,6 +9391,13 @@ __metadata: languageName: node linkType: hard +"lodash.sortby@npm:^4.7.0": + version: 4.7.0 + resolution: "lodash.sortby@npm:4.7.0" + checksum: 10c0/fc48fb54ff7669f33bb32997cab9460757ee99fafaf72400b261c3e10fde21538e47d8cfcbe6a25a31bcb5b7b727c27d52626386fc2de24eb059a6d64a89cdf5 + languageName: node + linkType: hard + "lodash@npm:^4.17.15, lodash@npm:^4.17.20, lodash@npm:^4.17.21": version: 4.17.21 resolution: "lodash@npm:4.17.21" @@ -8779,6 +9428,13 @@ __metadata: languageName: node linkType: hard +"long@npm:^5.0.0": + version: 5.3.2 + resolution: "long@npm:5.3.2" + checksum: 10c0/7130fe1cbce2dca06734b35b70d380ca3f70271c7f8852c922a7c62c86c4e35f0c39290565eca7133c625908d40e126ac57c02b1b1a4636b9457d77e1e60b981 + languageName: node + linkType: hard + "lower-case@npm:^2.0.2": version: 2.0.2 resolution: "lower-case@npm:2.0.2" @@ -8788,7 +9444,14 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0, lru-cache@npm:^10.2.2": +"lowercase-keys@npm:^2.0.0": + version: 2.0.0 + resolution: "lowercase-keys@npm:2.0.0" + checksum: 10c0/f82a2b3568910509da4b7906362efa40f5b54ea14c2584778ddb313226f9cbf21020a5db35f9b9a0e95847a9b781d548601f31793d736b22a2b8ae8eb9ab1082 + languageName: node + linkType: hard + +"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0, lru-cache@npm:^10.2.2, lru-cache@npm:^10.4.3": version: 10.4.3 resolution: "lru-cache@npm:10.4.3" checksum: 10c0/ebd04fbca961e6c1d6c0af3799adcc966a1babe798f685bb84e6599266599cd95d94630b10262f5424539bc4640107e8a33aa28585374abf561d30d16f4b39fb @@ -8820,7 +9483,7 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^7.14.1": +"lru-cache@npm:^7.14.0, lru-cache@npm:^7.14.1": version: 7.18.3 resolution: "lru-cache@npm:7.18.3" checksum: 10c0/b3a452b491433db885beed95041eb104c157ef7794b9c9b4d647be503be91769d11206bb573849a16b4cc0d03cbd15ffd22df7960997788b74c1d399ac7a4fed @@ -8944,6 +9607,15 @@ __metadata: languageName: node linkType: hard +"matcher@npm:^3.0.0": + version: 3.0.0 + resolution: "matcher@npm:3.0.0" + dependencies: + escape-string-regexp: "npm:^4.0.0" + checksum: 10c0/2edf24194a2879690bcdb29985fc6bc0d003df44e04df21ebcac721fa6ce2f6201c579866bb92f9380bffe946f11ecd8cd31f34117fb67ebf8aca604918e127e + languageName: node + linkType: hard + "math-intrinsics@npm:^1.1.0": version: 1.1.0 resolution: "math-intrinsics@npm:1.1.0" @@ -9132,6 +9804,20 @@ __metadata: languageName: node linkType: hard +"mimic-response@npm:^1.0.0": + version: 1.0.1 + resolution: "mimic-response@npm:1.0.1" + checksum: 10c0/c5381a5eae997f1c3b5e90ca7f209ed58c3615caeee850e85329c598f0c000ae7bec40196580eef1781c60c709f47258131dab237cad8786f8f56750594f27fa + languageName: node + linkType: hard + +"mimic-response@npm:^3.1.0": + version: 3.1.0 + resolution: "mimic-response@npm:3.1.0" + checksum: 10c0/0d6f07ce6e03e9e4445bee655202153bdb8a98d67ee8dc965ac140900d7a2688343e6b4c9a72cfc9ef2f7944dfd76eef4ab2482eb7b293a68b84916bac735362 + languageName: node + linkType: hard + "min-indent@npm:^1.0.0": version: 1.0.1 resolution: "min-indent@npm:1.0.1" @@ -9361,6 +10047,13 @@ __metadata: languageName: node linkType: hard +"module-details-from-path@npm:^1.0.3, module-details-from-path@npm:^1.0.4": + version: 1.0.4 + resolution: "module-details-from-path@npm:1.0.4" + checksum: 10c0/10863413e96dab07dee917eae07afe46f7bf853065cc75a7d2a718adf67574857fb64f8a2c0c9af12ac733a9a8cf652db7ed39b95f7a355d08106cb9cc50c83b + languageName: node + linkType: hard + "ms@npm:2.0.0": version: 2.0.0 resolution: "ms@npm:2.0.0" @@ -9416,6 +10109,15 @@ __metadata: languageName: node linkType: hard +"mutexify@npm:^1.4.0": + version: 1.4.0 + resolution: "mutexify@npm:1.4.0" + dependencies: + queue-tick: "npm:^1.0.0" + checksum: 10c0/0b2fad0c671cef33ad3596d702b581e5bb3708ec7ba2913639cfb1642c7f5093af9d8793b38eafe1b723e7879d60419d2e96c5e7793271e0167833a7939ac66d + languageName: node + linkType: hard + "mz@npm:^2.7.0": version: 2.7.0 resolution: "mz@npm:2.7.0" @@ -9495,6 +10197,15 @@ __metadata: languageName: node linkType: hard +"node-addon-api@npm:^6.1.0": + version: 6.1.0 + resolution: "node-addon-api@npm:6.1.0" + dependencies: + node-gyp: "npm:latest" + checksum: 10c0/d2699c4ad15740fd31482a3b6fca789af7723ab9d393adc6ac45250faaee72edad8f0b10b2b9d087df0de93f1bdc16d97afdd179b26b9ebc9ed68b569faa4bac + languageName: node + linkType: hard + "node-forge@npm:1.3.1, node-forge@npm:^1": version: 1.3.1 resolution: "node-forge@npm:1.3.1" @@ -9502,6 +10213,28 @@ __metadata: languageName: node linkType: hard +"node-gyp-build@npm:<4.0, node-gyp-build@npm:^3.9.0": + version: 3.9.0 + resolution: "node-gyp-build@npm:3.9.0" + bin: + node-gyp-build: ./bin.js + node-gyp-build-optional: ./optional.js + node-gyp-build-test: ./build-test.js + checksum: 10c0/0e7e39e5746728e6adf58803d9c3c732b6107f1af3df5128c4c2a6c9c0fb99a6c981ad0a7514d707adccbcfe303b4a92da7949408f1d3ec281f70d37bec29f60 + languageName: node + linkType: hard + +"node-gyp-build@npm:^4.5.0": + version: 4.8.4 + resolution: "node-gyp-build@npm:4.8.4" + bin: + node-gyp-build: bin.js + node-gyp-build-optional: optional.js + node-gyp-build-test: build-test.js + checksum: 10c0/444e189907ece2081fe60e75368784f7782cfddb554b60123743dfb89509df89f1f29c03bbfa16b3a3e0be3f48799a4783f487da6203245fa5bed239ba7407e1 + languageName: node + linkType: hard + "node-gyp@npm:^11.0.0, node-gyp@npm:latest": version: 11.5.0 resolution: "node-gyp@npm:11.5.0" @@ -9578,6 +10311,13 @@ __metadata: languageName: node linkType: hard +"normalize-url@npm:^6.0.1": + version: 6.1.0 + resolution: "normalize-url@npm:6.1.0" + checksum: 10c0/95d948f9bdd2cfde91aa786d1816ae40f8262946e13700bf6628105994fe0ff361662c20af3961161c38a119dc977adeb41fc0b41b1745eb77edaaf9cb22db23 + languageName: node + linkType: hard + "npm-bundled@npm:^4.0.0": version: 4.0.0 resolution: "npm-bundled@npm:4.0.0" @@ -10008,6 +10748,13 @@ __metadata: languageName: node linkType: hard +"opentracing@npm:>=0.14.7": + version: 0.14.7 + resolution: "opentracing@npm:0.14.7" + checksum: 10c0/a7be8d697b1997548233423f5f4c196e285af8e864a24d7704fc6029beb73cd1f987651ca814e207629c6bc624cb03297a86601c0dc51cdca9a07a20f97b71ea + languageName: node + linkType: hard + "optionator@npm:^0.9.3": version: 0.9.4 resolution: "optionator@npm:0.9.4" @@ -10049,6 +10796,13 @@ __metadata: languageName: node linkType: hard +"p-cancelable@npm:^2.0.0": + version: 2.1.1 + resolution: "p-cancelable@npm:2.1.1" + checksum: 10c0/8c6dc1f8dd4154fd8b96a10e55a3a832684c4365fb9108056d89e79fbf21a2465027c04a59d0d797b5ffe10b54a61a32043af287d5c4860f1e996cbdbc847f01 + languageName: node + linkType: hard + "p-finally@npm:^1.0.0": version: 1.0.0 resolution: "p-finally@npm:1.0.0" @@ -10074,7 +10828,7 @@ __metadata: languageName: node linkType: hard -"p-limit@npm:^3.0.2": +"p-limit@npm:^3.0.2, p-limit@npm:^3.1.0": version: 3.1.0 resolution: "p-limit@npm:3.1.0" dependencies: @@ -10452,7 +11206,7 @@ __metadata: languageName: node linkType: hard -"path-to-regexp@npm:0.1.12": +"path-to-regexp@npm:0.1.12, path-to-regexp@npm:^0.1.12": version: 0.1.12 resolution: "path-to-regexp@npm:0.1.12" checksum: 10c0/1c6ff10ca169b773f3bba943bbc6a07182e332464704572962d277b900aeee81ac6aa5d060ff9e01149636c30b1f63af6e69dd7786ba6e0ddb39d4dee1f0645b @@ -10681,6 +11435,13 @@ __metadata: languageName: node linkType: hard +"pprof-format@npm:^2.1.1, pprof-format@npm:^2.2.1": + version: 2.2.1 + resolution: "pprof-format@npm:2.2.1" + checksum: 10c0/1c8051b3e3ebba1ac2b8d7cf0a84ce501fdabe5e72a803c7daa6ddf67cbee33e9b5d6dbc6ffbeb740e3e56600c875f372576304ed718a4ffa4c89c18185494ae + languageName: node + linkType: hard + "prelude-ls@npm:^1.2.1": version: 1.2.1 resolution: "prelude-ls@npm:1.2.1" @@ -10795,6 +11556,26 @@ __metadata: languageName: node linkType: hard +"protobufjs@npm:^7.5.3": + version: 7.5.4 + resolution: "protobufjs@npm:7.5.4" + dependencies: + "@protobufjs/aspromise": "npm:^1.1.2" + "@protobufjs/base64": "npm:^1.1.2" + "@protobufjs/codegen": "npm:^2.0.4" + "@protobufjs/eventemitter": "npm:^1.1.0" + "@protobufjs/fetch": "npm:^1.1.0" + "@protobufjs/float": "npm:^1.0.2" + "@protobufjs/inquire": "npm:^1.1.0" + "@protobufjs/path": "npm:^1.1.2" + "@protobufjs/pool": "npm:^1.1.0" + "@protobufjs/utf8": "npm:^1.1.0" + "@types/node": "npm:>=13.7.0" + long: "npm:^5.0.0" + checksum: 10c0/913b676109ffb3c05d3d31e03a684e569be91f3bba8613da4a683d69d9dba948daa2afd7d2e7944d1aa6c417890c35d9d9a8883c1160affafb0f9670d59ef722 + languageName: node + linkType: hard + "protocols@npm:^2.0.0, protocols@npm:^2.0.1": version: 2.0.2 resolution: "protocols@npm:2.0.2" @@ -10947,6 +11728,13 @@ __metadata: languageName: node linkType: hard +"queue-tick@npm:^1.0.0": + version: 1.0.1 + resolution: "queue-tick@npm:1.0.1" + checksum: 10c0/0db998e2c9b15215317dbcf801e9b23e6bcde4044e115155dae34f8e7454b9a783f737c9a725528d677b7a66c775eb7a955cf144fe0b87f62b575ce5bfd515a9 + languageName: node + linkType: hard + "quick-lru@npm:^4.0.1": version: 4.0.1 resolution: "quick-lru@npm:4.0.1" @@ -10954,6 +11742,13 @@ __metadata: languageName: node linkType: hard +"quick-lru@npm:^5.1.1": + version: 5.1.1 + resolution: "quick-lru@npm:5.1.1" + checksum: 10c0/a24cba5da8cec30d70d2484be37622580f64765fb6390a928b17f60cd69e8dbd32a954b3ff9176fa1b86d86ff2ba05252fae55dc4d40d0291c60412b0ad096da + languageName: node + linkType: hard + "randombytes@npm:^2.1.0": version: 2.1.0 resolution: "randombytes@npm:2.1.0" @@ -11391,6 +12186,13 @@ __metadata: languageName: node linkType: hard +"resolve-alpn@npm:^1.0.0": + version: 1.2.1 + resolution: "resolve-alpn@npm:1.2.1" + checksum: 10c0/b70b29c1843bc39781ef946c8cd4482e6d425976599c0f9c138cec8209e4e0736161bf39319b01676a847000085dfdaf63583c6fb4427bf751a10635bd2aa0c4 + languageName: node + linkType: hard + "resolve-cwd@npm:^3.0.0": version: 3.0.0 resolution: "resolve-cwd@npm:3.0.0" @@ -11447,6 +12249,15 @@ __metadata: languageName: node linkType: hard +"responselike@npm:^2.0.0": + version: 2.0.1 + resolution: "responselike@npm:2.0.1" + dependencies: + lowercase-keys: "npm:^2.0.0" + checksum: 10c0/360b6deb5f101a9f8a4174f7837c523c3ec78b7ca8a7c1d45a1062b303659308a23757e318b1e91ed8684ad1205721142dd664d94771cd63499353fd4ee732b5 + languageName: node + linkType: hard + "restore-cursor@npm:^3.1.0": version: 3.1.0 resolution: "restore-cursor@npm:3.1.0" @@ -11478,7 +12289,7 @@ __metadata: languageName: node linkType: hard -"rfdc@npm:^1.3.0": +"rfdc@npm:^1.3.0, rfdc@npm:^1.4.1": version: 1.4.1 resolution: "rfdc@npm:1.4.1" checksum: 10c0/4614e4292356cafade0b6031527eea9bc90f2372a22c012313be1dcc69a3b90c7338158b414539be863fa95bfcb2ddcd0587be696841af4e6679d85e62c060c7 @@ -11529,6 +12340,20 @@ __metadata: languageName: node linkType: hard +"roarr@npm:^2.15.3": + version: 2.15.4 + resolution: "roarr@npm:2.15.4" + dependencies: + boolean: "npm:^3.0.1" + detect-node: "npm:^2.0.4" + globalthis: "npm:^1.0.1" + json-stringify-safe: "npm:^5.0.1" + semver-compare: "npm:^1.0.0" + sprintf-js: "npm:^1.1.2" + checksum: 10c0/7d01d4c14513c461778dd673a8f9e53255221f8d04173aafeb8e11b23d8b659bb83f1c90cfe81af7f9c213b8084b404b918108fd792bda76678f555340cc64ec + languageName: node + linkType: hard + "router@npm:^2.2.0": version: 2.2.0 resolution: "router@npm:2.2.0" @@ -11683,6 +12508,20 @@ __metadata: languageName: node linkType: hard +"semifies@npm:^1.0.0": + version: 1.0.0 + resolution: "semifies@npm:1.0.0" + checksum: 10c0/d93d5e8d2c0b7d5f972b9378736ed5cc1f2ab40d043234b4156665872f08cb0da914ee8c8b35c59dc6b17880a4c5502588c7515c6bb4dbc3ce5565746428d31d + languageName: node + linkType: hard + +"semver-compare@npm:^1.0.0": + version: 1.0.0 + resolution: "semver-compare@npm:1.0.0" + checksum: 10c0/9ef4d8b81847556f0865f46ddc4d276bace118c7cb46811867af82e837b7fc473911981d5a0abc561fa2db487065572217e5b06e18701c4281bcdd2a1affaff1 + languageName: node + linkType: hard + "semver@npm:2 || 3 || 4 || 5, semver@npm:^5.6.0": version: 5.7.2 resolution: "semver@npm:5.7.2" @@ -11701,7 +12540,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^6.3.0, semver@npm:^6.3.1": +"semver@npm:^6.2.0, semver@npm:^6.3.0, semver@npm:^6.3.1": version: 6.3.1 resolution: "semver@npm:6.3.1" bin: @@ -11710,7 +12549,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.0.0, semver@npm:^7.1.1, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.7.2, semver@npm:^7.7.3": +"semver@npm:^7.0.0, semver@npm:^7.1.1, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.7.2, semver@npm:^7.7.3": version: 7.7.3 resolution: "semver@npm:7.7.3" bin: @@ -11759,6 +12598,15 @@ __metadata: languageName: node linkType: hard +"serialize-error@npm:^7.0.1": + version: 7.0.1 + resolution: "serialize-error@npm:7.0.1" + dependencies: + type-fest: "npm:^0.13.1" + checksum: 10c0/7982937d578cd901276c8ab3e2c6ed8a4c174137730f1fb0402d005af209a0e84d04acc874e317c936724c7b5b26c7a96ff7e4b8d11a469f4924a4b0ea814c05 + languageName: node + linkType: hard + "serialize-javascript@npm:^6.0.2": version: 6.0.2 resolution: "serialize-javascript@npm:6.0.2" @@ -11897,7 +12745,7 @@ __metadata: languageName: node linkType: hard -"shell-quote@npm:^1.8.3": +"shell-quote@npm:^1.8.2, shell-quote@npm:^1.8.3": version: 1.8.3 resolution: "shell-quote@npm:1.8.3" checksum: 10c0/bee87c34e1e986cfb4c30846b8e6327d18874f10b535699866f368ade11ea4ee45433d97bf5eada22c4320c27df79c3a6a7eb1bf3ecfc47f2c997d9e5e2672fd @@ -12115,6 +12963,13 @@ __metadata: languageName: node linkType: hard +"spark-md5@npm:^3.0.2": + version: 3.0.2 + resolution: "spark-md5@npm:3.0.2" + checksum: 10c0/3fd11735eac5e7d60d6006d99ac0a055f148a89e9baf5f0b51ac103022dec30556b44190b37f6737ca50f81e8e50dc13e724f9edf6290c412ff5ab2101ce7780 + languageName: node + linkType: hard + "spdx-correct@npm:^3.0.0": version: 3.2.0 resolution: "spdx-correct@npm:3.2.0" @@ -12213,6 +13068,13 @@ __metadata: languageName: node linkType: hard +"sprintf-js@npm:^1.1.2": + version: 1.1.3 + resolution: "sprintf-js@npm:1.1.3" + checksum: 10c0/09270dc4f30d479e666aee820eacd9e464215cdff53848b443964202bf4051490538e5dd1b42e1a65cf7296916ca17640aebf63dae9812749c7542ee5f288dec + languageName: node + linkType: hard + "sprintf-js@npm:~1.0.2": version: 1.0.3 resolution: "sprintf-js@npm:1.0.3" @@ -12454,6 +13316,15 @@ __metadata: languageName: node linkType: hard +"sumchecker@npm:^3.0.1": + version: 3.0.1 + resolution: "sumchecker@npm:3.0.1" + dependencies: + debug: "npm:^4.1.0" + checksum: 10c0/43c387be9dfe22dbeaf39dfa4ffb279847aeb37a42a8988c0b066f548bbd209aa8c65e03da29f2b29be1a66b577801bf89fff0007df4183db2f286263a9569e5 + languageName: node + linkType: hard + "supports-color@npm:^7.1.0": version: 7.2.0 resolution: "supports-color@npm:7.2.0" @@ -12728,6 +13599,13 @@ __metadata: languageName: node linkType: hard +"tlhunter-sorted-set@npm:^0.1.0": + version: 0.1.0 + resolution: "tlhunter-sorted-set@npm:0.1.0" + checksum: 10c0/fd07870aa75331fb7823e68604fda3bafb6aaef5cea8d342a3c24096635fd2c70273a330b00013e51cbde25272ae599de1270edeff972bd3c32e1c78e714edc6 + languageName: node + linkType: hard + "tmp@npm:^0.2.1, tmp@npm:~0.2.1": version: 0.2.5 resolution: "tmp@npm:0.2.5" @@ -12898,6 +13776,15 @@ __metadata: languageName: node linkType: hard +"ttl-set@npm:^1.0.0": + version: 1.0.0 + resolution: "ttl-set@npm:1.0.0" + dependencies: + fast-fifo: "npm:^1.3.2" + checksum: 10c0/ef260c2a903c4ab05090d4dbc21ddb738d7f38fd9680570582414b9115a7c358796c82f5b19067262eabb7476e43b7a2f02e3bb4cace85edee3242aee745d4d3 + languageName: node + linkType: hard + "tuf-js@npm:^3.0.1": version: 3.1.0 resolution: "tuf-js@npm:3.1.0" @@ -12929,6 +13816,13 @@ __metadata: languageName: node linkType: hard +"type-fest@npm:^0.13.1": + version: 0.13.1 + resolution: "type-fest@npm:0.13.1" + checksum: 10c0/0c0fa07ae53d4e776cf4dac30d25ad799443e9eef9226f9fddbb69242db86b08584084a99885cfa5a9dfe4c063ebdc9aa7b69da348e735baede8d43f1aeae93b + languageName: node + linkType: hard + "type-fest@npm:^0.18.0": version: 0.18.1 resolution: "type-fest@npm:0.18.1" @@ -13148,6 +14042,13 @@ __metadata: languageName: node linkType: hard +"undici-types@npm:~6.21.0": + version: 6.21.0 + resolution: "undici-types@npm:6.21.0" + checksum: 10c0/c01ed51829b10aa72fc3ce64b747f8e74ae9b60eafa19a7b46ef624403508a54c526ffab06a14a26b3120d055e1104d7abe7c9017e83ced038ea5cf52f8d5e04 + languageName: node + linkType: hard + "undici-types@npm:~7.16.0": version: 7.16.0 resolution: "undici-types@npm:7.16.0"