Skip to content

Commit 49f005e

Browse files
authored
Merge pull request #362 from chancancode/encapsulated-task-v2
Allow accessing encapsulated task state
2 parents fac0f13 + 59194e5 commit 49f005e

File tree

4 files changed

+845
-300
lines changed

4 files changed

+845
-300
lines changed

addon/index.d.ts

Lines changed: 66 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,12 @@ export type TaskFunctionArgs<T extends TaskFunction<any, any[]>> =
1111
export type TaskFunctionReturnType<T extends TaskFunction<any, any[]>> =
1212
T extends (...args: any[]) => TaskGenerator<infer R> ? R : unknown;
1313

14+
export type TaskForTaskFunction<T extends TaskFunction<any, any[]>> =
15+
Task<TaskFunctionReturnType<T>, TaskFunctionArgs<T>>;
16+
17+
export type TaskInstanceForTaskFunction<T extends TaskFunction<any, any[]>> =
18+
TaskInstance<TaskFunctionReturnType<T>>;
19+
1420
export interface EncapsulatedTaskDescriptor<T, Args extends any[]> {
1521
perform(...args: Args): TaskGenerator<T>;
1622
}
@@ -21,16 +27,19 @@ export type EncapsulatedTaskDescriptorArgs<T extends EncapsulatedTaskDescriptor<
2127
export type EncapsulatedTaskDescriptorReturnType<T extends EncapsulatedTaskDescriptor<any, any[]>> =
2228
T extends { perform(...args: any[]): TaskGenerator<infer R> } ? R : unknown;
2329

