node_modules
.bin
@ampproject
@babel
@discoveryjs
@gar
@istanbuljs
@jridgewell
@leichtgewicht
@npmcli
@riotjs
@tootallnate
@types
@ungap
@webassemblyjs
@webpack-cli
@xtuc
abab
abbrev
accepts
acorn
acorn-globals
acorn-import-assertions
acorn-walk
agent-base
agentkeepalive
aggregate-error
ajv
ajv-formats
ajv-keywords
ansi-colors
ansi-html-community
ansi-regex
ansi-styles
anymatch
append-transform
aproba
archy
are-we-there-yet
argparse
array-flatten
arrify
assertion-error
ast-types
async-foreach
asynckit
babel-plugin-dynamic-import-node
babel-plugin-polyfill-corejs2
babel-plugin-polyfill-corejs3
babel-plugin-polyfill-regenerator
balanced-match
batch
bianco.attr
bianco.dom-to-array
bianco.events
bianco.query
big.js
binary-extensions
body-parser
bonjour-service
boolbase
brace-expansion
braces
browser-process-hrtime
browser-stdout
browserslist
buffer-from
bytes
cacache
caching-transform
call-bind
camel-case
camelcase
camelcase-keys
caniuse-lite
chai
chalk
check-error
chokidar
chownr
chrome-trace-event
clean-css
clean-stack
cliui
clone-deep
color-convert
color-name
color-support
colorette
combined-stream
commander
commondir
compressible
compression
concat-map
connect-history-api-fallback
console-control-strings
content-disposition
content-type
convert-source-map
cookie
cookie-signature
core-js-compat
core-util-is
cross-spawn
css-select
css-what
cssesc
cssom
cssstyle
cumpa
curri
data-urls
debug
decamelize
decamelize-keys
decimal.js
deep-eql
deep-is
default-gateway
default-require-extensions
define-lazy-prop
define-properties
delayed-stream
delegates
depd
destroy
detect-node
diff
dns-equal
dns-packet
dom-converter
dom-nodes
dom-serializer
domelementtype
domexception
domhandler
domutils
dot-case
ee-first
electron-to-chromium
emoji-regex
emojis-list
encodeurl
encoding
enhanced-resolve
entities
env-paths
envinfo
err-code
erre
error-ex
es-module-lexer
es6-error
escalade
escape-html
escape-string-regexp
escodegen
eslint-scope
esm
esprima
esrecurse
estraverse
esutils
etag
eventemitter3
events
execa
express
fast-deep-equal
fast-json-stable-stringify
fast-levenshtein
fastest-levenshtein
faye-websocket
fill-range
finalhandler
find-up
flat
follow-redirects
foreground-child
form-data
forwarded
fresh
fromentries
fs-minipass
fs-monkey
fs.realpath
function-bind
gauge
gaze
gensync
get-caller-file
get-func-name
get-intrinsic
get-package-type
get-stdin
get-stream
glob
glob-parent
glob-to-regexp
globals
globule
graceful-fs
growl
handle-thing
hard-rejection
has
has-flag
has-property-descriptors
has-symbols
has-unicode
hasha
he
hosted-git-info
hpack.js
html-encoding-sniffer
html-entities
html-escaper
html-minifier-terser
html-webpack-plugin
htmlparser2
http-cache-semantics
http-deceiver
http-errors
http-parser-js
http-proxy
http-proxy-agent
http-proxy-middleware
https-proxy-agent
human-signals
humanize-ms
iconv-lite
imurmurhash
indent-string
infer-owner
inflight
inherits
interpret
ip
ipaddr.js
is-arrayish
is-binary-path
is-core-module
is-docker
is-extglob
is-fullwidth-code-point
is-glob
is-lambda
is-number
is-plain-obj
is-plain-object
is-potential-custom-element-name
is-stream
is-typedarray
is-windows
is-wsl
isarray
isexe
isobject
istanbul-lib-coverage
istanbul-lib-hook
istanbul-lib-instrument
istanbul-lib-processinfo
istanbul-lib-report
istanbul-lib-source-maps
istanbul-reports
jest-worker
js-base64
js-tokens
js-yaml
jsdom
jsdom-global
jsesc
json-parse-even-better-errors
json-schema-traverse
json5
kind-of
levn
lines-and-columns
loader-runner
locate-path
lodash
lodash.debounce
lodash.flattendeep
log-symbols
loupe
lower-case
lru-cache
make-fetch-happen
map-obj
media-typer
memfs
meow
merge-descriptors
merge-stream
methods
micromatch
mime
mime-db
mime-types
mimic-fn
min-indent
minimalistic-assert
minimatch
minimist-options
minipass
minipass-collect
minipass-fetch
minipass-flush
minipass-pipeline
minipass-sized
minizlib
mkdirp
mocha
ms
multicast-dns
nan
nanoid
negotiator
neo-async
no-case
node-forge
node-gyp
node-preload
node-releases
node-sass
nopt
normalize-package-data
normalize-path
npm-run-path
npmlog
nth-check
nwsapi
nyc
object-inspect
object-keys
object.assign
obuf
on-finished
on-headers
once
onetime
open
optionator
p-limit
p-locate
p-map
p-retry
p-try
package-hash
param-case
parse-json
parse5
parseurl
pascal-case
path-exists
path-is-absolute
path-key
path-parse
path-to-regexp
pathval
picocolors
picomatch
pirates
prelude-ls
pretty-error
process-nextick-args
process-on-spawn
promise-inflight
promise-retry
proxy-addr
psl
punycode
qs
quick-lru
randombytes
range-parser
raw-body
rawth
read-pkg
read-pkg-up
readable-stream
readdirp
recast
rechoir
redent
regenerate
regenerate-unicode-properties
regenerator-runtime
regenerator-transform
regexpu-core
regjsgen
regjsparser
relateurl
release-zalgo
renderkid
require-directory
require-from-string
require-main-filename
requires-port
resolve
retry
rimraf
riot
ruit
safe-buffer
safer-buffer
sass-graph
saxes
schema-utils
scss-tokenizer
select-hose
selfsigned
semver
send
serialize-javascript
serve-index
serve-static
set-blocking
setprototypeof
shallow-clone
shebang-command
shebang-regex
side-channel
signal-exit
smart-buffer
build
smartbuffer.js
smartbuffer.js.map
utils.js
utils.js.map
docs
typings
.prettierrc.yaml
.travis.yml
LICENSE
README.md
package.json
sockjs
socks
socks-proxy-agent
source-map
source-map-support
spawn-wrap
spdx-correct
spdx-exceptions
spdx-expression-parse
spdx-license-ids
spdy
spdy-transport
sprintf-js
ssri
statuses
stdout-stream
string-width
string_decoder
strip-ansi
strip-final-newline
strip-indent
strip-json-comments
supports-color
symbol-tree
tapable
tar
terser
terser-webpack-plugin
test-exclude
thunky
to-fast-properties
to-regex-range
toidentifier
tough-cookie
tr46
trim-newlines
true-case-path
tslib
type-check
type-detect
type-fest
type-is
typedarray-to-buffer
unicode-canonical-property-names-ecmascript
unicode-match-property-ecmascript
unicode-match-property-value-ecmascript
unicode-property-aliases-ecmascript
unique-filename
unique-slug
universalify
unpipe
update-browserslist-db
uri-js
util-deprecate
utila
utils-merge
uuid
validate-npm-package-license
vary
w3c-hr-time
w3c-xmlserializer
watchpack
wbuf
webidl-conversions
webpack
webpack-cli
webpack-dev-middleware
webpack-dev-server
webpack-merge
webpack-sources
websocket-driver
websocket-extensions
whatwg-encoding
whatwg-mimetype
whatwg-url
which
which-module
wide-align
wildcard
word-wrap
workerpool
wrap-ansi
wrappy
write-file-atomic
ws
xml-name-validator
xmlchars
y18n
yallist
yargs
yargs-parser
yargs-unparser
yocto-queue
.package-lock.json
src
LICENSE
package-lock.json
package.json
readme.md
webpack.config.js
1233 lines
44 KiB
JavaScript
1233 lines
44 KiB
JavaScript
"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
|