matterbridge-roborock-vacuum-plugin
Version:
Matterbridge Roborock Vacuum Plugin
62 lines • 2.81 kB
JavaScript
import CRC32 from 'crc-32';
import { ProtocolVersion } from '../../enums/index.js';
import { Protocol } from '../../models/index.js';
import { MessageBodyBuilderFactory } from '../builders/messageBodyBuilderFactory.js';
import { MessageSerializerFactory } from './messageSerializerFactory.js';
export class MessageSerializer {
context;
logger;
sequence = 1;
supportedVersions = [
ProtocolVersion.V1,
ProtocolVersion.A01,
ProtocolVersion.B01,
ProtocolVersion.L01,
];
protocolsWithoutPayload = [Protocol.hello_request, Protocol.ping_request];
messageSerializerFactory = new MessageSerializerFactory();
messageBodyBuilderFactory = new MessageBodyBuilderFactory();
constructor(context, logger) {
this.context = context;
this.logger = logger;
}
serialize(duid, request) {
const messageId = request.messageId;
const buffer = this.buildBuffer(duid, request);
return { messageId: messageId, buffer: buffer };
}
buildBuffer(duid, request) {
const version = request.version ?? this.context.getMQTTProtocolVersion(duid);
if (!version || !this.supportedVersions.includes(version)) {
throw new Error(`[MessageSerializer] unknown protocol: ${version ?? ''}`);
}
let encrypted;
if (this.protocolsWithoutPayload.includes(request.protocol)) {
encrypted = Buffer.alloc(0);
}
else {
const localKey = this.context.getLocalKey(duid);
if (!localKey) {
throw new Error(`no local key for device ${duid}`);
}
const messageBodyBuilder = this.messageBodyBuilderFactory.getMessageBodyBuilder(version, request.body !== undefined);
const messageSerializer = this.messageSerializerFactory.getMessageSerializer(version);
const payloadData = messageBodyBuilder.buildPayload(request, this.context);
const connectNonce = this.context.nonce;
const ackNonce = this.context.getDeviceNonce(duid);
encrypted = messageSerializer.encode(payloadData, localKey, request.timestamp, this.sequence, request.nonce, connectNonce, ackNonce);
}
const msg = Buffer.alloc(23 + encrypted.length);
msg.write(version);
msg.writeUint32BE(this.sequence++ & 0xffffffff, 3);
msg.writeUint32BE(request.nonce & 0xffffffff, 7);
msg.writeUint32BE(request.timestamp, 11);
msg.writeUint16BE(request.protocol, 15);
msg.writeUint16BE(encrypted.length, 17);
encrypted.copy(msg, 19);
const crc32 = CRC32.buf(msg.subarray(0, msg.length - 4)) >>> 0;
msg.writeUint32BE(crc32, msg.length - 4);
return msg;
}
}
//# sourceMappingURL=messageSerializer.js.map