UNPKG

@huddly/device-api-usb

Version:

Huddly SDK device api which uses node-usb wrapper responsible for handling the transport layer of the communication and discovering the physical device/camera

71 lines 2.86 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Message = void 0; class Message { constructor(message, messageSize, payload, payloadSize) { this.message = message; this.messageSize = messageSize; this.payload = payload; this.payloadSize = payloadSize; } totalSize() { return MessagePacket.HEADER_SIZES.HDR_SIZE + this.messageSize + this.payloadSize; } isComplete() { return this.payload.byteLength >= this.payloadSize; } } exports.Message = Message; /** * @ignore * * @export * @class MessagePacket */ class MessagePacket { static createMessage(message, payload, fullPayloadSize) { const messageBuffer = Buffer.from(message); const hdrBuffer = Buffer.alloc(MessagePacket.HEADER_SIZES.HDR_SIZE); let payloadBuffer = Buffer.from(payload); if (payload instanceof Buffer) { payloadBuffer = payload; } const payloadSize = fullPayloadSize || payloadBuffer.byteLength; hdrBuffer.writeUInt16LE(messageBuffer.byteLength, MessagePacket.HEADER_SIZES.HDR_MESSAGE_SIZE_OFFSET); hdrBuffer.writeUInt32LE(payloadSize, MessagePacket.HEADER_SIZES.HDR_PAYLOAD_SIZE_OFFSET); const packageBuffer = Buffer.concat([hdrBuffer, messageBuffer, payloadBuffer]); return packageBuffer; } static parseMessage(messageBuffer) { const HDR_SIZE = MessagePacket.HEADER_SIZES.HDR_SIZE; if (messageBuffer.byteLength < HDR_SIZE) { throw new Error(`Header must be at least ${HDR_SIZE} bytes long. Not ${messageBuffer.length}.`); } const reserved = messageBuffer.slice(0, MessagePacket.HEADER_SIZES.HDR_MESSAGE_SIZE_OFFSET); Uint8Array.from(reserved).forEach((num, idx) => { if (num !== 0) { throw new Error(`Expected zero byte in reserved area at offset ${idx}, got ${num}`); } }); let ret; try { const messageSize = messageBuffer.readUInt16LE(MessagePacket.HEADER_SIZES.HDR_MESSAGE_SIZE_OFFSET); const payloadSize = messageBuffer.readUInt32LE(MessagePacket.HEADER_SIZES.HDR_PAYLOAD_SIZE_OFFSET); const payloadOffset = messageSize + HDR_SIZE; const message = messageBuffer.toString('utf8', HDR_SIZE, payloadOffset); const payload = messageBuffer.slice(payloadOffset); ret = new Message(message, messageSize, payload, payloadSize); } catch (e) { throw new Error(`Hlink message could not be parsed! ${e}`); } return Object.freeze(ret); } } exports.default = MessagePacket; MessagePacket.HEADER_SIZES = Object.freeze({ HDR_MESSAGE_SIZE_OFFSET: 10, HDR_PAYLOAD_SIZE_OFFSET: 12, HDR_SIZE: 16, }); //# sourceMappingURL=messagepacket.js.map