Skip to content

Commit e6d4cce

Browse files
oskarhanelutovich
authored andcommitted
Expose server info in result summary from sessions and transactions
Exposed as a map in `result.summary.server`: ``` { address: 'localhost:7687', version: 'Neo4j/3.1.0' } ```
1 parent 34d8935 commit e6d4cce

File tree

7 files changed

+93
-7
lines changed

7 files changed

+93
-7
lines changed

src/v1/driver.js

+6-2
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,8 @@ class Driver {
6767
*/
6868
_createConnection(url, release) {
6969
let sessionId = this._sessionIdGenerator++;
70-
let streamObserver = new _ConnectionStreamObserver(this);
7170
let conn = connect(url, this._config);
71+
let streamObserver = new _ConnectionStreamObserver(this, conn);
7272
conn.initialize(this._userAgent, this._token, streamObserver);
7373
conn._id = sessionId;
7474
conn._release = () => release(url, conn);
@@ -172,9 +172,10 @@ class Driver {
172172

173173
/** Internal stream observer used for connection state */
174174
class _ConnectionStreamObserver extends StreamObserver {
175-
constructor(driver) {
175+
constructor(driver, conn) {
176176
super();
177177
this._driver = driver;
178+
this._conn = conn;
178179
this._hasFailed = false;
179180
}
180181

@@ -192,6 +193,9 @@ class _ConnectionStreamObserver extends StreamObserver {
192193
if (this._driver.onCompleted) {
193194
this._driver.onCompleted(message);
194195
}
196+
if (this._conn && message && message.server) {
197+
this._conn.setServerVersion(message.server);
198+
}
195199
}
196200
}
197201

src/v1/internal/connector.js

+10-1
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,7 @@ class Connection {
193193
* to the next pending observer.
194194
*/
195195
this.url = url;
196+
this.server = {address: url};
196197
this._pendingObservers = [];
197198
this._currentObserver = undefined;
198199
this._ch = channel;
@@ -453,6 +454,10 @@ class Connection {
453454
_packable(value) {
454455
return this._packer.packable(value, (err) => this._handleFatalError(err));
455456
}
457+
458+
setServerVersion(version) {
459+
this.server.version = version;
460+
}
456461
}
457462

458463
/**
@@ -464,6 +469,10 @@ class Connection {
464469
*/
465470
function connect( url, config = {}) {
466471
let Ch = config.channel || Channel;
472+
const host = parseHost(url);
473+
const port = parsePort(url) || 7687;
474+
const completeUrl = host + ':' + port;
475+
467476
return new Connection( new Ch({
468477
host: parseHost(url),
469478
port: parsePort(url) || 7687,
@@ -473,7 +482,7 @@ function connect( url, config = {}) {
473482
trust : config.trust || (hasFeature("trust_all_certificates") ? "TRUST_ALL_CERTIFICATES" : "TRUST_CUSTOM_CA_SIGNED_CERTIFICATES"),
474483
trustedCertificates : config.trustedCertificates || [],
475484
knownHosts : config.knownHosts
476-
}), url);
485+
}), completeUrl);
477486
}
478487

479488
export {

src/v1/result-summary.js

+19
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ class ResultSummary {
4040
this.plan = metadata.plan || metadata.profile ? new Plan(metadata.plan || metadata.profile) : false;
4141
this.profile = metadata.profile ? new ProfiledPlan(metadata.profile) : false;
4242
this.notifications = this._buildNotifications(metadata.notifications);
43+
this.server = new ServerInfo(metadata.server);
4344
this.resultConsumedAfter = metadata.result_consumed_after;
4445
this.resultAvailableAfter = metadata.result_available_after;
4546
}
@@ -254,6 +255,24 @@ class Notification {
254255
}
255256
}
256257

258+
/**
259+
* Class for exposing server info from a result.
260+
* @access public
261+
*/
262+
class ServerInfo {
263+
/**
264+
* Create a ServerInfo instance
265+
* @constructor
266+
* @param {Object} serverMeta - Object with serverMeta data
267+
*/
268+
constructor(serverMeta) {
269+
if (serverMeta) {
270+
this.address = serverMeta.address;
271+
this.version = serverMeta.version;
272+
}
273+
}
274+
}
275+
257276
const statementType = {
258277
READ_ONLY: 'r',
259278
READ_WRITE: 'rw',

src/v1/session.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,8 @@ class _RunObserver extends StreamObserver {
136136
}
137137

138138
meta() {
139-
return this._meta;
139+
const serverMeta = {server: this._conn.server};
140+
return Object.assign({}, this._meta, serverMeta);
140141
}
141142
}
142143

src/v1/transaction.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,11 @@ class _TransactionStreamObserver extends StreamObserver {
134134
this._tx._onBookmark(bookmark);
135135
}
136136
}
137+
138+
serverMeta() {
139+
const serverMeta = {server: this._conn.server};
140+
return serverMeta;
141+
}
137142
}
138143

139144
/** internal state machine of the transaction*/
@@ -155,7 +160,7 @@ let _states = {
155160
conn.sync();
156161
}).catch(observer.onError);
157162

158-
return new Result( observer, statement, parameters );
163+
return new Result( observer, statement, parameters, () => observer.serverMeta() );
159164
}
160165
},
161166

test/v1/session.test.js

+23
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,29 @@ describe('session', function () {
164164
});
165165
});
166166

167+
it('should expose server info on successful query', function (done) {
168+
//lazy way of checking the version number
169+
//if server has been set we know it is at least
170+
//3.1 (todo actually parse the version string)
171+
if (!server) {
172+
done();
173+
return;
174+
}
175+
176+
// Given
177+
var statement = 'RETURN 1';
178+
179+
// When & Then
180+
session.run(statement)
181+
.then(function (result) {
182+
var sum = result.summary;
183+
expect(sum.server).toBeDefined();
184+
expect(sum.server.address).toEqual('localhost:7687');
185+
expect(sum.server.version).toBeDefined();
186+
done();
187+
});
188+
});
189+
167190
it('should expose execution time information when using 3.1 and onwards', function (done) {
168191

169192
//lazy way of checking the version number

test/v1/transaction.test.js

+27-2
Original file line numberDiff line numberDiff line change
@@ -296,8 +296,33 @@ describe('transaction', function() {
296296
});
297297
});
298298

299+
it('should expose server info on successful query', function (done) {
300+
//lazy way of checking the version number
301+
//if server has been set we know it is at least
302+
//3.1 (todo actually parse the version string)
303+
if (!server) {
304+
done();
305+
return;
306+
}
307+
// Given
308+
var statement = 'RETURN 1';
309+
310+
// When & Then
311+
var tx = session.beginTransaction();
312+
tx.run(statement)
313+
.then(function (result) {
314+
var sum = result.summary;
315+
expect(sum.server).toBeDefined();
316+
expect(sum.server.address).toEqual('localhost:7687');
317+
expect(sum.server.version).toBeDefined();
318+
});
319+
tx.commit().then(function() {
320+
done();
321+
})
322+
});
323+
299324
function expectSyntaxError(error) {
300-
const code = error.fields[0].code;
301-
expect(code).toBe('Neo.ClientError.Statement.SyntaxError');
325+
const code = error.fields[0].code;
326+
expect(code).toBe('Neo.ClientError.Statement.SyntaxError');
302327
}
303328
});

0 commit comments

Comments
 (0)