import type { Position } from "../types"; export type JSONType = Record | unknown[] | string; export type MetadataType = JSONType | Uint8Array; export type JSONEventType = Metadata extends MetadataType ? { type: Type; data: Data; metadata: Metadata; } : { type: Type; data: Data; metadata?: Metadata; }; export type BinaryEventType = Metadata extends MetadataType ? { type: Type; data: Uint8Array; metadata: Metadata; } : { type: Type; data: Uint8Array; metadata?: Metadata; }; export type EventType = JSONEventType | BinaryEventType; export type JSONEventData = E extends JSONEventType ? { id: string; contentType: "application/json"; type: E["type"]; data: E["data"]; metadata: E["metadata"] extends MetadataType ? E["metadata"] : MetadataType | undefined; } : never; export type BinaryEventData = E extends BinaryEventType ? { id: string; contentType: "application/octet-stream"; type: E["type"]; data: E["data"]; metadata: E["metadata"] extends MetadataType ? E["metadata"] : MetadataType | undefined; } : never; export type EventData = E extends BinaryEventType ? BinaryEventData : E extends JSONEventType ? JSONEventData : never; export type LinkEvent = BinaryEventType<"$>", { $causedBy?: string; $correlationId?: string; [key: string]: unknown; }>; /** * Represents a previously written event. */ export type RecordedEvent = E extends EventType ? { /** * The event stream that events belongs to. */ streamId: string; /** * Unique identifier representing this event. UUID format. */ id: string; /** * Indicates whether the content is internally marked as JSON. */ isJson: E extends JSONEventType ? true : false; /** * Number of this event in the stream. */ revision: bigint; /** * Type of this event. */ type: E["type"]; /** * Representing when this event was created in the database system. */ created: Date; /** * Data of this event. */ data: E extends JSONEventType ? E["data"] : Uint8Array; /** * Representing the metadata associated with this event. */ metadata: E["metadata"] extends MetadataType ? E["metadata"] : MetadataType | undefined; /** * Position of this event in the transaction log. * Only returned on server versions later than 22.6.0. */ position?: Position; } : never; export type JSONRecordedEvent = RecordedEvent; export type BinaryRecordedEvent = RecordedEvent; export type AllStreamJSONRecordedEvent = RecordedEvent & { /** * Position of this event in the transaction log. */ position: Position; }; export type AllStreamBinaryRecordedEvent = RecordedEvent & { /** * Position of this event in the transaction log. */ position: Position; }; export type AllStreamRecordedEvent = AllStreamJSONRecordedEvent | AllStreamBinaryRecordedEvent; /** * A structure representing a single event or an resolved link event. */ export interface ResolvedEvent { /** * The event, or the resolved link event if this {@link ResolvedEvent} is a link event. */ event?: EventTypeToRecordedEvent; /** * The link event if this ResolvedEvent is a link event. */ link?: EventTypeToRecordedEvent; /** * Commit position of the record. */ commitPosition?: bigint; } /** * A structure representing a single event or a resolved link event from a persistent subscription to a stream. */ export interface PersistentSubscriptionToStreamResolvedEvent extends ResolvedEvent { /** * The number of times this event has been retried. */ retryCount: number; } /** * A structure representing a single event or an resolved link event. */ export interface AllStreamResolvedEvent { /** * The event, or the resolved link event if this {@link ResolvedEvent} is a link event. */ event?: AllStreamRecordedEvent; /** * The link event if this ResolvedEvent is a link event. */ link?: AllStreamBinaryRecordedEvent; /** * Commit position of the record. */ commitPosition?: bigint; } /** * A structure representing a single event or a resolved link event from a persistent subscription to $all. */ export interface PersistentSubscriptionToAllResolvedEvent extends AllStreamResolvedEvent { /** * The number of times this event has been retried. */ retryCount: number; } export type EventTypeToRecordedEvent = T extends JSONEventType ? JSONRecordedEvent : T extends BinaryEventType ? BinaryRecordedEvent : never; export type RecordedEventToEventType = T extends JSONRecordedEvent ? E : T extends BinaryRecordedEvent ? E : never; export type EventTypeToEventData = T extends JSONEventType ? JSONEventData : T extends BinaryEventType ? BinaryEventData : never; export type EventDataToEventType = T extends JSONEventData ? E : T extends BinaryEventData ? E : never; export type RecordedEventToEventData = T extends JSONRecordedEvent ? JSONEventData : T extends BinaryRecordedEvent ? BinaryEventData : never; export type EventDataToRecordedEvent = T extends JSONRecordedEvent ? JSONEventData : T extends BinaryRecordedEvent ? BinaryEventData : never;