Skip to content

Commit 9d9a092

Browse files
committed
Switch to Fetch API instead of XHR
Driver created with either HTTP or HTTPS url needs to execute REST requests. This commit makes it use new standard Fetch API instead of 3rd party XHR library, which is based on `XMLHttpRequest`.
1 parent 2d679e3 commit 9d9a092

File tree

3 files changed

+40
-103
lines changed

3 files changed

+40
-103
lines changed

package-lock.json

+2-68
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+1-2
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,6 @@
7171
},
7272
"dependencies": {
7373
"babel-runtime": "^6.18.0",
74-
"url-parse": "^1.2.0",
75-
"xhr": "^2.4.1"
74+
"url-parse": "^1.2.0"
7675
}
7776
}

src/v1/internal/http/http-statement-runner.js

+37-33
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
* limitations under the License.
1818
*/
1919

20-
import xhr from 'xhr';
2120
import StreamObserver from '../stream-observer';
2221
import Result from '../../result';
2322
import {EMPTY_CONNECTION_HOLDER} from '../connection-holder';
@@ -50,24 +49,26 @@ function createTransactionCommitUrl(url) {
5049
}
5150

5251
function createHttpHeaders(authToken) {
53-
const basicAuthToken = 'Basic ' + btoa(authToken.principal + ':' + authToken.credentials);
54-
return {
55-
'Accept': 'application/json; charset=UTF-8',
56-
'Content-Type': 'application/json',
57-
'Authorization': basicAuthToken
58-
};
52+
const headers = new Headers();
53+
headers.append('Accept', 'application/json; charset=UTF-8');
54+
headers.append('Content-Type', 'application/json');
55+
headers.append('Authorization', 'Basic ' + btoa(authToken.principal + ':' + authToken.credentials));
56+
return headers;
5957
}
6058

6159
function sendPostRequest(statement, parameters, streamObserver, transactionCommitUrl, headers, converter) {
6260
try {
63-
xhr.post(
64-
transactionCommitUrl,
65-
{
66-
headers: headers,
67-
body: createStatementJson(statement, parameters, converter)
68-
},
69-
(error, response) => processPostResponse(error, response, converter, streamObserver)
70-
);
61+
const options = {
62+
method: 'POST',
63+
headers: headers,
64+
body: createStatementJson(statement, parameters, converter)
65+
};
66+
67+
fetch(transactionCommitUrl, options)
68+
.then(response => response.json())
69+
.catch(error => processResponseError(error, converter, streamObserver))
70+
.then(responseJson => processResponseJson(responseJson, converter, streamObserver));
71+
7172
} catch (e) {
7273
streamObserver.onError(e);
7374
}
@@ -93,33 +94,36 @@ function createStatementJsonOrThrow(statement, parameters, converter) {
9394
});
9495
}
9596

96-
function processPostResponse(error, response, converter, streamObserver) {
97+
function processResponseError(error, converter, streamObserver) {
98+
const neo4jError = converter.convertNetworkError(error);
99+
streamObserver.onError(neo4jError);
100+
}
101+
102+
function processResponseJson(responseJson, converter, streamObserver) {
103+
if (!responseJson) {
104+
// request failed and there is no response
105+
return;
106+
}
107+
97108
try {
98-
processPostResponseOrThrow(error, response, converter, streamObserver);
109+
processResponseJsonOrThrow(responseJson, converter, streamObserver);
99110
} catch (e) {
100111
streamObserver.onError(e);
101112
}
102113
}
103114

104-
function processPostResponseOrThrow(error, response, converter, streamObserver) {
105-
if (error) {
106-
const neo4jError = converter.convertNetworkError(error);
115+
function processResponseJsonOrThrow(responseJson, converter, streamObserver) {
116+
const neo4jError = converter.extractError(responseJson);
117+
if (neo4jError) {
107118
streamObserver.onError(neo4jError);
108119
} else {
109-
const responseJson = JSON.parse(response.body);
110-
111-
const neo4jError = converter.extractError(responseJson);
112-
if (neo4jError) {
113-
streamObserver.onError(neo4jError);
114-
} else {
115-
const recordMetadata = converter.extractRecordMetadata(responseJson);
116-
streamObserver.onCompleted(recordMetadata);
120+
const recordMetadata = converter.extractRecordMetadata(responseJson);
121+
streamObserver.onCompleted(recordMetadata);
117122

118-
const rawRecords = converter.extractRawRecords(responseJson);
119-
rawRecords.forEach(rawRecord => streamObserver.onNext(rawRecord));
123+
const rawRecords = converter.extractRawRecords(responseJson);
124+
rawRecords.forEach(rawRecord => streamObserver.onNext(rawRecord));
120125

121-
const statementMetadata = converter.extractStatementMetadata(responseJson);
122-
streamObserver.onCompleted(statementMetadata);
123-
}
126+
const statementMetadata = converter.extractStatementMetadata(responseJson);
127+
streamObserver.onCompleted(statementMetadata);
124128
}
125129
}

0 commit comments

Comments
 (0)