From db5d4f4bb7db06f7c2b1ffafea6e7939cd81a2a6 Mon Sep 17 00:00:00 2001 From: AlphaFoxz <841958335@qq.com> Date: Thu, 14 Nov 2024 09:45:41 +0800 Subject: [PATCH] fix --- libs/domain-server/__tests__/common.test.ts | 10 ++-- libs/domain-server/__tests__/event.test.ts | 58 ++++++++++++++------ libs/domain-server/agg.ts | 6 +-- libs/domain-server/common.ts | 59 +++++++-------------- libs/domain-server/event.ts | 7 +-- libs/domain/__tests__/common.ts | 10 ++-- libs/domain/__tests__/event.test.ts | 58 ++++++++++++++------ libs/domain/agg.ts | 6 +-- libs/domain/common.ts | 59 +++++++-------------- libs/domain/event.ts | 7 +-- 10 files changed, 154 insertions(+), 126 deletions(-) diff --git a/libs/domain-server/__tests__/common.test.ts b/libs/domain-server/__tests__/common.test.ts index 454ffd5..f5fbd97 100644 --- a/libs/domain-server/__tests__/common.test.ts +++ b/libs/domain-server/__tests__/common.test.ts @@ -2,10 +2,14 @@ import { expect, it } from '@jest/globals' import { Utils } from '..' it('createPromiseCallback 成功', async () => { - const { promise, resolved, callback, error } = Utils.createPromiseCallback(() => {}) + const { promise, resolved, callback, error } = Utils.createPromiseCallback(() => { + const a = true + if (!a) { + return new Error('error') + } + }) callback() - const result = await promise + await promise expect(resolved.value).toBe(true) expect(error.value).toBe(undefined) - expect(result.success).toBe(true) }) diff --git a/libs/domain-server/__tests__/event.test.ts b/libs/domain-server/__tests__/event.test.ts index a94abad..28a2c68 100644 --- a/libs/domain-server/__tests__/event.test.ts +++ b/libs/domain-server/__tests__/event.test.ts @@ -1,6 +1,6 @@ import { it, expect } from '@jest/globals' import { createBroadcastEvent, createRequestEvent } from '../event' -import { ref, reactive } from '@vue/reactivity' +import { ref } from '@vue/reactivity' it('createChannelEvent 触发事件', async () => { function register() { @@ -46,40 +46,68 @@ it('createChannelEvent 函数的回调', async () => { }) it('createChannelEvent Promise的回调', async () => { - const listenerCounter = reactive([]) + const listenerCounter = ref(0) + let succeed = false + function createInitEvent() { + const event = createRequestEvent({}, (name: string) => { + if (name !== 'Andy') { + return new Error('incorrect name') + } + listenerCounter.value++ + succeed = true + }) + return event + } + const watchedEventsCounter = ref(0) + const initEvent = createInitEvent() + initEvent.toApi().watchPublishRequest(({ reply }) => { + watchedEventsCounter.value++ + reply('Andy') + }) + initEvent.toApi().watchPublishRequest(({ reply }) => { + watchedEventsCounter.value++ + reply('Andy') + }) + await initEvent.publishRequest({ name: 'Andy' }) + expect(succeed).toBe(true) + expect(listenerCounter.value).toBe(1) + expect(watchedEventsCounter.value).toBe(1) +}) + +it('createChannelEvent Promise的回调', async () => { + const listenerCounter = ref(0) let succeed = false function createInitEvent() { const name = ref('wong') - const event = createRequestEvent({ name }, (b: boolean) => { - listenerCounter.push('') - succeed = b - const start = Date.now() - while (Date.now() - start < 10) { - // 运行10ms + const event = createRequestEvent({ name }, (name: string) => { + if (name !== 'Andy') { + return new Error('incorrect name') } + listenerCounter.value++ + succeed = true }) return event } - const watchedEventsCounter = reactive([]) + const watchedEventsCounter = ref(0) const initEvent = createInitEvent() initEvent.toApi().watchPublishRequest(({ data, reply }) => { - watchedEventsCounter.push('') + watchedEventsCounter.value++ if (data.name === 'Andy') { succeed = true } - reply(true) + reply('Andy') }) initEvent.toApi().watchPublishRequest(({ data, reply }) => { - watchedEventsCounter.push('') + watchedEventsCounter.value++ if (data.name === 'Andy') { succeed = true } - reply(true) + reply('Andy') }) await initEvent.publishRequest({ name: 'Andy' }) expect(succeed).toBe(true) - expect(listenerCounter.length).toBe(1) - expect(watchedEventsCounter.length).toBe(1) + expect(listenerCounter.value).toBe(1) + expect(watchedEventsCounter.value).toBe(1) }) it('createBroadcastEvent Promise的回调', async () => { diff --git a/libs/domain-server/agg.ts b/libs/domain-server/agg.ts index 63051d2..2ab577b 100644 --- a/libs/domain-server/agg.ts +++ b/libs/domain-server/agg.ts @@ -17,7 +17,7 @@ import { DomainEvent, DomainRequestEvent, } from './event' -import { type Result, createPromiseCallback } from './common' +import { createPromiseCallback } from './common' type AddDestroyedEvent = keyof T extends never ? { destroyed: DomainBroadcastEvent<{}> } @@ -189,7 +189,7 @@ export function createUnmountableAgg< onCreated: (fn: () => void) => void onBeforeInitialize: (fn: () => void) => void initialized: ComputedRef - untilInitialized: Promise> + untilInitialized: Promise }) => { states?: STATES actions?: ACTIONS @@ -265,7 +265,7 @@ export function createAgg< onCreated: (fn: () => void) => void onBeforeInitialize: (fn: () => void) => void initialized: ComputedRef - untilInitialized: Promise> + untilInitialized: Promise }) => { states?: STATES actions?: ACTIONS diff --git a/libs/domain-server/common.ts b/libs/domain-server/common.ts index e2aa1ff..b932949 100644 --- a/libs/domain-server/common.ts +++ b/libs/domain-server/common.ts @@ -1,65 +1,46 @@ import { type Ref, ref } from '@vue/reactivity' -type InferPromiseResult any> = Exclude, Error> extends - | undefined - | null - | void - | unknown - ? { success: boolean; value: undefined; error?: Error } - : { success: boolean; value: ReturnType['value']; error?: Error } - -export type Result = { success: boolean; error?: Error; value?: T } - -export function createPromiseCallback< - V, - CALLBACK extends (...args: any[]) => { value?: V; error?: Error } | void, - R = ReturnType ->( - callback: CALLBACK +export function createPromiseCallback Error | void>( + callback: CALLBACK, + stopOnError: boolean = true ): { - promise: Promise> + promise: Promise callback: CALLBACK resolved: Ref error: Ref } { const errorRef = ref() - let result: Result + let result: Error | true const resolvedRef = ref(false) let resolveEffect: Function = () => {} const proxyResolve = new Proxy(callback, { apply: function (target: CALLBACK, _thisArg: any, argumentsList: any[]) { let r = target(...argumentsList) - result = r as R & { success: boolean } - if (r === undefined || Object.keys(r).length === 0) { - result = { success: true } as R & { success: boolean } - } else if (r.error) { - errorRef.value = r.error - result.success = false - } else if (r.value) { - result.success = true - } - if (result.success) { + if (r instanceof Error) { + errorRef.value = r + result = r + } else { resolvedRef.value = true errorRef.value = undefined + result = true } - resolveEffect(result) - return result + resolveEffect() }, }) as CALLBACK - const promise = new Promise>((res, rej) => { - if (resolvedRef.value) { - res(result as InferPromiseResult) + const promise = new Promise((res, rej) => { + if (stopOnError && result instanceof Error) { + rej(result) return - } else if (errorRef.value) { - rej(errorRef.value) + } else if (result === true) { + res() return } resolveEffect = () => { - if (resolvedRef.value) { - res(result as InferPromiseResult) + if (stopOnError && result instanceof Error) { + rej(result) return - } else if (errorRef.value) { - rej(errorRef.value) + } else if (result === true) { + res() return } } diff --git a/libs/domain-server/event.ts b/libs/domain-server/event.ts index 93e6070..1e9291e 100644 --- a/libs/domain-server/event.ts +++ b/libs/domain-server/event.ts @@ -13,7 +13,7 @@ import { createPromiseCallback } from './common' export type DomainEventData = { [key: string]: any } -export type DomainRequestEventCallback = (...args: any[]) => { value?: T; error?: Error } | void +export type DomainRequestEventCallback = (...args: any[]) => void | Error export type DomainEvent = | DomainRequestEvent @@ -29,7 +29,8 @@ export type DomainBroadcastEvent = ReturnType( _: DATA, - reply: REPLY + reply: REPLY, + stopOnError = true ) { let version = shallowRef('0') const map: Record< @@ -88,7 +89,7 @@ export function createRequestEvent) => { - const { promise, callback: res, resolved, error } = createPromiseCallback(reply) + const { promise, callback: res, resolved, error } = createPromiseCallback(reply, stopOnError) updateEvent(data, res, resolved, error) await promise } diff --git a/libs/domain/__tests__/common.ts b/libs/domain/__tests__/common.ts index 454ffd5..f5fbd97 100644 --- a/libs/domain/__tests__/common.ts +++ b/libs/domain/__tests__/common.ts @@ -2,10 +2,14 @@ import { expect, it } from '@jest/globals' import { Utils } from '..' it('createPromiseCallback 成功', async () => { - const { promise, resolved, callback, error } = Utils.createPromiseCallback(() => {}) + const { promise, resolved, callback, error } = Utils.createPromiseCallback(() => { + const a = true + if (!a) { + return new Error('error') + } + }) callback() - const result = await promise + await promise expect(resolved.value).toBe(true) expect(error.value).toBe(undefined) - expect(result.success).toBe(true) }) diff --git a/libs/domain/__tests__/event.test.ts b/libs/domain/__tests__/event.test.ts index ddd238b..ec5a2c0 100644 --- a/libs/domain/__tests__/event.test.ts +++ b/libs/domain/__tests__/event.test.ts @@ -1,6 +1,6 @@ import { it, expect } from '@jest/globals' import { createBroadcastEvent, createRequestEvent } from '../event' -import { ref, reactive } from 'vue' +import { ref } from 'vue' it('createChannelEvent 触发事件', async () => { function register() { @@ -46,40 +46,68 @@ it('createChannelEvent 函数的回调', async () => { }) it('createChannelEvent Promise的回调', async () => { - const listenerCounter = reactive([]) + const listenerCounter = ref(0) + let succeed = false + function createInitEvent() { + const event = createRequestEvent({}, (name: string) => { + if (name !== 'Andy') { + return new Error('incorrect name') + } + listenerCounter.value++ + succeed = true + }) + return event + } + const watchedEventsCounter = ref(0) + const initEvent = createInitEvent() + initEvent.toApi().watchPublishRequest(({ reply }) => { + watchedEventsCounter.value++ + reply('Andy') + }) + initEvent.toApi().watchPublishRequest(({ reply }) => { + watchedEventsCounter.value++ + reply('Andy') + }) + await initEvent.publishRequest({ name: 'Andy' }) + expect(succeed).toBe(true) + expect(listenerCounter.value).toBe(1) + expect(watchedEventsCounter.value).toBe(1) +}) + +it('createChannelEvent Promise的回调', async () => { + const listenerCounter = ref(0) let succeed = false function createInitEvent() { const name = ref('wong') - const event = createRequestEvent({ name }, (b: boolean) => { - listenerCounter.push('') - succeed = b - const start = Date.now() - while (Date.now() - start < 10) { - // 运行10ms + const event = createRequestEvent({ name }, (name: string) => { + if (name !== 'Andy') { + return new Error('incorrect name') } + listenerCounter.value++ + succeed = true }) return event } - const watchedEventsCounter = reactive([]) + const watchedEventsCounter = ref(0) const initEvent = createInitEvent() initEvent.toApi().watchPublishRequest(({ data, reply }) => { - watchedEventsCounter.push('') + watchedEventsCounter.value++ if (data.name === 'Andy') { succeed = true } - reply(true) + reply('Andy') }) initEvent.toApi().watchPublishRequest(({ data, reply }) => { - watchedEventsCounter.push('') + watchedEventsCounter.value++ if (data.name === 'Andy') { succeed = true } - reply(true) + reply('Andy') }) await initEvent.publishRequest({ name: 'Andy' }) expect(succeed).toBe(true) - expect(listenerCounter.length).toBe(1) - expect(watchedEventsCounter.length).toBe(1) + expect(listenerCounter.value).toBe(1) + expect(watchedEventsCounter.value).toBe(1) }) it('createBroadcastEvent Promise的回调', async () => { diff --git a/libs/domain/agg.ts b/libs/domain/agg.ts index 7d3ffa1..ca958b0 100644 --- a/libs/domain/agg.ts +++ b/libs/domain/agg.ts @@ -17,7 +17,7 @@ import { DomainEvent, DomainRequestEvent, } from './event' -import { type Result, createPromiseCallback } from './common' +import { createPromiseCallback } from './common' type AddDestroyedEvent = keyof T extends never ? { destroyed: DomainBroadcastEvent<{}> } @@ -189,7 +189,7 @@ export function createUnmountableAgg< onCreated: (fn: () => void) => void onBeforeInitialize: (fn: () => void) => void initialized: ComputedRef - untilInitialized: Promise> + untilInitialized: Promise }) => { states?: STATES actions?: ACTIONS @@ -265,7 +265,7 @@ export function createAgg< onCreated: (fn: () => void) => void onBeforeInitialize: (fn: () => void) => void initialized: ComputedRef - untilInitialized: Promise> + untilInitialized: Promise }) => { states?: STATES actions?: ACTIONS diff --git a/libs/domain/common.ts b/libs/domain/common.ts index a46868c..5bf9068 100644 --- a/libs/domain/common.ts +++ b/libs/domain/common.ts @@ -1,65 +1,46 @@ import { type Ref, ref } from 'vue' -type InferPromiseResult any> = Exclude, Error> extends - | undefined - | null - | void - | unknown - ? { success: boolean; value: undefined; error?: Error } - : { success: boolean; value: ReturnType['value']; error?: Error } - -export type Result = { success: boolean; error?: Error; value?: T } - -export function createPromiseCallback< - V, - CALLBACK extends (...args: any[]) => { value?: V; error?: Error } | void, - R = ReturnType ->( - callback: CALLBACK +export function createPromiseCallback Error | void>( + callback: CALLBACK, + stopOnError: boolean = true ): { - promise: Promise> + promise: Promise callback: CALLBACK resolved: Ref error: Ref } { const errorRef = ref() - let result: Result + let result: Error | true const resolvedRef = ref(false) let resolveEffect: Function = () => {} const proxyResolve = new Proxy(callback, { apply: function (target: CALLBACK, _thisArg: any, argumentsList: any[]) { let r = target(...argumentsList) - result = r as R & { success: boolean } - if (r === undefined || Object.keys(r).length === 0) { - result = { success: true } as R & { success: boolean } - } else if (r.error) { - errorRef.value = r.error - result.success = false - } else if (r.value) { - result.success = true - } - if (result.success) { + if (r instanceof Error) { + errorRef.value = r + result = r + } else { resolvedRef.value = true errorRef.value = undefined + result = true } - resolveEffect(result) - return result + resolveEffect() }, }) as CALLBACK - const promise = new Promise>((res, rej) => { - if (resolvedRef.value) { - res(result as InferPromiseResult) + const promise = new Promise((res, rej) => { + if (stopOnError && result instanceof Error) { + rej(result) return - } else if (errorRef.value) { - rej(errorRef.value) + } else if (result === true) { + res() return } resolveEffect = () => { - if (resolvedRef.value) { - res(result as InferPromiseResult) + if (stopOnError && result instanceof Error) { + rej(result) return - } else if (errorRef.value) { - rej(errorRef.value) + } else if (result === true) { + res() return } } diff --git a/libs/domain/event.ts b/libs/domain/event.ts index 12947ea..656a421 100644 --- a/libs/domain/event.ts +++ b/libs/domain/event.ts @@ -13,7 +13,7 @@ import { createPromiseCallback } from './common' export type DomainEventData = { [key: string]: any } -export type DomainRequestEventCallback = (...args: any[]) => { value?: T; error?: Error } | void +export type DomainRequestEventCallback = (...args: any[]) => void | Error export type DomainEvent = | DomainRequestEvent @@ -29,7 +29,8 @@ export type DomainBroadcastEvent = ReturnType( _: DATA, - reply: REPLY + reply: REPLY, + stopOnError = true ) { let version = shallowRef('0') const map: Record< @@ -88,7 +89,7 @@ export function createRequestEvent) => { - const { promise, callback: res, resolved, error } = createPromiseCallback(reply) + const { promise, callback: res, resolved, error } = createPromiseCallback(reply, stopOnError) updateEvent(data, res, resolved, error) await promise }