@mwcp/kmore
Version:
midway component for knex, supports declarative transaction and OpenTelemetry
130 lines • 5.6 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 { App, ApplicationContext, Inject, Singleton, } from '@midwayjs/core';
import { TraceService } from '@mwcp/otel';
import { MConfig, getWebContext } from '@mwcp/share';
import { genError } from '@waiting/shared-core';
import { genCallerKey } from '../propagation/trx-status.helper.js';
import { TrxStatusService } from '../trx-status.service.js';
import { ConfigKey } from '../types.js';
import { DbHookBuilder } from './db-hook.builder.js';
import { DbHookTrx } from './db-hook.trx.js';
let DbHook = class DbHook {
sourceConfig;
app;
applicationContext;
appDir;
baseDir;
trxStatusSvc;
traceService;
dbHookBuilder;
dbHookTrx;
getDbConfigByDbId(dbId) {
assert(dbId);
const dbConfig = this.sourceConfig.dataSource[dbId];
return dbConfig;
}
getWebContext() {
return getWebContext(this.applicationContext);
}
getWebContextThenApp() {
try {
const webContext = getWebContext(this.applicationContext);
assert(webContext, 'getActiveContext() webContext should not be null, maybe this calling is not in a request context');
return webContext;
}
catch (ex) {
console.warn('getWebContextThenApp() failed', ex);
return this.app;
}
}
getTraceScopeByTrx(transaction) {
return transaction.kmoreTrxId;
}
// #region proxy
createProxy(db) {
// dbId is dbSourceName
this.trxStatusSvc.registerDbInstance(db.dbId, db);
db.hookList.builderPreHooks.unshift(this.dbHookBuilder.builderPreHooks.bind(this.dbHookBuilder));
db.hookList.builderPostHooks.unshift(this.dbHookBuilder.builderPostHook.bind(this.dbHookBuilder));
db.hookList.builderTransactingPostHooks.unshift(this.dbHookBuilder.builderTransactingPostHook.bind(this.dbHookBuilder));
db.hookList.responsePreHooks.unshift(this.dbHookBuilder.builderResultPreHook.bind(this.dbHookBuilder));
db.hookList.exceptionHooks.unshift(this.exceptionHook.bind(this));
db.hookList.transactionPreHooks.unshift(this.dbHookTrx.transactionPreHook.bind(this.dbHookTrx));
db.hookList.transactionPostHooks.unshift(this.dbHookTrx.transactionPostHook.bind(this.dbHookTrx));
db.hookList.beforeCommitHooks.push(this.dbHookTrx.beforeCommitHook.bind(this.dbHookTrx));
db.hookList.afterCommitHooks.unshift(this.dbHookTrx.afterCommitHook.bind(this.dbHookTrx));
db.hookList.beforeRollbackHooks.push(this.dbHookTrx.beforeRollbackHook.bind(this.dbHookTrx));
db.hookList.afterRollbackHooks.unshift(this.dbHookTrx.afterRollbackHook.bind(this.dbHookTrx));
}
// #region exception hooks
async exceptionHook(options) {
if (options.trxPropagated && options.trxPropagateOptions) {
const { kmore, builder, rowLockLevel } = options;
// if (! builder.scope) {
// builder.scope = this.getWebContext() ?? this.app
// }
if (rowLockLevel) {
// @FIXME
// this.trxStatusSvc.updateBuilderSpanRowlockLevelTag(kmoreQueryId, rowLockLevel)
void builder;
}
const { className, funcName } = options.trxPropagateOptions;
const callerKey = genCallerKey(className, funcName);
assert(callerKey, 'callerKey is empty');
const scope = this.getWebContextThenApp();
await this.trxStatusSvc.trxRollbackEntry(kmore.dbId, scope, callerKey);
}
const err = genError({ error: options.exception, altMessage: '[kmore-component] DbManager#exceptionHook' });
throw err;
}
};
__decorate([
MConfig(ConfigKey.config),
__metadata("design:type", Object)
], DbHook.prototype, "sourceConfig", void 0);
__decorate([
App(),
__metadata("design:type", Object)
], DbHook.prototype, "app", void 0);
__decorate([
ApplicationContext(),
__metadata("design:type", Object)
], DbHook.prototype, "applicationContext", void 0);
__decorate([
Inject(),
__metadata("design:type", String)
], DbHook.prototype, "appDir", void 0);
__decorate([
Inject(),
__metadata("design:type", String)
], DbHook.prototype, "baseDir", void 0);
__decorate([
Inject(),
__metadata("design:type", TrxStatusService)
], DbHook.prototype, "trxStatusSvc", void 0);
__decorate([
Inject(),
__metadata("design:type", TraceService)
], DbHook.prototype, "traceService", void 0);
__decorate([
Inject(),
__metadata("design:type", DbHookBuilder)
], DbHook.prototype, "dbHookBuilder", void 0);
__decorate([
Inject(),
__metadata("design:type", DbHookTrx)
], DbHook.prototype, "dbHookTrx", void 0);
DbHook = __decorate([
Singleton()
], DbHook);
export { DbHook };
//# sourceMappingURL=db-hook.js.map