From b711d2c0893991ae09f55ba4509eb66c7fdc1280 Mon Sep 17 00:00:00 2001 From: Denis Hilt Date: Fri, 5 May 2023 23:01:09 +0200 Subject: [PATCH 1/6] issue-44 resolve reset-reload collision, workflow context persists during adapter initialization --- src/classes/adapter.ts | 15 ++++++++++++++- src/scroller.ts | 8 +++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/classes/adapter.ts b/src/classes/adapter.ts index 38f683db..1f72a053 100644 --- a/src/classes/adapter.ts +++ b/src/classes/adapter.ts @@ -32,6 +32,14 @@ import { } from '../interfaces/index'; type MethodResolver = (...args: unknown[]) => Promise; +type InitializationParams = { + buffer: Buffer, + state: State, + viewport: Viewport, + logger: Logger, + adapterRun$?: Reactive, + getWorkflow?: WorkflowGetter +} const ADAPTER_PROPS_STUB = getDefaultAdapterProps(); @@ -264,7 +272,7 @@ export class Adapter implements IAdapter { } initialize( - buffer: Buffer, state: State, viewport: Viewport, logger: Logger, adapterRun$?: Reactive + { buffer, state, viewport, logger, adapterRun$, getWorkflow }: InitializationParams ): void { // buffer Object.defineProperty(this.demand, AdapterPropName.itemsCount, { @@ -344,6 +352,11 @@ export class Adapter implements IAdapter { }); } + // workflow getter + if (getWorkflow) { + this.getWorkflow = getWorkflow; + } + // init this.init = true; } diff --git a/src/scroller.ts b/src/scroller.ts index bf9e8aa9..1506abbe 100644 --- a/src/scroller.ts +++ b/src/scroller.ts @@ -79,7 +79,13 @@ export class Scroller { init(adapterRun$?: Reactive): void { this.viewport.reset(this.buffer.startIndex); this.logger.stat('initialization'); - this.adapter.initialize(this.buffer, this.state, this.viewport, this.logger, adapterRun$); + this.adapter.initialize({ + buffer: this.buffer, + state: this.state, + viewport: this.viewport, + logger: this.logger, adapterRun$, + getWorkflow: () => this.workflow + }); } dispose(forever?: boolean): void { From a446bc2db1f096607d6de03c927e18d0da63a3a3 Mon Sep 17 00:00:00 2001 From: Denis Hilt Date: Sun, 7 May 2023 22:31:18 +0200 Subject: [PATCH 2/6] issue-44 remove redundant animation/timers cleanup on Adapter.reload --- src/processes/adapter/reload.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/processes/adapter/reload.ts b/src/processes/adapter/reload.ts index 0eb96ebd..beafa8b0 100644 --- a/src/processes/adapter/reload.ts +++ b/src/processes/adapter/reload.ts @@ -14,7 +14,6 @@ export default class Reload extends BaseAdapterProcessFactory(AdapterProcess.rel const payload: ProcessPayload = {}; if (state.cycle.busy.get()) { - state.scroll.stop(); payload.finalize = true; state.cycle.interrupter = Reload.process; } From 27bb9120d393202a69b1fec513daaef29c041c40 Mon Sep 17 00:00:00 2001 From: Denis Hilt Date: Mon, 8 May 2023 21:51:49 +0200 Subject: [PATCH 3/6] issue-44 immediate re-initialization on Adapter.reset if there are no pending processes --- src/workflow.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/workflow.ts b/src/workflow.ts index 8fd7591a..0053b340 100644 --- a/src/workflow.ts +++ b/src/workflow.ts @@ -152,7 +152,7 @@ export class Workflow { const { workflow, logger } = this.scroller; // we are going to create a new reference for the scroller.workflow object // calling the old version of the scroller.workflow by any outstanding async processes will be skipped - workflow.call = (p: ProcessSubject) => // eslint-disable-line @typescript-eslint/no-unused-vars + workflow.call = (_: ProcessSubject) => // eslint-disable-line @typescript-eslint/no-unused-vars logger.log('[skip wf call]'); workflow.call.interrupted = true; this.scroller.workflow = this.getUpdater(); @@ -160,13 +160,19 @@ export class Workflow { logger.log(() => `workflow had been interrupted by the ${process} process (${this.interruptionCount})`); } if (datasource) { // Scroller re-initialization case - this.scroller.adapter.relax(() => { + const reInit = () => { this.scroller.logger.log('new Scroller instantiation'); const scroller = new Scroller({ datasource, scroller: this.scroller }); this.scroller.dispose(); this.scroller = scroller; this.scroller.init(); - }); + }; + if (this.scroller.state.cycle.busy.get()) { + // todo: think about immediate re-initialization even is there are pending processes + this.scroller.adapter.relax(reInit.bind(this)); + } else { + reInit(); + } } } From 4b3d91df8653520a6cab54d40a4551e90a83e3d9 Mon Sep 17 00:00:00 2001 From: Denis Hilt Date: Mon, 8 May 2023 21:52:42 +0200 Subject: [PATCH 4/6] issue-44 disposed protection for Adapter.relax --- src/classes/adapter.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/classes/adapter.ts b/src/classes/adapter.ts index 1f72a053..44149dd3 100644 --- a/src/classes/adapter.ts +++ b/src/classes/adapter.ts @@ -71,6 +71,7 @@ export class Adapter implements IAdapter { private source: { [key: string]: Reactive } = {}; // for Reactive props private box: { [key: string]: unknown } = {}; // for Scalars over Reactive props private demand: { [key: string]: unknown } = {}; // for Scalars on demand + private disposed: boolean; // eslint-disable-next-line @typescript-eslint/no-unused-vars setFirstOrLastVisible = (_: { first?: boolean, last?: boolean, workflow?: ScrollerWorkflow }) => { }; @@ -371,6 +372,7 @@ export class Adapter implements IAdapter { Object.getOwnPropertyNames(this).forEach(prop => { delete (this as Record)[prop]; }); + this.disposed = true; } resetContext(): void { @@ -524,8 +526,15 @@ export class Adapter implements IAdapter { resolve(false); }); }).then(immediate => { + if (this.disposed) { + return { + immediate, + success: false, + details: 'Adapter was disposed' + }; + } const success = reloadId === this.reloadId; - this.logger.log(() => !success ? `relax promise cancelled due to ${reloadId} != ${this.reloadId}` : void 0); + this.logger?.log?.(() => !success ? `relax promise cancelled due to ${reloadId} != ${this.reloadId}` : void 0); return { immediate, success, From 9fd1a487493a14a8427dfa67d566f101167d1561 Mon Sep 17 00:00:00 2001 From: Denis Hilt Date: Mon, 8 May 2023 22:08:26 +0200 Subject: [PATCH 5/6] Vulnerabilities --- package-lock.json | 56 ++++++++++++++++------------------------------- 1 file changed, 19 insertions(+), 37 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8b7e5f44..047336d7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3569,9 +3569,9 @@ "dev": true }, "node_modules/decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "dev": true, "engines": { "node": ">=0.10" @@ -6271,13 +6271,10 @@ "dev": true }, "node_modules/json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, "bin": { "json5": "lib/cli.js" }, @@ -6453,9 +6450,9 @@ } }, "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "dependencies": { "brace-expansion": "^1.1.7" @@ -6464,12 +6461,6 @@ "node": "*" } }, - "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, "node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -10583,9 +10574,9 @@ "dev": true }, "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "dev": true }, "dedent": { @@ -12611,13 +12602,10 @@ "dev": true }, "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true }, "kleur": { "version": "3.0.3", @@ -12748,20 +12736,14 @@ "dev": true }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", From ddfe19dd9f6718854e190a7c268a402e7248c4f3 Mon Sep 17 00:00:00 2001 From: Denis Hilt Date: Mon, 8 May 2023 22:10:51 +0200 Subject: [PATCH 6/6] v1.5.4 --- package-lock.json | 4 ++-- package.json | 4 ++-- src/version.ts | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 047336d7..022b158b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "vscroll", - "version": "1.5.3", + "version": "1.5.4", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "vscroll", - "version": "1.5.3", + "version": "1.5.4", "license": "MIT", "dependencies": { "tslib": "^2.3.1" diff --git a/package.json b/package.json index 33d035e2..d567c709 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vscroll", - "version": "1.5.3", + "version": "1.5.4", "description": "Virtual scroll engine", "main": "dist/bundles/vscroll.umd.js", "module": "dist/bundles/vscroll.esm5.js", @@ -65,4 +65,4 @@ "javascript", "typescript" ] -} +} \ No newline at end of file diff --git a/src/version.ts b/src/version.ts index 594f4996..23be8f3d 100644 --- a/src/version.ts +++ b/src/version.ts @@ -1,4 +1,4 @@ export default { name: 'vscroll', - version: '1.5.3' + version: '1.5.4' };