mh-two-thousand-and-two
2024-04-12 3d2ec2fd0578d3ba0a414b0cc4e4a2ae60878596
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
import {
  hasOwn
} from 'uni-shared'
 
import {
  TEMP_PATH
} from '../constants'
 
import {
  publish
} from '../../bridge'
 
let downloadTaskId = 0
const downloadTasks = {}
 
const publishStateChange = (res) => {
  publish('onDownloadTaskStateChange', res)
}
 
const createDownloadTaskById = function (downloadTaskId, {
  url,
  header,
  timeout
} = {}) {
  timeout = (timeout || (__uniConfig.networkTimeout && __uniConfig.networkTimeout.request) || 60 * 1000) / 1000
  const downloader = plus.downloader.createDownload(url, {
    timeout,
    filename: TEMP_PATH + '/download/',
    // 需要与其它平台上的表现保持一致,不走重试的逻辑。
    retry: 0,
    retryInterval: 0
  }, (download, statusCode) => {
    if (statusCode) {
      publishStateChange({
        downloadTaskId,
        state: 'success',
        tempFilePath: download.filename,
        statusCode
      })
    } else {
      publishStateChange({
        downloadTaskId,
        state: 'fail',
        statusCode
      })
    }
  })
  for (const name in header) {
    if (hasOwn(header, name)) {
      downloader.setRequestHeader(name, header[name])
    }
  }
  downloader.addEventListener('statechanged', (download, status) => {
    if (download.downloadedSize && download.totalSize) {
      publishStateChange({
        downloadTaskId,
        state: 'progressUpdate',
        progress: parseInt(download.downloadedSize / download.totalSize * 100),
        totalBytesWritten: download.downloadedSize,
        totalBytesExpectedToWrite: download.totalSize
      })
    }
  })
  downloadTasks[downloadTaskId] = downloader
  downloader.start()
  return {
    downloadTaskId,
    errMsg: 'createDownloadTask:ok'
  }
}
 
export function operateDownloadTask ({
  downloadTaskId,
  operationType
} = {}) {
  const downloadTask = downloadTasks[downloadTaskId]
  if (downloadTask && operationType === 'abort') {
    delete downloadTasks[downloadTaskId]
    downloadTask.abort()
    publishStateChange({
      downloadTaskId,
      state: 'fail',
      errMsg: 'abort'
    })
    return {
      errMsg: 'operateDownloadTask:ok'
    }
  }
  return {
    errMsg: 'operateDownloadTask:fail'
  }
}
 
export function createDownloadTask (args) {
  return createDownloadTaskById(++downloadTaskId, args)
}