export interface IMessageIdProvider {
/**
* Allocate the first vacant messageId. The messageId become occupied status.
* @return {Number} - The first vacant messageId. If all messageIds are occupied, return null.
*/
allocate(): number | null
/**
* Get the last allocated messageId.
* @return {Number} - messageId.
*/
getLastAllocated(): number | null
/**
* Register the messageId. The messageId become occupied status.
* If the messageId has already been occupied, then return false.
* @param {number} num - The messageId to request use.
* @return {boolean} - If `num` was not occupied, then return true, otherwise return false.
*/
register(num: number): boolean
/**
* Deallocate the messageId. The messageId become vacant status.
* @param {Number} num - The messageId to deallocate. The messageId must be occupied status.
* In other words, the messageId must be allocated by allocate() or
* occupied by register().
*/
deallocate(num: number): void
/**
* Clear all occupied messageIds.
* The all messageIds are set to vacant status.
*/
clear(): void
}
/**
* DefaultMessageAllocator constructor
* @constructor
*/
export default class DefaultMessageIdProvider implements IMessageIdProvider {
private nextId: number
constructor() {
/**
* MessageIDs starting with 1
* ensure that nextId is min. 1, see https://github.com/mqttjs/MQTT.js/issues/810
*/
this.nextId = Math.max(1, Math.floor(Math.random() * 65535))
}
/**
* allocate
*
* Get the next messageId.
* @return unsigned int
*/
allocate() {
// id becomes current state of this.nextId and increments afterwards
const id = this.nextId++
// Ensure 16 bit unsigned int (max 65535, nextId got one higher)
if (this.nextId === 65536) {
this.nextId = 1
}
return id
}
/**
* getLastAllocated
* Get the last allocated messageId.
* @return unsigned int
*/
getLastAllocated() {
return this.nextId === 1 ? 65535 : this.nextId - 1
}
/**
* register
* Register messageId. If success return true, otherwise return false.
* @param { unsigned int } - messageId to register,
* @return boolean
*/
register(messageId: number) {
return true
}
/**
* deallocate
* Deallocate messageId.
* @param { unsigned int } - messageId to deallocate,
*/
deallocate(messageId: number) {}
/**
* clear
* Deallocate all messageIds.
*/
clear() {}
}