posthog-js
Version:
Posthog-js allows you to automatically capture usage and send events to PostHog.
624 lines • 17.7 kB
TypeScript
//#region ../rrweb/types/dist/index.d.ts
//#region src/index.d.ts
declare enum EventType {
DomContentLoaded = 0,
Load = 1,
FullSnapshot = 2,
IncrementalSnapshot = 3,
Meta = 4,
Custom = 5,
Plugin = 6
}
type domContentLoadedEvent = {
type: EventType.DomContentLoaded;
data: unknown;
};
type loadedEvent = {
type: EventType.Load;
data: unknown;
};
type fullSnapshotEvent = {
type: EventType.FullSnapshot;
data: {
node: serializedNodeWithId;
initialOffset: {
top: number;
left: number;
};
};
};
type incrementalSnapshotEvent = {
type: EventType.IncrementalSnapshot;
data: incrementalData;
};
type metaEvent = {
type: EventType.Meta;
data: {
href: string;
width: number;
height: number;
};
};
type customEvent<T = unknown> = {
type: EventType.Custom;
data: {
tag: string;
payload: T;
};
};
type pluginEvent<T = unknown> = {
type: EventType.Plugin;
data: {
plugin: string;
payload: T;
};
};
declare enum IncrementalSource {
Mutation = 0,
MouseMove = 1,
MouseInteraction = 2,
Scroll = 3,
ViewportResize = 4,
Input = 5,
TouchMove = 6,
MediaInteraction = 7,
StyleSheetRule = 8,
CanvasMutation = 9,
Font = 10,
Log = 11,
Drag = 12,
StyleDeclaration = 13,
Selection = 14,
AdoptedStyleSheet = 15,
CustomElement = 16
}
type mutationData = {
source: IncrementalSource.Mutation;
} & mutationCallbackParam;
type mousemoveData = {
source: IncrementalSource.MouseMove | IncrementalSource.TouchMove | IncrementalSource.Drag;
positions: mousePosition[];
};
type mouseInteractionData = {
source: IncrementalSource.MouseInteraction;
} & mouseInteractionParam;
type scrollData = {
source: IncrementalSource.Scroll;
} & scrollPosition;
type viewportResizeData = {
source: IncrementalSource.ViewportResize;
} & viewportResizeDimension;
type inputData = {
source: IncrementalSource.Input;
id: number;
} & inputValue;
type mediaInteractionData = {
source: IncrementalSource.MediaInteraction;
} & mediaInteractionParam;
type styleSheetRuleData = {
source: IncrementalSource.StyleSheetRule;
} & styleSheetRuleParam;
type styleDeclarationData = {
source: IncrementalSource.StyleDeclaration;
} & styleDeclarationParam;
type canvasMutationData = {
source: IncrementalSource.CanvasMutation;
} & canvasMutationParam;
type fontData = {
source: IncrementalSource.Font;
} & fontParam;
type selectionData = {
source: IncrementalSource.Selection;
} & selectionParam;
type adoptedStyleSheetData = {
source: IncrementalSource.AdoptedStyleSheet;
} & adoptedStyleSheetParam;
type customElementData = {
source: IncrementalSource.CustomElement;
} & customElementParam;
type incrementalData = mutationData | mousemoveData | mouseInteractionData | scrollData | viewportResizeData | inputData | mediaInteractionData | styleSheetRuleData | canvasMutationData | fontData | selectionData | styleDeclarationData | adoptedStyleSheetData | customElementData;
type eventWithoutTime = domContentLoadedEvent | loadedEvent | fullSnapshotEvent | incrementalSnapshotEvent | metaEvent | customEvent | pluginEvent;
type eventWithTime = eventWithoutTime & {
timestamp: number;
delay?: number;
};
type blockClass = string | RegExp;
type maskTextClass = string | RegExp;
type SamplingStrategy = Partial<{
/**
* false means not to record mouse/touch move events
* number is the throttle threshold of recording mouse/touch move
*/
mousemove: boolean | number;
/**
* number is the throttle threshold of mouse/touch move callback
*/
mousemoveCallback: number;
/**
* false means not to record mouse interaction events
* can also specify record some kinds of mouse interactions
*/
mouseInteraction: boolean | Record<string, boolean | undefined>;
/**
* number is the throttle threshold of recording scroll
*/
scroll: number;
/**
* number is the throttle threshold of recording media interactions
*/
media: number;
/**
* 'all' will record all the input events
* 'last' will only record the last input value while input a sequence of chars
*/
input: "all" | "last";
/**
* 'all' will record every single canvas call
* number between 1 and 60, will record an image snapshots in a web-worker a (maximum) number of times per second.
* Number only supported where [`OffscreenCanvas`](http://mdn.io/offscreencanvas) is supported.
*/
canvas: "all" | number;
}>;
interface ICrossOriginIframeMirror {
getId(iframe: HTMLIFrameElement, remoteId: number, parentToRemoteMap?: Map<number, number>, remoteToParentMap?: Map<number, number>): number;
getIds(iframe: HTMLIFrameElement, remoteId: number[]): number[];
getRemoteId(iframe: HTMLIFrameElement, parentId: number, map?: Map<number, number>): number;
getRemoteIds(iframe: HTMLIFrameElement, parentId: number[]): number[];
reset(iframe?: HTMLIFrameElement): void;
}
type RecordPlugin<TOptions = unknown> = {
name: string;
observer?: (cb: (...args: Array<unknown>) => void, win: IWindow, options: TOptions) => listenerHandler;
eventProcessor?: <TExtend>(event: eventWithTime) => eventWithTime & TExtend;
getMirror?: (mirrors: {
nodeMirror: IMirror<Node>;
crossOriginIframeMirror: ICrossOriginIframeMirror;
crossOriginIframeStyleMirror: ICrossOriginIframeMirror;
}) => void;
options: TOptions;
};
type hooksParam = {
mutation?: mutationCallBack;
mousemove?: mousemoveCallBack;
mouseInteraction?: mouseInteractionCallBack;
scroll?: scrollCallback;
viewportResize?: viewportResizeCallback;
input?: inputCallback;
mediaInteaction?: mediaInteractionCallback;
styleSheetRule?: styleSheetRuleCallback;
styleDeclaration?: styleDeclarationCallback;
canvasMutation?: canvasMutationCallback;
font?: fontCallback;
selection?: selectionCallback;
customElement?: customElementCallback;
};
type textMutation = {
id: number;
value: string | null;
};
type styleOMValue = {
[key: string]: styleValueWithPriority | string | false;
};
type styleValueWithPriority = [string, string];
type attributeMutation = {
id: number;
attributes: {
[key: string]: string | styleOMValue | null;
};
};
type removedNodeMutation = {
parentId: number;
id: number;
isShadow?: boolean;
};
type addedNodeMutation = {
parentId: number;
previousId?: number | null;
nextId: number | null;
node: serializedNodeWithId;
};
type mutationCallbackParam = {
texts: textMutation[];
attributes: attributeMutation[];
removes: removedNodeMutation[];
adds: addedNodeMutation[];
isAttachIframe?: true;
};
type mutationCallBack = (m: mutationCallbackParam) => void;
type mousemoveCallBack = (p: mousePosition[], source: IncrementalSource.MouseMove | IncrementalSource.TouchMove | IncrementalSource.Drag) => void;
type mousePosition = {
x: number;
y: number;
id: number;
timeOffset: number;
};
declare enum MouseInteractions {
MouseUp = 0,
MouseDown = 1,
Click = 2,
ContextMenu = 3,
DblClick = 4,
Focus = 5,
Blur = 6,
TouchStart = 7,
TouchMove_Departed = 8,
TouchEnd = 9,
TouchCancel = 10
}
declare enum PointerTypes {
Mouse = 0,
Pen = 1,
Touch = 2
}
declare enum CanvasContext {
"2D" = 0,
WebGL = 1,
WebGL2 = 2
}
type mouseInteractionParam = {
type: MouseInteractions;
id: number;
x?: number;
y?: number;
pointerType?: PointerTypes;
};
type mouseInteractionCallBack = (d: mouseInteractionParam) => void;
type scrollPosition = {
id: number;
x: number;
y: number;
};
type scrollCallback = (p: scrollPosition) => void;
type styleSheetAddRule = {
rule: string;
index?: number | number[];
};
type styleSheetDeleteRule = {
index: number | number[];
};
type styleSheetRuleParam = {
id?: number;
styleId?: number;
removes?: styleSheetDeleteRule[];
adds?: styleSheetAddRule[];
replace?: string;
replaceSync?: string;
};
type styleSheetRuleCallback = (s: styleSheetRuleParam) => void;
type adoptedStyleSheetParam = {
id: number;
styles?: {
styleId: number;
rules: styleSheetAddRule[];
}[];
styleIds: number[];
};
type styleDeclarationParam = {
id?: number;
styleId?: number;
index: number[];
set?: {
property: string;
value: string | null;
priority: string | undefined;
};
remove?: {
property: string;
};
};
type styleDeclarationCallback = (s: styleDeclarationParam) => void;
type canvasMutationCommand = {
property: string;
args: Array<unknown>;
setter?: true;
};
type canvasMutationParam = {
id: number;
type: CanvasContext;
commands: canvasMutationCommand[];
displayWidth?: number;
displayHeight?: number;
} | ({
id: number;
type: CanvasContext;
displayWidth?: number;
displayHeight?: number;
} & canvasMutationCommand);
type canvasMutationCallback = (p: canvasMutationParam) => void;
type CanvasMaskRegion = {
x: number;
y: number;
width: number;
height: number;
};
type CanvasMasking = {
regionsFn?: (canvas: HTMLCanvasElement) => CanvasMaskRegion[] | null | undefined;
configured?: () => boolean;
};
type fontParam = {
family: string;
fontSource: string;
buffer: boolean;
descriptors?: FontFaceDescriptors;
};
type fontCallback = (p: fontParam) => void;
type viewportResizeDimension = {
width: number;
height: number;
};
type viewportResizeCallback = (d: viewportResizeDimension) => void;
type inputValue = {
text: string;
isChecked: boolean;
userTriggered?: boolean;
};
type inputCallback = (v: inputValue & {
id: number;
}) => void;
declare enum MediaInteractions {
Play = 0,
Pause = 1,
Seeked = 2,
VolumeChange = 3,
RateChange = 4
}
type mediaInteractionParam = {
type: MediaInteractions;
id: number;
currentTime?: number;
volume?: number;
muted?: boolean;
loop?: boolean;
playbackRate?: number;
};
type mediaInteractionCallback = (p: mediaInteractionParam) => void;
type SelectionRange = {
start: number;
startOffset: number;
end: number;
endOffset: number;
};
type selectionParam = {
ranges: Array<SelectionRange>;
};
type selectionCallback = (p: selectionParam) => void;
type customElementParam = {
define?: {
name: string;
};
};
type customElementCallback = (c: customElementParam) => void;
type listenerHandler = () => void;
type KeepIframeSrcFn = (src: string) => boolean;
declare global {
interface Window {
FontFace: typeof FontFace;
}
}
type IWindow = Window & typeof globalThis;
declare enum NodeType {
Document = 0,
DocumentType = 1,
Element = 2,
Text = 3,
CDATA = 4,
Comment = 5
}
type documentNode = {
type: NodeType.Document;
childNodes: serializedNodeWithId[];
compatMode?: string;
};
type documentTypeNode = {
type: NodeType.DocumentType;
name: string;
publicId: string;
systemId: string;
};
type cssTextKeyAttr = {
_cssText?: string;
};
type attributes = cssTextKeyAttr & {
[key: string]: string | number | true | null;
};
type elementNode = {
type: NodeType.Element;
tagName: string;
attributes: attributes;
childNodes: serializedNodeWithId[];
isSVG?: true;
needBlock?: boolean;
isCustom?: true;
};
type textNode = {
type: NodeType.Text;
textContent: string;
/**
* @deprecated styles are now always snapshotted against parent <style> element
* style mutations can still happen via an added textNode, but they don't need this attribute for correct replay
*/
isStyle?: true;
};
type cdataNode = {
type: NodeType.CDATA;
textContent: "";
};
type commentNode = {
type: NodeType.Comment;
textContent: string;
};
type serializedNode = (documentNode | documentTypeNode | elementNode | textNode | cdataNode | commentNode) & {
rootId?: number;
isShadowHost?: boolean;
isShadow?: boolean;
};
type serializedNodeWithId = serializedNode & {
id: number;
};
interface IMirror<TNode> {
getId(n: TNode | undefined | null): number;
getNode(id: number): TNode | null;
getIds(): number[];
getMeta(n: TNode): serializedNodeWithId | null;
removeNodeFromMap(n: TNode): void;
has(id: number): boolean;
hasNode(node: TNode): boolean;
add(n: TNode, meta: serializedNodeWithId): void;
replace(id: number, n: TNode): void;
reset(): void;
}
type DataURLOptions = Partial<{
type: string;
quality: number;
maxBase64ImageLength: number;
}>;
type PackFn = (event: eventWithTime) => string;
//#endregion
//#region ../rrweb/rrweb-snapshot/dist/rrweb-snapshot.d.ts
type MaskInputOptions = Partial<{
color: boolean;
date: boolean;
"datetime-local": boolean;
email: boolean;
month: boolean;
number: boolean;
range: boolean;
search: boolean;
tel: boolean;
text: boolean;
time: boolean;
url: boolean;
week: boolean;
textarea: boolean;
select: boolean;
password: boolean;
}>;
type SlimDOMOptions = Partial<{
script: boolean;
comment: boolean;
headFavicon: boolean;
headWhitespace: boolean;
headMetaDescKeywords: boolean;
headMetaSocial: boolean;
headMetaRobots: boolean;
headMetaHttpEquiv: boolean;
headMetaAuthorship: boolean;
headMetaVerification: boolean;
/**
* blocks title tag 'animations' which can generate a lot of mutations that aren't usually displayed in replayers
**/
headTitleMutations: boolean;
}>;
type MaskTextFn = (text: string, element: HTMLElement | null) => string;
type MaskInputFn = (text: string, element: HTMLElement) => string;
type MaskAttributeFn = (name: string, value: string, element: Element) => string;
declare class Mirror implements IMirror<Node> {
private idNodeMap;
private nodeMetaMap;
getId(n: Node | undefined | null): number;
getNode(id: number): Node | null;
getIds(): number[];
getMeta(n: Node): serializedNodeWithId | null;
removeNodeFromMap(n: Node): void;
has(id: number): boolean;
hasNode(node: Node): boolean;
add(n: Node, meta: serializedNodeWithId): void;
replace(id: number, n: Node): void;
reset(): void;
}
//#endregion
//#region ../rrweb/rrweb/dist/rrweb.d.ts
//#endregion
//#region src/types.d.ts
type recordOptions<T> = {
emit?: (e: T, isCheckout?: boolean) => void;
checkoutEveryNth?: number;
checkoutEveryNms?: number;
blockClass?: blockClass;
blockSelector?: string;
ignoreClass?: string;
ignoreSelector?: string;
maskTextClass?: maskTextClass;
maskTextSelector?: string;
maskAllInputs?: boolean;
maskInputOptions?: MaskInputOptions;
maskInputFn?: MaskInputFn;
maskTextFn?: MaskTextFn;
maskAllElementAttributes?: boolean;
maskAttributeFn?: MaskAttributeFn;
slimDOMOptions?: SlimDOMOptions | "all" | true;
ignoreCSSAttributes?: Set<string>;
/**
* Limit which DOM attributes the MutationObserver watches, by passing the
* list through to the native `MutationObserver.observe` `attributeFilter`.
* When set, mutations to unlisted attributes never fire the observer
* callback at all, so they cost no recording CPU - useful to exclude
* high-frequency inline `style` mutations from JS-driven animations.
*
* Filtered attributes are invisible to replay, so only set this when that
* loss of fidelity is acceptable. When omitted (or set to an empty array)
* all attributes are observed, the default behaviour.
*
* @see https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver/observe#attributefilter
*/
attributeFilter?: string[];
inlineStylesheet?: boolean;
/**
* Caps how many CSSRules a single full snapshot may stringify.
* `stringifyStylesheet` walks every CSSRule of every sheet, which on CSS-heavy
* pages is the dominant cost of the (uninterruptible) snapshot task and can
* freeze the UI for seconds.
*
* Once the cap is hit, remaining `<link rel=stylesheet>` elements are serialized
* without `_cssText` - they keep `rel`/`href` - and are then inlined across idle
* callbacks, arriving as attribute mutations. The queue is flushed synchronously
* (bounded) when recording stops and on `pagehide`, so in the common case every
* deferred sheet still reaches the recording. The residual risk: replay falls
* back to loading a sheet from its original href - which may be purged,
* auth-gated, or renamed by then - only if the tab dies without `pagehide`
* firing, the sheet does not fit the teardown flush's safety cap (the flush
* skips sheets too big to finish, so one such sheet cannot starve the rest),
* or stringifying the sheet fails; those last two are counted in
* `getDeferredStylesheetStats()`.
*
* Unset or 0 means no cap (the default): every sheet is inlined synchronously.
*/
inlineStylesheetBudgetRules?: number;
hooks?: hooksParam;
packFn?: PackFn;
sampling?: SamplingStrategy;
dataURLOptions?: DataURLOptions;
canvasResolutionScale?: number;
canvasMasking?: CanvasMasking;
recordDOM?: boolean;
recordCanvas?: boolean;
recordCrossOriginIframes?: boolean;
recordAfter?: "DOMContentLoaded" | "load";
userTriggeredOnInput?: boolean;
collectFonts?: boolean;
inlineImages?: boolean;
plugins?: RecordPlugin[];
mousemoveWait?: number;
keepIframeSrcFn?: KeepIframeSrcFn;
errorHandler?: ErrorHandler;
};
declare global {
interface Window {
FontFace: typeof FontFace;
Array: typeof Array;
}
}
type ErrorHandlerContext = "rrweb" | "host";
type ErrorHandler = (error: unknown, context?: ErrorHandlerContext) => void | boolean;
//#endregion
//#region src/record/index.d.ts
declare function record<T = eventWithTime>(options?: recordOptions<T>): listenerHandler | undefined;
declare namespace record {
var addCustomEvent: <T>(tag: string, payload: T) => void;
var freezePage: () => void;
var takeFullSnapshot: (isCheckout?: boolean) => void;
var isRecording: () => boolean;
var mirror: Mirror;
}
//#endregion
export { record as default };