import type { EmptyObject } from '../../../framework-types/BaseTypes'; import type { BaseContext } from '../../../framework-types/Types'; export type EventBase = { timestamp: number; type: string; }; export type EventListener = (event: Event & EventBase) => void; export type EventBusContext = BaseContext; export type EventMap = { [key: string]: object; }; export type EventBus = EmptyObject> = { on(name: Name | `${Name}`, listener: EventListener): void; off(name: Name | `${Name}`, listener: EventListener): void; dispatch(context: EventBusContext, name: Name | `${Name}`, event: Omit & Partial): void; readonly Type: Type; }; type EventMaps = { [key in keyof Apis]: Apis[key] extends { events: EventBus>; } ? Events : EmptyObject; }; type ApiEventTypes = { [key in keyof Apis]: Apis[key] extends { events: { readonly Type: infer T extends Record; }; } ? T : EmptyObject; }; type WithoutEventBuses = { [key in keyof Apis]: Omit; }; type MergeEventMaps = EventMaps extends [infer Events extends EventMap] ? Events : EventMaps extends [infer Events extends EventMap, ...infer OtherMaps extends EventMap[]] ? Events & MergeEventMaps : EmptyObject; type MergeRecords[]> = Records extends [infer R extends Record] ? R : Records extends [infer R extends Record, ...infer Rest extends Record[]] ? R & MergeRecords : EmptyObject; type MergeApis = Apis extends [infer Api] ? Api : Apis extends [infer Api, ...infer RemainingApis extends object[]] ? Api & MergeApis : EmptyObject; export type MergeApisAndEventBuses = MergeApis> & { events: EventBus>, MergeRecords>>; }; export declare enum EventBusExportNames { CreateEventBus = "create-event-bus", ExtendEventBusTypes = "extend-event-bus-types" } export {};