|
7 | 7 | */ |
8 | 8 | function encode( data ) { |
9 | 9 |
|
| 10 | + var buffers = [] |
| 11 | + encode._encode( buffers, data) |
| 12 | + return Buffer.concat(buffers) |
| 13 | +} |
| 14 | + |
| 15 | +encode._encode = function( buffers, data ) { |
| 16 | + |
10 | 17 | if( data instanceof Buffer ) { |
11 | | - return Buffer.concat([ |
12 | | - new Buffer(data.length+':'), |
13 | | - data |
14 | | - ]) |
| 18 | + buffers.push(new Buffer(data.length+':')) |
| 19 | + buffers.push(data) |
| 20 | + return; |
15 | 21 | } |
16 | 22 |
|
17 | 23 | switch( typeof data ) { |
18 | 24 | case 'string': |
19 | | - return encode.bytes( data ) |
| 25 | + encode.bytes( buffers, data ) |
20 | 26 | break |
21 | 27 | case 'number': |
22 | | - return encode.number( data ) |
| 28 | + encode.number( buffers, data ) |
23 | 29 | break |
24 | 30 | case 'object': |
25 | | - return data.constructor === Array |
26 | | - ? encode.list( data ) |
27 | | - : encode.dict( data ) |
| 31 | + data.constructor === Array |
| 32 | + ? encode.list( buffers, data ) |
| 33 | + : encode.dict( buffers, data ) |
28 | 34 | break |
29 | 35 | } |
30 | | - |
31 | 36 | } |
32 | 37 |
|
33 | 38 | var buff_e = new Buffer('e') |
34 | 39 | , buff_d = new Buffer('d') |
35 | 40 | , buff_l = new Buffer('l') |
36 | 41 |
|
37 | | -encode.bytes = function( data ) { |
38 | | - return Buffer.concat([ |
39 | | - new Buffer(Buffer.byteLength( data )+":"), |
40 | | - new Buffer(data) |
41 | | - ]) |
| 42 | +encode.bytes = function( buffers, data ) { |
| 43 | + |
| 44 | + buffers.push( new Buffer(Buffer.byteLength( data ) + ": " + data) ) |
42 | 45 | } |
43 | 46 |
|
44 | | -encode.number = function( data ) { |
45 | | - return new Buffer( 'i' + ( data << 0 ) + 'e' ) |
| 47 | +encode.number = function( buffers, data ) { |
| 48 | + |
| 49 | + buffers.push( new Buffer( 'i' + ( data << 0 ) + 'e' ) ) |
46 | 50 | } |
47 | 51 |
|
48 | | -encode.dict = function( data ) { |
| 52 | +encode.dict = function( buffers, data ) { |
| 53 | + |
| 54 | + buffers.push( buff_d ) |
| 55 | + |
| 56 | + var j = 0 |
49 | 57 |
|
50 | | - var dict = [ buff_d ] |
51 | | - var i = 1; |
52 | 58 | // fix for issue #13 - sorted dicts |
53 | | - var keys = [] |
54 | | - for( var k in data) { |
55 | | - keys.push(k) |
56 | | - } |
57 | | - keys = keys.sort() |
| 59 | + var keys = Object.keys(data).sort() |
| 60 | + var kl = keys.length |
58 | 61 |
|
59 | | - for(var j=0;j<keys.length;j++) { |
60 | | - dict[i++] = encode( keys[j] ) |
61 | | - dict[i++] = encode( data[keys[j]] ) |
| 62 | + for( ; j < kl ; j++ ) { |
| 63 | + encode.bytes( buffers, keys[j] ) |
| 64 | + encode._encode( buffers, data[keys[j]] ) |
62 | 65 | } |
63 | 66 |
|
64 | | - dict[i++] = buff_e |
65 | | - return Buffer.concat(dict) |
| 67 | + buffers.push( buff_e ) |
66 | 68 |
|
67 | 69 | } |
68 | 70 |
|
69 | | -encode.list = function( data ) { |
| 71 | +encode.list = function( buffers, data ) { |
70 | 72 |
|
71 | 73 | var i = 0, j = 1 |
72 | 74 | var c = data.length |
73 | | - var lst = [ buff_l ] |
| 75 | + buffers.push( buff_l ) |
74 | 76 |
|
75 | 77 | for( ; i < c; i++ ) { |
76 | | - lst[j++] = encode( data[i] ) |
| 78 | + encode._encode( buffers, data[i] ) |
77 | 79 | } |
78 | 80 |
|
79 | | - lst[j++] = buff_e |
80 | | - return Buffer.concat(lst) |
| 81 | + buffers.push( buff_e ) |
81 | 82 |
|
82 | 83 | } |
83 | 84 |
|
|
0 commit comments