Skip to content

Commit 5a7e842

Browse files
committed
version select ordering
1 parent 5034a5a commit 5a7e842

File tree

2 files changed

+62
-14
lines changed

2 files changed

+62
-14
lines changed

packages/bolt-connection/src/bolt/handshake.js

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ import { alloc } from '../channel'
1919
import { newError } from 'neo4j-driver-core'
2020

2121
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
2224

2325
function version (major, minor) {
2426
return {
@@ -80,25 +82,33 @@ function newNegotiation (channel, buffer, log) {
8082
buffer.readUInt8(),
8183
buffer.readUInt8()
8284
]
83-
versions = versions.concat([h])
85+
versions = versions.concat(getVersions(h))
8486
}
85-
buffer.readVarInt()
87+
const capabilityBitMask = buffer.readVarInt()
88+
const capabilites = selectCapabilites(capabilityBitMask)
89+
8690
// parse supported capabilities
8791
// 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+
}
90102

91103
return new Promise((resolve, reject) => {
92104
try {
93105
const selectionBuffer = alloc(5)
94106
selectionBuffer.writeInt32((minor << 8) | major)
95-
// select capabilities and respond
96-
const capabilites = 0
97107
selectionBuffer.writeVarInt(capabilites)
98108
channel.write(selectionBuffer)
99109
resolve({
100110
protocolVersion: Number(major + '.' + minor),
101-
capabilites: 0,
111+
capabilites,
102112
consumeRemainingBuffer: consumer => {
103113
if (buffer.hasRemaining()) {
104114
consumer(buffer.readSlice(buffer.remaining()))
@@ -193,3 +203,17 @@ function initialHandshake (channel, log) {
193203
channel.write(newHandshakeBuffer())
194204
})
195205
}
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+
}

packages/neo4j-driver-deno/lib/bolt-connection/bolt/handshake.js

Lines changed: 31 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)