@amityco/ts-sdk 0.0.1-beta.42.2 → 0.0.1-beta.43

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (308) hide show
  1. package/dist/@types/core/events.d.ts +11 -1
  2. package/dist/@types/core/events.d.ts.map +1 -1
  3. package/dist/@types/core/marker.d.ts +37 -0
  4. package/dist/@types/core/marker.d.ts.map +1 -0
  5. package/dist/@types/core/model.d.ts +10 -0
  6. package/dist/@types/core/model.d.ts.map +1 -1
  7. package/dist/@types/core/payload.d.ts +44 -0
  8. package/dist/@types/core/payload.d.ts.map +1 -1
  9. package/dist/@types/domains/channel.d.ts +5 -8
  10. package/dist/@types/domains/channel.d.ts.map +1 -1
  11. package/dist/@types/domains/client.d.ts +1 -0
  12. package/dist/@types/domains/client.d.ts.map +1 -1
  13. package/dist/@types/domains/marker.d.ts +15 -0
  14. package/dist/@types/domains/marker.d.ts.map +1 -0
  15. package/dist/@types/domains/message.d.ts +3 -0
  16. package/dist/@types/domains/message.d.ts.map +1 -1
  17. package/dist/@types/domains/partials.d.ts +3 -0
  18. package/dist/@types/domains/partials.d.ts.map +1 -1
  19. package/dist/@types/domains/subChannel.d.ts +2 -0
  20. package/dist/@types/domains/subChannel.d.ts.map +1 -1
  21. package/dist/channel/api/getChannels.d.ts.map +1 -1
  22. package/dist/channel/api/index.d.ts +0 -2
  23. package/dist/channel/api/index.d.ts.map +1 -1
  24. package/dist/channel/events/onChannelUpdated.d.ts.map +1 -1
  25. package/dist/channel/utils/index.d.ts +1 -2
  26. package/dist/channel/utils/index.d.ts.map +1 -1
  27. package/dist/channel/utils/prepareChannelPayload.d.ts +6 -0
  28. package/dist/channel/utils/prepareChannelPayload.d.ts.map +1 -0
  29. package/dist/channel/utils/tests/prepareChannelPayload.test.d.ts +5 -1
  30. package/dist/channel/utils/tests/prepareChannelPayload.test.d.ts.map +1 -1
  31. package/dist/client/api/activeUser.d.ts +2 -2
  32. package/dist/client/api/activeUser.d.ts.map +1 -1
  33. package/dist/client/api/connectClient.d.ts.map +1 -1
  34. package/dist/client/api/index.d.ts +2 -0
  35. package/dist/client/api/index.d.ts.map +1 -1
  36. package/dist/client/api/markerSync.d.ts +21 -0
  37. package/dist/client/api/markerSync.d.ts.map +1 -0
  38. package/dist/client/observers/getTotalUnreadCount.d.ts +18 -0
  39. package/dist/client/observers/getTotalUnreadCount.d.ts.map +1 -0
  40. package/dist/client/observers/index.d.ts +2 -0
  41. package/dist/client/observers/index.d.ts.map +1 -0
  42. package/dist/client/observers/tests/getTotalUnreadCount.test.d.ts +2 -0
  43. package/dist/client/observers/tests/getTotalUnreadCount.test.d.ts.map +1 -0
  44. package/dist/client/utils/index.d.ts +2 -0
  45. package/dist/client/utils/index.d.ts.map +1 -0
  46. package/dist/client/utils/markerSyncEngine.d.ts +46 -0
  47. package/dist/client/utils/markerSyncEngine.d.ts.map +1 -0
  48. package/dist/comment/api/getComments.d.ts.map +1 -1
  49. package/dist/core/events.d.ts +3 -3
  50. package/dist/core/events.d.ts.map +1 -1
  51. package/dist/core/model/idResolvers.d.ts.map +1 -1
  52. package/dist/core/model/index.d.ts.map +1 -1
  53. package/dist/index.cjs.js +1931 -1159
  54. package/dist/index.d.ts +5 -0
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.esm.js +1901 -1160
  57. package/dist/index.umd.js +4 -4
  58. package/dist/marker/api/getChannelMarkers.d.ts +18 -0
  59. package/dist/marker/api/getChannelMarkers.d.ts.map +1 -0
  60. package/dist/marker/api/getMessageMarkers.d.ts +18 -0
  61. package/dist/marker/api/getMessageMarkers.d.ts.map +1 -0
  62. package/dist/marker/api/getSubChannelMarkers.d.ts +18 -0
  63. package/dist/marker/api/getSubChannelMarkers.d.ts.map +1 -0
  64. package/dist/marker/api/getUserMarker.d.ts +8 -0
  65. package/dist/marker/api/getUserMarker.d.ts.map +1 -0
  66. package/dist/marker/api/index.d.ts +5 -0
  67. package/dist/marker/api/index.d.ts.map +1 -0
  68. package/dist/marker/api/tests/getChannelMarkers.test.d.ts +2 -0
  69. package/dist/marker/api/tests/getChannelMarkers.test.d.ts.map +1 -0
  70. package/dist/marker/api/tests/getMessageMarkers.test.d.ts +2 -0
  71. package/dist/marker/api/tests/getMessageMarkers.test.d.ts.map +1 -0
  72. package/dist/marker/api/tests/getSubChannelMarkers.test.d.ts +2 -0
  73. package/dist/marker/api/tests/getSubChannelMarkers.test.d.ts.map +1 -0
  74. package/dist/marker/events/index.d.ts +7 -0
  75. package/dist/marker/events/index.d.ts.map +1 -0
  76. package/dist/marker/events/onChannelMarkerFetched.d.ts +17 -0
  77. package/dist/marker/events/onChannelMarkerFetched.d.ts.map +1 -0
  78. package/dist/marker/events/onFeedlMarkerFetched.d.ts +17 -0
  79. package/dist/marker/events/onFeedlMarkerFetched.d.ts.map +1 -0
  80. package/dist/marker/events/onMessageMarkerFetched.d.ts +17 -0
  81. package/dist/marker/events/onMessageMarkerFetched.d.ts.map +1 -0
  82. package/dist/marker/events/onSubChannelMarkerFetched.d.ts +17 -0
  83. package/dist/marker/events/onSubChannelMarkerFetched.d.ts.map +1 -0
  84. package/dist/marker/events/onSubChannelMarkerUpdated.d.ts +17 -0
  85. package/dist/marker/events/onSubChannelMarkerUpdated.d.ts.map +1 -0
  86. package/dist/marker/events/onUserMarkerFetched.d.ts +17 -0
  87. package/dist/marker/events/onUserMarkerFetched.d.ts.map +1 -0
  88. package/dist/message/api/getMessage.d.ts.map +1 -1
  89. package/dist/message/api/getMessages.d.ts.map +1 -1
  90. package/dist/message/api/index.d.ts +1 -0
  91. package/dist/message/api/index.d.ts.map +1 -1
  92. package/dist/message/api/markAsDelivered.d.ts +17 -0
  93. package/dist/message/api/markAsDelivered.d.ts.map +1 -0
  94. package/dist/message/api/queryMessages.d.ts.map +1 -1
  95. package/dist/message/api/tests/markAsDelivered.test.d.ts +2 -0
  96. package/dist/message/api/tests/markAsDelivered.test.d.ts.map +1 -0
  97. package/dist/message/api/updateMessage.d.ts.map +1 -1
  98. package/dist/message/events/index.d.ts +1 -0
  99. package/dist/message/events/index.d.ts.map +1 -1
  100. package/dist/message/events/onMessageCreated.d.ts +2 -1
  101. package/dist/message/events/onMessageCreated.d.ts.map +1 -1
  102. package/dist/message/events/onMessageUpdated.d.ts.map +1 -1
  103. package/dist/message/utils/index.d.ts +1 -18
  104. package/dist/message/utils/index.d.ts.map +1 -1
  105. package/dist/message/utils/prepareMessagePayload.d.ts +16 -0
  106. package/dist/message/utils/prepareMessagePayload.d.ts.map +1 -0
  107. package/dist/post/api/getPosts.d.ts.map +1 -1
  108. package/dist/post/api/tests/getPosts.test.d.ts +2 -0
  109. package/dist/post/api/tests/getPosts.test.d.ts.map +1 -0
  110. package/dist/report/api/createReport.d.ts.map +1 -1
  111. package/dist/report/api/deleteReport.d.ts.map +1 -1
  112. package/dist/subChannel/api/getSubChannels.d.ts.map +1 -1
  113. package/dist/subChannel/api/index.d.ts +2 -0
  114. package/dist/subChannel/api/index.d.ts.map +1 -1
  115. package/dist/subChannel/api/startReadingAPI.d.ts +17 -0
  116. package/dist/subChannel/api/startReadingAPI.d.ts.map +1 -0
  117. package/dist/subChannel/api/stopReadingAPI.d.ts +17 -0
  118. package/dist/subChannel/api/stopReadingAPI.d.ts.map +1 -0
  119. package/dist/subChannel/events/onSubChannelUpdated.d.ts +1 -1
  120. package/dist/subChannel/events/onSubChannelUpdated.d.ts.map +1 -1
  121. package/dist/subChannel/observers/liveSubChannel.d.ts.map +1 -1
  122. package/dist/subChannel/utils/index.d.ts +2 -7
  123. package/dist/subChannel/utils/index.d.ts.map +1 -1
  124. package/dist/subChannel/utils/markReadEngine.d.ts +33 -0
  125. package/dist/subChannel/utils/markReadEngine.d.ts.map +1 -0
  126. package/dist/subChannel/utils/prepareSubChannelPayload.d.ts +15 -0
  127. package/dist/subChannel/utils/prepareSubChannelPayload.d.ts.map +1 -0
  128. package/dist/utils/liveObject.d.ts +1 -1
  129. package/dist/utils/liveObject.d.ts.map +1 -1
  130. package/dist/utils/tests/client.d.ts +1 -0
  131. package/dist/utils/tests/client.d.ts.map +1 -1
  132. package/dist/utils/tests/dummy/channel.d.ts +4 -0
  133. package/dist/utils/tests/dummy/channel.d.ts.map +1 -1
  134. package/dist/utils/tests/dummy/comment.d.ts.map +1 -1
  135. package/dist/utils/tests/dummy/index.d.ts +1 -0
  136. package/dist/utils/tests/dummy/index.d.ts.map +1 -1
  137. package/dist/utils/tests/dummy/marker.d.ts +6 -0
  138. package/dist/utils/tests/dummy/marker.d.ts.map +1 -0
  139. package/dist/utils/tests/dummy/message.d.ts +2 -0
  140. package/dist/utils/tests/dummy/message.d.ts.map +1 -1
  141. package/dist/utils/tests/dummy/subChannel.d.ts +1 -0
  142. package/dist/utils/tests/dummy/subChannel.d.ts.map +1 -1
  143. package/dist/utils/tests/utils.d.ts.map +1 -1
  144. package/package.json +1 -1
  145. package/src/@types/core/events.ts +13 -1
  146. package/src/@types/core/marker.ts +42 -0
  147. package/src/@types/core/model.ts +12 -0
  148. package/src/@types/core/payload.ts +52 -0
  149. package/src/@types/domains/channel.ts +5 -16
  150. package/src/@types/domains/client.ts +2 -0
  151. package/src/@types/domains/marker.ts +15 -0
  152. package/src/@types/domains/message.ts +3 -0
  153. package/src/@types/domains/partials.ts +4 -0
  154. package/src/@types/domains/subChannel.ts +2 -0
  155. package/src/channel/api/addChannelMembers.ts +1 -1
  156. package/src/channel/api/addChannelMembersRole.ts +1 -1
  157. package/src/channel/api/banChannelMembers.ts +1 -1
  158. package/src/channel/api/createChannel.ts +1 -1
  159. package/src/channel/api/getChannel.ts +1 -1
  160. package/src/channel/api/getChannels.ts +21 -5
  161. package/src/channel/api/index.ts +0 -3
  162. package/src/channel/api/joinChannel.ts +1 -1
  163. package/src/channel/api/leaveChannel.ts +1 -1
  164. package/src/channel/api/queryChannelMembers.ts +1 -1
  165. package/src/channel/api/queryChannels.ts +3 -3
  166. package/src/channel/api/removeChannelMembers.ts +1 -1
  167. package/src/channel/api/removeChannelMembersRole.ts +1 -1
  168. package/src/channel/api/tests/addChannelMembers.test.ts +16 -0
  169. package/src/channel/api/tests/createChannel.test.ts +29 -8
  170. package/src/channel/api/tests/getChannel.test.ts +11 -4
  171. package/src/channel/api/tests/getChannels.test.ts +22 -14
  172. package/src/channel/api/tests/queryChannelMembers.test.ts +13 -4
  173. package/src/channel/api/tests/queryChannels.test.ts +19 -9
  174. package/src/channel/api/unbanChannelMembers.ts +1 -1
  175. package/src/channel/api/updateChannel.ts +1 -1
  176. package/src/channel/events/onChannelCreated.ts +2 -2
  177. package/src/channel/events/onChannelDeleted.ts +4 -4
  178. package/src/channel/events/onChannelJoined.ts +2 -2
  179. package/src/channel/events/onChannelLeft.ts +2 -2
  180. package/src/channel/events/onChannelMemberAdded.ts +2 -2
  181. package/src/channel/events/onChannelMemberBanned.ts +3 -3
  182. package/src/channel/events/onChannelMemberRemoved.ts +2 -2
  183. package/src/channel/events/onChannelMemberUnbanned.ts +2 -2
  184. package/src/channel/events/onChannelMuted.ts +2 -2
  185. package/src/channel/events/onChannelUpdated.ts +25 -4
  186. package/src/channel/events/tests/onChannelCreated.test.ts +4 -1
  187. package/src/channel/events/tests/onChannelJoined.test.ts +5 -1
  188. package/src/channel/events/tests/onChannelMemberAdded.test.ts +5 -1
  189. package/src/channel/events/tests/onChannelMemberBanned.test.ts +4 -1
  190. package/src/channel/events/tests/onChannelMemberRemoved.test.ts +5 -1
  191. package/src/channel/events/tests/onChannelMemberUnbanned.test.ts +10 -10
  192. package/src/channel/events/tests/onChannelUpdated.test.ts +5 -1
  193. package/src/channel/observers/tests/liveChannelMembers.test.ts +5 -11
  194. package/src/channel/observers/tests/liveChannels.test.ts +21 -24
  195. package/src/channel/utils/index.ts +1 -57
  196. package/src/channel/utils/prepareChannelPayload.ts +91 -0
  197. package/src/channel/utils/tests/prepareChannelPayload.test.ts +102 -104
  198. package/src/client/api/activeUser.ts +2 -2
  199. package/src/client/api/connectClient.ts +2 -1
  200. package/src/client/api/index.ts +3 -0
  201. package/src/client/api/markerSync.ts +42 -0
  202. package/src/client/observers/getTotalUnreadCount.ts +52 -0
  203. package/src/client/observers/index.ts +1 -0
  204. package/src/client/observers/tests/getTotalUnreadCount.test.ts +126 -0
  205. package/src/client/utils/index.ts +1 -0
  206. package/src/client/utils/markerSyncEngine.ts +179 -0
  207. package/src/comment/api/getComments.ts +20 -4
  208. package/src/comment/api/tests/getComments.test.ts +12 -1
  209. package/src/comment/api/tests/queryComments.test.ts +2 -2
  210. package/src/core/model/idResolvers.ts +7 -0
  211. package/src/core/model/identifyModel.ts +1 -1
  212. package/src/core/model/index.ts +6 -0
  213. package/src/core/tests/query/query/runQuery.test.ts +3 -1
  214. package/src/group/utils/withUser.ts +2 -2
  215. package/src/index.ts +6 -0
  216. package/src/marker/api/getChannelMarkers.ts +53 -0
  217. package/src/marker/api/getMessageMarkers.ts +54 -0
  218. package/src/marker/api/getSubChannelMarkers.ts +54 -0
  219. package/src/marker/api/getUserMarker.ts +47 -0
  220. package/src/marker/api/index.ts +4 -0
  221. package/src/marker/api/tests/getChannelMarkers.test.ts +109 -0
  222. package/src/marker/api/tests/getMessageMarkers.test.ts +114 -0
  223. package/src/marker/api/tests/getSubChannelMarkers.test.ts +116 -0
  224. package/src/marker/events/index.ts +10 -0
  225. package/src/marker/events/onChannelMarkerFetched.ts +34 -0
  226. package/src/marker/events/onFeedlMarkerFetched.ts +34 -0
  227. package/src/marker/events/onMessageMarkerFetched.ts +34 -0
  228. package/src/marker/events/onSubChannelMarkerFetched.ts +34 -0
  229. package/src/marker/events/onSubChannelMarkerUpdated.ts +34 -0
  230. package/src/marker/events/onUserMarkerFetched.ts +34 -0
  231. package/src/message/api/createMessage.ts +1 -1
  232. package/src/message/api/getMessage.ts +6 -5
  233. package/src/message/api/getMessages.ts +7 -6
  234. package/src/message/api/index.ts +1 -0
  235. package/src/message/api/markAsDelivered.ts +36 -0
  236. package/src/message/api/queryMessages.ts +8 -6
  237. package/src/message/api/tests/createMessage.test.ts +13 -4
  238. package/src/message/api/tests/getMessage.test.ts +12 -3
  239. package/src/message/api/tests/getMessages.test.ts +14 -5
  240. package/src/message/api/tests/markAsDelivered.test.ts +83 -0
  241. package/src/message/api/tests/queryMessages.test.ts +14 -3
  242. package/src/message/api/updateMessage.ts +8 -7
  243. package/src/message/events/index.ts +2 -0
  244. package/src/message/events/onMessageCreated.ts +14 -41
  245. package/src/message/events/onMessageDeleted.ts +2 -2
  246. package/src/message/events/onMessageFlagCleared.ts +2 -2
  247. package/src/message/events/onMessageFlagged.ts +2 -2
  248. package/src/message/events/onMessageReactionAdded.ts +2 -2
  249. package/src/message/events/onMessageReactionRemoved.ts +2 -2
  250. package/src/message/events/onMessageUnflagged.ts +2 -2
  251. package/src/message/events/onMessageUpdated.ts +27 -5
  252. package/src/message/tests/events.test.ts +4 -2
  253. package/src/message/tests/observers/liveMessage.test.ts +22 -10
  254. package/src/message/tests/observers/liveMessages.test.ts +25 -18
  255. package/src/message/utils/index.ts +1 -140
  256. package/src/message/utils/prepareMessagePayload.ts +182 -0
  257. package/src/post/api/getPosts.ts +20 -4
  258. package/src/post/api/tests/getPosts.test.ts +18 -0
  259. package/src/reaction/events/onReactionAdded.ts +2 -2
  260. package/src/reaction/events/onReactionRemoved.ts +2 -2
  261. package/src/reaction/events/onReactorAdded.ts +2 -2
  262. package/src/reaction/events/onReactorRemoved.ts +2 -2
  263. package/src/report/api/createReport.ts +2 -1
  264. package/src/report/api/deleteReport.ts +2 -1
  265. package/src/subChannel/api/createSubChannel.ts +1 -1
  266. package/src/subChannel/api/getSubChannel.ts +1 -1
  267. package/src/subChannel/api/getSubChannels.ts +2 -1
  268. package/src/subChannel/api/index.ts +3 -0
  269. package/src/subChannel/api/querySubChannels.ts +1 -1
  270. package/src/subChannel/api/startReadingAPI.ts +33 -0
  271. package/src/subChannel/api/stopReadingAPI.ts +33 -0
  272. package/src/subChannel/api/tests/createSubChannel.test.ts +6 -3
  273. package/src/subChannel/api/tests/deleteSubChannel.test.ts +7 -5
  274. package/src/subChannel/api/tests/getSubChannel.test.ts +6 -4
  275. package/src/subChannel/api/tests/getSubChannels.test.ts +6 -3
  276. package/src/subChannel/api/tests/updateSubChannel.test.ts +6 -3
  277. package/src/subChannel/api/updateSubChannel.ts +1 -1
  278. package/src/subChannel/events/onSubChannelCreated.ts +2 -2
  279. package/src/subChannel/events/onSubChannelDeleted.ts +2 -2
  280. package/src/subChannel/events/onSubChannelUpdated.ts +43 -4
  281. package/src/subChannel/observers/liveSubChannel.ts +2 -0
  282. package/src/subChannel/observers/tests/liveSubChannel.test.ts +15 -10
  283. package/src/subChannel/observers/tests/liveSubChannels.test.ts +21 -14
  284. package/src/subChannel/utils/index.ts +2 -50
  285. package/src/subChannel/utils/markReadEngine.ts +117 -0
  286. package/src/subChannel/utils/prepareSubChannelPayload.ts +132 -0
  287. package/src/utils/liveObject.ts +15 -4
  288. package/src/utils/tests/client.ts +3 -1
  289. package/src/utils/tests/dummy/channel.ts +38 -21
  290. package/src/utils/tests/dummy/comment.ts +2 -2
  291. package/src/utils/tests/dummy/index.ts +1 -0
  292. package/src/utils/tests/dummy/marker.ts +68 -0
  293. package/src/utils/tests/dummy/message.ts +42 -2
  294. package/src/utils/tests/dummy/post.ts +1 -1
  295. package/src/utils/tests/dummy/subChannel.ts +16 -5
  296. package/src/utils/tests/utils.ts +4 -1
  297. package/dist/channel/api/startReading.d.ts +0 -17
  298. package/dist/channel/api/startReading.d.ts.map +0 -1
  299. package/dist/channel/api/stopReading.d.ts +0 -16
  300. package/dist/channel/api/stopReading.d.ts.map +0 -1
  301. package/dist/channel/api/tests/startReading.test.d.ts +0 -2
  302. package/dist/channel/api/tests/startReading.test.d.ts.map +0 -1
  303. package/dist/channel/api/tests/stopReading.test.d.ts +0 -2
  304. package/dist/channel/api/tests/stopReading.test.d.ts.map +0 -1
  305. package/src/channel/api/startReading.ts +0 -57
  306. package/src/channel/api/stopReading.ts +0 -53
  307. package/src/channel/api/tests/startReading.test.ts +0 -25
  308. package/src/channel/api/tests/stopReading.test.ts +0 -25
