@amityco/ts-sdk 0.0.1-beta.42.3 → 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 (296) 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/index.d.ts +0 -2
  22. package/dist/channel/api/index.d.ts.map +1 -1
  23. package/dist/channel/events/onChannelUpdated.d.ts.map +1 -1
  24. package/dist/channel/utils/index.d.ts +1 -2
  25. package/dist/channel/utils/index.d.ts.map +1 -1
  26. package/dist/channel/utils/prepareChannelPayload.d.ts +6 -0
  27. package/dist/channel/utils/prepareChannelPayload.d.ts.map +1 -0
  28. package/dist/channel/utils/tests/prepareChannelPayload.test.d.ts +5 -1
  29. package/dist/channel/utils/tests/prepareChannelPayload.test.d.ts.map +1 -1
  30. package/dist/client/api/activeUser.d.ts +2 -2
  31. package/dist/client/api/activeUser.d.ts.map +1 -1
  32. package/dist/client/api/connectClient.d.ts.map +1 -1
  33. package/dist/client/api/index.d.ts +2 -0
  34. package/dist/client/api/index.d.ts.map +1 -1
  35. package/dist/client/api/markerSync.d.ts +21 -0
  36. package/dist/client/api/markerSync.d.ts.map +1 -0
  37. package/dist/client/observers/getTotalUnreadCount.d.ts +18 -0
  38. package/dist/client/observers/getTotalUnreadCount.d.ts.map +1 -0
  39. package/dist/client/observers/index.d.ts +2 -0
  40. package/dist/client/observers/index.d.ts.map +1 -0
  41. package/dist/client/observers/tests/getTotalUnreadCount.test.d.ts +2 -0
  42. package/dist/client/observers/tests/getTotalUnreadCount.test.d.ts.map +1 -0
  43. package/dist/client/utils/index.d.ts +2 -0
  44. package/dist/client/utils/index.d.ts.map +1 -0
  45. package/dist/client/utils/markerSyncEngine.d.ts +46 -0
  46. package/dist/client/utils/markerSyncEngine.d.ts.map +1 -0
  47. package/dist/core/events.d.ts +3 -3
  48. package/dist/core/events.d.ts.map +1 -1
  49. package/dist/core/model/idResolvers.d.ts.map +1 -1
  50. package/dist/core/model/index.d.ts.map +1 -1
  51. package/dist/index.cjs.js +1921 -1185
  52. package/dist/index.d.ts +5 -0
  53. package/dist/index.d.ts.map +1 -1
  54. package/dist/index.esm.js +1891 -1186
  55. package/dist/index.umd.js +4 -4
  56. package/dist/marker/api/getChannelMarkers.d.ts +18 -0
  57. package/dist/marker/api/getChannelMarkers.d.ts.map +1 -0
  58. package/dist/marker/api/getMessageMarkers.d.ts +18 -0
  59. package/dist/marker/api/getMessageMarkers.d.ts.map +1 -0
  60. package/dist/marker/api/getSubChannelMarkers.d.ts +18 -0
  61. package/dist/marker/api/getSubChannelMarkers.d.ts.map +1 -0
  62. package/dist/marker/api/getUserMarker.d.ts +8 -0
  63. package/dist/marker/api/getUserMarker.d.ts.map +1 -0
  64. package/dist/marker/api/index.d.ts +5 -0
  65. package/dist/marker/api/index.d.ts.map +1 -0
  66. package/dist/marker/api/tests/getChannelMarkers.test.d.ts +2 -0
  67. package/dist/marker/api/tests/getChannelMarkers.test.d.ts.map +1 -0
  68. package/dist/marker/api/tests/getMessageMarkers.test.d.ts +2 -0
  69. package/dist/marker/api/tests/getMessageMarkers.test.d.ts.map +1 -0
  70. package/dist/marker/api/tests/getSubChannelMarkers.test.d.ts +2 -0
  71. package/dist/marker/api/tests/getSubChannelMarkers.test.d.ts.map +1 -0
  72. package/dist/marker/events/index.d.ts +7 -0
  73. package/dist/marker/events/index.d.ts.map +1 -0
  74. package/dist/marker/events/onChannelMarkerFetched.d.ts +17 -0
  75. package/dist/marker/events/onChannelMarkerFetched.d.ts.map +1 -0
  76. package/dist/marker/events/onFeedlMarkerFetched.d.ts +17 -0
  77. package/dist/marker/events/onFeedlMarkerFetched.d.ts.map +1 -0
  78. package/dist/marker/events/onMessageMarkerFetched.d.ts +17 -0
  79. package/dist/marker/events/onMessageMarkerFetched.d.ts.map +1 -0
  80. package/dist/marker/events/onSubChannelMarkerFetched.d.ts +17 -0
  81. package/dist/marker/events/onSubChannelMarkerFetched.d.ts.map +1 -0
  82. package/dist/marker/events/onSubChannelMarkerUpdated.d.ts +17 -0
  83. package/dist/marker/events/onSubChannelMarkerUpdated.d.ts.map +1 -0
  84. package/dist/marker/events/onUserMarkerFetched.d.ts +17 -0
  85. package/dist/marker/events/onUserMarkerFetched.d.ts.map +1 -0
  86. package/dist/message/api/getMessage.d.ts.map +1 -1
  87. package/dist/message/api/getMessages.d.ts.map +1 -1
  88. package/dist/message/api/index.d.ts +1 -0
  89. package/dist/message/api/index.d.ts.map +1 -1
  90. package/dist/message/api/markAsDelivered.d.ts +17 -0
  91. package/dist/message/api/markAsDelivered.d.ts.map +1 -0
  92. package/dist/message/api/queryMessages.d.ts.map +1 -1
  93. package/dist/message/api/tests/markAsDelivered.test.d.ts +2 -0
  94. package/dist/message/api/tests/markAsDelivered.test.d.ts.map +1 -0
  95. package/dist/message/api/updateMessage.d.ts.map +1 -1
  96. package/dist/message/events/index.d.ts +1 -0
  97. package/dist/message/events/index.d.ts.map +1 -1
  98. package/dist/message/events/onMessageCreated.d.ts +2 -1
  99. package/dist/message/events/onMessageCreated.d.ts.map +1 -1
  100. package/dist/message/events/onMessageUpdated.d.ts.map +1 -1
  101. package/dist/message/utils/index.d.ts +1 -18
  102. package/dist/message/utils/index.d.ts.map +1 -1
  103. package/dist/message/utils/prepareMessagePayload.d.ts +16 -0
  104. package/dist/message/utils/prepareMessagePayload.d.ts.map +1 -0
  105. package/dist/report/api/createReport.d.ts.map +1 -1
  106. package/dist/report/api/deleteReport.d.ts.map +1 -1
  107. package/dist/subChannel/api/getSubChannels.d.ts.map +1 -1
  108. package/dist/subChannel/api/index.d.ts +2 -0
  109. package/dist/subChannel/api/index.d.ts.map +1 -1
  110. package/dist/subChannel/api/startReadingAPI.d.ts +17 -0
  111. package/dist/subChannel/api/startReadingAPI.d.ts.map +1 -0
  112. package/dist/subChannel/api/stopReadingAPI.d.ts +17 -0
  113. package/dist/subChannel/api/stopReadingAPI.d.ts.map +1 -0
  114. package/dist/subChannel/events/onSubChannelUpdated.d.ts +1 -1
  115. package/dist/subChannel/events/onSubChannelUpdated.d.ts.map +1 -1
  116. package/dist/subChannel/observers/liveSubChannel.d.ts.map +1 -1
  117. package/dist/subChannel/utils/index.d.ts +2 -7
  118. package/dist/subChannel/utils/index.d.ts.map +1 -1
  119. package/dist/subChannel/utils/markReadEngine.d.ts +33 -0
  120. package/dist/subChannel/utils/markReadEngine.d.ts.map +1 -0
  121. package/dist/subChannel/utils/prepareSubChannelPayload.d.ts +15 -0
  122. package/dist/subChannel/utils/prepareSubChannelPayload.d.ts.map +1 -0
  123. package/dist/utils/liveObject.d.ts +1 -1
  124. package/dist/utils/liveObject.d.ts.map +1 -1
  125. package/dist/utils/tests/client.d.ts +1 -0
  126. package/dist/utils/tests/client.d.ts.map +1 -1
  127. package/dist/utils/tests/dummy/channel.d.ts +4 -0
  128. package/dist/utils/tests/dummy/channel.d.ts.map +1 -1
  129. package/dist/utils/tests/dummy/index.d.ts +1 -0
  130. package/dist/utils/tests/dummy/index.d.ts.map +1 -1
  131. package/dist/utils/tests/dummy/marker.d.ts +6 -0
  132. package/dist/utils/tests/dummy/marker.d.ts.map +1 -0
  133. package/dist/utils/tests/dummy/message.d.ts +2 -0
  134. package/dist/utils/tests/dummy/message.d.ts.map +1 -1
  135. package/dist/utils/tests/dummy/subChannel.d.ts +1 -0
  136. package/dist/utils/tests/dummy/subChannel.d.ts.map +1 -1
  137. package/dist/utils/tests/utils.d.ts.map +1 -1
  138. package/package.json +1 -1
  139. package/src/@types/core/events.ts +13 -1
  140. package/src/@types/core/marker.ts +42 -0
  141. package/src/@types/core/model.ts +12 -0
  142. package/src/@types/core/payload.ts +52 -0
  143. package/src/@types/domains/channel.ts +5 -16
  144. package/src/@types/domains/client.ts +2 -0
  145. package/src/@types/domains/marker.ts +15 -0
  146. package/src/@types/domains/message.ts +3 -0
  147. package/src/@types/domains/partials.ts +4 -0
  148. package/src/@types/domains/subChannel.ts +2 -0
  149. package/src/channel/api/addChannelMembers.ts +1 -1
  150. package/src/channel/api/addChannelMembersRole.ts +1 -1
  151. package/src/channel/api/banChannelMembers.ts +1 -1
  152. package/src/channel/api/createChannel.ts +1 -1
  153. package/src/channel/api/getChannel.ts +1 -1
  154. package/src/channel/api/getChannels.ts +1 -1
  155. package/src/channel/api/index.ts +0 -3
  156. package/src/channel/api/joinChannel.ts +1 -1
  157. package/src/channel/api/leaveChannel.ts +1 -1
  158. package/src/channel/api/queryChannelMembers.ts +1 -1
  159. package/src/channel/api/queryChannels.ts +1 -1
  160. package/src/channel/api/removeChannelMembers.ts +1 -1
  161. package/src/channel/api/removeChannelMembersRole.ts +1 -1
  162. package/src/channel/api/tests/addChannelMembers.test.ts +16 -0
  163. package/src/channel/api/tests/createChannel.test.ts +29 -8
  164. package/src/channel/api/tests/getChannel.test.ts +11 -4
  165. package/src/channel/api/tests/getChannels.test.ts +20 -12
  166. package/src/channel/api/tests/queryChannelMembers.test.ts +13 -4
  167. package/src/channel/api/tests/queryChannels.test.ts +19 -9
  168. package/src/channel/api/unbanChannelMembers.ts +1 -1
  169. package/src/channel/api/updateChannel.ts +1 -1
  170. package/src/channel/events/onChannelCreated.ts +2 -2
  171. package/src/channel/events/onChannelDeleted.ts +4 -4
  172. package/src/channel/events/onChannelJoined.ts +2 -2
  173. package/src/channel/events/onChannelLeft.ts +2 -2
  174. package/src/channel/events/onChannelMemberAdded.ts +2 -2
  175. package/src/channel/events/onChannelMemberBanned.ts +3 -3
  176. package/src/channel/events/onChannelMemberRemoved.ts +2 -2
  177. package/src/channel/events/onChannelMemberUnbanned.ts +2 -2
  178. package/src/channel/events/onChannelMuted.ts +2 -2
  179. package/src/channel/events/onChannelUpdated.ts +25 -4
  180. package/src/channel/events/tests/onChannelCreated.test.ts +4 -1
  181. package/src/channel/events/tests/onChannelJoined.test.ts +5 -1
  182. package/src/channel/events/tests/onChannelMemberAdded.test.ts +5 -1
  183. package/src/channel/events/tests/onChannelMemberBanned.test.ts +4 -1
  184. package/src/channel/events/tests/onChannelMemberRemoved.test.ts +5 -1
  185. package/src/channel/events/tests/onChannelMemberUnbanned.test.ts +10 -10
  186. package/src/channel/events/tests/onChannelUpdated.test.ts +5 -1
  187. package/src/channel/observers/tests/liveChannelMembers.test.ts +5 -11
  188. package/src/channel/observers/tests/liveChannels.test.ts +21 -24
  189. package/src/channel/utils/index.ts +1 -57
  190. package/src/channel/utils/prepareChannelPayload.ts +91 -0
  191. package/src/channel/utils/tests/prepareChannelPayload.test.ts +102 -104
  192. package/src/client/api/activeUser.ts +2 -2
  193. package/src/client/api/connectClient.ts +2 -1
  194. package/src/client/api/index.ts +3 -0
  195. package/src/client/api/markerSync.ts +42 -0
  196. package/src/client/observers/getTotalUnreadCount.ts +52 -0
  197. package/src/client/observers/index.ts +1 -0
  198. package/src/client/observers/tests/getTotalUnreadCount.test.ts +126 -0
  199. package/src/client/utils/index.ts +1 -0
  200. package/src/client/utils/markerSyncEngine.ts +179 -0
  201. package/src/comment/api/tests/queryComments.test.ts +2 -2
  202. package/src/core/model/idResolvers.ts +7 -0
  203. package/src/core/model/identifyModel.ts +1 -1
  204. package/src/core/model/index.ts +6 -0
  205. package/src/core/tests/query/query/runQuery.test.ts +3 -1
  206. package/src/group/utils/withUser.ts +2 -2
  207. package/src/index.ts +6 -0
  208. package/src/marker/api/getChannelMarkers.ts +53 -0
  209. package/src/marker/api/getMessageMarkers.ts +54 -0
  210. package/src/marker/api/getSubChannelMarkers.ts +54 -0
  211. package/src/marker/api/getUserMarker.ts +47 -0
  212. package/src/marker/api/index.ts +4 -0
  213. package/src/marker/api/tests/getChannelMarkers.test.ts +109 -0
  214. package/src/marker/api/tests/getMessageMarkers.test.ts +114 -0
  215. package/src/marker/api/tests/getSubChannelMarkers.test.ts +116 -0
  216. package/src/marker/events/index.ts +10 -0
  217. package/src/marker/events/onChannelMarkerFetched.ts +34 -0
  218. package/src/marker/events/onFeedlMarkerFetched.ts +34 -0
  219. package/src/marker/events/onMessageMarkerFetched.ts +34 -0
  220. package/src/marker/events/onSubChannelMarkerFetched.ts +34 -0
  221. package/src/marker/events/onSubChannelMarkerUpdated.ts +34 -0
  222. package/src/marker/events/onUserMarkerFetched.ts +34 -0
  223. package/src/message/api/createMessage.ts +1 -1
  224. package/src/message/api/getMessage.ts +6 -5
  225. package/src/message/api/getMessages.ts +7 -6
  226. package/src/message/api/index.ts +1 -0
  227. package/src/message/api/markAsDelivered.ts +36 -0
  228. package/src/message/api/queryMessages.ts +8 -6
  229. package/src/message/api/tests/createMessage.test.ts +13 -4
  230. package/src/message/api/tests/getMessage.test.ts +12 -3
  231. package/src/message/api/tests/getMessages.test.ts +14 -5
  232. package/src/message/api/tests/markAsDelivered.test.ts +83 -0
  233. package/src/message/api/tests/queryMessages.test.ts +14 -3
  234. package/src/message/api/updateMessage.ts +8 -7
  235. package/src/message/events/index.ts +2 -0
  236. package/src/message/events/onMessageCreated.ts +14 -41
  237. package/src/message/events/onMessageDeleted.ts +2 -2
  238. package/src/message/events/onMessageFlagCleared.ts +2 -2
  239. package/src/message/events/onMessageFlagged.ts +2 -2
  240. package/src/message/events/onMessageReactionAdded.ts +2 -2
  241. package/src/message/events/onMessageReactionRemoved.ts +2 -2
  242. package/src/message/events/onMessageUnflagged.ts +2 -2
  243. package/src/message/events/onMessageUpdated.ts +27 -5
  244. package/src/message/tests/events.test.ts +4 -2
  245. package/src/message/tests/observers/liveMessage.test.ts +22 -10
  246. package/src/message/tests/observers/liveMessages.test.ts +25 -18
  247. package/src/message/utils/index.ts +1 -140
  248. package/src/message/utils/prepareMessagePayload.ts +182 -0
  249. package/src/reaction/events/onReactionAdded.ts +2 -2
  250. package/src/reaction/events/onReactionRemoved.ts +2 -2
  251. package/src/reaction/events/onReactorAdded.ts +2 -2
  252. package/src/reaction/events/onReactorRemoved.ts +2 -2
  253. package/src/report/api/createReport.ts +2 -1
  254. package/src/report/api/deleteReport.ts +2 -1
  255. package/src/subChannel/api/createSubChannel.ts +1 -1
  256. package/src/subChannel/api/getSubChannel.ts +1 -1
  257. package/src/subChannel/api/getSubChannels.ts +2 -1
  258. package/src/subChannel/api/index.ts +3 -0
  259. package/src/subChannel/api/querySubChannels.ts +1 -1
  260. package/src/subChannel/api/startReadingAPI.ts +33 -0
  261. package/src/subChannel/api/stopReadingAPI.ts +33 -0
  262. package/src/subChannel/api/tests/createSubChannel.test.ts +6 -3
  263. package/src/subChannel/api/tests/deleteSubChannel.test.ts +7 -5
  264. package/src/subChannel/api/tests/getSubChannel.test.ts +6 -4
  265. package/src/subChannel/api/tests/getSubChannels.test.ts +6 -3
  266. package/src/subChannel/api/tests/updateSubChannel.test.ts +6 -3
  267. package/src/subChannel/api/updateSubChannel.ts +1 -1
  268. package/src/subChannel/events/onSubChannelCreated.ts +2 -2
  269. package/src/subChannel/events/onSubChannelDeleted.ts +2 -2
  270. package/src/subChannel/events/onSubChannelUpdated.ts +43 -4
  271. package/src/subChannel/observers/liveSubChannel.ts +2 -0
  272. package/src/subChannel/observers/tests/liveSubChannel.test.ts +15 -10
  273. package/src/subChannel/observers/tests/liveSubChannels.test.ts +21 -14
  274. package/src/subChannel/utils/index.ts +2 -50
  275. package/src/subChannel/utils/markReadEngine.ts +117 -0
  276. package/src/subChannel/utils/prepareSubChannelPayload.ts +132 -0
  277. package/src/utils/liveObject.ts +15 -4
  278. package/src/utils/tests/client.ts +3 -1
  279. package/src/utils/tests/dummy/channel.ts +38 -21
  280. package/src/utils/tests/dummy/index.ts +1 -0
  281. package/src/utils/tests/dummy/marker.ts +68 -0
  282. package/src/utils/tests/dummy/message.ts +43 -3
  283. package/src/utils/tests/dummy/subChannel.ts +16 -5
  284. package/src/utils/tests/utils.ts +4 -1
  285. package/dist/channel/api/startReading.d.ts +0 -17
  286. package/dist/channel/api/startReading.d.ts.map +0 -1
  287. package/dist/channel/api/stopReading.d.ts +0 -16
  288. package/dist/channel/api/stopReading.d.ts.map +0 -1
  289. package/dist/channel/api/tests/startReading.test.d.ts +0 -2
  290. package/dist/channel/api/tests/startReading.test.d.ts.map +0 -1
  291. package/dist/channel/api/tests/stopReading.test.d.ts +0 -2
  292. package/dist/channel/api/tests/stopReading.test.d.ts.map +0 -1
  293. package/src/channel/api/startReading.ts +0 -57
  294. package/src/channel/api/stopReading.ts +0 -53
  295. package/src/channel/api/tests/startReading.test.ts +0 -25
  296. package/src/channel/api/tests/stopReading.test.ts +0 -25
