@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.
Files changed (261) hide show
  1. package/dist/@types/core/events.d.ts +63 -17
  2. package/dist/@types/core/events.d.ts.map +1 -1
  3. package/dist/@types/core/transport.d.ts +15 -0
  4. package/dist/@types/core/transport.d.ts.map +1 -1
  5. package/dist/@types/domains/client.d.ts +4 -0
  6. package/dist/@types/domains/client.d.ts.map +1 -1
  7. package/dist/@types/domains/comment.d.ts +1 -1
  8. package/dist/@types/domains/comment.d.ts.map +1 -1
  9. package/dist/@types/domains/community.d.ts +1 -1
  10. package/dist/@types/domains/community.d.ts.map +1 -1
  11. package/dist/@types/domains/group.d.ts +2 -2
  12. package/dist/@types/domains/group.d.ts.map +1 -1
  13. package/dist/@types/domains/partials.d.ts +3 -0
  14. package/dist/@types/domains/partials.d.ts.map +1 -1
  15. package/dist/@types/domains/post.d.ts +1 -1
  16. package/dist/@types/domains/post.d.ts.map +1 -1
  17. package/dist/@types/domains/user.d.ts +2 -1
  18. package/dist/@types/domains/user.d.ts.map +1 -1
  19. package/dist/client/api/connectClient.d.ts.map +1 -1
  20. package/dist/client/api/createClient.d.ts +2 -1
  21. package/dist/client/api/createClient.d.ts.map +1 -1
  22. package/dist/client/api/disconnectClient.d.ts.map +1 -1
  23. package/dist/client/api/getToken.d.ts +3 -1
  24. package/dist/client/api/getToken.d.ts.map +1 -1
  25. package/dist/comment/api/deleteComment.d.ts +37 -1
  26. package/dist/comment/api/deleteComment.d.ts.map +1 -1
  27. package/dist/comment/api/getComment.d.ts.map +1 -1
  28. package/dist/comment/api/queryComments.d.ts +1 -1
  29. package/dist/comment/events/index.d.ts +4 -0
  30. package/dist/comment/events/index.d.ts.map +1 -1
  31. package/dist/comment/events/onCommentCreated.d.ts +1 -1
  32. package/dist/comment/events/onCommentCreated.d.ts.map +1 -1
  33. package/dist/comment/events/onCommentDeleted.d.ts +1 -1
  34. package/dist/comment/events/onCommentDeleted.d.ts.map +1 -1
  35. package/dist/comment/events/onCommentFlagged.d.ts +17 -0
  36. package/dist/comment/events/onCommentFlagged.d.ts.map +1 -0
  37. package/dist/comment/events/onCommentReactionAdded.d.ts +17 -0
  38. package/dist/comment/events/onCommentReactionAdded.d.ts.map +1 -0
  39. package/dist/comment/events/onCommentReactionRemoved.d.ts +17 -0
  40. package/dist/comment/events/onCommentReactionRemoved.d.ts.map +1 -0
  41. package/dist/comment/events/onCommentUnflagged.d.ts +17 -0
  42. package/dist/comment/events/onCommentUnflagged.d.ts.map +1 -0
  43. package/dist/comment/events/onCommentUpdated.d.ts +1 -1
  44. package/dist/comment/events/onCommentUpdated.d.ts.map +1 -1
  45. package/dist/comment/events/utils.d.ts +2 -0
  46. package/dist/comment/events/utils.d.ts.map +1 -0
  47. package/dist/comment/observers/observeComment.d.ts +1 -1
  48. package/dist/comment/observers/observeComment.d.ts.map +1 -1
  49. package/dist/comment/observers/observeComments.d.ts +5 -1
  50. package/dist/comment/observers/observeComments.d.ts.map +1 -1
  51. package/dist/community/events/index.d.ts +4 -0
  52. package/dist/community/events/index.d.ts.map +1 -1
  53. package/dist/community/events/onCommunityCreated.d.ts +2 -2
  54. package/dist/community/events/onCommunityCreated.d.ts.map +1 -1
  55. package/dist/community/events/onCommunityDeleted.d.ts +2 -2
  56. package/dist/community/events/onCommunityDeleted.d.ts.map +1 -1
  57. package/dist/community/events/onCommunityJoined.d.ts +3 -3
  58. package/dist/community/events/onCommunityJoined.d.ts.map +1 -1
  59. package/dist/community/events/onCommunityLeft.d.ts +3 -3
  60. package/dist/community/events/onCommunityLeft.d.ts.map +1 -1
  61. package/dist/community/events/onCommunityUpdated.d.ts +2 -2
  62. package/dist/community/events/onCommunityUpdated.d.ts.map +1 -1
  63. package/dist/community/events/onCommunityUserAdded.d.ts +17 -0
  64. package/dist/community/events/onCommunityUserAdded.d.ts.map +1 -0
  65. package/dist/community/events/onCommunityUserBanned.d.ts +17 -0
  66. package/dist/community/events/onCommunityUserBanned.d.ts.map +1 -0
  67. package/dist/community/events/onCommunityUserRemoved.d.ts +17 -0
  68. package/dist/community/events/onCommunityUserRemoved.d.ts.map +1 -0
  69. package/dist/community/events/onCommunityUserUnbanned.d.ts +17 -0
  70. package/dist/community/events/onCommunityUserUnbanned.d.ts.map +1 -0
  71. package/dist/community/events/utils.d.ts +3 -0
  72. package/dist/community/events/utils.d.ts.map +1 -0
  73. package/dist/community/observers/observeCommunity.d.ts +1 -1
  74. package/dist/community/observers/observeCommunity.d.ts.map +1 -1
  75. package/dist/core/cache/ingest.d.ts.map +1 -1
  76. package/dist/core/events.d.ts +4 -2
  77. package/dist/core/events.d.ts.map +1 -1
  78. package/dist/core/model/index.d.ts +1 -0
  79. package/dist/core/model/index.d.ts.map +1 -1
  80. package/dist/core/model/isMatch.d.ts +3 -0
  81. package/dist/core/model/isMatch.d.ts.map +1 -0
  82. package/dist/core/network.d.ts +11 -0
  83. package/dist/core/network.d.ts.map +1 -0
  84. package/dist/core/query/paging.d.ts.map +1 -1
  85. package/dist/core/subscription.d.ts +14 -0
  86. package/dist/core/subscription.d.ts.map +1 -0
  87. package/dist/core/transports/http.d.ts +11 -0
  88. package/dist/core/transports/http.d.ts.map +1 -0
  89. package/dist/core/transports/index.d.ts +4 -0
  90. package/dist/core/transports/index.d.ts.map +1 -0
  91. package/dist/core/transports/mqtt.d.ts +17 -0
  92. package/dist/core/transports/mqtt.d.ts.map +1 -0
  93. package/dist/core/transports/utils.d.ts +13 -0
  94. package/dist/core/transports/utils.d.ts.map +1 -0
  95. package/dist/core/transports/ws.d.ts +27 -0
  96. package/dist/core/transports/ws.d.ts.map +1 -0
  97. package/dist/feed/api/queryGlobalFeed.d.ts +1 -1
  98. package/dist/file/api/deleteFile.d.ts +3 -1
  99. package/dist/file/api/deleteFile.d.ts.map +1 -1
  100. package/dist/index.cjs.js +1292 -526
  101. package/dist/index.d.ts +2 -0
  102. package/dist/index.d.ts.map +1 -1
  103. package/dist/index.esm.js +1268 -527
  104. package/dist/index.umd.js +19 -5144
  105. package/dist/post/api/deletePost.d.ts +40 -1
  106. package/dist/post/api/deletePost.d.ts.map +1 -1
  107. package/dist/post/api/getPost.d.ts.map +1 -1
  108. package/dist/post/events/index.d.ts +6 -0
  109. package/dist/post/events/index.d.ts.map +1 -1
  110. package/dist/post/events/onPostApproved.d.ts +17 -0
  111. package/dist/post/events/onPostApproved.d.ts.map +1 -0
  112. package/dist/post/events/onPostCreated.d.ts +1 -1
  113. package/dist/post/events/onPostCreated.d.ts.map +1 -1
  114. package/dist/post/events/onPostDeclined.d.ts +17 -0
  115. package/dist/post/events/onPostDeclined.d.ts.map +1 -0
  116. package/dist/post/events/onPostDeleted.d.ts +1 -1
  117. package/dist/post/events/onPostDeleted.d.ts.map +1 -1
  118. package/dist/post/events/onPostFlagged.d.ts +17 -0
  119. package/dist/post/events/onPostFlagged.d.ts.map +1 -0
  120. package/dist/post/events/onPostReactionAdded.d.ts +17 -0
  121. package/dist/post/events/onPostReactionAdded.d.ts.map +1 -0
  122. package/dist/post/events/onPostReactionRemoved.d.ts +17 -0
  123. package/dist/post/events/onPostReactionRemoved.d.ts.map +1 -0
  124. package/dist/post/events/onPostUnflagged.d.ts +17 -0
  125. package/dist/post/events/onPostUnflagged.d.ts.map +1 -0
  126. package/dist/post/events/onPostUpdated.d.ts +1 -1
  127. package/dist/post/events/onPostUpdated.d.ts.map +1 -1
  128. package/dist/post/events/utils.d.ts +2 -0
  129. package/dist/post/events/utils.d.ts.map +1 -0
  130. package/dist/post/observers/observePost.d.ts +1 -1
  131. package/dist/post/observers/observePost.d.ts.map +1 -1
  132. package/dist/post/observers/observePosts.d.ts +1 -1
  133. package/dist/post/observers/observePosts.d.ts.map +1 -1
  134. package/dist/reaction/events/onReactionAdded.d.ts +4 -2
  135. package/dist/reaction/events/onReactionAdded.d.ts.map +1 -1
  136. package/dist/reaction/events/onReactionRemoved.d.ts +4 -2
  137. package/dist/reaction/events/onReactionRemoved.d.ts.map +1 -1
  138. package/dist/reaction/utils/index.d.ts +1 -0
  139. package/dist/reaction/utils/index.d.ts.map +1 -1
  140. package/dist/reaction/utils/preparePayloadForCache.d.ts +3 -0
  141. package/dist/reaction/utils/preparePayloadForCache.d.ts.map +1 -0
  142. package/dist/report/api/createReport.d.ts.map +1 -1
  143. package/dist/report/api/deleteReport.d.ts.map +1 -1
  144. package/dist/user/events/index.d.ts +3 -0
  145. package/dist/user/events/index.d.ts.map +1 -1
  146. package/dist/user/events/onUserFlagCleared.d.ts +17 -0
  147. package/dist/user/events/onUserFlagCleared.d.ts.map +1 -0
  148. package/dist/user/events/onUserFlagged.d.ts +17 -0
  149. package/dist/user/events/onUserFlagged.d.ts.map +1 -0
  150. package/dist/user/events/onUserUnflagged.d.ts +17 -0
  151. package/dist/user/events/onUserUnflagged.d.ts.map +1 -0
  152. package/dist/user/events/onUserUpdated.d.ts +1 -1
  153. package/dist/user/events/onUserUpdated.d.ts.map +1 -1
  154. package/dist/user/events/utils.d.ts +2 -0
  155. package/dist/user/events/utils.d.ts.map +1 -0
  156. package/dist/user/observers/observeUser.d.ts +1 -1
  157. package/dist/user/observers/observeUser.d.ts.map +1 -1
  158. package/dist/version.d.ts +2 -0
  159. package/dist/version.d.ts.map +1 -0
  160. package/package.json +7 -2
  161. package/rollup.config.js +63 -23
  162. package/src/@types/core/events.ts +64 -23
  163. package/src/@types/core/transport.ts +14 -0
  164. package/src/@types/domains/client.ts +5 -0
  165. package/src/@types/domains/comment.ts +1 -0
  166. package/src/@types/domains/community.ts +1 -0
  167. package/src/@types/domains/group.ts +2 -2
  168. package/src/@types/domains/partials.ts +4 -0
  169. package/src/@types/domains/post.ts +1 -0
  170. package/src/@types/domains/user.ts +2 -0
  171. package/src/client/api/connectClient.ts +12 -2
  172. package/src/client/api/createClient.ts +23 -15
  173. package/src/client/api/disconnectClient.ts +5 -0
  174. package/src/client/api/getToken.ts +3 -2
  175. package/src/client/events/onConnectionError.ts +1 -1
  176. package/src/comment/api/createComment.ts +2 -2
  177. package/src/comment/api/deleteComment.ts +25 -5
  178. package/src/comment/api/getComment.ts +17 -5
  179. package/src/comment/api/queryComments.ts +9 -8
  180. package/src/comment/api/updateComment.ts +1 -1
  181. package/src/comment/events/index.ts +6 -0
  182. package/src/comment/events/onCommentCreated.ts +4 -22
  183. package/src/comment/events/onCommentDeleted.ts +4 -22
  184. package/src/comment/events/onCommentFlagged.ts +21 -0
  185. package/src/comment/events/onCommentReactionAdded.ts +52 -0
  186. package/src/comment/events/onCommentReactionRemoved.ts +52 -0
  187. package/src/comment/events/onCommentUnflagged.ts +21 -0
  188. package/src/comment/events/onCommentUpdated.ts +4 -22
  189. package/src/comment/events/utils.ts +34 -0
  190. package/src/comment/observers/observeComment.ts +21 -7
  191. package/src/comment/observers/observeComments.ts +11 -3
  192. package/src/community/api/addCommunityMembers.ts +1 -1
  193. package/src/community/api/createCommunity.ts +1 -1
  194. package/src/community/api/deleteCommunity.ts +1 -1
  195. package/src/community/api/joinCommunity.ts +1 -1
  196. package/src/community/api/leaveCommunity.ts +1 -1
  197. package/src/community/api/removeCommunityMembers.ts +1 -1
  198. package/src/community/api/updateCommunity.ts +1 -1
  199. package/src/community/events/index.ts +5 -0
  200. package/src/community/events/onCommunityCreated.ts +5 -23
  201. package/src/community/events/onCommunityDeleted.ts +5 -23
  202. package/src/community/events/onCommunityJoined.ts +5 -23
  203. package/src/community/events/onCommunityLeft.ts +5 -23
  204. package/src/community/events/onCommunityUpdated.ts +5 -23
  205. package/src/community/events/onCommunityUserAdded.ts +19 -0
  206. package/src/community/events/onCommunityUserBanned.ts +19 -0
  207. package/src/community/events/onCommunityUserRemoved.ts +19 -0
  208. package/src/community/events/onCommunityUserUnbanned.ts +19 -0
  209. package/src/community/events/utils.ts +108 -0
  210. package/src/community/observers/observeCommunity.ts +23 -9
  211. package/src/core/cache/ingest.ts +19 -3
  212. package/src/core/events.ts +45 -4
  213. package/src/core/model/index.ts +1 -0
  214. package/src/core/model/isMatch.ts +12 -0
  215. package/src/core/network.ts +14 -0
  216. package/src/core/query/paging.ts +4 -0
  217. package/src/core/subscription.ts +75 -0
  218. package/src/core/transports/http.ts +63 -0
  219. package/src/core/transports/index.ts +3 -0
  220. package/src/core/transports/mqtt.ts +141 -0
  221. package/src/core/transports/utils.ts +25 -0
  222. package/src/core/transports/ws.ts +61 -0
  223. package/src/feed/api/queryGlobalFeed.ts +1 -1
  224. package/src/file/api/deleteFile.ts +5 -6
  225. package/src/index.ts +3 -0
  226. package/src/post/api/createPost.ts +2 -2
  227. package/src/post/api/deletePost.ts +29 -8
  228. package/src/post/api/getPost.ts +17 -5
  229. package/src/post/api/updatePost.ts +1 -1
  230. package/src/post/events/index.ts +9 -0
  231. package/src/post/events/onPostApproved.ts +19 -0
  232. package/src/post/events/onPostCreated.ts +4 -24
  233. package/src/post/events/onPostDeclined.ts +19 -0
  234. package/src/post/events/onPostDeleted.ts +4 -24
  235. package/src/post/events/onPostFlagged.ts +19 -0
  236. package/src/post/events/onPostReactionAdded.ts +50 -0
  237. package/src/post/events/onPostReactionRemoved.ts +50 -0
  238. package/src/post/events/onPostUnflagged.ts +19 -0
  239. package/src/post/events/onPostUpdated.ts +4 -24
  240. package/src/post/events/utils.ts +40 -0
  241. package/src/post/observers/observePost.ts +25 -7
  242. package/src/post/observers/observePosts.ts +12 -2
  243. package/src/reaction/events/onReactionAdded.ts +36 -15
  244. package/src/reaction/events/onReactionRemoved.ts +37 -14
  245. package/src/reaction/utils/dispatchReactable.ts +2 -2
  246. package/src/reaction/utils/index.ts +1 -0
  247. package/src/reaction/utils/preparePayloadForCache.ts +45 -0
  248. package/src/report/api/createReport.ts +5 -1
  249. package/src/report/api/deleteReport.ts +5 -1
  250. package/src/user/events/index.ts +4 -0
  251. package/src/user/events/onUserFlagCleared.ts +19 -0
  252. package/src/user/events/onUserFlagged.ts +19 -0
  253. package/src/user/events/onUserUnflagged.ts +19 -0
  254. package/src/user/events/onUserUpdated.ts +4 -24
  255. package/src/user/events/utils.ts +24 -0
  256. package/src/user/observers/observeUser.ts +11 -3
  257. package/src/version.ts +2 -0
  258. package/tsconfig.json +1 -0
  259. package/dist/core/transports.d.ts +0 -49
  260. package/dist/core/transports.d.ts.map +0 -1
  261. package/src/core/transports.ts +0 -151
