@zendesk/react-measure-timing-hooks
Version:
react hooks for measuring time to interactive and time to render of components
90 lines (89 loc) • 4.06 kB
TypeScript
import type { ErrorInfo } from 'react';
import type { BeaconConfig } from './hooksTypes';
import type { MapSchemaToTypes, RelationsOnASpan, Timestamp } from './types';
export type NativePerformanceEntryType = 'element' | 'event' | 'first-input' | 'largest-contentful-paint' | 'layout-shift' | 'long-animation-frame' | 'longtask' | 'mark' | 'measure' | 'navigation' | 'paint' | 'resource' | 'taskattribution' | 'visibility-state';
export type ComponentLifecycleSpanType = 'component-render-start' | 'component-render' | 'component-unmount';
export type SpanType = NativePerformanceEntryType | ComponentLifecycleSpanType;
export interface DraftTraceConfig<RelationSchemaT, VariantsT extends string> {
id?: string;
startTime?: Partial<Timestamp>;
variant: VariantsT;
/**
* any attributes that are relevant to the entire trace
*/
attributes?: Attributes;
relatedTo: MapSchemaToTypes<RelationSchemaT> | undefined;
/**
* Any additional data that can be used by the tooling to identify the trace
* It will *not* be a part of the trace recording.
*/
baggage?: any;
}
export interface StartTraceConfig<RelationSchemaT, VariantsT extends string> extends DraftTraceConfig<RelationSchemaT, VariantsT> {
relatedTo: MapSchemaToTypes<RelationSchemaT>;
}
export interface DraftTraceInput<RelationSchemaT, VariantsT extends string> extends DraftTraceConfig<RelationSchemaT, VariantsT> {
id: string;
startTime: Timestamp;
}
export interface ActiveTraceInput<RelationSchemaT, VariantsT extends string> extends DraftTraceInput<RelationSchemaT, VariantsT> {
relatedTo: MapSchemaToTypes<RelationSchemaT>;
}
export interface ActiveTraceConfig<SelectedRelationNameT extends keyof RelationSchemasT, RelationSchemasT, VariantsT extends string> extends DraftTraceInput<RelationSchemasT[SelectedRelationNameT], VariantsT> {
relatedTo: MapSchemaToTypes<RelationSchemasT[SelectedRelationNameT]>;
}
export interface Attributes {
[key: string]: unknown;
}
export type SpanStatus = 'ok' | 'error';
export interface SpanBase<RelationSchemasT> {
type: SpanType | (string & {});
/**
* The common name of the span.
* If converted from a PerformanceEntry, this is a sanitized version of the name.
*/
name: string;
startTime: Timestamp;
relatedTo?: RelationsOnASpan<RelationSchemasT>;
attributes: Attributes;
/**
* The duration of this span.
* If this span is just an event (a point in time), this will be 0.
* On the other hand, spans will have duration > 0.
*/
duration: number;
/**
* Status of the span ('error' or 'ok').
*/
status?: SpanStatus;
/**
* The original PerformanceEntry from which the Span was created
*/
performanceEntry?: PerformanceEntry;
/**
* if status is error, optionally provide the Error object with additional metadata
*/
error?: Error;
}
export interface ComponentRenderSpan<RelationSchemasT> extends Omit<SpanBase<RelationSchemasT>, 'attributes'>, Omit<BeaconConfig<RelationSchemasT>, 'relatedTo'> {
type: ComponentLifecycleSpanType;
isIdle: boolean;
errorInfo?: ErrorInfo;
renderCount: number;
}
export type InitiatorType = 'audio' | 'beacon' | 'body' | 'css' | 'early-hint' | 'embed' | 'fetch' | 'frame' | 'iframe' | 'icon' | 'image' | 'img' | 'input' | 'link' | 'navigation' | 'object' | 'ping' | 'script' | 'track' | 'video' | 'xmlhttprequest' | 'other';
export interface ResourceSpan<RelationSchemasT> extends SpanBase<RelationSchemasT> {
type: 'resource';
resourceDetails: {
initiatorType: InitiatorType;
query: Record<string, string | string[]>;
hash: string;
};
}
export interface PerformanceEntrySpan<RelationSchemasT> extends SpanBase<RelationSchemasT> {
type: Exclude<NativePerformanceEntryType, 'resource'>;
}
/**
* All possible trace entries
*/
export type Span<RelationSchemasT> = PerformanceEntrySpan<RelationSchemasT> | ComponentRenderSpan<RelationSchemasT> | ResourceSpan<RelationSchemasT>;