Skip to content

Commit 8e14d3e

Browse files
k-keisukekksuke
andauthoredJul 18, 2024··
fix: reschedule pings problem (#1904)
* reschedulePingForcely * reset KeepalivTimer if client receives pingresp * test for pingresp * reschedulePing with force arg * call reschedulePing with true * npm run lint-fix --------- Co-authored-by: kksuke <kajigaya.keisuke@gmail.com>
1 parent fbe5294 commit 8e14d3e

File tree

3 files changed

+38
-3
lines changed

3 files changed

+38
-3
lines changed
 

‎src/lib/client.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -2109,11 +2109,11 @@ export default class MqttClient extends TypedEventEmitter<MqttClientEventCallbac
21092109
/**
21102110
* Reschedule the ping interval
21112111
*/
2112-
public reschedulePing() {
2112+
public reschedulePing(force = false) {
21132113
if (
21142114
this.keepaliveManager &&
21152115
this.options.keepalive &&
2116-
this.options.reschedulePings
2116+
(force || this.options.reschedulePings)
21172117
) {
21182118
this._reschedulePing()
21192119
}

‎src/lib/handlers/index.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ const handle: PacketHandler = (client, packet, done) => {
5656
break
5757
case 'pingresp':
5858
client.log('_handlePacket :: received pingresp')
59-
client.reschedulePing()
59+
client.reschedulePing(true)
6060
done()
6161
break
6262
case 'disconnect':

‎test/abstract_client.ts

+35
Original file line numberDiff line numberDiff line change
@@ -2120,6 +2120,41 @@ export default function abstractTest(server, config, ports) {
21202120

21212121
reschedulePing(true)
21222122
reschedulePing(false)
2123+
2124+
const pingresp = (reschedulePings: boolean) => {
2125+
it(`should shift ping on pingresp when reschedulePings===${reschedulePings}`, function _test(t, done) {
2126+
const intervalMs = 3000
2127+
2128+
let client = connect({
2129+
keepalive: intervalMs / 1000,
2130+
reschedulePings,
2131+
})
2132+
2133+
const spy = sinon.spy(client, '_reschedulePing' as any)
2134+
2135+
client.on('packetreceive', (packet) => {
2136+
if (packet.cmd === 'pingresp') {
2137+
process.nextTick(() => {
2138+
assert.strictEqual(spy.callCount, 1)
2139+
client.end(true, done)
2140+
client = null
2141+
})
2142+
}
2143+
})
2144+
2145+
client.on('error', (err) => {
2146+
client.end(true, () => {
2147+
done(err)
2148+
})
2149+
})
2150+
2151+
client.once('connect', () => {
2152+
clock.tick(intervalMs)
2153+
})
2154+
})
2155+
}
2156+
pingresp(true)
2157+
pingresp(false)
21232158
})
21242159

21252160
describe('pinging', () => {

0 commit comments

Comments
 (0)
Please sign in to comment.