@@ -21,6 +21,9 @@ const renderApplication = require('renderApplication');
21
21
22
22
type Task = ( taskData : any ) => Promise < void > ;
23
23
type TaskProvider = ( ) => Task ;
24
+ type TaskCanceller = ( ) => void ;
25
+ type TaskCancelProvider = ( ) => TaskCanceller ;
26
+
24
27
/* $FlowFixMe(>=0.90.0 site=react_native_fb) This comment suppresses an
25
28
* error found when Flow v0.90 was deployed. To see the error, delete this
26
29
* comment and run Flow. */
@@ -50,7 +53,8 @@ export type WrapperComponentProvider = any => React$ComponentType<*>;
50
53
const runnables : Runnables = { } ;
51
54
let runCount = 1 ;
52
55
const sections : Runnables = { } ;
53
- const tasks : Map < string , TaskProvider > = new Map ( ) ;
56
+ const taskProviders : Map < string , TaskProvider > = new Map ( ) ;
57
+ const taskCancelProviders : Map < string , TaskCancelProvider > = new Map ( ) ;
54
58
let componentProviderInstrumentationHook : ComponentProviderInstrumentationHook = (
55
59
component : ComponentProvider ,
56
60
) => component ( ) ;
@@ -212,13 +216,29 @@ const AppRegistry = {
212
216
*
213
217
* See http://facebook.github.io/react-native/docs/appregistry.html#registerheadlesstask
214
218
*/
215
- registerHeadlessTask ( taskKey : string , task : TaskProvider ) : void {
216
- if ( tasks . has ( taskKey ) ) {
219
+ registerHeadlessTask ( taskKey : string , taskProvider : TaskProvider ) : void {
220
+ this . registerCancellableHeadlessTask ( taskKey , taskProvider , ( ) => ( ) => {
221
+ /* Cancel is no-op */
222
+ } ) ;
223
+ } ,
224
+
225
+ /**
226
+ * Register a cancellable headless task. A headless task is a bit of code that runs without a UI.
227
+ *
228
+ * See http://facebook.github.io/react-native/docs/appregistry.html#registercancellableheadlesstask
229
+ */
230
+ registerCancellableHeadlessTask (
231
+ taskKey : string ,
232
+ taskProvider : TaskProvider ,
233
+ taskCancelProvider : TaskCancelProvider ,
234
+ ) : void {
235
+ if ( taskProviders . has ( taskKey ) ) {
217
236
console . warn (
218
- `registerHeadlessTask called multiple times for same key '${taskKey } '`,
237
+ `registerHeadlessTask or registerCancellableHeadlessTask called multiple times for same key '${taskKey } '`,
219
238
) ;
220
239
}
221
- tasks . set ( taskKey , task ) ;
240
+ taskProviders . set ( taskKey , taskProvider ) ;
241
+ taskCancelProviders . set ( taskKey , taskCancelProvider ) ;
222
242
} ,
223
243
224
244
/**
@@ -227,7 +247,7 @@ const AppRegistry = {
227
247
* See http://facebook.github.io/react-native/docs/appregistry.html#startheadlesstask
228
248
*/
229
249
startHeadlessTask ( taskId : number , taskKey : string , data : any ) : void {
230
- const taskProvider = tasks . get ( taskKey ) ;
250
+ const taskProvider = taskProviders . get ( taskKey ) ;
231
251
if ( ! taskProvider ) {
232
252
throw new Error ( `No task registered for key ${ taskKey } ` ) ;
233
253
}
@@ -240,6 +260,19 @@ const AppRegistry = {
240
260
NativeModules . HeadlessJsTaskSupport . notifyTaskFinished ( taskId ) ;
241
261
} ) ;
242
262
} ,
263
+
264
+ /**
265
+ * Only called from native code. Cancels a headless task.
266
+ *
267
+ * See http://facebook.github.io/react-native/docs/appregistry.html#cancelheadlesstask
268
+ */
269
+ cancelHeadlessTask ( taskId : number , taskKey : string ) : void {
270
+ const taskCancelProvider = taskCancelProviders . get ( taskKey ) ;
271
+ if ( ! taskCancelProvider ) {
272
+ throw new Error ( `No task canceller registered for key '${ taskKey } '` ) ;
273
+ }
274
+ taskCancelProvider ( ) ( ) ;
275
+ } ,
243
276
} ;
244
277
245
278
BatchedBridge . registerCallableModule ( 'AppRegistry' , AppRegistry ) ;
0 commit comments