@holo-js/events 0.1.2 → 0.1.4

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 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, TListener extends ListenerDefinition<TInput>>(listener: TListener): TListener;
111
- declare function defineListener<TInput extends EventReferenceInput, TListener extends ListenerDefinition<TInput>>(listener: TListener): TListener;
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
- if (getRegisteredQueueJob(EVENTS_INVOKE_LISTENER_JOB)) {
425
+ const registry = getQueueRegistryState().jobs;
426
+ if (registry.has(EVENTS_INVOKE_LISTENER_JOB)) {
414
427
  return;
415
428
  }
416
- registerQueueJob(defineJob({
417
- async handle(payload) {
418
- await runQueuedListenerInvocation(payload);
419
- }
420
- }), {
421
- name: EVENTS_INVOKE_LISTENER_JOB
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 dispatchQueuedListenerViaQueue(dispatch) {
438
+ async function ensureEventsQueueJobRegisteredAsync() {
439
+ await loadQueueModule();
425
440
  ensureEventsQueueJobRegistered();
426
- let pending = dispatchQueueJob(EVENTS_INVOKE_LISTENER_JOB, {
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.2",
3
+ "version": "0.1.4",
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.2",
27
- "@holo-js/queue": "^0.1.2"
26
+ "@holo-js/db": "^0.1.4"
27
+ },
28
+ "peerDependencies": {
29
+ "@holo-js/queue": "^0.1.4"
30
+ },
31
+ "peerDependenciesMeta": {
32
+ "@holo-js/queue": {
33
+ "optional": true
34
+ }
28
35
  },
29
36
  "devDependencies": {
30
37
  "@types/node": "^22.10.2",