@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.
- package/dist/@types/core/errors.d.ts +1 -0
- package/dist/@types/core/errors.d.ts.map +1 -1
- package/dist/@types/core/events.d.ts +4 -0
- package/dist/@types/core/events.d.ts.map +1 -1
- package/dist/@types/domains/client.d.ts +21 -1
- package/dist/@types/domains/client.d.ts.map +1 -1
- package/dist/@types/global.d.ts +7 -0
- package/dist/@types/global.d.ts.map +1 -1
- package/dist/client/api/accessTokenExpiryWatcher.d.ts +4 -0
- package/dist/client/api/accessTokenExpiryWatcher.d.ts.map +1 -0
- package/dist/client/api/activeUser.d.ts +1 -1
- package/dist/client/api/activeUser.d.ts.map +1 -1
- package/dist/client/api/connectClient.d.ts +1 -1
- package/dist/client/api/connectClient.d.ts.map +1 -1
- package/dist/client/api/createClient.d.ts +1 -1
- package/dist/client/api/createClient.d.ts.map +1 -1
- package/dist/client/api/disconnectClient.d.ts +0 -1
- package/dist/client/api/disconnectClient.d.ts.map +1 -1
- package/dist/client/api/getToken.d.ts +4 -4
- package/dist/client/api/index.d.ts +1 -0
- package/dist/client/api/index.d.ts.map +1 -1
- package/dist/client/api/renewal.d.ts +2 -0
- package/dist/client/api/renewal.d.ts.map +1 -0
- package/dist/client/api/setSessionState.d.ts +12 -0
- package/dist/client/api/setSessionState.d.ts.map +1 -0
- package/dist/client/api/terminateClient.d.ts +9 -0
- package/dist/client/api/terminateClient.d.ts.map +1 -0
- package/dist/client/api/tests/accessTokenExpiryWatcher.test.d.ts +2 -0
- package/dist/client/api/tests/accessTokenExpiryWatcher.test.d.ts.map +1 -0
- package/dist/client/api/tests/connectClient.test.d.ts +2 -0
- package/dist/client/api/tests/connectClient.test.d.ts.map +1 -0
- package/dist/client/api/tests/disconnectClient.test.d.ts +2 -0
- package/dist/client/api/tests/disconnectClient.test.d.ts.map +1 -0
- package/dist/client/api/tests/getToken.test.d.ts +2 -0
- package/dist/client/api/tests/getToken.test.d.ts.map +1 -0
- package/dist/client/api/tests/renewal.test.d.ts +2 -0
- package/dist/client/api/tests/renewal.test.d.ts.map +1 -0
- package/dist/client/api/tests/setSessionState.test.d.ts +2 -0
- package/dist/client/api/tests/setSessionState.test.d.ts.map +1 -0
- package/dist/client/api/tests/terminateClient.test.d.ts +2 -0
- package/dist/client/api/tests/terminateClient.test.d.ts.map +1 -0
- package/dist/client/events/index.d.ts +1 -0
- package/dist/client/events/index.d.ts.map +1 -1
- package/dist/client/events/onClientBanned.d.ts +1 -1
- package/dist/client/events/onClientBanned.d.ts.map +1 -1
- package/dist/client/events/onSessionStateChange.d.ts +17 -0
- package/dist/client/events/onSessionStateChange.d.ts.map +1 -0
- package/dist/client/events/onTokenExpired.d.ts +17 -0
- package/dist/client/events/onTokenExpired.d.ts.map +1 -0
- package/dist/client/events/onTokenTerminated.d.ts +11 -0
- package/dist/client/events/onTokenTerminated.d.ts.map +1 -0
- package/dist/client/events/tests/onSessionStateChange.test.d.ts +2 -0
- package/dist/client/events/tests/onSessionStateChange.test.d.ts.map +1 -0
- package/dist/client/events/tests/onTokenTerminated.test.d.ts +2 -0
- package/dist/client/events/tests/onTokenTerminated.test.d.ts.map +1 -0
- package/dist/client/utils/setClientToken.d.ts +19 -0
- package/dist/client/utils/setClientToken.d.ts.map +1 -0
- package/dist/comment/events/tests/onCommentDeleted.test.d.ts +2 -0
- package/dist/comment/events/tests/onCommentDeleted.test.d.ts.map +1 -0
- package/dist/core/events.d.ts +3 -3
- package/dist/core/events.d.ts.map +1 -1
- package/dist/core/subscription.d.ts.map +1 -1
- package/dist/core/transports/http.d.ts.map +1 -1
- package/dist/index.cjs.js +503 -137
- package/dist/index.esm.js +502 -138
- package/dist/index.umd.js +4 -4
- package/dist/stream/api/tests/createStream.test.d.ts +2 -0
- package/dist/stream/api/tests/createStream.test.d.ts.map +1 -0
- package/dist/stream/api/tests/deleteStream.test.d.ts +2 -0
- package/dist/stream/api/tests/deleteStream.test.d.ts.map +1 -0
- package/dist/stream/api/tests/getStream.test.d.ts +2 -0
- package/dist/stream/api/tests/getStream.test.d.ts.map +1 -0
- package/dist/subChannel/api/tests/createSubChannel.test.d.ts +2 -0
- package/dist/subChannel/api/tests/createSubChannel.test.d.ts.map +1 -0
- package/dist/utils/constants.d.ts +2 -0
- package/dist/utils/constants.d.ts.map +1 -1
- package/dist/utils/tests/client.d.ts.map +1 -1
- package/dist/utils/tests/dummy/index.d.ts +2 -0
- package/dist/utils/tests/dummy/index.d.ts.map +1 -1
- package/dist/utils/tests/dummy/stream.d.ts +83 -0
- package/dist/utils/tests/dummy/stream.d.ts.map +1 -0
- package/dist/utils/tests/dummy/subChannel.d.ts +20 -0
- package/dist/utils/tests/dummy/subChannel.d.ts.map +1 -1
- package/dist/utils/tests/dummy/token.d.ts +11 -0
- package/dist/utils/tests/dummy/token.d.ts.map +1 -0
- package/package.json +1 -1
- package/src/@types/core/errors.ts +1 -0
- package/src/@types/core/events.ts +6 -0
- package/src/@types/domains/client.ts +45 -1
- package/src/@types/global.ts +14 -0
- package/src/client/api/accessTokenExpiryWatcher.ts +83 -0
- package/src/client/api/activeUser.ts +1 -1
- package/src/client/api/connectClient.ts +105 -24
- package/src/client/api/createClient.ts +9 -1
- package/src/client/api/disconnectClient.ts +26 -2
- package/src/client/api/getToken.ts +6 -6
- package/src/client/api/index.ts +2 -0
- package/src/client/api/renewal.ts +74 -0
- package/src/client/api/setSessionState.ts +75 -0
- package/src/client/api/terminateClient.ts +20 -0
- package/src/client/api/tests/accessTokenExpiryWatcher.test.ts +129 -0
- package/src/client/api/tests/connectClient.test.ts +84 -0
- package/src/client/api/tests/createClient.test.ts +8 -0
- package/src/client/api/tests/disconnectClient.test.ts +78 -0
- package/src/client/api/tests/getToken.test.ts +36 -0
- package/src/client/api/tests/renewal.test.ts +67 -0
- package/src/client/api/tests/setSessionState.test.ts +62 -0
- package/src/client/api/tests/terminateClient.test.ts +29 -0
- package/src/client/events/index.ts +2 -0
- package/src/client/events/onClientBanned.ts +12 -5
- package/src/client/events/onSessionStateChange.ts +31 -0
- package/src/client/events/onTokenExpired.ts +26 -0
- package/src/client/events/onTokenTerminated.ts +20 -0
- package/src/client/events/tests/onSessionStateChange.test.ts +37 -0
- package/src/client/events/tests/onTokenTerminated.test.ts +37 -0
- package/src/client/tests/connectClient.test.ts +6 -1
- package/src/client/utils/setClientToken.ts +39 -0
- package/src/comment/events/tests/onCommentDeleted.test.ts +27 -0
- package/src/core/events.ts +5 -3
- package/src/core/subscription.ts +3 -1
- package/src/core/transports/http.ts +36 -1
- package/src/core/transports/mqtt.ts +1 -1
- package/src/external/api/createUserToken.ts +2 -2
- package/src/stream/api/tests/createStream.test.ts +30 -0
- package/src/stream/api/tests/deleteStream.test.ts +48 -0
- package/src/stream/api/tests/getStream.test.ts +23 -0
- package/src/subChannel/api/tests/createSubChannel.test.ts +103 -0
- package/src/utils/constants.ts +2 -0
- package/src/utils/tests/client.ts +18 -2
- package/src/utils/tests/dummy/index.ts +3 -0
- package/src/utils/tests/dummy/stream.ts +86 -0
- package/src/utils/tests/dummy/subChannel.ts +22 -0
- 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
|
-
|
|
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
|
-
|
|
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).
|
|
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
|
|
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
|
-
*
|
|
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
|
|
20292
|
-
* @
|
|
20293
|
-
*
|
|
20294
|
-
* @
|
|
20295
|
-
|
|
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
|
-
|
|
20300
|
-
|
|
20301
|
-
const
|
|
20302
|
-
log('client/api/
|
|
20303
|
-
|
|
20304
|
-
|
|
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
|
-
|
|
20307
|
-
|
|
20308
|
-
|
|
20309
|
-
|
|
20310
|
-
|
|
20311
|
-
|
|
20312
|
-
|
|
20313
|
-
|
|
20314
|
-
|
|
20315
|
-
|
|
20316
|
-
|
|
20317
|
-
|
|
20318
|
-
|
|
20319
|
-
|
|
20320
|
-
|
|
20321
|
-
|
|
20322
|
-
|
|
20323
|
-
|
|
20324
|
-
|
|
20325
|
-
|
|
20326
|
-
|
|
20327
|
-
|
|
20328
|
-
|
|
20329
|
-
|
|
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.
|
|
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
|
-
*
|
|
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
|
-
*
|
|
20455
|
-
* @
|
|
20558
|
+
*
|
|
20559
|
+
* @category private
|
|
20456
20560
|
*/
|
|
20457
|
-
const
|
|
20561
|
+
const terminateClient = () => {
|
|
20458
20562
|
const client = getActiveClient();
|
|
20459
|
-
|
|
20460
|
-
|
|
20461
|
-
|
|
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
|
-
|
|
20541
|
-
|
|
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
|
-
|
|
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
|
-
|
|
20573
|
-
|
|
20574
|
-
|
|
20575
|
-
|
|
20576
|
-
|
|
20577
|
-
|
|
20578
|
-
|
|
20579
|
-
|
|
20580
|
-
|
|
20581
|
-
|
|
20582
|
-
|
|
20583
|
-
|
|
20584
|
-
|
|
20585
|
-
client.
|
|
20586
|
-
|
|
20587
|
-
|
|
20588
|
-
|
|
20589
|
-
|
|
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
|
-
|
|
20597
|
-
|
|
20598
|
-
|
|
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
|
-
|
|
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 =
|
|
29547
|
+
const deviceInfo = getDeviceInfo();
|
|
29184
29548
|
const http = createHttpTransport(computeUrl('http', apiRegion));
|
|
29185
|
-
const { data } = await http.post('/api/
|
|
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 };
|