azurite
Version:
An open source Azure Storage API compatible server
186 lines • 6.16 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseXMLwithEmpty = exports.getUTF8ByteSize = exports.readStreamToString = exports.getPopReceipt = exports.randomValueHex = exports.nameValidateCode = exports.isValidName = exports.deserializeRangeHeader = exports.checkApiVersion = void 0;
const tslib_1 = require("tslib");
const crypto_1 = require("crypto");
const xml2js = tslib_1.__importStar(require("xml2js"));
const StorageErrorFactory_1 = tslib_1.__importDefault(require("../errors/StorageErrorFactory"));
function checkApiVersion(inputApiVersion, validApiVersions, requestId) {
if (!validApiVersions.includes(inputApiVersion)) {
throw StorageErrorFactory_1.default.getInvalidAPIVersion(requestId, inputApiVersion);
}
}
exports.checkApiVersion = checkApiVersion;
/**
* Default range value [0, Infinite] will be returned if all parameters not provided.
*
* @export
* @param {string} [rangeHeaderValue]
* @param {string} [xMsRangeHeaderValue]
* @returns {[number, number]}
*/
function deserializeRangeHeader(rangeHeaderValue, xMsRangeHeaderValue) {
const range = xMsRangeHeaderValue || rangeHeaderValue;
if (!range) {
return [0, Infinity];
}
let parts = range.split("=");
if (parts === undefined || parts.length !== 2) {
throw new RangeError(`deserializeRangeHeader: raw range value ${range} is wrong.`);
}
parts = parts[1].split("-");
if (parts === undefined || parts.length < 1 || parts.length > 2) {
throw new RangeError(`deserializeRangeHeader: raw range value ${range} is wrong.`);
}
const startInclusive = parseInt(parts[0], 10);
let endInclusive = Infinity;
if (parts.length > 1 && parts[1] !== "") {
endInclusive = parseInt(parts[1], 10);
}
if (startInclusive > endInclusive) {
throw new RangeError(`deserializeRangeHeader: raw range value ${range} is wrong.`);
}
return [startInclusive, endInclusive];
}
exports.deserializeRangeHeader = deserializeRangeHeader;
/**
* Deserialize range header into valid page ranges.
* For example, "bytes=0-1023" will return [0, 1023].
*
* Default range value [0, Infinite] will be returned if all parameters not provided.
*
* @private
* @param {string} [rangeHeaderValue]
* @param {string} [xMsRangeHeaderValue]
* @returns {([number, number] | undefined)}
*/
/**
* validate the input name for queue or container.
* @see https://docs.microsoft.com/en-us/rest/api/storageservices/naming-queues-and-metadata
*
* @export
* @param {string} name
* @returns {nameValidateCode} //0 for valid, 1 for outOfRange, 2 for invalid.
*/
function isValidName(name) {
if (name === "") {
return nameValidateCode.invalidName;
}
if (name.length < 3 || name.length > 63) {
return nameValidateCode.outOfRange;
}
if (name.split("-").indexOf("") !== -1) {
return nameValidateCode.invalidName;
}
const reg = new RegExp("^[0-9|a-z|-]*$");
if (reg.test(name)) {
return nameValidateCode.valid;
}
return nameValidateCode.invalidName;
}
exports.isValidName = isValidName;
// The code to indicate the validation result.
var nameValidateCode;
(function (nameValidateCode) {
nameValidateCode[nameValidateCode["valid"] = 0] = "valid";
nameValidateCode[nameValidateCode["outOfRange"] = 1] = "outOfRange";
nameValidateCode[nameValidateCode["invalidUri"] = 2] = "invalidUri";
nameValidateCode[nameValidateCode["invalidName"] = 3] = "invalidName";
})(nameValidateCode || (exports.nameValidateCode = nameValidateCode = {}));
/**
* Generate a random code with given length
*
* @public
* @param {number} len
* @returns {string}
* @memberof LokiQueueDataStore
*/
function randomValueHex(len) {
return (0, crypto_1.randomBytes)(Math.ceil(len / 2))
.toString("hex") // convert to hexadecimal format
.slice(0, len); // return required number of characters
}
exports.randomValueHex = randomValueHex;
/**
* Generate the popreceipt for a get messages request.
*
* @public
* @param {Date} requestDate
* @returns {string}
* @memberof LokiQueueDataStore
*/
function getPopReceipt(requestDate) {
const encodedStr = requestDate
.toUTCString()
.split(" ")
.slice(1, 5)
.join("") + randomValueHex(4);
return Buffer.from(encodedStr).toString("base64");
}
exports.getPopReceipt = getPopReceipt;
/**
* Read the text from a readStream to a string.
*
* @export
* @param {NodeJS.ReadableStream} data
* @returns {Promise<string>}
*/
async function readStreamToString(data) {
return new Promise((resolve, reject) => {
let res = "";
data
.on("readable", () => {
let chunk;
chunk = data.read();
if (chunk) {
res += chunk.toString();
}
})
.on("end", () => {
resolve(res);
})
.on("error", reject);
});
}
exports.readStreamToString = readStreamToString;
/**
* Get the byte size of a string in UTF8.
*
* @public
* @param {Date} requestDate
* @returns {string}
* @memberof LokiQueueDataStore
*/
function getUTF8ByteSize(text) {
return Buffer.from(text, "utf8").length;
}
exports.getUTF8ByteSize = getUTF8ByteSize;
/**
* Retrieve the value from XML body without ignoring the empty characters.
*
* @export
* @param {string} param
* @param {boolean} [explicitChildrenWithOrder=false]
* @returns {Promise<any>}
*/
function parseXMLwithEmpty(param, explicitChildrenWithOrder = false) {
const xmlParser = new xml2js.Parser({
explicitArray: false,
explicitCharkey: false,
explicitRoot: false,
preserveChildrenOrder: explicitChildrenWithOrder,
explicitChildren: explicitChildrenWithOrder
});
return new Promise((resolve, reject) => {
xmlParser.parseString(param, (err, res) => {
if (err) {
reject(err);
}
else {
resolve(res);
}
});
});
}
exports.parseXMLwithEmpty = parseXMLwithEmpty;
//# sourceMappingURL=utils.js.map
;