@@ -24,6 +24,7 @@ import {alloc} from './buf';
24
24
import { Node , Path , PathSegment , Relationship , UnboundRelationship } from '../graph-types' ;
25
25
import { newError } from './../error' ;
26
26
import ChannelConfig from './ch-config' ;
27
+ import StreamObserver from './stream-observer' ;
27
28
28
29
let Channel ;
29
30
if ( NodeChannel . available ) {
@@ -57,7 +58,7 @@ UNBOUND_RELATIONSHIP = 0x72,
57
58
PATH = 0x50 ,
58
59
//sent before version negotiation
59
60
MAGIC_PREAMBLE = 0x6060B017 ,
60
- DEBUG = true ;
61
+ DEBUG = false ;
61
62
62
63
let URLREGEX = new RegExp ( [
63
64
"([^/]+//)?" , // scheme
@@ -272,7 +273,7 @@ class Connection {
272
273
* failing, and the connection getting ejected from the session pool.
273
274
*
274
275
* @param err an error object, forwarded to all current and future subscribers
275
- * @private
276
+ * @protected
276
277
*/
277
278
_handleFatalError ( err ) {
278
279
this . _isBroken = true ;
@@ -288,21 +289,13 @@ class Connection {
288
289
}
289
290
}
290
291
291
- /**
292
- * Mark this connection as failed because processing of INIT message failed and server will close the connection.
293
- * Initialization failure is a fatal error for the connection.
294
- * @param {Neo4jError } error the initialization error.
295
- * @param {StreamObserver } initObserver the initialization observer that noticed the failure.
296
- * @protected
297
- */
298
- _initializationFailed ( error , initObserver ) {
299
- if ( this . _currentObserver === initObserver ) {
300
- this . _currentObserver = null ; // init observer detected the failure and should not be notified again
292
+ _handleMessage ( msg ) {
293
+ if ( this . _isBroken ) {
294
+ // ignore all incoming messages when this connection is broken. all previously pending observers failed
295
+ // with the fatal error. all future observers will fail with same fatal error.
296
+ return ;
301
297
}
302
- this . _handleFatalError ( error ) ;
303
- }
304
298
305
- _handleMessage ( msg ) {
306
299
const payload = msg . fields [ 0 ] ;
307
300
308
301
switch ( msg . signature ) {
@@ -315,7 +308,7 @@ class Connection {
315
308
try {
316
309
this . _currentObserver . onCompleted ( payload ) ;
317
310
} finally {
318
- this . _currentObserver = this . _pendingObservers . shift ( ) ;
311
+ this . _updateCurrentObserver ( ) ;
319
312
}
320
313
break ;
321
314
case FAILURE :
@@ -324,7 +317,7 @@ class Connection {
324
317
this . _currentFailure = newError ( payload . message , payload . code ) ;
325
318
this . _currentObserver . onError ( this . _currentFailure ) ;
326
319
} finally {
327
- this . _currentObserver = this . _pendingObservers . shift ( ) ;
320
+ this . _updateCurrentObserver ( ) ;
328
321
// Things are now broken. Pending observers will get FAILURE messages routed until
329
322
// We are done handling this failure.
330
323
if ( ! this . _isHandlingFailure ) {
@@ -354,7 +347,7 @@ class Connection {
354
347
else if ( this . _currentObserver . onError )
355
348
this . _currentObserver . onError ( payload ) ;
356
349
} finally {
357
- this . _currentObserver = this . _pendingObservers . shift ( ) ;
350
+ this . _updateCurrentObserver ( ) ;
358
351
}
359
352
break ;
360
353
default :
@@ -452,6 +445,14 @@ class Connection {
452
445
}
453
446
}
454
447
448
+ /**
449
+ * Pop next pending observer form the list of observers and make it current observer.
450
+ * @protected
451
+ */
452
+ _updateCurrentObserver ( ) {
453
+ this . _currentObserver = this . _pendingObservers . shift ( ) ;
454
+ }
455
+
455
456
/**
456
457
* Synchronize - flush all queued outgoing messages and route their responses
457
458
* to their respective handlers.
@@ -509,14 +510,15 @@ function connect(url, config = {}, connectionErrorCode = null) {
509
510
* closed by the server if processing of INIT message fails so this observer will handle initialization failure
510
511
* as a fatal error.
511
512
*/
512
- class InitObserver {
513
+ class InitObserver extends StreamObserver {
513
514
514
515
/**
515
516
* @constructor
516
517
* @param {Connection } connection the connection used to send INIT message.
517
518
* @param {StreamObserver } originalObserver the observer to wrap and delegate calls to.
518
519
*/
519
520
constructor ( connection , originalObserver ) {
521
+ super ( ) ;
520
522
this . _connection = connection ;
521
523
this . _originalObserver = originalObserver || NO_OP_OBSERVER ;
522
524
}
@@ -526,10 +528,11 @@ class InitObserver {
526
528
}
527
529
528
530
onError ( error ) {
531
+ this . _connection . _updateCurrentObserver ( ) ; // make sure this same observer will not be called again
529
532
try {
530
533
this . _originalObserver . onError ( error ) ;
531
534
} finally {
532
- this . _connection . _initializationFailed ( error , this ) ;
535
+ this . _connection . _handleFatalError ( error ) ;
533
536
}
534
537
}
535
538
0 commit comments