|
|
|
@ -234,14 +234,12 @@ angular.module('izhukov.mtproto.wrapper', ['izhukov.utils', 'izhukov.mtproto'])
|
|
|
|
|
|
|
|
|
|
var cachedFs = false; |
|
|
|
|
var cachedFsPromise = false; |
|
|
|
|
var apiUploadPromise = $q.when(); |
|
|
|
|
var cachedSavePromises = {}; |
|
|
|
|
var cachedDownloadPromises = {}; |
|
|
|
|
var cachedDownloads = {}; |
|
|
|
|
|
|
|
|
|
var downloadPulls = {}; |
|
|
|
|
var downloadActives = {}; |
|
|
|
|
var downloadLimit = 5; |
|
|
|
|
|
|
|
|
|
function downloadRequest(dcID, cb, activeDelta) { |
|
|
|
|
if (downloadPulls[dcID] === undefined) { |
|
|
|
@ -251,7 +249,9 @@ angular.module('izhukov.mtproto.wrapper', ['izhukov.utils', 'izhukov.mtproto'])
|
|
|
|
|
var downloadPull = downloadPulls[dcID]; |
|
|
|
|
var deferred = $q.defer(); |
|
|
|
|
downloadPull.push({cb: cb, deferred: deferred, activeDelta: activeDelta}); |
|
|
|
|
downloadCheck(dcID); |
|
|
|
|
setZeroTimeout(function () { |
|
|
|
|
downloadCheck(dcID); |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
return deferred.promise; |
|
|
|
|
}; |
|
|
|
@ -260,6 +260,7 @@ angular.module('izhukov.mtproto.wrapper', ['izhukov.utils', 'izhukov.mtproto'])
|
|
|
|
|
|
|
|
|
|
function downloadCheck(dcID) { |
|
|
|
|
var downloadPull = downloadPulls[dcID]; |
|
|
|
|
var downloadLimit = dcID == 'upload' ? 17 : 5; |
|
|
|
|
|
|
|
|
|
if (downloadActives[dcID] >= downloadLimit || !downloadPull || !downloadPull.length) { |
|
|
|
|
return false; |
|
|
|
@ -507,15 +508,23 @@ angular.module('izhukov.mtproto.wrapper', ['izhukov.utils', 'izhukov.mtproto'])
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function uploadFile (file) { |
|
|
|
|
var fileSize = file.size, |
|
|
|
|
// partSize = fileSize > 102400 ? 65536 : 4096,
|
|
|
|
|
// partSize = fileSize > 102400 ? 524288 : 4096,
|
|
|
|
|
partSize = fileSize > 102400 ? 524288 : 32768, |
|
|
|
|
isBigFile = fileSize >= 10485760, |
|
|
|
|
totalParts = Math.ceil(fileSize / partSize), |
|
|
|
|
canceled = false, |
|
|
|
|
resolved = false, |
|
|
|
|
doneParts = 0; |
|
|
|
|
var fileSize = file.size, |
|
|
|
|
isBigFile = fileSize >= 10485760, |
|
|
|
|
canceled = false, |
|
|
|
|
resolved = false, |
|
|
|
|
doneParts = 0, |
|
|
|
|
partSize = 262144, // 256 Kb
|
|
|
|
|
activeDelta = 2; |
|
|
|
|
|
|
|
|
|
if (fileSize > 67108864) { |
|
|
|
|
partSize = 524288; |
|
|
|
|
activeDelta = 4; |
|
|
|
|
} |
|
|
|
|
else if (fileSize < 102400) { |
|
|
|
|
partSize = 32768; |
|
|
|
|
activeDelta = 1; |
|
|
|
|
} |
|
|
|
|
var totalParts = Math.ceil(fileSize / partSize); |
|
|
|
|
|
|
|
|
|
if (totalParts > 1500) { |
|
|
|
|
return $q.reject({type: 'FILE_TOO_BIG'}); |
|
|
|
@ -526,6 +535,7 @@ angular.module('izhukov.mtproto.wrapper', ['izhukov.utils', 'izhukov.mtproto'])
|
|
|
|
|
errorHandler = function (error) { |
|
|
|
|
// console.error('Up Error', error);
|
|
|
|
|
deferred.reject(error); |
|
|
|
|
canceled = true; |
|
|
|
|
errorHandler = angular.noop; |
|
|
|
|
}, |
|
|
|
|
part = 0, |
|
|
|
@ -539,35 +549,34 @@ angular.module('izhukov.mtproto.wrapper', ['izhukov.utils', 'izhukov.mtproto'])
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var fileReadPromise = $q.when(); |
|
|
|
|
|
|
|
|
|
for (offset = 0; offset < fileSize; offset += partSize) { |
|
|
|
|
(function (offset, part) { |
|
|
|
|
fileReadPromise = fileReadPromise.then(function () { |
|
|
|
|
var fileReadDeferred = $q.defer(); |
|
|
|
|
downloadRequest('upload', function () { |
|
|
|
|
var uploadDeferred = $q.defer(); |
|
|
|
|
|
|
|
|
|
var reader = new FileReader(); |
|
|
|
|
var blob = file.slice(offset, offset + partSize); |
|
|
|
|
|
|
|
|
|
reader.onloadend = function (e) { |
|
|
|
|
if (canceled || e.target.readyState != FileReader.DONE) { |
|
|
|
|
if (canceled) { |
|
|
|
|
uploadDeferred.reject(); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
var apiCurPromise = apiUploadPromise = apiUploadPromise.then(function () { |
|
|
|
|
return MtpApiManager.invokeApi(isBigFile ? 'upload.saveBigFilePart' : 'upload.saveFilePart', { |
|
|
|
|
file_id: fileID, |
|
|
|
|
file_part: part, |
|
|
|
|
file_total_parts: totalParts, |
|
|
|
|
bytes: e.target.result |
|
|
|
|
}, { |
|
|
|
|
startMaxLength: partSize + 256, |
|
|
|
|
fileUpload: true |
|
|
|
|
}); |
|
|
|
|
}, errorHandler); |
|
|
|
|
|
|
|
|
|
apiCurPromise.then(function (result) { |
|
|
|
|
if (e.target.readyState != FileReader.DONE) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
MtpApiManager.invokeApi(isBigFile ? 'upload.saveBigFilePart' : 'upload.saveFilePart', { |
|
|
|
|
file_id: fileID, |
|
|
|
|
file_part: part, |
|
|
|
|
file_total_parts: totalParts, |
|
|
|
|
bytes: e.target.result |
|
|
|
|
}, { |
|
|
|
|
startMaxLength: partSize + 256, |
|
|
|
|
fileUpload: true, |
|
|
|
|
singleInRequest: true |
|
|
|
|
}).then(function (result) { |
|
|
|
|
doneParts++; |
|
|
|
|
fileReadDeferred.resolve(); |
|
|
|
|
uploadDeferred.resolve(); |
|
|
|
|
if (doneParts >= totalParts) { |
|
|
|
|
deferred.resolve(resultInputFile); |
|
|
|
|
resolved = true; |
|
|
|
@ -580,8 +589,8 @@ angular.module('izhukov.mtproto.wrapper', ['izhukov.utils', 'izhukov.mtproto'])
|
|
|
|
|
|
|
|
|
|
reader.readAsArrayBuffer(blob); |
|
|
|
|
|
|
|
|
|
return fileReadDeferred.promise; |
|
|
|
|
}); |
|
|
|
|
return uploadDeferred.promise; |
|
|
|
|
}, activeDelta); |
|
|
|
|
})(offset, part++); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|