@@ -21,6 +21,8 @@ import Session from './session';
21
21
import { Driver , READ , WRITE } from './driver' ;
22
22
import { newError , SERVICE_UNAVAILABLE , SESSION_EXPIRED } from "./error" ;
23
23
import RoundRobinArray from './internal/round-robin-array' ;
24
+ import { int } from './integer'
25
+ import Integer from './integer'
24
26
import "babel-polyfill" ;
25
27
26
28
/**
@@ -139,13 +141,13 @@ class ClusterView {
139
141
this . routers = routers || new RoundRobinArray ( ) ;
140
142
this . readers = readers || new RoundRobinArray ( ) ;
141
143
this . writers = writers || new RoundRobinArray ( ) ;
142
- this . _expires = expires || - 1 ;
144
+ this . _expires = expires || int ( - 1 ) ;
143
145
144
146
}
145
147
146
148
needsUpdate ( ) {
147
- return this . _expires < Date . now ( ) ||
148
- this . routers . empty ( ) ||
149
+ return this . _expires . lessThan ( Date . now ( ) ) ||
150
+ this . routers . size ( ) <= 1 ||
149
151
this . readers . empty ( ) ||
150
152
this . writers . empty ( ) ;
151
153
}
@@ -196,10 +198,13 @@ function newClusterView(session) {
196
198
return Promise . reject ( newError ( "Invalid routing response from server" , SERVICE_UNAVAILABLE ) ) ;
197
199
}
198
200
let record = res . records [ 0 ] ;
199
- //Note we are loosing precision here but let's hope that in
200
- //the 140000 years to come before this precision loss
201
- //hits us, that we get native 64 bit integers in javascript
202
- let expires = record . get ( 'ttl' ) . toNumber ( ) ;
201
+ let now = int ( Date . now ( ) ) ;
202
+ let expires = record . get ( 'ttl' ) . multiply ( 1000 ) . add ( now ) ;
203
+ //if the server uses a really big expire time like Long.MAX_VALUE
204
+ //this may have overflowed
205
+ if ( expires . lessThan ( now ) ) {
206
+ expires = Integer . MAX_VALUE ;
207
+ }
203
208
let servers = record . get ( 'servers' ) ;
204
209
let routers = new RoundRobinArray ( ) ;
205
210
let readers = new RoundRobinArray ( ) ;
0 commit comments