const path = require('node:path'); const fs = require('node:fs'); // A reporting failure must never terminate a script or change its send result. module.exports = async function reportNotificationAudit(payload) { let client; try { if (!process.env.QL_DIR) return; const grpc = require('@grpc/grpc-js'); const loader = require('@grpc/proto-loader'); const certDir = path.join( process.env.QL_DATA_DIR || path.join(process.env.QL_DIR, 'data'), 'config/grpc', ); const credentials = grpc.credentials.createSsl( fs.readFileSync(path.join(certDir, 'ca.crt')), fs.readFileSync(path.join(certDir, 'client.key')), fs.readFileSync(path.join(certDir, 'client.crt')), ); const definition = loader.loadSync( path.join(process.env.QL_DIR, 'back/protos/api.proto'), { keepCase: true, defaults: true }, ); const Api = grpc.loadPackageDefinition(definition).com.ql.api.Api; client = new Api( `localhost:${process.env.GRPC_PORT || '5500'}`, credentials, { 'grpc.enable_http_proxy': 0 }, ); await new Promise((resolve) => { client.RecordNotifyLog( payload, new grpc.Metadata(), { deadline: new Date(Date.now() + 1500) }, () => resolve(), ); }); } catch (_) { // Missing certificates, old panels and offline services are best effort. } finally { if (client) client.close(); } };