@amityco/ts-sdk 0.0.1-beta.36 → 0.0.1-beta.38

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 (279) hide show
  1. package/.eslintrc.json +3 -5
  2. package/dist/@types/core/errors.d.ts +1 -0
  3. package/dist/@types/core/errors.d.ts.map +1 -1
  4. package/dist/@types/core/events.d.ts +5 -0
  5. package/dist/@types/core/events.d.ts.map +1 -1
  6. package/dist/@types/domains/category.d.ts +7 -0
  7. package/dist/@types/domains/category.d.ts.map +1 -1
  8. package/dist/@types/domains/client.d.ts +21 -1
  9. package/dist/@types/domains/client.d.ts.map +1 -1
  10. package/dist/@types/domains/community.d.ts +12 -0
  11. package/dist/@types/domains/community.d.ts.map +1 -1
  12. package/dist/@types/global.d.ts +12 -0
  13. package/dist/@types/global.d.ts.map +1 -1
  14. package/dist/category/api/queryCategories.d.ts +1 -5
  15. package/dist/category/api/queryCategories.d.ts.map +1 -1
  16. package/dist/category/observers/index.d.ts +2 -0
  17. package/dist/category/observers/index.d.ts.map +1 -0
  18. package/dist/category/observers/liveCategories.d.ts +18 -0
  19. package/dist/category/observers/liveCategories.d.ts.map +1 -0
  20. package/dist/category/observers/tests/liveCategories.test.d.ts +2 -0
  21. package/dist/category/observers/tests/liveCategories.test.d.ts.map +1 -0
  22. package/dist/channel/api/tests/getChannels.test.d.ts +2 -0
  23. package/dist/channel/api/tests/getChannels.test.d.ts.map +1 -0
  24. package/dist/channel/api/tests/leaveChannel.test.d.ts +2 -0
  25. package/dist/channel/api/tests/leaveChannel.test.d.ts.map +1 -0
  26. package/dist/channel/observers/liveChannel.d.ts.map +1 -1
  27. package/dist/client/api/accessTokenExpiryWatcher.d.ts +7 -0
  28. package/dist/client/api/accessTokenExpiryWatcher.d.ts.map +1 -0
  29. package/dist/client/api/activeUser.d.ts +1 -1
  30. package/dist/client/api/activeUser.d.ts.map +1 -1
  31. package/dist/client/api/connectClient.d.ts +1 -1
  32. package/dist/client/api/connectClient.d.ts.map +1 -1
  33. package/dist/client/api/createClient.d.ts +1 -1
  34. package/dist/client/api/createClient.d.ts.map +1 -1
  35. package/dist/client/api/disconnectClient.d.ts +0 -1
  36. package/dist/client/api/disconnectClient.d.ts.map +1 -1
  37. package/dist/client/api/getToken.d.ts +7 -5
  38. package/dist/client/api/getToken.d.ts.map +1 -1
  39. package/dist/client/api/index.d.ts +1 -0
  40. package/dist/client/api/index.d.ts.map +1 -1
  41. package/dist/client/api/renewal.d.ts +2 -0
  42. package/dist/client/api/renewal.d.ts.map +1 -0
  43. package/dist/client/api/setSessionState.d.ts +12 -0
  44. package/dist/client/api/setSessionState.d.ts.map +1 -0
  45. package/dist/client/api/terminateClient.d.ts +9 -0
  46. package/dist/client/api/terminateClient.d.ts.map +1 -0
  47. package/dist/client/api/tests/accessTokenExpiryWatcher.test.d.ts +2 -0
  48. package/dist/client/api/tests/accessTokenExpiryWatcher.test.d.ts.map +1 -0
  49. package/dist/client/api/tests/connectClient.test.d.ts +2 -0
  50. package/dist/client/api/tests/connectClient.test.d.ts.map +1 -0
  51. package/dist/client/api/tests/disconnectClient.test.d.ts +2 -0
  52. package/dist/client/api/tests/disconnectClient.test.d.ts.map +1 -0
  53. package/dist/client/api/tests/getToken.test.d.ts +2 -0
  54. package/dist/client/api/tests/getToken.test.d.ts.map +1 -0
  55. package/dist/client/api/tests/renewal.test.d.ts +2 -0
  56. package/dist/client/api/tests/renewal.test.d.ts.map +1 -0
  57. package/dist/client/api/tests/setSessionState.test.d.ts +2 -0
  58. package/dist/client/api/tests/setSessionState.test.d.ts.map +1 -0
  59. package/dist/client/api/tests/terminateClient.test.d.ts +2 -0
  60. package/dist/client/api/tests/terminateClient.test.d.ts.map +1 -0
  61. package/dist/client/events/index.d.ts +1 -0
  62. package/dist/client/events/index.d.ts.map +1 -1
  63. package/dist/client/events/onClientBanned.d.ts +1 -1
  64. package/dist/client/events/onClientBanned.d.ts.map +1 -1
  65. package/dist/client/events/onSessionStateChange.d.ts +17 -0
  66. package/dist/client/events/onSessionStateChange.d.ts.map +1 -0
  67. package/dist/client/events/onTokenExpired.d.ts +17 -0
  68. package/dist/client/events/onTokenExpired.d.ts.map +1 -0
  69. package/dist/client/events/onTokenTerminated.d.ts +11 -0
  70. package/dist/client/events/onTokenTerminated.d.ts.map +1 -0
  71. package/dist/client/events/tests/onSessionStateChange.test.d.ts +2 -0
  72. package/dist/client/events/tests/onSessionStateChange.test.d.ts.map +1 -0
  73. package/dist/client/events/tests/onTokenTerminated.test.d.ts +2 -0
  74. package/dist/client/events/tests/onTokenTerminated.test.d.ts.map +1 -0
  75. package/dist/client/utils/setClientToken.d.ts +19 -0
  76. package/dist/client/utils/setClientToken.d.ts.map +1 -0
  77. package/dist/comment/api/deleteComment.d.ts.map +1 -1
  78. package/dist/comment/api/getComment.d.ts.map +1 -1
  79. package/dist/comment/events/tests/onCommentDeleted.test.d.ts +2 -0
  80. package/dist/comment/events/tests/onCommentDeleted.test.d.ts.map +1 -0
  81. package/dist/comment/observers/index.d.ts +1 -0
  82. package/dist/comment/observers/index.d.ts.map +1 -1
  83. package/dist/comment/observers/liveComment.d.ts +21 -0
  84. package/dist/comment/observers/liveComment.d.ts.map +1 -0
  85. package/dist/comment/observers/tests/liveComment.test.d.ts +2 -0
  86. package/dist/comment/observers/tests/liveComment.test.d.ts.map +1 -0
  87. package/dist/community/api/queryCommunities.d.ts +1 -10
  88. package/dist/community/api/queryCommunities.d.ts.map +1 -1
  89. package/dist/community/events/index.d.ts +1 -0
  90. package/dist/community/events/index.d.ts.map +1 -1
  91. package/dist/community/events/onCommunityUserChanged.d.ts +17 -0
  92. package/dist/community/events/onCommunityUserChanged.d.ts.map +1 -0
  93. package/dist/community/events/utils.d.ts +1 -0
  94. package/dist/community/events/utils.d.ts.map +1 -1
  95. package/dist/community/observers/index.d.ts +1 -0
  96. package/dist/community/observers/index.d.ts.map +1 -1
  97. package/dist/community/observers/liveCommunities.d.ts +20 -0
  98. package/dist/community/observers/liveCommunities.d.ts.map +1 -0
  99. package/dist/community/observers/tests/liveCommunities.test.d.ts +2 -0
  100. package/dist/community/observers/tests/liveCommunities.test.d.ts.map +1 -0
  101. package/dist/core/events.d.ts +3 -3
  102. package/dist/core/events.d.ts.map +1 -1
  103. package/dist/core/query/sorting.d.ts +6 -0
  104. package/dist/core/query/sorting.d.ts.map +1 -1
  105. package/dist/core/subscription.d.ts.map +1 -1
  106. package/dist/core/transports/http.d.ts +0 -5
  107. package/dist/core/transports/http.d.ts.map +1 -1
  108. package/dist/file/api/test/createImage.test.d.ts +2 -0
  109. package/dist/file/api/test/createImage.test.d.ts.map +1 -0
  110. package/dist/file/api/test/createVideo.test.d.ts +2 -0
  111. package/dist/file/api/test/createVideo.test.d.ts.map +1 -0
  112. package/dist/index.cjs.js +944 -332
  113. package/dist/index.d.ts +1 -0
  114. package/dist/index.d.ts.map +1 -1
  115. package/dist/index.esm.js +937 -332
  116. package/dist/index.umd.js +4 -4
  117. package/dist/message/observers/liveMessage.d.ts.map +1 -1
  118. package/dist/post/observers/index.d.ts +1 -0
  119. package/dist/post/observers/index.d.ts.map +1 -1
  120. package/dist/post/observers/livePost.d.ts +21 -0
  121. package/dist/post/observers/livePost.d.ts.map +1 -0
  122. package/dist/post/observers/tests/livePost.test.d.ts +2 -0
  123. package/dist/post/observers/tests/livePost.test.d.ts.map +1 -0
  124. package/dist/stream/api/tests/createStream.test.d.ts +2 -0
  125. package/dist/stream/api/tests/createStream.test.d.ts.map +1 -0
  126. package/dist/stream/api/tests/deleteStream.test.d.ts +2 -0
  127. package/dist/stream/api/tests/deleteStream.test.d.ts.map +1 -0
  128. package/dist/stream/api/tests/getStream.test.d.ts +2 -0
  129. package/dist/stream/api/tests/getStream.test.d.ts.map +1 -0
  130. package/dist/subChannel/api/tests/createSubChannel.test.d.ts +2 -0
  131. package/dist/subChannel/api/tests/createSubChannel.test.d.ts.map +1 -0
  132. package/dist/subChannel/api/tests/deleteSubChannel.test.d.ts +2 -0
  133. package/dist/subChannel/api/tests/deleteSubChannel.test.d.ts.map +1 -0
  134. package/dist/subChannel/api/tests/getSubChannel.test.d.ts +2 -0
  135. package/dist/subChannel/api/tests/getSubChannel.test.d.ts.map +1 -0
  136. package/dist/subChannel/api/tests/getSubChannels.test.d.ts +2 -0
  137. package/dist/subChannel/api/tests/getSubChannels.test.d.ts.map +1 -0
  138. package/dist/subChannel/api/tests/updateSubChannel.test.d.ts +2 -0
  139. package/dist/subChannel/api/tests/updateSubChannel.test.d.ts.map +1 -0
  140. package/dist/subChannel/observers/liveSubChannel.d.ts.map +1 -1
  141. package/dist/user/api/tests/updateUser.test.d.ts +2 -0
  142. package/dist/user/api/tests/updateUser.test.d.ts.map +1 -0
  143. package/dist/user/observers/liveUser.d.ts.map +1 -1
  144. package/dist/utils/constants.d.ts +2 -0
  145. package/dist/utils/constants.d.ts.map +1 -1
  146. package/dist/utils/liveObject.d.ts +2 -0
  147. package/dist/utils/liveObject.d.ts.map +1 -0
  148. package/dist/utils/tests/client.d.ts.map +1 -1
  149. package/dist/utils/tests/dummy/category.d.ts +64 -0
  150. package/dist/utils/tests/dummy/category.d.ts.map +1 -0
  151. package/dist/utils/tests/dummy/channel.d.ts +50 -0
  152. package/dist/utils/tests/dummy/channel.d.ts.map +1 -1
  153. package/dist/utils/tests/dummy/community.d.ts +132 -0
  154. package/dist/utils/tests/dummy/community.d.ts.map +1 -1
  155. package/dist/utils/tests/dummy/file.d.ts +3 -0
  156. package/dist/utils/tests/dummy/file.d.ts.map +1 -1
  157. package/dist/utils/tests/dummy/index.d.ts +3 -0
  158. package/dist/utils/tests/dummy/index.d.ts.map +1 -1
  159. package/dist/utils/tests/dummy/post.d.ts +2 -0
  160. package/dist/utils/tests/dummy/post.d.ts.map +1 -1
  161. package/dist/utils/tests/dummy/stream.d.ts +83 -0
  162. package/dist/utils/tests/dummy/stream.d.ts.map +1 -0
  163. package/dist/utils/tests/dummy/token.d.ts +11 -0
  164. package/dist/utils/tests/dummy/token.d.ts.map +1 -0
  165. package/dist/utils/tests/dummy/user.d.ts +18 -0
  166. package/dist/utils/tests/dummy/user.d.ts.map +1 -1
  167. package/dist/utils/tests/liveObject.test.d.ts +2 -0
  168. package/dist/utils/tests/liveObject.test.d.ts.map +1 -0
  169. package/package.json +4 -4
  170. package/src/@types/core/errors.ts +1 -0
  171. package/src/@types/core/events.ts +7 -0
  172. package/src/@types/domains/category.ts +13 -0
  173. package/src/@types/domains/client.ts +45 -1
  174. package/src/@types/domains/community.ts +25 -0
  175. package/src/@types/global.ts +19 -0
  176. package/src/category/api/queryCategories.ts +3 -5
  177. package/src/category/observers/index.ts +1 -0
  178. package/src/category/observers/liveCategories.ts +141 -0
  179. package/src/category/observers/tests/liveCategories.test.ts +147 -0
  180. package/src/channel/api/tests/createChannel.test.ts +30 -6
  181. package/src/channel/api/tests/getChannel.test.ts +3 -1
  182. package/src/channel/api/tests/getChannels.test.ts +97 -0
  183. package/src/channel/api/tests/joinChannel.test.ts +62 -3
  184. package/src/channel/api/tests/leaveChannel.test.ts +90 -0
  185. package/src/channel/api/tests/queryChannels.test.ts +38 -1
  186. package/src/channel/observers/liveChannel.ts +8 -80
  187. package/src/client/api/accessTokenExpiryWatcher.ts +85 -0
  188. package/src/client/api/activeUser.ts +1 -1
  189. package/src/client/api/connectClient.ts +105 -24
  190. package/src/client/api/createClient.ts +9 -1
  191. package/src/client/api/disconnectClient.ts +26 -2
  192. package/src/client/api/getToken.ts +6 -6
  193. package/src/client/api/index.ts +2 -0
  194. package/src/client/api/renewal.ts +74 -0
  195. package/src/client/api/setSessionState.ts +75 -0
  196. package/src/client/api/terminateClient.ts +20 -0
  197. package/src/client/api/tests/accessTokenExpiryWatcher.test.ts +132 -0
  198. package/src/client/api/tests/connectClient.test.ts +84 -0
  199. package/src/client/api/tests/createClient.test.ts +8 -0
  200. package/src/client/api/tests/disconnectClient.test.ts +78 -0
  201. package/src/client/api/tests/getToken.test.ts +36 -0
  202. package/src/client/api/tests/renewal.test.ts +67 -0
  203. package/src/client/api/tests/setSessionState.test.ts +62 -0
  204. package/src/client/api/tests/terminateClient.test.ts +29 -0
  205. package/src/client/events/index.ts +2 -0
  206. package/src/client/events/onClientBanned.ts +12 -5
  207. package/src/client/events/onSessionStateChange.ts +31 -0
  208. package/src/client/events/onTokenExpired.ts +26 -0
  209. package/src/client/events/onTokenTerminated.ts +20 -0
  210. package/src/client/events/tests/onSessionStateChange.test.ts +37 -0
  211. package/src/client/events/tests/onTokenTerminated.test.ts +37 -0
  212. package/src/client/tests/connectClient.test.ts +6 -1
  213. package/src/client/utils/setClientToken.ts +39 -0
  214. package/src/comment/api/deleteComment.ts +5 -5
  215. package/src/comment/api/getComment.ts +8 -3
  216. package/src/comment/events/tests/onCommentDeleted.test.ts +27 -0
  217. package/src/comment/observers/index.ts +1 -0
  218. package/src/comment/observers/liveComment.ts +43 -0
  219. package/src/comment/observers/tests/liveComment.test.ts +95 -0
  220. package/src/community/api/queryCommunities.ts +3 -10
  221. package/src/community/api/test/addCommunityMember.test.ts +14 -2
  222. package/src/community/api/test/joinCommunity.test.ts +14 -2
  223. package/src/community/api/test/leaveCommunity.test.ts +11 -1
  224. package/src/community/api/test/removeCommunityMembers.test.ts +11 -1
  225. package/src/community/events/index.ts +1 -0
  226. package/src/community/events/onCommunityUserChanged.ts +20 -0
  227. package/src/community/events/test/onCommunityJoined.test.ts +1 -1
  228. package/src/community/events/test/onCommunityUserAdded.test.ts +1 -1
  229. package/src/community/events/test/onCommunityUserBanned.test.ts +1 -1
  230. package/src/community/events/test/onCommunityUserUnbaned.test.ts +1 -1
  231. package/src/community/events/test/utils.test.ts +52 -3
  232. package/src/community/events/utils.ts +49 -0
  233. package/src/community/observers/index.ts +1 -0
  234. package/src/community/observers/liveCommunities.ts +188 -0
  235. package/src/community/observers/tests/liveCommunities.test.ts +284 -0
  236. package/src/core/events.ts +5 -3
  237. package/src/core/query/sorting.ts +8 -0
  238. package/src/core/subscription.ts +3 -1
  239. package/src/core/transports/http.ts +52 -13
  240. package/src/core/transports/mqtt.ts +1 -1
  241. package/src/core/transports/test/http.test.ts +49 -60
  242. package/src/external/api/createUserToken.ts +2 -2
  243. package/src/file/api/createFile.ts +1 -1
  244. package/src/file/api/createImage.ts +1 -1
  245. package/src/file/api/createVideo.ts +1 -1
  246. package/src/file/api/test/createImage.test.ts +69 -0
  247. package/src/file/api/test/createVideo.test.ts +81 -0
  248. package/src/index.ts +1 -0
  249. package/src/message/observers/liveMessage.ts +11 -83
  250. package/src/message/tests/observers/liveMessage.test.ts +1 -143
  251. package/src/post/observers/index.ts +1 -0
  252. package/src/post/observers/livePost.ts +47 -0
  253. package/src/post/observers/tests/livePost.test.ts +97 -0
  254. package/src/stream/api/tests/createStream.test.ts +22 -0
  255. package/src/stream/api/tests/deleteStream.test.ts +50 -0
  256. package/src/stream/api/tests/getStream.test.ts +23 -0
  257. package/src/subChannel/api/tests/createSubChannel.test.ts +110 -0
  258. package/src/subChannel/api/tests/deleteSubChannel.test.ts +112 -0
  259. package/src/subChannel/api/tests/getSubChannel.test.ts +97 -0
  260. package/src/subChannel/api/tests/getSubChannels.test.ts +97 -0
  261. package/src/subChannel/api/tests/updateSubChannel.test.ts +86 -0
  262. package/src/subChannel/observers/liveSubChannel.ts +6 -56
  263. package/src/subChannel/observers/tests/liveSubChannel.test.ts +0 -82
  264. package/src/user/api/tests/updateUser.test.ts +60 -0
  265. package/src/user/observers/liveUser.ts +9 -61
  266. package/src/user/tests/observers/liveUser.test.ts +1 -154
  267. package/src/utils/constants.ts +2 -0
  268. package/src/utils/liveObject.ts +86 -0
  269. package/src/utils/tests/client.ts +18 -2
  270. package/src/utils/tests/dummy/category.ts +57 -0
  271. package/src/utils/tests/dummy/channel.ts +51 -1
  272. package/src/utils/tests/dummy/community.ts +94 -0
  273. package/src/utils/tests/dummy/file.ts +32 -0
  274. package/src/utils/tests/dummy/index.ts +4 -0
  275. package/src/utils/tests/dummy/post.ts +56 -45
  276. package/src/utils/tests/dummy/stream.ts +86 -0
  277. package/src/utils/tests/dummy/token.ts +12 -0
  278. package/src/utils/tests/dummy/user.ts +21 -0
  279. package/src/utils/tests/liveObject.test.ts +172 -0
