1 | import { isCancelError } from '../../../errors/CanceledError.mjs';
|
2 | import '../../../errors/types/validation.mjs';
|
3 | import '@aws-amplify/core/internals/utils';
|
4 | import { logger } from '../../../utils/logger.mjs';
|
5 |
|
6 |
|
7 |
|
8 | const createCancellableTask = ({ job, onCancel, }) => {
|
9 | const state = 'IN_PROGRESS';
|
10 | let canceledErrorMessage;
|
11 | const cancelableTask = {
|
12 | cancel: (message) => {
|
13 | const { state: taskState } = cancelableTask;
|
14 | if (taskState === 'CANCELED' ||
|
15 | taskState === 'ERROR' ||
|
16 | taskState === 'SUCCESS') {
|
17 | logger.debug(`This task cannot be canceled. State: ${taskState}`);
|
18 | return;
|
19 | }
|
20 | cancelableTask.state = 'CANCELED';
|
21 | canceledErrorMessage = message;
|
22 | onCancel(canceledErrorMessage);
|
23 | },
|
24 | state,
|
25 | };
|
26 | const wrappedJobPromise = (async () => {
|
27 | try {
|
28 | const result = await job();
|
29 | cancelableTask.state = 'SUCCESS';
|
30 | return result;
|
31 | }
|
32 | catch (e) {
|
33 | if (isCancelError(e)) {
|
34 | cancelableTask.state = 'CANCELED';
|
35 | e.message = canceledErrorMessage ?? e.message;
|
36 | }
|
37 | cancelableTask.state = 'ERROR';
|
38 | throw e;
|
39 | }
|
40 | })();
|
41 | return Object.assign(cancelableTask, {
|
42 | result: wrappedJobPromise,
|
43 | });
|
44 | };
|
45 | const createDownloadTask = createCancellableTask;
|
46 | const createUploadTask = ({ job, onCancel, onResume, onPause, isMultipartUpload, }) => {
|
47 | const cancellableTask = createCancellableTask({
|
48 | job,
|
49 | onCancel,
|
50 | });
|
51 | const uploadTask = Object.assign(cancellableTask, {
|
52 | pause: () => {
|
53 | const { state } = uploadTask;
|
54 | if (!isMultipartUpload || state !== 'IN_PROGRESS') {
|
55 | logger.debug(`This task cannot be paused. State: ${state}`);
|
56 | return;
|
57 | }
|
58 |
|
59 |
|
60 |
|
61 | uploadTask.state = 'PAUSED';
|
62 | onPause?.();
|
63 | },
|
64 | resume: () => {
|
65 | const { state } = uploadTask;
|
66 | if (!isMultipartUpload || state !== 'PAUSED') {
|
67 | logger.debug(`This task cannot be resumed. State: ${state}`);
|
68 | return;
|
69 | }
|
70 |
|
71 |
|
72 |
|
73 | uploadTask.state = 'IN_PROGRESS';
|
74 | onResume?.();
|
75 | },
|
76 | });
|
77 | return uploadTask;
|
78 | };
|
79 |
|
80 | export { createDownloadTask, createUploadTask };
|
81 |
|