@@ -1,8 +1,10 @@
1
+ import { pullFromCache, upsertInCache } from '~/cache/api';
1
2
  import { getActiveClient } from '~/client/api';
2
3
  import { createEventSubscriber } from '~/core/events';
3
4
 
4
5
  import { ingestInCache } from '~/cache/api/ingestInCache';
5
- import { prepareMessagePayload } from '../utils';
6
+
7
+ import { prepareMessagePayload, updateMessageMarker } from '../utils';
6
8
 
7
9
  /**
8
10
  * ```js
@@ -22,18 +24,38 @@ import { prepareMessagePayload } from '../utils';
22
24
  export const onMessageUpdated = (callback: Amity.Listener<Amity.Message>): Amity.Unsubscriber => {
23
25
  const client = getActiveClient();
24
26
 
25
- const filter = (rawPayload: Amity.MessagePayload) => {
26
- const payload = prepareMessagePayload(rawPayload);
27
+ const filter = async (rawPayload: Amity.MessagePayload) => {
28
+ const payload = await prepareMessagePayload(rawPayload);
27
29
 
28
30
  ingestInCache(payload);
29
31
  callback(payload.messages[0]);
30
32
  };
31
33
 
34
+ const messageMarkerChangeHandler = async (
35
+ rawPayload: MakeRequired<Amity.MessageMarkerPayload, 'contentMarkers'>,
36
+ ) => {
37
+ const marker = rawPayload.contentMarkers[0];
38
+ const cacheKey = ['message', 'get', marker.contentId];
39
+ const message = pullFromCache<Amity.Message>(cacheKey)?.data;
40
+
41
+ if (!message) return;
42
+
43
+ const updated = updateMessageMarker(message, marker);
44
+ upsertInCache(cacheKey, updated);
45
+ callback(updated);
46
+ };
47
+
32
48
  const disposers = [
33
- createEventSubscriber(client, 'message/onMessageUpdated', 'message.updated', filter),
34
- createEventSubscriber(client, 'local.message.updated', 'local.message.updated', payload =>
49
+ createEventSubscriber(client, 'onMessageUpdated', 'message.updated', filter),
50
+ createEventSubscriber(client, 'onMessageUpdated', 'local.message.updated', payload =>
35
51
  callback(payload.messages[0]),
36
52
  ),
53
+ createEventSubscriber(
54
+ client,
55
+ 'onMessageUpdated',
56
+ 'local.messageMarker.fetched',
57
+ messageMarkerChangeHandler,
58
+ ),
37
59
  ];
38
60
 
39
61
  return () => {
@@ -1,4 +1,4 @@
1
- import { client, generateRawMessage } from '~/utils/tests';
1
+ import { client, generateRawMessage, pause } from '~/utils/tests';
2
2
  import { convertFromRaw } from '~/message/utils';
3
3
  import {
4
4
  onMessageCreated,
@@ -29,7 +29,7 @@ describe('Message Events', () => {
29
29
  ];
30
30
 
31
31
  cases.forEach(([onEvent, event]) => {
32
- test(`should call '${onEvent.name}' callback if '${event}' event is dispatched`, () => {
32
+ test(`should call '${onEvent.name}' callback if '${event}' event is dispatched`, async () => {
33
33
  const callback = jest.fn();
34
34
  const unsubscribe = onEvent(callback);
35
35
  client.emitter.emit(event, {
@@ -38,6 +38,8 @@ describe('Message Events', () => {
38
38
  users: [],
39
39
  });
40
40
 
41
+ await pause();
42
+
41
43
  unsubscribe();
42
44
 
43
45
  expect(callback).toHaveBeenCalled();
@@ -1,15 +1,22 @@
1
1
  import { ASCApiError } from '~/core/errors';
2
2
  import { disableCache, enableCache } from '~/cache/api';
3
3
  import { UNSYNCED_OBJECT_CACHED_AT_MESSAGE } from '~/utils/constants';
4
- import { pause, client, connectClient, disconnectClient, generateRawMessage } from '~/utils/tests';
4
+ import {
5
+ pause,
6
+ client,
7
+ connectClient,
8
+ disconnectClient,
9
+ generateRawMessage,
10
+ convertRawMessage,
11
+ } from '~/utils/tests';
5
12
  import { getFutureDate } from '~/core/model';
6
13
 
7
- import { convertFromRaw } from '../../utils';
8
14
  import { liveMessage } from '../../observers/liveMessage';
9
15
  import { createMessage } from '../../api';
16
+ import * as getMessageMarkers from '../../../marker/api/getMessageMarkers';
10
17
 
11
18
  const rawMessage = generateRawMessage();
12
- const message = convertFromRaw(rawMessage);
19
+ const message = convertRawMessage(rawMessage);
13
20
  const messageQueryResponseRaw = {
14
21
  data: { messages: [rawMessage] },
15
22
  };
@@ -23,16 +30,20 @@ const getSnapshot = () => {
23
30
  };
24
31
 
25
32
  describe('liveMessage', () => {
26
- beforeAll(async () => {
27
- await connectClient();
33
+ beforeAll(() => {
34
+ connectClient();
35
+
36
+ jest.spyOn(getMessageMarkers, 'getMessageMarkers').mockImplementation(() =>
37
+ Promise.resolve({
38
+ data: [],
39
+ cachedAt: undefined,
40
+ }),
41
+ );
28
42
  });
29
43
 
30
- afterAll(async () => {
31
- await disconnectClient();
32
- });
44
+ afterAll(disconnectClient);
33
45
 
34
46
  beforeEach(enableCache);
35
-
36
47
  afterEach(disableCache);
37
48
 
38
49
  const events: [string, keyof Amity.Events][] = [
@@ -47,6 +58,7 @@ describe('liveMessage', () => {
47
58
  ];
48
59
 
49
60
  test.each(events)('%s', async (test, event) => {
61
+ await disableCache();
50
62
  const snapshot = getSnapshot();
51
63
 
52
64
  // mock response of queryMessages and validate
@@ -64,7 +76,7 @@ describe('liveMessage', () => {
64
76
  data: { text: event },
65
77
  updatedAt: getFutureDate(rawMessage.updatedAt),
66
78
  };
67
- const updatedMessage = convertFromRaw(rawUpdatedMessage);
79
+ const updatedMessage = convertRawMessage(rawUpdatedMessage);
68
80
  if (event === 'local.message.fetched') {
69
81
  client.emitter.emit('local.message.fetched', { messages: [updatedMessage] });
70
82
  } else {
@@ -7,34 +7,38 @@ import {
7
7
  disconnectClient,
8
8
  messages,
9
9
  generateRawMessage,
10
+ convertRawMessage,
11
+ pause,
10
12
  } from '~/utils/tests';
11
13
 
12
- import { convertFromRaw } from '../../utils';
13
14
  import { queryMessages } from '../../api';
14
15
  import { liveMessages } from '../../observers';
16
+ import * as getMessageMarkers from '../../../marker/api/getMessageMarkers';
15
17
 
16
18
  describe('liveMessages', () => {
17
- beforeAll(async () => {
18
- await connectClient();
19
- });
19
+ beforeAll(() => {
20
+ connectClient();
20
21
 
21
- afterAll(async () => {
22
- await disconnectClient();
22
+ jest.spyOn(getMessageMarkers, 'getMessageMarkers').mockImplementation(() =>
23
+ Promise.resolve({
24
+ data: [],
25
+ cachedAt: undefined,
26
+ }),
27
+ );
23
28
  });
24
29
 
25
- beforeEach(async () => {
26
- enableCache();
27
- });
30
+ afterAll(disconnectClient);
28
31
 
32
+ beforeEach(enableCache);
29
33
  afterEach(disableCache);
30
34
 
31
35
  const { subChannelId } = messages;
32
- const returnValue = [{ messageId: messages.page1[0] }];
36
+ const returnValue: Amity.RawMessage[] = [generateRawMessage({ messageId: messages.page1[0] })];
33
37
  const rawMessage = generateRawMessage({
34
38
  messageId: returnValue[0].messageId,
35
39
  messageFeedId: subChannelId,
36
40
  });
37
- const message = convertFromRaw(rawMessage);
41
+ const message = convertRawMessage(rawMessage);
38
42
 
39
43
  test('it should show message if cache not enabled', () => {
40
44
  /*
@@ -85,8 +89,7 @@ describe('liveMessages', () => {
85
89
 
86
90
  expect(callback).toHaveBeenCalledWith(
87
91
  expect.objectContaining({
88
- // @ts-ignore
89
- data: returnValue.map(convertFromRaw),
92
+ data: returnValue.map(convertRawMessage),
90
93
  error: undefined,
91
94
  loading: false,
92
95
  }),
@@ -166,7 +169,7 @@ describe('liveMessages', () => {
166
169
  expect(callback).toHaveBeenCalledWith(
167
170
  expect.objectContaining({
168
171
  // @ts-ignore
169
- data: [returnValue[1]].map(convertFromRaw),
172
+ data: [returnValue[1]].map(convertRawMessage),
170
173
  error: undefined,
171
174
  loading: false,
172
175
  }),
@@ -222,7 +225,7 @@ describe('liveMessages', () => {
222
225
  4,
223
226
  expect.objectContaining({
224
227
  // @ts-ignore
225
- data: [...returnValue2, ...returnValue].map(convertFromRaw),
228
+ data: [...returnValue2, ...returnValue].map(convertRawMessage),
226
229
  error: undefined,
227
230
  loading: false,
228
231
  }),
@@ -260,7 +263,7 @@ describe('liveMessages', () => {
260
263
  messageId: 'new-message-id',
261
264
  messageFeedId: message.subChannelId,
262
265
  });
263
- const newMessage = convertFromRaw(rawNewMessage);
266
+ const newMessage = convertRawMessage(rawNewMessage);
264
267
 
265
268
  // mock response of queryMessages and validate
266
269
  const callback = jest.fn();
@@ -283,6 +286,8 @@ describe('liveMessages', () => {
283
286
  files: [],
284
287
  });
285
288
 
289
+ await pause();
290
+
286
291
  expect(callback).toHaveBeenNthCalledWith(
287
292
  3,
288
293
  expect.objectContaining({
@@ -291,7 +296,7 @@ describe('liveMessages', () => {
291
296
  }),
292
297
  );
293
298
  expect(callback.mock.calls[2][0].data[0]).toMatchObject(newMessage);
294
- expect(callback.mock.calls[2][0].data[1]).toMatchObject(returnValue[0]);
299
+ expect(callback.mock.calls[2][0].data[1]).toMatchObject(message);
295
300
  });
296
301
 
297
302
  test('it should add new message to collection onUpdate', async () => {
@@ -317,7 +322,7 @@ describe('liveMessages', () => {
317
322
  });
318
323
 
319
324
  expect(callback).toHaveBeenNthCalledWith(
320
- 3,
325
+ 2,
321
326
  expect.objectContaining({
322
327
  data: [message],
323
328
  error: undefined,
@@ -348,6 +353,8 @@ describe('liveMessages', () => {
348
353
  files: [],
349
354
  });
350
355
 
356
+ await pause();
357
+
351
358
  expect(callback).toHaveBeenNthCalledWith(
352
359
  3,
353
360
  expect.objectContaining({
@@ -1,140 +1 @@
1
- import { AxiosResponse } from 'axios';
2
- import { toToken } from '~/core/query';
3
- import { pullFromCache } from '~/cache/api';
4
- import { prepareMessagePayloadForCache } from '~/reaction/utils/prepareMessagePayloadForCache';
5
-
6
- export function convertFromRaw({
7
- channelPublicId,
8
- childCount,
9
- creatorPublicId,
10
- mentionedUsers,
11
- messageFeedId,
12
- myReactions,
13
- reactionCount,
14
- reactions,
15
- referenceId,
16
- segment,
17
- ...rest
18
- }: Amity.RawMessage): Amity.Message {
19
- let cache: Amity.CacheEntry<Amity.Message> | undefined;
20
-
21
- if (referenceId) {
22
- try {
23
- cache = pullFromCache(['message', 'get', referenceId]);
24
- // eslint-disable-next-line no-empty
25
- } catch {}
26
- }
27
-
28
- if (!cache) {
29
- try {
30
- cache = pullFromCache(['message', 'get', rest.messageId]);
31
- // eslint-disable-next-line no-empty
32
- } catch {}
33
- }
34
-
35
- const out: Amity.Message = {
36
- ...rest,
37
- channelId: channelPublicId,
38
- channelSegment: segment,
39
- childrenNumber: childCount,
40
- creatorId: creatorPublicId,
41
- reactions: reactions ?? {},
42
- reactionsCount: reactionCount,
43
- subChannelId: messageFeedId,
44
- uniqueId: cache ? cache.data.uniqueId : rest.messageId,
45
- };
46
-
47
- if (mentionedUsers) {
48
- out.mentionees = mentionedUsers.map(mention => {
49
- if (mention.type === 'channel') {
50
- return mention;
51
- }
52
-
53
- return { type: 'user', userIds: mention.userPublicIds };
54
- });
55
- }
56
-
57
- if (myReactions) {
58
- // http response
59
- out.myReactions = myReactions;
60
- } else {
61
- // mqtt event
62
- try {
63
- prepareMessagePayloadForCache(out);
64
- // eslint-disable-next-line no-empty
65
- } catch {}
66
- }
67
-
68
- return out;
69
- }
70
-
71
- export const prepareMessagePayload = (
72
- payload: Amity.MessagePayload,
73
- ): Amity.ProcessedMessagePayload => {
74
- return {
75
- ...payload,
76
- messages: payload.messages.map(convertFromRaw),
77
- };
78
- };
79
-
80
- export const convertResponseFromRaw = <T extends Amity.MessagePayload>(
81
- response: AxiosResponse<T>,
82
- ): AxiosResponse<Omit<T, 'messages'> & { messages: Amity.ProcessedMessagePayload['messages'] }> => {
83
- return {
84
- ...response,
85
- data: {
86
- ...response.data,
87
- messages: response.data.messages.map(convertFromRaw),
88
- },
89
- };
90
- };
91
-
92
- type RawQueryMessages = Omit<
93
- Amity.QueryMessages,
94
- /*
95
- * include deleted is for internal sdk use only. The server expects isDeleted
96
- */
97
- 'page' | 'sortBy' | 'subChannelId' | 'tags' | 'includeDeleted'
98
- > & {
99
- includeTags?: Amity.QueryMessages['tags'];
100
- isDeleted?: Amity.Message['isDeleted'];
101
- messageFeedId: Amity.QueryMessages['subChannelId'];
102
- options: {
103
- sortBy?: Amity.QueryMessages['sortBy'];
104
- token: string;
105
- };
106
- };
107
-
108
- export function convertParams({
109
- subChannelId,
110
- mentionees,
111
- ...rest
112
- }: Partial<Amity.Message>): Record<string, any> {
113
- return { messageFeedId: subChannelId, mentionedUsers: mentionees, ...rest };
114
- }
115
-
116
- export function convertQueryParams({
117
- page,
118
- sortBy,
119
- subChannelId,
120
- tags,
121
- includeDeleted,
122
- ...rest
123
- }: Amity.QueryMessages): RawQueryMessages {
124
- const out: RawQueryMessages = {
125
- ...rest,
126
- messageFeedId: subChannelId,
127
- isDeleted: includeDeleted === false ? false : undefined,
128
- options: { token: toToken(page || { limit: 10 }, 'afterbeforeraw')! },
129
- };
130
-
131
- if (sortBy !== undefined) {
132
- out.options.sortBy = sortBy;
133
- }
134
-
135
- if (tags) {
136
- out.includeTags = tags;
137
- }
138
-
139
- return out;
140
- }
1
+ export * from './prepareMessagePayload';
@@ -0,0 +1,182 @@
1
+ import { pullFromCache } from '~/cache/api';
2
+ import { getResolver } from '~/core/model';
3
+ import { toToken } from '~/core/query';
4
+ import { getMessageMarkers } from '~/marker/api';
5
+ import { prepareMessagePayloadForCache } from '~/reaction/utils/prepareMessagePayloadForCache';
6
+
7
+ const getCachedMarker = (message: Amity.Message | Amity.RawMessage) => {
8
+ const key = {
9
+ creatorId: message.creatorId,
10
+ feedId: (<Amity.RawMessage>message).messageFeedId ?? (<Amity.Message>message).subChannelId,
11
+ contentId: message.messageId,
12
+ };
13
+
14
+ return pullFromCache<Amity.MessageMarker>([
15
+ 'messageMarker',
16
+ 'get',
17
+ getResolver('messageMarker')(key),
18
+ ])?.data;
19
+ };
20
+
21
+ const getReadCount = (message: Amity.Message | Amity.RawMessage, marker?: Amity.MessageMarker) =>
22
+ // Look in the marker param first
23
+ marker ??
24
+ // If the marker param is not set, look in the cache
25
+ getCachedMarker(message) ?? { readCount: 0, deliveredCount: 0 }; // and if not found in cache use default value `0`
26
+
27
+ export function convertFromRaw(
28
+ message: Amity.RawMessage,
29
+ marker?: Amity.MessageMarker,
30
+ ): Amity.Message {
31
+ const {
32
+ channelPublicId,
33
+ childCount,
34
+ creatorPublicId,
35
+ mentionedUsers,
36
+ messageFeedId,
37
+ myReactions,
38
+ reactionCount,
39
+ reactions,
40
+ referenceId,
41
+ segment,
42
+ messageId,
43
+ ...rest
44
+ } = message;
45
+
46
+ const { readCount, deliveredCount } = getReadCount(message, marker);
47
+
48
+ let cache: Amity.CacheEntry<Amity.Message> | undefined;
49
+
50
+ if (referenceId) {
51
+ cache = pullFromCache(['message', 'get', referenceId]);
52
+ }
53
+
54
+ if (!cache) {
55
+ cache = pullFromCache(['message', 'get', messageId]);
56
+ }
57
+
58
+ const out: Amity.Message = {
59
+ ...rest,
60
+ messageId,
61
+ channelId: channelPublicId,
62
+ channelSegment: segment,
63
+ childrenNumber: childCount,
64
+ creatorId: creatorPublicId,
65
+ reactions: reactions ?? {},
66
+ reactionsCount: reactionCount,
67
+ subChannelId: messageFeedId,
68
+ uniqueId: cache ? cache.data.uniqueId : messageId,
69
+ readCount,
70
+ deliveredCount,
71
+ };
72
+
73
+ if (mentionedUsers) {
74
+ out.mentionees = mentionedUsers.map(mention => {
75
+ if (mention.type === 'channel') {
76
+ return mention;
77
+ }
78
+
79
+ return { type: 'user', userIds: mention.userPublicIds };
80
+ });
81
+ }
82
+
83
+ if (myReactions) {
84
+ // http response
85
+ out.myReactions = myReactions;
86
+ } else {
87
+ // mqtt event
88
+ prepareMessagePayloadForCache(out);
89
+ }
90
+
91
+ return out;
92
+ }
93
+
94
+ export function updateMessageMarker(
95
+ message: Amity.Message,
96
+ marker?: Amity.MessageMarker,
97
+ ): Amity.Message {
98
+ const { readCount, deliveredCount } = getReadCount(message, marker);
99
+
100
+ return {
101
+ ...message,
102
+ readCount,
103
+ deliveredCount,
104
+ updatedAt: new Date().toISOString(),
105
+ };
106
+ }
107
+
108
+ export const prepareMessagePayload = async (
109
+ payload: Amity.MessagePayload,
110
+ ): Promise<Amity.ProcessedMessagePayload> => {
111
+ // make a fetch marker to prepare it for merging with the raw message payload.
112
+ let markers: Amity.MessageMarker[] = [];
113
+
114
+ const markerIds = payload.messages.map(({ messageId }) => messageId);
115
+
116
+ if (markerIds.length > 0)
117
+ // from the spec, allow marker fetch to fail
118
+ try {
119
+ ({ data: markers } = await getMessageMarkers(markerIds));
120
+ } catch (e) {
121
+ // empty block
122
+ }
123
+
124
+ return {
125
+ ...payload,
126
+ messages: payload.messages.map(message => {
127
+ const marker = markers?.find(({ contentId }) => contentId === message.messageId);
128
+
129
+ return convertFromRaw(message, marker);
130
+ }),
131
+ };
132
+ };
133
+
134
+ type RawQueryMessages = Omit<
135
+ Amity.QueryMessages,
136
+ /*
137
+ * include deleted is for internal sdk use only. The server expects isDeleted
138
+ */
139
+ 'page' | 'sortBy' | 'subChannelId' | 'tags' | 'includeDeleted'
140
+ > & {
141
+ includeTags?: Amity.QueryMessages['tags'];
142
+ isDeleted?: Amity.Message['isDeleted'];
143
+ messageFeedId: Amity.QueryMessages['subChannelId'];
144
+ options: {
145
+ sortBy?: Amity.QueryMessages['sortBy'];
146
+ token: string;
147
+ };
148
+ };
149
+
150
+ export function convertParams({
151
+ subChannelId,
152
+ mentionees,
153
+ ...rest
154
+ }: Partial<Amity.Message>): Record<string, any> {
155
+ return { messageFeedId: subChannelId, mentionedUsers: mentionees, ...rest };
156
+ }
157
+
158
+ export function convertQueryParams({
159
+ page,
160
+ sortBy,
161
+ subChannelId,
162
+ tags,
163
+ includeDeleted,
164
+ ...rest
165
+ }: Amity.QueryMessages): RawQueryMessages {
166
+ const out: RawQueryMessages = {
167
+ ...rest,
168
+ messageFeedId: subChannelId,
169
+ isDeleted: includeDeleted === false ? false : undefined,
170
+ options: { token: toToken(page || { limit: 10 }, 'afterbeforeraw')! },
171
+ };
172
+
173
+ if (sortBy !== undefined) {
174
+ out.options.sortBy = sortBy;
175
+ }
176
+
177
+ if (tags) {
178
+ out.includeTags = tags;
179
+ }
180
+
181
+ return out;
182
+ }
@@ -3,6 +3,8 @@ import { getActiveClient } from '~/client/api';
3
3
  import { pullFromCache } from '~/cache/api';
