You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					1233 lines
				
				44 KiB
			
		
		
			
		
	
	
					1233 lines
				
				44 KiB
			| 
											3 years ago
										 | "use strict"; | ||
|  | Object.defineProperty(exports, "__esModule", { value: true }); | ||
|  | const utils_1 = require("./utils"); | ||
|  | // The default Buffer size if one is not provided.
 | ||
|  | const DEFAULT_SMARTBUFFER_SIZE = 4096; | ||
|  | // The default string encoding to use for reading/writing strings.
 | ||
|  | const DEFAULT_SMARTBUFFER_ENCODING = 'utf8'; | ||
|  | class SmartBuffer { | ||
|  |     /** | ||
|  |      * Creates a new SmartBuffer instance. | ||
|  |      * | ||
|  |      * @param options { SmartBufferOptions } The SmartBufferOptions to apply to this instance. | ||
|  |      */ | ||
|  |     constructor(options) { | ||
|  |         this.length = 0; | ||
|  |         this._encoding = DEFAULT_SMARTBUFFER_ENCODING; | ||
|  |         this._writeOffset = 0; | ||
|  |         this._readOffset = 0; | ||
|  |         if (SmartBuffer.isSmartBufferOptions(options)) { | ||
|  |             // Checks for encoding
 | ||
|  |             if (options.encoding) { | ||
|  |                 utils_1.checkEncoding(options.encoding); | ||
|  |                 this._encoding = options.encoding; | ||
|  |             } | ||
|  |             // Checks for initial size length
 | ||
|  |             if (options.size) { | ||
|  |                 if (utils_1.isFiniteInteger(options.size) && options.size > 0) { | ||
|  |                     this._buff = Buffer.allocUnsafe(options.size); | ||
|  |                 } | ||
|  |                 else { | ||
|  |                     throw new Error(utils_1.ERRORS.INVALID_SMARTBUFFER_SIZE); | ||
|  |                 } | ||
|  |                 // Check for initial Buffer
 | ||
|  |             } | ||
|  |             else if (options.buff) { | ||
|  |                 if (Buffer.isBuffer(options.buff)) { | ||
|  |                     this._buff = options.buff; | ||
|  |                     this.length = options.buff.length; | ||
|  |                 } | ||
|  |                 else { | ||
|  |                     throw new Error(utils_1.ERRORS.INVALID_SMARTBUFFER_BUFFER); | ||
|  |                 } | ||
|  |             } | ||
|  |             else { | ||
|  |                 this._buff = Buffer.allocUnsafe(DEFAULT_SMARTBUFFER_SIZE); | ||
|  |             } | ||
|  |         } | ||
|  |         else { | ||
|  |             // If something was passed but it's not a SmartBufferOptions object
 | ||
|  |             if (typeof options !== 'undefined') { | ||
|  |                 throw new Error(utils_1.ERRORS.INVALID_SMARTBUFFER_OBJECT); | ||
|  |             } | ||
|  |             // Otherwise default to sane options
 | ||
|  |             this._buff = Buffer.allocUnsafe(DEFAULT_SMARTBUFFER_SIZE); | ||
|  |         } | ||
|  |     } | ||
|  |     /** | ||
|  |      * Creates a new SmartBuffer instance with the provided internal Buffer size and optional encoding. | ||
|  |      * | ||
|  |      * @param size { Number } The size of the internal Buffer. | ||
|  |      * @param encoding { String } The BufferEncoding to use for strings. | ||
|  |      * | ||
|  |      * @return { SmartBuffer } | ||
|  |      */ | ||
|  |     static fromSize(size, encoding) { | ||
|  |         return new this({ | ||
|  |             size: size, | ||
|  |             encoding: encoding | ||
|  |         }); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Creates a new SmartBuffer instance with the provided Buffer and optional encoding. | ||
|  |      * | ||
|  |      * @param buffer { Buffer } The Buffer to use as the internal Buffer value. | ||
|  |      * @param encoding { String } The BufferEncoding to use for strings. | ||
|  |      * | ||
|  |      * @return { SmartBuffer } | ||
|  |      */ | ||
|  |     static fromBuffer(buff, encoding) { | ||
|  |         return new this({ | ||
|  |             buff: buff, | ||
|  |             encoding: encoding | ||
|  |         }); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Creates a new SmartBuffer instance with the provided SmartBufferOptions options. | ||
|  |      * | ||
|  |      * @param options { SmartBufferOptions } The options to use when creating the SmartBuffer instance. | ||
|  |      */ | ||
|  |     static fromOptions(options) { | ||
|  |         return new this(options); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Type checking function that determines if an object is a SmartBufferOptions object. | ||
|  |      */ | ||
|  |     static isSmartBufferOptions(options) { | ||
|  |         const castOptions = options; | ||
|  |         return (castOptions && | ||
|  |             (castOptions.encoding !== undefined || castOptions.size !== undefined || castOptions.buff !== undefined)); | ||
|  |     } | ||
|  |     // Signed integers
 | ||
|  |     /** | ||
|  |      * Reads an Int8 value from the current read position or an optionally provided offset. | ||
|  |      * | ||
|  |      * @param offset { Number } The offset to read data from (optional) | ||
|  |      * @return { Number } | ||
|  |      */ | ||
|  |     readInt8(offset) { | ||
|  |         return this._readNumberValue(Buffer.prototype.readInt8, 1, offset); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Reads an Int16BE value from the current read position or an optionally provided offset. | ||
|  |      * | ||
|  |      * @param offset { Number } The offset to read data from (optional) | ||
|  |      * @return { Number } | ||
|  |      */ | ||
|  |     readInt16BE(offset) { | ||
|  |         return this._readNumberValue(Buffer.prototype.readInt16BE, 2, offset); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Reads an Int16LE value from the current read position or an optionally provided offset. | ||
|  |      * | ||
|  |      * @param offset { Number } The offset to read data from (optional) | ||
|  |      * @return { Number } | ||
|  |      */ | ||
|  |     readInt16LE(offset) { | ||
|  |         return this._readNumberValue(Buffer.prototype.readInt16LE, 2, offset); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Reads an Int32BE value from the current read position or an optionally provided offset. | ||
|  |      * | ||
|  |      * @param offset { Number } The offset to read data from (optional) | ||
|  |      * @return { Number } | ||
|  |      */ | ||
|  |     readInt32BE(offset) { | ||
|  |         return this._readNumberValue(Buffer.prototype.readInt32BE, 4, offset); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Reads an Int32LE value from the current read position or an optionally provided offset. | ||
|  |      * | ||
|  |      * @param offset { Number } The offset to read data from (optional) | ||
|  |      * @return { Number } | ||
|  |      */ | ||
|  |     readInt32LE(offset) { | ||
|  |         return this._readNumberValue(Buffer.prototype.readInt32LE, 4, offset); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Reads a BigInt64BE value from the current read position or an optionally provided offset. | ||
|  |      * | ||
|  |      * @param offset { Number } The offset to read data from (optional) | ||
|  |      * @return { BigInt } | ||
|  |      */ | ||
|  |     readBigInt64BE(offset) { | ||
|  |         utils_1.bigIntAndBufferInt64Check('readBigInt64BE'); | ||
|  |         return this._readNumberValue(Buffer.prototype.readBigInt64BE, 8, offset); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Reads a BigInt64LE value from the current read position or an optionally provided offset. | ||
|  |      * | ||
|  |      * @param offset { Number } The offset to read data from (optional) | ||
|  |      * @return { BigInt } | ||
|  |      */ | ||
|  |     readBigInt64LE(offset) { | ||
|  |         utils_1.bigIntAndBufferInt64Check('readBigInt64LE'); | ||
|  |         return this._readNumberValue(Buffer.prototype.readBigInt64LE, 8, offset); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Writes an Int8 value to the current write position (or at optional offset). | ||
|  |      * | ||
|  |      * @param value { Number } The value to write. | ||
|  |      * @param offset { Number } The offset to write the value at. | ||
|  |      * | ||
|  |      * @return this | ||
|  |      */ | ||
|  |     writeInt8(value, offset) { | ||
|  |         this._writeNumberValue(Buffer.prototype.writeInt8, 1, value, offset); | ||
|  |         return this; | ||
|  |     } | ||
|  |     /** | ||
|  |      * Inserts an Int8 value at the given offset value. | ||
|  |      * | ||
|  |      * @param value { Number } The value to insert. | ||
|  |      * @param offset { Number } The offset to insert the value at. | ||
|  |      * | ||
|  |      * @return this | ||
|  |      */ | ||
|  |     insertInt8(value, offset) { | ||
|  |         return this._insertNumberValue(Buffer.prototype.writeInt8, 1, value, offset); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Writes an Int16BE value to the current write position (or at optional offset). | ||
|  |      * | ||
|  |      * @param value { Number } The value to write. | ||
|  |      * @param offset { Number } The offset to write the value at. | ||
|  |      * | ||
|  |      * @return this | ||
|  |      */ | ||
|  |     writeInt16BE(value, offset) { | ||
|  |         return this._writeNumberValue(Buffer.prototype.writeInt16BE, 2, value, offset); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Inserts an Int16BE value at the given offset value. | ||
|  |      * | ||
|  |      * @param value { Number } The value to insert. | ||
|  |      * @param offset { Number } The offset to insert the value at. | ||
|  |      * | ||
|  |      * @return this | ||
|  |      */ | ||
|  |     insertInt16BE(value, offset) { | ||
|  |         return this._insertNumberValue(Buffer.prototype.writeInt16BE, 2, value, offset); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Writes an Int16LE value to the current write position (or at optional offset). | ||
|  |      * | ||
|  |      * @param value { Number } The value to write. | ||
|  |      * @param offset { Number } The offset to write the value at. | ||
|  |      * | ||
|  |      * @return this | ||
|  |      */ | ||
|  |     writeInt16LE(value, offset) { | ||
|  |         return this._writeNumberValue(Buffer.prototype.writeInt16LE, 2, value, offset); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Inserts an Int16LE value at the given offset value. | ||
|  |      * | ||
|  |      * @param value { Number } The value to insert. | ||
|  |      * @param offset { Number } The offset to insert the value at. | ||
|  |      * | ||
|  |      * @return this | ||
|  |      */ | ||
|  |     insertInt16LE(value, offset) { | ||
|  |         return this._insertNumberValue(Buffer.prototype.writeInt16LE, 2, value, offset); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Writes an Int32BE value to the current write position (or at optional offset). | ||
|  |      * | ||
|  |      * @param value { Number } The value to write. | ||
|  |      * @param offset { Number } The offset to write the value at. | ||
|  |      * | ||
|  |      * @return this | ||
|  |      */ | ||
|  |     writeInt32BE(value, offset) { | ||
|  |         return this._writeNumberValue(Buffer.prototype.writeInt32BE, 4, value, offset); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Inserts an Int32BE value at the given offset value. | ||
|  |      * | ||
|  |      * @param value { Number } The value to insert. | ||
|  |      * @param offset { Number } The offset to insert the value at. | ||
|  |      * | ||
|  |      * @return this | ||
|  |      */ | ||
|  |     insertInt32BE(value, offset) { | ||
|  |         return this._insertNumberValue(Buffer.prototype.writeInt32BE, 4, value, offset); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Writes an Int32LE value to the current write position (or at optional offset). | ||
|  |      * | ||
|  |      * @param value { Number } The value to write. | ||
|  |      * @param offset { Number } The offset to write the value at. | ||
|  |      * | ||
|  |      * @return this | ||
|  |      */ | ||
|  |     writeInt32LE(value, offset) { | ||
|  |         return this._writeNumberValue(Buffer.prototype.writeInt32LE, 4, value, offset); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Inserts an Int32LE value at the given offset value. | ||
|  |      * | ||
|  |      * @param value { Number } The value to insert. | ||
|  |      * @param offset { Number } The offset to insert the value at. | ||
|  |      * | ||
|  |      * @return this | ||
|  |      */ | ||
|  |     insertInt32LE(value, offset) { | ||
|  |         return this._insertNumberValue(Buffer.prototype.writeInt32LE, 4, value, offset); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Writes a BigInt64BE value to the current write position (or at optional offset). | ||
|  |      * | ||
|  |      * @param value { BigInt } The value to write. | ||
|  |      * @param offset { Number } The offset to write the value at. | ||
|  |      * | ||
|  |      * @return this | ||
|  |      */ | ||
|  |     writeBigInt64BE(value, offset) { | ||
|  |         utils_1.bigIntAndBufferInt64Check('writeBigInt64BE'); | ||
|  |         return this._writeNumberValue(Buffer.prototype.writeBigInt64BE, 8, value, offset); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Inserts a BigInt64BE value at the given offset value. | ||
|  |      * | ||
|  |      * @param value { BigInt } The value to insert. | ||
|  |      * @param offset { Number } The offset to insert the value at. | ||
|  |      * | ||
|  |      * @return this | ||
|  |      */ | ||
|  |     insertBigInt64BE(value, offset) { | ||
|  |         utils_1.bigIntAndBufferInt64Check('writeBigInt64BE'); | ||
|  |         return this._insertNumberValue(Buffer.prototype.writeBigInt64BE, 8, value, offset); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Writes a BigInt64LE value to the current write position (or at optional offset). | ||
|  |      * | ||
|  |      * @param value { BigInt } The value to write. | ||
|  |      * @param offset { Number } The offset to write the value at. | ||
|  |      * | ||
|  |      * @return this | ||
|  |      */ | ||
|  |     writeBigInt64LE(value, offset) { | ||
|  |         utils_1.bigIntAndBufferInt64Check('writeBigInt64LE'); | ||
|  |         return this._writeNumberValue(Buffer.prototype.writeBigInt64LE, 8, value, offset); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Inserts a Int64LE value at the given offset value. | ||
|  |      * | ||
|  |      * @param value { BigInt } The value to insert. | ||
|  |      * @param offset { Number } The offset to insert the value at. | ||
|  |      * | ||
|  |      * @return this | ||
|  |      */ | ||
|  |     insertBigInt64LE(value, offset) { | ||
|  |         utils_1.bigIntAndBufferInt64Check('writeBigInt64LE'); | ||
|  |         return this._insertNumberValue(Buffer.prototype.writeBigInt64LE, 8, value, offset); | ||
|  |     } | ||
|  |     // Unsigned Integers
 | ||
|  |     /** | ||
|  |      * Reads an UInt8 value from the current read position or an optionally provided offset. | ||
|  |      * | ||
|  |      * @param offset { Number } The offset to read data from (optional) | ||
|  |      * @return { Number } | ||
|  |      */ | ||
|  |     readUInt8(offset) { | ||
|  |         return this._readNumberValue(Buffer.prototype.readUInt8, 1, offset); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Reads an UInt16BE value from the current read position or an optionally provided offset. | ||
|  |      * | ||
|  |      * @param offset { Number } The offset to read data from (optional) | ||
|  |      * @return { Number } | ||
|  |      */ | ||
|  |     readUInt16BE(offset) { | ||
|  |         return this._readNumberValue(Buffer.prototype.readUInt16BE, 2, offset); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Reads an UInt16LE value from the current read position or an optionally provided offset. | ||
|  |      * | ||
|  |      * @param offset { Number } The offset to read data from (optional) | ||
|  |      * @return { Number } | ||
|  |      */ | ||
|  |     readUInt16LE(offset) { | ||
|  |         return this._readNumberValue(Buffer.prototype.readUInt16LE, 2, offset); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Reads an UInt32BE value from the current read position or an optionally provided offset. | ||
|  |      * | ||
|  |      * @param offset { Number } The offset to read data from (optional) | ||
|  |      * @return { Number } | ||
|  |      */ | ||
|  |     readUInt32BE(offset) { | ||
|  |         return this._readNumberValue(Buffer.prototype.readUInt32BE, 4, offset); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Reads an UInt32LE value from the current read position or an optionally provided offset. | ||
|  |      * | ||
|  |      * @param offset { Number } The offset to read data from (optional) | ||
|  |      * @return { Number } | ||
|  |      */ | ||
|  |     readUInt32LE(offset) { | ||
|  |         return this._readNumberValue(Buffer.prototype.readUInt32LE, 4, offset); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Reads a BigUInt64BE value from the current read position or an optionally provided offset. | ||
|  |      * | ||
|  |      * @param offset { Number } The offset to read data from (optional) | ||
|  |      * @return { BigInt } | ||
|  |      */ | ||
|  |     readBigUInt64BE(offset) { | ||
|  |         utils_1.bigIntAndBufferInt64Check('readBigUInt64BE'); | ||
|  |         return this._readNumberValue(Buffer.prototype.readBigUInt64BE, 8, offset); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Reads a BigUInt64LE value from the current read position or an optionally provided offset. | ||
|  |      * | ||
|  |      * @param offset { Number } The offset to read data from (optional) | ||
|  |      * @return { BigInt } | ||
|  |      */ | ||
|  |     readBigUInt64LE(offset) { | ||
|  |         utils_1.bigIntAndBufferInt64Check('readBigUInt64LE'); | ||
|  |         return this._readNumberValue(Buffer.prototype.readBigUInt64LE, 8, offset); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Writes an UInt8 value to the current write position (or at optional offset). | ||
|  |      * | ||
|  |      * @param value { Number } The value to write. | ||
|  |      * @param offset { Number } The offset to write the value at. | ||
|  |      * | ||
|  |      * @return this | ||
|  |      */ | ||
|  |     writeUInt8(value, offset) { | ||
|  |         return this._writeNumberValue(Buffer.prototype.writeUInt8, 1, value, offset); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Inserts an UInt8 value at the given offset value. | ||
|  |      * | ||
|  |      * @param value { Number } The value to insert. | ||
|  |      * @param offset { Number } The offset to insert the value at. | ||
|  |      * | ||
|  |      * @return this | ||
|  |      */ | ||
|  |     insertUInt8(value, offset) { | ||
|  |         return this._insertNumberValue(Buffer.prototype.writeUInt8, 1, value, offset); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Writes an UInt16BE value to the current write position (or at optional offset). | ||
|  |      * | ||
|  |      * @param value { Number } The value to write. | ||
|  |      * @param offset { Number } The offset to write the value at. | ||
|  |      * | ||
|  |      * @return this | ||
|  |      */ | ||
|  |     writeUInt16BE(value, offset) { | ||
|  |         return this._writeNumberValue(Buffer.prototype.writeUInt16BE, 2, value, offset); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Inserts an UInt16BE value at the given offset value. | ||
|  |      * | ||
|  |      * @param value { Number } The value to insert. | ||
|  |      * @param offset { Number } The offset to insert the value at. | ||
|  |      * | ||
|  |      * @return this | ||
|  |      */ | ||
|  |     insertUInt16BE(value, offset) { | ||
|  |         return this._insertNumberValue(Buffer.prototype.writeUInt16BE, 2, value, offset); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Writes an UInt16LE value to the current write position (or at optional offset). | ||
|  |      * | ||
|  |      * @param value { Number } The value to write. | ||
|  |      * @param offset { Number } The offset to write the value at. | ||
|  |      * | ||
|  |      * @return this | ||
|  |      */ | ||
|  |     writeUInt16LE(value, offset) { | ||
|  |         return this._writeNumberValue(Buffer.prototype.writeUInt16LE, 2, value, offset); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Inserts an UInt16LE value at the given offset value. | ||
|  |      * | ||
|  |      * @param value { Number } The value to insert. | ||
|  |      * @param offset { Number } The offset to insert the value at. | ||
|  |      * | ||
|  |      * @return this | ||
|  |      */ | ||
|  |     insertUInt16LE(value, offset) { | ||
|  |         return this._insertNumberValue(Buffer.prototype.writeUInt16LE, 2, value, offset); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Writes an UInt32BE value to the current write position (or at optional offset). | ||
|  |      * | ||
|  |      * @param value { Number } The value to write. | ||
|  |      * @param offset { Number } The offset to write the value at. | ||
|  |      * | ||
|  |      * @return this | ||
|  |      */ | ||
|  |     writeUInt32BE(value, offset) { | ||
|  |         return this._writeNumberValue(Buffer.prototype.writeUInt32BE, 4, value, offset); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Inserts an UInt32BE value at the given offset value. | ||
|  |      * | ||
|  |      * @param value { Number } The value to insert. | ||
|  |      * @param offset { Number } The offset to insert the value at. | ||
|  |      * | ||
|  |      * @return this | ||
|  |      */ | ||
|  |     insertUInt32BE(value, offset) { | ||
|  |         return this._insertNumberValue(Buffer.prototype.writeUInt32BE, 4, value, offset); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Writes an UInt32LE value to the current write position (or at optional offset). | ||
|  |      * | ||
|  |      * @param value { Number } The value to write. | ||
|  |      * @param offset { Number } The offset to write the value at. | ||
|  |      * | ||
|  |      * @return this | ||
|  |      */ | ||
|  |     writeUInt32LE(value, offset) { | ||
|  |         return this._writeNumberValue(Buffer.prototype.writeUInt32LE, 4, value, offset); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Inserts an UInt32LE value at the given offset value. | ||
|  |      * | ||
|  |      * @param value { Number } The value to insert. | ||
|  |      * @param offset { Number } The offset to insert the value at. | ||
|  |      * | ||
|  |      * @return this | ||
|  |      */ | ||
|  |     insertUInt32LE(value, offset) { | ||
|  |         return this._insertNumberValue(Buffer.prototype.writeUInt32LE, 4, value, offset); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Writes a BigUInt64BE value to the current write position (or at optional offset). | ||
|  |      * | ||
|  |      * @param value { Number } The value to write. | ||
|  |      * @param offset { Number } The offset to write the value at. | ||
|  |      * | ||
|  |      * @return this | ||
|  |      */ | ||
|  |     writeBigUInt64BE(value, offset) { | ||
|  |         utils_1.bigIntAndBufferInt64Check('writeBigUInt64BE'); | ||
|  |         return this._writeNumberValue(Buffer.prototype.writeBigUInt64BE, 8, value, offset); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Inserts a BigUInt64BE value at the given offset value. | ||
|  |      * | ||
|  |      * @param value { Number } The value to insert. | ||
|  |      * @param offset { Number } The offset to insert the value at. | ||
|  |      * | ||
|  |      * @return this | ||
|  |      */ | ||
|  |     insertBigUInt64BE(value, offset) { | ||
|  |         utils_1.bigIntAndBufferInt64Check('writeBigUInt64BE'); | ||
|  |         return this._insertNumberValue(Buffer.prototype.writeBigUInt64BE, 8, value, offset); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Writes a BigUInt64LE value to the current write position (or at optional offset). | ||
|  |      * | ||
|  |      * @param value { Number } The value to write. | ||
|  |      * @param offset { Number } The offset to write the value at. | ||
|  |      * | ||
|  |      * @return this | ||
|  |      */ | ||
|  |     writeBigUInt64LE(value, offset) { | ||
|  |         utils_1.bigIntAndBufferInt64Check('writeBigUInt64LE'); | ||
|  |         return this._writeNumberValue(Buffer.prototype.writeBigUInt64LE, 8, value, offset); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Inserts a BigUInt64LE value at the given offset value. | ||
|  |      * | ||
|  |      * @param value { Number } The value to insert. | ||
|  |      * @param offset { Number } The offset to insert the value at. | ||
|  |      * | ||
|  |      * @return this | ||
|  |      */ | ||
|  |     insertBigUInt64LE(value, offset) { | ||
|  |         utils_1.bigIntAndBufferInt64Check('writeBigUInt64LE'); | ||
|  |         return this._insertNumberValue(Buffer.prototype.writeBigUInt64LE, 8, value, offset); | ||
|  |     } | ||
|  |     // Floating Point
 | ||
|  |     /** | ||
|  |      * Reads an FloatBE value from the current read position or an optionally provided offset. | ||
|  |      * | ||
|  |      * @param offset { Number } The offset to read data from (optional) | ||
|  |      * @return { Number } | ||
|  |      */ | ||
|  |     readFloatBE(offset) { | ||
|  |         return this._readNumberValue(Buffer.prototype.readFloatBE, 4, offset); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Reads an FloatLE value from the current read position or an optionally provided offset. | ||
|  |      * | ||
|  |      * @param offset { Number } The offset to read data from (optional) | ||
|  |      * @return { Number } | ||
|  |      */ | ||
|  |     readFloatLE(offset) { | ||
|  |         return this._readNumberValue(Buffer.prototype.readFloatLE, 4, offset); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Writes a FloatBE value to the current write position (or at optional offset). | ||
|  |      * | ||
|  |      * @param value { Number } The value to write. | ||
|  |      * @param offset { Number } The offset to write the value at. | ||
|  |      * | ||
|  |      * @return this | ||
|  |      */ | ||
|  |     writeFloatBE(value, offset) { | ||
|  |         return this._writeNumberValue(Buffer.prototype.writeFloatBE, 4, value, offset); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Inserts a FloatBE value at the given offset value. | ||
|  |      * | ||
|  |      * @param value { Number } The value to insert. | ||
|  |      * @param offset { Number } The offset to insert the value at. | ||
|  |      * | ||
|  |      * @return this | ||
|  |      */ | ||
|  |     insertFloatBE(value, offset) { | ||
|  |         return this._insertNumberValue(Buffer.prototype.writeFloatBE, 4, value, offset); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Writes a FloatLE value to the current write position (or at optional offset). | ||
|  |      * | ||
|  |      * @param value { Number } The value to write. | ||
|  |      * @param offset { Number } The offset to write the value at. | ||
|  |      * | ||
|  |      * @return this | ||
|  |      */ | ||
|  |     writeFloatLE(value, offset) { | ||
|  |         return this._writeNumberValue(Buffer.prototype.writeFloatLE, 4, value, offset); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Inserts a FloatLE value at the given offset value. | ||
|  |      * | ||
|  |      * @param value { Number } The value to insert. | ||
|  |      * @param offset { Number } The offset to insert the value at. | ||
|  |      * | ||
|  |      * @return this | ||
|  |      */ | ||
|  |     insertFloatLE(value, offset) { | ||
|  |         return this._insertNumberValue(Buffer.prototype.writeFloatLE, 4, value, offset); | ||
|  |     } | ||
|  |     // Double Floating Point
 | ||
|  |     /** | ||
|  |      * Reads an DoublEBE value from the current read position or an optionally provided offset. | ||
|  |      * | ||
|  |      * @param offset { Number } The offset to read data from (optional) | ||
|  |      * @return { Number } | ||
|  |      */ | ||
|  |     readDoubleBE(offset) { | ||
|  |         return this._readNumberValue(Buffer.prototype.readDoubleBE, 8, offset); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Reads an DoubleLE value from the current read position or an optionally provided offset. | ||
|  |      * | ||
|  |      * @param offset { Number } The offset to read data from (optional) | ||
|  |      * @return { Number } | ||
|  |      */ | ||
|  |     readDoubleLE(offset) { | ||
|  |         return this._readNumberValue(Buffer.prototype.readDoubleLE, 8, offset); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Writes a DoubleBE value to the current write position (or at optional offset). | ||
|  |      * | ||
|  |      * @param value { Number } The value to write. | ||
|  |      * @param offset { Number } The offset to write the value at. | ||
|  |      * | ||
|  |      * @return this | ||
|  |      */ | ||
|  |     writeDoubleBE(value, offset) { | ||
|  |         return this._writeNumberValue(Buffer.prototype.writeDoubleBE, 8, value, offset); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Inserts a DoubleBE value at the given offset value. | ||
|  |      * | ||
|  |      * @param value { Number } The value to insert. | ||
|  |      * @param offset { Number } The offset to insert the value at. | ||
|  |      * | ||
|  |      * @return this | ||
|  |      */ | ||
|  |     insertDoubleBE(value, offset) { | ||
|  |         return this._insertNumberValue(Buffer.prototype.writeDoubleBE, 8, value, offset); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Writes a DoubleLE value to the current write position (or at optional offset). | ||
|  |      * | ||
|  |      * @param value { Number } The value to write. | ||
|  |      * @param offset { Number } The offset to write the value at. | ||
|  |      * | ||
|  |      * @return this | ||
|  |      */ | ||
|  |     writeDoubleLE(value, offset) { | ||
|  |         return this._writeNumberValue(Buffer.prototype.writeDoubleLE, 8, value, offset); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Inserts a DoubleLE value at the given offset value. | ||
|  |      * | ||
|  |      * @param value { Number } The value to insert. | ||
|  |      * @param offset { Number } The offset to insert the value at. | ||
|  |      * | ||
|  |      * @return this | ||
|  |      */ | ||
|  |     insertDoubleLE(value, offset) { | ||
|  |         return this._insertNumberValue(Buffer.prototype.writeDoubleLE, 8, value, offset); | ||
|  |     } | ||
|  |     // Strings
 | ||
|  |     /** | ||
|  |      * Reads a String from the current read position. | ||
|  |      * | ||
|  |      * @param arg1 { Number | String } The number of bytes to read as a String, or the BufferEncoding to use for | ||
|  |      *             the string (Defaults to instance level encoding). | ||
|  |      * @param encoding { String } The BufferEncoding to use for the string (Defaults to instance level encoding). | ||
|  |      * | ||
|  |      * @return { String } | ||
|  |      */ | ||
|  |     readString(arg1, encoding) { | ||
|  |         let lengthVal; | ||
|  |         // Length provided
 | ||
|  |         if (typeof arg1 === 'number') { | ||
|  |             utils_1.checkLengthValue(arg1); | ||
|  |             lengthVal = Math.min(arg1, this.length - this._readOffset); | ||
|  |         } | ||
|  |         else { | ||
|  |             encoding = arg1; | ||
|  |             lengthVal = this.length - this._readOffset; | ||
|  |         } | ||
|  |         // Check encoding
 | ||
|  |         if (typeof encoding !== 'undefined') { | ||
|  |             utils_1.checkEncoding(encoding); | ||
|  |         } | ||
|  |         const value = this._buff.slice(this._readOffset, this._readOffset + lengthVal).toString(encoding || this._encoding); | ||
|  |         this._readOffset += lengthVal; | ||
|  |         return value; | ||
|  |     } | ||
|  |     /** | ||
|  |      * Inserts a String | ||
|  |      * | ||
|  |      * @param value { String } The String value to insert. | ||
|  |      * @param offset { Number } The offset to insert the string at. | ||
|  |      * @param encoding { String } The BufferEncoding to use for writing strings (defaults to instance encoding). | ||
|  |      * | ||
|  |      * @return this | ||
|  |      */ | ||
|  |     insertString(value, offset, encoding) { | ||
|  |         utils_1.checkOffsetValue(offset); | ||
|  |         return this._handleString(value, true, offset, encoding); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Writes a String | ||
|  |      * | ||
|  |      * @param value { String } The String value to write. | ||
|  |      * @param arg2 { Number | String } The offset to write the string at, or the BufferEncoding to use. | ||
|  |      * @param encoding { String } The BufferEncoding to use for writing strings (defaults to instance encoding). | ||
|  |      * | ||
|  |      * @return this | ||
|  |      */ | ||
|  |     writeString(value, arg2, encoding) { | ||
|  |         return this._handleString(value, false, arg2, encoding); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Reads a null-terminated String from the current read position. | ||
|  |      * | ||
|  |      * @param encoding { String } The BufferEncoding to use for the string (Defaults to instance level encoding). | ||
|  |      * | ||
|  |      * @return { String } | ||
|  |      */ | ||
|  |     readStringNT(encoding) { | ||
|  |         if (typeof encoding !== 'undefined') { | ||
|  |             utils_1.checkEncoding(encoding); | ||
|  |         } | ||
|  |         // Set null character position to the end SmartBuffer instance.
 | ||
|  |         let nullPos = this.length; | ||
|  |         // Find next null character (if one is not found, default from above is used)
 | ||
|  |         for (let i = this._readOffset; i < this.length; i++) { | ||
|  |             if (this._buff[i] === 0x00) { | ||
|  |                 nullPos = i; | ||
|  |                 break; | ||
|  |             } | ||
|  |         } | ||
|  |         // Read string value
 | ||
|  |         const value = this._buff.slice(this._readOffset, nullPos); | ||
|  |         // Increment internal Buffer read offset
 | ||
|  |         this._readOffset = nullPos + 1; | ||
|  |         return value.toString(encoding || this._encoding); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Inserts a null-terminated String. | ||
|  |      * | ||
|  |      * @param value { String } The String value to write. | ||
|  |      * @param arg2 { Number | String } The offset to write the string to, or the BufferEncoding to use. | ||
|  |      * @param encoding { String } The BufferEncoding to use for writing strings (defaults to instance encoding). | ||
|  |      * | ||
|  |      * @return this | ||
|  |      */ | ||
|  |     insertStringNT(value, offset, encoding) { | ||
|  |         utils_1.checkOffsetValue(offset); | ||
|  |         // Write Values
 | ||
|  |         this.insertString(value, offset, encoding); | ||
|  |         this.insertUInt8(0x00, offset + value.length); | ||
|  |         return this; | ||
|  |     } | ||
|  |     /** | ||
|  |      * Writes a null-terminated String. | ||
|  |      * | ||
|  |      * @param value { String } The String value to write. | ||
|  |      * @param arg2 { Number | String } The offset to write the string to, or the BufferEncoding to use. | ||
|  |      * @param encoding { String } The BufferEncoding to use for writing strings (defaults to instance encoding). | ||
|  |      * | ||
|  |      * @return this | ||
|  |      */ | ||
|  |     writeStringNT(value, arg2, encoding) { | ||
|  |         // Write Values
 | ||
|  |         this.writeString(value, arg2, encoding); | ||
|  |         this.writeUInt8(0x00, typeof arg2 === 'number' ? arg2 + value.length : this.writeOffset); | ||
|  |         return this; | ||
|  |     } | ||
|  |     // Buffers
 | ||
|  |     /** | ||
|  |      * Reads a Buffer from the internal read position. | ||
|  |      * | ||
|  |      * @param length { Number } The length of data to read as a Buffer. | ||
|  |      * | ||
|  |      * @return { Buffer } | ||
|  |      */ | ||
|  |     readBuffer(length) { | ||
|  |         if (typeof length !== 'undefined') { | ||
|  |             utils_1.checkLengthValue(length); | ||
|  |         } | ||
|  |         const lengthVal = typeof length === 'number' ? length : this.length; | ||
|  |         const endPoint = Math.min(this.length, this._readOffset + lengthVal); | ||
|  |         // Read buffer value
 | ||
|  |         const value = this._buff.slice(this._readOffset, endPoint); | ||
|  |         // Increment internal Buffer read offset
 | ||
|  |         this._readOffset = endPoint; | ||
|  |         return value; | ||
|  |     } | ||
|  |     /** | ||
|  |      * Writes a Buffer to the current write position. | ||
|  |      * | ||
|  |      * @param value { Buffer } The Buffer to write. | ||
|  |      * @param offset { Number } The offset to write the Buffer to. | ||
|  |      * | ||
|  |      * @return this | ||
|  |      */ | ||
|  |     insertBuffer(value, offset) { | ||
|  |         utils_1.checkOffsetValue(offset); | ||
|  |         return this._handleBuffer(value, true, offset); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Writes a Buffer to the current write position. | ||
|  |      * | ||
|  |      * @param value { Buffer } The Buffer to write. | ||
|  |      * @param offset { Number } The offset to write the Buffer to. | ||
|  |      * | ||
|  |      * @return this | ||
|  |      */ | ||
|  |     writeBuffer(value, offset) { | ||
|  |         return this._handleBuffer(value, false, offset); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Reads a null-terminated Buffer from the current read poisiton. | ||
|  |      * | ||
|  |      * @return { Buffer } | ||
|  |      */ | ||
|  |     readBufferNT() { | ||
|  |         // Set null character position to the end SmartBuffer instance.
 | ||
|  |         let nullPos = this.length; | ||
|  |         // Find next null character (if one is not found, default from above is used)
 | ||
|  |         for (let i = this._readOffset; i < this.length; i++) { | ||
|  |             if (this._buff[i] === 0x00) { | ||
|  |                 nullPos = i; | ||
|  |                 break; | ||
|  |             } | ||
|  |         } | ||
|  |         // Read value
 | ||
|  |         const value = this._buff.slice(this._readOffset, nullPos); | ||
|  |         // Increment internal Buffer read offset
 | ||
|  |         this._readOffset = nullPos + 1; | ||
|  |         return value; | ||
|  |     } | ||
|  |     /** | ||
|  |      * Inserts a null-terminated Buffer. | ||
|  |      * | ||
|  |      * @param value { Buffer } The Buffer to write. | ||
|  |      * @param offset { Number } The offset to write the Buffer to. | ||
|  |      * | ||
|  |      * @return this | ||
|  |      */ | ||
|  |     insertBufferNT(value, offset) { | ||
|  |         utils_1.checkOffsetValue(offset); | ||
|  |         // Write Values
 | ||
|  |         this.insertBuffer(value, offset); | ||
|  |         this.insertUInt8(0x00, offset + value.length); | ||
|  |         return this; | ||
|  |     } | ||
|  |     /** | ||
|  |      * Writes a null-terminated Buffer. | ||
|  |      * | ||
|  |      * @param value { Buffer } The Buffer to write. | ||
|  |      * @param offset { Number } The offset to write the Buffer to. | ||
|  |      * | ||
|  |      * @return this | ||
|  |      */ | ||
|  |     writeBufferNT(value, offset) { | ||
|  |         // Checks for valid numberic value;
 | ||
|  |         if (typeof offset !== 'undefined') { | ||
|  |             utils_1.checkOffsetValue(offset); | ||
|  |         } | ||
|  |         // Write Values
 | ||
|  |         this.writeBuffer(value, offset); | ||
|  |         this.writeUInt8(0x00, typeof offset === 'number' ? offset + value.length : this._writeOffset); | ||
|  |         return this; | ||
|  |     } | ||
|  |     /** | ||
|  |      * Clears the SmartBuffer instance to its original empty state. | ||
|  |      */ | ||
|  |     clear() { | ||
|  |         this._writeOffset = 0; | ||
|  |         this._readOffset = 0; | ||
|  |         this.length = 0; | ||
|  |         return this; | ||
|  |     } | ||
|  |     /** | ||
|  |      * Gets the remaining data left to be read from the SmartBuffer instance. | ||
|  |      * | ||
|  |      * @return { Number } | ||
|  |      */ | ||
|  |     remaining() { | ||
|  |         return this.length - this._readOffset; | ||
|  |     } | ||
|  |     /** | ||
|  |      * Gets the current read offset value of the SmartBuffer instance. | ||
|  |      * | ||
|  |      * @return { Number } | ||
|  |      */ | ||
|  |     get readOffset() { | ||
|  |         return this._readOffset; | ||
|  |     } | ||
|  |     /** | ||
|  |      * Sets the read offset value of the SmartBuffer instance. | ||
|  |      * | ||
|  |      * @param offset { Number } - The offset value to set. | ||
|  |      */ | ||
|  |     set readOffset(offset) { | ||
|  |         utils_1.checkOffsetValue(offset); | ||
|  |         // Check for bounds.
 | ||
|  |         utils_1.checkTargetOffset(offset, this); | ||
|  |         this._readOffset = offset; | ||
|  |     } | ||
|  |     /** | ||
|  |      * Gets the current write offset value of the SmartBuffer instance. | ||
|  |      * | ||
|  |      * @return { Number } | ||
|  |      */ | ||
|  |     get writeOffset() { | ||
|  |         return this._writeOffset; | ||
|  |     } | ||
|  |     /** | ||
|  |      * Sets the write offset value of the SmartBuffer instance. | ||
|  |      * | ||
|  |      * @param offset { Number } - The offset value to set. | ||
|  |      */ | ||
|  |     set writeOffset(offset) { | ||
|  |         utils_1.checkOffsetValue(offset); | ||
|  |         // Check for bounds.
 | ||
|  |         utils_1.checkTargetOffset(offset, this); | ||
|  |         this._writeOffset = offset; | ||
|  |     } | ||
|  |     /** | ||
|  |      * Gets the currently set string encoding of the SmartBuffer instance. | ||
|  |      * | ||
|  |      * @return { BufferEncoding } The string Buffer encoding currently set. | ||
|  |      */ | ||
|  |     get encoding() { | ||
|  |         return this._encoding; | ||
|  |     } | ||
|  |     /** | ||
|  |      * Sets the string encoding of the SmartBuffer instance. | ||
|  |      * | ||
|  |      * @param encoding { BufferEncoding } The string Buffer encoding to set. | ||
|  |      */ | ||
|  |     set encoding(encoding) { | ||
|  |         utils_1.checkEncoding(encoding); | ||
|  |         this._encoding = encoding; | ||
|  |     } | ||
|  |     /** | ||
|  |      * Gets the underlying internal Buffer. (This includes unmanaged data in the Buffer) | ||
|  |      * | ||
|  |      * @return { Buffer } The Buffer value. | ||
|  |      */ | ||
|  |     get internalBuffer() { | ||
|  |         return this._buff; | ||
|  |     } | ||
|  |     /** | ||
|  |      * Gets the value of the internal managed Buffer (Includes managed data only) | ||
|  |      * | ||
|  |      * @param { Buffer } | ||
|  |      */ | ||
|  |     toBuffer() { | ||
|  |         return this._buff.slice(0, this.length); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Gets the String value of the internal managed Buffer | ||
|  |      * | ||
|  |      * @param encoding { String } The BufferEncoding to display the Buffer as (defaults to instance level encoding). | ||
|  |      */ | ||
|  |     toString(encoding) { | ||
|  |         const encodingVal = typeof encoding === 'string' ? encoding : this._encoding; | ||
|  |         // Check for invalid encoding.
 | ||
|  |         utils_1.checkEncoding(encodingVal); | ||
|  |         return this._buff.toString(encodingVal, 0, this.length); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Destroys the SmartBuffer instance. | ||
|  |      */ | ||
|  |     destroy() { | ||
|  |         this.clear(); | ||
|  |         return this; | ||
|  |     } | ||
|  |     /** | ||
|  |      * Handles inserting and writing strings. | ||
|  |      * | ||
|  |      * @param value { String } The String value to insert. | ||
|  |      * @param isInsert { Boolean } True if inserting a string, false if writing. | ||
|  |      * @param arg2 { Number | String } The offset to insert the string at, or the BufferEncoding to use. | ||
|  |      * @param encoding { String } The BufferEncoding to use for writing strings (defaults to instance encoding). | ||
|  |      */ | ||
|  |     _handleString(value, isInsert, arg3, encoding) { | ||
|  |         let offsetVal = this._writeOffset; | ||
|  |         let encodingVal = this._encoding; | ||
|  |         // Check for offset
 | ||
|  |         if (typeof arg3 === 'number') { | ||
|  |             offsetVal = arg3; | ||
|  |             // Check for encoding
 | ||
|  |         } | ||
|  |         else if (typeof arg3 === 'string') { | ||
|  |             utils_1.checkEncoding(arg3); | ||
|  |             encodingVal = arg3; | ||
|  |         } | ||
|  |         // Check for encoding (third param)
 | ||
|  |         if (typeof encoding === 'string') { | ||
|  |             utils_1.checkEncoding(encoding); | ||
|  |             encodingVal = encoding; | ||
|  |         } | ||
|  |         // Calculate bytelength of string.
 | ||
|  |         const byteLength = Buffer.byteLength(value, encodingVal); | ||
|  |         // Ensure there is enough internal Buffer capacity.
 | ||
|  |         if (isInsert) { | ||
|  |             this.ensureInsertable(byteLength, offsetVal); | ||
|  |         } | ||
|  |         else { | ||
|  |             this._ensureWriteable(byteLength, offsetVal); | ||
|  |         } | ||
|  |         // Write value
 | ||
|  |         this._buff.write(value, offsetVal, byteLength, encodingVal); | ||
|  |         // Increment internal Buffer write offset;
 | ||
|  |         if (isInsert) { | ||
|  |             this._writeOffset += byteLength; | ||
|  |         } | ||
|  |         else { | ||
|  |             // If an offset was given, check to see if we wrote beyond the current writeOffset.
 | ||
|  |             if (typeof arg3 === 'number') { | ||
|  |                 this._writeOffset = Math.max(this._writeOffset, offsetVal + byteLength); | ||
|  |             } | ||
|  |             else { | ||
|  |                 // If no offset was given, we wrote to the end of the SmartBuffer so increment writeOffset.
 | ||
|  |                 this._writeOffset += byteLength; | ||
|  |             } | ||
|  |         } | ||
|  |         return this; | ||
|  |     } | ||
|  |     /** | ||
|  |      * Handles writing or insert of a Buffer. | ||
|  |      * | ||
|  |      * @param value { Buffer } The Buffer to write. | ||
|  |      * @param offset { Number } The offset to write the Buffer to. | ||
|  |      */ | ||
|  |     _handleBuffer(value, isInsert, offset) { | ||
|  |         const offsetVal = typeof offset === 'number' ? offset : this._writeOffset; | ||
|  |         // Ensure there is enough internal Buffer capacity.
 | ||
|  |         if (isInsert) { | ||
|  |             this.ensureInsertable(value.length, offsetVal); | ||
|  |         } | ||
|  |         else { | ||
|  |             this._ensureWriteable(value.length, offsetVal); | ||
|  |         } | ||
|  |         // Write buffer value
 | ||
|  |         value.copy(this._buff, offsetVal); | ||
|  |         // Increment internal Buffer write offset;
 | ||
|  |         if (isInsert) { | ||
|  |             this._writeOffset += value.length; | ||
|  |         } | ||
|  |         else { | ||
|  |             // If an offset was given, check to see if we wrote beyond the current writeOffset.
 | ||
|  |             if (typeof offset === 'number') { | ||
|  |                 this._writeOffset = Math.max(this._writeOffset, offsetVal + value.length); | ||
|  |             } | ||
|  |             else { | ||
|  |                 // If no offset was given, we wrote to the end of the SmartBuffer so increment writeOffset.
 | ||
|  |                 this._writeOffset += value.length; | ||
|  |             } | ||
|  |         } | ||
|  |         return this; | ||
|  |     } | ||
|  |     /** | ||
|  |      * Ensures that the internal Buffer is large enough to read data. | ||
|  |      * | ||
|  |      * @param length { Number } The length of the data that needs to be read. | ||
|  |      * @param offset { Number } The offset of the data that needs to be read. | ||
|  |      */ | ||
|  |     ensureReadable(length, offset) { | ||
|  |         // Offset value defaults to managed read offset.
 | ||
|  |         let offsetVal = this._readOffset; | ||
|  |         // If an offset was provided, use it.
 | ||
|  |         if (typeof offset !== 'undefined') { | ||
|  |             // Checks for valid numberic value;
 | ||
|  |             utils_1.checkOffsetValue(offset); | ||
|  |             // Overide with custom offset.
 | ||
|  |             offsetVal = offset; | ||
|  |         } | ||
|  |         // Checks if offset is below zero, or the offset+length offset is beyond the total length of the managed data.
 | ||
|  |         if (offsetVal < 0 || offsetVal + length > this.length) { | ||
|  |             throw new Error(utils_1.ERRORS.INVALID_READ_BEYOND_BOUNDS); | ||
|  |         } | ||
|  |     } | ||
|  |     /** | ||
|  |      * Ensures that the internal Buffer is large enough to insert data. | ||
|  |      * | ||
|  |      * @param dataLength { Number } The length of the data that needs to be written. | ||
|  |      * @param offset { Number } The offset of the data to be written. | ||
|  |      */ | ||
|  |     ensureInsertable(dataLength, offset) { | ||
|  |         // Checks for valid numberic value;
 | ||
|  |         utils_1.checkOffsetValue(offset); | ||
|  |         // Ensure there is enough internal Buffer capacity.
 | ||
|  |         this._ensureCapacity(this.length + dataLength); | ||
|  |         // If an offset was provided and its not the very end of the buffer, copy data into appropriate location in regards to the offset.
 | ||
|  |         if (offset < this.length) { | ||
|  |             this._buff.copy(this._buff, offset + dataLength, offset, this._buff.length); | ||
|  |         } | ||
|  |         // Adjust tracked smart buffer length
 | ||
|  |         if (offset + dataLength > this.length) { | ||
|  |             this.length = offset + dataLength; | ||
|  |         } | ||
|  |         else { | ||
|  |             this.length += dataLength; | ||
|  |         } | ||
|  |     } | ||
|  |     /** | ||
|  |      * Ensures that the internal Buffer is large enough to write data. | ||
|  |      * | ||
|  |      * @param dataLength { Number } The length of the data that needs to be written. | ||
|  |      * @param offset { Number } The offset of the data to be written (defaults to writeOffset). | ||
|  |      */ | ||
|  |     _ensureWriteable(dataLength, offset) { | ||
|  |         const offsetVal = typeof offset === 'number' ? offset : this._writeOffset; | ||
|  |         // Ensure enough capacity to write data.
 | ||
|  |         this._ensureCapacity(offsetVal + dataLength); | ||
|  |         // Adjust SmartBuffer length (if offset + length is larger than managed length, adjust length)
 | ||
|  |         if (offsetVal + dataLength > this.length) { | ||
|  |             this.length = offsetVal + dataLength; | ||
|  |         } | ||
|  |     } | ||
|  |     /** | ||
|  |      * Ensures that the internal Buffer is large enough to write at least the given amount of data. | ||
|  |      * | ||
|  |      * @param minLength { Number } The minimum length of the data needs to be written. | ||
|  |      */ | ||
|  |     _ensureCapacity(minLength) { | ||
|  |         const oldLength = this._buff.length; | ||
|  |         if (minLength > oldLength) { | ||
|  |             let data = this._buff; | ||
|  |             let newLength = (oldLength * 3) / 2 + 1; | ||
|  |             if (newLength < minLength) { | ||
|  |                 newLength = minLength; | ||
|  |             } | ||
|  |             this._buff = Buffer.allocUnsafe(newLength); | ||
|  |             data.copy(this._buff, 0, 0, oldLength); | ||
|  |         } | ||
|  |     } | ||
|  |     /** | ||
|  |      * Reads a numeric number value using the provided function. | ||
|  |      * | ||
|  |      * @typeparam T { number | bigint } The type of the value to be read | ||
|  |      * | ||
|  |      * @param func { Function(offset: number) => number } The function to read data on the internal Buffer with. | ||
|  |      * @param byteSize { Number } The number of bytes read. | ||
|  |      * @param offset { Number } The offset to read from (optional). When this is not provided, the managed readOffset is used instead. | ||
|  |      * | ||
|  |      * @returns { T } the number value | ||
|  |      */ | ||
|  |     _readNumberValue(func, byteSize, offset) { | ||
|  |         this.ensureReadable(byteSize, offset); | ||
|  |         // Call Buffer.readXXXX();
 | ||
|  |         const value = func.call(this._buff, typeof offset === 'number' ? offset : this._readOffset); | ||
|  |         // Adjust internal read offset if an optional read offset was not provided.
 | ||
|  |         if (typeof offset === 'undefined') { | ||
|  |             this._readOffset += byteSize; | ||
|  |         } | ||
|  |         return value; | ||
|  |     } | ||
|  |     /** | ||
|  |      * Inserts a numeric number value based on the given offset and value. | ||
|  |      * | ||
|  |      * @typeparam T { number | bigint } The type of the value to be written | ||
|  |      * | ||
|  |      * @param func { Function(offset: T, offset?) => number} The function to write data on the internal Buffer with. | ||
|  |      * @param byteSize { Number } The number of bytes written. | ||
|  |      * @param value { T } The number value to write. | ||
|  |      * @param offset { Number } the offset to write the number at (REQUIRED). | ||
|  |      * | ||
|  |      * @returns SmartBuffer this buffer | ||
|  |      */ | ||
|  |     _insertNumberValue(func, byteSize, value, offset) { | ||
|  |         // Check for invalid offset values.
 | ||
|  |         utils_1.checkOffsetValue(offset); | ||
|  |         // Ensure there is enough internal Buffer capacity. (raw offset is passed)
 | ||
|  |         this.ensureInsertable(byteSize, offset); | ||
|  |         // Call buffer.writeXXXX();
 | ||
|  |         func.call(this._buff, value, offset); | ||
|  |         // Adjusts internally managed write offset.
 | ||
|  |         this._writeOffset += byteSize; | ||
|  |         return this; | ||
|  |     } | ||
|  |     /** | ||
|  |      * Writes a numeric number value based on the given offset and value. | ||
|  |      * | ||
|  |      * @typeparam T { number | bigint } The type of the value to be written | ||
|  |      * | ||
|  |      * @param func { Function(offset: T, offset?) => number} The function to write data on the internal Buffer with. | ||
|  |      * @param byteSize { Number } The number of bytes written. | ||
|  |      * @param value { T } The number value to write. | ||
|  |      * @param offset { Number } the offset to write the number at (REQUIRED). | ||
|  |      * | ||
|  |      * @returns SmartBuffer this buffer | ||
|  |      */ | ||
|  |     _writeNumberValue(func, byteSize, value, offset) { | ||
|  |         // If an offset was provided, validate it.
 | ||
|  |         if (typeof offset === 'number') { | ||
|  |             // Check if we're writing beyond the bounds of the managed data.
 | ||
|  |             if (offset < 0) { | ||
|  |                 throw new Error(utils_1.ERRORS.INVALID_WRITE_BEYOND_BOUNDS); | ||
|  |             } | ||
|  |             utils_1.checkOffsetValue(offset); | ||
|  |         } | ||
|  |         // Default to writeOffset if no offset value was given.
 | ||
|  |         const offsetVal = typeof offset === 'number' ? offset : this._writeOffset; | ||
|  |         // Ensure there is enough internal Buffer capacity. (raw offset is passed)
 | ||
|  |         this._ensureWriteable(byteSize, offsetVal); | ||
|  |         func.call(this._buff, value, offsetVal); | ||
|  |         // If an offset was given, check to see if we wrote beyond the current writeOffset.
 | ||
|  |         if (typeof offset === 'number') { | ||
|  |             this._writeOffset = Math.max(this._writeOffset, offsetVal + byteSize); | ||
|  |         } | ||
|  |         else { | ||
|  |             // If no numeric offset was given, we wrote to the end of the SmartBuffer so increment writeOffset.
 | ||
|  |             this._writeOffset += byteSize; | ||
|  |         } | ||
|  |         return this; | ||
|  |     } | ||
|  | } | ||
|  | exports.SmartBuffer = SmartBuffer; | ||
|  | //# sourceMappingURL=smartbuffer.js.map
 |