Skip to content

Commit c6164d7

Browse files
authored
Implementing new structures for DateTime in Bolt 5.0 (#948)
The structures with signature `0x46` and `0x66` are being replaced by `0x49` and `0x69`. This new structures changes the meaning of seconds and nano seconds from `adjusted Unix epoch` to `UTC`. This changes have with goal of avoiding un-existing or ambiguous ZonedDateTime to be received or sent over Bolt. Bolt v4.3 and v4.4 were patched to support this feature if the server supports the patch.
1 parent a94bbe7 commit c6164d7

24 files changed

+1446
-54
lines changed

packages/bolt-connection/src/bolt/bolt-protocol-v1.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ export default class BoltProtocol {
8787

8888
get transformer () {
8989
if (this._transformer === undefined) {
90-
this._transformer = new Transformer(Object.values(transformersFactories).map(create => create(this._config)))
90+
this._transformer = new Transformer(Object.values(transformersFactories).map(create => create(this._config, this._log)))
9191
}
9292
return this._transformer
9393
}

packages/bolt-connection/src/bolt/bolt-protocol-v2.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ export default class BoltProtocol extends BoltProtocolV1 {
3737

3838
get transformer () {
3939
if (this._transformer === undefined) {
40-
this._transformer = new Transformer(Object.values(transformersFactories).map(create => create(this._config)))
40+
this._transformer = new Transformer(Object.values(transformersFactories).map(create => create(this._config, this._log)))
4141
}
4242
return this._transformer
4343
}

packages/bolt-connection/src/bolt/bolt-protocol-v3.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ export default class BoltProtocol extends BoltProtocolV2 {
4848

4949
get transformer () {
5050
if (this._transformer === undefined) {
51-
this._transformer = new Transformer(Object.values(transformersFactories).map(create => create(this._config)))
51+
this._transformer = new Transformer(Object.values(transformersFactories).map(create => create(this._config, this._log)))
5252
}
5353
return this._transformer
5454
}

packages/bolt-connection/src/bolt/bolt-protocol-v4x0.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ export default class BoltProtocol extends BoltProtocolV3 {
4646

4747
get transformer () {
4848
if (this._transformer === undefined) {
49-
this._transformer = new Transformer(Object.values(transformersFactories).map(create => create(this._config)))
49+
this._transformer = new Transformer(Object.values(transformersFactories).map(create => create(this._config, this._log)))
5050
}
5151
return this._transformer
5252
}

packages/bolt-connection/src/bolt/bolt-protocol-v4x1.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ export default class BoltProtocol extends BoltProtocolV4 {
6767

6868
get transformer () {
6969
if (this._transformer === undefined) {
70-
this._transformer = new Transformer(Object.values(transformersFactories).map(create => create(this._config)))
70+
this._transformer = new Transformer(Object.values(transformersFactories).map(create => create(this._config, this._log)))
7171
}
7272
return this._transformer
7373
}

packages/bolt-connection/src/bolt/bolt-protocol-v4x2.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ export default class BoltProtocol extends BoltProtocolV41 {
3434

3535
get transformer () {
3636
if (this._transformer === undefined) {
37-
this._transformer = new Transformer(Object.values(transformersFactories).map(create => create(this._config)))
37+
this._transformer = new Transformer(Object.values(transformersFactories).map(create => create(this._config, this._log)))
3838
}
3939
return this._transformer
4040
}

packages/bolt-connection/src/bolt/bolt-protocol-v4x3.js

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,10 @@
1818
*/
1919
import BoltProtocolV42 from './bolt-protocol-v4x2'
2020
import RequestMessage from './request-message'
21-
import { RouteObserver } from './stream-observers'
21+
import { LoginObserver, RouteObserver } from './stream-observers'
2222

2323
import transformersFactories from './bolt-protocol-v4x3.transformer'
24+
import utcTransformersFactories from './bolt-protocol-v5x0.utc.transformer'
2425
import Transformer from './transformer'
2526

2627
import { internal } from 'neo4j-driver-core'
@@ -37,7 +38,7 @@ export default class BoltProtocol extends BoltProtocolV42 {
3738

3839
get transformer () {
3940
if (this._transformer === undefined) {
40-
this._transformer = new Transformer(Object.values(transformersFactories).map(create => create(this._config)))
41+
this._transformer = new Transformer(Object.values(transformersFactories).map(create => create(this._config, this._log)))
4142
}
4243
return this._transformer
4344
}
@@ -75,4 +76,51 @@ export default class BoltProtocol extends BoltProtocolV42 {
7576

7677
return observer
7778
}
79+
80+
/**
81+
* Initialize a connection with the server
82+
*
83+
* @param {Object} param0 The params
84+
* @param {string} param0.userAgent The user agent
85+
* @param {any} param0.authToken The auth token
86+
* @param {function(error)} param0.onError On error callback
87+
* @param {function(onComplte)} param0.onComplete On complete callback
88+
* @returns {LoginObserver} The Login observer
89+
*/
90+
initialize ({ userAgent, authToken, onError, onComplete } = {}) {
91+
const observer = new LoginObserver({
92+
onError: error => this._onLoginError(error, onError),
93+
onCompleted: metadata => {
94+
if (metadata.patch_bolt !== undefined) {
95+
this._applyPatches(metadata.patch_bolt)
96+
}
97+
return this._onLoginCompleted(metadata, onComplete)
98+
}
99+
})
100+
101+
this.write(
102+
RequestMessage.hello(userAgent, authToken, this._serversideRouting, ['utc']),
103+
observer,
104+
true
105+
)
106+
107+
return observer
108+
}
109+
110+
/**
111+
*
112+
* @param {string[]} patches Patches to be applied to the protocol
113+
*/
114+
_applyPatches (patches) {
115+
if (patches.includes('utc')) {
116+
this._applyUtcPatch()
117+
}
118+
}
119+
120+
_applyUtcPatch () {
121+
this._transformer = new Transformer(Object.values({
122+
...transformersFactories,
123+
...utcTransformersFactories
124+
}).map(create => create(this._config, this._log)))
125+
}
78126
}

packages/bolt-connection/src/bolt/bolt-protocol-v4x4.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import RequestMessage from './request-message'
2323
import { RouteObserver, ResultStreamObserver } from './stream-observers'
2424

2525
import transformersFactories from './bolt-protocol-v4x4.transformer'
26+
import utcTransformersFactories from './bolt-protocol-v5x0.utc.transformer'
2627
import Transformer from './transformer'
2728

2829
const {
@@ -37,7 +38,7 @@ export default class BoltProtocol extends BoltProtocolV43 {
3738

3839
get transformer () {
3940
if (this._transformer === undefined) {
40-
this._transformer = new Transformer(Object.values(transformersFactories).map(create => create(this._config)))
41+
this._transformer = new Transformer(Object.values(transformersFactories).map(create => create(this._config, this._log)))
4142
}
4243
return this._transformer
4344
}
@@ -163,4 +164,11 @@ export default class BoltProtocol extends BoltProtocolV43 {
163164

164165
return observer
165166
}
167+
168+
_applyUtcPatch () {
169+
this._transformer = new Transformer(Object.values({
170+
...transformersFactories,
171+
...utcTransformersFactories
172+
}).map(create => create(this._config, this._log)))
173+
}
166174
}

packages/bolt-connection/src/bolt/bolt-protocol-v5x0.js

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ import BoltProtocolV44 from './bolt-protocol-v4x4'
2020

2121
import transformersFactories from './bolt-protocol-v5x0.transformer'
2222
import Transformer from './transformer'
23+
import RequestMessage from './request-message'
24+
import { LoginObserver } from './stream-observers'
2325

2426
import { internal } from 'neo4j-driver-core'
2527

@@ -34,8 +36,33 @@ export default class BoltProtocol extends BoltProtocolV44 {
3436

3537
get transformer () {
3638
if (this._transformer === undefined) {
37-
this._transformer = new Transformer(Object.values(transformersFactories).map(create => create(this._config)))
39+
this._transformer = new Transformer(Object.values(transformersFactories).map(create => create(this._config, this._log)))
3840
}
3941
return this._transformer
4042
}
43+
44+
/**
45+
* Initialize a connection with the server
46+
*
47+
* @param {Object} param0 The params
48+
* @param {string} param0.userAgent The user agent
49+
* @param {any} param0.authToken The auth token
50+
* @param {function(error)} param0.onError On error callback
51+
* @param {function(onComplte)} param0.onComplete On complete callback
52+
* @returns {LoginObserver} The Login observer
53+
*/
54+
initialize ({ userAgent, authToken, onError, onComplete } = {}) {
55+
const observer = new LoginObserver({
56+
onError: error => this._onLoginError(error, onError),
57+
onCompleted: metadata => this._onLoginCompleted(metadata, onComplete)
58+
})
59+
60+
this.write(
61+
RequestMessage.hello(userAgent, authToken, this._serversideRouting),
62+
observer,
63+
true
64+
)
65+
66+
return observer
67+
}
4168
}

packages/bolt-connection/src/bolt/bolt-protocol-v5x0.transformer.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,14 @@
1818
*/
1919

2020
import { structure } from '../packstream'
21-
import { Node, Relationship, UnboundRelationship } from 'neo4j-driver-core'
21+
import {
22+
Node,
23+
Relationship,
24+
UnboundRelationship
25+
} from 'neo4j-driver-core'
26+
2227
import v4x4 from './bolt-protocol-v4x4.transformer'
28+
import v5x0Utc from './bolt-protocol-v5x0.utc.transformer'
2329

2430
const NODE_STRUCT_SIZE = 4
2531
const RELATIONSHIP_STRUCT_SIZE = 8
@@ -118,6 +124,7 @@ function createUnboundRelationshipTransformer (config) {
118124

119125
export default {
120126
...v4x4,
127+
...v5x0Utc,
121128
createNodeTransformer,
122129
createRelationshipTransformer,
123130
createUnboundRelationshipTransformer

0 commit comments

Comments
 (0)