2023-01-03 11:55:46 -08:00
|
|
|
// Copyright 2017 Signal Messenger, LLC
|
2021-01-27 15:13:33 -06:00
|
|
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
|
|
|
|
/* eslint-env node */
|
|
|
|
|
|
|
|
import { ipcRenderer as ipc } from 'electron';
|
2021-03-04 16:44:57 -05:00
|
|
|
import * as path from 'path';
|
2021-01-27 15:13:33 -06:00
|
|
|
|
2021-05-13 18:18:43 -07:00
|
|
|
import {
|
|
|
|
initLogger,
|
|
|
|
LogLevel as SignalClientLogLevel,
|
2022-03-24 14:47:21 -07:00
|
|
|
} from '@signalapp/libsignal-client';
|
2021-04-16 16:13:13 -07:00
|
|
|
|
2025-06-16 11:59:31 -07:00
|
|
|
import { setPinoDestination, log } from './log';
|
2022-11-22 10:43:43 -08:00
|
|
|
import * as Errors from '../types/errors';
|
2022-10-03 15:53:41 -07:00
|
|
|
import { createRotatingPinoDest } from '../util/rotatingPinoDest';
|
2025-06-16 09:47:18 -07:00
|
|
|
import { redactAll } from '../util/privacy';
|
2021-01-27 15:13:33 -06:00
|
|
|
|
2025-06-16 09:47:18 -07:00
|
|
|
let isInitialized = false;
|
2021-05-13 13:54:54 -07:00
|
|
|
let shouldRestart = false;
|
|
|
|
|
|
|
|
export function beforeRestart(): void {
|
|
|
|
shouldRestart = true;
|
|
|
|
}
|
2021-03-04 16:44:57 -05:00
|
|
|
|
|
|
|
export function initialize(): void {
|
2025-06-16 09:47:18 -07:00
|
|
|
if (isInitialized) {
|
|
|
|
throw new Error('Already initialized');
|
2021-03-04 16:44:57 -05:00
|
|
|
}
|
2025-06-16 09:47:18 -07:00
|
|
|
isInitialized = true;
|
2021-03-04 16:44:57 -05:00
|
|
|
|
|
|
|
const basePath = ipc.sendSync('get-user-data-path');
|
|
|
|
const logFile = path.join(basePath, 'logs', 'app.log');
|
2021-03-10 17:41:38 -05:00
|
|
|
|
2021-05-13 13:54:54 -07:00
|
|
|
const onClose = () => {
|
|
|
|
if (shouldRestart) {
|
|
|
|
initialize();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2022-10-03 15:53:41 -07:00
|
|
|
const stream = createRotatingPinoDest({
|
|
|
|
logFile,
|
|
|
|
});
|
|
|
|
|
2021-05-13 13:54:54 -07:00
|
|
|
stream.on('close', onClose);
|
|
|
|
stream.on('error', onClose);
|
2021-03-26 12:48:46 -04:00
|
|
|
|
2025-06-16 11:59:31 -07:00
|
|
|
setPinoDestination(stream, redactAll);
|
2021-03-04 16:44:57 -05:00
|
|
|
}
|
|
|
|
|
2025-06-12 12:18:56 -07:00
|
|
|
function toLocation(source?: string, line?: number, column?: number) {
|
2023-03-16 17:03:38 -07:00
|
|
|
if (source == null) {
|
|
|
|
return '(@ unknown)';
|
|
|
|
}
|
|
|
|
if (line != null && column != null) {
|
|
|
|
return `(@ ${source}:${line}:${column})`;
|
|
|
|
}
|
|
|
|
if (line != null) {
|
|
|
|
return `(@ ${source}:${line})`;
|
|
|
|
}
|
|
|
|
return `(@ ${source})`;
|
|
|
|
}
|
|
|
|
|
2025-06-12 12:18:56 -07:00
|
|
|
window.onerror = (message, source, line, column, error) => {
|
2022-11-22 10:43:43 -08:00
|
|
|
const errorInfo = Errors.toLogFormat(error);
|
2023-03-16 17:03:38 -07:00
|
|
|
log.error(
|
2025-06-12 12:18:56 -07:00
|
|
|
`Top-level unhandled error: ${message}, ${errorInfo}`,
|
|
|
|
toLocation(source, line, column)
|
2023-03-16 17:03:38 -07:00
|
|
|
);
|
2021-01-27 15:13:33 -06:00
|
|
|
};
|
|
|
|
|
|
|
|
window.addEventListener('unhandledrejection', rejectionEvent => {
|
|
|
|
const error = rejectionEvent.reason;
|
2022-11-22 10:43:43 -08:00
|
|
|
const errorString = Errors.toLogFormat(error);
|
2021-09-17 14:27:53 -04:00
|
|
|
log.error(`Top-level unhandled promise rejection: ${errorString}`);
|
2021-01-27 15:13:33 -06:00
|
|
|
});
|
2021-04-16 16:13:13 -07:00
|
|
|
|
2025-06-16 11:59:31 -07:00
|
|
|
const libSignalLog = log.child('@signalapp/libsignal-client');
|
|
|
|
|
2021-04-16 16:13:13 -07:00
|
|
|
initLogger(
|
2021-09-20 11:51:30 -07:00
|
|
|
SignalClientLogLevel.Info,
|
2021-04-16 16:13:13 -07:00
|
|
|
(
|
|
|
|
level: unknown,
|
|
|
|
target: string,
|
|
|
|
file: string | null,
|
|
|
|
line: number | null,
|
|
|
|
message: string
|
|
|
|
) => {
|
|
|
|
let fileString = '';
|
|
|
|
if (file && line) {
|
|
|
|
fileString = ` ${file}:${line}`;
|
|
|
|
} else if (file) {
|
|
|
|
fileString = ` ${file}`;
|
|
|
|
}
|
2025-06-16 11:59:31 -07:00
|
|
|
const logString = `${message} ${target}${fileString}`;
|
2021-04-16 16:13:13 -07:00
|
|
|
|
|
|
|
if (level === SignalClientLogLevel.Trace) {
|
2025-06-16 11:59:31 -07:00
|
|
|
libSignalLog.trace(logString);
|
2021-04-16 16:13:13 -07:00
|
|
|
} else if (level === SignalClientLogLevel.Debug) {
|
2025-06-16 11:59:31 -07:00
|
|
|
libSignalLog.debug(logString);
|
2021-04-16 16:13:13 -07:00
|
|
|
} else if (level === SignalClientLogLevel.Info) {
|
2025-06-16 11:59:31 -07:00
|
|
|
libSignalLog.info(logString);
|
2021-04-16 16:13:13 -07:00
|
|
|
} else if (level === SignalClientLogLevel.Warn) {
|
2025-06-16 11:59:31 -07:00
|
|
|
libSignalLog.warn(logString);
|
2021-04-16 16:13:13 -07:00
|
|
|
} else if (level === SignalClientLogLevel.Error) {
|
2025-06-16 11:59:31 -07:00
|
|
|
libSignalLog.error(logString);
|
2021-04-16 16:13:13 -07:00
|
|
|
} else {
|
2025-06-16 11:59:31 -07:00
|
|
|
libSignalLog.error(`${logString} (unknown log level ${level})`);
|
2021-04-16 16:13:13 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
);
|