UNPKG

@mwcp/kmore

Version:

midway component for knex, supports declarative transaction and OpenTelemetry

248 lines 9.8 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 { 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