diff --git a/.gitignore b/.gitignore index dab77719f..f96906491 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,4 @@ coverage *.code-workspace /testkit/CAs /testkit/CustomCAs +/.vs diff --git a/packages/bolt-connection/src/connection/connection-channel.js b/packages/bolt-connection/src/connection/connection-channel.js index 390eedb7e..0a885cbe2 100644 --- a/packages/bolt-connection/src/connection/connection-channel.js +++ b/packages/bolt-connection/src/connection/connection-channel.js @@ -172,7 +172,17 @@ export default class ChannelConnection extends Connection { * @return {Promise} promise resolved with the current connection if connection is successful. Rejected promise otherwise. */ connect (userAgent, authToken) { - return this._initialize(userAgent, authToken) + const self = this + // credentialsRefresher is function to refresh credentials + if (authToken && authToken.credentialsRefresher) { + const maybePromise = authToken.credentialsRefresher() + return Promise.resolve(maybePromise).then(function (creds) { + authToken.credentials = creds + return self._initialize(userAgent, authToken) + }) + } + + return self._initialize(userAgent, authToken) } /** diff --git a/packages/bolt-connection/src/packstream/packstream-v1.js b/packages/bolt-connection/src/packstream/packstream-v1.js index b71ef43f0..f039e48e1 100644 --- a/packages/bolt-connection/src/packstream/packstream-v1.js +++ b/packages/bolt-connection/src/packstream/packstream-v1.js @@ -119,14 +119,14 @@ class Packer { let count = 0 for (let i = 0; i < keys.length; i++) { - if (x[keys[i]] !== undefined) { + if (x[keys[i]] !== undefined && keys[i] !== "credentialsRefresher") { count++ } } this.packMapHeader(count) for (let i = 0; i < keys.length; i++) { const key = keys[i] - if (x[key] !== undefined) { + if (x[key] !== undefined && key !== "credentialsRefresher") { this.packString(key) this.packable(x[key], dehydrateStruct)() } diff --git a/packages/bolt-connection/test/packstream/packstream-v1.test.js b/packages/bolt-connection/test/packstream/packstream-v1.test.js index 038c49bbf..652fb9532 100644 --- a/packages/bolt-connection/test/packstream/packstream-v1.test.js +++ b/packages/bolt-connection/test/packstream/packstream-v1.test.js @@ -182,6 +182,13 @@ describe('#unit PackStreamV1', () => { expect(unpacked[0]).toBe(list[0]) expect(unpacked[1]).toBe(list[1]) }) + + it('should pack object with credentialsRefresher function', () => { + const obj = { foo: 'bar', credentialsRefresher: () => 'top-secret-password' } + const unpacked = packAndUnpack(obj) + expect(unpacked.foo).toBe(obj.foo) + expect(unpacked.credentialsRefresher).toBe(undefined) + }) }) function packAndUnpack ( diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index 63140cc16..06aae52ce 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -47,6 +47,7 @@ export interface AuthToken { credentials: string realm?: string parameters?: Parameters + credentialsRefresher?: () => string | Promise } export interface Config { encrypted?: boolean | EncryptionLevel diff --git a/packages/neo4j-driver-deno/lib/core/types.ts b/packages/neo4j-driver-deno/lib/core/types.ts index 63140cc16..06aae52ce 100644 --- a/packages/neo4j-driver-deno/lib/core/types.ts +++ b/packages/neo4j-driver-deno/lib/core/types.ts @@ -47,6 +47,7 @@ export interface AuthToken { credentials: string realm?: string parameters?: Parameters + credentialsRefresher?: () => string | Promise } export interface Config { encrypted?: boolean | EncryptionLevel