@amityco/ts-sdk 0.0.1-beta.36 → 0.0.1-beta.37

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 (133) hide show
  1. package/dist/@types/core/errors.d.ts +1 -0
  2. package/dist/@types/core/errors.d.ts.map +1 -1
  3. package/dist/@types/core/events.d.ts +4 -0
  4. package/dist/@types/core/events.d.ts.map +1 -1
  5. package/dist/@types/domains/client.d.ts +21 -1
  6. package/dist/@types/domains/client.d.ts.map +1 -1
  7. package/dist/@types/global.d.ts +7 -0
  8. package/dist/@types/global.d.ts.map +1 -1
  9. package/dist/client/api/accessTokenExpiryWatcher.d.ts +4 -0
  10. package/dist/client/api/accessTokenExpiryWatcher.d.ts.map +1 -0
  11. package/dist/client/api/activeUser.d.ts +1 -1
  12. package/dist/client/api/activeUser.d.ts.map +1 -1
  13. package/dist/client/api/connectClient.d.ts +1 -1
  14. package/dist/client/api/connectClient.d.ts.map +1 -1
  15. package/dist/client/api/createClient.d.ts +1 -1
  16. package/dist/client/api/createClient.d.ts.map +1 -1
  17. package/dist/client/api/disconnectClient.d.ts +0 -1
  18. package/dist/client/api/disconnectClient.d.ts.map +1 -1
  19. package/dist/client/api/getToken.d.ts +4 -4
  20. package/dist/client/api/index.d.ts +1 -0
  21. package/dist/client/api/index.d.ts.map +1 -1
  22. package/dist/client/api/renewal.d.ts +2 -0
  23. package/dist/client/api/renewal.d.ts.map +1 -0
  24. package/dist/client/api/setSessionState.d.ts +12 -0
  25. package/dist/client/api/setSessionState.d.ts.map +1 -0
  26. package/dist/client/api/terminateClient.d.ts +9 -0
  27. package/dist/client/api/terminateClient.d.ts.map +1 -0
  28. package/dist/client/api/tests/accessTokenExpiryWatcher.test.d.ts +2 -0
  29. package/dist/client/api/tests/accessTokenExpiryWatcher.test.d.ts.map +1 -0
  30. package/dist/client/api/tests/connectClient.test.d.ts +2 -0
  31. package/dist/client/api/tests/connectClient.test.d.ts.map +1 -0
  32. package/dist/client/api/tests/disconnectClient.test.d.ts +2 -0
  33. package/dist/client/api/tests/disconnectClient.test.d.ts.map +1 -0
  34. package/dist/client/api/tests/getToken.test.d.ts +2 -0
  35. package/dist/client/api/tests/getToken.test.d.ts.map +1 -0
  36. package/dist/client/api/tests/renewal.test.d.ts +2 -0
  37. package/dist/client/api/tests/renewal.test.d.ts.map +1 -0
  38. package/dist/client/api/tests/setSessionState.test.d.ts +2 -0
  39. package/dist/client/api/tests/setSessionState.test.d.ts.map +1 -0
  40. package/dist/client/api/tests/terminateClient.test.d.ts +2 -0
  41. package/dist/client/api/tests/terminateClient.test.d.ts.map +1 -0
  42. package/dist/client/events/index.d.ts +1 -0
  43. package/dist/client/events/index.d.ts.map +1 -1
  44. package/dist/client/events/onClientBanned.d.ts +1 -1
  45. package/dist/client/events/onClientBanned.d.ts.map +1 -1
  46. package/dist/client/events/onSessionStateChange.d.ts +17 -0
  47. package/dist/client/events/onSessionStateChange.d.ts.map +1 -0
  48. package/dist/client/events/onTokenExpired.d.ts +17 -0
  49. package/dist/client/events/onTokenExpired.d.ts.map +1 -0
  50. package/dist/client/events/onTokenTerminated.d.ts +11 -0
  51. package/dist/client/events/onTokenTerminated.d.ts.map +1 -0
  52. package/dist/client/events/tests/onSessionStateChange.test.d.ts +2 -0
  53. package/dist/client/events/tests/onSessionStateChange.test.d.ts.map +1 -0
  54. package/dist/client/events/tests/onTokenTerminated.test.d.ts +2 -0
  55. package/dist/client/events/tests/onTokenTerminated.test.d.ts.map +1 -0
  56. package/dist/client/utils/setClientToken.d.ts +19 -0
  57. package/dist/client/utils/setClientToken.d.ts.map +1 -0
  58. package/dist/comment/events/tests/onCommentDeleted.test.d.ts +2 -0
  59. package/dist/comment/events/tests/onCommentDeleted.test.d.ts.map +1 -0
  60. package/dist/core/events.d.ts +3 -3
  61. package/dist/core/events.d.ts.map +1 -1
  62. package/dist/core/subscription.d.ts.map +1 -1
  63. package/dist/core/transports/http.d.ts.map +1 -1
  64. package/dist/index.cjs.js +503 -137
  65. package/dist/index.esm.js +502 -138
  66. package/dist/index.umd.js +4 -4
  67. package/dist/stream/api/tests/createStream.test.d.ts +2 -0
  68. package/dist/stream/api/tests/createStream.test.d.ts.map +1 -0
  69. package/dist/stream/api/tests/deleteStream.test.d.ts +2 -0
  70. package/dist/stream/api/tests/deleteStream.test.d.ts.map +1 -0
  71. package/dist/stream/api/tests/getStream.test.d.ts +2 -0
  72. package/dist/stream/api/tests/getStream.test.d.ts.map +1 -0
  73. package/dist/subChannel/api/tests/createSubChannel.test.d.ts +2 -0
  74. package/dist/subChannel/api/tests/createSubChannel.test.d.ts.map +1 -0
  75. package/dist/utils/constants.d.ts +2 -0
  76. package/dist/utils/constants.d.ts.map +1 -1
  77. package/dist/utils/tests/client.d.ts.map +1 -1
  78. package/dist/utils/tests/dummy/index.d.ts +2 -0
  79. package/dist/utils/tests/dummy/index.d.ts.map +1 -1
  80. package/dist/utils/tests/dummy/stream.d.ts +83 -0
  81. package/dist/utils/tests/dummy/stream.d.ts.map +1 -0
  82. package/dist/utils/tests/dummy/subChannel.d.ts +20 -0
  83. package/dist/utils/tests/dummy/subChannel.d.ts.map +1 -1
  84. package/dist/utils/tests/dummy/token.d.ts +11 -0
  85. package/dist/utils/tests/dummy/token.d.ts.map +1 -0
  86. package/package.json +1 -1
  87. package/src/@types/core/errors.ts +1 -0
  88. package/src/@types/core/events.ts +6 -0
  89. package/src/@types/domains/client.ts +45 -1
  90. package/src/@types/global.ts +14 -0
  91. package/src/client/api/accessTokenExpiryWatcher.ts +83 -0
  92. package/src/client/api/activeUser.ts +1 -1
  93. package/src/client/api/connectClient.ts +105 -24
  94. package/src/client/api/createClient.ts +9 -1
  95. package/src/client/api/disconnectClient.ts +26 -2
  96. package/src/client/api/getToken.ts +6 -6
  97. package/src/client/api/index.ts +2 -0
  98. package/src/client/api/renewal.ts +74 -0
  99. package/src/client/api/setSessionState.ts +75 -0
  100. package/src/client/api/terminateClient.ts +20 -0
  101. package/src/client/api/tests/accessTokenExpiryWatcher.test.ts +129 -0
  102. package/src/client/api/tests/connectClient.test.ts +84 -0
  103. package/src/client/api/tests/createClient.test.ts +8 -0
  104. package/src/client/api/tests/disconnectClient.test.ts +78 -0
  105. package/src/client/api/tests/getToken.test.ts +36 -0
  106. package/src/client/api/tests/renewal.test.ts +67 -0
  107. package/src/client/api/tests/setSessionState.test.ts +62 -0
  108. package/src/client/api/tests/terminateClient.test.ts +29 -0
  109. package/src/client/events/index.ts +2 -0
  110. package/src/client/events/onClientBanned.ts +12 -5
  111. package/src/client/events/onSessionStateChange.ts +31 -0
  112. package/src/client/events/onTokenExpired.ts +26 -0
  113. package/src/client/events/onTokenTerminated.ts +20 -0
  114. package/src/client/events/tests/onSessionStateChange.test.ts +37 -0
  115. package/src/client/events/tests/onTokenTerminated.test.ts +37 -0
  116. package/src/client/tests/connectClient.test.ts +6 -1
  117. package/src/client/utils/setClientToken.ts +39 -0
  118. package/src/comment/events/tests/onCommentDeleted.test.ts +27 -0
  119. package/src/core/events.ts +5 -3
  120. package/src/core/subscription.ts +3 -1
  121. package/src/core/transports/http.ts +36 -1
  122. package/src/core/transports/mqtt.ts +1 -1
  123. package/src/external/api/createUserToken.ts +2 -2
  124. package/src/stream/api/tests/createStream.test.ts +30 -0
  125. package/src/stream/api/tests/deleteStream.test.ts +48 -0
  126. package/src/stream/api/tests/getStream.test.ts +23 -0
  127. package/src/subChannel/api/tests/createSubChannel.test.ts +103 -0
  128. package/src/utils/constants.ts +2 -0
  129. package/src/utils/tests/client.ts +18 -2
  130. package/src/utils/tests/dummy/index.ts +3 -0
  131. package/src/utils/tests/dummy/stream.ts +86 -0
  132. package/src/utils/tests/dummy/subChannel.ts +22 -0
  133. package/src/utils/tests/dummy/token.ts +12 -0
