@ductape/sdk 0.4.4 → 0.4.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/context/execution-context.d.ts +6 -0
- package/dist/context/execution-context.js +1 -1
- package/dist/context/execution-context.js.map +1 -1
- package/dist/database/adapters/dynamodb.adapter.d.ts +2 -0
- package/dist/database/adapters/dynamodb.adapter.js +18 -1
- package/dist/database/adapters/dynamodb.adapter.js.map +1 -1
- package/dist/database/adapters/mongodb.adapter.d.ts +4 -0
- package/dist/database/adapters/mongodb.adapter.js +58 -14
- package/dist/database/adapters/mongodb.adapter.js.map +1 -1
- package/dist/database/adapters/mysql.adapter.d.ts +2 -0
- package/dist/database/adapters/mysql.adapter.js +90 -15
- package/dist/database/adapters/mysql.adapter.js.map +1 -1
- package/dist/database/adapters/postgresql.adapter.d.ts +2 -0
- package/dist/database/adapters/postgresql.adapter.js +24 -4
- package/dist/database/adapters/postgresql.adapter.js.map +1 -1
- package/dist/database/atomic-batch.d.ts +58 -0
- package/dist/database/atomic-batch.js +183 -0
- package/dist/database/atomic-batch.js.map +1 -0
- package/dist/database/atomic-pipeline.d.ts +27 -0
- package/dist/database/atomic-pipeline.js +118 -0
- package/dist/database/atomic-pipeline.js.map +1 -0
- package/dist/database/databases.service.d.ts +9 -0
- package/dist/database/databases.service.js +234 -3
- package/dist/database/databases.service.js.map +1 -1
- package/dist/database/dynamodb-atomic-batch.d.ts +8 -0
- package/dist/database/dynamodb-atomic-batch.js +153 -0
- package/dist/database/dynamodb-atomic-batch.js.map +1 -0
- package/dist/database/index.d.ts +2 -0
- package/dist/database/index.js +4 -2
- package/dist/database/index.js.map +1 -1
- package/dist/database/sql-context.d.ts +17 -0
- package/dist/database/sql-context.js +51 -0
- package/dist/database/sql-context.js.map +1 -0
- package/dist/database/transactions/transaction-manager.d.ts +5 -1
- package/dist/database/transactions/transaction-manager.js +13 -2
- package/dist/database/transactions/transaction-manager.js.map +1 -1
- package/dist/database/types/index.d.ts +1 -0
- package/dist/database/types/pipeline.interface.d.ts +19 -0
- package/dist/database/types/pipeline.interface.js +22 -0
- package/dist/database/types/pipeline.interface.js.map +1 -0
- package/dist/index.d.ts +9 -1
- package/dist/index.js +17 -2
- package/dist/index.js.map +1 -1
- package/dist/logs/logs.service.js +10 -0
- package/dist/logs/logs.service.js.map +1 -1
- package/dist/processor/services/processor.service.d.ts +2 -2
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.executeDynamoAtomicBatch = executeDynamoAtomicBatch;
|
|
4
|
+
const crypto_1 = require("crypto");
|
|
5
|
+
const atomic_batch_1 = require("./atomic-batch");
|
|
6
|
+
const invalid = () => { throw new atomic_batch_1.AtomicBatchError('BATCH_VALIDATION', 'not_started'); };
|
|
7
|
+
/** DynamoDB transactions cannot return mutated rows or execute sequential result dependencies. */
|
|
8
|
+
async function executeDynamoAtomicBatch(options, keys, send) {
|
|
9
|
+
(0, atomic_batch_1.validateAtomicBatch)(options);
|
|
10
|
+
options = Object.assign(Object.assign({}, options), { operations: JSON.parse(JSON.stringify(options.operations)) });
|
|
11
|
+
if (options.transaction)
|
|
12
|
+
invalid();
|
|
13
|
+
const transactionId = (0, crypto_1.randomUUID)();
|
|
14
|
+
const results = Object.create(null);
|
|
15
|
+
const seen = new Set();
|
|
16
|
+
const items = [];
|
|
17
|
+
const operationNames = [];
|
|
18
|
+
const rejectReferences = (value) => {
|
|
19
|
+
if (!value || typeof value !== 'object')
|
|
20
|
+
return;
|
|
21
|
+
if ('$batchRef' in value)
|
|
22
|
+
invalid();
|
|
23
|
+
Object.values(value).forEach(rejectReferences);
|
|
24
|
+
};
|
|
25
|
+
for (const op of options.operations) {
|
|
26
|
+
rejectReferences(op);
|
|
27
|
+
// Projection and result dependencies need transaction-returned records, unavailable here.
|
|
28
|
+
if (op.project || (op.returning && op.operation !== 'insert'))
|
|
29
|
+
invalid();
|
|
30
|
+
const schema = keys[op.table];
|
|
31
|
+
if (!(schema === null || schema === void 0 ? void 0 : schema.length))
|
|
32
|
+
invalid();
|
|
33
|
+
const records = Array.isArray(op.data) ? op.data : [op.data];
|
|
34
|
+
if (op.expectedCount !== undefined && op.expectedCount !== records.length)
|
|
35
|
+
invalid();
|
|
36
|
+
const insertedIds = [];
|
|
37
|
+
for (const record of records) {
|
|
38
|
+
const source = op.operation === 'insert' || op.operation === 'upsert' ? record : op.where;
|
|
39
|
+
const key = {};
|
|
40
|
+
for (const field of schema) {
|
|
41
|
+
const value = source === null || source === void 0 ? void 0 : source[field];
|
|
42
|
+
if (!((typeof value === 'string' && value.length) || (typeof value === 'number' && Number.isFinite(value))))
|
|
43
|
+
invalid();
|
|
44
|
+
key[field] = value;
|
|
45
|
+
}
|
|
46
|
+
const identity = JSON.stringify([op.table, schema.map(field => key[field])]);
|
|
47
|
+
if (seen.has(identity))
|
|
48
|
+
invalid();
|
|
49
|
+
seen.add(identity);
|
|
50
|
+
const names = {};
|
|
51
|
+
const values = {};
|
|
52
|
+
let n = 0;
|
|
53
|
+
const name = (field) => { const token = `#n${n++}`; names[token] = field; return token; };
|
|
54
|
+
const value = (input) => { const token = `:v${n++}`; values[token] = input; return token; };
|
|
55
|
+
const conditions = [];
|
|
56
|
+
if (op.operation === 'insert')
|
|
57
|
+
conditions.push(`attribute_not_exists(${name(schema[0])})`);
|
|
58
|
+
if (op.operation === 'update' || op.operation === 'delete') {
|
|
59
|
+
conditions.push(`attribute_exists(${name(schema[0])})`);
|
|
60
|
+
for (const [field, predicate] of Object.entries(op.where)) {
|
|
61
|
+
if (schema.includes(field))
|
|
62
|
+
continue;
|
|
63
|
+
if (predicate && typeof predicate === 'object' && !Array.isArray(predicate)) {
|
|
64
|
+
const comparators = { $eq: '=', $ne: '<>', $lt: '<', $lte: '<=', $gt: '>', $gte: '>=' };
|
|
65
|
+
const entries = Object.entries(predicate);
|
|
66
|
+
if (!entries.length)
|
|
67
|
+
invalid();
|
|
68
|
+
for (const [operator, operand] of entries) {
|
|
69
|
+
const comparator = comparators[operator.toLowerCase()];
|
|
70
|
+
if (!comparator)
|
|
71
|
+
invalid();
|
|
72
|
+
conditions.push(`${name(field)} ${comparator} ${value(operand)}`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
else
|
|
76
|
+
conditions.push(`${name(field)} = ${value(predicate)}`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
let update;
|
|
80
|
+
if (op.operation === 'update') {
|
|
81
|
+
const set = [], remove = [];
|
|
82
|
+
for (const [field, operand] of Object.entries(record)) {
|
|
83
|
+
if (schema.includes(field))
|
|
84
|
+
invalid();
|
|
85
|
+
const target = name(field);
|
|
86
|
+
const operators = operand && typeof operand === 'object' && !Array.isArray(operand)
|
|
87
|
+
? Object.keys(operand).filter(key => key.startsWith('$')) : [];
|
|
88
|
+
if (!operators.length) {
|
|
89
|
+
set.push(`${target} = ${value(operand)}`);
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
if (Object.keys(operand).length !== 1)
|
|
93
|
+
invalid();
|
|
94
|
+
const operator = operators[0].toLowerCase();
|
|
95
|
+
const argument = operand[operators[0]];
|
|
96
|
+
if (operator === '$set')
|
|
97
|
+
set.push(`${target} = ${value(argument)}`);
|
|
98
|
+
else if (operator === '$unset' && argument === true)
|
|
99
|
+
remove.push(target);
|
|
100
|
+
else if (['$inc', '$dec'].includes(operator) && typeof argument === 'number') {
|
|
101
|
+
set.push(`${target} = ${target} ${operator === '$inc' ? '+' : '-'} ${value(argument)}`);
|
|
102
|
+
}
|
|
103
|
+
else
|
|
104
|
+
invalid();
|
|
105
|
+
}
|
|
106
|
+
if (!set.length && !remove.length)
|
|
107
|
+
invalid();
|
|
108
|
+
update = [set.length ? `SET ${set.join(', ')}` : '', remove.length ? `REMOVE ${remove.join(', ')}` : ''].filter(Boolean).join(' ');
|
|
109
|
+
}
|
|
110
|
+
if (op.operation === 'upsert' && (op.conflictKeys.length !== schema.length || schema.some(field => !op.conflictKeys.includes(field))))
|
|
111
|
+
invalid();
|
|
112
|
+
const command = { TableName: op.table };
|
|
113
|
+
if (op.operation === 'insert' || op.operation === 'upsert')
|
|
114
|
+
command.Item = record;
|
|
115
|
+
else
|
|
116
|
+
command.Key = key;
|
|
117
|
+
if (conditions.length)
|
|
118
|
+
command.ConditionExpression = conditions.join(' AND ');
|
|
119
|
+
if (update)
|
|
120
|
+
command.UpdateExpression = update;
|
|
121
|
+
if (Object.keys(names).length)
|
|
122
|
+
command.ExpressionAttributeNames = names;
|
|
123
|
+
if (Object.keys(values).length)
|
|
124
|
+
command.ExpressionAttributeValues = values;
|
|
125
|
+
items.push({ [op.operation === 'insert' || op.operation === 'upsert' ? 'Put' : op.operation === 'update' ? 'Update' : 'Delete']: command });
|
|
126
|
+
operationNames.push(op.name);
|
|
127
|
+
insertedIds.push(key);
|
|
128
|
+
}
|
|
129
|
+
results[op.name] = op.operation === 'insert'
|
|
130
|
+
? { count: records.length, data: op.returning ? records : [], insertedIds }
|
|
131
|
+
: op.operation === 'upsert' ? { count: 1, data: [], operation: 'upserted' } : { count: 1, data: [] };
|
|
132
|
+
}
|
|
133
|
+
if (items.length > 100)
|
|
134
|
+
invalid();
|
|
135
|
+
try {
|
|
136
|
+
await send({ TransactItems: items, ClientRequestToken: transactionId });
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
const name = error === null || error === void 0 ? void 0 : error.name;
|
|
140
|
+
if (name === 'TransactionCanceledException') {
|
|
141
|
+
const reasons = error.CancellationReasons || [];
|
|
142
|
+
const index = reasons.findIndex((reason) => reason.Code === 'ConditionalCheckFailed');
|
|
143
|
+
throw new atomic_batch_1.AtomicBatchError(index >= 0 ? 'BATCH_GUARD_FAILED' : 'BATCH_OPERATION_FAILED', 'aborted', index >= 0 ? operationNames[index] : undefined, transactionId);
|
|
144
|
+
}
|
|
145
|
+
if (['ValidationException', 'ResourceNotFoundException', 'AccessDeniedException', 'IdempotentParameterMismatchException'].includes(name)) {
|
|
146
|
+
throw new atomic_batch_1.AtomicBatchError('BATCH_OPERATION_FAILED', 'not_started', undefined, transactionId);
|
|
147
|
+
}
|
|
148
|
+
throw new atomic_batch_1.AtomicBatchError('BATCH_COMMIT_UNKNOWN', 'commit_unknown', undefined, transactionId);
|
|
149
|
+
}
|
|
150
|
+
// Counts are valid only after DynamoDB has acknowledged the entire conditional transaction.
|
|
151
|
+
return { status: 'committed', transactionId, results };
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=dynamodb-atomic-batch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dynamodb-atomic-batch.js","sourceRoot":"","sources":["../../src/database/dynamodb-atomic-batch.ts"],"names":[],"mappings":"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"}
|
package/dist/database/index.d.ts
CHANGED
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
*
|
|
12
12
|
* @module database
|
|
13
13
|
*/
|
|
14
|
+
export { AtomicBatchOptions, AtomicBatchOperation, AtomicBatchResult, AtomicBatchError } from './atomic-batch';
|
|
14
15
|
export { DatabaseService, databaseService, IDatabaseServiceConfig, IDatabaseSchemaSnapshot, DatabaseConnection, } from './databases.service';
|
|
15
16
|
export { BaseAdapter, DatabaseFeature, } from './adapters/base.adapter';
|
|
16
17
|
export { AdapterFactory } from './adapters/adapter.factory';
|
|
@@ -46,3 +47,4 @@ export { TriggerProcessor, createTriggerProcessor, Trigger, } from './triggers/t
|
|
|
46
47
|
export { TriggerEvent, TriggerTiming, TriggerActionType, ConditionOperator, } from './types/trigger.interface';
|
|
47
48
|
export type { ITriggerActionBase, ITriggerDatabaseAction, ITriggerStorageAction, ITriggerNotificationAction, ITriggerBrokerAction, ITriggerCacheAction, ITriggerFeatureAction, ITriggerActionExecuteAction, ITriggerAgentAction, ITriggerResilienceAction, ITriggerLogAction, ITriggerSessionAction, ITriggerVectorAction, ITriggerCustomAction, ITriggerHttpAction, ITriggerAction, IConditionClause, ITriggerCondition, ITriggerContext, ITriggerRetry, ITriggerDefinition, ITriggerActionResult, ITriggerResult, ITriggerConfig, ISchemaTriggerConfig, IPersistedTriggerAction, ICreateTriggerInput, IUpdateTriggerInput, IPersistedTrigger, IListTriggersOptions, ITriggerManager, } from './types/trigger.interface';
|
|
48
49
|
export type { IPreSaveOperation, IPreSaveBaseOptions, IPreSaveEncryptOptions, IPreSaveHashOptions, IPreSaveMaskOptions, IPreSaveValidateOptions, IPreSaveTransformOptions, IPreSaveSlugOptions, IPreSaveTruncateOptions, IPreSaveRoundOptions, IPreSaveClampOptions, IPreSaveDefaultOptions, IPreSaveComputeOptions, IPreSaveSimpleOptions, IValidationRule, IValidationError, IPreSaveConfig, IPreSaveResult, IAppliedOperation, ISchemaPreSaveConfig, } from './types/presave.interface';
|
|
50
|
+
export type { IMongoPipelineOptions, IMongoPipelineResult } from './types/pipeline.interface';
|
package/dist/database/index.js
CHANGED
|
@@ -13,9 +13,11 @@
|
|
|
13
13
|
* @module database
|
|
14
14
|
*/
|
|
15
15
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
-
exports.
|
|
17
|
-
exports.ConditionOperator = exports.TriggerActionType = exports.TriggerTiming = exports.TriggerEvent = exports.Trigger = exports.createTriggerProcessor = exports.TriggerProcessor = void 0;
|
|
16
|
+
exports.deriveDatabaseActionOutputContract = exports.PreSaveOperationType = exports.verifyShaHash = exports.verifyHash = exports.decryptFields = exports.decrypt = exports.PreSave = exports.PreSaveProcessor = exports.ReferentialAction = exports.ConstraintType = exports.MigrationStatus = exports.DatabaseErrorType = exports.ConflictAction = exports.RelationshipType = exports.AlterationType = exports.DatabaseActionType = exports.IsolationLevel = exports.SortOrder = exports.IndexType = exports.ColumnType = exports.DatabaseType = exports.DatabaseError = exports.createAction = exports.ActionBuilder = exports.ActionManager = exports.MigrationHelpers = exports.MigrationEngine = exports.migration = exports.MigrationBuilder = exports.SchemaManager = exports.Savepoint = exports.Transaction = exports.TransactionManager = exports.AggregationOperators = exports.AggregationBuilder = exports.Operators = exports.QueryBuilder = exports.CassandraAdapter = exports.MariaDBAdapter = exports.DynamoDBAdapter = exports.MongoDBAdapter = exports.MySQLAdapter = exports.PostgreSQLAdapter = exports.AdapterFactory = exports.DatabaseFeature = exports.BaseAdapter = exports.DatabaseConnection = exports.databaseService = exports.DatabaseService = exports.AtomicBatchError = void 0;
|
|
17
|
+
exports.ConditionOperator = exports.TriggerActionType = exports.TriggerTiming = exports.TriggerEvent = exports.Trigger = exports.createTriggerProcessor = exports.TriggerProcessor = exports.validateDatabaseActionOutput = void 0;
|
|
18
18
|
// ==================== MAIN SERVICE ====================
|
|
19
|
+
var atomic_batch_1 = require("./atomic-batch");
|
|
20
|
+
Object.defineProperty(exports, "AtomicBatchError", { enumerable: true, get: function () { return atomic_batch_1.AtomicBatchError; } });
|
|
19
21
|
var databases_service_1 = require("./databases.service");
|
|
20
22
|
Object.defineProperty(exports, "DatabaseService", { enumerable: true, get: function () { return databases_service_1.DatabaseService; } });
|
|
21
23
|
Object.defineProperty(exports, "databaseService", { enumerable: true, get: function () { return databases_service_1.databaseService; } });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/database/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;;;AAEH,yDAAyD;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/database/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;;;AAEH,yDAAyD;AACzD,+CAA+G;AAAzC,gHAAA,gBAAgB,OAAA;AAEtF,yDAM6B;AAL3B,oHAAA,eAAe,OAAA;AACf,oHAAA,eAAe,OAAA;AAGf,uHAAA,kBAAkB,OAAA;AAGpB,qDAAqD;AAErD,wDAGiC;AAF/B,2GAAA,WAAW,OAAA;AACX,+GAAA,eAAe,OAAA;AAGjB,8DAA4D;AAAnD,iHAAA,cAAc,OAAA;AAEvB,oEAAkE;AAAzD,uHAAA,iBAAiB,OAAA;AAC1B,0DAAwD;AAA/C,6GAAA,YAAY,OAAA;AACrB,8DAA4D;AAAnD,iHAAA,cAAc,OAAA;AACvB,gEAA8D;AAArD,mHAAA,eAAe,OAAA;AACxB,8DAA4D;AAAnD,iHAAA,cAAc,OAAA;AACvB,kEAAgE;AAAvD,qHAAA,gBAAgB,OAAA;AAEzB,sDAAsD;AAEtD,2DAImC;AAHjC,6GAAA,YAAY,OAAA;AACZ,0GAAA,SAAS,OAAA;AAIX,uEAIyC;AAHvC,yHAAA,kBAAkB,OAAA;AAClB,2HAAA,oBAAoB,OAAA;AAItB,yDAAyD;AAEzD,0EAI4C;AAH1C,yHAAA,kBAAkB,OAAA;AAClB,kHAAA,WAAW,OAAA;AACX,gHAAA,SAAS,OAAA;AAGX,mDAAmD;AAEnD,0DAIiC;AAH/B,+GAAA,aAAa,OAAA;AACb,kHAAA,gBAAgB,OAAA;AAChB,2GAAA,SAAS,OAAA;AAQX,uDAAuD;AAEvD,kEAGuC;AAFrC,mHAAA,eAAe,OAAA;AACf,oHAAA,gBAAgB,OAAA;AAGlB,oDAAoD;AAEpD,2DAIkC;AAHhC,+GAAA,aAAa,OAAA;AACb,+GAAA,aAAa,OAAA;AACb,8GAAA,YAAY,OAAA;AAGd,kDAAkD;AAElD,yDAAuD;AAA9C,+GAAA,aAAa,OAAA;AAEtB,kDAAkD;AAElD,QAAQ;AACR,uCAcuB;AAbrB,qGAAA,YAAY,OAAA;AACZ,mGAAA,UAAU,OAAA;AACV,kGAAA,SAAS,OAAA;AACT,kGAAA,SAAS,OAAA;AACT,uGAAA,cAAc,OAAA;AACd,2GAAA,kBAAkB,OAAA;AAClB,uGAAA,cAAc,OAAA;AACd,yGAAA,gBAAgB,OAAA;AAChB,uGAAA,cAAc,OAAA;AACd,0GAAA,iBAAiB,OAAA;AACjB,wGAAA,eAAe,OAAA;AACf,uGAAA,cAAc,OAAA;AACd,0GAAA,iBAAiB,OAAA;AA+KnB,gEAAgE;AAEhE,iEAGqC;AAFnC,qHAAA,gBAAgB,OAAA;AAChB,4GAAA,OAAO,OAAA;AAGT,6CAK2B;AAJzB,kGAAA,OAAO,OAAA;AACP,wGAAA,aAAa,OAAA;AACb,qGAAA,UAAU,OAAA;AACV,wGAAA,aAAa,OAAA;AAGf,iBAAiB;AACjB,+DAEmC;AADjC,yHAAA,oBAAoB,OAAA;AAGtB,6DAA6G;AAApG,qIAAA,kCAAkC,OAAA;AAAE,+HAAA,4BAA4B,OAAA;AAQzE,qDAAqD;AAErD,kEAIsC;AAHpC,qHAAA,gBAAgB,OAAA;AAChB,2HAAA,sBAAsB,OAAA;AACtB,4GAAA,OAAO,OAAA;AAGT,gBAAgB;AAChB,+DAKmC;AAJjC,iHAAA,YAAY,OAAA;AACZ,kHAAA,aAAa,OAAA;AACb,sHAAA,iBAAiB,OAAA;AACjB,sHAAA,iBAAiB,OAAA"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** Bounded, parameterized context SELECT. Flat rows; joins never cause hidden reads. */
|
|
2
|
+
export interface SqlContext {
|
|
3
|
+
select: Record<string, string>;
|
|
4
|
+
where: Record<string, string | number | boolean | null>;
|
|
5
|
+
joins?: Array<{
|
|
6
|
+
table: string;
|
|
7
|
+
alias: string;
|
|
8
|
+
on: Record<string, string>;
|
|
9
|
+
where: Record<string, string | number | boolean | null>;
|
|
10
|
+
kind?: 'left' | 'inner';
|
|
11
|
+
}>;
|
|
12
|
+
limit: number;
|
|
13
|
+
}
|
|
14
|
+
export declare function compileSqlContext(table: string, context: SqlContext, postgres: boolean): {
|
|
15
|
+
query: string;
|
|
16
|
+
params: unknown[];
|
|
17
|
+
};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.compileSqlContext = compileSqlContext;
|
|
4
|
+
function compileSqlContext(table, context, postgres) {
|
|
5
|
+
var _a;
|
|
6
|
+
const id = (value) => {
|
|
7
|
+
if (typeof value !== 'string' || !/^[A-Za-z_][A-Za-z0-9_]*$/.test(value))
|
|
8
|
+
throw new Error('Invalid SQL context identifier');
|
|
9
|
+
return postgres ? `"${value}"` : '`' + value + '`';
|
|
10
|
+
};
|
|
11
|
+
const aliases = new Set(['root']);
|
|
12
|
+
for (const join of context.joins || []) {
|
|
13
|
+
id(join.alias);
|
|
14
|
+
if (aliases.has(join.alias))
|
|
15
|
+
throw new Error('Duplicate SQL alias');
|
|
16
|
+
aliases.add(join.alias);
|
|
17
|
+
}
|
|
18
|
+
const field = (value) => {
|
|
19
|
+
if (typeof value !== 'string')
|
|
20
|
+
throw new Error('Invalid SQL field');
|
|
21
|
+
const parts = value.split('.');
|
|
22
|
+
if (parts.length !== 2 || !aliases.has(parts[0]))
|
|
23
|
+
throw new Error('Use alias.column for SQL fields');
|
|
24
|
+
return parts.map(id).join('.');
|
|
25
|
+
};
|
|
26
|
+
const params = [];
|
|
27
|
+
const where = (values) => {
|
|
28
|
+
if (!values || !Object.keys(values).length)
|
|
29
|
+
throw new Error('Explicit ownership predicates required');
|
|
30
|
+
return Object.entries(values).map(([key, value]) => {
|
|
31
|
+
if (value === null)
|
|
32
|
+
return `${field(key)} IS NULL`;
|
|
33
|
+
if (!['string', 'number', 'boolean'].includes(typeof value) || (typeof value === 'number' && !Number.isFinite(value)))
|
|
34
|
+
throw new Error('SQL context predicates require scalar values');
|
|
35
|
+
params.push(value);
|
|
36
|
+
return `${field(key)} = ${postgres ? '$' + params.length : '?'}`;
|
|
37
|
+
}).join(' AND ');
|
|
38
|
+
};
|
|
39
|
+
if (!context.select || !Object.keys(context.select).length || Object.keys(context.select).length > 100
|
|
40
|
+
|| !Number.isInteger(context.limit) || context.limit < 1 || context.limit > 100 || (((_a = context.joins) === null || _a === void 0 ? void 0 : _a.length) || 0) > 8)
|
|
41
|
+
throw new Error('SQL context bounds exceeded');
|
|
42
|
+
const select = Object.entries(context.select).map(([alias, column]) => `${field(column)} AS ${id(alias)}`).join(', ');
|
|
43
|
+
const joins = (context.joins || []).map(join => {
|
|
44
|
+
if (!join.on || !Object.keys(join.on).length || (join.kind && !['left', 'inner'].includes(join.kind)))
|
|
45
|
+
throw new Error('Invalid context join');
|
|
46
|
+
const on = Object.entries(join.on).map(([a, b]) => `${field(a)} = ${field(b)}`).join(' AND ');
|
|
47
|
+
return `${join.kind === 'inner' ? 'INNER' : 'LEFT'} JOIN ${id(join.table)} AS ${id(join.alias)} ON (${on}) AND (${where(join.where)})`;
|
|
48
|
+
}).join(' ');
|
|
49
|
+
return { query: `SELECT ${select} FROM ${id(table)} AS ${id('root')} ${joins} WHERE ${where(context.where)} LIMIT ${context.limit}`, params };
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=sql-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql-context.js","sourceRoot":"","sources":["../../src/database/sql-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,20 +4,24 @@
|
|
|
4
4
|
* Manages database transactions across different database adapters.
|
|
5
5
|
* Provides transaction creation, lifecycle management, and savepoint handling.
|
|
6
6
|
*/
|
|
7
|
+
import { IsolationLevel } from '../types/enums';
|
|
7
8
|
import { ITransactionOptions, ITransaction, ISavepoint, ITransactionCallback, ITransactionContext, TransactionStatus } from '../types/transaction.interface';
|
|
8
9
|
import { BaseAdapter } from '../adapters/base.adapter';
|
|
9
10
|
/**
|
|
10
11
|
* Transaction implementation
|
|
11
12
|
*/
|
|
12
13
|
declare class Transaction implements ITransaction {
|
|
14
|
+
private readonly onFinished?;
|
|
13
15
|
readonly id: string;
|
|
14
16
|
private _status;
|
|
15
17
|
private context;
|
|
16
18
|
private adapter;
|
|
17
19
|
private savepoints;
|
|
18
|
-
constructor(id: string, adapter: BaseAdapter, context: ITransactionContext);
|
|
20
|
+
constructor(id: string, adapter: BaseAdapter, context: ITransactionContext, onFinished?: () => void);
|
|
19
21
|
get status(): TransactionStatus;
|
|
20
22
|
get client(): any;
|
|
23
|
+
belongsTo(adapter: BaseAdapter): boolean;
|
|
24
|
+
get isolationLevel(): IsolationLevel;
|
|
21
25
|
commit(): Promise<void>;
|
|
22
26
|
rollback(): Promise<void>;
|
|
23
27
|
isActive(): boolean;
|
|
@@ -15,7 +15,8 @@ const database_error_1 = require("../utils/database-error");
|
|
|
15
15
|
* Transaction implementation
|
|
16
16
|
*/
|
|
17
17
|
class Transaction {
|
|
18
|
-
constructor(id, adapter, context) {
|
|
18
|
+
constructor(id, adapter, context, onFinished) {
|
|
19
|
+
this.onFinished = onFinished;
|
|
19
20
|
this._status = 'active';
|
|
20
21
|
this.savepoints = new Map();
|
|
21
22
|
this.id = id;
|
|
@@ -28,7 +29,10 @@ class Transaction {
|
|
|
28
29
|
get client() {
|
|
29
30
|
return this.context.client;
|
|
30
31
|
}
|
|
32
|
+
belongsTo(adapter) { return this.adapter === adapter; }
|
|
33
|
+
get isolationLevel() { return this.context.isolationLevel; }
|
|
31
34
|
async commit() {
|
|
35
|
+
var _a;
|
|
32
36
|
if (!this.isActive()) {
|
|
33
37
|
throw database_error_1.DatabaseError.transactionError(`Cannot commit transaction: transaction is ${this._status}`);
|
|
34
38
|
}
|
|
@@ -42,8 +46,12 @@ class Transaction {
|
|
|
42
46
|
this.context.status = 'error';
|
|
43
47
|
throw database_error_1.DatabaseError.transactionError(`Failed to commit transaction: ${error.message}`, error);
|
|
44
48
|
}
|
|
49
|
+
finally {
|
|
50
|
+
(_a = this.onFinished) === null || _a === void 0 ? void 0 : _a.call(this);
|
|
51
|
+
}
|
|
45
52
|
}
|
|
46
53
|
async rollback() {
|
|
54
|
+
var _a;
|
|
47
55
|
if (!this.isActive()) {
|
|
48
56
|
throw database_error_1.DatabaseError.transactionError(`Cannot rollback transaction: transaction is ${this._status}`);
|
|
49
57
|
}
|
|
@@ -57,6 +65,9 @@ class Transaction {
|
|
|
57
65
|
this.context.status = 'error';
|
|
58
66
|
throw database_error_1.DatabaseError.transactionError(`Failed to rollback transaction: ${error.message}`, error);
|
|
59
67
|
}
|
|
68
|
+
finally {
|
|
69
|
+
(_a = this.onFinished) === null || _a === void 0 ? void 0 : _a.call(this);
|
|
70
|
+
}
|
|
60
71
|
}
|
|
61
72
|
isActive() {
|
|
62
73
|
return this._status === 'active';
|
|
@@ -184,7 +195,7 @@ class TransactionManager {
|
|
|
184
195
|
const txContext = await adapter.beginTransaction(isolationLevel, options.readOnly, options.timeout);
|
|
185
196
|
context.client = txContext.client;
|
|
186
197
|
// Create transaction instance
|
|
187
|
-
const transaction = new Transaction(id, adapter, context);
|
|
198
|
+
const transaction = new Transaction(id, adapter, context, () => this.cleanupTransaction(id));
|
|
188
199
|
// Track active transaction
|
|
189
200
|
this.activeTransactions.set(id, context);
|
|
190
201
|
// Set timeout if specified
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transaction-manager.js","sourceRoot":"","sources":["../../../src/database/transactions/transaction-manager.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,+BAAoC;AACpC,0CAAiF;AASjF,2DAAwE;AACxE,4DAAwD;AAExD;;GAEG;AACH,MAAM,WAAW;IAOf,YACE,EAAU,EACV,OAAoB,EACpB,OAA4B;
|
|
1
|
+
{"version":3,"file":"transaction-manager.js","sourceRoot":"","sources":["../../../src/database/transactions/transaction-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,3 +13,4 @@ export { IActionDefinition, IActionTemplate, IActionOrderBy, IActionCreateOption
|
|
|
13
13
|
export { PreSaveOperationType, IPreSaveOperation, IPreSaveBaseOptions, IPreSaveEncryptOptions, IPreSaveHashOptions, IPreSaveMaskOptions, IPreSaveValidateOptions, IPreSaveTransformOptions, IPreSaveSlugOptions, IPreSaveTruncateOptions, IPreSaveRoundOptions, IPreSaveClampOptions, IPreSaveDefaultOptions, IPreSaveComputeOptions, IPreSaveSimpleOptions, IValidationRule, IValidationError, IPreSaveConfig, IPreSaveResult, IAppliedOperation, ISchemaPreSaveConfig, } from './presave.interface';
|
|
14
14
|
export { TriggerEvent, TriggerTiming, TriggerActionType, ConditionOperator, ITriggerActionBase, ITriggerDatabaseAction, ITriggerStorageAction, ITriggerNotificationAction, ITriggerBrokerAction, ITriggerCacheAction, ITriggerFeatureAction, ITriggerActionExecuteAction, ITriggerAgentAction, ITriggerResilienceAction, ITriggerLogAction, ITriggerSessionAction, ITriggerVectorAction, ITriggerCustomAction, ITriggerHttpAction, ITriggerAction, IConditionClause, ITriggerCondition, ITriggerContext, ITriggerRetry, ITriggerDefinition, ITriggerActionResult, ITriggerResult, ITriggerConfig, ISchemaTriggerConfig, } from './trigger.interface';
|
|
15
15
|
export { IFetchDatabaseDashboardOptions, IDatabaseDashboardMetrics, } from './dashboard.interface';
|
|
16
|
+
export type { IMongoPipelineOptions, IMongoPipelineResult } from './pipeline.interface';
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ITransaction } from './transaction.interface';
|
|
2
|
+
/** MongoDB read pipeline. Ownership predicates must be supplied for roots and lookups. */
|
|
3
|
+
export interface IMongoPipelineOptions {
|
|
4
|
+
product: string;
|
|
5
|
+
env: string;
|
|
6
|
+
database: string;
|
|
7
|
+
table: string;
|
|
8
|
+
pipeline: Record<string, unknown>[];
|
|
9
|
+
session?: string;
|
|
10
|
+
transaction?: ITransaction;
|
|
11
|
+
maxTimeMS?: number;
|
|
12
|
+
allowDiskUse?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface IMongoPipelineResult<T> {
|
|
15
|
+
data: T[];
|
|
16
|
+
/** Number of returned documents, not an independent total-count query. */
|
|
17
|
+
count: number;
|
|
18
|
+
}
|
|
19
|
+
export declare function validateReadPipeline(pipeline: unknown): asserts pipeline is Record<string, unknown>[];
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateReadPipeline = validateReadPipeline;
|
|
4
|
+
function validateReadPipeline(pipeline) {
|
|
5
|
+
if (!Array.isArray(pipeline))
|
|
6
|
+
throw new Error('MongoDB pipeline must be an array');
|
|
7
|
+
const visit = (value) => {
|
|
8
|
+
if (!value || typeof value !== 'object')
|
|
9
|
+
return;
|
|
10
|
+
for (const [key, child] of Object.entries(value)) {
|
|
11
|
+
if (key === '$out' || key === '$merge')
|
|
12
|
+
throw new Error('aggregatePipeline is read-only');
|
|
13
|
+
visit(child);
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
for (const stage of pipeline) {
|
|
17
|
+
if (!stage || typeof stage !== 'object' || Array.isArray(stage) || Object.keys(stage).length !== 1)
|
|
18
|
+
throw new Error('Each MongoDB pipeline stage must have exactly one operator');
|
|
19
|
+
visit(stage);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=pipeline.interface.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.interface.js","sourceRoot":"","sources":["../../../src/database/types/pipeline.interface.ts"],"names":[],"mappings":";;AAqBA,oDAcC;AAdD,SAAgB,oBAAoB,CAAC,QAAiB;IACpD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACnF,MAAM,KAAK,GAAG,CAAC,KAAc,EAAQ,EAAE;QACrC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO;QAChD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACjD,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,QAAQ;gBAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;YAC1F,KAAK,CAAC,KAAK,CAAC,CAAC;QACf,CAAC;IACH,CAAC,CAAC;IACF,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC7B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC;YAChG,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAChF,KAAK,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;AACH,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -235,6 +235,10 @@ export { AgentsService, AgentError, agentsService } from './agents';
|
|
|
235
235
|
export { AgentExecutor, AgentContext, ToolRegistry, MemoryManager, createLLMProvider, AnthropicProvider, OpenAIProvider, VectorServiceAdapter, createVectorStoreAdapter, createPineconeAdapter, createQdrantAdapter, createWeaviateAdapter, createMemoryAdapter, } from './agents';
|
|
236
236
|
export type { IAgentServiceConfig, IDefineAgentOptions, IDefinedAgent, IRunAgentOptions, IAgentExecutionResult, IDispatchAgentOptions, IDispatchAgentResult, ISendAgentSignalOptions, IAgentStatusOptions, IAgentState, IListAgentExecutionsOptions, IAgentExecutionListResult, IAgentTool, IAgentToolSchema, IToolParam, IToolCallResult, ILLMConfig, LLMProvider, IAgentMemoryConfig, IAgentTerminationConfig, IAgentStreamEvent, IAgentToolContext, IConversationMessage, ITokenUsage, AgentStatus, IHumanInLoopConfig, IApprovalRequest, IApprovalResponse, IMultiAgentWorkflow, MultiAgentMode, } from './agents';
|
|
237
237
|
export { deriveDatabaseActionOutputContract, validateDatabaseActionOutput } from './database';
|
|
238
|
+
export { AtomicBatchOptions, AtomicBatchOperation, AtomicBatchResult, AtomicBatchError } from './database/atomic-batch';
|
|
239
|
+
export type { IMongoPipelineOptions, IMongoPipelineResult } from './database/types/pipeline.interface';
|
|
240
|
+
export type { AtomicPipelineOptions, AtomicPipelineResult } from './database/atomic-pipeline';
|
|
241
|
+
export type { SqlContext } from './database/sql-context';
|
|
238
242
|
export type { IActionResult, IQueryActionResult, IInsertActionResult, IUpdateActionResult, IDeleteActionResult, IRawActionResult, IDatabaseActionSchemaNode, IDatabaseActionOutputContract, IDatabaseActionOutputValidation, IDatabaseTableColumnMetadata, } from './database';
|
|
239
243
|
export { StorageService, StorageError } from './storage';
|
|
240
244
|
export { uploadBlobToCloud, downloadBlobFromCloud, deleteBlobFromCloud, listBlobsInCloud, generateSignedUrl, } from './storage';
|
|
@@ -1831,6 +1835,8 @@ export default class Ductape implements IDuctape {
|
|
|
1831
1835
|
* await ductape.databases.connect({ env: 'dev', product: 'my-product', database: 'users-db' });
|
|
1832
1836
|
*/
|
|
1833
1837
|
databases: {
|
|
1838
|
+
/** Same-database atomic writes on supported MongoDB/SQL topologies. Not a warehouse Saga. */
|
|
1839
|
+
atomicBatch: (options: Parameters<DatabaseService["atomicBatch"]>[0]) => Promise<import("./database").AtomicBatchResult>;
|
|
1834
1840
|
/**
|
|
1835
1841
|
* Create/register a new database configuration
|
|
1836
1842
|
*/
|
|
@@ -1922,6 +1928,8 @@ export default class Ductape implements IDuctape {
|
|
|
1922
1928
|
/**
|
|
1923
1929
|
* Perform multiple aggregations in one query
|
|
1924
1930
|
*/
|
|
1931
|
+
aggregatePipeline: <T = Record<string, unknown>>(options: Parameters<DatabaseService["aggregatePipeline"]>[0]) => Promise<import("./database").IMongoPipelineResult<T>>;
|
|
1932
|
+
atomicPipeline: <T = Record<string, unknown>>(options: Parameters<DatabaseService["atomicPipeline"]>[0]) => Promise<import("./database/atomic-pipeline").AtomicPipelineResult<T>>;
|
|
1925
1933
|
aggregate: (options: Parameters<DatabaseService["aggregate"]>[0]) => Promise<import("./database").IAggregateResult>;
|
|
1926
1934
|
/**
|
|
1927
1935
|
* Begin a database transaction
|
|
@@ -4405,7 +4413,7 @@ export default class Ductape implements IDuctape {
|
|
|
4405
4413
|
refreshedAt?: number;
|
|
4406
4414
|
error?: string;
|
|
4407
4415
|
};
|
|
4408
|
-
connections: "
|
|
4416
|
+
connections: "ready" | "warming" | "degraded";
|
|
4409
4417
|
};
|
|
4410
4418
|
warmup: {
|
|
4411
4419
|
databases: {
|
package/dist/index.js
CHANGED
|
@@ -51,8 +51,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
51
51
|
};
|
|
52
52
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
53
53
|
exports.deriveDatabaseActionOutputContract = exports.createMemoryAdapter = exports.createWeaviateAdapter = exports.createQdrantAdapter = exports.createPineconeAdapter = exports.createVectorStoreAdapter = exports.VectorServiceAdapter = exports.OpenAIProvider = exports.AnthropicProvider = exports.createLLMProvider = exports.MemoryManager = exports.ToolRegistry = exports.AgentContext = exports.AgentExecutor = exports.agentsService = exports.AgentError = exports.AgentsService = exports.verifyInvocationSignature = exports.PORTABLE_FUNCTION_HTTP_PATH = exports.handlePortableFunctionHttpRequest = exports.PortableFunctionError = exports.PortableFunctionsRegistry = exports.portableFunctions = exports.defineFunctions = exports.defineFunction = exports.FeatureExecutor = exports.createFeature = exports.FeatureBuilder = exports.FeaturePublicationError = exports.featureService = exports.FeatureCompilationError = exports.FeatureError = exports.FeatureService = exports.GraphAdapterFactory = exports.MemgraphAdapter = exports.ArangoDBAdapter = exports.NeptuneAdapter = exports.Neo4jAdapter = exports.BaseGraphAdapter = exports.GraphError = exports.GraphSortOrder = exports.GraphFeature = exports.GraphErrorType = exports.GraphTransactionStatus = exports.GraphIsolationLevel = exports.NodeConstraintType = exports.NodeIndexType = exports.TraversalDirection = exports.GraphType = exports.GraphService = void 0;
|
|
54
|
-
exports.
|
|
55
|
-
exports.getAssetSchemas = exports.buildVpcConnectorRelayWebSocketUrl = exports.parseTcpEndpointFromUrl = exports.buildVpcConnectorTunnelAdapterOptions = exports.openVpcConnectorTunnelStream = exports.resolveCloudLinkedEnvConfig = exports.resolveCloudLinkedConfig = exports.CloudError = exports.CloudService = exports.mightContainSecrets = exports.findAllSecretReferences = exports.extractSecretKeys = exports.containsSecretReferences = exports.isSecretReference = exports.SecretResolutionError = void 0;
|
|
54
|
+
exports.SecretExpiredError = exports.SecretEnvironmentError = exports.SecretScopeError = exports.SecretNotFoundError = exports.SECRET_PATTERN_GLOBAL = exports.SECRET_PATTERN = exports.SecretsService = exports.VectorFeature = exports.VectorErrorType = exports.VectorIndexType = exports.DistanceMetric = exports.VectorDBType = exports.MemoryAdapter = exports.WeaviateAdapter = exports.QdrantAdapter = exports.PineconeAdapter = exports.BaseVectorAdapter = exports.VectorError = exports.VectorDatabaseService = exports.SmsProvider = exports.PushNotificationProvider = exports.NotificationChannelType = exports.notificationsService = exports.NotificationsService = exports.getSqsQueueUrl = exports.isValidSqsUrl = exports.parseEventString = exports.loadBrokerService = exports.GooglePubSubService = exports.RedisService = exports.SQSService = exports.KafkaService = exports.RabbitMQService = exports.BrokerError = exports.BrokersService = exports.CacheLogger = exports.cacheLogger = exports.CacheError = exports.CacheService = exports.SessionError = exports.SessionsService = exports.generateSignedUrl = exports.listBlobsInCloud = exports.deleteBlobFromCloud = exports.downloadBlobFromCloud = exports.uploadBlobToCloud = exports.StorageError = exports.StorageService = exports.AtomicBatchError = exports.validateDatabaseActionOutput = void 0;
|
|
55
|
+
exports.getAssetSchemas = exports.buildVpcConnectorRelayWebSocketUrl = exports.parseTcpEndpointFromUrl = exports.buildVpcConnectorTunnelAdapterOptions = exports.openVpcConnectorTunnelStream = exports.resolveCloudLinkedEnvConfig = exports.resolveCloudLinkedConfig = exports.CloudError = exports.CloudService = exports.mightContainSecrets = exports.findAllSecretReferences = exports.extractSecretKeys = exports.containsSecretReferences = exports.isSecretReference = exports.SecretResolutionError = exports.SecretRevokedError = void 0;
|
|
56
56
|
const appApi_service_1 = require("./api/services/appApi.service");
|
|
57
57
|
const userApi_service_1 = require("./api/services/userApi.service");
|
|
58
58
|
const workspaceApi_service_1 = require("./api/services/workspaceApi.service");
|
|
@@ -362,6 +362,8 @@ Object.defineProperty(exports, "createMemoryAdapter", { enumerable: true, get: f
|
|
|
362
362
|
var database_2 = require("./database");
|
|
363
363
|
Object.defineProperty(exports, "deriveDatabaseActionOutputContract", { enumerable: true, get: function () { return database_2.deriveDatabaseActionOutputContract; } });
|
|
364
364
|
Object.defineProperty(exports, "validateDatabaseActionOutput", { enumerable: true, get: function () { return database_2.validateDatabaseActionOutput; } });
|
|
365
|
+
var atomic_batch_1 = require("./database/atomic-batch");
|
|
366
|
+
Object.defineProperty(exports, "AtomicBatchError", { enumerable: true, get: function () { return atomic_batch_1.AtomicBatchError; } });
|
|
365
367
|
// Re-export Storage module types and classes
|
|
366
368
|
var storage_2 = require("./storage");
|
|
367
369
|
Object.defineProperty(exports, "StorageService", { enumerable: true, get: function () { return storage_2.StorageService; } });
|
|
@@ -2322,6 +2324,11 @@ class Ductape {
|
|
|
2322
2324
|
* await ductape.databases.connect({ env: 'dev', product: 'my-product', database: 'users-db' });
|
|
2323
2325
|
*/
|
|
2324
2326
|
this.databases = {
|
|
2327
|
+
/** Same-database atomic writes on supported MongoDB/SQL topologies. Not a warehouse Saga. */
|
|
2328
|
+
atomicBatch: async (options) => {
|
|
2329
|
+
const service = await this.createNewDatabaseService();
|
|
2330
|
+
return service.atomicBatch(options);
|
|
2331
|
+
},
|
|
2325
2332
|
// ==================== DATABASE CRUD OPERATIONS ====================
|
|
2326
2333
|
/**
|
|
2327
2334
|
* Create/register a new database configuration
|
|
@@ -2483,6 +2490,14 @@ class Ductape {
|
|
|
2483
2490
|
/**
|
|
2484
2491
|
* Perform multiple aggregations in one query
|
|
2485
2492
|
*/
|
|
2493
|
+
aggregatePipeline: async (options) => {
|
|
2494
|
+
const service = await this.createNewDatabaseService();
|
|
2495
|
+
return service.aggregatePipeline(options);
|
|
2496
|
+
},
|
|
2497
|
+
atomicPipeline: async (options) => {
|
|
2498
|
+
const service = await this.createNewDatabaseService();
|
|
2499
|
+
return service.atomicPipeline(options);
|
|
2500
|
+
},
|
|
2486
2501
|
aggregate: async (options) => {
|
|
2487
2502
|
const service = await this.createNewDatabaseService();
|
|
2488
2503
|
return service.aggregate(options);
|