@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
@@ -1,83 +1,72 @@
1
- import { createHttpTransport, stringify } from '../http';
1
+ import nock from 'nock';
2
+
3
+ import { ASCApiError, ASCUnknownError } from '~/core/errors';
4
+ import { createFileFormData } from '~/utils/tests';
5
+
6
+ import { createHttpTransport } from '../http';
7
+
8
+ const baseUrl = 'https://non-exist.domain';
2
9
 
3
10
  describe('core/transports', () => {
4
- describe('stringify', () => {
5
- test('should serializer simple string', () => {
6
- const params = { a: 'c' };
7
- const url = stringify(params);
8
- expect(url).toBe('a=c');
9
- });
11
+ describe('createHttpTransport', () => {
12
+ beforeAll(nock.disableNetConnect);
13
+ beforeEach(nock.cleanAll);
10
14
 
11
- test('should serializer empty string', () => {
12
- const params = { a: '' };
13
- const url = stringify(params);
14
- expect(url).toBe('a=');
15
- });
15
+ test('should create axios instance with out error', () => {
16
+ nock(baseUrl).get(/./).reply(200);
16
17
 
17
- test('should serializer special character', () => {
18
- const params = { a: '✓', b: 'ø' };
19
- const url = stringify(params);
20
- expect(url).toBe('a=%E2%9C%93&b=%C3%B8');
18
+ expect(createHttpTransport(baseUrl)).not.toThrow();
21
19
  });
22
20
 
23
- test('should serializer boolean', () => {
24
- const params = { a: true, b: false };
25
- const url = stringify(params);
26
- expect(url).toBe('a=true&b=false');
27
- });
21
+ test('instance should resolved http request', async () => {
22
+ const expectedResolveValue = { foo: 'bar' };
23
+ nock(baseUrl).get('/foo').reply(200, expectedResolveValue);
28
24
 
29
- test('should serializer null ', () => {
30
- const params = { a: null };
31
- const url = stringify(params);
32
- expect(url).toBe('a=');
33
- });
25
+ const instance = createHttpTransport(baseUrl);
34
26
 
35
- test('should serializer undefined', () => {
36
- const params = { a: undefined };
37
- const url = stringify(params);
38
- expect(url).toBe('');
27
+ const expected = expect.objectContaining({ data: expectedResolveValue });
28
+ await expect(instance.get('/foo')).resolves.toEqual(expected);
39
29
  });
40
30
 
41
- test('should serializer NaN', () => {
42
- const params = { a: NaN };
43
- const url = stringify(params);
44
- expect(url).toBe('a=NaN');
45
- });
31
+ test('instance should throw Error when got 400 response code', async () => {
32
+ nock(baseUrl).get('/foo').reply(400);
46
33
 
47
- test('should serializer simple array', () => {
48
- const params = { a: ['b', 'c', 'd'] };
49
- const url = stringify(params);
50
- expect(url).toBe('a%5B%5D=b&a%5B%5D=c&a%5B%5D=d');
51
- });
34
+ const instance = createHttpTransport(baseUrl);
52
35
 
53
- test('should serializer complex array', () => {
54
- const params = { a: ['b', { c: 'd' }] };
55
- const url = stringify(params);
56
- expect(url).toBe('a%5B%5D=b&a%5B%5D%5Bc%5D=d');
36
+ await expect(instance.get('/foo')).rejects.toThrow(Error);
57
37
  });
58
38
 
59
- test('should serializer nested object', () => {
60
- const params = { a: { b: 'c' } };
61
- const url = stringify(params);
62
- expect(url).toBe('a%5Bb%5D=c');
39
+ test('instance should throw Error when got 500 response code', async () => {
40
+ nock(baseUrl).get('/foo').reply(500);
41
+
42
+ const instance = createHttpTransport(baseUrl);
43
+
44
+ await expect(instance.get('/foo')).rejects.toThrow(Error);
63
45
  });
64
46
 
65
- test('should serializer deep nested object', () => {
66
- const params = { a: { b: { c: { d: { e: { f: { g: { h: { i: 'j' } } } } } } } } };
67
- const url = stringify(params);
68
- expect(url).toBe('a%5Bb%5D%5Bc%5D%5Bd%5D%5Be%5D%5Bf%5D%5Bg%5D%5Bh%5D%5Bi%5D=j');
47
+ test('instance should throw `ASCUnknownError` when got `fail` status in payload', async () => {
48
+ nock(baseUrl).get('/foo').reply(500, { status: 'fail', message: 'something fail' });
49
+
50
+ const instance = createHttpTransport(baseUrl);
51
+
52
+ await expect(instance.get('/foo')).rejects.toThrow(ASCUnknownError);
69
53
  });
70
54
 
71
- test('should serializer empty object', () => {
72
- const params = { a: { b: [] } };
73
- const url = stringify(params);
74
- expect(url).toBe('');
55
+ test('instance should throw `ASCApiError` when got `error` status in payload', async () => {
56
+ nock(baseUrl).get('/foo').reply(500, { status: 'error', message: 'something error' });
57
+
58
+ const instance = createHttpTransport(baseUrl);
59
+
60
+ await expect(instance.get('/foo')).rejects.toThrow(ASCApiError);
75
61
  });
76
- });
77
62
 
78
- describe('createHttpTransport', () => {
79
- test('should create axios instance with out error', () => {
80
- expect(createHttpTransport('/')).not.toThrow();
63
+ test('instance should receive formData', async () => {
64
+ const formData = createFileFormData();
65
+ nock(baseUrl).post('/foo').reply(200);
66
+
67
+ const instance = createHttpTransport(baseUrl);
68
+
69
+ await expect(instance.post('/foo', formData)).resolves.not.toThrow();
81
70
  });
82
71
  });
83
72
  });
@@ -26,11 +26,11 @@ export const createUserToken = async (
26
26
  },
27
27
  ) => {
28
28
  const deviceId = getDeviceId();
29
- const deviceInfo = await getDeviceInfo();
29
+ const deviceInfo = getDeviceInfo();
30
30
  const http = createHttpTransport(computeUrl('http', apiRegion));
31
31
 
32
32
  const { data } = await http.post<Amity.Tokens>(
33
- '/api/v3/sessions',
33
+ '/api/v4/sessions',
34
34
  {
35
35
  ...params,
36
36
  deviceId,
@@ -34,7 +34,7 @@ export const createFile = async <T extends Amity.FileType = any>(
34
34
 
35
35
  const { data } = await client.http.post<Amity.CreateFilePayload<T>>('/api/v4/files', formData, {
36
36
  headers,
37
- onUploadProgress({ loaded, total }) {
37
+ onUploadProgress({ loaded, total = 100 }) {
38
38
  onProgress && onProgress(Math.round((loaded * 100) / total));
39
39
  },
40
40
  });
@@ -37,7 +37,7 @@ export const createImage = async (
37
37
  formData,
38
38
  {
39
39
  headers,
40
- onUploadProgress({ loaded, total }) {
40
+ onUploadProgress({ loaded, total = 100 }) {
41
41
  onProgress && onProgress(Math.round((loaded * 100) / total));
42
42
  },
43
43
  },
@@ -43,7 +43,7 @@ export const createVideo = async (
43
43
  formData,
44
44
  {
45
45
  headers,
46
- onUploadProgress({ loaded, total }) {
46
+ onUploadProgress({ loaded, total = 100 }) {
47
47
  onProgress && onProgress(Math.round((loaded * 100) / total));
48
48
  },
49
49
  },
@@ -0,0 +1,69 @@
1
+ import { disableCache, enableCache, pullFromCache } from '~/cache/api';
2
+ import { client, file11, createEmptyFormData, createFileFormData } from '~/utils/tests';
3
+
4
+ import { createImage } from '../createImage';
5
+
6
+ const imageToCreate = [file11];
7
+ const createIds = imageToCreate.map(({ fileId }) => fileId);
8
+ const resolvedPayloadValue = { data: imageToCreate };
9
+
10
+ describe('createImage', () => {
11
+ test('should return created image', async () => {
12
+ const formData = createFileFormData();
13
+ client.http.post = jest.fn().mockResolvedValue(resolvedPayloadValue);
14
+
15
+ const received = createImage(formData);
16
+
17
+ await expect(received).resolves.toEqual(expect.objectContaining({ data: imageToCreate }));
18
+ });
19
+
20
+ test('should throw an error if request fails', async () => {
21
+ const formData = createFileFormData();
22
+ client.http.post = jest.fn().mockRejectedValueOnce(new Error('error'));
23
+
24
+ await expect(createImage(formData)).rejects.toThrow('error');
25
+ });
26
+
27
+ test('should throw an error if formData is empty', async () => {
28
+ const emptyFormData = createEmptyFormData();
29
+
30
+ await expect(createImage(emptyFormData)).rejects.toThrow(
31
+ 'The formData object must have a `files` key.',
32
+ );
33
+ });
34
+
35
+ test('should call onProgress params on upload progress updated', async () => {
36
+ expect.assertions(3);
37
+ const formData = createFileFormData();
38
+ const onProgress = jest.fn();
39
+
40
+ jest.spyOn(client.http, 'post').mockImplementationOnce(
41
+ (url, data, config) =>
42
+ new Promise((resolve, _reject) => {
43
+ config?.onUploadProgress?.({ loaded: 0, bytes: 0, total: 100 });
44
+ config?.onUploadProgress?.({ loaded: 40, bytes: 40, total: 100 });
45
+ config?.onUploadProgress?.({ loaded: 100, bytes: 100, total: 100 });
46
+ resolve(resolvedPayloadValue);
47
+ }),
48
+ );
49
+
50
+ await createImage(formData, onProgress);
51
+
52
+ expect(onProgress).toHaveBeenNthCalledWith(1, 0);
53
+ expect(onProgress).toHaveBeenNthCalledWith(2, 40);
54
+ expect(onProgress).toHaveBeenNthCalledWith(3, 100);
55
+ });
56
+
57
+ test('should create cache after created image', async () => {
58
+ enableCache();
59
+ const formData = createFileFormData();
60
+ client.http.post = jest.fn().mockResolvedValue(resolvedPayloadValue);
61
+
62
+ await createImage(formData);
63
+ const received = createIds.map(id => pullFromCache(['file', 'get', id])?.data);
64
+
65
+ expect(received).toEqual(expect.objectContaining(imageToCreate));
66
+
67
+ disableCache();
68
+ });
69
+ });
@@ -0,0 +1,81 @@
1
+ import { ContentFeedType } from '~/@types';
2
+ import { disableCache, enableCache, pullFromCache } from '~/cache/api';
3
+ import { client, file12, createEmptyFormData, createFileFormData } from '~/utils/tests';
4
+
5
+ import { createVideo } from '../createVideo';
6
+
7
+ const videoToCreate = [file12];
8
+ const createIds = videoToCreate.map(({ fileId }) => fileId);
9
+ const resolvedPayloadValue = { data: videoToCreate };
10
+
11
+ describe('createVideo', () => {
12
+ test('should return created video', async () => {
13
+ const formData = createFileFormData();
14
+ client.http.post = jest.fn().mockResolvedValue(resolvedPayloadValue);
15
+
16
+ const received = createVideo(formData);
17
+
18
+ await expect(received).resolves.toEqual(expect.objectContaining({ data: videoToCreate }));
19
+ });
20
+
21
+ test('should throw an error if request fails', async () => {
22
+ const formData = createFileFormData();
23
+ client.http.post = jest.fn().mockRejectedValueOnce(new Error('error'));
24
+
25
+ await expect(createVideo(formData)).rejects.toThrow('error');
26
+ });
27
+
28
+ test('should throw an error if formData is empty', async () => {
29
+ const emptyFormData = createEmptyFormData();
30
+
31
+ await expect(createVideo(emptyFormData)).rejects.toThrow(
32
+ 'The formData object must have a `files` key.',
33
+ );
34
+ });
35
+
36
+ // There is currently no polyfill or native API for generating complete formData
37
+ // in Node.js, so I'll skip this until 100% browser-compatible formData can be created.
38
+ test.skip('should append feedType to formData when define feedType param', async () => {
39
+ const formData = createFileFormData();
40
+ client.http.post = jest.fn().mockResolvedValue(resolvedPayloadValue);
41
+
42
+ await createVideo(formData, ContentFeedType.POST);
43
+
44
+ expect(formData.get('feedType')).toEqual(ContentFeedType.POST);
45
+ });
46
+
47
+ test('should call onProgress params on upload progress updated', async () => {
48
+ expect.assertions(3);
49
+ const formData = createFileFormData();
50
+ const onProgress = jest.fn();
51
+
52
+ jest.spyOn(client.http, 'post').mockImplementationOnce(
53
+ (url, data, config) =>
54
+ new Promise((resolve, _reject) => {
55
+ config?.onUploadProgress?.({ loaded: 0, bytes: 0, total: 100 });
56
+ config?.onUploadProgress?.({ loaded: 40, bytes: 40, total: 100 });
57
+ config?.onUploadProgress?.({ loaded: 100, bytes: 100, total: 100 });
58
+ resolve(resolvedPayloadValue);
59
+ }),
60
+ );
61
+
62
+ await createVideo(formData, undefined, onProgress);
63
+
64
+ expect(onProgress).toHaveBeenNthCalledWith(1, 0);
65
+ expect(onProgress).toHaveBeenNthCalledWith(2, 40);
66
+ expect(onProgress).toHaveBeenNthCalledWith(3, 100);
67
+ });
68
+
69
+ test('should create cache after created video', async () => {
70
+ enableCache();
71
+ const formData = createFileFormData();
72
+ client.http.post = jest.fn().mockResolvedValue(resolvedPayloadValue);
73
+
74
+ await createVideo(formData);
75
+ const received = createIds.map(id => pullFromCache(['file', 'get', id])?.data);
76
+
77
+ expect(received).toEqual(expect.objectContaining(videoToCreate));
78
+
79
+ disableCache();
80
+ });
81
+ });
package/src/index.ts CHANGED
@@ -48,6 +48,7 @@ export * from './community/events';
48
48
  export * from './community/observers';
49
49
 
50
50
  export * from './category/api';
51
+ export * from './category/observers';
51
52
 
52
53
  export * from './feed/api';
53
54
 
@@ -1,12 +1,4 @@
1
- import { ASCApiError } from '~/core/errors';
2
- import { getActiveClient } from '~/client/api';
3
- import { createQuery, runQuery } from '~/core/query';
4
- import {
5
- LIVE_OBJECT_ENABLE_CACHE_MESSAGE,
6
- UNSYNCED_OBJECT_CACHED_AT_MESSAGE,
7
- UNSYNCED_OBJECT_CACHED_AT_VALUE,
8
- } from '~/utils/constants';
9
- import { hasUpdates } from '~/core/model';
1
+ import { liveObject } from '~/utils/liveObject';
10
2
  import { getMessage } from '../api';
11
3
  import {
12
4
  onMessageUpdated,
@@ -42,78 +34,14 @@ export const liveMessage = (
42
34
  messageId: Amity.Message['messageId'],
43
35
  callback: Amity.LiveObjectCallback<Amity.Message>,
44
36
  ): Amity.Unsubscriber => {
45
- const { log, cache } = getActiveClient();
46
- const timestamp = Date.now();
47
- log(`liveMessage(tmpid: ${timestamp}) > listen`);
48
-
49
- if (!cache) {
50
- console.log(LIVE_OBJECT_ENABLE_CACHE_MESSAGE);
51
- }
52
-
53
- let message: Amity.Message;
54
- let isUnsyncedObject = false;
55
- const disposers: Amity.Unsubscriber[] = [];
56
-
57
- const dispatcher = (data: Amity.LiveObject<Amity.Message>) => {
58
- message = data.data;
59
- callback(data);
60
- };
61
-
62
- const realtimeRouter = (eventMessage: Amity.Message) => {
63
- if (messageId !== eventMessage.messageId) {
64
- return;
65
- }
66
-
67
- if (message && !hasUpdates(message, eventMessage)) {
68
- return;
69
- }
70
-
71
- dispatcher({ loading: false, data: eventMessage, origin: 'event' });
72
- };
73
-
74
- const onFetch = () => {
75
- const query = createQuery(getMessage, messageId, true);
76
-
77
- runQuery(query, ({ loading, data, error, origin, cachedAt }) => {
78
- if (cachedAt === UNSYNCED_OBJECT_CACHED_AT_VALUE) {
79
- dispatcher({
80
- data,
81
- origin,
82
- loading: false,
83
- error: new ASCApiError(
84
- UNSYNCED_OBJECT_CACHED_AT_MESSAGE,
85
- Amity.ClientError.DISALOOW_UNSYNCED_OBJECT,
86
- Amity.ErrorLevel.ERROR,
87
- ),
88
- });
89
-
90
- isUnsyncedObject = true;
91
- disposers.forEach(fn => fn());
92
- } else if (!isUnsyncedObject) {
93
- dispatcher({ loading, data, origin, error });
94
- }
95
-
96
- if (error) {
97
- disposers.forEach(fn => fn());
98
- }
99
- });
100
- };
101
-
102
- disposers.push(
103
- onMessageFetched(realtimeRouter),
104
- onMessageUpdated(realtimeRouter),
105
- onMessageDeleted(realtimeRouter),
106
- onMessageFlagged(realtimeRouter),
107
- onMessageUnflagged(realtimeRouter),
108
- onMessageFlagCleared(realtimeRouter),
109
- onMessageReactionAdded(realtimeRouter),
110
- onMessageReactionRemoved(realtimeRouter),
111
- );
112
-
113
- onFetch();
114
-
115
- return () => {
116
- log(`liveMessage(tmpid: ${timestamp}) > dispose`);
117
- disposers.forEach(fn => fn());
118
- };
37
+ return liveObject(messageId, callback, 'messageId', getMessage, [
38
+ onMessageFetched,
39
+ onMessageUpdated,
40
+ onMessageDeleted,
41
+ onMessageFlagged,
42
+ onMessageUnflagged,
43
+ onMessageFlagCleared,
44
+ onMessageReactionAdded,
45
+ onMessageReactionRemoved,
46
+ ]);
119
47
  };
@@ -1,9 +1,6 @@
1
1
  import { ASCApiError } from '~/core/errors';
2
2
  import { disableCache, enableCache } from '~/cache/api';
3
- import {
4
- LIVE_OBJECT_ENABLE_CACHE_MESSAGE,
5
- UNSYNCED_OBJECT_CACHED_AT_MESSAGE,
6
- } from '~/utils/constants';
3
+ import { UNSYNCED_OBJECT_CACHED_AT_MESSAGE } from '~/utils/constants';
7
4
  import { pause, client, connectClient, disconnectClient, generateRawMessage } from '~/utils/tests';
8
5
  import { getFutureDate } from '~/core/model';
9
6
  import { convertFromRaw } from '../../utils';
@@ -37,145 +34,6 @@ describe('liveMessage', () => {
37
34
 
38
35
  afterEach(disableCache);
39
36
 
40
- test('it should show message if cache not enabled', () => {
41
- /*
42
- * NOTE: at the time of writing this test cache is diabled by default, but
43
- * there is a proposal to enable cache by default. So I'm disabling cache
44
- * here to ensure cache is disabled
45
- */
46
- disableCache();
47
-
48
- const callback = jest.fn();
49
- jest.spyOn(global.console, 'log');
50
- client.http.get = jest.fn();
51
-
52
- // call liveMessage check if mocked console get's called with the correct
53
- // message
54
- client.use();
55
- liveMessage(message.messageId, callback);
56
-
57
- expect(console.log).toBeCalledWith(LIVE_OBJECT_ENABLE_CACHE_MESSAGE);
58
- });
59
-
60
- test('it should return message live object', async () => {
61
- const snapshot = getSnapshot();
62
-
63
- // mock response of queryMessages and validate
64
- const callback = jest.fn();
65
- client.http.get = jest.fn().mockResolvedValue(messageQueryResponseRaw);
66
-
67
- liveMessage(message.messageId, callback);
68
-
69
- expect(callback).toHaveBeenCalledTimes(1);
70
-
71
- // check if cache data returned (should be empty)
72
- expect(callback).toHaveBeenCalledWith(expect.objectContaining(snapshot));
73
-
74
- await pause();
75
-
76
- expect(callback).toHaveBeenCalledTimes(2);
77
-
78
- snapshot.loading = false;
79
- snapshot.data = message;
80
-
81
- expect(callback).toHaveBeenCalledWith(expect.objectContaining(snapshot));
82
- });
83
-
84
- test('it should return error on api failure', async () => {
85
- const snapshot = getSnapshot();
86
- const error = new ASCApiError(
87
- 'server error!',
88
- Amity.ServerError.ITEM_NOT_FOUND,
89
- Amity.ErrorLevel.ERROR,
90
- );
91
-
92
- // mock response of queryMessages and validate
93
- const callback = jest.fn();
94
- client.http.get = jest.fn().mockRejectedValue(error);
95
-
96
- liveMessage(message.messageId, callback);
97
-
98
- expect(callback).toHaveBeenCalledTimes(1);
99
-
100
- // check if cache data returned (should be empty)
101
- expect(callback).toHaveBeenCalledWith(expect.objectContaining(snapshot));
102
-
103
- await pause();
104
-
105
- expect(callback).toHaveBeenCalledTimes(2);
106
-
107
- snapshot.error = error;
108
- snapshot.loading = false;
109
- expect(callback).toHaveBeenLastCalledWith(expect.objectContaining(snapshot));
110
- });
111
-
112
- test('it should terminate updates on api failure', async () => {
113
- const snapshot = getSnapshot();
114
- const error = new ASCApiError(
115
- 'server error!',
116
- Amity.ServerError.ITEM_NOT_FOUND,
117
- Amity.ErrorLevel.ERROR,
118
- );
119
-
120
- // mock response of queryMessages and validate
121
- const callback = jest.fn();
122
- client.http.get = jest.fn().mockRejectedValue(error);
123
-
124
- liveMessage(message.messageId, callback);
125
-
126
- expect(callback).toHaveBeenCalledTimes(1);
127
-
128
- // check if cache data returned (should be empty)
129
- expect(callback).toHaveBeenCalledWith(expect.objectContaining(snapshot));
130
-
131
- await pause();
132
-
133
- expect(callback).toHaveBeenCalledTimes(2);
134
-
135
- snapshot.error = error;
136
- snapshot.loading = false;
137
- expect(callback).toHaveBeenLastCalledWith(expect.objectContaining(snapshot));
138
-
139
- const rawUpdatedMessage = { ...rawMessage, updatedAt: getFutureDate(rawMessage.updatedAt) };
140
- const updatedMessage = convertFromRaw(rawUpdatedMessage);
141
- client.emitter.emit('message.updated', { messages: [rawUpdatedMessage] });
142
-
143
- delete snapshot.error;
144
- snapshot.loading = false;
145
- snapshot.data = updatedMessage;
146
- expect(callback).not.toHaveBeenNthCalledWith(3, expect.objectContaining(snapshot));
147
- });
148
-
149
- test('it should not return updates on obtain once!', async () => {
150
- const snapshot = getSnapshot();
151
-
152
- // mock response of queryMessages and validate
153
- const callback = jest.fn();
154
- client.http.get = jest.fn().mockResolvedValue(messageQueryResponseRaw);
155
-
156
- const unsub = liveMessage(message.messageId, callback);
157
-
158
- expect(callback).toHaveBeenCalledTimes(1);
159
-
160
- // check if cache data returned (should be empty)
161
- expect(callback).toHaveBeenCalledWith(expect.objectContaining(snapshot));
162
-
163
- await pause();
164
-
165
- expect(callback).toHaveBeenCalledTimes(2);
166
-
167
- unsub();
168
-
169
- const rawUpdatedMessage = { ...rawMessage, updatedAt: getFutureDate(rawMessage.updatedAt) };
170
- const updatedMessage = convertFromRaw(rawUpdatedMessage);
171
- client.emitter.emit('message.updated', { messages: [rawUpdatedMessage] });
172
-
173
- delete snapshot.error;
174
- snapshot.loading = false;
175
- snapshot.data = updatedMessage;
176
- expect(callback).not.toHaveBeenNthCalledWith(3, expect.objectContaining(snapshot));
177
- });
178
-
179
37
  const events: [string, keyof Amity.Events][] = [
180
38
  ['it should return updated message on onFetch', 'local.message.fetched'],
181
39
  ['it should return updated message on onUpdate', 'message.updated'],
@@ -1,3 +1,4 @@
1
1
  export * from './observePosts';
2
2
  export * from './observePost';
3
+ export * from './livePost';
3
4
  export * from './livePosts';
@@ -0,0 +1,47 @@
1
+ import { liveObject } from '~/utils/liveObject';
2
+ import { getPost } from '../api';
3
+ import {
4
+ onPostApproved,
5
+ onPostDeclined,
6
+ onPostDeleted,
7
+ onPostFlagged,
8
+ onPostReactionAdded,
9
+ onPostReactionRemoved,
10
+ onPostUnflagged,
11
+ onPostUpdated,
12
+ } from '../events';
13
+
14
+ /**
15
+ * ```js
16
+ * import { livePost } from '@amityco/ts-sdk';
17
+ *
18
+ * let post;
19
+ *
20
+ * const unsubscribe = livePost(postId, response => {
21
+ * post = response.data;
22
+ * });
23
+ * ```
24
+ *
25
+ * Observe all mutation on a given {@link Amity.Post}
26
+ *
27
+ * @param postId the ID of the message to observe
28
+ * @param callback the function to call when new data are available
29
+ * @returns An {@link Amity.Unsubscriber} function to run when willing to stop observing the sub channel
30
+ *
31
+ * @category Post Live Object
32
+ */
33
+ export const livePost = (
34
+ postId: Amity.Post['postId'],
35
+ callback: Amity.LiveObjectCallback<Amity.Post>,
36
+ ): Amity.Unsubscriber => {
37
+ return liveObject(postId, callback, 'postId', getPost, [
38
+ onPostApproved,
39
+ onPostDeclined,
40
+ onPostDeleted,
41
+ onPostFlagged,
42
+ onPostReactionAdded,
43
+ onPostReactionRemoved,
44
+ onPostUnflagged,
45
+ onPostUpdated,
46
+ ]);
47
+ };