@fgiova/aws-signature
Version:
[](https://www.npmjs.com/package/@fgiova/aws-signature)  [ • 2.73 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.SignerSingleton = exports.Signer = void 0;
const piscina_1 = __importDefault(require("piscina"));
const lru_cache_1 = require("lru-cache");
const node_path_1 = __importDefault(require("node:path"));
const os_1 = require("os");
/* c8 ignore start */
const isTS = node_path_1.default.resolve(__filename).endsWith(".ts");
const runEnv = {
ext: isTS ? "ts" : "js",
execArgv: isTS ? ["-r", "ts-node/register"] : undefined
};
/* c8 ignore end */
const keyCache = new lru_cache_1.LRUCache({
max: 50,
ttl: 1000 * 60 * 60 * 24
});
class Signer {
worker;
cpuCount = (() => {
try {
return (0, os_1.cpus)().length;
}
catch {
/* istanbul ignore next */
return 1;
}
})();
constructor(options = {}) {
const { minThreads, maxThreads, idleTimeout, maxQueue, concurrentTasksPerWorker, resourceLimits } = options;
this.worker = new piscina_1.default({
filename: node_path_1.default.resolve(__dirname, `./sign_worker.${runEnv.ext}`),
execArgv: runEnv.execArgv,
name: "generateKey",
minThreads: minThreads ?? Math.max(this.cpuCount / 2, 1),
maxThreads: maxThreads ?? this.cpuCount * 1.5,
idleTimeout,
maxQueue,
concurrentTasksPerWorker,
resourceLimits
});
}
millsToNextDay() {
const tomorrow = new Date();
tomorrow.setDate(tomorrow.getDate() + 1);
tomorrow.setHours(0, 0, 0, 0);
return Math.abs(tomorrow.getTime() - new Date().getTime());
}
async request(request, service, region, date = new Date()) {
const keyId = `${service}-${region}`;
let key = keyCache.get(keyId);
if (!key) {
key = await this.worker.run({ service, region, date });
keyCache.set(keyId, key, {
ttl: this.millsToNextDay()
});
}
return await this.worker.run({ request, service, region, key, date }, { name: "signRequest" });
}
async destroy() {
return this.worker.destroy();
}
}
exports.Signer = Signer;
class SignerSingleton {
static signer;
constructor() {
throw new Error("Use SignerSingleton.getSigner()");
}
static getSigner(options) {
if (!SignerSingleton.signer) {
SignerSingleton.signer = new Signer(options);
}
return SignerSingleton.signer;
}
}
exports.SignerSingleton = SignerSingleton;