Skip to content

Commit b44296c

Browse files
committed
refactored unpack method
1 parent 4e33fc9 commit b44296c

File tree

2 files changed

+145
-68
lines changed

2 files changed

+145
-68
lines changed

src/v1/internal/connector.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -480,7 +480,6 @@ class Connection {
480480
const serverVersion = metadata ? metadata.server : null;
481481
if (!this.server.version) {
482482
this.server.version = serverVersion;
483-
484483
const version = ServerVersion.fromString(serverVersion);
485484
if (version.compareTo(VERSION_3_2_0) < 0) {
486485
this._packer.disableByteArrays();

src/v1/internal/packstream.js

Lines changed: 145 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -316,54 +316,65 @@ class Unpacker {
316316
this.structMappers = {};
317317
}
318318

319-
unpackList (size, buffer) {
320-
let value = [];
321-
for(let i = 0; i < size; i++) {
322-
value.push( this.unpack( buffer ) );
323-
}
324-
return value;
325-
}
319+
unpack(buffer) {
320+
const marker = buffer.readUInt8();
321+
const markerHigh = marker & 0xF0;
322+
const markerLow = marker & 0x0F;
326323

327-
unpackBytes(size, buffer) {
328-
const value = new Int8Array(size);
329-
for (let i = 0; i < size; i++) {
330-
value[i] = buffer.readInt8();
324+
if (marker == NULL) {
325+
return null;
331326
}
332-
return value;
333-
}
334327

335-
unpackMap (size, buffer) {
336-
let value = {};
337-
for(let i = 0; i < size; i++) {
338-
let key = this.unpack(buffer);
339-
value[key] = this.unpack(buffer);
328+
const boolean = this._unpackBoolean(marker);
329+
if (boolean !== null) {
330+
return boolean;
340331
}
341-
return value;
342-
}
343332

344-
unpackStruct (size, buffer) {
345-
let signature = buffer.readUInt8();
346-
let mapper = this.structMappers[signature];
347-
if( mapper ) {
348-
return mapper( this, buffer );
349-
} else {
350-
let value = new Structure(signature, []);
351-
for(let i = 0; i < size; i++) {
352-
value.fields.push(this.unpack(buffer));
353-
}
354-
return value;
333+
const number = this._unpackNumber(marker, buffer);
334+
if (number !== null) {
335+
return number;
336+
}
337+
338+
const string = this._unpackString(marker, markerHigh, markerLow, buffer);
339+
if (string !== null) {
340+
return string;
341+
}
342+
343+
const list = this._unpackList(marker, markerHigh, markerLow, buffer);
344+
if (list !== null) {
345+
return list;
355346
}
347+
348+
const byteArray = this._unpackByteArray(marker, buffer);
349+
if (byteArray !== null) {
350+
return byteArray;
351+
}
352+
353+
const map = this._unpackMap(marker, markerHigh, markerLow, buffer);
354+
if (map !== null) {
355+
return map;
356+
}
357+
358+
const struct = this._unpackStruct(marker, markerHigh, markerLow, buffer);
359+
if (struct !== null) {
360+
return struct;
361+
}
362+
363+
throw newError('Unknown packed value with marker ' + marker.toString(16));
356364
}
357365

358-
unpack ( buffer ) {
359-
let marker = buffer.readUInt8();
360-
if (marker == NULL) {
361-
return null;
362-
} else if (marker == TRUE) {
366+
_unpackBoolean(marker) {
367+
if (marker == TRUE) {
363368
return true;
364369
} else if (marker == FALSE) {
365370
return false;
366-
} else if (marker == FLOAT_64) {
371+
} else {
372+
return null;
373+
}
374+
}
375+
376+
_unpackNumber(marker, buffer) {
377+
if (marker == FLOAT_64) {
367378
return buffer.readFloat64();
368379
} else if (marker >= 0 && marker < 128) {
369380
return int(marker);
@@ -378,55 +389,122 @@ class Unpacker {
378389
return int(b);
379390
} else if (marker == INT_64) {
380391
let high = buffer.readInt32();
381-
let low = buffer.readInt32();
382-
return new Integer( low, high );
392+
let low = buffer.readInt32();
393+
return new Integer(low, high);
394+
} else {
395+
return null;
396+
}
397+
}
398+
399+
_unpackString(marker, markerHigh, markerLow, buffer) {
400+
if (markerHigh == TINY_STRING) {
401+
return utf8.decode(buffer, markerLow);
383402
} else if (marker == STRING_8) {
384-
return utf8.decode( buffer, buffer.readUInt8());
403+
return utf8.decode(buffer, buffer.readUInt8());
385404
} else if (marker == STRING_16) {
386-
return utf8.decode( buffer, buffer.readUInt16() );
405+
return utf8.decode(buffer, buffer.readUInt16());
387406
} else if (marker == STRING_32) {
388-
return utf8.decode( buffer, buffer.readUInt32() );
407+
return utf8.decode(buffer, buffer.readUInt32());
408+
} else {
409+
return null;
410+
}
411+
}
412+
413+
_unpackList(marker, markerHigh, markerLow, buffer) {
414+
if (markerHigh == TINY_LIST) {
415+
return this._unpackListWithSize(markerLow, buffer);
389416
} else if (marker == LIST_8) {
390-
return this.unpackList(buffer.readUInt8(), buffer);
417+
return this._unpackListWithSize(buffer.readUInt8(), buffer);
391418
} else if (marker == LIST_16) {
392-
return this.unpackList(buffer.readUInt16(), buffer);
419+
return this._unpackListWithSize(buffer.readUInt16(), buffer);
393420
} else if (marker == LIST_32) {
394-
return this.unpackList(buffer.readUInt32(), buffer);
395-
} else if (marker == BYTES_8) {
396-
return this.unpackBytes(buffer.readUInt8(), buffer);
421+
return this._unpackListWithSize(buffer.readUInt32(), buffer);
422+
} else {
423+
return null;
424+
}
425+
}
426+
427+
_unpackListWithSize(size, buffer) {
428+
let value = [];
429+
for (let i = 0; i < size; i++) {
430+
value.push(this.unpack(buffer));
431+
}
432+
return value;
433+
}
434+
435+
_unpackByteArray(marker, buffer) {
436+
if (marker == BYTES_8) {
437+
return this._unpackByteArrayWithSize(buffer.readUInt8(), buffer);
397438
} else if (marker == BYTES_16) {
398-
return this.unpackBytes(buffer.readUInt16(), buffer);
439+
return this._unpackByteArrayWithSize(buffer.readUInt16(), buffer);
399440
} else if (marker == BYTES_32) {
400-
return this.unpackBytes(buffer.readUInt32(), buffer);
441+
return this._unpackByteArrayWithSize(buffer.readUInt32(), buffer);
442+
} else {
443+
return null;
444+
}
445+
}
446+
447+
_unpackByteArrayWithSize(size, buffer) {
448+
const value = new Int8Array(size);
449+
for (let i = 0; i < size; i++) {
450+
value[i] = buffer.readInt8();
451+
}
452+
return value;
453+
}
454+
455+
_unpackMap(marker, markerHigh, markerLow, buffer) {
456+
if (markerHigh == TINY_MAP) {
457+
return this._unpackMapWithSize(markerLow, buffer);
401458
} else if (marker == MAP_8) {
402-
return this.unpackMap(buffer.readUInt8(), buffer);
459+
return this._unpackMapWithSize(buffer.readUInt8(), buffer);
403460
} else if (marker == MAP_16) {
404-
return this.unpackMap(buffer.readUInt16(), buffer);
461+
return this._unpackMapWithSize(buffer.readUInt16(), buffer);
405462
} else if (marker == MAP_32) {
406-
return this.unpackMap(buffer.readUInt32(), buffer);
463+
return this._unpackMapWithSize(buffer.readUInt32(), buffer);
464+
} else {
465+
return null;
466+
}
467+
}
468+
469+
_unpackMapWithSize(size, buffer) {
470+
let value = {};
471+
for (let i = 0; i < size; i++) {
472+
let key = this.unpack(buffer);
473+
value[key] = this.unpack(buffer);
474+
}
475+
return value;
476+
}
477+
478+
_unpackStruct(marker, markerHigh, markerLow, buffer) {
479+
if (markerHigh == TINY_STRUCT) {
480+
return this._unpackStructWithSize(markerLow, buffer);
407481
} else if (marker == STRUCT_8) {
408-
return this.unpackStruct(buffer.readUInt8(), buffer);
482+
return this._unpackStructWithSize(buffer.readUInt8(), buffer);
409483
} else if (marker == STRUCT_16) {
410-
return this.unpackStruct(buffer.readUInt16(), buffer);
411-
}
412-
let markerHigh = marker & 0xF0;
413-
let markerLow = marker & 0x0F;
414-
if (markerHigh == 0x80) {
415-
return utf8.decode( buffer, markerLow );
416-
} else if (markerHigh == 0x90) {
417-
return this.unpackList(markerLow, buffer);
418-
} else if (markerHigh == 0xA0) {
419-
return this.unpackMap(markerLow, buffer);
420-
} else if (markerHigh == 0xB0) {
421-
return this.unpackStruct(markerLow, buffer);
484+
return this._unpackStructWithSize(buffer.readUInt16(), buffer);
485+
} else {
486+
return null;
487+
}
488+
}
489+
490+
_unpackStructWithSize(size, buffer) {
491+
let signature = buffer.readUInt8();
492+
let mapper = this.structMappers[signature];
493+
if (mapper) {
494+
return mapper(this, buffer);
422495
} else {
423-
throw newError("Unknown packed value with marker " + marker.toString(16));
496+
let value = new Structure(signature, []);
497+
for (let i = 0; i < size; i++) {
498+
value.fields.push(this.unpack(buffer));
499+
}
500+
return value;
424501
}
425502
}
503+
426504
}
427505

428506
export {
429507
Packer,
430508
Unpacker,
431509
Structure
432-
}
510+
};

0 commit comments

Comments
 (0)