4
4
  import { ingestInCache } from '~/cache/api/ingestInCache';
5
5
  import { prepareMembershipPayload } from '~/group/utils';
6
+ import { checkIfShouldGoesToTombstone } from '~/cache/utils';
7
+ import { pushToTombstone } from '~/cache/api/pushToTombstone';
6
8
 
7
9
  /* begin_public_function
8
10
  id: post.get_by_ids
@@ -29,10 +31,24 @@ export const getPosts = async (
29
31
 
30
32
  const encodedPostIds = postIds.map(postId => encodeURIComponent(postId));
31
33
 
32
- // API-FIX: endpoint should not be /list, parameters should be querystring.
33
- const { data: payload } = await client.http.get<Amity.PostPayload>(`/api/v3/posts/list`, {
34
- params: { postIds: encodedPostIds },
35
- });
34
+ let payload: Amity.PostPayload;
35
+
36
+ try {
37
+ // API-FIX: endpoint should not be /list, parameters should be querystring.
38
+ const response = await client.http.get<Amity.PostPayload>(`/api/v3/posts/list`, {
39
+ params: { postIds: encodedPostIds },
40
+ });
41
+
42
+ payload = response.data;
43
+ } catch (error) {
44
+ postIds.forEach(postId => {
45
+ if (checkIfShouldGoesToTombstone((error as Amity.ErrorResponse)?.code)) {
46
+ pushToTombstone('post', postId);
47
+ }
48
+ });
49
+
50
+ throw error;
51
+ }
36
52
 
37
53
  const data = prepareMembershipPayload(payload, 'communityUsers');
38
54
 
@@ -0,0 +1,18 @@
1
+ import { getPosts } from '~/post/api';
2
+ import { client, connectClient, disconnectClient, post11, post12 } from '~/utils/tests';
3
+ import { ASCApiError } from '~/core/errors';
4
+
5
+ describe('getPosts', () => {
6
+ beforeAll(connectClient);
7
+ afterAll(disconnectClient);
8
+
9
+ test('Should return Error: 400400 when getPosts from invalid postId', async () => {
10
+ client.http.get = jest
11
+ .fn()
12
+ .mockRejectedValueOnce(
13
+ new ASCApiError('not found!', Amity.ServerError.ITEM_NOT_FOUND, Amity.ErrorLevel.ERROR),
14
+ );
15
+
16
+ await expect(getPosts([post11.postId, post12.postId])).rejects.toThrow();
17
+ });
18
+ });
@@ -42,8 +42,8 @@ export const onReactionAdded = (
42
42
  if (referenceType === 'message') {
43
43
  const client = getActiveClient();
44
44
 
45
- const filter = (rawPayload: Amity.MessagePayload) => {
46
- const payload = prepareMessagePayload(rawPayload);
45
+ const filter = async (rawPayload: Amity.MessagePayload) => {
46
+ const payload = await prepareMessagePayload(rawPayload);
47
47
  const cached = pullFromCache<Amity.Message>([
48
48
  'message',
49
49
  'get',
@@ -38,8 +38,8 @@ export const onReactionRemoved = (
38
38
  if (referenceType === 'message') {
39
39
  const client = getActiveClient();
40
40
 
41
- const filter = (rawPayload: Amity.MessagePayload) => {
42
- const payload = prepareMessagePayload(rawPayload);
41
+ const filter = async (rawPayload: Amity.MessagePayload) => {
42
+ const payload = await prepareMessagePayload(rawPayload);
43
43
  const cached = pullFromCache<Amity.Message>([
44
44
  'message',
45
45
  'get',
@@ -38,8 +38,8 @@ export const onReactorAdded = (
38
38
  };
39
39
 
40
40
  if (referenceType === 'message') {
41
- const filter = (rawPayload: Amity.MessagePayload) => {
42
- const payload = prepareMessagePayload(rawPayload);
41
+ const filter = async (rawPayload: Amity.MessagePayload) => {
42
+ const payload = await prepareMessagePayload(rawPayload);
43
43
  if (!payload.messages[0].latestReaction) return;
44
44
 
45
45
  const { eventName, referenceId, referenceType, userDisplayName, ...reactor } =
@@ -38,8 +38,8 @@ export const onReactorRemoved = (
38
38
  };
39
39
 
40
40
  if (referenceType === 'message') {
41
- const filter = (rawPayload: Amity.MessagePayload) => {
42
- const payload = prepareMessagePayload(rawPayload);
41
+ const filter = async (rawPayload: Amity.MessagePayload) => {
42
+ const payload = await prepareMessagePayload(rawPayload);
43
43
  if (!payload.messages[0].latestReaction) return;
44
44
 
45
45
  const { eventName, referenceId, referenceType, ...reactor } =