@@ -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
+ }
@@ -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 } =
@@ -50,7 +50,8 @@ export const createReport = async (
50
50
 
51
51
  if (client.cache) {
52
52
  if (referenceType === 'message') {
53
- ingestInCache(prepareMessagePayload(payload as Amity.MessagePayload));
53
+ const messagePayload = await prepareMessagePayload(payload as Amity.MessagePayload);
54
+ ingestInCache(messagePayload);
54
55
  } else if (referenceType === 'post') {
55
56
  ingestInCache(prepareMembershipPayload(payload as Amity.PostPayload, 'communityUsers'));
56
57
  } else {
@@ -50,7 +50,8 @@ export const deleteReport = async (
50
50
 
51
51
  if (client.cache) {
52
52
  if (referenceType === 'message') {
53
- ingestInCache(prepareMessagePayload(payload as Amity.MessagePayload));
53
+ const messagePayload = await prepareMessagePayload(payload as Amity.MessagePayload);
54
+ ingestInCache(messagePayload);
54
55
  } else if (referenceType === 'post') {
55
56
  ingestInCache(prepareMembershipPayload(payload as Amity.PostPayload, 'communityUsers'));
56
57
  } else {
@@ -30,7 +30,7 @@ export const createSubChannel = async <T extends Amity.ChannelType>(
30
30
  channelId: bundle.channelId,
31
31
  name: bundle.displayName,
32
32
  });
33
- const data = prepareSubChannelPayload(response.data);
33
+ const data = await prepareSubChannelPayload(response.data);
34
34
 
35
35
  const cachedAt = client.cache && Date.now();
36
36
  if (client.cache) ingestInCache(data, { cachedAt });
@@ -36,7 +36,7 @@ export const getSubChannel = async (
36
36
  const response = await client.http.get<Amity.SubChannelPayload>(
37
37
  `/api/v5/message-feeds/${encodeURIComponent(subChannelId)}`,
38
38
  );
39
- const data = prepareSubChannelPayload(response.data);
39
+ const data = await prepareSubChannelPayload(response.data);
40
40
 
41
41
  const cachedAt = client.cache && Date.now();
42
42
  if (client.cache) ingestInCache(data, { cachedAt });
@@ -27,7 +27,8 @@ export const getSubChannels = async (
27
27
  const response = await client.http.get<Amity.SubChannelPayload>('/api/v5/message-feeds/list', {
28
28
  params: { messageFeedIds: subChannelIds.map(encodeURIComponent) },
29
29
  });
30
- const data = prepareSubChannelPayload(response.data);
30
+
31
+ const data = await prepareSubChannelPayload(response.data);
31
32
 
32
33
  const cachedAt = client.cache && Date.now();
33
34
  if (client.cache) ingestInCache(data, { cachedAt });
@@ -6,3 +6,6 @@ export * from './getSubChannel';
6
6
  export * from './createSubChannel';
7
7
  export * from './updateSubChannel';
8
8
  export * from './deleteSubChannel';
9
+
10
+ export * from './startReadingAPI';
11
+ export * from './stopReadingAPI';
@@ -45,7 +45,7 @@ export const querySubChannels = async (
45
45
  );
46
46
 
47
47
  const { paging, ...payload } = response.data;
48
- const data = prepareSubChannelPayload(payload);
48
+ const data = await prepareSubChannelPayload(payload);
49
49
  const subChannels = data.messageFeeds;
50
50
  const cachedAt = client.cache && Date.now();
51
51
 
@@ -0,0 +1,33 @@
1
+ import { ingestInCache } from '~/cache/api/ingestInCache';
2
+ import { getActiveClient } from '~/client/api';
3
+
4
+ /**
5
+ * ```js
6
+ * import { SubChannel } from '@amityco/ts-sdk'
7
+ * const success = await SubChannel('foo')
8
+ * ```
9
+ *
10
+ * Mark all messages as read and start reading message inside channel
11
+ *
12
+ * @param messageFeedId - The sub channel ID to start reading.
13
+ * @return A success boolean if reading of the sub channel had begun.
14
+ *
15
+ * @category Channel API
16
+ * @async
17
+ * @private
18
+ */
19
+ export const startReadingAPI = async (
20
+ messageFeedId: Amity.SubChannel['subChannelId'],
21
+ ): Promise<boolean> => {
22
+ const client = getActiveClient();
23
+ client.log('channel/startReadingAPI', messageFeedId);
24
+
25
+ const { data: payload } = await client.http.post<Amity.StartReadingPayload>(
26
+ `/api/v1/markers/message-feeds/${messageFeedId}/start-reading`,
27
+ );
28
+
29
+ const cachedAt = client.cache && Date.now();
30
+ if (client.cache) ingestInCache(payload as Amity.StartReadingPayload, { cachedAt });
31
+
32
+ return true;
33
+ };
@@ -0,0 +1,33 @@
1
+ import { ingestInCache } from '~/cache/api/ingestInCache';
2
+ import { getActiveClient } from '~/client/api';
3
+
4
+ /**
5
+ * ```js
6
+ * import { stopReading } from '@amityco/ts-sdk'
7
+ * const success = await stopReading('foo')
8
+ * ```
9
+ *
10
+ * Mark all messages as read and stop reading message inside channel
11
+ *
12
+ * @param messageFeedId - The sub channel ID to stop reading.
13
+ * @return A success boolean if reading of the sub channel had begun.
14
+ *
15
+ * @category Channel API
16
+ * @async
17
+ * @private
18
+ */
19
+ export const stopReadingAPI = async (
20
+ messageFeedId: Amity.SubChannel['subChannelId'],
21
+ ): Promise<boolean> => {
22
+ const client = getActiveClient();
23
+ client.log('channel/stopReadingAPI', messageFeedId);
24
+
25
+ const { data: payload } = await client.http.post<Amity.StopReadingPayload>(
26
+ `/api/v1/markers/message-feeds/${messageFeedId}/stop-reading`,
27
+ );
28
+
29
+ const cachedAt = client.cache && Date.now();
30
+ if (client.cache) ingestInCache(payload as Amity.StopReadingPayload, { cachedAt });
31
+
32
+ return true;
33
+ };
@@ -1,11 +1,12 @@
1
- import { createSubChannel } from '../createSubChannel';
2
- import { client, generateRawSubChannel } from '~/utils/tests';
1
+ import { client, connectClient, disconnectClient, generateRawSubChannel } from '~/utils/tests';
3
2
 
4
3
  import { onSubChannelCreated } from '~/subChannel/events';
5
4
 
6
5
  import { disableCache, enableCache, pullFromCache } from '~/cache/api';
7
6
  import { ASCApiError } from '~/core/errors';
8
7
 
8
+ import { createSubChannel } from '../createSubChannel';
9
+
9
10
  const subChannelId = 'channelId11--sub-channel-id';
10
11
 
11
12
  const subChannelPayload = {
@@ -14,8 +15,10 @@ const subChannelPayload = {
14
15
  };
15
16
 
16
17
  describe('createSubChannel', () => {
17
- beforeEach(enableCache);
18
+ beforeAll(connectClient);
19
+ afterAll(disconnectClient);
18
20
 
21
+ beforeEach(enableCache);
19
22
  afterEach(disableCache);
20
23
 
21
24
  // integration_test_id: fa72f0eb-b22b-4b9a-9e55-3a163a0ebd2a
@@ -1,16 +1,18 @@
1
- import { deleteSubChannel } from '../deleteSubChannel';
2
- import { onSubChannelDeleted } from '../../events';
3
-
4
- import { client, generateRawSubChannel } from '~/utils/tests';
1
+ import { client, connectClient, disconnectClient, generateRawSubChannel } from '~/utils/tests';
5
2
 
6
3
  import { disableCache, enableCache, pullFromCache } from '~/cache/api';
7
4
  import { ASCApiError } from '~/core/errors';
8
5
 
6
+ import { deleteSubChannel } from '../deleteSubChannel';
7
+ import { onSubChannelDeleted } from '../../events';
8
+
9
9
  const subChannelId = 'channelId11--sub-channel-id';
10
10
 
11
11
  describe('createSubChannel', () => {
12
- beforeEach(enableCache);
12
+ beforeAll(connectClient);
13
+ afterAll(disconnectClient);
13
14
 
15
+ beforeEach(enableCache);
14
16
  afterEach(disableCache);
15
17
 
16
18
  // integration_test_id: 43ba1273-4560-4cea-93ce-cf5728b2a475