1 | import { EventEmitter } from '@unimodules/core';
|
2 | import { UnavailabilityError } from '@unimodules/core';
|
3 | import ExpoTaskManager from './ExpoTaskManager';
|
4 | const eventEmitter = new EventEmitter(ExpoTaskManager);
|
5 | const tasks = new Map();
|
6 | let isRunningDuringInitialization = true;
|
7 | function _validateTaskName(taskName) {
|
8 | if (!taskName || typeof taskName !== 'string') {
|
9 | throw new TypeError('`taskName` must be a non-empty string.');
|
10 | }
|
11 | }
|
12 | export 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 | }
|
31 | export function isTaskDefined(taskName) {
|
32 | return tasks.has(taskName);
|
33 | }
|
34 | export async function isTaskRegisteredAsync(taskName) {
|
35 | if (!ExpoTaskManager.isTaskRegisteredAsync) {
|
36 | throw new UnavailabilityError('TaskManager', 'isTaskRegisteredAsync');
|
37 | }
|
38 | _validateTaskName(taskName);
|
39 | return ExpoTaskManager.isTaskRegisteredAsync(taskName);
|
40 | }
|
41 | export async function getTaskOptionsAsync(taskName) {
|
42 | if (!ExpoTaskManager.getTaskOptionsAsync) {
|
43 | throw new UnavailabilityError('TaskManager', 'getTaskOptionsAsync');
|
44 | }
|
45 | _validateTaskName(taskName);
|
46 | return ExpoTaskManager.getTaskOptionsAsync(taskName);
|
47 | }
|
48 | export async function getRegisteredTasksAsync() {
|
49 | if (!ExpoTaskManager.getRegisteredTasksAsync) {
|
50 | throw new UnavailabilityError('TaskManager', 'getRegisteredTasksAsync');
|
51 | }
|
52 | return ExpoTaskManager.getRegisteredTasksAsync();
|
53 | }
|
54 | export async function unregisterTaskAsync(taskName) {
|
55 | if (!ExpoTaskManager.unregisterTaskAsync) {
|
56 | throw new UnavailabilityError('TaskManager', 'unregisterTaskAsync');
|
57 | }
|
58 | _validateTaskName(taskName);
|
59 | await ExpoTaskManager.unregisterTaskAsync(taskName);
|
60 | }
|
61 | export async function unregisterAllTasksAsync() {
|
62 | if (!ExpoTaskManager.unregisterAllTasksAsync) {
|
63 | throw new UnavailabilityError('TaskManager', 'unregisterAllTasksAsync');
|
64 | }
|
65 | await ExpoTaskManager.unregisterAllTasksAsync();
|
66 | }
|
67 | eventEmitter.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 |
|
74 | result = await task({ data, error, executionInfo });
|
75 | }
|
76 | catch (error) {
|
77 | console.error(`TaskManager: Task "${taskName}" failed:`, error);
|
78 | }
|
79 | finally {
|
80 |
|
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 |
|
87 | await ExpoTaskManager.notifyTaskFinishedAsync(taskName, { eventId, result });
|
88 |
|
89 |
|
90 | await ExpoTaskManager.unregisterTaskAsync(taskName);
|
91 | }
|
92 | });
|
93 |
|
94 |
|
95 | Promise.resolve().then(() => {
|
96 | isRunningDuringInitialization = false;
|
97 | });
|
98 |
|
\ | No newline at end of file |