glasswork 0.12.2 → 0.13.0

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.
Files changed (108) hide show
  1. package/dist/auth/abilities.d.ts +41 -0
  2. package/dist/auth/abilities.d.ts.map +1 -0
  3. package/dist/auth/abilities.js +62 -0
  4. package/dist/auth/abilities.js.map +1 -0
  5. package/dist/auth/assert.d.ts +20 -0
  6. package/dist/auth/assert.d.ts.map +1 -0
  7. package/dist/auth/assert.js +28 -0
  8. package/dist/auth/assert.js.map +1 -0
  9. package/dist/auth/better-auth-provider.d.ts +56 -0
  10. package/dist/auth/better-auth-provider.d.ts.map +1 -0
  11. package/dist/auth/better-auth-provider.js +62 -0
  12. package/dist/auth/better-auth-provider.js.map +1 -0
  13. package/dist/auth/index.d.ts +6 -0
  14. package/dist/auth/index.d.ts.map +1 -0
  15. package/dist/auth/index.js +5 -0
  16. package/dist/auth/index.js.map +1 -0
  17. package/dist/auth/middleware.d.ts +31 -0
  18. package/dist/auth/middleware.d.ts.map +1 -0
  19. package/dist/auth/middleware.js +92 -0
  20. package/dist/auth/middleware.js.map +1 -0
  21. package/dist/auth/types.d.ts +54 -0
  22. package/dist/auth/types.d.ts.map +1 -0
  23. package/dist/auth/types.js +2 -0
  24. package/dist/auth/types.js.map +1 -0
  25. package/dist/core/bootstrap.d.ts.map +1 -1
  26. package/dist/core/bootstrap.js +5 -2
  27. package/dist/core/bootstrap.js.map +1 -1
  28. package/dist/core/types.d.ts +8 -2
  29. package/dist/core/types.d.ts.map +1 -1
  30. package/dist/http/route-helpers.d.ts +43 -0
  31. package/dist/http/route-helpers.d.ts.map +1 -1
  32. package/dist/http/route-helpers.js +90 -40
  33. package/dist/http/route-helpers.js.map +1 -1
  34. package/dist/index.d.ts +8 -2
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +7 -1
  37. package/dist/index.js.map +1 -1
  38. package/dist/jobs/define-job.d.ts +34 -2
  39. package/dist/jobs/define-job.d.ts.map +1 -1
  40. package/dist/jobs/define-job.js.map +1 -1
  41. package/dist/jobs/drivers/eventbridge-scheduler-driver.d.ts +75 -0
  42. package/dist/jobs/drivers/eventbridge-scheduler-driver.d.ts.map +1 -0
  43. package/dist/jobs/drivers/eventbridge-scheduler-driver.js +135 -0
  44. package/dist/jobs/drivers/eventbridge-scheduler-driver.js.map +1 -0
  45. package/dist/jobs/drivers/mock-driver.d.ts +45 -10
  46. package/dist/jobs/drivers/mock-driver.d.ts.map +1 -1
  47. package/dist/jobs/drivers/mock-driver.js +36 -17
  48. package/dist/jobs/drivers/mock-driver.js.map +1 -1
  49. package/dist/jobs/drivers/sqs-driver.d.ts +26 -19
  50. package/dist/jobs/drivers/sqs-driver.d.ts.map +1 -1
  51. package/dist/jobs/drivers/sqs-driver.js +54 -69
  52. package/dist/jobs/drivers/sqs-driver.js.map +1 -1
  53. package/dist/jobs/errors.d.ts +8 -4
  54. package/dist/jobs/errors.d.ts.map +1 -1
  55. package/dist/jobs/errors.js +13 -7
  56. package/dist/jobs/errors.js.map +1 -1
  57. package/dist/jobs/index.d.ts +4 -3
  58. package/dist/jobs/index.d.ts.map +1 -1
  59. package/dist/jobs/index.js +3 -2
  60. package/dist/jobs/index.js.map +1 -1
  61. package/dist/jobs/job-registry.d.ts +4 -4
  62. package/dist/jobs/job-registry.d.ts.map +1 -1
  63. package/dist/jobs/job-registry.js.map +1 -1
  64. package/dist/jobs/job-service.js +1 -1
  65. package/dist/jobs/job-service.js.map +1 -1
  66. package/dist/jobs/schedule-constants.d.ts +0 -4
  67. package/dist/jobs/schedule-constants.d.ts.map +1 -1
  68. package/dist/jobs/schedule-constants.js +0 -4
  69. package/dist/jobs/schedule-constants.js.map +1 -1
  70. package/dist/jobs/scheduler.d.ts +1 -1
  71. package/dist/jobs/scheduler.d.ts.map +1 -1
  72. package/dist/jobs/scheduler.js +46 -10
  73. package/dist/jobs/scheduler.js.map +1 -1
  74. package/dist/jobs/types.d.ts +59 -50
  75. package/dist/jobs/types.d.ts.map +1 -1
  76. package/dist/jobs/utils.d.ts +0 -9
  77. package/dist/jobs/utils.d.ts.map +1 -1
  78. package/dist/jobs/utils.js +3 -23
  79. package/dist/jobs/utils.js.map +1 -1
  80. package/dist/jobs/worker.d.ts +2 -3
  81. package/dist/jobs/worker.d.ts.map +1 -1
  82. package/dist/jobs/worker.js +183 -82
  83. package/dist/jobs/worker.js.map +1 -1
  84. package/dist/list-query/casl.d.ts +18 -19
  85. package/dist/list-query/casl.d.ts.map +1 -1
  86. package/dist/list-query/casl.js +40 -46
  87. package/dist/list-query/casl.js.map +1 -1
  88. package/dist/uploads/file-upload.d.ts +44 -0
  89. package/dist/uploads/file-upload.d.ts.map +1 -0
  90. package/dist/uploads/file-upload.js +145 -0
  91. package/dist/uploads/file-upload.js.map +1 -0
  92. package/dist/uploads/index.d.ts +6 -0
  93. package/dist/uploads/index.d.ts.map +1 -0
  94. package/dist/uploads/index.js +7 -0
  95. package/dist/uploads/index.js.map +1 -0
  96. package/dist/uploads/uploads.service.d.ts +98 -0
  97. package/dist/uploads/uploads.service.d.ts.map +1 -0
  98. package/dist/uploads/uploads.service.js +134 -0
  99. package/dist/uploads/uploads.service.js.map +1 -0
  100. package/dist/uploads/validators.d.ts +41 -0
  101. package/dist/uploads/validators.d.ts.map +1 -0
  102. package/dist/uploads/validators.js +94 -0
  103. package/dist/uploads/validators.js.map +1 -0
  104. package/package.json +34 -3
  105. package/dist/email/compiler/code-generator.d.ts +0 -11
  106. package/dist/email/compiler/code-generator.d.ts.map +0 -1
  107. package/dist/email/compiler/code-generator.js +0 -319
  108. package/dist/email/compiler/code-generator.js.map +0 -1
