@delta-base/core 0.0.2

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.
@@ -0,0 +1,412 @@
1
+ import * as hono_hono_base from 'hono/hono-base';
2
+ import * as hono_utils_http_status from 'hono/utils/http-status';
3
+ import * as hono_types from 'hono/types';
4
+ import * as hono from 'hono';
5
+ import { DurableObject } from 'cloudflare:workers';
6
+ import { OpenAPIHono } from '@hono/zod-openapi';
7
+
8
+ type Flavour<K, T> = K & {
9
+ readonly __brand?: T;
10
+ };
11
+ type DefaultRecord = Record<string, unknown>;
12
+ type Event<EventType extends string = string, EventData extends DefaultRecord = DefaultRecord, EventMetaData extends DefaultRecord = DefaultRecord> = Flavour<Readonly<{
13
+ type: EventType;
14
+ data: EventData;
15
+ metadata?: EventMetaData;
16
+ }>, 'Event'>;
17
+ type EventTypeOf<T extends Event> = T['type'];
18
+ type EventDataOf<T extends Event> = T['data'];
19
+ type EventMetaDataOf<T extends Event> = T['metadata'];
20
+ type CreateEventType<EventType extends string, EventData extends DefaultRecord, EventMetaData extends DefaultRecord | undefined> = Readonly<{
21
+ type: EventType;
22
+ data: EventData;
23
+ metadata?: EventMetaData;
24
+ }>;
25
+ type ReadEvent<EventType extends Event = Event, EventMetaDataType extends EventMetaDataOf<EventType> & ReadEventMetadata = EventMetaDataOf<EventType> & ReadEventMetadata> = CreateEventType<EventTypeOf<EventType>, EventDataOf<EventType>, EventMetaDataType> & EventType & {
26
+ metadata: EventMetaDataType;
27
+ };
28
+ type ReadEventMetadata = Readonly<{
29
+ eventId: string;
30
+ streamPosition: number;
31
+ streamName: string;
32
+ }>;
33
+ type ReadEventMetadataWithGlobalPosition = ReadEventMetadata & {
34
+ globalPosition: number;
35
+ };
36
+ type ExpectedStreamVersion<VersionType = DefaultStreamVersionType> = ExpectedStreamVersionWithValue<VersionType> | ExpectedStreamVersionGeneral;
37
+ type ExpectedStreamVersionWithValue<VersionType = DefaultStreamVersionType> = Flavour<VersionType, 'StreamVersion'>;
38
+ type ExpectedStreamVersionGeneral = Flavour<'STREAM_EXISTS' | 'STREAM_DOES_NOT_EXIST' | 'NO_CONCURRENCY_CHECK', 'StreamVersion'>;
39
+ interface EventStore<StreamVersion = DefaultStreamVersionType, ReadEventMetadataType extends ReadEventMetadata = ReadEventMetadata> {
40
+ aggregateStream<State, EventType extends Event>(streamName: string, options: AggregateStreamOptions<State, EventType, StreamVersion, ReadEventMetadataType>): Promise<AggregateStreamResult<State, StreamVersion> | null>;
41
+ readStream<EventType extends Event>(streamName: string, options?: ReadStreamOptions<StreamVersion>): Promise<ReadStreamResult<EventType, StreamVersion, ReadEventMetadataType>>;
42
+ appendToStream<EventType extends Event>(streamName: string, events: EventType[], options?: AppendToStreamOptions<StreamVersion>): Promise<AppendToStreamResult<StreamVersion>>;
43
+ }
44
+ type DefaultStreamVersionType = number;
45
+ type ReadStreamOptions<StreamVersion = DefaultStreamVersionType> = ({
46
+ from: StreamVersion;
47
+ } | {
48
+ to: StreamVersion;
49
+ } | {
50
+ from: StreamVersion;
51
+ maxCount?: DefaultStreamVersionType;
52
+ } | {
53
+ expectedStreamVersion: ExpectedStreamVersion<StreamVersion>;
54
+ }) & {
55
+ expectedStreamVersion?: ExpectedStreamVersion<StreamVersion>;
56
+ };
57
+ type ReadStreamResult<EventType extends Event, StreamVersion = DefaultStreamVersionType, ReadEventMetadataType extends ReadEventMetadata = ReadEventMetadata> = {
58
+ currentStreamVersion: StreamVersion;
59
+ events: ReadEvent<EventType, ReadEventMetadataType>[];
60
+ } | null;
61
+ type Evolve<State, EventType extends Event, ReadEventMetadataType extends ReadEventMetadata = ReadEventMetadata> = ((currentState: State, event: EventType) => State) | ((currentState: State, event: ReadEvent<EventType, ReadEventMetadataType>) => State) | ((currentState: State, event: ReadEvent<EventType>) => State);
62
+ type AggregateStreamOptions<State, EventType extends Event, StreamVersion = DefaultStreamVersionType, ReadEventMetadataType extends ReadEventMetadata = ReadEventMetadata> = {
63
+ evolve: Evolve<State, EventType, ReadEventMetadataType>;
64
+ initialState: () => State;
65
+ read?: ReadStreamOptions<StreamVersion>;
66
+ };
67
+ type AggregateStreamResult<State, StreamVersion = DefaultStreamVersionType> = {
68
+ currentStreamVersion: StreamVersion;
69
+ state: State;
70
+ };
71
+ type AppendToStreamOptions<StreamVersion = DefaultStreamVersionType> = {
72
+ expectedStreamVersion?: ExpectedStreamVersion<StreamVersion>;
73
+ };
74
+ type AppendToStreamResult<StreamVersion = DefaultStreamVersionType> = {
75
+ nextExpectedStreamVersion: StreamVersion;
76
+ };
77
+
78
+ type EventStoreOutboxEvent = {
79
+ stream_position: number;
80
+ global_position: number;
81
+ event_id: string;
82
+ event_type: string;
83
+ event_data: string;
84
+ event_metadata: string;
85
+ event_schema_version: string;
86
+ transaction_id: string;
87
+ stream_id: string;
88
+ phase: number;
89
+ created: string;
90
+ processing_started_at: string;
91
+ processed_at: string;
92
+ };
93
+ declare class EventStoreDurableObject extends DurableObject<Env> {
94
+ sql: SqlStorage;
95
+ constructor(ctx: DurableObjectState, env: Env);
96
+ private initializeTables;
97
+ initialize(eventStoreId: string): void;
98
+ getEventStoreId(): string;
99
+ appendToStream(streamId: string, events: Event[], options?: AppendToStreamOptions<number>): Promise<AppendToStreamResult<number>>;
100
+ private getStreamVersion;
101
+ private getGlobalPosition;
102
+ private scheduleAsyncWork;
103
+ private storeEventsToStream;
104
+ alarm(_alarmInfo: AlarmInvocationInfo): Promise<void>;
105
+ queryEvents(options: {
106
+ afterPosition?: number;
107
+ limit?: number;
108
+ streamId?: string;
109
+ eventType?: string;
110
+ }): Promise<{
111
+ events: EventStoreOutboxEvent[];
112
+ hasMore: boolean;
113
+ nextPosition: number;
114
+ }>;
115
+ getDatabaseSize(): number;
116
+ readStream<EventType extends Event>(streamId: string, options?: ReadStreamOptions & {
117
+ consistencyLevel?: 'eventual' | 'strong';
118
+ }): Promise<ReadStreamResult<EventType, DefaultStreamVersionType, ReadEventMetadataWithGlobalPosition> & {
119
+ consistency: 'eventual' | 'strong';
120
+ }>;
121
+ private waitForStreamVersion;
122
+ private mergeAndDeduplicateEvents;
123
+ }
124
+
125
+ type WildcardPattern = '*' | `${string}.*` | `*.${string}` | `${string}.*${string}`;
126
+ type EventType = string;
127
+ type EventFilter = EventType | EventType[] | WildcardPattern;
128
+ interface BaseSubscriberConfig {
129
+ retryPolicy?: {
130
+ maxAttempts: number;
131
+ backoffMinutes: number;
132
+ };
133
+ }
134
+ interface DurableObjectConfig extends BaseSubscriberConfig {
135
+ namespace: string;
136
+ id: string;
137
+ }
138
+ interface CloudflareWorkflowConfig extends BaseSubscriberConfig {
139
+ bindingName: string;
140
+ }
141
+ interface WebhookConfig extends BaseSubscriberConfig {
142
+ url: string;
143
+ headers?: Record<string, string>;
144
+ timeoutMs?: number;
145
+ }
146
+ interface QueueConfig extends BaseSubscriberConfig {
147
+ queueName: string;
148
+ region?: string;
149
+ batchSize?: number;
150
+ }
151
+ interface WebSocketConfig extends BaseSubscriberConfig {
152
+ managerId: string;
153
+ }
154
+ declare enum SubscriberType {
155
+ DurableObject = "durable_object",
156
+ Webhook = "webhook",
157
+ Queue = "queue",
158
+ CloudflareWorkflow = "cloudflare_workflow",
159
+ WebSocket = "websocket"
160
+ }
161
+ type SubscriberTypeConfig = {
162
+ type: SubscriberType.DurableObject;
163
+ config: DurableObjectConfig;
164
+ } | {
165
+ type: SubscriberType.Webhook;
166
+ config: WebhookConfig;
167
+ } | {
168
+ type: SubscriberType.Queue;
169
+ config: QueueConfig;
170
+ } | {
171
+ type: SubscriberType.CloudflareWorkflow;
172
+ config: CloudflareWorkflowConfig;
173
+ } | {
174
+ type: SubscriberType.WebSocket;
175
+ config: WebSocketConfig;
176
+ };
177
+ interface Env$1 {
178
+ [key: string]: DurableObjectNamespace | Workflow;
179
+ }
180
+ interface EventMessage {
181
+ event_id: string;
182
+ event_type: string;
183
+ event_data: Record<string, unknown>;
184
+ event_metadata: Record<string, unknown>;
185
+ stream_id: string;
186
+ stream_position: number;
187
+ global_position: number;
188
+ event_schema_version: string;
189
+ transaction_id: string;
190
+ created: string;
191
+ }
192
+ declare class EventBusDurableObject extends DurableObject<Env$1> {
193
+ private readonly BATCH_SIZE;
194
+ private readonly RETRY_DELAY_HOURS;
195
+ sql: SqlStorage;
196
+ constructor(state: DurableObjectState, env: Env$1);
197
+ private initializeTables;
198
+ subscribe(eventFilter: EventFilter, subscriberId: string, subscription: SubscriberTypeConfig): Promise<void>;
199
+ unsubscribe(eventFilter: EventFilter, subscriberId: string): Promise<void>;
200
+ getSubscriptions(): Promise<{
201
+ id: string;
202
+ eventFilter: string;
203
+ subscriberId: string;
204
+ subscriberType: SubscriberType;
205
+ subscriberConfig: string;
206
+ lastProcessedEventGlobalPosition: number;
207
+ createdAt: string;
208
+ }[]>;
209
+ publish(events: EventStoreOutboxEvent[]): Promise<void>;
210
+ private getMatchingSubscriptions;
211
+ private scheduleDelivery;
212
+ private processOutboxBatch;
213
+ private getPendingMessages;
214
+ private reconstructEvent;
215
+ private parseSubscription;
216
+ private markMessageAsProcessed;
217
+ private markMessageAsFailed;
218
+ private deliverEvent;
219
+ private logProcessingMetrics;
220
+ alarm(alarmInfo: AlarmInvocationInfo): Promise<void>;
221
+ getDatabaseSize(): number;
222
+ private validateEventFilter;
223
+ }
224
+
225
+ declare class WebSocketManagerDurableObject extends DurableObject<Env> {
226
+ fetch(request: Request): Promise<Response>;
227
+ private findWebSocketsByClientId;
228
+ deliverEventToClient(clientId: string, event: EventMessage): Promise<void>;
229
+ broadcastEvent(event: EventMessage): Promise<void>;
230
+ closeConnection(clientId: string): Promise<void>;
231
+ webSocketClose(ws: WebSocket, _code: number, reason: string, _wasClean: boolean): Promise<void>;
232
+ }
233
+
234
+ declare class EventStreamDurableObject extends DurableObject<Env> {
235
+ sql: SqlStorage;
236
+ private isProcessing;
237
+ private static ALARM_DELAY;
238
+ constructor(ctx: DurableObjectState, env: Env);
239
+ private initializeTables;
240
+ initializeStream(streamId: string, eventStoreId: string): void;
241
+ private getStreamId;
242
+ private getEventStoreId;
243
+ appendToStream(events: EventStoreOutboxEvent[]): Promise<void>;
244
+ getStreamEvents<EventType extends Event>(streamId: string, options?: ReadStreamOptions<number>): ReadStreamResult<EventType, number, ReadEventMetadataWithGlobalPosition>;
245
+ getEventsByEventIds(eventIds: string[]): Promise<ReadEvent[]>;
246
+ private checkUnprocessedEvents;
247
+ private scheduleAsyncWork;
248
+ private publishEventsToEventBus;
249
+ private storeEventsToGlobalIndex;
250
+ alarm(_alarmInfo: AlarmInvocationInfo): Promise<void>;
251
+ }
252
+
253
+ declare class EventGlobalIndexDurableObject extends DurableObject<Env> {
254
+ sql: SqlStorage;
255
+ constructor(ctx: DurableObjectState, env: Env);
256
+ private initializeTables;
257
+ appendToIndex(events: EventStoreOutboxEvent[]): Promise<void>;
258
+ getEventsByType(eventType: string, options?: {
259
+ fromPosition?: number;
260
+ limit?: number;
261
+ streamId?: string;
262
+ }): Promise<Record<string, SqlStorageValue>[]>;
263
+ getEventsPaginated(options: {
264
+ afterPosition?: number;
265
+ limit?: number;
266
+ streamId?: string;
267
+ eventType?: string;
268
+ }): Promise<{
269
+ events: Record<string, SqlStorageValue>[];
270
+ hasMore: boolean;
271
+ nextPosition: SqlStorageValue | undefined;
272
+ }>;
273
+ getEventsByTransactionId(transactionId: string): Promise<Record<string, SqlStorageValue>[]>;
274
+ getEventCounts(): Promise<Record<string, SqlStorageValue>[]>;
275
+ getEventTypeDistribution(streamId?: string): Promise<Record<string, SqlStorageValue>[]>;
276
+ getEventsInTimeAndPositionRange(options: {
277
+ startTime?: Date;
278
+ endTime?: Date;
279
+ minPosition?: number;
280
+ maxPosition?: number;
281
+ streamId?: string;
282
+ limit?: number;
283
+ }): Promise<Record<string, SqlStorageValue>[]>;
284
+ getEventStatistics(windowStart: Date, windowEnd: Date): Promise<Record<string, SqlStorageValue>>;
285
+ getEventsAfterPosition(position: number, limit?: number): Promise<Record<string, SqlStorageValue>[]>;
286
+ getStreamEvents(streamId: string, options?: {
287
+ fromPosition?: number;
288
+ toPosition?: number;
289
+ limit?: number;
290
+ }): Promise<Record<string, SqlStorageValue>[]>;
291
+ getEventsByTimeRange(startTime: Date, endTime: Date, limit?: number): Promise<Record<string, SqlStorageValue>[]>;
292
+ getLatestEvents(limit?: number): Promise<Record<string, SqlStorageValue>[]>;
293
+ getStreamPositionRange(streamId: string): Promise<Record<string, SqlStorageValue>>;
294
+ getDatabaseSize(): number;
295
+ }
296
+
297
+ declare class EventStoreManagerDurableObject extends DurableObject<Env> {
298
+ sql: SqlStorage;
299
+ constructor(ctx: DurableObjectState, env: Env);
300
+ private initializeTables;
301
+ createEventStore(eventStoreName: string): Promise<{
302
+ eventStoreID: string;
303
+ eventStoreName: string;
304
+ eventStoreDurableObjectID: string;
305
+ eventBusDurableObjectID: string;
306
+ eventGlobalIndexDurableObjectID: string;
307
+ }>;
308
+ getEventStoreInfo(eventStoreName: string): {
309
+ eventStoreID: string;
310
+ eventStoreName: string;
311
+ eventStoreDurableObjectID: string;
312
+ eventBusDurableObjectID: string;
313
+ eventGlobalIndexDurableObjectID: string;
314
+ };
315
+ getEventStoreDatabaseSizes(eventStoreName: string): Promise<{
316
+ eventStoreDatabaseSize: number;
317
+ eventBusDatabaseSize: number;
318
+ eventGlobalIndexDatabaseSize: number;
319
+ }>;
320
+ }
321
+
322
+ // Generated by Wrangler by running `wrangler types`
323
+
324
+ interface Env {
325
+ EVENT_STORE_MANAGER_DO: DurableObjectNamespace<
326
+ EventStoreManagerDurableObject
327
+ >;
328
+ EVENT_STORE_DO: DurableObjectNamespace<
329
+ EventStoreDurableObject
330
+ >;
331
+ EVENT_BUS_DO: DurableObjectNamespace<
332
+ EventBusDurableObject
333
+ >;
334
+ EVENT_GLOBAL_INDEX_DO: DurableObjectNamespace<
335
+ EventGlobalIndexDurableObject
336
+ >;
337
+ EVENT_STREAM_DO: DurableObjectNamespace<
338
+ EventStreamDurableObject
339
+ >;
340
+ WS_MANAGER_DO: DurableObjectNamespace<
341
+ WebSocketManagerDurableObject
342
+ >;
343
+ }
344
+
345
+ declare const getDOEventStoreManagement: (environmentName: string, env: Env) => {
346
+ createEventStore: (eventStoreName: string) => Promise<{
347
+ eventStoreID: string;
348
+ eventStoreName: string;
349
+ eventStoreDurableObjectID: string;
350
+ eventBusDurableObjectID: string;
351
+ eventGlobalIndexDurableObjectID: string;
352
+ } & Disposable>;
353
+ getEventStoreInfo: (eventStoreName: string) => Promise<{
354
+ eventStoreID: string;
355
+ eventStoreName: string;
356
+ eventStoreDurableObjectID: string;
357
+ eventBusDurableObjectID: string;
358
+ eventGlobalIndexDurableObjectID: string;
359
+ } & Disposable>;
360
+ getEventStoreDatabaseSizes: (eventStoreName: string) => Promise<{
361
+ eventStoreDatabaseSize: number;
362
+ eventBusDatabaseSize: number;
363
+ eventGlobalIndexDatabaseSize: number;
364
+ } & Disposable>;
365
+ };
366
+
367
+ declare const getDOEventStore: (eventStoreId: string, env: Env) => EventStore;
368
+
369
+ declare const getDOEventBus: (eventBusId: string, env: Env) => {
370
+ subscribe: (eventFilter: EventFilter, subscriberId: string, subscription: SubscriberTypeConfig) => Promise<void>;
371
+ unsubscribe: (eventFilter: EventFilter, subscriberId: string) => Promise<void>;
372
+ };
373
+
374
+ interface EventStoreWebSocketRouteConfig {
375
+ managerId: string;
376
+ path?: string;
377
+ }
378
+ declare function createEventStoreWebSocketRoute(config: EventStoreWebSocketRouteConfig): {
379
+ app: OpenAPIHono<{
380
+ Bindings: Env;
381
+ }, {}, "/">;
382
+ getManagerId: () => string;
383
+ };
384
+
385
+ declare const routes: hono_hono_base.HonoBase<hono.Env, hono_types.MergeSchemaPath<{}, "/api"> & {
386
+ docs: {
387
+ $get: {
388
+ input: {};
389
+ output: {};
390
+ outputFormat: "json";
391
+ status: hono_utils_http_status.StatusCode;
392
+ };
393
+ };
394
+ } & {
395
+ "/api/reference": {
396
+ $get: {
397
+ input: {};
398
+ output: {};
399
+ outputFormat: string;
400
+ status: hono_utils_http_status.StatusCode;
401
+ } | {
402
+ input: {};
403
+ output: {};
404
+ outputFormat: string;
405
+ status: hono_utils_http_status.StatusCode;
406
+ };
407
+ };
408
+ }, "/api">;
409
+
410
+ type AppType = typeof routes;
411
+
412
+ export { type AppType, type BaseSubscriberConfig, type CloudflareWorkflowConfig, type DurableObjectConfig, EventBusDurableObject, type EventFilter, EventGlobalIndexDurableObject, EventStoreDurableObject, type Env as EventStoreEnv, EventStoreManagerDurableObject, EventStreamDurableObject, type EventType, type QueueConfig, SubscriberType, WebSocketManagerDurableObject, type WebhookConfig, type WildcardPattern, createEventStoreWebSocketRoute, routes as default, getDOEventBus, getDOEventStore, getDOEventStoreManagement };