@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
@@ -0,0 +1,141 @@
1
+ import mqtt, { MqttClient, IClientOptions, ISubscriptionGrant } from 'mqtt'
2
+ import { ASCError, ASCUnknownError } from '~/core/errors'
3
+
4
+ const QOS_FAILURE_CODE = 128
5
+
6
+ const RETRY_BASE_TIMEOUT = 1000;
7
+ const RETRY_COUNT_MAX = 10;
8
+
9
+ const enum MqttError {
10
+ IDENTIFIER_REJECTED = 2,
11
+ BAD_USERNAME_OR_PASSWORD = 4,
12
+ NOT_AUTHORIZED = 5,
13
+ }
14
+
15
+ export function getMqttOptions(params: { username: string, password: string, clientId?: string }): IClientOptions {
16
+ return {
17
+ clean: false, // keep subscriptions
18
+ clientId: `mqttjs_ + ${Math.random().toString(16).substr(2, 8)}`,
19
+ protocolId: 'MQTT',
20
+ protocolVersion: 4,
21
+ reconnectPeriod: 0, // disable auto reconnect
22
+ will: {
23
+ topic: 'WillMsg',
24
+ payload: 'Connection Closed abnormally..!',
25
+ qos: 0,
26
+ retain: false
27
+ },
28
+
29
+ ...params
30
+ }
31
+ }
32
+
33
+ /**
34
+ * Creates a pre-configured socket.io instance
35
+ *
36
+ * @param endpoint The mqtt server's URL
37
+ * @returns A pre-configured (non-connected) mqtt client instance
38
+ *
39
+ * @category Transport
40
+ * @hidden
41
+ */
42
+ export const createMqttTransport = (endpoint: string): Amity.MqttClient => {
43
+ let mqttClient: MqttClient | void;
44
+ let retryCount = 0
45
+ let allowReconnection = true
46
+
47
+ async function connect(params: { accessToken: string, userId: string }): Promise<void> {
48
+ if (mqttClient) {
49
+ mqttClient.removeAllListeners();
50
+ mqttClient.end(true)
51
+ }
52
+
53
+ mqttClient = mqtt.connect(endpoint, getMqttOptions({ username: params.userId, password: params.accessToken }))
54
+
55
+ mqttClient.on('connect', () => {
56
+ retryCount = 0
57
+ allowReconnection = true
58
+ })
59
+
60
+ mqttClient.on('error', (error: Error & { code: number }) => {
61
+ switch (error.code) {
62
+ case MqttError.IDENTIFIER_REJECTED:
63
+ case MqttError.BAD_USERNAME_OR_PASSWORD:
64
+ case MqttError.NOT_AUTHORIZED:
65
+ allowReconnection = false
66
+ }
67
+ })
68
+
69
+ mqttClient.on('close', () => {
70
+ if (allowReconnection) {
71
+ reconnect()
72
+ }
73
+ })
74
+
75
+ return new Promise(resolve => mqttClient!.once('connect', () => resolve()))
76
+ }
77
+
78
+ const reconnect = () => {
79
+ setTimeout(() => {
80
+ retryCount = retryCount + 1
81
+ mqttClient!.reconnect()
82
+ }, RETRY_BASE_TIMEOUT * Math.pow(2, retryCount > RETRY_COUNT_MAX ? RETRY_COUNT_MAX : retryCount))
83
+ }
84
+
85
+ return {
86
+ connect,
87
+ async disconnect(): Promise<void> {
88
+ allowReconnection = false
89
+
90
+ if (this.connected) {
91
+ return new Promise(resolve => mqttClient?.end(true, undefined, () => resolve()))
92
+ }
93
+ },
94
+ get connected() {
95
+ return !!mqttClient?.connected
96
+ },
97
+ on<T extends keyof Amity.MqttEvents>(event: T, handler: (payload: Amity.MqttEvents[T]) => void) {
98
+ mqttClient?.on(event, handler)
99
+ },
100
+ once<T extends keyof Amity.MqttEvents>(event: T, handler: (payload: Amity.MqttEvents[T]) => void) {
101
+ mqttClient?.once(event, handler)
102
+ },
103
+ off<T extends keyof Amity.MqttEvents>(event: T, handler?: (payload: Amity.MqttEvents[T]) => void) {
104
+ if (handler !== undefined) {
105
+ mqttClient?.off(event, handler)
106
+ } else {
107
+ mqttClient?.removeAllListeners(event)
108
+ }
109
+ },
110
+ removeAllListeners() {
111
+ mqttClient?.removeAllListeners()
112
+ },
113
+ subscribe(topic: string, callback?: Amity.Listener<ASCError | void>): Amity.Unsubscriber {
114
+ const callbackWrapper = (error: Error, granted: ISubscriptionGrant[]) => {
115
+ if (error || granted[0].qos === QOS_FAILURE_CODE) {
116
+ const ascError = error
117
+ ? new ASCError(error.message, Amity.ClientError.UNKNOWN_ERROR, Amity.ErrorLevel.ERROR)
118
+ // TODO throw the actual error, once BE can tell us the actual error code
119
+ : new ASCUnknownError(Amity.ClientError.UNKNOWN_ERROR, Amity.ErrorLevel.ERROR)
120
+
121
+ console.error(`Failed to subscribe to topic ${topic}`, ascError)
122
+ callback?.(ascError)
123
+ } else {
124
+ console.log(`Subscribed to topic ${granted[0].topic}`)
125
+ callback?.()
126
+ }
127
+ }
128
+
129
+ if (mqttClient) {
130
+ mqttClient.subscribe(topic, { qos: 0 }, callbackWrapper)
131
+ } else {
132
+ callbackWrapper(new Error('No connection to broker'), []);
133
+ }
134
+
135
+ return () => mqttClient?.unsubscribe(topic)
136
+ },
137
+ unsubscribe(topic: string) {
138
+ mqttClient?.unsubscribe(topic)
139
+ }
140
+ }
141
+ }
@@ -0,0 +1,25 @@
1
+ import { ASCApiError, ASCUnknownError } from '~/core/errors'
2
+
3
+ /**
4
+ * Unwraps v3 server payload (for error handling and type extraction)
5
+ *
6
+ * @param response A typical "v3" response (related to backend's service strategy)
7
+ *
8
+ * @returns The data returned by the backend
9
+ * @throws An error related to backend's rejection
10
+ *
11
+ * @category Transport
12
+ * @hidden
13
+ */
14
+ export const unwrapPayload = <T>(response: Amity.Response<T>): T => {
15
+ if (response.status === 'success') {
16
+ return response.data
17
+ } else if (response.status === 'fail') {
18
+ throw new ASCUnknownError(response.code)
19
+ } else if (response.status === 'error') {
20
+ throw new ASCApiError(response.message, response.code, Amity.ErrorLevel.ERROR)
21
+ }
22
+
23
+ // unjust, but helps force uncast "T | undefined" to allow deconstruction without warnings
24
+ return undefined as unknown as T
25
+ }
@@ -0,0 +1,61 @@
1
+ import io from 'socket.io-client'
2
+ import { unwrapPayload } from './utils'
3
+
4
+ /**
5
+ * Creates a pre-configured socket.io instance
6
+ *
7
+ * @param endpoint The socket.io server's URL
8
+ * @returns A pre-configured (non-connected) socket.io client instance
9
+ *
10
+ * @category Transport
11
+ * @hidden
12
+ */
13
+ export const createWebsocketTransport = (endpoint: string) => {
14
+ const socket = io(endpoint, {
15
+ autoConnect: false,
16
+ reconnectionDelay: 2000,
17
+ transports: ['websocket'],
18
+ })
19
+
20
+ // FIXME: disconnectClient removes this listener and client can get global ban event
21
+ socket.on('disconnect', (reason: string) => {
22
+ if (reason === 'io server disconnect')
23
+ socket.connect()
24
+ })
25
+
26
+ return socket
27
+ }
28
+
29
+ /**
30
+ * Promisify a websocket event emission - resulting in a synchronous http-like XHR (ws legacy)
31
+ *
32
+ * @param client The current client for which to send the event with
33
+ * @param event The websocket event name
34
+ * @param data The event's payload
35
+ *
36
+ * @returns The data returned by the backend
37
+ * @throws An error related to backend's rejection
38
+ *
39
+ * @category Transport
40
+ * @async
41
+ * @hidden
42
+ */
43
+ export const synchronousWSCall = async <T>(
44
+ client: Amity.Client,
45
+ event: string,
46
+ data?: Object,
47
+ )=> {
48
+ const { ws } = client
49
+
50
+ const value = await new Promise<T | undefined>((resolve, reject) => {
51
+ ws.emit(event, data, (response: Amity.Response<T>) => {
52
+ try {
53
+ resolve(unwrapPayload(response))
54
+ } catch (error) {
55
+ reject(error)
56
+ }
57
+ })
58
+ })
59
+
60
+ return value
61
+ }
@@ -19,7 +19,7 @@ import { decoratePayload, toPage, toToken } from '~/core/query'
19
19
  * @async
