@amityco/ts-sdk-react-native 7.8.3-e4f1111.0 → 7.8.3
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/.env +26 -26
- package/.rollup.cache/home/runner/work/AmityReactNativeTypescriptSDK/AmityReactNativeTypescriptSDK/packages/sdk/dist/@types/domains/client.d.ts +0 -2
- package/.rollup.cache/home/runner/work/AmityReactNativeTypescriptSDK/AmityReactNativeTypescriptSDK/packages/sdk/dist/@types/domains/client.d.ts.map +1 -1
- package/.rollup.cache/home/runner/work/AmityReactNativeTypescriptSDK/AmityReactNativeTypescriptSDK/packages/sdk/dist/@types/domains/client.js.map +1 -1
- package/.rollup.cache/home/runner/work/AmityReactNativeTypescriptSDK/AmityReactNativeTypescriptSDK/packages/sdk/dist/client/api/createClient.d.ts.map +1 -1
- package/.rollup.cache/home/runner/work/AmityReactNativeTypescriptSDK/AmityReactNativeTypescriptSDK/packages/sdk/dist/client/api/createClient.js +1 -2
- package/.rollup.cache/home/runner/work/AmityReactNativeTypescriptSDK/AmityReactNativeTypescriptSDK/packages/sdk/dist/client/api/createClient.js.map +1 -1
- package/.rollup.cache/home/runner/work/AmityReactNativeTypescriptSDK/AmityReactNativeTypescriptSDK/packages/sdk/dist/client/api/isConnected.d.ts.map +1 -1
- package/.rollup.cache/home/runner/work/AmityReactNativeTypescriptSDK/AmityReactNativeTypescriptSDK/packages/sdk/dist/client/api/isConnected.js +1 -5
- package/.rollup.cache/home/runner/work/AmityReactNativeTypescriptSDK/AmityReactNativeTypescriptSDK/packages/sdk/dist/client/api/isConnected.js.map +1 -1
- package/.rollup.cache/home/runner/work/AmityReactNativeTypescriptSDK/AmityReactNativeTypescriptSDK/packages/sdk/dist/client/api/login.d.ts.map +1 -1
- package/.rollup.cache/home/runner/work/AmityReactNativeTypescriptSDK/AmityReactNativeTypescriptSDK/packages/sdk/dist/client/api/login.js +0 -6
- package/.rollup.cache/home/runner/work/AmityReactNativeTypescriptSDK/AmityReactNativeTypescriptSDK/packages/sdk/dist/client/api/login.js.map +1 -1
- package/.rollup.cache/home/runner/work/AmityReactNativeTypescriptSDK/AmityReactNativeTypescriptSDK/packages/sdk/dist/client/api/logout.d.ts.map +1 -1
- package/.rollup.cache/home/runner/work/AmityReactNativeTypescriptSDK/AmityReactNativeTypescriptSDK/packages/sdk/dist/client/api/logout.js +2 -9
- package/.rollup.cache/home/runner/work/AmityReactNativeTypescriptSDK/AmityReactNativeTypescriptSDK/packages/sdk/dist/client/api/logout.js.map +1 -1
- package/.rollup.cache/home/runner/work/AmityReactNativeTypescriptSDK/AmityReactNativeTypescriptSDK/packages/sdk/dist/client/api/resumeSession.d.ts.map +1 -1
- package/.rollup.cache/home/runner/work/AmityReactNativeTypescriptSDK/AmityReactNativeTypescriptSDK/packages/sdk/dist/client/api/resumeSession.js +0 -13
- package/.rollup.cache/home/runner/work/AmityReactNativeTypescriptSDK/AmityReactNativeTypescriptSDK/packages/sdk/dist/client/api/resumeSession.js.map +1 -1
- package/.rollup.cache/home/runner/work/AmityReactNativeTypescriptSDK/AmityReactNativeTypescriptSDK/packages/sdk/dist/client/api/tests/createClient.test.js +0 -4
- package/.rollup.cache/home/runner/work/AmityReactNativeTypescriptSDK/AmityReactNativeTypescriptSDK/packages/sdk/dist/client/api/tests/createClient.test.js.map +1 -1
- package/.rollup.cache/home/runner/work/AmityReactNativeTypescriptSDK/AmityReactNativeTypescriptSDK/packages/sdk/dist/client/api/tests/login.test.js +1 -7
- package/.rollup.cache/home/runner/work/AmityReactNativeTypescriptSDK/AmityReactNativeTypescriptSDK/packages/sdk/dist/client/api/tests/login.test.js.map +1 -1
- package/.rollup.cache/home/runner/work/AmityReactNativeTypescriptSDK/AmityReactNativeTypescriptSDK/packages/sdk/dist/client/api/tests/logout.test.js +0 -8
- package/.rollup.cache/home/runner/work/AmityReactNativeTypescriptSDK/AmityReactNativeTypescriptSDK/packages/sdk/dist/client/api/tests/logout.test.js.map +1 -1
- package/.rollup.cache/home/runner/work/AmityReactNativeTypescriptSDK/AmityReactNativeTypescriptSDK/packages/sdk/dist/client/api/tests/resumeSession.test.js +1 -8
- package/.rollup.cache/home/runner/work/AmityReactNativeTypescriptSDK/AmityReactNativeTypescriptSDK/packages/sdk/dist/client/api/tests/resumeSession.test.js.map +1 -1
- package/.rollup.cache/home/runner/work/AmityReactNativeTypescriptSDK/AmityReactNativeTypescriptSDK/packages/sdk/dist/client/api/tests/terminateClient.test.js +0 -3
- package/.rollup.cache/home/runner/work/AmityReactNativeTypescriptSDK/AmityReactNativeTypescriptSDK/packages/sdk/dist/client/api/tests/terminateClient.test.js.map +1 -1
- package/.rollup.cache/home/runner/work/AmityReactNativeTypescriptSDK/AmityReactNativeTypescriptSDK/packages/sdk/dist/client/utils/setClientToken.d.ts.map +1 -1
- package/.rollup.cache/home/runner/work/AmityReactNativeTypescriptSDK/AmityReactNativeTypescriptSDK/packages/sdk/dist/client/utils/setClientToken.js +0 -3
- package/.rollup.cache/home/runner/work/AmityReactNativeTypescriptSDK/AmityReactNativeTypescriptSDK/packages/sdk/dist/client/utils/setClientToken.js.map +1 -1
- package/.rollup.cache/home/runner/work/AmityReactNativeTypescriptSDK/AmityReactNativeTypescriptSDK/packages/sdk/dist/core/events.d.ts +0 -11
- package/.rollup.cache/home/runner/work/AmityReactNativeTypescriptSDK/AmityReactNativeTypescriptSDK/packages/sdk/dist/core/events.d.ts.map +1 -1
- package/.rollup.cache/home/runner/work/AmityReactNativeTypescriptSDK/AmityReactNativeTypescriptSDK/packages/sdk/dist/core/events.js +0 -17
- package/.rollup.cache/home/runner/work/AmityReactNativeTypescriptSDK/AmityReactNativeTypescriptSDK/packages/sdk/dist/core/events.js.map +1 -1
- package/.rollup.cache/home/runner/work/AmityReactNativeTypescriptSDK/AmityReactNativeTypescriptSDK/packages/sdk/dist/core/transports/index.d.ts +0 -1
- package/.rollup.cache/home/runner/work/AmityReactNativeTypescriptSDK/AmityReactNativeTypescriptSDK/packages/sdk/dist/core/transports/index.d.ts.map +1 -1
- package/.rollup.cache/home/runner/work/AmityReactNativeTypescriptSDK/AmityReactNativeTypescriptSDK/packages/sdk/dist/core/transports/index.js +0 -1
- package/.rollup.cache/home/runner/work/AmityReactNativeTypescriptSDK/AmityReactNativeTypescriptSDK/packages/sdk/dist/core/transports/index.js.map +1 -1
- package/.rollup.cache/home/runner/work/AmityReactNativeTypescriptSDK/AmityReactNativeTypescriptSDK/packages/sdk/dist/utils/tests/client.d.ts.map +1 -1
- package/.rollup.cache/home/runner/work/AmityReactNativeTypescriptSDK/AmityReactNativeTypescriptSDK/packages/sdk/dist/utils/tests/client.js +1 -6
- package/.rollup.cache/home/runner/work/AmityReactNativeTypescriptSDK/AmityReactNativeTypescriptSDK/packages/sdk/dist/utils/tests/client.js.map +1 -1
- package/.rollup.cache/home/runner/work/AmityReactNativeTypescriptSDK/AmityReactNativeTypescriptSDK/packages/sdk/tsconfig.tsbuildinfo +1 -1
- package/dist/@types/domains/client.d.ts +0 -2
- package/dist/@types/domains/client.d.ts.map +1 -1
- package/dist/client/api/createClient.d.ts.map +1 -1
- package/dist/client/api/isConnected.d.ts.map +1 -1
- package/dist/client/api/login.d.ts.map +1 -1
- package/dist/client/api/logout.d.ts.map +1 -1
- package/dist/client/api/resumeSession.d.ts.map +1 -1
- package/dist/client/utils/setClientToken.d.ts.map +1 -1
- package/dist/core/events.d.ts +0 -11
- package/dist/core/events.d.ts.map +1 -1
- package/dist/core/transports/index.d.ts +0 -1
- package/dist/core/transports/index.d.ts.map +1 -1
- package/dist/index.cjs.js +6 -90
- package/dist/index.esm.js +6 -89
- package/dist/index.umd.js +3 -3
- package/dist/utils/tests/client.d.ts.map +1 -1
- package/package.json +1 -3
- package/src/@types/domains/client.ts +0 -1
- package/src/client/api/createClient.ts +0 -1
- package/src/client/api/isConnected.ts +1 -8
- package/src/client/api/login.ts +0 -6
- package/src/client/api/logout.ts +1 -8
- package/src/client/api/resumeSession.ts +0 -12
- package/src/client/api/tests/createClient.test.ts +0 -6
- package/src/client/api/tests/login.test.ts +42 -51
- package/src/client/api/tests/logout.test.ts +1 -12
- package/src/client/api/tests/resumeSession.test.ts +102 -111
- package/src/client/api/tests/terminateClient.test.ts +0 -6
- package/src/client/utils/setClientToken.ts +0 -3
- package/src/core/events.ts +0 -18
- package/src/core/transports/index.ts +0 -1
- package/src/utils/tests/client.ts +1 -7
- package/tsconfig.tsbuildinfo +1 -1
- package/.rollup.cache/home/runner/work/AmityReactNativeTypescriptSDK/AmityReactNativeTypescriptSDK/packages/sdk/dist/core/transports/ws.d.ts +0 -27
- package/.rollup.cache/home/runner/work/AmityReactNativeTypescriptSDK/AmityReactNativeTypescriptSDK/packages/sdk/dist/core/transports/ws.d.ts.map +0 -1
- package/.rollup.cache/home/runner/work/AmityReactNativeTypescriptSDK/AmityReactNativeTypescriptSDK/packages/sdk/dist/core/transports/ws.js +0 -53
- package/.rollup.cache/home/runner/work/AmityReactNativeTypescriptSDK/AmityReactNativeTypescriptSDK/packages/sdk/dist/core/transports/ws.js.map +0 -1
- package/dist/core/transports/ws.d.ts +0 -27
- package/dist/core/transports/ws.d.ts.map +0 -1
- package/src/core/transports/ws.ts +0 -60
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/utils/tests/client.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,UAAU,YAAS,CAAC;AAYjC,eAAO,MAAM,MAAM,cAA4B,CAAC;AAMhD,eAAO,MAAM,aAAa,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/utils/tests/client.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,UAAU,YAAS,CAAC;AAYjC,eAAO,MAAM,MAAM,cAA4B,CAAC;AAMhD,eAAO,MAAM,aAAa,qBAiBzB,CAAC;AAEF,eAAO,MAAM,gBAAgB,qBAE5B,CAAC;;AAEF,wBAAkB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@amityco/ts-sdk-react-native",
|
|
3
|
-
"version": "7.8.3
|
|
3
|
+
"version": "7.8.3",
|
|
4
4
|
"license": "CC-BY-ND-4.0",
|
|
5
5
|
"author": "amity.co <developers@amity.co> (https://amity.co)",
|
|
6
6
|
"description": "Amity Social Cloud Typescript SDK",
|
|
@@ -47,7 +47,6 @@
|
|
|
47
47
|
"@types/node": "^18.6.4",
|
|
48
48
|
"@types/object-hash": "^3.0.6",
|
|
49
49
|
"@types/react-native": "0.63.4",
|
|
50
|
-
"@types/socket.io-client": "^1.4.34",
|
|
51
50
|
"chalk": "^4.1.2",
|
|
52
51
|
"concurrently": "^6.1.0",
|
|
53
52
|
"form-data": "^4.0.0",
|
|
@@ -77,7 +76,6 @@
|
|
|
77
76
|
"mqtt": "^4.3.7",
|
|
78
77
|
"object-hash": "^3.0.0",
|
|
79
78
|
"react-native-uuid": "^2.0.1",
|
|
80
|
-
"socket.io-client": "2.2.0",
|
|
81
79
|
"ts-jest": "^28.0.3"
|
|
82
80
|
},
|
|
83
81
|
"peerDependencies": {
|
|
@@ -16,12 +16,5 @@ export const isConnected = (): boolean => {
|
|
|
16
16
|
const client = getActiveClient();
|
|
17
17
|
client.log('client/api/isConnected', client);
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
const isWsConnected = (client.ws && client.ws.connected) || !!client.ws;
|
|
21
|
-
|
|
22
|
-
return !!(
|
|
23
|
-
client.userId &&
|
|
24
|
-
String(client.http.defaults.headers.common?.Authorization)?.length &&
|
|
25
|
-
isWsConnected
|
|
26
|
-
);
|
|
19
|
+
return !!(client.userId && String(client.http.defaults.headers.common?.Authorization)?.length);
|
|
27
20
|
};
|
package/src/client/api/login.ts
CHANGED
|
@@ -122,12 +122,6 @@ export const login = async (
|
|
|
122
122
|
return false;
|
|
123
123
|
}
|
|
124
124
|
|
|
125
|
-
// FIXME: events are duplicated if connectClient is called few times without disconnectClient
|
|
126
|
-
// wire websocket events to our event emitter
|
|
127
|
-
proxyWebsocketEvents(client.ws, client.emitter);
|
|
128
|
-
|
|
129
|
-
client.ws?.open();
|
|
130
|
-
|
|
131
125
|
client.userId = user.userId;
|
|
132
126
|
|
|
133
127
|
client.sessionHandler = sessionHandler;
|
package/src/client/api/logout.ts
CHANGED
|
@@ -26,10 +26,6 @@ export const logout = async (): Promise<boolean> => {
|
|
|
26
26
|
client.mqtt.disconnect();
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
-
if (client.ws && client.ws.connected) {
|
|
30
|
-
client.ws.disconnect();
|
|
31
|
-
}
|
|
32
|
-
|
|
33
29
|
/*
|
|
34
30
|
* for cases when session state is terminated (example on ban) or token expired,
|
|
35
31
|
* the terminating block will set session state to terminated or for the or
|
|
@@ -46,8 +42,7 @@ export const logout = async (): Promise<boolean> => {
|
|
|
46
42
|
setSessionState(Amity.SessionStates.NOT_LOGGED_IN);
|
|
47
43
|
|
|
48
44
|
client.emitter.all.clear();
|
|
49
|
-
|
|
50
|
-
client.ws?.removeAllListeners();
|
|
45
|
+
|
|
51
46
|
client.mqtt?.removeAllListeners();
|
|
52
47
|
client.userId = undefined;
|
|
53
48
|
client.token = undefined;
|
|
@@ -59,8 +54,6 @@ export const logout = async (): Promise<boolean> => {
|
|
|
59
54
|
isUserDeleted: false,
|
|
60
55
|
};
|
|
61
56
|
|
|
62
|
-
if (client.ws) client.ws.io.opts.query = { token: '' };
|
|
63
|
-
|
|
64
57
|
if (typeof document !== 'undefined') {
|
|
65
58
|
document.cookie = '_ascSession=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;';
|
|
66
59
|
}
|
|
@@ -97,9 +97,6 @@ const validateAccessToken = async ({ token, userId }: Params) => {
|
|
|
97
97
|
isUserDeleted: false,
|
|
98
98
|
};
|
|
99
99
|
|
|
100
|
-
// manually setup the token for ws transport
|
|
101
|
-
if (client.ws) client.ws.io.opts.query = { token: token.accessToken };
|
|
102
|
-
|
|
103
100
|
client.token = token;
|
|
104
101
|
|
|
105
102
|
setSessionState(Amity.SessionStates.ESTABLISHED);
|
|
@@ -152,9 +149,6 @@ export const resumeSession = async (
|
|
|
152
149
|
if (client.mqtt && client.mqtt.connected) {
|
|
153
150
|
client.mqtt.disconnect();
|
|
154
151
|
}
|
|
155
|
-
if (client.ws && client.ws.connected) {
|
|
156
|
-
client.ws.disconnect();
|
|
157
|
-
}
|
|
158
152
|
|
|
159
153
|
// Clear existing subscriptions
|
|
160
154
|
subscriptions.forEach(fn => fn());
|
|
@@ -190,12 +184,6 @@ export const resumeSession = async (
|
|
|
190
184
|
return false;
|
|
191
185
|
}
|
|
192
186
|
|
|
193
|
-
// FIXME: events are duplicated if connectClient is called few times without disconnectClient
|
|
194
|
-
// wire websocket events to our event emitter
|
|
195
|
-
proxyWebsocketEvents(client.ws, client.emitter);
|
|
196
|
-
|
|
197
|
-
client.ws?.open();
|
|
198
|
-
|
|
199
187
|
client.userId = user.userId;
|
|
200
188
|
|
|
201
189
|
client.sessionHandler = sessionHandler;
|
|
@@ -13,12 +13,6 @@ describe('createClient', () => {
|
|
|
13
13
|
expect(client.http).toBeDefined();
|
|
14
14
|
});
|
|
15
15
|
|
|
16
|
-
test('it should define ws transport', () => {
|
|
17
|
-
const client = createClient('test-api-key');
|
|
18
|
-
|
|
19
|
-
expect(client.ws).toBeDefined();
|
|
20
|
-
});
|
|
21
|
-
|
|
22
16
|
test('it should define mqtt transport', () => {
|
|
23
17
|
const client = createClient('test-api-key');
|
|
24
18
|
|
|
@@ -12,71 +12,62 @@ const sessionHandler: Amity.SessionHandler = {
|
|
|
12
12
|
};
|
|
13
13
|
|
|
14
14
|
const onConnect = () =>
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
describe('login', () => {
|
|
16
|
+
beforeEach(() => {
|
|
17
|
+
client = createClient('key', 'sg');
|
|
18
|
+
client.mqtt.connect = jest.fn();
|
|
19
|
+
client.mqtt.subscribe = jest.fn();
|
|
20
|
+
client.http.post = jest.fn().mockResolvedValueOnce(sessionResponse);
|
|
17
21
|
|
|
18
|
-
|
|
22
|
+
setActiveClient(client);
|
|
23
|
+
});
|
|
19
24
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
25
|
+
afterEach(async () => {
|
|
26
|
+
if (client.sessionState === Amity.SessionStates.ESTABLISHED) await disconnectClient();
|
|
27
|
+
});
|
|
23
28
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
client = createClient('key', 'sg');
|
|
27
|
-
client.mqtt.connect = jest.fn();
|
|
28
|
-
client.mqtt.subscribe = jest.fn();
|
|
29
|
-
client.http.post = jest.fn().mockResolvedValueOnce(sessionResponse);
|
|
29
|
+
test('it should connect client', async () => {
|
|
30
|
+
onConnect().unref();
|
|
30
31
|
|
|
31
|
-
|
|
32
|
-
});
|
|
32
|
+
const recieved = await login({ userId: user11.userId }, sessionHandler);
|
|
33
33
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
});
|
|
34
|
+
expect(recieved).toBe(true);
|
|
35
|
+
});
|
|
37
36
|
|
|
38
|
-
|
|
39
|
-
|
|
37
|
+
test('it should establish connection', async () => {
|
|
38
|
+
onConnect().unref();
|
|
40
39
|
|
|
41
|
-
|
|
40
|
+
await login({ userId: user11.userId }, sessionHandler);
|
|
41
|
+
const { sessionState } = client;
|
|
42
42
|
|
|
43
|
-
|
|
44
|
-
|
|
43
|
+
expect(sessionState).toBe(Amity.SessionStates.ESTABLISHED);
|
|
44
|
+
});
|
|
45
45
|
|
|
46
|
-
|
|
47
|
-
|
|
46
|
+
test('it should have session state establishing while connecting client', () => {
|
|
47
|
+
login({ userId: user11.userId }, sessionHandler);
|
|
48
48
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
expect(sessionState).toBe(Amity.SessionStates.ESTABLISHED);
|
|
53
|
-
});
|
|
49
|
+
expect(client.sessionState).toBe(Amity.SessionStates.ESTABLISHING);
|
|
50
|
+
});
|
|
54
51
|
|
|
55
|
-
|
|
56
|
-
|
|
52
|
+
test('it should have session state notLoggedIn on failure', async () => {
|
|
53
|
+
client.http.post = jest
|
|
54
|
+
.fn()
|
|
55
|
+
.mockRejectedValue(
|
|
56
|
+
new ASCApiError('unauthorzed', Amity.ServerError.UNAUTHORIZED, Amity.ErrorLevel.FATAL),
|
|
57
|
+
);
|
|
57
58
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
test('it should have session state notLoggedIn on failure', async () => {
|
|
62
|
-
client.http.post = jest
|
|
63
|
-
.fn()
|
|
64
|
-
.mockRejectedValue(
|
|
65
|
-
new ASCApiError('unauthorzed', Amity.ServerError.UNAUTHORIZED, Amity.ErrorLevel.FATAL),
|
|
66
|
-
);
|
|
67
|
-
|
|
68
|
-
await expect(login({ userId: user11.userId }, sessionHandler)).rejects.toThrow('unauthorzed');
|
|
69
|
-
expect(client.sessionState).toBe(Amity.SessionStates.NOT_LOGGED_IN);
|
|
70
|
-
});
|
|
59
|
+
await expect(login({ userId: user11.userId }, sessionHandler)).rejects.toThrow('unauthorzed');
|
|
60
|
+
expect(client.sessionState).toBe(Amity.SessionStates.NOT_LOGGED_IN);
|
|
61
|
+
});
|
|
71
62
|
|
|
72
|
-
|
|
73
|
-
|
|
63
|
+
test('it should terminate session on ban', async () => {
|
|
64
|
+
onConnect().unref();
|
|
74
65
|
|
|
75
|
-
|
|
66
|
+
await login({ userId: user11.userId }, sessionHandler);
|
|
76
67
|
|
|
77
|
-
|
|
78
|
-
|
|
68
|
+
// ban user
|
|
69
|
+
client.emitter.emit('user.didGlobalBan', {} as Amity.UserPayload);
|
|
79
70
|
|
|
80
|
-
|
|
71
|
+
expect(client.sessionState).toBe(Amity.SessionStates.TERMINATED);
|
|
72
|
+
});
|
|
81
73
|
});
|
|
82
|
-
});
|
|
@@ -3,23 +3,18 @@ import { client, connectClient, message11 as message } from '~/utils/tests';
|
|
|
3
3
|
|
|
4
4
|
import { logout } from '..';
|
|
5
5
|
|
|
6
|
-
const disconnect = () => setTimeout(() => client.ws.emit('disconnect'), 500);
|
|
7
|
-
|
|
8
6
|
describe('logout', () => {
|
|
9
7
|
beforeEach(async () => {
|
|
10
8
|
await connectClient();
|
|
11
9
|
});
|
|
12
10
|
|
|
13
11
|
test('it should disconnect client', async () => {
|
|
14
|
-
disconnect().unref();
|
|
15
|
-
|
|
16
12
|
const recieved = await logout();
|
|
17
13
|
|
|
18
14
|
expect(recieved).toBe(true);
|
|
19
15
|
});
|
|
20
16
|
|
|
21
17
|
test('it should set sesion state to notLoggedIn after disconnect', async () => {
|
|
22
|
-
disconnect().unref();
|
|
23
18
|
await logout();
|
|
24
19
|
|
|
25
20
|
expect(client.sessionState).toBe(Amity.SessionStates.NOT_LOGGED_IN);
|
|
@@ -27,7 +22,6 @@ describe('logout', () => {
|
|
|
27
22
|
|
|
28
23
|
test('it should not update sesion state if session state terminated', async () => {
|
|
29
24
|
client.sessionState = Amity.SessionStates.TERMINATED;
|
|
30
|
-
disconnect().unref();
|
|
31
25
|
|
|
32
26
|
await logout();
|
|
33
27
|
|
|
@@ -35,8 +29,6 @@ describe('logout', () => {
|
|
|
35
29
|
});
|
|
36
30
|
|
|
37
31
|
test('it should clear userId and accessToken on disconnect', async () => {
|
|
38
|
-
disconnect().unref();
|
|
39
|
-
|
|
40
32
|
await logout();
|
|
41
33
|
|
|
42
34
|
expect(client.userId).toBeUndefined();
|
|
@@ -44,15 +36,12 @@ describe('logout', () => {
|
|
|
44
36
|
});
|
|
45
37
|
|
|
46
38
|
test('it should clear auth header on disconnect', async () => {
|
|
47
|
-
disconnect().unref();
|
|
48
|
-
|
|
49
39
|
await logout();
|
|
50
40
|
|
|
51
41
|
expect(client.http.defaults.headers.common.Authorization).toBeFalsy();
|
|
52
42
|
});
|
|
53
43
|
|
|
54
44
|
test('it should clear cache on disconnect', async () => {
|
|
55
|
-
disconnect().unref();
|
|
56
45
|
enableCache();
|
|
57
46
|
|
|
58
47
|
const cacheKey = ['message', 'get', message.messageId];
|
|
@@ -65,7 +54,7 @@ describe('logout', () => {
|
|
|
65
54
|
|
|
66
55
|
test('it should not clear cache if tokenExpired', async () => {
|
|
67
56
|
client.sessionState = Amity.SessionStates.TOKEN_EXPIRED;
|
|
68
|
-
|
|
57
|
+
|
|
69
58
|
enableCache();
|
|
70
59
|
|
|
71
60
|
const cacheKey = ['message', 'get', message.messageId];
|
|
@@ -24,150 +24,141 @@ const mockUserResponse = {
|
|
|
24
24
|
};
|
|
25
25
|
|
|
26
26
|
const onConnect = () =>
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
27
|
+
describe('resumeSession', () => {
|
|
28
|
+
beforeEach(() => {
|
|
29
|
+
client = createClient('key', 'sg');
|
|
30
|
+
client.mqtt?.connect && (client.mqtt.connect = jest.fn());
|
|
31
|
+
client.mqtt?.subscribe && (client.mqtt.subscribe = jest.fn());
|
|
32
|
+
client.http.get = jest.fn().mockResolvedValueOnce(mockUserResponse);
|
|
33
|
+
|
|
34
|
+
setActiveClient(client);
|
|
35
|
+
});
|
|
31
36
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
37
|
+
afterEach(async () => {
|
|
38
|
+
if (client.sessionState === Amity.SessionStates.ESTABLISHED) await disconnectClient();
|
|
39
|
+
});
|
|
35
40
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
client = createClient('key', 'sg');
|
|
39
|
-
client.mqtt?.connect && (client.mqtt.connect = jest.fn());
|
|
40
|
-
client.mqtt?.subscribe && (client.mqtt.subscribe = jest.fn());
|
|
41
|
-
client.http.get = jest.fn().mockResolvedValueOnce(mockUserResponse);
|
|
41
|
+
test('it should connect client with access token', async () => {
|
|
42
|
+
onConnect().unref();
|
|
42
43
|
|
|
43
|
-
|
|
44
|
-
|
|
44
|
+
const received = await resumeSession(
|
|
45
|
+
{ userId: user11.userId, token: mockToken },
|
|
46
|
+
sessionHandler,
|
|
47
|
+
);
|
|
45
48
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
});
|
|
49
|
+
expect(received).toBe(true);
|
|
50
|
+
});
|
|
49
51
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
+
test('it should establish connection', async () => {
|
|
53
|
+
onConnect().unref();
|
|
52
54
|
|
|
53
|
-
|
|
54
|
-
{
|
|
55
|
-
sessionHandler,
|
|
56
|
-
);
|
|
55
|
+
await resumeSession({ userId: user11.userId, token: mockToken }, sessionHandler);
|
|
56
|
+
const { sessionState } = client;
|
|
57
57
|
|
|
58
|
-
|
|
59
|
-
|
|
58
|
+
expect(sessionState).toBe(Amity.SessionStates.ESTABLISHED);
|
|
59
|
+
});
|
|
60
60
|
|
|
61
|
-
|
|
62
|
-
|
|
61
|
+
test('it should have session state establishing while connecting client', () => {
|
|
62
|
+
resumeSession({ userId: user11.userId, token: mockToken }, sessionHandler);
|
|
63
63
|
|
|
64
|
-
|
|
65
|
-
|
|
64
|
+
expect(client.sessionState).toBe(Amity.SessionStates.ESTABLISHING);
|
|
65
|
+
});
|
|
66
66
|
|
|
67
|
-
|
|
68
|
-
|
|
67
|
+
test('it should have session state notLoggedIn on failure', async () => {
|
|
68
|
+
client.http.get = jest
|
|
69
|
+
.fn()
|
|
70
|
+
.mockRejectedValue(
|
|
71
|
+
new ASCApiError('unauthorized', Amity.ServerError.UNAUTHORIZED, Amity.ErrorLevel.FATAL),
|
|
72
|
+
);
|
|
73
|
+
|
|
74
|
+
await expect(
|
|
75
|
+
resumeSession({ userId: user11.userId, token: mockToken }, sessionHandler),
|
|
76
|
+
).rejects.toThrow('unauthorized');
|
|
77
|
+
expect(client.sessionState).toBe(Amity.SessionStates.NOT_LOGGED_IN);
|
|
78
|
+
});
|
|
69
79
|
|
|
70
|
-
|
|
71
|
-
|
|
80
|
+
test('it should set authorization header with token', async () => {
|
|
81
|
+
onConnect().unref();
|
|
72
82
|
|
|
73
|
-
|
|
74
|
-
});
|
|
83
|
+
await resumeSession({ userId: user11.userId, token: mockToken }, sessionHandler);
|
|
75
84
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
.fn()
|
|
79
|
-
.mockRejectedValue(
|
|
80
|
-
new ASCApiError('unauthorized', Amity.ServerError.UNAUTHORIZED, Amity.ErrorLevel.FATAL),
|
|
85
|
+
expect(client.http.defaults.headers.common.Authorization).toBe(
|
|
86
|
+
`Bearer ${mockToken.accessToken}`,
|
|
81
87
|
);
|
|
88
|
+
expect(client.upload.defaults.headers.common.Authorization).toBe(
|
|
89
|
+
`Bearer ${mockToken.accessToken}`,
|
|
90
|
+
);
|
|
91
|
+
});
|
|
82
92
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
).rejects.toThrow('unauthorized');
|
|
86
|
-
expect(client.sessionState).toBe(Amity.SessionStates.NOT_LOGGED_IN);
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
test('it should set authorization header with token', async () => {
|
|
90
|
-
onConnect().unref();
|
|
91
|
-
|
|
92
|
-
await resumeSession({ userId: user11.userId, token: mockToken }, sessionHandler);
|
|
93
|
-
|
|
94
|
-
expect(client.http.defaults.headers.common.Authorization).toBe(
|
|
95
|
-
`Bearer ${mockToken.accessToken}`,
|
|
96
|
-
);
|
|
97
|
-
expect(client.upload.defaults.headers.common.Authorization).toBe(
|
|
98
|
-
`Bearer ${mockToken.accessToken}`,
|
|
99
|
-
);
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
test('it should set token metadata', async () => {
|
|
103
|
-
onConnect().unref();
|
|
93
|
+
test('it should set token metadata', async () => {
|
|
94
|
+
onConnect().unref();
|
|
104
95
|
|
|
105
|
-
|
|
96
|
+
await resumeSession({ userId: user11.userId, token: mockToken }, sessionHandler);
|
|
106
97
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
98
|
+
expect(client.token).toEqual(mockToken);
|
|
99
|
+
expect(client.http.defaults.metadata).toEqual({
|
|
100
|
+
tokenExpiry: mockToken.expiresAt,
|
|
101
|
+
isGlobalBanned: false,
|
|
102
|
+
isUserDeleted: false,
|
|
103
|
+
});
|
|
112
104
|
});
|
|
113
|
-
});
|
|
114
105
|
|
|
115
|
-
|
|
116
|
-
|
|
106
|
+
test('it should call user endpoint to validate token', async () => {
|
|
107
|
+
onConnect().unref();
|
|
117
108
|
|
|
118
|
-
|
|
109
|
+
await resumeSession({ userId: user11.userId, token: mockToken }, sessionHandler);
|
|
119
110
|
|
|
120
|
-
|
|
121
|
-
|
|
111
|
+
expect(client.http.get).toHaveBeenCalledWith(`/api/v3/users/${user11.userId}`);
|
|
112
|
+
});
|
|
122
113
|
|
|
123
|
-
|
|
124
|
-
|
|
114
|
+
test('it should terminate session on ban', async () => {
|
|
115
|
+
onConnect().unref();
|
|
125
116
|
|
|
126
|
-
|
|
117
|
+
await resumeSession({ userId: user11.userId, token: mockToken }, sessionHandler);
|
|
127
118
|
|
|
128
|
-
|
|
129
|
-
|
|
119
|
+
// ban user
|
|
120
|
+
client.emitter.emit('user.didGlobalBan', {} as Amity.UserPayload);
|
|
130
121
|
|
|
131
|
-
|
|
132
|
-
|
|
122
|
+
expect(client.sessionState).toBe(Amity.SessionStates.TERMINATED);
|
|
123
|
+
});
|
|
133
124
|
|
|
134
|
-
|
|
135
|
-
|
|
125
|
+
test('it should reset client state when user is already connected with same userId', async () => {
|
|
126
|
+
onConnect().unref();
|
|
136
127
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
128
|
+
// First connection
|
|
129
|
+
await resumeSession({ userId: user11.userId, token: mockToken }, sessionHandler);
|
|
130
|
+
expect(client.sessionState).toBe(Amity.SessionStates.ESTABLISHED);
|
|
131
|
+
expect(client.userId).toBe(user11.userId);
|
|
141
132
|
|
|
142
|
-
|
|
143
|
-
|
|
133
|
+
// Mock the HTTP call for second connection
|
|
134
|
+
client.http.get = jest.fn().mockResolvedValueOnce(mockUserResponse);
|
|
144
135
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
136
|
+
// Second connection with same userId should treat as token expiry (preserve cache)
|
|
137
|
+
onConnect().unref();
|
|
138
|
+
await resumeSession({ userId: user11.userId, token: mockToken }, sessionHandler);
|
|
148
139
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
140
|
+
// Verify that the client is properly reset and reconnected
|
|
141
|
+
expect(client.sessionState).toBe(Amity.SessionStates.ESTABLISHED);
|
|
142
|
+
expect(client.userId).toBe(user11.userId);
|
|
143
|
+
});
|
|
153
144
|
|
|
154
|
-
|
|
155
|
-
|
|
145
|
+
test('it should preserve cache when resuming session with same userId', async () => {
|
|
146
|
+
onConnect().unref();
|
|
156
147
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
148
|
+
// First connection - set some cache data
|
|
149
|
+
await resumeSession({ userId: user11.userId, token: mockToken }, sessionHandler);
|
|
150
|
+
if (client.cache) {
|
|
151
|
+
client.cache.data = { test: 'data' };
|
|
152
|
+
}
|
|
162
153
|
|
|
163
|
-
|
|
164
|
-
|
|
154
|
+
// Mock the HTTP call for second connection
|
|
155
|
+
client.http.get = jest.fn().mockResolvedValueOnce(mockUserResponse);
|
|
165
156
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
157
|
+
// Second connection with same userId
|
|
158
|
+
onConnect().unref();
|
|
159
|
+
await resumeSession({ userId: user11.userId, token: mockToken }, sessionHandler);
|
|
169
160
|
|
|
170
|
-
|
|
171
|
-
|
|
161
|
+
// Cache should be preserved when same userId is used
|
|
162
|
+
expect(client.cache?.data).toEqual({ test: 'data' });
|
|
163
|
+
});
|
|
172
164
|
});
|
|
173
|
-
});
|
|
@@ -2,16 +2,12 @@ import { client, connectClient } from '~/utils/tests';
|
|
|
2
2
|
|
|
3
3
|
import { terminateClient } from '../terminateClient';
|
|
4
4
|
|
|
5
|
-
const disconnect = () => setTimeout(() => client.ws.emit('disconnect'), 500);
|
|
6
|
-
|
|
7
5
|
describe('terminateClient', () => {
|
|
8
6
|
beforeAll(async () => {
|
|
9
7
|
await connectClient();
|
|
10
8
|
});
|
|
11
9
|
|
|
12
10
|
test('it should terminate client session', async () => {
|
|
13
|
-
disconnect().unref();
|
|
14
|
-
|
|
15
11
|
const expected = Amity.SessionStates.TERMINATED;
|
|
16
12
|
|
|
17
13
|
terminateClient();
|
|
@@ -20,8 +16,6 @@ describe('terminateClient', () => {
|
|
|
20
16
|
});
|
|
21
17
|
|
|
22
18
|
test('it should clear sessionHandler', async () => {
|
|
23
|
-
disconnect().unref();
|
|
24
|
-
|
|
25
19
|
terminateClient();
|
|
26
20
|
|
|
27
21
|
expect(client.sessionHandler).toBeUndefined();
|
|
@@ -38,9 +38,6 @@ export const setClientToken = async (params: Parameters<typeof getToken>[0]) =>
|
|
|
38
38
|
isUserDeleted: false,
|
|
39
39
|
};
|
|
40
40
|
|
|
41
|
-
// manually setup the token for ws transport
|
|
42
|
-
if (client.ws) client.ws.io.opts.query = { token: accessToken };
|
|
43
|
-
|
|
44
41
|
client.token = { accessToken, issuedAt, expiresAt };
|
|
45
42
|
|
|
46
43
|
setSessionState(Amity.SessionStates.ESTABLISHED);
|
package/src/core/events.ts
CHANGED
|
@@ -43,24 +43,6 @@ export const createEventEmitter = () => {
|
|
|
43
43
|
return mitt<Amity.Events>();
|
|
44
44
|
};
|
|
45
45
|
|
|
46
|
-
/**
|
|
47
|
-
* Wraps the websocket events into the client's event emitter for
|
|
48
|
-
* abstraction of transport.
|
|
49
|
-
*
|
|
50
|
-
* @param ws A websocket connection to listen from
|
|
51
|
-
* @param emitter An event emitter to wire the events to
|
|
52
|
-
*
|
|
53
|
-
* @category Transport
|
|
54
|
-
* @hidden
|
|
55
|
-
*/
|
|
56
|
-
export const proxyWebsocketEvents = (ws: Amity.Client['ws'], emitter: Amity.Client['emitter']) => {
|
|
57
|
-
WS_EVENTS.forEach(event => {
|
|
58
|
-
ws?.on(event, (param: Amity.Events[typeof event]) => {
|
|
59
|
-
emitter.emit(event, param);
|
|
60
|
-
});
|
|
61
|
-
});
|
|
62
|
-
};
|
|
63
|
-
|
|
64
46
|
export const proxyMqttEvents = (
|
|
65
47
|
mqttClient: Amity.Client['mqtt'],
|
|
66
48
|
emitter: Amity.Client['emitter'],
|