Skip to content

Commit 1029d8b

Browse files
committed
feat: allow logout with clearSession to logout with invalid session token
1 parent bc5eaf3 commit 1029d8b

File tree

2 files changed

+46
-4
lines changed

2 files changed

+46
-4
lines changed

src/ParseUser.js

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1134,18 +1134,26 @@ const DefaultController = {
11341134

11351135
logOut(options: RequestOptions): Promise<ParseUser> {
11361136
const RESTController = CoreManager.getRESTController();
1137+
const promiseCatch = e => {
1138+
if (e.code === ParseError.INVALID_SESSION_TOKEN && options.clearSession) {
1139+
return;
1140+
}
1141+
throw e;
1142+
};
11371143
if (options.sessionToken) {
1138-
return RESTController.request('POST', 'logout', {}, options);
1144+
return RESTController.request('POST', 'logout', {}, options).catch(promiseCatch);
11391145
}
11401146
return DefaultController.currentUserAsync().then(currentUser => {
11411147
const path = Storage.generatePath(CURRENT_USER_KEY);
11421148
let promise = Storage.removeItemAsync(path);
11431149
if (currentUser !== null) {
11441150
const currentSession = currentUser.getSessionToken();
11451151
if (currentSession && isRevocableSession(currentSession)) {
1146-
promise = promise.then(() => {
1147-
return RESTController.request('POST', 'logout', {}, { sessionToken: currentSession });
1148-
});
1152+
promise = promise
1153+
.then(() => {
1154+
return RESTController.request('POST', 'logout', {}, { sessionToken: currentSession });
1155+
})
1156+
.catch(promiseCatch);
11491157
}
11501158
currentUser._logOutWithAll();
11511159
currentUser._finishFetch({ sessionToken: undefined });

src/__tests__/ParseUser-test.js

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -940,6 +940,40 @@ describe('ParseUser', () => {
940940
});
941941
});
942942

943+
it('can logout user with clear session', async () => {
944+
ParseUser.disableUnsafeCurrentUser();
945+
ParseUser._clearCache();
946+
Storage._clear();
947+
const RESTController = {
948+
request() {
949+
const error = new ParseError(ParseError.INVALID_SESSION_TOKEN, 'Invalid session token.');
950+
return Promise.reject(error);
951+
},
952+
ajax() {},
953+
};
954+
jest.spyOn(RESTController, 'request');
955+
CoreManager.setRESTController(RESTController);
956+
957+
await ParseUser.logOut({ clearSession: true });
958+
});
959+
960+
it('can logout user with clear session and session token', async () => {
961+
ParseUser.disableUnsafeCurrentUser();
962+
ParseUser._clearCache();
963+
Storage._clear();
964+
const RESTController = {
965+
request() {
966+
const error = new ParseError(ParseError.INVALID_SESSION_TOKEN, 'Invalid session token.');
967+
return Promise.reject(error);
968+
},
969+
ajax() {},
970+
};
971+
jest.spyOn(RESTController, 'request');
972+
CoreManager.setRESTController(RESTController);
973+
974+
await ParseUser.logOut({ sessionToken: '1234', clearSession: true });
975+
});
976+
943977
it('can retreive a user with sessionToken (me)', async () => {
944978
ParseUser.disableUnsafeCurrentUser();
945979
ParseUser._clearCache();

0 commit comments

Comments
 (0)