@bugsplat/symbol-upload
Version:
Cross platform symbol upload tool
91 lines • 4.05 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.uploadSymbolFiles = uploadSymbolFiles;
const js_api_client_1 = require("@bugsplat/js-api-client");
const promises_1 = require("node:fs/promises");
const node_os_1 = require("node:os");
const node_path_1 = require("node:path");
const pretty_bytes_1 = __importDefault(require("pretty-bytes"));
const workerpool_1 = require("workerpool");
const dsym_1 = require("./dsym");
const elf_1 = require("./elf");
const pdb_1 = require("./pdb");
const preload_1 = require("./preload");
const sym_1 = require("./sym");
const worker_1 = require("./worker");
const maxWorkers = (0, node_os_1.availableParallelism)();
const workerPool = (0, workerpool_1.pool)((0, preload_1.findCompressionWorkerPath)(), { maxWorkers });
async function uploadSymbolFiles(bugsplat, database, application, version, symbolFilePaths) {
console.log(`About to upload symbols for ${database}-${application}-${version}...`);
const startTime = new Date();
const symbolsApiClient = new js_api_client_1.SymbolsApiClient(bugsplat);
const versionsApiClient = new js_api_client_1.VersionsApiClient(bugsplat);
const symbolFiles = await Promise.all(symbolFilePaths.map(async (symbolFilePath) => await createSymbolFileInfos(symbolFilePath))).then(array => array.flat());
const workers = (0, worker_1.createWorkersFromSymbolFiles)(workerPool, maxWorkers, symbolFiles, [symbolsApiClient, versionsApiClient]);
const uploads = workers.map((worker) => worker.upload(database, application, version));
const stats = await Promise.all(uploads).then(stats => stats.flat());
const endTime = new Date();
const size = stats.reduce((acc, curr) => acc + curr.size, 0);
const seconds = (endTime.getTime() - startTime.getTime()) / 1000;
console.log(`Uploaded ${symbolFiles.length} symbols totaling ${(0, pretty_bytes_1.default)(size)} @ ${(0, pretty_bytes_1.default)(size / seconds)}/sec`);
}
async function createSymbolFileInfos(symbolFilePath) {
const path = symbolFilePath;
const isFolder = await (0, promises_1.stat)(path).then((stats) => stats.isDirectory());
const extLowerCase = (0, node_path_1.extname)(path).toLowerCase();
const isSymFile = extLowerCase.includes('.sym') && !isFolder;
const isPdbFile = extLowerCase.includes('.pdb') && !isFolder;
const isPeFile = extLowerCase.includes('.exe') || extLowerCase.includes('.dll') && !isFolder;
const isDsymBundle = extLowerCase.includes('.dsym');
const isElfFile = elfExtensions.some((ext) => extLowerCase.includes(ext) && !isFolder);
if (isPdbFile) {
const dbgId = await (0, pdb_1.tryGetPdbGuid)(path);
const moduleName = (0, node_path_1.basename)(path);
return [{
path,
dbgId,
moduleName,
}];
}
if (isPeFile) {
const dbgId = await (0, pdb_1.tryGetPeGuid)(path);
const moduleName = (0, node_path_1.basename)(path);
return [{
path,
dbgId,
moduleName,
}];
}
if (isSymFile) {
const { dbgId, moduleName } = await (0, sym_1.getSymFileInfo)(path);
return [{
path,
dbgId,
moduleName,
}];
}
if (isDsymBundle) {
return (0, dsym_1.getDSymFileInfos)(path);
}
if (isElfFile) {
const dbgId = await (0, elf_1.tryGetElfUUID)(path);
const moduleName = (0, node_path_1.basename)(path);
return [{
path,
dbgId,
moduleName,
}];
}
const dbgId = '';
const moduleName = (0, node_path_1.basename)(path);
return [{
path,
dbgId,
moduleName,
}];
}
const elfExtensions = ['.elf', '.self', '.prx', '.sprx', '.nss'];
//# sourceMappingURL=upload.js.map