"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.receive = exports.send = void 0; const tslib_1 = require("tslib"); const utils_fs_1 = require("@ionic/utils-fs"); const utils_subprocess_1 = require("@ionic/utils-subprocess"); const debug_1 = tslib_1.__importDefault(require("debug")); const https_1 = require("https"); const path_1 = require("path"); const cli_1 = require("./util/cli"); const debug = (0, debug_1.default)('capacitor:ipc'); /** * Send an IPC message to a forked process. */ async function send(msg) { const dir = cli_1.ENV_PATHS.log; await (0, utils_fs_1.mkdirp)(dir); const logPath = (0, path_1.resolve)(dir, 'ipc.log'); debug('Sending %O IPC message to forked process (logs: %O)', msg.type, logPath); const fd = await (0, utils_fs_1.open)(logPath, 'a'); const p = (0, utils_subprocess_1.fork)(process.argv[1], ['📡'], { stdio: ['ignore', fd, fd, 'ipc'] }); p.send(msg); p.disconnect(); p.unref(); } exports.send = send; /** * Receive and handle an IPC message. * * Assume minimal context and keep external dependencies to a minimum. */ async function receive(msg) { debug('Received %O IPC message', msg.type); if (msg.type === 'telemetry') { const now = new Date().toISOString(); const { data } = msg; // This request is only made if telemetry is on. const req = (0, https_1.request)({ hostname: 'api.ionicjs.com', port: 443, path: '/events/metrics', method: 'POST', headers: { 'Content-Type': 'application/json', }, }, response => { debug('Sent %O metric to events service (status: %O)', data.name, response.statusCode); if (response.statusCode !== 204) { response.on('data', chunk => { debug('Bad response from events service. Request body: %O', chunk.toString()); }); } }); const body = { metrics: [data], sent_at: now, }; req.end(JSON.stringify(body)); } } exports.receive = receive;