@@ -37,4 +37,12 @@ describe('createClient', () => {
37
37
 
38
38
  expect(recieved).toStrictEqual(expected);
39
39
  });
40
+
41
+ test('it should set not logged in as the start up session state', () => {
42
+ const got = createClient('key', 'sg');
43
+ const { sessionState } = got;
44
+
45
+ expect(got).toBeDefined();
46
+ expect(sessionState).toBe(Amity.SessionStates.NOT_LOGGED_IN);
47
+ });
40
48
  });
@@ -0,0 +1,78 @@
1
+ import { pushToCache, pullFromCache, enableCache } from '~/cache/api';
2
+ import { client, connectClient, message11 as message } from '~/utils/tests';
3
+
4
+ import { disconnectClient } from '..';
5
+
6
+ const disconnect = () => setTimeout(() => client.ws.emit('disconnect'), 500);
7
+
8
+ describe('disconnectClient', () => {
9
+ beforeEach(async () => {
10
+ await connectClient();
11
+ });
12
+
13
+ test('it should disconnect client', async () => {
14
+ disconnect().unref();
15
+
16
+ const recieved = await disconnectClient();
17
+
18
+ expect(recieved).toBe(true);
19
+ });
20
+
21
+ test('it should set sesion state to notLoggedIn after disconnect', async () => {
22
+ disconnect().unref();
23
+ await disconnectClient();
24
+
25
+ expect(client.sessionState).toBe(Amity.SessionStates.NOT_LOGGED_IN);
26
+ });
27
+
28
+ test('it should not update sesion state if session state terminated', async () => {
29
+ client.sessionState = Amity.SessionStates.TERMINATED;
30
+ disconnect().unref();
31
+
32
+ await disconnectClient();
33
+
34
+ expect(client.sessionState).toBe(Amity.SessionStates.TERMINATED);
35
+ });
36
+
37
+ test('it should clear userId and accessToken on disconnect', async () => {
38
+ disconnect().unref();
39
+
40
+ await disconnectClient();
41
+
42
+ expect(client.userId).toBeUndefined();
43
+ expect(client.token).toBeUndefined();
44
+ });
45
+
46
+ test('it should clear auth header on disconnect', async () => {
47
+ disconnect().unref();
48
+
49
+ await disconnectClient();
50
+
51
+ expect(client.http.defaults.headers.common.Authorization).toBeFalsy();
52
+ });
53
+
54
+ test('it should clear cache on disconnect', async () => {
55
+ disconnect().unref();
56
+ enableCache();
57
+
58
+ const cacheKey = ['message', 'get', message.messageId];
59
+ pushToCache(cacheKey, message);
60
+
61
+ await disconnectClient();
62
+
63
+ expect(pullFromCache(cacheKey)).toBeUndefined();
64
+ });
65
+
66
+ test('it should not clear cache if tokenExpired', async () => {
67
+ client.sessionState = Amity.SessionStates.TOKEN_EXPIRED;
68
+ disconnect().unref();
69
+ enableCache();
70
+
71
+ const cacheKey = ['message', 'get', message.messageId];
72
+ pushToCache(cacheKey, message);
73
+
74
+ await disconnectClient();
75
+
76
+ expect(pullFromCache(cacheKey)?.data).toStrictEqual(message);
77
+ });
78
+ });
@@ -0,0 +1,36 @@
1
+ import { client, user11, sessionResponse } from '~/utils/tests';
2
+
3
+ import { getToken } from '../getToken';
4
+
5
+ describe('getToken', () => {
6
+ const { userId } = user11;
7
+ const displayName = 'test-displayName';
8
+ const deviceId = 'test-deviceId';
9
+ const params = { userId, displayName, deviceId };
10
+
11
+ test('it should call v3/sessions api', async () => {
12
+ const expected = '/api/v3/sessions';
13
+ const mockApi = jest.fn().mockResolvedValue(sessionResponse);
14
+ client.http.post = mockApi;
15
+
16
+ await getToken(params);
17
+ const [recieved] = mockApi.mock.lastCall;
18
+
19
+ expect(recieved).toBe(expected);
20
+ });
21
+
22
+ test('it should return token', async () => {
23
+ const expected = sessionResponse.data;
24
+ client.http.post = jest.fn().mockResolvedValue(sessionResponse);
25
+
26
+ const recieved = await getToken(params);
27
+
28
+ expect(recieved).toStrictEqual(expected);
29
+ });
30
+
31
+ test('it should throw error', async () => {
32
+ client.http.post = jest.fn().mockRejectedValue(new Error('error'));
33
+
34
+ await expect(getToken(params)).rejects.toThrow();
35
+ });
36
+ });
@@ -0,0 +1,67 @@
1
+ import { ACCESS_TOKEN_WATCHER_INTERVAL } from '~/utils/constants';
2
+ import { client, connectClient, disconnectClient, user11, pause } from '~/utils/tests';
3
+
4
+ import { renewal } from '../renewal';
5
+
6
+ const accessToken = 'renewed-access-token';
7
+ const sessionResponse = {
8
+ data: {
9
+ accessToken,
10
+ refreshToken: 'test-refresh-token',
11
+ issuedAt: new Date(),
12
+ expiresAt: new Date(),
13
+ users: [user11],
14
+ files: [],
15
+ },
16
+ };
17
+
18
+ describe('renewal', () => {
19
+ beforeAll(connectClient);
20
+
21
+ afterAll(disconnectClient);
22
+
23
+ test('it should renew access token', async () => {
24
+ const mock = jest.fn();
25
+ client.http.post = mock.mockResolvedValue(sessionResponse);
26
+
27
+ renewal().renew();
28
+ await pause();
29
+
30
+ expect(client.token?.accessToken).toBe(accessToken);
31
+ });
32
+
33
+ test('it should show warning message if renewal already called', async () => {
34
+ client.http.post = jest.fn().mockResolvedValue(sessionResponse);
35
+ jest.spyOn(global.console, 'log');
36
+
37
+ const expected = "'renew' method can be called only once per renewal instance";
38
+ const renewalInstance = renewal();
39
+
40
+ renewalInstance.renew();
41
+ await pause();
42
+
43
+ renewalInstance.renew();
44
+ await pause();
45
+
46
+ expect(console.log).toBeCalledWith(expected);
47
+ });
48
+
49
+ test('it should call renewal later if unable to renew', async () => {
50
+ jest.useFakeTimers();
51
+ const sessionHandler: Amity.SessionHandler = {
52
+ sessionWillRenewAccessToken(renewal) {
53
+ renewal.renew();
54
+ },
55
+ };
56
+
57
+ client.sessionHandler = sessionHandler;
58
+
59
+ const mock = jest.fn();
60
+ client.http.post = mock.mockResolvedValue(sessionResponse);
61
+
62
+ renewal().unableToRetrieveAuthToken();
63
+ jest.advanceTimersByTime(ACCESS_TOKEN_WATCHER_INTERVAL);
64
+
65
+ expect(mock).toBeCalled();
66
+ });
67
+ });
@@ -0,0 +1,62 @@
1
+ import { ASCError } from '~/core/errors';
2
+ import { getActiveClient } from '../activeClient';
3
+
4
+ import { connectClient, disconnectClient, pause } from '~/utils/tests';
5
+
6
+ import { setSessionState } from '../setSessionState';
7
+ import { onSessionStateChange } from '../../events';
8
+
9
+ describe('setSessionState', () => {
10
+ beforeEach(async () => {
11
+ await connectClient();
12
+ });
13
+
14
+ afterEach(async () => {
15
+ await disconnectClient();
16
+ });
17
+
18
+ test('it should set new session state', () => {
19
+ const client = getActiveClient();
20
+ const expected = Amity.SessionStates.NOT_LOGGED_IN;
21
+
22
+ setSessionState(expected);
23
+
24
+ expect(client.sessionState).toBe(expected);
25
+ });
26
+
27
+ test('it should return true if state changed successully', () => {
28
+ const expected = true;
29
+
30
+ const recieved = setSessionState(Amity.SessionStates.NOT_LOGGED_IN);
31
+
32
+ expect(recieved).toBe(expected);
33
+ });
34
+
35
+ test('it should fire event on state change', async () => {
36
+ const callback = jest.fn();
37
+
38
+ const expected = Amity.SessionStates.NOT_LOGGED_IN;
39
+ const unsub = onSessionStateChange(callback);
40
+
41
+ const recieved = setSessionState(expected);
42
+
43
+ // wait for event handler
44
+ await pause();
45
+
46
+ expect(recieved).toBe(true);
47
+ expect(callback).toHaveBeenCalledWith(expected);
48
+
49
+ unsub();
50
+ });
51
+
52
+ test('it should not allow invalid state change', async () => {
53
+ /*
54
+ * as state changes from established -> established are not possible, even
55
+ * for cases when logging in with already logged in user it should go to
56
+ * establishing first
57
+ */
58
+ const nextState = Amity.SessionStates.ESTABLISHED;
59
+
60
+ expect(setSessionState(nextState)).toBe(false);
61
+ });
62
+ });
@@ -0,0 +1,29 @@
1
+ import { client, connectClient } from '~/utils/tests';
2
+
3
+ import { terminateClient } from '../terminateClient';
4
+
5
+ const disconnect = () => setTimeout(() => client.ws.emit('disconnect'), 500);
6
+
7
+ describe('terminateClient', () => {
8
+ beforeAll(async () => {
9
+ await connectClient();
10
+ });
11
+
12
+ test('it should terminate client session', async () => {
13
+ disconnect().unref();
14
+
15
+ const expected = Amity.SessionStates.TERMINATED;
16
+
17
+ terminateClient();
18
+
19
+ expect(client.sessionState).toBe(expected);
20
+ });
21
+
22
+ test('it should clear sessionHandler', async () => {
23
+ disconnect().unref();
24
+
25
+ terminateClient();
26
+
27
+ expect(client.sessionHandler).toBeUndefined();
28
+ });
29
+ });
@@ -2,3 +2,5 @@ export * from './onConnectionError';
2
2
 
