@@ -22,6 +22,7 @@ import StreamObserver from '../stream-observer';
22
22
import Result from '../../result' ;
23
23
import { EMPTY_CONNECTION_HOLDER } from '../connection-holder' ;
24
24
import HttpDataConverter from './http-data-converter' ;
25
+ import { Neo4jError } from '../../error' ;
25
26
26
27
export default class HttpStatementRunner {
27
28
@@ -30,13 +31,21 @@ export default class HttpStatementRunner {
30
31
this . _transactionCommitUrl = createTransactionCommitUrl ( url ) ;
31
32
this . _headers = createHttpHeaders ( authToken ) ;
32
33
this . _converter = new HttpDataConverter ( ) ;
34
+ this . _activeXhrRequests = [ ] ;
33
35
}
34
36
35
37
run ( statement , parameters ) {
36
38
const streamObserver = new StreamObserver ( ) ;
37
- sendPostRequest ( statement , parameters , streamObserver , this . _transactionCommitUrl , this . _headers , this . _converter ) ;
39
+ sendPostRequest ( statement , parameters , streamObserver , this ) ;
38
40
return new Result ( streamObserver , statement , parameters , this . _serverInfoSupplier , EMPTY_CONNECTION_HOLDER ) ;
39
41
}
42
+
43
+ terminateActiveRequests ( ) {
44
+ while ( this . _activeXhrRequests . length > 0 ) {
45
+ const activeXhrRequest = this . _activeXhrRequests . pop ( ) ;
46
+ activeXhrRequest . abort ( ) ;
47
+ }
48
+ }
40
49
}
41
50
42
51
function createServerInfoSupplier ( url ) {
@@ -58,16 +67,22 @@ function createHttpHeaders(authToken) {
58
67
} ;
59
68
}
60
69
61
- function sendPostRequest ( statement , parameters , streamObserver , transactionCommitUrl , headers , converter ) {
70
+ function sendPostRequest ( statement , parameters , streamObserver , statementRunner ) {
62
71
try {
63
- xhr . post (
64
- transactionCommitUrl ,
72
+ const xhrRequest = xhr . post (
73
+ statementRunner . _transactionCommitUrl ,
65
74
{
66
- headers : headers ,
67
- body : createStatementJson ( statement , parameters , converter )
75
+ headers : statementRunner . _headers ,
76
+ body : createStatementJson ( statement , parameters , statementRunner . _converter )
68
77
} ,
69
- ( error , response ) => processPostResponse ( error , response , converter , streamObserver )
78
+ ( error , response ) => processPostResponse ( error , response , statementRunner . _converter , streamObserver )
70
79
) ;
80
+
81
+ xhrRequest . addEventListener ( 'abort' , ( ) => {
82
+ streamObserver . onError ( new Neo4jError ( 'Query terminated because session has been closed' ) ) ;
83
+ } , false ) ;
84
+
85
+ statementRunner . _activeXhrRequests . push ( xhrRequest ) ;
71
86
} catch ( e ) {
72
87
streamObserver . onError ( e ) ;
73
88
}
0 commit comments