jiocloud-node
Version:
sdk for ril jiocloud
101 lines (87 loc) • 2.91 kB
JavaScript
const axios = require('axios');
const context = require("../context");
const GetTransactionId = require("../util/getTransactionId");
const fs = require("fs");
const crypto = require("crypto");
const getJioHeaders = require('../util/getJioHeaders');
class UploadFile {
async generateMD5(filePath) {
return new Promise((resolve, reject) => {
const hash = crypto.createHash('md5');
const stream = fs.createReadStream(filePath);
stream.on('data', (data) => hash.update(data));
stream.on('end', () => resolve(hash.digest('hex')));
stream.on('error', (err) => reject(err));
});
}
checkFileExists(filePath) {
if (fs.existsSync(filePath)) {
console.log("File exists.");
return true;
} else {
console.log("Doesn't exist");
return false;
}
}
async upload(filePath) {
if (!this.checkFileExists(filePath)) {
console.error("File does not exist:", filePath);
return 1;
}
const headers = getJioHeaders({
'x-session-id': context.loginInfo.sessionId,
'authorization': 'Basic ' + Buffer.from(context.authToken.accessToken, 'utf-8').toString('base64'),
'x-device-key': context.loginInfo.deviceKey,
'X-User-Id': context.userId,
});
let offset = 0;
let chunkSize = 2 * 1024 * 1024;
let partNumber = 1;
const transDetails = await new GetTransactionId().getTransactionId(filePath);
if (transDetails?.url) {
return transDetails.url;
}
const uploadId = transDetails.transactionId;
const uploadUrl = `https://jaws-upload.jiocloud.com/upload/files/chunked?uploadId=${uploadId}`;
const fileSize = fs.statSync(filePath).size;
const file = fs.openSync(filePath, "r");
let objectKey = null;
while (!objectKey && offset < fileSize) {
const actualChunkSize = Math.min(chunkSize, fileSize - offset);
const buffer = Buffer.alloc(actualChunkSize);
fs.readSync(file, buffer, 0, actualChunkSize, offset);
const md5 = crypto.createHash("md5").update(buffer).digest("hex");
try {
const response = await axios.put(
uploadUrl,
buffer,
{
headers: {
...headers,
"Content-Length": actualChunkSize,
"Content-MD5": md5,
"X-Offset": offset,
"Content-Type": "application/octet-stream"
},
}
);
// Check if upload completed
if (response.data.objectKey) {
return response.data.url;
}
// Update offset if present
if (response.data.offset !== undefined) {
offset = response.data.offset;
} else {
offset += actualChunkSize; // fallback
}
chunkSize *= 2;
partNumber++;
} catch (err) {
return 0;
}
}
fs.closeSync(file);
}
}
module.exports = UploadFile;