UNPKG

@mwcp/kmore

Version:

midway component for knex, supports declarative transaction and OpenTelemetry

130 lines 5.6 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 { 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