@iotize/tap
Version:
IoTize Device client for Javascript
176 lines • 13.3 kB
JavaScript
import { SinglePacket } from '../generated/models';
import { SinglePacketError } from './definitions';
import { computePadding } from './util';
const TAG = 'SinglePacketBuilder';
export const ZEROS_PADDING_GENERATOR = (length) => new Uint8Array(length);
export class SinglePacketBuilder {
constructor(type, paddingGenerator = ZEROS_PADDING_GENERATOR) {
this.paddingGenerator = paddingGenerator;
this.model = {
sendTime: 0,
header: {
ack: false,
configVersion: 0,
encryption: false,
isExtended: false,
messageType: type,
packetId: 0,
packetLength: 0,
salt: Math.round(Math.random() * 0xffff),
senderId: 0,
},
payload: {
data: new Uint8Array(),
dataSize: 0,
logTime: SinglePacketBuilder.getTimestampInSeconds(),
padding: undefined, // TODO
},
};
}
// static fillComputedField(packet: SinglePacket): SinglePacket {
// if (!packet.sendTime) {
// packet.sendTime = SinglePacketBuilder.getTimestampInSeconds();
// }
// packet.payload.dataSize = packet.payload.data.length;
// packet.header.packetLength =
// computePadding(packet.payload.data.length + 10, 4) +
// packet.payload.data.length +
// SinglePacketBuilder.PACKET_HEADER_SIZE_WITH_SEND_TIME;
// let multiplicator = SinglePacketBuilder.getLengthMultiplicator(packet);
// if (packet.header.packetLength % multiplicator !== 0){
// throw new Error(`Packet length must be a multiple of ${multiplicator}. But length is ${packet.header.packetLength}`);
// }
// return packet;
// }
static getTimestampInSeconds() {
return Math.round(new Date().getTime() / 1000);
}
static getLengthMultiplicator(packet) {
if (packet.header.isExtended) {
return 256;
}
else if (packet.header.encryption ||
packet.header.messageType === SinglePacket.PacketType.CODE_EXEC) {
return 16;
}
else {
return 1;
}
}
static create(data, type, paddingGenertor = ZEROS_PADDING_GENERATOR) {
const builder = new SinglePacketBuilder(type, paddingGenertor);
builder.setData(data);
return builder;
}
setLogTime(logTime) {
this.model.payload.logTime = logTime;
return this;
}
/**
*
* @param id
*/
setPacketId(id) {
// TODO check length ?
this.model.header.packetId = id;
return this;
}
setSalt(salt) {
this.model.header.salt = salt;
return this;
}
setExtended(value) {
this.model.header.isExtended = value;
return this;
}
/**
*
* @param id
*/
setEncryption(enabled) {
// TODO check length ?
this.model.header.encryption = enabled;
return this;
}
/**
*
* @param id
*/
setSenderId(id) {
// TODO check length ?
this.model.header.senderId = id;
return this;
}
/**
*
* @param id
*/
setSendTime(time) {
this.model.sendTime = time;
return this;
}
/**
*
* @param id
*/
setConfigVersion(configVersion) {
this.model.header.configVersion = configVersion;
return this;
}
setData(data) {
this.model.payload.data = data;
return this;
}
getLengthMultiplicator() {
return SinglePacketBuilder.getLengthMultiplicator(this.model);
}
build() {
if (!this.model.sendTime) {
this.model.sendTime = SinglePacketBuilder.getTimestampInSeconds();
}
let multiplicator = this.getLengthMultiplicator();
if (this.model.payload.data.length > 0xffff * multiplicator) {
this.model.header.isExtended = true;
}
multiplicator = this.getLengthMultiplicator(); // Refresh multiplicator if isExtended
const paddingMultiple = Math.max(4, multiplicator); // TODO constant
// debug(TAG, 'Multiplicator', multiplicator, 'padding mult', paddingMultiple);
const requiredPadding = computePadding(this.model.payload.data.length +
SinglePacketBuilder.PACKET_PAYLOAD_HEADER_SIZE, paddingMultiple);
// debug(TAG, 'requiredPadding', requiredPadding);
this.model.payload.padding = this.paddingGenerator(requiredPadding);
// debug(TAG, 'this.model.payload.padding', this.model.payload.padding);
const payloadLengthInBytes = this.model.payload.data.length +
SinglePacketBuilder.PACKET_PAYLOAD_HEADER_SIZE +
this.model.payload.padding.length;
const packetLengthInBytes = SinglePacketBuilder.PACKET_HEADER_SIZE +
this.model.payload.data.length +
this.model.payload.padding.length;
this.model.payload.dataSize =
this.model.payload.data.length > 0xffff
? undefined
: this.model.payload.data.length;
if (payloadLengthInBytes % multiplicator !== 0) {
throw SinglePacketError.internalError(`Packet length ${packetLengthInBytes} must be a multiple of ${multiplicator}`);
}
if (packetLengthInBytes > SinglePacketBuilder.MAX_FULL_SIZE) {
throw SinglePacketError.maxSinglePacketSizeExceeded(packetLengthInBytes, SinglePacketBuilder.MAX_FULL_SIZE);
}
this.model.header.packetLength = payloadLengthInBytes / multiplicator;
if (multiplicator === 1) {
this.model.header.packetLength +=
SinglePacketBuilder.PACKET_OUTER_HEADER_SIZE;
}
return this.model;
}
}
SinglePacketBuilder.MAX_FULL_SIZE = 0x200000;
SinglePacketBuilder.MAX_PART_SIZE = 0xc0;
SinglePacketBuilder.PACKET_PAYLOAD_HEADER_SIZE = 4 + 2 + 4;
SinglePacketBuilder.PACKET_OUTER_HEADER_SIZE = 12;
SinglePacketBuilder.PACKET_HEADER_SIZE = SinglePacketBuilder.PACKET_OUTER_HEADER_SIZE +
SinglePacketBuilder.PACKET_PAYLOAD_HEADER_SIZE;
SinglePacketBuilder.PACKET_HEADER_SIZE_WITH_SEND_TIME = SinglePacketBuilder.PACKET_HEADER_SIZE + 4;
SinglePacketBuilder.MAX_DATA_SIZE = SinglePacketBuilder.MAX_FULL_SIZE -
(SinglePacketBuilder.PACKET_HEADER_SIZE_WITH_SEND_TIME + 0xff);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2luZ2xlLXBhY2tldC1idWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc2VydmljZS9pbXBsL3NpbmdsZS1wYWNrZXQvc3JjL2xpYi9jdXN0b20vc2luZ2xlLXBhY2tldC1idWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUV4QyxNQUFNLEdBQUcsR0FBRyxxQkFBcUIsQ0FBQztBQUdsQyxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLE1BQWMsRUFBRSxFQUFFLENBQ3hELElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3pCLE1BQU0sT0FBTyxtQkFBbUI7SUFnQjlCLFlBQ0UsSUFBNkIsRUFDdEIsbUJBQXdDLHVCQUF1QjtRQUEvRCxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQStDO1FBRXRFLElBQUksQ0FBQyxLQUFLLEdBQUc7WUFDWCxRQUFRLEVBQUUsQ0FBQztZQUNYLE1BQU0sRUFBRTtnQkFDTixHQUFHLEVBQUUsS0FBSztnQkFDVixhQUFhLEVBQUUsQ0FBQztnQkFDaEIsVUFBVSxFQUFFLEtBQUs7Z0JBQ2pCLFVBQVUsRUFBRSxLQUFLO2dCQUNqQixXQUFXLEVBQUUsSUFBSTtnQkFDakIsUUFBUSxFQUFFLENBQUM7Z0JBQ1gsWUFBWSxFQUFFLENBQUM7Z0JBQ2YsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQztnQkFDeEMsUUFBUSxFQUFFLENBQUM7YUFDWjtZQUNELE9BQU8sRUFBRTtnQkFDUCxJQUFJLEVBQUUsSUFBSSxVQUFVLEVBQUU7Z0JBQ3RCLFFB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