package/dist/index.esm.js CHANGED
@@ -1125,6 +1125,9 @@ const WS_EVENTS = [
1125
1125
  'connect_error',
1126
1126
  'reconnect_error',
1127
1127
  'reconnect_failed',
1128
+ 'sessionStateChange',
1129
+ // for internal use by accessTokenExpiryWatcher
1130
+ 'tokenExpired',
1128
1131
  ];
1129
1132
  const MQTT_EVENTS = [
1130
1133
  'connect',
@@ -1134,6 +1137,7 @@ const MQTT_EVENTS = [
1134
1137
  'close',
1135
1138
  'end',
1136
1139
  'reconnect',
1140
+ 'user.didGlobalBan',
1137
1141
  ];
1138
1142
  /** @hidden */
1139
1143
  const createEventEmitter = () => {
@@ -1152,7 +1156,6 @@ const createEventEmitter = () => {
1152
1156
  const proxyWebsocketEvents = (ws, emitter) => {
1153
1157
  WS_EVENTS.forEach(event => {
1154
1158
  ws.on(event, (param) => {
1155
- console.log('ws', event, param);
1156
1159
  emitter.emit(event, param);
1157
1160
  });
1158
1161
  });
@@ -1160,14 +1163,12 @@ const proxyWebsocketEvents = (ws, emitter) => {
1160
1163
  const proxyMqttEvents = (mqttClient, emitter) => {
1161
1164
  MQTT_EVENTS.forEach(event => {
1162
1165
  mqttClient.on(event, (...params) => {
1163
- console.log('mqtt', event, params);
1164
1166
  emitter.emit(event, params.length === 1 ? params[0] : params);
1165
1167
  });
1166
1168
  });
1167
1169
  // @ts-ignore
1168
1170
  mqttClient.on('message', (topic, payload) => {
1169
1171
  const message = JSON.parse(payload.toString());
1170
- console.log('mqtt message', message);
1171
1172
  emitter.emit(message.eventType, message.data);
1172
1173
  });
1173
1174
  };
@@ -1310,7 +1311,9 @@ const getSmartFeedMessageTopic = () => {
1310
1311
  let mqttAccessToken;
1311
1312
  let mqttUserId;
1312
1313
  function subscribeTopic(topic, callback) {
1313
- const { mqtt, emitter, accessToken } = getActiveClient();
1314
+ var _a;
1315
+ const { mqtt, emitter, token } = getActiveClient();
1316
+ const accessToken = (_a = token === null || token === void 0 ? void 0 : token.accessToken) !== null && _a !== void 0 ? _a : '';
1314
1317
  const user = getActiveUser();
1315
1318
  if (mqttAccessToken !== accessToken || mqttUserId !== user._id) {
1316
1319
  mqttAccessToken = accessToken;
@@ -1408,12 +1411,32 @@ const createHttpTransport = (endpoint) => {
1408
1411
  httpsAgent: new HttpsAgent(options),
1409
1412
  paramsSerializer: stringify,
1410
1413
  });
1414
+ instance.interceptors.request.use(config => {
1415
+ var _a;
1416
+ // check global.ts for the extension of AxiosRequestConfig
1417
+ const tokenExpiry = (_a = config.metadata) === null || _a === void 0 ? void 0 : _a.tokenExpiry;
1418
+ if (tokenExpiry) {
1419
+ if (Date.now() >= Date.parse(tokenExpiry)) {
1420
+ return Object.assign(Object.assign({}, config), { cancelToken: new axios.CancelToken(cancel => cancel('Token Expired')) });
1421
+ }
1422
+ }
1423
+ return config;
1424
+ });
1411
1425
  instance.interceptors.response.use(response => response, error => {
1412
1426
  var _a;
1413
1427
  const { response } = error;
1414
1428
  // eslint-disable-next-line no-console
1415
1429
  console.error((_a = response === null || response === void 0 ? void 0 : response.data) !== null && _a !== void 0 ? _a : error);
1416
- if (response)
1430
+ // handle unauthorized request
1431
+ if (response.data.code === 400100 /* Amity.ServerError.UNAUTHORIZED */) {
1432
+ fireEvent('tokenTerminated', "terminated" /* Amity.SessionStates.TERMINATED */);
1433
+ }
1434
+ // handle request cancellation
1435
+ if (axios.isCancel(error)) {
1436
+ fireEvent('tokenExpired', "tokenExpired" /* Amity.SessionStates.TOKEN_EXPIRED */);
1437
+ throw new ASCError('Token expired', 800403 /* Amity.ClientError.TOKEN_EXPIRED */, "fatal" /* Amity.ErrorLevel.FATAL */);
1438
+ }
1439
+ if (response === null || response === void 0 ? void 0 : response.data)
1417
1440
  unwrapPayload(response.data);
1418
1441
  });
1419
1442
  return instance;
@@ -20148,7 +20171,7 @@ var MqttError;
20148
20171
  MqttError[MqttError["NOT_AUTHORIZED"] = 5] = "NOT_AUTHORIZED";
20149
20172
  })(MqttError || (MqttError = {}));
20150
20173
  function getMqttOptions(params) {
20151
- return Object.assign({ clean: false, clientId: `mqttjs_ + ${Math.random().toString(16).substr(2, 8)}`, protocolId: 'MQTT', protocolVersion: 4, reconnectPeriod: 0, will: {
20174
+ return Object.assign({ clean: false, clientId: `mqttjs_ + ${Math.random().toString(16).substring(2, 10)}`, protocolId: 'MQTT', protocolVersion: 4, reconnectPeriod: 0, will: {
20152
20175
  topic: 'WillMsg',
20153
20176
  payload: 'Connection Closed abnormally..!',
20154
20177
  qos: 0,
@@ -20279,54 +20302,153 @@ const getFeedSettings = async () => {
20279
20302
  }));
20280
20303
  };
20281
20304
 
20282
- const DEFAULT_DEBUG_SESSION = 'amity';
20305
+ const COLLECTION_DEFAULT_PAGINATION_LIMIT = 5;
20306
+ const COLLECTION_DEFAULT_CACHING_POLICY = 'cache_then_server';
20307
+ const ENABLE_CACHE_MESSAGE = 'For using Live Collection feature you need to enable Cache!';
20308
+ const LIVE_OBJECT_ENABLE_CACHE_MESSAGE = 'For using Live Object feature you need to enable Cache!';
20309
+ const UNSYNCED_OBJECT_CACHED_AT_MESSAGE = 'Observing unsynced object is not supported by Live Object.';
20310
+ const UNSYNCED_OBJECT_CACHED_AT_VALUE = -5;
20311
+ const MINUTE = 60 * 1000;
20312
+ const ACCESS_TOKEN_WATCHER_INTERVAL = 10 * MINUTE;
20313
+
20314
+ // TODO: find a way to uniquely identify the device
20315
+ /** @hidden */
20316
+ const VERSION = '11.0.0';
20317
+ /** @hidden */
20318
+ const getDeviceId = () => {
20319
+ // here maybe put some auto detection of the device id based on if it's react or not?
20320
+ // anyhow we let consumer branch out if they want, but it doesn't mean we shouldn't try to be nice
20321
+ // and do things automatically
20322
+ // https://www.npmjs.com/package/react-native-device-info#getuniqueid
20323
+ // how to make sure that the react native package will not be included when build is for web
20324
+ return `ascWebSdk#${Math.random().toString(16)}`;
20325
+ };
20326
+ /** @hidden */
20327
+ const getDeviceModel = () => {
20328
+ var _a, _b;
20329
+ if ((_a = safeProcess.versions) === null || _a === void 0 ? void 0 : _a.node)
20330
+ return safeProcess.versions.node;
20331
+ if (navigator)
20332
+ return `${navigator.product.toLowerCase()}#${(_b = navigator.userAgent) !== null && _b !== void 0 ? _b : 'unknown_agent'}`;
20333
+ return 'unknown_model';
20334
+ };
20335
+ /** @hidden */
20336
+ const getDeviceInfo = () => {
20337
+ const model = getDeviceModel();
20338
+ return {
20339
+ version: VERSION,
20340
+ // TODO: replace with: kind: process.versions ? 'node' : 'web', when backend has fixed this
20341
+ kind: 'web',
20342
+ model,
20343
+ };
20344
+ };
20345
+
20346
+ /*
20347
+ * Session States cannot be set arbitarily.
20348
+ * These are the possible new states based on the current state
20349
+ * Check tech spec for details:
20350
+ * https://ekoapp.atlassian.net/wiki/spaces/UP/pages/2082537485/ASC+Core+-+Session+Management+3.0#Session-State
20351
+ */
20352
+ const sessisonStateTransitions = {
20353
+ // notLoggedIn -> establishing
20354
+ ["notLoggedIn" /* Amity.SessionStates.NOT_LOGGED_IN */]: ["establishing" /* Amity.SessionStates.ESTABLISHING */],
20355
+ // terminated -> establishing
20356
+ ["terminated" /* Amity.SessionStates.TERMINATED */]: ["establishing" /* Amity.SessionStates.ESTABLISHING */],
20357
+ // establishing -> notLoggedIn, established
20358
+ ["establishing" /* Amity.SessionStates.ESTABLISHING */]: [
20359
+ "notLoggedIn" /* Amity.SessionStates.NOT_LOGGED_IN */,
20360
+ "established" /* Amity.SessionStates.ESTABLISHED */,
20361
+ ],
20362
+ /*
20363
+ * established -> notLoggedIn, terminated, tokenExpired, establishing (for
20364
+ * cases when logging in same user)
20365
+ */
20366
+ ["established" /* Amity.SessionStates.ESTABLISHED */]: [
20367
+ "notLoggedIn" /* Amity.SessionStates.NOT_LOGGED_IN */,
20368
+ "terminated" /* Amity.SessionStates.TERMINATED */,
20369
+ "tokenExpired" /* Amity.SessionStates.TOKEN_EXPIRED */,
20370
+ "establishing" /* Amity.SessionStates.ESTABLISHING */,
20371
+ ],
20372
+ // tokenExpired -> establishing
20373
+ ["tokenExpired" /* Amity.SessionStates.TOKEN_EXPIRED */]: ["establishing" /* Amity.SessionStates.ESTABLISHING */],
20374
+ };
20375
+ const isValidStateChange = (prevState, nextState) => {
20376
+ return sessisonStateTransitions[prevState].includes(nextState);
20377
+ };
20283
20378
  /**
20284
- * ```js
20285
- * import { createClient } from '@amityco/ts-sdk'
20286
- * const client = createClient(apiKey, 'https://asc.server/', 'myClient')
20287
- * ```
20379
+ * Checks if a {@link Amity.Client} instance is connected to ASC servers
20288
20380
  *
20289
- * Creates a new {@link Amity.Client} instance
20290
20381
  *
20291
- * @param apiKey for the {@link Amity.Client} instance
20292
- * @param apiRegion endpoint to connect to
20293
- * @param apiEndpoint custom endpoint in case you don't want to use a preset endpoint
20294
- * @param debugSession session's identifier for the client's logger instance
20295
- * @returns A {@link Amity.Client} instance
20382
+ * @param state the new session state
20383
+ * @returns a success boolean if connected
20384
+ *
20385
+ * @category private
20386
+ */
20387
+ const setSessionState = (state) => {
20388
+ const client = getActiveClient();
20389
+ client.log('client/api/setSessionState', state);
20390
+ const { sessionState: prevState } = client;
20391
+ if (prevState === state)
20392
+ return false;
20393
+ // check if transition is valid
20394
+ if (!isValidStateChange(prevState, state)) {
20395
+ throw new ASCError(`Session state cannot change from ${prevState} to ${state}`, 800000 /* Amity.ClientError.UNKNOWN_ERROR */, "error" /* Amity.ErrorLevel.ERROR */);
20396
+ }
20397
+ client.sessionState = state;
20398
+ fireEvent('sessionStateChange', state);
20399
+ return true;
20400
+ };
20401
+
20402
+ /**
20403
+ * Retrieves a pair of {@link Amity.Tokens} necessary for connection
20404
+ *
20405
+ * @param params.userId The userId to use to issue a token
20406
+ * @param params.displayName The user's displayName
20407
+ * @param params.deviceId The user's device Id (can be manually set for native users)
20408
+ * @param params.authToken The authentication token - necessary when network option is set to secure
20409
+ * @return The accessToken for the given userId
20296
20410
  *
20297
20411
  * @category Client API
20298
- * */
20299
- const createClient = (apiKey, apiRegion = API_REGIONS.SG, { debugSession = DEFAULT_DEBUG_SESSION, apiEndpoint, } = {}) => {
20300
- var _a, _b;
20301
- const log = createLogger(debugSession);
20302
- log('client/api/createClient', {
20303
- apiKey: apiKey.replace(/.{5}$/g, 'xxxxx'),
20304
- apiRegion,
20412
+ * @hidden
20413
+ */
20414
+ const getToken = async (params) => {
20415
+ const client = getActiveClient();
20416
+ client.log('client/api/getToken', params);
20417
+ const deviceInfo = getDeviceInfo();
20418
+ const { data } = await client.http.post('/api/v3/sessions', Object.assign(Object.assign({}, params), { deviceInfo }), {
20419
+ // @ts-ignore
20420
+ headers: { 'X-API-Key': client.apiKey },
20305
20421
  });
20306
- const httpEndpoint = (_a = apiEndpoint === null || apiEndpoint === void 0 ? void 0 : apiEndpoint.http) !== null && _a !== void 0 ? _a : computeUrl('http', apiRegion);
20307
- const mqttEndpoint = (_b = apiEndpoint === null || apiEndpoint === void 0 ? void 0 : apiEndpoint.mqtt) !== null && _b !== void 0 ? _b : computeUrl('mqtt', apiRegion);
20308
- const http = createHttpTransport(httpEndpoint);
20309
- const ws = createWebsocketTransport(httpEndpoint);
20310
- const mqtt = createMqttTransport(mqttEndpoint);
20311
- const emitter = createEventEmitter();
20312
- const client = {
20313
- version: `${VERSION$1}`,
20314
- apiKey,
20315
- log,
20316
- http,
20317
- ws,
20318
- mqtt,
20319
- emitter,
20320
- use: () => setActiveClient(client),
20321
- getFeedSettings,
20322
- };
20323
- try {
20324
- return getActiveClient();
20325
- }
20326
- catch (_c) {
20327
- setActiveClient(client);
20328
- }
20329
- return client;
20422
+ return data;
20423
+ };
20424
+
20425
+ /**
20426
+ * A util to set or refresh client token
20427
+ *
20428
+ * @param params.userId the user ID for the current session
20429
+ * @param params.displayName the user's displayName for the current session
20430
+ * @param params.deviceId Manual override of the user's device id (for device management)
20431
+ * @param params.authToken The authentication token - necessary when network option is set to secure
20432
+ * @returns token & user info
20433
+ *
20434
+ * @category private
20435
+ * @async
20436
+ */
20437
+ const setClientToken = async (params) => {
20438
+ const client = getActiveClient();
20439
+ // begin establishing session
20440
+ setSessionState("establishing" /* Amity.SessionStates.ESTABLISHING */);
20441
+ // @ts-ignore: in that particular case, typing can be
20442
+ // ignored since we enforce default values just before.
20443
+ const { accessToken, users, expiresAt, issuedAt, refreshToken } = await getToken(params);
20444
+ // manually setup the token for http transport
20445
+ client.http.defaults.headers.common.Authorization = `Bearer ${accessToken}`;
20446
+ client.http.defaults.metadata = { tokenExpiry: expiresAt };
20447
+ // manually setup the token for ws transport
20448
+ client.ws.io.opts.query = { token: accessToken };
20449
+ client.token = { accessToken, issuedAt, expiresAt };
20450
+ setSessionState("established" /* Amity.SessionStates.ESTABLISHED */);
20451
+ return { accessToken, users, refreshToken };
20330
20452
  };
20331
20453
 
20332
20454
  /**
@@ -20337,7 +20459,6 @@ const createClient = (apiKey, apiRegion = API_REGIONS.SG, { debugSession = DEFAU
20337
20459
  *
20338
20460
  * Disconnects an {@link Amity.Client} instance from ASC servers
20339
20461
  *
20340
- * @param client The {@link Amity.Client} instance to disconnect
20341
20462
  * @returns a success boolean if disconnected
20342
20463
  *
20343
20464
  * @category Client API
@@ -20356,42 +20477,30 @@ const disconnectClient = async () => {
20356
20477
  client.ws.removeAllListeners();
20357
20478
  client.mqtt.removeAllListeners();
20358
20479
  client.userId = undefined;
20359
- client.accessToken = undefined;
20480
+ client.token = undefined;
20481
+ client.http.defaults.headers.common.Authorization = '';
20482
+ client.ws.io.opts.query = { token: '' };
20483
+ /*
20484
+ * for cases when session state is terminated (example on ban) or token expired,
20485
+ * the terminating block will set session state to terminated or for the or
20486
+ * in the case of expired token the same happens
20487
+ *
20488
+ * establishing state also ignored in cases where accessTokenExpiryWatcher
20489
+ * calls renewal. There is a possibility that renewal will be called before
20490
+ * disconnectClient finishes execution
20491
+ */
20492
+ if (client.sessionState === "established" /* Amity.SessionStates.ESTABLISHED */)
20493
+ setSessionState("notLoggedIn" /* Amity.SessionStates.NOT_LOGGED_IN */);
20494
+ /*
20495
+ * Cache should be usable if tokenExpired
20496
+ * https://ekoapp.atlassian.net/wiki/spaces/UP/pages/2082537485/ASC+Core+-+Session+Management+3.0#SDK-usability-based-on-Session-State
20497
+ */
20498
+ if (client.sessionState !== "tokenExpired" /* Amity.SessionStates.TOKEN_EXPIRED */ && client.cache) {
20499
+ client.cache = { data: {} };
20500
+ }
20360
20501
  return !client.ws.connected;
20361
20502
  };
20362
20503
 
20363
- // TODO: find a way to uniquely identify the device
20364
- /** @hidden */
20365
- const VERSION = '11.0.0';
20366
- /** @hidden */
20367
- const getDeviceId = () => {
20368
- // here maybe put some auto detection of the device id based on if it's react or not?
20369
- // anyhow we let consumer branch out if they want, but it doesn't mean we shouldn't try to be nice
20370
- // and do things automatically
20371
- // https://www.npmjs.com/package/react-native-device-info#getuniqueid
20372
- // how to make sure that the react native package will not be included when build is for web
20373
- return `ascWebSdk#${Math.random().toString(16)}`;
20374
- };
20375
- /** @hidden */
20376
- const getDeviceModel = () => {
20377
- var _a, _b;
20378
- if ((_a = safeProcess.versions) === null || _a === void 0 ? void 0 : _a.node)
20379
- return safeProcess.versions.node;
20380
- if (navigator)
20381
- return `${navigator.product.toLowerCase()}#${(_b = navigator.userAgent) !== null && _b !== void 0 ? _b : 'unknown_agent'}`;
20382
- return 'unknown_model';
20383
- };
20384
- /** @hidden */
20385
- const getDeviceInfo = () => {
20386
- const model = getDeviceModel();
20387
- return {
20388
- version: VERSION,
20389
- // TODO: replace with: kind: process.versions ? 'node' : 'web', when backend has fixed this
20390
- kind: 'web',
20391
- model,
20392
- };
20393
- };
20394
-
20395
20504
  /**
20396
20505
  * Ingest a payload (v3) into the cache
20397
20506
  *
@@ -20443,26 +20552,17 @@ const createUserEventSubscriber = (event, callback) => {
20443
20552
  const onUserDeleted = (callback) => createUserEventSubscriber('user.deleted', callback);
20444
20553
 
20445
20554
  /**
20446
- * Retrieves a pair of {@link Amity.Tokens} necessary for connection
20555
+ * Terminates {@link Amity.Client} instance
20447
20556
  *
20448
- * @param userId The userId to use to issue a token
20449
- * @param displayName The user's displayName
20450
- * @param deviceId The user's device Id (can be manually set for native users)
20451
- * @param authToken The authentication token - necessary when network option is set to secure
20452
- * @return The accessToken for the given userId
20453
20557
  *
20454
- * @category Client API
20455
- * @hidden
20558
+ *
20559
+ * @category private
20456
20560
  */
20457
- const getToken = async (params) => {
20561
+ const terminateClient = () => {
20458
20562
  const client = getActiveClient();
20459
- client.log('client/api/getToken', params);
20460
- const deviceInfo = await getDeviceInfo();
20461
- const { data } = await client.http.post('/v1/device', Object.assign(Object.assign({}, params), { deviceInfo }), {
20462
- // @ts-ignore
20463
- headers: { 'X-API-Key': client.apiKey },
20464
- });
20465
- return data;
20563
+ setSessionState("terminated" /* Amity.SessionStates.TERMINATED */);
20564
+ client.sessionHandler = undefined;
20565
+ disconnectClient();
20466
20566
  };
20467
20567
 
20468
20568
  const EVENTS = [
@@ -20537,12 +20637,71 @@ const onClientDisconnected = (callback) => {
20537
20637
  * @category Client Events
20538
20638
  */
20539
20639
  const onClientBanned = (callback) => {
20540
- return onConnectionError(({ code }) => {
20541
- code === 400312 /* Amity.ServerError.GLOBAL_BAN */ && callback();
20542
- });
20640
+ const client = getActiveClient();
20641
+ return createEventSubscriber(client, `client/onConnectionError(user.didGlobalBan)`, 'user.didGlobalBan', callback);
20642
+ };
20643
+
20644
+ /**
20645
+ * ```js
20646
+ * import { onSessionStateChange } from '@amityco/ts-sdk'
20647
+ * const dispose = onSessionStateChange((state: Amity.SessionStates) => {
20648
+ * // ...
20649
+ * })
20650
+ * ```
20651
+ *
20652
+ * Fired when any {@link Amity.Client} has a session state change
20653
+ *
20654
+ * @param callback The function to call when the event was fired
20655
+ * @returns an {@link Amity.Unsubscriber} function to stop listening
20656
+ *
20657
+ * @category Client Events
20658
+ */
20659
+ const onSessionStateChange = (callback) => {
20660
+ const client = getActiveClient();
20661
+ return createEventSubscriber(client, `client/onSessionStateChange`, 'sessionStateChange', callback);
20662
+ };
20663
+
20664
+ /**
20665
+ * ```js
20666
+ * import { onTokenExpired } from '@amityco/ts-sdk'
20667
+ * const dispose = onTokenExpired((state: Amity.SessionStates.TOKEN_EXPIRED) => {
20668
+ * // ...
20669
+ * })
20670
+ * ```
20671
+ *
20672
+ * Fired when any {@link Amity.Client} session state has expired
20673
+ *
20674
+ * @param callback The function to call when the event was fired
20675
+ * @returns an {@link Amity.Unsubscriber} function to stop listening
20676
+ *
20677
+ * @category private
20678
+ */
20679
+ const onTokenExpired = (callback) => {
20680
+ const client = getActiveClient();
20681
+ return createEventSubscriber(client, `client/onTokenExpired`, 'tokenExpired', callback);
20682
+ };
20683
+
20684
+ /**
20685
+ *
20686
+ * Fired when any {@link Amity.Client} session state has terminated
20687
+ *
20688
+ * @param callback The function to call when the event was fired
20689
+ * @returns an {@link Amity.Unsubscriber} function to stop listening
20690
+ *
20691
+ * @category private
20692
+ */
20693
+ const onTokenTerminated = (callback) => {
20694
+ const client = getActiveClient();
20695
+ return createEventSubscriber(client, `client/onTokenTerminated`, 'tokenTerminated', callback);
20543
20696
  };
20544
20697
 
20545
20698
  /* eslint-disable no-param-reassign */
20699
+ /*
20700
+ * declared earlier to accomodate case when logging in with a different user
20701
+ * than the one already connected, in which case the existing subscriptions need
20702
+ * to be cleared
20703
+ */
20704
+ const subscriptions = [];
20546
20705
  /**
20547
20706
  * ```js
20548
20707
  * import { connectClient } from '@amityco/ts-sdk/client/api'
@@ -20563,46 +20722,258 @@ const onClientBanned = (callback) => {
20563
20722
  * @category Client API
20564
20723
  * @async
20565
20724
  */
20566
- const connectClient = async (params, config) => {
20567
- var _a;
20725
+ const connectClient = async (params, sessionHandler, config) => {
20726
+ var _a, _b, _c;
20568
20727
  const client = getActiveClient();
20569
- client.log('client/api/connectClient', Object.assign({ apiKey: client.apiKey }, params));
20728
+ let unsubWatcher;
20729
+ client.log('client/api/connectClient', Object.assign({ apiKey: client.apiKey, sessionState: client.sessionState }, params));
20730
+ // if connecting to a different userId than the one that is connected currently
20731
+ if (client.userId && client.userId !== params.userId) {
20732
+ await disconnectClient();
20733
+ // Remove subscription to ban and delete
20734
+ subscriptions.forEach(fn => fn());
20735
+ }
20570
20736
  // default values
20571
20737
  (_a = params.deviceId) !== null && _a !== void 0 ? _a : (params.deviceId = getDeviceId());
20572
- // @ts-ignore: in that particular case, typing can be
20573
- // ignored since we enforce default values just before.
20574
- const { accessToken, users } = await getToken(params);
20575
- // manually setup the token for http, ws transport
20576
- client.http.defaults.headers.common.Authorization = `Bearer ${accessToken}`;
20577
- client.ws.io.opts.query = { token: accessToken };
20578
- // FIXME: events are duplicated if connectClient is called few times without disconnectClient
20579
- // wire websocket events to our event emitter
20580
- proxyWebsocketEvents(client.ws, client.emitter);
20581
- // TODO: in phase 2, this should not be necessary. we should have WS
20582
- // to be connected "on demand" rather than "by default"
20583
- await new Promise(resolve => {
20584
- client.ws.once('connect', resolve);
20585
- client.ws.open();
20586
- });
20587
- client.userId = params.userId;
20588
- client.accessToken = accessToken;
20589
- setActiveUser(users[0]);
20738
+ try {
20739
+ // @ts-ignore: in that particular case, typing can be
20740
+ // ignored since we enforce default values just before.
20741
+ const { users } = await setClientToken(params);
20742
+ // FIXME: events are duplicated if connectClient is called few times without disconnectClient
20743
+ // wire websocket events to our event emitter
20744
+ proxyWebsocketEvents(client.ws, client.emitter);
20745
+ // TODO: in phase 2, this should not be necessary. we should have WS
20746
+ // to be connected "on demand" rather than "by default"
20747
+ await new Promise(resolve => {
20748
+ client.ws.once('connect', resolve);
20749
+ client.ws.open();
20750
+ });
20751
+ client.userId = params.userId;
20752
+ client.sessionHandler = sessionHandler;
20753
+ /*
20754
+ * Cannot push to subscriptions as watcher needs to continue working even if
20755
+ * token expires
20756
+ */
20757
+ unsubWatcher = client.accessTokenExpiryWatcher((_b = client.token) === null || _b === void 0 ? void 0 : _b.issuedAt, (_c = client.token) === null || _c === void 0 ? void 0 : _c.expiresAt, sessionHandler);
20758
+ setActiveUser(users[0]);
20759
+ }
20760
+ catch (error) {
20761
+ /*
20762
+ * if getting token failed session state reverts to initial state when app
20763
+ * is first launched
20764
+ */
20765
+ setSessionState("notLoggedIn" /* Amity.SessionStates.NOT_LOGGED_IN */);
20766
+ // pass error down tree so the calling function handle it
20767
+ throw error;
20768
+ }
20590
20769
  if ((config === null || config === void 0 ? void 0 : config.disableRTE) !== true) {
20591
20770
  subscribeTopic(getNetworkTopic());
20592
20771
  subscribeTopic(getSmartFeedChannelTopic());
20593
20772
  subscribeTopic(getSmartFeedSubChannelTopic());
20594
20773
  subscribeTopic(getSmartFeedMessageTopic());
20774
+ // subscribing to user topic is necessary to handle ban event
20775
+ subscribeTopic(getUserTopic(getActiveUser()));
20595
20776
  }
20596
- const subscriptions = [
20597
- onClientBanned(() => {
20598
- disconnectClient();
20777
+ subscriptions.push(
20778
+ // GLOBAL_BAN
20779
+ onClientBanned((_) => {
20780
+ terminateClient();
20781
+ subscriptions.forEach(fn => fn());
20782
+ unsubWatcher();
20783
+ }), onTokenTerminated(_ => {
20784
+ terminateClient();
20785
+ subscriptions.forEach(fn => fn());
20786
+ unsubWatcher();
20787
+ }), onUserDeleted((user) => {
20788
+ if (user.userId === client.userId) {
20789
+ terminateClient();
20599
20790
  subscriptions.forEach(fn => fn());
20600
- }),
20601
- onUserDeleted(() => null),
20602
- ];
20791
+ unsubWatcher();
20792
+ }
20793
+ }), onTokenExpired(state => {
20794
+ setSessionState(state);
20795
+ disconnectClient();
20796
+ subscriptions.forEach(fn => fn());
20797
+ }), onUserDeleted(() => null));
20603
20798
  return client.ws.connected;
20604
20799
  };
20605
20800
 
20801
+ /*
20802
+ * Renewal defintion accepted by SessionHandler interface
20803
+ *
20804
+ * Tech Spec:
20805
+ * https://ekoapp.atlassian.net/wiki/spaces/UP/pages/2082537485/ASC+Core+-+Session+Management+3.0#Session-Handler
20806
+ *
20807
+ * @category private
20808
+ */
20809
+ const renewal = () => {
20810
+ let tokenRenewed = false;
20811
+ let renewTimeoutId;
20812
+ const client = getActiveClient();
20813
+ client.log('initiating access token renewal');
20814
+ /*
20815
+ * Renews a token if it is hasn't been renewed before. Also marks token as
20816
+ * renewed once done
20817
+ * Per instance of Renewal, only one renewal is allowed
20818
+ */
20819
+ const renewToken = async (authToken) => {
20820
+ const { userId, displayName } = getActiveUser();
20821
+ const deviceId = getDeviceId();
20822
+ const params = { userId, displayName, authToken, deviceId };
20823
+ if (client.sessionState === "tokenExpired" /* Amity.SessionStates.TOKEN_EXPIRED */) {
20824
+ // sessionHandler will never be empty when renewal is instantiatied
20825
+ await connectClient(params, client.sessionHandler);
20826
+ }
20827
+ else {
20828
+ // about to expire
20829
+ // @ts-ignore: in that particular case, typing can be
20830
+ // ignored since we enforce default values just before.
20831
+ await setClientToken(params);
20832
+ }
20833
+ tokenRenewed = true;
20834
+ if (renewTimeoutId)
20835
+ clearTimeout(renewTimeoutId);
20836
+ };
20837
+ return {
20838
+ renew: () => {
20839
+ if (tokenRenewed) {
20840
+ console.log("'renew' method can be called only once per renewal instance");
20841
+ return;
20842
+ }
20843
+ renewToken();
20844
+ },
20845
+ renewWithAuthToken: (authToken) => {
20846
+ if (tokenRenewed) {
20847
+ console.log("'renewWithAuthToken' method can be called only once per renewal instance");
20848
+ return;
20849
+ }
20850
+ renewToken(authToken);
20851
+ },
20852
+ unableToRetrieveAuthToken: () => {
20853
+ renewTimeoutId = setTimeout(() => {
20854
+ var _a;
20855
+ (_a = client.sessionHandler) === null || _a === void 0 ? void 0 : _a.sessionWillRenewAccessToken(renewal());
20856
+ }, ACCESS_TOKEN_WATCHER_INTERVAL);
20857
+ },
20858
+ };
20859
+ };
20860
+
20861
+ const ABOUT_TO_EXPIRE_THRESHOLD = 80 / 100;
20862
+ const COMPENSATED_DELAY = 5 * MINUTE;
20863
+ /*
20864
+ * a helper function to check if the token has expires
20865
+ *
20866
+ * @param token to be checked
20867
+ * @returns boolean indicating if token expires
20868
+ *
20869
+ * @category private
20870
+ */
20871
+ const isExpired = (expiresAt) => Date.now() > Date.parse(expiresAt) - COMPENSATED_DELAY;
20872
+ /*
20873
+ * a helper function to check if the token is about to expire
20874
+ *
20875
+ * @param token to be checked
20876
+ * @returns boolean indicating if token is aboutToExpire
20877
+ *
20878
+ * @category private
20879
+ */
20880
+ const isAboutToExpire = (expiresAt, issuedAt) => {
20881
+ const expires = Date.parse(expiresAt);
20882
+ const issued = Date.parse(issuedAt);
20883
+ const now = Date.now();
20884
+ const duration = expires - issued - COMPENSATED_DELAY;
20885
+ const aboutToExpireAt = issued + duration * ABOUT_TO_EXPIRE_THRESHOLD;
20886
+ return now > aboutToExpireAt && now < expires;
20887
+ };
20888
+ /*
20889
+ * Monitors time to expire of token and updates session state to aboutToExpire
20890
+ *
20891
+ * @returns intervalId to be cleared after trigger
20892
+ *
20893
+ * @category private
20894
+ */
20895
+ const accessTokenExpiryWatcher = (expiresAt, issuedAt, sessionHandler) => {
20896
+ const interval = setInterval(() => {
20897
+ if (isExpired(expiresAt)) {
20898
+ /*
20899
+ * the event handler will take care of updating session state
20900
+ * Note, this will also clear the interval id, so this event will only be
20901
+ * fired once
20902
+ */
20903
+ fireEvent('tokenExpired', "tokenExpired" /* Amity.SessionStates.TOKEN_EXPIRED */);
20904
+ /*
20905
+ * https://ekoapp.atlassian.net/wiki/spaces/UP/pages/2082537485/ASC+Core+-+Session+Management+3.0#Automatically-initiate-renewal-flow
20906
+ *
20907
+ * Why sechduled task?
20908
+ * Since fireEvent is scheduled, it will be called
20909
+ * after sessionHandler leading to an invalid state change from
20910
+ * establishing to tokenExpired
20911
+ */
20912
+ scheduleTask(() => sessionHandler.sessionWillRenewAccessToken(renewal()));
20913
+ return;
20914
+ }
20915
+ if (isAboutToExpire(issuedAt, expiresAt)) {
20916
+ sessionHandler.sessionWillRenewAccessToken(renewal());
20917
+ }
20918
+ }, ACCESS_TOKEN_WATCHER_INTERVAL);
20919
+ return () => clearInterval(interval);
20920
+ };
20921
+
20922
+ const DEFAULT_DEBUG_SESSION = 'amity';
20923
+ /**
20924
+ * ```js
20925
+ * import { createClient } from '@amityco/ts-sdk'
20926
+ * const client = createClient(apiKey, 'https://asc.server/', 'myClient')
20927
+ * ```
20928
+ *
20929
+ * Creates a new {@link Amity.Client} instance
20930
+ *
20931
+ * @param apiKey for the {@link Amity.Client} instance
20932
+ * @param apiRegion endpoint to connect to
20933
+ * @param apiEndpoint custom endpoint in case you don't want to use a preset endpoint
20934
+ * @param param.debugSession session's identifier for the client's logger instance
20935
+ * @returns A {@link Amity.Client} instance
20936
+ *
20937
+ * @category Client API
20938
+ * */
20939
+ const createClient = (apiKey, apiRegion = API_REGIONS.SG, { debugSession = DEFAULT_DEBUG_SESSION, apiEndpoint, } = {}) => {
20940
+ var _a, _b;
20941
+ const log = createLogger(debugSession);
20942
+ log('client/api/createClient', {
20943
+ apiKey: apiKey.replace(/.{5}$/g, 'xxxxx'),
20944
+ apiRegion,
20945
+ });
20946
+ const httpEndpoint = (_a = apiEndpoint === null || apiEndpoint === void 0 ? void 0 : apiEndpoint.http) !== null && _a !== void 0 ? _a : computeUrl('http', apiRegion);
20947
+ const mqttEndpoint = (_b = apiEndpoint === null || apiEndpoint === void 0 ? void 0 : apiEndpoint.mqtt) !== null && _b !== void 0 ? _b : computeUrl('mqtt', apiRegion);
20948
+ const http = createHttpTransport(httpEndpoint);
20949
+ const ws = createWebsocketTransport(httpEndpoint);
20950
+ const mqtt = createMqttTransport(mqttEndpoint);
20951
+ const emitter = createEventEmitter();
20952
+ const sessionState = "notLoggedIn" /* Amity.SessionStates.NOT_LOGGED_IN */;
20953
+ const sessionHandler = undefined;
20954
+ const client = {
20955
+ version: `${VERSION$1}`,
20956
+ apiKey,
20957
+ log,
20958
+ http,
20959
+ ws,
20960
+ mqtt,
20961
+ emitter,
20962
+ accessTokenExpiryWatcher,
20963
+ use: () => setActiveClient(client),
20964
+ sessionState,
20965
+ sessionHandler,
20966
+ getFeedSettings,
20967
+ };
20968
+ try {
20969
+ return getActiveClient();
20970
+ }
20971
+ catch (_c) {
20972
+ setActiveClient(client);
20973
+ }
20974
+ return client;
20975
+ };
20976
+
20606
20977
  /**
20607
20978
  * ```js
20608
20979
  * import { isConnected } from '@amityco/ts-sdk'
@@ -21012,13 +21383,6 @@ const onUserUnflagged = (callback) => createUserEventSubscriber('user.unflagged'
21012
21383
  */
21013
21384
  const onUserFlagCleared = (callback) => createUserEventSubscriber('user.flagCleared', callback);
21014
21385
 
21015
- const COLLECTION_DEFAULT_PAGINATION_LIMIT = 5;
21016
- const COLLECTION_DEFAULT_CACHING_POLICY = 'cache_then_server';
21017
- const ENABLE_CACHE_MESSAGE = 'For using Live Collection feature you need to enable Cache!';
21018
- const LIVE_OBJECT_ENABLE_CACHE_MESSAGE = 'For using Live Object feature you need to enable Cache!';
21019
- const UNSYNCED_OBJECT_CACHED_AT_MESSAGE = 'Observing unsynced object is not supported by Live Object.';
21020
- const UNSYNCED_OBJECT_CACHED_AT_VALUE = -5;
21021
-
21022
21386
  /**
21023
21387
  * ```js
21024
21388
  * import { onUserFetched } from '@amityco/ts-sdk'
@@ -29180,10 +29544,10 @@ const onStreamRecorded = (callback) => {
29180
29544
  */
29181
29545
  const createUserToken = async (apiKey, apiRegion, params) => {
29182
29546
  const deviceId = getDeviceId();
29183
- const deviceInfo = await getDeviceInfo();
29547
+ const deviceInfo = getDeviceInfo();
29184
29548
  const http = createHttpTransport(computeUrl('http', apiRegion));
29185
- const { data } = await http.post('/api/v3/sessions', Object.assign(Object.assign({}, params), { deviceId, deviceInfo: Object.assign(Object.assign({}, deviceInfo), { model: 'token management API on TS-SDK' }) }), { headers: { 'X-API-Key': apiKey } });
29549
+ const { data } = await http.post('/api/v4/sessions', Object.assign(Object.assign({}, params), { deviceId, deviceInfo: Object.assign(Object.assign({}, deviceInfo), { model: 'token management API on TS-SDK' }) }), { headers: { 'X-API-Key': apiKey } });
29186
29550
  return { accessToken: data.accessToken };
29187
29551
  };
29188
29552
 
29189
- export { API_REGIONS, CommunityPostSettingMaps, CommunityPostSettings, ContentFeedType, DefaultCommunityPostSetting, FileType, MessageContentType, PostContentType, SubscriptionLevels, VERSION$1 as VERSION, VideoResolution, VideoSize, VideoTranscodingStatus, acceptFollower, addChannelMembers, addChannelMembersRole, addCommunityMembers, addCommunityMembersRoles, addReaction, approvePost, backupCache, banChannelMembers, closePoll, connectClient, createChannel, createClient, createComment, createCommunity, createFile, createImage, createMessage, createPoll, createPost, createQuery, createReport, createStream, createSubChannel, createUserToken, createVideo, declineFollower, declinePost, deleteChannel, deleteComment, deleteCommunity, deleteFile, deleteMessage, deletePoll, deletePost, deleteReport, deleteStream, deleteSubChannel, disableCache, disconnectClient, disposeStream, dropFromCache, enableCache, fileUrlWithSize, filterByChannelMembership, filterByPropEquality, filterByPropInclusion, follow, getActiveClient, getCategory, getChannel, getChannelTopic, getChannels, getComment, getCommentTopic, getComments, getCommunities, getCommunity, getCommunityTopic, getFeedSettings, getFile, getFollowInfo, getMessage, getMessageTopic, getMessages, getMyFollowersTopic, getMyFollowingsTopic, getNetworkTopic, getPoll, getPost, getPostTopic, getPosts, getRecommendedCommunities, getRole, getSmartFeedChannelTopic, getSmartFeedMessageTopic, getSmartFeedSubChannelTopic, getStream, getSubChannel, getSubChannelTopic, getSubChannels, getTopTrendingCommunities, getUser, getUserTopic, getUsers, isAfterBefore, isAfterBeforeRaw, isCachable, isConnected, isFetcher, isFresh, isLocal, isMutator, isOffline, isPaged, isReportedByMe, isSkipLimit, joinChannel, joinCommunity, leaveChannel, leaveCommunity, liveChannel, liveChannelMembers, liveChannels, liveComments, liveFollowers, liveFollowings, liveMessage, liveMessages, livePosts, liveReactions, liveSubChannel, liveSubChannels, liveUser, mergeInCache, observeChannel, observeChannels, observeComment, observeComments, observeCommunity, observeFile, observeFollowInfo, observeFollowers, observeFollowings, observeMessage, observeMessages, observePoll, observePost, observePosts, observeUser, onChannelCreated, onChannelDeleted, onChannelJoined, onChannelLeft, onChannelMemberAdded, onChannelMemberBanned, onChannelMemberRemoved, onChannelMemberUnbanned, onChannelMuted, onChannelUpdated, onClientBanned, onClientDisconnected, onCommentCreated, onCommentDeleted, onCommentFlagged, onCommentReactionAdded, onCommentReactionRemoved, onCommentUnflagged, onCommentUpdated, onCommunityCreated, onCommunityDeleted, onCommunityJoined, onCommunityLeft, onCommunityUpdated, onCommunityUserAdded, onCommunityUserBanned, onCommunityUserRemoved, onCommunityUserUnbanned, onConnectionError, onFollowInfoUpdated, onFollowRequestAccepted, onFollowRequestCanceled, onFollowRequestDeclined, onFollowerDeleted, onFollowerRequested, onMessageCreated, onMessageDeleted, onMessageFlagCleared, onMessageFlagged, onMessageReactionAdded, onMessageReactionRemoved, onMessageUnflagged, onMessageUpdated, onPollDeleted, onPollUpdated, onPostApproved, onPostCreated, onPostDeclined, onPostDeleted, onPostFlagged, onPostReactionAdded, onPostReactionRemoved, onPostUnflagged, onPostUpdated, onReactionAdded, onReactionRemoved, onReactorAdded, onReactorRemoved, onStreamRecorded, onStreamStarted, onStreamStopped, onSubChannelCreated, onSubChannelDeleted, onSubChannelUpdated, onUserDeleted, onUserFlagCleared, onUserFlagged, onUserFollowed, onUserUnflagged, onUserUnfollowed, onUserUpdated, pullFromCache, pushToCache, queryCache, queryCategories, queryChannelMembers, queryChannels, queryComments, queryCommunities, queryCommunityMembers, queryFollowers, queryFollowings, queryGlobalFeed, queryMessages, queryOptions, queryPosts, queryReactions, queryRoles, queryStreams, querySubChannels, queryUsers, removeChannelMembers, removeChannelMembersRole, removeCommunityMembers, removeCommunityMembersRoles, removeReaction, restoreCache, runQuery, sortByChannelSegment, sortByDisplayName, sortByFirstCreated, sortByLastActivity, sortByLastCreated, sortBySegmentNumber, startReading, stopReading, subscribeTopic, toPage, toPageRaw, toToken, unbanChannelMembers, unfollow, updateChannel, updateComment, updateCommunity, updateMessage, updatePost, updateStream, updateSubChannel, updateUser, upsertInCache, votePoll, wipeCache };
29553
+ export { API_REGIONS, CommunityPostSettingMaps, CommunityPostSettings, ContentFeedType, DefaultCommunityPostSetting, FileType, MessageContentType, PostContentType, SubscriptionLevels, VERSION$1 as VERSION, VideoResolution, VideoSize, VideoTranscodingStatus, acceptFollower, addChannelMembers, addChannelMembersRole, addCommunityMembers, addCommunityMembersRoles, addReaction, approvePost, backupCache, banChannelMembers, closePoll, connectClient, createChannel, createClient, createComment, createCommunity, createFile, createImage, createMessage, createPoll, createPost, createQuery, createReport, createStream, createSubChannel, createUserToken, createVideo, declineFollower, declinePost, deleteChannel, deleteComment, deleteCommunity, deleteFile, deleteMessage, deletePoll, deletePost, deleteReport, deleteStream, deleteSubChannel, disableCache, disconnectClient, disposeStream, dropFromCache, enableCache, fileUrlWithSize, filterByChannelMembership, filterByPropEquality, filterByPropInclusion, follow, getActiveClient, getCategory, getChannel, getChannelTopic, getChannels, getComment, getCommentTopic, getComments, getCommunities, getCommunity, getCommunityTopic, getFeedSettings, getFile, getFollowInfo, getMessage, getMessageTopic, getMessages, getMyFollowersTopic, getMyFollowingsTopic, getNetworkTopic, getPoll, getPost, getPostTopic, getPosts, getRecommendedCommunities, getRole, getSmartFeedChannelTopic, getSmartFeedMessageTopic, getSmartFeedSubChannelTopic, getStream, getSubChannel, getSubChannelTopic, getSubChannels, getTopTrendingCommunities, getUser, getUserTopic, getUsers, isAfterBefore, isAfterBeforeRaw, isCachable, isConnected, isFetcher, isFresh, isLocal, isMutator, isOffline, isPaged, isReportedByMe, isSkipLimit, joinChannel, joinCommunity, leaveChannel, leaveCommunity, liveChannel, liveChannelMembers, liveChannels, liveComments, liveFollowers, liveFollowings, liveMessage, liveMessages, livePosts, liveReactions, liveSubChannel, liveSubChannels, liveUser, mergeInCache, observeChannel, observeChannels, observeComment, observeComments, observeCommunity, observeFile, observeFollowInfo, observeFollowers, observeFollowings, observeMessage, observeMessages, observePoll, observePost, observePosts, observeUser, onChannelCreated, onChannelDeleted, onChannelJoined, onChannelLeft, onChannelMemberAdded, onChannelMemberBanned, onChannelMemberRemoved, onChannelMemberUnbanned, onChannelMuted, onChannelUpdated, onClientBanned, onClientDisconnected, onCommentCreated, onCommentDeleted, onCommentFlagged, onCommentReactionAdded, onCommentReactionRemoved, onCommentUnflagged, onCommentUpdated, onCommunityCreated, onCommunityDeleted, onCommunityJoined, onCommunityLeft, onCommunityUpdated, onCommunityUserAdded, onCommunityUserBanned, onCommunityUserRemoved, onCommunityUserUnbanned, onConnectionError, onFollowInfoUpdated, onFollowRequestAccepted, onFollowRequestCanceled, onFollowRequestDeclined, onFollowerDeleted, onFollowerRequested, onMessageCreated, onMessageDeleted, onMessageFlagCleared, onMessageFlagged, onMessageReactionAdded, onMessageReactionRemoved, onMessageUnflagged, onMessageUpdated, onPollDeleted, onPollUpdated, onPostApproved, onPostCreated, onPostDeclined, onPostDeleted, onPostFlagged, onPostReactionAdded, onPostReactionRemoved, onPostUnflagged, onPostUpdated, onReactionAdded, onReactionRemoved, onReactorAdded, onReactorRemoved, onSessionStateChange, onStreamRecorded, onStreamStarted, onStreamStopped, onSubChannelCreated, onSubChannelDeleted, onSubChannelUpdated, onUserDeleted, onUserFlagCleared, onUserFlagged, onUserFollowed, onUserUnflagged, onUserUnfollowed, onUserUpdated, pullFromCache, pushToCache, queryCache, queryCategories, queryChannelMembers, queryChannels, queryComments, queryCommunities, queryCommunityMembers, queryFollowers, queryFollowings, queryGlobalFeed, queryMessages, queryOptions, queryPosts, queryReactions, queryRoles, queryStreams, querySubChannels, queryUsers, removeChannelMembers, removeChannelMembersRole, removeCommunityMembers, removeCommunityMembersRoles, removeReaction, renewal, restoreCache, runQuery, sortByChannelSegment, sortByDisplayName, sortByFirstCreated, sortByLastActivity, sortByLastCreated, sortBySegmentNumber, startReading, stopReading, subscribeTopic, toPage, toPageRaw, toToken, unbanChannelMembers, unfollow, updateChannel, updateComment, updateCommunity, updateMessage, updatePost, updateStream, updateSubChannel, updateUser, upsertInCache, votePoll, wipeCache };