From db5c7279f97fad5c48b345669e78ff82e466ed09 Mon Sep 17 00:00:00 2001 From: Oskar Hane Date: Thu, 4 Oct 2018 15:01:52 +0200 Subject: [PATCH 1/7] Update due to driver changes --- package.json | 4 ++-- src/browser/modules/Stream/CypherFrame/AsciiView.test.js | 2 +- src/browser/modules/Stream/CypherFrame/CodeView.test.js | 2 +- src/browser/modules/Stream/CypherFrame/PlanView.test.js | 2 +- src/browser/modules/Stream/CypherFrame/TableView.jsx | 2 +- src/browser/modules/Stream/CypherFrame/TableView.test.js | 2 +- src/browser/modules/Stream/CypherFrame/helpers.js | 7 ++++--- src/browser/modules/Stream/CypherFrame/helpers.test.js | 2 +- src/shared/modules/dbMeta/dbMetaDuck.test.js | 2 +- src/shared/services/bolt/applyGraphTypes.test.js | 2 +- src/shared/services/bolt/bolt.js | 2 +- src/shared/services/bolt/boltConnection.js | 2 +- src/shared/services/bolt/boltMappings.js | 2 +- src/shared/services/bolt/boltMappings.test.js | 2 +- src/shared/services/bolt/cypherTypesFormatting.js | 6 ++++-- webpack.config.js | 3 +-- 16 files changed, 23 insertions(+), 21 deletions(-) diff --git a/package.json b/package.json index 94a1f7ab993..2481201b83d 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "moduleNameMapper": { "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga|html)$": "/__mocks__/fileMock.js", "\\.(css|less)$": "/__mocks__/styleMock.js", - "^neo4j-driver-alias$": "neo4j-driver", + "^neo4j-driver$": "neo4j-driver", "^browser-styles(.*)$": "/src/browser/styles$1", "^browser-components(.*)$": "/src/browser/components$1", "worker-loader": "/__mocks__/workerLoaderMock.js" @@ -148,7 +148,7 @@ "firebase": "^4.3.0", "isomorphic-fetch": "^2.2.1", "jsonic": "^0.3.0", - "neo4j-driver": "^1.6.1", + "neo4j-driver": "^1.7.0-beta02", "react": "^16.4.1", "react-addons-pure-render-mixin": "^15.0.2", "react-dnd": "^2.5.1", diff --git a/src/browser/modules/Stream/CypherFrame/AsciiView.test.js b/src/browser/modules/Stream/CypherFrame/AsciiView.test.js index 6a9a6bcff90..16e9a55b50e 100644 --- a/src/browser/modules/Stream/CypherFrame/AsciiView.test.js +++ b/src/browser/modules/Stream/CypherFrame/AsciiView.test.js @@ -21,7 +21,7 @@ /* global jest, describe, test, expect */ import React from 'react' import { render, cleanup } from 'react-testing-library' -import { v1 as neo4j } from 'neo4j-driver-alias' +import { v1 as neo4j } from 'neo4j-driver' import { AsciiView, AsciiStatusbar } from './AsciiView' diff --git a/src/browser/modules/Stream/CypherFrame/CodeView.test.js b/src/browser/modules/Stream/CypherFrame/CodeView.test.js index ca2f1c78e63..1bc39c2fba2 100644 --- a/src/browser/modules/Stream/CypherFrame/CodeView.test.js +++ b/src/browser/modules/Stream/CypherFrame/CodeView.test.js @@ -21,7 +21,7 @@ /* global describe, test, expect */ import React from 'react' import { render, cleanup } from 'react-testing-library' -import { v1 as neo4j } from 'neo4j-driver-alias' +import { v1 as neo4j } from 'neo4j-driver' import { CodeView, CodeStatusbar } from './CodeView' diff --git a/src/browser/modules/Stream/CypherFrame/PlanView.test.js b/src/browser/modules/Stream/CypherFrame/PlanView.test.js index 8eb55550dcb..4ec4b82f0cc 100644 --- a/src/browser/modules/Stream/CypherFrame/PlanView.test.js +++ b/src/browser/modules/Stream/CypherFrame/PlanView.test.js @@ -21,7 +21,7 @@ /* global jest, describe, test, expect */ import React from 'react' import { render, cleanup } from 'react-testing-library' -import { v1 as neo4j } from 'neo4j-driver-alias' +import { v1 as neo4j } from 'neo4j-driver' import { PlanView, PlanStatusbar } from './PlanView' diff --git a/src/browser/modules/Stream/CypherFrame/TableView.jsx b/src/browser/modules/Stream/CypherFrame/TableView.jsx index 5d6653af27d..94417f3110d 100644 --- a/src/browser/modules/Stream/CypherFrame/TableView.jsx +++ b/src/browser/modules/Stream/CypherFrame/TableView.jsx @@ -20,7 +20,7 @@ import React, { Component } from 'react' import { v4 } from 'uuid' -import { v1 as neo4j } from 'neo4j-driver-alias' +import { v1 as neo4j } from 'neo4j-driver' import { StyledStatsBar, PaddedTableViewDiv, diff --git a/src/browser/modules/Stream/CypherFrame/TableView.test.js b/src/browser/modules/Stream/CypherFrame/TableView.test.js index dd404979b5a..43c53605640 100644 --- a/src/browser/modules/Stream/CypherFrame/TableView.test.js +++ b/src/browser/modules/Stream/CypherFrame/TableView.test.js @@ -22,7 +22,7 @@ import React from 'react' import { render, cleanup } from 'react-testing-library' -import { v1 as neo4j } from 'neo4j-driver-alias' +import { v1 as neo4j } from 'neo4j-driver' import { TableView, TableStatusbar, renderObject } from './TableView' diff --git a/src/browser/modules/Stream/CypherFrame/helpers.js b/src/browser/modules/Stream/CypherFrame/helpers.js index 94bfb765061..bc312d2523a 100644 --- a/src/browser/modules/Stream/CypherFrame/helpers.js +++ b/src/browser/modules/Stream/CypherFrame/helpers.js @@ -19,7 +19,7 @@ */ import bolt from 'services/bolt/bolt' -import { v1 as neo4j } from 'neo4j-driver-alias' +import { v1 as neo4j } from 'neo4j-driver' import * as viewTypes from 'shared/modules/stream/frameViewTypes' import { recursivelyExtractGraphItems, @@ -51,8 +51,9 @@ export function getBodyAndStatusBarMessages (result, maxRows) { let updateMessages = bolt.retrieveFormattedUpdateStatistics(result) let streamMessage = result.records.length > 0 - ? `started streaming ${result.records - .length} records ${resultAvailableAfter} ms and completed ${totalTimeString} ${streamMessageTail}` + ? `started streaming ${ + result.records.length + } records ${resultAvailableAfter} ms and completed ${totalTimeString} ${streamMessageTail}` : `completed ${totalTimeString} ${streamMessageTail}` if (updateMessages && updateMessages.length > 0) { diff --git a/src/browser/modules/Stream/CypherFrame/helpers.test.js b/src/browser/modules/Stream/CypherFrame/helpers.test.js index cfd3c267910..5cc068151e6 100644 --- a/src/browser/modules/Stream/CypherFrame/helpers.test.js +++ b/src/browser/modules/Stream/CypherFrame/helpers.test.js @@ -20,7 +20,7 @@ /* global describe, test, expect */ /* eslint-disable new-cap */ -import { v1 as neo4j } from 'neo4j-driver-alias' +import { v1 as neo4j } from 'neo4j-driver' import * as viewTypes from 'shared/modules/stream/frameViewTypes' import { resultHasNodes, diff --git a/src/shared/modules/dbMeta/dbMetaDuck.test.js b/src/shared/modules/dbMeta/dbMetaDuck.test.js index 9a8a595d883..4eaa1ae37c7 100644 --- a/src/shared/modules/dbMeta/dbMetaDuck.test.js +++ b/src/shared/modules/dbMeta/dbMetaDuck.test.js @@ -19,7 +19,7 @@ */ /* global describe, test, expect */ -import { v1 as neo4j } from 'neo4j-driver-alias' +import { v1 as neo4j } from 'neo4j-driver' import reducer, * as meta from './dbMetaDuck' import { APP_START } from 'shared/modules/app/appDuck' diff --git a/src/shared/services/bolt/applyGraphTypes.test.js b/src/shared/services/bolt/applyGraphTypes.test.js index 6f486c5af69..a7443908b6e 100644 --- a/src/shared/services/bolt/applyGraphTypes.test.js +++ b/src/shared/services/bolt/applyGraphTypes.test.js @@ -19,7 +19,7 @@ */ /* global describe, test, expect */ -import { v1 as neo4j } from 'neo4j-driver-alias' +import { v1 as neo4j } from 'neo4j-driver' import { applyGraphTypes, recursivelyTypeGraphItems, diff --git a/src/shared/services/bolt/bolt.js b/src/shared/services/bolt/bolt.js index dfd82129b5d..f7cea135d70 100644 --- a/src/shared/services/bolt/bolt.js +++ b/src/shared/services/bolt/bolt.js @@ -19,7 +19,7 @@ */ import { v4 } from 'uuid' -import { v1 as neo4j } from 'neo4j-driver-alias' +import { v1 as neo4j } from 'neo4j-driver' import WorkPool from '../WorkPool' import * as mappings from './boltMappings' import * as boltConnection from './boltConnection' diff --git a/src/shared/services/bolt/boltConnection.js b/src/shared/services/bolt/boltConnection.js index 5d1b6b08db3..dd50212d584 100644 --- a/src/shared/services/bolt/boltConnection.js +++ b/src/shared/services/bolt/boltConnection.js @@ -18,7 +18,7 @@ * along with this program. If not, see . */ -import { v1 as neo4j } from 'neo4j-driver-alias' +import { v1 as neo4j } from 'neo4j-driver' import { v4 } from 'uuid' import { BoltConnectionError, createErrorObject } from '../exceptions' import { generateBoltHost } from 'services/utils' diff --git a/src/shared/services/bolt/boltMappings.js b/src/shared/services/bolt/boltMappings.js index bc71bbf191e..0b7424d27ed 100644 --- a/src/shared/services/bolt/boltMappings.js +++ b/src/shared/services/bolt/boltMappings.js @@ -19,7 +19,7 @@ */ import updateStatsFields from './updateStatisticsFields' -import { v1 as neo4j } from 'neo4j-driver-alias' +import { v1 as neo4j } from 'neo4j-driver' import { stringFormat } from 'services/bolt/cypherTypesFormatting' import { safetlyRemoveObjectProp, diff --git a/src/shared/services/bolt/boltMappings.test.js b/src/shared/services/bolt/boltMappings.test.js index b993108e46f..612ba658fc3 100644 --- a/src/shared/services/bolt/boltMappings.test.js +++ b/src/shared/services/bolt/boltMappings.test.js @@ -19,7 +19,7 @@ */ /* global describe, test, expect */ -import { v1 as neo4j } from 'neo4j-driver-alias' +import { v1 as neo4j } from 'neo4j-driver' import { itemIntToString, arrayIntToString, diff --git a/src/shared/services/bolt/cypherTypesFormatting.js b/src/shared/services/bolt/cypherTypesFormatting.js index c61405e7926..f656e7d103f 100644 --- a/src/shared/services/bolt/cypherTypesFormatting.js +++ b/src/shared/services/bolt/cypherTypesFormatting.js @@ -1,4 +1,4 @@ -import { v1 as neo4j } from 'neo4j-driver-alias' +import { v1 as neo4j } from 'neo4j-driver' export const csvFormat = anything => { if (typeof anything === 'number') { @@ -43,7 +43,9 @@ const numberFormat = anything => { } const spacialFormat = anything => { const zString = anything.z ? `, z:${anything.z}` : '' - return `point({srid:${anything.srid}, x:${anything.x}, y:${anything.y}${zString}})` + return `point({srid:${anything.srid}, x:${anything.x}, y:${ + anything.y + }${zString}})` } const isTemporalType = anything => diff --git a/webpack.config.js b/webpack.config.js index 17257828b9c..928f27d5b9a 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -236,7 +236,7 @@ module.exports = { js: ['index.jsx'], vendor: [ 'firebase', - 'neo4j-driver-alias', + 'neo4j-driver', 'rxjs', 'babel-polyfill', 'isomorphic-fetch', @@ -271,7 +271,6 @@ module.exports = { ], modules: [path.resolve(__dirname, 'node_modules'), jsSourcePath], alias: { - 'neo4j-driver-alias': 'neo4j-driver/lib/browser/neo4j-web.min.js', 'src-root': path.resolve(__dirname, 'src'), 'project-root': path.resolve(__dirname), services: path.resolve(__dirname, 'src/shared/services'), From e931dd49f4ee9d42014cf55be061fd5aeee374da Mon Sep 17 00:00:00 2001 From: Oskar Hane Date: Thu, 18 Oct 2018 12:41:58 +0200 Subject: [PATCH 2/7] Add transaction metadata to queries MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is not for all places yet, this is for the recurring background queries + user executed queries. If we pass metadata along to a pre neo4j 3.5.0 server, it returns a error message, that’s why we need to figure out the server version before start sending. --- package.json | 6 +- .../modules/Stream/Queries/QueriesFrame.jsx | 8 ++- .../modules/commands/commandsDuck.test.js | 3 +- src/shared/modules/commands/helpers/cypher.js | 6 +- .../modules/currentUser/currentUserDuck.js | 9 ++- src/shared/modules/dbMeta/dbMetaDuck.js | 55 +++++++++++-------- src/shared/modules/features/featuresDuck.js | 26 ++++++++- src/shared/modules/jmx/jmxDuck.js | 37 +++++++------ src/shared/services/bolt/bolt.js | 18 ++++-- src/shared/services/bolt/boltConnection.js | 32 ++++++----- src/shared/services/bolt/boltWorker.js | 5 +- src/shared/services/bolt/txMetaData.js | 54 ++++++++++++++++++ .../services/commandInterpreterHelper.js | 7 ++- 13 files changed, 194 insertions(+), 72 deletions(-) create mode 100644 src/shared/services/bolt/txMetaData.js diff --git a/package.json b/package.json index 2481201b83d..faafbf09910 100644 --- a/package.json +++ b/package.json @@ -58,10 +58,10 @@ "moduleNameMapper": { "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga|html)$": "/__mocks__/fileMock.js", "\\.(css|less)$": "/__mocks__/styleMock.js", - "^neo4j-driver$": "neo4j-driver", "^browser-styles(.*)$": "/src/browser/styles$1", "^browser-components(.*)$": "/src/browser/components$1", - "worker-loader": "/__mocks__/workerLoaderMock.js" + "worker-loader": "/__mocks__/workerLoaderMock.js", + "project-root(.*)$": "$1" }, "modulePaths": [ "/src", @@ -148,7 +148,7 @@ "firebase": "^4.3.0", "isomorphic-fetch": "^2.2.1", "jsonic": "^0.3.0", - "neo4j-driver": "^1.7.0-beta02", + "neo4j-driver": "^1.7.0-rc2", "react": "^16.4.1", "react-addons-pure-render-mixin": "^15.0.2", "react-dnd": "^2.5.1", diff --git a/src/browser/modules/Stream/Queries/QueriesFrame.jsx b/src/browser/modules/Stream/Queries/QueriesFrame.jsx index df9fea358d0..1e5a024c46e 100644 --- a/src/browser/modules/Stream/Queries/QueriesFrame.jsx +++ b/src/browser/modules/Stream/Queries/QueriesFrame.jsx @@ -209,7 +209,7 @@ export class QueriesFrame extends Component { ['User', '8%'], ['Query', 'auto'], ['Params', '7%'], - ['Meta', '8%'], + ['Meta', 'auto'], ['Elapsed time', '95px'], ['Kill', '95px'] ] @@ -236,7 +236,11 @@ export class QueriesFrame extends Component { {JSON.stringify(query.parameters, null, 2)} - + {JSON.stringify(query.metaData, null, 2)} diff --git a/src/shared/modules/commands/commandsDuck.test.js b/src/shared/modules/commands/commandsDuck.test.js index b4a5a6061d6..eac1476efb7 100644 --- a/src/shared/modules/commands/commandsDuck.test.js +++ b/src/shared/modules/commands/commandsDuck.test.js @@ -72,7 +72,8 @@ describe('commandsDuck', () => { node: { color: '#000' } - } + }, + meta: {} }) }) afterEach(() => { diff --git a/src/shared/modules/commands/helpers/cypher.js b/src/shared/modules/commands/helpers/cypher.js index b4034d37038..46b3f3729dc 100644 --- a/src/shared/modules/commands/helpers/cypher.js +++ b/src/shared/modules/commands/helpers/cypher.js @@ -27,7 +27,8 @@ export const handleCypherCommand = ( action, put, params = {}, - shouldUseCypherThread = false + shouldUseCypherThread = false, + txMetadata = undefined ) => { const paramsToNeo4jType = Object.keys(params).map(k => ({ [k]: applyGraphTypes(params[k]) @@ -38,7 +39,8 @@ export const handleCypherCommand = ( { useCypherThread: shouldUseCypherThread, requestId: action.requestId, - cancelable: true + cancelable: true, + ...txMetadata } ) put(send('cypher', id)) diff --git a/src/shared/modules/currentUser/currentUserDuck.js b/src/shared/modules/currentUser/currentUserDuck.js index 33c164827e6..b124f7be084 100644 --- a/src/shared/modules/currentUser/currentUserDuck.js +++ b/src/shared/modules/currentUser/currentUserDuck.js @@ -26,6 +26,8 @@ import { CONNECTION_SUCCESS, DISCONNECTION_SUCCESS } from 'shared/modules/connections/connectionsDuck' +import { getBackgroundTxMetadata } from 'shared/services/bolt/txMetadata' +import { canSendTxMetadata } from '../features/featuresDuck' export const NAME = 'user' export const UPDATE_CURRENT_USER = NAME + '/UPDATE_CURRENT_USER' @@ -89,7 +91,12 @@ export const getCurrentUserEpic = (some$, store) => bolt.directTransaction( 'CALL dbms.security.showCurrentUser()', {}, - { useCypherThread: shouldUseCypherThread(store.getState()) } + { + useCypherThread: shouldUseCypherThread(store.getState()), + ...getBackgroundTxMetadata({ + hasServerSupport: canSendTxMetadata(store.getState()) + }) + } ) ) .catch(() => Rx.Observable.of(null)) diff --git a/src/shared/modules/dbMeta/dbMetaDuck.js b/src/shared/modules/dbMeta/dbMetaDuck.js index 79390d80ca1..5fb708c5e67 100644 --- a/src/shared/modules/dbMeta/dbMetaDuck.js +++ b/src/shared/modules/dbMeta/dbMetaDuck.js @@ -35,6 +35,8 @@ import { onLostConnection } from 'shared/modules/connections/connectionsDuck' import { shouldUseCypherThread } from 'shared/modules/settings/settingsDuck' +import { getBackgroundTxMetadata } from 'shared/services/bolt/txMetadata' +import { canSendTxMetadata } from '../features/featuresDuck' export const NAME = 'meta' export const UPDATE = 'meta/UPDATE' @@ -65,7 +67,8 @@ export function getMetaInContext (state, context) { } } -export const getVersion = state => state[NAME].server.version +export const getVersion = state => + (state[NAME] || {}).server ? (state[NAME] || {}).server.version : 0 export const getEdition = state => state[NAME].server.edition export const getDbName = state => state[NAME].server.dbName export const getStoreSize = state => state[NAME].server.storeSize @@ -285,37 +288,45 @@ export const dbMetaEpic = (some$, store) => .merge(some$.ofType(CONNECTION_SUCCESS)) .mergeMap(() => { return ( - Rx.Observable - .timer(1, 20000) + Rx.Observable.timer(1, 20000) .merge(some$.ofType(FORCE_FETCH)) // Labels, types and propertyKeys .mergeMap(() => - Rx.Observable - .fromPromise( - bolt.routedReadTransaction( - metaQuery, - {}, - { - useCypherThread: shouldUseCypherThread(store.getState()), - onLostConnection: onLostConnection(store.dispatch) - } - ) + Rx.Observable.fromPromise( + bolt.routedReadTransaction( + metaQuery, + {}, + { + useCypherThread: shouldUseCypherThread(store.getState()), + onLostConnection: onLostConnection(store.dispatch), + ...getBackgroundTxMetadata({ + hasServerSupport: canSendTxMetadata(store.getState()) + }) + } ) - .catch(e => Rx.Observable.of(null)) + ).catch(e => { + return Rx.Observable.of(null) + }) ) .filter(r => r) .do(res => store.dispatch(updateMeta(res))) // Cluster role .mergeMap(() => - Rx.Observable - .fromPromise( - bolt.directTransaction( - 'CALL dbms.cluster.role() YIELD role', - {}, - { useCypherThread: shouldUseCypherThread(store.getState()) } - ) + Rx.Observable.fromPromise( + bolt.directTransaction( + 'CALL dbms.cluster.role() YIELD role', + {}, + { + useCypherThread: shouldUseCypherThread(store.getState()), + ...getBackgroundTxMetadata({ + hasServerSupport: canSendTxMetadata(store.getState()) + }) + } ) - .catch(e => Rx.Observable.of(null)) + ) + .catch(e => { + return Rx.Observable.of(null) + }) .do(res => { if (!res) return Rx.Observable.of(null) const role = res.records[0].get(0) diff --git a/src/shared/modules/features/featuresDuck.js b/src/shared/modules/features/featuresDuck.js index eb42e2821aa..2ee2e40fc23 100644 --- a/src/shared/modules/features/featuresDuck.js +++ b/src/shared/modules/features/featuresDuck.js @@ -18,14 +18,19 @@ * along with this program. If not, see . */ +import semver from 'semver' +import Rx from 'rxjs/Rx' import bolt from 'services/bolt/bolt' import { APP_START, WEB } from 'shared/modules/app/appDuck' import { CONNECTION_SUCCESS } from 'shared/modules/connections/connectionsDuck' import { shouldUseCypherThread } from 'shared/modules/settings/settingsDuck' +import { getBackgroundTxMetadata } from 'shared/services/bolt/txMetadata' +import { getVersion } from '../dbMeta/dbMetaDuck' export const NAME = 'features' export const RESET = 'features/RESET' export const UPDATE_ALL_FEATURES = 'features/UPDATE_ALL_FEATURES' +const NEO4J_TX_METADATA_VERSION = '3.5.0-alpha01' export const getAvailableProcedures = state => state[NAME].availableProcedures export const isACausalCluster = state => @@ -33,6 +38,16 @@ export const isACausalCluster = state => export const canAssignRolesToUser = state => getAvailableProcedures(state).includes('dbms.security.addRoleToUser') export const useBrowserSync = state => !!state[NAME].browserSync +export const canSendTxMetadata = state => { + const serverVersion = getVersion(state) + if (!serverVersion) { + return false + } + if (semver.gt(serverVersion, NEO4J_TX_METADATA_VERSION)) { + return true + } + return false +} const initialState = { availableProcedures: [], @@ -70,16 +85,21 @@ export const featuresDiscoveryEpic = (action$, store) => { .routedReadTransaction( 'CALL dbms.procedures YIELD name', {}, - { useCypherThread: shouldUseCypherThread(store.getState()) } + { + useCypherThread: shouldUseCypherThread(store.getState()), + ...getBackgroundTxMetadata({ + hasServerSupport: canSendTxMetadata(store.getState()) + }) + } ) .then(res => { store.dispatch( updateFeatures(res.records.map(record => record.get('name'))) ) - return null + return Rx.Observable.of(null) }) .catch(e => { - return null + return Rx.Observable.of(null) }) }) .mapTo({ type: 'NOOP' }) diff --git a/src/shared/modules/jmx/jmxDuck.js b/src/shared/modules/jmx/jmxDuck.js index 6aacb71215a..6d3e4ef7893 100644 --- a/src/shared/modules/jmx/jmxDuck.js +++ b/src/shared/modules/jmx/jmxDuck.js @@ -31,7 +31,9 @@ import { connectionLossFilter } from 'shared/modules/connections/connectionsDuck' import { FORCE_FETCH } from 'shared/modules/dbMeta/dbMetaDuck' +import { canSendTxMetadata } from 'shared/modules/features/featuresDuck' import { shouldUseCypherThread } from 'shared/modules/settings/settingsDuck' +import { getBackgroundTxMetadata } from 'shared/services/bolt/txMetadata' export const NAME = 'jmx' export const UPDATE = NAME + '/UPDATE' @@ -64,7 +66,12 @@ const fetchJmxValues = store => { .directTransaction( 'CALL dbms.queryJmx("org.neo4j:*")', {}, - { useCypherThread: shouldUseCypherThread(store.getState()) } + { + useCypherThread: shouldUseCypherThread(store.getState()), + ...getBackgroundTxMetadata({ + hasServerSupport: canSendTxMetadata(store.getState()) + }) + } ) .then(res => { const converters = { @@ -72,19 +79,18 @@ const fetchJmxValues = store => { intConverter: val => val.toString(), objectConverter: extractFromNeoObjects } - return toObjects( - res.records, - converters - ).map(([name, description, attributes]) => { - return { - name, - description, - attributes + return toObjects(res.records, converters).map( + ([name, description, attributes]) => { + return { + name, + description, + attributes + } } - }) + ) }) .catch(e => { - return null + return Rx.Observable.of(null) }) } @@ -120,13 +126,12 @@ export const jmxEpic = (some$, store) => .filter(s => s.state === CONNECTED_STATE) .merge(some$.ofType(CONNECTION_SUCCESS)) .mergeMap(() => { - return Rx.Observable - .timer(0, 20000) + return Rx.Observable.timer(0, 20000) .merge(some$.ofType(FORCE_FETCH)) .mergeMap(() => - Rx.Observable - .fromPromise(fetchJmxValues(store)) - .catch(e => Rx.Observable.of(null)) + Rx.Observable.fromPromise(fetchJmxValues(store)).catch(e => + Rx.Observable.of(null) + ) ) .filter(r => r) .do(res => store.dispatch(updateJmxValues(res))) diff --git a/src/shared/services/bolt/bolt.js b/src/shared/services/bolt/bolt.js index f7cea135d70..90f820890a2 100644 --- a/src/shared/services/bolt/bolt.js +++ b/src/shared/services/bolt/bolt.js @@ -74,7 +74,8 @@ function routedWriteTransaction (input, parameters, requestMetaData = {}) { useCypherThread = false, requestId = null, cancelable = false, - onLostConnection = () => {} + onLostConnection = () => {}, + txMetadata = undefined } = requestMetaData if (useCypherThread && window.Worker) { const id = requestId || v4() @@ -90,7 +91,8 @@ function routedWriteTransaction (input, parameters, requestMetaData = {}) { generateBoltHost( connectionProperties ? connectionProperties.host : '' ) - ) + ), + txMetadata } ) const workerPromise = setupBoltWorker(id, workFn, onLostConnection) @@ -110,7 +112,8 @@ function routedReadTransaction (input, parameters, requestMetaData = {}) { useCypherThread = false, requestId = null, cancelable = false, - onLostConnection = () => {} + onLostConnection = () => {}, + txMetadata = undefined } = requestMetaData if (useCypherThread && window.Worker) { const id = requestId || v4() @@ -126,7 +129,8 @@ function routedReadTransaction (input, parameters, requestMetaData = {}) { generateBoltHost( connectionProperties ? connectionProperties.host : '' ) - ) + ), + txMetadata } ) const workerPromise = setupBoltWorker(id, workFn, onLostConnection) @@ -146,7 +150,8 @@ function directTransaction (input, parameters, requestMetaData = {}) { useCypherThread = false, requestId = null, cancelable = false, - onLostConnection = () => {} + onLostConnection = () => {}, + txMetadata = undefined } = requestMetaData if (useCypherThread && window.Worker) { const id = requestId || v4() @@ -162,7 +167,8 @@ function directTransaction (input, parameters, requestMetaData = {}) { generateBoltHost( connectionProperties ? connectionProperties.host : '' ) - ) + ), + txMetadata } ) const workerPromise = setupBoltWorker(id, workFn, onLostConnection) diff --git a/src/shared/services/bolt/boltConnection.js b/src/shared/services/bolt/boltConnection.js index dd50212d584..5f0992f7614 100644 --- a/src/shared/services/bolt/boltConnection.js +++ b/src/shared/services/bolt/boltConnection.js @@ -178,7 +178,8 @@ function _trackedTransaction ( input, parameters = {}, session, - requestId = null + requestId = null, + txMetadata = undefined ) { const id = requestId || v4() if (!session) { @@ -190,8 +191,9 @@ function _trackedTransaction ( } runningQueryRegister[id] = closeFn + const metadata = txMetadata ? { metadata: txMetadata } : undefined const queryPromise = session - .run(input, parameters) + .run(input, parameters, metadata) .then(r => { closeFn() return r @@ -204,10 +206,11 @@ function _trackedTransaction ( return [id, queryPromise] } -function _transaction (input, parameters, session) { +function _transaction (input, parameters, session, txMetadata = undefined) { if (!session) return Promise.reject(createErrorObject(BoltConnectionError)) + const metadata = txMetadata ? { metadata: txMetadata } : undefined return session - .run(input, parameters) + .run(input, parameters, metadata) .then(r => { session.close() return r @@ -228,37 +231,40 @@ export function directTransaction ( input, parameters, requestId = null, - cancelable = false + cancelable = false, + txMetadata = undefined ) { const session = _drivers ? _drivers.getDirectDriver().session() : false - if (!cancelable) return _transaction(input, parameters, session) - return _trackedTransaction(input, parameters, session, requestId) + if (!cancelable) return _transaction(input, parameters, session, txMetadata) + return _trackedTransaction(input, parameters, session, requestId, txMetadata) } export function routedReadTransaction ( input, parameters, requestId = null, - cancelable = false + cancelable = false, + txMetadata = undefined ) { const session = _drivers ? _drivers.getRoutedDriver().session(neo4j.session.READ) : false - if (!cancelable) return _transaction(input, parameters, session) - return _trackedTransaction(input, parameters, session, requestId) + if (!cancelable) return _transaction(input, parameters, session, txMetadata) + return _trackedTransaction(input, parameters, session, requestId, txMetadata) } export function routedWriteTransaction ( input, parameters, requestId = null, - cancelable = false + cancelable = false, + txMetadata = undefined ) { const session = _drivers ? _drivers.getRoutedDriver().session(neo4j.session.WRITE) : false - if (!cancelable) return _transaction(input, parameters, session) - return _trackedTransaction(input, parameters, session, requestId) + if (!cancelable) return _transaction(input, parameters, session, txMetadata) + return _trackedTransaction(input, parameters, session, requestId, txMetadata) } export const closeConnection = () => { diff --git a/src/shared/services/bolt/boltWorker.js b/src/shared/services/bolt/boltWorker.js index d30298407f7..f6303ec464b 100644 --- a/src/shared/services/bolt/boltWorker.js +++ b/src/shared/services/bolt/boltWorker.js @@ -65,7 +65,7 @@ const onmessage = function (message) { cancelable, connectionProperties } = message.data - + const { txMetadata } = connectionProperties ensureConnection(connectionProperties, connectionProperties.opts, e => { self.postMessage( boltConnectionErrorMessage(createErrorObject(BoltConnectionError)) @@ -76,7 +76,8 @@ const onmessage = function (message) { input, applyGraphTypes(parameters), requestId, - cancelable + cancelable, + txMetadata ) connectionTypeMap[connectionType] .getPromise(res) diff --git a/src/shared/services/bolt/txMetaData.js b/src/shared/services/bolt/txMetaData.js new file mode 100644 index 00000000000..be90268bf80 --- /dev/null +++ b/src/shared/services/bolt/txMetaData.js @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2002-2018 "Neo4j, Inc" + * Network Engine for Objects in Lund AB [http://neotechnology.com] + * + * This file is part of Neo4j. + * + * Neo4j is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +import { version } from 'project-root/package.json' + +let counter = 0 + +// Application info +const NEO4J_BROWSER_BACKGROUND_QUERY = `NEO4J_BROWSER_BACKGROUND_QUERY` +const NEO4J_BROWSER_USER_QUERY = `NEO4J_BROWSER_USER_QUERY` +const NEO4J_BROWSER_APP_ID = `NEO4J_BROWSER_V${version}` + +export const getBackgroundTxMetadata = ({ hasServerSupport = false }) => { + if (!hasServerSupport) { + return {} + } + return { + txMetadata: { + type: NEO4J_BROWSER_BACKGROUND_QUERY, + application: NEO4J_BROWSER_APP_ID, + query_number: ++counter + } + } +} + +export const getUserTxMetadata = ({ hasServerSupport = false }) => { + if (!hasServerSupport) { + return {} + } + return { + txMetadata: { + type: NEO4J_BROWSER_USER_QUERY, + application: NEO4J_BROWSER_APP_ID, + query_number: ++counter + } + } +} diff --git a/src/shared/services/commandInterpreterHelper.js b/src/shared/services/commandInterpreterHelper.js index 2d54690bef9..e18720b9d2a 100644 --- a/src/shared/services/commandInterpreterHelper.js +++ b/src/shared/services/commandInterpreterHelper.js @@ -29,6 +29,7 @@ import { getGraphStyleData } from 'shared/modules/grass/grassDuck' import { getRemoteContentHostnameWhitelist } from 'shared/modules/dbMeta/dbMetaDuck' +import { canSendTxMetadata } from 'shared/modules/features/featuresDuck' import { fetchRemoteGuide } from 'shared/modules/commands/helpers/play' import remote from 'services/remote' import { isLocalRequest, authHeaderFromCredentials } from 'services/remoteUtils' @@ -58,6 +59,7 @@ import { import { fetchRemoteGrass } from 'shared/modules/commands/helpers/grass' import { parseGrass } from 'shared/services/grassUtils' import { shouldUseCypherThread } from 'shared/modules/settings/settingsDuck' +import { getUserTxMetadata } from './bolt/txMetadata' const availableCommands = [ { @@ -151,7 +153,10 @@ const availableCommands = [ action, put, getParams(state), - shouldUseCypherThread(state) + shouldUseCypherThread(state), + getUserTxMetadata({ + hasServerSupport: canSendTxMetadata(store.getState()) + }) ) put(cypher(action.cmd)) put(frames.add({ ...action, type: 'cypher', requestId: id })) From 8bcc10be3a21f9541f5042c3b154d3d8590e611e Mon Sep 17 00:00:00 2001 From: Oskar Hane Date: Thu, 18 Oct 2018 12:50:48 +0200 Subject: [PATCH 3/7] Fix conflicts --- yarn.lock | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/yarn.lock b/yarn.lock index 7f9a56c7fa8..49a89982364 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6771,12 +6771,13 @@ neo-async@^2.5.0: resolved "https://neo.jfrog.io/neo/api/npm/npm/neo-async/-/neo-async-2.5.2.tgz#489105ce7bc54e709d736b195f82135048c50fcc" integrity sha1-SJEFznvFTnCdc2sZX4ITUEjFD8w= -neo4j-driver@^1.6.1: - version "1.6.3" - resolved "https://neo.jfrog.io/neo/api/npm/npm/neo4j-driver/-/neo4j-driver-1.6.3.tgz#b7a51bac401bd341082dff7766e8643d61752eb7" - integrity sha1-t6UbrEAb00EILf93ZuhkPWF1Lrc= +neo4j-driver@^1.7.0-rc2: + version "1.7.0-rc2" + resolved "https://neo.jfrog.io/neo/api/npm/npm/neo4j-driver/-/neo4j-driver-1.7.0-rc2.tgz#642b980bacca1e80d99cd54cba4841477511fa92" + integrity sha1-ZCuYC6zKHoDZnNVMukhBR3UR+pI= dependencies: - babel-runtime "^6.18.0" + babel-runtime "^6.26.0" + text-encoding "^0.6.4" uri-js "^4.2.1" next-tick@1: @@ -10152,6 +10153,11 @@ test-exclude@^4.2.1: read-pkg-up "^1.0.1" require-main-filename "^1.0.1" +text-encoding@^0.6.4: + version "0.6.4" + resolved "https://neo.jfrog.io/neo/api/npm/npm/text-encoding/-/text-encoding-0.6.4.tgz#e399a982257a276dae428bb92845cb71bdc26d19" + integrity sha1-45mpgiV6J22uQou5KEXLcb3CbRk= + text-table@~0.2.0: version "0.2.0" resolved "https://neo.jfrog.io/neo/api/npm/npm/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" From f4d860d188a6deb6654ed447da8cd9a9b9a369dc Mon Sep 17 00:00:00 2001 From: Oskar Hane Date: Thu, 18 Oct 2018 12:58:24 +0200 Subject: [PATCH 4/7] Fix build errors --- src/shared/services/bolt/txMetadata.js | 54 +++++++++++++++++++ .../services/commandInterpreterHelper.js | 2 +- 2 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 src/shared/services/bolt/txMetadata.js diff --git a/src/shared/services/bolt/txMetadata.js b/src/shared/services/bolt/txMetadata.js new file mode 100644 index 00000000000..be90268bf80 --- /dev/null +++ b/src/shared/services/bolt/txMetadata.js @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2002-2018 "Neo4j, Inc" + * Network Engine for Objects in Lund AB [http://neotechnology.com] + * + * This file is part of Neo4j. + * + * Neo4j is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +import { version } from 'project-root/package.json' + +let counter = 0 + +// Application info +const NEO4J_BROWSER_BACKGROUND_QUERY = `NEO4J_BROWSER_BACKGROUND_QUERY` +const NEO4J_BROWSER_USER_QUERY = `NEO4J_BROWSER_USER_QUERY` +const NEO4J_BROWSER_APP_ID = `NEO4J_BROWSER_V${version}` + +export const getBackgroundTxMetadata = ({ hasServerSupport = false }) => { + if (!hasServerSupport) { + return {} + } + return { + txMetadata: { + type: NEO4J_BROWSER_BACKGROUND_QUERY, + application: NEO4J_BROWSER_APP_ID, + query_number: ++counter + } + } +} + +export const getUserTxMetadata = ({ hasServerSupport = false }) => { + if (!hasServerSupport) { + return {} + } + return { + txMetadata: { + type: NEO4J_BROWSER_USER_QUERY, + application: NEO4J_BROWSER_APP_ID, + query_number: ++counter + } + } +} diff --git a/src/shared/services/commandInterpreterHelper.js b/src/shared/services/commandInterpreterHelper.js index e18720b9d2a..dd9d71fbc95 100644 --- a/src/shared/services/commandInterpreterHelper.js +++ b/src/shared/services/commandInterpreterHelper.js @@ -59,7 +59,7 @@ import { import { fetchRemoteGrass } from 'shared/modules/commands/helpers/grass' import { parseGrass } from 'shared/services/grassUtils' import { shouldUseCypherThread } from 'shared/modules/settings/settingsDuck' -import { getUserTxMetadata } from './bolt/txMetadata' +import { getUserTxMetadata } from 'shared/services/bolt/txMetadata' const availableCommands = [ { From 079242a7ca6abea08fac39e1052e2be6b897febe Mon Sep 17 00:00:00 2001 From: Oskar Hane Date: Thu, 18 Oct 2018 13:14:42 +0200 Subject: [PATCH 5/7] Wow, what a mess --- src/shared/services/bolt/txMetaData.js | 54 -------------------------- src/shared/services/bolt/txMetadata.js | 54 -------------------------- 2 files changed, 108 deletions(-) delete mode 100644 src/shared/services/bolt/txMetaData.js delete mode 100644 src/shared/services/bolt/txMetadata.js diff --git a/src/shared/services/bolt/txMetaData.js b/src/shared/services/bolt/txMetaData.js deleted file mode 100644 index be90268bf80..00000000000 --- a/src/shared/services/bolt/txMetaData.js +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (c) 2002-2018 "Neo4j, Inc" - * Network Engine for Objects in Lund AB [http://neotechnology.com] - * - * This file is part of Neo4j. - * - * Neo4j is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import { version } from 'project-root/package.json' - -let counter = 0 - -// Application info -const NEO4J_BROWSER_BACKGROUND_QUERY = `NEO4J_BROWSER_BACKGROUND_QUERY` -const NEO4J_BROWSER_USER_QUERY = `NEO4J_BROWSER_USER_QUERY` -const NEO4J_BROWSER_APP_ID = `NEO4J_BROWSER_V${version}` - -export const getBackgroundTxMetadata = ({ hasServerSupport = false }) => { - if (!hasServerSupport) { - return {} - } - return { - txMetadata: { - type: NEO4J_BROWSER_BACKGROUND_QUERY, - application: NEO4J_BROWSER_APP_ID, - query_number: ++counter - } - } -} - -export const getUserTxMetadata = ({ hasServerSupport = false }) => { - if (!hasServerSupport) { - return {} - } - return { - txMetadata: { - type: NEO4J_BROWSER_USER_QUERY, - application: NEO4J_BROWSER_APP_ID, - query_number: ++counter - } - } -} diff --git a/src/shared/services/bolt/txMetadata.js b/src/shared/services/bolt/txMetadata.js deleted file mode 100644 index be90268bf80..00000000000 --- a/src/shared/services/bolt/txMetadata.js +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (c) 2002-2018 "Neo4j, Inc" - * Network Engine for Objects in Lund AB [http://neotechnology.com] - * - * This file is part of Neo4j. - * - * Neo4j is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import { version } from 'project-root/package.json' - -let counter = 0 - -// Application info -const NEO4J_BROWSER_BACKGROUND_QUERY = `NEO4J_BROWSER_BACKGROUND_QUERY` -const NEO4J_BROWSER_USER_QUERY = `NEO4J_BROWSER_USER_QUERY` -const NEO4J_BROWSER_APP_ID = `NEO4J_BROWSER_V${version}` - -export const getBackgroundTxMetadata = ({ hasServerSupport = false }) => { - if (!hasServerSupport) { - return {} - } - return { - txMetadata: { - type: NEO4J_BROWSER_BACKGROUND_QUERY, - application: NEO4J_BROWSER_APP_ID, - query_number: ++counter - } - } -} - -export const getUserTxMetadata = ({ hasServerSupport = false }) => { - if (!hasServerSupport) { - return {} - } - return { - txMetadata: { - type: NEO4J_BROWSER_USER_QUERY, - application: NEO4J_BROWSER_APP_ID, - query_number: ++counter - } - } -} From 6807025deae91faab7ecc1a08486c3c1c84657a3 Mon Sep 17 00:00:00 2001 From: Oskar Hane Date: Thu, 18 Oct 2018 13:15:20 +0200 Subject: [PATCH 6/7] Try again. --- jsconfig.json | 5 +-- src/shared/services/bolt/txMetadata.js | 54 ++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 4 deletions(-) create mode 100644 src/shared/services/bolt/txMetadata.js diff --git a/jsconfig.json b/jsconfig.json index 367d7b81f27..0cf6e64d601 100644 --- a/jsconfig.json +++ b/jsconfig.json @@ -1,14 +1,11 @@ { - "include": [ - "src/**/*" - ], + "include": ["src/**/*"], "compilerOptions": { "target": "ES6", "allowSyntheticDefaultImports": true, "baseUrl": "src/", "checkJs": false, "paths": { - "src-root/*": ["*"], "services/*": ["shared/services/*"], "browser-services/*": ["browser/services/*"], "shared/*": ["shared/*"], diff --git a/src/shared/services/bolt/txMetadata.js b/src/shared/services/bolt/txMetadata.js new file mode 100644 index 00000000000..be90268bf80 --- /dev/null +++ b/src/shared/services/bolt/txMetadata.js @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2002-2018 "Neo4j, Inc" + * Network Engine for Objects in Lund AB [http://neotechnology.com] + * + * This file is part of Neo4j. + * + * Neo4j is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +import { version } from 'project-root/package.json' + +let counter = 0 + +// Application info +const NEO4J_BROWSER_BACKGROUND_QUERY = `NEO4J_BROWSER_BACKGROUND_QUERY` +const NEO4J_BROWSER_USER_QUERY = `NEO4J_BROWSER_USER_QUERY` +const NEO4J_BROWSER_APP_ID = `NEO4J_BROWSER_V${version}` + +export const getBackgroundTxMetadata = ({ hasServerSupport = false }) => { + if (!hasServerSupport) { + return {} + } + return { + txMetadata: { + type: NEO4J_BROWSER_BACKGROUND_QUERY, + application: NEO4J_BROWSER_APP_ID, + query_number: ++counter + } + } +} + +export const getUserTxMetadata = ({ hasServerSupport = false }) => { + if (!hasServerSupport) { + return {} + } + return { + txMetadata: { + type: NEO4J_BROWSER_USER_QUERY, + application: NEO4J_BROWSER_APP_ID, + query_number: ++counter + } + } +} From 9fa87ea56f029b0a97a92c296d319ca9ac8d1b9a Mon Sep 17 00:00:00 2001 From: Oskar Hane Date: Fri, 19 Oct 2018 11:09:06 +0200 Subject: [PATCH 7/7] Use 1.7.0 GA driver --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index faafbf09910..bfbe7364a51 100644 --- a/package.json +++ b/package.json @@ -148,7 +148,7 @@ "firebase": "^4.3.0", "isomorphic-fetch": "^2.2.1", "jsonic": "^0.3.0", - "neo4j-driver": "^1.7.0-rc2", + "neo4j-driver": "^1.7.0", "react": "^16.4.1", "react-addons-pure-render-mixin": "^15.0.2", "react-dnd": "^2.5.1", diff --git a/yarn.lock b/yarn.lock index 49a89982364..46cedd5f017 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6771,10 +6771,10 @@ neo-async@^2.5.0: resolved "https://neo.jfrog.io/neo/api/npm/npm/neo-async/-/neo-async-2.5.2.tgz#489105ce7bc54e709d736b195f82135048c50fcc" integrity sha1-SJEFznvFTnCdc2sZX4ITUEjFD8w= -neo4j-driver@^1.7.0-rc2: - version "1.7.0-rc2" - resolved "https://neo.jfrog.io/neo/api/npm/npm/neo4j-driver/-/neo4j-driver-1.7.0-rc2.tgz#642b980bacca1e80d99cd54cba4841477511fa92" - integrity sha1-ZCuYC6zKHoDZnNVMukhBR3UR+pI= +neo4j-driver@^1.7.0: + version "1.7.0" + resolved "https://neo.jfrog.io/neo/api/npm/npm/neo4j-driver/-/neo4j-driver-1.7.0.tgz#38ea2be2fe43b9a2edc63bdfd500d062f053be99" + integrity sha1-OOor4v5DuaLtxjvf1QDQYvBTvpk= dependencies: babel-runtime "^6.26.0" text-encoding "^0.6.4"