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) }