diff --git a/src/modules/qqbot/core/application/send/qqbot-send.service.ts b/src/modules/qqbot/core/application/send/qqbot-send.service.ts index 4240ee7..dc0a9be 100644 --- a/src/modules/qqbot/core/application/send/qqbot-send.service.ts +++ b/src/modules/qqbot/core/application/send/qqbot-send.service.ts @@ -18,7 +18,6 @@ import { import { QqbotRateLimitService } from './qqbot-rate-limit.service'; import { QqbotSendAttemptError } from './qqbot-send.error'; import { QqbotSendLog } from '../../infrastructure/persistence/send/qqbot-send-log.entity'; -import { QqbotReverseWsActionError } from '../../infrastructure/integration/connection/qqbot-reverse-ws.service'; import type { QqbotAccount } from '../../infrastructure/persistence/account/qqbot-account.entity'; import type { QqbotSendGroupDto, @@ -337,7 +336,7 @@ export class QqbotSendService { } private toStrictSendError(err: unknown, sendLogId: null | string) { - if (err instanceof QqbotReverseWsActionError) { + if (this.isReverseWsActionError(err)) { return new QqbotSendAttemptError({ code: err.code, message: err.message, @@ -353,6 +352,23 @@ export class QqbotSendService { }); } + /** + * 判断异常是否来自 OneBot 反向 WebSocket 动作,避免静态加载运行时服务形成循环依赖。 + * @param err - 待识别的异常。 + * @returns 是否为受支持的反向 WebSocket 动作异常。 + */ + private isReverseWsActionError( + err: unknown, + ): err is Error & { + code: 'onebot_disconnected' | 'onebot_timeout'; + } { + if (!(err instanceof Error) || err.name !== 'QqbotReverseWsActionError') { + return false; + } + const code = (err as Error & { code?: unknown }).code; + return code === 'onebot_disconnected' || code === 'onebot_timeout'; + } + private throwSendFailure( strict: boolean, err: unknown, diff --git a/test/modules/qqbot/core/qqbot-core-injection-cycle.spec.ts b/test/modules/qqbot/core/qqbot-core-injection-cycle.spec.ts new file mode 100644 index 0000000..57d3522 --- /dev/null +++ b/test/modules/qqbot/core/qqbot-core-injection-cycle.spec.ts @@ -0,0 +1,22 @@ +describe('QQBot core injection metadata', () => { + it('keeps the command sender dependency defined when the send service loads first', () => { + jest.isolateModules(() => { + const { QqbotSendService } = jest.requireActual< + typeof import('../../../../src/modules/qqbot/core/application/send/qqbot-send.service') + >( + '../../../../src/modules/qqbot/core/application/send/qqbot-send.service', + ); + const { QqbotCommandEngineService } = jest.requireActual< + typeof import('../../../../src/modules/qqbot/core/application/command/qqbot-command-engine.service') + >( + '../../../../src/modules/qqbot/core/application/command/qqbot-command-engine.service', + ); + const parameterTypes = Reflect.getMetadata( + 'design:paramtypes', + QqbotCommandEngineService, + ); + + expect(parameterTypes[4]).toBe(QqbotSendService); + }); + }); +});