@webfaas/webfaas-core
Version:
WebFaaS Framework - Core
136 lines • 5.8 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.PackageStoreUtil = void 0;
const zlib = require("zlib");
const PackageStore_1 = require("../PackageStore/PackageStore");
class PackageStoreUtil {
static unzipSync(bufferGZ) {
var bufferDecompressed = zlib.unzipSync(bufferGZ, { finishFlush: zlib.constants.Z_SYNC_FLUSH });
return bufferDecompressed;
}
;
static zipSync(buffer) {
var bufferCompressed = zlib.gzipSync(buffer, { finishFlush: zlib.constants.Z_SYNC_FLUSH });
return bufferCompressed;
}
;
static buildItemData(name, begin, size) {
var itemData = {};
itemData.begin = begin;
itemData.name = name;
itemData.size = size;
return itemData;
}
}
exports.PackageStoreUtil = PackageStoreUtil;
PackageStoreUtil.buildPackageStoreFromListBuffer = function (name, version, etag, listBufferFile, listName) {
var dataPackageItemDataMap = new Map();
var offset = 0;
var packageBuffer;
for (var i = 0; i < listBufferFile.length; i++) {
let itemBuffer = listBufferFile[i];
let itemName = listName[i] || "";
let item = {};
item.begin = offset;
item.size = itemBuffer.length;
item.name = itemName;
dataPackageItemDataMap.set(item.name, item);
offset += item.size;
}
packageBuffer = Buffer.concat(listBufferFile);
var packageStore = new PackageStore_1.PackageStore(name, version, etag, packageBuffer, dataPackageItemDataMap);
return packageStore;
};
PackageStoreUtil.buildPackageStoreFromTarGzBuffer = function (name, version, etag, tarGzBuffer) {
var tarBuffer = PackageStoreUtil.unzipSync(tarGzBuffer);
return PackageStoreUtil.buildPackageStoreFromTarBuffer(name, version, etag, tarBuffer);
};
PackageStoreUtil.buildPackageStoreFromTarBuffer = function (name, version, etag, tarBuffer) {
var dataPackageItemDataMap = PackageStoreUtil.extractItemDataMapFromTarBuffer(tarBuffer);
var packageStore = new PackageStore_1.PackageStore(name, version, etag, tarBuffer, dataPackageItemDataMap);
return packageStore;
};
PackageStoreUtil.extractItemDataMapFromTarBuffer = function (bufferTar) {
var dataPackageItemDataMap = new Map();
var offset = 0;
var size = bufferTar.length;
//https://www.gnu.org/software/tar/manual/html_node/Standard.html
//0 100 File name
//100 8 File mode
//108 8 Owner's numeric user ID
//116 8 Group's numeric user ID
//124 12 File size in bytes (octal base)
do {
var item = {};
var nameBuffer = bufferTar.subarray(offset, offset + 100);
item.name = nameBuffer.subarray(0, nameBuffer.indexOf(0)).toString();
item.name = item.name.substring(item.name.indexOf("/") + 1); //remove prefix. ex: package/
item.size = parseInt(bufferTar.subarray(offset + 124, offset + 136).toString(), 8);
if (item.size) {
item.begin = offset + 512; //header -> block 512 Bytes
dataPackageItemDataMap.set(item.name, item);
offset = offset + 512 + item.size + (512 - (item.size % 512)); //512Bytes(header block) + XBytes(data item block - multiple of 512 Bytes)
}
else {
offset = offset + 512; //size(0) => header only
}
} while (offset < size);
return dataPackageItemDataMap;
};
PackageStoreUtil.convertPackageStoreToTarBuffer = function (packageStore) {
var bufferTar;
var offset = 0;
var packageBuffer = packageStore.getPackageBuffer();
var dataPackageItemDataMap = packageStore.getDataPackageItemDataMap();
var listDataBuffer = new Array();
//https://www.gnu.org/software/tar/manual/html_node/Standard.html
//0 100 File name
//100 8 File mode
//108 8 Owner's numeric user ID
//116 8 Group's numeric user ID
//124 12 File size in bytes (octal base)
//136 12 mtime
//148 8 chksum
//156 1 typeflag
//157 100 linkname
//257 6 magic
//263 2 version
//329 8 devmajor
//337 8 devminor
dataPackageItemDataMap.forEach(function (itemData) {
let dataBuffer;
let dataBufferPad;
let dataBufferSize;
dataBufferPad = Buffer.alloc(512 - (itemData.size % 512));
dataBuffer = Buffer.concat([packageBuffer.subarray(itemData.begin, itemData.begin + itemData.size), dataBufferPad]);
let dataHeader = Buffer.alloc(512, 0);
dataHeader.write("package/" + itemData.name, 0, 100);
dataHeader.write("000664 ", 100, 8); //File mode
dataHeader.write((itemData.size).toString(8).padStart(10, "0") + " ", 124, 11); //File size in bytes (octal base)
dataHeader.write("3560116604 ", 136, 12); //mtime
dataHeader.write("0", 156, 1); //typeflag
dataHeader.write("ustar", 257, 5); //magic
dataHeader.write("00", 263, 2); //version
dataHeader.write("000000 ", 329, 8); //devmajor
dataHeader.write("000000 ", 337, 8); //devminor
//chksum
let sum = 8 * 0x20;
for (let i = 0; i < 148; i++) {
sum += dataHeader[i];
}
for (let i = 156; i < 346; i++) {
sum += dataHeader[i];
}
dataHeader.write(sum.toString(8).padStart(7, "0") + " ", 148, 8); //chksum
listDataBuffer.push(dataHeader);
listDataBuffer.push(dataBuffer);
offset += dataBuffer.length + dataHeader.length;
});
bufferTar = Buffer.concat(listDataBuffer);
return bufferTar;
};
PackageStoreUtil.convertPackageStoreToTarGzBuffer = function (packageStore) {
let bufferTar = PackageStoreUtil.convertPackageStoreToTarBuffer(packageStore);
return PackageStoreUtil.zipSync(bufferTar);
};
//# sourceMappingURL=PackageStoreUtil.js.map