@capgo/capacitor-background-task 8.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,141 @@
1
+ import { registerPlugin } from '@capacitor/core';
2
+ import { BackgroundTaskResult, BackgroundTaskStatus } from './definitions';
3
+ const DEFAULT_TASK_NAME = 'CapgoBackgroundTask';
4
+ const NativeBackgroundTask = registerPlugin('BackgroundTask', {
5
+ web: () => import('./web').then((m) => new m.BackgroundTaskWeb()),
6
+ });
7
+ const callbacks = new Map();
8
+ const processedTaskIds = new Set();
9
+ let listenerReady;
10
+ let currentReactNativeTask;
11
+ const ensureListener = () => {
12
+ if (!listenerReady) {
13
+ listenerReady = NativeBackgroundTask.addListener('backgroundTask', (event) => {
14
+ void runTask(event);
15
+ }).then(() => undefined);
16
+ }
17
+ return listenerReady;
18
+ };
19
+ const drainPendingTaskRuns = async () => {
20
+ const { tasks } = await NativeBackgroundTask.getPendingTaskRuns();
21
+ await Promise.all(tasks.map((task) => runTask(task)));
22
+ };
23
+ const runTask = async (event) => {
24
+ if (processedTaskIds.has(event.taskId)) {
25
+ return;
26
+ }
27
+ const callback = callbacks.get(event.taskName);
28
+ if (!callback) {
29
+ return;
30
+ }
31
+ processedTaskIds.add(event.taskId);
32
+ try {
33
+ currentReactNativeTask = {
34
+ taskId: event.taskId,
35
+ taskName: event.taskName,
36
+ result: BackgroundTaskResult.Success,
37
+ };
38
+ const result = await callback(event);
39
+ await NativeBackgroundTask.finish({
40
+ taskId: event.taskId,
41
+ taskName: event.taskName,
42
+ result: result !== null && result !== void 0 ? result : BackgroundTaskResult.Success,
43
+ });
44
+ }
45
+ catch (_a) {
46
+ await NativeBackgroundTask.finish({
47
+ taskId: event.taskId,
48
+ taskName: event.taskName,
49
+ result: BackgroundTaskResult.Failed,
50
+ });
51
+ }
52
+ finally {
53
+ currentReactNativeTask = undefined;
54
+ }
55
+ };
56
+ const assertTaskName = (taskName) => {
57
+ if (!taskName || typeof taskName !== 'string') {
58
+ throw new Error('taskName is required');
59
+ }
60
+ };
61
+ const normalizeReactNativeOptions = (options) => {
62
+ var _a;
63
+ const period = (_a = options === null || options === void 0 ? void 0 : options.period) !== null && _a !== void 0 ? _a : 900;
64
+ return {
65
+ minimumInterval: Math.max(15, Math.ceil(period / 60)),
66
+ };
67
+ };
68
+ const BackgroundTask = {
69
+ defineTask(taskName, callback) {
70
+ assertTaskName(taskName);
71
+ callbacks.set(taskName, callback);
72
+ void ensureListener().then(drainPendingTaskRuns);
73
+ },
74
+ async registerTaskAsync(taskName, options) {
75
+ assertTaskName(taskName);
76
+ if (!callbacks.has(taskName)) {
77
+ throw new Error(`Task "${taskName}" must be defined before it is registered.`);
78
+ }
79
+ await NativeBackgroundTask.registerTask({ taskName, options });
80
+ await ensureListener();
81
+ await drainPendingTaskRuns();
82
+ },
83
+ async unregisterTaskAsync(taskName) {
84
+ assertTaskName(taskName);
85
+ await NativeBackgroundTask.unregisterTask({ taskName });
86
+ },
87
+ async isTaskRegisteredAsync(taskName) {
88
+ assertTaskName(taskName);
89
+ const { value } = await NativeBackgroundTask.isTaskRegistered({ taskName });
90
+ return value;
91
+ },
92
+ async getRegisteredTasksAsync() {
93
+ const { tasks } = await NativeBackgroundTask.getRegisteredTasks();
94
+ return tasks;
95
+ },
96
+ async getPendingTaskRunsAsync() {
97
+ const { tasks } = await NativeBackgroundTask.getPendingTaskRuns();
98
+ return tasks;
99
+ },
100
+ async getStatusAsync() {
101
+ const { status } = await NativeBackgroundTask.getStatus();
102
+ return status;
103
+ },
104
+ async triggerTaskWorkerForTestingAsync() {
105
+ await ensureListener();
106
+ const { value } = await NativeBackgroundTask.triggerTaskWorkerForTesting();
107
+ await drainPendingTaskRuns();
108
+ return value;
109
+ },
110
+ addExpirationListener(listener) {
111
+ return NativeBackgroundTask.addListener('expiration', listener);
112
+ },
113
+ define(callback) {
114
+ this.defineTask(DEFAULT_TASK_NAME, callback);
115
+ },
116
+ schedule(options) {
117
+ return this.registerTaskAsync(DEFAULT_TASK_NAME, normalizeReactNativeOptions(options));
118
+ },
119
+ cancel() {
120
+ return this.unregisterTaskAsync(DEFAULT_TASK_NAME);
121
+ },
122
+ async statusAsync() {
123
+ const status = await this.getStatusAsync();
124
+ if (status === BackgroundTaskStatus.Available) {
125
+ return { available: true };
126
+ }
127
+ return {
128
+ available: false,
129
+ unavailableReason: 'restricted',
130
+ };
131
+ },
132
+ async finish(result = BackgroundTaskResult.Success) {
133
+ if (!currentReactNativeTask) {
134
+ return;
135
+ }
136
+ await NativeBackgroundTask.finish(Object.assign(Object.assign({}, currentReactNativeTask), { result }));
137
+ },
138
+ };
139
+ export * from './definitions';
140
+ export { BackgroundTask, NativeBackgroundTask };
141
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAWjD,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAE3E,MAAM,iBAAiB,GAAG,qBAAqB,CAAC;AAEhD,MAAM,oBAAoB,GAAG,cAAc,CAA6B,gBAAgB,EAAE;IACxF,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,iBAAiB,EAAE,CAAC;CAClE,CAAC,CAAC;AAEH,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkC,CAAC;AAC5D,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAU,CAAC;AAC3C,IAAI,aAAwC,CAAC;AAC7C,IAAI,sBAAiD,CAAC;AAEtD,MAAM,cAAc,GAAG,GAAkB,EAAE;IACzC,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,aAAa,GAAG,oBAAoB,CAAC,WAAW,CAAC,gBAAgB,EAAE,CAAC,KAAK,EAAE,EAAE;YAC3E,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,KAAK,IAAmB,EAAE;IACrD,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,oBAAoB,CAAC,kBAAkB,EAAE,CAAC;IAClE,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACxD,CAAC,CAAC;AAEF,MAAM,OAAO,GAAG,KAAK,EAAE,KAA0B,EAAiB,EAAE;IAClE,IAAI,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QACvC,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC/C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO;IACT,CAAC;IAED,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAEnC,IAAI,CAAC;QACH,sBAAsB,GAAG;YACvB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,MAAM,EAAE,oBAAoB,CAAC,OAAO;SACrC,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC;QACrC,MAAM,oBAAoB,CAAC,MAAM,CAAC;YAChC,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,MAAM,EAAE,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,oBAAoB,CAAC,OAAO;SAC/C,CAAC,CAAC;IACL,CAAC;IAAC,WAAM,CAAC;QACP,MAAM,oBAAoB,CAAC,MAAM,CAAC;YAChC,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,MAAM,EAAE,oBAAoB,CAAC,MAAM;SACpC,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,sBAAsB,GAAG,SAAS,CAAC;IACrC,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,QAAgB,EAAQ,EAAE;IAChD,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,2BAA2B,GAAG,CAAC,OAA0C,EAAyB,EAAE;;IACxG,MAAM,MAAM,GAAG,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,mCAAI,GAAG,CAAC;IACtC,OAAO;QACL,eAAe,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;KACtD,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,cAAc,GAAyB;IAC3C,UAAU,CAAC,QAAQ,EAAE,QAAQ;QAC3B,cAAc,CAAC,QAAQ,CAAC,CAAC;QACzB,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAClC,KAAK,cAAc,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,QAAQ,EAAE,OAAO;QACvC,cAAc,CAAC,QAAQ,CAAC,CAAC;QACzB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,SAAS,QAAQ,4CAA4C,CAAC,CAAC;QACjF,CAAC;QACD,MAAM,oBAAoB,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QAC/D,MAAM,cAAc,EAAE,CAAC;QACvB,MAAM,oBAAoB,EAAE,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,QAAQ;QAChC,cAAc,CAAC,QAAQ,CAAC,CAAC;QACzB,MAAM,oBAAoB,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,QAAQ;QAClC,cAAc,CAAC,QAAQ,CAAC,CAAC;QACzB,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,oBAAoB,CAAC,gBAAgB,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC5E,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,uBAAuB;QAC3B,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,oBAAoB,CAAC,kBAAkB,EAAE,CAAC;QAClE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,uBAAuB;QAC3B,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,oBAAoB,CAAC,kBAAkB,EAAE,CAAC;QAClE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,oBAAoB,CAAC,SAAS,EAAE,CAAC;QAC1D,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,gCAAgC;QACpC,MAAM,cAAc,EAAE,CAAC;QACvB,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,oBAAoB,CAAC,2BAA2B,EAAE,CAAC;QAC3E,MAAM,oBAAoB,EAAE,CAAC;QAC7B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,qBAAqB,CAAC,QAAQ;QAC5B,OAAO,oBAAoB,CAAC,WAAW,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,CAAC,QAAQ;QACb,IAAI,CAAC,UAAU,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAED,QAAQ,CAAC,OAAO;QACd,OAAO,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,EAAE,2BAA2B,CAAC,OAAO,CAAC,CAAC,CAAC;IACzF,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,WAAW;QACf,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC3C,IAAI,MAAM,KAAK,oBAAoB,CAAC,SAAS,EAAE,CAAC;YAC9C,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAC7B,CAAC;QACD,OAAO;YACL,SAAS,EAAE,KAAK;YAChB,iBAAiB,EAAE,YAAY;SAChC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,oBAAoB,CAAC,OAAO;QAChD,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC5B,OAAO;QACT,CAAC;QAED,MAAM,oBAAoB,CAAC,MAAM,iCAC5B,sBAAsB,KACzB,MAAM,IACN,CAAC;IACL,CAAC;CACF,CAAC;AAEF,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,CAAC","sourcesContent":["import { registerPlugin } from '@capacitor/core';\n\nimport type {\n BackgroundTaskCallback,\n BackgroundTaskEvent,\n BackgroundTaskOptions,\n BackgroundTaskPlugin,\n FinishOptions,\n NativeBackgroundTaskPlugin,\n ReactNativeBackgroundTaskOptions,\n} from './definitions';\nimport { BackgroundTaskResult, BackgroundTaskStatus } from './definitions';\n\nconst DEFAULT_TASK_NAME = 'CapgoBackgroundTask';\n\nconst NativeBackgroundTask = registerPlugin<NativeBackgroundTaskPlugin>('BackgroundTask', {\n web: () => import('./web').then((m) => new m.BackgroundTaskWeb()),\n});\n\nconst callbacks = new Map<string, BackgroundTaskCallback>();\nconst processedTaskIds = new Set<string>();\nlet listenerReady: Promise<void> | undefined;\nlet currentReactNativeTask: FinishOptions | undefined;\n\nconst ensureListener = (): Promise<void> => {\n if (!listenerReady) {\n listenerReady = NativeBackgroundTask.addListener('backgroundTask', (event) => {\n void runTask(event);\n }).then(() => undefined);\n }\n return listenerReady;\n};\n\nconst drainPendingTaskRuns = async (): Promise<void> => {\n const { tasks } = await NativeBackgroundTask.getPendingTaskRuns();\n await Promise.all(tasks.map((task) => runTask(task)));\n};\n\nconst runTask = async (event: BackgroundTaskEvent): Promise<void> => {\n if (processedTaskIds.has(event.taskId)) {\n return;\n }\n\n const callback = callbacks.get(event.taskName);\n if (!callback) {\n return;\n }\n\n processedTaskIds.add(event.taskId);\n\n try {\n currentReactNativeTask = {\n taskId: event.taskId,\n taskName: event.taskName,\n result: BackgroundTaskResult.Success,\n };\n\n const result = await callback(event);\n await NativeBackgroundTask.finish({\n taskId: event.taskId,\n taskName: event.taskName,\n result: result ?? BackgroundTaskResult.Success,\n });\n } catch {\n await NativeBackgroundTask.finish({\n taskId: event.taskId,\n taskName: event.taskName,\n result: BackgroundTaskResult.Failed,\n });\n } finally {\n currentReactNativeTask = undefined;\n }\n};\n\nconst assertTaskName = (taskName: string): void => {\n if (!taskName || typeof taskName !== 'string') {\n throw new Error('taskName is required');\n }\n};\n\nconst normalizeReactNativeOptions = (options?: ReactNativeBackgroundTaskOptions): BackgroundTaskOptions => {\n const period = options?.period ?? 900;\n return {\n minimumInterval: Math.max(15, Math.ceil(period / 60)),\n };\n};\n\nconst BackgroundTask: BackgroundTaskPlugin = {\n defineTask(taskName, callback) {\n assertTaskName(taskName);\n callbacks.set(taskName, callback);\n void ensureListener().then(drainPendingTaskRuns);\n },\n\n async registerTaskAsync(taskName, options) {\n assertTaskName(taskName);\n if (!callbacks.has(taskName)) {\n throw new Error(`Task \"${taskName}\" must be defined before it is registered.`);\n }\n await NativeBackgroundTask.registerTask({ taskName, options });\n await ensureListener();\n await drainPendingTaskRuns();\n },\n\n async unregisterTaskAsync(taskName) {\n assertTaskName(taskName);\n await NativeBackgroundTask.unregisterTask({ taskName });\n },\n\n async isTaskRegisteredAsync(taskName) {\n assertTaskName(taskName);\n const { value } = await NativeBackgroundTask.isTaskRegistered({ taskName });\n return value;\n },\n\n async getRegisteredTasksAsync() {\n const { tasks } = await NativeBackgroundTask.getRegisteredTasks();\n return tasks;\n },\n\n async getPendingTaskRunsAsync() {\n const { tasks } = await NativeBackgroundTask.getPendingTaskRuns();\n return tasks;\n },\n\n async getStatusAsync() {\n const { status } = await NativeBackgroundTask.getStatus();\n return status;\n },\n\n async triggerTaskWorkerForTestingAsync() {\n await ensureListener();\n const { value } = await NativeBackgroundTask.triggerTaskWorkerForTesting();\n await drainPendingTaskRuns();\n return value;\n },\n\n addExpirationListener(listener) {\n return NativeBackgroundTask.addListener('expiration', listener);\n },\n\n define(callback) {\n this.defineTask(DEFAULT_TASK_NAME, callback);\n },\n\n schedule(options) {\n return this.registerTaskAsync(DEFAULT_TASK_NAME, normalizeReactNativeOptions(options));\n },\n\n cancel() {\n return this.unregisterTaskAsync(DEFAULT_TASK_NAME);\n },\n\n async statusAsync() {\n const status = await this.getStatusAsync();\n if (status === BackgroundTaskStatus.Available) {\n return { available: true };\n }\n return {\n available: false,\n unavailableReason: 'restricted',\n };\n },\n\n async finish(result = BackgroundTaskResult.Success) {\n if (!currentReactNativeTask) {\n return;\n }\n\n await NativeBackgroundTask.finish({\n ...currentReactNativeTask,\n result,\n });\n },\n};\n\nexport * from './definitions';\nexport { BackgroundTask, NativeBackgroundTask };\n"]}
@@ -0,0 +1,13 @@
1
+ import { WebPlugin } from '@capacitor/core';
2
+ import type { BooleanResult, GetStatusResult, NativeBackgroundTaskPlugin, PendingTaskRunsResult, RegisteredTasksResult, RegisterTaskOptions, TaskNameOptions } from './definitions';
3
+ export declare class BackgroundTaskWeb extends WebPlugin implements NativeBackgroundTaskPlugin {
4
+ private readonly registeredTasks;
5
+ registerTask(options: RegisterTaskOptions): Promise<void>;
6
+ unregisterTask(options: TaskNameOptions): Promise<void>;
7
+ isTaskRegistered(options: TaskNameOptions): Promise<BooleanResult>;
8
+ getRegisteredTasks(): Promise<RegisteredTasksResult>;
9
+ getPendingTaskRuns(): Promise<PendingTaskRunsResult>;
10
+ getStatus(): Promise<GetStatusResult>;
11
+ triggerTaskWorkerForTesting(): Promise<BooleanResult>;
12
+ finish(): Promise<void>;
13
+ }
@@ -0,0 +1,52 @@
1
+ import { WebPlugin } from '@capacitor/core';
2
+ import { BackgroundTaskStatus } from './definitions';
3
+ export class BackgroundTaskWeb extends WebPlugin {
4
+ constructor() {
5
+ super(...arguments);
6
+ this.registeredTasks = new Map();
7
+ }
8
+ async registerTask(options) {
9
+ this.registeredTasks.set(options.taskName, options);
10
+ }
11
+ async unregisterTask(options) {
12
+ this.registeredTasks.delete(options.taskName);
13
+ }
14
+ async isTaskRegistered(options) {
15
+ return {
16
+ value: this.registeredTasks.has(options.taskName),
17
+ };
18
+ }
19
+ async getRegisteredTasks() {
20
+ return {
21
+ tasks: [...this.registeredTasks.keys()],
22
+ };
23
+ }
24
+ async getPendingTaskRuns() {
25
+ return {
26
+ tasks: [],
27
+ };
28
+ }
29
+ async getStatus() {
30
+ return {
31
+ status: BackgroundTaskStatus.Restricted,
32
+ };
33
+ }
34
+ async triggerTaskWorkerForTesting() {
35
+ const timestamp = Date.now();
36
+ for (const taskName of this.registeredTasks.keys()) {
37
+ void this.notifyListeners('backgroundTask', {
38
+ taskName,
39
+ taskId: `${taskName}:${timestamp}`,
40
+ timestamp,
41
+ test: true,
42
+ });
43
+ }
44
+ return {
45
+ value: this.registeredTasks.size > 0,
46
+ };
47
+ }
48
+ async finish() {
49
+ return;
50
+ }
51
+ }
52
+ //# sourceMappingURL=web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAW5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAErD,MAAM,OAAO,iBAAkB,SAAQ,SAAS;IAAhD;;QACmB,oBAAe,GAAG,IAAI,GAAG,EAA+B,CAAC;IAsD5E,CAAC;IApDC,KAAK,CAAC,YAAY,CAAC,OAA4B;QAC7C,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,OAAwB;QAC3C,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,OAAwB;QAC7C,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC;SAClD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,kBAAkB;QACtB,OAAO;YACL,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;SACxC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,kBAAkB;QACtB,OAAO;YACL,KAAK,EAAE,EAAE;SACV,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,SAAS;QACb,OAAO;YACL,MAAM,EAAE,oBAAoB,CAAC,UAAU;SACxC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,2BAA2B;QAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC;YACnD,KAAK,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE;gBAC1C,QAAQ;gBACR,MAAM,EAAE,GAAG,QAAQ,IAAI,SAAS,EAAE;gBAClC,SAAS;gBACT,IAAI,EAAE,IAAI;aACX,CAAC,CAAC;QACL,CAAC;QAED,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,GAAG,CAAC;SACrC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,MAAM;QACV,OAAO;IACT,CAAC;CACF","sourcesContent":["import { WebPlugin } from '@capacitor/core';\n\nimport type {\n BooleanResult,\n GetStatusResult,\n NativeBackgroundTaskPlugin,\n PendingTaskRunsResult,\n RegisteredTasksResult,\n RegisterTaskOptions,\n TaskNameOptions,\n} from './definitions';\nimport { BackgroundTaskStatus } from './definitions';\n\nexport class BackgroundTaskWeb extends WebPlugin implements NativeBackgroundTaskPlugin {\n private readonly registeredTasks = new Map<string, RegisterTaskOptions>();\n\n async registerTask(options: RegisterTaskOptions): Promise<void> {\n this.registeredTasks.set(options.taskName, options);\n }\n\n async unregisterTask(options: TaskNameOptions): Promise<void> {\n this.registeredTasks.delete(options.taskName);\n }\n\n async isTaskRegistered(options: TaskNameOptions): Promise<BooleanResult> {\n return {\n value: this.registeredTasks.has(options.taskName),\n };\n }\n\n async getRegisteredTasks(): Promise<RegisteredTasksResult> {\n return {\n tasks: [...this.registeredTasks.keys()],\n };\n }\n\n async getPendingTaskRuns(): Promise<PendingTaskRunsResult> {\n return {\n tasks: [],\n };\n }\n\n async getStatus(): Promise<GetStatusResult> {\n return {\n status: BackgroundTaskStatus.Restricted,\n };\n }\n\n async triggerTaskWorkerForTesting(): Promise<BooleanResult> {\n const timestamp = Date.now();\n\n for (const taskName of this.registeredTasks.keys()) {\n void this.notifyListeners('backgroundTask', {\n taskName,\n taskId: `${taskName}:${timestamp}`,\n timestamp,\n test: true,\n });\n }\n\n return {\n value: this.registeredTasks.size > 0,\n };\n }\n\n async finish(): Promise<void> {\n return;\n }\n}\n"]}
@@ -0,0 +1,228 @@
1
+ 'use strict';
2
+
3
+ var core = require('@capacitor/core');
4
+
5
+ /**
6
+ * Return value for a background task callback.
7
+ */
8
+ exports.BackgroundTaskResult = void 0;
9
+ (function (BackgroundTaskResult) {
10
+ /**
11
+ * The task finished successfully.
12
+ */
13
+ BackgroundTaskResult[BackgroundTaskResult["Success"] = 1] = "Success";
14
+ /**
15
+ * The task failed.
16
+ */
17
+ BackgroundTaskResult[BackgroundTaskResult["Failed"] = 2] = "Failed";
18
+ })(exports.BackgroundTaskResult || (exports.BackgroundTaskResult = {}));
19
+ /**
20
+ * Availability status for background task scheduling.
21
+ */
22
+ exports.BackgroundTaskStatus = void 0;
23
+ (function (BackgroundTaskStatus) {
24
+ /**
25
+ * Background task scheduling is unavailable or restricted.
26
+ */
27
+ BackgroundTaskStatus[BackgroundTaskStatus["Restricted"] = 1] = "Restricted";
28
+ /**
29
+ * Background task scheduling is available.
30
+ */
31
+ BackgroundTaskStatus[BackgroundTaskStatus["Available"] = 2] = "Available";
32
+ })(exports.BackgroundTaskStatus || (exports.BackgroundTaskStatus = {}));
33
+
34
+ const DEFAULT_TASK_NAME = 'CapgoBackgroundTask';
35
+ const NativeBackgroundTask = core.registerPlugin('BackgroundTask', {
36
+ web: () => Promise.resolve().then(function () { return web; }).then((m) => new m.BackgroundTaskWeb()),
37
+ });
38
+ const callbacks = new Map();
39
+ const processedTaskIds = new Set();
40
+ let listenerReady;
41
+ let currentReactNativeTask;
42
+ const ensureListener = () => {
43
+ if (!listenerReady) {
44
+ listenerReady = NativeBackgroundTask.addListener('backgroundTask', (event) => {
45
+ void runTask(event);
46
+ }).then(() => undefined);
47
+ }
48
+ return listenerReady;
49
+ };
50
+ const drainPendingTaskRuns = async () => {
51
+ const { tasks } = await NativeBackgroundTask.getPendingTaskRuns();
52
+ await Promise.all(tasks.map((task) => runTask(task)));
53
+ };
54
+ const runTask = async (event) => {
55
+ if (processedTaskIds.has(event.taskId)) {
56
+ return;
57
+ }
58
+ const callback = callbacks.get(event.taskName);
59
+ if (!callback) {
60
+ return;
61
+ }
62
+ processedTaskIds.add(event.taskId);
63
+ try {
64
+ currentReactNativeTask = {
65
+ taskId: event.taskId,
66
+ taskName: event.taskName,
67
+ result: exports.BackgroundTaskResult.Success,
68
+ };
69
+ const result = await callback(event);
70
+ await NativeBackgroundTask.finish({
71
+ taskId: event.taskId,
72
+ taskName: event.taskName,
73
+ result: result !== null && result !== void 0 ? result : exports.BackgroundTaskResult.Success,
74
+ });
75
+ }
76
+ catch (_a) {
77
+ await NativeBackgroundTask.finish({
78
+ taskId: event.taskId,
79
+ taskName: event.taskName,
80
+ result: exports.BackgroundTaskResult.Failed,
81
+ });
82
+ }
83
+ finally {
84
+ currentReactNativeTask = undefined;
85
+ }
86
+ };
87
+ const assertTaskName = (taskName) => {
88
+ if (!taskName || typeof taskName !== 'string') {
89
+ throw new Error('taskName is required');
90
+ }
91
+ };
92
+ const normalizeReactNativeOptions = (options) => {
93
+ var _a;
94
+ const period = (_a = options === null || options === void 0 ? void 0 : options.period) !== null && _a !== void 0 ? _a : 900;
95
+ return {
96
+ minimumInterval: Math.max(15, Math.ceil(period / 60)),
97
+ };
98
+ };
99
+ const BackgroundTask = {
100
+ defineTask(taskName, callback) {
101
+ assertTaskName(taskName);
102
+ callbacks.set(taskName, callback);
103
+ void ensureListener().then(drainPendingTaskRuns);
104
+ },
105
+ async registerTaskAsync(taskName, options) {
106
+ assertTaskName(taskName);
107
+ if (!callbacks.has(taskName)) {
108
+ throw new Error(`Task "${taskName}" must be defined before it is registered.`);
109
+ }
110
+ await NativeBackgroundTask.registerTask({ taskName, options });
111
+ await ensureListener();
112
+ await drainPendingTaskRuns();
113
+ },
114
+ async unregisterTaskAsync(taskName) {
115
+ assertTaskName(taskName);
116
+ await NativeBackgroundTask.unregisterTask({ taskName });
117
+ },
118
+ async isTaskRegisteredAsync(taskName) {
119
+ assertTaskName(taskName);
120
+ const { value } = await NativeBackgroundTask.isTaskRegistered({ taskName });
121
+ return value;
122
+ },
123
+ async getRegisteredTasksAsync() {
124
+ const { tasks } = await NativeBackgroundTask.getRegisteredTasks();
125
+ return tasks;
126
+ },
127
+ async getPendingTaskRunsAsync() {
128
+ const { tasks } = await NativeBackgroundTask.getPendingTaskRuns();
129
+ return tasks;
130
+ },
131
+ async getStatusAsync() {
132
+ const { status } = await NativeBackgroundTask.getStatus();
133
+ return status;
134
+ },
135
+ async triggerTaskWorkerForTestingAsync() {
136
+ await ensureListener();
137
+ const { value } = await NativeBackgroundTask.triggerTaskWorkerForTesting();
138
+ await drainPendingTaskRuns();
139
+ return value;
140
+ },
141
+ addExpirationListener(listener) {
142
+ return NativeBackgroundTask.addListener('expiration', listener);
143
+ },
144
+ define(callback) {
145
+ this.defineTask(DEFAULT_TASK_NAME, callback);
146
+ },
147
+ schedule(options) {
148
+ return this.registerTaskAsync(DEFAULT_TASK_NAME, normalizeReactNativeOptions(options));
149
+ },
150
+ cancel() {
151
+ return this.unregisterTaskAsync(DEFAULT_TASK_NAME);
152
+ },
153
+ async statusAsync() {
154
+ const status = await this.getStatusAsync();
155
+ if (status === exports.BackgroundTaskStatus.Available) {
156
+ return { available: true };
157
+ }
158
+ return {
159
+ available: false,
160
+ unavailableReason: 'restricted',
161
+ };
162
+ },
163
+ async finish(result = exports.BackgroundTaskResult.Success) {
164
+ if (!currentReactNativeTask) {
165
+ return;
166
+ }
167
+ await NativeBackgroundTask.finish(Object.assign(Object.assign({}, currentReactNativeTask), { result }));
168
+ },
169
+ };
170
+
171
+ class BackgroundTaskWeb extends core.WebPlugin {
172
+ constructor() {
173
+ super(...arguments);
174
+ this.registeredTasks = new Map();
175
+ }
176
+ async registerTask(options) {
177
+ this.registeredTasks.set(options.taskName, options);
178
+ }
179
+ async unregisterTask(options) {
180
+ this.registeredTasks.delete(options.taskName);
181
+ }
182
+ async isTaskRegistered(options) {
183
+ return {
184
+ value: this.registeredTasks.has(options.taskName),
185
+ };
186
+ }
187
+ async getRegisteredTasks() {
188
+ return {
189
+ tasks: [...this.registeredTasks.keys()],
190
+ };
191
+ }
192
+ async getPendingTaskRuns() {
193
+ return {
194
+ tasks: [],
195
+ };
196
+ }
197
+ async getStatus() {
198
+ return {
199
+ status: exports.BackgroundTaskStatus.Restricted,
200
+ };
201
+ }
202
+ async triggerTaskWorkerForTesting() {
203
+ const timestamp = Date.now();
204
+ for (const taskName of this.registeredTasks.keys()) {
205
+ void this.notifyListeners('backgroundTask', {
206
+ taskName,
207
+ taskId: `${taskName}:${timestamp}`,
208
+ timestamp,
209
+ test: true,
210
+ });
211
+ }
212
+ return {
213
+ value: this.registeredTasks.size > 0,
214
+ };
215
+ }
216
+ async finish() {
217
+ return;
218
+ }
219
+ }
220
+
221
+ var web = /*#__PURE__*/Object.freeze({
222
+ __proto__: null,
223
+ BackgroundTaskWeb: BackgroundTaskWeb
224
+ });
225
+
226
+ exports.BackgroundTask = BackgroundTask;
227
+ exports.NativeBackgroundTask = NativeBackgroundTask;
228
+ //# sourceMappingURL=plugin.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.cjs.js","sources":["esm/definitions.js","esm/index.js","esm/web.js"],"sourcesContent":["/**\n * Return value for a background task callback.\n */\nexport var BackgroundTaskResult;\n(function (BackgroundTaskResult) {\n /**\n * The task finished successfully.\n */\n BackgroundTaskResult[BackgroundTaskResult[\"Success\"] = 1] = \"Success\";\n /**\n * The task failed.\n */\n BackgroundTaskResult[BackgroundTaskResult[\"Failed\"] = 2] = \"Failed\";\n})(BackgroundTaskResult || (BackgroundTaskResult = {}));\n/**\n * Availability status for background task scheduling.\n */\nexport var BackgroundTaskStatus;\n(function (BackgroundTaskStatus) {\n /**\n * Background task scheduling is unavailable or restricted.\n */\n BackgroundTaskStatus[BackgroundTaskStatus[\"Restricted\"] = 1] = \"Restricted\";\n /**\n * Background task scheduling is available.\n */\n BackgroundTaskStatus[BackgroundTaskStatus[\"Available\"] = 2] = \"Available\";\n})(BackgroundTaskStatus || (BackgroundTaskStatus = {}));\n//# sourceMappingURL=definitions.js.map","import { registerPlugin } from '@capacitor/core';\nimport { BackgroundTaskResult, BackgroundTaskStatus } from './definitions';\nconst DEFAULT_TASK_NAME = 'CapgoBackgroundTask';\nconst NativeBackgroundTask = registerPlugin('BackgroundTask', {\n web: () => import('./web').then((m) => new m.BackgroundTaskWeb()),\n});\nconst callbacks = new Map();\nconst processedTaskIds = new Set();\nlet listenerReady;\nlet currentReactNativeTask;\nconst ensureListener = () => {\n if (!listenerReady) {\n listenerReady = NativeBackgroundTask.addListener('backgroundTask', (event) => {\n void runTask(event);\n }).then(() => undefined);\n }\n return listenerReady;\n};\nconst drainPendingTaskRuns = async () => {\n const { tasks } = await NativeBackgroundTask.getPendingTaskRuns();\n await Promise.all(tasks.map((task) => runTask(task)));\n};\nconst runTask = async (event) => {\n if (processedTaskIds.has(event.taskId)) {\n return;\n }\n const callback = callbacks.get(event.taskName);\n if (!callback) {\n return;\n }\n processedTaskIds.add(event.taskId);\n try {\n currentReactNativeTask = {\n taskId: event.taskId,\n taskName: event.taskName,\n result: BackgroundTaskResult.Success,\n };\n const result = await callback(event);\n await NativeBackgroundTask.finish({\n taskId: event.taskId,\n taskName: event.taskName,\n result: result !== null && result !== void 0 ? result : BackgroundTaskResult.Success,\n });\n }\n catch (_a) {\n await NativeBackgroundTask.finish({\n taskId: event.taskId,\n taskName: event.taskName,\n result: BackgroundTaskResult.Failed,\n });\n }\n finally {\n currentReactNativeTask = undefined;\n }\n};\nconst assertTaskName = (taskName) => {\n if (!taskName || typeof taskName !== 'string') {\n throw new Error('taskName is required');\n }\n};\nconst normalizeReactNativeOptions = (options) => {\n var _a;\n const period = (_a = options === null || options === void 0 ? void 0 : options.period) !== null && _a !== void 0 ? _a : 900;\n return {\n minimumInterval: Math.max(15, Math.ceil(period / 60)),\n };\n};\nconst BackgroundTask = {\n defineTask(taskName, callback) {\n assertTaskName(taskName);\n callbacks.set(taskName, callback);\n void ensureListener().then(drainPendingTaskRuns);\n },\n async registerTaskAsync(taskName, options) {\n assertTaskName(taskName);\n if (!callbacks.has(taskName)) {\n throw new Error(`Task \"${taskName}\" must be defined before it is registered.`);\n }\n await NativeBackgroundTask.registerTask({ taskName, options });\n await ensureListener();\n await drainPendingTaskRuns();\n },\n async unregisterTaskAsync(taskName) {\n assertTaskName(taskName);\n await NativeBackgroundTask.unregisterTask({ taskName });\n },\n async isTaskRegisteredAsync(taskName) {\n assertTaskName(taskName);\n const { value } = await NativeBackgroundTask.isTaskRegistered({ taskName });\n return value;\n },\n async getRegisteredTasksAsync() {\n const { tasks } = await NativeBackgroundTask.getRegisteredTasks();\n return tasks;\n },\n async getPendingTaskRunsAsync() {\n const { tasks } = await NativeBackgroundTask.getPendingTaskRuns();\n return tasks;\n },\n async getStatusAsync() {\n const { status } = await NativeBackgroundTask.getStatus();\n return status;\n },\n async triggerTaskWorkerForTestingAsync() {\n await ensureListener();\n const { value } = await NativeBackgroundTask.triggerTaskWorkerForTesting();\n await drainPendingTaskRuns();\n return value;\n },\n addExpirationListener(listener) {\n return NativeBackgroundTask.addListener('expiration', listener);\n },\n define(callback) {\n this.defineTask(DEFAULT_TASK_NAME, callback);\n },\n schedule(options) {\n return this.registerTaskAsync(DEFAULT_TASK_NAME, normalizeReactNativeOptions(options));\n },\n cancel() {\n return this.unregisterTaskAsync(DEFAULT_TASK_NAME);\n },\n async statusAsync() {\n const status = await this.getStatusAsync();\n if (status === BackgroundTaskStatus.Available) {\n return { available: true };\n }\n return {\n available: false,\n unavailableReason: 'restricted',\n };\n },\n async finish(result = BackgroundTaskResult.Success) {\n if (!currentReactNativeTask) {\n return;\n }\n await NativeBackgroundTask.finish(Object.assign(Object.assign({}, currentReactNativeTask), { result }));\n },\n};\nexport * from './definitions';\nexport { BackgroundTask, NativeBackgroundTask };\n//# sourceMappingURL=index.js.map","import { WebPlugin } from '@capacitor/core';\nimport { BackgroundTaskStatus } from './definitions';\nexport class BackgroundTaskWeb extends WebPlugin {\n constructor() {\n super(...arguments);\n this.registeredTasks = new Map();\n }\n async registerTask(options) {\n this.registeredTasks.set(options.taskName, options);\n }\n async unregisterTask(options) {\n this.registeredTasks.delete(options.taskName);\n }\n async isTaskRegistered(options) {\n return {\n value: this.registeredTasks.has(options.taskName),\n };\n }\n async getRegisteredTasks() {\n return {\n tasks: [...this.registeredTasks.keys()],\n };\n }\n async getPendingTaskRuns() {\n return {\n tasks: [],\n };\n }\n async getStatus() {\n return {\n status: BackgroundTaskStatus.Restricted,\n };\n }\n async triggerTaskWorkerForTesting() {\n const timestamp = Date.now();\n for (const taskName of this.registeredTasks.keys()) {\n void this.notifyListeners('backgroundTask', {\n taskName,\n taskId: `${taskName}:${timestamp}`,\n timestamp,\n test: true,\n });\n }\n return {\n value: this.registeredTasks.size > 0,\n };\n }\n async finish() {\n return;\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["BackgroundTaskResult","BackgroundTaskStatus","registerPlugin","WebPlugin"],"mappings":"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"}