@@ -1,37 +1,19 @@
1
- import { getActiveClient } from '~/client/api'
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(channel => {
6
+ * const dispose = onCommunityUpdated(community => {
11
7
  * // ...
12
8
  * })
13
9
  * ```
14
10
  *
15
- * Fired when any {@link Amity.Community} have been updated
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
- const client = getActiveClient()
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 => router({ data }, 'onUpdate')),
60
- onCommunityDeleted(data => router({ data }, 'onDelete')),
61
- onCommunityJoined(data => router({ data }, 'onJoin')),
62
- onCommunityLeft(data => router({ data }, 'onLeft')),
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 => result.data && router(result, 'onFetch')
81
+ result => router(result, 'onFetch')
68
82
  )
69
83
 
70
84
  return () => {
@@ -1,6 +1,8 @@
1
- import { pushToCache } from './push'
1
+ import { pullFromCache } from './pull'
2
+ import { mergeInCache } from './merge'
2
3
 
3
- import { storeInterests } from '../model/idResolvers'
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
- pushToCache(name, ...payload[key])
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
  }
@@ -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 EVENTS = [
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
- EVENTS.forEach(event => {
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
  *
@@ -1,3 +1,4 @@
1
1
  export * from './identifyModel'
2
2
  export * from './idResolvers'
3
3
  export * from './toRecord'
4
+ export * from './isMatch'
@@ -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
+ }
@@ -84,6 +84,10 @@ export const toToken = (
84
84
  after: paging.after,
85
85
  first: paging.limit,
86
86
  }
87
+ } else if (!isNaN(paging?.limit!)) {
88
+ payload = {
89
+ last: paging.limit,
90
+ }
87
91
  }
88
92
  }
89
93
 
@@ -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
+ }
@@ -0,0 +1,3 @@
1
+ export * from './http';
2
+ export * from './ws';
3
+ export * from './mqtt';