@@ -4,9 +4,12 @@ import java.util.concurrent.TimeUnit
4
4
5
5
import com .github .benmanes .caffeine .cache .{Cache , Caffeine }
6
6
import wechaty .padplus .grpc .PadPlusServerOuterClass .StreamResponse
7
- import wechaty .padplus .schemas .ModelContact .{ PadplusContactPayload , PadplusConversation }
7
+ import wechaty .padplus .schemas .ModelContact .PadplusContactPayload
8
8
import wechaty .padplus .schemas .ModelRoom .{PadplusRoomMemberMap , PadplusRoomPayload }
9
9
10
+ import scala .concurrent .Promise
11
+ import scala .util .{Success , Try }
12
+
10
13
/**
11
14
*
12
15
* @author <a href="mailto:[email protected] ">Jun Tsai</a>
@@ -19,23 +22,25 @@ object CallbackHelper {
19
22
.build()
20
23
.asInstanceOf [Cache [String , T ]]
21
24
}
22
- type TraceRequestCallback = StreamResponse => Unit
25
+ type TraceRequestCallback = Promise [ StreamResponse ]
23
26
lazy val traceCallbacks : Cache [String , TraceRequestCallback ] = createPool[TraceRequestCallback ]
24
27
25
- type ContactCallback = PadplusConversation => Unit
26
- lazy val contactCallbacks : Cache [String , List [ContactCallback ]] = createPool[List [ContactCallback ]]
28
+ type ContactPromise = Promise [PadplusContactPayload ]
29
+ lazy val contactCallbacks : Cache [String , List [ContactPromise ]] = createPool[List [ContactPromise ]]
30
+ type RoomPromise = Promise [PadplusRoomPayload ]
31
+ lazy val roomCallbacks : Cache [String , List [RoomPromise ]] = createPool[List [RoomPromise ]]
27
32
28
- type ContactAliasCallback = () => Unit
33
+ type ContactAliasCallback = Promise [ Unit ]
29
34
lazy val contactAliasCallbacks : Cache [String , Map [String , ContactAliasCallback ]] = createPool[Map [String ,ContactAliasCallback ]]
30
35
31
36
32
- type RoomTopicCallback = () => Unit
37
+ type RoomTopicCallback = Promise [ Unit ]
33
38
lazy val roomTopicCallbacks : Cache [String , Map [String , RoomTopicCallback ]] = createPool[Map [String ,RoomTopicCallback ]]
34
39
35
- type AcceptFriendCallback = () => Unit
40
+ type AcceptFriendCallback = Promise [ Unit ]
36
41
lazy val acceptFriendCallbacks : Cache [String , List [AcceptFriendCallback ]] = createPool[List [AcceptFriendCallback ]]
37
42
38
- type RoomMemberCallback = PadplusRoomMemberMap => Unit
43
+ type RoomMemberCallback = Promise [ PadplusRoomMemberMap ]
39
44
lazy val roomMemberCallbacks : Cache [String , List [RoomMemberCallback ]] = createPool[List [RoomMemberCallback ]]
40
45
41
46
def pushCallbackToPool (traceId : String , callback : TraceRequestCallback ){
@@ -44,7 +49,7 @@ object CallbackHelper {
44
49
def resolveCallBack (traceId : String ,response: StreamResponse ): Unit = {
45
50
val callback = traceCallbacks.getIfPresent(traceId)
46
51
if (callback!= null ){
47
- callback(response)
52
+ callback.success (response)
48
53
}
49
54
traceCallbacks.invalidate(traceId)
50
55
}
@@ -61,32 +66,42 @@ object CallbackHelper {
61
66
cache.put(key,callbackList :+ callback)
62
67
}
63
68
}
69
+ private def resolveListCallBack [T ] (cache: Cache [String ,List [Promise [T ]]],key : String , data : Try [T ]) {
70
+ val callbackList = cache.getIfPresent(key)
71
+ if (callbackList != null ) {
72
+ callbackList.foreach(f => f.complete(data))
73
+ cache.invalidate(key)
74
+ }
75
+ }
64
76
65
- def pushContactCallback ( contactId : String , callback : ContactCallback ) {
77
+ def pushContactCallback ( contactId : String , callback: ContactPromise ) {
66
78
pushListCallback(contactCallbacks,contactId,callback)
67
79
}
68
80
69
- def resolveContactCallBack (contactId : String , data : PadplusContactPayload ) {
70
- val callbackList = contactCallbacks.getIfPresent(contactId)
71
- if (callbackList != null ){
72
- callbackList.foreach(f=> f(data))
73
- }
81
+ def resolveContactCallBack (contactId : String , data : Try [PadplusContactPayload ]) {
82
+ resolveListCallBack(contactCallbacks,contactId,data)
74
83
75
- this .resolveContactAliasCallback(contactId, data.remark)
76
- this .resolveAcceptFriendCallback(contactId)
77
- contactCallbacks.invalidate(contactId)
84
+ data match {
85
+ case Success (value) =>
86
+ this .resolveContactAliasCallback(contactId, value.remark)
87
+ this .resolveAcceptFriendCallback(contactId)
88
+ case _ =>
89
+ }
78
90
}
79
91
80
- def resolveRoomCallBack (roomId : String , data : PadplusRoomPayload ) {
81
- val callbackList = contactCallbacks.getIfPresent(roomId)
82
- if (callbackList != null ){
83
- callbackList.foreach(f=> f(data))
92
+ def pushRoomCallback ( roomId : String , callback: RoomPromise ) {
93
+ pushListCallback(roomCallbacks,roomId,callback)
94
+ }
95
+ def resolveRoomCallBack (roomId : String , data : Try [PadplusRoomPayload ]) {
96
+ resolveListCallBack(roomCallbacks,roomId,data)
97
+ data match {
98
+ case Success (value) =>
99
+ this .resolveRoomTopicCallback(value.chatroomId, value.nickName)
100
+ case _ => // do nothing
84
101
}
85
- this .resolveRoomTopicCallback(data.chatroomId, data.nickName)
86
- contactCallbacks.invalidate(roomId)
87
102
}
88
103
89
- private def pushMapCallback [T ](cache: Cache [String ,Map [String ,T ]],key: String ,mapKey: String ,callback: T ): Unit = {
104
+ private def pushMapCallback [T ](cache: Cache [String ,Map [String ,Promise [ T ]]] ,key: String ,mapKey: String ,callback: Promise [ T ] ): Unit = {
90
105
val callbacks = cache.getIfPresent(key)
91
106
if (callbacks == null ){
92
107
cache.put(key,Map (mapKey-> callback))
@@ -97,12 +112,12 @@ object CallbackHelper {
97
112
def pushContactAliasCallback (contactId : String , alias : String , callback: ContactAliasCallback ): Unit = {
98
113
pushMapCallback(contactAliasCallbacks,contactId,alias,callback)
99
114
}
100
- private def resolveMapCallback (cache: Cache [String ,Map [String ,() => Unit ]],key : String , mapKey : String ) {
115
+ private def resolveMapCallback (cache: Cache [String ,Map [String ,Promise [ Unit ] ]],key : String , mapKey : String ) {
101
116
val callbacks = cache.getIfPresent(key)
102
117
if (callbacks != null ){
103
118
val callbackOpt = callbacks.get(mapKey)
104
119
callbackOpt.foreach{f=>
105
- f( )
120
+ f.success({} )
106
121
if (callbacks.size == 1 )
107
122
cache.invalidate(key)
108
123
else
@@ -127,22 +142,14 @@ object CallbackHelper {
127
142
}
128
143
129
144
private def resolveAcceptFriendCallback (contactId : String ) {
130
- val callbacks = acceptFriendCallbacks.getIfPresent(contactId)
131
- if (callbacks != null ){
132
- callbacks.foreach(cb=> cb())
133
- acceptFriendCallbacks.invalidate(contactId)
134
- }
145
+ resolveListCallBack(acceptFriendCallbacks,contactId,Try [Unit ]({}))
135
146
}
136
147
137
148
def pushRoomMemberCallback (roomId : String , callback : RoomMemberCallback ): Unit = {
138
149
pushListCallback(roomMemberCallbacks,roomId,callback)
139
150
}
140
151
141
- def resolveRoomMemberCallback (roomId : String , memberList : PadplusRoomMemberMap ) {
142
- val callbacks = roomMemberCallbacks.getIfPresent(roomId)
143
- if (callbacks != null ){
144
- callbacks.foreach(cb=> cb(memberList))
145
- roomMemberCallbacks.invalidate(roomId)
146
- }
152
+ def resolveRoomMemberCallback (roomId : String , memberList : Try [PadplusRoomMemberMap ]) {
153
+ resolveListCallBack(roomMemberCallbacks,roomId,memberList)
147
154
}
148
155
}
0 commit comments