@event-driven-io/emmett 0.26.0 → 0.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/typing/command.ts","../src/typing/event.ts","../src/typing/workflow.ts","../src/eventStore/afterCommit/afterEventStoreCommitHandler.ts","../src/eventStore/afterCommit/forwardToMessageBus.ts","../src/eventStore/events/index.ts","../src/eventStore/eventStore.ts","../src/eventStore/expectedVersion.ts","../src/eventStore/inMemoryEventStore.ts","../src/eventStore/subscriptions/caughtUpTransformStream.ts","../src/eventStore/subscriptions/streamingCoordinator.ts","../src/streaming/transformations/notifyAboutNoActiveReaders.ts","../src/streaming/writers/writeToStream.ts","../src/utils/collections/duplicates.ts","../src/utils/collections/merge.ts","../src/utils/collections/index.ts","../src/utils/deepEquals.ts","../src/utils/iterators.ts","../src/taskProcessing/taskProcessor.ts","../src/utils/locking/index.ts","../src/utils/retry.ts","../src/commandHandling/handleCommand.ts","../src/commandHandling/handleCommandWithDecider.ts","../src/messageBus/index.ts","../src/serialization/json/JSONParser.ts","../src/projections/index.ts","../src/streaming/binaryArrays.ts","../src/streaming/collectors/collect.ts","../src/streaming/decoders/binary.ts","../src/streaming/decoders/string.ts","../src/streaming/decoders/json.ts","../src/streaming/decoders/object.ts","../src/streaming/decoders/composite.ts","../src/streaming/generators/fromArray.ts","../src/streaming/generators/index.ts","../src/streaming/restream.ts","../src/streaming/transformations/filter.ts","../src/streaming/transformations/map.ts","../src/streaming/transformations/reduce.ts","../src/streaming/transformations/retry.ts","../src/streaming/transformations/skip.ts","../src/streaming/transformations/stopAfter.ts","../src/streaming/transformations/stopOn.ts","../src/streaming/transformations/take.ts","../src/streaming/transformations/waitAtMost.ts","../src/streaming/transformations/index.ts","../src/testing/assertions.ts","../src/testing/deciderSpecification.ts","../src/testing/wrapEventStore.ts"],"sourcesContent":["import type { DefaultRecord, Flavour } from './';\n\nexport type Command<\n CommandType extends string = string,\n CommandData extends DefaultRecord = DefaultRecord,\n CommandMetaData extends DefaultRecord | undefined = undefined,\n> = Flavour<\n Readonly<\n CommandMetaData extends undefined\n ? {\n type: CommandType;\n data: Readonly<CommandData>;\n metadata?: DefaultCommandMetadata | undefined;\n }\n : {\n type: CommandType;\n data: CommandData;\n metadata: CommandMetaData;\n }\n >,\n 'Command'\n>;\n\nexport type CommandTypeOf<T extends Command> = T['type'];\nexport type CommandDataOf<T extends Command> = T['data'];\nexport type CommandMetaDataOf<T extends Command> = T extends {\n metadata: infer M;\n}\n ? M\n : undefined;\n\nexport type CreateCommandType<\n CommandType extends string,\n CommandData extends DefaultRecord,\n CommandMetaData extends DefaultRecord | undefined = undefined,\n> = Readonly<\n CommandMetaData extends undefined\n ? {\n type: CommandType;\n data: CommandData;\n metadata?: DefaultCommandMetadata | undefined;\n }\n : {\n type: CommandType;\n data: CommandData;\n metadata: CommandMetaData;\n }\n>;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const command = <CommandType extends Command<string, any, any>>(\n ...args: CommandMetaDataOf<CommandType> extends undefined\n ? [\n type: CommandTypeOf<CommandType>,\n data: CommandDataOf<CommandType>,\n metadata?: DefaultCommandMetadata | undefined,\n ]\n : [\n type: CommandTypeOf<CommandType>,\n data: CommandDataOf<CommandType>,\n metadata: CommandMetaDataOf<CommandType>,\n ]\n): CommandType => {\n const [type, data, metadata] = args;\n\n return metadata !== undefined\n ? ({ type, data, metadata } as CommandType)\n : ({ type, data } as CommandType);\n};\n\nexport type DefaultCommandMetadata = { now: Date };\n","import type { DefaultRecord, Flavour } from './';\n\nexport type BigIntStreamPosition = bigint;\nexport type BigIntGlobalPosition = bigint;\n\nexport type Event<\n EventType extends string = string,\n EventData extends DefaultRecord = DefaultRecord,\n EventMetaData extends DefaultRecord | undefined = undefined,\n> = Flavour<\n Readonly<\n EventMetaData extends undefined\n ? {\n type: EventType;\n data: EventData;\n }\n : {\n type: EventType;\n data: EventData;\n metadata: EventMetaData;\n }\n >,\n 'Event'\n>;\n\nexport type EventTypeOf<T extends Event> = T['type'];\nexport type EventDataOf<T extends Event> = T['data'];\nexport type EventMetaDataOf<T extends Event> = T extends { metadata: infer M }\n ? M\n : undefined;\n\nexport type CanHandle<T extends Event> = EventTypeOf<T>[];\n\nexport type CreateEventType<\n EventType extends string,\n EventData extends DefaultRecord,\n EventMetaData extends DefaultRecord | undefined = undefined,\n> = Readonly<\n EventMetaData extends undefined\n ? {\n type: EventType;\n data: EventData;\n }\n : {\n type: EventType;\n data: EventData;\n metadata: EventMetaData;\n }\n>;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const event = <EventType extends Event<string, any, any>>(\n ...args: EventMetaDataOf<EventType> extends undefined\n ? [type: EventTypeOf<EventType>, data: EventDataOf<EventType>]\n : [\n type: EventTypeOf<EventType>,\n data: EventDataOf<EventType>,\n metadata: EventMetaDataOf<EventType>,\n ]\n): EventType => {\n const [type, data, metadata] = args;\n\n return metadata !== undefined\n ? ({ type, data, metadata } as EventType)\n : ({ type, data } as EventType);\n};\n\nexport type CombinedReadEventMetadata<\n EventType extends Event = Event,\n EventMetaDataType extends AnyReadEventMetadata = AnyReadEventMetadata,\n> =\n EventMetaDataOf<EventType> extends undefined\n ? EventMetaDataType\n : EventMetaDataOf<EventType> & EventMetaDataType;\n\nexport type ReadEvent<\n EventType extends Event = Event,\n EventMetaDataType extends AnyReadEventMetadata = AnyReadEventMetadata,\n> = EventType & {\n metadata: CombinedReadEventMetadata<EventType, EventMetaDataType>;\n};\n\nexport type ReadEventMetadata<\n GlobalPosition = undefined,\n StreamPosition = BigIntStreamPosition,\n> = Readonly<{\n eventId: string;\n streamPosition: StreamPosition;\n streamName: string;\n}> &\n (GlobalPosition extends undefined\n ? object\n : { globalPosition: GlobalPosition });\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyReadEventMetadata = ReadEventMetadata<any, any>;\n\nexport type ReadEventMetadataWithGlobalPosition<\n GlobalPosition = BigIntGlobalPosition,\n> = ReadEventMetadata<GlobalPosition>;\n\nexport type ReadEventMetadataWithoutGlobalPosition<\n StreamPosition = BigIntStreamPosition,\n> = ReadEventMetadata<undefined, StreamPosition>;\n\nexport type GlobalPositionTypeOfReadEventMetadata<ReadEventMetadataType> =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ReadEventMetadataType extends ReadEventMetadata<infer GP, any> ? GP : never;\n\nexport type StreamPositionTypeOfReadEventMetadata<ReadEventMetadataType> =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ReadEventMetadataType extends ReadEventMetadata<any, infer SV> ? SV : never;\n","import type { Command } from './command';\nimport type { Event } from './event';\n\n/// Inspired by https://blog.bittacklr.be/the-workflow-pattern.html\n\nexport type Workflow<\n Input extends Event | Command,\n State,\n Output extends Event | Command,\n> = {\n decide: (command: Input, state: State) => WorkflowOutput<Output>[];\n evolve: (currentState: State, event: WorkflowEvent<Output>) => State;\n initialState: () => State;\n};\n\nexport type WorkflowEvent<Output extends Command | Event> = Extract<\n Output,\n { __brand?: 'Event' }\n>;\n\nexport type WorkflowCommand<Output extends Command | Event> = Extract<\n Output,\n { __brand?: 'Command' }\n>;\n\nexport type WorkflowOutput<TOutput extends Command | Event> =\n | { kind: 'Reply'; message: TOutput }\n | { kind: 'Send'; message: WorkflowCommand<TOutput> }\n | { kind: 'Publish'; message: WorkflowEvent<TOutput> }\n | {\n kind: 'Schedule';\n message: TOutput;\n when: { afterInMs: number } | { at: Date };\n }\n | { kind: 'Complete' }\n | { kind: 'Accept' }\n | { kind: 'Ignore'; reason: string }\n | { kind: 'Error'; reason: string };\n\nexport const reply = <TOutput extends Command | Event>(\n message: TOutput,\n): WorkflowOutput<TOutput> => {\n return {\n kind: 'Reply',\n message,\n };\n};\n\nexport const send = <TOutput extends Command | Event>(\n message: WorkflowCommand<TOutput>,\n): WorkflowOutput<TOutput> => {\n return {\n kind: 'Send',\n message,\n };\n};\n\nexport const publish = <TOutput extends Command | Event>(\n message: WorkflowEvent<TOutput>,\n): WorkflowOutput<TOutput> => {\n return {\n kind: 'Publish',\n message,\n };\n};\n\nexport const schedule = <TOutput extends Command | Event>(\n message: TOutput,\n when: { afterInMs: number } | { at: Date },\n): WorkflowOutput<TOutput> => {\n return {\n kind: 'Schedule',\n message,\n when,\n };\n};\n\nexport const complete = <\n TOutput extends Command | Event,\n>(): WorkflowOutput<TOutput> => {\n return {\n kind: 'Complete',\n };\n};\n\nexport const ignore = <TOutput extends Command | Event>(\n reason: string,\n): WorkflowOutput<TOutput> => {\n return {\n kind: 'Ignore',\n reason,\n };\n};\n\nexport const error = <TOutput extends Command | Event>(\n reason: string,\n): WorkflowOutput<TOutput> => {\n return {\n kind: 'Error',\n reason,\n };\n};\n\nexport const accept = <\n TOutput extends Command | Event,\n>(): WorkflowOutput<TOutput> => {\n return { kind: 'Accept' };\n};\n","import { type Event, type ReadEvent } from '../../typing';\nimport type { EventStore, EventStoreReadEventMetadata } from '../eventStore';\n\ntype AfterEventStoreCommitHandlerWithoutContext<Store extends EventStore> = (\n messages: ReadEvent<Event, EventStoreReadEventMetadata<Store>>[],\n) => Promise<void> | void;\n\nexport type AfterEventStoreCommitHandler<\n Store extends EventStore,\n HandlerContext = never,\n> = [HandlerContext] extends [never]\n ? AfterEventStoreCommitHandlerWithoutContext<Store>\n : (\n messages: ReadEvent<Event, EventStoreReadEventMetadata<Store>>[],\n context: HandlerContext,\n ) => Promise<void> | void;\n\ntype TryPublishMessagesAfterCommitOptions<\n Store extends EventStore,\n HandlerContext = never,\n> = {\n onAfterCommit?: AfterEventStoreCommitHandler<Store, HandlerContext>;\n};\n\nexport async function tryPublishMessagesAfterCommit<Store extends EventStore>(\n messages: ReadEvent<Event, EventStoreReadEventMetadata<Store>>[],\n options: TryPublishMessagesAfterCommitOptions<Store, undefined> | undefined,\n): Promise<boolean>;\nexport async function tryPublishMessagesAfterCommit<\n Store extends EventStore,\n HandlerContext,\n>(\n messages: ReadEvent<Event, EventStoreReadEventMetadata<Store>>[],\n options:\n | TryPublishMessagesAfterCommitOptions<Store, HandlerContext>\n | undefined,\n context: HandlerContext,\n): Promise<boolean>;\nexport async function tryPublishMessagesAfterCommit<\n Store extends EventStore,\n HandlerContext = never,\n>(\n messages: ReadEvent<Event, EventStoreReadEventMetadata<Store>>[],\n options:\n | TryPublishMessagesAfterCommitOptions<Store, HandlerContext>\n | undefined,\n context?: HandlerContext,\n): Promise<boolean> {\n if (options?.onAfterCommit === undefined) return false;\n\n try {\n await options?.onAfterCommit(messages, context!);\n return true;\n } catch (error) {\n // TODO: enhance with tracing\n console.error(`Error in on after commit hook`, error);\n return false;\n }\n}\n","import type { EventsPublisher } from '../../messageBus';\nimport type { Event, ReadEvent } from '../../typing';\nimport type { EventStore, EventStoreReadEventMetadata } from '../eventStore';\nimport type { AfterEventStoreCommitHandler } from './afterEventStoreCommitHandler';\n\nexport const forwardToMessageBus =\n <Store extends EventStore, HandlerContext = never>(\n eventPublisher: EventsPublisher,\n ): AfterEventStoreCommitHandler<Store, HandlerContext> =>\n async (\n messages: ReadEvent<Event, EventStoreReadEventMetadata<Store>>[],\n ): Promise<void> => {\n for (const message of messages) {\n await eventPublisher.publish(message);\n }\n };\n","import {\n event,\n type Event,\n type EventDataOf,\n type ReadEvent,\n type ReadEventMetadataWithGlobalPosition,\n} from '../../typing';\n\nexport const GlobalStreamCaughtUpType = '__emt:GlobalStreamCaughtUp';\n\nexport type GlobalStreamCaughtUp = Event<\n '__emt:GlobalStreamCaughtUp',\n { globalPosition: bigint },\n { globalPosition: bigint }\n>;\n\nexport const isGlobalStreamCaughtUp = (\n event: Event,\n): event is GlobalStreamCaughtUp => event.type === GlobalStreamCaughtUpType;\n\nexport const caughtUpEventFrom =\n (position: bigint) =>\n (\n event: ReadEvent<Event, ReadEventMetadataWithGlobalPosition>,\n ): event is ReadEvent<\n GlobalStreamCaughtUp,\n ReadEventMetadataWithGlobalPosition\n > =>\n event.type === GlobalStreamCaughtUpType &&\n event.metadata?.globalPosition >= position;\n\nexport const globalStreamCaughtUp = (\n data: EventDataOf<GlobalStreamCaughtUp>,\n): GlobalStreamCaughtUp =>\n event<GlobalStreamCaughtUp>(GlobalStreamCaughtUpType, data, {\n globalPosition: data.globalPosition,\n });\n\nexport const isSubscriptionEvent = (\n event: Event,\n): event is GlobalSubscriptionEvent => isGlobalStreamCaughtUp(event);\n\nexport const isNotInternalEvent = (event: Event): boolean =>\n !isGlobalStreamCaughtUp(event);\n\nexport type GlobalSubscriptionEvent = GlobalStreamCaughtUp;\n","//import type { ReadableStream } from 'web-streams-polyfill';\nimport type {\n AnyReadEventMetadata,\n BigIntGlobalPosition,\n BigIntStreamPosition,\n Event,\n GlobalPositionTypeOfReadEventMetadata,\n ReadEvent,\n ReadEventMetadata,\n StreamPositionTypeOfReadEventMetadata,\n} from '../typing';\nimport type { AfterEventStoreCommitHandler } from './afterCommit';\n//import type { GlobalSubscriptionEvent } from './events';\nimport type { ExpectedStreamVersion } from './expectedVersion';\n\n// #region event-store\nexport interface EventStore<\n ReadEventMetadataType extends AnyReadEventMetadata = AnyReadEventMetadata,\n> {\n aggregateStream<State, EventType extends Event>(\n streamName: string,\n options: AggregateStreamOptions<State, EventType, ReadEventMetadataType>,\n ): Promise<\n AggregateStreamResult<\n State,\n StreamPositionTypeOfReadEventMetadata<ReadEventMetadataType>\n >\n >;\n\n readStream<EventType extends Event>(\n streamName: string,\n options?: ReadStreamOptions<\n StreamPositionTypeOfReadEventMetadata<ReadEventMetadataType>\n >,\n ): Promise<ReadStreamResult<EventType, ReadEventMetadataType>>;\n\n appendToStream<EventType extends Event>(\n streamName: string,\n events: EventType[],\n options?: AppendToStreamOptions<\n StreamPositionTypeOfReadEventMetadata<ReadEventMetadataType>\n >,\n ): Promise<\n AppendToStreamResult<\n StreamPositionTypeOfReadEventMetadata<ReadEventMetadataType>\n >\n >;\n\n // streamEvents(): ReadableStream<\n // ReadEvent<Event, ReadEventMetadataType> | GlobalSubscriptionEvent\n // >;\n}\n\nexport type EventStoreReadEventMetadata<Store extends EventStore> =\n Store extends EventStore<infer ReadEventMetadataType>\n ? ReadEventMetadataType extends ReadEventMetadata<infer GV, infer SV>\n ? ReadEventMetadata<GV, SV> & ReadEventMetadataType\n : never\n : never;\n\nexport type GlobalPositionTypeOfEventStore<Store extends EventStore> =\n GlobalPositionTypeOfReadEventMetadata<EventStoreReadEventMetadata<Store>>;\n\nexport type StreamPositionTypeOfEventStore<Store extends EventStore> =\n StreamPositionTypeOfReadEventMetadata<EventStoreReadEventMetadata<Store>>;\n\nexport type EventStoreSession<EventStoreType extends EventStore> = {\n eventStore: EventStoreType;\n close: () => Promise<void>;\n};\n\nexport interface EventStoreSessionFactory<EventStoreType extends EventStore> {\n withSession<T = unknown>(\n callback: (session: EventStoreSession<EventStoreType>) => Promise<T>,\n ): Promise<T>;\n}\n// #endregion event-store\n\nexport const canCreateEventStoreSession = <Store extends EventStore>(\n eventStore: Store | EventStoreSessionFactory<Store>,\n): eventStore is EventStoreSessionFactory<Store> => 'withSession' in eventStore;\n\nexport const nulloSessionFactory = <EventStoreType extends EventStore>(\n eventStore: EventStoreType,\n): EventStoreSessionFactory<EventStoreType> => ({\n withSession: (callback) => {\n const nulloSession: EventStoreSession<EventStoreType> = {\n eventStore,\n close: () => Promise.resolve(),\n };\n\n return callback(nulloSession);\n },\n});\n\n////////////////////////////////////////////////////////////////////\n/// ReadStream types\n////////////////////////////////////////////////////////////////////\n\nexport type ReadStreamOptions<StreamVersion = BigIntStreamPosition> = (\n | {\n from: StreamVersion;\n }\n | { to: StreamVersion }\n | { from: StreamVersion; maxCount?: bigint }\n | {\n expectedStreamVersion: ExpectedStreamVersion<StreamVersion>;\n }\n) & {\n expectedStreamVersion?: ExpectedStreamVersion<StreamVersion>;\n};\n\nexport type ReadStreamResult<\n EventType extends Event,\n ReadEventMetadataType extends AnyReadEventMetadata = AnyReadEventMetadata,\n> = {\n currentStreamVersion: StreamPositionTypeOfReadEventMetadata<ReadEventMetadataType>;\n events: ReadEvent<EventType, ReadEventMetadataType>[];\n streamExists: boolean;\n};\n\n////////////////////////////////////////////////////////////////////\n/// AggregateStream types\n////////////////////////////////////////////////////////////////////\n\ntype Evolve<\n State,\n EventType extends Event,\n ReadEventMetadataType extends AnyReadEventMetadata = AnyReadEventMetadata,\n> =\n | ((currentState: State, event: EventType) => State)\n | ((\n currentState: State,\n event: ReadEvent<EventType, ReadEventMetadataType>,\n ) => State)\n | ((currentState: State, event: ReadEvent<EventType>) => State);\n\nexport type AggregateStreamOptions<\n State,\n EventType extends Event,\n ReadEventMetadataType extends AnyReadEventMetadata = AnyReadEventMetadata,\n> = {\n evolve: Evolve<State, EventType, ReadEventMetadataType>;\n initialState: () => State;\n read?: ReadStreamOptions<\n StreamPositionTypeOfReadEventMetadata<ReadEventMetadataType>\n >;\n};\n\nexport type AggregateStreamResult<\n State,\n StreamPosition = BigIntStreamPosition,\n> = {\n currentStreamVersion: StreamPosition;\n state: State;\n streamExists: boolean;\n};\n\nexport type AggregateStreamResultWithGlobalPosition<\n State,\n StreamPosition = BigIntStreamPosition,\n GlobalPosition = BigIntGlobalPosition,\n> =\n | (AggregateStreamResult<State, StreamPosition> & {\n streamExists: true;\n lastEventGlobalPosition: GlobalPosition;\n })\n | (AggregateStreamResult<State, StreamPosition> & {\n streamExists: false;\n });\n\nexport type AggregateStreamResultOfEventStore<Store extends EventStore> =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Store['aggregateStream'] extends (...args: any[]) => Promise<infer R>\n ? R\n : never;\n\n////////////////////////////////////////////////////////////////////\n/// AppendToStream types\n////////////////////////////////////////////////////////////////////\n\nexport type AppendToStreamOptions<StreamVersion = BigIntStreamPosition> = {\n expectedStreamVersion?: ExpectedStreamVersion<StreamVersion>;\n};\n\nexport type AppendToStreamResult<StreamVersion = BigIntStreamPosition> = {\n nextExpectedStreamVersion: StreamVersion;\n createdNewStream: boolean;\n};\n\nexport type AppendToStreamResultWithGlobalPosition<\n StreamVersion = BigIntStreamPosition,\n GlobalPosition = BigIntGlobalPosition,\n> = AppendToStreamResult<StreamVersion> & {\n lastEventGlobalPosition: GlobalPosition;\n};\n\nexport type AppendStreamResultOfEventStore<Store extends EventStore> =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Store['appendToStream'] extends (...args: any[]) => Promise<infer R>\n ? R\n : never;\n\n////////////////////////////////////////////////////////////////////\n/// DefaultEventStoreOptions\n////////////////////////////////////////////////////////////////////\n\nexport type DefaultEventStoreOptions<\n Store extends EventStore,\n HandlerContext = never,\n> = {\n /**\n * Pluggable set of hooks informing about the event store internal behaviour.\n */\n hooks?: {\n /**\n * This hook will be called **AFTER** events were stored in the event store.\n * It's designed to handle scenarios where delivery and ordering guarantees do not matter much.\n *\n * **WARNINGS:**\n *\n * 1. It will be called **EXACTLY ONCE** if append succeded.\n * 2. If the hook fails, its append **will still silently succeed**, and no error will be thrown.\n * 3. Wen process crashes after events were committed, but before the hook was called, delivery won't be retried.\n * That can lead to state inconsistencies.\n * 4. In the case of high concurrent traffic, **race conditions may cause ordering issues**.\n * For instance, where the second hook takes longer to process than the first one, ordering won't be guaranteed.\n *\n * @type {AfterEventStoreCommitHandler<Store, HandlerContext>}\n */\n onAfterCommit?: AfterEventStoreCommitHandler<Store, HandlerContext>;\n };\n};\n","import { ConcurrencyError } from '../errors';\nimport type { BigIntStreamPosition, Flavour } from '../typing';\n\nexport type ExpectedStreamVersion<VersionType = BigIntStreamPosition> =\n | ExpectedStreamVersionWithValue<VersionType>\n | ExpectedStreamVersionGeneral;\n\nexport type ExpectedStreamVersionWithValue<VersionType = BigIntStreamPosition> =\n Flavour<VersionType, 'StreamVersion'>;\n\nexport type ExpectedStreamVersionGeneral = Flavour<\n 'STREAM_EXISTS' | 'STREAM_DOES_NOT_EXIST' | 'NO_CONCURRENCY_CHECK',\n 'StreamVersion'\n>;\n\nexport const STREAM_EXISTS = 'STREAM_EXISTS' as ExpectedStreamVersionGeneral;\nexport const STREAM_DOES_NOT_EXIST =\n 'STREAM_DOES_NOT_EXIST' as ExpectedStreamVersionGeneral;\nexport const NO_CONCURRENCY_CHECK =\n 'NO_CONCURRENCY_CHECK' as ExpectedStreamVersionGeneral;\n\nexport const matchesExpectedVersion = <StreamVersion = BigIntStreamPosition>(\n current: StreamVersion | undefined,\n expected: ExpectedStreamVersion<StreamVersion>,\n defaultVersion: StreamVersion,\n): boolean => {\n if (expected === NO_CONCURRENCY_CHECK) return true;\n\n if (expected == STREAM_DOES_NOT_EXIST) return current === defaultVersion;\n\n if (expected == STREAM_EXISTS) return current !== defaultVersion;\n\n return current === expected;\n};\n\nexport const assertExpectedVersionMatchesCurrent = <\n StreamVersion = BigIntStreamPosition,\n>(\n current: StreamVersion,\n expected: ExpectedStreamVersion<StreamVersion> | undefined,\n defaultVersion: StreamVersion,\n): void => {\n expected ??= NO_CONCURRENCY_CHECK;\n\n if (!matchesExpectedVersion(current, expected, defaultVersion))\n throw new ExpectedVersionConflictError(current, expected);\n};\n\nexport class ExpectedVersionConflictError<\n VersionType = BigIntStreamPosition,\n> extends ConcurrencyError {\n constructor(\n current: VersionType,\n expected: ExpectedStreamVersion<VersionType>,\n ) {\n super(current?.toString(), expected?.toString());\n\n // 👇️ because we are extending a built-in class\n Object.setPrototypeOf(this, ExpectedVersionConflictError.prototype);\n }\n}\n\nexport const isExpectedVersionConflictError = (\n error: unknown,\n): error is ExpectedVersionConflictError =>\n error instanceof ExpectedVersionConflictError;\n","import { v4 as uuid } from 'uuid';\nimport type {\n BigIntStreamPosition,\n CombinedReadEventMetadata,\n Event,\n ReadEvent,\n ReadEventMetadataWithGlobalPosition,\n} from '../typing';\nimport { tryPublishMessagesAfterCommit } from './afterCommit';\nimport {\n type AggregateStreamOptions,\n type AggregateStreamResult,\n type AppendToStreamOptions,\n type AppendToStreamResult,\n type DefaultEventStoreOptions,\n type EventStore,\n type ReadStreamOptions,\n type ReadStreamResult,\n} from './eventStore';\nimport { assertExpectedVersionMatchesCurrent } from './expectedVersion';\nimport { StreamingCoordinator } from './subscriptions';\n\nexport const InMemoryEventStoreDefaultStreamVersion = 0n;\n\nexport type InMemoryEventStore =\n EventStore<ReadEventMetadataWithGlobalPosition>;\n\nexport type InMemoryEventStoreOptions =\n DefaultEventStoreOptions<InMemoryEventStore>;\n\nexport type InMemoryReadEvent<EventType extends Event = Event> = ReadEvent<\n EventType,\n ReadEventMetadataWithGlobalPosition\n>;\n\nexport const getInMemoryEventStore = (\n eventStoreOptions?: InMemoryEventStoreOptions,\n): InMemoryEventStore => {\n const streams = new Map<\n string,\n ReadEvent<Event, ReadEventMetadataWithGlobalPosition>[]\n >();\n const streamingCoordinator = StreamingCoordinator();\n\n const getAllEventsCount = () => {\n return Array.from<ReadEvent[]>(streams.values())\n .map((s) => s.length)\n .reduce((p, c) => p + c, 0);\n };\n\n return {\n async aggregateStream<State, EventType extends Event>(\n streamName: string,\n options: AggregateStreamOptions<\n State,\n EventType,\n ReadEventMetadataWithGlobalPosition\n >,\n ): Promise<AggregateStreamResult<State>> {\n const { evolve, initialState, read } = options;\n\n const result = await this.readStream<EventType>(streamName, read);\n\n const events = result?.events ?? [];\n\n return {\n currentStreamVersion: BigInt(events.length),\n state: events.reduce(evolve, initialState()),\n streamExists: result.streamExists,\n };\n },\n\n readStream: <EventType extends Event>(\n streamName: string,\n options?: ReadStreamOptions<BigIntStreamPosition>,\n ): Promise<\n ReadStreamResult<EventType, ReadEventMetadataWithGlobalPosition>\n > => {\n const events = streams.get(streamName);\n const currentStreamVersion = events\n ? BigInt(events.length)\n : InMemoryEventStoreDefaultStreamVersion;\n\n assertExpectedVersionMatchesCurrent(\n currentStreamVersion,\n options?.expectedStreamVersion,\n InMemoryEventStoreDefaultStreamVersion,\n );\n\n const from = Number(options && 'from' in options ? options.from : 0);\n const to = Number(\n options && 'to' in options\n ? options.to\n : options && 'maxCount' in options && options.maxCount\n ? options.from + options.maxCount\n : (events?.length ?? 1),\n );\n\n const resultEvents =\n events !== undefined && events.length > 0\n ? events\n .map(\n (e) =>\n e as ReadEvent<\n EventType,\n ReadEventMetadataWithGlobalPosition\n >,\n )\n .slice(from, to)\n : [];\n\n const result: ReadStreamResult<\n EventType,\n ReadEventMetadataWithGlobalPosition\n > = {\n currentStreamVersion,\n events: resultEvents,\n streamExists: events !== undefined && events.length > 0,\n };\n\n return Promise.resolve(result);\n },\n\n appendToStream: async <EventType extends Event>(\n streamName: string,\n events: EventType[],\n options?: AppendToStreamOptions,\n ): Promise<AppendToStreamResult> => {\n const currentEvents = streams.get(streamName) ?? [];\n const currentStreamVersion =\n currentEvents.length > 0\n ? BigInt(currentEvents.length)\n : InMemoryEventStoreDefaultStreamVersion;\n\n assertExpectedVersionMatchesCurrent(\n currentStreamVersion,\n options?.expectedStreamVersion,\n InMemoryEventStoreDefaultStreamVersion,\n );\n\n const newEvents: ReadEvent<\n EventType,\n ReadEventMetadataWithGlobalPosition\n >[] = events.map((event, index) => {\n const metadata: ReadEventMetadataWithGlobalPosition = {\n streamName,\n eventId: uuid(),\n streamPosition: BigInt(currentEvents.length + index + 1),\n globalPosition: BigInt(getAllEventsCount() + index + 1),\n };\n return {\n ...event,\n metadata: {\n ...('metadata' in event ? (event.metadata ?? {}) : {}),\n ...metadata,\n } as CombinedReadEventMetadata<\n EventType,\n ReadEventMetadataWithGlobalPosition\n >,\n };\n });\n\n const positionOfLastEventInTheStream = BigInt(\n newEvents.slice(-1)[0]!.metadata.streamPosition,\n );\n\n streams.set(streamName, [...currentEvents, ...newEvents]);\n await streamingCoordinator.notify(newEvents);\n\n const result: AppendToStreamResult = {\n nextExpectedStreamVersion: positionOfLastEventInTheStream,\n createdNewStream:\n currentStreamVersion === InMemoryEventStoreDefaultStreamVersion,\n };\n\n await tryPublishMessagesAfterCommit(newEvents, eventStoreOptions?.hooks);\n\n return result;\n },\n\n //streamEvents: streamingCoordinator.stream,\n };\n};\n","import { TransformStream } from 'web-streams-polyfill';\nimport type {\n Event,\n ReadEvent,\n ReadEventMetadataWithGlobalPosition,\n} from '../../typing';\nimport { globalStreamCaughtUp, type GlobalSubscriptionEvent } from '../events';\n\nexport const streamTrackingGlobalPosition = (\n currentEvents: ReadEvent<Event, ReadEventMetadataWithGlobalPosition>[],\n) => new CaughtUpTransformStream(currentEvents);\n\nexport class CaughtUpTransformStream extends TransformStream<\n ReadEvent<Event, ReadEventMetadataWithGlobalPosition>,\n | ReadEvent<Event, ReadEventMetadataWithGlobalPosition>\n | GlobalSubscriptionEvent\n> {\n private _currentPosition: bigint;\n private _logPosition: bigint;\n\n constructor(events: ReadEvent<Event, ReadEventMetadataWithGlobalPosition>[]) {\n super({\n start: (controller) => {\n let globalPosition = 0n;\n for (const event of events) {\n controller.enqueue(event);\n globalPosition = event.metadata.globalPosition;\n }\n controller.enqueue(globalStreamCaughtUp({ globalPosition }));\n },\n transform: (event, controller) => {\n this._currentPosition = event.metadata.globalPosition;\n controller.enqueue(event);\n\n if (this._currentPosition < this._logPosition) return;\n\n controller.enqueue(\n globalStreamCaughtUp({ globalPosition: this._currentPosition }),\n );\n },\n });\n\n this._currentPosition = this._logPosition =\n events.length > 0\n ? events[events.length - 1]!.metadata.globalPosition\n : 0n;\n }\n\n public set logPosition(value: bigint) {\n this._logPosition = value;\n }\n}\n","import { v4 as uuid } from 'uuid';\nimport { notifyAboutNoActiveReadersStream } from '../../streaming/transformations/notifyAboutNoActiveReaders';\nimport { writeToStream } from '../../streaming/writers';\nimport type {\n Event,\n ReadEvent,\n ReadEventMetadataWithGlobalPosition,\n} from '../../typing';\nimport {\n CaughtUpTransformStream,\n streamTrackingGlobalPosition,\n} from './caughtUpTransformStream';\n\nexport const StreamingCoordinator = () => {\n const allEvents: ReadEvent<Event, ReadEventMetadataWithGlobalPosition>[] = [];\n const listeners = new Map<string, CaughtUpTransformStream>();\n\n return {\n notify: async (\n events: ReadEvent<Event, ReadEventMetadataWithGlobalPosition>[],\n ) => {\n if (events.length === 0) return;\n\n allEvents.push(...events);\n\n for (const listener of listeners.values()) {\n listener.logPosition =\n events[events.length - 1]!.metadata.globalPosition;\n\n await writeToStream(listener, events);\n }\n },\n\n stream: () => {\n const streamId = uuid();\n const transformStream = streamTrackingGlobalPosition(allEvents);\n\n listeners.set(streamId, transformStream);\n return transformStream.readable.pipeThrough(\n notifyAboutNoActiveReadersStream(\n (stream) => {\n if (listeners.has(stream.streamId))\n listeners.delete(stream.streamId);\n },\n { streamId },\n ),\n );\n },\n };\n};\n","import { v4 as uuid } from 'uuid';\nimport { TransformStream } from 'web-streams-polyfill';\n\nexport const notifyAboutNoActiveReadersStream = <Item>(\n onNoActiveReaderCallback: (\n stream: NotifyAboutNoActiveReadersStream<Item>,\n ) => void,\n options: { streamId?: string; intervalCheckInMs?: number } = {},\n) => new NotifyAboutNoActiveReadersStream(onNoActiveReaderCallback, options);\n\nexport class NotifyAboutNoActiveReadersStream<Item> extends TransformStream<\n Item,\n Item\n> {\n private checkInterval: NodeJS.Timeout | null = null;\n public readonly streamId: string;\n private _isStopped: boolean = false;\n public get hasActiveSubscribers() {\n return !this._isStopped;\n }\n\n constructor(\n private onNoActiveReaderCallback: (\n stream: NotifyAboutNoActiveReadersStream<Item>,\n ) => void,\n options: { streamId?: string; intervalCheckInMs?: number } = {},\n ) {\n super({\n cancel: (reason) => {\n console.log('Stream was canceled. Reason:', reason);\n this.stopChecking();\n },\n });\n this.streamId = options?.streamId ?? uuid();\n\n this.onNoActiveReaderCallback = onNoActiveReaderCallback;\n\n this.startChecking(options?.intervalCheckInMs ?? 20);\n }\n\n private startChecking(interval: number) {\n this.checkInterval = setInterval(() => {\n this.checkNoActiveReader();\n }, interval);\n }\n\n private stopChecking() {\n if (!this.checkInterval) return;\n\n clearInterval(this.checkInterval);\n this.checkInterval = null;\n this._isStopped = true;\n this.onNoActiveReaderCallback(this);\n }\n\n private checkNoActiveReader() {\n if (!this.readable.locked && !this._isStopped) {\n this.stopChecking();\n }\n }\n}\n","import type { ReadableStream, TransformStream } from 'web-streams-polyfill';\nimport { noMoreWritingOn } from './noMoreWritingOn';\n\nexport const writeToStream = async <In, Out = In>(\n stream: TransformStream<In, Out>,\n items: In[],\n): Promise<boolean> => {\n if (stream.writable.locked) return false;\n\n const writer = stream.writable.getWriter();\n await writer.ready;\n\n if (!stream.readable.locked) return false;\n\n try {\n for (const item of items) {\n await writer.write(item);\n }\n } catch (error) {\n console.log(error);\n } finally {\n await writer.close();\n }\n return true;\n};\n\nexport const writeToStreamAndStop = async <In, Out>(\n stream: TransformStream<In, Out>,\n items: In[],\n): Promise<ReadableStream<Out>> => {\n await writeToStream(stream, items);\n return await noMoreWritingOn(stream);\n};\n","export const hasDuplicates = <ArrayItem, Mapped>(\n array: ArrayItem[],\n predicate: (value: ArrayItem, index: number, array: ArrayItem[]) => Mapped,\n) => {\n const mapped = array.map(predicate);\n const uniqueValues = new Set(mapped);\n\n return uniqueValues.size < mapped.length;\n};\n\nexport const getDuplicates = <ArrayItem, Mapped>(\n array: ArrayItem[],\n predicate: (value: ArrayItem, index: number, array: ArrayItem[]) => Mapped,\n): ArrayItem[] => {\n const map = new Map<Mapped, ArrayItem[]>();\n\n for (let i = 0; i < array.length; i++) {\n const item = array[i]!;\n const key = predicate(item, i, array);\n if (!map.has(key)) {\n map.set(key, []);\n }\n map.get(key)!.push(item);\n }\n\n return Array.from(map.values())\n .filter((group) => group.length > 1)\n .flat();\n};\n","export const merge = <T>(\n array: T[],\n item: T,\n where: (current: T) => boolean,\n onExisting: (current: T) => T,\n onNotFound: () => T | undefined = () => undefined,\n) => {\n let wasFound = false;\n\n const result = array\n // merge the existing item if matches condition\n .map((p: T) => {\n if (!where(p)) return p;\n\n wasFound = true;\n return onExisting(p);\n })\n // filter out item if undefined was returned\n // for cases of removal\n .filter((p) => p !== undefined)\n // make TypeScript happy\n .map((p) => {\n if (!p) throw Error('That should not happen');\n\n return p;\n });\n\n // if item was not found and onNotFound action is defined\n // try to generate new item\n if (!wasFound) {\n const result = onNotFound();\n\n if (result !== undefined) return [...array, item];\n }\n\n return result;\n};\n","import { getDuplicates, hasDuplicates } from './duplicates';\nimport { merge } from './merge';\n\nexport * from './merge';\n\nexport const arrayUtils = {\n merge,\n hasDuplicates,\n getDuplicates,\n};\n","export const deepEquals = <T>(left: T, right: T): boolean => {\n if (isEquatable(left)) {\n return left.equals(right);\n }\n\n if (Array.isArray(left)) {\n return (\n Array.isArray(right) &&\n left.length === right.length &&\n left.every((val, index) => deepEquals(val, right[index]))\n );\n }\n\n if (\n typeof left !== 'object' ||\n typeof right !== 'object' ||\n left === null ||\n right === null\n ) {\n return left === right;\n }\n\n if (Array.isArray(right)) return false;\n\n const keys1 = Object.keys(left);\n const keys2 = Object.keys(right);\n\n if (\n keys1.length !== keys2.length ||\n !keys1.every((key) => keys2.includes(key))\n )\n return false;\n\n for (const key in left) {\n if (left[key] instanceof Function && right[key] instanceof Function)\n continue;\n\n const isEqual = deepEquals(left[key], right[key]);\n if (!isEqual) {\n return false;\n }\n }\n\n return true;\n};\n\nexport type Equatable<T> = { equals: (right: T) => boolean } & T;\n\nexport const isEquatable = <T>(left: T): left is Equatable<T> => {\n return (\n left &&\n typeof left === 'object' &&\n 'equals' in left &&\n typeof left['equals'] === 'function'\n );\n};\n","export const sum = (\n iterator: Iterator<number, number, number> | Iterator<number>,\n) => {\n let value,\n done: boolean | undefined,\n sum = 0;\n do {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n ({ value, done } = iterator.next());\n sum += value || 0;\n } while (!done);\n return sum;\n};\n","import { EmmettError } from '../errors';\n\nexport type TaskQueue = TaskQueueItem[];\n\nexport type TaskQueueItem = {\n task: () => Promise<void>;\n options?: EnqueueTaskOptions;\n};\n\nexport type TaskProcessorOptions = {\n maxActiveTasks: number;\n maxQueueSize: number;\n maxTaskIdleTime?: number;\n};\n\nexport type Task<T> = (context: TaskContext) => Promise<T>;\n\nexport type TaskContext = {\n ack: () => void;\n};\n\nexport type EnqueueTaskOptions = { taskGroupId?: string };\n\nexport class TaskProcessor {\n private queue: TaskQueue = [];\n private isProcessing = false;\n private activeTasks = 0;\n private activeGroups: Set<string> = new Set();\n\n constructor(private options: TaskProcessorOptions) {}\n\n enqueue<T>(task: Task<T>, options?: EnqueueTaskOptions): Promise<T> {\n if (this.queue.length >= this.options.maxQueueSize) {\n return Promise.reject(\n new EmmettError(\n 'Too many pending connections. Please try again later.',\n ),\n );\n }\n\n return this.schedule(task, options);\n }\n\n waitForEndOfProcessing(): Promise<void> {\n return this.schedule(({ ack }) => Promise.resolve(ack()));\n }\n\n private schedule<T>(task: Task<T>, options?: EnqueueTaskOptions): Promise<T> {\n return promiseWithDeadline(\n (resolve, reject) => {\n const taskWithContext = () => {\n return new Promise<void>((resolveTask, failTask) => {\n const taskPromise = task({\n ack: resolveTask,\n });\n\n taskPromise.then(resolve).catch((err) => {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\n failTask(err);\n reject(err);\n });\n });\n };\n\n this.queue.push({ task: taskWithContext, options });\n if (!this.isProcessing) {\n this.ensureProcessing();\n }\n },\n { deadline: this.options.maxTaskIdleTime },\n );\n }\n\n private ensureProcessing(): void {\n if (this.isProcessing) return;\n this.isProcessing = true;\n this.processQueue();\n }\n\n private processQueue(): void {\n try {\n while (\n this.activeTasks < this.options.maxActiveTasks &&\n this.queue.length > 0\n ) {\n const item = this.takeFirstAvailableItem();\n\n if (item === null) return;\n\n const groupId = item.options?.taskGroupId;\n\n if (groupId) {\n // Mark the group as active\n this.activeGroups.add(groupId);\n }\n\n this.activeTasks++;\n void this.executeItem(item);\n }\n } catch (error) {\n console.error(error);\n throw error;\n } finally {\n this.isProcessing = false;\n if (\n this.hasItemsToProcess() &&\n this.activeTasks < this.options.maxActiveTasks\n ) {\n this.ensureProcessing();\n }\n }\n }\n\n private async executeItem({ task, options }: TaskQueueItem): Promise<void> {\n try {\n await task();\n } finally {\n this.activeTasks--;\n\n // Mark the group as inactive after task completion\n if (options && options.taskGroupId) {\n this.activeGroups.delete(options.taskGroupId);\n }\n\n this.ensureProcessing();\n }\n }\n\n private takeFirstAvailableItem = (): TaskQueueItem | null => {\n const taskIndex = this.queue.findIndex(\n (item) =>\n !item.options?.taskGroupId ||\n !this.activeGroups.has(item.options.taskGroupId),\n );\n\n if (taskIndex === -1) {\n // All remaining tasks are blocked by active groups\n return null;\n }\n\n // Remove the task from the queue\n const [item] = this.queue.splice(taskIndex, 1);\n\n return item ?? null;\n };\n\n private hasItemsToProcess = (): boolean =>\n this.queue.findIndex(\n (item) =>\n !item.options?.taskGroupId ||\n !this.activeGroups.has(item.options.taskGroupId),\n ) !== -1;\n}\n\nconst DEFAULT_PROMISE_DEADLINE = 2147483647;\n\nconst promiseWithDeadline = <T>(\n executor: (\n resolve: (value: T | PromiseLike<T>) => void,\n reject: (reason?: unknown) => void,\n ) => void,\n options: { deadline?: number },\n) => {\n return new Promise<T>((resolve, reject) => {\n let taskStarted = false;\n\n const maxWaitingTime = options.deadline || DEFAULT_PROMISE_DEADLINE;\n\n let timeoutId: NodeJS.Timeout | null = setTimeout(() => {\n if (!taskStarted) {\n reject(\n new Error('Task was not started within the maximum waiting time'),\n );\n }\n }, maxWaitingTime);\n\n executor((value) => {\n taskStarted = true;\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n timeoutId = null;\n resolve(value);\n }, reject);\n });\n};\n","import { TaskProcessor } from '../../taskProcessing';\n\nexport type LockOptions = { lockId: number };\n\nexport type AcquireLockOptions = { lockId: string };\nexport type ReleaseLockOptions = { lockId: string };\n\nexport type Lock = {\n acquire(options: AcquireLockOptions): Promise<void>;\n tryAcquire(options: AcquireLockOptions): Promise<boolean>;\n release(options: ReleaseLockOptions): Promise<boolean>;\n withAcquire: <Result = unknown>(\n handle: () => Promise<Result>,\n options: AcquireLockOptions,\n ) => Promise<Result>;\n};\n\nexport const InProcessLock = (): Lock => {\n const taskProcessor = new TaskProcessor({\n maxActiveTasks: Number.MAX_VALUE,\n maxQueueSize: Number.MAX_VALUE,\n });\n\n // Map to store ack functions of currently held locks: lockId -> ack()\n const locks = new Map<string, () => void>();\n\n return {\n async acquire({ lockId }: AcquireLockOptions): Promise<void> {\n // If the lock is already held, we just queue up another task in the same group.\n // TaskProcessor ensures tasks in the same group run one at a time.\n await new Promise<void>((resolve, reject) => {\n taskProcessor\n .enqueue(\n ({ ack }) => {\n // When this task starts, it means the previous lock (if any) was released\n // and now we have exclusive access.\n locks.set(lockId, ack);\n // We do NOT call ack() here. We hold onto the lock.\n resolve();\n return Promise.resolve();\n },\n { taskGroupId: lockId },\n )\n .catch(reject);\n });\n },\n\n async tryAcquire({ lockId }: AcquireLockOptions): Promise<boolean> {\n // If lock is already held, fail immediately\n if (locks.has(lockId)) {\n return false;\n }\n\n // TODO: Check pending queue\n await this.acquire({ lockId });\n\n return true;\n },\n\n release({ lockId }: ReleaseLockOptions): Promise<boolean> {\n const ack = locks.get(lockId);\n if (ack === undefined) {\n return Promise.resolve(true);\n }\n locks.delete(lockId);\n ack();\n return Promise.resolve(true);\n },\n\n async withAcquire<Result = unknown>(\n handle: () => Promise<Result>,\n { lockId }: AcquireLockOptions,\n ): Promise<Result> {\n return taskProcessor.enqueue(\n async ({ ack }) => {\n // When this task starts, it means the previous lock (if any) was released\n // and now we have exclusive access.\n locks.set(lockId, ack);\n\n // We do NOT call ack() here. We hold onto the lock.\n try {\n return await handle();\n } finally {\n locks.delete(lockId);\n ack();\n }\n },\n { taskGroupId: lockId },\n );\n },\n };\n};\n","import retry from 'async-retry';\n\nexport type AsyncRetryOptions = retry.Options & {\n shouldRetryError?: (error: unknown) => boolean;\n};\n\nexport const NoRetries: AsyncRetryOptions = { retries: 0 };\n\nexport const asyncRetry = async <T>(\n fn: () => Promise<T>,\n opts?: AsyncRetryOptions,\n): Promise<T> => {\n if (opts === undefined || opts.retries === 0) return fn();\n\n return retry(\n async (bail) => {\n try {\n return await fn();\n } catch (error) {\n if (opts?.shouldRetryError && !opts.shouldRetryError(error)) {\n bail(error as Error);\n }\n throw error;\n }\n },\n opts ?? { retries: 0 },\n );\n};\n","import {\n canCreateEventStoreSession,\n isExpectedVersionConflictError,\n NO_CONCURRENCY_CHECK,\n nulloSessionFactory,\n STREAM_DOES_NOT_EXIST,\n type AppendStreamResultOfEventStore,\n type EventStore,\n type EventStoreSession,\n type ExpectedStreamVersion,\n type StreamPositionTypeOfEventStore,\n} from '../eventStore';\nimport type { Event } from '../typing';\nimport { asyncRetry, NoRetries, type AsyncRetryOptions } from '../utils';\n\nexport const CommandHandlerStreamVersionConflictRetryOptions: AsyncRetryOptions =\n {\n retries: 3,\n minTimeout: 100,\n factor: 1.5,\n shouldRetryError: isExpectedVersionConflictError,\n };\n\nexport type CommandHandlerRetryOptions =\n | AsyncRetryOptions\n | { onVersionConflict: true | number | AsyncRetryOptions };\n\nconst fromCommandHandlerRetryOptions = (\n retryOptions: CommandHandlerRetryOptions | undefined,\n): AsyncRetryOptions => {\n if (retryOptions === undefined) return NoRetries;\n\n if ('onVersionConflict' in retryOptions) {\n if (typeof retryOptions.onVersionConflict === 'boolean')\n return CommandHandlerStreamVersionConflictRetryOptions;\n else if (typeof retryOptions.onVersionConflict === 'number')\n return {\n ...CommandHandlerStreamVersionConflictRetryOptions,\n retries: retryOptions.onVersionConflict,\n };\n else return retryOptions.onVersionConflict;\n }\n\n return retryOptions;\n};\n\n// #region command-handler\nexport type CommandHandlerResult<\n State,\n StreamEvent extends Event,\n Store extends EventStore,\n> = AppendStreamResultOfEventStore<Store> & {\n newState: State;\n newEvents: StreamEvent[];\n};\n\nexport type CommandHandlerOptions<State, StreamEvent extends Event> = {\n evolve: (state: State, event: StreamEvent) => State;\n initialState: () => State;\n mapToStreamId?: (id: string) => string;\n retry?: CommandHandlerRetryOptions;\n};\n\nexport type HandleOptions<Store extends EventStore> = Parameters<\n Store['appendToStream']\n>[2] &\n (\n | {\n expectedStreamVersion?: ExpectedStreamVersion<\n StreamPositionTypeOfEventStore<Store>\n >;\n }\n | {\n retry?: CommandHandlerRetryOptions;\n }\n );\n\nexport const CommandHandler =\n <State, StreamEvent extends Event>(\n options: CommandHandlerOptions<State, StreamEvent>,\n ) =>\n async <Store extends EventStore>(\n store: Store,\n id: string,\n handle: (\n state: State,\n ) => StreamEvent | StreamEvent[] | Promise<StreamEvent | StreamEvent[]>,\n handleOptions?: HandleOptions<Store>,\n ): Promise<CommandHandlerResult<State, StreamEvent, Store>> =>\n asyncRetry(\n async () => {\n const result = await withSession<\n Store,\n CommandHandlerResult<\n State,\n StreamEvent,\n StreamPositionTypeOfEventStore<Store>\n >\n >(store, async ({ eventStore }) => {\n const { evolve, initialState } = options;\n const mapToStreamId = options.mapToStreamId ?? ((id) => id);\n\n const streamName = mapToStreamId(id);\n\n // 1. Aggregate the stream\n const aggregationResult = await eventStore.aggregateStream<\n State,\n StreamEvent\n >(streamName, {\n evolve,\n initialState,\n read: {\n // expected stream version is passed to fail fast\n // if stream is in the wrong state\n expectedStreamVersion:\n handleOptions?.expectedStreamVersion ?? NO_CONCURRENCY_CHECK,\n },\n });\n\n // 2. Use the aggregate state\n\n const {\n state,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n currentStreamVersion,\n streamExists: _streamExists,\n ...restOfAggregationResult\n } = aggregationResult;\n\n // 3. Run business logic\n const result = await handle(state);\n\n const newEvents = Array.isArray(result) ? result : [result];\n\n if (newEvents.length === 0) {\n return {\n ...restOfAggregationResult,\n newEvents: [],\n newState: state,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n nextExpectedStreamVersion: currentStreamVersion,\n createdNewStream: false,\n } as unknown as CommandHandlerResult<State, StreamEvent, Store>;\n }\n\n // Either use:\n // - provided expected stream version,\n // - current stream version got from stream aggregation,\n // - or expect stream not to exists otherwise.\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const expectedStreamVersion: ExpectedStreamVersion<\n StreamPositionTypeOfEventStore<Store>\n > =\n handleOptions?.expectedStreamVersion ??\n (aggregationResult.streamExists\n ? (currentStreamVersion as ExpectedStreamVersion<\n StreamPositionTypeOfEventStore<Store>\n >)\n : STREAM_DOES_NOT_EXIST);\n\n // 4. Append result to the stream\n const appendResult = await eventStore.appendToStream(\n streamName,\n newEvents,\n {\n ...handleOptions,\n expectedStreamVersion,\n },\n );\n\n // 5. Return result with updated state\n return {\n ...appendResult,\n newEvents,\n newState: newEvents.reduce(evolve, state),\n } as unknown as CommandHandlerResult<State, StreamEvent, Store>;\n });\n\n return result;\n },\n fromCommandHandlerRetryOptions(\n handleOptions && 'retry' in handleOptions\n ? handleOptions.retry\n : options.retry,\n ),\n );\n// #endregion command-handler\n\nconst withSession = <EventStoreType extends EventStore, T = unknown>(\n eventStore: EventStoreType,\n callback: (session: EventStoreSession<EventStoreType>) => Promise<T>,\n) => {\n const sessionFactory = canCreateEventStoreSession<EventStoreType>(eventStore)\n ? eventStore\n : nulloSessionFactory<EventStoreType>(eventStore);\n\n return sessionFactory.withSession(callback);\n};\n","import type { EventStore } from '../eventStore';\nimport type { Command, Event } from '../typing';\nimport type { Decider } from '../typing/decider';\nimport {\n CommandHandler,\n type CommandHandlerOptions,\n type HandleOptions,\n} from './handleCommand';\n\n// #region command-handler\n\nexport type DeciderCommandHandlerOptions<\n State,\n CommandType extends Command,\n StreamEvent extends Event,\n> = CommandHandlerOptions<State, StreamEvent> &\n Decider<State, CommandType, StreamEvent>;\n\nexport const DeciderCommandHandler =\n <State, CommandType extends Command, StreamEvent extends Event>(\n options: DeciderCommandHandlerOptions<State, CommandType, StreamEvent>,\n ) =>\n async <Store extends EventStore>(\n eventStore: Store,\n id: string,\n command: CommandType,\n handleOptions?: HandleOptions<Store>,\n ) => {\n const { decide, ...rest } = options;\n\n return CommandHandler<State, StreamEvent>(rest)(\n eventStore,\n id,\n (state) => decide(command, state),\n handleOptions,\n );\n };\n// #endregion command-handler\n","import { EmmettError } from '../errors';\nimport {\n type Command,\n type CommandTypeOf,\n type Event,\n type EventTypeOf,\n} from '../typing';\n\nexport interface CommandSender {\n send<CommandType extends Command = Command>(\n command: CommandType,\n ): Promise<void>;\n}\n\nexport interface EventsPublisher {\n publish<EventType extends Event = Event>(event: EventType): Promise<void>;\n}\n\nexport type ScheduleOptions = { afterInMs: number } | { at: Date };\n\nexport interface MessageScheduler<CommandOrEvent extends Command | Event> {\n schedule<MessageType extends CommandOrEvent>(\n message: MessageType,\n when?: ScheduleOptions,\n ): void;\n}\n\nexport interface CommandBus extends CommandSender, MessageScheduler<Command> {}\n\nexport interface EventBus extends EventsPublisher, MessageScheduler<Event> {}\n\nexport interface MessageBus extends CommandBus, EventBus {\n schedule<MessageType extends Command | Event>(\n message: MessageType,\n when?: ScheduleOptions,\n ): void;\n}\n\ntype CommandHandler<CommandType extends Command = Command> = (\n command: CommandType,\n) => Promise<void> | void;\n\nexport interface CommandProcessor {\n handle<CommandType extends Command>(\n commandHandler: CommandHandler<CommandType>,\n ...commandTypes: CommandTypeOf<CommandType>[]\n ): void;\n}\n\ntype EventHandler<EventType extends Event = Event> = (\n event: EventType,\n) => Promise<void> | void;\n\nexport interface EventProcessor {\n subscribe<EventType extends Event>(\n eventHandler: EventHandler<EventType>,\n ...eventTypes: EventTypeOf<EventType>[]\n ): void;\n}\n\nexport type ScheduledMessage = {\n message: Event | Command;\n options?: ScheduleOptions;\n};\n\nexport interface ScheduledMessageProcessor {\n dequeue(): ScheduledMessage[];\n}\n\nexport type MessageHandler = CommandHandler | EventHandler;\n\nexport type MessageProcessor = EventProcessor | CommandProcessor;\n\nexport const getInMemoryMessageBus = (): MessageBus &\n EventProcessor &\n CommandProcessor &\n ScheduledMessageProcessor => {\n const allHandlers = new Map<string, MessageHandler[]>();\n let pendingMessages: ScheduledMessage[] = [];\n\n return {\n send: async <CommandType extends Command = Command>(\n command: CommandType,\n ): Promise<void> => {\n const handlers = allHandlers.get(command.type);\n\n if (handlers === undefined || handlers.length === 0)\n throw new EmmettError(\n `No handler registered for command ${command.type}!`,\n );\n\n const commandHandler = handlers[0] as CommandHandler<CommandType>;\n\n await commandHandler(command);\n },\n\n publish: async <EventType extends Event = Event>(\n event: EventType,\n ): Promise<void> => {\n const handlers = allHandlers.get(event.type) ?? [];\n\n for (const handler of handlers) {\n const eventHandler = handler as EventHandler<EventType>;\n\n await eventHandler(event);\n }\n },\n\n schedule: <MessageType extends Command | Event>(\n message: MessageType,\n when?: ScheduleOptions,\n ): void => {\n pendingMessages = [...pendingMessages, { message, options: when }];\n },\n\n handle: <CommandType extends Command>(\n commandHandler: CommandHandler<CommandType>,\n ...commandTypes: CommandTypeOf<CommandType>[]\n ): void => {\n const alreadyRegistered = [...allHandlers.keys()].filter((registered) =>\n commandTypes.includes(registered),\n );\n\n if (alreadyRegistered.length > 0)\n throw new EmmettError(\n `Cannot register handler for commands ${alreadyRegistered.join(', ')} as they're already registered!`,\n );\n for (const commandType of commandTypes) {\n allHandlers.set(commandType, [commandHandler as MessageHandler]);\n }\n },\n\n subscribe<EventType extends Event>(\n eventHandler: EventHandler<EventType>,\n ...eventTypes: EventTypeOf<EventType>[]\n ): void {\n for (const eventType of eventTypes) {\n if (!allHandlers.has(eventType)) allHandlers.set(eventType, []);\n\n allHandlers.set(eventType, [\n ...(allHandlers.get(eventType) ?? []),\n eventHandler as MessageHandler,\n ]);\n }\n },\n\n dequeue: (): ScheduledMessage[] => {\n const pending = pendingMessages;\n pendingMessages = [];\n return pending;\n },\n };\n};\n","export class ParseError extends Error {\n constructor(text: string) {\n super(`Cannot parse! ${text}`);\n }\n}\n\nexport type Mapper<From, To = From> =\n | ((value: unknown) => To)\n | ((value: Partial<From>) => To)\n | ((value: From) => To)\n | ((value: Partial<To>) => To)\n | ((value: To) => To)\n | ((value: Partial<To | From>) => To)\n | ((value: To | From) => To);\n\nexport type MapperArgs<From, To = From> = Partial<From> &\n From &\n Partial<To> &\n To;\n\nexport type ParseOptions<From, To = From> = {\n reviver?: (key: string, value: unknown) => unknown;\n map?: Mapper<From, To>;\n typeCheck?: <To>(value: unknown) => value is To;\n};\n\nexport type StringifyOptions<From, To = From> = {\n map?: Mapper<From, To>;\n};\n\nexport const JSONParser = {\n stringify: <From, To = From>(\n value: From,\n options?: StringifyOptions<From, To>,\n ) => {\n return JSON.stringify(\n options?.map ? options.map(value as MapperArgs<From, To>) : value,\n //TODO: Consider adding support to DateTime and adding specific format to mark that's a bigint\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n (_, v) => (typeof v === 'bigint' ? v.toString() : v),\n );\n },\n parse: <From, To = From>(\n text: string,\n options?: ParseOptions<From, To>,\n ): To | undefined => {\n const parsed: unknown = JSON.parse(text, options?.reviver);\n\n if (options?.typeCheck && !options?.typeCheck<To>(parsed))\n throw new ParseError(text);\n\n return options?.map\n ? options.map(parsed as MapperArgs<From, To>)\n : (parsed as To | undefined);\n },\n};\n","import { EmmettError } from '../errors';\nimport { JSONParser } from '../serialization';\nimport type {\n AnyReadEventMetadata,\n CanHandle,\n DefaultRecord,\n Event,\n ReadEvent,\n} from '../typing';\nimport { arrayUtils } from '../utils';\n\nexport type ProjectionHandlingType = 'inline' | 'async';\n\nexport type ProjectionHandler<\n EventType extends Event = Event,\n EventMetaDataType extends AnyReadEventMetadata = AnyReadEventMetadata,\n ProjectionHandlerContext extends DefaultRecord = DefaultRecord,\n> = (\n events: ReadEvent<EventType, EventMetaDataType>[],\n context: ProjectionHandlerContext,\n) => Promise<void> | void;\n\nexport interface ProjectionDefinition<\n ReadEventMetadataType extends AnyReadEventMetadata = AnyReadEventMetadata,\n ProjectionHandlerContext extends DefaultRecord = DefaultRecord,\n> {\n name?: string;\n canHandle: CanHandle<Event>;\n handle: ProjectionHandler<\n Event,\n ReadEventMetadataType,\n ProjectionHandlerContext\n >;\n}\n\nexport interface TypedProjectionDefinition<\n EventType extends Event = Event,\n EventMetaDataType extends AnyReadEventMetadata = AnyReadEventMetadata,\n ProjectionHandlerContext extends DefaultRecord = DefaultRecord,\n> {\n name?: string;\n canHandle: CanHandle<EventType>;\n handle: ProjectionHandler<\n EventType,\n EventMetaDataType,\n ProjectionHandlerContext\n >;\n}\n\nexport type ProjectionRegistration<\n HandlingType extends ProjectionHandlingType,\n ReadEventMetadataType extends AnyReadEventMetadata = AnyReadEventMetadata,\n ProjectionHandlerContext extends DefaultRecord = DefaultRecord,\n> = {\n type: HandlingType;\n projection: ProjectionDefinition<\n ReadEventMetadataType,\n ProjectionHandlerContext\n >;\n};\n\nexport const filterProjections = <\n ReadEventMetadataType extends AnyReadEventMetadata = AnyReadEventMetadata,\n ProjectionHandlerContext extends DefaultRecord = DefaultRecord,\n>(\n type: ProjectionHandlingType,\n projections: ProjectionRegistration<\n ProjectionHandlingType,\n ReadEventMetadataType,\n ProjectionHandlerContext\n >[],\n) => {\n const inlineProjections = projections\n .filter((projection) => projection.type === type)\n .map(({ projection }) => projection);\n\n const duplicateRegistrations = arrayUtils.getDuplicates(\n inlineProjections,\n (proj) => proj.name,\n );\n\n if (duplicateRegistrations.length > 0) {\n throw new EmmettError(`You cannot register multiple projections with the same name (or without the name).\n Ensure that:\n ${JSONParser.stringify(duplicateRegistrations)}\n have different names`);\n }\n\n return inlineProjections;\n};\n\nexport const projection = <\n EventType extends Event = Event,\n EventMetaDataType extends AnyReadEventMetadata = AnyReadEventMetadata,\n ProjectionHandlerContext extends DefaultRecord = DefaultRecord,\n ProjectionDefintionType extends TypedProjectionDefinition<\n EventType,\n EventMetaDataType,\n ProjectionHandlerContext\n > = TypedProjectionDefinition<\n EventType,\n EventMetaDataType,\n ProjectionHandlerContext\n >,\n>(\n definition: ProjectionDefintionType,\n): ProjectionDefintionType => definition;\n\nexport const inlineProjections = <\n ReadEventMetadataType extends AnyReadEventMetadata = AnyReadEventMetadata,\n ProjectionHandlerContext extends DefaultRecord = DefaultRecord,\n ProjectionDefintionType extends ProjectionDefinition<\n ReadEventMetadataType,\n ProjectionHandlerContext\n > = ProjectionDefinition<ReadEventMetadataType, ProjectionHandlerContext>,\n>(\n definitions: ProjectionDefintionType[],\n): ProjectionRegistration<\n 'inline',\n ReadEventMetadataType,\n ProjectionHandlerContext\n>[] => definitions.map((projection) => ({ type: 'inline', projection }));\n\nexport const asyncProjections = <\n ReadEventMetadataType extends AnyReadEventMetadata = AnyReadEventMetadata,\n ProjectionHandlerContext extends DefaultRecord = DefaultRecord,\n ProjectionDefintionType extends ProjectionDefinition<\n ReadEventMetadataType,\n ProjectionHandlerContext\n > = ProjectionDefinition<ReadEventMetadataType, ProjectionHandlerContext>,\n>(\n definitions: ProjectionDefintionType[],\n): ProjectionRegistration<\n 'async',\n ReadEventMetadataType,\n ProjectionHandlerContext\n>[] => definitions.map((projection) => ({ type: 'async', projection }));\n\nexport const projections = {\n inline: inlineProjections,\n async: asyncProjections,\n};\n","export const concatUint8Arrays = (chunks: Uint8Array[]): Uint8Array => {\n const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n return result;\n};\n","import type { ReadableStream } from 'web-streams-polyfill';\n\nexport const collect = async <T>(stream: ReadableStream<T>): Promise<T[]> => {\n const results: T[] = [];\n\n for await (const value of stream) {\n results.push(value as T);\n }\n\n return results;\n};\n","import type { Decoder } from '.';\nimport { concatUint8Arrays } from '../binaryArrays';\n\nexport class BinaryJsonDecoder<Decoded>\n implements Decoder<Uint8Array, Decoded>\n{\n private buffer: Uint8Array[] = [];\n\n addToBuffer(data: Uint8Array): void {\n this.buffer.push(data);\n }\n\n clearBuffer(): void {\n this.buffer = [];\n }\n\n hasCompleteMessage(): boolean {\n const combined = concatUint8Arrays(this.buffer);\n const text = new TextDecoder().decode(combined);\n return text.includes('\\n');\n }\n\n decode(): Decoded | null {\n if (!this.hasCompleteMessage()) {\n return null;\n }\n\n const combined = concatUint8Arrays(this.buffer);\n const text = new TextDecoder().decode(combined);\n const delimiterIndex = text.indexOf('\\n');\n\n if (delimiterIndex === -1) {\n return null;\n }\n\n const jsonString = text.slice(0, delimiterIndex);\n const remaining = new Uint8Array(combined.buffer, delimiterIndex + 1);\n this.buffer = remaining.byteLength > 0 ? [remaining] : [];\n\n return JSON.parse(jsonString) as Decoded;\n }\n}\n","import type { Decoder } from '.';\n\nexport class StringDecoder<Decoded> implements Decoder<string, Decoded> {\n protected buffer: string[] = [];\n\n constructor(private transform: (input: string) => Decoded) {\n this.transform = transform;\n }\n\n addToBuffer(data: string): void {\n this.buffer.push(data);\n }\n\n clearBuffer(): void {\n this.buffer = [];\n }\n\n hasCompleteMessage(): boolean {\n return this.buffer.some((chunk) => chunk.includes('\\n'));\n }\n\n decode(): Decoded | null {\n const completeString = this.buffer.join('');\n\n if (!this.hasCompleteMessage()) {\n if (completeString.trim().length > 0) {\n throw new Error('Unterminated string in JSON at position');\n }\n return null;\n }\n\n const delimiterIndex = completeString.indexOf('\\n');\n const message = completeString.slice(0, delimiterIndex).trim();\n this.buffer = [completeString.slice(delimiterIndex + 1)];\n\n return this.transform(message);\n }\n}\n","import { StringDecoder } from './string';\n\nexport class JsonDecoder<Decoded> extends StringDecoder<Decoded> {\n constructor() {\n super((jsonString) => JSON.parse(jsonString) as Decoded);\n }\n}\n","import type { Decoder } from '.';\n\nexport class ObjectDecoder<Decoded> implements Decoder<Decoded, Decoded> {\n private buffer: Decoded | null = null;\n\n addToBuffer(data: Decoded): void {\n this.buffer = data;\n }\n\n clearBuffer(): void {\n this.buffer = null;\n }\n\n hasCompleteMessage(): boolean {\n return this.buffer !== null;\n }\n\n decode(): Decoded | null {\n if (!this.hasCompleteMessage() || !this.buffer) {\n return null;\n }\n\n const data = this.buffer;\n this.clearBuffer();\n return data as Decoded;\n }\n}\n","import type { Decoder } from '.';\nimport { BinaryJsonDecoder } from './binary';\nimport { JsonDecoder } from './json';\nimport { ObjectDecoder } from './object';\n\nexport class CompositeDecoder<Decoded> implements Decoder<unknown, Decoded> {\n constructor(\n private decoders: [(data: unknown) => boolean, Decoder<unknown, Decoded>][],\n ) {}\n\n private decoderFor(data: unknown): Decoder<unknown, unknown> | null {\n const decoder = this.decoders.find((d) => d[0](data));\n\n if (!decoder) return null;\n\n return decoder[1];\n }\n\n addToBuffer(data: unknown): void {\n this.decoderFor(data)?.addToBuffer(data);\n }\n\n clearBuffer(): void {\n for (const decoder of this.decoders.map((d) => d[1])) {\n decoder.clearBuffer();\n }\n }\n\n hasCompleteMessage(): boolean {\n return this.decoders.some((d) => d[1].hasCompleteMessage());\n }\n\n decode(): Decoded | null {\n const decoder = this.decoders\n .map((d) => d[1])\n .find((d) => d.hasCompleteMessage());\n\n return decoder?.decode() ?? null;\n }\n}\n\nexport class DefaultDecoder<Decoded> extends CompositeDecoder<Decoded> {\n constructor() {\n super([\n [(data) => typeof data === 'string', new JsonDecoder<Decoded>()],\n [(data) => data instanceof Uint8Array, new BinaryJsonDecoder<Decoded>()],\n [(data) => typeof data === 'object', new ObjectDecoder<Decoded>()],\n ]);\n }\n}\n","import { ReadableStream } from 'web-streams-polyfill';\n\nexport const fromArray = <T>(chunks: T[]) =>\n new ReadableStream<T>({\n start(controller) {\n for (const chunk of chunks) controller.enqueue(chunk);\n controller.close();\n },\n });\n","import { fromArray } from './fromArray';\nexport const streamGenerators = { fromArray };\n","import {\n type ReadableStream,\n type ReadableStreamDefaultReadResult,\n type TransformStreamDefaultController,\n} from 'web-streams-polyfill';\nimport type { AsyncRetryOptions } from '../utils';\nimport type { Decoder } from './decoders';\nimport { DefaultDecoder } from './decoders/composite';\nimport { streamTransformations } from './transformations';\n\nconst { retry } = streamTransformations;\n\nexport const restream = <\n Source = unknown,\n Transformed = Source,\n StreamType = Source,\n>(\n createSourceStream: () => ReadableStream<StreamType>,\n transform: (input: Source) => Transformed = (source) =>\n source as unknown as Transformed,\n retryOptions: AsyncRetryOptions = { forever: true, minTimeout: 25 },\n decoder: Decoder<StreamType, Source> = new DefaultDecoder<Source>(),\n): ReadableStream<Transformed> =>\n retry(createSourceStream, handleChunk(transform, decoder), retryOptions)\n .readable;\n\nconst handleChunk =\n <Source = unknown, Transformed = Source, StreamType = Source>(\n transform: (input: Source) => Transformed = (source) =>\n source as unknown as Transformed,\n decoder: Decoder<StreamType, Source> = new DefaultDecoder<Source>(),\n ) =>\n (\n readResult: ReadableStreamDefaultReadResult<StreamType>,\n controller: TransformStreamDefaultController<Transformed>,\n ): void => {\n const { done: isDone, value } = readResult;\n\n if (value) decoder.addToBuffer(value);\n\n if (!isDone && !decoder.hasCompleteMessage()) return;\n\n decodeAndTransform(decoder, transform, controller);\n };\n\nconst decodeAndTransform = <StreamType, Source, Transformed = Source>(\n decoder: Decoder<StreamType, Source>,\n transform: (input: Source) => Transformed,\n controller: TransformStreamDefaultController<Transformed>,\n) => {\n try {\n const decoded = decoder.decode();\n if (!decoded) return; // TODO: Add a proper handling of decode errors\n\n const transformed = transform(decoded);\n controller.enqueue(transformed);\n } catch (error) {\n controller.error(new Error(`Decoding error: ${error?.toString()}`));\n }\n};\n","import { TransformStream } from 'web-streams-polyfill';\n\nexport const filter = <Item>(filter: (item: Item) => boolean) =>\n new TransformStream<Item, Item>({\n transform(chunk, controller) {\n if (filter(chunk)) {\n controller.enqueue(chunk);\n }\n },\n });\n","import { TransformStream } from 'web-streams-polyfill';\n\nexport const map = <From, To>(map: (item: From) => To) =>\n new TransformStream<From, To>({\n transform(chunk, controller) {\n controller.enqueue(map(chunk));\n },\n });\n","import { TransformStream } from 'web-streams-polyfill';\n\nexport const reduce = <I, O>(\n reducer: (accumulator: O, chunk: I) => O,\n initialValue: O,\n) => new ReduceTransformStream<I, O>(reducer, initialValue);\n\nexport class ReduceTransformStream<I, O> extends TransformStream<I, O> {\n private accumulator: O;\n private reducer: (accumulator: O, chunk: I) => O;\n\n constructor(reducer: (accumulator: O, chunk: I) => O, initialValue: O) {\n super({\n transform: (chunk) => {\n this.accumulator = this.reducer(this.accumulator, chunk);\n },\n flush: (controller) => {\n controller.enqueue(this.accumulator);\n controller.terminate();\n },\n });\n\n this.accumulator = initialValue;\n this.reducer = reducer;\n }\n}\n","import {\n type ReadableStream,\n type ReadableStreamDefaultReadResult,\n TransformStream,\n type TransformStreamDefaultController,\n} from 'web-streams-polyfill';\nimport { type AsyncRetryOptions, asyncRetry } from '../../utils';\n\nexport const retryStream = <\n Source = unknown,\n Transformed = Source,\n StreamType = Source,\n>(\n createSourceStream: () => ReadableStream<StreamType>,\n handleChunk: (\n readResult: ReadableStreamDefaultReadResult<StreamType>,\n controller: TransformStreamDefaultController<Transformed>,\n ) => Promise<void> | void,\n retryOptions: AsyncRetryOptions = { forever: true, minTimeout: 25 },\n): TransformStream<Source, Transformed> =>\n new TransformStream<Source, Transformed>({\n start(controller) {\n asyncRetry(\n () => onRestream(createSourceStream, handleChunk, controller),\n retryOptions,\n ).catch((error) => {\n controller.error(error);\n });\n },\n });\n\nconst onRestream = async <StreamType, Source, Transformed = Source>(\n createSourceStream: () => ReadableStream<StreamType>,\n handleChunk: (\n readResult: ReadableStreamDefaultReadResult<StreamType>,\n controller: TransformStreamDefaultController<Transformed>,\n ) => Promise<void> | void,\n controller: TransformStreamDefaultController<Transformed>,\n): Promise<void> => {\n const sourceStream = createSourceStream();\n const reader = sourceStream.getReader();\n\n try {\n let done: boolean;\n\n do {\n const result = await reader.read();\n done = result.done;\n\n await handleChunk(result, controller);\n\n if (done) {\n controller.terminate();\n }\n } while (!done);\n } finally {\n reader.releaseLock();\n }\n};\n","import { TransformStream } from 'web-streams-polyfill';\n\nexport const skip = <T>(limit: number) => new SkipTransformStream<T>(limit);\n\nexport class SkipTransformStream<T> extends TransformStream<T, T> {\n private count = 0;\n private skip: number;\n\n constructor(skip: number) {\n super({\n transform: (chunk, controller) => {\n this.count++;\n if (this.count > this.skip) {\n controller.enqueue(chunk);\n }\n },\n });\n\n this.skip = skip;\n }\n}\n","import { TransformStream } from 'web-streams-polyfill';\n\nexport const stopAfter = <Item>(stopCondition: (item: Item) => boolean) =>\n new TransformStream<Item, Item>({\n transform(chunk, controller) {\n controller.enqueue(chunk);\n\n if (stopCondition(chunk)) {\n controller.terminate();\n }\n },\n });\n","import { TransformStream } from 'web-streams-polyfill';\n\nexport const stopOn = <Item>(stopCondition: (item: Item) => boolean) =>\n new TransformStream<Item, Item>({\n async transform(chunk, controller) {\n if (!stopCondition(chunk)) {\n controller.enqueue(chunk);\n return;\n }\n await Promise.resolve();\n controller.terminate();\n },\n });\n","import { TransformStream } from 'web-streams-polyfill';\n\nexport const take = <T>(limit: number) => new TakeTransformStream<T>(limit);\n\nexport class TakeTransformStream<T> extends TransformStream<T, T> {\n private count = 0;\n private limit: number;\n\n constructor(limit: number) {\n super({\n transform: (chunk, controller) => {\n if (this.count < this.limit) {\n this.count++;\n controller.enqueue(chunk);\n } else {\n controller.terminate();\n }\n },\n });\n\n this.limit = limit;\n }\n}\n","import { TransformStream } from 'web-streams-polyfill';\n\nexport const waitAtMost = <Item>(waitTimeInMs: number) =>\n new TransformStream<Item, Item>({\n start(controller) {\n const timeoutId = setTimeout(() => {\n controller.terminate();\n }, waitTimeInMs);\n\n const originalTerminate = controller.terminate.bind(controller);\n\n // Clear the timeout if the stream is terminated early\n controller.terminate = () => {\n clearTimeout(timeoutId);\n originalTerminate();\n };\n },\n transform(chunk, controller) {\n controller.enqueue(chunk);\n },\n });\n","import { filter } from './filter';\nimport { map } from './map';\nimport {\n notifyAboutNoActiveReadersStream,\n NotifyAboutNoActiveReadersStream,\n} from './notifyAboutNoActiveReaders';\nimport { reduce, ReduceTransformStream } from './reduce';\nimport { retryStream } from './retry';\nimport { skip, SkipTransformStream } from './skip';\nimport { stopAfter } from './stopAfter';\nimport { stopOn } from './stopOn';\nimport { take, TakeTransformStream } from './take';\nimport { waitAtMost } from './waitAtMost';\n\nexport const streamTransformations = {\n filter,\n take,\n TakeTransformStream,\n skip,\n SkipTransformStream,\n map,\n notifyAboutNoActiveReadersStream,\n NotifyAboutNoActiveReadersStream,\n reduce,\n ReduceTransformStream,\n retry: retryStream,\n stopAfter,\n stopOn,\n waitAtMost,\n};\n","import { JSONParser } from '../serialization';\nimport type { DefaultRecord } from '../typing';\nimport { deepEquals } from '../utils';\n\nexport class AssertionError extends Error {\n constructor(message: string) {\n super(message);\n }\n}\n\nexport const isSubset = (superObj: unknown, subObj: unknown): boolean => {\n const sup = superObj as DefaultRecord;\n const sub = subObj as DefaultRecord;\n\n assertOk(sup);\n assertOk(sub);\n\n return Object.keys(sub).every((ele: string) => {\n if (typeof sub[ele] == 'object') {\n return isSubset(sup[ele], sub[ele]);\n }\n return sub[ele] === sup[ele];\n });\n};\n\nexport const assertFails = (message?: string) => {\n throw new AssertionError(message ?? 'That should not ever happened, right?');\n};\n\nexport const assertThrowsAsync = async <TError extends Error>(\n fun: () => Promise<void>,\n errorCheck?: (error: Error) => boolean,\n): Promise<TError> => {\n try {\n await fun();\n } catch (error) {\n const typedError = error as TError;\n if (typedError instanceof AssertionError || !errorCheck) {\n assertFalse(\n typedError instanceof AssertionError,\n \"Function didn't throw expected error\",\n );\n return typedError;\n }\n\n assertTrue(\n errorCheck(typedError),\n `Error doesn't match the expected condition: ${JSONParser.stringify(error)}`,\n );\n\n return typedError;\n }\n throw new AssertionError(\"Function didn't throw expected error\");\n};\n\nexport const assertThrows = <TError extends Error>(\n fun: () => void,\n errorCheck?: (error: Error) => boolean,\n): TError => {\n try {\n fun();\n } catch (error) {\n const typedError = error as TError;\n\n if (errorCheck) {\n assertTrue(\n errorCheck(typedError),\n `Error doesn't match the expected condition: ${JSONParser.stringify(error)}`,\n );\n } else if (typedError instanceof AssertionError) {\n assertFalse(\n typedError instanceof AssertionError,\n \"Function didn't throw expected error\",\n );\n }\n\n return typedError;\n }\n throw new AssertionError(\"Function didn't throw expected error\");\n};\n\nexport const assertDoesNotThrow = <TError extends Error>(\n fun: () => void,\n errorCheck?: (error: Error) => boolean,\n): TError | null => {\n try {\n fun();\n return null;\n } catch (error) {\n const typedError = error as TError;\n\n if (errorCheck) {\n assertFalse(\n errorCheck(typedError),\n `Error matching the expected condition was thrown!: ${JSONParser.stringify(error)}`,\n );\n } else {\n assertFails(`Function threw an error: ${JSONParser.stringify(error)}`);\n }\n\n return typedError;\n }\n};\n\nexport const assertRejects = async <T, TError extends Error = Error>(\n promise: Promise<T>,\n errorCheck?: ((error: TError) => boolean) | TError,\n) => {\n try {\n await promise;\n throw new AssertionError(\"Function didn't throw expected error\");\n } catch (error) {\n if (!errorCheck) return;\n\n if (errorCheck instanceof Error) assertDeepEqual(error, errorCheck);\n else assertTrue(errorCheck(error as TError));\n }\n};\n\nexport const assertMatches = (\n actual: unknown,\n expected: unknown,\n message?: string,\n) => {\n if (!isSubset(actual, expected))\n throw new AssertionError(\n message ??\n `subObj:\\n${JSONParser.stringify(expected)}\\nis not subset of\\n${JSONParser.stringify(actual)}`,\n );\n};\n\nexport const assertDeepEqual = <T = unknown>(\n actual: T,\n expected: T,\n message?: string,\n) => {\n if (!deepEquals(actual, expected))\n throw new AssertionError(\n message ??\n `subObj:\\n${JSONParser.stringify(expected)}\\nis not equal to\\n${JSONParser.stringify(actual)}`,\n );\n};\n\nexport const assertNotDeepEqual = <T = unknown>(\n actual: T,\n expected: T,\n message?: string,\n) => {\n if (deepEquals(actual, expected))\n throw new AssertionError(\n message ??\n `subObj:\\n${JSONParser.stringify(expected)}\\nis equals to\\n${JSONParser.stringify(actual)}`,\n );\n};\n\nexport const assertThat = <T>(item: T) => {\n return {\n isEqualTo: (other: T) => assertTrue(deepEquals(item, other)),\n };\n};\n\nexport function assertFalse(\n condition: boolean,\n message?: string,\n): asserts condition is false {\n if (condition !== false)\n throw new AssertionError(message ?? `Condition is true`);\n}\n\nexport function assertTrue(\n condition: boolean,\n message?: string,\n): asserts condition is true {\n if (condition !== true)\n throw new AssertionError(message ?? `Condition is false`);\n}\n\nexport function assertOk<T>(\n obj: T | null | undefined,\n message?: string,\n): asserts obj is T {\n if (!obj) throw new AssertionError(message ?? `Condition is not truthy`);\n}\n\nexport function assertEqual<T>(\n expected: T | null | undefined,\n actual: T | null | undefined,\n message?: string,\n): void {\n if (expected !== actual)\n throw new AssertionError(\n `${message ?? 'Objects are not equal'}:\\nExpected: ${JSONParser.stringify(expected)}\\nActual: ${JSONParser.stringify(actual)}`,\n );\n}\n\nexport function assertNotEqual<T>(\n obj: T | null | undefined,\n other: T | null | undefined,\n message?: string,\n): void {\n if (obj === other)\n throw new AssertionError(\n message ?? `Objects are equal: ${JSONParser.stringify(obj)}`,\n );\n}\n\nexport function assertIsNotNull<T extends object | bigint>(\n result: T | null,\n): asserts result is T {\n assertNotEqual(result, null);\n assertOk(result);\n}\n\nexport function assertIsNull<T extends object>(\n result: T | null,\n): asserts result is null {\n assertEqual(result, null);\n}\n\ntype Call = {\n arguments: unknown[];\n result: unknown;\n target: unknown;\n this: unknown;\n};\n\nexport type ArgumentMatcher = (arg: unknown) => boolean;\n\nexport const argValue =\n <T>(value: T): ArgumentMatcher =>\n (arg) =>\n deepEquals(arg, value);\n\nexport const argMatches =\n <T>(matches: (arg: T) => boolean): ArgumentMatcher =>\n (arg) =>\n matches(arg as T);\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nexport type MockedFunction = Function & { mock?: { calls: Call[] } };\n\nexport function verifyThat(fn: MockedFunction) {\n return {\n calledTimes: (times: number) => {\n assertEqual(fn.mock?.calls?.length, times);\n },\n notCalled: () => {\n assertEqual(fn?.mock?.calls?.length, 0);\n },\n called: () => {\n assertTrue(\n fn.mock?.calls.length !== undefined && fn.mock.calls.length > 0,\n );\n },\n calledWith: (...args: unknown[]) => {\n assertTrue(\n fn.mock?.calls.length !== undefined &&\n fn.mock.calls.length >= 1 &&\n fn.mock.calls.some((call) => deepEquals(call.arguments, args)),\n );\n },\n calledOnceWith: (...args: unknown[]) => {\n assertTrue(\n fn.mock?.calls.length !== undefined &&\n fn.mock.calls.length === 1 &&\n fn.mock.calls.some((call) => deepEquals(call.arguments, args)),\n );\n },\n calledWithArgumentMatching: (...matches: ArgumentMatcher[]) => {\n assertTrue(\n fn.mock?.calls.length !== undefined && fn.mock.calls.length >= 1,\n );\n assertTrue(\n fn.mock?.calls.length !== undefined &&\n fn.mock.calls.length >= 1 &&\n fn.mock.calls.some(\n (call) =>\n call.arguments &&\n call.arguments.length >= matches.length &&\n matches.every((match, index) => match(call.arguments[index])),\n ),\n );\n },\n notCalledWithArgumentMatching: (...matches: ArgumentMatcher[]) => {\n assertFalse(\n fn.mock?.calls.length !== undefined &&\n fn.mock.calls.length >= 1 &&\n fn.mock.calls[0]!.arguments &&\n fn.mock.calls[0]!.arguments.length >= matches.length &&\n matches.every((match, index) =>\n match(fn.mock!.calls[0]!.arguments[index]),\n ),\n );\n },\n };\n}\n\nexport const assertThatArray = <T>(array: T[]) => {\n return {\n isEmpty: () =>\n assertEqual(\n array.length,\n 0,\n `Array is not empty ${JSONParser.stringify(array)}`,\n ),\n isNotEmpty: () => assertNotEqual(array.length, 0, `Array is empty`),\n hasSize: (length: number) => assertEqual(array.length, length),\n containsElements: (other: T[]) => {\n assertTrue(other.every((ts) => array.some((o) => deepEquals(ts, o))));\n },\n containsElementsMatching: (other: T[]) => {\n assertTrue(other.every((ts) => array.some((o) => isSubset(o, ts))));\n },\n containsOnlyElementsMatching: (other: T[]) => {\n assertEqual(array.length, other.length, `Arrays lengths don't match`);\n assertTrue(other.every((ts) => array.some((o) => isSubset(o, ts))));\n },\n containsExactlyInAnyOrder: (other: T[]) => {\n assertEqual(array.length, other.length);\n assertTrue(array.every((ts) => other.some((o) => deepEquals(ts, o))));\n },\n containsExactlyInAnyOrderElementsOf: (other: T[]) => {\n assertEqual(array.length, other.length);\n assertTrue(array.every((ts) => other.some((o) => deepEquals(ts, o))));\n },\n containsExactlyElementsOf: (other: T[]) => {\n assertEqual(array.length, other.length);\n for (let i = 0; i < array.length; i++) {\n assertTrue(deepEquals(array[i], other[i]));\n }\n },\n containsExactly: (elem: T) => {\n assertEqual(array.length, 1);\n assertTrue(deepEquals(array[0], elem));\n },\n contains: (elem: T) => {\n assertTrue(array.some((a) => deepEquals(a, elem)));\n },\n containsOnlyOnceElementsOf: (other: T[]) => {\n assertTrue(\n other\n .map((o) => array.filter((a) => deepEquals(a, o)).length)\n .filter((a) => a === 1).length === other.length,\n );\n },\n containsAnyOf: (other: T[]) => {\n assertTrue(array.some((a) => other.some((o) => deepEquals(a, o))));\n },\n allMatch: (matches: (item: T) => boolean) => {\n assertTrue(array.every(matches));\n },\n anyMatches: (matches: (item: T) => boolean) => {\n assertTrue(array.some(matches));\n },\n allMatchAsync: async (\n matches: (item: T) => Promise<boolean>,\n ): Promise<void> => {\n for (const item of array) {\n assertTrue(await matches(item));\n }\n },\n };\n};\n","import { isErrorConstructor, type ErrorConstructor } from '../errors';\nimport { AssertionError, assertThatArray, assertTrue } from './assertions';\n\ntype ErrorCheck<ErrorType> = (error: ErrorType) => boolean;\n\nexport type ThenThrows<ErrorType extends Error> =\n | (() => void)\n | ((errorConstructor: ErrorConstructor<ErrorType>) => void)\n | ((errorCheck: ErrorCheck<ErrorType>) => void)\n | ((\n errorConstructor: ErrorConstructor<ErrorType>,\n errorCheck?: ErrorCheck<ErrorType>,\n ) => void);\n\nexport type DeciderSpecfication<Command, Event> = (\n givenEvents: Event | Event[],\n) => {\n when: (command: Command) => {\n then: (expectedEvents: Event | Event[]) => void;\n thenNothingHappened: () => void;\n thenThrows: <ErrorType extends Error = Error>(\n ...args: Parameters<ThenThrows<ErrorType>>\n ) => void;\n };\n};\n\nexport const DeciderSpecification = {\n for: <Command, Event, State>(decider: {\n decide: (command: Command, state: State) => Event | Event[];\n evolve: (state: State, event: Event) => State;\n initialState: () => State;\n }): DeciderSpecfication<Command, Event> => {\n {\n return (givenEvents: Event | Event[]) => {\n return {\n when: (command: Command) => {\n const handle = () => {\n const existingEvents = Array.isArray(givenEvents)\n ? givenEvents\n : [givenEvents];\n\n const currentState = existingEvents.reduce<State>(\n decider.evolve,\n decider.initialState(),\n );\n\n return decider.decide(command, currentState);\n };\n\n return {\n then: (expectedEvents: Event | Event[]): void => {\n const resultEvents = handle();\n\n const resultEventsArray = Array.isArray(resultEvents)\n ? resultEvents\n : [resultEvents];\n\n const expectedEventsArray = Array.isArray(expectedEvents)\n ? expectedEvents\n : [expectedEvents];\n\n assertThatArray(resultEventsArray).containsOnlyElementsMatching(\n expectedEventsArray,\n );\n },\n thenNothingHappened: (): void => {\n const resultEvents = handle();\n\n const resultEventsArray = Array.isArray(resultEvents)\n ? resultEvents\n : [resultEvents];\n\n assertThatArray(resultEventsArray).isEmpty();\n },\n thenThrows: <ErrorType extends Error>(\n ...args: Parameters<ThenThrows<ErrorType>>\n ): void => {\n try {\n handle();\n throw new AssertionError('Handler did not fail as expected');\n } catch (error) {\n if (error instanceof AssertionError) throw error;\n\n if (args.length === 0) return;\n\n if (!isErrorConstructor(args[0])) {\n assertTrue(\n args[0](error as ErrorType),\n `Error didn't match the error condition: ${error?.toString()}`,\n );\n return;\n }\n\n assertTrue(\n error instanceof args[0],\n `Caught error is not an instance of the expected type: ${error?.toString()}`,\n );\n\n if (args[1]) {\n assertTrue(\n args[1](error as ErrorType),\n `Error didn't match the error condition: ${error?.toString()}`,\n );\n }\n }\n },\n };\n },\n };\n };\n }\n },\n};\n","import type {\n AggregateStreamOptions,\n AggregateStreamResult,\n AppendToStreamOptions,\n AppendToStreamResult,\n EventStore,\n EventStoreReadEventMetadata,\n ReadStreamOptions,\n ReadStreamResult,\n StreamPositionTypeOfEventStore,\n} from '../eventStore';\nimport { type Event, type EventMetaDataOf } from '../typing';\n\nexport type TestEventStream<EventType extends Event = Event> = [\n string,\n EventType[],\n];\n\nexport type EventStoreWrapper<Store extends EventStore> = Store & {\n appendedEvents: Map<string, TestEventStream>;\n setup<EventType extends Event>(\n streamName: string,\n events: EventType[],\n ): Promise<AppendToStreamResult<StreamPositionTypeOfEventStore<Store>>>;\n};\n\nexport const WrapEventStore = <Store extends EventStore>(\n eventStore: Store,\n): EventStoreWrapper<Store> => {\n const appendedEvents = new Map<string, TestEventStream>();\n\n const wrapped = {\n ...eventStore,\n aggregateStream<State, EventType extends Event>(\n streamName: string,\n options: AggregateStreamOptions<State, EventType>,\n ): Promise<\n AggregateStreamResult<State, StreamPositionTypeOfEventStore<Store>>\n > {\n return eventStore.aggregateStream(streamName, options);\n },\n\n async readStream<EventType extends Event>(\n streamName: string,\n options?: ReadStreamOptions<StreamPositionTypeOfEventStore<Store>>,\n ): Promise<\n ReadStreamResult<\n EventType,\n EventStoreReadEventMetadata<Store> & EventMetaDataOf<EventType>\n >\n > {\n return (await eventStore.readStream(\n streamName,\n options,\n )) as ReadStreamResult<\n EventType,\n EventStoreReadEventMetadata<Store> & EventMetaDataOf<EventType>\n >;\n },\n\n appendToStream: async <EventType extends Event>(\n streamName: string,\n events: EventType[],\n options?: AppendToStreamOptions<StreamPositionTypeOfEventStore<Store>>,\n ): Promise<AppendToStreamResult<StreamPositionTypeOfEventStore<Store>>> => {\n const result = await eventStore.appendToStream(\n streamName,\n events,\n options,\n );\n\n const currentStream = appendedEvents.get(streamName) ?? [streamName, []];\n\n appendedEvents.set(streamName, [\n streamName,\n [...currentStream[1], ...events],\n ]);\n\n return result;\n },\n\n appendedEvents,\n\n setup: async <EventType extends Event>(\n streamName: string,\n events: EventType[],\n ): Promise<AppendToStreamResult<StreamPositionTypeOfEventStore<Store>>> => {\n return eventStore.appendToStream(streamName, events);\n },\n\n // streamEvents: (): ReadableStream<\n // // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\n // ReadEvent<Event, ReadEventMetadataType> | GlobalSubscriptionEvent\n // > => {\n // return eventStore.streamEvents();\n // },\n };\n\n return wrapped as EventStoreWrapper<Store>;\n};\n"],"mappings":"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","names":["error","event","error","uuid","event","uuid","TransformStream","error","uuid","event","uuid","map","result","sum","error","item","error","id","result","command","command","event","projections","inlineProjections","projection","TransformStream","filter","TransformStream","map","TransformStream","TransformStream","handleChunk","TransformStream","error","TransformStream","skip","TransformStream","TransformStream","TransformStream","TransformStream","retry","error","error","command","error"]}
1
+ {"version":3,"sources":["../src/typing/command.ts","../src/typing/event.ts","../src/typing/workflow.ts","../src/eventStore/afterCommit/afterEventStoreCommitHandler.ts","../src/eventStore/afterCommit/forwardToMessageBus.ts","../src/eventStore/events/index.ts","../src/eventStore/eventStore.ts","../src/eventStore/expectedVersion.ts","../src/eventStore/inMemoryEventStore.ts","../src/eventStore/subscriptions/caughtUpTransformStream.ts","../src/eventStore/subscriptions/streamingCoordinator.ts","../src/streaming/transformations/notifyAboutNoActiveReaders.ts","../src/streaming/writers/writeToStream.ts","../src/utils/collections/duplicates.ts","../src/utils/collections/merge.ts","../src/utils/collections/index.ts","../src/utils/deepEquals.ts","../src/utils/iterators.ts","../src/taskProcessing/taskProcessor.ts","../src/utils/locking/index.ts","../src/utils/retry.ts","../src/commandHandling/handleCommand.ts","../src/commandHandling/handleCommandWithDecider.ts","../src/serialization/json/JSONParser.ts","../src/database/inMemoryDatabase.ts","../src/messageBus/index.ts","../src/projections/index.ts","../src/streaming/binaryArrays.ts","../src/streaming/collectors/collect.ts","../src/streaming/decoders/binary.ts","../src/streaming/decoders/string.ts","../src/streaming/decoders/json.ts","../src/streaming/decoders/object.ts","../src/streaming/decoders/composite.ts","../src/streaming/generators/fromArray.ts","../src/streaming/generators/index.ts","../src/streaming/restream.ts","../src/streaming/transformations/filter.ts","../src/streaming/transformations/map.ts","../src/streaming/transformations/reduce.ts","../src/streaming/transformations/retry.ts","../src/streaming/transformations/skip.ts","../src/streaming/transformations/stopAfter.ts","../src/streaming/transformations/stopOn.ts","../src/streaming/transformations/take.ts","../src/streaming/transformations/waitAtMost.ts","../src/streaming/transformations/index.ts","../src/testing/assertions.ts","../src/testing/deciderSpecification.ts","../src/testing/wrapEventStore.ts"],"sourcesContent":["import type { DefaultRecord, Flavour } from './';\n\nexport type Command<\n CommandType extends string = string,\n CommandData extends DefaultRecord = DefaultRecord,\n CommandMetaData extends DefaultRecord | undefined = undefined,\n> = Flavour<\n Readonly<\n CommandMetaData extends undefined\n ? {\n type: CommandType;\n data: Readonly<CommandData>;\n metadata?: DefaultCommandMetadata | undefined;\n }\n : {\n type: CommandType;\n data: CommandData;\n metadata: CommandMetaData;\n }\n >,\n 'Command'\n>;\n\nexport type CommandTypeOf<T extends Command> = T['type'];\nexport type CommandDataOf<T extends Command> = T['data'];\nexport type CommandMetaDataOf<T extends Command> = T extends {\n metadata: infer M;\n}\n ? M\n : undefined;\n\nexport type CreateCommandType<\n CommandType extends string,\n CommandData extends DefaultRecord,\n CommandMetaData extends DefaultRecord | undefined = undefined,\n> = Readonly<\n CommandMetaData extends undefined\n ? {\n type: CommandType;\n data: CommandData;\n metadata?: DefaultCommandMetadata | undefined;\n }\n : {\n type: CommandType;\n data: CommandData;\n metadata: CommandMetaData;\n }\n>;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const command = <CommandType extends Command<string, any, any>>(\n ...args: CommandMetaDataOf<CommandType> extends undefined\n ? [\n type: CommandTypeOf<CommandType>,\n data: CommandDataOf<CommandType>,\n metadata?: DefaultCommandMetadata | undefined,\n ]\n : [\n type: CommandTypeOf<CommandType>,\n data: CommandDataOf<CommandType>,\n metadata: CommandMetaDataOf<CommandType>,\n ]\n): CommandType => {\n const [type, data, metadata] = args;\n\n return metadata !== undefined\n ? ({ type, data, metadata } as CommandType)\n : ({ type, data } as CommandType);\n};\n\nexport type DefaultCommandMetadata = { now: Date };\n","import type { DefaultRecord, Flavour } from './';\n\nexport type BigIntStreamPosition = bigint;\nexport type BigIntGlobalPosition = bigint;\n\nexport type Event<\n EventType extends string = string,\n EventData extends DefaultRecord = DefaultRecord,\n EventMetaData extends DefaultRecord | undefined = undefined,\n> = Flavour<\n Readonly<\n EventMetaData extends undefined\n ? {\n type: EventType;\n data: EventData;\n }\n : {\n type: EventType;\n data: EventData;\n metadata: EventMetaData;\n }\n >,\n 'Event'\n>;\n\nexport type EventTypeOf<T extends Event> = T['type'];\nexport type EventDataOf<T extends Event> = T['data'];\nexport type EventMetaDataOf<T extends Event> = T extends { metadata: infer M }\n ? M\n : undefined;\n\nexport type CanHandle<T extends Event> = EventTypeOf<T>[];\n\nexport type CreateEventType<\n EventType extends string,\n EventData extends DefaultRecord,\n EventMetaData extends DefaultRecord | undefined = undefined,\n> = Readonly<\n EventMetaData extends undefined\n ? {\n type: EventType;\n data: EventData;\n }\n : {\n type: EventType;\n data: EventData;\n metadata: EventMetaData;\n }\n>;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const event = <EventType extends Event<string, any, any>>(\n ...args: EventMetaDataOf<EventType> extends undefined\n ? [type: EventTypeOf<EventType>, data: EventDataOf<EventType>]\n : [\n type: EventTypeOf<EventType>,\n data: EventDataOf<EventType>,\n metadata: EventMetaDataOf<EventType>,\n ]\n): EventType => {\n const [type, data, metadata] = args;\n\n return metadata !== undefined\n ? ({ type, data, metadata } as EventType)\n : ({ type, data } as EventType);\n};\n\nexport type CombinedReadEventMetadata<\n EventType extends Event = Event,\n EventMetaDataType extends AnyReadEventMetadata = AnyReadEventMetadata,\n> =\n EventMetaDataOf<EventType> extends undefined\n ? EventMetaDataType\n : EventMetaDataOf<EventType> & EventMetaDataType;\n\nexport type ReadEvent<\n EventType extends Event = Event,\n EventMetaDataType extends AnyReadEventMetadata = AnyReadEventMetadata,\n> = EventType & {\n metadata: CombinedReadEventMetadata<EventType, EventMetaDataType>;\n};\n\nexport type CommonReadEventMetadata<StreamPosition = BigIntStreamPosition> =\n Readonly<{\n eventId: string;\n streamPosition: StreamPosition;\n streamName: string;\n }>;\n\nexport type WithGlobalPosition<GlobalPosition> = Readonly<{\n globalPosition: GlobalPosition;\n}>;\n\nexport type ReadEventMetadata<\n GlobalPosition = undefined,\n StreamPosition = BigIntStreamPosition,\n> = CommonReadEventMetadata<StreamPosition> &\n // eslint-disable-next-line @typescript-eslint/no-empty-object-type\n (GlobalPosition extends undefined ? {} : WithGlobalPosition<GlobalPosition>);\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyReadEventMetadata = ReadEventMetadata<any, any>;\n\nexport type ReadEventMetadataWithGlobalPosition<\n GlobalPosition = BigIntGlobalPosition,\n> = ReadEventMetadata<GlobalPosition>;\n\nexport type ReadEventMetadataWithoutGlobalPosition<\n StreamPosition = BigIntStreamPosition,\n> = ReadEventMetadata<undefined, StreamPosition>;\n\nexport type GlobalPositionTypeOfReadEventMetadata<ReadEventMetadataType> =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ReadEventMetadataType extends ReadEventMetadata<infer GP, any> ? GP : never;\n\nexport type StreamPositionTypeOfReadEventMetadata<ReadEventMetadataType> =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ReadEventMetadataType extends ReadEventMetadata<any, infer SV> ? SV : never;\n","import type { Command } from './command';\nimport type { Event } from './event';\n\n/// Inspired by https://blog.bittacklr.be/the-workflow-pattern.html\n\nexport type Workflow<\n Input extends Event | Command,\n State,\n Output extends Event | Command,\n> = {\n decide: (command: Input, state: State) => WorkflowOutput<Output>[];\n evolve: (currentState: State, event: WorkflowEvent<Output>) => State;\n initialState: () => State;\n};\n\nexport type WorkflowEvent<Output extends Command | Event> = Extract<\n Output,\n { __brand?: 'Event' }\n>;\n\nexport type WorkflowCommand<Output extends Command | Event> = Extract<\n Output,\n { __brand?: 'Command' }\n>;\n\nexport type WorkflowOutput<TOutput extends Command | Event> =\n | { kind: 'Reply'; message: TOutput }\n | { kind: 'Send'; message: WorkflowCommand<TOutput> }\n | { kind: 'Publish'; message: WorkflowEvent<TOutput> }\n | {\n kind: 'Schedule';\n message: TOutput;\n when: { afterInMs: number } | { at: Date };\n }\n | { kind: 'Complete' }\n | { kind: 'Accept' }\n | { kind: 'Ignore'; reason: string }\n | { kind: 'Error'; reason: string };\n\nexport const reply = <TOutput extends Command | Event>(\n message: TOutput,\n): WorkflowOutput<TOutput> => {\n return {\n kind: 'Reply',\n message,\n };\n};\n\nexport const send = <TOutput extends Command | Event>(\n message: WorkflowCommand<TOutput>,\n): WorkflowOutput<TOutput> => {\n return {\n kind: 'Send',\n message,\n };\n};\n\nexport const publish = <TOutput extends Command | Event>(\n message: WorkflowEvent<TOutput>,\n): WorkflowOutput<TOutput> => {\n return {\n kind: 'Publish',\n message,\n };\n};\n\nexport const schedule = <TOutput extends Command | Event>(\n message: TOutput,\n when: { afterInMs: number } | { at: Date },\n): WorkflowOutput<TOutput> => {\n return {\n kind: 'Schedule',\n message,\n when,\n };\n};\n\nexport const complete = <\n TOutput extends Command | Event,\n>(): WorkflowOutput<TOutput> => {\n return {\n kind: 'Complete',\n };\n};\n\nexport const ignore = <TOutput extends Command | Event>(\n reason: string,\n): WorkflowOutput<TOutput> => {\n return {\n kind: 'Ignore',\n reason,\n };\n};\n\nexport const error = <TOutput extends Command | Event>(\n reason: string,\n): WorkflowOutput<TOutput> => {\n return {\n kind: 'Error',\n reason,\n };\n};\n\nexport const accept = <\n TOutput extends Command | Event,\n>(): WorkflowOutput<TOutput> => {\n return { kind: 'Accept' };\n};\n","import { type Event, type ReadEvent } from '../../typing';\nimport type { EventStore, EventStoreReadEventMetadata } from '../eventStore';\n\ntype AfterEventStoreCommitHandlerWithoutContext<Store extends EventStore> = (\n messages: ReadEvent<Event, EventStoreReadEventMetadata<Store>>[],\n) => Promise<void> | void;\n\nexport type AfterEventStoreCommitHandler<\n Store extends EventStore,\n HandlerContext = never,\n> = [HandlerContext] extends [never]\n ? AfterEventStoreCommitHandlerWithoutContext<Store>\n : (\n messages: ReadEvent<Event, EventStoreReadEventMetadata<Store>>[],\n context: HandlerContext,\n ) => Promise<void> | void;\n\ntype TryPublishMessagesAfterCommitOptions<\n Store extends EventStore,\n HandlerContext = never,\n> = {\n onAfterCommit?: AfterEventStoreCommitHandler<Store, HandlerContext>;\n};\n\nexport async function tryPublishMessagesAfterCommit<Store extends EventStore>(\n messages: ReadEvent<Event, EventStoreReadEventMetadata<Store>>[],\n options: TryPublishMessagesAfterCommitOptions<Store, undefined> | undefined,\n): Promise<boolean>;\nexport async function tryPublishMessagesAfterCommit<\n Store extends EventStore,\n HandlerContext,\n>(\n messages: ReadEvent<Event, EventStoreReadEventMetadata<Store>>[],\n options:\n | TryPublishMessagesAfterCommitOptions<Store, HandlerContext>\n | undefined,\n context: HandlerContext,\n): Promise<boolean>;\nexport async function tryPublishMessagesAfterCommit<\n Store extends EventStore,\n HandlerContext = never,\n>(\n messages: ReadEvent<Event, EventStoreReadEventMetadata<Store>>[],\n options:\n | TryPublishMessagesAfterCommitOptions<Store, HandlerContext>\n | undefined,\n context?: HandlerContext,\n): Promise<boolean> {\n if (options?.onAfterCommit === undefined) return false;\n\n try {\n await options?.onAfterCommit(messages, context!);\n return true;\n } catch (error) {\n // TODO: enhance with tracing\n console.error(`Error in on after commit hook`, error);\n return false;\n }\n}\n","import type { EventsPublisher } from '../../messageBus';\nimport type { Event, ReadEvent } from '../../typing';\nimport type { EventStore, EventStoreReadEventMetadata } from '../eventStore';\nimport type { AfterEventStoreCommitHandler } from './afterEventStoreCommitHandler';\n\nexport const forwardToMessageBus =\n <Store extends EventStore, HandlerContext = never>(\n eventPublisher: EventsPublisher,\n ): AfterEventStoreCommitHandler<Store, HandlerContext> =>\n async (\n messages: ReadEvent<Event, EventStoreReadEventMetadata<Store>>[],\n ): Promise<void> => {\n for (const message of messages) {\n await eventPublisher.publish(message);\n }\n };\n","import {\n event,\n type Event,\n type EventDataOf,\n type ReadEvent,\n type ReadEventMetadataWithGlobalPosition,\n} from '../../typing';\n\nexport const GlobalStreamCaughtUpType = '__emt:GlobalStreamCaughtUp';\n\nexport type GlobalStreamCaughtUp = Event<\n '__emt:GlobalStreamCaughtUp',\n { globalPosition: bigint },\n { globalPosition: bigint }\n>;\n\nexport const isGlobalStreamCaughtUp = (\n event: Event,\n): event is GlobalStreamCaughtUp => event.type === GlobalStreamCaughtUpType;\n\nexport const caughtUpEventFrom =\n (position: bigint) =>\n (\n event: ReadEvent<Event, ReadEventMetadataWithGlobalPosition>,\n ): event is ReadEvent<\n GlobalStreamCaughtUp,\n ReadEventMetadataWithGlobalPosition\n > =>\n event.type === GlobalStreamCaughtUpType &&\n event.metadata?.globalPosition >= position;\n\nexport const globalStreamCaughtUp = (\n data: EventDataOf<GlobalStreamCaughtUp>,\n): GlobalStreamCaughtUp =>\n event<GlobalStreamCaughtUp>(GlobalStreamCaughtUpType, data, {\n globalPosition: data.globalPosition,\n });\n\nexport const isSubscriptionEvent = (\n event: Event,\n): event is GlobalSubscriptionEvent => isGlobalStreamCaughtUp(event);\n\nexport const isNotInternalEvent = (event: Event): boolean =>\n !isGlobalStreamCaughtUp(event);\n\nexport type GlobalSubscriptionEvent = GlobalStreamCaughtUp;\n","//import type { ReadableStream } from 'web-streams-polyfill';\nimport type {\n AnyReadEventMetadata,\n BigIntGlobalPosition,\n BigIntStreamPosition,\n CommonReadEventMetadata,\n Event,\n GlobalPositionTypeOfReadEventMetadata,\n ReadEvent,\n ReadEventMetadata,\n StreamPositionTypeOfReadEventMetadata,\n WithGlobalPosition,\n} from '../typing';\nimport type { AfterEventStoreCommitHandler } from './afterCommit';\n//import type { GlobalSubscriptionEvent } from './events';\nimport type { ExpectedStreamVersion } from './expectedVersion';\n\n// #region event-store\nexport interface EventStore<\n ReadEventMetadataType extends AnyReadEventMetadata = AnyReadEventMetadata,\n> {\n aggregateStream<State, EventType extends Event>(\n streamName: string,\n options: AggregateStreamOptions<State, EventType, ReadEventMetadataType>,\n ): Promise<\n AggregateStreamResult<\n State,\n StreamPositionTypeOfReadEventMetadata<ReadEventMetadataType>\n >\n >;\n\n readStream<EventType extends Event>(\n streamName: string,\n options?: ReadStreamOptions<\n StreamPositionTypeOfReadEventMetadata<ReadEventMetadataType>\n >,\n ): Promise<ReadStreamResult<EventType, ReadEventMetadataType>>;\n\n appendToStream<EventType extends Event>(\n streamName: string,\n events: EventType[],\n options?: AppendToStreamOptions<\n StreamPositionTypeOfReadEventMetadata<ReadEventMetadataType>\n >,\n ): Promise<\n AppendToStreamResult<\n StreamPositionTypeOfReadEventMetadata<ReadEventMetadataType>\n >\n >;\n\n // streamEvents(): ReadableStream<\n // ReadEvent<Event, ReadEventMetadataType> | GlobalSubscriptionEvent\n // >;\n}\n\nexport type EventStoreReadEventMetadata<Store extends EventStore> =\n Store extends EventStore<infer T>\n ? T extends CommonReadEventMetadata<infer SP>\n ? T extends WithGlobalPosition<infer GP>\n ? ReadEventMetadata<GP, SP> & T\n : ReadEventMetadata<undefined, SP> & T\n : never\n : never;\n\nexport type GlobalPositionTypeOfEventStore<Store extends EventStore> =\n GlobalPositionTypeOfReadEventMetadata<EventStoreReadEventMetadata<Store>>;\n\nexport type StreamPositionTypeOfEventStore<Store extends EventStore> =\n StreamPositionTypeOfReadEventMetadata<EventStoreReadEventMetadata<Store>>;\n\nexport type EventStoreSession<EventStoreType extends EventStore> = {\n eventStore: EventStoreType;\n close: () => Promise<void>;\n};\n\nexport interface EventStoreSessionFactory<EventStoreType extends EventStore> {\n withSession<T = unknown>(\n callback: (session: EventStoreSession<EventStoreType>) => Promise<T>,\n ): Promise<T>;\n}\n// #endregion event-store\n\nexport const canCreateEventStoreSession = <Store extends EventStore>(\n eventStore: Store | EventStoreSessionFactory<Store>,\n): eventStore is EventStoreSessionFactory<Store> => 'withSession' in eventStore;\n\nexport const nulloSessionFactory = <EventStoreType extends EventStore>(\n eventStore: EventStoreType,\n): EventStoreSessionFactory<EventStoreType> => ({\n withSession: (callback) => {\n const nulloSession: EventStoreSession<EventStoreType> = {\n eventStore,\n close: () => Promise.resolve(),\n };\n\n return callback(nulloSession);\n },\n});\n\n////////////////////////////////////////////////////////////////////\n/// ReadStream types\n////////////////////////////////////////////////////////////////////\n\nexport type ReadStreamOptions<StreamVersion = BigIntStreamPosition> = (\n | {\n from: StreamVersion;\n }\n | { to: StreamVersion }\n | { from: StreamVersion; maxCount?: bigint }\n | {\n expectedStreamVersion: ExpectedStreamVersion<StreamVersion>;\n }\n) & {\n expectedStreamVersion?: ExpectedStreamVersion<StreamVersion>;\n};\n\nexport type ReadStreamResult<\n EventType extends Event,\n ReadEventMetadataType extends AnyReadEventMetadata = AnyReadEventMetadata,\n> = {\n currentStreamVersion: StreamPositionTypeOfReadEventMetadata<ReadEventMetadataType>;\n events: ReadEvent<EventType, ReadEventMetadataType>[];\n streamExists: boolean;\n};\n\n////////////////////////////////////////////////////////////////////\n/// AggregateStream types\n////////////////////////////////////////////////////////////////////\n\ntype Evolve<\n State,\n EventType extends Event,\n ReadEventMetadataType extends AnyReadEventMetadata = AnyReadEventMetadata,\n> =\n | ((currentState: State, event: EventType) => State)\n | ((\n currentState: State,\n event: ReadEvent<EventType, ReadEventMetadataType>,\n ) => State)\n | ((currentState: State, event: ReadEvent<EventType>) => State);\n\nexport type AggregateStreamOptions<\n State,\n EventType extends Event,\n ReadEventMetadataType extends AnyReadEventMetadata = AnyReadEventMetadata,\n> = {\n evolve: Evolve<State, EventType, ReadEventMetadataType>;\n initialState: () => State;\n read?: ReadStreamOptions<\n StreamPositionTypeOfReadEventMetadata<ReadEventMetadataType>\n >;\n};\n\nexport type AggregateStreamResult<\n State,\n StreamPosition = BigIntStreamPosition,\n> = {\n currentStreamVersion: StreamPosition;\n state: State;\n streamExists: boolean;\n};\n\nexport type AggregateStreamResultWithGlobalPosition<\n State,\n StreamPosition = BigIntStreamPosition,\n GlobalPosition = BigIntGlobalPosition,\n> =\n | (AggregateStreamResult<State, StreamPosition> & {\n streamExists: true;\n lastEventGlobalPosition: GlobalPosition;\n })\n | (AggregateStreamResult<State, StreamPosition> & {\n streamExists: false;\n });\n\nexport type AggregateStreamResultOfEventStore<Store extends EventStore> =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Store['aggregateStream'] extends (...args: any[]) => Promise<infer R>\n ? R\n : never;\n\n////////////////////////////////////////////////////////////////////\n/// AppendToStream types\n////////////////////////////////////////////////////////////////////\n\nexport type AppendToStreamOptions<StreamVersion = BigIntStreamPosition> = {\n expectedStreamVersion?: ExpectedStreamVersion<StreamVersion>;\n};\n\nexport type AppendToStreamResult<StreamVersion = BigIntStreamPosition> = {\n nextExpectedStreamVersion: StreamVersion;\n createdNewStream: boolean;\n};\n\nexport type AppendToStreamResultWithGlobalPosition<\n StreamVersion = BigIntStreamPosition,\n GlobalPosition = BigIntGlobalPosition,\n> = AppendToStreamResult<StreamVersion> & {\n lastEventGlobalPosition: GlobalPosition;\n};\n\nexport type AppendStreamResultOfEventStore<Store extends EventStore> =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Store['appendToStream'] extends (...args: any[]) => Promise<infer R>\n ? R\n : never;\n\n////////////////////////////////////////////////////////////////////\n/// DefaultEventStoreOptions\n////////////////////////////////////////////////////////////////////\n\nexport type DefaultEventStoreOptions<\n Store extends EventStore,\n HandlerContext = never,\n> = {\n /**\n * Pluggable set of hooks informing about the event store internal behaviour.\n */\n hooks?: {\n /**\n * This hook will be called **AFTER** events were stored in the event store.\n * It's designed to handle scenarios where delivery and ordering guarantees do not matter much.\n *\n * **WARNINGS:**\n *\n * 1. It will be called **EXACTLY ONCE** if append succeded.\n * 2. If the hook fails, its append **will still silently succeed**, and no error will be thrown.\n * 3. Wen process crashes after events were committed, but before the hook was called, delivery won't be retried.\n * That can lead to state inconsistencies.\n * 4. In the case of high concurrent traffic, **race conditions may cause ordering issues**.\n * For instance, where the second hook takes longer to process than the first one, ordering won't be guaranteed.\n *\n * @type {AfterEventStoreCommitHandler<Store, HandlerContext>}\n */\n onAfterCommit?: AfterEventStoreCommitHandler<Store, HandlerContext>;\n };\n};\n","import { ConcurrencyError } from '../errors';\nimport type { BigIntStreamPosition, Flavour } from '../typing';\n\nexport type ExpectedStreamVersion<VersionType = BigIntStreamPosition> =\n | ExpectedStreamVersionWithValue<VersionType>\n | ExpectedStreamVersionGeneral;\n\nexport type ExpectedStreamVersionWithValue<VersionType = BigIntStreamPosition> =\n Flavour<VersionType, 'StreamVersion'>;\n\nexport type ExpectedStreamVersionGeneral = Flavour<\n 'STREAM_EXISTS' | 'STREAM_DOES_NOT_EXIST' | 'NO_CONCURRENCY_CHECK',\n 'StreamVersion'\n>;\n\nexport const STREAM_EXISTS = 'STREAM_EXISTS' as ExpectedStreamVersionGeneral;\nexport const STREAM_DOES_NOT_EXIST =\n 'STREAM_DOES_NOT_EXIST' as ExpectedStreamVersionGeneral;\nexport const NO_CONCURRENCY_CHECK =\n 'NO_CONCURRENCY_CHECK' as ExpectedStreamVersionGeneral;\n\nexport const matchesExpectedVersion = <StreamVersion = BigIntStreamPosition>(\n current: StreamVersion | undefined,\n expected: ExpectedStreamVersion<StreamVersion>,\n defaultVersion: StreamVersion,\n): boolean => {\n if (expected === NO_CONCURRENCY_CHECK) return true;\n\n if (expected == STREAM_DOES_NOT_EXIST) return current === defaultVersion;\n\n if (expected == STREAM_EXISTS) return current !== defaultVersion;\n\n return current === expected;\n};\n\nexport const assertExpectedVersionMatchesCurrent = <\n StreamVersion = BigIntStreamPosition,\n>(\n current: StreamVersion,\n expected: ExpectedStreamVersion<StreamVersion> | undefined,\n defaultVersion: StreamVersion,\n): void => {\n expected ??= NO_CONCURRENCY_CHECK;\n\n if (!matchesExpectedVersion(current, expected, defaultVersion))\n throw new ExpectedVersionConflictError(current, expected);\n};\n\nexport class ExpectedVersionConflictError<\n VersionType = BigIntStreamPosition,\n> extends ConcurrencyError {\n constructor(\n current: VersionType,\n expected: ExpectedStreamVersion<VersionType>,\n ) {\n super(current?.toString(), expected?.toString());\n\n // 👇️ because we are extending a built-in class\n Object.setPrototypeOf(this, ExpectedVersionConflictError.prototype);\n }\n}\n\nexport const isExpectedVersionConflictError = (\n error: unknown,\n): error is ExpectedVersionConflictError =>\n error instanceof ExpectedVersionConflictError;\n","import { v4 as uuid } from 'uuid';\nimport type {\n BigIntStreamPosition,\n CombinedReadEventMetadata,\n Event,\n ReadEvent,\n ReadEventMetadataWithGlobalPosition,\n} from '../typing';\nimport { tryPublishMessagesAfterCommit } from './afterCommit';\nimport {\n type AggregateStreamOptions,\n type AggregateStreamResult,\n type AppendToStreamOptions,\n type AppendToStreamResult,\n type DefaultEventStoreOptions,\n type EventStore,\n type ReadStreamOptions,\n type ReadStreamResult,\n} from './eventStore';\nimport { assertExpectedVersionMatchesCurrent } from './expectedVersion';\nimport { StreamingCoordinator } from './subscriptions';\nimport type { ProjectionRegistration } from '../projections';\n\nexport const InMemoryEventStoreDefaultStreamVersion = 0n;\n\nexport type InMemoryEventStore =\n EventStore<ReadEventMetadataWithGlobalPosition>;\n\nexport type InMemoryReadEventMetadata = ReadEventMetadataWithGlobalPosition;\n\nexport type InMemoryProjectionHandlerContext = {\n eventStore: InMemoryEventStore;\n};\n\nexport type InMemoryEventStoreOptions =\n DefaultEventStoreOptions<InMemoryEventStore> & {\n projections?: ProjectionRegistration<\n 'inline',\n InMemoryReadEventMetadata,\n InMemoryProjectionHandlerContext\n >[];\n };\n\nexport type InMemoryReadEvent<EventType extends Event = Event> = ReadEvent<\n EventType,\n ReadEventMetadataWithGlobalPosition\n>;\n\nexport const getInMemoryEventStore = (\n eventStoreOptions?: InMemoryEventStoreOptions,\n): InMemoryEventStore => {\n const streams = new Map<\n string,\n ReadEvent<Event, ReadEventMetadataWithGlobalPosition>[]\n >();\n const streamingCoordinator = StreamingCoordinator();\n\n const getAllEventsCount = () => {\n return Array.from<ReadEvent[]>(streams.values())\n .map((s) => s.length)\n .reduce((p, c) => p + c, 0);\n };\n\n const _inlineProjections = (eventStoreOptions?.projections ?? [])\n .filter(({ type }) => type === 'inline')\n .map(({ projection }) => projection);\n\n return {\n async aggregateStream<State, EventType extends Event>(\n streamName: string,\n options: AggregateStreamOptions<\n State,\n EventType,\n ReadEventMetadataWithGlobalPosition\n >,\n ): Promise<AggregateStreamResult<State>> {\n const { evolve, initialState, read } = options;\n\n const result = await this.readStream<EventType>(streamName, read);\n\n const events = result?.events ?? [];\n\n return {\n currentStreamVersion: BigInt(events.length),\n state: events.reduce(evolve, initialState()),\n streamExists: result.streamExists,\n };\n },\n\n readStream: <EventType extends Event>(\n streamName: string,\n options?: ReadStreamOptions<BigIntStreamPosition>,\n ): Promise<\n ReadStreamResult<EventType, ReadEventMetadataWithGlobalPosition>\n > => {\n const events = streams.get(streamName);\n const currentStreamVersion = events\n ? BigInt(events.length)\n : InMemoryEventStoreDefaultStreamVersion;\n\n assertExpectedVersionMatchesCurrent(\n currentStreamVersion,\n options?.expectedStreamVersion,\n InMemoryEventStoreDefaultStreamVersion,\n );\n\n const from = Number(options && 'from' in options ? options.from : 0);\n const to = Number(\n options && 'to' in options\n ? options.to\n : options && 'maxCount' in options && options.maxCount\n ? options.from + options.maxCount\n : (events?.length ?? 1),\n );\n\n const resultEvents =\n events !== undefined && events.length > 0\n ? events\n .map(\n (e) =>\n e as ReadEvent<\n EventType,\n ReadEventMetadataWithGlobalPosition\n >,\n )\n .slice(from, to)\n : [];\n\n const result: ReadStreamResult<\n EventType,\n ReadEventMetadataWithGlobalPosition\n > = {\n currentStreamVersion,\n events: resultEvents,\n streamExists: events !== undefined && events.length > 0,\n };\n\n return Promise.resolve(result);\n },\n\n appendToStream: async <EventType extends Event>(\n streamName: string,\n events: EventType[],\n options?: AppendToStreamOptions,\n ): Promise<AppendToStreamResult> => {\n const currentEvents = streams.get(streamName) ?? [];\n const currentStreamVersion =\n currentEvents.length > 0\n ? BigInt(currentEvents.length)\n : InMemoryEventStoreDefaultStreamVersion;\n\n assertExpectedVersionMatchesCurrent(\n currentStreamVersion,\n options?.expectedStreamVersion,\n InMemoryEventStoreDefaultStreamVersion,\n );\n\n const newEvents: ReadEvent<\n EventType,\n ReadEventMetadataWithGlobalPosition\n >[] = events.map((event, index) => {\n const metadata: ReadEventMetadataWithGlobalPosition = {\n streamName,\n eventId: uuid(),\n streamPosition: BigInt(currentEvents.length + index + 1),\n globalPosition: BigInt(getAllEventsCount() + index + 1),\n };\n return {\n ...event,\n metadata: {\n ...('metadata' in event ? (event.metadata ?? {}) : {}),\n ...metadata,\n } as CombinedReadEventMetadata<\n EventType,\n ReadEventMetadataWithGlobalPosition\n >,\n };\n });\n\n const positionOfLastEventInTheStream = BigInt(\n newEvents.slice(-1)[0]!.metadata.streamPosition,\n );\n\n streams.set(streamName, [...currentEvents, ...newEvents]);\n await streamingCoordinator.notify(newEvents);\n\n const result: AppendToStreamResult = {\n nextExpectedStreamVersion: positionOfLastEventInTheStream,\n createdNewStream:\n currentStreamVersion === InMemoryEventStoreDefaultStreamVersion,\n };\n\n await tryPublishMessagesAfterCommit<InMemoryEventStore>(\n newEvents,\n eventStoreOptions?.hooks,\n );\n\n return result;\n },\n\n //streamEvents: streamingCoordinator.stream,\n };\n};\n","import { TransformStream } from 'web-streams-polyfill';\nimport type {\n Event,\n ReadEvent,\n ReadEventMetadataWithGlobalPosition,\n} from '../../typing';\nimport { globalStreamCaughtUp, type GlobalSubscriptionEvent } from '../events';\n\nexport const streamTrackingGlobalPosition = (\n currentEvents: ReadEvent<Event, ReadEventMetadataWithGlobalPosition>[],\n) => new CaughtUpTransformStream(currentEvents);\n\nexport class CaughtUpTransformStream extends TransformStream<\n ReadEvent<Event, ReadEventMetadataWithGlobalPosition>,\n | ReadEvent<Event, ReadEventMetadataWithGlobalPosition>\n | GlobalSubscriptionEvent\n> {\n private _currentPosition: bigint;\n private _logPosition: bigint;\n\n constructor(events: ReadEvent<Event, ReadEventMetadataWithGlobalPosition>[]) {\n super({\n start: (controller) => {\n let globalPosition = 0n;\n for (const event of events) {\n controller.enqueue(event);\n globalPosition = event.metadata.globalPosition;\n }\n controller.enqueue(globalStreamCaughtUp({ globalPosition }));\n },\n transform: (event, controller) => {\n this._currentPosition = event.metadata.globalPosition;\n controller.enqueue(event);\n\n if (this._currentPosition < this._logPosition) return;\n\n controller.enqueue(\n globalStreamCaughtUp({ globalPosition: this._currentPosition }),\n );\n },\n });\n\n this._currentPosition = this._logPosition =\n events.length > 0\n ? events[events.length - 1]!.metadata.globalPosition\n : 0n;\n }\n\n public set logPosition(value: bigint) {\n this._logPosition = value;\n }\n}\n","import { v4 as uuid } from 'uuid';\nimport { notifyAboutNoActiveReadersStream } from '../../streaming/transformations/notifyAboutNoActiveReaders';\nimport { writeToStream } from '../../streaming/writers';\nimport type {\n Event,\n ReadEvent,\n ReadEventMetadataWithGlobalPosition,\n} from '../../typing';\nimport {\n CaughtUpTransformStream,\n streamTrackingGlobalPosition,\n} from './caughtUpTransformStream';\n\nexport const StreamingCoordinator = () => {\n const allEvents: ReadEvent<Event, ReadEventMetadataWithGlobalPosition>[] = [];\n const listeners = new Map<string, CaughtUpTransformStream>();\n\n return {\n notify: async (\n events: ReadEvent<Event, ReadEventMetadataWithGlobalPosition>[],\n ) => {\n if (events.length === 0) return;\n\n allEvents.push(...events);\n\n for (const listener of listeners.values()) {\n listener.logPosition =\n events[events.length - 1]!.metadata.globalPosition;\n\n await writeToStream(listener, events);\n }\n },\n\n stream: () => {\n const streamId = uuid();\n const transformStream = streamTrackingGlobalPosition(allEvents);\n\n listeners.set(streamId, transformStream);\n return transformStream.readable.pipeThrough(\n notifyAboutNoActiveReadersStream(\n (stream) => {\n if (listeners.has(stream.streamId))\n listeners.delete(stream.streamId);\n },\n { streamId },\n ),\n );\n },\n };\n};\n","import { v4 as uuid } from 'uuid';\nimport { TransformStream } from 'web-streams-polyfill';\n\nexport const notifyAboutNoActiveReadersStream = <Item>(\n onNoActiveReaderCallback: (\n stream: NotifyAboutNoActiveReadersStream<Item>,\n ) => void,\n options: { streamId?: string; intervalCheckInMs?: number } = {},\n) => new NotifyAboutNoActiveReadersStream(onNoActiveReaderCallback, options);\n\nexport class NotifyAboutNoActiveReadersStream<Item> extends TransformStream<\n Item,\n Item\n> {\n private checkInterval: NodeJS.Timeout | null = null;\n public readonly streamId: string;\n private _isStopped: boolean = false;\n public get hasActiveSubscribers() {\n return !this._isStopped;\n }\n\n constructor(\n private onNoActiveReaderCallback: (\n stream: NotifyAboutNoActiveReadersStream<Item>,\n ) => void,\n options: { streamId?: string; intervalCheckInMs?: number } = {},\n ) {\n super({\n cancel: (reason) => {\n console.log('Stream was canceled. Reason:', reason);\n this.stopChecking();\n },\n });\n this.streamId = options?.streamId ?? uuid();\n\n this.onNoActiveReaderCallback = onNoActiveReaderCallback;\n\n this.startChecking(options?.intervalCheckInMs ?? 20);\n }\n\n private startChecking(interval: number) {\n this.checkInterval = setInterval(() => {\n this.checkNoActiveReader();\n }, interval);\n }\n\n private stopChecking() {\n if (!this.checkInterval) return;\n\n clearInterval(this.checkInterval);\n this.checkInterval = null;\n this._isStopped = true;\n this.onNoActiveReaderCallback(this);\n }\n\n private checkNoActiveReader() {\n if (!this.readable.locked && !this._isStopped) {\n this.stopChecking();\n }\n }\n}\n","import type { ReadableStream, TransformStream } from 'web-streams-polyfill';\nimport { noMoreWritingOn } from './noMoreWritingOn';\n\nexport const writeToStream = async <In, Out = In>(\n stream: TransformStream<In, Out>,\n items: In[],\n): Promise<boolean> => {\n if (stream.writable.locked) return false;\n\n const writer = stream.writable.getWriter();\n await writer.ready;\n\n if (!stream.readable.locked) return false;\n\n try {\n for (const item of items) {\n await writer.write(item);\n }\n } catch (error) {\n console.log(error);\n } finally {\n await writer.close();\n }\n return true;\n};\n\nexport const writeToStreamAndStop = async <In, Out>(\n stream: TransformStream<In, Out>,\n items: In[],\n): Promise<ReadableStream<Out>> => {\n await writeToStream(stream, items);\n return await noMoreWritingOn(stream);\n};\n","export const hasDuplicates = <ArrayItem, Mapped>(\n array: ArrayItem[],\n predicate: (value: ArrayItem, index: number, array: ArrayItem[]) => Mapped,\n) => {\n const mapped = array.map(predicate);\n const uniqueValues = new Set(mapped);\n\n return uniqueValues.size < mapped.length;\n};\n\nexport const getDuplicates = <ArrayItem, Mapped>(\n array: ArrayItem[],\n predicate: (value: ArrayItem, index: number, array: ArrayItem[]) => Mapped,\n): ArrayItem[] => {\n const map = new Map<Mapped, ArrayItem[]>();\n\n for (let i = 0; i < array.length; i++) {\n const item = array[i]!;\n const key = predicate(item, i, array);\n if (!map.has(key)) {\n map.set(key, []);\n }\n map.get(key)!.push(item);\n }\n\n return Array.from(map.values())\n .filter((group) => group.length > 1)\n .flat();\n};\n","export const merge = <T>(\n array: T[],\n item: T,\n where: (current: T) => boolean,\n onExisting: (current: T) => T,\n onNotFound: () => T | undefined = () => undefined,\n) => {\n let wasFound = false;\n\n const result = array\n // merge the existing item if matches condition\n .map((p: T) => {\n if (!where(p)) return p;\n\n wasFound = true;\n return onExisting(p);\n })\n // filter out item if undefined was returned\n // for cases of removal\n .filter((p) => p !== undefined)\n // make TypeScript happy\n .map((p) => {\n if (!p) throw Error('That should not happen');\n\n return p;\n });\n\n // if item was not found and onNotFound action is defined\n // try to generate new item\n if (!wasFound) {\n const result = onNotFound();\n\n if (result !== undefined) return [...array, item];\n }\n\n return result;\n};\n","import { getDuplicates, hasDuplicates } from './duplicates';\nimport { merge } from './merge';\n\nexport * from './merge';\n\nexport const arrayUtils = {\n merge,\n hasDuplicates,\n getDuplicates,\n};\n","export const deepEquals = <T>(left: T, right: T): boolean => {\n if (isEquatable(left)) {\n return left.equals(right);\n }\n\n if (Array.isArray(left)) {\n return (\n Array.isArray(right) &&\n left.length === right.length &&\n left.every((val, index) => deepEquals(val, right[index]))\n );\n }\n\n if (\n typeof left !== 'object' ||\n typeof right !== 'object' ||\n left === null ||\n right === null\n ) {\n return left === right;\n }\n\n if (Array.isArray(right)) return false;\n\n const keys1 = Object.keys(left);\n const keys2 = Object.keys(right);\n\n if (\n keys1.length !== keys2.length ||\n !keys1.every((key) => keys2.includes(key))\n )\n return false;\n\n for (const key in left) {\n if (left[key] instanceof Function && right[key] instanceof Function)\n continue;\n\n const isEqual = deepEquals(left[key], right[key]);\n if (!isEqual) {\n return false;\n }\n }\n\n return true;\n};\n\nexport type Equatable<T> = { equals: (right: T) => boolean } & T;\n\nexport const isEquatable = <T>(left: T): left is Equatable<T> => {\n return (\n left &&\n typeof left === 'object' &&\n 'equals' in left &&\n typeof left['equals'] === 'function'\n );\n};\n","export const sum = (\n iterator: Iterator<number, number, number> | Iterator<number>,\n) => {\n let value,\n done: boolean | undefined,\n sum = 0;\n do {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n ({ value, done } = iterator.next());\n sum += value || 0;\n } while (!done);\n return sum;\n};\n","import { EmmettError } from '../errors';\n\nexport type TaskQueue = TaskQueueItem[];\n\nexport type TaskQueueItem = {\n task: () => Promise<void>;\n options?: EnqueueTaskOptions;\n};\n\nexport type TaskProcessorOptions = {\n maxActiveTasks: number;\n maxQueueSize: number;\n maxTaskIdleTime?: number;\n};\n\nexport type Task<T> = (context: TaskContext) => Promise<T>;\n\nexport type TaskContext = {\n ack: () => void;\n};\n\nexport type EnqueueTaskOptions = { taskGroupId?: string };\n\nexport class TaskProcessor {\n private queue: TaskQueue = [];\n private isProcessing = false;\n private activeTasks = 0;\n private activeGroups: Set<string> = new Set();\n\n constructor(private options: TaskProcessorOptions) {}\n\n enqueue<T>(task: Task<T>, options?: EnqueueTaskOptions): Promise<T> {\n if (this.queue.length >= this.options.maxQueueSize) {\n return Promise.reject(\n new EmmettError(\n 'Too many pending connections. Please try again later.',\n ),\n );\n }\n\n return this.schedule(task, options);\n }\n\n waitForEndOfProcessing(): Promise<void> {\n return this.schedule(({ ack }) => Promise.resolve(ack()));\n }\n\n private schedule<T>(task: Task<T>, options?: EnqueueTaskOptions): Promise<T> {\n return promiseWithDeadline(\n (resolve, reject) => {\n const taskWithContext = () => {\n return new Promise<void>((resolveTask, failTask) => {\n const taskPromise = task({\n ack: resolveTask,\n });\n\n taskPromise.then(resolve).catch((err) => {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\n failTask(err);\n reject(err);\n });\n });\n };\n\n this.queue.push({ task: taskWithContext, options });\n if (!this.isProcessing) {\n this.ensureProcessing();\n }\n },\n { deadline: this.options.maxTaskIdleTime },\n );\n }\n\n private ensureProcessing(): void {\n if (this.isProcessing) return;\n this.isProcessing = true;\n this.processQueue();\n }\n\n private processQueue(): void {\n try {\n while (\n this.activeTasks < this.options.maxActiveTasks &&\n this.queue.length > 0\n ) {\n const item = this.takeFirstAvailableItem();\n\n if (item === null) return;\n\n const groupId = item.options?.taskGroupId;\n\n if (groupId) {\n // Mark the group as active\n this.activeGroups.add(groupId);\n }\n\n this.activeTasks++;\n void this.executeItem(item);\n }\n } catch (error) {\n console.error(error);\n throw error;\n } finally {\n this.isProcessing = false;\n if (\n this.hasItemsToProcess() &&\n this.activeTasks < this.options.maxActiveTasks\n ) {\n this.ensureProcessing();\n }\n }\n }\n\n private async executeItem({ task, options }: TaskQueueItem): Promise<void> {\n try {\n await task();\n } finally {\n this.activeTasks--;\n\n // Mark the group as inactive after task completion\n if (options && options.taskGroupId) {\n this.activeGroups.delete(options.taskGroupId);\n }\n\n this.ensureProcessing();\n }\n }\n\n private takeFirstAvailableItem = (): TaskQueueItem | null => {\n const taskIndex = this.queue.findIndex(\n (item) =>\n !item.options?.taskGroupId ||\n !this.activeGroups.has(item.options.taskGroupId),\n );\n\n if (taskIndex === -1) {\n // All remaining tasks are blocked by active groups\n return null;\n }\n\n // Remove the task from the queue\n const [item] = this.queue.splice(taskIndex, 1);\n\n return item ?? null;\n };\n\n private hasItemsToProcess = (): boolean =>\n this.queue.findIndex(\n (item) =>\n !item.options?.taskGroupId ||\n !this.activeGroups.has(item.options.taskGroupId),\n ) !== -1;\n}\n\nconst DEFAULT_PROMISE_DEADLINE = 2147483647;\n\nconst promiseWithDeadline = <T>(\n executor: (\n resolve: (value: T | PromiseLike<T>) => void,\n reject: (reason?: unknown) => void,\n ) => void,\n options: { deadline?: number },\n) => {\n return new Promise<T>((resolve, reject) => {\n let taskStarted = false;\n\n const maxWaitingTime = options.deadline || DEFAULT_PROMISE_DEADLINE;\n\n let timeoutId: NodeJS.Timeout | null = setTimeout(() => {\n if (!taskStarted) {\n reject(\n new Error('Task was not started within the maximum waiting time'),\n );\n }\n }, maxWaitingTime);\n\n executor((value) => {\n taskStarted = true;\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n timeoutId = null;\n resolve(value);\n }, reject);\n });\n};\n","import { TaskProcessor } from '../../taskProcessing';\n\nexport type LockOptions = { lockId: number };\n\nexport type AcquireLockOptions = { lockId: string };\nexport type ReleaseLockOptions = { lockId: string };\n\nexport type Lock = {\n acquire(options: AcquireLockOptions): Promise<void>;\n tryAcquire(options: AcquireLockOptions): Promise<boolean>;\n release(options: ReleaseLockOptions): Promise<boolean>;\n withAcquire: <Result = unknown>(\n handle: () => Promise<Result>,\n options: AcquireLockOptions,\n ) => Promise<Result>;\n};\n\nexport const InProcessLock = (): Lock => {\n const taskProcessor = new TaskProcessor({\n maxActiveTasks: Number.MAX_VALUE,\n maxQueueSize: Number.MAX_VALUE,\n });\n\n // Map to store ack functions of currently held locks: lockId -> ack()\n const locks = new Map<string, () => void>();\n\n return {\n async acquire({ lockId }: AcquireLockOptions): Promise<void> {\n // If the lock is already held, we just queue up another task in the same group.\n // TaskProcessor ensures tasks in the same group run one at a time.\n await new Promise<void>((resolve, reject) => {\n taskProcessor\n .enqueue(\n ({ ack }) => {\n // When this task starts, it means the previous lock (if any) was released\n // and now we have exclusive access.\n locks.set(lockId, ack);\n // We do NOT call ack() here. We hold onto the lock.\n resolve();\n return Promise.resolve();\n },\n { taskGroupId: lockId },\n )\n .catch(reject);\n });\n },\n\n async tryAcquire({ lockId }: AcquireLockOptions): Promise<boolean> {\n // If lock is already held, fail immediately\n if (locks.has(lockId)) {\n return false;\n }\n\n // TODO: Check pending queue\n await this.acquire({ lockId });\n\n return true;\n },\n\n release({ lockId }: ReleaseLockOptions): Promise<boolean> {\n const ack = locks.get(lockId);\n if (ack === undefined) {\n return Promise.resolve(true);\n }\n locks.delete(lockId);\n ack();\n return Promise.resolve(true);\n },\n\n async withAcquire<Result = unknown>(\n handle: () => Promise<Result>,\n { lockId }: AcquireLockOptions,\n ): Promise<Result> {\n return taskProcessor.enqueue(\n async ({ ack }) => {\n // When this task starts, it means the previous lock (if any) was released\n // and now we have exclusive access.\n locks.set(lockId, ack);\n\n // We do NOT call ack() here. We hold onto the lock.\n try {\n return await handle();\n } finally {\n locks.delete(lockId);\n ack();\n }\n },\n { taskGroupId: lockId },\n );\n },\n };\n};\n","import retry from 'async-retry';\n\nexport type AsyncRetryOptions = retry.Options & {\n shouldRetryError?: (error: unknown) => boolean;\n};\n\nexport const NoRetries: AsyncRetryOptions = { retries: 0 };\n\nexport const asyncRetry = async <T>(\n fn: () => Promise<T>,\n opts?: AsyncRetryOptions,\n): Promise<T> => {\n if (opts === undefined || opts.retries === 0) return fn();\n\n return retry(\n async (bail) => {\n try {\n return await fn();\n } catch (error) {\n if (opts?.shouldRetryError && !opts.shouldRetryError(error)) {\n bail(error as Error);\n }\n throw error;\n }\n },\n opts ?? { retries: 0 },\n );\n};\n","import {\n canCreateEventStoreSession,\n isExpectedVersionConflictError,\n NO_CONCURRENCY_CHECK,\n nulloSessionFactory,\n STREAM_DOES_NOT_EXIST,\n type AppendStreamResultOfEventStore,\n type EventStore,\n type EventStoreSession,\n type ExpectedStreamVersion,\n type StreamPositionTypeOfEventStore,\n} from '../eventStore';\nimport type { Event } from '../typing';\nimport { asyncRetry, NoRetries, type AsyncRetryOptions } from '../utils';\n\nexport const CommandHandlerStreamVersionConflictRetryOptions: AsyncRetryOptions =\n {\n retries: 3,\n minTimeout: 100,\n factor: 1.5,\n shouldRetryError: isExpectedVersionConflictError,\n };\n\nexport type CommandHandlerRetryOptions =\n | AsyncRetryOptions\n | { onVersionConflict: true | number | AsyncRetryOptions };\n\nconst fromCommandHandlerRetryOptions = (\n retryOptions: CommandHandlerRetryOptions | undefined,\n): AsyncRetryOptions => {\n if (retryOptions === undefined) return NoRetries;\n\n if ('onVersionConflict' in retryOptions) {\n if (typeof retryOptions.onVersionConflict === 'boolean')\n return CommandHandlerStreamVersionConflictRetryOptions;\n else if (typeof retryOptions.onVersionConflict === 'number')\n return {\n ...CommandHandlerStreamVersionConflictRetryOptions,\n retries: retryOptions.onVersionConflict,\n };\n else return retryOptions.onVersionConflict;\n }\n\n return retryOptions;\n};\n\n// #region command-handler\nexport type CommandHandlerResult<\n State,\n StreamEvent extends Event,\n Store extends EventStore,\n> = AppendStreamResultOfEventStore<Store> & {\n newState: State;\n newEvents: StreamEvent[];\n};\n\nexport type CommandHandlerOptions<State, StreamEvent extends Event> = {\n evolve: (state: State, event: StreamEvent) => State;\n initialState: () => State;\n mapToStreamId?: (id: string) => string;\n retry?: CommandHandlerRetryOptions;\n};\n\nexport type HandleOptions<Store extends EventStore> = Parameters<\n Store['appendToStream']\n>[2] &\n (\n | {\n expectedStreamVersion?: ExpectedStreamVersion<\n StreamPositionTypeOfEventStore<Store>\n >;\n }\n | {\n retry?: CommandHandlerRetryOptions;\n }\n );\n\nexport const CommandHandler =\n <State, StreamEvent extends Event>(\n options: CommandHandlerOptions<State, StreamEvent>,\n ) =>\n async <Store extends EventStore>(\n store: Store,\n id: string,\n handle: (\n state: State,\n ) => StreamEvent | StreamEvent[] | Promise<StreamEvent | StreamEvent[]>,\n handleOptions?: HandleOptions<Store>,\n ): Promise<CommandHandlerResult<State, StreamEvent, Store>> =>\n asyncRetry(\n async () => {\n const result = await withSession<\n Store,\n CommandHandlerResult<\n State,\n StreamEvent,\n StreamPositionTypeOfEventStore<Store>\n >\n >(store, async ({ eventStore }) => {\n const { evolve, initialState } = options;\n const mapToStreamId = options.mapToStreamId ?? ((id) => id);\n\n const streamName = mapToStreamId(id);\n\n // 1. Aggregate the stream\n const aggregationResult = await eventStore.aggregateStream<\n State,\n StreamEvent\n >(streamName, {\n evolve,\n initialState,\n read: {\n // expected stream version is passed to fail fast\n // if stream is in the wrong state\n expectedStreamVersion:\n handleOptions?.expectedStreamVersion ?? NO_CONCURRENCY_CHECK,\n },\n });\n\n // 2. Use the aggregate state\n\n const {\n state,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n currentStreamVersion,\n streamExists: _streamExists,\n ...restOfAggregationResult\n } = aggregationResult;\n\n // 3. Run business logic\n const result = await handle(state);\n\n const newEvents = Array.isArray(result) ? result : [result];\n\n if (newEvents.length === 0) {\n return {\n ...restOfAggregationResult,\n newEvents: [],\n newState: state,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n nextExpectedStreamVersion: currentStreamVersion,\n createdNewStream: false,\n } as unknown as CommandHandlerResult<State, StreamEvent, Store>;\n }\n\n // Either use:\n // - provided expected stream version,\n // - current stream version got from stream aggregation,\n // - or expect stream not to exists otherwise.\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const expectedStreamVersion: ExpectedStreamVersion<\n StreamPositionTypeOfEventStore<Store>\n > =\n handleOptions?.expectedStreamVersion ??\n (aggregationResult.streamExists\n ? (currentStreamVersion as ExpectedStreamVersion<\n StreamPositionTypeOfEventStore<Store>\n >)\n : STREAM_DOES_NOT_EXIST);\n\n // 4. Append result to the stream\n const appendResult = await eventStore.appendToStream(\n streamName,\n newEvents,\n {\n ...handleOptions,\n expectedStreamVersion,\n },\n );\n\n // 5. Return result with updated state\n return {\n ...appendResult,\n newEvents,\n newState: newEvents.reduce(evolve, state),\n } as unknown as CommandHandlerResult<State, StreamEvent, Store>;\n });\n\n return result;\n },\n fromCommandHandlerRetryOptions(\n handleOptions && 'retry' in handleOptions\n ? handleOptions.retry\n : options.retry,\n ),\n );\n// #endregion command-handler\n\nconst withSession = <EventStoreType extends EventStore, T = unknown>(\n eventStore: EventStoreType,\n callback: (session: EventStoreSession<EventStoreType>) => Promise<T>,\n) => {\n const sessionFactory = canCreateEventStoreSession<EventStoreType>(eventStore)\n ? eventStore\n : nulloSessionFactory<EventStoreType>(eventStore);\n\n return sessionFactory.withSession(callback);\n};\n","import type { EventStore } from '../eventStore';\nimport type { Command, Event } from '../typing';\nimport type { Decider } from '../typing/decider';\nimport {\n CommandHandler,\n type CommandHandlerOptions,\n type HandleOptions,\n} from './handleCommand';\n\n// #region command-handler\n\nexport type DeciderCommandHandlerOptions<\n State,\n CommandType extends Command,\n StreamEvent extends Event,\n> = CommandHandlerOptions<State, StreamEvent> &\n Decider<State, CommandType, StreamEvent>;\n\nexport const DeciderCommandHandler =\n <State, CommandType extends Command, StreamEvent extends Event>(\n options: DeciderCommandHandlerOptions<State, CommandType, StreamEvent>,\n ) =>\n async <Store extends EventStore>(\n eventStore: Store,\n id: string,\n command: CommandType,\n handleOptions?: HandleOptions<Store>,\n ) => {\n const { decide, ...rest } = options;\n\n return CommandHandler<State, StreamEvent>(rest)(\n eventStore,\n id,\n (state) => decide(command, state),\n handleOptions,\n );\n };\n// #endregion command-handler\n","export class ParseError extends Error {\n constructor(text: string) {\n super(`Cannot parse! ${text}`);\n }\n}\n\nexport type Mapper<From, To = From> =\n | ((value: unknown) => To)\n | ((value: Partial<From>) => To)\n | ((value: From) => To)\n | ((value: Partial<To>) => To)\n | ((value: To) => To)\n | ((value: Partial<To | From>) => To)\n | ((value: To | From) => To);\n\nexport type MapperArgs<From, To = From> = Partial<From> &\n From &\n Partial<To> &\n To;\n\nexport type ParseOptions<From, To = From> = {\n reviver?: (key: string, value: unknown) => unknown;\n map?: Mapper<From, To>;\n typeCheck?: <To>(value: unknown) => value is To;\n};\n\nexport type StringifyOptions<From, To = From> = {\n map?: Mapper<From, To>;\n};\n\nexport const JSONParser = {\n stringify: <From, To = From>(\n value: From,\n options?: StringifyOptions<From, To>,\n ) => {\n return JSON.stringify(\n options?.map ? options.map(value as MapperArgs<From, To>) : value,\n //TODO: Consider adding support to DateTime and adding specific format to mark that's a bigint\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n (_, v) => (typeof v === 'bigint' ? v.toString() : v),\n );\n },\n parse: <From, To = From>(\n text: string,\n options?: ParseOptions<From, To>,\n ): To | undefined => {\n const parsed: unknown = JSON.parse(text, options?.reviver);\n\n if (options?.typeCheck && !options?.typeCheck<To>(parsed))\n throw new ParseError(text);\n\n return options?.map\n ? options.map(parsed as MapperArgs<From, To>)\n : (parsed as To | undefined);\n },\n};\n","import { JSONParser } from '../serialization';\n\nexport interface DocumentsCollection<T> {\n store: (id: string, obj: T) => void;\n delete: (id: string) => void;\n get: (id: string) => T | null;\n}\n\nexport interface Database {\n collection: <T>(name: string) => DocumentsCollection<T>;\n}\n\nexport const getInMemoryDatabase = (): Database => {\n const storage = new Map<string, unknown>();\n\n return {\n collection: <T>(\n collectionName: string,\n _collectionOptions: {\n errors?: { throwOnOperationFailures?: boolean } | undefined;\n } = {},\n ): DocumentsCollection<T> => {\n const toFullId = (id: string) => `${collectionName}-${id}`;\n\n const collection = {\n store: (id: string, obj: T): void => {\n storage.set(toFullId(id), obj);\n },\n delete: (id: string): void => {\n storage.delete(toFullId(id));\n },\n get: (id: string): T | null => {\n const result = storage.get(toFullId(id));\n\n return result\n ? // Clone to simulate getting new instance on loading\n (JSONParser.parse(JSONParser.stringify(result)) as T)\n : null;\n },\n };\n\n return collection;\n },\n };\n};\n","import { EmmettError } from '../errors';\nimport {\n type Command,\n type CommandTypeOf,\n type Event,\n type EventTypeOf,\n} from '../typing';\n\nexport interface CommandSender {\n send<CommandType extends Command = Command>(\n command: CommandType,\n ): Promise<void>;\n}\n\nexport interface EventsPublisher {\n publish<EventType extends Event = Event>(event: EventType): Promise<void>;\n}\n\nexport type ScheduleOptions = { afterInMs: number } | { at: Date };\n\nexport interface MessageScheduler<CommandOrEvent extends Command | Event> {\n schedule<MessageType extends CommandOrEvent>(\n message: MessageType,\n when?: ScheduleOptions,\n ): void;\n}\n\nexport interface CommandBus extends CommandSender, MessageScheduler<Command> {}\n\nexport interface EventBus extends EventsPublisher, MessageScheduler<Event> {}\n\nexport interface MessageBus extends CommandBus, EventBus {\n schedule<MessageType extends Command | Event>(\n message: MessageType,\n when?: ScheduleOptions,\n ): void;\n}\n\ntype CommandHandler<CommandType extends Command = Command> = (\n command: CommandType,\n) => Promise<void> | void;\n\nexport interface CommandProcessor {\n handle<CommandType extends Command>(\n commandHandler: CommandHandler<CommandType>,\n ...commandTypes: CommandTypeOf<CommandType>[]\n ): void;\n}\n\ntype EventHandler<EventType extends Event = Event> = (\n event: EventType,\n) => Promise<void> | void;\n\nexport interface EventProcessor {\n subscribe<EventType extends Event>(\n eventHandler: EventHandler<EventType>,\n ...eventTypes: EventTypeOf<EventType>[]\n ): void;\n}\n\nexport type ScheduledMessage = {\n message: Event | Command;\n options?: ScheduleOptions;\n};\n\nexport interface ScheduledMessageProcessor {\n dequeue(): ScheduledMessage[];\n}\n\nexport type MessageHandler = CommandHandler | EventHandler;\n\nexport type MessageProcessor = EventProcessor | CommandProcessor;\n\nexport const getInMemoryMessageBus = (): MessageBus &\n EventProcessor &\n CommandProcessor &\n ScheduledMessageProcessor => {\n const allHandlers = new Map<string, MessageHandler[]>();\n let pendingMessages: ScheduledMessage[] = [];\n\n return {\n send: async <CommandType extends Command = Command>(\n command: CommandType,\n ): Promise<void> => {\n const handlers = allHandlers.get(command.type);\n\n if (handlers === undefined || handlers.length === 0)\n throw new EmmettError(\n `No handler registered for command ${command.type}!`,\n );\n\n const commandHandler = handlers[0] as CommandHandler<CommandType>;\n\n await commandHandler(command);\n },\n\n publish: async <EventType extends Event = Event>(\n event: EventType,\n ): Promise<void> => {\n const handlers = allHandlers.get(event.type) ?? [];\n\n for (const handler of handlers) {\n const eventHandler = handler as EventHandler<EventType>;\n\n await eventHandler(event);\n }\n },\n\n schedule: <MessageType extends Command | Event>(\n message: MessageType,\n when?: ScheduleOptions,\n ): void => {\n pendingMessages = [...pendingMessages, { message, options: when }];\n },\n\n handle: <CommandType extends Command>(\n commandHandler: CommandHandler<CommandType>,\n ...commandTypes: CommandTypeOf<CommandType>[]\n ): void => {\n const alreadyRegistered = [...allHandlers.keys()].filter((registered) =>\n commandTypes.includes(registered),\n );\n\n if (alreadyRegistered.length > 0)\n throw new EmmettError(\n `Cannot register handler for commands ${alreadyRegistered.join(', ')} as they're already registered!`,\n );\n for (const commandType of commandTypes) {\n allHandlers.set(commandType, [commandHandler as MessageHandler]);\n }\n },\n\n subscribe<EventType extends Event>(\n eventHandler: EventHandler<EventType>,\n ...eventTypes: EventTypeOf<EventType>[]\n ): void {\n for (const eventType of eventTypes) {\n if (!allHandlers.has(eventType)) allHandlers.set(eventType, []);\n\n allHandlers.set(eventType, [\n ...(allHandlers.get(eventType) ?? []),\n eventHandler as MessageHandler,\n ]);\n }\n },\n\n dequeue: (): ScheduledMessage[] => {\n const pending = pendingMessages;\n pendingMessages = [];\n return pending;\n },\n };\n};\n","import { EmmettError } from '../errors';\nimport { JSONParser } from '../serialization';\nimport type {\n AnyReadEventMetadata,\n CanHandle,\n DefaultRecord,\n Event,\n ReadEvent,\n} from '../typing';\nimport { arrayUtils } from '../utils';\n\nexport type ProjectionHandlingType = 'inline' | 'async';\n\nexport type ProjectionHandler<\n EventType extends Event = Event,\n EventMetaDataType extends AnyReadEventMetadata = AnyReadEventMetadata,\n ProjectionHandlerContext extends DefaultRecord = DefaultRecord,\n> = (\n events: ReadEvent<EventType, EventMetaDataType>[],\n context: ProjectionHandlerContext,\n) => Promise<void> | void;\n\nexport interface ProjectionDefinition<\n ReadEventMetadataType extends AnyReadEventMetadata = AnyReadEventMetadata,\n ProjectionHandlerContext extends DefaultRecord = DefaultRecord,\n> {\n name?: string;\n canHandle: CanHandle<Event>;\n handle: ProjectionHandler<\n Event,\n ReadEventMetadataType,\n ProjectionHandlerContext\n >;\n}\n\nexport interface TypedProjectionDefinition<\n EventType extends Event = Event,\n EventMetaDataType extends AnyReadEventMetadata = AnyReadEventMetadata,\n ProjectionHandlerContext extends DefaultRecord = DefaultRecord,\n> {\n name?: string;\n canHandle: CanHandle<EventType>;\n handle: ProjectionHandler<\n EventType,\n EventMetaDataType,\n ProjectionHandlerContext\n >;\n}\n\nexport type ProjectionRegistration<\n HandlingType extends ProjectionHandlingType,\n ReadEventMetadataType extends AnyReadEventMetadata = AnyReadEventMetadata,\n ProjectionHandlerContext extends DefaultRecord = DefaultRecord,\n> = {\n type: HandlingType;\n projection: ProjectionDefinition<\n ReadEventMetadataType,\n ProjectionHandlerContext\n >;\n};\n\nexport const filterProjections = <\n ReadEventMetadataType extends AnyReadEventMetadata = AnyReadEventMetadata,\n ProjectionHandlerContext extends DefaultRecord = DefaultRecord,\n>(\n type: ProjectionHandlingType,\n projections: ProjectionRegistration<\n ProjectionHandlingType,\n ReadEventMetadataType,\n ProjectionHandlerContext\n >[],\n) => {\n const inlineProjections = projections\n .filter((projection) => projection.type === type)\n .map(({ projection }) => projection);\n\n const duplicateRegistrations = arrayUtils.getDuplicates(\n inlineProjections,\n (proj) => proj.name,\n );\n\n if (duplicateRegistrations.length > 0) {\n throw new EmmettError(`You cannot register multiple projections with the same name (or without the name).\n Ensure that:\n ${JSONParser.stringify(duplicateRegistrations)}\n have different names`);\n }\n\n return inlineProjections;\n};\n\nexport const projection = <\n EventType extends Event = Event,\n EventMetaDataType extends AnyReadEventMetadata = AnyReadEventMetadata,\n ProjectionHandlerContext extends DefaultRecord = DefaultRecord,\n ProjectionDefintionType extends TypedProjectionDefinition<\n EventType,\n EventMetaDataType,\n ProjectionHandlerContext\n > = TypedProjectionDefinition<\n EventType,\n EventMetaDataType,\n ProjectionHandlerContext\n >,\n>(\n definition: ProjectionDefintionType,\n): ProjectionDefintionType => definition;\n\nexport const inlineProjections = <\n ReadEventMetadataType extends AnyReadEventMetadata = AnyReadEventMetadata,\n ProjectionHandlerContext extends DefaultRecord = DefaultRecord,\n ProjectionDefintionType extends ProjectionDefinition<\n ReadEventMetadataType,\n ProjectionHandlerContext\n > = ProjectionDefinition<ReadEventMetadataType, ProjectionHandlerContext>,\n>(\n definitions: ProjectionDefintionType[],\n): ProjectionRegistration<\n 'inline',\n ReadEventMetadataType,\n ProjectionHandlerContext\n>[] => definitions.map((projection) => ({ type: 'inline', projection }));\n\nexport const asyncProjections = <\n ReadEventMetadataType extends AnyReadEventMetadata = AnyReadEventMetadata,\n ProjectionHandlerContext extends DefaultRecord = DefaultRecord,\n ProjectionDefintionType extends ProjectionDefinition<\n ReadEventMetadataType,\n ProjectionHandlerContext\n > = ProjectionDefinition<ReadEventMetadataType, ProjectionHandlerContext>,\n>(\n definitions: ProjectionDefintionType[],\n): ProjectionRegistration<\n 'async',\n ReadEventMetadataType,\n ProjectionHandlerContext\n>[] => definitions.map((projection) => ({ type: 'async', projection }));\n\nexport const projections = {\n inline: inlineProjections,\n async: asyncProjections,\n};\n","export const concatUint8Arrays = (chunks: Uint8Array[]): Uint8Array => {\n const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n return result;\n};\n","import type { ReadableStream } from 'web-streams-polyfill';\n\nexport const collect = async <T>(stream: ReadableStream<T>): Promise<T[]> => {\n const results: T[] = [];\n\n for await (const value of stream) {\n results.push(value as T);\n }\n\n return results;\n};\n","import type { Decoder } from '.';\nimport { concatUint8Arrays } from '../binaryArrays';\n\nexport class BinaryJsonDecoder<Decoded>\n implements Decoder<Uint8Array, Decoded>\n{\n private buffer: Uint8Array[] = [];\n\n addToBuffer(data: Uint8Array): void {\n this.buffer.push(data);\n }\n\n clearBuffer(): void {\n this.buffer = [];\n }\n\n hasCompleteMessage(): boolean {\n const combined = concatUint8Arrays(this.buffer);\n const text = new TextDecoder().decode(combined);\n return text.includes('\\n');\n }\n\n decode(): Decoded | null {\n if (!this.hasCompleteMessage()) {\n return null;\n }\n\n const combined = concatUint8Arrays(this.buffer);\n const text = new TextDecoder().decode(combined);\n const delimiterIndex = text.indexOf('\\n');\n\n if (delimiterIndex === -1) {\n return null;\n }\n\n const jsonString = text.slice(0, delimiterIndex);\n const remaining = new Uint8Array(combined.buffer, delimiterIndex + 1);\n this.buffer = remaining.byteLength > 0 ? [remaining] : [];\n\n return JSON.parse(jsonString) as Decoded;\n }\n}\n","import type { Decoder } from '.';\n\nexport class StringDecoder<Decoded> implements Decoder<string, Decoded> {\n protected buffer: string[] = [];\n\n constructor(private transform: (input: string) => Decoded) {\n this.transform = transform;\n }\n\n addToBuffer(data: string): void {\n this.buffer.push(data);\n }\n\n clearBuffer(): void {\n this.buffer = [];\n }\n\n hasCompleteMessage(): boolean {\n return this.buffer.some((chunk) => chunk.includes('\\n'));\n }\n\n decode(): Decoded | null {\n const completeString = this.buffer.join('');\n\n if (!this.hasCompleteMessage()) {\n if (completeString.trim().length > 0) {\n throw new Error('Unterminated string in JSON at position');\n }\n return null;\n }\n\n const delimiterIndex = completeString.indexOf('\\n');\n const message = completeString.slice(0, delimiterIndex).trim();\n this.buffer = [completeString.slice(delimiterIndex + 1)];\n\n return this.transform(message);\n }\n}\n","import { StringDecoder } from './string';\n\nexport class JsonDecoder<Decoded> extends StringDecoder<Decoded> {\n constructor() {\n super((jsonString) => JSON.parse(jsonString) as Decoded);\n }\n}\n","import type { Decoder } from '.';\n\nexport class ObjectDecoder<Decoded> implements Decoder<Decoded, Decoded> {\n private buffer: Decoded | null = null;\n\n addToBuffer(data: Decoded): void {\n this.buffer = data;\n }\n\n clearBuffer(): void {\n this.buffer = null;\n }\n\n hasCompleteMessage(): boolean {\n return this.buffer !== null;\n }\n\n decode(): Decoded | null {\n if (!this.hasCompleteMessage() || !this.buffer) {\n return null;\n }\n\n const data = this.buffer;\n this.clearBuffer();\n return data as Decoded;\n }\n}\n","import type { Decoder } from '.';\nimport { BinaryJsonDecoder } from './binary';\nimport { JsonDecoder } from './json';\nimport { ObjectDecoder } from './object';\n\nexport class CompositeDecoder<Decoded> implements Decoder<unknown, Decoded> {\n constructor(\n private decoders: [(data: unknown) => boolean, Decoder<unknown, Decoded>][],\n ) {}\n\n private decoderFor(data: unknown): Decoder<unknown, unknown> | null {\n const decoder = this.decoders.find((d) => d[0](data));\n\n if (!decoder) return null;\n\n return decoder[1];\n }\n\n addToBuffer(data: unknown): void {\n this.decoderFor(data)?.addToBuffer(data);\n }\n\n clearBuffer(): void {\n for (const decoder of this.decoders.map((d) => d[1])) {\n decoder.clearBuffer();\n }\n }\n\n hasCompleteMessage(): boolean {\n return this.decoders.some((d) => d[1].hasCompleteMessage());\n }\n\n decode(): Decoded | null {\n const decoder = this.decoders\n .map((d) => d[1])\n .find((d) => d.hasCompleteMessage());\n\n return decoder?.decode() ?? null;\n }\n}\n\nexport class DefaultDecoder<Decoded> extends CompositeDecoder<Decoded> {\n constructor() {\n super([\n [(data) => typeof data === 'string', new JsonDecoder<Decoded>()],\n [(data) => data instanceof Uint8Array, new BinaryJsonDecoder<Decoded>()],\n [(data) => typeof data === 'object', new ObjectDecoder<Decoded>()],\n ]);\n }\n}\n","import { ReadableStream } from 'web-streams-polyfill';\n\nexport const fromArray = <T>(chunks: T[]) =>\n new ReadableStream<T>({\n start(controller) {\n for (const chunk of chunks) controller.enqueue(chunk);\n controller.close();\n },\n });\n","import { fromArray } from './fromArray';\nexport const streamGenerators = { fromArray };\n","import {\n type ReadableStream,\n type ReadableStreamDefaultReadResult,\n type TransformStreamDefaultController,\n} from 'web-streams-polyfill';\nimport type { AsyncRetryOptions } from '../utils';\nimport type { Decoder } from './decoders';\nimport { DefaultDecoder } from './decoders/composite';\nimport { streamTransformations } from './transformations';\n\nconst { retry } = streamTransformations;\n\nexport const restream = <\n Source = unknown,\n Transformed = Source,\n StreamType = Source,\n>(\n createSourceStream: () => ReadableStream<StreamType>,\n transform: (input: Source) => Transformed = (source) =>\n source as unknown as Transformed,\n retryOptions: AsyncRetryOptions = { forever: true, minTimeout: 25 },\n decoder: Decoder<StreamType, Source> = new DefaultDecoder<Source>(),\n): ReadableStream<Transformed> =>\n retry(createSourceStream, handleChunk(transform, decoder), retryOptions)\n .readable;\n\nconst handleChunk =\n <Source = unknown, Transformed = Source, StreamType = Source>(\n transform: (input: Source) => Transformed = (source) =>\n source as unknown as Transformed,\n decoder: Decoder<StreamType, Source> = new DefaultDecoder<Source>(),\n ) =>\n (\n readResult: ReadableStreamDefaultReadResult<StreamType>,\n controller: TransformStreamDefaultController<Transformed>,\n ): void => {\n const { done: isDone, value } = readResult;\n\n if (value) decoder.addToBuffer(value);\n\n if (!isDone && !decoder.hasCompleteMessage()) return;\n\n decodeAndTransform(decoder, transform, controller);\n };\n\nconst decodeAndTransform = <StreamType, Source, Transformed = Source>(\n decoder: Decoder<StreamType, Source>,\n transform: (input: Source) => Transformed,\n controller: TransformStreamDefaultController<Transformed>,\n) => {\n try {\n const decoded = decoder.decode();\n if (!decoded) return; // TODO: Add a proper handling of decode errors\n\n const transformed = transform(decoded);\n controller.enqueue(transformed);\n } catch (error) {\n controller.error(new Error(`Decoding error: ${error?.toString()}`));\n }\n};\n","import { TransformStream } from 'web-streams-polyfill';\n\nexport const filter = <Item>(filter: (item: Item) => boolean) =>\n new TransformStream<Item, Item>({\n transform(chunk, controller) {\n if (filter(chunk)) {\n controller.enqueue(chunk);\n }\n },\n });\n","import { TransformStream } from 'web-streams-polyfill';\n\nexport const map = <From, To>(map: (item: From) => To) =>\n new TransformStream<From, To>({\n transform(chunk, controller) {\n controller.enqueue(map(chunk));\n },\n });\n","import { TransformStream } from 'web-streams-polyfill';\n\nexport const reduce = <I, O>(\n reducer: (accumulator: O, chunk: I) => O,\n initialValue: O,\n) => new ReduceTransformStream<I, O>(reducer, initialValue);\n\nexport class ReduceTransformStream<I, O> extends TransformStream<I, O> {\n private accumulator: O;\n private reducer: (accumulator: O, chunk: I) => O;\n\n constructor(reducer: (accumulator: O, chunk: I) => O, initialValue: O) {\n super({\n transform: (chunk) => {\n this.accumulator = this.reducer(this.accumulator, chunk);\n },\n flush: (controller) => {\n controller.enqueue(this.accumulator);\n controller.terminate();\n },\n });\n\n this.accumulator = initialValue;\n this.reducer = reducer;\n }\n}\n","import {\n type ReadableStream,\n type ReadableStreamDefaultReadResult,\n TransformStream,\n type TransformStreamDefaultController,\n} from 'web-streams-polyfill';\nimport { type AsyncRetryOptions, asyncRetry } from '../../utils';\n\nexport const retryStream = <\n Source = unknown,\n Transformed = Source,\n StreamType = Source,\n>(\n createSourceStream: () => ReadableStream<StreamType>,\n handleChunk: (\n readResult: ReadableStreamDefaultReadResult<StreamType>,\n controller: TransformStreamDefaultController<Transformed>,\n ) => Promise<void> | void,\n retryOptions: AsyncRetryOptions = { forever: true, minTimeout: 25 },\n): TransformStream<Source, Transformed> =>\n new TransformStream<Source, Transformed>({\n start(controller) {\n asyncRetry(\n () => onRestream(createSourceStream, handleChunk, controller),\n retryOptions,\n ).catch((error) => {\n controller.error(error);\n });\n },\n });\n\nconst onRestream = async <StreamType, Source, Transformed = Source>(\n createSourceStream: () => ReadableStream<StreamType>,\n handleChunk: (\n readResult: ReadableStreamDefaultReadResult<StreamType>,\n controller: TransformStreamDefaultController<Transformed>,\n ) => Promise<void> | void,\n controller: TransformStreamDefaultController<Transformed>,\n): Promise<void> => {\n const sourceStream = createSourceStream();\n const reader = sourceStream.getReader();\n\n try {\n let done: boolean;\n\n do {\n const result = await reader.read();\n done = result.done;\n\n await handleChunk(result, controller);\n\n if (done) {\n controller.terminate();\n }\n } while (!done);\n } finally {\n reader.releaseLock();\n }\n};\n","import { TransformStream } from 'web-streams-polyfill';\n\nexport const skip = <T>(limit: number) => new SkipTransformStream<T>(limit);\n\nexport class SkipTransformStream<T> extends TransformStream<T, T> {\n private count = 0;\n private skip: number;\n\n constructor(skip: number) {\n super({\n transform: (chunk, controller) => {\n this.count++;\n if (this.count > this.skip) {\n controller.enqueue(chunk);\n }\n },\n });\n\n this.skip = skip;\n }\n}\n","import { TransformStream } from 'web-streams-polyfill';\n\nexport const stopAfter = <Item>(stopCondition: (item: Item) => boolean) =>\n new TransformStream<Item, Item>({\n transform(chunk, controller) {\n controller.enqueue(chunk);\n\n if (stopCondition(chunk)) {\n controller.terminate();\n }\n },\n });\n","import { TransformStream } from 'web-streams-polyfill';\n\nexport const stopOn = <Item>(stopCondition: (item: Item) => boolean) =>\n new TransformStream<Item, Item>({\n async transform(chunk, controller) {\n if (!stopCondition(chunk)) {\n controller.enqueue(chunk);\n return;\n }\n await Promise.resolve();\n controller.terminate();\n },\n });\n","import { TransformStream } from 'web-streams-polyfill';\n\nexport const take = <T>(limit: number) => new TakeTransformStream<T>(limit);\n\nexport class TakeTransformStream<T> extends TransformStream<T, T> {\n private count = 0;\n private limit: number;\n\n constructor(limit: number) {\n super({\n transform: (chunk, controller) => {\n if (this.count < this.limit) {\n this.count++;\n controller.enqueue(chunk);\n } else {\n controller.terminate();\n }\n },\n });\n\n this.limit = limit;\n }\n}\n","import { TransformStream } from 'web-streams-polyfill';\n\nexport const waitAtMost = <Item>(waitTimeInMs: number) =>\n new TransformStream<Item, Item>({\n start(controller) {\n const timeoutId = setTimeout(() => {\n controller.terminate();\n }, waitTimeInMs);\n\n const originalTerminate = controller.terminate.bind(controller);\n\n // Clear the timeout if the stream is terminated early\n controller.terminate = () => {\n clearTimeout(timeoutId);\n originalTerminate();\n };\n },\n transform(chunk, controller) {\n controller.enqueue(chunk);\n },\n });\n","import { filter } from './filter';\nimport { map } from './map';\nimport {\n notifyAboutNoActiveReadersStream,\n NotifyAboutNoActiveReadersStream,\n} from './notifyAboutNoActiveReaders';\nimport { reduce, ReduceTransformStream } from './reduce';\nimport { retryStream } from './retry';\nimport { skip, SkipTransformStream } from './skip';\nimport { stopAfter } from './stopAfter';\nimport { stopOn } from './stopOn';\nimport { take, TakeTransformStream } from './take';\nimport { waitAtMost } from './waitAtMost';\n\nexport const streamTransformations = {\n filter,\n take,\n TakeTransformStream,\n skip,\n SkipTransformStream,\n map,\n notifyAboutNoActiveReadersStream,\n NotifyAboutNoActiveReadersStream,\n reduce,\n ReduceTransformStream,\n retry: retryStream,\n stopAfter,\n stopOn,\n waitAtMost,\n};\n","import { JSONParser } from '../serialization';\nimport type { DefaultRecord } from '../typing';\nimport { deepEquals } from '../utils';\n\nexport class AssertionError extends Error {\n constructor(message: string) {\n super(message);\n }\n}\n\nexport const isSubset = (superObj: unknown, subObj: unknown): boolean => {\n const sup = superObj as DefaultRecord;\n const sub = subObj as DefaultRecord;\n\n assertOk(sup);\n assertOk(sub);\n\n return Object.keys(sub).every((ele: string) => {\n if (typeof sub[ele] == 'object') {\n return isSubset(sup[ele], sub[ele]);\n }\n return sub[ele] === sup[ele];\n });\n};\n\nexport const assertFails = (message?: string) => {\n throw new AssertionError(message ?? 'That should not ever happened, right?');\n};\n\nexport const assertThrowsAsync = async <TError extends Error>(\n fun: () => Promise<void>,\n errorCheck?: (error: Error) => boolean,\n): Promise<TError> => {\n try {\n await fun();\n } catch (error) {\n const typedError = error as TError;\n if (typedError instanceof AssertionError || !errorCheck) {\n assertFalse(\n typedError instanceof AssertionError,\n \"Function didn't throw expected error\",\n );\n return typedError;\n }\n\n assertTrue(\n errorCheck(typedError),\n `Error doesn't match the expected condition: ${JSONParser.stringify(error)}`,\n );\n\n return typedError;\n }\n throw new AssertionError(\"Function didn't throw expected error\");\n};\n\nexport const assertThrows = <TError extends Error>(\n fun: () => void,\n errorCheck?: (error: Error) => boolean,\n): TError => {\n try {\n fun();\n } catch (error) {\n const typedError = error as TError;\n\n if (errorCheck) {\n assertTrue(\n errorCheck(typedError),\n `Error doesn't match the expected condition: ${JSONParser.stringify(error)}`,\n );\n } else if (typedError instanceof AssertionError) {\n assertFalse(\n typedError instanceof AssertionError,\n \"Function didn't throw expected error\",\n );\n }\n\n return typedError;\n }\n throw new AssertionError(\"Function didn't throw expected error\");\n};\n\nexport const assertDoesNotThrow = <TError extends Error>(\n fun: () => void,\n errorCheck?: (error: Error) => boolean,\n): TError | null => {\n try {\n fun();\n return null;\n } catch (error) {\n const typedError = error as TError;\n\n if (errorCheck) {\n assertFalse(\n errorCheck(typedError),\n `Error matching the expected condition was thrown!: ${JSONParser.stringify(error)}`,\n );\n } else {\n assertFails(`Function threw an error: ${JSONParser.stringify(error)}`);\n }\n\n return typedError;\n }\n};\n\nexport const assertRejects = async <T, TError extends Error = Error>(\n promise: Promise<T>,\n errorCheck?: ((error: TError) => boolean) | TError,\n) => {\n try {\n await promise;\n throw new AssertionError(\"Function didn't throw expected error\");\n } catch (error) {\n if (!errorCheck) return;\n\n if (errorCheck instanceof Error) assertDeepEqual(error, errorCheck);\n else assertTrue(errorCheck(error as TError));\n }\n};\n\nexport const assertMatches = (\n actual: unknown,\n expected: unknown,\n message?: string,\n) => {\n if (!isSubset(actual, expected))\n throw new AssertionError(\n message ??\n `subObj:\\n${JSONParser.stringify(expected)}\\nis not subset of\\n${JSONParser.stringify(actual)}`,\n );\n};\n\nexport const assertDeepEqual = <T = unknown>(\n actual: T,\n expected: T,\n message?: string,\n) => {\n if (!deepEquals(actual, expected))\n throw new AssertionError(\n message ??\n `subObj:\\n${JSONParser.stringify(expected)}\\nis not equal to\\n${JSONParser.stringify(actual)}`,\n );\n};\n\nexport const assertNotDeepEqual = <T = unknown>(\n actual: T,\n expected: T,\n message?: string,\n) => {\n if (deepEquals(actual, expected))\n throw new AssertionError(\n message ??\n `subObj:\\n${JSONParser.stringify(expected)}\\nis equals to\\n${JSONParser.stringify(actual)}`,\n );\n};\n\nexport const assertThat = <T>(item: T) => {\n return {\n isEqualTo: (other: T) => assertTrue(deepEquals(item, other)),\n };\n};\n\nexport function assertFalse(\n condition: boolean,\n message?: string,\n): asserts condition is false {\n if (condition !== false)\n throw new AssertionError(message ?? `Condition is true`);\n}\n\nexport function assertTrue(\n condition: boolean,\n message?: string,\n): asserts condition is true {\n if (condition !== true)\n throw new AssertionError(message ?? `Condition is false`);\n}\n\nexport function assertOk<T>(\n obj: T | null | undefined,\n message?: string,\n): asserts obj is T {\n if (!obj) throw new AssertionError(message ?? `Condition is not truthy`);\n}\n\nexport function assertEqual<T>(\n expected: T | null | undefined,\n actual: T | null | undefined,\n message?: string,\n): void {\n if (expected !== actual)\n throw new AssertionError(\n `${message ?? 'Objects are not equal'}:\\nExpected: ${JSONParser.stringify(expected)}\\nActual: ${JSONParser.stringify(actual)}`,\n );\n}\n\nexport function assertNotEqual<T>(\n obj: T | null | undefined,\n other: T | null | undefined,\n message?: string,\n): void {\n if (obj === other)\n throw new AssertionError(\n message ?? `Objects are equal: ${JSONParser.stringify(obj)}`,\n );\n}\n\nexport function assertIsNotNull<T extends object | bigint>(\n result: T | null,\n): asserts result is T {\n assertNotEqual(result, null);\n assertOk(result);\n}\n\nexport function assertIsNull<T extends object>(\n result: T | null,\n): asserts result is null {\n assertEqual(result, null);\n}\n\ntype Call = {\n arguments: unknown[];\n result: unknown;\n target: unknown;\n this: unknown;\n};\n\nexport type ArgumentMatcher = (arg: unknown) => boolean;\n\nexport const argValue =\n <T>(value: T): ArgumentMatcher =>\n (arg) =>\n deepEquals(arg, value);\n\nexport const argMatches =\n <T>(matches: (arg: T) => boolean): ArgumentMatcher =>\n (arg) =>\n matches(arg as T);\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nexport type MockedFunction = Function & { mock?: { calls: Call[] } };\n\nexport function verifyThat(fn: MockedFunction) {\n return {\n calledTimes: (times: number) => {\n assertEqual(fn.mock?.calls?.length, times);\n },\n notCalled: () => {\n assertEqual(fn?.mock?.calls?.length, 0);\n },\n called: () => {\n assertTrue(\n fn.mock?.calls.length !== undefined && fn.mock.calls.length > 0,\n );\n },\n calledWith: (...args: unknown[]) => {\n assertTrue(\n fn.mock?.calls.length !== undefined &&\n fn.mock.calls.length >= 1 &&\n fn.mock.calls.some((call) => deepEquals(call.arguments, args)),\n );\n },\n calledOnceWith: (...args: unknown[]) => {\n assertTrue(\n fn.mock?.calls.length !== undefined &&\n fn.mock.calls.length === 1 &&\n fn.mock.calls.some((call) => deepEquals(call.arguments, args)),\n );\n },\n calledWithArgumentMatching: (...matches: ArgumentMatcher[]) => {\n assertTrue(\n fn.mock?.calls.length !== undefined && fn.mock.calls.length >= 1,\n );\n assertTrue(\n fn.mock?.calls.length !== undefined &&\n fn.mock.calls.length >= 1 &&\n fn.mock.calls.some(\n (call) =>\n call.arguments &&\n call.arguments.length >= matches.length &&\n matches.every((match, index) => match(call.arguments[index])),\n ),\n );\n },\n notCalledWithArgumentMatching: (...matches: ArgumentMatcher[]) => {\n assertFalse(\n fn.mock?.calls.length !== undefined &&\n fn.mock.calls.length >= 1 &&\n fn.mock.calls[0]!.arguments &&\n fn.mock.calls[0]!.arguments.length >= matches.length &&\n matches.every((match, index) =>\n match(fn.mock!.calls[0]!.arguments[index]),\n ),\n );\n },\n };\n}\n\nexport const assertThatArray = <T>(array: T[]) => {\n return {\n isEmpty: () =>\n assertEqual(\n array.length,\n 0,\n `Array is not empty ${JSONParser.stringify(array)}`,\n ),\n isNotEmpty: () => assertNotEqual(array.length, 0, `Array is empty`),\n hasSize: (length: number) => assertEqual(array.length, length),\n containsElements: (other: T[]) => {\n assertTrue(other.every((ts) => array.some((o) => deepEquals(ts, o))));\n },\n containsElementsMatching: (other: T[]) => {\n assertTrue(other.every((ts) => array.some((o) => isSubset(o, ts))));\n },\n containsOnlyElementsMatching: (other: T[]) => {\n assertEqual(array.length, other.length, `Arrays lengths don't match`);\n assertTrue(other.every((ts) => array.some((o) => isSubset(o, ts))));\n },\n containsExactlyInAnyOrder: (other: T[]) => {\n assertEqual(array.length, other.length);\n assertTrue(array.every((ts) => other.some((o) => deepEquals(ts, o))));\n },\n containsExactlyInAnyOrderElementsOf: (other: T[]) => {\n assertEqual(array.length, other.length);\n assertTrue(array.every((ts) => other.some((o) => deepEquals(ts, o))));\n },\n containsExactlyElementsOf: (other: T[]) => {\n assertEqual(array.length, other.length);\n for (let i = 0; i < array.length; i++) {\n assertTrue(deepEquals(array[i], other[i]));\n }\n },\n containsExactly: (elem: T) => {\n assertEqual(array.length, 1);\n assertTrue(deepEquals(array[0], elem));\n },\n contains: (elem: T) => {\n assertTrue(array.some((a) => deepEquals(a, elem)));\n },\n containsOnlyOnceElementsOf: (other: T[]) => {\n assertTrue(\n other\n .map((o) => array.filter((a) => deepEquals(a, o)).length)\n .filter((a) => a === 1).length === other.length,\n );\n },\n containsAnyOf: (other: T[]) => {\n assertTrue(array.some((a) => other.some((o) => deepEquals(a, o))));\n },\n allMatch: (matches: (item: T) => boolean) => {\n assertTrue(array.every(matches));\n },\n anyMatches: (matches: (item: T) => boolean) => {\n assertTrue(array.some(matches));\n },\n allMatchAsync: async (\n matches: (item: T) => Promise<boolean>,\n ): Promise<void> => {\n for (const item of array) {\n assertTrue(await matches(item));\n }\n },\n };\n};\n","import { isErrorConstructor, type ErrorConstructor } from '../errors';\nimport { AssertionError, assertThatArray, assertTrue } from './assertions';\n\ntype ErrorCheck<ErrorType> = (error: ErrorType) => boolean;\n\nexport type ThenThrows<ErrorType extends Error> =\n | (() => void)\n | ((errorConstructor: ErrorConstructor<ErrorType>) => void)\n | ((errorCheck: ErrorCheck<ErrorType>) => void)\n | ((\n errorConstructor: ErrorConstructor<ErrorType>,\n errorCheck?: ErrorCheck<ErrorType>,\n ) => void);\n\nexport type DeciderSpecification<Command, Event> = (\n givenEvents: Event | Event[],\n) => {\n when: (command: Command) => {\n then: (expectedEvents: Event | Event[]) => void;\n thenNothingHappened: () => void;\n thenThrows: <ErrorType extends Error = Error>(\n ...args: Parameters<ThenThrows<ErrorType>>\n ) => void;\n };\n};\nexport type AsyncDeciderSpecification<Command, Event> = (\n givenEvents: Event | Event[],\n) => {\n when: (command: Command) => {\n then: (expectedEvents: Event | Event[]) => Promise<void>;\n thenNothingHappened: () => Promise<void>;\n thenThrows: <ErrorType extends Error = Error>(\n ...args: Parameters<ThenThrows<ErrorType>>\n ) => Promise<void>;\n };\n};\n\nexport const DeciderSpecification = {\n for: deciderSpecificationFor,\n};\n\nfunction deciderSpecificationFor<Command, Event, State>(decider: {\n decide: (command: Command, state: State) => Event | Event[];\n evolve: (state: State, event: Event) => State;\n initialState: () => State;\n}): DeciderSpecification<Command, Event>;\nfunction deciderSpecificationFor<Command, Event, State>(decider: {\n decide: (command: Command, state: State) => Promise<Event | Event[]>;\n evolve: (state: State, event: Event) => State;\n initialState: () => State;\n}): AsyncDeciderSpecification<Command, Event>;\nfunction deciderSpecificationFor<Command, Event, State>(decider: {\n decide: (\n command: Command,\n state: State,\n ) => Event | Event[] | Promise<Event | Event[]>;\n evolve: (state: State, event: Event) => State;\n initialState: () => State;\n}):\n | DeciderSpecification<Command, Event>\n | AsyncDeciderSpecification<Command, Event> {\n {\n return (givenEvents: Event | Event[]) => {\n return {\n when: (command: Command) => {\n const handle = () => {\n const existingEvents = Array.isArray(givenEvents)\n ? givenEvents\n : [givenEvents];\n\n const currentState = existingEvents.reduce<State>(\n decider.evolve,\n decider.initialState(),\n );\n\n return decider.decide(command, currentState);\n };\n\n return {\n then: (expectedEvents: Event | Event[]): void | Promise<void> => {\n const resultEvents = handle();\n\n if (resultEvents instanceof Promise) {\n return resultEvents.then((events) => {\n thenHandler(events, expectedEvents);\n });\n }\n\n thenHandler(resultEvents, expectedEvents);\n },\n thenNothingHappened: (): void | Promise<void> => {\n const resultEvents = handle();\n\n if (resultEvents instanceof Promise) {\n return resultEvents.then((events) => {\n thenNothingHappensHandler(events);\n });\n }\n\n thenNothingHappensHandler(resultEvents);\n },\n thenThrows: <ErrorType extends Error>(\n ...args: Parameters<ThenThrows<ErrorType>>\n ): void | Promise<void> => {\n try {\n const result = handle();\n if (result instanceof Promise) {\n return result\n .then(() => {\n throw new AssertionError(\n 'Handler did not fail as expected',\n );\n })\n .catch((error) => {\n thenThrowsErrorHandler(error, args);\n });\n }\n throw new AssertionError('Handler did not fail as expected');\n } catch (error) {\n thenThrowsErrorHandler(error, args);\n }\n },\n };\n },\n };\n };\n }\n}\n\nfunction thenHandler<Event>(\n events: Event | Event[],\n expectedEvents: Event | Event[],\n): void {\n const resultEventsArray = Array.isArray(events) ? events : [events];\n\n const expectedEventsArray = Array.isArray(expectedEvents)\n ? expectedEvents\n : [expectedEvents];\n\n assertThatArray(resultEventsArray).containsOnlyElementsMatching(\n expectedEventsArray,\n );\n}\n\nfunction thenNothingHappensHandler<Event>(events: Event | Event[]): void {\n const resultEventsArray = Array.isArray(events) ? events : [events];\n assertThatArray(resultEventsArray).isEmpty();\n}\n\nfunction thenThrowsErrorHandler<ErrorType extends Error>(\n error: unknown,\n args: Parameters<ThenThrows<ErrorType>>,\n): void {\n if (error instanceof AssertionError) throw error;\n\n if (args.length === 0) return;\n\n if (!isErrorConstructor(args[0])) {\n assertTrue(\n args[0](error as ErrorType),\n `Error didn't match the error condition: ${error?.toString()}`,\n );\n return;\n }\n\n assertTrue(\n error instanceof args[0],\n `Caught error is not an instance of the expected type: ${error?.toString()}`,\n );\n\n if (args[1]) {\n assertTrue(\n args[1](error as ErrorType),\n `Error didn't match the error condition: ${error?.toString()}`,\n );\n }\n}\n","import type {\n AggregateStreamOptions,\n AggregateStreamResult,\n AppendToStreamOptions,\n AppendToStreamResult,\n EventStore,\n EventStoreReadEventMetadata,\n ReadStreamOptions,\n ReadStreamResult,\n StreamPositionTypeOfEventStore,\n} from '../eventStore';\nimport { type Event, type EventMetaDataOf } from '../typing';\n\nexport type TestEventStream<EventType extends Event = Event> = [\n string,\n EventType[],\n];\n\nexport type EventStoreWrapper<Store extends EventStore> = Store & {\n appendedEvents: Map<string, TestEventStream>;\n setup<EventType extends Event>(\n streamName: string,\n events: EventType[],\n ): Promise<AppendToStreamResult<StreamPositionTypeOfEventStore<Store>>>;\n};\n\nexport const WrapEventStore = <Store extends EventStore>(\n eventStore: Store,\n): EventStoreWrapper<Store> => {\n const appendedEvents = new Map<string, TestEventStream>();\n\n const wrapped = {\n ...eventStore,\n aggregateStream<State, EventType extends Event>(\n streamName: string,\n options: AggregateStreamOptions<State, EventType>,\n ): Promise<\n AggregateStreamResult<State, StreamPositionTypeOfEventStore<Store>>\n > {\n return eventStore.aggregateStream(streamName, options);\n },\n\n async readStream<EventType extends Event>(\n streamName: string,\n options?: ReadStreamOptions<StreamPositionTypeOfEventStore<Store>>,\n ): Promise<\n ReadStreamResult<\n EventType,\n EventStoreReadEventMetadata<Store> & EventMetaDataOf<EventType>\n >\n > {\n return (await eventStore.readStream(\n streamName,\n options,\n )) as ReadStreamResult<\n EventType,\n EventStoreReadEventMetadata<Store> & EventMetaDataOf<EventType>\n >;\n },\n\n appendToStream: async <EventType extends Event>(\n streamName: string,\n events: EventType[],\n options?: AppendToStreamOptions<StreamPositionTypeOfEventStore<Store>>,\n ): Promise<AppendToStreamResult<StreamPositionTypeOfEventStore<Store>>> => {\n const result = await eventStore.appendToStream(\n streamName,\n events,\n options,\n );\n\n const currentStream = appendedEvents.get(streamName) ?? [streamName, []];\n\n appendedEvents.set(streamName, [\n streamName,\n [...currentStream[1], ...events],\n ]);\n\n return result;\n },\n\n appendedEvents,\n\n setup: async <EventType extends Event>(\n streamName: string,\n events: EventType[],\n ): Promise<AppendToStreamResult<StreamPositionTypeOfEventStore<Store>>> => {\n return eventStore.appendToStream(streamName, events);\n },\n\n // streamEvents: (): ReadableStream<\n // // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\n // ReadEvent<Event, ReadEventMetadataType> | GlobalSubscriptionEvent\n // > => {\n // return eventStore.streamEvents();\n // },\n };\n\n return wrapped as EventStoreWrapper<Store>;\n};\n"],"mappings":"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","names":["error","event","error","uuid","event","uuid","TransformStream","error","uuid","projection","event","uuid","map","result","sum","error","item","error","id","result","command","command","event","projections","inlineProjections","projection","TransformStream","filter","TransformStream","map","TransformStream","TransformStream","handleChunk","TransformStream","error","TransformStream","skip","TransformStream","TransformStream","TransformStream","TransformStream","retry","error","error","command","error"]}