Skip to content

Commit a9bdaad

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 29b983a commit a9bdaad

File tree

7 files changed

+93
-7
lines changed

7 files changed

+93
-7
lines changed

src/v1/driver.js

Lines changed: 6 additions & 2 deletions
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

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,7 @@ class Connection {
196196
* to the next pending observer.
197197
*/
198198
this.url = url;
199+
this.server = {address: url};
199200
this._pendingObservers = [];
200201
this._currentObserver = undefined;
201202
this._ch = channel;
@@ -456,6 +457,10 @@ class Connection {
456457
_packable(value) {
457458
return this._packer.packable(value, (err) => this._handleFatalError(err));
458459
}
460+
461+
setServerVersion(version) {
462+
this.server.version = version;
463+
}
459464
}
460465

461466
/**
@@ -467,16 +472,20 @@ class Connection {
467472
*/
468473
function connect( url, config = {}) {
469474
let Ch = config.channel || Channel;
475+
const host = parseHost(url);
476+
const port = parsePort(url) || 7687;
477+
const completeUrl = host + ':' + port;
478+
470479
return new Connection( new Ch({
471-
host: parseHost(url),
472-
port: parsePort(url) || 7687,
480+
host: host,
481+
port: port,
473482
// Default to using ENCRYPTION_NON_LOCAL if trust-on-first-use is available
474483
encrypted : shouldEncrypt(config.encrypted, (hasFeature("trust_on_first_use") ? ENCRYPTION_NON_LOCAL : ENCRYPTION_OFF), parseHost(url)),
475484
// Default to using TRUST_ON_FIRST_USE if it is available
476485
trust : config.trust || (hasFeature("trust_on_first_use") ? "TRUST_ON_FIRST_USE" : "TRUST_CUSTOM_CA_SIGNED_CERTIFICATES"),
477486
trustedCertificates : config.trustedCertificates || [],
478487
knownHosts : config.knownHosts
479-
}), url);
488+
}), completeUrl);
480489
}
481490

482491
export {

src/v1/result-summary.js

Lines changed: 19 additions & 0 deletions
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

Lines changed: 2 additions & 1 deletion
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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,11 @@ class _TransactionStreamObserver extends StreamObserver {
128128
this._tx._onBookmark(bookmark);
129129
}
130130
}
131+
132+
serverMeta() {
133+
const serverMeta = {server: this._conn.server};
134+
return serverMeta;
135+
}
131136
}
132137

133138
/** internal state machine of the transaction*/
@@ -149,7 +154,7 @@ let _states = {
149154
conn.sync();
150155
}).catch(observer.onError);
151156

152-
return new Result( observer, statement, parameters );
157+
return new Result( observer, statement, parameters, () => observer.serverMeta() );
153158
}
154159
},
155160

test/v1/session.test.js

Lines changed: 23 additions & 0 deletions
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

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,4 +236,29 @@ describe('transaction', function() {
236236
done();
237237
});
238238
});
239+
240+
it('should expose server info on successful query', function (done) {
241+
//lazy way of checking the version number
242+
//if server has been set we know it is at least
243+
//3.1 (todo actually parse the version string)
244+
if (!server) {
245+
done();
246+
return;
247+
}
248+
// Given
249+
var statement = 'RETURN 1';
250+
251+
// When & Then
252+
var tx = session.beginTransaction();
253+
tx.run(statement)
254+
.then(function (result) {
255+
var sum = result.summary;
256+
expect(sum.server).toBeDefined();
257+
expect(sum.server.address).toEqual('localhost:7687');
258+
expect(sum.server.version).toBeDefined();
259+
});
260+
tx.commit().then(function() {
261+
done();
262+
})
263+
});
239264
});

0 commit comments

Comments
 (0)