UNPKG

@mwcp/kmore

Version:

midway component for knex, supports declarative transaction and OpenTelemetry

201 lines 8.4 kB
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