@holo-js/queue 0.2.4 → 0.2.6

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
@@ -2,6 +2,16 @@ type QueueJsonPrimitive = string | number | boolean | null;
2
2
  type QueueJsonValue = QueueJsonPrimitive | readonly QueueJsonValue[] | {
3
3
  readonly [key: string]: QueueJsonValue;
4
4
  };
5
+ type QueueJobDispatcher = <TPayload extends QueueJsonValue>(jobName: string, payload: TPayload) => QueuePendingDispatch<TPayload>;
6
+ type QueueJobSyncDispatcher = <TPayload extends QueueJsonValue, TResult>(jobName: string, payload: TPayload) => Promise<TResult>;
7
+ declare function setQueueJobDispatcher(dispatcher: QueueJobDispatcher): void;
8
+ declare function setQueueJobSyncDispatcher(dispatcher: QueueJobSyncDispatcher): void;
9
+ declare function setQueueJobDefinitionName(definition: object, name: string): void;
10
+ declare function deleteQueueJobDefinitionName(name: string): void;
11
+ declare function clearQueueJobDefinitionNames(): void;
12
+ declare function resolveQueueJobDefinitionName(definition: object): string;
13
+ declare function dispatchDefinedQueueJob<TPayload extends QueueJsonValue>(definition: object, payload: TPayload): QueuePendingDispatch<TPayload>;
14
+ declare function dispatchDefinedQueueJobSync<TPayload extends QueueJsonValue, TResult>(definition: object, payload: TPayload): Promise<TResult>;
5
15
  declare function normalizeOptionalString(value: string | undefined, label: string): string | undefined;
