import type { VirtualObjectDefinition } from "@restatedev/restate-sdk";
import * as restate from "@restatedev/restate-sdk";
import type { ObjectHandlerContext } from "./typed-object";
type BaseEvent<TEventMap, K extends keyof TEventMap> = {
    event: K;
    data: TEventMap[K];
};
export type EventUnion<TEventMap> = {
    [K in keyof TEventMap]: BaseEvent<TEventMap, K>;
}[keyof TEventMap];
export type EventSourcedState<TEventMap> = {
    events: (EventUnion<TEventMap> & {
        timestamp: number;
        uuid: string;
    })[];
};
export type CombinedEventState<TEventMap, TAdditionalState = {}> = EventSourcedState<TEventMap> & Omit<TAdditionalState, "events">;
type TransformEventHandlers<TState, THandlers> = {
    [K in keyof THandlers]: THandlers[K] extends (context: any, data: infer D) => Promise<infer R> ? (ctx: restate.ObjectContext, data: D) => Promise<R> : never;
};
export declare function createEventObject<TEventMap extends Record<string, any>, TAdditionalState extends Record<string, any> = {}>(name: string, SerdeClass: new <T>() => restate.Serde<T>): <THandlers extends { [K in keyof TEventMap]: (context: ObjectHandlerContext<EventSourcedState<TEventMap> & Omit<TAdditionalState, "events">> & {
    eventUuid: string;
    eventTimestamp: number;
}, data: TEventMap[K]) => Promise<any>; }>(handlers: THandlers) => VirtualObjectDefinition<string, TransformEventHandlers<EventSourcedState<TEventMap> & Omit<TAdditionalState, "events">, THandlers>>;
export type InferEventType<T> = T extends Record<string, any> ? EventUnion<T> : never;
export type InferEventState<T> = T extends Record<string, any> ? EventSourcedState<T> : never;
export type InferCombinedState<TEventMap, TAdditionalState = {}> = TEventMap extends Record<string, any> ? CombinedEventState<TEventMap, TAdditionalState> : never;
export {};
//# sourceMappingURL=typed-event-object.d.ts.map