UNPKG

backblaze-b2

Version:

Node.js Library for the Backblaze B2 Storage Service

355 lines (313 loc) 10.8 kB
const _ = require('lodash'); const utils = require('./../utils'); const headersUtil = require('../headers'); const request = require('../request'); const endpoints = require('../endpoints'); const sha1 = (value) => require('crypto').createHash('sha1').update(value).digest('hex'); exports.uploadFile = function(b2, args) { const uploadUrl = args.uploadUrl; const uploadAuthToken = args.uploadAuthToken; // Previous versions used filename (lowercase), so support that here const fileName = utils.getUrlEncodedFileName(args.fileName || args.filename); const data = args.data; const hash = args.hash; const info = args.info; const mime = args.mime; const len = args.contentLength || data.byteLength || data.length; const options = { url: uploadUrl, method: 'POST', headers: { Authorization: uploadAuthToken, 'Content-Type': mime || 'b2/x-auto', 'Content-Length': len, 'X-Bz-File-Name': fileName, 'X-Bz-Content-Sha1': hash || (data ? sha1(data) : null) }, data: data, maxRedirects: 0, onUploadProgress: args.onUploadProgress || null }; headersUtil.addInfoHeaders(options, info); // merge order matters here: later objects override earlier objects return request.sendRequest(_.merge({}, _.get(args, 'axios', {}), options, _.get(args, 'axiosOverride', {}) )); }; exports.startLargeFile = function(b2, args) { const options = { url: endpoints(b2).startLargeFileUrl, method: 'POST', headers: utils.getAuthHeaderObjectWithToken(b2), data: { bucketId: args.bucketId, fileName: args.fileName, contentType: args.contentType || 'b2/x-auto' } }; // merge order matters here: later objects override earlier objects return request.sendRequest(_.merge({}, _.get(args, 'axios', {}), options, _.get(args, 'axiosOverride', {}) )); }; exports.getUploadPartUrl = function(b2, args) { const options = { url: endpoints(b2).getUploadPartUrl, method: 'POST', headers: utils.getAuthHeaderObjectWithToken(b2), data: { fileId: args.fileId } }; // merge order matters here: later objects override earlier objects return request.sendRequest(_.merge({}, _.get(args, 'axios', {}), options, _.get(args, 'axiosOverride', {}) )); }; exports.uploadPart = function(b2, args) { const options = { url: args.uploadUrl, method: 'POST', headers: { Authorization: args.uploadAuthToken, 'Content-Length': args.contentLength || args.data.byteLength || args.data.length, 'X-Bz-Part-Number': args.partNumber, 'X-Bz-Content-Sha1': args.hash || (args.data ? sha1(args.data) : null) }, data: args.data, onUploadProgress: args.onUploadProgress || null, maxRedirects: 0 }; // merge order matters here: later objects override earlier objects return request.sendRequest(_.merge({}, _.get(args, 'axios', {}), options, _.get(args, 'axiosOverride', {}) )); }; exports.finishLargeFile = function(b2, args) { const options = { url: endpoints(b2).finishLargeFileUrl, method: 'POST', headers: utils.getAuthHeaderObjectWithToken(b2), data: { fileId: args.fileId, partSha1Array: args.partSha1Array } }; // merge order matters here: later objects override earlier objects return request.sendRequest(_.merge({}, _.get(args, 'axios', {}), options, _.get(args, 'axiosOverride', {}) )); }; exports.cancelLargeFile = function(b2, args) { const options = { url: endpoints(b2).cancelLargeFileUrl, method: 'POST', headers: utils.getAuthHeaderObjectWithToken(b2), data: { fileId: args.fileId } }; // merge order matters here: later objects override earlier objects return request.sendRequest(_.merge({}, _.get(args, 'axios', {}), options, _.get(args, 'axiosOverride', {}) )); }; exports.listFileNames = function(b2, args) { const bucketId = args.bucketId; const startFileName = args.startFileName; const maxFileCount = args.maxFileCount; const prefix = args.prefix; const delimiter = args.delimiter; const options = { url: endpoints(b2).listFilesUrl, method: 'POST', headers: utils.getAuthHeaderObjectWithToken(b2), data: { bucketId, startFileName: startFileName || '', maxFileCount: maxFileCount || 100, prefix: prefix || '', delimiter: delimiter || null } }; // merge order matters here: later objects override earlier objects return request.sendRequest(_.merge({}, _.get(args, 'axios', {}), options, _.get(args, 'axiosOverride', {}) ), utils.getProcessFileSuccess(options)); }; exports.listFileVersions = function(b2, args) { const bucketId = args.bucketId; const startFileName = args.startFileName; const startFileId = args.startFileId; const maxFileCount = args.maxFileCount; const options = { url: endpoints(b2).listFileVersionsUrl, method: 'POST', headers: utils.getAuthHeaderObjectWithToken(b2), data: { bucketId: bucketId, startFileName: startFileName || '', startFileId: startFileId, maxFileCount: maxFileCount || 100 } }; // merge order matters here: later objects override earlier objects return request.sendRequest(_.merge({}, _.get(args, 'axios', {}), options, _.get(args, 'axiosOverride', {}) )); }; exports.listParts = function(b2, args) { const fileId = args.fileId; const startPartNumber = args.startPartNumber; const maxPartCount = args.maxPartCount; const options = { url: endpoints(b2).listPartsUrl, method: 'POST', headers: utils.getAuthHeaderObjectWithToken(b2), data: { fileId: fileId, startPartNumber: startPartNumber || 0, maxPartCount: maxPartCount || 100 } }; // merge order matters here: later objects override earlier objects return request.sendRequest(_.merge({}, _.get(args, 'axios', {}), options, _.get(args, 'axiosOverride', {}) )); }; exports.hideFile = function(b2, args) { const bucketId = args.bucketId; const fileName = args.fileName; const options = { url: endpoints(b2).hideFileUrl, method: 'POST', headers: utils.getAuthHeaderObjectWithToken(b2), data: { bucketId: bucketId, fileName: fileName } }; // merge order matters here: later objects override earlier objects return request.sendRequest(_.merge({}, _.get(args, 'axios', {}), options, _.get(args, 'axiosOverride', {}) )); }; exports.getFileInfo = function(b2, argsOrFileId) { /* we're allowing an args object OR fileId for backwards compatibility */ let fileId = argsOrFileId; if (!_.isString(argsOrFileId)) { fileId = _.get(argsOrFileId, 'fileId'); } const options = { url: endpoints(b2).fileInfoUrl, method: 'POST', headers: utils.getAuthHeaderObjectWithToken(b2), data: { fileId: fileId } }; // merge order matters here: later objects override earlier objects return request.sendRequest(_.merge({}, _.get(argsOrFileId, 'axios', {}), options, _.get(argsOrFileId, 'axiosOverride', {}) )); }; exports.getDownloadAuthorization = function (b2, args) { const bucketId = args.bucketId; const fileNamePrefix = args.fileNamePrefix; const validDurationInSeconds = args.validDurationInSeconds; const b2ContentDisposition = args.b2ContentDisposition; const options = { url: endpoints(b2).downloadAuthorizationUrl, method: 'POST', headers: utils.getAuthHeaderObjectWithToken(b2), data: { bucketId: bucketId, fileNamePrefix: fileNamePrefix, validDurationInSeconds: validDurationInSeconds, b2ContentDisposition: b2ContentDisposition } }; // merge order matters here: later objects override earlier objects return request.sendRequest(_.merge({}, _.get(args, 'axios', {}), options, _.get(args, 'axiosOverride', {}) )); }; exports.downloadFileByName = function(b2, args) { const bucketName = args.bucketName; const fileName = utils.getUrlEncodedFileName(args.fileName); const options = { url: endpoints(b2).downloadFileByNameUrl(bucketName, fileName), headers: utils.getAuthHeaderObjectWithToken(b2), responseType: args.responseType || null, encoding: null, transformResponse: args.transformResponse || null, onDownloadProgress: args.onDownloadProgress || null }; const requestInstance = request.getInstance(); // merge order matters here: later objects override earlier objects return requestInstance(_.merge({}, _.get(args, 'axios', {}), options, _.get(args, 'axiosOverride', {}) ), utils.getProcessFileSuccess()); }; exports.downloadFileById = function(b2, args) { const options = { url: endpoints(b2).downloadFileByIdUrl(args.fileId), headers: utils.getAuthHeaderObjectWithToken(b2), responseType: args.responseType || null, encoding: null, transformResponse: args.transformResponse || null, onDownloadProgress: args.onDownloadProgress || null }; const requestInstance = request.getInstance(); // merge order matters here: later objects override earlier objects return requestInstance(_.merge({}, _.get(args, 'axios', {}), options, _.get(args, 'axiosOverride', {}) ), utils.getProcessFileSuccess()); }; exports.deleteFileVersion = function(b2, args) { const fileId = args.fileId; const fileName = args.fileName; const options = { url: endpoints(b2).deleteFileVersionUrl, method: 'POST', headers: utils.getAuthHeaderObjectWithToken(b2), data: { fileId: fileId, fileName: fileName } }; // merge order matters here: later objects override earlier objects return request.sendRequest(_.merge({}, _.get(args, 'axios', {}), options, _.get(args, 'axiosOverride', {}) )); };