From f46ec6349d11974046b59d61db4ddbfead44c5d9 Mon Sep 17 00:00:00 2001 From: MixMasterT Date: Mon, 3 Apr 2023 12:04:27 -0500 Subject: [PATCH 1/4] add proposed test cases (commented out) --- packages/datastore/__tests__/sync.test.ts | 49 +++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/packages/datastore/__tests__/sync.test.ts b/packages/datastore/__tests__/sync.test.ts index cc31abfa36a..7837f2e6ce1 100644 --- a/packages/datastore/__tests__/sync.test.ts +++ b/packages/datastore/__tests__/sync.test.ts @@ -299,6 +299,55 @@ describe('Sync', () => { }); }); + /* + * This is where new tests would be added for per-model syncPageSize + * Proposed test cases are added below with // comments + */ + + // describe('syncPageSize', () => { + // test('should use default syncPageSize if not specified (null, undefined or zero)', async () => { + // const resolveResponse = { + // data: { + // syncPosts: { + // items: [ + // { + // id: '1', + // title: 'Item 1', + // }, + // { + // id: '2', + // title: 'Item 2', + // }, + // ], + // }, + // }, + // }; + + // const SyncProcessor = jitteredRetrySyncProcessorSetup({ + // resolveResponse, + // }); + + // await SyncProcessor.jitteredRetry({ + // query: defaultQuery, + // variables: defaultVariables, + // opName: defaultOpName, + // modelDefinition: defaultModelDefinition, + // }); + + // expect(mockGraphQl).toHaveBeenCalledWith( + // expect.objectContaining({ + // variables: { + // syncPageSize: DEFAULT_SYNC_PAGE_SIZE, + // }, + // }) + // ); + // }); + // test('the limit for the sync query should equal syncPageSize if it is defined as a natural number', async () => {}); + // test('a meaningful error should be thrown if syncPageSize is not defined as a natural number', async () => {}); + // test('the limit for the sync query should equal perModelSyncPageSize[`modelName`] if it is defined as a natural number', async () => {}); + // test('a meaningful error should be thrown if perModelSyncPageSize[`modelName`] is not a natural number', async () => {}); + // } + describe('error handler', () => { const errorHandler = jest.fn(); const data = { From 3f88214e7cd86127b090b3a59106c8e0acfe643d Mon Sep 17 00:00:00 2001 From: MixMasterT Date: Mon, 3 Apr 2023 12:05:05 -0500 Subject: [PATCH 2/4] add perModelSyncPageSize to DataStoreConfig type --- packages/datastore/src/types.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/datastore/src/types.ts b/packages/datastore/src/types.ts index e92b1af7e14..4544ad78f69 100644 --- a/packages/datastore/src/types.ts +++ b/packages/datastore/src/types.ts @@ -934,6 +934,7 @@ export type DataStoreConfig = { errorHandler?: (error: SyncError) => void; // default : logger.warn maxRecordsToSync?: number; // merge syncPageSize?: number; + perModelSyncPageSize?: { [modelName: string]: number }; // over-ride syncPageSize for specific models fullSyncInterval?: number; syncExpressions?: SyncExpression[]; authProviders?: AuthProviders; @@ -944,6 +945,7 @@ export type DataStoreConfig = { errorHandler?: (error: SyncError) => void; // default : logger.warn maxRecordsToSync?: number; // merge syncPageSize?: number; + perModelSyncPageSize?: { [modelName: string]: number }; // over-ride syncPageSize for specific models fullSyncInterval?: number; syncExpressions?: SyncExpression[]; authProviders?: AuthProviders; From ba9c13d5b482fbc7b28aa9ce0be20578ea68edfb Mon Sep 17 00:00:00 2001 From: MixMasterT Date: Mon, 3 Apr 2023 12:06:06 -0500 Subject: [PATCH 3/4] add perModelSyncPageSize in DataStore Class --- packages/datastore/src/datastore/datastore.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/datastore/src/datastore/datastore.ts b/packages/datastore/src/datastore/datastore.ts index c702fe25c85..8c10d465673 100644 --- a/packages/datastore/src/datastore/datastore.ts +++ b/packages/datastore/src/datastore/datastore.ts @@ -1374,6 +1374,7 @@ class DataStore { private storage?: Storage; private sync?: SyncEngine; private syncPageSize!: number; + private perModelSyncPageSize?: { [modelName: string]: number }; private syncExpressions!: SyncExpression[]; private syncPredicates: WeakMap | null> = new WeakMap>(); @@ -2460,6 +2461,9 @@ class DataStore { // store on config object, so that Sync, Subscription, and Mutation processors can have access this.amplifyConfig.syncPageSize = this.syncPageSize; + // also store perModelSyncPageSize on config object, so that Sync, Subscription, and Mutation processors can have access + this.amplifyConfig.perModelSyncPageSize = this.perModelSyncPageSize; + this.fullSyncInterval = (configDataStore && configDataStore.fullSyncInterval) || configFullSyncInterval || From 8dee01708b94f36a1e2b8bddb57a6e3bda8a564b Mon Sep 17 00:00:00 2001 From: MixMasterT Date: Mon, 3 Apr 2023 12:07:52 -0500 Subject: [PATCH 4/4] add logic to set request limit to modelName value on perModelSyncPageSize object if it exists keeping the previous implementation if not --- packages/datastore/src/sync/processors/sync.ts | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/packages/datastore/src/sync/processors/sync.ts b/packages/datastore/src/sync/processors/sync.ts index 26073073eda..57b67ce7e6f 100644 --- a/packages/datastore/src/sync/processors/sync.ts +++ b/packages/datastore/src/sync/processors/sync.ts @@ -315,7 +315,8 @@ class SyncProcessor { start( typesLastSync: Map ): Observable { - const { maxRecordsToSync, syncPageSize } = this.amplifyConfig; + const { maxRecordsToSync, syncPageSize, perModelSyncPageSize } = + this.amplifyConfig; const parentPromises = new Map>(); const observable = new Observable(observer => { const sortedTypesLastSyncs = Object.values(this.schema.namespaces).reduce( @@ -360,10 +361,15 @@ class SyncProcessor { return; } - const limit = Math.min( - maxRecordsToSync - recordsReceived, - syncPageSize - ); + const limit = perModelSyncPageSize?.[modelDefinition.name] + ? Math.min( + maxRecordsToSync - recordsReceived, + perModelSyncPageSize[modelDefinition.name] + ) + : Math.min( + maxRecordsToSync - recordsReceived, + syncPageSize + ); ({ items, nextToken, startedAt } = await this.retrievePage( modelDefinition,