@mwcp/kmore
Version:
midway component for knex, supports declarative transaction and OpenTelemetry
201 lines • 8.4 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 { TraceLog, TraceService } from '@mwcp/otel';
import { MConfig, getWebContext } from '@mwcp/share';
import { eventNeedTrace, genCommonAttr } from '../trace.helper.js';
import { TrxStatusService } from '../trx-status.service.js';
import { ConfigKey, KmoreAttrNames } from '../types.js';
let DbHookBuilder = class DbHookBuilder {
sourceConfig;
app;
applicationContext;
appDir;
baseDir;
trxStatusSvc;
traceService;
// #region builderPreHooks
builderPreHooks(options) {
this.builderPrePropagating(options);
}
// #region builderPostHooks
async builderPostHook(options) {
await this.builderPostPropagating(options);
}
builderPrePropagating(options) {
const { kmore, builder } = options;
if (!builder.scope) {
builder.scope = this.getWebContext();
}
if (!builder.scope) {
builder.scope = this.app;
}
if (builder.trxPropagated) {
return;
}
/* Call stack in bindBuilderPropagationData():
1 - TrxStatusService.bindBuilderPropagationData(trx-status.service.ts: 389)
2 - DbSourceManager.builderPrePropagating(db- source-manager.ts: 377)
3 - DbSourceManager.builderPreProcessor(db-source-manager.ts: 378)
4 - <anonymous>(builder.index.js: 67)
5 - extRefTableFnProperty(builder.index.js: 64)
6 - tb_user(builder.index.js: 28)
7 - UserRepo6.getUsers(70c.cache.repo.ts: 78) <-- call from here 6+1
8 - Clz.<computed>(aspectService.js: 92)
*/
/*
1 - TrxStatusService.bindBuilderPropagationData (trx-status.service.ts:318)
2 - DbSourceManager.builderPrePropagating (db-source-manager.ts:404)
3 - DbSourceManager.builderPreProcessor (db-source-manager.ts:377)
4 - <anonymous> (builder.index.js:62)
5 - createQueryBuilder (builder.index.js:59)
6 - tb_user (builder.index.js:27)
7 - TrxRepo._update (101/101r.middle-trx-auto-action.repo.ts:46) <-- call from here 6+1
8 - TrxRepo.commit (101/101r.middle-trx-auto-action.repo.ts:33)
*/
/*
1 - TrxStatusService.bindBuilderPropagationData(src\lib\trx-status.service.ts: 342)
2 - DbHookBuilder.builderPrePropagating(src\lib\db-hook\db-hook.builder.ts: 87)
3 - DbHookBuilder.builderPreHooks(src\lib\db-hook\db-hook.builder.ts: 44)
4 - <anonymous>(kmore\dist\lib\builder\builder.index.js: 57)
5 - createQueryBuilder(kmore\dist\lib\builder\builder.index.js: 55)
6 - tb_user(kmore\dist\lib\builder\builder.index.js: 25)
7 - TransactionalSimpleRepo.getUserOne(test\fixtures\base-app\src\transactional\30\30r.transactional - simple.repo.ts: 51)
8 - Clz.<computed>(kmore\node_modules\@midwayjs\core\dist\service\aspectService.js: 92)
9 - process.processTicksAndRejections(<node_internals> /internal/process / task_queues: 105)
10 - await(未知源: 0)
11 - user(test\fixtures\base - app\src\transactional\30\30r.transactional - simple.repo.ts: 33)
*/
this.trxStatusSvc.bindBuilderPropagationData(kmore.dbId, builder, 5);
}
async builderPostPropagating(options) {
const { builder } = options;
if (!builder.scope) {
builder.scope = this.getWebContext();
}
if (builder.trxPropagated) {
return;
}
await this.trxStatusSvc.propagating({
builder,
db: options.kmore,
});
}
// #region builderResultPreHook
async builderResultPreHook(options) {
if (options.kmoreTrxId && options.trxPropagated && options.trxPropagateOptions) {
const { builder, rowLockLevel } = options;
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 tkey = this.trxStatusSvc.retrieveUniqueTopCallerKey(callerKey)
}
}
// #region builderTransactingPostHook
builderTransactingPostHook(options) {
void options;
}
getTrxTraceScopeByQueryId(db, queryId) {
const trx = db.getTrxByQueryId(queryId);
return trx?.kmoreTrxId;
}
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;
}
};
__decorate([
MConfig(ConfigKey.config),
__metadata("design:type", Object)
], DbHookBuilder.prototype, "sourceConfig", void 0);
__decorate([
App(),
__metadata("design:type", Object)
], DbHookBuilder.prototype, "app", void 0);
__decorate([
ApplicationContext(),
__metadata("design:type", Object)
], DbHookBuilder.prototype, "applicationContext", void 0);
__decorate([
Inject(),
__metadata("design:type", String)
], DbHookBuilder.prototype, "appDir", void 0);
__decorate([
Inject(),
__metadata("design:type", String)
], DbHookBuilder.prototype, "baseDir", void 0);
__decorate([
Inject(),
__metadata("design:type", TrxStatusService)
], DbHookBuilder.prototype, "trxStatusSvc", void 0);
__decorate([
Inject(),
__metadata("design:type", TraceService
// #region builderPreHooks
)
], DbHookBuilder.prototype, "traceService", void 0);
__decorate([
TraceLog({
after([options]) {
const dbConfig = this.getDbConfigByDbId(options.kmore.dbId);
if (dbConfig && !eventNeedTrace(KmoreAttrNames.BuilderTransacting, dbConfig)) {
return;
}
const { builder } = options;
// @ts-expect-error builder._method
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
let method = builder._method ?? 'unknown';
if (method === 'del') {
method = 'delete';
}
// @ts-ignore
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access
const table = builder._single?.table ?? '';
const events = genCommonAttr(KmoreAttrNames.BuilderTransacting, {
kmoreQueryId: builder.kmoreQueryId.toString(),
method,
table,
});
return { events };
},
}),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", void 0)
], DbHookBuilder.prototype, "builderTransactingPostHook", null);
DbHookBuilder = __decorate([
Singleton()
], DbHookBuilder);
export { DbHookBuilder };
//# sourceMappingURL=db-hook.builder.js.map