UNPKG

@iotize/tap

Version:

IoTize Device client for Javascript

176 lines 13.3 kB
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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