Files
Desktop/app/WindowsNotifications.main.ts
2025-12-03 13:03:53 -08:00

79 lines
2.0 KiB
TypeScript

// Copyright 2017 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import { ipcMain as ipc, app } from 'electron';
import type { IpcMainInvokeEvent } from 'electron';
import { join } from 'node:path';
import { Worker } from 'node:worker_threads';
import { AUMID } from './startup_config.main.js';
import type {
WindowsNotificationWorkerDataType,
WindowsNotificationRequestType,
WindowsNotificationData,
} from '../ts/types/notifications.std.js';
import { WindowsNotificationDataSchema } from '../ts/types/notifications.std.js';
import OS from '../ts/util/os/osMain.node.js';
import { createLogger } from '../ts/logging/log.std.js';
const log = createLogger('WindowsNotifications');
let worker: Worker | undefined;
if (OS.isWindows()) {
const scriptPath = join(
app.getAppPath(),
'app',
'WindowsNotificationsWorker.node.js'
);
worker = new Worker(scriptPath, {
workerData: {
AUMID,
} satisfies WindowsNotificationWorkerDataType,
});
}
export function sendDummyKeystroke(): void {
if (worker == null) {
log.warn('sendDummyKeystroke without worker');
return;
}
worker.postMessage({
command: 'sendDummyKeystroke',
} satisfies WindowsNotificationRequestType);
}
export function show(notificationData: WindowsNotificationData): void {
if (worker == null) {
log.warn('show without worker');
return;
}
worker.postMessage({
command: 'show',
notificationData,
} satisfies WindowsNotificationRequestType);
}
ipc.handle(
'windows-notifications:show',
(_event: IpcMainInvokeEvent, data: unknown) => {
try {
const notificationData = WindowsNotificationDataSchema.parse(data);
show(notificationData);
} catch (error) {
log.error('failed to parse notification data', error.stack);
}
}
);
ipc.handle('windows-notifications:clear-all', () => {
if (worker == null) {
log.warn('clear all without worker');
return;
}
worker.postMessage({
command: 'clearAll',
} satisfies WindowsNotificationRequestType);
});