Skip to content

Commit 45ac4e3

Browse files
authored
Support for connection.update-secret (#77)
* Support for connection.update-secret Fixes #65
1 parent d464ef2 commit 45ac4e3

2 files changed

Lines changed: 33 additions & 0 deletions

File tree

src/amqp-base-client.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ export abstract class AMQPBaseClient {
1818
channels: AMQPChannel[]
1919
protected connectPromise?: [(conn: AMQPBaseClient) => void, (err: Error) => void]
2020
protected closePromise?: [(value?: void) => void, (err: Error) => void]
21+
protected onUpdateSecretOk?: (value?: void) => void
2122
closed = true
2223
blocked?: string
2324
channelMax = 0
@@ -100,6 +101,25 @@ export abstract class AMQPBaseClient {
100101
})
101102
}
102103

104+
updateSecret(newSecret : string, reason : string) {
105+
let j = 0
106+
const frame = new AMQPView(new ArrayBuffer(4096))
107+
frame.setUint8(j, 1); j += 1 // type: method
108+
frame.setUint16(j, 0); j += 2 // channel: 0
109+
frame.setUint32(j, 0); j += 4 // frameSize
110+
frame.setUint16(j, 10); j += 2 // class: connection
111+
frame.setUint16(j, 70); j += 2 // method: update-secret
112+
j += frame.setLongString(j, newSecret) // new secret
113+
j += frame.setShortString(j, reason) // reason
114+
frame.setUint8(j, 206); j += 1 // frame end byte
115+
frame.setUint32(3, j - 8) // update frameSize
116+
return new Promise((resolve, reject) => {
117+
this.send(new Uint8Array(frame.buffer, 0, j))
118+
.then(() => this.onUpdateSecretOk = resolve)
119+
.catch(reject)
120+
})
121+
}
122+
103123
/**
104124
* Try establish a connection
105125
*/
@@ -266,6 +286,7 @@ export abstract class AMQPBaseClient {
266286
.catch(err => console.warn("Error while sending Connection#CloseOk", err))
267287
this.onerror(err)
268288
this.rejectConnect(err)
289+
this.onUpdateSecretOk?.()
269290
break
270291
}
271292
case 51: { // closeOk
@@ -291,6 +312,12 @@ export abstract class AMQPBaseClient {
291312
delete this.blocked
292313
break
293314
}
315+
case 71: { // update-secret-ok
316+
console.info("AMQP connection update secret ok")
317+
this.onUpdateSecretOk?.()
318+
delete this.onUpdateSecretOk
319+
break
320+
}
294321
default:
295322
i += frameSize - 4
296323
console.error("unsupported class/method id", classId, methodId)

test/test.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -667,3 +667,9 @@ test("raises when channelMax is reached", async () => {
667667
const ch1 = await conn.channel(1)
668668
await expect(ch1.basicQos(10)).resolves.toBeUndefined()
669669
}, 10_000)
670+
671+
test('can update-secret', async () => {
672+
const amqp = getNewClient()
673+
const conn = await amqp.connect()
674+
await expect(conn.updateSecret("foobar", "no reason")).resolves.toBeUndefined()
675+
})

0 commit comments

Comments
 (0)