UNPKG

highlight.run

Version:

Open source, fullstack monitoring. Capture frontend errors, record server side logs, and visualize what broke with session replay.

176 lines (175 loc) 8.02 kB
import { eventWithTime, listenerHandler } from '@rrweb/types'; import { PushPayloadMutationVariables, Sdk } from './graph/generated/operations'; import { FirstLoadListeners } from './listeners/first-load-listeners'; import { AmplitudeIntegrationOptions, ConsoleMethods, DebugOptions, MetricCategory, MixpanelIntegrationOptions, NetworkRecordingOptions, SessionShortcutOptions } from './types/client'; import { HighlightOptions, HighlightPublicInterface, Integration, Metadata, Metric, PrivacySettingOption, RecordMetric, SamplingStrategy, SessionDetails, StartOptions } from './types/types'; import { HighlightFetchWindow } from './listeners/network-listener/utils/fetch-listener'; import { RequestResponsePair } from './listeners/network-listener/utils/models'; import { type ViewportResizeListenerArgs } from './listeners/viewport-resize-listener'; import { Logger } from './logger'; import { getMeter, getTracer, setupBrowserTracing } from './otel'; import { ConsoleMessage, ErrorMessageType, Source } from './types/shared-types'; import { GenerateSecureID } from './utils/secure-id'; import { getPreviousSessionData, SessionData } from './utils/sessionStorage/highlightSession'; import type { HighlightClientRequestWorker } from './workers/highlight-client-worker'; import { PropertyType } from './workers/types'; import { Counter, Gauge, Histogram, UpDownCounter } from '@opentelemetry/api'; import { IntegrationClient } from '../integrations'; import type { LDClientMin } from '../integrations/launchdarkly/types/LDClient'; export declare const HighlightWarning: (context: string, msg: any) => void; export type HighlightClassOptions = { organizationID: number | string; debug?: boolean | DebugOptions; backendUrl?: string; tracingOrigins?: boolean | (string | RegExp)[]; disableNetworkRecording?: boolean; networkRecording?: boolean | NetworkRecordingOptions; disableBackgroundRecording?: boolean; disableConsoleRecording?: boolean; disableSessionRecording?: boolean; reportConsoleErrors?: boolean; consoleMethodsToRecord?: ConsoleMethods[]; privacySetting?: PrivacySettingOption; enableSegmentIntegration?: boolean; enableCanvasRecording?: boolean; enablePerformanceRecording?: boolean; enablePromisePatch?: boolean; samplingStrategy?: SamplingStrategy; inlineImages?: boolean; inlineVideos?: boolean; inlineStylesheet?: boolean; recordCrossOriginIframe?: boolean; firstloadVersion?: string; environment?: 'development' | 'production' | 'staging' | string; appVersion?: string; serviceName?: string; sessionShortcut?: SessionShortcutOptions; sessionSecureID: string; storageMode?: 'sessionStorage' | 'localStorage'; sessionCookie?: true; sendMode?: 'webworker' | 'local'; otlpEndpoint?: HighlightOptions['otlpEndpoint']; otel?: HighlightOptions['otel']; }; /** * Subset of HighlightClassOptions that is stored with the session. These fields are stored for debugging purposes. */ type HighlightClassOptionsInternal = Omit<HighlightClassOptions, 'firstloadVersion'>; export declare class Highlight { options: HighlightClassOptions; /** Determines if the client is running on a Highlight property (e.g. frontend). */ isRunningOnHighlight: boolean; /** Verbose project ID that is exposed to users. Legacy users may still be using ints. */ organizationID: string; graphqlSDK: Sdk; events: eventWithTime[]; sessionData: SessionData; ready: boolean; manualStopped: boolean; state: 'NotRecording' | 'Recording'; logger: Logger; enableSegmentIntegration: boolean; privacySetting: PrivacySettingOption; enableCanvasRecording: boolean; enablePerformanceRecording: boolean; samplingStrategy: SamplingStrategy; inlineImages: boolean; inlineVideos: boolean; inlineStylesheet: boolean; debugOptions: DebugOptions; listeners: listenerHandler[]; firstloadVersion: string; environment: string; sessionShortcut: SessionShortcutOptions; /** The end-user's app version. This isn't Highlight's version. */ appVersion: string | undefined; serviceName: string; _worker: HighlightClientRequestWorker; _optionsInternal: HighlightClassOptionsInternal; _backendUrl: string; _recordingStartTime: number; _isOnLocalHost: boolean; _onToggleFeedbackFormVisibility: () => void; _firstLoadListeners: FirstLoadListeners; _isCrossOriginIframe: boolean; _eventBytesSinceSnapshot: number; _lastSnapshotTime: number; _lastVisibilityChangeTime: number; pushPayloadTimerId: ReturnType<typeof setTimeout> | undefined; hasSessionUnloaded: boolean; hasPushedData: boolean; reloaded: boolean; _hasPreviouslyInitialized: boolean; _recordStop: listenerHandler | undefined; _gauges: Map<string, Gauge>; _counters: Map<string, Counter>; _histograms: Map<string, Histogram>; _up_down_counters: Map<string, UpDownCounter>; _integrations: IntegrationClient[]; static create(options: HighlightClassOptions): Highlight; constructor(options: HighlightClassOptions, firstLoadListeners?: FirstLoadListeners); _reset({ forceNew }: { forceNew?: boolean; }): Promise<void>; _initMembers(options: HighlightClassOptions): void; identify(user_identifier: string, user_object?: {}, source?: Source): void; pushCustomError(message: string, payload?: string): void; consumeCustomError(error: Error, message?: string, payload?: string): void; consumeError(error: Error, { message, payload, source, type, }: { message?: string; payload?: object; source?: string; type?: ErrorMessageType; }): void; addProperties(properties_obj?: {}, typeArg?: PropertyType): void; initialize(options?: StartOptions): Promise<undefined>; _visibilityHandler(hidden: boolean): Promise<void>; _setupCrossOriginIframe(): Promise<void>; _setupCrossOriginIframeParent(): void; _setupWindowListeners(): void; submitViewportMetrics({ height, width, availHeight, availWidth, }: ViewportResizeListenerArgs): void; recordGauge(metric: RecordMetric): void; recordCount(metric: RecordMetric): void; recordIncr(metric: Omit<RecordMetric, 'value'>): void; recordHistogram(metric: RecordMetric): void; recordUpDownCounter(metric: RecordMetric): void; /** * Stops Highlight from recording. * @param manual The end user requested to stop recording. */ stopRecording(manual?: boolean): void; getCurrentSessionTimestamp(): number; /** * Returns the current timestamp for the current session. */ getCurrentSessionURLWithTimestamp(): string; getCurrentSessionURL(): string | null; snapshot(element: HTMLCanvasElement): Promise<void>; addSessionFeedback({ timestamp, verbatim, user_email, user_name, }: { verbatim: string; timestamp: string; user_name?: string; user_email?: string; }): void; _save(): Promise<void>; /** * This proxy should be used instead of rrweb's native addCustomEvent. * The proxy makes sure recording has started before emitting a custom event. */ addCustomEvent<T>(tag: string, payload: T): void; _sendPayload({ sendFn, }: { sendFn?: (payload: PushPayloadMutationVariables) => Promise<number>; }): Promise<void>; private takeFullSnapshot; registerLD(client: LDClientMin): void; } declare global { interface Console { defaultLog: any; defaultError: any; defaultWarn: any; defaultDebug: any; } } export { FirstLoadListeners, GenerateSecureID, getPreviousSessionData, getTracer, getMeter, MetricCategory, setupBrowserTracing, }; export type { AmplitudeIntegrationOptions, ConsoleMessage, HighlightFetchWindow, HighlightOptions, HighlightPublicInterface, Integration, Metadata, Metric, MixpanelIntegrationOptions, RequestResponsePair, SessionDetails, };