You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by sp...@apache.org on 2020/04/15 11:44:00 UTC

[tinkerpop] 01/03: gremlin-javascript: remove session close method

This is an automated email from the ASF dual-hosted git repository.

spmallette pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git

commit a9c02e4259e01847e56a24fe4a9ff93da8ab3fe5
Author: Liu Jianping <he...@foxmail.com>
AuthorDate: Thu Apr 2 17:23:34 2020 +0800

    gremlin-javascript: remove session close method
    
    Attach session mode check in 'client', remove addition logic for session
    
    gremlin-javascript: update session docs
    
    Revert "gremlin-javascript: remove session close method"
    
    This reverts commit 6e20698fbb9c60cc8672b7ab613ab855f8748e06.
    
    gremlin-javascript: make session close request as specification
    
    session is one mode of client, attach 'session' logic to client
    
    test case: fixup gremlin server port
---
 docs/src/reference/gremlin-variants.asciidoc       |  2 +-
 docs/src/upgrade/release-3.3.x.asciidoc            |  2 +-
 .../gremlin-javascript/lib/driver/client.js        | 20 +++++++++++++++++++-
 .../gremlin-javascript/lib/driver/connection.js    | 22 ----------------------
 .../javascript/gremlin-javascript/test/helper.js   |  4 ++--
 5 files changed, 23 insertions(+), 27 deletions(-)

diff --git a/docs/src/reference/gremlin-variants.asciidoc b/docs/src/reference/gremlin-variants.asciidoc
index 780d69e..0aea657 100644
--- a/docs/src/reference/gremlin-variants.asciidoc
+++ b/docs/src/reference/gremlin-variants.asciidoc
@@ -644,7 +644,7 @@ It is also possible to initialize the `Client` to use <<sessions,sessions>>:
 
 [source,javascript]
 ----
-const client = new gremlin.driver.Client('ws://localhost:8182/gremlin', { traversalSource: 'g', 'processor': 'session' });
+const client = new gremlin.driver.Client('ws://localhost:8182/gremlin', { traversalSource: 'g', 'session': 'unique-string-id' });
 ----
 
 With this configuration, the state of variables within scripts are preserved between requests.
diff --git a/docs/src/upgrade/release-3.3.x.asciidoc b/docs/src/upgrade/release-3.3.x.asciidoc
index 2861177..0e9549c 100644
--- a/docs/src/upgrade/release-3.3.x.asciidoc
+++ b/docs/src/upgrade/release-3.3.x.asciidoc
@@ -43,7 +43,7 @@ and exposed on the server. As such, providing support in all Gremlin Language Va
 ensuring a consistent implementation for all programming languages.
 
 [source,javascript]
-const client = new gremlin.driver.Client('ws://localhost:8182/gremlin', { traversalSource: 'g', 'processor': 'session' });
+const client = new gremlin.driver.Client('ws://localhost:8182/gremlin', { traversalSource: 'g', 'session': 'unique-string-id' });
 ==== Deprecate maxWaitForSessionClose
 
 The `maxWaitForSessionClose` setting for the Java driver has been deprecated and in some sense replaced by the
diff --git a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/driver/client.js b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/driver/client.js
index 91abf47..519ccb4 100644
--- a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/driver/client.js
+++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/driver/client.js
@@ -18,6 +18,7 @@
  */
 'use strict';
 
+const utils = require('../utils');
 const Connection = require('./connection');
 const Bytecode = require('../process/bytecode');
 
@@ -39,11 +40,20 @@ class Client {
    * @param {String} [options.traversalSource] The traversal source. Defaults to: 'g'.
    * @param {GraphSONWriter} [options.writer] The writer to use.
    * @param {Authenticator} [options.authenticator] The authentication handler to use.
-   * @param {String} [options.processor] The name of the opProcessor to use
+   * @param {String} [options.processor] The name of the opProcessor to use, leave it undefined or set 'session' when session mode.
+   * @param {String} [options.session] The sessionId of Client in session mode. Defaults to null means session-less Client.
    * @constructor
    */
   constructor(url, options) {
     this._options = options;
+    if (this._options.processor === 'session') {
+      // compatibility with old 'session' processor setting
+      this._options.session = options.session || utils.getUuid()
+    }
+    if (this._options.session) {
+      // re-assign processor to 'session' when in session mode
+      this._options.processor = options.processor || 'session';
+    }
     this._connection = new Connection(url, options);
   }
 
@@ -70,6 +80,9 @@ class Client {
         'accept': this._connection.mimeType,
         'aliases': { 'g': this._options.traversalSource || 'g' }
       };
+      if (this._options.session && this._options.processor === 'session') {
+        args['session'] = this._options.session;
+      }
 
       return this._connection.submit(null, 'eval', args, null, this._options.processor || '');
     }
@@ -81,9 +94,14 @@ class Client {
 
   /**
    * Closes the underlying connection
+   * send session close request before connection close if session mode
    * @returns {Promise}
    */
   close() {
+    if (this._options.session && this._options.processor === 'session') {
+      const args = {'session': this._options.session};
+      return this._connection.submit(null, 'close', args, null, this._options.processor).then(() => this._connection.close());
+    }
     return this._connection.close();
   }
 
diff --git a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/driver/connection.js b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/driver/connection.js
index 01cf16a..29be5dc 100644
--- a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/driver/connection.js
+++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/driver/connection.js
@@ -100,10 +100,6 @@ class Connection extends EventEmitter {
     this._pingIntervalDelay = this.options.pingInterval || pingIntervalDelay;
     this._pongTimeoutDelay = this.options.pongTimeout || pongTimeoutDelay;
 
-    if (options.processor === 'session') {
-      this._session = true;
-      this._sessionId = utils.getUuid();
-    }
     if (this.options.connectOnStartup !== false) {
       this.open();
     }
@@ -169,13 +165,6 @@ class Connection extends EventEmitter {
         };
       }
 
-      if (this._session === true) {
-        if (bytecode !== null || args === null) {
-          reject(new Error('only script enabled in session mode'));
-          return;
-        }
-      }
-
       const message = Buffer.from(this._header + JSON.stringify(this._getRequest(requestId, bytecode, op, args, processor)));
       this._ws.send(message);
     }));
@@ -198,10 +187,6 @@ class Connection extends EventEmitter {
       args = this._adaptArgs(args, true);
     }
 
-    if (this._session === true && op !== 'authentication') {
-      args['session'] = this._sessionId;
-    }
-
     return ({
       'requestId': { '@type': 'g:UUID', '@value': id },
       'op': op || 'bytecode',
@@ -380,13 +365,6 @@ class Connection extends EventEmitter {
     }
     if (!this._closePromise) {
       this._closePromise = new Promise(resolve => {
-        if (this._session === true) {
-          // session close request, dsl in args as tips and not be executed actually
-          const args = {'gremlin': 'session.close()'};
-          const message = Buffer.from(this._header + JSON.stringify(this._getRequest(utils.getUuid(), null, 'close', args, 'session')));
-          this._ws.send(message);
-        }
-
         this._closeCallback = resolve;
         this._ws.close();
       });
diff --git a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/helper.js b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/helper.js
index 1c837cf..72708c0 100644
--- a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/helper.js
+++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/helper.js
@@ -48,5 +48,5 @@ exports.getClient = function getClient(traversalSource) {
 };
 
 exports.getSessionClient = function getSessionClient(traversalSource) {
-  return new Client(serverUrl, { 'traversalSource': traversalSource, 'processor': 'session'});
-};
\ No newline at end of file
+  return new Client(serverUrl, { 'traversalSource': traversalSource, 'session': 'unique-string-id'});
+};