@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.
- package/.eslintrc.json +3 -5
- package/dist/@types/core/errors.d.ts +1 -0
- package/dist/@types/core/errors.d.ts.map +1 -1
- package/dist/@types/core/events.d.ts +5 -0
- package/dist/@types/core/events.d.ts.map +1 -1
- package/dist/@types/domains/category.d.ts +7 -0
- package/dist/@types/domains/category.d.ts.map +1 -1
- package/dist/@types/domains/client.d.ts +21 -1
- package/dist/@types/domains/client.d.ts.map +1 -1
- package/dist/@types/domains/community.d.ts +12 -0
- package/dist/@types/domains/community.d.ts.map +1 -1
- package/dist/@types/global.d.ts +12 -0
- package/dist/@types/global.d.ts.map +1 -1
- package/dist/category/api/queryCategories.d.ts +1 -5
- package/dist/category/api/queryCategories.d.ts.map +1 -1
- package/dist/category/observers/index.d.ts +2 -0
- package/dist/category/observers/index.d.ts.map +1 -0
- package/dist/category/observers/liveCategories.d.ts +18 -0
- package/dist/category/observers/liveCategories.d.ts.map +1 -0
- package/dist/category/observers/tests/liveCategories.test.d.ts +2 -0
- package/dist/category/observers/tests/liveCategories.test.d.ts.map +1 -0
- package/dist/channel/api/tests/getChannels.test.d.ts +2 -0
- package/dist/channel/api/tests/getChannels.test.d.ts.map +1 -0
- package/dist/channel/api/tests/leaveChannel.test.d.ts +2 -0
- package/dist/channel/api/tests/leaveChannel.test.d.ts.map +1 -0
- package/dist/channel/observers/liveChannel.d.ts.map +1 -1
- package/dist/client/api/accessTokenExpiryWatcher.d.ts +7 -0
- package/dist/client/api/accessTokenExpiryWatcher.d.ts.map +1 -0
- package/dist/client/api/activeUser.d.ts +1 -1
- package/dist/client/api/activeUser.d.ts.map +1 -1
- package/dist/client/api/connectClient.d.ts +1 -1
- package/dist/client/api/connectClient.d.ts.map +1 -1
- package/dist/client/api/createClient.d.ts +1 -1
- package/dist/client/api/createClient.d.ts.map +1 -1
- package/dist/client/api/disconnectClient.d.ts +0 -1
- package/dist/client/api/disconnectClient.d.ts.map +1 -1
- package/dist/client/api/getToken.d.ts +7 -5
- package/dist/client/api/getToken.d.ts.map +1 -1
- package/dist/client/api/index.d.ts +1 -0
- package/dist/client/api/index.d.ts.map +1 -1
- package/dist/client/api/renewal.d.ts +2 -0
- package/dist/client/api/renewal.d.ts.map +1 -0
- package/dist/client/api/setSessionState.d.ts +12 -0
- package/dist/client/api/setSessionState.d.ts.map +1 -0
- package/dist/client/api/terminateClient.d.ts +9 -0
- package/dist/client/api/terminateClient.d.ts.map +1 -0
- package/dist/client/api/tests/accessTokenExpiryWatcher.test.d.ts +2 -0
- package/dist/client/api/tests/accessTokenExpiryWatcher.test.d.ts.map +1 -0
- package/dist/client/api/tests/connectClient.test.d.ts +2 -0
- package/dist/client/api/tests/connectClient.test.d.ts.map +1 -0
- package/dist/client/api/tests/disconnectClient.test.d.ts +2 -0
- package/dist/client/api/tests/disconnectClient.test.d.ts.map +1 -0
- package/dist/client/api/tests/getToken.test.d.ts +2 -0
- package/dist/client/api/tests/getToken.test.d.ts.map +1 -0
- package/dist/client/api/tests/renewal.test.d.ts +2 -0
- package/dist/client/api/tests/renewal.test.d.ts.map +1 -0
- package/dist/client/api/tests/setSessionState.test.d.ts +2 -0
- package/dist/client/api/tests/setSessionState.test.d.ts.map +1 -0
- package/dist/client/api/tests/terminateClient.test.d.ts +2 -0
- package/dist/client/api/tests/terminateClient.test.d.ts.map +1 -0
- package/dist/client/events/index.d.ts +1 -0
- package/dist/client/events/index.d.ts.map +1 -1
- package/dist/client/events/onClientBanned.d.ts +1 -1
- package/dist/client/events/onClientBanned.d.ts.map +1 -1
- package/dist/client/events/onSessionStateChange.d.ts +17 -0
- package/dist/client/events/onSessionStateChange.d.ts.map +1 -0
- package/dist/client/events/onTokenExpired.d.ts +17 -0
- package/dist/client/events/onTokenExpired.d.ts.map +1 -0
- package/dist/client/events/onTokenTerminated.d.ts +11 -0
- package/dist/client/events/onTokenTerminated.d.ts.map +1 -0
- package/dist/client/events/tests/onSessionStateChange.test.d.ts +2 -0
- package/dist/client/events/tests/onSessionStateChange.test.d.ts.map +1 -0
- package/dist/client/events/tests/onTokenTerminated.test.d.ts +2 -0
- package/dist/client/events/tests/onTokenTerminated.test.d.ts.map +1 -0
- package/dist/client/utils/setClientToken.d.ts +19 -0
- package/dist/client/utils/setClientToken.d.ts.map +1 -0
- package/dist/comment/api/deleteComment.d.ts.map +1 -1
- package/dist/comment/api/getComment.d.ts.map +1 -1
- package/dist/comment/events/tests/onCommentDeleted.test.d.ts +2 -0
- package/dist/comment/events/tests/onCommentDeleted.test.d.ts.map +1 -0
- package/dist/comment/observers/index.d.ts +1 -0
- package/dist/comment/observers/index.d.ts.map +1 -1
- package/dist/comment/observers/liveComment.d.ts +21 -0
- package/dist/comment/observers/liveComment.d.ts.map +1 -0
- package/dist/comment/observers/tests/liveComment.test.d.ts +2 -0
- package/dist/comment/observers/tests/liveComment.test.d.ts.map +1 -0
- package/dist/community/api/queryCommunities.d.ts +1 -10
- package/dist/community/api/queryCommunities.d.ts.map +1 -1
- package/dist/community/events/index.d.ts +1 -0
- package/dist/community/events/index.d.ts.map +1 -1
- package/dist/community/events/onCommunityUserChanged.d.ts +17 -0
- package/dist/community/events/onCommunityUserChanged.d.ts.map +1 -0
- package/dist/community/events/utils.d.ts +1 -0
- package/dist/community/events/utils.d.ts.map +1 -1
- package/dist/community/observers/index.d.ts +1 -0
- package/dist/community/observers/index.d.ts.map +1 -1
- package/dist/community/observers/liveCommunities.d.ts +20 -0
- package/dist/community/observers/liveCommunities.d.ts.map +1 -0
- package/dist/community/observers/tests/liveCommunities.test.d.ts +2 -0
- package/dist/community/observers/tests/liveCommunities.test.d.ts.map +1 -0
- package/dist/core/events.d.ts +3 -3
- package/dist/core/events.d.ts.map +1 -1
- package/dist/core/query/sorting.d.ts +6 -0
- package/dist/core/query/sorting.d.ts.map +1 -1
- package/dist/core/subscription.d.ts.map +1 -1
- package/dist/core/transports/http.d.ts +0 -5
- package/dist/core/transports/http.d.ts.map +1 -1
- package/dist/file/api/test/createImage.test.d.ts +2 -0
- package/dist/file/api/test/createImage.test.d.ts.map +1 -0
- package/dist/file/api/test/createVideo.test.d.ts +2 -0
- package/dist/file/api/test/createVideo.test.d.ts.map +1 -0
- package/dist/index.cjs.js +944 -332
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.esm.js +937 -332
- package/dist/index.umd.js +4 -4
- package/dist/message/observers/liveMessage.d.ts.map +1 -1
- package/dist/post/observers/index.d.ts +1 -0
- package/dist/post/observers/index.d.ts.map +1 -1
- package/dist/post/observers/livePost.d.ts +21 -0
- package/dist/post/observers/livePost.d.ts.map +1 -0
- package/dist/post/observers/tests/livePost.test.d.ts +2 -0
- package/dist/post/observers/tests/livePost.test.d.ts.map +1 -0
- package/dist/stream/api/tests/createStream.test.d.ts +2 -0
- package/dist/stream/api/tests/createStream.test.d.ts.map +1 -0
- package/dist/stream/api/tests/deleteStream.test.d.ts +2 -0
- package/dist/stream/api/tests/deleteStream.test.d.ts.map +1 -0
- package/dist/stream/api/tests/getStream.test.d.ts +2 -0
- package/dist/stream/api/tests/getStream.test.d.ts.map +1 -0
- package/dist/subChannel/api/tests/createSubChannel.test.d.ts +2 -0
- package/dist/subChannel/api/tests/createSubChannel.test.d.ts.map +1 -0
- package/dist/subChannel/api/tests/deleteSubChannel.test.d.ts +2 -0
- package/dist/subChannel/api/tests/deleteSubChannel.test.d.ts.map +1 -0
- package/dist/subChannel/api/tests/getSubChannel.test.d.ts +2 -0
- package/dist/subChannel/api/tests/getSubChannel.test.d.ts.map +1 -0
- package/dist/subChannel/api/tests/getSubChannels.test.d.ts +2 -0
- package/dist/subChannel/api/tests/getSubChannels.test.d.ts.map +1 -0
- package/dist/subChannel/api/tests/updateSubChannel.test.d.ts +2 -0
- package/dist/subChannel/api/tests/updateSubChannel.test.d.ts.map +1 -0
- package/dist/subChannel/observers/liveSubChannel.d.ts.map +1 -1
- package/dist/user/api/tests/updateUser.test.d.ts +2 -0
- package/dist/user/api/tests/updateUser.test.d.ts.map +1 -0
- package/dist/user/observers/liveUser.d.ts.map +1 -1
- package/dist/utils/constants.d.ts +2 -0
- package/dist/utils/constants.d.ts.map +1 -1
- package/dist/utils/liveObject.d.ts +2 -0
- package/dist/utils/liveObject.d.ts.map +1 -0
- package/dist/utils/tests/client.d.ts.map +1 -1
- package/dist/utils/tests/dummy/category.d.ts +64 -0
- package/dist/utils/tests/dummy/category.d.ts.map +1 -0
- package/dist/utils/tests/dummy/channel.d.ts +50 -0
- package/dist/utils/tests/dummy/channel.d.ts.map +1 -1
- package/dist/utils/tests/dummy/community.d.ts +132 -0
- package/dist/utils/tests/dummy/community.d.ts.map +1 -1
- package/dist/utils/tests/dummy/file.d.ts +3 -0
- package/dist/utils/tests/dummy/file.d.ts.map +1 -1
- package/dist/utils/tests/dummy/index.d.ts +3 -0
- package/dist/utils/tests/dummy/index.d.ts.map +1 -1
- package/dist/utils/tests/dummy/post.d.ts +2 -0
- package/dist/utils/tests/dummy/post.d.ts.map +1 -1
- package/dist/utils/tests/dummy/stream.d.ts +83 -0
- package/dist/utils/tests/dummy/stream.d.ts.map +1 -0
- package/dist/utils/tests/dummy/token.d.ts +11 -0
- package/dist/utils/tests/dummy/token.d.ts.map +1 -0
- package/dist/utils/tests/dummy/user.d.ts +18 -0
- package/dist/utils/tests/dummy/user.d.ts.map +1 -1
- package/dist/utils/tests/liveObject.test.d.ts +2 -0
- package/dist/utils/tests/liveObject.test.d.ts.map +1 -0
- package/package.json +4 -4
- package/src/@types/core/errors.ts +1 -0
- package/src/@types/core/events.ts +7 -0
- package/src/@types/domains/category.ts +13 -0
- package/src/@types/domains/client.ts +45 -1
- package/src/@types/domains/community.ts +25 -0
- package/src/@types/global.ts +19 -0
- package/src/category/api/queryCategories.ts +3 -5
- package/src/category/observers/index.ts +1 -0
- package/src/category/observers/liveCategories.ts +141 -0
- package/src/category/observers/tests/liveCategories.test.ts +147 -0
- package/src/channel/api/tests/createChannel.test.ts +30 -6
- package/src/channel/api/tests/getChannel.test.ts +3 -1
- package/src/channel/api/tests/getChannels.test.ts +97 -0
- package/src/channel/api/tests/joinChannel.test.ts +62 -3
- package/src/channel/api/tests/leaveChannel.test.ts +90 -0
- package/src/channel/api/tests/queryChannels.test.ts +38 -1
- package/src/channel/observers/liveChannel.ts +8 -80
- package/src/client/api/accessTokenExpiryWatcher.ts +85 -0
- package/src/client/api/activeUser.ts +1 -1
- package/src/client/api/connectClient.ts +105 -24
- package/src/client/api/createClient.ts +9 -1
- package/src/client/api/disconnectClient.ts +26 -2
- package/src/client/api/getToken.ts +6 -6
- package/src/client/api/index.ts +2 -0
- package/src/client/api/renewal.ts +74 -0
- package/src/client/api/setSessionState.ts +75 -0
- package/src/client/api/terminateClient.ts +20 -0
- package/src/client/api/tests/accessTokenExpiryWatcher.test.ts +132 -0
- package/src/client/api/tests/connectClient.test.ts +84 -0
- package/src/client/api/tests/createClient.test.ts +8 -0
- package/src/client/api/tests/disconnectClient.test.ts +78 -0
- package/src/client/api/tests/getToken.test.ts +36 -0
- package/src/client/api/tests/renewal.test.ts +67 -0
- package/src/client/api/tests/setSessionState.test.ts +62 -0
- package/src/client/api/tests/terminateClient.test.ts +29 -0
- package/src/client/events/index.ts +2 -0
- package/src/client/events/onClientBanned.ts +12 -5
- package/src/client/events/onSessionStateChange.ts +31 -0
- package/src/client/events/onTokenExpired.ts +26 -0
- package/src/client/events/onTokenTerminated.ts +20 -0
- package/src/client/events/tests/onSessionStateChange.test.ts +37 -0
- package/src/client/events/tests/onTokenTerminated.test.ts +37 -0
- package/src/client/tests/connectClient.test.ts +6 -1
- package/src/client/utils/setClientToken.ts +39 -0
- package/src/comment/api/deleteComment.ts +5 -5
- package/src/comment/api/getComment.ts +8 -3
- package/src/comment/events/tests/onCommentDeleted.test.ts +27 -0
- package/src/comment/observers/index.ts +1 -0
- package/src/comment/observers/liveComment.ts +43 -0
- package/src/comment/observers/tests/liveComment.test.ts +95 -0
- package/src/community/api/queryCommunities.ts +3 -10
- package/src/community/api/test/addCommunityMember.test.ts +14 -2
- package/src/community/api/test/joinCommunity.test.ts +14 -2
- package/src/community/api/test/leaveCommunity.test.ts +11 -1
- package/src/community/api/test/removeCommunityMembers.test.ts +11 -1
- package/src/community/events/index.ts +1 -0
- package/src/community/events/onCommunityUserChanged.ts +20 -0
- package/src/community/events/test/onCommunityJoined.test.ts +1 -1
- package/src/community/events/test/onCommunityUserAdded.test.ts +1 -1
- package/src/community/events/test/onCommunityUserBanned.test.ts +1 -1
- package/src/community/events/test/onCommunityUserUnbaned.test.ts +1 -1
- package/src/community/events/test/utils.test.ts +52 -3
- package/src/community/events/utils.ts +49 -0
- package/src/community/observers/index.ts +1 -0
- package/src/community/observers/liveCommunities.ts +188 -0
- package/src/community/observers/tests/liveCommunities.test.ts +284 -0
- package/src/core/events.ts +5 -3
- package/src/core/query/sorting.ts +8 -0
- package/src/core/subscription.ts +3 -1
- package/src/core/transports/http.ts +52 -13
- package/src/core/transports/mqtt.ts +1 -1
- package/src/core/transports/test/http.test.ts +49 -60
- package/src/external/api/createUserToken.ts +2 -2
- package/src/file/api/createFile.ts +1 -1
- package/src/file/api/createImage.ts +1 -1
- package/src/file/api/createVideo.ts +1 -1
- package/src/file/api/test/createImage.test.ts +69 -0
- package/src/file/api/test/createVideo.test.ts +81 -0
- package/src/index.ts +1 -0
- package/src/message/observers/liveMessage.ts +11 -83
- package/src/message/tests/observers/liveMessage.test.ts +1 -143
- package/src/post/observers/index.ts +1 -0
- package/src/post/observers/livePost.ts +47 -0
- package/src/post/observers/tests/livePost.test.ts +97 -0
- package/src/stream/api/tests/createStream.test.ts +22 -0
- package/src/stream/api/tests/deleteStream.test.ts +50 -0
- package/src/stream/api/tests/getStream.test.ts +23 -0
- package/src/subChannel/api/tests/createSubChannel.test.ts +110 -0
- package/src/subChannel/api/tests/deleteSubChannel.test.ts +112 -0
- package/src/subChannel/api/tests/getSubChannel.test.ts +97 -0
- package/src/subChannel/api/tests/getSubChannels.test.ts +97 -0
- package/src/subChannel/api/tests/updateSubChannel.test.ts +86 -0
- package/src/subChannel/observers/liveSubChannel.ts +6 -56
- package/src/subChannel/observers/tests/liveSubChannel.test.ts +0 -82
- package/src/user/api/tests/updateUser.test.ts +60 -0
- package/src/user/observers/liveUser.ts +9 -61
- package/src/user/tests/observers/liveUser.test.ts +1 -154
- package/src/utils/constants.ts +2 -0
- package/src/utils/liveObject.ts +86 -0
- package/src/utils/tests/client.ts +18 -2
- package/src/utils/tests/dummy/category.ts +57 -0
- package/src/utils/tests/dummy/channel.ts +51 -1
- package/src/utils/tests/dummy/community.ts +94 -0
- package/src/utils/tests/dummy/file.ts +32 -0
- package/src/utils/tests/dummy/index.ts +4 -0
- package/src/utils/tests/dummy/post.ts +56 -45
- package/src/utils/tests/dummy/stream.ts +86 -0
- package/src/utils/tests/dummy/token.ts +12 -0
- package/src/utils/tests/dummy/user.ts +21 -0
- package/src/utils/tests/liveObject.test.ts +172 -0
|
@@ -1,83 +1,72 @@
|
|
|
1
|
-
import
|
|
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('
|
|
5
|
-
|
|
6
|
-
|
|
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
|
|
12
|
-
|
|
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
|
-
|
|
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
|
|
24
|
-
const
|
|
25
|
-
|
|
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
|
-
|
|
30
|
-
const params = { a: null };
|
|
31
|
-
const url = stringify(params);
|
|
32
|
-
expect(url).toBe('a=');
|
|
33
|
-
});
|
|
25
|
+
const instance = createHttpTransport(baseUrl);
|
|
34
26
|
|
|
35
|
-
|
|
36
|
-
|
|
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
|
|
42
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
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
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
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
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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 =
|
|
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/
|
|
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
|
});
|
|
@@ -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
|
@@ -1,12 +1,4 @@
|
|
|
1
|
-
import {
|
|
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
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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'],
|
|
@@ -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
|
+
};
|