1
- import { BufferList } from '../BufferList' ;
2
1
import { ERROR , PROPERTY } from '../enums' ;
3
- import { Properties } from '../types' ;
2
+ import { BufferLike , Properties } from '../types' ;
4
3
5
- export const parseVarInt = ( data : BufferList , offset : number ) : [ int : number , size : number ] => {
4
+ export const parseVarInt = ( data : BufferLike , offset : number ) : [ int : number , size : number ] => {
6
5
const b1 = data . readUInt8 ( offset ) ;
7
6
if ( ! ( b1 & 0b10000000 ) ) return [ b1 & 0b01111111 , 1 ] ;
8
7
const b2 = data . readUInt8 ( offset + 1 ) ;
@@ -13,37 +12,19 @@ export const parseVarInt = (data: BufferList, offset: number): [int: number, siz
13
12
return [ ( ( b4 & 0b01111111 ) << 21 ) + ( ( b3 & 0b01111111 ) << 14 ) + ( ( b2 & 0b01111111 ) << 7 ) + ( b1 & 0b01111111 ) , 4 ] ;
14
13
} ;
15
14
16
- export const parseVarIntBuf = ( buf : Buffer , offset : number ) : [ int : number , size : number ] => {
17
- const b1 = buf . readUInt8 ( offset ) ;
18
- if ( ! ( b1 & 0b10000000 ) ) return [ b1 & 0b01111111 , 1 ] ;
19
- const b2 = buf . readUInt8 ( offset + 1 ) ;
20
- if ( ! ( b2 & 0b10000000 ) ) return [ ( ( b2 & 0b01111111 ) << 7 ) + ( b1 & 0b01111111 ) , 2 ] ;
21
- const b3 = buf . readUInt8 ( offset + 2 ) ;
22
- if ( ! ( b3 & 0b10000000 ) ) return [ ( ( b3 & 0b01111111 ) << 14 ) + ( ( b2 & 0b01111111 ) << 7 ) + ( b1 & 0b01111111 ) , 3 ] ;
23
- const b4 = buf . readUInt8 ( offset + 3 ) ;
24
- return [ ( ( b4 & 0b01111111 ) << 21 ) + ( ( b3 & 0b01111111 ) << 14 ) + ( ( b2 & 0b01111111 ) << 7 ) + ( b1 & 0b01111111 ) , 4 ] ;
25
- } ;
26
-
27
- export const parseBinary = ( list : BufferList , offset : number ) : Buffer => {
15
+ export const parseBinary = ( list : BufferLike , offset : number ) : Buffer => {
28
16
const stringOffset = offset + 2 ;
29
17
const dataLength = list . readUInt16BE ( offset ) ;
30
18
return list . slice ( stringOffset , stringOffset + dataLength ) ;
31
19
} ;
32
20
33
- export const parseBinaryBuf = ( buf : Buffer , offset : number ) : Buffer => {
34
- const stringOffset = offset + 2 ;
35
- const dataLength = buf . readUInt16BE ( offset ) ;
36
- return buf . slice ( stringOffset , stringOffset + dataLength ) ;
37
- } ;
38
-
39
- export const parseProps = ( data : BufferList , offset : number ) : [ props : Properties , size : number ] => {
21
+ export const parseProps = ( data : BufferLike , offset : number ) : [ props : Properties , size : number ] => {
40
22
const [ int , size ] = parseVarInt ( data , offset ) ;
41
23
offset += size ;
42
- const buf = data . slice ( offset , offset + int ) ;
24
+ const end = offset + int ;
43
25
const props : Properties = { } ;
44
- offset = 0 ;
45
- while ( offset < int ) {
46
- const byte = buf . readUInt8 ( offset ++ ) ;
26
+ while ( offset < end ) {
27
+ const byte = data . readUInt8 ( offset ++ ) ;
47
28
switch ( byte ) {
48
29
case PROPERTY . PayloadFormatIndicator :
49
30
case PROPERTY . RequestProblemInformation :
@@ -53,35 +34,35 @@ export const parseProps = (data: BufferList, offset: number): [props: Properties
53
34
case PROPERTY . WildcardSubscriptionAvailable :
54
35
case PROPERTY . SubscriptionIdentifierAvailable :
55
36
case PROPERTY . SharedSubscriptionAvailable : {
56
- props [ byte ] = buf . readUInt8 ( offset ) ;
37
+ props [ byte ] = data . readUInt8 ( offset ) ;
57
38
offset += 1 ;
58
39
break ;
59
40
}
60
41
case PROPERTY . ServerKeepAlive :
61
42
case PROPERTY . ReceiveMaximum :
62
43
case PROPERTY . TopicAliasMaximum :
63
44
case PROPERTY . TopicAlias : {
64
- props [ byte ] = buf . readUInt16BE ( offset ) ;
45
+ props [ byte ] = data . readUInt16BE ( offset ) ;
65
46
offset += 2 ;
66
47
break ;
67
48
}
68
49
case PROPERTY . MessageExpiryInterval :
69
50
case PROPERTY . WillDelayInterval :
70
51
case PROPERTY . SessionExpiryInterval :
71
52
case PROPERTY . MaximumPacketSize : {
72
- props [ byte ] = buf . readUInt32BE ( offset ) ;
53
+ props [ byte ] = data . readUInt32BE ( offset ) ;
73
54
offset += 4 ;
74
55
break ;
75
56
}
76
57
case PROPERTY . SubscriptionIdentifier : {
77
- const [ value , size ] = parseVarIntBuf ( buf , offset ) ;
58
+ const [ value , size ] = parseVarInt ( data , offset ) ;
78
59
props [ byte ] = value ;
79
60
offset += size ;
80
61
break ;
81
62
}
82
63
case PROPERTY . CorrelationData :
83
64
case PROPERTY . AuthenticationData : {
84
- const { byteLength} = ( props [ byte ] = parseBinaryBuf ( buf , offset ) ) ;
65
+ const { byteLength} = ( props [ byte ] = parseBinary ( data , offset ) ) ;
85
66
offset += 2 + byteLength ;
86
67
break ;
87
68
}
@@ -92,16 +73,16 @@ export const parseProps = (data: BufferList, offset: number): [props: Properties
92
73
case PROPERTY . ResponseInformation :
93
74
case PROPERTY . ServerReference :
94
75
case PROPERTY . ReasonString : {
95
- const binary = parseBinaryBuf ( buf , offset ) ;
76
+ const binary = parseBinary ( data , offset ) ;
96
77
props [ byte ] = binary . toString ( 'utf8' ) ;
97
78
offset += 2 + binary . byteLength ;
98
79
break ;
99
80
}
100
81
case PROPERTY . UserProperty : {
101
82
if ( ! props [ PROPERTY . UserProperty ] ) props [ PROPERTY . UserProperty ] = [ ] ;
102
- const key = parseBinaryBuf ( buf , offset ) ;
83
+ const key = parseBinary ( data , offset ) ;
103
84
offset += 2 + key . byteLength ;
104
- const value = parseBinaryBuf ( buf , offset ) ;
85
+ const value = parseBinary ( data , offset ) ;
105
86
offset += 2 + value . byteLength ;
106
87
props [ PROPERTY . UserProperty ] ! . push ( [ key . toString ( 'utf8' ) , value . toString ( 'utf8' ) ] ) ;
107
88
break ;
0 commit comments