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
TypeScript
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, };