3
3
  export * from './onClientDisconnected';
4
4
  export * from './onClientBanned';
5
+
6
+ export * from './onSessionStateChange';
@@ -1,4 +1,6 @@
1
- import { onConnectionError } from './onConnectionError';
1
+ import { getActiveClient } from '~/client/api/activeClient';
2
+
3
+ import { createEventSubscriber } from '~/core/events';
2
4
 
3
5
  /**
4
6
  * ```js
@@ -15,8 +17,13 @@ import { onConnectionError } from './onConnectionError';
15
17
  *
16
18
  * @category Client Events
17
19
  */
18
- export const onClientBanned = (callback: Amity.Listener<void>): Amity.Unsubscriber => {
19
- return onConnectionError(({ code }) => {
20
- code === Amity.ServerError.GLOBAL_BAN && callback();
21
- });
20
+ export const onClientBanned = (callback: Amity.Listener<Amity.UserPayload>): Amity.Unsubscriber => {
21
+ const client = getActiveClient();
22
+
23
+ return createEventSubscriber(
24
+ client,
25
+ `client/onConnectionError(user.didGlobalBan)`,
26
+ 'user.didGlobalBan',
27
+ callback,
28
+ );
22
29
  };
@@ -0,0 +1,31 @@
1
+ import { getActiveClient } from '~/client/api/activeClient';
2
+
3
+ import { createEventSubscriber } from '~/core/events';
4
+
5
+ /**
6
+ * ```js
7
+ * import { onSessionStateChange } from '@amityco/ts-sdk'
8
+ * const dispose = onSessionStateChange((state: Amity.SessionStates) => {
9
+ * // ...
10
+ * })
11
+ * ```
12
+ *
13
+ * Fired when any {@link Amity.Client} has a session state change
14
+ *
15
+ * @param callback The function to call when the event was fired
16
+ * @returns an {@link Amity.Unsubscriber} function to stop listening
17
+ *
18
+ * @category Client Events
19
+ */
20
+ export const onSessionStateChange = (
21
+ callback: Amity.Listener<Amity.SessionStates>,
22
+ ): Amity.Unsubscriber => {
23
+ const client = getActiveClient();
24
+
25
+ return createEventSubscriber(
26
+ client,
27
+ `client/onSessionStateChange`,
28
+ 'sessionStateChange',
29
+ callback,
30
+ );
31
+ };
@@ -0,0 +1,26 @@
1
+ import { getActiveClient } from '~/client/api/activeClient';
2
+
3
+ import { createEventSubscriber } from '~/core/events';
4
+
5
+ /**
6
+ * ```js
7
+ * import { onTokenExpired } from '@amityco/ts-sdk'
8
+ * const dispose = onTokenExpired((state: Amity.SessionStates.TOKEN_EXPIRED) => {
9
+ * // ...
10
+ * })
11
+ * ```
12
+ *
13
+ * Fired when any {@link Amity.Client} session state has expired
14
+ *
15
+ * @param callback The function to call when the event was fired
16
+ * @returns an {@link Amity.Unsubscriber} function to stop listening
17
+ *
18
+ * @category private
19
+ */
20
+ export const onTokenExpired = (
21
+ callback: Amity.Listener<Amity.SessionStates.TOKEN_EXPIRED>,
22
+ ): Amity.Unsubscriber => {
23
+ const client = getActiveClient();
24
+
25
+ return createEventSubscriber(client, `client/onTokenExpired`, 'tokenExpired', callback);
26
+ };
@@ -0,0 +1,20 @@
1
+ import { getActiveClient } from '~/client/api/activeClient';
2
+
3
+ import { createEventSubscriber } from '~/core/events';
4
+
5
+ /**
6
+ *
7
+ * Fired when any {@link Amity.Client} session state has terminated
8
+ *
9
+ * @param callback The function to call when the event was fired
10
+ * @returns an {@link Amity.Unsubscriber} function to stop listening
11
+ *
12
+ * @category private
13
+ */
14
+ export const onTokenTerminated = (
15
+ callback: Amity.Listener<Amity.SessionStates.TERMINATED>,
16
+ ): Amity.Unsubscriber => {
17
+ const client = getActiveClient();
18
+
19
+ return createEventSubscriber(client, `client/onTokenTerminated`, 'tokenTerminated', callback);
20
+ };
@@ -0,0 +1,37 @@
1
+ import { client, connectClient, disconnectClient } from '~/utils/tests';
2
+
3
+ import { onSessionStateChange } from '../onSessionStateChange';
4
+
5
+ describe('onSessionStateChange', () => {
6
+ beforeAll(async () => {
7
+ await connectClient();
8
+ });
9
+
10
+ afterAll(async () => {
11
+ await disconnectClient();
12
+ });
13
+
14
+ test('it should call callback on event', () => {
15
+ const callback = jest.fn();
16
+ const expected = Amity.SessionStates.ESTABLISHED;
17
+
18
+ const unsub = onSessionStateChange(callback);
19
+ client.emitter.emit('sessionStateChange', expected);
20
+
21
+ expect(callback).toHaveBeenCalledWith(expected);
22
+
23
+ unsub();
24
+ });
25
+
26
+ test('it should not call callback if unsubscribed', () => {
27
+ const callback = jest.fn();
28
+ const state = Amity.SessionStates.ESTABLISHED;
29
+
30
+ const unsub = onSessionStateChange(callback);
31
+ unsub();
32
+
33
+ client.emitter.emit('sessionStateChange', state);
34
+
35
+ expect(callback).not.toHaveBeenCalled();
36
+ });
37
+ });
@@ -0,0 +1,37 @@
1
+ import { client, connectClient, disconnectClient } from '~/utils/tests';
2
+
3
+ import { onTokenTerminated } from '../onTokenTerminated';
4
+
5
+ describe('onTokenTerminated', () => {
6
+ beforeAll(async () => {
7
+ await connectClient();
8
+ });
9
+
10
+ afterAll(async () => {
11
+ await disconnectClient();
12
+ });
13
+
14
+ test('it should call callback on event', () => {
15
+ const callback = jest.fn();
16
+ const expected = Amity.SessionStates.TERMINATED;
17
+
18
+ const unsub = onTokenTerminated(callback);
19
+ client.emitter.emit('tokenTerminated', expected);
20
+
21
+ expect(callback).toHaveBeenCalledWith(expected);
22
+
23
+ unsub();
24
+ });
25
+
26
+ test('it should not call callback if unsubscribed', () => {
27
+ const callback = jest.fn();
28
+ const state = Amity.SessionStates.TERMINATED;
29
+
30
+ const unsub = onTokenTerminated(callback);
31
+ unsub();
32
+
33
+ client.emitter.emit('tokenTerminated', state);
34
+
35
+ expect(callback).not.toHaveBeenCalled();
36
+ });
37
+ });
@@ -4,6 +4,7 @@ import {
4
4
  getSmartFeedChannelTopic,
5
5
  getSmartFeedSubChannelTopic,
6
6
  getSmartFeedMessageTopic,
7
+ getUserTopic,
7
8
  subscribeTopic,
8
9
  } from '~/core/subscription';
9
10
 
@@ -12,6 +13,7 @@ jest.mock('~/core/subscription', () => ({
12
13
  ...jest.requireActual('~/core/subscription'),
13
14
  subscribeTopic: jest.fn(),
14
15
  getNetworkTopic: jest.fn(),
16
+ getUserTopic: jest.fn(),
15
17
  getSmartFeedChannelTopic: jest.fn(),
16
18
  getSmartFeedSubChannelTopic: jest.fn(),
17
19
  getSmartFeedMessageTopic: jest.fn(),
@@ -20,16 +22,19 @@ jest.mock('~/core/subscription', () => ({
20
22
  describe('connectClient', () => {
21
23
  test('should subscribe to network and smart feed topic', async () => {
22
24
  (getNetworkTopic as jest.Mock).mockReturnValue('network-topic');
25
+ (getUserTopic as jest.Mock).mockReturnValue('user-topic');
23
26
  (getSmartFeedChannelTopic as jest.Mock).mockReturnValue('smart-feed-channel-topic');
24
27
  (getSmartFeedSubChannelTopic as jest.Mock).mockReturnValue('smart-feed-sub-channel-topic');
25
28
  (getSmartFeedMessageTopic as jest.Mock).mockReturnValue('smart-feed-message-topic');
26
29
 
27
30
  await connectClient();
28
31
 
29
- expect(subscribeTopic).toBeCalledTimes(4);
32
+ expect(subscribeTopic).toBeCalledTimes(5);
33
+
30
34
  expect(subscribeTopic).toHaveBeenNthCalledWith(1, 'network-topic');
31
35
  expect(subscribeTopic).toHaveBeenNthCalledWith(2, 'smart-feed-channel-topic');
32
36
  expect(subscribeTopic).toHaveBeenNthCalledWith(3, 'smart-feed-sub-channel-topic');
33
37
  expect(subscribeTopic).toHaveBeenNthCalledWith(4, 'smart-feed-message-topic');
38
+ expect(subscribeTopic).toHaveBeenNthCalledWith(5, 'user-topic');
34
39
  });
35
40
  });
@@ -0,0 +1,39 @@
1
+ import { getActiveClient } from '../api/activeClient';
2
+ import { setSessionState } from '../api/setSessionState';
3
+ import { getToken } from '../api/getToken';
4
+
5
+ /**
6
+ * A util to set or refresh client token
7
+ *
8
+ * @param params.userId the user ID for the current session
9
+ * @param params.displayName the user's displayName for the current session
10
+ * @param params.deviceId Manual override of the user's device id (for device management)
11
+ * @param params.authToken The authentication token - necessary when network option is set to secure
12
+ * @returns token & user info
13
+ *
14
+ * @category private
15
+ * @async
16
+ */
17
+ export const setClientToken = async (params: Parameters<typeof getToken>) => {
18
+ const client = getActiveClient();
19
+ // begin establishing session
20
+ setSessionState(Amity.SessionStates.ESTABLISHING);
21
+
22
+ // @ts-ignore: in that particular case, typing can be
23
+ // ignored since we enforce default values just before.
24
+ const { accessToken, users, expiresAt, issuedAt, refreshToken } = await getToken(params);
25
+
26
+ // manually setup the token for http transport
27
+ client.http.defaults.headers.common.Authorization = `Bearer ${accessToken}`;
28
+
29
+ client.http.defaults.metadata = { tokenExpiry: expiresAt };
30
+
31
+ // manually setup the token for ws transport
32
+ client.ws.io.opts.query = { token: accessToken };
33
+
34
+ client.token = { accessToken, issuedAt, expiresAt };
35
+
36
+ setSessionState(Amity.SessionStates.ESTABLISHED);
37
+
38
+ return { accessToken, users, refreshToken };
39
+ };
@@ -1,10 +1,12 @@
1
1
  import { getActiveClient } from '~/client/api';
2
2
 
3
- import { dropFromCache, upsertInCache } from '~/cache/api';
3
+ import { upsertInCache } from '~/cache/api';
4
4
  import { fireEvent } from '~/core/events';
5
5
 
6
- import { getComment } from './getComment';
7
6
  import { getPost } from '~/post/api/getPost';
7
+ import { pushToTombstone } from '~/cache/api/pushToTombstone';
8
+ import { scheduleTask } from '~/core/microtasks';
9
+ import { getComment } from './getComment';
8
10
 
9
11
  /**
10
12
  * ```js
@@ -49,9 +51,7 @@ export const deleteComment = async (
49
51
  fireEvent('comment.deleted', { comments: [deleted] });
50
52
 
51
53
  if (permanent) {
52
- setTimeout(() => {
53
- dropFromCache(['comment', 'get', commentId], true);
54
- }, 0);
54
+ scheduleTask(() => pushToTombstone('comment', commentId));
55
55
  } else {
56
56
  upsertInCache(['comment', 'get', commentId], { isDeleted: true });
57
57
  }
@@ -1,7 +1,10 @@
1
1
  import { getActiveClient } from '~/client/api';
2
2
 
3
- import { pullFromCache, dropFromCache } from '~/cache/api';
3
+ import { pullFromCache } from '~/cache/api';
4
4
  import { ingestInCache } from '~/cache/api/ingestInCache';
5
+ import { isInTombstone } from '~/cache/api/isInTombstone';
6
+ import { checkIfShouldGoesToTombstone } from '~/cache/utils';
7
+ import { pushToTombstone } from '~/cache/api/pushToTombstone';
5
8
 
6
9
  /**
7
10
  * ```js
@@ -23,6 +26,8 @@ export const getComment = async (
23
26
  const client = getActiveClient();
24
27
  client.log('comment/getComment', commentId);
25
28
 
29
+ isInTombstone('comment', commentId);
30
+
26
31
  let data: Amity.CommentPayload;
27
32
 
28
33
  try {
@@ -33,8 +38,8 @@ export const getComment = async (
33
38
 
34
39
  data = response.data;
35
40
  } catch (error) {
36
- if ((error as Amity.ErrorResponse)?.code === Amity.ServerError.ITEM_NOT_FOUND) {
37
- dropFromCache(['comment', 'get', commentId], true);
41
+ if (checkIfShouldGoesToTombstone((error as Amity.ErrorResponse)?.code)) {
42
+ pushToTombstone('comment', commentId);
38
43
  }
39
44
 
40
45
  throw error;
@@ -0,0 +1,27 @@
1
+ import { client, comment11, commentPayload } from '~/utils/tests';
2
+ import { onCommentDeleted } from '../onCommentDeleted';
3
+
4
+ describe('onCommentDeleted', () => {
5
+ test('it should call callback when comment have created', () => {
6
+ const callback = jest.fn();
7
+
8
+ const unsub = onCommentDeleted(callback);
9
+ client.emitter.emit('comment.deleted', commentPayload);
10
+
11
+ unsub();
12
+
13
+ expect(callback).toHaveBeenCalled();
14
+ expect(callback).toHaveBeenCalledWith(comment11);
15
+ });
16
+
17
+ test('it should return an unsubscriber', () => {
18
+ const callback = jest.fn();
19
+
20
+ const unsub = onCommentDeleted(callback);
21
+ unsub();
22
+
23
+ client.emitter.emit('comment.deleted', commentPayload);
24
+
25
+ expect(callback).not.toHaveBeenCalled();
26
+ });
27
+ });
@@ -1,3 +1,4 @@
1
1
  export * from './observeComments';
2
2
  export * from './observeComment';
3
+ export * from './liveComment';
3
4
  export * from './liveComments';