lib6/transaction-promise.js
/**
* Copyright (c) "Neo4j"
* Neo4j Sweden AB [https://neo4j.com]
*
* 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.
*/
var _a;
/* eslint-disable @typescript-eslint/promise-function-async */
import Transaction from './transaction';
/**
* Represents a {@link Promise<Transaction>} object and a {@link Transaction} object.
*
* Resolving this object promise verifies the result of the transaction begin and returns the {@link Transaction} object in case of success.
*
* The object can still also used as {@link Transaction} for convenience. The result of begin will be checked
* during the next API calls in the object as it is in the transaction.
*
* @access public
*/
class TransactionPromise extends Transaction {
/**
* @constructor
* @param {object} args
* @param {ConnectionHolder} args.connectionHolder - the connection holder to get connection from.
* @param {function()} args.onClose - Function to be called when transaction is committed or rolled back.
* @param {function(bookmarks: Bookmarks)} args.onBookmarks callback invoked when new bookmark is produced.
* @param {function()} args.onConnection - Function to be called when a connection is obtained to ensure the connection
* is not yet released.
* @param {boolean} args.reactive whether this transaction generates reactive streams
* @param {number} args.fetchSize - the record fetch size in each pulling batch.
* @param {string} args.impersonatedUser - The name of the user which should be impersonated for the duration of the session.
* @param {NotificationFilter} args.notificationFilter - The notification filter used for this transaction.
* @param {NonAutoCommitApiTelemetryConfig} args.apiTelemetryConfig - The api telemetry configuration. Empty/Null for disabling telemetry
*/
constructor({ connectionHolder, onClose, onBookmarks, onConnection, reactive, fetchSize, impersonatedUser, highRecordWatermark, lowRecordWatermark, notificationFilter, apiTelemetryConfig }) {
super({
connectionHolder,
onClose,
onBookmarks,
onConnection,
reactive,
fetchSize,
impersonatedUser,
highRecordWatermark,
lowRecordWatermark,
notificationFilter,
apiTelemetryConfig
});
this[_a] = 'TransactionPromise';
}
/**
* Waits for the begin to complete.
*
* @param {function(transaction: Transaction)} onFulfilled - function to be called when finished.
* @param {function(error: {message:string, code:string})} onRejected - function to be called upon errors.
* @return {Promise} promise.
*/
then(onfulfilled, onrejected) {
return this._getOrCreateBeginPromise().then(onfulfilled, onrejected);
}
/**
* Catch errors when using promises.
*
* @param {function(error: Neo4jError)} onRejected - Function to be called upon errors.
* @return {Promise} promise.
*/
catch(onrejected) {
return this._getOrCreateBeginPromise().catch(onrejected);
}
/**
* Called when finally the begin is done
*
* @param {function()|null} onfinally - function when the promise finished
* @return {Promise} promise.
*/
finally(onfinally) {
return this._getOrCreateBeginPromise().finally(onfinally);
}
_getOrCreateBeginPromise() {
if (this._beginPromise == null) {
this._beginPromise = new Promise((resolve, reject) => {
this._resolve = resolve;
this._reject = reject;
if (this._beginError != null) {
reject(this._beginError);
}
if (this._beginMetadata != null) {
resolve(this._toTransaction());
}
});
}
return this._beginPromise;
}
/**
* @access private
*/
_toTransaction() {
return Object.assign(Object.assign({}, this), { run: super.run.bind(this), commit: super.commit.bind(this), rollback: super.rollback.bind(this), close: super.close.bind(this), isOpen: super.isOpen.bind(this), _begin: this._begin.bind(this) });
}
/**
* @access private
*/
_begin(bookmarks, txConfig) {
return super._begin(bookmarks, txConfig, {
onError: this._onBeginError.bind(this),
onComplete: this._onBeginMetadata.bind(this)
});
}
/**
* @access private
* @returns {void}
*/
_onBeginError(error) {
this._beginError = error;
if (this._reject != null) {
this._reject(error);
}
}
/**
* @access private
* @returns {void}
*/
_onBeginMetadata(metadata) {
this._beginMetadata = metadata !== null && metadata !== void 0 ? metadata : {};
if (this._resolve != null) {
this._resolve(this._toTransaction());
}
}
}
_a = Symbol.toStringTag;
export default TransactionPromise;