@@ -2,14 +2,79 @@ import {log, isFunction, isString} from '../utils';
22import { fxData , _require } from '../core' ;
33import i18n from '../i18n' ;
44import Dispatcher from './dispatcher' ;
5+ import { getDecoratorToken } from '../command/decorator' ;
6+ import assert from 'assert' ;
57
68export default class MessageDispatcher extends Dispatcher {
79 _dispatchingListeners = [ ]
810 _dispatchFailedListeners = [ ]
911 _dispatchedListeners = [ ]
1012
11- getHandlers ( module , name ) {
12- return Object . keys ( fxData . alias ) . filter ( item => item . startsWith ( `${ module } /${ this . type } /` ) ) . map ( alias => _require ( alias ) ) . filter ( item => isFunction ( item . prototype [ name ] ) ) ;
13+ _handlers = { } ;
14+
15+ createAndRegisterAlias ( ) {
16+ Object . keys ( fxData . alias ) . filter ( item => item . indexOf ( `/${ this . type } /` ) > - 1 ) . map ( alias => _require ( alias ) ) . forEach ( ( type ) => this . registerHandler ( type ) ) ;
17+ }
18+
19+ getHandlers ( name , module ) {
20+ assert ( name ) ;
21+ if ( ! module ) {
22+ const mn = name . split ( '/' ) ;
23+ module = mn [ 0 ] ;
24+ name = mn [ 1 ] ;
25+ }
26+ assert ( module ) ;
27+ return this . _handlers [ `${ module } /${ name } ` ] || [ ] ;
28+ }
29+
30+ registerHandler ( handlerType ) {
31+ let ctoken = getDecoratorToken ( handlerType ) ;
32+ if ( ! ctoken . name && ! ctoken . module ) {
33+ ctoken = {
34+ module : handlerType . prototype . __module ,
35+ name : handlerType . name
36+ } ;
37+ }
38+ for ( const p of Object . getOwnPropertyNames ( handlerType . prototype ) ) {
39+ if ( p === 'constructor' ) {
40+ continue ;
41+ }
42+ if ( ! isFunction ( handlerType . prototype [ p ] ) ) {
43+ continue ;
44+ }
45+ const {
46+ module = ctoken . module ,
47+ name = p
48+ } = getDecoratorToken ( handlerType . prototype [ p ] ) ;
49+ if ( module && name ) {
50+ let items = this . _handlers [ `${ module } /${ name } ` ] ;
51+ if ( ! items ) {
52+ this . _handlers [ `${ module } /${ name } ` ] = items = [ ] ;
53+ }
54+ items . push ( { CLS : handlerType , method : p } ) ;
55+ }
56+ }
57+ }
58+
59+ unregisterHandler ( handler ) {
60+ const ctoken = getDecoratorToken ( handlerType ) ;
61+ for ( const p in handlerType . prototype ) {
62+ const {
63+ module = ctoken . module ,
64+ name
65+ } = getDecoratorToken ( handlerType . prototype [ p ] ) ;
66+ if ( module && name ) {
67+ let items = this . _handlers [ `${ module } /${ name } ` ] ;
68+ if ( ! items ) {
69+ continue ;
70+ }
71+ const item = items . find ( item => item . CLS === handler ) ;
72+ if ( ! item ) {
73+ continue ;
74+ }
75+ items . splice ( items . indexOf ( item ) , 1 ) ;
76+ }
77+ }
1378 }
1479
1580 // message = {name,module,type,data}
@@ -48,35 +113,32 @@ export default class MessageDispatcher extends Dispatcher {
48113 if ( ! handlers || handlers . length <= 0 ) {
49114 log ( i18n . t ( '无消息处理器' ) ) ;
50115 }
51- let success = 0 ;
52- for ( const type of handlers ) {
53- var CLS = _require ( type ) ;
54- if ( ! CLS || ! isFunction ( CLS ) )
55- continue ;
116+ for ( const { CLS , method}
117+ of handlers ) {
56118 var handler = new CLS ( ) ;
57- if ( ! handler || ! isFunction ( handler [ name ] ) )
119+ if ( ! isFunction ( handler [ method ] ) ) {
120+ log ( i18n . t ( '处理器无法执行命令' ) ) ;
58121 continue ;
122+ }
59123 const evt = {
60124 type : message . type ,
61125 data : message . data ,
62126 module,
63127 name,
64128 handler
65129 } ;
66- log ( i18n . t ( '开始分发 ' ) + this . type + ':' + `${ module } /${ name } ` ) ;
130+ log ( i18n . t ( '开始执行 ' ) + this . type + ':' + `${ module } /${ name } ` ) ;
67131 this . _onDispatching ( evt ) ;
68132 try {
69- await handler [ name ] . bind ( handler ) ( message . data || { } ) ;
133+ await handler [ method ] . bind ( handler ) ( message . data || { } ) ;
70134 this . _onDispatched ( evt ) ;
71- success ++ ;
72- log ( i18n . t ( '完成分发' ) + this . type + ':' + `${ module } /${ name } ` ) ;
135+ log ( i18n . t ( '完成执行' ) + this . type + ':' + `${ module } /${ name } ` ) ;
73136 } catch ( err ) {
74137 evt . error = err ;
75- log ( i18n . t ( '失败分发 ' ) + this . type + ':' + `${ module } /${ name } ` + ',' + err ) ;
138+ log ( i18n . t ( '失败执行 ' ) + this . type + ':' + `${ module } /${ name } ` + ',' + err ) ;
76139 this . _onDispatchFaild ( evt ) ;
77140 }
78141 }
79- return success ;
80142 }
81143
82144 clear ( ) {
0 commit comments