Skip to content

Commit

Permalink
issue-56 paused methods resolver
Browse files Browse the repository at this point in the history
  • Loading branch information
dhilt committed Mar 2, 2024
1 parent 9966eb4 commit adbbca2
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 24 deletions.
44 changes: 33 additions & 11 deletions src/classes/adapter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,13 @@ import { Logger } from './logger';
import { Buffer } from './buffer';
import { Reactive } from './reactive';
import {
AdapterPropName, AdapterPropType, EMPTY_ITEM, getDefaultAdapterProps, methodPreResult, reactiveConfigStorage
AdapterPropName,
AdapterPropType,
EMPTY_ITEM,
getDefaultAdapterProps,
methodPausedResult,
methodPreResult,
reactiveConfigStorage
} from './adapter/props';
import { wantedUtils } from './adapter/wanted';
import { Viewport } from './viewport';
Expand Down Expand Up @@ -113,16 +119,32 @@ export class Adapter<Item = unknown> implements IAdapter<Item> {
private relax$: Reactive<AdapterMethodResult> | null;
private relaxRun: Promise<AdapterMethodResult> | null;

private getPromisifiedMethod(method: MethodResolver, defaultMethod: MethodResolver) {
private shouldIgnorePausedMethod(method: MethodResolver) {
const WHITE_LIST = [AdapterPropName.reset, AdapterPropName.resume];
return this.paused && !WHITE_LIST.includes(method.name as AdapterPropName);
}

private getPausedMethodResult(method: MethodResolver) {
this.logger?.log?.(() => 'scroller is paused: ' + method.name + ' method is ignored');
return Promise.resolve(methodPausedResult);
}

private getPromisifiedMethod(method: MethodResolver, args: unknown[]) {
return new Promise<AdapterMethodResult>(resolve => {
if (this.relax$) {
this.relax$.once(value => resolve(value));
}
method.apply(this, args);
});
}

private getWorkflowRunnerMethod(method: MethodResolver, defaultMethod: MethodResolver) {
return (...args: unknown[]): Promise<AdapterMethodResult> =>
this.relax$
? new Promise(resolve => {
if (this.relax$) {
this.relax$.once(value => resolve(value));
}
method.apply(this, args);
})
: defaultMethod.apply(this, args);
!this.relax$
? defaultMethod.apply(this, args)
: this.shouldIgnorePausedMethod(method)
? this.getPausedMethodResult(method)
: this.getPromisifiedMethod(method, args);
}

constructor(context: IAdapter<Item> | null, getWorkflow: WorkflowGetter<Item>, logger: Logger) {
Expand Down Expand Up @@ -251,7 +273,7 @@ export class Adapter<Item = unknown> implements IAdapter<Item> {
if (type === AdapterPropType.Function) {
value = (value as () => void).bind(this);
} else if (type === AdapterPropType.WorkflowRunner) {
value = this.getPromisifiedMethod(value as MethodResolver, defaultValue as MethodResolver);
value = this.getWorkflowRunnerMethod(value as MethodResolver, defaultValue as MethodResolver);
} else if (type === AdapterPropType.Reactive && reactivePropsStore[name]) {
value = (context as IAdapter)[name];
} else if (name === AdapterPropName.augmented) {
Expand Down
6 changes: 6 additions & 0 deletions src/classes/adapter/props.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,12 @@ export const methodPreResult: AdapterMethodResult = {
details: 'Adapter is not initialized'
};

export const methodPausedResult: AdapterMethodResult = {
immediate: true,
success: true,
details: 'Scroller is paused'
};

const noopWF = () => Promise.resolve(methodPreResult);

const emptyPackageInfo: IPackages = {
Expand Down
21 changes: 8 additions & 13 deletions src/processes/adapter/pause.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,24 +6,19 @@ export default class Pause extends BaseAdapterProcessFactory(AdapterProcess.paus
static run(scroller: Scroller, options?: { resume: boolean }): void {
const resume = !!options?.resume;

if (!resume) {
if (!scroller.state.paused.get()) {
scroller.logger.log('pause scroller');
scroller.state.paused.set(true);
} else {
scroller.logger.log('pause scroller (cancelled)');
}
return;
}

if (!scroller.state.paused.get()) {
scroller.logger.log('resume scroller (cancelled)');
// pause branch
if (!resume && !scroller.state.paused.get()) {
scroller.logger.log('pause scroller');
scroller.state.paused.set(true);
scroller.workflow.call({
process: AdapterProcess.pause,
status: ProcessStatus.done
});
return;
}

scroller.logger.log('resume scroller');
scroller.state.paused.set(false);

scroller.workflow.call({
process: AdapterProcess.pause,
status: ProcessStatus.next
Expand Down

0 comments on commit adbbca2

Please sign in to comment.