@amityco/ts-sdk 0.0.1-beta.5 → 0.0.1-beta.9
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/dist/@types/core/events.d.ts +63 -17
- package/dist/@types/core/events.d.ts.map +1 -1
- package/dist/@types/core/transport.d.ts +15 -0
- package/dist/@types/core/transport.d.ts.map +1 -1
- package/dist/@types/domains/client.d.ts +4 -0
- package/dist/@types/domains/client.d.ts.map +1 -1
- package/dist/@types/domains/comment.d.ts +1 -1
- package/dist/@types/domains/comment.d.ts.map +1 -1
- package/dist/@types/domains/community.d.ts +1 -1
- package/dist/@types/domains/community.d.ts.map +1 -1
- package/dist/@types/domains/group.d.ts +2 -2
- package/dist/@types/domains/group.d.ts.map +1 -1
- package/dist/@types/domains/partials.d.ts +3 -0
- package/dist/@types/domains/partials.d.ts.map +1 -1
- package/dist/@types/domains/post.d.ts +1 -1
- package/dist/@types/domains/post.d.ts.map +1 -1
- package/dist/@types/domains/user.d.ts +2 -1
- package/dist/@types/domains/user.d.ts.map +1 -1
- package/dist/client/api/connectClient.d.ts.map +1 -1
- package/dist/client/api/createClient.d.ts +2 -1
- package/dist/client/api/createClient.d.ts.map +1 -1
- package/dist/client/api/disconnectClient.d.ts.map +1 -1
- package/dist/client/api/getToken.d.ts +3 -1
- package/dist/client/api/getToken.d.ts.map +1 -1
- package/dist/comment/api/deleteComment.d.ts +37 -1
- package/dist/comment/api/deleteComment.d.ts.map +1 -1
- package/dist/comment/api/getComment.d.ts.map +1 -1
- package/dist/comment/api/queryComments.d.ts +1 -1
- package/dist/comment/events/index.d.ts +4 -0
- package/dist/comment/events/index.d.ts.map +1 -1
- package/dist/comment/events/onCommentCreated.d.ts +1 -1
- package/dist/comment/events/onCommentCreated.d.ts.map +1 -1
- package/dist/comment/events/onCommentDeleted.d.ts +1 -1
- package/dist/comment/events/onCommentDeleted.d.ts.map +1 -1
- package/dist/comment/events/onCommentFlagged.d.ts +17 -0
- package/dist/comment/events/onCommentFlagged.d.ts.map +1 -0
- package/dist/comment/events/onCommentReactionAdded.d.ts +17 -0
- package/dist/comment/events/onCommentReactionAdded.d.ts.map +1 -0
- package/dist/comment/events/onCommentReactionRemoved.d.ts +17 -0
- package/dist/comment/events/onCommentReactionRemoved.d.ts.map +1 -0
- package/dist/comment/events/onCommentUnflagged.d.ts +17 -0
- package/dist/comment/events/onCommentUnflagged.d.ts.map +1 -0
- package/dist/comment/events/onCommentUpdated.d.ts +1 -1
- package/dist/comment/events/onCommentUpdated.d.ts.map +1 -1
- package/dist/comment/events/utils.d.ts +2 -0
- package/dist/comment/events/utils.d.ts.map +1 -0
- package/dist/comment/observers/observeComment.d.ts +1 -1
- package/dist/comment/observers/observeComment.d.ts.map +1 -1
- package/dist/comment/observers/observeComments.d.ts +5 -1
- package/dist/comment/observers/observeComments.d.ts.map +1 -1
- package/dist/community/events/index.d.ts +4 -0
- package/dist/community/events/index.d.ts.map +1 -1
- package/dist/community/events/onCommunityCreated.d.ts +2 -2
- package/dist/community/events/onCommunityCreated.d.ts.map +1 -1
- package/dist/community/events/onCommunityDeleted.d.ts +2 -2
- package/dist/community/events/onCommunityDeleted.d.ts.map +1 -1
- package/dist/community/events/onCommunityJoined.d.ts +3 -3
- package/dist/community/events/onCommunityJoined.d.ts.map +1 -1
- package/dist/community/events/onCommunityLeft.d.ts +3 -3
- package/dist/community/events/onCommunityLeft.d.ts.map +1 -1
- package/dist/community/events/onCommunityUpdated.d.ts +2 -2
- package/dist/community/events/onCommunityUpdated.d.ts.map +1 -1
- package/dist/community/events/onCommunityUserAdded.d.ts +17 -0
- package/dist/community/events/onCommunityUserAdded.d.ts.map +1 -0
- package/dist/community/events/onCommunityUserBanned.d.ts +17 -0
- package/dist/community/events/onCommunityUserBanned.d.ts.map +1 -0
- package/dist/community/events/onCommunityUserRemoved.d.ts +17 -0
- package/dist/community/events/onCommunityUserRemoved.d.ts.map +1 -0
- package/dist/community/events/onCommunityUserUnbanned.d.ts +17 -0
- package/dist/community/events/onCommunityUserUnbanned.d.ts.map +1 -0
- package/dist/community/events/utils.d.ts +3 -0
- package/dist/community/events/utils.d.ts.map +1 -0
- package/dist/community/observers/observeCommunity.d.ts +1 -1
- package/dist/community/observers/observeCommunity.d.ts.map +1 -1
- package/dist/core/cache/ingest.d.ts.map +1 -1
- package/dist/core/events.d.ts +4 -2
- package/dist/core/events.d.ts.map +1 -1
- package/dist/core/model/index.d.ts +1 -0
- package/dist/core/model/index.d.ts.map +1 -1
- package/dist/core/model/isMatch.d.ts +3 -0
- package/dist/core/model/isMatch.d.ts.map +1 -0
- package/dist/core/network.d.ts +11 -0
- package/dist/core/network.d.ts.map +1 -0
- package/dist/core/query/paging.d.ts.map +1 -1
- package/dist/core/subscription.d.ts +14 -0
- package/dist/core/subscription.d.ts.map +1 -0
- package/dist/core/transports/http.d.ts +11 -0
- package/dist/core/transports/http.d.ts.map +1 -0
- package/dist/core/transports/index.d.ts +4 -0
- package/dist/core/transports/index.d.ts.map +1 -0
- package/dist/core/transports/mqtt.d.ts +17 -0
- package/dist/core/transports/mqtt.d.ts.map +1 -0
- package/dist/core/transports/utils.d.ts +13 -0
- package/dist/core/transports/utils.d.ts.map +1 -0
- package/dist/core/transports/ws.d.ts +27 -0
- package/dist/core/transports/ws.d.ts.map +1 -0
- package/dist/feed/api/queryGlobalFeed.d.ts +1 -1
- package/dist/file/api/deleteFile.d.ts +3 -1
- package/dist/file/api/deleteFile.d.ts.map +1 -1
- package/dist/index.cjs.js +1292 -526
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.esm.js +1268 -527
- package/dist/index.umd.js +19 -5144
- package/dist/post/api/deletePost.d.ts +40 -1
- package/dist/post/api/deletePost.d.ts.map +1 -1
- package/dist/post/api/getPost.d.ts.map +1 -1
- package/dist/post/events/index.d.ts +6 -0
- package/dist/post/events/index.d.ts.map +1 -1
- package/dist/post/events/onPostApproved.d.ts +17 -0
- package/dist/post/events/onPostApproved.d.ts.map +1 -0
- package/dist/post/events/onPostCreated.d.ts +1 -1
- package/dist/post/events/onPostCreated.d.ts.map +1 -1
- package/dist/post/events/onPostDeclined.d.ts +17 -0
- package/dist/post/events/onPostDeclined.d.ts.map +1 -0
- package/dist/post/events/onPostDeleted.d.ts +1 -1
- package/dist/post/events/onPostDeleted.d.ts.map +1 -1
- package/dist/post/events/onPostFlagged.d.ts +17 -0
- package/dist/post/events/onPostFlagged.d.ts.map +1 -0
- package/dist/post/events/onPostReactionAdded.d.ts +17 -0
- package/dist/post/events/onPostReactionAdded.d.ts.map +1 -0
- package/dist/post/events/onPostReactionRemoved.d.ts +17 -0
- package/dist/post/events/onPostReactionRemoved.d.ts.map +1 -0
- package/dist/post/events/onPostUnflagged.d.ts +17 -0
- package/dist/post/events/onPostUnflagged.d.ts.map +1 -0
- package/dist/post/events/onPostUpdated.d.ts +1 -1
- package/dist/post/events/onPostUpdated.d.ts.map +1 -1
- package/dist/post/events/utils.d.ts +2 -0
- package/dist/post/events/utils.d.ts.map +1 -0
- package/dist/post/observers/observePost.d.ts +1 -1
- package/dist/post/observers/observePost.d.ts.map +1 -1
- package/dist/post/observers/observePosts.d.ts +1 -1
- package/dist/post/observers/observePosts.d.ts.map +1 -1
- package/dist/reaction/events/onReactionAdded.d.ts +4 -2
- package/dist/reaction/events/onReactionAdded.d.ts.map +1 -1
- package/dist/reaction/events/onReactionRemoved.d.ts +4 -2
- package/dist/reaction/events/onReactionRemoved.d.ts.map +1 -1
- package/dist/reaction/utils/index.d.ts +1 -0
- package/dist/reaction/utils/index.d.ts.map +1 -1
- package/dist/reaction/utils/preparePayloadForCache.d.ts +3 -0
- package/dist/reaction/utils/preparePayloadForCache.d.ts.map +1 -0
- package/dist/report/api/createReport.d.ts.map +1 -1
- package/dist/report/api/deleteReport.d.ts.map +1 -1
- package/dist/user/events/index.d.ts +3 -0
- package/dist/user/events/index.d.ts.map +1 -1
- package/dist/user/events/onUserFlagCleared.d.ts +17 -0
- package/dist/user/events/onUserFlagCleared.d.ts.map +1 -0
- package/dist/user/events/onUserFlagged.d.ts +17 -0
- package/dist/user/events/onUserFlagged.d.ts.map +1 -0
- package/dist/user/events/onUserUnflagged.d.ts +17 -0
- package/dist/user/events/onUserUnflagged.d.ts.map +1 -0
- package/dist/user/events/onUserUpdated.d.ts +1 -1
- package/dist/user/events/onUserUpdated.d.ts.map +1 -1
- package/dist/user/events/utils.d.ts +2 -0
- package/dist/user/events/utils.d.ts.map +1 -0
- package/dist/user/observers/observeUser.d.ts +1 -1
- package/dist/user/observers/observeUser.d.ts.map +1 -1
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/package.json +7 -2
- package/rollup.config.js +63 -23
- package/src/@types/core/events.ts +64 -23
- package/src/@types/core/transport.ts +14 -0
- package/src/@types/domains/client.ts +5 -0
- package/src/@types/domains/comment.ts +1 -0
- package/src/@types/domains/community.ts +1 -0
- package/src/@types/domains/group.ts +2 -2
- package/src/@types/domains/partials.ts +4 -0
- package/src/@types/domains/post.ts +1 -0
- package/src/@types/domains/user.ts +2 -0
- package/src/client/api/connectClient.ts +12 -2
- package/src/client/api/createClient.ts +23 -15
- package/src/client/api/disconnectClient.ts +5 -0
- package/src/client/api/getToken.ts +3 -2
- package/src/client/events/onConnectionError.ts +1 -1
- package/src/comment/api/createComment.ts +2 -2
- package/src/comment/api/deleteComment.ts +25 -5
- package/src/comment/api/getComment.ts +17 -5
- package/src/comment/api/queryComments.ts +9 -8
- package/src/comment/api/updateComment.ts +1 -1
- package/src/comment/events/index.ts +6 -0
- package/src/comment/events/onCommentCreated.ts +4 -22
- package/src/comment/events/onCommentDeleted.ts +4 -22
- package/src/comment/events/onCommentFlagged.ts +21 -0
- package/src/comment/events/onCommentReactionAdded.ts +52 -0
- package/src/comment/events/onCommentReactionRemoved.ts +52 -0
- package/src/comment/events/onCommentUnflagged.ts +21 -0
- package/src/comment/events/onCommentUpdated.ts +4 -22
- package/src/comment/events/utils.ts +34 -0
- package/src/comment/observers/observeComment.ts +21 -7
- package/src/comment/observers/observeComments.ts +11 -3
- package/src/community/api/addCommunityMembers.ts +1 -1
- package/src/community/api/createCommunity.ts +1 -1
- package/src/community/api/deleteCommunity.ts +1 -1
- package/src/community/api/joinCommunity.ts +1 -1
- package/src/community/api/leaveCommunity.ts +1 -1
- package/src/community/api/removeCommunityMembers.ts +1 -1
- package/src/community/api/updateCommunity.ts +1 -1
- package/src/community/events/index.ts +5 -0
- package/src/community/events/onCommunityCreated.ts +5 -23
- package/src/community/events/onCommunityDeleted.ts +5 -23
- package/src/community/events/onCommunityJoined.ts +5 -23
- package/src/community/events/onCommunityLeft.ts +5 -23
- package/src/community/events/onCommunityUpdated.ts +5 -23
- package/src/community/events/onCommunityUserAdded.ts +19 -0
- package/src/community/events/onCommunityUserBanned.ts +19 -0
- package/src/community/events/onCommunityUserRemoved.ts +19 -0
- package/src/community/events/onCommunityUserUnbanned.ts +19 -0
- package/src/community/events/utils.ts +108 -0
- package/src/community/observers/observeCommunity.ts +23 -9
- package/src/core/cache/ingest.ts +19 -3
- package/src/core/events.ts +45 -4
- package/src/core/model/index.ts +1 -0
- package/src/core/model/isMatch.ts +12 -0
- package/src/core/network.ts +14 -0
- package/src/core/query/paging.ts +4 -0
- package/src/core/subscription.ts +75 -0
- package/src/core/transports/http.ts +63 -0
- package/src/core/transports/index.ts +3 -0
- package/src/core/transports/mqtt.ts +141 -0
- package/src/core/transports/utils.ts +25 -0
- package/src/core/transports/ws.ts +61 -0
- package/src/feed/api/queryGlobalFeed.ts +1 -1
- package/src/file/api/deleteFile.ts +5 -6
- package/src/index.ts +3 -0
- package/src/post/api/createPost.ts +2 -2
- package/src/post/api/deletePost.ts +29 -8
- package/src/post/api/getPost.ts +17 -5
- package/src/post/api/updatePost.ts +1 -1
- package/src/post/events/index.ts +9 -0
- package/src/post/events/onPostApproved.ts +19 -0
- package/src/post/events/onPostCreated.ts +4 -24
- package/src/post/events/onPostDeclined.ts +19 -0
- package/src/post/events/onPostDeleted.ts +4 -24
- package/src/post/events/onPostFlagged.ts +19 -0
- package/src/post/events/onPostReactionAdded.ts +50 -0
- package/src/post/events/onPostReactionRemoved.ts +50 -0
- package/src/post/events/onPostUnflagged.ts +19 -0
- package/src/post/events/onPostUpdated.ts +4 -24
- package/src/post/events/utils.ts +40 -0
- package/src/post/observers/observePost.ts +25 -7
- package/src/post/observers/observePosts.ts +12 -2
- package/src/reaction/events/onReactionAdded.ts +36 -15
- package/src/reaction/events/onReactionRemoved.ts +37 -14
- package/src/reaction/utils/dispatchReactable.ts +2 -2
- package/src/reaction/utils/index.ts +1 -0
- package/src/reaction/utils/preparePayloadForCache.ts +45 -0
- package/src/report/api/createReport.ts +5 -1
- package/src/report/api/deleteReport.ts +5 -1
- package/src/user/events/index.ts +4 -0
- package/src/user/events/onUserFlagCleared.ts +19 -0
- package/src/user/events/onUserFlagged.ts +19 -0
- package/src/user/events/onUserUnflagged.ts +19 -0
- package/src/user/events/onUserUpdated.ts +4 -24
- package/src/user/events/utils.ts +24 -0
- package/src/user/observers/observeUser.ts +11 -3
- package/src/version.ts +2 -0
- package/tsconfig.json +1 -0
- package/dist/core/transports.d.ts +0 -49
- package/dist/core/transports.d.ts.map +0 -1
- package/src/core/transports.ts +0 -151
|
@@ -1,37 +1,19 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { createEventSubscriber } from '~/core/events'
|
|
3
|
-
|
|
4
|
-
import { decoratePayload } from '~/core/query'
|
|
5
|
-
import { ingestInCache } from '~/core/cache'
|
|
1
|
+
import { createCommunityEventSubscriber } from './utils'
|
|
6
2
|
|
|
7
3
|
/**
|
|
8
4
|
* ```js
|
|
9
5
|
* import { onCommunityUpdated } from '@amityco/ts-sdk'
|
|
10
|
-
* const dispose = onCommunityUpdated(
|
|
6
|
+
* const dispose = onCommunityUpdated(community => {
|
|
11
7
|
* // ...
|
|
12
8
|
* })
|
|
13
9
|
* ```
|
|
14
10
|
*
|
|
15
|
-
* Fired when
|
|
11
|
+
* Fired when a {@link Amity.Community} has been updated
|
|
16
12
|
*
|
|
17
13
|
* @param callback The function to call when the event was fired
|
|
18
14
|
* @returns an {@link Amity.Unsubscriber} function to stop listening
|
|
19
15
|
*
|
|
20
16
|
* @category Community Events
|
|
21
17
|
*/
|
|
22
|
-
export const onCommunityUpdated = (callback: Amity.Listener<Amity.Community>) =>
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
const filter = (payload: Amity.CommunityPayload) => {
|
|
26
|
-
decoratePayload(payload)
|
|
27
|
-
ingestInCache(payload)
|
|
28
|
-
callback(payload.communities[0])
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
return createEventSubscriber(
|
|
32
|
-
client,
|
|
33
|
-
'onCommunityUpdated',
|
|
34
|
-
'v3.community.didUpdate',
|
|
35
|
-
filter
|
|
36
|
-
)
|
|
37
|
-
}
|
|
18
|
+
export const onCommunityUpdated = (callback: Amity.Listener<Amity.Community>) =>
|
|
19
|
+
createCommunityEventSubscriber('community.updated', callback)
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { createCommunityMemberEventSubscriber } from './utils'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* ```js
|
|
5
|
+
* import { onCommunityUserAdded } from '@amityco/ts-sdk'
|
|
6
|
+
* const dispose = onCommunityUserAdded((community, member) => {
|
|
7
|
+
* // ...
|
|
8
|
+
* })
|
|
9
|
+
* ```
|
|
10
|
+
*
|
|
11
|
+
* Fired when a user has been added to a {@link Amity.Community}
|
|
12
|
+
*
|
|
13
|
+
* @param callback The function to call when the event was fired
|
|
14
|
+
* @returns an {@link Amity.Unsubscriber} function to stop listening
|
|
15
|
+
*
|
|
16
|
+
* @category Community Events
|
|
17
|
+
*/
|
|
18
|
+
export const onCommunityUserAdded = (callback: (community: Amity.Community, member: Amity.Membership<'community'>) => void) =>
|
|
19
|
+
createCommunityMemberEventSubscriber('community.userAdded', callback)
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { createCommunityMemberEventSubscriber } from './utils'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* ```js
|
|
5
|
+
* import { onCommunityUserBanned } from '@amityco/ts-sdk'
|
|
6
|
+
* const dispose = onCommunityUserBanned((community, member) => {
|
|
7
|
+
* // ...
|
|
8
|
+
* })
|
|
9
|
+
* ```
|
|
10
|
+
*
|
|
11
|
+
* Fired when a user has been banned in a {@link Amity.Community}
|
|
12
|
+
*
|
|
13
|
+
* @param callback The function to call when the event was fired
|
|
14
|
+
* @returns an {@link Amity.Unsubscriber} function to stop listening
|
|
15
|
+
*
|
|
16
|
+
* @category Community Events
|
|
17
|
+
*/
|
|
18
|
+
export const onCommunityUserBanned = (callback: (community: Amity.Community, member: Amity.Membership<'community'>) => void) =>
|
|
19
|
+
createCommunityMemberEventSubscriber('community.userBanned', callback)
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { createCommunityMemberEventSubscriber } from './utils'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* ```js
|
|
5
|
+
* import { onCommunityUserRemoved } from '@amityco/ts-sdk'
|
|
6
|
+
* const dispose = onCommunityUserRemoved((community, member) => {
|
|
7
|
+
* // ...
|
|
8
|
+
* })
|
|
9
|
+
* ```
|
|
10
|
+
*
|
|
11
|
+
* Fired when a user has been removed from a {@link Amity.Community}
|
|
12
|
+
*
|
|
13
|
+
* @param callback The function to call when the event was fired
|
|
14
|
+
* @returns an {@link Amity.Unsubscriber} function to stop listening
|
|
15
|
+
*
|
|
16
|
+
* @category Community Events
|
|
17
|
+
*/
|
|
18
|
+
export const onCommunityUserRemoved = (callback: (community: Amity.Community, member: Amity.Membership<'community'>) => void) =>
|
|
19
|
+
createCommunityMemberEventSubscriber('community.userRemoved', callback)
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { createCommunityMemberEventSubscriber } from './utils'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* ```js
|
|
5
|
+
* import { onCommunityUserUnbanned } from '@amityco/ts-sdk'
|
|
6
|
+
* const dispose = onCommunityUserUnbanned((community, member) => {
|
|
7
|
+
* // ...
|
|
8
|
+
* })
|
|
9
|
+
* ```
|
|
10
|
+
*
|
|
11
|
+
* Fired when a user has been unbanned in a {@link Amity.Community}
|
|
12
|
+
*
|
|
13
|
+
* @param callback The function to call when the event was fired
|
|
14
|
+
* @returns an {@link Amity.Unsubscriber} function to stop listening
|
|
15
|
+
*
|
|
16
|
+
* @category Community Events
|
|
17
|
+
*/
|
|
18
|
+
export const onCommunityUserUnbanned = (callback: (community: Amity.Community, member: Amity.Membership<'community'>) => void) =>
|
|
19
|
+
createCommunityMemberEventSubscriber('community.userUnbanned', callback)
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { getActiveClient } from '~/client/api'
|
|
2
|
+
import { decoratePayload } from '~/core/query'
|
|
3
|
+
import { ingestInCache, pullFromCache } from '~/core/cache'
|
|
4
|
+
import { createEventSubscriber } from '~/core/events'
|
|
5
|
+
import { getResolver, isMatch } from '~/core/model'
|
|
6
|
+
|
|
7
|
+
export const createCommunityEventSubscriber = (
|
|
8
|
+
event: keyof Amity.MqttCommunityMessageEvents,
|
|
9
|
+
callback: Amity.Listener<Amity.Community>
|
|
10
|
+
) => {
|
|
11
|
+
const client = getActiveClient()
|
|
12
|
+
|
|
13
|
+
const filter = (payload: Amity.CommunityPayload) => {
|
|
14
|
+
const [cached] = pullFromCache('community', payload.communities[0].communityId) ?? []
|
|
15
|
+
|
|
16
|
+
decoratePayload(payload)
|
|
17
|
+
ingestInCache(payload)
|
|
18
|
+
|
|
19
|
+
const [community] = pullFromCache('community', payload.communities[0].communityId) ?? []
|
|
20
|
+
|
|
21
|
+
if (cached && isMatch(cached, community)) {
|
|
22
|
+
return
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
callback(community)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return createEventSubscriber(
|
|
29
|
+
client,
|
|
30
|
+
event,
|
|
31
|
+
event,
|
|
32
|
+
filter
|
|
33
|
+
)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function hasPermission(member: Amity.Membership<'community'>, payload: Amity.CommunityPayload, permission: string) {
|
|
37
|
+
if (member.permissions.some(x => x === permission)) {
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return payload.users!
|
|
42
|
+
.find(user => user.userId === member.userId)!
|
|
43
|
+
.permissions.some(x => x === permission)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
function getEventRelatedMember(
|
|
48
|
+
event: keyof Amity.MqttCommunityUserMessageEvents,
|
|
49
|
+
payload: Amity.CommunityPayload
|
|
50
|
+
) {
|
|
51
|
+
if (event === 'community.joined' || event === 'community.left') {
|
|
52
|
+
return payload.communityUsers![0];
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// NOTE: backend returns the one who took the action and the one on whom
|
|
56
|
+
// the action was taken. We need the 2nd one
|
|
57
|
+
if (event === 'community.userRemoved') {
|
|
58
|
+
return payload.communityUsers!.filter(x => x.communityMembership === 'none')[0]
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
if (event === 'community.userBanned') {
|
|
62
|
+
return payload.communityUsers!.filter(x => x.communityMembership === 'banned')[0]
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// NOTE: it might be that in certain edge cases permission check won't be enough
|
|
66
|
+
if (event === 'community.userUnbanned') {
|
|
67
|
+
return payload.communityUsers!.filter(x => !hasPermission(x, payload, 'BAN_COMMUNITY_USER'))[0]
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return payload.communityUsers!.filter(x => !hasPermission(x, payload, 'ADD_COMMUNITY_USER'))[0]
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export const createCommunityMemberEventSubscriber = (
|
|
74
|
+
event: keyof Amity.MqttCommunityUserMessageEvents,
|
|
75
|
+
callback: (community: Amity.Community, member: Amity.Membership<'community'>) => void,
|
|
76
|
+
) => {
|
|
77
|
+
const client = getActiveClient()
|
|
78
|
+
|
|
79
|
+
const filter = (payload: Amity.CommunityPayload) => {
|
|
80
|
+
const [cachedCommunity] = pullFromCache('community', payload.communities[0].communityId) ?? []
|
|
81
|
+
const [cachedMember] = pullFromCache(
|
|
82
|
+
'communityUsers',
|
|
83
|
+
getResolver('communityUsers')(getEventRelatedMember(event, payload))
|
|
84
|
+
) ?? []
|
|
85
|
+
|
|
86
|
+
decoratePayload(payload)
|
|
87
|
+
ingestInCache(payload)
|
|
88
|
+
|
|
89
|
+
const [community] = pullFromCache('community', payload.communities[0].communityId) ?? []
|
|
90
|
+
const [member] = pullFromCache(
|
|
91
|
+
'communityUsers',
|
|
92
|
+
getResolver('communityUsers')(getEventRelatedMember(event, payload))
|
|
93
|
+
) ?? []
|
|
94
|
+
|
|
95
|
+
if (cachedCommunity && isMatch(cachedCommunity, community) && cachedMember && isMatch(cachedMember, member)) {
|
|
96
|
+
return
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
callback(community, member)
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
return createEventSubscriber(
|
|
103
|
+
client,
|
|
104
|
+
event,
|
|
105
|
+
event,
|
|
106
|
+
filter
|
|
107
|
+
)
|
|
108
|
+
}
|
|
@@ -9,6 +9,10 @@ import {
|
|
|
9
9
|
onCommunityDeleted,
|
|
10
10
|
onCommunityJoined,
|
|
11
11
|
onCommunityLeft,
|
|
12
|
+
onCommunityUserAdded,
|
|
13
|
+
onCommunityUserRemoved,
|
|
14
|
+
onCommunityUserBanned,
|
|
15
|
+
onCommunityUserUnbanned
|
|
12
16
|
} from '../events'
|
|
13
17
|
|
|
14
18
|
/**
|
|
@@ -27,7 +31,7 @@ import {
|
|
|
27
31
|
*
|
|
28
32
|
* @category Community Observer
|
|
29
33
|
*/
|
|
30
|
-
export const observeCommunity = <Events extends ['onFetch', 'onUpdate', 'onDelete', 'onJoin', 'onLeft']>(
|
|
34
|
+
export const observeCommunity = <Events extends ['onFetch', 'onUpdate', 'onDelete', 'onJoin', 'onLeft', 'onUserAdded', 'onUserRemoved', 'onUserBanned', 'onUserUnbanned']>(
|
|
31
35
|
communityId: string,
|
|
32
36
|
callback: Amity.ObjectListener<Amity.QueryResult<Amity.Community>, Events>
|
|
33
37
|
): Amity.Unsubscriber => {
|
|
@@ -41,9 +45,6 @@ export const observeCommunity = <Events extends ['onFetch', 'onUpdate', 'onDelet
|
|
|
41
45
|
result: Amity.QueryResult<Amity.Community>,
|
|
42
46
|
action: Events[number]
|
|
43
47
|
) => {
|
|
44
|
-
// filter function
|
|
45
|
-
if (result.data?.communityId !== communityId) return
|
|
46
|
-
|
|
47
48
|
if (callback instanceof Function)
|
|
48
49
|
return callback(result)
|
|
49
50
|
|
|
@@ -53,18 +54,31 @@ export const observeCommunity = <Events extends ['onFetch', 'onUpdate', 'onDelet
|
|
|
53
54
|
callback[action]?.(result)
|
|
54
55
|
}
|
|
55
56
|
|
|
57
|
+
const realtimeRouter = (
|
|
58
|
+
result: Amity.QueryResult<Amity.Community>,
|
|
59
|
+
action: Events[number]
|
|
60
|
+
) => {
|
|
61
|
+
if (result.data?.communityId !== communityId) return
|
|
62
|
+
|
|
63
|
+
router(result, action)
|
|
64
|
+
}
|
|
65
|
+
|
|
56
66
|
const disposers: Amity.Unsubscriber[] = []
|
|
57
67
|
|
|
58
68
|
disposers.push(
|
|
59
|
-
onCommunityUpdated(data =>
|
|
60
|
-
onCommunityDeleted(data =>
|
|
61
|
-
onCommunityJoined(data =>
|
|
62
|
-
onCommunityLeft(data =>
|
|
69
|
+
onCommunityUpdated(data => realtimeRouter({ data }, 'onUpdate')),
|
|
70
|
+
onCommunityDeleted(data => realtimeRouter({ data }, 'onDelete')),
|
|
71
|
+
onCommunityJoined(data => realtimeRouter({ data }, 'onJoin')),
|
|
72
|
+
onCommunityLeft(data => realtimeRouter({ data }, 'onLeft')),
|
|
73
|
+
onCommunityUserAdded(data => realtimeRouter({ data }, 'onUserAdded')),
|
|
74
|
+
onCommunityUserRemoved(data => realtimeRouter({ data }, 'onUserRemoved')),
|
|
75
|
+
onCommunityUserBanned(data => realtimeRouter({ data }, 'onUserBanned')),
|
|
76
|
+
onCommunityUserUnbanned(data => realtimeRouter({ data }, 'onUserUnbanned')),
|
|
63
77
|
)
|
|
64
78
|
|
|
65
79
|
runQuery(
|
|
66
80
|
createQuery(getCommunity, communityId),
|
|
67
|
-
result =>
|
|
81
|
+
result => router(result, 'onFetch')
|
|
68
82
|
)
|
|
69
83
|
|
|
70
84
|
return () => {
|
package/src/core/cache/ingest.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { pullFromCache } from './pull'
|
|
2
|
+
import { mergeInCache } from './merge'
|
|
2
3
|
|
|
3
|
-
import { storeInterests } from '
|
|
4
|
+
import { getResolver, storeInterests } from '~/core/model'
|
|
5
|
+
import { pushToCache } from '~/core/cache/push'
|
|
4
6
|
|
|
5
7
|
/**
|
|
6
8
|
* Ingest a payload (v3) into the cache
|
|
@@ -19,6 +21,20 @@ export const ingestInCache = (
|
|
|
19
21
|
const name = storeInterests[key]
|
|
20
22
|
if (!name) return
|
|
21
23
|
|
|
22
|
-
|
|
24
|
+
payload[key].forEach(model => {
|
|
25
|
+
const [cached] = pullFromCache(name, getResolver(name)(model)) ?? []
|
|
26
|
+
|
|
27
|
+
if (cached) {
|
|
28
|
+
// > instead of >= - some updates like reactions do not change updatedAt
|
|
29
|
+
if (cached.updatedAt && cached.updatedAt > model.updatedAt) {
|
|
30
|
+
return
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// personal fields like isJoined, myReactions are missed from real time event payload
|
|
34
|
+
mergeInCache(name, model)
|
|
35
|
+
} else {
|
|
36
|
+
pushToCache(name, model)
|
|
37
|
+
}
|
|
38
|
+
})
|
|
23
39
|
})
|
|
24
40
|
}
|
package/src/core/events.ts
CHANGED
|
@@ -3,15 +3,13 @@ import mitt from 'mitt'
|
|
|
3
3
|
import { getActiveClient } from '~/client/api/activeClient'
|
|
4
4
|
|
|
5
5
|
// need to sync up the list
|
|
6
|
-
const
|
|
6
|
+
const WS_EVENTS = [
|
|
7
7
|
'disconnected',
|
|
8
8
|
'error',
|
|
9
9
|
'connect_error',
|
|
10
10
|
'reconnect_error',
|
|
11
11
|
'reconnect_failed',
|
|
12
12
|
|
|
13
|
-
'v3.user.didUpdate',
|
|
14
|
-
|
|
15
13
|
'v3.channel.didUpdate',
|
|
16
14
|
'v3.channel.didUpdate',
|
|
17
15
|
'v3.channel.didJoin',
|
|
@@ -26,6 +24,16 @@ const EVENTS = [
|
|
|
26
24
|
'v3.message.didDelete',
|
|
27
25
|
] as const
|
|
28
26
|
|
|
27
|
+
const MQTT_EVENTS = [
|
|
28
|
+
'connect',
|
|
29
|
+
'message',
|
|
30
|
+
'disconnect',
|
|
31
|
+
'error',
|
|
32
|
+
'close',
|
|
33
|
+
'end',
|
|
34
|
+
'reconnect'
|
|
35
|
+
] as const;
|
|
36
|
+
|
|
29
37
|
/** @hidden */
|
|
30
38
|
export const createEventEmitter = () => {
|
|
31
39
|
return mitt<Amity.Events>()
|
|
@@ -42,11 +50,24 @@ export const createEventEmitter = () => {
|
|
|
42
50
|
* @hidden
|
|
43
51
|
*/
|
|
44
52
|
export const proxyWebsocketEvents = (ws: Amity.Client['ws'], emitter: Amity.Client['emitter']) => {
|
|
45
|
-
|
|
53
|
+
WS_EVENTS.forEach(event => {
|
|
46
54
|
ws.on(event, (param: Amity.Events[typeof event]) => emitter.emit(event, param))
|
|
47
55
|
})
|
|
48
56
|
}
|
|
49
57
|
|
|
58
|
+
export const proxyMqttEvents = (mqttClient: Amity.Client['mqtt'], emitter: Amity.Client['emitter']) => {
|
|
59
|
+
MQTT_EVENTS.forEach(event => {
|
|
60
|
+
mqttClient.on(event, (...params: any[]) => emitter.emit(event, params.length === 1 ? params[0] : params))
|
|
61
|
+
})
|
|
62
|
+
|
|
63
|
+
// @ts-ignore
|
|
64
|
+
mqttClient.on('message', (topic: string, payload: Buffer) => {
|
|
65
|
+
const message = JSON.parse(payload.toString());
|
|
66
|
+
|
|
67
|
+
emitter.emit(message.eventType, message.data)
|
|
68
|
+
})
|
|
69
|
+
}
|
|
70
|
+
|
|
50
71
|
/**
|
|
51
72
|
* Standardize the subscription of SSE through web sockets
|
|
52
73
|
*
|
|
@@ -83,6 +104,26 @@ export const createEventSubscriber = <T extends keyof Amity.Events>(
|
|
|
83
104
|
}
|
|
84
105
|
}
|
|
85
106
|
|
|
107
|
+
export const createMqttMessageSubscriber = <T extends keyof Amity.Events>(
|
|
108
|
+
client: Amity.Client,
|
|
109
|
+
namespace: string,
|
|
110
|
+
event: string,
|
|
111
|
+
fn: (params: Object) => void,
|
|
112
|
+
): Amity.Unsubscriber => {
|
|
113
|
+
return createEventSubscriber(
|
|
114
|
+
client,
|
|
115
|
+
namespace,
|
|
116
|
+
'message',
|
|
117
|
+
([topic, message]) => {
|
|
118
|
+
const payload = JSON.parse(message.toString());
|
|
119
|
+
|
|
120
|
+
if (payload.eventType === event) {
|
|
121
|
+
fn(payload.data);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
)
|
|
125
|
+
}
|
|
126
|
+
|
|
86
127
|
/**
|
|
87
128
|
* Wrapper around dispatch event
|
|
88
129
|
*
|
package/src/core/model/index.ts
CHANGED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import isMatchWith from 'lodash.ismatchwith'
|
|
2
|
+
|
|
3
|
+
/** @hidden */
|
|
4
|
+
export const isMatch =<T extends Amity.Domain>(model1: Amity.Model[T], model2: Amity.Model[T]) => {
|
|
5
|
+
const customizer = (oldValue: any, newValue: any, key: string | number | symbol) => {
|
|
6
|
+
if (key === 'syncedAt') {
|
|
7
|
+
return true
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
return isMatchWith(model1, model2, customizer)
|
|
12
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export const API_ENDPOINT = {
|
|
2
|
+
EU: 'eu',
|
|
3
|
+
SG: 'sg',
|
|
4
|
+
US: 'us',
|
|
5
|
+
} as const
|
|
6
|
+
|
|
7
|
+
export enum UrlTemplate {
|
|
8
|
+
HTTP = 'https://api.{region}.amity.co',
|
|
9
|
+
MQTT = 'wss://sse.{region}.amity.co:443/mqtt',
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export const getUrlFromTemplate = ( template: UrlTemplate, region: string ) => {
|
|
13
|
+
return template.replace( '{region}', region);
|
|
14
|
+
}
|
package/src/core/query/paging.ts
CHANGED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { getActiveClient } from '~/client/api'
|
|
2
|
+
import { ASCError } from '~/core/errors'
|
|
3
|
+
import { proxyMqttEvents } from '~/core/events'
|
|
4
|
+
|
|
5
|
+
export enum SubscriptionLevels {
|
|
6
|
+
COMMUNITY = 'community',
|
|
7
|
+
POST = 'post',
|
|
8
|
+
COMMENT = 'comment',
|
|
9
|
+
POST_AND_COMMENT = 'post_and_comment',
|
|
10
|
+
USER = 'user',
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const getCommunityUserTopic = (
|
|
14
|
+
{ path }: Amity.Subscribable,
|
|
15
|
+
level?: SubscriptionLevels,
|
|
16
|
+
): string => {
|
|
17
|
+
switch (level) {
|
|
18
|
+
case 'post':
|
|
19
|
+
return `${path}/post/+`;
|
|
20
|
+
case 'comment':
|
|
21
|
+
return `${path}/post/+/comment/+`;
|
|
22
|
+
case 'post_and_comment':
|
|
23
|
+
return `${path}/post/#`;
|
|
24
|
+
default:
|
|
25
|
+
return path;
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export const getCommunityTopic = (
|
|
30
|
+
{ path }: Amity.Subscribable,
|
|
31
|
+
level: Exclude<SubscriptionLevels, SubscriptionLevels.USER> = SubscriptionLevels.COMMUNITY,
|
|
32
|
+
): string =>
|
|
33
|
+
getCommunityUserTopic({ path }, level)
|
|
34
|
+
|
|
35
|
+
export const getUserTopic = (
|
|
36
|
+
{ path }: Amity.Subscribable,
|
|
37
|
+
level: Exclude<SubscriptionLevels, SubscriptionLevels.COMMUNITY> = SubscriptionLevels.USER,
|
|
38
|
+
): string =>
|
|
39
|
+
getCommunityUserTopic({ path }, level)
|
|
40
|
+
|
|
41
|
+
export const getPostTopic = (
|
|
42
|
+
{ path }: Amity.Subscribable,
|
|
43
|
+
level: SubscriptionLevels.POST | SubscriptionLevels.COMMENT = SubscriptionLevels.POST
|
|
44
|
+
): string => {
|
|
45
|
+
switch (level) {
|
|
46
|
+
case 'comment':
|
|
47
|
+
return `${path}/comment/+`;
|
|
48
|
+
default:
|
|
49
|
+
return path;
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
export const getCommentTopic = ({ path }: Amity.Subscribable): string => {
|
|
54
|
+
return path;
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
let mqttAccessToken: string;
|
|
58
|
+
let mqttUserId: string;
|
|
59
|
+
|
|
60
|
+
export function subscribeTopic(
|
|
61
|
+
topic: string,
|
|
62
|
+
callback?: Amity.Listener<ASCError | void>
|
|
63
|
+
): Amity.Unsubscriber {
|
|
64
|
+
const { mqtt, emitter, accessToken, user } = getActiveClient()
|
|
65
|
+
|
|
66
|
+
if (mqttAccessToken !== accessToken || mqttUserId !== user!._id) {
|
|
67
|
+
mqttAccessToken = accessToken!
|
|
68
|
+
mqttUserId = user!._id
|
|
69
|
+
|
|
70
|
+
mqtt.connect({ accessToken: accessToken!, userId: user!._id })
|
|
71
|
+
proxyMqttEvents(mqtt, emitter)
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return mqtt.subscribe(topic, callback)
|
|
75
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import axios from 'axios'
|
|
2
|
+
import HttpAgent, { HttpsAgent } from 'agentkeepalive'
|
|
3
|
+
|
|
4
|
+
import { unwrapPayload } from './utils'
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Axios param serializer (for querystring)
|
|
8
|
+
* @hidden
|
|
9
|
+
*/
|
|
10
|
+
const stringify = (params: object, prefix?: string): string => {
|
|
11
|
+
return Object.entries(params)
|
|
12
|
+
.filter(([, value]) => value !== undefined)
|
|
13
|
+
.map(([name, value]) => {
|
|
14
|
+
const key = prefix ? `${prefix}[${name}]` : name
|
|
15
|
+
|
|
16
|
+
if (Array.isArray(value)) {
|
|
17
|
+
return value.map(item => `${key}[]=${item}`).join('&')
|
|
18
|
+
} else if (typeof value !== 'object') {
|
|
19
|
+
return `${key}=${value}`
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
return stringify(value, prefix ?? name)
|
|
23
|
+
})
|
|
24
|
+
.join('&')
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Creates a pre-configured axios instance
|
|
29
|
+
*
|
|
30
|
+
* @param endpoint The ASC rest api server's URL
|
|
31
|
+
* @returns A pre-configured axios instance
|
|
32
|
+
*
|
|
33
|
+
* @category Transport
|
|
34
|
+
* @hidden
|
|
35
|
+
*/
|
|
36
|
+
export const createHttpTransport = (endpoint: string) => {
|
|
37
|
+
const options = {
|
|
38
|
+
maxSockets: 100,
|
|
39
|
+
maxFreeSockets: 10,
|
|
40
|
+
timeout: 60000,
|
|
41
|
+
freeSocketTimeout: 30000,
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const instance = axios.create({
|
|
45
|
+
baseURL: endpoint,
|
|
46
|
+
httpAgent: new HttpAgent(options),
|
|
47
|
+
httpsAgent: new HttpsAgent(options),
|
|
48
|
+
paramsSerializer: stringify,
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
instance.interceptors.response.use(
|
|
52
|
+
(response) => response,
|
|
53
|
+
(error) => {
|
|
54
|
+
const { response } = error
|
|
55
|
+
console.error(response?.data ?? error)
|
|
56
|
+
|
|
57
|
+
if (response)
|
|
58
|
+
unwrapPayload(response.data)
|
|
59
|
+
}
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
return instance
|
|
63
|
+
}
|