Skip to content

Commit fd853a7

Browse files
committed
Merge pull request #7 from oskarhane/decode-combined-buffer
Decode combined buffer
2 parents af34207 + ec2a3cb commit fd853a7

File tree

4 files changed

+80
-5
lines changed

4 files changed

+80
-5
lines changed

gulpfile.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,6 @@ gulp.task('build-browser-test', function(){
7979
})
8080
.on('error', gutil.log)
8181
.pipe(source('neo4j-web.test.js'))
82-
.pipe(buffer())
83-
.pipe(uglify())
8482
.pipe(gulp.dest(browserOutput))
8583
},
8684
function(cb) {

lib/internal/utf8.js

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,14 @@
2121
// with the Buffer API defined in buf.js
2222

2323
import buf from "./buf";
24+
import {StringDecoder} from 'string_decoder';
2425
let platformObj = {};
2526

27+
2628
try {
2729
// This will throw an exception is 'buffer' is not available
2830
require.resolve("buffer");
29-
31+
let decoder = new StringDecoder('utf8');
3032
let node = require("buffer");
3133

3234
platformObj = {
@@ -39,7 +41,17 @@ try {
3941
end = start + length;
4042
buffer.position = end;
4143
return buffer._buffer.toString( 'utf8', start, end );
42-
} else {
44+
}
45+
else if( buffer instanceof buf.CombinedBuffer ) {
46+
let out = streamDecodeCombinedBuffer(buffer._buffers, length,
47+
(partBuffer) => {
48+
return decoder.write(partBuffer._buffer);
49+
},
50+
() => { return decoder.end(); }
51+
);
52+
return out;
53+
}
54+
else {
4355
throw new Error( "Don't know how to decode strings from `" + buffer + "`.");
4456
}
4557
}
@@ -59,11 +71,40 @@ try {
5971
"decode" : function( buffer, length ) {
6072
if( buffer instanceof buf.HeapBuffer ) {
6173
return decoder.decode( buffer.readView( length ) );
62-
} else {
74+
}
75+
else if( buffer instanceof buf.CombinedBuffer ) {
76+
let out = streamDecodeCombinedBuffer(buffer._buffers, length,
77+
(partBuffer) => {
78+
return decoder.decode(partBuffer.readView(partBuffer.length), {stream:true});
79+
},
80+
() => { return decoder.decode(); }
81+
);
82+
return out;
83+
}
84+
else {
6385
throw new Error( "Don't know how to decode strings from `" + buffer + "`.");
6486
}
6587
}
6688
}
6789
}
6890

91+
let streamDecodeCombinedBuffer = (combinedBuffers, length, decodeFn, endFn) => {
92+
let remainingBytesToRead = length;
93+
// Reduce CombinedBuffers to a decoded string
94+
let out = combinedBuffers.reduce(function(last, partBuffer){
95+
if(remainingBytesToRead <= 0) {
96+
return last;
97+
}
98+
if(partBuffer.length > remainingBytesToRead) { // When we don't want the whole buffer
99+
let lastSlice = partBuffer.readSlice(remainingBytesToRead);
100+
partBuffer._updatePos(remainingBytesToRead);
101+
remainingBytesToRead = 0;
102+
return last + decodeFn(lastSlice);
103+
}
104+
remainingBytesToRead -= partBuffer.length;
105+
return last + decodeFn(partBuffer);
106+
}, '');
107+
return out + endFn();
108+
}
109+
69110
export default platformObj;

test/browser/testrunner-phantomjs.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<!DOCTYPE html>
22
<html>
33
<head>
4+
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
45
<title>Jasmine Test Runner</title>
56

67
<link rel="shortcut icon" type="image/png" href="jasmine/lib/jasmine-2.0.3/jasmine_favicon.png">

test/internal/utf8.test.js

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11

22
var utf8 = require('../../build/node/internal/utf8');
3+
var buffers = require('../../build/node/internal/buf');
34

45
describe('utf8', function() {
56
it('should have a nice clean buffer position after serializing', function() {
@@ -14,6 +15,40 @@ describe('utf8', function() {
1415
expect( packAndUnpack( "" ) ).toBe( "" );
1516
expect( packAndUnpack( "åäö123" ) ).toBe( "åäö123" );
1617
});
18+
19+
it('should decode utf8 from a complete combined buffer', function() {
20+
// Given
21+
var msg = "asåfqwer";
22+
var buf = utf8.encode(msg);
23+
var bufa = buf.readSlice(3);
24+
var bufb = buf.readSlice(3);
25+
var bufc = buf.readSlice(3);
26+
var combined = new buffers.CombinedBuffer( [bufa, bufb, bufc] );
27+
28+
// When
29+
var decoded = utf8.decode(combined, combined.length);
30+
31+
// Then
32+
expect(decoded).toBe(msg);
33+
});
34+
35+
it('should decode utf8 from part of a combined buffer', function() {
36+
// Given
37+
var msg = "asåfq";
38+
var expectMsg = msg.substring(0, msg.length-1);
39+
var buf = utf8.encode(msg);
40+
var bufa = buf.readSlice(3);
41+
var bufb = buf.readSlice(3);
42+
var unrelatedData = buffers.alloc(3);
43+
var combined = new buffers.CombinedBuffer( [bufa, bufb, unrelatedData] );
44+
45+
// When
46+
// We read all but the unrelatedData and the last character of bufb
47+
var decoded = utf8.decode(combined, combined.length - 1 - unrelatedData.length );
48+
49+
// Then
50+
expect(decoded).toBe(expectMsg);
51+
});
1752
});
1853

1954
function packAndUnpack( str ) {

0 commit comments

Comments
 (0)