Improve message receive time accuracy

This commit is contained in:
Thomas Nordquist
2019-06-16 19:39:40 +02:00
parent 1884f3baae
commit 1d77af5e22
3 changed files with 19 additions and 9 deletions

View File

@@ -1,7 +1,12 @@
import { MqttMessage } from '../../../events'
interface BufferedMessage {
message: MqttMessage
received: Date
}
export class ChangeBuffer {
private buffer: Array<MqttMessage> = []
private buffer: Array<BufferedMessage> = []
private size = 0
private maxSize = 100_000_000 // ~100MB
public length = 0
@@ -9,7 +14,7 @@ export class ChangeBuffer {
public push(val: MqttMessage) {
if (!this.isFull()) {
this.buffer.push(val)
this.buffer.push({ message: val, received: new Date() })
this.size += this.estimatedMessageOverhead + (val.payload ? val.payload.length : 0)
this.length += 1
}
@@ -27,7 +32,7 @@ export class ChangeBuffer {
return this.size / this.maxSize
}
public popAll(): Array<MqttMessage> {
public popAll(): Array<BufferedMessage> {
const tmpBuffer = this.buffer
this.buffer = []
this.size = 0

View File

@@ -48,10 +48,14 @@ export class Tree<ViewModel extends Destroyable> extends TreeNode<ViewModel> {
}
public applyUnmergedChanges() {
this.unmergedMessages.popAll().forEach(msg => {
const edges = msg.topic.split('/')
const node = TreeNodeFactory.fromEdgesAndValue<ViewModel>(edges, msg.payload)
node.mqttMessage = msg
this.unmergedMessages.popAll().forEach(bufferedItem => {
const edges = bufferedItem.message.topic.split('/')
const node = TreeNodeFactory.fromEdgesAndValue<ViewModel>(
edges,
bufferedItem.message.payload,
bufferedItem.received
)
node.mqttMessage = bufferedItem.message
if (!this.nodeFilter || this.nodeFilter(node)) {
this.updateWithNode(node.firstNode())

View File

@@ -22,13 +22,14 @@ export abstract class TreeNodeFactory {
public static fromEdgesAndValue<ViewModel extends Destroyable>(
edgeNames: Array<string>,
value?: Base64Message | null
value?: Base64Message | null,
receiveDate: Date = new Date()
): TreeNode<ViewModel> {
const node = new TreeNode<ViewModel>()
node.setMessage({
value: value || undefined,
length: value ? value.length : 0,
received: new Date(),
received: receiveDate,
messageNumber: this.messageCounter,
})
this.messageCounter += 1