20
20
  **/
21
21
  export const queryGlobalFeed = async (query?: {
22
- dataTypes?: ('video' | 'image' | 'file')[]
22
+ dataTypes?: ('video' | 'image' | 'file' | 'liveStream')[]
23
23
  page?: Amity.Page
24
24
  }) => {
25
25
  const client = getActiveClient()
@@ -1,6 +1,6 @@
1
1
  import { getActiveClient } from '~/client/api'
2
2
 
3
- import { mergeInCache } from '~/core/cache'
3
+ import { dropFromCache } from '~/core/cache'
4
4
 
5
5
  /**
6
6
  * ```js
@@ -22,14 +22,13 @@ export const deleteFile = async (
22
22
  const client = getActiveClient()
23
23
  client.log('file/deleteFile', fileId)
24
24
 
25
- const { data } = await client.http.delete<{ success: boolean }>(
25
+ // API-FIX: payload is different than swagger docs!!
26
+ const { data } = await client.http.delete<{ fileId: string }>(
26
27
  `/api/v3/files/${fileId}`,
27
28
  )
28
29
 
29
- const { success } = data
30
+ dropFromCache('file', {fileId: data.fileId})
30
31
 
31
- if (success)
32
- mergeInCache('file', { fileId, isDeleted: true })
33
32
 
34
- return success
33
+ return { success: true }
35
34
  }
package/src/index.ts CHANGED
@@ -1,10 +1,13 @@
1
1
  // types
2
2
  import './@types'
3
3
 
4
+ export * from './version'
5
+
4
6
  // sdk core
5
7
  export * from './core/query'
6
8
  export * from './core/cache'
7
9
  export * from './core/stores'
10
+ export * from './core/subscription'
8
11
 
9
12
  export * from './client/api'
10
13
  export * from './client/events'
@@ -41,8 +41,8 @@ export const createPost = async <T extends Amity.PostContentType | string>(
41
41
  decoratePayload(data)
42
42
  ingestInCache(data)
43
43
 
44
- fireEvent('v3.community.didUpdate', { communities: data.communities! })
45
- fireEvent('v3.post.didCreate', data)
44
+ fireEvent('community.updated', { communities: data.communities! })
45
+ fireEvent('post.created', data)
46
46
 
47
47
  const { posts } = data
48
48
  return posts[0]
@@ -1,6 +1,7 @@
1
1
  import { getActiveClient } from '~/client/api'
2
2
  import { getCommunity } from '~/community/api'
3
3
  import { fireEvent } from '~/core/events'
4
+ import { dropFromCache, mergeInCache } from '~/core/cache'
4
5
 
5
6
  import { getPost } from './getPost'
6
7
 
@@ -20,24 +21,44 @@ import { getPost } from './getPost'
20
21
  */
21
22
  export const deletePost = async (
22
23
  postId: Amity.Post['postId'],
24
+ permanent: boolean = false,
23
25
  ) => {
24
26
  const client = getActiveClient()
25
27
  client.log('post/deletePost', postId)
26
28
 
29
+ let post = await getPost(postId)
30
+
27
31
  // API-FIX: This endpoint has not been implemented yet.
28
32
  await client.http.delete<{ success: boolean }>(
29
- `/api/v3/posts/${postId}`,
33
+ `/api/v4/posts/${postId}`, {
34
+ params: {
35
+ postId,
36
+ permanent,
37
+ },
38
+ },
30
39
  )
31
40
 
32
- // API-FIX: as for now we have no choice but to refetch
33
- const deleted = await getPost(postId)
34
-
35
- if (deleted.targetType === 'community') {
36
- const community = await getCommunity(deleted.targetId);
37
- fireEvent('v3.community.didUpdate', { communities: [community] })
41
+ // there is currently a limitation which doesn't allow us to fire event to tell that community
42
+ // has been updated. reason is that, when the object is deleted, we don't have its `communityId`
43
+ // and so we cannot refetch the community or advertise on events. hopefully this should be solved
44
+ // later when realtime events covers that for us.
45
+ if (post.targetType === 'community') {
46
+ const community = await getCommunity(post.targetId);
47
+ fireEvent('community.updated', { communities: [community] })
38
48
  }
39
49
 
40
- fireEvent('v3.post.didDelete', { posts: [deleted] })
50
+ // to support hard deletion
51
+ const deleted = { ...post, isDeleted: true }
52
+
53
+ fireEvent('post.deleted', { posts: [deleted] })
54
+
55
+ if (permanent) {
56
+ setTimeout(() => {
57
+ dropFromCache('post', {postId})
58
+ }, 0)
59
+ } else {
60
+ mergeInCache('post', {postId, isDeleted: true})
61
+ }
41
62
 
42
63
  return deleted
43
64
  }
@@ -1,5 +1,5 @@
1
1
  import { getActiveClient } from '~/client/api'
2
- import { ingestInCache, pullFromCache } from '~/core/cache'
2
+ import { ingestInCache, pullFromCache, dropFromCache } from '~/core/cache'
3
3
  import { decoratePayload } from '~/core/query'
4
4
 
5
5
  import { getPosts } from './getPosts'
@@ -24,10 +24,22 @@ export const getPost = async (
24
24
  const client = getActiveClient()
25
25
  client.log('post/getPost', postId)
26
26
 
27
- // API-FIX: endpoint should not be /list, parameters should be querystring.
28
- const { data } = await client.http.get<Amity.PostPayload>(
29
- `/api/v3/posts/${postId}`,
30
- )
27
+ let data: Amity.PostPayload;
28
+
29
+ try {
30
+ // API-FIX: endpoint should not be /list, parameters should be querystring.
31
+ const response = await client.http.get<Amity.PostPayload>(
32
+ `/api/v3/posts/${postId}`,
33
+ )
34
+
35
+ data = response.data;
36
+ } catch (error) {
37
+ if ((error as Amity.ErrorResponse)?.code === Amity.ServerError.ITEM_NOT_FOUND) {
38
+ dropFromCache('post', {postId})
39
+ }
40
+
41
+ throw error;
42
+ }
31
43
 
32
44
  decoratePayload(data)
33
45
  ingestInCache(data)
@@ -35,7 +35,7 @@ export const updatePost = async (
35
35
  decoratePayload(data)
36
36
  ingestInCache(data)
37
37
 
38
- fireEvent('v3.post.didUpdate', data)
38
+ fireEvent('post.updated', data)
39
39
 
40
40
  const { posts } = data
41
41
  return posts.find(post => post.postId === postId)!
@@ -1,3 +1,12 @@
1
1
  export * from './onPostCreated'
2
2
  export * from './onPostUpdated'
3
3
  export * from './onPostDeleted'
4
+
5
+ export * from './onPostApproved'
6
+ export * from './onPostDeclined'
7
+
8
+ export * from './onPostFlagged'
9
+ export * from './onPostUnflagged'
10
+
11
+ export * from './onPostReactionAdded'
12
+ export * from './onPostReactionRemoved'
@@ -0,0 +1,19 @@
1
+ import { createPostEventSubscriber } from './utils'
2
+
3
+ /**
4
+ * ```js
5
+ * import { onPostApproved } from '@amityco/ts-sdk'
6
+ * const dispose = onPostApproved(post => {
7
+ * // ...
8
+ * })
9
+ * ```
10
+ *
11
+ * Fired when a {@link Amity.Post} has been updated
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 Post Events
17
+ */
18
+ export const onPostApproved = (callback: Amity.Listener<Amity.Post>): Amity.Unsubscriber =>
19
+ createPostEventSubscriber('post.approved', callback)
@@ -1,8 +1,4 @@
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 { createPostEventSubscriber } from './utils'
6
2
 
7
3
  /**
8
4
  * ```js
@@ -12,28 +8,12 @@ import { ingestInCache } from '~/core/cache'
12
8
  * })
13
9
  * ```
14
10
  *
15
- * Fired when an {@link Amity.Post} has been created
11
+ * Fired when {@link Amity.Post} has been created
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 Post Events
21
17
  */
22
- export const onPostCreated = (
23
- callback: Amity.Listener<Amity.Post>
24
- ): Amity.Unsubscriber => {
25
- const client = getActiveClient()
26
-
27
- const filter = (payload: Amity.PostPayload) => {
28
- decoratePayload(payload)
29
- ingestInCache(payload)
30
- callback(payload.posts[0])
31
- }
32
-
33
- return createEventSubscriber(
34
- client,
35
- 'message/onPostCreated',
36
- 'v3.post.didCreate',
37
- filter
38
- )
39
- }
18
+ export const onPostCreated = (callback: Amity.Listener<Amity.Post>): Amity.Unsubscriber =>
19
+ createPostEventSubscriber('post.created', callback)
@@ -0,0 +1,19 @@
1
+ import { createPostEventSubscriber } from './utils'
2
+
3
+ /**
4
+ * ```js
5
+ * import { onPostDeclined } from '@amityco/ts-sdk'
6
+ * const dispose = onPostDeclined(post => {
7
+ * // ...
8
+ * })
9
+ * ```
10
+ *
11
+ * Fired when a {@link Amity.Post} has been updated
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 Post Events
17
+ */
18
+ export const onPostDeclined = (callback: Amity.Listener<Amity.Post>): Amity.Unsubscriber =>
19
+ createPostEventSubscriber('post.declined', callback)
@@ -1,8 +1,4 @@
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 { createPostEventSubscriber } from './utils'
6
2
 
7
3
  /**
8
4
  * ```js
@@ -12,28 +8,12 @@ import { ingestInCache } from '~/core/cache'
12
8
  * })
13
9
  * ```
14
10
  *
15
- * Fired when an {@link Amity.Post} has been deleted
11
+ * Fired when a {@link Amity.Post} has been deleted
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 Post Events
21
17
  */
22
- export const onPostDeleted = (
23
- callback: Amity.Listener<Amity.Post>
24
- ): Amity.Unsubscriber => {
25
- const client = getActiveClient()
26
-
27
- const filter = (payload: Amity.PostPayload) => {
28
- decoratePayload(payload)
29
- ingestInCache(payload)
30
- callback(payload.posts[0])
31
- }
32
-
33
- return createEventSubscriber(
34
- client,
35
- 'message/onPostDeleted',
36
- 'v3.post.didDelete',
37
- filter
38
- )
39
- }
18
+ export const onPostDeleted = (callback: Amity.Listener<Amity.Post>): Amity.Unsubscriber =>
19
+ createPostEventSubscriber('post.deleted', callback)
@@ -0,0 +1,19 @@
1
+ import { createPostEventSubscriber } from './utils'
2
+
3
+ /**
4
+ * ```js
5
+ * import { onPostFlagged } from '@amityco/ts-sdk'
6
+ * const dispose = onPostFlagged(post => {
7
+ * // ...
8
+ * })
9
+ * ```
10
+ *
11
+ * Fired when a {@link Amity.Post} has been flagged
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 Post Events
17
+ */
18
+ export const onPostFlagged = (callback: Amity.Listener<Amity.Post>): Amity.Unsubscriber =>
19
+ createPostEventSubscriber('post.flagged', callback)
@@ -0,0 +1,50 @@
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 { preparePayloadForCache } from '~/reaction/utils'
6
+ import { isMatch } from '~/core/model'
7
+
8
+ /**
9
+ * ```js
10
+ * import { onPostReactionAdded } from '@amityco/ts-sdk'
11
+ * const dispose = onPostReactionAdded(post => {
12
+ * // ...
13
+ * })
14
+ * ```
15
+ *
16
+ * Fired when a {@link Amity.Post} has been reacted
17
+ *
18
+ * @param callback The function to call when the event was fired
19
+ * @returns an {@link Amity.Unsubscriber} function to stop listening
20
+ *
21
+ * @category Post Events
22
+ */
23
+ export const onPostReactionAdded = (callback: Amity.Listener<Amity.Post>): Amity.Unsubscriber => {
24
+ const client = getActiveClient()
25
+
26
+ const filter = (payload: Amity.Events['post.addReaction']) => {
27
+ const [cached] = pullFromCache('post', payload.posts[0].postId) ?? []
28
+
29
+ const { reactor, ...postPayload } = payload;
30
+
31
+ decoratePayload(postPayload as Amity.PostPayload)
32
+ preparePayloadForCache('post.addReaction', payload)
33
+ ingestInCache(postPayload as Amity.PostPayload)
34
+
35
+ const [post] = pullFromCache('post', payload.posts[0].postId) ?? []
36
+
37
+ if (cached && isMatch(cached, post)) {
38
+ return
39
+ }
40
+
41
+ callback(post)
42
+ }
43
+
44
+ return createEventSubscriber(
45
+ client,
46
+ 'post.addReaction',
47
+ 'post.addReaction',
48
+ filter
49
+ )
50
+ }
@@ -0,0 +1,50 @@
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 { preparePayloadForCache } from '~/reaction/utils/preparePayloadForCache'
6
+ import { isMatch } from '~/core/model'
7
+
8
+ /**
9
+ * ```js
10
+ * import { onPostReactionRemoved } from '@amityco/ts-sdk'
11
+ * const dispose = onPostReactionRemoved(post => {
12
+ * // ...
13
+ * })
14
+ * ```
15
+ *
16
+ * Fired when a reaction has been removed from a {@link Amity.Post}
17
+ *
18
+ * @param callback The function to call when the event was fired
19
+ * @returns an {@link Amity.Unsubscriber} function to stop listening
20
+ *
21
+ * @category Post Events
22
+ */
23
+ export const onPostReactionRemoved = (callback: Amity.Listener<Amity.Post>): Amity.Unsubscriber => {
24
+ const client = getActiveClient()
25
+
26
+ const filter = (payload: Amity.Events['post.removeReaction']) => {
27
+ const [cached] = pullFromCache('post', payload.posts[0].postId) ?? []
28
+
29
+ const { reactor, ...postPayload } = payload;
30
+
31
+ decoratePayload(postPayload as Amity.PostPayload)
32
+ preparePayloadForCache('post.removeReaction', payload)
33
+ ingestInCache(postPayload as Amity.PostPayload)
34
+
35
+ const [post] = pullFromCache('post', payload.posts[0].postId) ?? []
36
+
37
+ if (cached && isMatch(cached, post)) {
38
+ return
39
+ }
40
+
41
+ callback(post)
42
+ }
43
+
44
+ return createEventSubscriber(
45
+ client,
46
+ 'post.removeReaction',
47
+ 'post.removeReaction',
48
+ filter
49
+ )
50
+ }
@@ -0,0 +1,19 @@
1
+ import { createPostEventSubscriber } from './utils'
2
+
3
+ /**
4
+ * ```js
5
+ * import { onPostUnflagged } from '@amityco/ts-sdk'
6
+ * const dispose = onPostUnflagged(post => {
7
+ * // ...
8
+ * })
9
+ * ```
10
+ *
11
+ * Fired when a flag has been removed from a {@link Amity.Post}
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 Post Events
17
+ */
18
+ export const onPostUnflagged = (callback: Amity.Listener<Amity.Post>): Amity.Unsubscriber =>
19
+ createPostEventSubscriber('post.unflagged', callback)