UNPKG

4.12 kBJavaScriptView Raw
1import { EventEmitter } from '@unimodules/core';
2import { UnavailabilityError } from '@unimodules/core';
3import ExpoTaskManager from './ExpoTaskManager';
4const eventEmitter = new EventEmitter(ExpoTaskManager);
5const tasks = new Map();
6let isRunningDuringInitialization = true;
7function _validateTaskName(taskName) {
8 if (!taskName || typeof taskName !== 'string') {
9 throw new TypeError('`taskName` must be a non-empty string.');
10 }
11}
12export function defineTask(taskName, task) {
13 if (!isRunningDuringInitialization) {
14 console.error(`TaskManager.defineTask must be called during initialization phase!`);
15 return;
16 }
17 if (!taskName || typeof taskName !== 'string') {
18 console.warn(`TaskManager.defineTask: 'taskName' argument must be a non-empty string.`);
19 return;
20 }
21 if (!task || typeof task !== 'function') {
22 console.warn(`TaskManager.defineTask: 'task' argument must be a function.`);
23 return;
24 }
25 if (tasks.has(taskName)) {
26 console.warn(`TaskManager.defineTask: task '${taskName}' is already defined.`);
27 return;
28 }
29 tasks.set(taskName, task);
30}
31export function isTaskDefined(taskName) {
32 return tasks.has(taskName);
33}
34export async function isTaskRegisteredAsync(taskName) {
35 if (!ExpoTaskManager.isTaskRegisteredAsync) {
36 throw new UnavailabilityError('TaskManager', 'isTaskRegisteredAsync');
37 }
38 _validateTaskName(taskName);
39 return ExpoTaskManager.isTaskRegisteredAsync(taskName);
40}
41export async function getTaskOptionsAsync(taskName) {
42 if (!ExpoTaskManager.getTaskOptionsAsync) {
43 throw new UnavailabilityError('TaskManager', 'getTaskOptionsAsync');
44 }
45 _validateTaskName(taskName);
46 return ExpoTaskManager.getTaskOptionsAsync(taskName);
47}
48export async function getRegisteredTasksAsync() {
49 if (!ExpoTaskManager.getRegisteredTasksAsync) {
50 throw new UnavailabilityError('TaskManager', 'getRegisteredTasksAsync');
51 }
52 return ExpoTaskManager.getRegisteredTasksAsync();
53}
54export async function unregisterTaskAsync(taskName) {
55 if (!ExpoTaskManager.unregisterTaskAsync) {
56 throw new UnavailabilityError('TaskManager', 'unregisterTaskAsync');
57 }
58 _validateTaskName(taskName);
59 await ExpoTaskManager.unregisterTaskAsync(taskName);
60}
61export async function unregisterAllTasksAsync() {
62 if (!ExpoTaskManager.unregisterAllTasksAsync) {
63 throw new UnavailabilityError('TaskManager', 'unregisterAllTasksAsync');
64 }
65 await ExpoTaskManager.unregisterAllTasksAsync();
66}
67eventEmitter.addListener(ExpoTaskManager.EVENT_NAME, async ({ data, error, executionInfo }) => {
68 const { eventId, taskName } = executionInfo;
69 const task = tasks.get(taskName);
70 let result = null;
71 if (task) {
72 try {
73 // Execute JS task
74 result = await task({ data, error, executionInfo });
75 }
76 catch (error) {
77 console.error(`TaskManager: Task "${taskName}" failed:`, error);
78 }
79 finally {
80 // Notify manager the task is finished.
81 await ExpoTaskManager.notifyTaskFinishedAsync(taskName, { eventId, result });
82 }
83 }
84 else {
85 console.warn(`TaskManager: Task "${taskName}" has been executed but looks like it is not defined. Please make sure that "TaskManager.defineTask" is called during initialization phase.`);
86 // No tasks defined -> we need to notify about finish anyway.
87 await ExpoTaskManager.notifyTaskFinishedAsync(taskName, { eventId, result });
88 // We should also unregister such tasks automatically as the task might have been removed
89 // from the app or just renamed - in that case it needs to be registered again (with the new name).
90 await ExpoTaskManager.unregisterTaskAsync(taskName);
91 }
92});
93// @tsapeta: Turn off `defineTask` function right after the initialization phase.
94// Promise.resolve() ensures that it will be called as a microtask just after the first event loop.
95Promise.resolve().then(() => {
96 isRunningDuringInitialization = false;
97});
98//# sourceMappingURL=TaskManager.js.map
\No newline at end of file