• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3const utils_1 = require("./utils");
4// The default Buffer size if one is not provided.
5const DEFAULT_SMARTBUFFER_SIZE = 4096;
6// The default string encoding to use for reading/writing strings.
7const DEFAULT_SMARTBUFFER_ENCODING = 'utf8';
8class SmartBuffer {
9    /**
10     * Creates a new SmartBuffer instance.
11     *
12     * @param options { SmartBufferOptions } The SmartBufferOptions to apply to this instance.
13     */
14    constructor(options) {
15        this.length = 0;
16        this._encoding = DEFAULT_SMARTBUFFER_ENCODING;
17        this._writeOffset = 0;
18        this._readOffset = 0;
19        if (SmartBuffer.isSmartBufferOptions(options)) {
20            // Checks for encoding
21            if (options.encoding) {
22                utils_1.checkEncoding(options.encoding);
23                this._encoding = options.encoding;
24            }
25            // Checks for initial size length
26            if (options.size) {
27                if (utils_1.isFiniteInteger(options.size) && options.size > 0) {
28                    this._buff = Buffer.allocUnsafe(options.size);
29                }
30                else {
31                    throw new Error(utils_1.ERRORS.INVALID_SMARTBUFFER_SIZE);
32                }
33                // Check for initial Buffer
34            }
35            else if (options.buff) {
36                if (options.buff instanceof Buffer) {
37                    this._buff = options.buff;
38                    this.length = options.buff.length;
39                }
40                else {
41                    throw new Error(utils_1.ERRORS.INVALID_SMARTBUFFER_BUFFER);
42                }
43            }
44            else {
45                this._buff = Buffer.allocUnsafe(DEFAULT_SMARTBUFFER_SIZE);
46            }
47        }
48        else {
49            // If something was passed but it's not a SmartBufferOptions object
50            if (typeof options !== 'undefined') {
51                throw new Error(utils_1.ERRORS.INVALID_SMARTBUFFER_OBJECT);
52            }
53            // Otherwise default to sane options
54            this._buff = Buffer.allocUnsafe(DEFAULT_SMARTBUFFER_SIZE);
55        }
56    }
57    /**
58     * Creates a new SmartBuffer instance with the provided internal Buffer size and optional encoding.
59     *
60     * @param size { Number } The size of the internal Buffer.
61     * @param encoding { String } The BufferEncoding to use for strings.
62     *
63     * @return { SmartBuffer }
64     */
65    static fromSize(size, encoding) {
66        return new this({
67            size: size,
68            encoding: encoding
69        });
70    }
71    /**
72     * Creates a new SmartBuffer instance with the provided Buffer and optional encoding.
73     *
74     * @param buffer { Buffer } The Buffer to use as the internal Buffer value.
75     * @param encoding { String } The BufferEncoding to use for strings.
76     *
77     * @return { SmartBuffer }
78     */
79    static fromBuffer(buff, encoding) {
80        return new this({
81            buff: buff,
82            encoding: encoding
83        });
84    }
85    /**
86     * Creates a new SmartBuffer instance with the provided SmartBufferOptions options.
87     *
88     * @param options { SmartBufferOptions } The options to use when creating the SmartBuffer instance.
89     */
90    static fromOptions(options) {
91        return new this(options);
92    }
93    /**
94     * Type checking function that determines if an object is a SmartBufferOptions object.
95     */
96    static isSmartBufferOptions(options) {
97        const castOptions = options;
98        return (castOptions &&
99            (castOptions.encoding !== undefined || castOptions.size !== undefined || castOptions.buff !== undefined));
100    }
101    // Signed integers
102    /**
103     * Reads an Int8 value from the current read position or an optionally provided offset.
104     *
105     * @param offset { Number } The offset to read data from (optional)
106     * @return { Number }
107     */
108    readInt8(offset) {
109        return this._readNumberValue(Buffer.prototype.readInt8, 1, offset);
110    }
111    /**
112     * Reads an Int16BE value from the current read position or an optionally provided offset.
113     *
114     * @param offset { Number } The offset to read data from (optional)
115     * @return { Number }
116     */
117    readInt16BE(offset) {
118        return this._readNumberValue(Buffer.prototype.readInt16BE, 2, offset);
119    }
120    /**
121     * Reads an Int16LE value from the current read position or an optionally provided offset.
122     *
123     * @param offset { Number } The offset to read data from (optional)
124     * @return { Number }
125     */
126    readInt16LE(offset) {
127        return this._readNumberValue(Buffer.prototype.readInt16LE, 2, offset);
128    }
129    /**
130     * Reads an Int32BE value from the current read position or an optionally provided offset.
131     *
132     * @param offset { Number } The offset to read data from (optional)
133     * @return { Number }
134     */
135    readInt32BE(offset) {
136        return this._readNumberValue(Buffer.prototype.readInt32BE, 4, offset);
137    }
138    /**
139     * Reads an Int32LE value from the current read position or an optionally provided offset.
140     *
141     * @param offset { Number } The offset to read data from (optional)
142     * @return { Number }
143     */
144    readInt32LE(offset) {
145        return this._readNumberValue(Buffer.prototype.readInt32LE, 4, offset);
146    }
147    /**
148     * Reads a BigInt64BE value from the current read position or an optionally provided offset.
149     *
150     * @param offset { Number } The offset to read data from (optional)
151     * @return { BigInt }
152     */
153    readBigInt64BE(offset) {
154        utils_1.bigIntAndBufferInt64Check('readBigInt64BE');
155        return this._readNumberValue(Buffer.prototype.readBigInt64BE, 8, offset);
156    }
157    /**
158     * Reads a BigInt64LE value from the current read position or an optionally provided offset.
159     *
160     * @param offset { Number } The offset to read data from (optional)
161     * @return { BigInt }
162     */
163    readBigInt64LE(offset) {
164        utils_1.bigIntAndBufferInt64Check('readBigInt64LE');
165        return this._readNumberValue(Buffer.prototype.readBigInt64LE, 8, offset);
166    }
167    /**
168     * Writes an Int8 value to the current write position (or at optional offset).
169     *
170     * @param value { Number } The value to write.
171     * @param offset { Number } The offset to write the value at.
172     *
173     * @return this
174     */
175    writeInt8(value, offset) {
176        this._writeNumberValue(Buffer.prototype.writeInt8, 1, value, offset);
177        return this;
178    }
179    /**
180     * Inserts an Int8 value at the given offset value.
181     *
182     * @param value { Number } The value to insert.
183     * @param offset { Number } The offset to insert the value at.
184     *
185     * @return this
186     */
187    insertInt8(value, offset) {
188        return this._insertNumberValue(Buffer.prototype.writeInt8, 1, value, offset);
189    }
190    /**
191     * Writes an Int16BE value to the current write position (or at optional offset).
192     *
193     * @param value { Number } The value to write.
194     * @param offset { Number } The offset to write the value at.
195     *
196     * @return this
197     */
198    writeInt16BE(value, offset) {
199        return this._writeNumberValue(Buffer.prototype.writeInt16BE, 2, value, offset);
200    }
201    /**
202     * Inserts an Int16BE value at the given offset value.
203     *
204     * @param value { Number } The value to insert.
205     * @param offset { Number } The offset to insert the value at.
206     *
207     * @return this
208     */
209    insertInt16BE(value, offset) {
210        return this._insertNumberValue(Buffer.prototype.writeInt16BE, 2, value, offset);
211    }
212    /**
213     * Writes an Int16LE value to the current write position (or at optional offset).
214     *
215     * @param value { Number } The value to write.
216     * @param offset { Number } The offset to write the value at.
217     *
218     * @return this
219     */
220    writeInt16LE(value, offset) {
221        return this._writeNumberValue(Buffer.prototype.writeInt16LE, 2, value, offset);
222    }
223    /**
224     * Inserts an Int16LE value at the given offset value.
225     *
226     * @param value { Number } The value to insert.
227     * @param offset { Number } The offset to insert the value at.
228     *
229     * @return this
230     */
231    insertInt16LE(value, offset) {
232        return this._insertNumberValue(Buffer.prototype.writeInt16LE, 2, value, offset);
233    }
234    /**
235     * Writes an Int32BE value to the current write position (or at optional offset).
236     *
237     * @param value { Number } The value to write.
238     * @param offset { Number } The offset to write the value at.
239     *
240     * @return this
241     */
242    writeInt32BE(value, offset) {
243        return this._writeNumberValue(Buffer.prototype.writeInt32BE, 4, value, offset);
244    }
245    /**
246     * Inserts an Int32BE value at the given offset value.
247     *
248     * @param value { Number } The value to insert.
249     * @param offset { Number } The offset to insert the value at.
250     *
251     * @return this
252     */
253    insertInt32BE(value, offset) {
254        return this._insertNumberValue(Buffer.prototype.writeInt32BE, 4, value, offset);
255    }
256    /**
257     * Writes an Int32LE value to the current write position (or at optional offset).
258     *
259     * @param value { Number } The value to write.
260     * @param offset { Number } The offset to write the value at.
261     *
262     * @return this
263     */
264    writeInt32LE(value, offset) {
265        return this._writeNumberValue(Buffer.prototype.writeInt32LE, 4, value, offset);
266    }
267    /**
268     * Inserts an Int32LE value at the given offset value.
269     *
270     * @param value { Number } The value to insert.
271     * @param offset { Number } The offset to insert the value at.
272     *
273     * @return this
274     */
275    insertInt32LE(value, offset) {
276        return this._insertNumberValue(Buffer.prototype.writeInt32LE, 4, value, offset);
277    }
278    /**
279     * Writes a BigInt64BE value to the current write position (or at optional offset).
280     *
281     * @param value { BigInt } The value to write.
282     * @param offset { Number } The offset to write the value at.
283     *
284     * @return this
285     */
286    writeBigInt64BE(value, offset) {
287        utils_1.bigIntAndBufferInt64Check('writeBigInt64BE');
288        return this._writeNumberValue(Buffer.prototype.writeBigInt64BE, 8, value, offset);
289    }
290    /**
291     * Inserts a BigInt64BE value at the given offset value.
292     *
293     * @param value { BigInt } The value to insert.
294     * @param offset { Number } The offset to insert the value at.
295     *
296     * @return this
297     */
298    insertBigInt64BE(value, offset) {
299        utils_1.bigIntAndBufferInt64Check('writeBigInt64BE');
300        return this._insertNumberValue(Buffer.prototype.writeBigInt64BE, 8, value, offset);
301    }
302    /**
303     * Writes a BigInt64LE value to the current write position (or at optional offset).
304     *
305     * @param value { BigInt } The value to write.
306     * @param offset { Number } The offset to write the value at.
307     *
308     * @return this
309     */
310    writeBigInt64LE(value, offset) {
311        utils_1.bigIntAndBufferInt64Check('writeBigInt64LE');
312        return this._writeNumberValue(Buffer.prototype.writeBigInt64LE, 8, value, offset);
313    }
314    /**
315     * Inserts a Int64LE value at the given offset value.
316     *
317     * @param value { BigInt } The value to insert.
318     * @param offset { Number } The offset to insert the value at.
319     *
320     * @return this
321     */
322    insertBigInt64LE(value, offset) {
323        utils_1.bigIntAndBufferInt64Check('writeBigInt64LE');
324        return this._insertNumberValue(Buffer.prototype.writeBigInt64LE, 8, value, offset);
325    }
326    // Unsigned Integers
327    /**
328     * Reads an UInt8 value from the current read position or an optionally provided offset.
329     *
330     * @param offset { Number } The offset to read data from (optional)
331     * @return { Number }
332     */
333    readUInt8(offset) {
334        return this._readNumberValue(Buffer.prototype.readUInt8, 1, offset);
335    }
336    /**
337     * Reads an UInt16BE value from the current read position or an optionally provided offset.
338     *
339     * @param offset { Number } The offset to read data from (optional)
340     * @return { Number }
341     */
342    readUInt16BE(offset) {
343        return this._readNumberValue(Buffer.prototype.readUInt16BE, 2, offset);
344    }
345    /**
346     * Reads an UInt16LE value from the current read position or an optionally provided offset.
347     *
348     * @param offset { Number } The offset to read data from (optional)
349     * @return { Number }
350     */
351    readUInt16LE(offset) {
352        return this._readNumberValue(Buffer.prototype.readUInt16LE, 2, offset);
353    }
354    /**
355     * Reads an UInt32BE value from the current read position or an optionally provided offset.
356     *
357     * @param offset { Number } The offset to read data from (optional)
358     * @return { Number }
359     */
360    readUInt32BE(offset) {
361        return this._readNumberValue(Buffer.prototype.readUInt32BE, 4, offset);
362    }
363    /**
364     * Reads an UInt32LE value from the current read position or an optionally provided offset.
365     *
366     * @param offset { Number } The offset to read data from (optional)
367     * @return { Number }
368     */
369    readUInt32LE(offset) {
370        return this._readNumberValue(Buffer.prototype.readUInt32LE, 4, offset);
371    }
372    /**
373     * Reads a BigUInt64BE value from the current read position or an optionally provided offset.
374     *
375     * @param offset { Number } The offset to read data from (optional)
376     * @return { BigInt }
377     */
378    readBigUInt64BE(offset) {
379        utils_1.bigIntAndBufferInt64Check('readBigUInt64BE');
380        return this._readNumberValue(Buffer.prototype.readBigUInt64BE, 8, offset);
381    }
382    /**
383     * Reads a BigUInt64LE value from the current read position or an optionally provided offset.
384     *
385     * @param offset { Number } The offset to read data from (optional)
386     * @return { BigInt }
387     */
388    readBigUInt64LE(offset) {
389        utils_1.bigIntAndBufferInt64Check('readBigUInt64LE');
390        return this._readNumberValue(Buffer.prototype.readBigUInt64LE, 8, offset);
391    }
392    /**
393     * Writes an UInt8 value to the current write position (or at optional offset).
394     *
395     * @param value { Number } The value to write.
396     * @param offset { Number } The offset to write the value at.
397     *
398     * @return this
399     */
400    writeUInt8(value, offset) {
401        return this._writeNumberValue(Buffer.prototype.writeUInt8, 1, value, offset);
402    }
403    /**
404     * Inserts an UInt8 value at the given offset value.
405     *
406     * @param value { Number } The value to insert.
407     * @param offset { Number } The offset to insert the value at.
408     *
409     * @return this
410     */
411    insertUInt8(value, offset) {
412        return this._insertNumberValue(Buffer.prototype.writeUInt8, 1, value, offset);
413    }
414    /**
415     * Writes an UInt16BE value to the current write position (or at optional offset).
416     *
417     * @param value { Number } The value to write.
418     * @param offset { Number } The offset to write the value at.
419     *
420     * @return this
421     */
422    writeUInt16BE(value, offset) {
423        return this._writeNumberValue(Buffer.prototype.writeUInt16BE, 2, value, offset);
424    }
425    /**
426     * Inserts an UInt16BE value at the given offset value.
427     *
428     * @param value { Number } The value to insert.
429     * @param offset { Number } The offset to insert the value at.
430     *
431     * @return this
432     */
433    insertUInt16BE(value, offset) {
434        return this._insertNumberValue(Buffer.prototype.writeUInt16BE, 2, value, offset);
435    }
436    /**
437     * Writes an UInt16LE value to the current write position (or at optional offset).
438     *
439     * @param value { Number } The value to write.
440     * @param offset { Number } The offset to write the value at.
441     *
442     * @return this
443     */
444    writeUInt16LE(value, offset) {
445        return this._writeNumberValue(Buffer.prototype.writeUInt16LE, 2, value, offset);
446    }
447    /**
448     * Inserts an UInt16LE value at the given offset value.
449     *
450     * @param value { Number } The value to insert.
451     * @param offset { Number } The offset to insert the value at.
452     *
453     * @return this
454     */
455    insertUInt16LE(value, offset) {
456        return this._insertNumberValue(Buffer.prototype.writeUInt16LE, 2, value, offset);
457    }
458    /**
459     * Writes an UInt32BE value to the current write position (or at optional offset).
460     *
461     * @param value { Number } The value to write.
462     * @param offset { Number } The offset to write the value at.
463     *
464     * @return this
465     */
466    writeUInt32BE(value, offset) {
467        return this._writeNumberValue(Buffer.prototype.writeUInt32BE, 4, value, offset);
468    }
469    /**
470     * Inserts an UInt32BE value at the given offset value.
471     *
472     * @param value { Number } The value to insert.
473     * @param offset { Number } The offset to insert the value at.
474     *
475     * @return this
476     */
477    insertUInt32BE(value, offset) {
478        return this._insertNumberValue(Buffer.prototype.writeUInt32BE, 4, value, offset);
479    }
480    /**
481     * Writes an UInt32LE value to the current write position (or at optional offset).
482     *
483     * @param value { Number } The value to write.
484     * @param offset { Number } The offset to write the value at.
485     *
486     * @return this
487     */
488    writeUInt32LE(value, offset) {
489        return this._writeNumberValue(Buffer.prototype.writeUInt32LE, 4, value, offset);
490    }
491    /**
492     * Inserts an UInt32LE value at the given offset value.
493     *
494     * @param value { Number } The value to insert.
495     * @param offset { Number } The offset to insert the value at.
496     *
497     * @return this
498     */
499    insertUInt32LE(value, offset) {
500        return this._insertNumberValue(Buffer.prototype.writeUInt32LE, 4, value, offset);
501    }
502    /**
503     * Writes a BigUInt64BE value to the current write position (or at optional offset).
504     *
505     * @param value { Number } The value to write.
506     * @param offset { Number } The offset to write the value at.
507     *
508     * @return this
509     */
510    writeBigUInt64BE(value, offset) {
511        utils_1.bigIntAndBufferInt64Check('writeBigUInt64BE');
512        return this._writeNumberValue(Buffer.prototype.writeBigUInt64BE, 8, value, offset);
513    }
514    /**
515     * Inserts a BigUInt64BE value at the given offset value.
516     *
517     * @param value { Number } The value to insert.
518     * @param offset { Number } The offset to insert the value at.
519     *
520     * @return this
521     */
522    insertBigUInt64BE(value, offset) {
523        utils_1.bigIntAndBufferInt64Check('writeBigUInt64BE');
524        return this._insertNumberValue(Buffer.prototype.writeBigUInt64BE, 8, value, offset);
525    }
526    /**
527     * Writes a BigUInt64LE value to the current write position (or at optional offset).
528     *
529     * @param value { Number } The value to write.
530     * @param offset { Number } The offset to write the value at.
531     *
532     * @return this
533     */
534    writeBigUInt64LE(value, offset) {
535        utils_1.bigIntAndBufferInt64Check('writeBigUInt64LE');
536        return this._writeNumberValue(Buffer.prototype.writeBigUInt64LE, 8, value, offset);
537    }
538    /**
539     * Inserts a BigUInt64LE value at the given offset value.
540     *
541     * @param value { Number } The value to insert.
542     * @param offset { Number } The offset to insert the value at.
543     *
544     * @return this
545     */
546    insertBigUInt64LE(value, offset) {
547        utils_1.bigIntAndBufferInt64Check('writeBigUInt64LE');
548        return this._insertNumberValue(Buffer.prototype.writeBigUInt64LE, 8, value, offset);
549    }
550    // Floating Point
551    /**
552     * Reads an FloatBE value from the current read position or an optionally provided offset.
553     *
554     * @param offset { Number } The offset to read data from (optional)
555     * @return { Number }
556     */
557    readFloatBE(offset) {
558        return this._readNumberValue(Buffer.prototype.readFloatBE, 4, offset);
559    }
560    /**
561     * Reads an FloatLE value from the current read position or an optionally provided offset.
562     *
563     * @param offset { Number } The offset to read data from (optional)
564     * @return { Number }
565     */
566    readFloatLE(offset) {
567        return this._readNumberValue(Buffer.prototype.readFloatLE, 4, offset);
568    }
569    /**
570     * Writes a FloatBE value to the current write position (or at optional offset).
571     *
572     * @param value { Number } The value to write.
573     * @param offset { Number } The offset to write the value at.
574     *
575     * @return this
576     */
577    writeFloatBE(value, offset) {
578        return this._writeNumberValue(Buffer.prototype.writeFloatBE, 4, value, offset);
579    }
580    /**
581     * Inserts a FloatBE value at the given offset value.
582     *
583     * @param value { Number } The value to insert.
584     * @param offset { Number } The offset to insert the value at.
585     *
586     * @return this
587     */
588    insertFloatBE(value, offset) {
589        return this._insertNumberValue(Buffer.prototype.writeFloatBE, 4, value, offset);
590    }
591    /**
592     * Writes a FloatLE value to the current write position (or at optional offset).
593     *
594     * @param value { Number } The value to write.
595     * @param offset { Number } The offset to write the value at.
596     *
597     * @return this
598     */
599    writeFloatLE(value, offset) {
600        return this._writeNumberValue(Buffer.prototype.writeFloatLE, 4, value, offset);
601    }
602    /**
603     * Inserts a FloatLE value at the given offset value.
604     *
605     * @param value { Number } The value to insert.
606     * @param offset { Number } The offset to insert the value at.
607     *
608     * @return this
609     */
610    insertFloatLE(value, offset) {
611        return this._insertNumberValue(Buffer.prototype.writeFloatLE, 4, value, offset);
612    }
613    // Double Floating Point
614    /**
615     * Reads an DoublEBE value from the current read position or an optionally provided offset.
616     *
617     * @param offset { Number } The offset to read data from (optional)
618     * @return { Number }
619     */
620    readDoubleBE(offset) {
621        return this._readNumberValue(Buffer.prototype.readDoubleBE, 8, offset);
622    }
623    /**
624     * Reads an DoubleLE value from the current read position or an optionally provided offset.
625     *
626     * @param offset { Number } The offset to read data from (optional)
627     * @return { Number }
628     */
629    readDoubleLE(offset) {
630        return this._readNumberValue(Buffer.prototype.readDoubleLE, 8, offset);
631    }
632    /**
633     * Writes a DoubleBE value to the current write position (or at optional offset).
634     *
635     * @param value { Number } The value to write.
636     * @param offset { Number } The offset to write the value at.
637     *
638     * @return this
639     */
640    writeDoubleBE(value, offset) {
641        return this._writeNumberValue(Buffer.prototype.writeDoubleBE, 8, value, offset);
642    }
643    /**
644     * Inserts a DoubleBE value at the given offset value.
645     *
646     * @param value { Number } The value to insert.
647     * @param offset { Number } The offset to insert the value at.
648     *
649     * @return this
650     */
651    insertDoubleBE(value, offset) {
652        return this._insertNumberValue(Buffer.prototype.writeDoubleBE, 8, value, offset);
653    }
654    /**
655     * Writes a DoubleLE value to the current write position (or at optional offset).
656     *
657     * @param value { Number } The value to write.
658     * @param offset { Number } The offset to write the value at.
659     *
660     * @return this
661     */
662    writeDoubleLE(value, offset) {
663        return this._writeNumberValue(Buffer.prototype.writeDoubleLE, 8, value, offset);
664    }
665    /**
666     * Inserts a DoubleLE value at the given offset value.
667     *
668     * @param value { Number } The value to insert.
669     * @param offset { Number } The offset to insert the value at.
670     *
671     * @return this
672     */
673    insertDoubleLE(value, offset) {
674        return this._insertNumberValue(Buffer.prototype.writeDoubleLE, 8, value, offset);
675    }
676    // Strings
677    /**
678     * Reads a String from the current read position.
679     *
680     * @param arg1 { Number | String } The number of bytes to read as a String, or the BufferEncoding to use for
681     *             the string (Defaults to instance level encoding).
682     * @param encoding { String } The BufferEncoding to use for the string (Defaults to instance level encoding).
683     *
684     * @return { String }
685     */
686    readString(arg1, encoding) {
687        let lengthVal;
688        // Length provided
689        if (typeof arg1 === 'number') {
690            utils_1.checkLengthValue(arg1);
691            lengthVal = Math.min(arg1, this.length - this._readOffset);
692        }
693        else {
694            encoding = arg1;
695            lengthVal = this.length - this._readOffset;
696        }
697        // Check encoding
698        if (typeof encoding !== 'undefined') {
699            utils_1.checkEncoding(encoding);
700        }
701        const value = this._buff.slice(this._readOffset, this._readOffset + lengthVal).toString(encoding || this._encoding);
702        this._readOffset += lengthVal;
703        return value;
704    }
705    /**
706     * Inserts a String
707     *
708     * @param value { String } The String value to insert.
709     * @param offset { Number } The offset to insert the string at.
710     * @param encoding { String } The BufferEncoding to use for writing strings (defaults to instance encoding).
711     *
712     * @return this
713     */
714    insertString(value, offset, encoding) {
715        utils_1.checkOffsetValue(offset);
716        return this._handleString(value, true, offset, encoding);
717    }
718    /**
719     * Writes a String
720     *
721     * @param value { String } The String value to write.
722     * @param arg2 { Number | String } The offset to write the string at, or the BufferEncoding to use.
723     * @param encoding { String } The BufferEncoding to use for writing strings (defaults to instance encoding).
724     *
725     * @return this
726     */
727    writeString(value, arg2, encoding) {
728        return this._handleString(value, false, arg2, encoding);
729    }
730    /**
731     * Reads a null-terminated String from the current read position.
732     *
733     * @param encoding { String } The BufferEncoding to use for the string (Defaults to instance level encoding).
734     *
735     * @return { String }
736     */
737    readStringNT(encoding) {
738        if (typeof encoding !== 'undefined') {
739            utils_1.checkEncoding(encoding);
740        }
741        // Set null character position to the end SmartBuffer instance.
742        let nullPos = this.length;
743        // Find next null character (if one is not found, default from above is used)
744        for (let i = this._readOffset; i < this.length; i++) {
745            if (this._buff[i] === 0x00) {
746                nullPos = i;
747                break;
748            }
749        }
750        // Read string value
751        const value = this._buff.slice(this._readOffset, nullPos);
752        // Increment internal Buffer read offset
753        this._readOffset = nullPos + 1;
754        return value.toString(encoding || this._encoding);
755    }
756    /**
757     * Inserts a null-terminated String.
758     *
759     * @param value { String } The String value to write.
760     * @param arg2 { Number | String } The offset to write the string to, or the BufferEncoding to use.
761     * @param encoding { String } The BufferEncoding to use for writing strings (defaults to instance encoding).
762     *
763     * @return this
764     */
765    insertStringNT(value, offset, encoding) {
766        utils_1.checkOffsetValue(offset);
767        // Write Values
768        this.insertString(value, offset, encoding);
769        this.insertUInt8(0x00, offset + value.length);
770        return this;
771    }
772    /**
773     * Writes a null-terminated String.
774     *
775     * @param value { String } The String value to write.
776     * @param arg2 { Number | String } The offset to write the string to, or the BufferEncoding to use.
777     * @param encoding { String } The BufferEncoding to use for writing strings (defaults to instance encoding).
778     *
779     * @return this
780     */
781    writeStringNT(value, arg2, encoding) {
782        // Write Values
783        this.writeString(value, arg2, encoding);
784        this.writeUInt8(0x00, typeof arg2 === 'number' ? arg2 + value.length : this.writeOffset);
785        return this;
786    }
787    // Buffers
788    /**
789     * Reads a Buffer from the internal read position.
790     *
791     * @param length { Number } The length of data to read as a Buffer.
792     *
793     * @return { Buffer }
794     */
795    readBuffer(length) {
796        if (typeof length !== 'undefined') {
797            utils_1.checkLengthValue(length);
798        }
799        const lengthVal = typeof length === 'number' ? length : this.length;
800        const endPoint = Math.min(this.length, this._readOffset + lengthVal);
801        // Read buffer value
802        const value = this._buff.slice(this._readOffset, endPoint);
803        // Increment internal Buffer read offset
804        this._readOffset = endPoint;
805        return value;
806    }
807    /**
808     * Writes a Buffer to the current write position.
809     *
810     * @param value { Buffer } The Buffer to write.
811     * @param offset { Number } The offset to write the Buffer to.
812     *
813     * @return this
814     */
815    insertBuffer(value, offset) {
816        utils_1.checkOffsetValue(offset);
817        return this._handleBuffer(value, true, offset);
818    }
819    /**
820     * Writes a Buffer to the current write position.
821     *
822     * @param value { Buffer } The Buffer to write.
823     * @param offset { Number } The offset to write the Buffer to.
824     *
825     * @return this
826     */
827    writeBuffer(value, offset) {
828        return this._handleBuffer(value, false, offset);
829    }
830    /**
831     * Reads a null-terminated Buffer from the current read poisiton.
832     *
833     * @return { Buffer }
834     */
835    readBufferNT() {
836        // Set null character position to the end SmartBuffer instance.
837        let nullPos = this.length;
838        // Find next null character (if one is not found, default from above is used)
839        for (let i = this._readOffset; i < this.length; i++) {
840            if (this._buff[i] === 0x00) {
841                nullPos = i;
842                break;
843            }
844        }
845        // Read value
846        const value = this._buff.slice(this._readOffset, nullPos);
847        // Increment internal Buffer read offset
848        this._readOffset = nullPos + 1;
849        return value;
850    }
851    /**
852     * Inserts a null-terminated Buffer.
853     *
854     * @param value { Buffer } The Buffer to write.
855     * @param offset { Number } The offset to write the Buffer to.
856     *
857     * @return this
858     */
859    insertBufferNT(value, offset) {
860        utils_1.checkOffsetValue(offset);
861        // Write Values
862        this.insertBuffer(value, offset);
863        this.insertUInt8(0x00, offset + value.length);
864        return this;
865    }
866    /**
867     * Writes a null-terminated Buffer.
868     *
869     * @param value { Buffer } The Buffer to write.
870     * @param offset { Number } The offset to write the Buffer to.
871     *
872     * @return this
873     */
874    writeBufferNT(value, offset) {
875        // Checks for valid numberic value;
876        if (typeof offset !== 'undefined') {
877            utils_1.checkOffsetValue(offset);
878        }
879        // Write Values
880        this.writeBuffer(value, offset);
881        this.writeUInt8(0x00, typeof offset === 'number' ? offset + value.length : this._writeOffset);
882        return this;
883    }
884    /**
885     * Clears the SmartBuffer instance to its original empty state.
886     */
887    clear() {
888        this._writeOffset = 0;
889        this._readOffset = 0;
890        this.length = 0;
891        return this;
892    }
893    /**
894     * Gets the remaining data left to be read from the SmartBuffer instance.
895     *
896     * @return { Number }
897     */
898    remaining() {
899        return this.length - this._readOffset;
900    }
901    /**
902     * Gets the current read offset value of the SmartBuffer instance.
903     *
904     * @return { Number }
905     */
906    get readOffset() {
907        return this._readOffset;
908    }
909    /**
910     * Sets the read offset value of the SmartBuffer instance.
911     *
912     * @param offset { Number } - The offset value to set.
913     */
914    set readOffset(offset) {
915        utils_1.checkOffsetValue(offset);
916        // Check for bounds.
917        utils_1.checkTargetOffset(offset, this);
918        this._readOffset = offset;
919    }
920    /**
921     * Gets the current write offset value of the SmartBuffer instance.
922     *
923     * @return { Number }
924     */
925    get writeOffset() {
926        return this._writeOffset;
927    }
928    /**
929     * Sets the write offset value of the SmartBuffer instance.
930     *
931     * @param offset { Number } - The offset value to set.
932     */
933    set writeOffset(offset) {
934        utils_1.checkOffsetValue(offset);
935        // Check for bounds.
936        utils_1.checkTargetOffset(offset, this);
937        this._writeOffset = offset;
938    }
939    /**
940     * Gets the currently set string encoding of the SmartBuffer instance.
941     *
942     * @return { BufferEncoding } The string Buffer encoding currently set.
943     */
944    get encoding() {
945        return this._encoding;
946    }
947    /**
948     * Sets the string encoding of the SmartBuffer instance.
949     *
950     * @param encoding { BufferEncoding } The string Buffer encoding to set.
951     */
952    set encoding(encoding) {
953        utils_1.checkEncoding(encoding);
954        this._encoding = encoding;
955    }
956    /**
957     * Gets the underlying internal Buffer. (This includes unmanaged data in the Buffer)
958     *
959     * @return { Buffer } The Buffer value.
960     */
961    get internalBuffer() {
962        return this._buff;
963    }
964    /**
965     * Gets the value of the internal managed Buffer (Includes managed data only)
966     *
967     * @param { Buffer }
968     */
969    toBuffer() {
970        return this._buff.slice(0, this.length);
971    }
972    /**
973     * Gets the String value of the internal managed Buffer
974     *
975     * @param encoding { String } The BufferEncoding to display the Buffer as (defaults to instance level encoding).
976     */
977    toString(encoding) {
978        const encodingVal = typeof encoding === 'string' ? encoding : this._encoding;
979        // Check for invalid encoding.
980        utils_1.checkEncoding(encodingVal);
981        return this._buff.toString(encodingVal, 0, this.length);
982    }
983    /**
984     * Destroys the SmartBuffer instance.
985     */
986    destroy() {
987        this.clear();
988        return this;
989    }
990    /**
991     * Handles inserting and writing strings.
992     *
993     * @param value { String } The String value to insert.
994     * @param isInsert { Boolean } True if inserting a string, false if writing.
995     * @param arg2 { Number | String } The offset to insert the string at, or the BufferEncoding to use.
996     * @param encoding { String } The BufferEncoding to use for writing strings (defaults to instance encoding).
997     */
998    _handleString(value, isInsert, arg3, encoding) {
999        let offsetVal = this._writeOffset;
1000        let encodingVal = this._encoding;
1001        // Check for offset
1002        if (typeof arg3 === 'number') {
1003            offsetVal = arg3;
1004            // Check for encoding
1005        }
1006        else if (typeof arg3 === 'string') {
1007            utils_1.checkEncoding(arg3);
1008            encodingVal = arg3;
1009        }
1010        // Check for encoding (third param)
1011        if (typeof encoding === 'string') {
1012            utils_1.checkEncoding(encoding);
1013            encodingVal = encoding;
1014        }
1015        // Calculate bytelength of string.
1016        const byteLength = Buffer.byteLength(value, encodingVal);
1017        // Ensure there is enough internal Buffer capacity.
1018        if (isInsert) {
1019            this.ensureInsertable(byteLength, offsetVal);
1020        }
1021        else {
1022            this._ensureWriteable(byteLength, offsetVal);
1023        }
1024        // Write value
1025        this._buff.write(value, offsetVal, byteLength, encodingVal);
1026        // Increment internal Buffer write offset;
1027        if (isInsert) {
1028            this._writeOffset += byteLength;
1029        }
1030        else {
1031            // If an offset was given, check to see if we wrote beyond the current writeOffset.
1032            if (typeof arg3 === 'number') {
1033                this._writeOffset = Math.max(this._writeOffset, offsetVal + byteLength);
1034            }
1035            else {
1036                // If no offset was given, we wrote to the end of the SmartBuffer so increment writeOffset.
1037                this._writeOffset += byteLength;
1038            }
1039        }
1040        return this;
1041    }
1042    /**
1043     * Handles writing or insert of a Buffer.
1044     *
1045     * @param value { Buffer } The Buffer to write.
1046     * @param offset { Number } The offset to write the Buffer to.
1047     */
1048    _handleBuffer(value, isInsert, offset) {
1049        const offsetVal = typeof offset === 'number' ? offset : this._writeOffset;
1050        // Ensure there is enough internal Buffer capacity.
1051        if (isInsert) {
1052            this.ensureInsertable(value.length, offsetVal);
1053        }
1054        else {
1055            this._ensureWriteable(value.length, offsetVal);
1056        }
1057        // Write buffer value
1058        value.copy(this._buff, offsetVal);
1059        // Increment internal Buffer write offset;
1060        if (isInsert) {
1061            this._writeOffset += value.length;
1062        }
1063        else {
1064            // If an offset was given, check to see if we wrote beyond the current writeOffset.
1065            if (typeof offset === 'number') {
1066                this._writeOffset = Math.max(this._writeOffset, offsetVal + value.length);
1067            }
1068            else {
1069                // If no offset was given, we wrote to the end of the SmartBuffer so increment writeOffset.
1070                this._writeOffset += value.length;
1071            }
1072        }
1073        return this;
1074    }
1075    /**
1076     * Ensures that the internal Buffer is large enough to read data.
1077     *
1078     * @param length { Number } The length of the data that needs to be read.
1079     * @param offset { Number } The offset of the data that needs to be read.
1080     */
1081    ensureReadable(length, offset) {
1082        // Offset value defaults to managed read offset.
1083        let offsetVal = this._readOffset;
1084        // If an offset was provided, use it.
1085        if (typeof offset !== 'undefined') {
1086            // Checks for valid numberic value;
1087            utils_1.checkOffsetValue(offset);
1088            // Overide with custom offset.
1089            offsetVal = offset;
1090        }
1091        // Checks if offset is below zero, or the offset+length offset is beyond the total length of the managed data.
1092        if (offsetVal < 0 || offsetVal + length > this.length) {
1093            throw new Error(utils_1.ERRORS.INVALID_READ_BEYOND_BOUNDS);
1094        }
1095    }
1096    /**
1097     * Ensures that the internal Buffer is large enough to insert data.
1098     *
1099     * @param dataLength { Number } The length of the data that needs to be written.
1100     * @param offset { Number } The offset of the data to be written.
1101     */
1102    ensureInsertable(dataLength, offset) {
1103        // Checks for valid numberic value;
1104        utils_1.checkOffsetValue(offset);
1105        // Ensure there is enough internal Buffer capacity.
1106        this._ensureCapacity(this.length + dataLength);
1107        // If an offset was provided and its not the very end of the buffer, copy data into appropriate location in regards to the offset.
1108        if (offset < this.length) {
1109            this._buff.copy(this._buff, offset + dataLength, offset, this._buff.length);
1110        }
1111        // Adjust tracked smart buffer length
1112        if (offset + dataLength > this.length) {
1113            this.length = offset + dataLength;
1114        }
1115        else {
1116            this.length += dataLength;
1117        }
1118    }
1119    /**
1120     * Ensures that the internal Buffer is large enough to write data.
1121     *
1122     * @param dataLength { Number } The length of the data that needs to be written.
1123     * @param offset { Number } The offset of the data to be written (defaults to writeOffset).
1124     */
1125    _ensureWriteable(dataLength, offset) {
1126        const offsetVal = typeof offset === 'number' ? offset : this._writeOffset;
1127        // Ensure enough capacity to write data.
1128        this._ensureCapacity(offsetVal + dataLength);
1129        // Adjust SmartBuffer length (if offset + length is larger than managed length, adjust length)
1130        if (offsetVal + dataLength > this.length) {
1131            this.length = offsetVal + dataLength;
1132        }
1133    }
1134    /**
1135     * Ensures that the internal Buffer is large enough to write at least the given amount of data.
1136     *
1137     * @param minLength { Number } The minimum length of the data needs to be written.
1138     */
1139    _ensureCapacity(minLength) {
1140        const oldLength = this._buff.length;
1141        if (minLength > oldLength) {
1142            let data = this._buff;
1143            let newLength = (oldLength * 3) / 2 + 1;
1144            if (newLength < minLength) {
1145                newLength = minLength;
1146            }
1147            this._buff = Buffer.allocUnsafe(newLength);
1148            data.copy(this._buff, 0, 0, oldLength);
1149        }
1150    }
1151    /**
1152     * Reads a numeric number value using the provided function.
1153     *
1154     * @typeparam T { number | bigint } The type of the value to be read
1155     *
1156     * @param func { Function(offset: number) => number } The function to read data on the internal Buffer with.
1157     * @param byteSize { Number } The number of bytes read.
1158     * @param offset { Number } The offset to read from (optional). When this is not provided, the managed readOffset is used instead.
1159     *
1160     * @returns { T } the number value
1161     */
1162    _readNumberValue(func, byteSize, offset) {
1163        this.ensureReadable(byteSize, offset);
1164        // Call Buffer.readXXXX();
1165        const value = func.call(this._buff, typeof offset === 'number' ? offset : this._readOffset);
1166        // Adjust internal read offset if an optional read offset was not provided.
1167        if (typeof offset === 'undefined') {
1168            this._readOffset += byteSize;
1169        }
1170        return value;
1171    }
1172    /**
1173     * Inserts a numeric number value based on the given offset and value.
1174     *
1175     * @typeparam T { number | bigint } The type of the value to be written
1176     *
1177     * @param func { Function(offset: T, offset?) => number} The function to write data on the internal Buffer with.
1178     * @param byteSize { Number } The number of bytes written.
1179     * @param value { T } The number value to write.
1180     * @param offset { Number } the offset to write the number at (REQUIRED).
1181     *
1182     * @returns SmartBuffer this buffer
1183     */
1184    _insertNumberValue(func, byteSize, value, offset) {
1185        // Check for invalid offset values.
1186        utils_1.checkOffsetValue(offset);
1187        // Ensure there is enough internal Buffer capacity. (raw offset is passed)
1188        this.ensureInsertable(byteSize, offset);
1189        // Call buffer.writeXXXX();
1190        func.call(this._buff, value, offset);
1191        // Adjusts internally managed write offset.
1192        this._writeOffset += byteSize;
1193        return this;
1194    }
1195    /**
1196     * Writes a numeric number value based on the given offset and value.
1197     *
1198     * @typeparam T { number | bigint } The type of the value to be written
1199     *
1200     * @param func { Function(offset: T, offset?) => number} The function to write data on the internal Buffer with.
1201     * @param byteSize { Number } The number of bytes written.
1202     * @param value { T } The number value to write.
1203     * @param offset { Number } the offset to write the number at (REQUIRED).
1204     *
1205     * @returns SmartBuffer this buffer
1206     */
1207    _writeNumberValue(func, byteSize, value, offset) {
1208        // If an offset was provided, validate it.
1209        if (typeof offset === 'number') {
1210            // Check if we're writing beyond the bounds of the managed data.
1211            if (offset < 0) {
1212                throw new Error(utils_1.ERRORS.INVALID_WRITE_BEYOND_BOUNDS);
1213            }
1214            utils_1.checkOffsetValue(offset);
1215        }
1216        // Default to writeOffset if no offset value was given.
1217        const offsetVal = typeof offset === 'number' ? offset : this._writeOffset;
1218        // Ensure there is enough internal Buffer capacity. (raw offset is passed)
1219        this._ensureWriteable(byteSize, offsetVal);
1220        func.call(this._buff, value, offsetVal);
1221        // If an offset was given, check to see if we wrote beyond the current writeOffset.
1222        if (typeof offset === 'number') {
1223            this._writeOffset = Math.max(this._writeOffset, offsetVal + byteSize);
1224        }
1225        else {
1226            // If no numeric offset was given, we wrote to the end of the SmartBuffer so increment writeOffset.
1227            this._writeOffset += byteSize;
1228        }
1229        return this;
1230    }
1231}
1232exports.SmartBuffer = SmartBuffer;
1233//# sourceMappingURL=smartbuffer.js.map