24-
/**
25-
* The `Task` object lives on a host Ember object (e.g.
26-
* a Component, Route, or Controller). You call the
27-
* {@linkcode Task#perform .perform()} method on this object
28-
* to create run individual {@linkcode TaskInstance}s,
29-
* and at any point, you can call the {@linkcode Task#cancelAll .cancelAll()}
30-
* method on this object to cancel all running or enqueued
31-
* {@linkcode TaskInstance}s.
32-
*/
33-
export interface Task<T, Args extends any[]> extends EmberObject {
30+
export type EncapsulatedTaskState<T extends object> = Omit<T, 'perform' | keyof TaskInstance<any>>;
31+
32+
export type TaskForEncapsulatedTaskDescriptor<T extends EncapsulatedTaskDescriptor<any, any[]>> =
33+
EncapsulatedTask<
34+
EncapsulatedTaskDescriptorReturnType<T>,
35+
EncapsulatedTaskDescriptorArgs<T>,
36+
EncapsulatedTaskState<T>
37+
>;
38+
39+
export type TaskInstanceForEncapsulatedTaskDescriptor<T extends EncapsulatedTaskDescriptor<any, any[]>> =
40+
EncapsulatedTaskInstance<EncapsulatedTaskDescriptorReturnType<T>, EncapsulatedTaskState<T>>;
41+
42+
interface AbstractTask<Args extends any[], T extends TaskInstance<any>> extends EmberObject {
3443
/**
3544
* `true` if any current task instances are running.
3645
*/
@@ -54,42 +63,42 @@ export interface Task<T, Args extends any[]> extends EmberObject {
5463
/**
5564
* The most recently started task instance.
5665
*/
57-
readonly last: TaskInstance<T> | null;
66+
readonly last: T | null;
5867

5968
/**
6069
* The most recent task instance that is currently running.
6170
*/
62-
readonly lastRunning: TaskInstance<T> | null;
71+
readonly lastRunning: T | null;
6372

6473
/**
6574
* The most recently performed task instance.
6675
*/
67-
readonly lastPerformed: TaskInstance<T> | null;
76+
readonly lastPerformed: T | null;
6877

6978
/**
7079
* The most recent task instance that succeeded.
7180
*/
72-
readonly lastSuccessful: TaskInstance<T> | null;
81+
readonly lastSuccessful: T | null;
7382

7483
/**
7584
* The most recently completed task instance.
7685
*/
77-
readonly lastComplete: TaskInstance<T> | null;
86+
readonly lastComplete: T | null;
7887

7988
/**
8089
* The most recent task instance that errored.
8190
*/
82-
readonly lastErrored: TaskInstance<T> | null;
91+
readonly lastErrored: T | null;
8392

8493
/**
8594
* The most recently canceled task instance.
8695
*/
87-
readonly lastCanceled: TaskInstance<T> | null;
96+
readonly lastCanceled: T | null;
8897

8998
/**
9099
* The most recent task instance that is incomplete.
91100
*/
92-
readonly lastIncomplete: TaskInstance<T> | null;
101+
readonly lastIncomplete: T | null;
93102

94103
/**
95104
* The number of times this task has been performed.
@@ -120,9 +129,24 @@ export interface Task<T, Args extends any[]> extends EmberObject {
120129
*
121130
* @param args Arguments to pass to the task function.
122131
*/
123-
perform(...args: Args): TaskInstance<T>;
132+
perform(...args: Args): T;
124133
}
125134

135+
/**
136+
* The `Task` object lives on a host Ember object (e.g.
137+
* a Component, Route, or Controller). You call the
138+
* {@linkcode Task#perform .perform()} method on this object
139+
* to create run individual {@linkcode TaskInstance}s,
140+
* and at any point, you can call the {@linkcode Task#cancelAll .cancelAll()}
141+
* method on this object to cancel all running or enqueued
142+
* {@linkcode TaskInstance}s.
143+
*/
144+
export interface Task<T, Args extends any[]>
145+
extends AbstractTask<Args, TaskInstance<T>> {}
146+
147+
export interface EncapsulatedTask<T, Args extends any[], State extends object>
148+
extends AbstractTask<Args, EncapsulatedTaskInstance<T, State>> {}
149+
126150
/**
127151
* "Task Groups" provide a means for applying
128152
* task modifiers to groups of tasks. Once a {@linkcode Task} is declared
@@ -333,16 +357,9 @@ export interface TaskInstance<T> extends Promise<T>, EmberObject {
333357
finally(onfinally?: (() => void) | null): Promise<T>;
334358
}
335359

336-
/**
337-
* A {@link TaskProperty} is the Computed Property-like object returned
338-
* from the {@linkcode task} function. You can call Task Modifier methods
339-
* on this object to configure the behavior of the {@link Task}.
340-
*
341-
* See [Managing Task Concurrency](/#/docs/task-concurrency) for an
342-
* overview of all the different task modifiers you can use and how
343-
* they impact automatic cancelation / enqueueing of task instances.
344-
*/
345-
export interface TaskProperty<T, Args extends any[]> extends ComputedProperty<Task<T, Args>> {
360+
type EncapsulatedTaskInstance<T, State extends object> = TaskInstance<T> & EncapsulatedTaskState<State>;
361+
362+
interface AbstractTaskProperty<T extends Task<any, any[]>> extends ComputedProperty<T> {
346363
volatile: never;
347364
readOnly: never;
348365
property: never;
@@ -483,6 +500,21 @@ export interface TaskProperty<T, Args extends any[]> extends ComputedProperty<Ta
483500
debug(): this;
484501
}
485502

503+
/**
504+
* A {@link TaskProperty} is the Computed Property-like object returned
505+
* from the {@linkcode task} function. You can call Task Modifier methods
506+
* on this object to configure the behavior of the {@link Task}.
507+
*
508+
* See [Managing Task Concurrency](/#/docs/task-concurrency) for an
509+
* overview of all the different task modifiers you can use and how
510+
* they impact automatic cancelation / enqueueing of task instances.
511+
*/
512+
export interface TaskProperty<T, Args extends any[]>
513+
extends AbstractTaskProperty<Task<T, Args>> {}
514+
515+
export interface EncapsulatedTaskProperty<T, Args extends any[], State extends object>
516+
extends AbstractTaskProperty<EncapsulatedTask<T, Args, State>> {}
517+
486518
export interface TaskGroupProperty<T> extends ComputedProperty<TaskGroup<T>> {
487519
volatile: never;
488520
readOnly: never;
@@ -645,7 +677,11 @@ type Settled<T> = Settlement<Resolved<T>>;
645677
export function task<T extends TaskFunction<any, any[]>>(taskFn: T):
646678
TaskProperty<TaskFunctionReturnType<T>, TaskFunctionArgs<T>>;
647679
export function task<T extends EncapsulatedTaskDescriptor<any, any[]>>(taskFn: T):
648-
TaskProperty<EncapsulatedTaskDescriptorReturnType<T>, EncapsulatedTaskDescriptorArgs<T>>;
680+
EncapsulatedTaskProperty<
681+
EncapsulatedTaskDescriptorReturnType<T>,
682+
EncapsulatedTaskDescriptorArgs<T>,
683+
EncapsulatedTaskState<T>
684+
>;
649685

650686
/**
651687
* "Task Groups" provide a means for applying

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,9 @@
4343
"ember-cli-template-lint": "^1.0.0-beta.1",
4444
"ember-cli-uglify": "^2.1.0",
4545
"ember-code-snippet": "^2.4.0",
46-
"ember-concurrency-async": "^0.2.0",
46+
"ember-concurrency-async": "chancancode/ember-concurrency-async#encapsulated-task-v2",
4747
"ember-concurrency-decorators": "^2.0.0",
48-
"ember-concurrency-ts": "^0.1.0",
48+
"ember-concurrency-ts": "chancancode/ember-concurrency-ts#encapsulated-task-v2",
4949
"ember-disable-prototype-extensions": "^1.1.3",
5050
"ember-disable-proxy-controllers": "^1.0.1",
5151
"ember-export-application-global": "^2.0.0",

0 commit comments

Comments
 (0)