From 4dc20aff9541f968d689094c8cc38da5718e0c57 Mon Sep 17 00:00:00 2001 From: Xc Date: Wed, 17 Jul 2024 21:41:50 +0800 Subject: [PATCH] =?UTF-8?q?subscriber=E4=BF=AE=E6=94=B9=E4=BA=86sub?= =?UTF-8?q?=E5=92=8Cunsub=E7=9A=84=E6=8E=A5=E5=8F=A3=E5=BD=A2=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- es/components/filterPanel/index.js | 3 ++ es/features/subscriber.d.ts | 4 +-- es/features/subscriber.js | 41 ++++++++++++++---------- es/page.mp.js | 7 ++--- es/page.react.d.ts | 3 +- es/page.react.js | 7 ++--- es/types/Page.d.ts | 3 +- lib/features/subscriber.d.ts | 4 +-- lib/features/subscriber.js | 41 ++++++++++++++---------- lib/page.mp.js | 7 ++--- lib/page.react.d.ts | 3 +- lib/page.react.js | 7 ++--- lib/types/Page.d.ts | 3 +- src/components/filterPanel/index.ts | 3 ++ src/features/subscriber.ts | 49 +++++++++++++++++++---------- src/page.mp.ts | 8 ++--- src/page.react.tsx | 8 ++--- src/types/Page.ts | 4 +-- 18 files changed, 110 insertions(+), 95 deletions(-) diff --git a/es/components/filterPanel/index.js b/es/components/filterPanel/index.js index 019bd382..d1166484 100644 --- a/es/components/filterPanel/index.js +++ b/es/components/filterPanel/index.js @@ -2,6 +2,9 @@ import { assert } from 'oak-domain/lib/utils/assert'; import { getFilterName } from '../filter/utils'; export default OakComponent({ isList: true, + entity() { + return this.props.entity; + }, data: { isExpandContent: false, open: false, diff --git a/es/features/subscriber.d.ts b/es/features/subscriber.d.ts index 3808d80e..d1844c92 100644 --- a/es/features/subscriber.d.ts +++ b/es/features/subscriber.d.ts @@ -25,8 +25,8 @@ export declare class SubScriber extends private emit; private initSocketPoint; private connect; - sub(events: string[], moduleName: string, callback?: Callback): Promise; - unsub(events: string[], moduleName: string): Promise; + sub(events: string[], callback?: Callback): Promise<() => void>; + private unsub; getSubscriberId(): string | undefined; setHalted(halted: boolean): void; } diff --git a/es/features/subscriber.js b/es/features/subscriber.js index cc5c49b0..6f666052 100644 --- a/es/features/subscriber.js +++ b/es/features/subscriber.js @@ -82,9 +82,7 @@ export class SubScriber extends Feature { socket.on('data', (opRecords, event) => { const registered = this.eventMap[event]; if (registered) { - for (const moduleName in registered) { - registered[moduleName] && registered[moduleName](event, opRecords); - } + registered.callbacks.forEach((ele) => ele(event, opRecords)); } this.cache.sync(opRecords); }); @@ -122,27 +120,30 @@ export class SubScriber extends Feature { socket.connect(); }); } - async sub(events, moduleName, callback) { + async sub(events, callback) { const newEvents = []; events.forEach((event) => { const registered = this.eventMap[event]; if (registered) { - assert(!registered.hasOwnProperty(moduleName), `[subscriber]注册回调的事件${event}和moduleName${moduleName}发生重复`); - registered[moduleName] = callback; + if (callback) { + registered.callbacks.push(callback); + registered.count++; + } } else { this.eventMap[event] = { - [moduleName]: callback, + callbacks: callback ? [callback] : [], + count: 1, }; newEvents.push(event); } ; }); if (this.socketState === 'unconnected') { - return this.connect(); + await this.connect(); } else if (this.socketState === 'connected' && newEvents.length > 0) { - return new Promise((resolve, reject) => { + await new Promise((resolve, reject) => { this.socket.emit('sub', newEvents, (result) => { if (result) { this.message.setMessage({ @@ -158,18 +159,26 @@ export class SubScriber extends Feature { }); }); } + return () => { + this.unsub(events, callback); + }; } - async unsub(events, moduleName) { - const emptyEvents = []; + async unsub(events, callback) { + const invalidEvents = []; events.forEach((event) => { const registered = this.eventMap[event]; - assert(registered.hasOwnProperty(moduleName)); - unset(registered, moduleName); - if (Object.keys(registered).length === 0) { - emptyEvents.push(event); + assert(registered); + registered.count--; + if (registered.count > 0) { + if (callback) { + pull(registered.callbacks, callback); + } + } + else { + invalidEvents.push(event); } }); - emptyEvents.forEach(event => unset(this.eventMap, event)); + invalidEvents.forEach(event => unset(this.eventMap, event)); if (this.socketState === 'connected') { this.socket.emit('unsub', events); if (Object.keys(this.eventMap).length === 0) { diff --git a/es/page.mp.js b/es/page.mp.js index ec0fadbb..08004fd6 100644 --- a/es/page.mp.js +++ b/es/page.mp.js @@ -469,11 +469,8 @@ const oakBehavior = Behavior({ loadMissedLocales(key) { this.features.locales.loadMissedLocale(key); }, - subDataEvents(events, moduleName, callback) { - return this.features.subscriber.sub(events, moduleName, callback); - }, - unsubDataEvents(events, moduleName) { - return this.features.subscriber.unsub(events, moduleName); + subDataEvents(events, callback) { + return this.features.subscriber.sub(events, callback); }, }, observers: { diff --git a/es/page.react.d.ts b/es/page.react.d.ts index 698670b7..863df032 100644 --- a/es/page.react.d.ts +++ b/es/page.react.d.ts @@ -101,8 +101,7 @@ export declare function createComponent[]) => void): Promise; - unsubDataEvents(events: string[], moduleName: string): Promise; + subDataEvents(events: string[], callback: (event: string, opRecords: OpRecord[]) => void): Promise<() => void>; context: unknown; setState>(state: ComponentData | ((prevState: Readonly>, props: Readonly>) => ComponentData | Pick, K> | null) | Pick, K> | null, callback?: (() => void) | undefined): void; forceUpdate(callback?: (() => void) | undefined): void; diff --git a/es/page.react.js b/es/page.react.js index 50a4ab9e..7058ff78 100644 --- a/es/page.react.js +++ b/es/page.react.js @@ -368,11 +368,8 @@ class OakComponentBase extends React.PureComponent { this.features.runningTree.setCurrentPage(path2, currentPage); } } - subDataEvents(events, moduleName, callback) { - return this.features.subscriber.sub(events, moduleName, callback); - } - unsubDataEvents(events, moduleName) { - return this.features.subscriber.unsub(events, moduleName); + subDataEvents(events, callback) { + return this.features.subscriber.sub(events, callback); } } function translateListeners(listeners) { diff --git a/es/types/Page.d.ts b/es/types/Page.d.ts index ca35e7d0..792f1277 100644 --- a/es/types/Page.d.ts +++ b/es/types/Page.d.ts @@ -184,8 +184,7 @@ export type OakCommonComponentMethods Promise; aggregate: (aggregation: ED[T]['Aggregation']) => Promise>; - subDataEvents: (events: string[], moduleName: string, callback?: (event: string, opRecords: OpRecord[]) => void) => Promise; - unsubDataEvents: (events: string[], moduleName: string) => Promise; + subDataEvents: (events: string[], callback?: (event: string, opRecords: OpRecord[]) => void) => Promise<() => void>; }; export type OakSingleComponentMethods = { setId: (id: string) => void; diff --git a/lib/features/subscriber.d.ts b/lib/features/subscriber.d.ts index 3808d80e..d1844c92 100644 --- a/lib/features/subscriber.d.ts +++ b/lib/features/subscriber.d.ts @@ -25,8 +25,8 @@ export declare class SubScriber extends private emit; private initSocketPoint; private connect; - sub(events: string[], moduleName: string, callback?: Callback): Promise; - unsub(events: string[], moduleName: string): Promise; + sub(events: string[], callback?: Callback): Promise<() => void>; + private unsub; getSubscriberId(): string | undefined; setHalted(halted: boolean): void; } diff --git a/lib/features/subscriber.js b/lib/features/subscriber.js index 0e98de7f..231e9d7b 100644 --- a/lib/features/subscriber.js +++ b/lib/features/subscriber.js @@ -86,9 +86,7 @@ class SubScriber extends Feature_1.Feature { socket.on('data', (opRecords, event) => { const registered = this.eventMap[event]; if (registered) { - for (const moduleName in registered) { - registered[moduleName] && registered[moduleName](event, opRecords); - } + registered.callbacks.forEach((ele) => ele(event, opRecords)); } this.cache.sync(opRecords); }); @@ -126,27 +124,30 @@ class SubScriber extends Feature_1.Feature { socket.connect(); }); } - async sub(events, moduleName, callback) { + async sub(events, callback) { const newEvents = []; events.forEach((event) => { const registered = this.eventMap[event]; if (registered) { - (0, assert_1.assert)(!registered.hasOwnProperty(moduleName), `[subscriber]注册回调的事件${event}和moduleName${moduleName}发生重复`); - registered[moduleName] = callback; + if (callback) { + registered.callbacks.push(callback); + registered.count++; + } } else { this.eventMap[event] = { - [moduleName]: callback, + callbacks: callback ? [callback] : [], + count: 1, }; newEvents.push(event); } ; }); if (this.socketState === 'unconnected') { - return this.connect(); + await this.connect(); } else if (this.socketState === 'connected' && newEvents.length > 0) { - return new Promise((resolve, reject) => { + await new Promise((resolve, reject) => { this.socket.emit('sub', newEvents, (result) => { if (result) { this.message.setMessage({ @@ -162,18 +163,26 @@ class SubScriber extends Feature_1.Feature { }); }); } + return () => { + this.unsub(events, callback); + }; } - async unsub(events, moduleName) { - const emptyEvents = []; + async unsub(events, callback) { + const invalidEvents = []; events.forEach((event) => { const registered = this.eventMap[event]; - (0, assert_1.assert)(registered.hasOwnProperty(moduleName)); - (0, lodash_1.unset)(registered, moduleName); - if (Object.keys(registered).length === 0) { - emptyEvents.push(event); + (0, assert_1.assert)(registered); + registered.count--; + if (registered.count > 0) { + if (callback) { + (0, lodash_1.pull)(registered.callbacks, callback); + } + } + else { + invalidEvents.push(event); } }); - emptyEvents.forEach(event => (0, lodash_1.unset)(this.eventMap, event)); + invalidEvents.forEach(event => (0, lodash_1.unset)(this.eventMap, event)); if (this.socketState === 'connected') { this.socket.emit('unsub', events); if (Object.keys(this.eventMap).length === 0) { diff --git a/lib/page.mp.js b/lib/page.mp.js index e8e2b66c..6a83be92 100644 --- a/lib/page.mp.js +++ b/lib/page.mp.js @@ -472,11 +472,8 @@ const oakBehavior = Behavior({ loadMissedLocales(key) { this.features.locales.loadMissedLocale(key); }, - subDataEvents(events, moduleName, callback) { - return this.features.subscriber.sub(events, moduleName, callback); - }, - unsubDataEvents(events, moduleName) { - return this.features.subscriber.unsub(events, moduleName); + subDataEvents(events, callback) { + return this.features.subscriber.sub(events, callback); }, }, observers: { diff --git a/lib/page.react.d.ts b/lib/page.react.d.ts index 698670b7..863df032 100644 --- a/lib/page.react.d.ts +++ b/lib/page.react.d.ts @@ -101,8 +101,7 @@ export declare function createComponent[]) => void): Promise; - unsubDataEvents(events: string[], moduleName: string): Promise; + subDataEvents(events: string[], callback: (event: string, opRecords: OpRecord[]) => void): Promise<() => void>; context: unknown; setState>(state: ComponentData | ((prevState: Readonly>, props: Readonly>) => ComponentData | Pick, K> | null) | Pick, K> | null, callback?: (() => void) | undefined): void; forceUpdate(callback?: (() => void) | undefined): void; diff --git a/lib/page.react.js b/lib/page.react.js index 54680f0d..36acfe38 100644 --- a/lib/page.react.js +++ b/lib/page.react.js @@ -373,11 +373,8 @@ class OakComponentBase extends react_1.default.PureComponent { this.features.runningTree.setCurrentPage(path2, currentPage); } } - subDataEvents(events, moduleName, callback) { - return this.features.subscriber.sub(events, moduleName, callback); - } - unsubDataEvents(events, moduleName) { - return this.features.subscriber.unsub(events, moduleName); + subDataEvents(events, callback) { + return this.features.subscriber.sub(events, callback); } } function translateListeners(listeners) { diff --git a/lib/types/Page.d.ts b/lib/types/Page.d.ts index ca35e7d0..792f1277 100644 --- a/lib/types/Page.d.ts +++ b/lib/types/Page.d.ts @@ -184,8 +184,7 @@ export type OakCommonComponentMethods Promise; aggregate: (aggregation: ED[T]['Aggregation']) => Promise>; - subDataEvents: (events: string[], moduleName: string, callback?: (event: string, opRecords: OpRecord[]) => void) => Promise; - unsubDataEvents: (events: string[], moduleName: string) => Promise; + subDataEvents: (events: string[], callback?: (event: string, opRecords: OpRecord[]) => void) => Promise<() => void>; }; export type OakSingleComponentMethods = { setId: (id: string) => void; diff --git a/src/components/filterPanel/index.ts b/src/components/filterPanel/index.ts index 6ff993ee..08729ae6 100644 --- a/src/components/filterPanel/index.ts +++ b/src/components/filterPanel/index.ts @@ -6,6 +6,9 @@ import { RowWithActions, ReactComponentProps } from '../../types/Page'; export default OakComponent({ isList: true, + entity() { + return this.props.entity!; + }, data: { isExpandContent: false, open: false, diff --git a/src/features/subscriber.ts b/src/features/subscriber.ts index 55ee9ac5..160f2f4a 100644 --- a/src/features/subscriber.ts +++ b/src/features/subscriber.ts @@ -18,7 +18,10 @@ export class SubScriber extends Feature url: string; path: string; }>; - private eventMap: Record | undefined>> = {}; + private eventMap: Record[]; + count: number; + }> = {}; private url?: string; private path?: string; @@ -117,9 +120,9 @@ export class SubScriber extends Feature (opRecords: OpRecord[], event: string) => { const registered = this.eventMap[event]; if (registered) { - for (const moduleName in registered) { - registered[moduleName] && registered[moduleName]!(event, opRecords); - } + registered.callbacks.forEach( + (ele) => ele(event, opRecords) + ); } this.cache.sync(opRecords); } @@ -162,27 +165,30 @@ export class SubScriber extends Feature }); } - async sub(events: string[], moduleName: string, callback?: Callback): Promise { + async sub(events: string[], callback?: Callback): Promise<() => void> { const newEvents: string[] = []; events.forEach((event) => { const registered = this.eventMap[event]; if (registered) { - assert(!registered.hasOwnProperty(moduleName), `[subscriber]注册回调的事件${event}和moduleName${moduleName}发生重复`); - registered[moduleName] = callback; + if (callback) { + registered.callbacks.push(callback); + registered.count ++; + } } else { this.eventMap[event] = { - [moduleName]: callback, + callbacks: callback ? [callback] : [], + count: 1, }; newEvents.push(event); }; }); if (this.socketState === 'unconnected') { - return this.connect(); + await this.connect(); } else if (this.socketState === 'connected' && newEvents.length > 0) { - return new Promise( + await new Promise( (resolve, reject) => { this.socket!.emit('sub', newEvents, (result: string) => { if (result) { @@ -200,21 +206,30 @@ export class SubScriber extends Feature } ); } + + return () => { + this.unsub(events, callback); + }; } - async unsub(events: string[], moduleName: string) { - const emptyEvents: string[] = []; + private async unsub(events: string[], callback?: Callback) { + const invalidEvents: string[] = []; events.forEach( (event) => { const registered = this.eventMap[event]; - assert(registered!.hasOwnProperty(moduleName)); - unset(registered, moduleName); - if (Object.keys(registered).length === 0) { - emptyEvents.push(event); + assert(registered); + registered.count --; + if (registered.count > 0) { + if (callback) { + pull(registered.callbacks, callback); + } + } + else { + invalidEvents.push(event); } } ); - emptyEvents.forEach( + invalidEvents.forEach( event => unset(this.eventMap, event) ); diff --git a/src/page.mp.ts b/src/page.mp.ts index 17a6ae18..556df0ab 100644 --- a/src/page.mp.ts +++ b/src/page.mp.ts @@ -689,12 +689,8 @@ const oakBehavior = Behavior< this.features.locales.loadMissedLocale(key); }, - subDataEvents(events, moduleName, callback) { - return this.features.subscriber.sub(events, moduleName, callback); - }, - - unsubDataEvents(events, moduleName) { - return this.features.subscriber.unsub(events, moduleName); + subDataEvents(events, callback) { + return this.features.subscriber.sub(events, callback); }, }, observers: { diff --git a/src/page.react.tsx b/src/page.react.tsx index 049a7f92..259f782a 100644 --- a/src/page.react.tsx +++ b/src/page.react.tsx @@ -610,12 +610,8 @@ abstract class OakComponentBase< } } - subDataEvents(events: string[], moduleName: string, callback: (event: string, opRecords: OpRecord[]) => void) { - return this.features.subscriber.sub(events, moduleName, callback); - } - - unsubDataEvents(events: string[], moduleName: string) { - return this.features.subscriber.unsub(events, moduleName); + subDataEvents(events: string[], callback: (event: string, opRecords: OpRecord[]) => void) { + return this.features.subscriber.sub(events, callback); } } diff --git a/src/types/Page.ts b/src/types/Page.ts index e8de3ac7..fe5257b4 100644 --- a/src/types/Page.ts +++ b/src/types/Page.ts @@ -410,8 +410,8 @@ export type OakCommonComponentMethods< aggregate: ( aggregation: ED[T]['Aggregation'] ) => Promise>; - subDataEvents: (events: string[], moduleName: string, callback?: (event: string, opRecords: OpRecord[]) => void) => Promise; - unsubDataEvents: (events: string[], moduleName: string) => Promise; + subDataEvents: (events: string[], callback?: (event: string, opRecords: OpRecord[]) => void) => Promise<() => void>; + // unsubDataEvents: (events: string[], moduleName: string) => Promise; }; export type OakSingleComponentMethods = {