Skip to content

Commit 442d275

Browse files
committed
added typings for classic and quorum queue types
1 parent 85943c4 commit 442d275

File tree

3 files changed

+231
-123
lines changed

3 files changed

+231
-123
lines changed

src/management.ts

Lines changed: 42 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { AmqpExchange, Exchange, ExchangeInfo, ExchangeOptions } from "./exchange.js"
2-
import { AmqpQueue, Queue, QueueOptions, QueueType } from "./queue.js"
2+
import { AmqpQueue, Queue, QueueType, QueueOptions, QuorumQueueOptions, ClassicQueueOptions } from "./queue.js"
33
import {
44
EventContext,
55
Receiver,
@@ -111,12 +111,7 @@ export class AmqpManagement implements Management {
111111
.sendTo(`/${AmqpEndpoints.Queues}/${encodeURIComponent(queueName)}`)
112112
.setReplyTo(ME)
113113
.setAmqpMethod(AmqpMethods.PUT)
114-
.setBody({
115-
exclusive: options.exclusive ?? false,
116-
durable: options.durable ?? false,
117-
auto_delete: options.autoDelete ?? false,
118-
arguments: buildArgumentsFrom(options.type, options.arguments),
119-
})
114+
.setBody(buildDeclareQueueBody(options))
120115
.build()
121116
this.senderLink.send(message)
122117
})
@@ -295,7 +290,46 @@ export class AmqpManagement implements Management {
295290
}
296291
}
297292

298-
function buildArgumentsFrom(queueType?: QueueType, queueOptions?: Record<string, string>) {
293+
function buildDeclareQueueBody(options: Partial<QueueOptions>) {
294+
const body = {
295+
exclusive: options.exclusive ?? false,
296+
durable: options.durable ?? true, // needed at least by quorum queue type
297+
auto_delete: options.autoDelete ?? false,
298+
arguments: buildArgumentsFrom(options.type, options.arguments),
299+
}
300+
switch (options.type) {
301+
case "quorum":
302+
body.arguments = addQuorumArgumentsFrom(body.arguments, options)
303+
return body
304+
case "classic":
305+
body.arguments = addClassicArgumentsFrom(body.arguments, options)
306+
return body
307+
case "stream":
308+
default:
309+
return body
310+
}
311+
}
312+
313+
function addQuorumArgumentsFrom(args: Record<string, unknown>, options: Partial<QuorumQueueOptions>) {
314+
return {
315+
...args,
316+
...(options.deadLetterStrategy ? { "x-dead-letter-strategy": options.deadLetterStrategy } : {}),
317+
...(options.deliveryLimit ? { "x-max-delivery-limit": options.deliveryLimit } : {}),
318+
...(options.initialGroupSize ? { "x-quorum-initial-group-size": options.initialGroupSize } : {}),
319+
...(options.targetGroupSize ? { "x-quorum-target-group-size": options.targetGroupSize } : {}),
320+
}
321+
}
322+
323+
function addClassicArgumentsFrom(args: Record<string, unknown>, options: Partial<ClassicQueueOptions>) {
324+
return {
325+
...args,
326+
...(options.maxPriority ? { "x-max-priority": options.maxPriority } : {}),
327+
...(options.mode ? { "x-queue-mode": options.mode } : {}),
328+
...(options.version ? { "x-queue-version": options.version } : {}),
329+
}
330+
}
331+
332+
function buildArgumentsFrom(queueType?: QueueType, queueOptions?: Record<string, string>): Record<string, unknown> {
299333
return { ...(queueOptions ?? {}), ...(queueType ? { "x-queue-type": queueType } : {}) }
300334
}
301335

src/queue.ts

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,36 @@
11
export type QueueType = "classic" | "stream" | "quorum"
22

3-
export type QueueOptions = {
4-
type: QueueType
3+
export type QuorumDeadLetterStrategy = "at-most-once" | "at-least-once"
4+
5+
export type ClassicQueueMode = "default" | "lazy"
6+
7+
export type ClassicQueueVersion = 1 | 2
8+
9+
type BaseQueueOptions = {
510
exclusive: boolean
611
autoDelete: boolean
7-
durable: boolean
812
arguments: Record<string, string>
913
}
1014

15+
export type ClassicQueueOptions = BaseQueueOptions & {
16+
type: Exclude<QueueType, "quorum">
17+
durable: boolean
18+
maxPriority: number
19+
mode: ClassicQueueMode
20+
version: ClassicQueueVersion
21+
}
22+
23+
export type QuorumQueueOptions = BaseQueueOptions & {
24+
type: "quorum"
25+
durable: true
26+
deadLetterStrategy: QuorumDeadLetterStrategy
27+
deliveryLimit: number
28+
initialGroupSize: number
29+
targetGroupSize: number
30+
}
31+
32+
export type QueueOptions = ClassicQueueOptions | QuorumQueueOptions
33+
1134
export type QueueInfo = {
1235
name: string
1336
durable: boolean

0 commit comments

Comments
 (0)