6
16
  declare function normalizeOptionalInteger(value: number | undefined, label: string, options?: {
7
17
  minimum?: number;
@@ -34,6 +44,10 @@ interface QueueJobDefinition<TPayload extends QueueJsonValue = QueueJsonValue, T
34
44
  readonly onFailed?: QueueJobFailedHook<TPayload>;
35
45
  handle(payload: TPayload, context: QueueJobContext): Promise<TResult> | TResult;
36
46
  }
47
+ interface DefinedQueueJobDefinition<TPayload extends QueueJsonValue = QueueJsonValue, TResult = unknown> extends QueueJobDefinition<TPayload, TResult> {
48
+ dispatch(payload: TPayload): QueuePendingDispatch<TPayload>;
49
+ dispatchSync(payload: TPayload): Promise<TResult>;
50
+ }
37
51
  interface QueueJobEnvelope<TPayload extends QueueJsonValue = QueueJsonValue> {
38
52
  readonly id: string;
39
53
  readonly name: string;
@@ -215,8 +229,8 @@ interface QueueFailedJobStore {
215
229
  flushFailedJobs(): Promise<number>;
216
230
  }
217
231
  declare function isQueueJobDefinition(value: unknown): value is QueueJobDefinition;
218
- declare function normalizeQueueJobDefinition<TJob extends QueueJobDefinition>(job: TJob): TJob;
219
- declare function defineJob<TJob extends QueueJobDefinition>(job: TJob): TJob;
232
+ declare function normalizeQueueJobDefinition<TPayload extends QueueJsonValue, TResult, TJob extends QueueJobDefinition<TPayload, TResult>>(job: TJob): TJob;
233
+ declare function defineJob<TPayload extends QueueJsonValue, TResult = unknown>(job: QueueJobDefinition<TPayload, TResult>): DefinedQueueJobDefinition<TPayload, TResult>;
220
234
  interface QueueFailedStoreConfig {
221
235
  readonly driver?: 'database';
222
236
  readonly connection?: string;
@@ -325,11 +339,19 @@ interface NormalizedHoloQueueConfig {
325
339
  readonly connections: Readonly<Record<string, NormalizedQueueConnectionConfig>>;
326
340
  }
327
341
  declare const queueJobInternals: {
342
+ clearQueueJobDefinitionNames: typeof clearQueueJobDefinitionNames;
343
+ deleteQueueJobDefinitionName: typeof deleteQueueJobDefinitionName;
344
+ dispatchDefinedQueueJob: typeof dispatchDefinedQueueJob;
345
+ dispatchDefinedQueueJobSync: typeof dispatchDefinedQueueJobSync;
328
346
  normalizeQueueJobDefinition: typeof normalizeQueueJobDefinition;
329
347
  normalizeBackoff: typeof normalizeBackoff;
330
348
  normalizeOptionalHook: typeof normalizeOptionalHook;
331
349
  normalizeOptionalInteger: typeof normalizeOptionalInteger;
332
350
  normalizeOptionalString: typeof normalizeOptionalString;
351
+ resolveQueueJobDefinitionName: typeof resolveQueueJobDefinitionName;
352
+ setQueueJobDefinitionName: typeof setQueueJobDefinitionName;
353
+ setQueueJobDispatcher: typeof setQueueJobDispatcher;
354
+ setQueueJobSyncDispatcher: typeof setQueueJobSyncDispatcher;
333
355
  };
334
356
 
335
357
  declare const DEFAULT_QUEUE_CONNECTION = "sync";
@@ -607,4 +629,4 @@ declare const queueWorkerInternals: {
607
629
 
608
630
  declare function defineQueueConfig<TConfig extends HoloQueueConfig>(config: TConfig): Readonly<TConfig>;
609
631
 
610
- export { DEFAULT_DATABASE_QUEUE_TABLE, DEFAULT_FAILED_JOBS_CONNECTION, DEFAULT_FAILED_JOBS_TABLE, DEFAULT_QUEUE_BLOCK_FOR, DEFAULT_QUEUE_CONNECTION, DEFAULT_QUEUE_NAME, DEFAULT_QUEUE_RETRY_AFTER, DEFAULT_QUEUE_SLEEP, type ExportedQueueJobDefinition, type HoloQueueConfig, type HoloQueueJobRegistry, type NormalizedHoloQueueConfig, type NormalizedQueueConnectionConfig, type NormalizedQueueDatabaseConnectionConfig, type NormalizedQueueFailedStoreConfig, type NormalizedQueueRedisConnectionConfig, type NormalizedQueueSyncConnectionConfig, Queue, type QueueAsyncDriver, type QueueClearInput, type QueueConnectionConfig, type QueueConnectionFacade, type QueueDatabaseConnectionConfig, type QueueDelayValue, type QueueDispatchCompletedHook, type QueueDispatchFailedHook, type QueueDispatchOptions, type QueueDispatchResult, type QueueDriver, type QueueDriverDispatchResult, type QueueDriverFactory, type QueueDriverFactoryContext, type QueueEnqueueResult, type QueueFailedJobRecord, type QueueFailedJobStore, type QueueFailedStoreConfig, QueueFailedStoreError, type QueueJobContext, type QueueJobContextOverrides, type QueueJobDefinition, type QueueJobEnvelope, type QueueJsonValue, type QueuePayloadFor, type QueuePendingDispatch, type QueueRedisConnectionConfig, type QueueRegisteredJob, type QueueReleaseOptions, QueueReleaseUnsupportedError, type QueueReserveInput, type QueueReservedJob, type QueueResultFor, type QueueRuntimeBinding, type QueueSharedRedisConfig, type QueueSharedRedisConnectionConfig, type QueueSyncConnectionConfig, type QueueSyncDriver, type QueueWorkerHooks, type QueueWorkerJobEvent, type QueueWorkerOptions, type QueueWorkerResult, type QueueWorkerRunOptions, QueueWorkerTimeoutError, QueueWorkerUnsupportedDriverError, RedisQueueDriver, RedisQueueDriverError, type RegisterQueueJobOptions, type RegisterableQueueJobDefinition, clearQueueConnection, configureQueueRuntime, defineJob, defineQueueConfig, dispatch, dispatchSync, flushFailedQueueJobs, forgetFailedQueueJob, getQueueRuntime, getRegisteredQueueJob, holoQueueDefaults, isQueueJobDefinition, listFailedQueueJobs, listRegisteredQueueJobs, normalizeQueueConfig, normalizeQueueJobDefinition, persistFailedQueueJob, queueFailedInternals, queueInternals, queueJobInternals, queueRegistryInternals, queueRuntimeInternals, queueWorkerInternals, redisQueueDriverFactory, redisQueueDriverInternals, registerQueueJob, registerQueueJobs, resetQueueRegistry, resetQueueRuntime, retryFailedQueueJobs, runQueueWorker, shutdownQueueRuntime, syncQueueDriverFactory, syncQueueDriverInternals, unregisterQueueJob, useQueueConnection };
632
+ export { DEFAULT_DATABASE_QUEUE_TABLE, DEFAULT_FAILED_JOBS_CONNECTION, DEFAULT_FAILED_JOBS_TABLE, DEFAULT_QUEUE_BLOCK_FOR, DEFAULT_QUEUE_CONNECTION, DEFAULT_QUEUE_NAME, DEFAULT_QUEUE_RETRY_AFTER, DEFAULT_QUEUE_SLEEP, type DefinedQueueJobDefinition, type ExportedQueueJobDefinition, type HoloQueueConfig, type HoloQueueJobRegistry, type NormalizedHoloQueueConfig, type NormalizedQueueConnectionConfig, type NormalizedQueueDatabaseConnectionConfig, type NormalizedQueueFailedStoreConfig, type NormalizedQueueRedisConnectionConfig, type NormalizedQueueSyncConnectionConfig, Queue, type QueueAsyncDriver, type QueueClearInput, type QueueConnectionConfig, type QueueConnectionFacade, type QueueDatabaseConnectionConfig, type QueueDelayValue, type QueueDispatchCompletedHook, type QueueDispatchFailedHook, type QueueDispatchOptions, type QueueDispatchResult, type QueueDriver, type QueueDriverDispatchResult, type QueueDriverFactory, type QueueDriverFactoryContext, type QueueEnqueueResult, type QueueFailedJobRecord, type QueueFailedJobStore, type QueueFailedStoreConfig, QueueFailedStoreError, type QueueJobContext, type QueueJobContextOverrides, type QueueJobDefinition, type QueueJobEnvelope, type QueueJsonValue, type QueuePayloadFor, type QueuePendingDispatch, type QueueRedisConnectionConfig, type QueueRegisteredJob, type QueueReleaseOptions, QueueReleaseUnsupportedError, type QueueReserveInput, type QueueReservedJob, type QueueResultFor, type QueueRuntimeBinding, type QueueSharedRedisConfig, type QueueSharedRedisConnectionConfig, type QueueSyncConnectionConfig, type QueueSyncDriver, type QueueWorkerHooks, type QueueWorkerJobEvent, type QueueWorkerOptions, type QueueWorkerResult, type QueueWorkerRunOptions, QueueWorkerTimeoutError, QueueWorkerUnsupportedDriverError, RedisQueueDriver, RedisQueueDriverError, type RegisterQueueJobOptions, type RegisterableQueueJobDefinition, clearQueueConnection, configureQueueRuntime, defineJob, defineQueueConfig, dispatch, dispatchSync, flushFailedQueueJobs, forgetFailedQueueJob, getQueueRuntime, getRegisteredQueueJob, holoQueueDefaults, isQueueJobDefinition, listFailedQueueJobs, listRegisteredQueueJobs, normalizeQueueConfig, normalizeQueueJobDefinition, persistFailedQueueJob, queueFailedInternals, queueInternals, queueJobInternals, queueRegistryInternals, queueRuntimeInternals, queueWorkerInternals, redisQueueDriverFactory, redisQueueDriverInternals, registerQueueJob, registerQueueJobs, resetQueueRegistry, resetQueueRuntime, retryFailedQueueJobs, runQueueWorker, shutdownQueueRuntime, syncQueueDriverFactory, syncQueueDriverInternals, unregisterQueueJob, useQueueConnection };
package/dist/index.mjs CHANGED
@@ -1,4 +1,132 @@
1
1
  // src/contracts.ts
2
+ function getQueueJobDispatcher() {
3
+ return globalThis.__holoQueueJobDispatcher__;
4
+ }
5
+ function setQueueJobDispatcher(dispatcher) {
6
+ const runtime = globalThis;
7
+ runtime.__holoQueueJobDispatcher__ = dispatcher;
8
+ }
9
+ function getQueueJobSyncDispatcher() {
10
+ return globalThis.__holoQueueJobSyncDispatcher__;
11
+ }
12
+ function setQueueJobSyncDispatcher(dispatcher) {
13
+ const runtime = globalThis;
14
+ runtime.__holoQueueJobSyncDispatcher__ = dispatcher;
15
+ }
16
+ function getQueueJobDefinitionNames() {
17
+ const runtime = globalThis;
18
+ runtime.__holoQueueJobDefinitionNames__ ??= /* @__PURE__ */ new WeakMap();
19
+ return runtime.__holoQueueJobDefinitionNames__;
20
+ }
21
+ function getQueueJobDefinitionFingerprints() {
22
+ const runtime = globalThis;
23
+ runtime.__holoQueueJobDefinitionFingerprints__ ??= /* @__PURE__ */ new Map();
24
+ return runtime.__holoQueueJobDefinitionFingerprints__;
25
+ }
26
+ function getQueueJobDefinitionOptionFingerprints() {
27
+ const runtime = globalThis;
28
+ runtime.__holoQueueJobDefinitionOptionFingerprints__ ??= /* @__PURE__ */ new Map();
29
+ return runtime.__holoQueueJobDefinitionOptionFingerprints__;
30
+ }
31
+ function createQueueJobDefinitionOptionsFingerprint(definition) {
32
+ return JSON.stringify({
33
+ connection: definition.connection,
34
+ queue: definition.queue,
35
+ tries: definition.tries,
36
+ backoff: definition.backoff,
37
+ timeout: definition.timeout
38
+ });
39
+ }
40
+ function getQueueJobDefinitionFingerprint(definition) {
41
+ if (!isQueueJobDefinition(definition)) {
42
+ return void 0;
43
+ }
44
+ return JSON.stringify({
45
+ options: createQueueJobDefinitionOptionsFingerprint(definition),
46
+ handle: definition.handle.toString()
47
+ });
48
+ }
49
+ function addQueueJobDefinitionNameByFingerprint(fingerprints, fingerprint, name) {
50
+ const names = fingerprints.get(fingerprint) ?? /* @__PURE__ */ new Set();
51
+ names.add(name);
52
+ fingerprints.set(fingerprint, names);
53
+ }
54
+ function setQueueJobDefinitionName(definition, name) {
55
+ getQueueJobDefinitionNames().set(definition, name);
56
+ if (!isQueueJobDefinition(definition)) {
57
+ return;
58
+ }
59
+ addQueueJobDefinitionNameByFingerprint(
60
+ getQueueJobDefinitionFingerprints(),
61
+ getQueueJobDefinitionFingerprint(definition),
62
+ name
63
+ );
64
+ addQueueJobDefinitionNameByFingerprint(
65
+ getQueueJobDefinitionOptionFingerprints(),
66
+ createQueueJobDefinitionOptionsFingerprint(definition),
67
+ name
68
+ );
69
+ }
70
+ function deleteQueueJobDefinitionName(name) {
71
+ for (const fingerprints of [
72
+ getQueueJobDefinitionFingerprints(),
73
+ getQueueJobDefinitionOptionFingerprints()
74
+ ]) {
75
+ for (const [fingerprint, names] of fingerprints) {
76
+ names.delete(name);
77
+ if (names.size === 0) {
78
+ fingerprints.delete(fingerprint);
79
+ }
80
+ }
81
+ }
82
+ }
83
+ function clearQueueJobDefinitionNames() {
84
+ getQueueJobDefinitionFingerprints().clear();
85
+ getQueueJobDefinitionOptionFingerprints().clear();
86
+ }
87
+ function resolveSingleQueueJobDefinitionFingerprintName(names) {
88
+ if (!names) {
89
+ return void 0;
90
+ }
91
+ if (names.size === 1) {
92
+ return [...names][0];
93
+ }
94
+ throw new Error("[Holo Queue] Job definition dispatch is ambiguous because multiple registered jobs match the same definition.");
95
+ }
96
+ function resolveQueueJobDefinitionName(definition) {
97
+ const name = getQueueJobDefinitionNames().get(definition);
98
+ if (name) {
99
+ return name;
100
+ }
101
+ const fingerprint = getQueueJobDefinitionFingerprint(definition);
102
+ const fingerprintName = fingerprint ? resolveSingleQueueJobDefinitionFingerprintName(getQueueJobDefinitionFingerprints().get(fingerprint)) : void 0;
103
+ if (fingerprintName) {
104
+ return fingerprintName;
105
+ }
106
+ if (isQueueJobDefinition(definition)) {
107
+ const optionFingerprintName = resolveSingleQueueJobDefinitionFingerprintName(
108
+ getQueueJobDefinitionOptionFingerprints().get(createQueueJobDefinitionOptionsFingerprint(definition))
109
+ );
110
+ if (optionFingerprintName) {
111
+ return optionFingerprintName;
112
+ }
113
+ }
114
+ throw new Error("[Holo Queue] Job definitions cannot dispatch before the job is registered.");
115
+ }
116
+ function dispatchDefinedQueueJob(definition, payload) {
117
+ const dispatcher = getQueueJobDispatcher();
118
+ if (!dispatcher) {
119
+ throw new Error("[Holo Queue] Job definitions cannot dispatch before the queue runtime is loaded.");
120
+ }
121
+ return dispatcher(resolveQueueJobDefinitionName(definition), payload);
122
+ }
123
+ function dispatchDefinedQueueJobSync(definition, payload) {
124
+ const dispatcher = getQueueJobSyncDispatcher();
125
+ if (!dispatcher) {
126
+ throw new Error("[Holo Queue] Job definitions cannot dispatch before the queue runtime is loaded.");
127
+ }
128
+ return dispatcher(resolveQueueJobDefinitionName(definition), payload);
129
+ }
2
130
  function normalizeOptionalString(value, label) {
3
131
  if (typeof value === "undefined") {
4
132
  return void 0;
@@ -70,14 +198,35 @@ function normalizeQueueJobDefinition(job) {
70
198
  };
71
199
  }
72
200
  function defineJob(job) {
73
- return Object.freeze(normalizeQueueJobDefinition(job));
201
+ const normalized = normalizeQueueJobDefinition(job);
202
+ Object.defineProperty(normalized, "dispatch", {
203
+ value(payload) {
204
+ return dispatchDefinedQueueJob(normalized, payload);
205
+ },
206
+ enumerable: false
207
+ });
208
+ Object.defineProperty(normalized, "dispatchSync", {
209
+ value(payload) {
210
+ return dispatchDefinedQueueJobSync(normalized, payload);
211
+ },
212
+ enumerable: false
213
+ });
214
+ return Object.freeze(normalized);
74
215
  }
75
216
  var queueJobInternals = {
217
+ clearQueueJobDefinitionNames,
218
+ deleteQueueJobDefinitionName,
219
+ dispatchDefinedQueueJob,
220
+ dispatchDefinedQueueJobSync,
76
221
  normalizeQueueJobDefinition,
77
222
  normalizeBackoff,
78
223
  normalizeOptionalHook,
79
224
  normalizeOptionalInteger,
80
- normalizeOptionalString
225
+ normalizeOptionalString,
226
+ resolveQueueJobDefinitionName,
227
+ setQueueJobDefinitionName,
228
+ setQueueJobDispatcher,
229
+ setQueueJobSyncDispatcher
81
230
  };
82
231
 
83
232
  // src/config.ts
@@ -366,6 +515,8 @@ function registerQueueJob(definition, options = {}) {
366
515
  ...normalizedDefinition
367
516
  })
368
517
  });
518
+ queueJobInternals.setQueueJobDefinitionName(definition, name);
519
+ queueJobInternals.setQueueJobDefinitionName(normalizedDefinition, name);
369
520
  registry.set(name, entry);
370
521
  return entry;
371
522
  }
@@ -379,10 +530,15 @@ function listRegisteredQueueJobs() {
379
530
  return Object.freeze([...getQueueRegistryState().jobs.values()].sort((left, right) => left.name.localeCompare(right.name)));
380
531
  }
381
532
  function unregisterQueueJob(name) {
382
- return getQueueRegistryState().jobs.delete(name);
533
+ const deleted = getQueueRegistryState().jobs.delete(name);
534
+ if (deleted) {
535
+ queueJobInternals.deleteQueueJobDefinitionName(name);
536
+ }
537
+ return deleted;
383
538
  }
384
539
  function resetQueueRegistry() {
385
540
  getQueueRegistryState().jobs.clear();
541
+ queueJobInternals.clearQueueJobDefinitionNames();
386
542
  }
387
543
  var queueRegistryInternals = {
388
544
  deriveJobNameFromSourcePath
@@ -1049,6 +1205,8 @@ async function dispatchSync(jobName, payload, options = {}) {
1049
1205
  function dispatch(jobName, payload, options = {}) {
1050
1206
  return new PendingQueueDispatch(jobName, payload, options);
1051
1207
  }
1208
+ queueJobInternals.setQueueJobDispatcher(dispatch);
1209
+ queueJobInternals.setQueueJobSyncDispatcher(dispatchSync);
1052
1210
  var Queue = {
1053
1211
  connection(name) {
1054
1212
  return createQueueConnection(name);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@holo-js/queue",
3
- "version": "0.2.4",
3
+ "version": "0.2.6",
4
4
  "description": "Holo-JS Framework - queue contracts and config helpers",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -23,7 +23,7 @@
23
23
  "test": "vitest --run"
24
24
  },
25
25
  "peerDependencies": {
26
- "@holo-js/queue-redis": "^0.2.4"
26
+ "@holo-js/queue-redis": "^0.2.6"
27
27
  },
28
28
  "peerDependenciesMeta": {
29
29
  "@holo-js/queue-redis": {
@@ -31,7 +31,7 @@
31
31
  }
32
32
  },
33
33
  "devDependencies": {
34
- "@holo-js/queue-redis": "^0.2.4",
34
+ "@holo-js/queue-redis": "^0.2.6",
35
35
  "@types/node": "^22.10.2",
36
36
  "tsup": "^8.3.5",
37
37
  "typescript": "^5.7.2",