Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 12 additions & 2 deletions config.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
const fs = require('fs');
const path = require('path');

const { StorageRetryPolicyType } = require('@azure/storage-blob');
let config = null;

function getConfig() {
if (config === null) {
try {
const _configFileName = `${process?.env?.CARBONE_AST_CONFIG ?? 'config.json'}`
const _path = process?.env?.CARBONE_AST_CONFIG_PATH ? path.join(process.env.CARBONE_AST_CONFIG_PATH, _configFileName) : path.join(__dirname, '..', 'config', _configFileName);
const _path = process?.env?.CARBONE_AST_CONFIG_PATH ? path.join(__dirname, process.env.CARBONE_AST_CONFIG_PATH, _configFileName) : path.join(__dirname, '..', 'config', _configFileName);
config = JSON.parse(fs.readFileSync(_path, 'utf8'));
} catch (e) {
config = {};
Expand All @@ -18,6 +18,16 @@ function getConfig() {
accountName: process.env.AZURE_STORAGE_ACCOUNT,
accountKey: process.env.AZURE_STORAGE_KEY
}

// Create retry options
const storageRetryOptions = {
maxTries: 4, // Maximum number of retry attempts
tryTimeoutInMs: 30000, // Maximum time to wait before retrying (30 seconds)
retryDelayInMs: 2000, // Delay before retrying (2 seconds)
maxRetryDelayInMs: 30000, // Maximum delay before retrying (30 seconds)
retryPolicyType: StorageRetryPolicyType.EXPONENTIAL, // Use exponential backoff strategy
};
config.storageRetryOptions = storageRetryOptions;
}
if (process?.env?.CONTAINER_RENDERS) {
config.rendersContainer = process.env.CONTAINER_RENDERS
Expand Down
11 changes: 6 additions & 5 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
{
"scripts": {
"test": "mocha"
"test": "mocha"
},
"dependencies": {
"@azure/storage-blob": "^12.17.0",
"dotenv": "^16.4.5"
"@azure/storage-blob": "^12.17.0",
"dotenv": "^16.4.5"
},
"devDependencies": {
"mocha": "=10.2.0",
"nock": "=13.5.0"
"chai": "^5.1.2",
"mocha": "^10.2.0",
"nock": "^13.5.0"
}
}
53 changes: 46 additions & 7 deletions storage.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
const fs = require('fs');
const path = require('path');
const { BlobServiceClient, StorageSharedKeyCredential } = require('@azure/storage-blob');
const { BlobServiceClient, StorageSharedKeyCredential, RestError } = require('@azure/storage-blob');
const config = require('./config');

const _config = config.getConfig();
Expand All @@ -19,7 +19,10 @@ if (_config?.storageCredentials) {
};
blobServiceClient = new BlobServiceClient(
blobServiceClientOptions.url,
blobServiceClientOptions.credential);
blobServiceClientOptions.credential,
{
retryOptions: _config.storageRetryOptions
});
}

function writeTemplate(req, res, templateId, templatePath, callback) {
Expand All @@ -43,9 +46,15 @@ function writeTemplate(req, res, templateId, templatePath, callback) {
if (response._response.status !== 201) {
return callback(new Error(`Status: ${response._response.status} | Body: ${response.errorCode ?? response._response.bodyAsText}`));
}

return callback(null, templateId);
})
.catch(err => {

if(err.statusCode === 403) {
return callback(new Error('AccessDenied'));
}

return callback(err, templateId);
});
});
Expand All @@ -66,9 +75,7 @@ function readTemplate(req, res, templateId, callback) {

return blockBlobClient.download(0, undefined, downloadOptions)
.then(response => {
if (response._response.status === 404) {
return callback(new Error('File does not exist'));
}

if (response._response.status !== 200) {
return callback(new Error(`Status: ${response._response.status} | Body: ${response.errorCode ?? response._response.bodyAsText}`));
}
Expand All @@ -84,6 +91,17 @@ function readTemplate(req, res, templateId, callback) {
});
})
.catch(err => {

if(err instanceof RestError ) {
if(err.statusCode === 404) {
return callback(new Error('404 - Blob does not exist'));
}

return callback(new Error(`${err.statusCode} - ${err.message}`));
}



return callback(err);
});
}
Expand All @@ -109,7 +127,7 @@ function deleteTemplate(req, res, templateId, callback) {
return callback(null, templatePath);
})
.catch(err => {
return callback(err);
return handleError(err, callback);
});
}

Expand Down Expand Up @@ -151,7 +169,8 @@ function readRender(req, res, renderId, callback) {
});
})
.catch(err => {
return callback(new Error(`Error downloading blob: ${err.message}`));
//return callback(new Error(`Error downloading blob: ${err.message}`));
return handleError(err, callback);
});
}
else {
Expand All @@ -166,6 +185,19 @@ function readRender(req, res, renderId, callback) {
});
}

function handleError(err, callback) {
if (err instanceof RestError) {
if (err.statusCode === 404) {
return callback(new Error('404 - Blob does not exist'));
}
if (err.statusCode === 403) {
return callback(new Error('403 - AccessDenied'));
}
return callback(new Error(`${err.statusCode} - ${err.message}`));
}
return callback(err);
}

function afterRender(req, res, err, reportPath, reportName, stats, callback) {
if (err) {
return callback(err);
Expand All @@ -189,6 +221,13 @@ function afterRender(req, res, err, reportPath, reportName, stats, callback) {
return callback();
})
.catch(err => {
if (err instanceof RestError) {
if (err.statusCode === 403) {
return callback(new Error('403 - AccessDenied'));
}
return callback(new Error(`${err.statusCode} - ${err.message}`));
}

return callback(err);
});
});
Expand Down
9 changes: 8 additions & 1 deletion test/config.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,14 @@ describe('Config', () => {
"accountKey": "whateverAccountKey"
},
"rendersContainer": "whateverRendersContainer",
"templatesContainer": "whateverTemplatesContainer"
"templatesContainer": "whateverTemplatesContainer",
"storageRetryOptions": {
"maxTries": 4,
"tryTimeoutInMs": 30000,
"retryDelayInMs": 2000,
"maxRetryDelayInMs": 30000,
"retryPolicyType": 0
}
}
const _config = config.getConfig();
assert.deepStrictEqual(_config, _expectedConfig);
Expand Down
9 changes: 8 additions & 1 deletion test/data/config.test.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,12 @@
"accountKey": "whateverAccountKey"
},
"rendersContainer": "whateverRendersContainer",
"templatesContainer": "whateverTemplatesContainer"
"templatesContainer": "whateverTemplatesContainer",
"storageRetryOptions": {
"maxTries": 4,
"tryTimeoutInMs": 30000,
"retryDelayInMs": 2000,
"maxRetryDelayInMs": 30000,
"retryPolicyType": "StorageRetryPolicyType.EXPONENTIAL"
}
}
Loading