@holo-js/events 0.1.2 → 0.1.3
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.d.ts +24 -4
- package/dist/index.mjs +37 -16
- package/package.json +10 -3
package/dist/index.d.ts
CHANGED
|
@@ -46,6 +46,9 @@ interface ListenerDefinition<TInput extends EventReferenceInput = EventReference
|
|
|
46
46
|
readonly afterCommit?: boolean;
|
|
47
47
|
handle(event: ListenerHandledEvent<TInput>): TResult | Promise<TResult>;
|
|
48
48
|
}
|
|
49
|
+
type ListenerDefinitionInput<TInput extends EventReferenceInput = EventReferenceInput, TResult = unknown> = Omit<ListenerDefinition<TInput, TResult>, 'listensTo'> & {
|
|
50
|
+
readonly listensTo: TInput;
|
|
51
|
+
};
|
|
49
52
|
interface RegisteredListener<TInput extends EventReferenceInput = EventReferenceInput, TResult = unknown> {
|
|
50
53
|
readonly id: string;
|
|
51
54
|
readonly sourcePath?: string;
|
|
@@ -107,8 +110,8 @@ declare function normalizeEventDefinition<TEvent extends EventDefinition>(event:
|
|
|
107
110
|
declare function defineEvent<TPayload, TName extends string | undefined = string | undefined>(event: EventDefinition<TPayload, TName>): EventDefinition<TPayload, TName>;
|
|
108
111
|
declare function normalizeListensTo<TInput extends EventReferenceInput>(input: TInput): NormalizeEventReferenceInput<TInput>;
|
|
109
112
|
declare function isListenerDefinition(value: unknown): value is ListenerDefinition;
|
|
110
|
-
declare function normalizeListenerDefinition<TInput extends EventReferenceInput,
|
|
111
|
-
declare function defineListener<TInput extends EventReferenceInput,
|
|
113
|
+
declare function normalizeListenerDefinition<TInput extends EventReferenceInput, TResult>(listener: ListenerDefinitionInput<TInput, TResult>): ListenerDefinition<TInput, TResult>;
|
|
114
|
+
declare function defineListener<TInput extends EventReferenceInput, TResult>(listener: ListenerDefinitionInput<TInput, TResult>): ListenerDefinition<TInput, TResult>;
|
|
112
115
|
declare const eventInternals: {
|
|
113
116
|
hasEventDefinitionMarker: typeof hasEventDefinitionMarker;
|
|
114
117
|
hasListenerDefinitionMarker: typeof hasListenerDefinitionMarker;
|
|
@@ -138,7 +141,7 @@ declare function deriveListenerIdFromSourcePath(sourcePath: string): string;
|
|
|
138
141
|
declare function resolveRegisteredEventName(definition: EventDefinition, options?: RegisterEventOptions): string;
|
|
139
142
|
declare function resolveRegisteredListenerId(definition: ListenerDefinition, options?: RegisterListenerOptions): string;
|
|
140
143
|
declare function resolveListenerEventNames(definition: ListenerDefinition, state: EventRegistryState): readonly string[];
|
|
141
|
-
declare function registerEvent<TPayload, TName extends string = string>(definition: EventDefinition<TPayload, TName>, options?: RegisterEventOptions): RegisteredEvent<TPayload, TName
|
|
144
|
+
declare function registerEvent<TPayload, TName extends string | undefined = string | undefined>(definition: EventDefinition<TPayload, TName>, options?: RegisterEventOptions): RegisteredEvent<TPayload, Extract<TName, string> extends never ? string : Extract<TName, string>>;
|
|
142
145
|
declare function registerEvents(definitions: ReadonlyArray<{
|
|
143
146
|
readonly definition: EventDefinition;
|
|
144
147
|
readonly options?: RegisterEventOptions;
|
|
@@ -183,14 +186,31 @@ declare module '@holo-js/queue' {
|
|
|
183
186
|
'holo.events.invoke-listener': QueueJobDefinition<EventsInvokeListenerPayload, void>;
|
|
184
187
|
}
|
|
185
188
|
}
|
|
189
|
+
type QueueModule = {
|
|
190
|
+
defineJob(definition: QueueJobDefinition<EventsInvokeListenerPayload, void>): QueueJobDefinition<EventsInvokeListenerPayload, void>;
|
|
191
|
+
dispatch(jobName: string, payload: EventsInvokeListenerPayload): QueuePendingDispatchChain;
|
|
192
|
+
getRegisteredQueueJob(name: string): unknown;
|
|
193
|
+
registerQueueJob(definition: QueueJobDefinition<EventsInvokeListenerPayload, void>, options: {
|
|
194
|
+
name: string;
|
|
195
|
+
}): void;
|
|
196
|
+
};
|
|
197
|
+
type QueuePendingDispatchChain = {
|
|
198
|
+
onConnection(name: string): QueuePendingDispatchChain;
|
|
199
|
+
onQueue(name: string): QueuePendingDispatchChain;
|
|
200
|
+
delay(value: number | Date): QueuePendingDispatchChain;
|
|
201
|
+
dispatch(): Promise<unknown>;
|
|
202
|
+
};
|
|
203
|
+
declare function loadQueueModule(): Promise<QueueModule>;
|
|
186
204
|
declare function createQueuedListenerEventEnvelope(payload: EventsInvokeListenerPayload): EventEnvelope<string, QueueJsonValue>;
|
|
187
205
|
declare function requireQueuedListener(listenerId: string): RegisteredListener;
|
|
188
206
|
declare function assertQueuedListenerMatchesEvent(listener: RegisteredListener, eventName: string): void;
|
|
189
207
|
declare function runQueuedListenerInvocation(payload: EventsInvokeListenerPayload): Promise<void>;
|
|
190
208
|
declare function ensureEventsQueueJobRegistered(): void;
|
|
209
|
+
declare function ensureEventsQueueJobRegisteredAsync(): Promise<void>;
|
|
191
210
|
declare const eventQueueInternals: {
|
|
192
211
|
assertQueuedListenerMatchesEvent: typeof assertQueuedListenerMatchesEvent;
|
|
193
212
|
createQueuedListenerEventEnvelope: typeof createQueuedListenerEventEnvelope;
|
|
213
|
+
loadQueueModule: typeof loadQueueModule;
|
|
194
214
|
requireQueuedListener: typeof requireQueuedListener;
|
|
195
215
|
};
|
|
196
216
|
|
|
@@ -264,4 +284,4 @@ declare const eventRuntimeInternals: {
|
|
|
264
284
|
validateQueuedEventPayload: typeof validateQueuedEventPayload;
|
|
265
285
|
};
|
|
266
286
|
|
|
267
|
-
export { EVENTS_INVOKE_LISTENER_JOB, Event, type EventDeferredDispatchContext, type EventDefinition, type EventDelayValue, type EventDispatchResult, type EventEnvelope, type EventEnvelopeFor, type EventFacade, type EventPayloadFor, type EventPendingDispatch, type EventQueuedListenerDispatch, type EventReference, type EventReferenceInput, type EventRuntimeBinding, type EventRuntimeHooks, type EventsInvokeListenerPayload, type ExportedEventDefinition, type HoloEventRegistry, type HoloListenerRegistry, type ListenerDefinition, type ListenerHandledEvent, type RegisterEventOptions, type RegisterListenerOptions, type RegisteredEvent, type RegisteredListener, configureEventsRuntime, deferEventDispatchToDatabaseCommit, defineEvent, defineListener, dispatchEvent, ensureEventsQueueJobRegistered, eventInternals, eventQueueInternals, eventRegistryInternals, eventRuntimeInternals, getEventsRuntime, getRegisteredEvent, getRegisteredListener, isEventDefinition, isListenerDefinition, listRegisteredEvents, listRegisteredListeners, listRegisteredListenersForEvent, normalizeEventDefinition, normalizeListenerDefinition, registerEvent, registerEvents, registerListener, registerListeners, resetEventRegistry, resetEventsRegistry, resetEventsRuntime, resetListenerRegistry, runQueuedListenerInvocation, unregisterEvent, unregisterListener };
|
|
287
|
+
export { EVENTS_INVOKE_LISTENER_JOB, Event, type EventDeferredDispatchContext, type EventDefinition, type EventDelayValue, type EventDispatchResult, type EventEnvelope, type EventEnvelopeFor, type EventFacade, type EventPayloadFor, type EventPendingDispatch, type EventQueuedListenerDispatch, type EventReference, type EventReferenceInput, type EventRuntimeBinding, type EventRuntimeHooks, type EventsInvokeListenerPayload, type ExportedEventDefinition, type HoloEventRegistry, type HoloListenerRegistry, type ListenerDefinition, type ListenerDefinitionInput, type ListenerHandledEvent, type RegisterEventOptions, type RegisterListenerOptions, type RegisteredEvent, type RegisteredListener, configureEventsRuntime, deferEventDispatchToDatabaseCommit, defineEvent, defineListener, dispatchEvent, ensureEventsQueueJobRegistered, ensureEventsQueueJobRegisteredAsync, eventInternals, eventQueueInternals, eventRegistryInternals, eventRuntimeInternals, getEventsRuntime, getRegisteredEvent, getRegisteredListener, isEventDefinition, isListenerDefinition, listRegisteredEvents, listRegisteredListeners, listRegisteredListenersForEvent, normalizeEventDefinition, normalizeListenerDefinition, registerEvent, registerEvents, registerListener, registerListeners, resetEventRegistry, resetEventsRegistry, resetEventsRuntime, resetListenerRegistry, runQueuedListenerInvocation, unregisterEvent, unregisterListener };
|
package/dist/index.mjs
CHANGED
|
@@ -376,13 +376,25 @@ function deferEventDispatchToDatabaseCommit(callback, _context) {
|
|
|
376
376
|
}
|
|
377
377
|
|
|
378
378
|
// src/queue.ts
|
|
379
|
-
import {
|
|
380
|
-
defineJob,
|
|
381
|
-
dispatch as dispatchQueueJob,
|
|
382
|
-
getRegisteredQueueJob,
|
|
383
|
-
registerQueueJob
|
|
384
|
-
} from "@holo-js/queue";
|
|
385
379
|
var EVENTS_INVOKE_LISTENER_JOB = "holo.events.invoke-listener";
|
|
380
|
+
function getQueueRegistryState() {
|
|
381
|
+
const runtime = globalThis;
|
|
382
|
+
runtime.__holoQueueRegistry__ ??= {
|
|
383
|
+
jobs: /* @__PURE__ */ new Map()
|
|
384
|
+
};
|
|
385
|
+
return runtime.__holoQueueRegistry__;
|
|
386
|
+
}
|
|
387
|
+
async function loadQueueModule() {
|
|
388
|
+
try {
|
|
389
|
+
const specifier = "@holo-js/queue";
|
|
390
|
+
return await import(specifier);
|
|
391
|
+
} catch (error) {
|
|
392
|
+
if (error && typeof error === "object" && "code" in error && error.code === "ERR_MODULE_NOT_FOUND") {
|
|
393
|
+
throw new Error("[@holo-js/events] Queued listeners require @holo-js/queue to be installed.");
|
|
394
|
+
}
|
|
395
|
+
throw error;
|
|
396
|
+
}
|
|
397
|
+
}
|
|
386
398
|
function createQueuedListenerEventEnvelope(payload) {
|
|
387
399
|
return Object.freeze({
|
|
388
400
|
name: payload.eventName,
|
|
@@ -410,20 +422,27 @@ async function runQueuedListenerInvocation(payload) {
|
|
|
410
422
|
await listener.definition.handle(createQueuedListenerEventEnvelope(payload));
|
|
411
423
|
}
|
|
412
424
|
function ensureEventsQueueJobRegistered() {
|
|
413
|
-
|
|
425
|
+
const registry = getQueueRegistryState().jobs;
|
|
426
|
+
if (registry.has(EVENTS_INVOKE_LISTENER_JOB)) {
|
|
414
427
|
return;
|
|
415
428
|
}
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
429
|
+
registry.set(EVENTS_INVOKE_LISTENER_JOB, Object.freeze({
|
|
430
|
+
name: EVENTS_INVOKE_LISTENER_JOB,
|
|
431
|
+
definition: Object.freeze({
|
|
432
|
+
async handle(payload) {
|
|
433
|
+
await runQueuedListenerInvocation(payload);
|
|
434
|
+
}
|
|
435
|
+
})
|
|
436
|
+
}));
|
|
423
437
|
}
|
|
424
|
-
async function
|
|
438
|
+
async function ensureEventsQueueJobRegisteredAsync() {
|
|
439
|
+
await loadQueueModule();
|
|
425
440
|
ensureEventsQueueJobRegistered();
|
|
426
|
-
|
|
441
|
+
}
|
|
442
|
+
async function dispatchQueuedListenerViaQueue(dispatch) {
|
|
443
|
+
const queueModule = await loadQueueModule();
|
|
444
|
+
await ensureEventsQueueJobRegisteredAsync();
|
|
445
|
+
let pending = queueModule.dispatch(EVENTS_INVOKE_LISTENER_JOB, {
|
|
427
446
|
listenerId: dispatch.listenerId,
|
|
428
447
|
eventName: dispatch.event.name,
|
|
429
448
|
occurredAt: dispatch.event.occurredAt,
|
|
@@ -443,6 +462,7 @@ async function dispatchQueuedListenerViaQueue(dispatch) {
|
|
|
443
462
|
var eventQueueInternals = {
|
|
444
463
|
assertQueuedListenerMatchesEvent,
|
|
445
464
|
createQueuedListenerEventEnvelope,
|
|
465
|
+
loadQueueModule,
|
|
446
466
|
requireQueuedListener
|
|
447
467
|
};
|
|
448
468
|
|
|
@@ -784,6 +804,7 @@ export {
|
|
|
784
804
|
defineListener,
|
|
785
805
|
dispatchEvent,
|
|
786
806
|
ensureEventsQueueJobRegistered,
|
|
807
|
+
ensureEventsQueueJobRegisteredAsync,
|
|
787
808
|
eventInternals,
|
|
788
809
|
eventQueueInternals,
|
|
789
810
|
eventRegistryInternals,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@holo-js/events",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"description": "Holo-JS Framework - event contracts and runtime surface",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -23,8 +23,15 @@
|
|
|
23
23
|
"test": "vitest --run"
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
|
-
"@holo-js/db": "^0.1.
|
|
27
|
-
|
|
26
|
+
"@holo-js/db": "^0.1.3"
|
|
27
|
+
},
|
|
28
|
+
"peerDependencies": {
|
|
29
|
+
"@holo-js/queue": "^0.1.3"
|
|
30
|
+
},
|
|
31
|
+
"peerDependenciesMeta": {
|
|
32
|
+
"@holo-js/queue": {
|
|
33
|
+
"optional": true
|
|
34
|
+
}
|
|
28
35
|
},
|
|
29
36
|
"devDependencies": {
|
|
30
37
|
"@types/node": "^22.10.2",
|