@mwcp/kmore
Version:
midway component for knex, supports declarative transaction and OpenTelemetry
248 lines • 9.8 kB
JavaScript
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
import assert from 'node:assert';
import { relative } from 'node:path';
import { App, ApplicationContext, Inject, Singleton, } from '@midwayjs/core';
import { AttrNames, Trace, TraceLog, TraceService, } from '@mwcp/otel';
import { MConfig, getWebContext } from '@mwcp/share';
import { genKmoreTrxId, } from 'kmore';
import { genCommonAttr } from '../trace.helper.js';
import { TrxStatusService } from '../trx-status.service.js';
import { ConfigKey, KmoreAttrNames } from '../types.js';
import { processTrxCommitAndRollback } from './db-hook.trx.helper.js';
let DbHookTrx = class DbHookTrx {
sourceConfig;
app;
applicationContext;
appDir;
baseDir;
trxStatusSvc;
traceService;
getDbConfigByDbId(dbId) {
assert(dbId);
const dbConfig = this.sourceConfig.dataSource[dbId];
return dbConfig;
}
getWebContext() {
return getWebContext(this.applicationContext);
}
getTraceScopeByTrx(transaction) {
return transaction.kmoreTrxId;
}
// #region transactionPreHook
async transactionPreHook(options) {
const { traceContext } = options;
if (traceContext) {
return { traceContext }; // necessary for update trace context correctly
}
return;
}
// #region transactionPostHook
async transactionPostHook(options) {
const { trx } = options;
assert(trx.scope, 'transactionPostHook() trx.scope is empty');
}
// #region beforeCommit
async beforeCommitHook(options) {
void options;
}
// #region afterCommit
async afterCommitHook(options) {
void options;
}
// #region beforeRollback
async beforeRollbackHook(options) {
void options;
}
// #region afterRollback
async afterRollbackHook(options) {
void options;
}
};
__decorate([
MConfig(ConfigKey.config),
__metadata("design:type", Object)
], DbHookTrx.prototype, "sourceConfig", void 0);
__decorate([
App(),
__metadata("design:type", Object)
], DbHookTrx.prototype, "app", void 0);
__decorate([
ApplicationContext(),
__metadata("design:type", Object)
], DbHookTrx.prototype, "applicationContext", void 0);
__decorate([
Inject(),
__metadata("design:type", String)
], DbHookTrx.prototype, "appDir", void 0);
__decorate([
Inject(),
__metadata("design:type", String)
], DbHookTrx.prototype, "baseDir", void 0);
__decorate([
Inject(),
__metadata("design:type", TrxStatusService)
], DbHookTrx.prototype, "trxStatusSvc", void 0);
__decorate([
Inject(),
__metadata("design:type", TraceService)
], DbHookTrx.prototype, "traceService", void 0);
__decorate([
Trace({
autoEndSpan: false, // end span in DbHook.afterCommitHook/afterRollbackHook
spanName([options]) {
const { kmore, config } = options;
if (!config.kmoreTrxId) {
const entryKey = config.trxPropagateOptions?.entryKey ?? '';
const kmoreTrxId = genKmoreTrxId(`trx-${kmore.dbId}-`, entryKey);
config.kmoreTrxId = kmoreTrxId;
}
const dbSourceName = options.kmore.dbId;
return `Kmore ${dbSourceName} transaction`;
},
before([options], decoratorContext) {
options.traceContext = decoratorContext.traceContext ?? this.traceService.getActiveContext(); // necessary for update trace context correctly
return null;
},
after([options], _res, decoratorContext) {
const { kmore, config } = options;
if (!config.kmoreTrxId) {
const entryKey = config.trxPropagateOptions?.entryKey ?? '';
const kmoreTrxId = genKmoreTrxId(`trx-${kmore.dbId}-`, entryKey);
config.kmoreTrxId = kmoreTrxId;
}
const { kmoreTrxId } = config;
assert(config.kmoreTrxId, 'transactionPreHook() after: kmoreTrxId is empty');
const activeTraceCtx = decoratorContext.traceContext ?? this.traceService.getActiveContext();
assert(activeTraceCtx, 'transactionPostHook() before: activeTraceCtx is empty');
this.trxStatusSvc.setTraceContextByScope(kmoreTrxId, activeTraceCtx);
if (!config.scope) {
config.scope = this.getWebContext() ?? this.app;
}
const events = genCommonAttr(KmoreAttrNames.TrxCreateStart);
const attrs = {
dbId: kmore.dbId,
kmoreTrxId: kmoreTrxId.toString(),
};
return { attrs, events };
},
}),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", Promise)
], DbHookTrx.prototype, "transactionPreHook", null);
__decorate([
TraceLog({
before([options]) {
const { kmore, config, trx } = options;
const { kmoreTrxId } = config;
assert(kmoreTrxId, 'transactionPostHook() kmoreTrxId is empty');
let attrs = {
dbId: kmore.dbId,
kmoreTrxId: kmoreTrxId.toString(),
};
const { trxPropagateOptions } = trx;
if (trxPropagateOptions) {
const path = trxPropagateOptions.path
? relative(this.appDir, trxPropagateOptions.path.replace(/^file:\/{3}/u, '')).replaceAll('\\', '/')
: '';
const attrs2 = {
[AttrNames.TrxPropagationType]: trxPropagateOptions.type,
[AttrNames.TrxPropagationClass]: trxPropagateOptions.className,
[AttrNames.TrxPropagationFunc]: trxPropagateOptions.funcName,
[AttrNames.TrxPropagationPath]: path,
[AttrNames.TrxPropagationReadRowLockLevel]: trxPropagateOptions.readRowLockLevel,
[AttrNames.TrxPropagationWriteRowLockLevel]: trxPropagateOptions.writeRowLockLevel,
};
attrs = Object.assign(attrs, attrs2);
}
const events = genCommonAttr(KmoreAttrNames.TrxCreateEnd);
return { attrs, events };
},
}),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", Promise)
], DbHookTrx.prototype, "transactionPostHook", null);
__decorate([
TraceLog({
after([options]) {
const activeTraceCtx = this.traceService.getActiveContext();
void activeTraceCtx;
const { kmore, trx } = options;
const events = genCommonAttr(KmoreAttrNames.TrxCommitStart, {
dbId: kmore.dbId,
kmoreTrxId: trx.kmoreTrxId.toString(),
});
return { events };
},
}),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", Promise)
], DbHookTrx.prototype, "beforeCommitHook", null);
__decorate([
TraceLog({
before([options], decoratorContext) {
if (!decoratorContext.traceScope) {
decoratorContext.traceScope = this.getTraceScopeByTrx(options.trx);
}
const data = {
eventName: KmoreAttrNames.TrxCommitEnd,
hook: 'afterCommitHook',
stage: 'before',
op: 'commit',
};
return processTrxCommitAndRollback(options, decoratorContext, data);
},
}),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", Promise)
], DbHookTrx.prototype, "afterCommitHook", null);
__decorate([
TraceLog({
after([options]) {
const { kmore, trx } = options;
const events = genCommonAttr(KmoreAttrNames.TrxRollbackStart, {
dbId: kmore.dbId,
kmoreTrxId: trx.kmoreTrxId.toString(),
});
return { events };
},
}),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", Promise)
], DbHookTrx.prototype, "beforeRollbackHook", null);
__decorate([
TraceLog({
before([options], decoratorContext) {
if (!decoratorContext.traceScope) {
decoratorContext.traceScope = this.getTraceScopeByTrx(options.trx);
}
const data = {
eventName: KmoreAttrNames.TrxRollbackEnd,
hook: 'afterRollbackHook',
stage: 'before',
op: 'rollback',
};
return processTrxCommitAndRollback(options, decoratorContext, data);
},
}),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", Promise)
], DbHookTrx.prototype, "afterRollbackHook", null);
DbHookTrx = __decorate([
Singleton()
], DbHookTrx);
export { DbHookTrx };
//# sourceMappingURL=db-hook.trx.js.map