From 54092892b0b263a54a71a5b7cb398c1db0d0fced Mon Sep 17 00:00:00 2001 From: Morten Moeller Date: Sat, 13 Apr 2024 10:07:43 -0500 Subject: [PATCH 1/5] EventuallyQueue behavior isn't always what I need. Was hoping to have a way to replace the default to change the behavior. Using CoreManager felt like the obvious way. --- src/CoreManager.js | 16 +++++++++++++++- src/Parse.ts | 4 +++- src/ParseObject.js | 9 ++++----- src/__tests__/ParseObject-test.js | 1 + 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/CoreManager.js b/src/CoreManager.js index 60467e2a6..de5efba95 100644 --- a/src/CoreManager.js +++ b/src/CoreManager.js @@ -6,7 +6,7 @@ import type { AttributeMap, ObjectCache, OpsMap, State } from './ObjectStateMuta import type ParseFile from './ParseFile'; import type { FileSource } from './ParseFile'; import type { Op } from './ParseOp'; -import type ParseObject from './ParseObject'; +import type ParseObject, {SaveOptions} from './ParseObject'; import type { QueryJSON } from './ParseQuery'; import type ParseUser from './ParseUser'; import type { AuthData } from './ParseUser'; @@ -73,6 +73,11 @@ type QueryController = { find: (className: string, params: QueryJSON, options: RequestOptions) => Promise, aggregate: (className: string, params: any, options: RequestOptions) => Promise, }; +type EventuallyQueue = { + save: (object: ParseObject, serverOptions: SaveOptions) => Promise, + destroy: (object: ParseObject, serverOptions: RequestOptions) => Promise, + poll: (ms: number) => void +}; type RESTController = { request: (method: string, path: string, data: mixed, options: RequestOptions) => Promise, ajax: (method: string, url: string, data: any, headers?: any, options: FullOptions) => Promise, @@ -363,6 +368,15 @@ const CoreManager = { return config['RESTController']; }, + setEventuallyQueue(controller: EventuallyQueue) { + requireMethods('EventuallyQueue', ['poll', 'save', 'destroy'], controller); + config['EventuallyQueue'] = controller; + }, + + getEventuallyQueue(): EventuallyQueue { + return config['EventuallyQueue']; + }, + setSchemaController(controller: SchemaController) { requireMethods( 'SchemaController', diff --git a/src/Parse.ts b/src/Parse.ts index dbf3a0983..afaf0bf46 100644 --- a/src/Parse.ts +++ b/src/Parse.ts @@ -185,6 +185,8 @@ const Parse: ParseType = { Parse.LiveQuery = new LiveQuery(); CoreManager.setIfNeeded('LiveQuery', Parse.LiveQuery); + CoreManager.setIfNeeded('EventuallyQueue', EventuallyQueue); + if (process.env.PARSE_BUILD === 'browser') { Parse.IndexedDB = CoreManager.setIfNeeded('IndexedDBStorageController', IndexedDBStorageController); } @@ -380,7 +382,7 @@ const Parse: ParseType = { if (!this.LocalDatastore.isEnabled) { this.LocalDatastore.isEnabled = true; if (polling) { - EventuallyQueue.poll(ms); + CoreManager.getEventuallyQueue().poll(ms); } } }, diff --git a/src/ParseObject.js b/src/ParseObject.js index eafa7f45d..826a2458e 100644 --- a/src/ParseObject.js +++ b/src/ParseObject.js @@ -7,7 +7,6 @@ import canBeSerialized from './canBeSerialized'; import decode from './decode'; import encode from './encode'; import escape from './escape'; -import EventuallyQueue from './EventuallyQueue'; import ParseACL from './ParseACL'; import parseDate from './parseDate'; import ParseError from './ParseError'; @@ -1220,8 +1219,8 @@ class ParseObject { await this.save(null, options); } catch (e) { if (e.code === ParseError.CONNECTION_FAILED) { - await EventuallyQueue.save(this, options); - EventuallyQueue.poll(); + await CoreManager.getEventuallyQueue().save(this, options); + CoreManager.getEventuallyQueue().poll(); } } return this; @@ -1366,8 +1365,8 @@ class ParseObject { await this.destroy(options); } catch (e) { if (e.code === ParseError.CONNECTION_FAILED) { - await EventuallyQueue.destroy(this, options); - EventuallyQueue.poll(); + await CoreManager.getEventuallyQueue().destroy(this, options); + CoreManager.getEventuallyQueue().poll(); } } return this; diff --git a/src/__tests__/ParseObject-test.js b/src/__tests__/ParseObject-test.js index 2066a8979..06a7f3c2f 100644 --- a/src/__tests__/ParseObject-test.js +++ b/src/__tests__/ParseObject-test.js @@ -160,6 +160,7 @@ const flushPromises = require('./test_helpers/flushPromises'); CoreManager.setLocalDatastore(mockLocalDatastore); CoreManager.setRESTController(RESTController); +CoreManager.setEventuallyQueue(EventuallyQueue); CoreManager.setInstallationController({ currentInstallationId() { return Promise.resolve('iid'); From c9a0cfbdf6b45a547a9403a87091adfe5c187082 Mon Sep 17 00:00:00 2001 From: Morten Moeller Date: Sat, 13 Apr 2024 20:44:54 -0500 Subject: [PATCH 2/5] Support `Parse.EventuallyQueue` setting and getting using `CoreManager`. --- src/Parse.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/Parse.ts b/src/Parse.ts index afaf0bf46..6a1b76581 100644 --- a/src/Parse.ts +++ b/src/Parse.ts @@ -120,7 +120,6 @@ const Parse: ParseType = { CoreManager: CoreManager, Config: Config, Error: ParseError, - EventuallyQueue: EventuallyQueue, FacebookUtils: FacebookUtils, File: File, GeoPoint: GeoPoint, @@ -151,6 +150,18 @@ const Parse: ParseType = { Hooks: undefined, Parse: undefined, + /** + * @member {EventuallyQueue} Parse.EventuallyQueue + * @static + */ + set EventuallyQueue(queue: EventuallyQueue) { + CoreManager.setEventuallyQueue(queue); + }, + + get EventuallyQueue() { + return CoreManager.getEventuallyQueue(); + }, + /** * Call this method first to set up your authentication tokens for Parse. * From 29cc66dee1b5843342207813cefc73a3d3a6414f Mon Sep 17 00:00:00 2001 From: Morten Moeller Date: Tue, 16 Apr 2024 15:14:56 -0500 Subject: [PATCH 3/5] Adding tests for `Parse.EventuallyQueue` changes. --- src/__tests__/Parse-test.js | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/__tests__/Parse-test.js b/src/__tests__/Parse-test.js index 6a9e19737..8bfe873f7 100644 --- a/src/__tests__/Parse-test.js +++ b/src/__tests__/Parse-test.js @@ -94,6 +94,25 @@ describe('Parse module', () => { expect(CoreManager.getLocalDatastoreController()).toBe(controller); }); + it('can set EventuallyQueue', () => { + const controller = { + poll: function () {}, + save: function () {}, + destroy: function () {}, + }; + Parse.EventuallyQueue = controller; + expect(CoreManager.getEventuallyQueue()).toBe(controller); + expect(Parse.EventuallyQueue).toBe(controller); + }); + + it('cannot set EventuallyQueue controller with missing functions', () => { + const controller = { + }; + expect(() => Parse.EventuallyQueue = controller).toThrow( + 'EventuallyQueue must implement poll()' + ); + }); + it('can set AsyncStorage', () => { const controller = { getItem: function () {}, From f78ffff9c73fe2dc7d719dd4d3ed8a2659fa66a0 Mon Sep 17 00:00:00 2001 From: Morten Moeller Date: Mon, 22 Apr 2024 12:27:18 -0500 Subject: [PATCH 4/5] Lint issues --- src/__tests__/Parse-test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/__tests__/Parse-test.js b/src/__tests__/Parse-test.js index 8bfe873f7..56dedf351 100644 --- a/src/__tests__/Parse-test.js +++ b/src/__tests__/Parse-test.js @@ -109,7 +109,7 @@ describe('Parse module', () => { const controller = { }; expect(() => Parse.EventuallyQueue = controller).toThrow( - 'EventuallyQueue must implement poll()' + 'EventuallyQueue must implement poll()' ); }); From 0963495c83f6229fe157afc72a7633766e160d20 Mon Sep 17 00:00:00 2001 From: Morten Moeller Date: Tue, 23 Apr 2024 13:12:36 -0500 Subject: [PATCH 5/5] Test issues --- src/__tests__/Parse-test.js | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/__tests__/Parse-test.js b/src/__tests__/Parse-test.js index 56dedf351..d74b76373 100644 --- a/src/__tests__/Parse-test.js +++ b/src/__tests__/Parse-test.js @@ -94,17 +94,6 @@ describe('Parse module', () => { expect(CoreManager.getLocalDatastoreController()).toBe(controller); }); - it('can set EventuallyQueue', () => { - const controller = { - poll: function () {}, - save: function () {}, - destroy: function () {}, - }; - Parse.EventuallyQueue = controller; - expect(CoreManager.getEventuallyQueue()).toBe(controller); - expect(Parse.EventuallyQueue).toBe(controller); - }); - it('cannot set EventuallyQueue controller with missing functions', () => { const controller = { }; @@ -277,4 +266,16 @@ describe('Parse module', () => { process.env.PARSE_BUILD = 'node'; }); }); + + it('can set EventuallyQueue', () => { + const controller = { + poll: function () {}, + save: function () {}, + destroy: function () {}, + }; + + Parse.EventuallyQueue = controller; + expect(CoreManager.getEventuallyQueue()).toBe(controller); + expect(Parse.EventuallyQueue).toBe(controller); + }); });