1- import { AmqpExchangeInfo , ExchangeInfo , ExchangeOptions } from "./exchange.js"
1+ import { AmqpExchange , Exchange , ExchangeInfo , ExchangeOptions } from "./exchange.js"
22import { AmqpQueue , Queue , QueueOptions , QueueType } from "./queue.js"
33import {
44 EventContext ,
@@ -11,7 +11,12 @@ import {
1111 SenderOptions ,
1212} from "rhea"
1313import { AmqpEndpoints , AmqpMethods , MessageBuilder , ME } from "./message_builder.js"
14- import { CreateQueueResponseDecoder , DeleteQueueResponseDecoder } from "./response_decoder.js"
14+ import {
15+ CreateExchangeResponseDecoder ,
16+ CreateQueueResponseDecoder ,
17+ DeleteExchangeResponseDecoder ,
18+ DeleteQueueResponseDecoder ,
19+ } from "./response_decoder.js"
1520
1621type LinkOpenEvents = SenderEvents . senderOpen | ReceiverEvents . receiverOpen
1722type LinkErrorEvents = SenderEvents . senderError | ReceiverEvents . receiverError
@@ -31,8 +36,8 @@ const MANAGEMENT_NODE_CONFIGURATION: SenderOptions | ReceiverOptions = {
3136export interface Management {
3237 declareQueue : ( queueName : string , options ?: Partial < QueueOptions > ) => Promise < Queue >
3338 deleteQueue : ( queueName : string ) => Promise < boolean >
34- declareExchange : ( exchangeName : string , options : Partial < ExchangeOptions > ) => ExchangeInfo
35- deleteExchange : ( exchangeName : string ) => void
39+ declareExchange : ( exchangeName : string , options : Partial < ExchangeOptions > ) => Promise < Exchange >
40+ deleteExchange : ( exchangeName : string ) => Promise < boolean >
3641 close : ( ) => void
3742}
3843
@@ -158,28 +163,64 @@ export class AmqpManagement implements Management {
158163 } )
159164 }
160165
161- declareExchange ( exchangeName : string , options : Partial < ExchangeOptions > = { } ) : ExchangeInfo {
162- // decode the response
163- // create queueInfo
166+ declareExchange ( exchangeName : string , options : Partial < ExchangeOptions > = { } ) : Promise < Exchange > {
167+ const exchangeInfo : ExchangeInfo = {
168+ type : options . type ?? "direct" ,
169+ arguments : options . arguments ?? { } ,
170+ autoDelete : options . auto_delete ?? false ,
171+ durable : options . durable ?? false ,
172+ name : exchangeName ,
173+ }
174+ return new Promise ( ( res , rej ) => {
175+ this . receiverLink . once ( ReceiverEvents . message , ( context : EventContext ) => {
176+ if ( ! context . message ) {
177+ return rej ( new Error ( "Receiver has not received any message" ) )
178+ }
164179
165- this . senderLink . send ( {
166- message_id : generate_uuid ( ) ,
167- to : `/exchanges/${ encodeURIComponent ( exchangeName ) } ` ,
168- reply_to : "$me" ,
169- subject : "PUT" ,
170- body : options ,
171- } )
180+ const response = new CreateExchangeResponseDecoder ( ) . decodeFrom ( context . message , String ( message . message_id ) )
181+ if ( response . status === "error" ) {
182+ return rej ( response . error )
183+ }
184+
185+ return res ( new AmqpExchange ( exchangeInfo ) )
186+ } )
187+
188+ const message = new MessageBuilder ( )
189+ . sendTo ( `/${ AmqpEndpoints . Exchanges } /${ encodeURIComponent ( exchangeName ) } ` )
190+ . setReplyTo ( ME )
191+ . setAmqpMethod ( AmqpMethods . PUT )
192+ . setBody ( {
193+ type : options . type ,
194+ durable : options . durable ?? false ,
195+ auto_delete : options . auto_delete ?? false ,
196+ } )
197+ . build ( )
172198
173- return new AmqpExchangeInfo ( { name : exchangeName } )
199+ this . senderLink . send ( message )
200+ } )
174201 }
175202
176- deleteExchange ( exchangeName : string ) {
177- this . senderLink . send ( {
178- message_id : generate_uuid ( ) ,
179- to : `/exchanges/${ encodeURIComponent ( exchangeName ) } ` ,
180- reply_to : "$me" ,
181- subject : "DELETE" ,
182- body : null ,
203+ deleteExchange ( exchangeName : string ) : Promise < boolean > {
204+ return new Promise ( ( res , rej ) => {
205+ this . receiverLink . once ( ReceiverEvents . message , ( context : EventContext ) => {
206+ if ( ! context . message ) {
207+ return rej ( new Error ( "Receiver has not received any message" ) )
208+ }
209+
210+ const response = new DeleteExchangeResponseDecoder ( ) . decodeFrom ( context . message , String ( message . message_id ) )
211+ if ( response . status === "error" ) {
212+ return rej ( response . error )
213+ }
214+
215+ return res ( true )
216+ } )
217+
218+ const message = new MessageBuilder ( )
219+ . sendTo ( `/${ AmqpEndpoints . Exchanges } /${ encodeURIComponent ( exchangeName ) } ` )
220+ . setReplyTo ( ME )
221+ . setAmqpMethod ( AmqpMethods . DELETE )
222+ . build ( )
223+ this . senderLink . send ( message )
183224 } )
184225 }
185226}
0 commit comments