Skip to content

Commit 75d3071

Browse files
author
Daniel Wirtz
committed
Correctly wrap node <=0.8 Buffer
1 parent 70dcbf2 commit 75d3071

File tree

7 files changed

+116
-59
lines changed

7 files changed

+116
-59
lines changed

ByteBuffer.js

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -135,11 +135,26 @@
135135
ByteBuffer.allocate = function(capacity, littleEndian) {
136136
return new ByteBuffer(capacity, littleEndian);
137137
};
138+
139+
/**
140+
* Converts a node.js <= 0.8 Buffer to an ArrayBuffer.
141+
* @param {Buffer} buffer Buffer to convert
142+
* @return {ArrayBuffer} Converted buffer
143+
* @private
144+
*/
145+
function toArrayBuffer(buffer) {
146+
var ab = new ArrayBuffer(buffer.length);
147+
var view = new Uint8Array(ab);
148+
for (var i = 0; i < buffer.length; ++i) {
149+
view[i] = buffer[i];
150+
}
151+
return ab;
152+
}
138153

139154
/**
140155
* Wraps an ArrayBuffer, any object containing an ArrayBuffer or a string. Sets the created ByteBuffer's offset to 0
141156
* and its length to the wrapped objects byte length.
142-
* @param {ArrayBuffer|{array: ArrayBuffer}|{buffer: ArrayBuffer}|string} buffer ArrayBuffer, any object with an .array or .buffer property or a string to wrap
157+
* @param {ArrayBuffer|Buffer|string|{array: ArrayBuffer}|{buffer: ArrayBuffer}|string} buffer ArrayBuffer, any object with an .array or .buffer property or a string to wrap
143158
* @param {boolean=} littleEndian true to use little endian multi byte values, false for big endian. Defaults to true.
144159
* @return {ByteBuffer}
145160
* @throws {Error} If the specified object cannot be wrapped
@@ -150,9 +165,11 @@
150165
if (typeof buffer == 'string') {
151166
return new ByteBuffer().writeUTF8String(buffer).flip();
152167
}
153-
// Wrap node Buffer
168+
var b;
169+
// Wrap Buffer
154170
if (Buffer && Buffer.isBuffer(buffer)) {
155-
buffer = new Uint8Array(buffer);
171+
b = new Uint8Array(buffer).buffer; // noop on node <= 0.8
172+
buffer = (b === buffer) ? toArrayBuffer(buffer) : b;
156173
}
157174
// Wrap anything that is or contains an ArrayBuffer
158175
if (!!buffer["array"]) {
@@ -161,9 +178,9 @@
161178
buffer = buffer["buffer"];
162179
}
163180
if (!(buffer instanceof ArrayBuffer)) {
164-
throw(new Error("Cannot wrap buffer of type "+typeof(buffer)));
181+
throw(new Error("Cannot wrap buffer of type "+typeof(buffer)+", "+buffer.constructor.name));
165182
}
166-
var b = new ByteBuffer(0, littleEndian, /* shadow copy */ true);
183+
b = new ByteBuffer(0, littleEndian, /* shadow copy */ true);
167184
b.array = buffer;
168185
b.view = new DataView(b.array);
169186
b.offset = 0;

ByteBuffer.min.js

Lines changed: 41 additions & 41 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ByteBuffer.min.map

Lines changed: 2 additions & 2 deletions
Large diffs are not rendered by default.

ByteBuffer.noexpose.js

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -123,11 +123,26 @@
123123
ByteBuffer.allocate = function(capacity, littleEndian) {
124124
return new ByteBuffer(capacity, littleEndian);
125125
};
126+
127+
/**
128+
* Converts a node.js <= 0.8 Buffer to an ArrayBuffer.
129+
* @param {Buffer} buffer Buffer to convert
130+
* @return {ArrayBuffer} Converted buffer
131+
* @private
132+
*/
133+
function toArrayBuffer(buffer) {
134+
var ab = new ArrayBuffer(buffer.length);
135+
var view = new Uint8Array(ab);
136+
for (var i = 0; i < buffer.length; ++i) {
137+
view[i] = buffer[i];
138+
}
139+
return ab;
140+
}
126141

