restate-for-dummies
Version:
Type-safe Restate SDK wrapper with simplified API
29 lines • 1.88 kB
TypeScript
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