import { invoke } from 'uni-core/service/bridge' import { onMethod, invokeMethod } from '../../platform' class UploadTask { constructor (uploadTaskId, callbackId) { this.id = uploadTaskId this._callbackId = callbackId this._callbacks = [] } abort () { invokeMethod('operateUploadTask', { uploadTaskId: this.id, operationType: 'abort' }) } onProgressUpdate (callback) { if (typeof callback !== 'function') { return } this._callbacks.push(callback) } onHeadersReceived () { } offProgressUpdate (callback) { const index = this._callbacks.indexOf(callback) if (index >= 0) { this._callbacks.splice(index, 1) } } offHeadersReceived () { } } const uploadTasks = Object.create(null) onMethod('onUploadTaskStateChange', ({ uploadTaskId, state, data, statusCode, progress, totalBytesSent, totalBytesExpectedToSend, errMsg }) => { const uploadTask = uploadTasks[uploadTaskId] const callbackId = uploadTask._callbackId switch (state) { case 'progressUpdate': uploadTask._callbacks.forEach(callback => { callback({ progress, totalBytesSent, totalBytesExpectedToSend }) }) break case 'success': invoke(callbackId, { data, statusCode, errMsg: 'request:ok' }) // eslint-disable-next-line no-fallthrough case 'fail': invoke(callbackId, { errMsg: 'request:fail ' + errMsg }) // eslint-disable-next-line no-fallthrough default: // progressUpdate 可能晚于 success setTimeout(() => { delete uploadTasks[uploadTaskId] }, 100) break } }) export function uploadFile (args, callbackId) { const { uploadTaskId } = invokeMethod('createUploadTask', args) const task = new UploadTask(uploadTaskId, callbackId) uploadTasks[uploadTaskId] = task return task }