From f4bbd069074a91f8dc19f076f8846d08cc5fe6b2 Mon Sep 17 00:00:00 2001 From: Diamond Lewis Date: Fri, 6 Oct 2023 12:21:27 -0500 Subject: [PATCH 1/2] fix: Error when IndexedDB is protected --- package-lock.json | 2 +- src/IndexedDBStorageController.js | 45 +++++++++++++++++-------------- src/Parse.ts | 9 ++++--- src/__tests__/Parse-test.js | 1 + src/__tests__/Storage-test.js | 9 +++++++ 5 files changed, 41 insertions(+), 25 deletions(-) diff --git a/package-lock.json b/package-lock.json index 35e244d10..343677ec3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "@babel/runtime-corejs3": "7.22.15", "idb-keyval": "6.2.1", "react-native-crypto-js": "1.0.0", - "uuid": "^9.0.1", + "uuid": "9.0.1", "ws": "8.13.0", "xmlhttprequest": "1.8.0" }, diff --git a/src/IndexedDBStorageController.js b/src/IndexedDBStorageController.js index a223000e3..da2d2e973 100644 --- a/src/IndexedDBStorageController.js +++ b/src/IndexedDBStorageController.js @@ -6,28 +6,33 @@ import { createStore, del, set, get, clear, keys } from 'idb-keyval'; if (typeof window !== 'undefined' && window.indexedDB) { - const ParseStore = createStore('parseDB', 'parseStore'); + try { + const ParseStore = createStore('parseDB', 'parseStore'); - const IndexedDBStorageController = { - async: 1, - getItemAsync(path: string) { - return get(path, ParseStore); - }, - setItemAsync(path: string, value: string) { - return set(path, value, ParseStore); - }, - removeItemAsync(path: string) { - return del(path, ParseStore); - }, - getAllKeysAsync() { - return keys(ParseStore); - }, - clear() { - return clear(ParseStore); - }, - }; + const IndexedDBStorageController = { + async: 1, + getItemAsync(path: string) { + return get(path, ParseStore); + }, + setItemAsync(path: string, value: string) { + return set(path, value, ParseStore); + }, + removeItemAsync(path: string) { + return del(path, ParseStore); + }, + getAllKeysAsync() { + return keys(ParseStore); + }, + clear() { + return clear(ParseStore); + }, + }; - module.exports = IndexedDBStorageController; + module.exports = IndexedDBStorageController; + } catch (_) { + // IndexedDB not accessible + module.exports = undefined; + } } else { // IndexedDB not supported module.exports = undefined; diff --git a/src/Parse.ts b/src/Parse.ts index b6876a861..dbf3a0983 100644 --- a/src/Parse.ts +++ b/src/Parse.ts @@ -2,6 +2,7 @@ import decode from './decode'; import encode from './encode'; import CryptoController from './CryptoController'; import EventuallyQueue from './EventuallyQueue'; +import IndexedDBStorageController from './IndexedDBStorageController'; import InstallationController from './InstallationController'; import * as ParseOp from './ParseOp'; import RESTController from './RESTController'; @@ -183,6 +184,10 @@ const Parse: ParseType = { Parse.LiveQuery = new LiveQuery(); CoreManager.setIfNeeded('LiveQuery', Parse.LiveQuery); + + if (process.env.PARSE_BUILD === 'browser') { + Parse.IndexedDB = CoreManager.setIfNeeded('IndexedDBStorageController', IndexedDBStorageController); + } }, /** @@ -428,10 +433,6 @@ const Parse: ParseType = { }, }; -if (process.env.PARSE_BUILD === 'browser') { - Parse.IndexedDB = require('./IndexedDBStorageController'); -} - CoreManager.setCryptoController(CryptoController); CoreManager.setInstallationController(InstallationController); CoreManager.setRESTController(RESTController); diff --git a/src/__tests__/Parse-test.js b/src/__tests__/Parse-test.js index 4bb09217c..560585230 100644 --- a/src/__tests__/Parse-test.js +++ b/src/__tests__/Parse-test.js @@ -237,6 +237,7 @@ describe('Parse module', () => { expect(Parse.IndexedDB).toBeUndefined(); process.env.PARSE_BUILD = 'browser'; const ParseInstance = require('../Parse'); + ParseInstance.initialize('test', 'test'); expect(ParseInstance.IndexedDB).toBeDefined(); CoreManager.setStorageController(ParseInstance.IndexedDB); const currentStorage = CoreManager.getStorageController(); diff --git a/src/__tests__/Storage-test.js b/src/__tests__/Storage-test.js index 2f64884a4..4734c8581 100644 --- a/src/__tests__/Storage-test.js +++ b/src/__tests__/Storage-test.js @@ -12,6 +12,7 @@ global.indexedDB = mockIndexedDB; jest.mock('idb-keyval', () => { return mockIndexedDB; }); +const idbKeyVal = require('idb-keyval'); const BrowserStorageController = require('../StorageController.browser'); @@ -204,6 +205,14 @@ describe('IndexDB StorageController', () => { expect(dbController).toBeUndefined(); global.indexedDB = mockIndexedDB; }); + + it('handle indexedDB is not accessible', async () => { + jest.spyOn(idbKeyVal, 'createStore') + .mockImplementationOnce(() => { throw new Error('Protected'); }); + const dbController = require('../IndexedDBStorageController'); + expect(idbKeyVal.createStore).toHaveBeenCalled(); + expect(dbController).toBeUndefined(); + }); }); const DefaultStorageController = require('../StorageController.default'); From 585916583e5f2e04530820ee57e74661bd50daa7 Mon Sep 17 00:00:00 2001 From: Diamond Lewis Date: Fri, 6 Oct 2023 12:43:28 -0500 Subject: [PATCH 2/2] fix tests --- src/__tests__/Storage-test.js | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/__tests__/Storage-test.js b/src/__tests__/Storage-test.js index 4734c8581..0b89bb9e5 100644 --- a/src/__tests__/Storage-test.js +++ b/src/__tests__/Storage-test.js @@ -207,11 +207,14 @@ describe('IndexDB StorageController', () => { }); it('handle indexedDB is not accessible', async () => { - jest.spyOn(idbKeyVal, 'createStore') - .mockImplementationOnce(() => { throw new Error('Protected'); }); - const dbController = require('../IndexedDBStorageController'); - expect(idbKeyVal.createStore).toHaveBeenCalled(); - expect(dbController).toBeUndefined(); + jest.isolateModules(() => { + global.indexedDB = mockIndexedDB; + jest.spyOn(idbKeyVal, 'createStore') + .mockImplementationOnce(() => { throw new Error('Protected'); }); + const dbController = require('../IndexedDBStorageController'); + expect(dbController).toBeUndefined(); + expect(idbKeyVal.createStore).toHaveBeenCalled(); + }); }); });