@google-cloud/spanner
Version:
Cloud Spanner Client Library for Node.js
133 lines • 5.47 kB
JavaScript
"use strict";
/*!
* Copyright 2024 Google LLC. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.SessionFactory = void 0;
const multiplexed_session_1 = require("./multiplexed-session");
const session_pool_1 = require("./session-pool");
const common = require('./common-grpc/service-object');
/**
* Creates a SessionFactory object to manage the creation of
* session-pool and multiplexed session.
*
* @class
*
* @param {Database} database Database object.
* @param {String} name Name of the database.
* @param {SessionPoolOptions|SessionPoolInterface} options Session pool
* configuration options or custom pool inteface.
*/
class SessionFactory extends common.GrpcServiceObject {
multiplexedSession_;
pool_;
isMultiplexed;
isMultiplexedPartitionOps;
constructor(database, name, poolOptions) {
super({
parent: database,
id: name,
});
this.pool_ =
typeof poolOptions === 'function'
? new poolOptions(database, null)
: new session_pool_1.SessionPool(database, poolOptions);
this.pool_.on('error', this.emit.bind(database, 'error'));
this.pool_.open();
this.multiplexedSession_ = new multiplexed_session_1.MultiplexedSession(database);
// set the isMultiplexed property to true if multiplexed session is enabled, otherwise set the property to false
process.env.GOOGLE_CLOUD_SPANNER_MULTIPLEXED_SESSIONS === 'true'
? (this.isMultiplexed = true)
: (this.isMultiplexed = false);
// set the isMultiplexedPartitionedOps property to true if multiplexed session is enabled for paritioned ops, otherwise set the property to false
this.isMultiplexedPartitionOps =
process.env.GOOGLE_CLOUD_SPANNER_MULTIPLEXED_SESSIONS === 'true' &&
process.env.GOOGLE_CLOUD_SPANNER_MULTIPLEXED_SESSIONS_PARTITIONED_OPS ===
'true';
// Multiplexed sessions should only be created if its enabled.
if (this.isMultiplexed) {
this.multiplexedSession_.on('error', this.emit.bind(database, 'error'));
this.multiplexedSession_.createSession();
}
}
/**
* Retrieves a session, either a regular session or a multiplexed session, based on the environment variable configuration.
*
* If the environment variable `GOOGLE_CLOUD_SPANNER_MULTIPLEXED_SESSIONS` is set to `true`, the method will attempt to
* retrieve a multiplexed session. Otherwise, it will retrieve a session from the regular pool.
*
* @param {GetSessionCallback} callback The callback function.
*/
getSession(callback) {
const sessionHandler = this.isMultiplexed
? this.multiplexedSession_
: this.pool_;
sessionHandler.getSession((err, session, transaction) => callback(err, session, transaction));
}
/**
* Retrieves a session for partitioned operations, selecting the appropriate session type
* based on whether multiplexed sessions are enabled.
*
* If multiplexed sessions are enabled for partitioned ops this methods delegates the request to `getSession()`, which returns
* either a multiplexed session or a regular session based on the configuration.
*
* If the multiplexed sessions are disabled, a session is retrieved from the regular session pool.
*
* @param {GetSessionCallback} callback The callback function.
*/
getSessionForPartitionedOps(callback) {
this.isMultiplexedPartitionOps
? this.getSession(callback)
: this.pool_.getSession(callback);
}
/**
* Returns the regular session pool object.
*
* @returns {SessionPoolInterface} The session pool used by current instance.
*/
getPool() {
return this.pool_;
}
/**
* Releases a regular session back to the session pool.
*
* This methods does not release a multiplexed session.
*
* It returns a session to the pool after it is no longer needed.
* It is a no-op for multiplexed sessions.
*
* @param {Session} session - The session to be released. This should be an instance of `Session` that was
* previously acquired from the session pool.
*
* @throws {Error} If the session is invalid or cannot be released.
*/
release(session) {
if (!session.metadata?.multiplexed) {
this.pool_.release(session);
}
}
/**
* Returns if a multiplexed is enabled or not.
*
* This method returns true if multiplexed session is enabled, otherwise returns false
*
* @returns {boolean}
*/
isMultiplexedEnabled() {
return this.isMultiplexed;
}
}
exports.SessionFactory = SessionFactory;
//# sourceMappingURL=session-factory.js.map