import { DataTransferType, CancelToken, TosClient, TosClientError, TosServerError, isCancel } from '@volcengine/tos-sdk';
import fsp from 'fs/promises';
const client = new TosClient({
accessKeyId: process.env['TOS_ACCESS_KEY'],
accessKeySecret: process.env['TOS_SECRET_KEY'],
region: "Provide your region",
endpoint: "Provide your endpoint",
function handleError(error) {
if (error instanceof TosClientError) {
console.log('Client Err Msg:', error.message);
console.log('Client Err Stack:', error.stack);
} else if (error instanceof TosServerError) {
console.log('Request ID:', error.requestId);
console.log('Response Status Code:', error.statusCode);
console.log('Response Header:', error.headers);
console.log('Response Err Code:', error.code);
console.log('Response Err Msg:', error.message);
console.log('unexpected exception, message: ', error);
const checkpointFilePath = './example_dir/example.checkpoint';
const bucketName = 'node-sdk-test-bucket';
const objectName = 'example_dir/example.txt';
const filePath = './example_dir/example.txt';
const cancelTokenSource = CancelToken.source();
cancelTokenSource.cancel();
console.log('cancel downloadFile');
await client.downloadFile({
partSize: 1 * 1024 * 1024,
checkpoint: './example_dir/example.checkpoint',
dataTransferStatusChange: (event) => {
if (event.type === DataTransferType.Started) {
console.log('Data Transfer Started');
} else if (event.type === DataTransferType.Rw) {
const percent = ((event.consumedBytes / event.totalBytes) * 100).toFixed(2);
console.log(`Once Read:${event.rwOnceBytes},ConsumerBytes/TotalBytes: ${event.consumedBytes}/${event.totalBytes},${percent}%`);
} else if (event.type === DataTransferType.Succeed) {
const percent = ((event.consumedBytes / event.totalBytes) * 100).toFixed(2);
console.log(`Data Transfer Succeed, ConsumerBytes/TotalBytes:${event.consumedBytes}/${event.totalBytes},${percent}%`);
} else if (event.type === DataTransferType.Failed) {
console.log('Data Transfer Failed');
cancelToken: cancelTokenSource.token,
const checkpointFileContent = await fsp.readFile(checkpointFilePath, 'utf-8');
console.log(`checkpoint file's content after cancel: `, checkpointFileContent);
console.log('Continue to download');
await client.downloadFile({
partSize: 1 * 1024 * 1024,
checkpoint: './example_dir/example.checkpoint',
dataTransferStatusChange: (event) => {
if (event.type === DataTransferType.Started) {
console.log('Data Transfer Started');
} else if (event.type === DataTransferType.Rw) {
const percent = ((event.consumedBytes / event.totalBytes) * 100).toFixed(2);
console.log(`Once Read:${event.rwOnceBytes},ConsumerBytes/TotalBytes: ${event.consumedBytes}/${event.totalBytes},${percent}%`);
} else if (event.type === DataTransferType.Succeed) {
const percent = ((event.consumedBytes / event.totalBytes) * 100).toFixed(2);
console.log(`Data Transfer Succeed, ConsumerBytes/TotalBytes:${event.consumedBytes}/${event.totalBytes},${percent}%`);
} else if (event.type === DataTransferType.Failed) {
console.log('Data Transfer Failed');
const fileStat = await fsp.stat(filePath);
console.log('fileSize: ', fileStat.size);