@lichtblick/cdr
Version:
Common Data Representation serialization and deserialization library
476 lines • 27.5 kB
JavaScript
"use strict";
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
};
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
if (kind === "m") throw new TypeError("Private method is not writable");
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
};
var _CdrWriter_instances, _CdrWriter_littleEndian, _CdrWriter_hostLittleEndian, _CdrWriter_isCDR2, _CdrWriter_eightByteAlignment, _CdrWriter_buffer, _CdrWriter_array, _CdrWriter_view, _CdrWriter_offset, _CdrWriter_origin, _CdrWriter_memberHeaderV1, _CdrWriter_resetOrigin, _CdrWriter_memberHeaderV2, _CdrWriter_resizeIfNeeded, _CdrWriter_resize;
Object.defineProperty(exports, "__esModule", { value: true });
exports.CdrWriter = void 0;
const EncapsulationKind_1 = require("./EncapsulationKind");
const getEncapsulationKindInfo_1 = require("./getEncapsulationKindInfo");
const isBigEndian_1 = require("./isBigEndian");
const lengthCodes_1 = require("./lengthCodes");
const reservedPIDs_1 = require("./reservedPIDs");
const textEncoder = new TextEncoder();
class CdrWriter {
get data() {
return new Uint8Array(__classPrivateFieldGet(this, _CdrWriter_buffer, "f"), 0, __classPrivateFieldGet(this, _CdrWriter_offset, "f"));
}
get size() {
return __classPrivateFieldGet(this, _CdrWriter_offset, "f");
}
get kind() {
return __classPrivateFieldGet(this, _CdrWriter_view, "f").getUint8(1);
}
constructor(options = {}) {
_CdrWriter_instances.add(this);
_CdrWriter_littleEndian.set(this, void 0);
_CdrWriter_hostLittleEndian.set(this, void 0);
_CdrWriter_isCDR2.set(this, void 0);
_CdrWriter_eightByteAlignment.set(this, void 0); // Alignment for 64-bit values, 4 on CDR2 8 on CDR1
_CdrWriter_buffer.set(this, void 0);
_CdrWriter_array.set(this, void 0);
_CdrWriter_view.set(this, void 0);
_CdrWriter_offset.set(this, void 0);
/** Origin offset into stream used for alignment */
_CdrWriter_origin.set(this, void 0);
if (options.buffer != undefined) {
__classPrivateFieldSet(this, _CdrWriter_buffer, options.buffer, "f");
}
else if (options.size != undefined) {
__classPrivateFieldSet(this, _CdrWriter_buffer, new ArrayBuffer(options.size), "f");
}
else {
__classPrivateFieldSet(this, _CdrWriter_buffer, new ArrayBuffer(CdrWriter.DEFAULT_CAPACITY), "f");
}
const kind = options.kind ?? EncapsulationKind_1.EncapsulationKind.CDR_LE;
const { isCDR2, littleEndian } = (0, getEncapsulationKindInfo_1.getEncapsulationKindInfo)(kind);
__classPrivateFieldSet(this, _CdrWriter_isCDR2, isCDR2, "f");
__classPrivateFieldSet(this, _CdrWriter_littleEndian, littleEndian, "f");
__classPrivateFieldSet(this, _CdrWriter_hostLittleEndian, !(0, isBigEndian_1.isBigEndian)(), "f");
__classPrivateFieldSet(this, _CdrWriter_eightByteAlignment, isCDR2 ? 4 : 8, "f");
__classPrivateFieldSet(this, _CdrWriter_array, new Uint8Array(__classPrivateFieldGet(this, _CdrWriter_buffer, "f")), "f");
__classPrivateFieldSet(this, _CdrWriter_view, new DataView(__classPrivateFieldGet(this, _CdrWriter_buffer, "f")), "f");
// Write the Representation Id and Offset fields
__classPrivateFieldGet(this, _CdrWriter_instances, "m", _CdrWriter_resizeIfNeeded).call(this, 4);
__classPrivateFieldGet(this, _CdrWriter_view, "f").setUint8(0, 0); // Upper bits of EncapsulationKind, unused
__classPrivateFieldGet(this, _CdrWriter_view, "f").setUint8(1, kind);
// The RTPS specification does not define any settings for the 2 byte
// options field and further states that a receiver should not interpret it
// when it reads the options field
__classPrivateFieldGet(this, _CdrWriter_view, "f").setUint16(2, 0, false);
__classPrivateFieldSet(this, _CdrWriter_offset, 4, "f");
__classPrivateFieldSet(this, _CdrWriter_origin, 4, "f");
}
int8(value) {
__classPrivateFieldGet(this, _CdrWriter_instances, "m", _CdrWriter_resizeIfNeeded).call(this, 1);
__classPrivateFieldGet(this, _CdrWriter_view, "f").setInt8(__classPrivateFieldGet(this, _CdrWriter_offset, "f"), value);
__classPrivateFieldSet(this, _CdrWriter_offset, __classPrivateFieldGet(this, _CdrWriter_offset, "f") + 1, "f");
return this;
}
uint8(value) {
__classPrivateFieldGet(this, _CdrWriter_instances, "m", _CdrWriter_resizeIfNeeded).call(this, 1);
__classPrivateFieldGet(this, _CdrWriter_view, "f").setUint8(__classPrivateFieldGet(this, _CdrWriter_offset, "f"), value);
__classPrivateFieldSet(this, _CdrWriter_offset, __classPrivateFieldGet(this, _CdrWriter_offset, "f") + 1, "f");
return this;
}
int16(value) {
this.align(2);
__classPrivateFieldGet(this, _CdrWriter_view, "f").setInt16(__classPrivateFieldGet(this, _CdrWriter_offset, "f"), value, __classPrivateFieldGet(this, _CdrWriter_littleEndian, "f"));
__classPrivateFieldSet(this, _CdrWriter_offset, __classPrivateFieldGet(this, _CdrWriter_offset, "f") + 2, "f");
return this;
}
uint16(value) {
this.align(2);
__classPrivateFieldGet(this, _CdrWriter_view, "f").setUint16(__classPrivateFieldGet(this, _CdrWriter_offset, "f"), value, __classPrivateFieldGet(this, _CdrWriter_littleEndian, "f"));
__classPrivateFieldSet(this, _CdrWriter_offset, __classPrivateFieldGet(this, _CdrWriter_offset, "f") + 2, "f");
return this;
}
int32(value) {
this.align(4);
__classPrivateFieldGet(this, _CdrWriter_view, "f").setInt32(__classPrivateFieldGet(this, _CdrWriter_offset, "f"), value, __classPrivateFieldGet(this, _CdrWriter_littleEndian, "f"));
__classPrivateFieldSet(this, _CdrWriter_offset, __classPrivateFieldGet(this, _CdrWriter_offset, "f") + 4, "f");
return this;
}
uint32(value) {
this.align(4);
__classPrivateFieldGet(this, _CdrWriter_view, "f").setUint32(__classPrivateFieldGet(this, _CdrWriter_offset, "f"), value, __classPrivateFieldGet(this, _CdrWriter_littleEndian, "f"));
__classPrivateFieldSet(this, _CdrWriter_offset, __classPrivateFieldGet(this, _CdrWriter_offset, "f") + 4, "f");
return this;
}
int64(value) {
this.align(__classPrivateFieldGet(this, _CdrWriter_eightByteAlignment, "f"), 8);
__classPrivateFieldGet(this, _CdrWriter_view, "f").setBigInt64(__classPrivateFieldGet(this, _CdrWriter_offset, "f"), value, __classPrivateFieldGet(this, _CdrWriter_littleEndian, "f"));
__classPrivateFieldSet(this, _CdrWriter_offset, __classPrivateFieldGet(this, _CdrWriter_offset, "f") + 8, "f");
return this;
}
uint64(value) {
this.align(__classPrivateFieldGet(this, _CdrWriter_eightByteAlignment, "f"), 8);
__classPrivateFieldGet(this, _CdrWriter_view, "f").setBigUint64(__classPrivateFieldGet(this, _CdrWriter_offset, "f"), value, __classPrivateFieldGet(this, _CdrWriter_littleEndian, "f"));
__classPrivateFieldSet(this, _CdrWriter_offset, __classPrivateFieldGet(this, _CdrWriter_offset, "f") + 8, "f");
return this;
}
uint16BE(value) {
this.align(2);
__classPrivateFieldGet(this, _CdrWriter_view, "f").setUint16(__classPrivateFieldGet(this, _CdrWriter_offset, "f"), value, false);
__classPrivateFieldSet(this, _CdrWriter_offset, __classPrivateFieldGet(this, _CdrWriter_offset, "f") + 2, "f");
return this;
}
uint32BE(value) {
this.align(4);
__classPrivateFieldGet(this, _CdrWriter_view, "f").setUint32(__classPrivateFieldGet(this, _CdrWriter_offset, "f"), value, false);
__classPrivateFieldSet(this, _CdrWriter_offset, __classPrivateFieldGet(this, _CdrWriter_offset, "f") + 4, "f");
return this;
}
uint64BE(value) {
this.align(__classPrivateFieldGet(this, _CdrWriter_eightByteAlignment, "f"), 8);
__classPrivateFieldGet(this, _CdrWriter_view, "f").setBigUint64(__classPrivateFieldGet(this, _CdrWriter_offset, "f"), value, false);
__classPrivateFieldSet(this, _CdrWriter_offset, __classPrivateFieldGet(this, _CdrWriter_offset, "f") + 8, "f");
return this;
}
float32(value) {
this.align(4);
__classPrivateFieldGet(this, _CdrWriter_view, "f").setFloat32(__classPrivateFieldGet(this, _CdrWriter_offset, "f"), value, __classPrivateFieldGet(this, _CdrWriter_littleEndian, "f"));
__classPrivateFieldSet(this, _CdrWriter_offset, __classPrivateFieldGet(this, _CdrWriter_offset, "f") + 4, "f");
return this;
}
float64(value) {
this.align(__classPrivateFieldGet(this, _CdrWriter_eightByteAlignment, "f"), 8);
__classPrivateFieldGet(this, _CdrWriter_view, "f").setFloat64(__classPrivateFieldGet(this, _CdrWriter_offset, "f"), value, __classPrivateFieldGet(this, _CdrWriter_littleEndian, "f"));
__classPrivateFieldSet(this, _CdrWriter_offset, __classPrivateFieldGet(this, _CdrWriter_offset, "f") + 8, "f");
return this;
}
// writeLength optional because it could already be included in a header
string(value, writeLength = true) {
const strlen = value.length;
if (writeLength) {
this.uint32(strlen + 1); // Add one for the null terminator
}
__classPrivateFieldGet(this, _CdrWriter_instances, "m", _CdrWriter_resizeIfNeeded).call(this, strlen + 1);
textEncoder.encodeInto(value, new Uint8Array(__classPrivateFieldGet(this, _CdrWriter_buffer, "f"), __classPrivateFieldGet(this, _CdrWriter_offset, "f"), strlen));
__classPrivateFieldGet(this, _CdrWriter_view, "f").setUint8(__classPrivateFieldGet(this, _CdrWriter_offset, "f") + strlen, 0);
__classPrivateFieldSet(this, _CdrWriter_offset, __classPrivateFieldGet(this, _CdrWriter_offset, "f") + (strlen + 1), "f");
return this;
}
/** Writes the delimiter header using object size
* NOTE: changing endian-ness with a single CDR message is not supported
*/
dHeader(objectSize) {
// DHEADER(O) = O.ssize
const header = objectSize;
this.uint32(header);
return this;
}
/**
* Writes the member header (EMHEADER)
* Accomodates for PL_CDR and PL_CDR2 based on the CdrWriter constructor options
*
* @param mustUnderstand - Whether the member is required to be understood by the receiver
* @param id - The member ID
* @param objectSize - The size of the member in bytes
* @param lengthCode - Optional length code for CDR2 emHeaders.
* lengthCode values [5-7] allow the emHeader object size to take the place of the normally encoded member length.
*
* NOTE: Dynamically determines default value if not provided that does not affect serialization ie will use lengthCode values [0-4].
*
* From Extensible and Dynamic Topic Types in DDS-XTypes v1.3 @ `7.4.3.4.2`:
* "EMHEADER1 with LC values 5 to 7 also affect the serialization/deserialization virtual machine in that they cause NEXTINT to be
* reused also as part of the serialized member. This is useful because the serialization of certain members also starts with an
* integer length, which would take exactly the same value as NEXTINT. Therefore the use of length codes 5 to 7 saves 4 bytes in
* the serialization."
* @returns - CdrWriter instance
*/
emHeader(mustUnderstand, id, objectSize, lengthCode) {
return __classPrivateFieldGet(this, _CdrWriter_isCDR2, "f")
? __classPrivateFieldGet(this, _CdrWriter_instances, "m", _CdrWriter_memberHeaderV2).call(this, mustUnderstand, id, objectSize, lengthCode)
: __classPrivateFieldGet(this, _CdrWriter_instances, "m", _CdrWriter_memberHeaderV1).call(this, mustUnderstand, id, objectSize);
}
/** Writes the PID_SENTINEL value if encapsulation supports it*/
sentinelHeader() {
if (!__classPrivateFieldGet(this, _CdrWriter_isCDR2, "f")) {
this.align(4);
this.uint16(reservedPIDs_1.SENTINEL_PID);
this.uint16(0);
}
return this;
}
sequenceLength(value) {
return this.uint32(value);
}
int8Array(value, writeLength) {
if (writeLength === true) {
this.sequenceLength(value.length);
}
__classPrivateFieldGet(this, _CdrWriter_instances, "m", _CdrWriter_resizeIfNeeded).call(this, value.length);
__classPrivateFieldGet(this, _CdrWriter_array, "f").set(value, __classPrivateFieldGet(this, _CdrWriter_offset, "f"));
__classPrivateFieldSet(this, _CdrWriter_offset, __classPrivateFieldGet(this, _CdrWriter_offset, "f") + value.length, "f");
return this;
}
uint8Array(value, writeLength) {
if (writeLength === true) {
this.sequenceLength(value.length);
}
__classPrivateFieldGet(this, _CdrWriter_instances, "m", _CdrWriter_resizeIfNeeded).call(this, value.length);
__classPrivateFieldGet(this, _CdrWriter_array, "f").set(value, __classPrivateFieldGet(this, _CdrWriter_offset, "f"));
__classPrivateFieldSet(this, _CdrWriter_offset, __classPrivateFieldGet(this, _CdrWriter_offset, "f") + value.length, "f");
return this;
}
int16Array(value, writeLength) {
if (writeLength === true) {
this.sequenceLength(value.length);
}
if (value instanceof Int16Array &&
__classPrivateFieldGet(this, _CdrWriter_littleEndian, "f") === __classPrivateFieldGet(this, _CdrWriter_hostLittleEndian, "f") &&
value.length >= CdrWriter.BUFFER_COPY_THRESHOLD) {
this.align(value.BYTES_PER_ELEMENT, value.byteLength);
__classPrivateFieldGet(this, _CdrWriter_array, "f").set(new Uint8Array(value.buffer, value.byteOffset, value.byteLength), __classPrivateFieldGet(this, _CdrWriter_offset, "f"));
__classPrivateFieldSet(this, _CdrWriter_offset, __classPrivateFieldGet(this, _CdrWriter_offset, "f") + value.byteLength, "f");
}
else {
for (const entry of value) {
this.int16(entry);
}
}
return this;
}
uint16Array(value, writeLength) {
if (writeLength === true) {
this.sequenceLength(value.length);
}
if (value instanceof Uint16Array &&
__classPrivateFieldGet(this, _CdrWriter_littleEndian, "f") === __classPrivateFieldGet(this, _CdrWriter_hostLittleEndian, "f") &&
value.length >= CdrWriter.BUFFER_COPY_THRESHOLD) {
this.align(value.BYTES_PER_ELEMENT, value.byteLength);
__classPrivateFieldGet(this, _CdrWriter_array, "f").set(new Uint8Array(value.buffer, value.byteOffset, value.byteLength), __classPrivateFieldGet(this, _CdrWriter_offset, "f"));
__classPrivateFieldSet(this, _CdrWriter_offset, __classPrivateFieldGet(this, _CdrWriter_offset, "f") + value.byteLength, "f");
}
else {
for (const entry of value) {
this.uint16(entry);
}
}
return this;
}
int32Array(value, writeLength) {
if (writeLength === true) {
this.sequenceLength(value.length);
}
if (value instanceof Int32Array &&
__classPrivateFieldGet(this, _CdrWriter_littleEndian, "f") === __classPrivateFieldGet(this, _CdrWriter_hostLittleEndian, "f") &&
value.length >= CdrWriter.BUFFER_COPY_THRESHOLD) {
this.align(value.BYTES_PER_ELEMENT, value.byteLength);
__classPrivateFieldGet(this, _CdrWriter_array, "f").set(new Uint8Array(value.buffer, value.byteOffset, value.byteLength), __classPrivateFieldGet(this, _CdrWriter_offset, "f"));
__classPrivateFieldSet(this, _CdrWriter_offset, __classPrivateFieldGet(this, _CdrWriter_offset, "f") + value.byteLength, "f");
}
else {
for (const entry of value) {
this.int32(entry);
}
}
return this;
}
uint32Array(value, writeLength) {
if (writeLength === true) {
this.sequenceLength(value.length);
}
if (value instanceof Uint32Array &&
__classPrivateFieldGet(this, _CdrWriter_littleEndian, "f") === __classPrivateFieldGet(this, _CdrWriter_hostLittleEndian, "f") &&
value.length >= CdrWriter.BUFFER_COPY_THRESHOLD) {
this.align(value.BYTES_PER_ELEMENT, value.byteLength);
__classPrivateFieldGet(this, _CdrWriter_array, "f").set(new Uint8Array(value.buffer, value.byteOffset, value.byteLength), __classPrivateFieldGet(this, _CdrWriter_offset, "f"));
__classPrivateFieldSet(this, _CdrWriter_offset, __classPrivateFieldGet(this, _CdrWriter_offset, "f") + value.byteLength, "f");
}
else {
for (const entry of value) {
this.uint32(entry);
}
}
return this;
}
int64Array(value, writeLength) {
if (writeLength === true) {
this.sequenceLength(value.length);
}
if (value instanceof BigInt64Array &&
__classPrivateFieldGet(this, _CdrWriter_littleEndian, "f") === __classPrivateFieldGet(this, _CdrWriter_hostLittleEndian, "f") &&
value.length >= CdrWriter.BUFFER_COPY_THRESHOLD) {
this.align(value.BYTES_PER_ELEMENT, value.byteLength);
__classPrivateFieldGet(this, _CdrWriter_array, "f").set(new Uint8Array(value.buffer, value.byteOffset, value.byteLength), __classPrivateFieldGet(this, _CdrWriter_offset, "f"));
__classPrivateFieldSet(this, _CdrWriter_offset, __classPrivateFieldGet(this, _CdrWriter_offset, "f") + value.byteLength, "f");
}
else {
for (const entry of value) {
this.int64(BigInt(entry));
}
}
return this;
}
uint64Array(value, writeLength) {
if (writeLength === true) {
this.sequenceLength(value.length);
}
if (value instanceof BigUint64Array &&
__classPrivateFieldGet(this, _CdrWriter_littleEndian, "f") === __classPrivateFieldGet(this, _CdrWriter_hostLittleEndian, "f") &&
value.length >= CdrWriter.BUFFER_COPY_THRESHOLD) {
this.align(value.BYTES_PER_ELEMENT, value.byteLength);
__classPrivateFieldGet(this, _CdrWriter_array, "f").set(new Uint8Array(value.buffer, value.byteOffset, value.byteLength), __classPrivateFieldGet(this, _CdrWriter_offset, "f"));
__classPrivateFieldSet(this, _CdrWriter_offset, __classPrivateFieldGet(this, _CdrWriter_offset, "f") + value.byteLength, "f");
}
else {
for (const entry of value) {
this.uint64(BigInt(entry));
}
}
return this;
}
float32Array(value, writeLength) {
if (writeLength === true) {
this.sequenceLength(value.length);
}
if (value instanceof Float32Array &&
__classPrivateFieldGet(this, _CdrWriter_littleEndian, "f") === __classPrivateFieldGet(this, _CdrWriter_hostLittleEndian, "f") &&
value.length >= CdrWriter.BUFFER_COPY_THRESHOLD) {
this.align(value.BYTES_PER_ELEMENT, value.byteLength);
__classPrivateFieldGet(this, _CdrWriter_array, "f").set(new Uint8Array(value.buffer, value.byteOffset, value.byteLength), __classPrivateFieldGet(this, _CdrWriter_offset, "f"));
__classPrivateFieldSet(this, _CdrWriter_offset, __classPrivateFieldGet(this, _CdrWriter_offset, "f") + value.byteLength, "f");
}
else {
for (const entry of value) {
this.float32(entry);
}
}
return this;
}
float64Array(value, writeLength) {
if (writeLength === true) {
this.sequenceLength(value.length);
}
if (value instanceof Float64Array &&
__classPrivateFieldGet(this, _CdrWriter_littleEndian, "f") === __classPrivateFieldGet(this, _CdrWriter_hostLittleEndian, "f") &&
value.length >= CdrWriter.BUFFER_COPY_THRESHOLD) {
this.align(value.BYTES_PER_ELEMENT, value.byteLength);
__classPrivateFieldGet(this, _CdrWriter_array, "f").set(new Uint8Array(value.buffer, value.byteOffset, value.byteLength), __classPrivateFieldGet(this, _CdrWriter_offset, "f"));
__classPrivateFieldSet(this, _CdrWriter_offset, __classPrivateFieldGet(this, _CdrWriter_offset, "f") + value.byteLength, "f");
}
else {
for (const entry of value) {
this.float64(entry);
}
}
return this;
}
/**
* Calculate the capacity needed to hold the given number of aligned bytes,
* resize if needed, and write padding bytes for alignment
* @param size Byte width to align to. If the current #offset is 1 and `size`
* is 4, 3 bytes of padding will be written
* @param bytesToWrite Optional, total amount of bytes that are intended to be
* written directly following the alignment. This can be used to avoid
* additional #buffer resizes in the case of writing large blocks of aligned
* data such as arrays
*/
align(size, bytesToWrite = size) {
const alignment = (__classPrivateFieldGet(this, _CdrWriter_offset, "f") - __classPrivateFieldGet(this, _CdrWriter_origin, "f")) % size;
const padding = alignment > 0 ? size - alignment : 0;
__classPrivateFieldGet(this, _CdrWriter_instances, "m", _CdrWriter_resizeIfNeeded).call(this, padding + bytesToWrite);
// Write padding bytes
__classPrivateFieldGet(this, _CdrWriter_array, "f").fill(0, __classPrivateFieldGet(this, _CdrWriter_offset, "f"), __classPrivateFieldGet(this, _CdrWriter_offset, "f") + padding);
__classPrivateFieldSet(this, _CdrWriter_offset, __classPrivateFieldGet(this, _CdrWriter_offset, "f") + padding, "f");
}
}
exports.CdrWriter = CdrWriter;
_CdrWriter_littleEndian = new WeakMap(), _CdrWriter_hostLittleEndian = new WeakMap(), _CdrWriter_isCDR2 = new WeakMap(), _CdrWriter_eightByteAlignment = new WeakMap(), _CdrWriter_buffer = new WeakMap(), _CdrWriter_array = new WeakMap(), _CdrWriter_view = new WeakMap(), _CdrWriter_offset = new WeakMap(), _CdrWriter_origin = new WeakMap(), _CdrWriter_instances = new WeakSet(), _CdrWriter_memberHeaderV1 = function _CdrWriter_memberHeaderV1(mustUnderstand, id, objectSize) {
this.align(4);
const mustUnderstandFlag = mustUnderstand ? 1 << 14 : 0;
const shouldUseExtendedPID = id > 0x3f00 || objectSize > 0xffff;
if (!shouldUseExtendedPID) {
const idHeader = mustUnderstandFlag | id;
this.uint16(idHeader);
const objectSizeHeader = objectSize & 0xffff;
this.uint16(objectSizeHeader);
}
else {
const extendedHeader = mustUnderstandFlag | reservedPIDs_1.EXTENDED_PID;
this.uint16(extendedHeader);
this.uint16(8); // size of next two parameters
this.uint32(id);
this.uint32(objectSize);
}
__classPrivateFieldGet(this, _CdrWriter_instances, "m", _CdrWriter_resetOrigin).call(this);
return this;
}, _CdrWriter_resetOrigin = function _CdrWriter_resetOrigin() {
__classPrivateFieldSet(this, _CdrWriter_origin, __classPrivateFieldGet(this, _CdrWriter_offset, "f"), "f");
}, _CdrWriter_memberHeaderV2 = function _CdrWriter_memberHeaderV2(mustUnderstand, id, objectSize, lengthCode) {
if (id > 0x0fffffff) {
// first byte is used for M_FLAG and LC
throw Error(`Member ID ${id} is too large. Max value is 268435455`);
}
// EMHEADER = (M_FLAG<<31) + (LC<<28) + M.id
// M is the member of a structure
// M_FLAG is the value of the Must Understand option for the member
const mustUnderstandFlag = mustUnderstand ? 1 << 31 : 0;
// LC is the value of the Length Code for the member.
const finalLengthCode = lengthCode ?? (0, lengthCodes_1.getLengthCodeForObjectSize)(objectSize);
const header = mustUnderstandFlag | (finalLengthCode << 28) | id;
this.uint32(header);
switch (finalLengthCode) {
case 0:
case 1:
case 2:
case 3: {
const shouldBeSize = lengthCodes_1.lengthCodeToObjectSizes[finalLengthCode];
if (objectSize !== shouldBeSize) {
throw new Error(`Cannot write a length code ${finalLengthCode} header with an object size not equal to ${shouldBeSize}`);
}
break;
}
// When the length code is > 3 the header is 8 bytes because of the NEXTINT value storing the object size
case 4:
case 5:
this.uint32(objectSize);
break;
case 6:
if (objectSize % 4 !== 0) {
throw new Error("Cannot write a length code 6 header with an object size that is not a multiple of 4");
}
this.uint32(objectSize >> 2);
break;
case 7:
if (objectSize % 8 !== 0) {
throw new Error("Cannot write a length code 7 header with an object size that is not a multiple of 8");
}
this.uint32(objectSize >> 3);
break;
default:
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
throw new Error(`Unexpected length code ${finalLengthCode}`);
}
return this;
}, _CdrWriter_resizeIfNeeded = function _CdrWriter_resizeIfNeeded(additionalBytes) {
const capacity = __classPrivateFieldGet(this, _CdrWriter_offset, "f") + additionalBytes;
if (__classPrivateFieldGet(this, _CdrWriter_buffer, "f").byteLength < capacity) {
const doubled = __classPrivateFieldGet(this, _CdrWriter_buffer, "f").byteLength * 2;
const newCapacity = doubled > capacity ? doubled : capacity;
__classPrivateFieldGet(this, _CdrWriter_instances, "m", _CdrWriter_resize).call(this, newCapacity);
}
}, _CdrWriter_resize = function _CdrWriter_resize(capacity) {
if (__classPrivateFieldGet(this, _CdrWriter_buffer, "f").byteLength >= capacity) {
return;
}
const buffer = new ArrayBuffer(capacity);
const array = new Uint8Array(buffer);
array.set(__classPrivateFieldGet(this, _CdrWriter_array, "f"));
__classPrivateFieldSet(this, _CdrWriter_buffer, buffer, "f");
__classPrivateFieldSet(this, _CdrWriter_array, array, "f");
__classPrivateFieldSet(this, _CdrWriter_view, new DataView(buffer), "f");
};
CdrWriter.DEFAULT_CAPACITY = 16;
CdrWriter.BUFFER_COPY_THRESHOLD = 10;
//# sourceMappingURL=CdrWriter.js.map