Backblaze B2 Node.js Library
This library uses promises, so all actions on a B2
instance return a promise in the following pattern:
b2.instanceFunction(arg1, arg2).then(
successFn(response) { ... },
errorFn(err) { ... }
);
Status of project
See the CHANGELOG for a history of updates.
Contributing
Contributions, suggestions, and questions are welcome. Please review the contributing guidelines for details.
Upgrading from 0.9.x to 1.0.x
For this update, we've switched the back end HTTP request library from request
to axios
as it has better Promise and progress support built in. However, there are a couple changes that will break your code and ruin your day. Here are the changes:
- The Promise resolution has a different data structure. Where previously, the request response data was the root object in the promise resolution (
res
), this data now resides in res.data
. - In v0.9.12, we added request progress reporting via the third parameter to
then()
. Because we are no longer using the same promise library, this functionality has been removed. However, progress reporting is still available by passing a callback function into the b2.method()
that you're calling. See the documentation below for details. - In v0.9.x,
b2.downloadFileById()
accepted a fileId
parameter as a String or Number. As of 1.0.0, the first parameter is now expected to be a plain Object of arguments.
Response Object
Each request returns an object with:
Basic Example
const B2 = require('backblaze-b2');
const b2 = new B2({
accountId: '<accountId>',
applicationKey: 'applicationKey'
});
async function GetBuckets() {
try {
await b2.authorize();
let response = await b2.listBuckets();
console.log(response.data);
} catch (err) {
console.log('Error getting buckets:', err);
}
}
Uploading Large Files
To upload large files, you need to split the file into parts (between 5MB and 5GB) and upload each part seperately.
First, you initiate the large file upload to get the fileId:
let response = await this.b2.startLargeFile({bucketId, fileName});
let fileID = response.data.fileId;
Then for each part you request an uploadUrl, and use the response to upload the part:
let response = await this.b2.getUploadPartUrl({fileId: this.fileID});
let uploadURL = response.data.uploadUrl;
let authToken = response.data.authorizationToken;
response = await this.b2.uploadPart({
partNumber: parNum,
uploadUrl: uploadURL,
uploadAuthToken: authToken,
data: buf
});
Then finish the uploadUrl:
let response = await this.b2.finishLargeFile({
fileId: this.fileID,
partSha1Array: parts.map(buf => sha1(buf))
})
Usage
const B2 = require('backblaze-b2');
const b2 = new B2({
accountId: 'accountId',
applicationKey: 'applicationKey'
});
b2.authorize();
b2.createBucket(
bucketName,
bucketType
);
b2.deleteBucket(bucketId);
b2.listBuckets();
b2.updateBucket(bucketId, bucketType);
b2.getUploadUrl(bucketId);
b2.uploadFile({
uploadUrl: 'uploadUrl',
uploadAuthToken: 'uploadAuthToken',
fileName: 'fileName',
mime: '',
data: 'data',
hash: 'sha1-hash',
info: {
key1: 'value'
key2: 'value'
},
onUploadProgress: (event) => {} || null
});
b2.listFileNames({
bucketId: 'bucketId',
startFileName: 'startFileName',
maxFileCount: 100,
delimiter: '',
prefix: ''
});
b2.listFileVersions({
bucketId: 'bucketId',
startFileName: 'startFileName',
maxFileCount: 100
});
b2.hideFile({
bucketId: 'bucketId',
fileName: 'fileName'
});
b2.getFileInfo(fileId);
b2.getDownloadAuthorization({
bucketId: 'bucketId',
fileNamePrefix: 'fileNamePrefix',
validDurationInSeconds: 'validDurationInSeconds',
b2ContentDisposition: 'b2ContentDisposition'
});
b2.downloadFileByName({
bucketName: 'bucketName',
fileName: 'fileName',
responseType: 'arraybuffer',
onDownloadProgress: (event) => {} || null
});
b2.downloadFileById({
fileId: 'fileId',
responseType: 'arraybuffer',
onDownloadProgress: (event) => {} || null
});
b2.deleteFileVersion({
fileId: 'fileId',
fileName: 'fileName'
});
b2.startLargeFile({
bucketId: 'bucketId',
fileName: 'fileName'
});
b2.getUploadPartUrl({
fileId: 'fileId'
});
b2.uploadPart({
partNumber: 'partNumber',
uploadUrl: 'uploadUrl',
uploadAuthToken: 'uploadAuthToken',
data: Buffer
hash: 'sha1-hash',
onUploadProgress: (event) => {} || null
});
b2.finishLargeFile({
fileId: 'fileId',
partSha1Array: [partSha1Array]
});
b2.cancelLargeFile({
fileId: 'fileId'
});
Authors
- Yakov Khalinsky (@yakovkhalinsky)
- Ivan Kalinin (@IvanKalinin) at Isolary
- Brandon Patton (@crazyscience) at Isolary