127142
/**
128143
* Wraps an ArrayBuffer, any object containing an ArrayBuffer or a string. Sets the created ByteBuffer's offset to 0
129144
* and its length to the wrapped objects byte length.
130-
* @param {ArrayBuffer|{array: ArrayBuffer}|{buffer: ArrayBuffer}|string} buffer ArrayBuffer, any object with an .array or .buffer property or a string to wrap
145+
* @param {ArrayBuffer|Buffer|string|{array: ArrayBuffer}|{buffer: ArrayBuffer}|string} buffer ArrayBuffer, any object with an .array or .buffer property or a string to wrap
131146
* @param {boolean=} littleEndian true to use little endian multi byte values, false for big endian. Defaults to true.
132147
* @return {ByteBuffer}
133148
* @throws {Error} If the specified object cannot be wrapped
@@ -137,9 +152,11 @@
137152
if (typeof buffer == 'string') {
138153
return new ByteBuffer().writeUTF8String(buffer).flip();
139154
}
140-
// Wrap node Buffer
155+
var b;
156+
// Wrap Buffer
141157
if (Buffer && Buffer.isBuffer(buffer)) {
142-
buffer = new Uint8Array(buffer);
158+
b = new Uint8Array(buffer).buffer; // noop on node <= 0.8
159+
buffer = (b === buffer) ? toArrayBuffer(buffer) : b;
143160
}
144161
// Wrap anything that is or contains an ArrayBuffer
145162
if (!!buffer["array"]) {
@@ -148,9 +165,9 @@
148165
buffer = buffer["buffer"];
149166
}
150167
if (!(buffer instanceof ArrayBuffer)) {
151-
throw(new Error("Cannot wrap buffer of type "+typeof(buffer)));
168+
throw(new Error("Cannot wrap buffer of type "+typeof(buffer)+", "+buffer.constructor.name));
152169
}
153-
var b = new ByteBuffer(0, littleEndian, /* shadow copy */ true);
170+
b = new ByteBuffer(0, littleEndian, /* shadow copy */ true);
154171
b.array = buffer;
155172
b.view = new DataView(b.array);
156173
b.offset = 0;

docs/ByteBuffer.html

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2056,6 +2056,12 @@ <h5>Parameters:</h5>
20562056
<span class="param-type">ArrayBuffer</span>
20572057
|
20582058

2059+
<span class="param-type">Buffer</span>
2060+
|
2061+
2062+
<span class="param-type">string</span>
2063+
|
2064+
20592065
<span class="param-type">{array: ArrayBuffer}</span>
20602066
|
20612067

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "bytebuffer",
3-
"version": "1.3.5",
3+
"version": "1.3.6",
44
"author": "Daniel Wirtz <[email protected]>",
55
"description": "ByteBuffer.js: A Java-like, Netty-inspired ByteBuffer implementation using typed arrays.",
66
"main": "ByteBuffer.js",

src/ByteBuffer.js

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -135,11 +135,26 @@
135135
ByteBuffer.allocate = function(capacity, littleEndian) {
136136
return new ByteBuffer(capacity, littleEndian);
137137
};
138+
139+
/**
140+
* Converts a node.js <= 0.8 Buffer to an ArrayBuffer.
141+
* @param {Buffer} buffer Buffer to convert
142+
* @return {ArrayBuffer} Converted buffer
143+
* @private
144+
*/
145+
function toArrayBuffer(buffer) {
146+
var ab = new ArrayBuffer(buffer.length);
147+
var view = new Uint8Array(ab);
148+
for (var i = 0; i < buffer.length; ++i) {
149+
view[i] = buffer[i];
150+
}
151+
return ab;
152+
}
138153

139154
/**
140155
* Wraps an ArrayBuffer, any object containing an ArrayBuffer or a string. Sets the created ByteBuffer's offset to 0
141156
* and its length to the wrapped objects byte length.
142-
* @param {ArrayBuffer|{array: ArrayBuffer}|{buffer: ArrayBuffer}|string} buffer ArrayBuffer, any object with an .array or .buffer property or a string to wrap
157+
* @param {ArrayBuffer|Buffer|string|{array: ArrayBuffer}|{buffer: ArrayBuffer}|string} buffer ArrayBuffer, any object with an .array or .buffer property or a string to wrap
143158
* @param {boolean=} littleEndian true to use little endian multi byte values, false for big endian. Defaults to true.
144159
* @return {ByteBuffer}
145160
* @throws {Error} If the specified object cannot be wrapped
@@ -150,9 +165,11 @@
150165
if (typeof buffer == 'string') {
151166
return new ByteBuffer().writeUTF8String(buffer).flip();
152167
}
153-
// Wrap node Buffer
168+
var b;
169+
// Wrap Buffer
154170
if (Buffer && Buffer.isBuffer(buffer)) {
155-
buffer = new Uint8Array(buffer);
171+
b = new Uint8Array(buffer).buffer; // noop on node <= 0.8
172+
buffer = (b === buffer) ? toArrayBuffer(buffer) : b;
156173
}
157174
// Wrap anything that is or contains an ArrayBuffer
158175
if (!!buffer["array"]) {
@@ -161,9 +178,9 @@
161178
buffer = buffer["buffer"];
162179
}
163180
if (!(buffer instanceof ArrayBuffer)) {
164-
throw(new Error("Cannot wrap buffer of type "+typeof(buffer)));
181+
throw(new Error("Cannot wrap buffer of type "+typeof(buffer)+", "+buffer.constructor.name));
165182
}
166-
var b = new ByteBuffer(0, littleEndian, /* shadow copy */ true);
183+
b = new ByteBuffer(0, littleEndian, /* shadow copy */ true);
167184
b.array = buffer;
168185
b.view = new DataView(b.array);
169186
b.offset = 0;

0 commit comments

Comments
 (0)