• Home
Name
Date
Size
#Lines
LOC

..--

CHANGELOG.mdD12-May-20242.2 KiB7151

README_v3.mdD12-May-202412.3 KiB367244

ROADMAP.mdD12-May-20240

README_v3.md

1 smart-buffer  [![Build Status](https://travis-ci.org/JoshGlazebrook/smart-buffer.svg?branch=master)](https://travis-ci.org/JoshGlazebrook/smart-buffer)  [![Coverage Status](https://coveralls.io/repos/github/JoshGlazebrook/smart-buffer/badge.svg?branch=master)](https://coveralls.io/github/JoshGlazebrook/smart-buffer?branch=master)
2 =============
3 
4 smart-buffer is a light Buffer wrapper that takes away the need to keep track of what position to read and write data to and from the underlying Buffer. It also adds null terminating string operations and **grows** as you add more data.
5 
6 ![stats](https://nodei.co/npm/smart-buffer.png?downloads=true&downloadRank=true&stars=true "stats")
7 
8 ### What it's useful for:
9 
10 I created smart-buffer because I wanted to simplify the process of using Buffer for building and reading network packets to send over a socket. Rather than having to keep track of which position I need to write a UInt16 to after adding a string of variable length, I simply don't have to.
11 
12 Key Features:
13 * Proxies all of the Buffer write and read functions.
14 * Keeps track of read and write positions for you.
15 * Grows the internal Buffer as you add data to it.
16 * Useful string operations. (Null terminating strings)
17 * Allows for inserting values at specific points in the internal Buffer.
18 * Built in TypeScript
19 * Type Definitions Provided
20 
21 Requirements:
22 * Node v4.0+ is supported at this time.  (Versions prior to 2.0 will work on node 0.10)
23 
24 
25 #### Note:
26 smart-buffer can be used for writing to an underlying buffer as well as reading from it. It however does not function correctly if you're mixing both read and write operations with each other.
27 
28 ## Breaking Changes with 2.0
29 The latest version (2.0+) is written in TypeScript, and are compiled to ES6 Javascript. This means the earliest Node.js it supports will be 4.x (in strict mode.) If you're using version 6 and above it will work without any issues. From an API standpoint, 2.0 is backwards compatible. The only difference is SmartBuffer is not exported directly as the root module.
30 
31 ## Breaking Changes with 3.0
32 Starting with 3.0, if any of the readIntXXXX() methods are called and the requested data is larger than the bounds of the internally managed valid buffer data, an exception will now be thrown.
33 
34 ## Installing:
35 
36 `npm install smart-buffer`
37 
38 or
39 
40 `yarn add smart-buffer`
41 
42 Note: The published NPM package includes the built javascript library.
43 If you cloned this repo and wish to build the library manually use:
44 
45 `tsc -p ./`
46 
47 ## Using smart-buffer
48 
49 ### Example
50 
51 Say you were building a packet that had to conform to the following protocol:
52 
53 `[PacketType:2][PacketLength:2][Data:XX]`
54 
55 To build this packet using the vanilla Buffer class, you would have to count up the length of the data payload beforehand. You would also need to keep track of the current "cursor" position in your Buffer so you write everything in the right places. With smart-buffer you don't have to do either of those things.
56 
57 ```javascript
58 // 1.x (javascript)
59 var SmartBuffer = require('smart-buffer');
60 
61 // 1.x (typescript)
62 import SmartBuffer = require('smart-buffer');
63 
64 // 2.x+ (javascript)
65 const SmartBuffer = require('smart-buffer').SmartBuffer;
66 
67 // 2.x+ (typescript)
68 import { SmartBuffer, SmartBufferOptions} from 'smart-buffer';
69 
70 function createLoginPacket(username, password, age, country) {
71     let packet = new SmartBuffer();
72     packet.writeUInt16LE(0x0060); // Login Packet Type/ID
73     packet.writeStringNT(username);
74     packet.writeStringNT(password);
75     packet.writeUInt8(age);
76     packet.writeStringNT(country);
77     packet.writeUInt16LE(packet.length - 2, 2);
78 
79     return packet.toBuffer();
80 }
81 ```
82 With the above function, you now can do this:
83 ```javascript
84 let login = createLoginPacket("Josh", "secret123", 22, "United States");
85 
86 // <Buffer 60 00 1e 00 4a 6f 73 68 00 73 65 63 72 65 74 31 32 33 00 16 55 6e 69 74 65 64 20 53 74 61 74 65 73 00>
87 ```
88 Notice that the `[PacketLength:2]` part of the packet was inserted after we had added everything else, and as shown in the Buffer dump above, is in the correct location along with everything else.
89 
90 Reading back the packet we created above is just as easy:
91 ```javascript
92 
93 let reader = SmartBuffer.fromBuffer(login);
94 
95 let logininfo = {
96     packetType: reader.readUInt16LE(),
97     packetLength: reader.readUInt16LE(),
98     username: reader.readStringNT(),
99     password: reader.readStringNT(),
100     age: reader.readUInt8(),
101     country: reader.readStringNT()
102 };
103 
104 /*
105 {
106     packetType: 96, (0x0060)
107     packetLength: 30,
108     username: 'Josh',
109     password: 'secret123',
110     age: 22,
111     country: 'United States'
112 };
113 */
114 ```
115 
116 # Api Reference:
117 
118 ### Constructing a smart-buffer
119 
120 smart-buffer has a few different ways to construct an instance. Starting with version 2.0, the following factory methods are preffered.
121 
122 ```javascript
123 let SmartBuffer = require('smart-buffer');
124 
125 // Creating SmartBuffer from existing Buffer
126 let buff = SmartBuffer.fromBuffer(buffer); // Creates instance from buffer. (Uses default utf8 encoding)
127 let buff = SmartBuffer.fromBuffer(buffer, 'ascii'); // Creates instance from buffer with ascii encoding for Strings.
128 
129 // Creating SmartBuffer with specified internal Buffer size.
130 let buff = SmartBuffer.fromSize(1024); // Creates instance with internal Buffer size of 1024.
131 let buff = SmartBuffer.fromSize(1024, 'utf8'); // Creates instance with intenral Buffer size of 1024, and utf8 encoding.
132 
133 // Creating SmartBuffer with options object. This one specifies size and encoding.
134 let buff = SmartBuffer.fromOptions({
135     size: 1024,
136     encoding: 'ascii'
137 });
138 
139 // Creating SmartBuffer with options object. This one specified an existing Buffer.
140 let buff = SmartBuffer.fromOptions({
141     buff: buffer
142 });
143 
144 // Just want a regular SmartBuffer with all default options?
145 let buff = new SmartBuffer();
146 ```
147 
148 ## Backwards Compatibility:
149 
150 All constructors used prior to 2.0 still are supported. However it's not recommended to use these.
151 
152 ```javascript
153 let writer = new SmartBuffer();               // Defaults to utf8, 4096 length internal Buffer.
154 let writer = new SmartBuffer(1024);           // Defaults to utf8, 1024 length internal Buffer.
155 let writer = new SmartBuffer('ascii');         // Sets to ascii encoding, 4096 length internal buffer.
156 let writer = new SmartBuffer(1024, 'ascii');  // Sets to ascii encoding, 1024 length internal buffer.
157 ```
158 
159 ## Reading Data
160 
161 smart-buffer supports all of the common read functions you will find in the vanilla Buffer class. The only difference is, you do not need to specify which location to start reading from. This is possible because as you read data out of a smart-buffer, it automatically progresses an internal read offset/position to know where to pick up from on the next read.
162 
163 ## Reading Numeric Values
164 
165 When numeric values, you simply need to call the function you want, and the data is returned.
166 
167 Supported Operations:
168 * readInt8
169 * readInt16BE
170 * readInt16LE
171 * readInt32BE
172 * readInt32LE
173 * readBigInt64LE
174 * readBigInt64BE
175 * readUInt8
176 * readUInt16BE
177 * readUInt16LE
178 * readUInt32BE
179 * readUInt32LE
180 * readBigUInt64LE
181 * readBigUInt64BE
182 * readFloatBE
183 * readFloatLE
184 * readDoubleBE
185 * readDoubleLE
186 
187 ```javascript
188 let reader = new SmartBuffer(somebuffer);
189 let num = reader.readInt8();
190 ```
191 
192 ## Reading String Values
193 
194 When reading String values, you can either choose to read a null terminated string, or a string of a specified length.
195 
196 ### SmartBuffer.readStringNT( [encoding] )
197 > `String` **String encoding to use**  - Defaults to the encoding set in the constructor.
198 
199 returns `String`
200 
201 > Note: When readStringNT is called and there is no null character found, smart-buffer will read to the end of the internal Buffer.
202 
203 ### SmartBuffer.readString( [length] )
204 ### SmartBuffer.readString( [encoding] )
205 ### SmartBuffer.readString( [length], [encoding] )
206 > `Number` **Length of the string to read**
207 
208 > `String` **String encoding to use** - Defaults to the encoding set in the constructor, or utf8.
209 
210 returns `String`
211 
212 > Note: When readString is called without a specified length, smart-buffer will read to the end of the internal Buffer.
213 
214 
215 
216 ## Reading Buffer Values
217 
218 ### SmartBuffer.readBuffer( length )
219 > `Number` **Length of data to read into a Buffer**
220 
221 returns `Buffer`
222 
223 > Note: This function uses `slice` to retrieve the Buffer.
224 
225 
226 ### SmartBuffer.readBufferNT()
227 
228 returns `Buffer`
229 
230 > Note: This reads the next sequence of bytes in the buffer until a null (0x00) value is found. (Null terminated buffer)
231 > Note: This function uses `slice` to retrieve the Buffer.
232 
233 
234 ## Writing Data
235 
236 smart-buffer supports all of the common write functions you will find in the vanilla Buffer class. The only difference is, you do not need to specify which location to write to in your Buffer by default. You do however have the option of **inserting** a piece of data into your smart-buffer at a given location.
237 
238 
239 ## Writing Numeric Values
240 
241 
242 For numeric values, you simply need to call the function you want, and the data is written at the end of the internal Buffer's current write position. You can specify a offset/position to **insert** the given value at, but keep in mind this does not override data at the given position. This feature also does not work properly when inserting a value beyond the current internal length of the smart-buffer (length being the .length property of the smart-buffer instance you're writing to)
243 
244 Supported Operations:
245 * writeInt8
246 * writeInt16BE
247 * writeInt16LE
248 * writeInt32BE
249 * writeInt32LE
250 * writeBigInt64BE
251 * writeBigInt64LE
252 * writeUInt8
253 * writeUInt16BE
254 * writeUInt16LE
255 * writeUInt32BE
256 * writeUInt32LE
257 * writeBigUInt64BE
258 * writeBigUInt64LE
259 * writeFloatBE
260 * writeFloatLE
261 * writeDoubleBE
262 * writeDoubleLE
263 
264 The following signature is the same for all the above functions:
265 
266 ### SmartBuffer.writeInt8( value, [offset] )
267 > `Number` **A valid Int8 number**
268 
269 > `Number` **The position to insert this value at**
270 
271 returns this
272 
273 > Note: All write operations return `this` to allow for chaining.
274 
275 ## Writing String Values
276 
277 When reading String values, you can either choose to write a null terminated string, or a non null terminated string.
278 
279 ### SmartBuffer.writeStringNT( value, [offset], [encoding] )
280 ### SmartBuffer.writeStringNT( value, [offset] )
281 ### SmartBuffer.writeStringNT( value, [encoding] )
282 > `String` **String value to write**
283 
284 > `Number` **The position to insert this String at**
285 
286 > `String` **The String encoding to use.** - Defaults to the encoding set in the constructor, or utf8.
287 
288 returns this
289 
290 ### SmartBuffer.writeString( value, [offset], [encoding] )
291 ### SmartBuffer.writeString( value, [offset] )
292 ### SmartBuffer.writeString( value, [encoding] )
293 > `String` **String value to write**
294 
295 > `Number` **The position to insert this String at**
296 
297 > `String` **The String encoding to use** - Defaults to the encoding set in the constructor, or utf8.
298 
299 returns this
300 
301 
302 ## Writing Buffer Values
303 
304 ### SmartBuffer.writeBuffer( value, [offset] )
305 > `Buffer` **Buffer value to write**
306 
307 > `Number` **The position to insert this Buffer's content at**
308 
309 returns this
310 
311 ### SmartBuffer.writeBufferNT( value, [offset] )
312 > `Buffer` **Buffer value to write**
313 
314 > `Number` **The position to insert this Buffer's content at**
315 
316 returns this
317 
318 
319 ## Utility Functions
320 
321 ### SmartBuffer.clear()
322 Resets the SmartBuffer to its default state where it can be reused for reading or writing.
323 
324 ### SmartBuffer.remaining()
325 
326 returns `Number` The amount of data left to read based on the current read Position.
327 
328 ### SmartBuffer.skip( value )
329 > `Number` **The amount of bytes to skip ahead**
330 
331 Skips the read position ahead by the given value.
332 
333 returns this
334 
335 ### SmartBuffer.rewind( value )
336 > `Number` **The amount of bytes to reward backwards**
337 
338 Rewinds the read position backwards by the given value.
339 
340 returns this
341 
342 ### SmartBuffer.moveTo( position )
343 > `Number` **The point to skip the read position to**
344 
345 Moves the read position to the given point.
346 returns this
347 
348 ### SmartBuffer.toBuffer()
349 
350 returns `Buffer` A Buffer containing the contents of the internal Buffer.
351 
352 > Note: This uses the slice function.
353 
354 ### SmartBuffer.toString( [encoding] )
355 > `String` **The String encoding to use** - Defaults to the encoding set in the constructor, or utf8.
356 
357 returns `String` The internal Buffer in String representation.
358 
359 ## Properties
360 
361 ### SmartBuffer.length
362 
363 returns `Number` **The length of the data that is being tracked in the internal Buffer** - Does NOT return the absolute length of the internal Buffer being written to.
364 
365 ## License
366 
367 This work is licensed under the [MIT license](http://en.wikipedia.org/wiki/MIT_License).