UNPKG

node-tls-client-snikes

Version:

Advanced library based on node-fetch and tls-client.

74 lines (73 loc) 2.62 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Client = void 0; const piscina_1 = require("piscina"); const native_1 = require("../utils/native"); const utils_1 = require("../utils"); const os_1 = __importDefault(require("os")); class Client { static instance = null; static ready = false; static readyPromise = null; _pool; constructor() { this._pool = new piscina_1.Piscina({ filename: require.resolve("../workers/index.js"), maxQueue: Infinity, maxThreads: (typeof os_1.default.availableParallelism === "function" ? os_1.default.availableParallelism() : os_1.default.cpus().length) * 2, atomics: "disabled", }); } static async init(customLibraryPath) { if (Client.ready) return; if (!Client.readyPromise) { Client.readyPromise = (async () => { await native_1.LibraryHandler.validateFile(customLibraryPath); Client.instance = new Client(); // IMPORTANT: Set library path in ALL worker threads if (customLibraryPath) { const workers = Client.instance._pool.threads; const promises = []; for (let i = 0; i < workers.length; i++) { promises.push(Client.instance.pool.run(customLibraryPath, { name: "setLibraryPath" })); } await Promise.all(promises); } Client.ready = true; Client.readyPromise = null; })(); } return Client.readyPromise; } static async destroy() { if (!Client.instance) { throw new utils_1.TlsClientError("Client not initialized. Call initTLS() first."); } // Clear sessions cache await Client.instance.pool.run({}, { name: "destroyAll" }); // Destroy worker pool await Client.instance.pool.close(); // Reset instance Client.instance = null; Client.ready = false; } static getInstance() { if (!Client.instance) { throw new utils_1.TlsClientError("Client not initialized. Call initTLS() first."); } return Client.instance; } get pool() { return this._pool; } static isReady() { return Client.ready; } } exports.Client = Client;