@zudojs/events 0.0.1
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/LICENSE +21 -0
- package/README.md +42 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/eventBus/eventBus.core.d.ts +55 -0
- package/dist/eventBus/eventBus.core.d.ts.map +1 -0
- package/dist/eventBus/eventBus.core.js +175 -0
- package/dist/eventBus/eventBus.core.js.map +1 -0
- package/dist/eventBus/eventBus.factory.d.ts +14 -0
- package/dist/eventBus/eventBus.factory.d.ts.map +1 -0
- package/dist/eventBus/eventBus.factory.js +17 -0
- package/dist/eventBus/eventBus.factory.js.map +1 -0
- package/dist/eventBus/eventBus.publish.d.ts +17 -0
- package/dist/eventBus/eventBus.publish.d.ts.map +1 -0
- package/dist/eventBus/eventBus.publish.js +78 -0
- package/dist/eventBus/eventBus.publish.js.map +1 -0
- package/dist/eventBus/eventBus.registration.d.ts +47 -0
- package/dist/eventBus/eventBus.registration.d.ts.map +1 -0
- package/dist/eventBus/eventBus.registration.js +84 -0
- package/dist/eventBus/eventBus.registration.js.map +1 -0
- package/dist/eventBus/eventBus.type.d.ts +50 -0
- package/dist/eventBus/eventBus.type.d.ts.map +1 -0
- package/dist/eventBus/eventBus.type.js +10 -0
- package/dist/eventBus/eventBus.type.js.map +1 -0
- package/dist/eventBus/index.d.ts +9 -0
- package/dist/eventBus/index.d.ts.map +1 -0
- package/dist/eventBus/index.js +9 -0
- package/dist/eventBus/index.js.map +1 -0
- package/dist/eventEmitter/eventEmitter.abort.d.ts +8 -0
- package/dist/eventEmitter/eventEmitter.abort.d.ts.map +1 -0
- package/dist/eventEmitter/eventEmitter.abort.js +12 -0
- package/dist/eventEmitter/eventEmitter.abort.js.map +1 -0
- package/dist/eventEmitter/eventEmitter.core.d.ts +38 -0
- package/dist/eventEmitter/eventEmitter.core.d.ts.map +1 -0
- package/dist/eventEmitter/eventEmitter.core.js +151 -0
- package/dist/eventEmitter/eventEmitter.core.js.map +1 -0
- package/dist/eventEmitter/eventEmitter.parallel.d.ts +12 -0
- package/dist/eventEmitter/eventEmitter.parallel.d.ts.map +1 -0
- package/dist/eventEmitter/eventEmitter.parallel.js +50 -0
- package/dist/eventEmitter/eventEmitter.parallel.js.map +1 -0
- package/dist/eventEmitter/eventEmitter.sequential.d.ts +12 -0
- package/dist/eventEmitter/eventEmitter.sequential.d.ts.map +1 -0
- package/dist/eventEmitter/eventEmitter.sequential.js +44 -0
- package/dist/eventEmitter/eventEmitter.sequential.js.map +1 -0
- package/dist/eventEmitter/eventEmitter.type.d.ts +43 -0
- package/dist/eventEmitter/eventEmitter.type.d.ts.map +1 -0
- package/dist/eventEmitter/eventEmitter.type.js +14 -0
- package/dist/eventEmitter/eventEmitter.type.js.map +1 -0
- package/dist/eventEmitter/index.d.ts +11 -0
- package/dist/eventEmitter/index.d.ts.map +1 -0
- package/dist/eventEmitter/index.js +11 -0
- package/dist/eventEmitter/index.js.map +1 -0
- package/dist/eventErrors/eventError.base.d.ts +8 -0
- package/dist/eventErrors/eventError.base.d.ts.map +1 -0
- package/dist/eventErrors/eventError.base.js +8 -0
- package/dist/eventErrors/eventError.base.js.map +1 -0
- package/dist/eventErrors/index.d.ts +7 -0
- package/dist/eventErrors/index.d.ts.map +1 -0
- package/dist/eventErrors/index.js +7 -0
- package/dist/eventErrors/index.js.map +1 -0
- package/dist/eventHandler/eventHandler.core.d.ts +204 -0
- package/dist/eventHandler/eventHandler.core.d.ts.map +1 -0
- package/dist/eventHandler/eventHandler.core.js +182 -0
- package/dist/eventHandler/eventHandler.core.js.map +1 -0
- package/dist/eventHandler/index.d.ts +7 -0
- package/dist/eventHandler/index.d.ts.map +1 -0
- package/dist/eventHandler/index.js +7 -0
- package/dist/eventHandler/index.js.map +1 -0
- package/dist/eventMiddleware/eventMiddleware.builder.d.ts +47 -0
- package/dist/eventMiddleware/eventMiddleware.builder.d.ts.map +1 -0
- package/dist/eventMiddleware/eventMiddleware.builder.js +109 -0
- package/dist/eventMiddleware/eventMiddleware.builder.js.map +1 -0
- package/dist/eventMiddleware/eventMiddleware.helper.d.ts +38 -0
- package/dist/eventMiddleware/eventMiddleware.helper.d.ts.map +1 -0
- package/dist/eventMiddleware/eventMiddleware.helper.js +86 -0
- package/dist/eventMiddleware/eventMiddleware.helper.js.map +1 -0
- package/dist/eventMiddleware/eventMiddleware.pipeline.d.ts +18 -0
- package/dist/eventMiddleware/eventMiddleware.pipeline.d.ts.map +1 -0
- package/dist/eventMiddleware/eventMiddleware.pipeline.js +93 -0
- package/dist/eventMiddleware/eventMiddleware.pipeline.js.map +1 -0
- package/dist/eventMiddleware/eventMiddleware.type.d.ts +49 -0
- package/dist/eventMiddleware/eventMiddleware.type.d.ts.map +1 -0
- package/dist/eventMiddleware/eventMiddleware.type.js +5 -0
- package/dist/eventMiddleware/eventMiddleware.type.js.map +1 -0
- package/dist/eventMiddleware/index.d.ts +10 -0
- package/dist/eventMiddleware/index.d.ts.map +1 -0
- package/dist/eventMiddleware/index.js +10 -0
- package/dist/eventMiddleware/index.js.map +1 -0
- package/dist/eventRegistry/eventRegistry.lifecycle.d.ts +19 -0
- package/dist/eventRegistry/eventRegistry.lifecycle.d.ts.map +1 -0
- package/dist/eventRegistry/eventRegistry.lifecycle.js +45 -0
- package/dist/eventRegistry/eventRegistry.lifecycle.js.map +1 -0
- package/dist/eventRegistry/eventRegistry.queries.d.ts +23 -0
- package/dist/eventRegistry/eventRegistry.queries.d.ts.map +1 -0
- package/dist/eventRegistry/eventRegistry.queries.js +35 -0
- package/dist/eventRegistry/eventRegistry.queries.js.map +1 -0
- package/dist/eventRegistry/eventRegistry.registration.d.ts +29 -0
- package/dist/eventRegistry/eventRegistry.registration.d.ts.map +1 -0
- package/dist/eventRegistry/eventRegistry.registration.js +104 -0
- package/dist/eventRegistry/eventRegistry.registration.js.map +1 -0
- package/dist/eventRegistry/eventRegistry.store.d.ts +52 -0
- package/dist/eventRegistry/eventRegistry.store.d.ts.map +1 -0
- package/dist/eventRegistry/eventRegistry.store.js +124 -0
- package/dist/eventRegistry/eventRegistry.store.js.map +1 -0
- package/dist/eventRegistry/eventRegistry.type.d.ts +28 -0
- package/dist/eventRegistry/eventRegistry.type.d.ts.map +1 -0
- package/dist/eventRegistry/eventRegistry.type.js +11 -0
- package/dist/eventRegistry/eventRegistry.type.js.map +1 -0
- package/dist/eventRegistry/index.d.ts +11 -0
- package/dist/eventRegistry/index.d.ts.map +1 -0
- package/dist/eventRegistry/index.js +11 -0
- package/dist/eventRegistry/index.js.map +1 -0
- package/dist/eventSubscription/eventSubscription.core.d.ts +149 -0
- package/dist/eventSubscription/eventSubscription.core.d.ts.map +1 -0
- package/dist/eventSubscription/eventSubscription.core.js +174 -0
- package/dist/eventSubscription/eventSubscription.core.js.map +1 -0
- package/dist/eventSubscription/index.d.ts +7 -0
- package/dist/eventSubscription/index.d.ts.map +1 -0
- package/dist/eventSubscription/index.js +7 -0
- package/dist/eventSubscription/index.js.map +1 -0
- package/dist/eventTypes/eventDefinition.type.d.ts +180 -0
- package/dist/eventTypes/eventDefinition.type.d.ts.map +1 -0
- package/dist/eventTypes/eventDefinition.type.js +140 -0
- package/dist/eventTypes/eventDefinition.type.js.map +1 -0
- package/dist/eventTypes/eventPayload.type.d.ts +126 -0
- package/dist/eventTypes/eventPayload.type.d.ts.map +1 -0
- package/dist/eventTypes/eventPayload.type.js +167 -0
- package/dist/eventTypes/eventPayload.type.js.map +1 -0
- package/dist/eventTypes/eventType.type.d.ts +157 -0
- package/dist/eventTypes/eventType.type.d.ts.map +1 -0
- package/dist/eventTypes/eventType.type.js +244 -0
- package/dist/eventTypes/eventType.type.js.map +1 -0
- package/dist/eventTypes/index.d.ts +9 -0
- package/dist/eventTypes/index.d.ts.map +1 -0
- package/dist/eventTypes/index.js +9 -0
- package/dist/eventTypes/index.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event handler primitives for Zudojs.
|
|
3
|
+
*
|
|
4
|
+
* Handlers are responsible for processing events.
|
|
5
|
+
* They do not own event registration or event dispatching.
|
|
6
|
+
*/
|
|
7
|
+
import type { Event, EventType } from "../eventTypes/eventDefinition.type.js";
|
|
8
|
+
import type { EventTypePattern } from "../eventTypes/eventType.type.js";
|
|
9
|
+
/**
|
|
10
|
+
* Result returned by an event handler.
|
|
11
|
+
*/
|
|
12
|
+
export type EventHandlerResult = void | unknown;
|
|
13
|
+
/**
|
|
14
|
+
* Context supplied to an event handler.
|
|
15
|
+
*/
|
|
16
|
+
export interface EventHandlerContext<TEvent extends Event = Event> {
|
|
17
|
+
/**
|
|
18
|
+
* Event currently being handled.
|
|
19
|
+
*/
|
|
20
|
+
readonly event: TEvent;
|
|
21
|
+
/**
|
|
22
|
+
* Event type.
|
|
23
|
+
*/
|
|
24
|
+
readonly type: EventType;
|
|
25
|
+
/**
|
|
26
|
+
* Event identifier.
|
|
27
|
+
*/
|
|
28
|
+
readonly eventId: string;
|
|
29
|
+
/**
|
|
30
|
+
* Optional correlation identifier.
|
|
31
|
+
*/
|
|
32
|
+
readonly correlationId?: string;
|
|
33
|
+
/**
|
|
34
|
+
* Optional causation identifier.
|
|
35
|
+
*/
|
|
36
|
+
readonly causationId?: string;
|
|
37
|
+
/**
|
|
38
|
+
* Abort signal for the current dispatch.
|
|
39
|
+
*/
|
|
40
|
+
readonly signal: AbortSignal;
|
|
41
|
+
/**
|
|
42
|
+
* Metadata associated with the dispatch operation.
|
|
43
|
+
*/
|
|
44
|
+
readonly metadata: Readonly<Record<string, unknown>>;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Function-based event handler.
|
|
48
|
+
*/
|
|
49
|
+
export type EventHandler<TEvent extends Event = Event> = (event: TEvent, context: EventHandlerContext<TEvent>) => EventHandlerResult | Promise<EventHandlerResult>;
|
|
50
|
+
/**
|
|
51
|
+
* Event handler object contract.
|
|
52
|
+
*/
|
|
53
|
+
export interface EventHandlerObject<TEvent extends Event = Event> {
|
|
54
|
+
/**
|
|
55
|
+
* Handles an event.
|
|
56
|
+
*/
|
|
57
|
+
handle(event: TEvent, context: EventHandlerContext<TEvent>): EventHandlerResult | Promise<EventHandlerResult>;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Supported event handler representation.
|
|
61
|
+
*/
|
|
62
|
+
export type EventHandlerLike<TEvent extends Event = Event> = EventHandler<TEvent> | EventHandlerObject<TEvent>;
|
|
63
|
+
/**
|
|
64
|
+
* Options for an event handler.
|
|
65
|
+
*/
|
|
66
|
+
export interface EventHandlerOptions {
|
|
67
|
+
/**
|
|
68
|
+
* Optional handler identifier.
|
|
69
|
+
*/
|
|
70
|
+
readonly id?: string;
|
|
71
|
+
/**
|
|
72
|
+
* Optional description.
|
|
73
|
+
*/
|
|
74
|
+
readonly description?: string;
|
|
75
|
+
/**
|
|
76
|
+
* Event type or pattern handled by this handler.
|
|
77
|
+
*/
|
|
78
|
+
readonly eventType?: EventTypePattern;
|
|
79
|
+
/**
|
|
80
|
+
* Handler execution priority.
|
|
81
|
+
*
|
|
82
|
+
* Higher values execute first.
|
|
83
|
+
*
|
|
84
|
+
* Defaults to 0.
|
|
85
|
+
*/
|
|
86
|
+
readonly priority?: number;
|
|
87
|
+
/**
|
|
88
|
+
* Whether the handler is enabled.
|
|
89
|
+
*
|
|
90
|
+
* Defaults to true.
|
|
91
|
+
*/
|
|
92
|
+
readonly enabled?: boolean;
|
|
93
|
+
/**
|
|
94
|
+
* Whether the handler should only execute once.
|
|
95
|
+
*/
|
|
96
|
+
readonly once?: boolean;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Complete registered event handler.
|
|
100
|
+
*/
|
|
101
|
+
export interface RegisteredEventHandler<TEvent extends Event = Event> {
|
|
102
|
+
/**
|
|
103
|
+
* Unique handler identifier.
|
|
104
|
+
*/
|
|
105
|
+
readonly id: string;
|
|
106
|
+
/**
|
|
107
|
+
* Event type pattern handled by the handler.
|
|
108
|
+
*/
|
|
109
|
+
readonly eventType: EventTypePattern;
|
|
110
|
+
/**
|
|
111
|
+
* Handler priority.
|
|
112
|
+
*/
|
|
113
|
+
readonly priority: number;
|
|
114
|
+
/**
|
|
115
|
+
* Whether the handler is enabled.
|
|
116
|
+
*/
|
|
117
|
+
readonly enabled: boolean;
|
|
118
|
+
/**
|
|
119
|
+
* Whether the handler executes only once.
|
|
120
|
+
*/
|
|
121
|
+
readonly once: boolean;
|
|
122
|
+
/**
|
|
123
|
+
* Optional description.
|
|
124
|
+
*/
|
|
125
|
+
readonly description?: string;
|
|
126
|
+
/**
|
|
127
|
+
* Actual handler.
|
|
128
|
+
*/
|
|
129
|
+
readonly handler: EventHandlerLike<TEvent>;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Generates a handler identifier.
|
|
133
|
+
*/
|
|
134
|
+
export declare function createEventHandlerId(): string;
|
|
135
|
+
/**
|
|
136
|
+
* Creates an event handler context.
|
|
137
|
+
*/
|
|
138
|
+
export declare function createEventHandlerContext<TEvent extends Event>(event: TEvent, options?: Partial<Pick<EventHandlerContext<TEvent>, "signal" | "metadata">>): EventHandlerContext<TEvent>;
|
|
139
|
+
/**
|
|
140
|
+
* Creates a registered event handler.
|
|
141
|
+
*/
|
|
142
|
+
export declare function createEventHandler<TEvent extends Event = Event>(handler: EventHandlerLike<TEvent>, options?: EventHandlerOptions): RegisteredEventHandler<TEvent>;
|
|
143
|
+
/**
|
|
144
|
+
* Determines whether a value is a function event handler.
|
|
145
|
+
*/
|
|
146
|
+
export declare function isFunctionEventHandler(value: unknown): value is EventHandler;
|
|
147
|
+
/**
|
|
148
|
+
* Determines whether a value is an object event handler.
|
|
149
|
+
*/
|
|
150
|
+
export declare function isObjectEventHandler(value: unknown): value is EventHandlerObject;
|
|
151
|
+
/**
|
|
152
|
+
* Determines whether a value is a supported event handler.
|
|
153
|
+
*/
|
|
154
|
+
export declare function isEventHandler(value: unknown): value is EventHandlerLike;
|
|
155
|
+
/**
|
|
156
|
+
* Executes an event handler regardless of whether it is
|
|
157
|
+
* represented as a function or an object.
|
|
158
|
+
*/
|
|
159
|
+
export declare function executeEventHandler<TEvent extends Event>(handler: EventHandlerLike<TEvent>, event: TEvent, context: EventHandlerContext<TEvent>): Promise<EventHandlerResult>;
|
|
160
|
+
/**
|
|
161
|
+
* Determines whether a registered handler should process
|
|
162
|
+
* a given event.
|
|
163
|
+
*/
|
|
164
|
+
export declare function handlerMatchesEvent<TEvent extends Event>(handler: RegisteredEventHandler<TEvent>, event: TEvent): boolean;
|
|
165
|
+
/**
|
|
166
|
+
* Sorts handlers by execution priority.
|
|
167
|
+
*
|
|
168
|
+
* Higher priority handlers execute first.
|
|
169
|
+
* Registration order is preserved for equal priorities.
|
|
170
|
+
*/
|
|
171
|
+
export declare function sortEventHandlers<TEvent extends Event>(handlers: readonly RegisteredEventHandler<TEvent>[]): RegisteredEventHandler<TEvent>[];
|
|
172
|
+
/**
|
|
173
|
+
* Filters handlers that can process an event.
|
|
174
|
+
*/
|
|
175
|
+
export declare function getMatchingEventHandlers<TEvent extends Event>(handlers: readonly RegisteredEventHandler<TEvent>[], event: TEvent): RegisteredEventHandler<TEvent>[];
|
|
176
|
+
/**
|
|
177
|
+
* Creates a handler restricted to a specific event type.
|
|
178
|
+
*/
|
|
179
|
+
export declare function typedEventHandler<TEvent extends Event>(eventType: EventTypePattern, handler: EventHandlerLike<TEvent>, options?: Omit<EventHandlerOptions, "eventType">): RegisteredEventHandler<TEvent>;
|
|
180
|
+
/**
|
|
181
|
+
* Creates a handler that executes only once.
|
|
182
|
+
*/
|
|
183
|
+
export declare function onceEventHandler<TEvent extends Event>(eventType: EventTypePattern, handler: EventHandlerLike<TEvent>, options?: Omit<EventHandlerOptions, "eventType" | "once">): RegisteredEventHandler<TEvent>;
|
|
184
|
+
/**
|
|
185
|
+
* Creates an event handler with a specific priority.
|
|
186
|
+
*/
|
|
187
|
+
export declare function prioritizedEventHandler<TEvent extends Event>(eventType: EventTypePattern, priority: number, handler: EventHandlerLike<TEvent>, options?: Omit<EventHandlerOptions, "eventType" | "priority">): RegisteredEventHandler<TEvent>;
|
|
188
|
+
/**
|
|
189
|
+
* Enables a registered handler.
|
|
190
|
+
*/
|
|
191
|
+
export declare function enableEventHandler<TEvent extends Event>(handler: RegisteredEventHandler<TEvent>): RegisteredEventHandler<TEvent>;
|
|
192
|
+
/**
|
|
193
|
+
* Disables a registered handler.
|
|
194
|
+
*/
|
|
195
|
+
export declare function disableEventHandler<TEvent extends Event>(handler: RegisteredEventHandler<TEvent>): RegisteredEventHandler<TEvent>;
|
|
196
|
+
/**
|
|
197
|
+
* Changes the priority of a handler.
|
|
198
|
+
*/
|
|
199
|
+
export declare function setEventHandlerPriority<TEvent extends Event>(handler: RegisteredEventHandler<TEvent>, priority: number): RegisteredEventHandler<TEvent>;
|
|
200
|
+
/**
|
|
201
|
+
* Creates a handler that ignores its return value.
|
|
202
|
+
*/
|
|
203
|
+
export declare function fireAndForgetHandler<TEvent extends Event>(handler: EventHandlerLike<TEvent>): EventHandler<TEvent>;
|
|
204
|
+
//# sourceMappingURL=eventHandler.core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eventHandler.core.d.ts","sourceRoot":"","sources":["../../src/eventHandler/eventHandler.core.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event handler primitives for Zudojs.
|
|
3
|
+
*
|
|
4
|
+
* Handlers are responsible for processing events.
|
|
5
|
+
* They do not own event registration or event dispatching.
|
|
6
|
+
*/
|
|
7
|
+
import { matchesEventType } from "../eventTypes/eventType.type.js";
|
|
8
|
+
/**
|
|
9
|
+
* Generates a handler identifier.
|
|
10
|
+
*/
|
|
11
|
+
export function createEventHandlerId() {
|
|
12
|
+
if (typeof crypto !== "undefined" &&
|
|
13
|
+
typeof crypto.randomUUID === "function") {
|
|
14
|
+
return `handler:${crypto.randomUUID()}`;
|
|
15
|
+
}
|
|
16
|
+
return `handler:${Date.now().toString(36)}:${Math.random()
|
|
17
|
+
.toString(36)
|
|
18
|
+
.slice(2)}`;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Creates an event handler context.
|
|
22
|
+
*/
|
|
23
|
+
export function createEventHandlerContext(event, options = {}) {
|
|
24
|
+
return Object.freeze({
|
|
25
|
+
event,
|
|
26
|
+
type: event.type,
|
|
27
|
+
eventId: event.id,
|
|
28
|
+
correlationId: event.correlationId,
|
|
29
|
+
causationId: event.causationId,
|
|
30
|
+
signal: options.signal ?? new AbortController().signal,
|
|
31
|
+
metadata: Object.freeze({
|
|
32
|
+
...(options.metadata ?? {}),
|
|
33
|
+
}),
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Creates a registered event handler.
|
|
38
|
+
*/
|
|
39
|
+
export function createEventHandler(handler, options = {}) {
|
|
40
|
+
const eventType = options.eventType ?? "*";
|
|
41
|
+
if (!isValidHandler(handler)) {
|
|
42
|
+
throw new TypeError("Invalid event handler.");
|
|
43
|
+
}
|
|
44
|
+
return Object.freeze({
|
|
45
|
+
id: options.id ?? createEventHandlerId(),
|
|
46
|
+
eventType,
|
|
47
|
+
priority: options.priority ?? 0,
|
|
48
|
+
enabled: options.enabled ?? true,
|
|
49
|
+
once: options.once ?? false,
|
|
50
|
+
description: options.description,
|
|
51
|
+
handler,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Determines whether a value is a function event handler.
|
|
56
|
+
*/
|
|
57
|
+
export function isFunctionEventHandler(value) {
|
|
58
|
+
return typeof value === "function";
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Determines whether a value is an object event handler.
|
|
62
|
+
*/
|
|
63
|
+
export function isObjectEventHandler(value) {
|
|
64
|
+
return (typeof value === "object" &&
|
|
65
|
+
value !== null &&
|
|
66
|
+
typeof value.handle === "function");
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Determines whether a value is a supported event handler.
|
|
70
|
+
*/
|
|
71
|
+
export function isEventHandler(value) {
|
|
72
|
+
return isFunctionEventHandler(value) || isObjectEventHandler(value);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Internal handler validation.
|
|
76
|
+
*/
|
|
77
|
+
function isValidHandler(handler) {
|
|
78
|
+
return isEventHandler(handler);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Executes an event handler regardless of whether it is
|
|
82
|
+
* represented as a function or an object.
|
|
83
|
+
*/
|
|
84
|
+
export async function executeEventHandler(handler, event, context) {
|
|
85
|
+
if (isFunctionEventHandler(handler)) {
|
|
86
|
+
return handler(event, context);
|
|
87
|
+
}
|
|
88
|
+
return handler.handle(event, context);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Determines whether a registered handler should process
|
|
92
|
+
* a given event.
|
|
93
|
+
*/
|
|
94
|
+
export function handlerMatchesEvent(handler, event) {
|
|
95
|
+
if (!handler.enabled) {
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
return matchesEventType(event.type, handler.eventType);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Sorts handlers by execution priority.
|
|
102
|
+
*
|
|
103
|
+
* Higher priority handlers execute first.
|
|
104
|
+
* Registration order is preserved for equal priorities.
|
|
105
|
+
*/
|
|
106
|
+
export function sortEventHandlers(handlers) {
|
|
107
|
+
return [...handlers].sort((first, second) => second.priority - first.priority);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Filters handlers that can process an event.
|
|
111
|
+
*/
|
|
112
|
+
export function getMatchingEventHandlers(handlers, event) {
|
|
113
|
+
return sortEventHandlers(handlers.filter((handler) => handlerMatchesEvent(handler, event)));
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Creates a handler restricted to a specific event type.
|
|
117
|
+
*/
|
|
118
|
+
export function typedEventHandler(eventType, handler, options = {}) {
|
|
119
|
+
return createEventHandler(handler, {
|
|
120
|
+
...options,
|
|
121
|
+
eventType,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Creates a handler that executes only once.
|
|
126
|
+
*/
|
|
127
|
+
export function onceEventHandler(eventType, handler, options = {}) {
|
|
128
|
+
return createEventHandler(handler, {
|
|
129
|
+
...options,
|
|
130
|
+
eventType,
|
|
131
|
+
once: true,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Creates an event handler with a specific priority.
|
|
136
|
+
*/
|
|
137
|
+
export function prioritizedEventHandler(eventType, priority, handler, options = {}) {
|
|
138
|
+
return createEventHandler(handler, {
|
|
139
|
+
...options,
|
|
140
|
+
eventType,
|
|
141
|
+
priority,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Enables a registered handler.
|
|
146
|
+
*/
|
|
147
|
+
export function enableEventHandler(handler) {
|
|
148
|
+
return Object.freeze({
|
|
149
|
+
...handler,
|
|
150
|
+
enabled: true,
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Disables a registered handler.
|
|
155
|
+
*/
|
|
156
|
+
export function disableEventHandler(handler) {
|
|
157
|
+
return Object.freeze({
|
|
158
|
+
...handler,
|
|
159
|
+
enabled: false,
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Changes the priority of a handler.
|
|
164
|
+
*/
|
|
165
|
+
export function setEventHandlerPriority(handler, priority) {
|
|
166
|
+
if (!Number.isFinite(priority)) {
|
|
167
|
+
throw new RangeError("Event handler priority must be a finite number.");
|
|
168
|
+
}
|
|
169
|
+
return Object.freeze({
|
|
170
|
+
...handler,
|
|
171
|
+
priority,
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Creates a handler that ignores its return value.
|
|
176
|
+
*/
|
|
177
|
+
export function fireAndForgetHandler(handler) {
|
|
178
|
+
return async (event, context) => {
|
|
179
|
+
await executeEventHandler(handler, event, context);
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=eventHandler.core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eventHandler.core.js","sourceRoot":"","sources":["../../src/eventHandler/eventHandler.core.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/eventHandler/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,wBAAwB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/eventHandler/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event middleware builder functions for Zudojs.
|
|
3
|
+
*/
|
|
4
|
+
import type { Event } from "../eventTypes/eventDefinition.type.js";
|
|
5
|
+
import type { EventMiddlewareContext, EventMiddlewareNext, EventMiddlewareOptions, RegisteredEventMiddleware } from "./eventMiddleware.type.js";
|
|
6
|
+
/**
|
|
7
|
+
* Creates a middleware that executes before downstream
|
|
8
|
+
* middleware and handlers.
|
|
9
|
+
*/
|
|
10
|
+
export declare function beforeEvent(callback: (context: EventMiddlewareContext) => void | Promise<void>, options?: EventMiddlewareOptions): RegisteredEventMiddleware;
|
|
11
|
+
/**
|
|
12
|
+
* Creates a middleware that executes after downstream
|
|
13
|
+
* middleware and handlers.
|
|
14
|
+
*/
|
|
15
|
+
export declare function afterEvent(callback: (context: EventMiddlewareContext, result: unknown) => void | Promise<void>, options?: EventMiddlewareOptions): RegisteredEventMiddleware;
|
|
16
|
+
/**
|
|
17
|
+
* Creates a middleware that wraps the entire event operation.
|
|
18
|
+
*/
|
|
19
|
+
export declare function aroundEvent(callback: (context: EventMiddlewareContext, next: EventMiddlewareNext) => Promise<unknown>, options?: EventMiddlewareOptions): RegisteredEventMiddleware;
|
|
20
|
+
/**
|
|
21
|
+
* Creates middleware that validates an event before it
|
|
22
|
+
* reaches downstream handlers.
|
|
23
|
+
*/
|
|
24
|
+
export declare function validateEventMiddleware<TEvent extends Event>(validator: (event: TEvent) => boolean | Promise<boolean>, options?: EventMiddlewareOptions): RegisteredEventMiddleware<TEvent>;
|
|
25
|
+
/**
|
|
26
|
+
* Creates middleware that records event timing.
|
|
27
|
+
*/
|
|
28
|
+
export declare function timingEventMiddleware(callback: (duration: number, context: EventMiddlewareContext) => void | Promise<void>, options?: EventMiddlewareOptions): RegisteredEventMiddleware;
|
|
29
|
+
/**
|
|
30
|
+
* Creates middleware that stores a value in the
|
|
31
|
+
* middleware context state.
|
|
32
|
+
*/
|
|
33
|
+
export declare function stateEventMiddleware<T>(key: string, factory: (context: EventMiddlewareContext) => T | Promise<T>, options?: EventMiddlewareOptions): RegisteredEventMiddleware;
|
|
34
|
+
/**
|
|
35
|
+
* Enables middleware.
|
|
36
|
+
*/
|
|
37
|
+
export declare function enableEventMiddleware<TEvent extends Event, TResult>(middleware: RegisteredEventMiddleware<TEvent, TResult>): RegisteredEventMiddleware<TEvent, TResult>;
|
|
38
|
+
/**
|
|
39
|
+
* Disables middleware.
|
|
40
|
+
*/
|
|
41
|
+
export declare function disableEventMiddleware<TEvent extends Event, TResult>(middleware: RegisteredEventMiddleware<TEvent, TResult>): RegisteredEventMiddleware<TEvent, TResult>;
|
|
42
|
+
/**
|
|
43
|
+
* Creates a middleware that stops execution when the
|
|
44
|
+
* supplied AbortSignal is cancelled.
|
|
45
|
+
*/
|
|
46
|
+
export declare function abortableEventMiddleware(options?: EventMiddlewareOptions): RegisteredEventMiddleware;
|
|
47
|
+
//# sourceMappingURL=eventMiddleware.builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eventMiddleware.builder.d.ts","sourceRoot":"","sources":["../../src/eventMiddleware/eventMiddleware.builder.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uCAAuC,CAAC;AAInE,OAAO,KAAK,EACV,sBAAsB,EACtB,mBAAmB,EACnB,sBAAsB,EACtB,yBAAyB,EAC1B,MAAM,2BAA2B,CAAC;AAcnC;;;GAGG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,CAAC,OAAO,EAAE,sBAAsB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EACnE,OAAO,GAAE,sBAA2B,GACnC,yBAAyB,CAM3B;AAED;;;GAGG;AACH,wBAAgB,UAAU,CACxB,QAAQ,EAAE,CACR,OAAO,EAAE,sBAAsB,EAC/B,MAAM,EAAE,OAAO,KACZ,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EACzB,OAAO,GAAE,sBAA2B,GACnC,yBAAyB,CAQ3B;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,CACR,OAAO,EAAE,sBAAsB,EAC/B,IAAI,EAAE,mBAAmB,KACtB,OAAO,CAAC,OAAO,CAAC,EACrB,OAAO,GAAE,sBAA2B,GACnC,yBAAyB,CAE3B;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,SAAS,KAAK,EAC1D,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,EACxD,OAAO,GAAE,sBAA2B,GACnC,yBAAyB,CAAC,MAAM,CAAC,CAcnC;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,CACR,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,sBAAsB,KAC5B,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EACzB,OAAO,GAAE,sBAA2B,GACnC,yBAAyB,CAU3B;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EACpC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,CAAC,OAAO,EAAE,sBAAsB,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EAC5D,OAAO,GAAE,sBAA2B,GACnC,yBAAyB,CAI3B;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,SAAS,KAAK,EAAE,OAAO,EACjE,UAAU,EAAE,yBAAyB,CAAC,MAAM,EAAE,OAAO,CAAC,GACrD,yBAAyB,CAAC,MAAM,EAAE,OAAO,CAAC,CAM5C;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,SAAS,KAAK,EAAE,OAAO,EAClE,UAAU,EAAE,yBAAyB,CAAC,MAAM,EAAE,OAAO,CAAC,GACrD,yBAAyB,CAAC,MAAM,EAAE,OAAO,CAAC,CAM5C;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,GAAE,sBAA2B,GACnC,yBAAyB,CAM3B"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event middleware builder functions for Zudojs.
|
|
3
|
+
*/
|
|
4
|
+
import { EventMiddlewareError } from "../eventErrors/eventError.base.js";
|
|
5
|
+
import { createEventMiddleware } from "./eventMiddleware.helper.js";
|
|
6
|
+
/**
|
|
7
|
+
* Creates an AbortError without relying on a runtime-specific
|
|
8
|
+
* DOMException implementation.
|
|
9
|
+
*/
|
|
10
|
+
function createAbortError() {
|
|
11
|
+
return new EventMiddlewareError("Event middleware execution was aborted.", {
|
|
12
|
+
cause: new Error("AbortSignal was aborted."),
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Creates a middleware that executes before downstream
|
|
17
|
+
* middleware and handlers.
|
|
18
|
+
*/
|
|
19
|
+
export function beforeEvent(callback, options = {}) {
|
|
20
|
+
return createEventMiddleware(async (context, next) => {
|
|
21
|
+
await callback(context);
|
|
22
|
+
return next();
|
|
23
|
+
}, options);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Creates a middleware that executes after downstream
|
|
27
|
+
* middleware and handlers.
|
|
28
|
+
*/
|
|
29
|
+
export function afterEvent(callback, options = {}) {
|
|
30
|
+
return createEventMiddleware(async (context, next) => {
|
|
31
|
+
const result = await next();
|
|
32
|
+
await callback(context, result);
|
|
33
|
+
return result;
|
|
34
|
+
}, options);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Creates a middleware that wraps the entire event operation.
|
|
38
|
+
*/
|
|
39
|
+
export function aroundEvent(callback, options = {}) {
|
|
40
|
+
return createEventMiddleware(callback, options);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Creates middleware that validates an event before it
|
|
44
|
+
* reaches downstream handlers.
|
|
45
|
+
*/
|
|
46
|
+
export function validateEventMiddleware(validator, options = {}) {
|
|
47
|
+
return beforeEvent(async (context) => {
|
|
48
|
+
const valid = await validator(context.event);
|
|
49
|
+
if (!valid) {
|
|
50
|
+
throw new EventMiddlewareError(`Event "${context.event.type}" failed middleware validation.`, {
|
|
51
|
+
eventType: context.event?.type,
|
|
52
|
+
eventId: context.event?.id,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}, options);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Creates middleware that records event timing.
|
|
59
|
+
*/
|
|
60
|
+
export function timingEventMiddleware(callback, options = {}) {
|
|
61
|
+
return aroundEvent(async (context, next) => {
|
|
62
|
+
const started = performance.now();
|
|
63
|
+
try {
|
|
64
|
+
return await next();
|
|
65
|
+
}
|
|
66
|
+
finally {
|
|
67
|
+
await callback(performance.now() - started, context);
|
|
68
|
+
}
|
|
69
|
+
}, options);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Creates middleware that stores a value in the
|
|
73
|
+
* middleware context state.
|
|
74
|
+
*/
|
|
75
|
+
export function stateEventMiddleware(key, factory, options = {}) {
|
|
76
|
+
return beforeEvent(async (context) => {
|
|
77
|
+
context.state.set(key, await factory(context));
|
|
78
|
+
}, options);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Enables middleware.
|
|
82
|
+
*/
|
|
83
|
+
export function enableEventMiddleware(middleware) {
|
|
84
|
+
return Object.freeze({
|
|
85
|
+
...middleware,
|
|
86
|
+
enabled: true,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Disables middleware.
|
|
91
|
+
*/
|
|
92
|
+
export function disableEventMiddleware(middleware) {
|
|
93
|
+
return Object.freeze({
|
|
94
|
+
...middleware,
|
|
95
|
+
enabled: false,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Creates a middleware that stops execution when the
|
|
100
|
+
* supplied AbortSignal is cancelled.
|
|
101
|
+
*/
|
|
102
|
+
export function abortableEventMiddleware(options = {}) {
|
|
103
|
+
return beforeEvent(async (context) => {
|
|
104
|
+
if (context.signal.aborted) {
|
|
105
|
+
throw createAbortError();
|
|
106
|
+
}
|
|
107
|
+
}, options);
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=eventMiddleware.builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eventMiddleware.builder.js","sourceRoot":"","sources":["../../src/eventMiddleware/eventMiddleware.builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event middleware core helpers for Zudojs.
|
|
3
|
+
*/
|
|
4
|
+
import type { Event } from "../eventTypes/eventDefinition.type.js";
|
|
5
|
+
import type { EventMiddlewareContext, EventMiddlewareNext, EventMiddleware, EventMiddlewareObject, EventMiddlewareLike, EventMiddlewareOptions, RegisteredEventMiddleware, EventMiddlewarePipelineOptions } from "./eventMiddleware.type.js";
|
|
6
|
+
/**
|
|
7
|
+
* Generates a middleware identifier.
|
|
8
|
+
*/
|
|
9
|
+
export declare function createEventMiddlewareId(): string;
|
|
10
|
+
/**
|
|
11
|
+
* Determines whether a value is a function middleware.
|
|
12
|
+
*/
|
|
13
|
+
export declare function isFunctionEventMiddleware(value: unknown): value is EventMiddleware;
|
|
14
|
+
/**
|
|
15
|
+
* Determines whether a value is an object middleware.
|
|
16
|
+
*/
|
|
17
|
+
export declare function isObjectEventMiddleware(value: unknown): value is EventMiddlewareObject;
|
|
18
|
+
/**
|
|
19
|
+
* Determines whether a value is a supported middleware.
|
|
20
|
+
*/
|
|
21
|
+
export declare function isEventMiddleware(value: unknown): value is EventMiddlewareLike;
|
|
22
|
+
/**
|
|
23
|
+
* Creates a registered middleware definition.
|
|
24
|
+
*/
|
|
25
|
+
export declare function createEventMiddleware<TEvent extends Event = Event, TResult = unknown>(middleware: EventMiddlewareLike<TEvent, TResult>, options?: EventMiddlewareOptions): RegisteredEventMiddleware<TEvent, TResult>;
|
|
26
|
+
/**
|
|
27
|
+
* Executes a middleware implementation.
|
|
28
|
+
*/
|
|
29
|
+
export declare function executeEventMiddleware<TEvent extends Event, TResult>(middleware: EventMiddlewareLike<TEvent, TResult>, context: EventMiddlewareContext<TEvent>, next: EventMiddlewareNext<TResult>): Promise<TResult>;
|
|
30
|
+
/**
|
|
31
|
+
* Sorts middleware by descending priority.
|
|
32
|
+
*/
|
|
33
|
+
export declare function sortEventMiddleware<TEvent extends Event, TResult>(middleware: readonly RegisteredEventMiddleware<TEvent, TResult>[]): RegisteredEventMiddleware<TEvent, TResult>[];
|
|
34
|
+
/**
|
|
35
|
+
* Creates a middleware context.
|
|
36
|
+
*/
|
|
37
|
+
export declare function createEventMiddlewareContext<TEvent extends Event>(event: TEvent, options?: EventMiddlewarePipelineOptions): EventMiddlewareContext<TEvent>;
|
|
38
|
+
//# sourceMappingURL=eventMiddleware.helper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eventMiddleware.helper.d.ts","sourceRoot":"","sources":["../../src/eventMiddleware/eventMiddleware.helper.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uCAAuC,CAAC;AAInE,OAAO,KAAK,EACV,sBAAsB,EACtB,mBAAmB,EACnB,eAAe,EACf,qBAAqB,EACrB,mBAAmB,EACnB,sBAAsB,EACtB,yBAAyB,EACzB,8BAA8B,EAC/B,MAAM,2BAA2B,CAAC;AAEnC;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAWhD;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,eAAe,CAE1B;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,qBAAqB,CAUhC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,mBAAmB,CAE9B;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,SAAS,KAAK,GAAG,KAAK,EAC5B,OAAO,GAAG,OAAO,EAEjB,UAAU,EAAE,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,EAChD,OAAO,GAAE,sBAA2B,GACnC,yBAAyB,CAAC,MAAM,EAAE,OAAO,CAAC,CAsB5C;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,MAAM,SAAS,KAAK,EAAE,OAAO,EACxE,UAAU,EAAE,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,EAChD,OAAO,EAAE,sBAAsB,CAAC,MAAM,CAAC,EACvC,IAAI,EAAE,mBAAmB,CAAC,OAAO,CAAC,GACjC,OAAO,CAAC,OAAO,CAAC,CASlB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,SAAS,KAAK,EAAE,OAAO,EAC/D,UAAU,EAAE,SAAS,yBAAyB,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAChE,yBAAyB,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAI9C;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,SAAS,KAAK,EAC/D,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,8BAAmC,GAC3C,sBAAsB,CAAC,MAAM,CAAC,CAgBhC"}
|