@ultipa-graph/ultipa-driver
Version:
NodeJS SDK for Ultipa GQL
120 lines • 15.7 kB
JavaScript
"use strict";
/**
* Transaction service handles transaction lifecycle management.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.TransactionService = void 0;
const services_1 = require("../services");
/**
* Transaction service for managing database transactions.
*/
class TransactionService {
ctx;
constructor(ctx) {
this.ctx = ctx;
}
/**
* Start a new transaction.
*/
async beginTransaction(graphName, readOnly = false, timeout = 0) {
const session = this.ctx.sessions.getSession();
const request = {
session_id: session?.id?.toString() || '0',
graph_name: graphName,
read_only: readOnly,
timeout: Math.floor((timeout || this.ctx.config.timeout || 30000) / 1000), // Convert ms to seconds for gRPC
};
const metadata = this.ctx.getSessionMetadata();
const response = await (0, services_1.promisifyCall)(this.ctx.clients.transactionService, 'Begin', request, metadata);
const txId = parseInt(response.transaction_id || '0', 10);
const sessionId = session?.id || 0;
const timeoutMs = timeout || this.ctx.config.timeout || 30000;
const tx = this.ctx.txManager.begin(txId, sessionId, graphName, readOnly, timeoutMs);
return tx;
}
/**
* Commit a transaction.
*/
async commit(transactionId) {
const session = this.ctx.sessions.getSession();
const request = {
session_id: session?.id?.toString() || '0',
transaction_id: transactionId.toString(),
};
const metadata = this.ctx.getSessionMetadata();
try {
const response = await (0, services_1.promisifyCall)(this.ctx.clients.transactionService, 'Commit', request, metadata);
this.ctx.txManager.commit(transactionId);
return response.success || false;
}
catch (e) {
// Clean up local state even if server commit fails
try {
this.ctx.txManager.rollback(transactionId);
}
catch { }
throw e;
}
}
/**
* Rollback a transaction.
*/
async rollback(transactionId) {
const session = this.ctx.sessions.getSession();
const request = {
session_id: session?.id?.toString() || '0',
transaction_id: transactionId.toString(),
};
const metadata = this.ctx.getSessionMetadata();
try {
const response = await (0, services_1.promisifyCall)(this.ctx.clients.transactionService, 'Rollback', request, metadata);
this.ctx.txManager.rollback(transactionId);
return response.success || false;
}
catch (e) {
// Always clean up local state even if server rollback fails
try {
this.ctx.txManager.rollback(transactionId);
}
catch { }
throw e;
}
}
/**
* Return active transactions for the current session.
*/
async listTransactions() {
const session = this.ctx.sessions.getSession();
const request = {
session_id: session?.id?.toString() || '0',
};
const metadata = this.ctx.getSessionMetadata();
const response = await (0, services_1.promisifyCall)(this.ctx.clients.transactionService, 'ListTransactions', request, metadata);
return (response.transactions || []).map((t) => ({
transactionId: parseInt(t.transaction_id || '0', 10),
sessionId: parseInt(t.session_id || '0', 10),
graphName: t.graph_name || '',
readOnly: t.read_only || false,
createdAt: parseInt(t.created_at || '0', 10),
durationMs: parseInt(t.duration_ms || '0', 10),
internalTxId: t.internal_tx_id || '',
}));
}
/**
* Execute a function within a transaction.
*/
async withTransaction(graphName, fn, readOnly = false) {
const tx = await this.beginTransaction(graphName, readOnly, this.ctx.config.timeout ?? 30000);
try {
const result = await fn(tx.id);
await this.commit(tx.id);
return result;
}
catch (e) {
await this.rollback(tx.id);
throw e;
}
}
}
exports.TransactionService = TransactionService;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24tc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy90cmFuc2FjdGlvbi1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7R0FFRzs7O0FBS0gsMENBQTRDO0FBRTVDOztHQUVHO0FBQ0gsTUFBYSxrQkFBa0I7SUFDVDtJQUFwQixZQUFvQixHQUFtQjtRQUFuQixRQUFHLEdBQUgsR0FBRyxDQUFnQjtJQUFHLENBQUM7SUFFM0M7O09BRUc7SUFDSCxLQUFLLENBQUMsZ0JBQWdCLENBQ3BCLFNBQWlCLEVBQ2pCLFdBQW9CLEtBQUssRUFDekIsVUFBa0IsQ0FBQztRQUVuQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUMvQyxNQUFNLE9BQU8sR0FBRztZQUNkLFVBQVUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEdBQUc7WUFDMUMsVUFBVSxFQUFFLFNBQVM7WUFDckIsU0FBUyxFQUFFLFFBQVE7WUFDbkIsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLGlDQUFpQztTQUM3RyxDQUFDO1FBRUYsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQy9DLE1BQU0sUUFBUSxHQUFRLE1BQU0sSUFBQSx3QkFBYSxFQUN2QyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsRUFDbkMsT0FBTyxFQUNQLE9BQU8sRUFDUCxRQUFRLENBQ1QsQ0FBQztRQUVGLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsY0FBYyxJQUFJLEdBQUcsRUFBRSxFQUFF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RUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxDQUFDO1FBQzlGLElBQUksQ0FBQztZQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMvQixNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3pCLE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMzQixNQUFNLENBQUMsQ0FBQztRQUNWLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUF4SUQsZ0RBd0lDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUcmFuc2FjdGlvbiBzZXJ2aWNlIGhhbmRsZXMgdHJhbnNhY3Rpb24gbGlmZWN5Y2xlIG1hbmFnZW1lbnQuXG4gKi9cblxuaW1wb3J0IHsgU2VydmljZUNvbnRleHQgfSBmcm9tICcuL3NlcnZpY2UtY29udGV4dCc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4uL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uSW5mbyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IHByb21pc2lmeUNhbGwgfSBmcm9tICcuLi9zZXJ2aWNlcyc7XG5cbi8qKlxuICogVHJhbnNhY3Rpb24gc2VydmljZSBmb3IgbWFuYWdpbmcgZGF0YWJhc2UgdHJhbnNhY3Rpb25zLlxuICovXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25TZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjdHg6IFNlcnZpY2VDb250ZXh0KSB7fVxuXG4gIC8qKlxuICAgKiBTdGFydCBhIG5ldyB0cmFuc2FjdGlvbi5cbiAgICovXG4gIGFzeW5jIGJlZ2luVHJhbnNhY3Rpb24oXG4gICAgZ3JhcGhOYW1lOiBzdHJpbmcsXG4gICAgcmVhZE9ubHk6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICB0aW1lb3V0OiBudW1iZXIgPSAwXG4gICk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCBzZXNzaW9uID0gdGhpcy5jdHguc2Vzc2lvbnMuZ2V0U2Vzc2lvbigpO1xuICAgIGNvbnN0IHJlcXVlc3QgPSB7XG4gICAgICBzZXNzaW9uX2lkOiBzZXNzaW9uPy5pZD8udG9TdHJpbmcoKSB8fCAnMCcsXG4gICAgICBncmFwaF9uYW1lOiBncmFwaE5hbWUsXG4gICAgICByZWFkX29ubHk6IHJlYWRPbmx5LFxuICAgICAgdGltZW91dDogTWF0aC5mbG9vcigodGltZW91dCB8fCB0aGlzLmN0eC5jb25maWcudGltZW91dCB8fCAzMDAwMCkgLyAxMDAwKSwgLy8gQ29udmVydCBtcyB0byBzZWNvbmRzIGZvciBnUlBDXG4gICAgfTtcblxuICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy5jdHguZ2V0U2Vzc2lvbk1ldGFkYXRhKCk7XG4gICAgY29uc3QgcmVzcG9uc2U6IGFueSA9IGF3YWl0IHByb21pc2lmeUNhbGwoXG4gICAgICB0aGlzLmN0eC5jbGllbnRzLnRyYW5zYWN0aW9uU2VydmljZSxcbiAgICAgICdCZWdpbicsXG4gICAgICByZXF1ZXN0LFxuICAgICAgbWV0YWRhdGFcbiAgICApO1xuXG4gICAgY29uc3QgdHhJZCA9IHBhcnNlSW50KHJlc3BvbnNlLnRyYW5zYWN0aW9uX2lkIHx8ICcwJywgMTApO1xuICAgIGNvbnN0IHNlc3Npb25JZCA9IHNlc3Npb24/LmlkIHx8IDA7XG4gICAgY29uc3QgdGltZW91dE1zID0gdGltZW91dCB8fCB0aGlzLmN0eC5jb25maWcudGltZW91dCB8fCAzMDAwMDtcbiAgICBjb25zdCB0eCA9IHRoaXMuY3R4LnR4TWFuYWdlci5iZWdpbih0eElkLCBzZXNzaW9uSWQsIGdyYXBoTmFtZSwgcmVhZE9ubHksIHRpbWVvdXRNcyk7XG4gICAgcmV0dXJuIHR4O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbW1pdCBhIHRyYW5zYWN0aW9uLlxuICAgKi9cbiAgYXN5bmMgY29tbWl0KHRyYW5zYWN0aW9uSWQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLmN0eC5zZXNzaW9ucy5nZXRTZXNzaW9uKCk7XG4gICAgY29uc3QgcmVxdWVzdCA9IHtcbiAgICAgIHNlc3Npb25faWQ6IHNlc3Npb24/LmlkPy50b1N0cmluZygpIHx8ICcwJyxcbiAgICAgIHRyYW5zYWN0aW9uX2lkOiB0cmFuc2FjdGlvbklkLnRvU3RyaW5nKCksXG4gICAgfTtcblxuICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy5jdHguZ2V0U2Vzc2lvbk1ldGFkYXRhKCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlOiBhbnkgPSBhd2FpdCBwcm9taXNpZnlDYWxsKFxuICAgICAgICB0aGlzLmN0eC5jbGllbnRzLnRyYW5zYWN0aW9uU2VydmljZSxcbiAgICAgICAgJ0NvbW1pdCcsXG4gICAgICAgIHJlcXVlc3QsXG4gICAgICAgIG1ldGFkYXRhXG4gICAgICApO1xuXG4gICAgICB0aGlzLmN0eC50eE1hbmFnZXIuY29tbWl0KHRyYW5zYWN0aW9uSWQpO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLnN1Y2Nlc3MgfHwgZmFsc2U7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gQ2xlYW4gdXAgbG9jYWwgc3RhdGUgZXZlbiBpZiBzZXJ2ZXIgY29tbWl0IGZhaWxzXG4gICAgICB0cnkgeyB0aGlzLmN0eC50eE1hbmFnZXIucm9sbGJhY2sodHJhbnNhY3Rpb25JZCk7IH0gY2F0Y2gge31cbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJvbGxiYWNrIGEgdHJhbnNhY3Rpb24uXG4gICAqL1xuICBhc3luYyByb2xsYmFjayh0cmFuc2FjdGlvbklkOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBzZXNzaW9uID0gdGhpcy5jdHguc2Vzc2lvbnMuZ2V0U2Vzc2lvbigpO1xuICAgIGNvbnN0IHJlcXVlc3QgPSB7XG4gICAgICBzZXNzaW9uX2lkOiBzZXNzaW9uPy5pZD8udG9TdHJpbmcoKSB8fCAnMCcsXG4gICAgICB0cmFuc2FjdGlvbl9pZDogdHJhbnNhY3Rpb25JZC50b1N0cmluZygpLFxuICAgIH07XG5cbiAgICBjb25zdCBtZXRhZGF0YSA9IHRoaXMuY3R4LmdldFNlc3Npb25NZXRhZGF0YSgpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZTogYW55ID0gYXdhaXQgcHJvbWlzaWZ5Q2FsbChcbiAgICAgICAgdGhpcy5jdHguY2xpZW50cy50cmFuc2FjdGlvblNlcnZpY2UsXG4gICAgICAgICdSb2xsYmFjaycsXG4gICAgICAgIHJlcXVlc3QsXG4gICAgICAgIG1ldGFkYXRhXG4gICAgICApO1xuXG4gICAgICB0aGlzLmN0eC50eE1hbmFnZXIucm9sbGJhY2sodHJhbnNhY3Rpb25JZCk7XG4gICAgICByZXR1cm4gcmVzcG9uc2Uuc3VjY2VzcyB8fCBmYWxzZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBBbHdheXMgY2xlYW4gdXAgbG9jYWwgc3RhdGUgZXZlbiBpZiBzZXJ2ZXIgcm9sbGJhY2sgZmFpbHNcbiAgICAgIHRyeSB7IHRoaXMuY3R4LnR4TWFuYWdlci5yb2xsYmFjayh0cmFuc2FjdGlvbklkKTsgfSBjYXRjaCB7fVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGFjdGl2ZSB0cmFuc2FjdGlvbnMgZm9yIHRoZSBjdXJyZW50IHNlc3Npb24uXG4gICAqL1xuICBhc3luYyBsaXN0VHJhbnNhY3Rpb25zKCk6IFByb21pc2U8VHJhbnNhY3Rpb25JbmZvW10+IHtcbiAgICBjb25zdCBzZXNzaW9uID0gdGhpcy5jdHguc2Vzc2lvbnMuZ2V0U2Vzc2lvbigpO1xuICAgIGNvbnN0IHJlcXVlc3QgPSB7XG4gICAgICBzZXNzaW9uX2lkOiBzZXNzaW9uPy5pZD8udG9TdHJpbmcoKSB8fCAnMCcsXG4gICAgfTtcblxuICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy5jdHguZ2V0U2Vzc2lvbk1ldGFkYXRhKCk7XG4gICAgY29uc3QgcmVzcG9uc2U6IGFueSA9IGF3YWl0IHByb21pc2lmeUNhbGwoXG4gICAgICB0aGlzLmN0eC5jbGllbnRzLnRyYW5zYWN0aW9uU2VydmljZSxcbiAgICAgICdMaXN0VHJhbnNhY3Rpb25zJyxcbiAgICAgIHJlcXVlc3QsXG4gICAgICBtZXRhZGF0YVxuICAgICk7XG5cbiAgICByZXR1cm4gKHJlc3BvbnNlLnRyYW5zYWN0aW9ucyB8fCBbXSkubWFwKCh0OiBhbnkpID0+ICh7XG4gICAgICB0cmFuc2FjdGlvbklkOiBwYXJzZUludCh0LnRyYW5zYWN0aW9uX2lkIHx8ICcwJywgMTApLFxuICAgICAgc2Vzc2lvbklkOiBwYXJzZUludCh0LnNlc3Npb25faWQgfHwgJzAnLCAxMCksXG4gICAgICBncmFwaE5hbWU6IHQuZ3JhcGhfbmFtZSB8fCAnJyxcbiAgICAgIHJlYWRPbmx5OiB0LnJlYWRfb25seSB8fCBmYWxzZSxcbiAgICAgIGNyZWF0ZWRBdDogcGFyc2VJbnQodC5jcmVhdGVkX2F0IHx8ICcwJywgMTApLFxuICAgICAgZHVyYXRpb25NczogcGFyc2VJbnQodC5kdXJhdGlvbl9tcyB8fCAnMCcsIDEwKSxcbiAgICAgIGludGVybmFsVHhJZDogdC5pbnRlcm5hbF90eF9pZCB8fCAnJyxcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBhIGZ1bmN0aW9uIHdpdGhpbiBhIHRyYW5zYWN0aW9uLlxuICAgKi9cbiAgYXN5bmMgd2l0aFRyYW5zYWN0aW9uPFQ+KFxuICAgIGdyYXBoTmFtZTogc3RyaW5nLFxuICAgIGZuOiAodHhJZDogbnVtYmVyKSA9PiBQcm9taXNlPFQ+LFxuICAgIHJlYWRPbmx5OiBib29sZWFuID0gZmFsc2VcbiAgKTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3QgdHggPSBhd2FpdCB0aGlzLmJlZ2luVHJhbnNhY3Rpb24oZ3JhcGhOYW1lLCByZWFkT25seSwgdGhpcy5jdHguY29uZmlnLnRpbWVvdXQgPz8gMzAwMDApO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmbih0eC5pZCk7XG4gICAgICBhd2FpdCB0aGlzLmNvbW1pdCh0eC5pZCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGF3YWl0IHRoaXMucm9sbGJhY2sodHguaWQpO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==