@researchdatabox/agenda-sqs-backend 0.0.1-beta.10173

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/README.md ADDED
@@ -0,0 +1,51 @@
1
+ # @researchdatabox/agenda-sqs-backend
2
+
3
+ Amazon SQS backend for `agenda`.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ pnpm add @researchdatabox/agenda-sqs-backend
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ```ts
14
+ import { Agenda } from 'agenda';
15
+ import { SqsBackend } from '@researchdatabox/agenda-sqs-backend';
16
+
17
+ const agenda = new Agenda({
18
+ backend: new SqsBackend({
19
+ queueUrl: 'https://sqs.ap-southeast-2.amazonaws.com/123456789012/jobs',
20
+ region: 'ap-southeast-2'
21
+ })
22
+ });
23
+
24
+ agenda.define('send-email', async job => {
25
+ console.log(job.attrs.data);
26
+ });
27
+
28
+ await agenda.start();
29
+ await agenda.now('send-email', { userId: 'u1' });
30
+ ```
31
+
32
+ ## Notes
33
+
34
+ - This backend is queue-only.
35
+ - It does not support recurring jobs, `every()`, unique jobs, or query-style job browsing.
36
+ - SQS scheduling is limited to 15 minutes of delay.
37
+ - Redrive and retries are handled by SQS visibility and your queue redrive policy.
38
+ - FIFO queues are supported when the queue URL ends with `.fifo` or FIFO is enabled in config.
39
+
40
+ ## Configuration
41
+
42
+ ```ts
43
+ new SqsBackend({
44
+ queueUrl,
45
+ region,
46
+ waitTimeSeconds: 20,
47
+ receiveBatchSize: 10,
48
+ visibilityTimeoutSeconds: 300,
49
+ unknownJobPolicy: 'release'
50
+ });
51
+ ```
@@ -0,0 +1,15 @@
1
+ import type { AgendaBackend, JobRepository } from 'agenda';
2
+ import type { SqsBackendConfig } from './types.js';
3
+ export declare class SqsBackend implements AgendaBackend {
4
+ private readonly config;
5
+ readonly name = "SQS";
6
+ readonly repository: JobRepository;
7
+ readonly ownsConnection = true;
8
+ private readonly client;
9
+ private readonly ownsClient;
10
+ private readonly repositoryImpl;
11
+ constructor(config: SqsBackendConfig);
12
+ connect(): Promise<void>;
13
+ disconnect(): Promise<void>;
14
+ }
15
+ //# sourceMappingURL=SqsBackend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SqsBackend.d.ts","sourceRoot":"","sources":["../src/SqsBackend.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAE3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAInD,qBAAa,UAAW,YAAW,aAAa;IASnC,OAAO,CAAC,QAAQ,CAAC,MAAM;IARnC,QAAQ,CAAC,IAAI,SAAS;IACtB,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC;IACnC,QAAQ,CAAC,cAAc,QAAQ;IAE/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAU;IACrC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAmB;gBAErB,MAAM,EAAE,gBAAgB;IAO/C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAMxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAOjC"}
@@ -0,0 +1,33 @@
1
+ import debug from 'debug';
2
+ import { SQSClient, GetQueueAttributesCommand } from '@aws-sdk/client-sqs';
3
+ import { SqsJobRepository } from './SqsJobRepository.js';
4
+ const log = debug('agenda:sqs:backend');
5
+ export class SqsBackend {
6
+ config;
7
+ name = 'SQS';
8
+ repository;
9
+ ownsConnection = true;
10
+ client;
11
+ ownsClient;
12
+ repositoryImpl;
13
+ constructor(config) {
14
+ this.config = config;
15
+ this.ownsClient = !config.sqsClient;
16
+ this.client = config.sqsClient ?? new SQSClient({ region: config.region });
17
+ this.repositoryImpl = new SqsJobRepository(this.client, config);
18
+ this.repository = this.repositoryImpl;
19
+ }
20
+ async connect() {
21
+ log('connecting');
22
+ await this.client.send(new GetQueueAttributesCommand({ QueueUrl: this.config.queueUrl, AttributeNames: ['QueueArn'] }));
23
+ await this.repositoryImpl.connect();
24
+ }
25
+ async disconnect() {
26
+ log('disconnecting');
27
+ await this.repositoryImpl.disconnect();
28
+ if (this.ownsClient) {
29
+ this.client.destroy();
30
+ }
31
+ }
32
+ }
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3FzQmFja2VuZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9TcXNCYWNrZW5kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUUsU0FBUyxFQUFFLHlCQUF5QixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFM0UsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFHekQsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUM7QUFFeEMsTUFBTSxPQUFPLFVBQVU7SUFTTztJQVJwQixJQUFJLEdBQUcsS0FBSyxDQUFDO0lBQ2IsVUFBVSxDQUFnQjtJQUMxQixjQUFjLEdBQUcsSUFBSSxDQUFDO0lBRWQsTUFBTSxDQUFZO0lBQ2xCLFVBQVUsQ0FBVTtJQUNwQixjQUFjLENBQW1CO0lBRWxELFlBQTZCLE1BQXdCO1FBQXhCLFdBQU0sR0FBTixNQUFNLENBQWtCO1FBQ3BELElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLFNBQVMsSUFBSSxJQUFJLFNBQVMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUMzRSxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNoRSxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDdkMsQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFPO1FBQ1osR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2xCLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSx5QkFBeUIsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxjQUFjLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN4SCxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDckMsQ0FBQztJQUVELEtBQUssQ0FBQyxVQUFVO1FBQ2YsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3JCLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN2QyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3ZCLENBQUM7SUFDRixDQUFDO0NBQ0QifQ==
@@ -0,0 +1,41 @@
1
+ import { SQSClient } from '@aws-sdk/client-sqs';
2
+ import type { JobParameters, JobRepository, JobRepositoryOptions, JobsOverview, JobsQueryOptions, JobsResult, RemoveJobsOptions } from 'agenda';
3
+ import type { SqsBackendConfig } from './types.js';
4
+ export declare class SqsJobRepository implements JobRepository {
5
+ private readonly client;
6
+ private readonly codec;
7
+ private readonly queueUrl;
8
+ private readonly waitTimeSeconds;
9
+ private readonly receiveBatchSize;
10
+ private readonly visibilityTimeoutSeconds;
11
+ private readonly unknownJobPolicy;
12
+ private readonly fifoEnabled;
13
+ private readonly fifoConfig;
14
+ private readonly messageBuffer;
15
+ constructor(client: SQSClient, config: SqsBackendConfig);
16
+ connect(): Promise<void>;
17
+ disconnect(): Promise<void>;
18
+ private bufferJob;
19
+ private validateJob;
20
+ private encodeBody;
21
+ private send;
22
+ private buildFifo;
23
+ saveJob<DATA = unknown>(job: JobParameters<DATA>, options: JobRepositoryOptions | undefined): Promise<JobParameters<DATA>>;
24
+ saveJobState(job: JobParameters, _options: JobRepositoryOptions | undefined): Promise<void>;
25
+ getNextJobToRun(jobName: string, _nextScanAt: Date, _lockDeadline: Date, _now: Date | undefined, _options: JobRepositoryOptions | undefined): Promise<JobParameters | undefined>;
26
+ private toJob;
27
+ unlockJob(job: JobParameters): Promise<void>;
28
+ unlockJobs(jobIds: (string | JobParameters['_id'])[]): Promise<void>;
29
+ private release;
30
+ queryJobs(_options?: JobsQueryOptions): Promise<JobsResult>;
31
+ getJobsOverview(): Promise<JobsOverview[]>;
32
+ getDistinctJobNames(): Promise<string[]>;
33
+ getJobById(_id: string): Promise<JobParameters | null>;
34
+ getQueueSize(): Promise<number>;
35
+ removeJobs(_options: RemoveJobsOptions): Promise<number>;
36
+ lockJob(): Promise<JobParameters | undefined>;
37
+ disableJobs(_options: RemoveJobsOptions): Promise<number>;
38
+ enableJobs(_options: RemoveJobsOptions): Promise<number>;
39
+ purgeAllJobs(): Promise<number>;
40
+ }
41
+ //# sourceMappingURL=SqsJobRepository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SqsJobRepository.d.ts","sourceRoot":"","sources":["../src/SqsJobRepository.ts"],"names":[],"mappings":"AAEA,OAAO,EAKN,SAAS,EACT,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EACX,aAAa,EACb,aAAa,EACb,oBAAoB,EACpB,YAAY,EACZ,gBAAgB,EAChB,UAAU,EACV,iBAAiB,EACjB,MAAM,QAAQ,CAAC;AAIhB,OAAO,KAAK,EAAE,gBAAgB,EAAsC,MAAM,YAAY,CAAC;AAIvF,qBAAa,gBAAiB,YAAW,aAAa;IAWzC,OAAO,CAAC,QAAQ,CAAC,MAAM;IAVnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAyB;IAC/C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAS;IAClD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAoD;IACrF,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAU;IACtC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA2B;IACtD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAsC;gBAEvC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB;IAUlE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IACxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBjC,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,UAAU;YAIJ,IAAI;IAalB,OAAO,CAAC,SAAS;IAiBX,OAAO,CAAC,IAAI,GAAG,OAAO,EAC3B,GAAG,EAAE,aAAa,CAAC,IAAI,CAAC,EACxB,OAAO,EAAE,oBAAoB,GAAG,SAAS,GACvC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAkBzB,YAAY,CAAC,GAAG,EAAE,aAAa,EAAE,QAAQ,EAAE,oBAAoB,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAyB3F,eAAe,CACpB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,IAAI,EACjB,aAAa,EAAE,IAAI,EACnB,IAAI,EAAE,IAAI,GAAG,SAAS,EACtB,QAAQ,EAAE,oBAAoB,GAAG,SAAS,GACxC,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IAsCrC,OAAO,CAAC,KAAK;IAeP,SAAS,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAM5C,UAAU,CAAC,MAAM,EAAE,CAAC,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;YAU5D,OAAO;IAYf,SAAS,CAAC,QAAQ,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC;IAG3D,eAAe,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAG1C,mBAAmB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAGxC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAGtD,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IAG/B,UAAU,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;IAGxD,OAAO,IAAI,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IAG7C,WAAW,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;IAGzD,UAAU,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;IAGxD,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;CAGrC"}
@@ -0,0 +1,245 @@
1
+ import crypto from 'crypto';
2
+ import debug from 'debug';
3
+ import { ChangeMessageVisibilityCommand, DeleteMessageCommand, ReceiveMessageCommand, SendMessageCommand } from '@aws-sdk/client-sqs';
4
+ import { toJobId } from 'agenda';
5
+ import { SqsUnsupportedFeatureError } from './errors.js';
6
+ import { SqsMessageCodec, getSqsMetadata, setSqsMetadata } from './SqsMessageCodec.js';
7
+ const log = debug('agenda:sqs:repository');
8
+ export class SqsJobRepository {
9
+ client;
10
+ codec = new SqsMessageCodec();
11
+ queueUrl;
12
+ waitTimeSeconds;
13
+ receiveBatchSize;
14
+ visibilityTimeoutSeconds;
15
+ unknownJobPolicy;
16
+ fifoEnabled;
17
+ fifoConfig;
18
+ messageBuffer = new Map();
19
+ constructor(client, config) {
20
+ this.client = client;
21
+ this.queueUrl = config.queueUrl;
22
+ this.waitTimeSeconds = config.waitTimeSeconds ?? 20;
23
+ this.receiveBatchSize = config.receiveBatchSize ?? 10;
24
+ this.visibilityTimeoutSeconds = config.visibilityTimeoutSeconds ?? 300;
25
+ this.unknownJobPolicy = config.unknownJobPolicy ?? 'release';
26
+ this.fifoEnabled = config.fifo?.enabled ?? config.queueUrl.endsWith('.fifo');
27
+ this.fifoConfig = config.fifo;
28
+ }
29
+ async connect() { }
30
+ async disconnect() {
31
+ const releasePromises = [];
32
+ for (const buffered of this.messageBuffer.values()) {
33
+ for (const job of buffered) {
34
+ releasePromises.push(this.release(job));
35
+ }
36
+ }
37
+ const results = await Promise.allSettled(releasePromises);
38
+ for (const result of results) {
39
+ if (result.status === 'rejected') {
40
+ log('failed to release buffered message %O', result.reason);
41
+ }
42
+ }
43
+ this.messageBuffer.clear();
44
+ }
45
+ bufferJob(job) {
46
+ const existing = this.messageBuffer.get(job.name) ?? [];
47
+ existing.push(job);
48
+ this.messageBuffer.set(job.name, existing);
49
+ }
50
+ validateJob(job) {
51
+ if (job.type === 'single')
52
+ throw new SqsUnsupportedFeatureError('single jobs');
53
+ if (job.repeatInterval)
54
+ throw new SqsUnsupportedFeatureError('repeatInterval');
55
+ if (job.repeatAt)
56
+ throw new SqsUnsupportedFeatureError('repeatAt');
57
+ if (job.unique)
58
+ throw new SqsUnsupportedFeatureError('unique jobs');
59
+ if (job.uniqueOpts)
60
+ throw new SqsUnsupportedFeatureError('uniqueOpts');
61
+ if (job.disabled)
62
+ throw new SqsUnsupportedFeatureError('disabled jobs');
63
+ if (job.fork)
64
+ throw new SqsUnsupportedFeatureError('fork mode');
65
+ if ((job.priority ?? 0) !== 0)
66
+ throw new SqsUnsupportedFeatureError('non-zero priority');
67
+ }
68
+ encodeBody(job) {
69
+ return this.codec.encode(job);
70
+ }
71
+ async send(body, delaySeconds) {
72
+ const payload = JSON.stringify(body);
73
+ const fifo = this.fifoEnabled ? this.buildFifo(body, payload) : {};
74
+ await this.client.send(new SendMessageCommand({
75
+ QueueUrl: this.queueUrl,
76
+ MessageBody: payload,
77
+ DelaySeconds: delaySeconds,
78
+ ...fifo
79
+ }));
80
+ }
81
+ buildFifo(body, payload) {
82
+ const groupId = typeof this.fifoConfig?.messageGroupId === 'function'
83
+ ? this.fifoConfig.messageGroupId(body)
84
+ : this.fifoConfig?.messageGroupId || 'agenda';
85
+ const deduplicationId = typeof this.fifoConfig?.deduplicationIdStrategy === 'function'
86
+ ? this.fifoConfig.deduplicationIdStrategy(body)
87
+ : this.fifoConfig?.deduplicationIdStrategy === 'content'
88
+ ? crypto.createHash('sha256').update(payload).digest('hex')
89
+ : body.id;
90
+ return {
91
+ MessageGroupId: groupId,
92
+ MessageDeduplicationId: deduplicationId
93
+ };
94
+ }
95
+ async saveJob(job, options) {
96
+ this.validateJob(job);
97
+ const now = new Date();
98
+ const id = job._id?.toString() || crypto.randomUUID();
99
+ const nextRunAt = job.nextRunAt ?? now;
100
+ const delaySeconds = Math.max(0, Math.ceil((nextRunAt.getTime() - now.getTime()) / 1000));
101
+ if (delaySeconds > 900)
102
+ throw new SqsUnsupportedFeatureError('schedule delays greater than 15 minutes');
103
+ const saved = {
104
+ ...job,
105
+ _id: toJobId(id),
106
+ nextRunAt,
107
+ lastModifiedBy: options?.lastModifiedBy
108
+ };
109
+ await this.send(this.encodeBody(saved), delaySeconds);
110
+ return saved;
111
+ }
112
+ async saveJobState(job, _options) {
113
+ const meta = getSqsMetadata(job);
114
+ if (!meta?.receiptHandle)
115
+ return;
116
+ if (job.lastFinishedAt && !job.failedAt) {
117
+ await this.client.send(new DeleteMessageCommand({ QueueUrl: this.queueUrl, ReceiptHandle: meta.receiptHandle }));
118
+ return;
119
+ }
120
+ if (job.lockedAt) {
121
+ await this.client.send(new ChangeMessageVisibilityCommand({
122
+ QueueUrl: this.queueUrl,
123
+ ReceiptHandle: meta.receiptHandle,
124
+ VisibilityTimeout: this.visibilityTimeoutSeconds
125
+ }));
126
+ return;
127
+ }
128
+ if (job.nextRunAt && job.nextRunAt.getTime() > Date.now()) {
129
+ const delay = Math.min(43200, Math.ceil((job.nextRunAt.getTime() - Date.now()) / 1000));
130
+ await this.client.send(new ChangeMessageVisibilityCommand({
131
+ QueueUrl: this.queueUrl,
132
+ ReceiptHandle: meta.receiptHandle,
133
+ VisibilityTimeout: delay
134
+ }));
135
+ }
136
+ }
137
+ async getNextJobToRun(jobName, _nextScanAt, _lockDeadline, _now, _options) {
138
+ const buffered = this.messageBuffer.get(jobName);
139
+ if (buffered?.length) {
140
+ return buffered.shift();
141
+ }
142
+ const response = await this.client.send(new ReceiveMessageCommand({
143
+ QueueUrl: this.queueUrl,
144
+ MaxNumberOfMessages: this.receiveBatchSize,
145
+ WaitTimeSeconds: this.waitTimeSeconds,
146
+ VisibilityTimeout: this.visibilityTimeoutSeconds,
147
+ MessageSystemAttributeNames: ['ApproximateReceiveCount'],
148
+ MessageAttributeNames: ['All']
149
+ }));
150
+ let matchedJob;
151
+ for (const message of response.Messages ?? []) {
152
+ if (!message.Body)
153
+ continue;
154
+ try {
155
+ const envelope = this.codec.decode(message.Body);
156
+ const metadata = {
157
+ messageId: message.MessageId,
158
+ receiptHandle: message.ReceiptHandle,
159
+ receiveCount: Number(message.Attributes?.ApproximateReceiveCount ?? '1')
160
+ };
161
+ const job = this.toJob(envelope, metadata);
162
+ if (job.name === jobName && !matchedJob) {
163
+ matchedJob = job;
164
+ continue;
165
+ }
166
+ this.bufferJob(job);
167
+ }
168
+ catch (error) {
169
+ log('dropping malformed message %O', error);
170
+ }
171
+ }
172
+ return matchedJob;
173
+ }
174
+ toJob(envelope, metadata) {
175
+ const job = {
176
+ _id: toJobId(envelope.id),
177
+ name: envelope.name,
178
+ priority: envelope.priority,
179
+ nextRunAt: new Date(),
180
+ type: 'normal',
181
+ lockedAt: new Date(),
182
+ failCount: Math.max((metadata.receiveCount ?? 1) - 1, 0),
183
+ data: envelope.data
184
+ };
185
+ setSqsMetadata(job, metadata);
186
+ return job;
187
+ }
188
+ async unlockJob(job) {
189
+ const meta = getSqsMetadata(job);
190
+ if (!meta?.receiptHandle)
191
+ return;
192
+ await this.release(job);
193
+ }
194
+ async unlockJobs(jobIds) {
195
+ for (const id of jobIds) {
196
+ const flattened = String(id);
197
+ for (const jobs of this.messageBuffer.values()) {
198
+ const match = jobs.find(job => job._id?.toString() === flattened);
199
+ if (match)
200
+ await this.unlockJob(match);
201
+ }
202
+ }
203
+ }
204
+ async release(job) {
205
+ const meta = getSqsMetadata(job);
206
+ if (!meta?.receiptHandle)
207
+ return;
208
+ await this.client.send(new ChangeMessageVisibilityCommand({
209
+ QueueUrl: this.queueUrl,
210
+ ReceiptHandle: meta.receiptHandle,
211
+ VisibilityTimeout: 0
212
+ }));
213
+ }
214
+ async queryJobs(_options) {
215
+ throw new SqsUnsupportedFeatureError('queryJobs');
216
+ }
217
+ async getJobsOverview() {
218
+ throw new SqsUnsupportedFeatureError('getJobsOverview');
219
+ }
220
+ async getDistinctJobNames() {
221
+ throw new SqsUnsupportedFeatureError('getDistinctJobNames');
222
+ }
223
+ async getJobById(_id) {
224
+ throw new SqsUnsupportedFeatureError('getJobById');
225
+ }
226
+ async getQueueSize() {
227
+ return 0;
228
+ }
229
+ async removeJobs(_options) {
230
+ throw new SqsUnsupportedFeatureError('removeJobs');
231
+ }
232
+ async lockJob() {
233
+ throw new SqsUnsupportedFeatureError('lockJob');
234
+ }
235
+ async disableJobs(_options) {
236
+ throw new SqsUnsupportedFeatureError('disableJobs');
237
+ }
238
+ async enableJobs(_options) {
239
+ throw new SqsUnsupportedFeatureError('enableJobs');
240
+ }
241
+ async purgeAllJobs() {
242
+ throw new SqsUnsupportedFeatureError('purgeAllJobs');
243
+ }
244
+ }
245
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3FzSm9iUmVwb3NpdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9TcXNKb2JSZXBvc2l0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUNOLDhCQUE4QixFQUM5QixvQkFBb0IsRUFDcEIscUJBQXFCLEVBQ3JCLGtCQUFrQixFQUVsQixNQUFNLHFCQUFxQixDQUFDO0FBVTdCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDakMsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pELE9BQU8sRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBR3ZGLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0FBRTNDLE1BQU0sT0FBTyxnQkFBZ0I7SUFXQztJQVZaLEtBQUssR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO0lBQzlCLFFBQVEsQ0FBUztJQUNqQixlQUFlLENBQVM7SUFDeEIsZ0JBQWdCLENBQVM7SUFDekIsd0JBQXdCLENBQVM7SUFDakMsZ0JBQWdCLENBQW9EO0lBQ3BFLFdBQVcsQ0FBVTtJQUNyQixVQUFVLENBQTJCO0lBQ3JDLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBMkIsQ0FBQztJQUVwRSxZQUE2QixNQUFpQixFQUFFLE1BQXdCO1FBQTNDLFdBQU0sR0FBTixNQUFNLENBQVc7UUFDN0MsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxlQUFlLEdBQUcsTUFBTSxDQUFDLGVBQWUsSUFBSSxFQUFFLENBQUM7UUFDcEQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsSUFBSSxFQUFFLENBQUM7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
@@ -0,0 +1,11 @@
1
+ import type { JobParameters } from 'agenda';
2
+ import type { SqsJobEnvelope, SqsJobEnvelopeWithMeta, SqsRuntimeMetadata } from './types.js';
3
+ export declare const SQS_METADATA: unique symbol;
4
+ export declare function getSqsMetadata(job: JobParameters): SqsRuntimeMetadata | undefined;
5
+ export declare function setSqsMetadata(job: JobParameters, metadata: SqsRuntimeMetadata): void;
6
+ export declare function clearSqsMetadata(job: JobParameters): void;
7
+ export declare class SqsMessageCodec {
8
+ encode(job: JobParameters, queuedAt?: Date): SqsJobEnvelope;
9
+ decode(messageBody: string): SqsJobEnvelopeWithMeta;
10
+ }
11
+ //# sourceMappingURL=SqsMessageCodec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SqsMessageCodec.d.ts","sourceRoot":"","sources":["../src/SqsMessageCodec.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAuB7F,eAAO,MAAM,YAAY,eAAgC,CAAC;AAE1D,wBAAgB,cAAc,CAAC,GAAG,EAAE,aAAa,GAAG,kBAAkB,GAAG,SAAS,CAEjF;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,aAAa,EAAE,QAAQ,EAAE,kBAAkB,GAAG,IAAI,CAErF;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI,CAEzD;AAED,qBAAa,eAAe;IAC3B,MAAM,CAAC,GAAG,EAAE,aAAa,EAAE,QAAQ,OAAa,GAAG,cAAc;IAajE,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,sBAAsB;CAiCnD"}
@@ -0,0 +1,76 @@
1
+ import crypto from 'crypto';
2
+ function isRecord(value) {
3
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
4
+ }
5
+ function normalizeTimestamp(value, fieldName) {
6
+ if (typeof value === 'string' && Number.isFinite(Date.parse(value))) {
7
+ return value;
8
+ }
9
+ if (typeof value === 'number' && Number.isFinite(value) && Number.isFinite(new Date(value).getTime())) {
10
+ return new Date(value).toISOString();
11
+ }
12
+ throw new Error(`Invalid SQS job envelope: ${fieldName} must be a valid timestamp`);
13
+ }
14
+ function normalizeOptionalTimestamp(value, fieldName) {
15
+ if (value === null || value === undefined) {
16
+ return null;
17
+ }
18
+ return normalizeTimestamp(value, fieldName);
19
+ }
20
+ export const SQS_METADATA = Symbol('agenda:sqs-metadata');
21
+ export function getSqsMetadata(job) {
22
+ return job[SQS_METADATA];
23
+ }
24
+ export function setSqsMetadata(job, metadata) {
25
+ job[SQS_METADATA] = metadata;
26
+ }
27
+ export function clearSqsMetadata(job) {
28
+ delete job[SQS_METADATA];
29
+ }
30
+ export class SqsMessageCodec {
31
+ encode(job, queuedAt = new Date()) {
32
+ return {
33
+ backend: 'sqs',
34
+ id: job._id?.toString() || crypto.randomUUID(),
35
+ name: job.name,
36
+ data: job.data,
37
+ priority: job.priority ?? 0,
38
+ type: 'normal',
39
+ queuedAt: queuedAt.toISOString(),
40
+ scheduledAt: job.nextRunAt ? job.nextRunAt.toISOString() : null
41
+ };
42
+ }
43
+ decode(messageBody) {
44
+ let parsed;
45
+ try {
46
+ parsed = JSON.parse(messageBody);
47
+ }
48
+ catch {
49
+ throw new Error(`Invalid JSON in SQS message: ${messageBody}`);
50
+ }
51
+ if (!isRecord(parsed)) {
52
+ throw new Error('Invalid SQS job envelope: message must be a JSON object');
53
+ }
54
+ if (parsed.backend !== 'sqs') {
55
+ throw new Error('Invalid SQS job envelope: backend must be "sqs"');
56
+ }
57
+ if (typeof parsed.id !== 'string' || parsed.id.length === 0) {
58
+ throw new Error('Invalid SQS job envelope: id must be a non-empty string');
59
+ }
60
+ if (typeof parsed.name !== 'string' || parsed.name.length === 0) {
61
+ throw new Error('Invalid SQS job envelope: name must be a non-empty string');
62
+ }
63
+ if (typeof parsed.priority !== 'number' || !Number.isFinite(parsed.priority)) {
64
+ throw new Error('Invalid SQS job envelope: priority must be a finite number');
65
+ }
66
+ if (parsed.type !== 'normal') {
67
+ throw new Error('Invalid SQS job envelope: type must be "normal"');
68
+ }
69
+ return {
70
+ ...parsed,
71
+ queuedAt: normalizeTimestamp(parsed.queuedAt, 'queuedAt'),
72
+ scheduledAt: normalizeOptionalTimestamp(parsed.scheduledAt, 'scheduledAt')
73
+ };
74
+ }
75
+ }
76
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3FzTWVzc2FnZUNvZGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1Nxc01lc3NhZ2VDb2RlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFJNUIsU0FBUyxRQUFRLENBQUMsS0FBYztJQUMvQixPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM3RSxDQUFDO0FBRUQsU0FBUyxrQkFBa0IsQ0FBQyxLQUFjLEVBQUUsU0FBaUI7SUFDNUQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNyRSxPQUFPLEtBQUssQ0FBQztJQUNkLENBQUM7SUFDRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3ZHLE9BQU8sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDdEMsQ0FBQztJQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLFNBQVMsNEJBQTRCLENBQUMsQ0FBQztBQUNyRixDQUFDO0FBRUQsU0FBUywwQkFBMEIsQ0FBQyxLQUFjLEVBQUUsU0FBaUI7SUFDcEUsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUMzQyxPQUFPLElBQUksQ0FBQztJQUNiLENBQUM7SUFDRCxPQUFPLGtCQUFrQixDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FB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
@@ -0,0 +1,4 @@
1
+ export declare class SqsUnsupportedFeatureError extends Error {
2
+ constructor(feature: string);
3
+ }
4
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,0BAA2B,SAAQ,KAAK;gBACxC,OAAO,EAAE,MAAM;CAI3B"}
package/dist/errors.js ADDED
@@ -0,0 +1,7 @@
1
+ export class SqsUnsupportedFeatureError extends Error {
2
+ constructor(feature) {
3
+ super(`SQS backend does not support ${feature}`);
4
+ this.name = 'SqsUnsupportedFeatureError';
5
+ }
6
+ }
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8sMEJBQTJCLFNBQVEsS0FBSztJQUNwRCxZQUFZLE9BQWU7UUFDMUIsS0FBSyxDQUFDLGdDQUFnQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxJQUFJLEdBQUcsNEJBQTRCLENBQUM7SUFDMUMsQ0FBQztDQUNEIn0=
@@ -0,0 +1,6 @@
1
+ export { SqsBackend } from './SqsBackend.js';
2
+ export { SqsJobRepository } from './SqsJobRepository.js';
3
+ export { SqsMessageCodec, SQS_METADATA } from './SqsMessageCodec.js';
4
+ export { SqsUnsupportedFeatureError } from './errors.js';
5
+ export type { SqsBackendConfig, SqsFifoConfig, SqsJobEnvelope, SqsRuntimeMetadata } from './types.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AACzD,YAAY,EACX,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ export { SqsBackend } from './SqsBackend.js';
2
+ export { SqsJobRepository } from './SqsJobRepository.js';
3
+ export { SqsMessageCodec, SQS_METADATA } from './SqsMessageCodec.js';
4
+ export { SqsUnsupportedFeatureError } from './errors.js';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDckUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sYUFBYSxDQUFDIn0=
@@ -0,0 +1,35 @@
1
+ import type { SQSClient } from '@aws-sdk/client-sqs';
2
+ export interface SqsFifoConfig {
3
+ enabled?: boolean;
4
+ messageGroupId?: string | ((job: SqsJobEnvelope) => string);
5
+ deduplicationIdStrategy?: 'job-id' | 'content' | ((job: SqsJobEnvelope) => string);
6
+ }
7
+ export interface SqsBackendConfig {
8
+ queueUrl: string;
9
+ region?: string;
10
+ sqsClient?: SQSClient;
11
+ waitTimeSeconds?: number;
12
+ receiveBatchSize?: number;
13
+ visibilityTimeoutSeconds?: number;
14
+ fifo?: SqsFifoConfig;
15
+ unknownJobPolicy?: 'release' | 'delete' | 'leave';
16
+ }
17
+ export interface SqsJobEnvelope<DATA = unknown> {
18
+ backend: 'sqs';
19
+ id: string;
20
+ name: string;
21
+ data?: DATA;
22
+ priority: number;
23
+ type: 'normal';
24
+ queuedAt: string;
25
+ scheduledAt: string | null;
26
+ }
27
+ export interface SqsRuntimeMetadata {
28
+ receiptHandle?: string;
29
+ messageId?: string;
30
+ receiveCount?: number;
31
+ }
32
+ export type SqsJobEnvelopeWithMeta<DATA = unknown> = SqsJobEnvelope<DATA> & {
33
+ __sqs?: SqsRuntimeMetadata;
34
+ };
35
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD,MAAM,WAAW,aAAa;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,cAAc,KAAK,MAAM,CAAC,CAAC;IAC5D,uBAAuB,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,CAAC,CAAC,GAAG,EAAE,cAAc,KAAK,MAAM,CAAC,CAAC;CACnF;AAED,MAAM,WAAW,gBAAgB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,gBAAgB,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;CAClD;AAED,MAAM,WAAW,cAAc,CAAC,IAAI,GAAG,OAAO;IAC7C,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB;IAClC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,sBAAsB,CAAC,IAAI,GAAG,OAAO,IAAI,cAAc,CAAC,IAAI,CAAC,GAAG;IAC3E,KAAK,CAAC,EAAE,kBAAkB,CAAC;CAC3B,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "@researchdatabox/agenda-sqs-backend",
3
+ "version": "0.0.1-beta.10173",
4
+ "description": "Amazon SQS backend for Agenda job scheduler",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js",
12
+ "default": "./dist/index.js"
13
+ }
14
+ },
15
+ "publishConfig": {
16
+ "access": "public",
17
+ "registry": "https://registry.npmjs.org/"
18
+ },
19
+ "files": [
20
+ "dist"
21
+ ],
22
+ "engines": {
23
+ "node": ">=18.0.0"
24
+ },
25
+ "scripts": {
26
+ "build": "rm -rf dist tsconfig.tsbuildinfo && tsc -b",
27
+ "typecheck": "tsc -b && tsc -p tsconfig.test.json",
28
+ "test": "vitest run",
29
+ "test:watch": "vitest"
30
+ },
31
+ "dependencies": {
32
+ "@aws-sdk/client-sqs": "3.1043.0",
33
+ "debug": "4.4.3"
34
+ },
35
+ "peerDependencies": {
36
+ "agenda": "6.2.5"
37
+ },
38
+ "devDependencies": {
39
+ "@tsconfig/node24": "24.0.4",
40
+ "@types/debug": "4.1.13",
41
+ "@types/node": "24.12.4",
42
+ "typescript": "5.9.3",
43
+ "vitest": "4.1.5"
44
+ }
45
+ }