@@ -0,0 +1,135 @@
1
+ import { generateJobId } from '../utils.js';
2
+ /**
3
+ * EventBridge Scheduler driver for scheduling jobs with delays longer than 15 minutes.
4
+ *
5
+ * Uses one-off schedules with `at()` expressions that target an SQS queue.
6
+ * Schedules are automatically deleted after execution.
7
+ */
8
+ export class EventBridgeSchedulerDriver {
9
+ config;
10
+ client = null;
11
+ constructor(config) {
12
+ this.config = config;
13
+ }
14
+ /**
15
+ * Lazily initialize the Scheduler client.
16
+ */
17
+ async getClient() {
18
+ if (!this.client) {
19
+ const { SchedulerClient } = await import('@aws-sdk/client-scheduler');
20
+ this.client = new SchedulerClient({
21
+ region: this.config.region,
22
+ ...(this.config.endpoint && { endpoint: this.config.endpoint }),
23
+ });
24
+ }
25
+ return this.client;
26
+ }
27
+ /**
28
+ * Schedule a job to be executed at a specific time.
29
+ *
30
+ * Creates a one-off EventBridge Scheduler schedule that sends a message
31
+ * to the specified SQS queue at the scheduled time.
32
+ *
33
+ * @param config - The scheduled job configuration
34
+ * @returns Schedule result with ARN and name
35
+ */
36
+ async scheduleAt(config) {
37
+ const client = await this.getClient();
38
+ const { CreateScheduleCommand } = await import('@aws-sdk/client-scheduler');
39
+ const jobId = config.message.jobId ?? generateJobId();
40
+ const scheduleName = `glasswork-${jobId}`;
41
+ // Format: at(yyyy-mm-ddThh:mm:ss)
42
+ const scheduleExpression = `at(${config.scheduledAt.toISOString().slice(0, 19)})`;
43
+ // Build the SQS message payload
44
+ const messageBody = JSON.stringify({
45
+ jobName: config.message.jobName,
46
+ payload: config.message.payload,
47
+ jobId,
48
+ metadata: config.message.metadata,
49
+ enqueuedAt: new Date().toISOString(),
50
+ });
51
+ const command = new CreateScheduleCommand({
52
+ Name: scheduleName,
53
+ GroupName: this.config.scheduleGroupName ?? 'default',
54
+ ScheduleExpression: scheduleExpression,
55
+ ScheduleExpressionTimezone: 'UTC',
56
+ FlexibleTimeWindow: {
57
+ Mode: 'OFF',
58
+ },
59
+ Target: {
60
+ Arn: this.sqsArnFromUrl(config.queueUrl),
61
+ RoleArn: this.config.roleArn,
62
+ Input: messageBody,
63
+ SqsParameters: {
64
+ MessageGroupId: config.message.queue ?? config.message.jobName,
65
+ },
66
+ },
67
+ // Auto-delete the schedule after it runs
68
+ ActionAfterCompletion: 'DELETE',
69
+ });
70
+ const result = await client.send(command);
71
+ const scheduleArn = result.ScheduleArn;
72
+ if (!scheduleArn) {
73
+ throw new Error('EventBridge Scheduler did not return a schedule ARN');
74
+ }
75
+ return {
76
+ messageId: jobId,
77
+ jobId,
78
+ scheduleArn,
79
+ scheduleName,
80
+ };
81
+ }
82
+ /**
83
+ * Cancel a scheduled job.
84
+ *
85
+ * @param scheduleName - The name of the schedule to cancel
86
+ */
87
+ async cancel(scheduleName) {
88
+ const client = await this.getClient();
89
+ const { DeleteScheduleCommand } = await import('@aws-sdk/client-scheduler');
90
+ const command = new DeleteScheduleCommand({
91
+ Name: scheduleName,
92
+ GroupName: this.config.scheduleGroupName ?? 'default',
93
+ });
94
+ await client.send(command);
95
+ }
96
+ /**
97
+ * Dispose of the driver and release AWS SDK client resources.
98
+ * Call this when you're done using the driver to prevent memory leaks.
99
+ */
100
+ async dispose() {
101
+ if (this.client) {
102
+ this.client.destroy();
103
+ this.client = null;
104
+ }
105
+ }
106
+ /**
107
+ * Convert an SQS queue URL to its ARN.
108
+ *
109
+ * Supports both standard AWS and LocalStack URL formats:
110
+ * - AWS: https://sqs.{region}.amazonaws.com/{accountId}/{queueName}
111
+ * - LocalStack: http://localhost:4566/{accountId}/{queueName}
112
+ *
113
+ * ARN format: arn:aws:sqs:{region}:{accountId}:{queueName}
114
+ */
115
+ sqsArnFromUrl(queueUrl) {
116
+ const url = new URL(queueUrl);
117
+ const pathParts = url.pathname.split('/').filter(Boolean);
118
+ if (pathParts.length < 2) {
119
+ throw new Error(`Invalid SQS queue URL format: ${queueUrl}`);
120
+ }
121
+ const accountId = pathParts[0];
122
+ const queueName = pathParts[1];
123
+ // Determine region from URL or fall back to configured region
124
+ // Standard AWS format: sqs.{region}.amazonaws.com
125
+ // LocalStack format: localhost:4566 (no region in hostname)
126
+ let region = this.config.region;
127
+ const hostParts = url.hostname.split('.');
128
+ const isAwsUrl = url.hostname.includes('amazonaws.com');
129
+ if (isAwsUrl && hostParts.length >= 2 && hostParts[0] === 'sqs') {
130
+ region = hostParts[1];
131
+ }
132
+ return `arn:aws:sqs:${region}:${accountId}:${queueName}`;
133
+ }
134
+ }
135
+ //# sourceMappingURL=eventbridge-scheduler-driver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eventbridge-scheduler-driver.js","sourceRoot":"","sources":["../../../src/jobs/drivers/eventbridge-scheduler-driver.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAoC5C;;;;;GAKG;AACH,MAAM,OAAO,0BAA0B;IAGR;IAFrB,MAAM,GAA2B,IAAI,CAAC;IAE9C,YAA6B,MAAkC;QAAlC,WAAM,GAAN,MAAM,CAA4B;IAAG,CAAC;IAEnE;;OAEG;IACK,KAAK,CAAC,SAAS;QACrB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;YACtE,IAAI,CAAC,MAAM,GAAG,IAAI,eAAe,CAAC;gBAChC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;gBAC1B,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;aAChE,CAAoB,CAAC;QACxB,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,UAAU,CAAC,MAA0B;QACzC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACtC,MAAM,EAAE,qBAAqB,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;QAE5E,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,aAAa,EAAE,CAAC;QACtD,MAAM,YAAY,GAAG,aAAa,KAAK,EAAE,CAAC;QAE1C,kCAAkC;QAClC,MAAM,kBAAkB,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC;QAElF,gCAAgC;QAChC,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC;YACjC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO;YAC/B,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO;YAC/B,KAAK;YACL,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ;YACjC,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACrC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC;YACxC,IAAI,EAAE,YAAY;YAClB,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,iBAAiB,IAAI,SAAS;YACrD,kBAAkB,EAAE,kBAAkB;YACtC,0BAA0B,EAAE,KAAK;YACjC,kBAAkB,EAAE;gBAClB,IAAI,EAAE,KAAK;aACZ;YACD,MAAM,EAAE;gBACN,GAAG,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC;gBACxC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;gBAC5B,KAAK,EAAE,WAAW;gBAClB,aAAa,EAAE;oBACb,cAAc,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO;iBAC/D;aACF;YACD,yCAAyC;YACzC,qBAAqB,EAAE,QAAQ;SAChC,CAA0B,CAAC;QAE5B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,WAAW,GAAI,MAAmC,CAAC,WAAW,CAAC;QAErE,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACzE,CAAC;QAED,OAAO;YACL,SAAS,EAAE,KAAK;YAChB,KAAK;YACL,WAAW;YACX,YAAY;SACb,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,MAAM,CAAC,YAAoB;QAC/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACtC,MAAM,EAAE,qBAAqB,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;QAE5E,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC;YACxC,IAAI,EAAE,YAAY;YAClB,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,iBAAiB,IAAI,SAAS;SACtD,CAA0B,CAAC;QAE5B,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACtB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACrB,CAAC;IACH,CAAC;IAED;;;;;;;;OAQG;IACK,aAAa,CAAC,QAAgB;QACpC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC9B,MAAM,SAAS,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAE1D,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,iCAAiC,QAAQ,EAAE,CAAC,CAAC;QAC/D,CAAC;QAED,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAE/B,8DAA8D;QAC9D,kDAAkD;QAClD,4DAA4D;QAC5D,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QAChC,MAAM,SAAS,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;QAExD,IAAI,QAAQ,IAAI,SAAS,CAAC,MAAM,IAAI,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;YAChE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC;QAED,OAAO,eAAe,MAAM,IAAI,SAAS,IAAI,SAAS,EAAE,CAAC;IAC3D,CAAC;CACF"}
@@ -1,4 +1,5 @@
1
- import type { Duration, EnqueueResult, JobMessage, QueueDriver, ReceivedJob, ReceiveOptions } from '../types.js';
1
+ import type { JobRegistry } from '../job-registry.js';
2
+ import type { Duration, EnqueueResult, JobMessage, QueueDriver } from '../types.js';
2
3
  export interface MockEnqueuedJob {
3
4
  message: JobMessage & {
4
5
  jobId: string;
@@ -7,18 +8,55 @@ export interface MockEnqueuedJob {
7
8
  delay?: Duration;
8
9
  }
9
10
  /**
10
- * In-memory queue driver for testing.
11
+ * Configuration for MockQueueDriver.
12
+ */
13
+ export interface MockQueueDriverConfig {
14
+ /**
15
+ * Execute jobs synchronously when enqueued.
16
+ * Useful for local development to test job handlers immediately.
17
+ * @default false
18
+ */
19
+ executeImmediately?: boolean;
20
+ /**
21
+ * Job registry for looking up job definitions.
22
+ * Required when executeImmediately is true.
23
+ */
24
+ registry?: JobRegistry;
25
+ /**
26
+ * Resolver to get DI services for job execution.
27
+ * Called when a job is executed, returning the services container.
28
+ * Required when executeImmediately is true.
29
+ */
30
+ serviceResolver?: () => Record<string, unknown>;
31
+ }
32
+ /**
33
+ * In-memory queue driver for testing and local development.
34
+ *
35
+ * @example Testing mode (default)
36
+ * ```typescript
37
+ * const driver = new MockQueueDriver();
38
+ * await jobService.enqueue(myJob, payload);
39
+ * expect(driver.enqueued).toHaveLength(1);
40
+ * ```
41
+ *
42
+ * @example Development mode with immediate execution
43
+ * ```typescript
44
+ * const driver = new MockQueueDriver({
45
+ * executeImmediately: true,
46
+ * registry: createJobRegistry([myJob]),
47
+ * serviceResolver: () => diContainer,
48
+ * });
49
+ * ```
11
50
  */
12
51
  export declare class MockQueueDriver implements QueueDriver {
13
52
  readonly name = "mock";
14
53
  private counter;
15
54
  private failNext?;
55
+ private readonly executeImmediately;
56
+ private readonly registry?;
57
+ private readonly serviceResolver?;
16
58
  readonly enqueued: MockEnqueuedJob[];
17
- readonly acks: ReceivedJob[];
18
- readonly nacks: Array<{
19
- job: ReceivedJob;
20
- error?: Error;
21
- }>;
59
+ constructor(config?: MockQueueDriverConfig);
22
60
  /**
23
61
  * Simulate the next enqueue call failing.
24
62
  */
@@ -31,8 +69,5 @@ export declare class MockQueueDriver implements QueueDriver {
31
69
  enqueue(message: JobMessage): Promise<EnqueueResult>;
32
70
  enqueueAt(message: JobMessage, at: Date): Promise<EnqueueResult>;
33
71
  enqueueIn(message: JobMessage, delay: Duration): Promise<EnqueueResult>;
34
- receive(_options?: ReceiveOptions): Promise<ReceivedJob[]>;
35
- ack(job: ReceivedJob): Promise<void>;
36
- nack(job: ReceivedJob, error?: Error): Promise<void>;
37
72
  }
38
73
  //# sourceMappingURL=mock-driver.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mock-driver.d.ts","sourceRoot":"","sources":["../../../src/jobs/drivers/mock-driver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EACR,aAAa,EACb,UAAU,EACV,WAAW,EACX,WAAW,EACX,cAAc,EACf,MAAM,aAAa,CAAC;AAGrB,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,UAAU,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,EAAE,CAAC,EAAE,IAAI,CAAC;IACV,KAAK,CAAC,EAAE,QAAQ,CAAC;CAClB;AAED;;GAEG;AACH,qBAAa,eAAgB,YAAW,WAAW;IACjD,QAAQ,CAAC,IAAI,UAAU;IACvB,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,QAAQ,CAAC,CAAQ;IACzB,QAAQ,CAAC,QAAQ,EAAE,eAAe,EAAE,CAAM;IAC1C,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,CAAM;IAClC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,WAAW,CAAC;QAAC,KAAK,CAAC,EAAE,KAAK,CAAA;KAAE,CAAC,CAAM;IAEhE;;OAEG;IACH,eAAe,CAAC,KAAK,QAAoC,GAAG,IAAI;IAIhE;;OAEG;IACH,KAAK,IAAI,IAAI;IAQb,IAAI,OAAO,IAAI,eAAe,GAAG,SAAS,CAEzC;IAEK,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC;IAoBpD,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC;IAShE,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC;IASvE,OAAO,CAAC,QAAQ,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAO1D,GAAG,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpC,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;CAG3D"}
1
+ {"version":3,"file":"mock-driver.d.ts","sourceRoot":"","sources":["../../../src/jobs/drivers/mock-driver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAc,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAGhG,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,UAAU,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,EAAE,CAAC,EAAE,IAAI,CAAC;IACV,KAAK,CAAC,EAAE,QAAQ,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B;;;OAGG;IACH,QAAQ,CAAC,EAAE,WAAW,CAAC;IAEvB;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjD;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,eAAgB,YAAW,WAAW;IACjD,QAAQ,CAAC,IAAI,UAAU;IACvB,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,QAAQ,CAAC,CAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAU;IAC7C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAc;IACxC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAgC;IACjE,QAAQ,CAAC,QAAQ,EAAE,eAAe,EAAE,CAAM;gBAE9B,MAAM,GAAE,qBAA0B;IAM9C;;OAEG;IACH,eAAe,CAAC,KAAK,QAAoC,GAAG,IAAI;IAIhE;;OAEG;IACH,KAAK,IAAI,IAAI;IAMb,IAAI,OAAO,IAAI,eAAe,GAAG,SAAS,CAEzC;IAEK,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC;IAgCpD,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC;IAShE,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC;CAQ9E"}
@@ -1,14 +1,36 @@
1
1
  import { generateJobId } from '../utils.js';
2
2
  /**
3
- * In-memory queue driver for testing.
3
+ * In-memory queue driver for testing and local development.
4
+ *
5
+ * @example Testing mode (default)
6
+ * ```typescript
7
+ * const driver = new MockQueueDriver();
8
+ * await jobService.enqueue(myJob, payload);
9
+ * expect(driver.enqueued).toHaveLength(1);
10
+ * ```
11
+ *
12
+ * @example Development mode with immediate execution
13
+ * ```typescript
14
+ * const driver = new MockQueueDriver({
15
+ * executeImmediately: true,
16
+ * registry: createJobRegistry([myJob]),
17
+ * serviceResolver: () => diContainer,
18
+ * });
19
+ * ```
4
20
  */
5
21
  export class MockQueueDriver {
6
22
  name = 'mock';
7
23
  counter = 0;
8
24
  failNext;
25
+ executeImmediately;
26
+ registry;
27
+ serviceResolver;
9
28
  enqueued = [];
10
- acks = [];
11
- nacks = [];
29
+ constructor(config = {}) {
30
+ this.executeImmediately = config.executeImmediately ?? false;
31
+ this.registry = config.registry;
32
+ this.serviceResolver = config.serviceResolver;
33
+ }
12
34
  /**
13
35
  * Simulate the next enqueue call failing.
14
36
  */
@@ -20,8 +42,6 @@ export class MockQueueDriver {
20
42
  */
21
43
  clear() {
22
44
  this.enqueued.length = 0;
23
- this.acks.length = 0;
24
- this.nacks.length = 0;
25
45
  this.counter = 0;
26
46
  this.failNext = undefined;
27
47
  }
@@ -42,6 +62,17 @@ export class MockQueueDriver {
42
62
  this.enqueued.push({
43
63
  message: { ...message, jobId },
44
64
  });
65
+ // Execute immediately if configured
66
+ if (this.executeImmediately && this.registry && this.serviceResolver) {
67
+ const job = this.registry.getOrThrow(message.jobName);
68
+ const context = {
69
+ services: this.serviceResolver(),
70
+ jobId,
71
+ attemptNumber: 1,
72
+ enqueuedAt: new Date(),
73
+ };
74
+ await job.handler(message.payload, context);
75
+ }
45
76
  return result;
46
77
  }
47
78
  async enqueueAt(message, at) {
@@ -60,17 +91,5 @@ export class MockQueueDriver {
60
91
  }
61
92
  return result;
62
93
  }
63
- async receive(_options) {
64
- return this.enqueued.map(({ message }) => ({
65
- message,
66
- receiptHandle: message.jobId,
67
- }));
68
- }
69
- async ack(job) {
70
- this.acks.push(job);
71
- }
72
- async nack(job, error) {
73
- this.nacks.push({ job, error });
74
- }
75
94
  }
76
95
  //# sourceMappingURL=mock-driver.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mock-driver.js","sourceRoot":"","sources":["../../../src/jobs/drivers/mock-driver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mock-driver.js","sourceRoot":"","sources":["../../../src/jobs/drivers/mock-driver.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import type { SQSClient as SQSClientType } from '@aws-sdk/client-sqs';
2
- import type { Duration, EnqueueResult, JobMessage, QueueDriver, ReceivedJob, ReceiveOptions } from '../types.js';
2
+ import type { Duration, EnqueueResult, JobMessage, QueueDriver } from '../types.js';
3
+ import { type EventBridgeSchedulerConfig } from './eventbridge-scheduler-driver.js';
3
4
  export interface SQSDriverConfig {
4
5
  /** AWS region */
5
6
  region: string;
@@ -10,43 +11,49 @@ export interface SQSDriverConfig {
10
11
  /** Custom endpoint (for LocalStack) */
11
12
  endpoint?: string;
12
13
  /**
13
- * DynamoDB table for scheduled jobs (used when longDelayStrategy is "dynamodb").
14
- * Not required when using the default self-rescheduling strategy.
14
+ * EventBridge Scheduler configuration for delays over 15 minutes.
15
+ * Required when using enqueueAt or enqueueIn with delays exceeding SQS maximum.
15
16
  */
16
- schedulerTable?: string;
17
- /**
18
- * Strategy for delays over 15 minutes (SQS maximum).
19
- * - "self-reschedule" (default): the job re-enqueues itself in 15-minute slices until due.
20
- * - "dynamodb": store in DynamoDB and poll via the scheduler Lambda.
21
- */
22
- longDelayStrategy?: 'self-reschedule' | 'dynamodb';
17
+ scheduler?: EventBridgeSchedulerConfig;
23
18
  /** Optional pre-configured SQS client */
24
19
  client?: SQSClientType;
25
20
  }
26
21
  /**
27
- * AWS SQS queue driver (Phase 1: enqueue only).
22
+ * AWS SQS queue driver with EventBridge Scheduler support for long delays.
23
+ *
24
+ * For delays up to 15 minutes, uses native SQS delay.
25
+ * For delays over 15 minutes, uses EventBridge Scheduler to create a one-off
26
+ * schedule that sends the job to SQS at the specified time.
28
27
  */
29
28
  export declare class SQSQueueDriver implements QueueDriver {
30
29
  private readonly config;
31
30
  readonly name = "sqs";
31
+ readonly defaultQueue: string;
32
32
  private client;
33
- private schedulerClientPromise;
33
+ private schedulerDriver;
34
+ private disposed;
34
35
  constructor(config: SQSDriverConfig);
35
36
  /**
36
37
  * Lazily initialize the SQS client.
38
+ * @throws Error if the driver has been disposed
37
39
  */
38
40
  private getClient;
39
41
  enqueue(message: JobMessage): Promise<EnqueueResult>;
40
42
  enqueueAt(message: JobMessage, at: Date): Promise<EnqueueResult>;
41
43
  enqueueIn(message: JobMessage, delay: Duration): Promise<EnqueueResult>;
42
- receive(_options?: ReceiveOptions): Promise<ReceivedJob[]>;
43
- ack(_job: ReceivedJob): Promise<void>;
44
- nack(_job: ReceivedJob): Promise<void>;
44
+ /**
45
+ * Cancel a scheduled job. Only works for jobs scheduled with EventBridge Scheduler.
46
+ *
47
+ * @param scheduleName - The schedule name from the ScheduleResult
48
+ */
49
+ cancelSchedule(scheduleName: string): Promise<void>;
50
+ /**
51
+ * Dispose of the driver and release AWS SDK client resources.
52
+ * Call this when you're done using the driver to prevent memory leaks.
53
+ */
54
+ dispose(): Promise<void>;
45
55
  private getQueueUrl;
46
56
  private enqueueWithDelay;
47
- private scheduleLongDelay;
48
- private scheduleJobWithSelfReschedule;
49
- private scheduleJobWithDynamo;
50
- private getSchedulerClient;
57
+ private scheduleWithEventBridge;
51
58
  }
52
59
  //# sourceMappingURL=sqs-driver.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sqs-driver.d.ts","sourceRoot":"","sources":["../../../src/jobs/drivers/sqs-driver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,SAAS,IAAI,aAAa,EAC3B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EACV,QAAQ,EACR,aAAa,EACb,UAAU,EACV,WAAW,EACX,WAAW,EACX,cAAc,EACf,MAAM,aAAa,CAAC;AAMrB,MAAM,WAAW,eAAe;IAC9B,iBAAiB;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,4CAA4C;IAC5C,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,yBAAyB;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uCAAuC;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,iBAAiB,GAAG,UAAU,CAAC;IACnD,yCAAyC;IACzC,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED;;GAEG;AACH,qBAAa,cAAe,YAAW,WAAW;IAKpC,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJnC,QAAQ,CAAC,IAAI,SAAS;IACtB,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,sBAAsB,CAAiC;gBAElC,MAAM,EAAE,eAAe;IAMpD;;OAEG;YACW,SAAS;IAWjB,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC;IAqCpD,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC;IAWhE,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC;IASvE,OAAO,CAAC,QAAQ,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAI1D,GAAG,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrC,IAAI,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5C,OAAO,CAAC,WAAW;YASL,gBAAgB;YAyChB,iBAAiB;YASjB,6BAA6B;YAyB7B,qBAAqB;YAgCrB,kBAAkB;CAqBjC"}
1
+ {"version":3,"file":"sqs-driver.d.ts","sourceRoot":"","sources":["../../../src/jobs/drivers/sqs-driver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,SAAS,IAAI,aAAa,EAC3B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEpF,OAAO,EACL,KAAK,0BAA0B,EAGhC,MAAM,mCAAmC,CAAC;AAK3C,MAAM,WAAW,eAAe;IAC9B,iBAAiB;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,4CAA4C;IAC5C,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,yBAAyB;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uCAAuC;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,SAAS,CAAC,EAAE,0BAA0B,CAAC;IACvC,yCAAyC;IACzC,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED;;;;;;GAMG;AACH,qBAAa,cAAe,YAAW,WAAW;IAOpC,OAAO,CAAC,QAAQ,CAAC,MAAM;IANnC,QAAQ,CAAC,IAAI,SAAS;IACtB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,eAAe,CAA2C;IAClE,OAAO,CAAC,QAAQ,CAAS;gBAEI,MAAM,EAAE,eAAe;IAUpD;;;OAGG;YACW,SAAS;IAcjB,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC;IAqCpD,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC;IAWhE,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC;IAS7E;;;;OAIG;IACG,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOzD;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAW9B,OAAO,CAAC,WAAW;YASL,gBAAgB;YAyChB,uBAAuB;CAgBtC"}
@@ -1,23 +1,38 @@
1
- import { MAX_SQS_DELAY_SECONDS, RUN_AT_METADATA_KEY } from '../schedule-constants.js';
1
+ import { MAX_SQS_DELAY_SECONDS } from '../schedule-constants.js';
2
2
  import { durationToSeconds, generateJobId } from '../utils.js';
3
+ import { EventBridgeSchedulerDriver, } from './eventbridge-scheduler-driver.js';
3
4
  /**
4
- * AWS SQS queue driver (Phase 1: enqueue only).
5
+ * AWS SQS queue driver with EventBridge Scheduler support for long delays.
6
+ *
7
+ * For delays up to 15 minutes, uses native SQS delay.
8
+ * For delays over 15 minutes, uses EventBridge Scheduler to create a one-off
9
+ * schedule that sends the job to SQS at the specified time.
5
10
  */
6
11
  export class SQSQueueDriver {
7
12
  config;
8
13
  name = 'sqs';
14
+ defaultQueue;
9
15
  client = null;
10
- schedulerClientPromise = null;
16
+ schedulerDriver = null;
17
+ disposed = false;
11
18
  constructor(config) {
12
19
  this.config = config;
20
+ this.defaultQueue = config.defaultQueue ?? 'default';
13
21
  if (config.client) {
14
22
  this.client = config.client;
15
23
  }
24
+ if (config.scheduler) {
25
+ this.schedulerDriver = new EventBridgeSchedulerDriver(config.scheduler);
26
+ }
16
27
  }
17
28
  /**
18
29
  * Lazily initialize the SQS client.
30
+ * @throws Error if the driver has been disposed
19
31
  */
20
32
  async getClient() {
33
+ if (this.disposed) {
34
+ throw new Error('SQSQueueDriver has been disposed');
35
+ }
21
36
  if (!this.client) {
22
37
  const { SQSClient } = await import('@aws-sdk/client-sqs');
23
38
  this.client = new SQSClient({
@@ -68,7 +83,7 @@ export class SQSQueueDriver {
68
83
  if (delaySeconds <= MAX_SQS_DELAY_SECONDS) {
69
84
  return this.enqueueWithDelay(message, delaySeconds);
70
85
  }
71
- return this.scheduleLongDelay(message, at);
86
+ return this.scheduleWithEventBridge(message, at);
72
87
  }
73
88
  async enqueueIn(message, delay) {
74
89
  const delaySeconds = durationToSeconds(delay);
@@ -76,19 +91,35 @@ export class SQSQueueDriver {
76
91
  return this.enqueueWithDelay(message, delaySeconds);
77
92
  }
78
93
  const at = new Date(Date.now() + delaySeconds * 1000);
79
- return this.scheduleLongDelay(message, at);
94
+ return this.scheduleWithEventBridge(message, at);
80
95
  }
81
- async receive(_options) {
82
- throw new Error('receive is not implemented for SQS driver');
83
- }
84
- async ack(_job) {
85
- throw new Error('ack is not implemented for SQS driver');
96
+ /**
97
+ * Cancel a scheduled job. Only works for jobs scheduled with EventBridge Scheduler.
98
+ *
99
+ * @param scheduleName - The schedule name from the ScheduleResult
100
+ */
101
+ async cancelSchedule(scheduleName) {
102
+ if (!this.schedulerDriver) {
103
+ throw new Error('EventBridge Scheduler is not configured');
104
+ }
105
+ await this.schedulerDriver.cancel(scheduleName);
86
106
  }
87
- async nack(_job) {
88
- throw new Error('nack is not implemented for SQS driver');
107
+ /**
108
+ * Dispose of the driver and release AWS SDK client resources.
109
+ * Call this when you're done using the driver to prevent memory leaks.
110
+ */
111
+ async dispose() {
112
+ this.disposed = true;
113
+ if (this.client) {
114
+ this.client.destroy();
115
+ this.client = null;
116
+ }
117
+ if (this.schedulerDriver) {
118
+ await this.schedulerDriver.dispose();
119
+ }
89
120
  }
90
121
  getQueueUrl(queue) {
91
- const queueName = queue ?? this.config.defaultQueue ?? 'default';
122
+ const queueName = queue ?? this.defaultQueue;
92
123
  const queueUrl = this.config.queues[queueName];
93
124
  if (!queueUrl) {
94
125
  throw new Error(`Queue "${queueName}" is not configured for SQS driver`);
@@ -129,63 +160,17 @@ export class SQSQueueDriver {
129
160
  jobId,
130
161
  };
131
162
  }
132
- async scheduleLongDelay(message, at) {
133
- const strategy = this.config.longDelayStrategy ?? 'self-reschedule';
134
- if (strategy === 'dynamodb') {
135
- return this.scheduleJobWithDynamo(message, at);
136
- }
137
- return this.scheduleJobWithSelfReschedule(message, at);
138
- }
139
- async scheduleJobWithSelfReschedule(message, at) {
140
- const jobId = message.jobId ?? generateJobId();
141
- const metadata = {
142
- ...message.metadata,
143
- [RUN_AT_METADATA_KEY]: at.toISOString(),
144
- };
145
- const delaySeconds = Math.max(1, Math.min(MAX_SQS_DELAY_SECONDS, Math.floor((at.getTime() - Date.now()) / 1000)));
146
- return this.enqueueWithDelay({
147
- ...message,
148
- jobId,
149
- metadata,
150
- }, delaySeconds);
151
- }
152
- async scheduleJobWithDynamo(message, at) {
153
- if (!this.config.schedulerTable) {
154
- throw new Error('schedulerTable is required for delays over 15 minutes when using dynamodb');
155
- }
156
- const { PutItemCommand } = await import('@aws-sdk/client-dynamodb');
157
- const ddb = await this.getSchedulerClient();
158
- const jobId = message.jobId ?? generateJobId();
159
- const partition = `SCHEDULED#${at.toISOString().slice(0, 16)}`;
160
- await ddb.send(new PutItemCommand({
161
- TableName: this.config.schedulerTable,
162
- Item: {
163
- pk: { S: partition },
164
- sk: { S: jobId },
165
- jobName: { S: message.jobName },
166
- payload: { S: JSON.stringify(message.payload) },
167
- queue: { S: message.queue ?? this.config.defaultQueue ?? 'default' },
168
- scheduledAt: { S: at.toISOString() },
169
- ttl: { N: String(Math.floor(at.getTime() / 1000) + 86400) },
170
- },
171
- }));
172
- return {
173
- messageId: jobId,
174
- jobId,
175
- };
176
- }
177
- async getSchedulerClient() {
178
- if (this.schedulerClientPromise) {
179
- return (await this.schedulerClientPromise);
163
+ async scheduleWithEventBridge(message, at) {
164
+ if (!this.schedulerDriver) {
165
+ throw new Error('EventBridge Scheduler configuration is required for delays over 15 minutes. ' +
166
+ 'Configure the `scheduler` option in SQSDriverConfig.');
180
167
  }
181
- this.schedulerClientPromise = (async () => {
182
- const { DynamoDBClient } = await import('@aws-sdk/client-dynamodb');
183
- return new DynamoDBClient({
184
- region: this.config.region,
185
- ...(this.config.endpoint && { endpoint: this.config.endpoint }),
186
- });
187
- })();
188
- return (await this.schedulerClientPromise);
168
+ const queueUrl = this.getQueueUrl(message.queue);
169
+ return this.schedulerDriver.scheduleAt({
170
+ queueUrl,
171
+ message,
172
+ scheduledAt: at,
173
+ });
189
174
  }
190
175
  }
191
176
  //# sourceMappingURL=sqs-driver.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sqs-driver.js","sourceRoot":"","sources":["../../../src/jobs/drivers/sqs-driver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sqs-driver.js","sourceRoot":"","sources":["../../../src/jobs/drivers/sqs-driver.ts"],"names":[],"mappings":"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"}
@@ -30,11 +30,15 @@ export declare class TransientJobError extends Error {
30
30
  constructor(message: string, retryAfter?: import('./types.js').Duration);
31
31
  }
32
32
  /**
33
- * Thrown when attempting to enqueue a duplicate job (uniqueness constraint).
33
+ * Thrown internally when a job has exhausted all retry attempts.
34
+ * This triggers the onJobDeadLetter hook and indicates the job
35
+ * should be moved to the dead letter queue.
34
36
  */
35
- export declare class DuplicateJobError extends Error {
37
+ export declare class RetryExhaustedError extends Error {
36
38
  readonly jobName: string;
37
- readonly dedupeKey: string;
38
- constructor(jobName: string, dedupeKey: string);
39
+ readonly attemptNumber: number;
40
+ readonly maxAttempts: number;
41
+ readonly cause: Error;
42
+ constructor(jobName: string, attemptNumber: number, maxAttempts: number, cause: Error);
39
43
  }
40
44
  //# sourceMappingURL=errors.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/jobs/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;gBAC9B,OAAO,EAAE,MAAM;CAI5B;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;gBAEb,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAUhD;AAED;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;gBAE1B,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE;CAM1D;AAED;;;GAGG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,YAAY,EAAE,QAAQ,CAAC;gBAExC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,YAAY,EAAE,QAAQ;CAKxE;AAED;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;gBAEf,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;CAM/C"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/jobs/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;gBAC9B,OAAO,EAAE,MAAM;CAI5B;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;gBAEb,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAUhD;AAED;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;gBAE1B,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE;CAM1D;AAED;;;GAGG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,YAAY,EAAE,QAAQ,CAAC;gBAExC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,YAAY,EAAE,QAAQ;CAKxE;AAED;;;;GAIG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;gBAEV,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK;CAQtF"}