import * as plugins from './plugins.js'; class TapNodeTools { private smartshellInstance: plugins.smartshell.Smartshell; constructor() {} public async getQenv(): Promise { return new plugins.qenv.Qenv('./', '.nogit/'); } public async runCommand(commandArg: string): Promise { if (!this.smartshellInstance) { this.smartshellInstance = new plugins.smartshell.Smartshell({ executor: 'bash', }); } const result = await this.smartshellInstance.exec(commandArg); return result; } public async createHttpsCert( commonName: string = 'localhost', allowSelfSigned: boolean = true ): Promise<{ key: string; cert: string }> { if (allowSelfSigned) { // set node to allow self-signed certificates process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; } // Generate a key pair const keys = plugins.smartcrypto.nodeForge.pki.rsa.generateKeyPair(2048); // Create a self-signed certificate const cert = plugins.smartcrypto.nodeForge.pki.createCertificate(); cert.publicKey = keys.publicKey; cert.serialNumber = '01'; cert.validity.notBefore = new Date(); cert.validity.notAfter = new Date(); cert.validity.notAfter.setFullYear(cert.validity.notBefore.getFullYear() + 1); const attrs = [ { name: 'commonName', value: commonName }, { name: 'countryName', value: 'US' }, { shortName: 'ST', value: 'California' }, { name: 'localityName', value: 'San Francisco' }, { name: 'organizationName', value: 'My Company' }, { shortName: 'OU', value: 'Dev' }, ]; cert.setSubject(attrs); cert.setIssuer(attrs); // Sign the certificate with its own private key (self-signed) cert.sign(keys.privateKey, plugins.smartcrypto.nodeForge.md.sha256.create()); // PEM encode the private key and certificate const pemKey = plugins.smartcrypto.nodeForge.pki.privateKeyToPem(keys.privateKey); const pemCert = plugins.smartcrypto.nodeForge.pki.certificateToPem(cert); return { key: pemKey, cert: pemCert, }; } } export const tapNodeTools = new TapNodeTools();