<!-- API Report Version: 2.3 -->

## API Report File for "@atlaskit/ufo"

> Do not edit this file. This report is auto-generated using
> [API Extractor](https://api-extractor.com/).
> [Learn more about API reports](https://hello.atlassian.net/wiki/spaces/UR/pages/1825484529/Package+API+Reports)

### Table of contents

- [Main Entry Types](#main-entry-types)
- [Peer Dependencies](#peer-dependencies)

### Main Entry Types

<!--SECTION START: Main Entry Types-->

```ts
// @public (undocumented)
type AbstractExperienceConfig = {
	category?: null | string;
	until?: Function | null;
	type: ExperienceTypes;
	performanceType: ExperiencePerformanceTypes;
	platform?: {
		component: string;
	};
	featureFlags?: string[];
	isSSROutputAsFMP?: boolean;
	timings?: Timing[];
	performanceConfig?: PerformanceConfig;
};

// @public (undocumented)
type BasePageLoadHistogramConfig = {
	[PageLoadMetrics.fmp]: string;
	[PageLoadMetrics.tti]: string;
};

// @public (undocumented)
type BasePageSegmentLoadHistogramConfig = {
	[PageSegmentLoadMetrics.fmp]: string;
	[PageSegmentLoadMetrics.tti]: string;
};

// @public (undocumented)
export class ConcurrentExperience {
	constructor(experienceId: string, config: AbstractExperienceConfig);
	// (undocumented)
	config: AbstractExperienceConfig;
	// (undocumented)
	experienceId: string;
	// (undocumented)
	getInstance(instanceId: string): UFOExperience;
	// (undocumented)
	instances: {
		[key: string]: UFOExperience;
	};
	// (undocumented)
	release(instanceId: string): void;
}

// @public (undocumented)
export type CustomData = {
	[key: string]: CustomData | boolean | number | string | undefined;
};

// @public (undocumented)
type CustomHistogramConfig = {
	[CustomMetrics.duration]: string;
};

// @public (undocumented)
enum CustomMetrics {
	// (undocumented)
	duration = 'duration',
}

// @public (undocumented)
type EndStateConfig = {
	force?: boolean;
	metadata?: CustomData;
};

// @public (undocumented)
interface ExperienceData {
	// (undocumented)
	category: null | string;
	// (undocumented)
	children: Array<ExperienceData>;
	// (undocumented)
	explicitTimings: ReportedTimings;
	// (undocumented)
	featureFlags: string[];
	// (undocumented)
	id: string;
	// (undocumented)
	isSSROutputAsFMP: boolean;
	// (undocumented)
	metadata: CustomData;
	// (undocumented)
	metrics: ExperienceMetrics;
	// (undocumented)
	pageVisibleState: PageVisibleState;
	// (undocumented)
	performanceConfig?: PerformanceConfig;
	// (undocumented)
	performanceType: ExperiencePerformanceTypes;
	// (undocumented)
	platform: null | {
		component: string;
	};
	// (undocumented)
	result: {
		success: boolean;
		startTime: null | number;
		duration: number;
	};
	// (undocumented)
	schemaVersion: string;
	// (undocumented)
	state: UFOExperienceStateType;
	// (undocumented)
	timings: Timing[];
	// (undocumented)
	type: ExperienceTypes;
	// (undocumented)
	uuid: null | string;
}

// @public (undocumented)
type ExperienceMetrics = {
	startTime: null | number;
	endTime: null | number;
	marks: Array<{
		name: string;
		time: number;
	}>;
};

// @public (undocumented)
export const experiencePayloadEvent: (
	data: ExperienceData,
) => UFOGlobalEventStreamExperiencePayload;

// @public (undocumented)
export enum ExperiencePerformanceTypes {
	// (undocumented)
	Custom = 'custom',
	// (undocumented)
	InlineResult = 'inline-result',
	// (undocumented)
	PageLoad = 'page-load',
	// (undocumented)
	PageSegmentLoad = 'page-segment-load',
}

// @public (undocumented)
export enum ExperienceTypes {
	// (undocumented)
	Experience = 'experience',
	// (undocumented)
	Load = 'load',
	// (undocumented)
	Operation = 'operation',
}

// @public (undocumented)
export const getGlobalEventStream: () => GlobalEventStream;

// @public (undocumented)
type GlobalEventStream = {
	push(event: UFOGlobalEventStreamEvent): void;
	__buffer_only__: boolean;
};

// @public (undocumented)
export const GlobalPageLoadExperience: UFOGlobalPageLoadExperience;

// @public (undocumented)
type HistogramConfig = {
	[ExperiencePerformanceTypes.PageLoad]?: PageLoadHistogramConfig;
	[ExperiencePerformanceTypes.PageSegmentLoad]?: PageSegmentLoadHistogramConfig;
	[ExperiencePerformanceTypes.InlineResult]?: InteractionHistogramConfig;
	[ExperiencePerformanceTypes.Custom]?: CustomHistogramConfig;
};

// @public (undocumented)
type InteractionHistogramConfig = {
	[InteractionMetrics.response]: string;
	[InteractionMetrics.result]: string;
};

// @public (undocumented)
enum InteractionMetrics {
	// (undocumented)
	response = 'response',
	// (undocumented)
	result = 'result',
}

// @public (undocumented)
interface PageLoadExperienceData extends ExperienceData {
	// (undocumented)
	initial: boolean;
}

// @public (undocumented)
type PageLoadHistogramConfig = {
	initial: BasePageLoadHistogramConfig;
	transition: BasePageLoadHistogramConfig;
};

// @public (undocumented)
enum PageLoadMetrics {
	// (undocumented)
	fmp = 'fmp',
	// (undocumented)
	tti = 'tti',
}

// @public (undocumented)
type PageSegmentLoadHistogramConfig = {
	initial: BasePageSegmentLoadHistogramConfig;
	transition: BasePageSegmentLoadHistogramConfig;
};

// @public (undocumented)
enum PageSegmentLoadMetrics {
	// (undocumented)
	fmp = 'fmp',
	// (undocumented)
	tti = 'tti',
}

// @public (undocumented)
enum PageVisibleState {
	// (undocumented)
	HIDDEN = 'hidden',
	// (undocumented)
	MIXED = 'mixed',
	// (undocumented)
	VISIBLE = 'visible',
}

// @public (undocumented)
type PerformanceConfig = {
	histogram?: HistogramConfig;
};

// @public (undocumented)
type ReportedTiming = {
	startTime: number;
	duration: number;
};

// @public (undocumented)
type ReportedTimings = {
	[key: string]: ReportedTiming;
};

// @public (undocumented)
export const setGlobalEventStream: (eventStream: GlobalEventStream) => void;

// @public (undocumented)
type SubscribeCallback = (data: ExperienceData) => void;

// @public (undocumented)
export const subscribeEvent: (
	experienceId: string,
	callback: SubscribeCallback,
) => UFOGlobalEventStreamSubscribe;

// @public (undocumented)
type Timing =
	| {
			key: string;
			endMark: string;
			component?: string;
	  }
	| {
			key: string;
			startMark: string;
			component?: string;
	  }
	| {
			key: string;
			startMark: string;
			endMark: string;
			component?: string;
	  };

// @public (undocumented)
export const UFO_EXPERIMENTAL_BUILD_VERSION = '0.1.5';

// @public (undocumented)
class UFOAbstractExperience {
	constructor(id: string, config: AbstractExperienceConfig, instanceId?: null | string);
	// (undocumented)
	abort(config?: EndStateConfig): Promise<boolean | null>;
	// (undocumented)
	addMetadata(data: CustomData): void;
	// (undocumented)
	category: null | string;
	// (undocumented)
	childExperiences: never[];
	// (undocumented)
	config: AbstractExperienceConfig;
	// (undocumented)
	explicitTimings: ReportedTimings;
	// (undocumented)
	exportData(): Promise<ExperienceData>;
	// (undocumented)
	failure(config?: EndStateConfig): Promise<boolean | null>;
	// (undocumented)
	featureFlags: string[];
	// (undocumented)
	getId(): Promise<string>;
	// (undocumented)
	handleDoneBind: SubscribeCallback;
	// (undocumented)
	id: string;
	// (undocumented)
	instanceId: null | string;
	// (undocumented)
	isSSROutputAsFMP: boolean;
	// (undocumented)
	mark(name: string, timestamp?: number): void;
	// (undocumented)
	markFMP(timestamp?: number): void;
	// (undocumented)
	markInlineResponse(timestamp?: number): void;
	// (undocumented)
	metadata: CustomData;
	// (undocumented)
	metrics: ExperienceMetrics;
	// (undocumented)
	onDoneCallbacks: never[];
	// (undocumented)
	parent: UFOAbstractExperience | null;
	// (undocumented)
	performanceConfig: PerformanceConfig;
	// (undocumented)
	performanceType: ExperiencePerformanceTypes;
	// (undocumented)
	start(startTime?: number): Promise<void>;
	// (undocumented)
	state: UFOExperienceStateType;
	// (undocumented)
	success(config?: EndStateConfig): Promise<boolean | null>;
	// (undocumented)
	timings: Timing[];
	// (undocumented)
	transition(newState: UFOExperienceStateType, timestamp?: number): Promise<boolean>;
	// (undocumented)
	type: ExperienceTypes;
	// (undocumented)
	until: Function | null;
	// (undocumented)
	uuid: null | string;
}

// @public (undocumented)
export class UFOExperience extends UFOAbstractExperience {}

// @public (undocumented)
export const UFOExperienceState: {
	[key: string]: UFOExperienceStateType;
};

// @public (undocumented)
type UFOExperienceStateType = {
	id: string;
	final?: boolean;
	success?: boolean;
};

// @public (undocumented)
type UFOGlobalEventStreamEvent =
	| UFOGlobalEventStreamExperiencePayload
	| UFOGlobalEventStreamSubscribe
	| UFOGlobalEventStreamUnsubscribe;

// @public (undocumented)
enum UFOGlobalEventStreamEventType {
	// (undocumented)
	EXPERIENCE_PAYLOAD = 0,
	// (undocumented)
	SUBSCRIBE = 1,
	// (undocumented)
	UNSUBSCRIBE = 2,
}

// @public (undocumented)
type UFOGlobalEventStreamExperiencePayload = {
	type: UFOGlobalEventStreamEventType.EXPERIENCE_PAYLOAD;
	payload: ExperienceData;
};

// @public (undocumented)
type UFOGlobalEventStreamSubscribe = {
	type: UFOGlobalEventStreamEventType.SUBSCRIBE;
	payload: {
		experienceId: string;
		callback: SubscribeCallback;
	};
};

// @public (undocumented)
type UFOGlobalEventStreamUnsubscribe = {
	type: UFOGlobalEventStreamEventType.UNSUBSCRIBE;
	payload: {
		experienceId: string;
		callback: SubscribeCallback;
	};
};

// @public (undocumented)
class UFOGlobalPageLoadExperience extends UFOAbstractExperience {
	// (undocumented)
	exportData(): Promise<PageLoadExperienceData>;
	// (undocumented)
	getId(): Promise<string>;
	// (undocumented)
	initial: boolean;
	// (undocumented)
	loadingPageLoadId: string;
	// (undocumented)
	performanceType: ExperiencePerformanceTypes;
	// (undocumented)
	setPageLoadId(id: string): void;
	// (undocumented)
	startPageLoad(id: string, initial?: boolean, startTime?: number): Promise<void>;
	// (undocumented)
	type: ExperienceTypes;
	// (undocumented)
	updateConfig(config: Partial<AbstractExperienceConfig>): void;
}

// @public (undocumented)
export const ufolog: (...args: Array<any>) => void;

// @public (undocumented)
class UFOLogger {
	// (undocumented)
	disable(): void;
	// (undocumented)
	enable(): void;
	// (undocumented)
	enabled: boolean;
	// (undocumented)
	log(...args: Array<any>): void;
	// (undocumented)
	static UFOprefix: string;
	// (undocumented)
	warn(...args: Array<any>): void;
}

// @public (undocumented)
export const ufologger: UFOLogger;

// @public (undocumented)
export const ufowarn: (...args: Array<any>) => void;

// @public (undocumented)
export const unsubscribeEvent: (
	experienceId: string,
	callback: SubscribeCallback,
) => UFOGlobalEventStreamUnsubscribe;

// @public (undocumented)
export const untilAll: (deps: UntilAllArgs) => () => (data: ExperienceData) =>
	| {
			done: boolean;
			state: UFOExperienceStateType;
	  }
	| {
			done: boolean;
			state?: undefined;
	  };

// @public (undocumented)
type UntilAllArgs = Array<UntilDefinition>;

// @public (undocumented)
type UntilCategory = {
	category: string;
};

// @public (undocumented)
type UntilDefinition = UntilCategory | UntilExperience;

// @public (undocumented)
type UntilExperience = {
	experience: UFOExperience;
};

// @public (undocumented)
class VisibilityChangeObserver {
	// (undocumented)
	start(): void;
	// (undocumented)
	subscribe(callback: () => void): void;
	// (undocumented)
	unsubscribe(callback: () => void): void;
}

// @public (undocumented)
export const visibilityChangeObserver: VisibilityChangeObserver;

// (No @packageDocumentation comment for this package)
```

<!--SECTION END: Main Entry Types-->

### Peer Dependencies

<!--SECTION START: Peer Dependencies-->

```json
{
	"react": "^16.8.0"
}
```

<!--SECTION END: Peer Dependencies-->
