@@ -19,6 +19,8 @@ import { alloc } from '../channel'
19
19
import { newError } from 'neo4j-driver-core'
20
20
21
21
const BOLT_MAGIC_PREAMBLE = 0x6060b017
22
+ const AVAILABLE_BOLT_PROTOCOLS = [ 5.7 , 5.5 , 5.4 , 5.3 , 5.2 , 5.1 , 5.0 , 4.4 , 4.3 , 4.2 , 4.1 , 4.0 , 3.0 ]
23
+ const DESIRED_CAPABILITES = 0
22
24
23
25
function version ( major , minor ) {
24
26
return {
@@ -80,25 +82,33 @@ function newNegotiation (channel, buffer, log) {
80
82
buffer . readUInt8 ( ) ,
81
83
buffer . readUInt8 ( )
82
84
]
83
- versions = versions . concat ( [ h ] )
85
+ versions = versions . concat ( getVersions ( h ) )
84
86
}
85
- buffer . readVarInt ( )
87
+ const capabilityBitMask = buffer . readVarInt ( )
88
+ const capabilites = selectCapabilites ( capabilityBitMask )
89
+
86
90
// parse supported capabilities
87
91
// select preferrable protocol and respond
88
- const major = versions [ 0 ] [ 3 ]
89
- const minor = versions [ 0 ] [ 2 ]
92
+ let major
93
+ let minor
94
+ for ( let i = 0 ; i < versions . length ; i ++ ) {
95
+ const version = versions [ i ]
96
+ if ( AVAILABLE_BOLT_PROTOCOLS . includes ( Number ( version . major + '.' + version . minor ) ) ) {
97
+ major = version . major
98
+ minor = version . minor
99
+ break
100
+ }
101
+ }
90
102
91
103
return new Promise ( ( resolve , reject ) => {
92
104
try {
93
105
const selectionBuffer = alloc ( 5 )
94
106
selectionBuffer . writeInt32 ( ( minor << 8 ) | major )
95
- // select capabilities and respond
96
- const capabilites = 0
97
107
selectionBuffer . writeVarInt ( capabilites )
98
108
channel . write ( selectionBuffer )
99
109
resolve ( {
100
110
protocolVersion : Number ( major + '.' + minor ) ,
101
- capabilites : 0 ,
111
+ capabilites,
102
112
consumeRemainingBuffer : consumer => {
103
113
if ( buffer . hasRemaining ( ) ) {
104
114
consumer ( buffer . readSlice ( buffer . remaining ( ) ) )
@@ -193,3 +203,17 @@ function initialHandshake (channel, log) {
193
203
channel . write ( newHandshakeBuffer ( ) )
194
204
} )
195
205
}
206
+
207
+ function getVersions ( versionArray ) {
208
+ const resultArr = [ ]
209
+ const major = versionArray [ 3 ]
210
+ const minor = versionArray [ 2 ]
211
+ for ( let i = 0 ; i <= versionArray [ 1 ] ; i ++ ) {
212
+ resultArr . push ( { major, minor : minor - i } )
213
+ }
214
+ return resultArr
215
+ }
216
+
217
+ function selectCapabilites ( capabilityBitMask ) {
218
+ return DESIRED_CAPABILITES // capabilites are currently unused and will always be 0.
219
+ }
0 commit comments