11package com.didi.dimina.api
22
3+ import com.didi.dimina.api.ext.ExtBridgeApi
4+ import com.didi.dimina.api.ext.ExtModuleHandler
5+ import com.didi.dimina.common.ApiUtils
36import com.didi.dimina.common.LogUtils
47import com.didi.dimina.ui.container.DiminaActivity
58import org.json.JSONObject
@@ -12,33 +15,120 @@ class ApiRegistry {
1215 private val tag = " ApiRegistry"
1316 private val apiHandlers = mutableMapOf<String , ApiHandler >()
1417
18+ // 宿主注册的第三方扩展模块,key=moduleName
19+ private val extModules = mutableMapOf<String , ExtModuleHandler >()
20+
21+ // extBridge 一次性调用的处理器,共享 extModules 引用
22+ private val extBridgeApi by lazy { ExtBridgeApi (extModules) }
23+
24+ // extOnBridge 持续订阅的取消函数,key="${module}_${event}"
25+ private val extSubscriptions = mutableMapOf<String , Runnable >()
26+
1527 /* *
1628 * Registers an API handler
1729 */
1830 fun register (name : String , handler : ApiHandler ) {
1931 apiHandlers[name] = handler
2032 }
21-
33+
34+ /* *
35+ * 注册第三方扩展 bridge 模块
36+ * @param moduleName 模块名,对应 extBridge/extOnBridge 的 module 参数
37+ * @param handler 模块处理器
38+ */
39+ fun registerExtModule (moduleName : String , handler : ExtModuleHandler ) {
40+ extModules[moduleName] = handler
41+ LogUtils .d(tag, " Registered ext module: $moduleName " )
42+ }
43+
2244 /* *
2345 * Invokes an API
24- *
46+ *
2547 * @param apiName The name of the API to invoke
2648 * @param params Parameters for the API call
2749 * @return True if API was successfully invoked, false otherwise
2850 */
2951 fun invoke (
3052 activity : DiminaActivity ,
3153 appId : String ,
32- apiName : String ,
54+ apiName : String ,
55+ params : JSONObject ,
56+ responseCallback : (String ) -> Unit ,
57+ ): APIResult {
58+ // 1. 优先命中已注册的标准 API
59+ apiHandlers[apiName]?.let { handler ->
60+ return handler.handleAction(activity, appId, apiName, params, responseCallback)
61+ }
62+
63+ // 2. extBridge:未命中且 params 携带 "module" 字段
64+ if (params.has(" module" )) {
65+ return extBridgeApi.handleAction(activity, appId, apiName, params, responseCallback)
66+ }
67+
68+ // 3. extOnBridge / extOffBridge:apiName 格式为 "${module}_${event}"
69+ val matchedModule = extModules.keys.firstOrNull { apiName.startsWith(" ${it} _" ) }
70+ if (matchedModule != null ) {
71+ val event = apiName.removePrefix(" ${matchedModule} _" )
72+ val successId = params.optString(" success" , " " )
73+ return if (successId.isNotEmpty()) {
74+ handleExtOnBridge(matchedModule, event, apiName, params, successId, responseCallback)
75+ } else {
76+ handleExtOffBridge(apiName)
77+ NoneResult ()
78+ }
79+ }
80+
81+ LogUtils .e(tag, " API not found: $apiName " )
82+ return NoneResult ()
83+ }
84+
85+ /* *
86+ * 处理 extOnBridge:启动持续订阅,保存取消函数
87+ */
88+ private fun handleExtOnBridge (
89+ module : String ,
90+ event : String ,
91+ eventKey : String ,
3392 params : JSONObject ,
93+ successCallbackId : String ,
3494 responseCallback : (String ) -> Unit ,
3595 ): APIResult {
36- val handler = apiHandlers[apiName]
37- if (handler == null ) {
38- LogUtils .e(tag, " API not found: $apiName " )
39- return NoneResult ()
96+ val handler = extModules[module] ? : return NoneResult ()
97+
98+ // 若已有相同订阅,先取消旧的
99+ extSubscriptions.remove(eventKey)?.run ()
100+
101+ val callback = object : com.didi.dimina.api.ext.ExtCallback {
102+ override fun onSuccess (result : JSONObject ) {
103+ responseCallback(ApiUtils .createCallbackResponse(successCallbackId, result))
104+ }
105+
106+ override fun onFail (error : JSONObject ) {
107+ LogUtils .e(tag, " extOnBridge error ($eventKey ): $error " )
108+ }
109+ }
110+
111+ val unsubscribe = handler.handle(event, JSONObject (), callback)
112+ if (unsubscribe != null ) {
113+ extSubscriptions[eventKey] = unsubscribe
40114 }
41- return handler.handleAction(activity, appId, apiName, params, responseCallback)
115+ return NoneResult ()
116+ }
117+
118+ /* *
119+ * 处理 extOffBridge:取消持续订阅
120+ */
121+ private fun handleExtOffBridge (eventKey : String ) {
122+ extSubscriptions.remove(eventKey)?.run ()
123+ LogUtils .d(tag, " extOffBridge: cancelled subscription for $eventKey " )
124+ }
125+
126+ /* *
127+ * 取消所有持续订阅(小程序销毁时调用)
128+ */
129+ fun clearExtSubscriptions () {
130+ extSubscriptions.values.forEach { it.run () }
131+ extSubscriptions.clear()
42132 }
43133
44134 /* *
0 commit comments