From 5aae89a98ac8838719f1d9e7e2809ea003fd8bfe Mon Sep 17 00:00:00 2001 From: "Hwashiang (Michael) Yu" Date: Wed, 23 Mar 2022 15:36:29 -0500 Subject: [PATCH] PWA-2571: Regression fix disabled TTL support in BrowserPersistence (#3729) * PWA-2571: Regression fix disabled TTL support in BrowserPersistence - Reverted ttl support for getItem * PWA-2571: Regression fix disabled TTL support in BrowserPersistence - Updated user reducers to not use the ttl checking getItem to let user component validate. Co-authored-by: Tommy Wiebell --- packages/peregrine/lib/store/reducers/user.js | 14 ++++++++++++-- .../lib/util/__mocks__/simplePersistence.js | 2 ++ .../util/__tests__/simplePersistence.spec.js | 18 ++++++++++++++++++ .../peregrine/lib/util/simplePersistence.js | 8 +++++++- 4 files changed, 39 insertions(+), 3 deletions(-) diff --git a/packages/peregrine/lib/store/reducers/user.js b/packages/peregrine/lib/store/reducers/user.js index 2201bb2a78..73f49ec154 100755 --- a/packages/peregrine/lib/store/reducers/user.js +++ b/packages/peregrine/lib/store/reducers/user.js @@ -7,7 +7,17 @@ import actions from '../actions/user'; export const name = 'user'; -const isSignedIn = () => !!storage.getItem('signin_token'); +const rawSignInToken = storage.getRawItem('signin_token'); + +const isSignedIn = () => !!rawSignInToken; + +const getToken = () => { + if (!rawSignInToken) { + return undefined; + } + const { value } = JSON.parse(rawSignInToken); + return value; +}; const initialState = { currentUser: { @@ -20,7 +30,7 @@ const initialState = { isResettingPassword: false, isSignedIn: isSignedIn(), resetPasswordError: null, - token: storage.getItem('signin_token') + token: getToken() }; const reducerMap = { diff --git a/packages/peregrine/lib/util/__mocks__/simplePersistence.js b/packages/peregrine/lib/util/__mocks__/simplePersistence.js index 83f8e9effd..1c8518daff 100644 --- a/packages/peregrine/lib/util/__mocks__/simplePersistence.js +++ b/packages/peregrine/lib/util/__mocks__/simplePersistence.js @@ -1,9 +1,11 @@ export const mockGetItem = jest.fn(); +export const mockGetRawItem = jest.fn(); export const mockRemoveItem = jest.fn(); export const mockSetItem = jest.fn(); export const BrowserPersistence = jest.fn().mockImplementation(() => ({ getItem: mockGetItem, + getRawItem: mockGetRawItem, removeItem: mockRemoveItem, setItem: mockSetItem })); diff --git a/packages/peregrine/lib/util/__tests__/simplePersistence.spec.js b/packages/peregrine/lib/util/__tests__/simplePersistence.spec.js index 51225b3aac..e87e774fe3 100644 --- a/packages/peregrine/lib/util/__tests__/simplePersistence.spec.js +++ b/packages/peregrine/lib/util/__tests__/simplePersistence.spec.js @@ -59,6 +59,24 @@ describe('getItem', () => { }); }); +test('it removes the item and returns undefined if the item has expired', () => { + // Test setup: an expired item. + mockGetItem.mockImplementationOnce(() => + shape({ + value: MOCK_VALUE, + timeStored: 0, + ttl: 1 + }) + ); + + // Call the function. + const result = instance.getItem(NAME); + + // Make assertions. + expect(mockRemoveItem).toHaveBeenCalledWith(KEY); + expect(result).toBeUndefined(); +}); + describe('setItem', () => { test('it puts the item in storage with the correct values', () => { // Call the function. diff --git a/packages/peregrine/lib/util/simplePersistence.js b/packages/peregrine/lib/util/simplePersistence.js index 42ee553902..213c567b2a 100644 --- a/packages/peregrine/lib/util/simplePersistence.js +++ b/packages/peregrine/lib/util/simplePersistence.js @@ -42,11 +42,17 @@ export default class BrowserPersistence { return this.storage.getItem(name); } getItem(name) { + const now = Date.now(); const item = this.storage.getItem(name); if (!item) { return undefined; } - const { value } = JSON.parse(item); + const { value, ttl, timeStored } = JSON.parse(item); + + if (ttl && now - timeStored > ttl * 1000) { + this.storage.removeItem(name); + return undefined; + } return JSON.parse(value); }