@@ -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
export type ComponentProvider = ( ) => React$ComponentType < any > ;
25
28
export type ComponentProviderInstrumentationHook = (
26
29
component : ComponentProvider ,
@@ -47,7 +50,8 @@ export type WrapperComponentProvider = any => React$ComponentType<*>;
47
50
const runnables : Runnables = { } ;
48
51
let runCount = 1 ;
49
52
const sections : Runnables = { } ;
50
- const tasks : Map < string , TaskProvider > = new Map ( ) ;
53
+ const taskProviders : Map < string , TaskProvider > = new Map ( ) ;
54
+ const taskCancelProviders : Map < string , TaskCancelProvider > = new Map ( ) ;
51
55
let componentProviderInstrumentationHook : ComponentProviderInstrumentationHook = (
52
56
component : ComponentProvider ,
53
57
) => component ( ) ;
@@ -209,13 +213,23 @@ const AppRegistry = {
209
213
*
210
214
* See http://facebook.github.io/react-native/docs/appregistry.html#registerheadlesstask
211
215
*/
212
- registerHeadlessTask ( taskKey : string , task : TaskProvider ) : void {
213
- if ( tasks . has ( taskKey ) ) {
216
+ registerHeadlessTask ( taskKey : string , taskProvider : TaskProvider ) : void {
217
+ this . registerCancellableHeadlessTask ( taskKey , taskProvider , ( ) => ( ) => { /* Cancel is no-op */ } ) ;
218
+ } ,
219
+
220
+ /**
221
+ * Register a cancellable headless task. A headless task is a bit of code that runs without a UI.
222
+ *
223
+ * See http://facebook.github.io/react-native/docs/appregistry.html#registercancellableheadlesstask
224
+ */
225
+ registerCancellableHeadlessTask ( taskKey : string , taskProvider : TaskProvider , taskCancelProvider : TaskCancelProvider ) : void {
226
+ if ( taskProviders . has ( taskKey ) ) {
214
227
console . warn (
215
- `registerHeadlessTask called multiple times for same key '${taskKey } '`,
228
+ `registerHeadlessTask or registerCancellableHeadlessTask called multiple times for same key '${taskKey } '`,
216
229
) ;
217
230
}
218
- tasks . set ( taskKey , task ) ;
231
+ taskProviders . set ( taskKey , taskProvider ) ;
232
+ taskCancelProviders . set ( taskKey , taskCancelProvider ) ;
219
233
} ,
220
234
221
235
/**
@@ -224,7 +238,7 @@ const AppRegistry = {
224
238
* See http://facebook.github.io/react-native/docs/appregistry.html#startheadlesstask
225
239
*/
226
240
startHeadlessTask ( taskId : number , taskKey : string , data : any ) : void {
227
- const taskProvider = tasks . get ( taskKey ) ;
241
+ const taskProvider = taskProviders . get ( taskKey ) ;
228
242
if ( ! taskProvider ) {
229
243
throw new Error ( `No task registered for key ${ taskKey } ` ) ;
230
244
}
@@ -237,6 +251,19 @@ const AppRegistry = {
237
251
NativeModules . HeadlessJsTaskSupport . notifyTaskFinished ( taskId ) ;
238
252
} ) ;
239
253
} ,
254
+
255
+ /**
256
+ * Only called from native code. Cancels a headless task.
257
+ *
258
+ * See http://facebook.github.io/react-native/docs/appregistry.html#cancelheadlesstask
259
+ */
260
+ cancelHeadlessTask ( taskId : number , taskKey : string ) : void {
261
+ const taskCancelProvider = taskCancelProviders . get ( taskKey ) ;
262
+ if ( ! taskCancelProvider ) {
263
+ throw new Error ( `No task canceller registered for key '${ taskKey } '` ) ;
264
+ }
265
+ taskCancelProvider ( ) ( ) ;
266
+ } ,
240
267
} ;
241
268
242
269
BatchedBridge . registerCallableModule ( 'AppRegistry' , AppRegistry ) ;
0 commit comments