1
0
Fork 0
mirror of https://gitlab.com/futo-org/fcast.git synced 2025-06-24 21:25:23 +00:00

Receivers: Renamed store module and added Electron option to ignore certificate errors

This commit is contained in:
Michael Hollister 2025-06-12 14:13:05 -05:00
parent 6b16af4b7d
commit fa246a3f08
6 changed files with 136 additions and 85 deletions

View file

@ -0,0 +1,98 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
import * as fs from 'fs';
import { Logger, LoggerType } from 'common/Logger';
const logger = new Logger('Settings', LoggerType.BACKEND);
export interface LoggerSettings {
level: string,
}
export interface NetworkSettings {
ignoreCertificateErrors: boolean,
deviceName: string,
}
export interface UISettings {
noMainWindow: boolean,
fullscreen: boolean,
mainWindowBackground: string,
}
export interface UpdaterSettings {
channel: string,
checkForUpdatesOnStart: boolean,
}
export interface Settings {
storeVersion: number,
log: LoggerSettings,
network: NetworkSettings,
ui: UISettings,
updater: UpdaterSettings,
}
export class Settings {
private static instance: Settings = null;
private static readonly version = 1;
private static path?: string = null;
public static json: Settings;
constructor(path?: string) {
if (!Settings.instance) {
// @ts-ignore
if (TARGET === 'electron') {
Settings.path = path;
Settings.json = JSON.parse(fs.readFileSync(path, { encoding: 'utf8', flag: 'r' })) as Settings;
logger.info('Read settings file:', Settings.json);
Settings.setDefault();
// @ts-ignore
} else if (TARGET === 'webOS') {
// todo
} else {
// @ts-ignore
logger.warn(`Attempting to initialize Settings on unsupported target: ${TARGET}`);
}
Settings.instance = this;
}
}
private static setDefault() {
Settings.json.storeVersion = Settings.json.storeVersion === undefined ? Settings.version : Settings.json.storeVersion;
Settings.json.log = Settings.json.log === undefined ? {} as LoggerSettings : Settings.json.log;
Settings.json.network = Settings.json.network === undefined ? {} as NetworkSettings : Settings.json.network;
Settings.json.ui = Settings.json.ui === undefined ? {} as UISettings : Settings.json.ui;
Settings.json.updater = Settings.json.updater === undefined ? {} as UpdaterSettings : Settings.json.updater;
Settings.json.log.level = Settings.json.log.level === undefined ? 'INFO' : Settings.json.log.level;
Settings.json.network.deviceName = Settings.json.network.deviceName === undefined ? '' : Settings.json.network.deviceName;
Settings.json.network.ignoreCertificateErrors = Settings.json.network.ignoreCertificateErrors === undefined ? false : Settings.json.network.ignoreCertificateErrors;
Settings.json.ui.noMainWindow = Settings.json.ui.noMainWindow === undefined ? false : Settings.json.ui.noMainWindow;
Settings.json.ui.fullscreen = Settings.json.ui.fullscreen === undefined ? false : Settings.json.ui.fullscreen;
Settings.json.ui.mainWindowBackground = Settings.json.ui.mainWindowBackground === undefined ? '' : Settings.json.ui.mainWindowBackground;
Settings.json.updater.channel = Settings.json.updater.channel === undefined ? '' : Settings.json.updater.channel;
Settings.json.updater.checkForUpdatesOnStart = Settings.json.updater.checkForUpdatesOnStart === undefined ? true : Settings.json.updater.checkForUpdatesOnStart;
Settings.save();
}
public static save() {
// @ts-ignore
if (TARGET === 'electron') {
logger.info('Saving settings file:', Settings.json);
fs.writeFileSync(Settings.path, JSON.stringify(Settings.json, null, 4));
// @ts-ignore
} else if (TARGET === 'webOS') {
// todo
} else {
// @ts-ignore
logger.warn(`Attempting to initialize Settings on unsupported target: ${TARGET}`);
}
}
}

View file

@ -1,72 +0,0 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
import * as fs from 'fs';
import { Logger, LoggerType } from 'common/Logger';
const logger = new Logger('Store', LoggerType.BACKEND);
export interface NetworkSettings {
ignoreCertificateErrors: boolean,
deviceName: string,
}
export interface UISettings {
mainWindowBackground: string,
}
export interface UpdaterSettings {
channel: string,
checkForUpdatesOnStart: boolean,
}
export interface Settings {
storeVersion: number,
network: NetworkSettings,
ui: UISettings,
updater: UpdaterSettings,
}
export class Store {
private static instance: Store = null;
private static storeVersion = 1;
private static path?: string = null;
public static settings: Settings = null;
constructor(path?: string) {
if (!Store.instance) {
// @ts-ignore
if (TARGET === 'electron') {
Store.path = path;
Store.settings = JSON.parse(fs.readFileSync(path, { encoding: 'utf8', flag: 'r' })) as Settings;
logger.info('Read settings file:', Store.settings);
if (Store.settings === undefined) {
Store.settings.storeVersion = Store.storeVersion;
fs.writeFileSync(Store.path, JSON.stringify(Store.settings));
}
// @ts-ignore
} else if (TARGET === 'webOS') {
// todo
} else {
// @ts-ignore
logger.warn(`Attempting to initialize Store on unsupported target: ${TARGET}`);
}
Store.instance = this;
}
}
public static saveSettings() {
// @ts-ignore
if (TARGET === 'electron') {
logger.info('Saving settings file:', Store.settings);
fs.writeFileSync(Store.path, JSON.stringify(Store.settings));
// @ts-ignore
} else if (TARGET === 'webOS') {
// todo
} else {
// @ts-ignore
logger.warn(`Attempting to initialize Store on unsupported target: ${TARGET}`);
}
}
}

View file

@ -1,5 +1,6 @@
/* eslint-disable @typescript-eslint/ban-ts-comment */
/* eslint-disable @typescript-eslint/no-explicit-any */
import { toast, ToastIcon } from 'common/components/Toast';
import { Logger, LoggerType } from 'common/Logger';
import { EventMessage } from 'common/Packets';
const logger = new Logger('MainWindow', LoggerType.FRONTEND);
@ -34,14 +35,18 @@ if (TARGET === 'electron') {
// @ts-ignore
const electronAPI = __non_webpack_require__('electron');
electronAPI.ipcRenderer.on("device-info", (_event, value: any) => {
electronAPI.ipcRenderer.on('device-info', (_event, value: any) => {
preloadData.deviceInfo = value;
})
electronAPI.ipcRenderer.on("event-subscribed-keys-update", (_event, value: { keyDown: Set<string>, keyUp: Set<string> }) => {
electronAPI.ipcRenderer.on('event-subscribed-keys-update', (_event, value: { keyDown: Set<string>, keyUp: Set<string> }) => {
preloadData.subscribedKeys.keyDown = value.keyDown;
preloadData.subscribedKeys.keyUp = value.keyUp;
})
electronAPI.ipcRenderer.on('toast', (_event, message: string, icon: ToastIcon = ToastIcon.INFO, duration: number = 5000) => {
toast(message, icon, duration);
})
electronAPI.contextBridge.exposeInMainWorld('targetAPI', {
onDeviceInfo: (callback: any) => electronAPI.ipcRenderer.on('device-info', callback),
getDeviceInfo: () => preloadData.deviceInfo,

View file

@ -2,6 +2,7 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
import { PlaybackErrorMessage, PlaybackUpdateMessage, VolumeUpdateMessage, EventMessage, PlayMessage } from 'common/Packets';
import { Logger, LoggerType } from 'common/Logger';
import { toast, ToastIcon } from 'common/components/Toast';
const logger = new Logger('PlayerWindow', LoggerType.FRONTEND);
// Cannot directly pass the object to the renderer for some reason...
@ -35,11 +36,15 @@ if (TARGET === 'electron') {
// @ts-ignore
const electronAPI = __non_webpack_require__('electron');
electronAPI.ipcRenderer.on("event-subscribed-keys-update", (_event, value: { keyDown: Set<string>, keyUp: Set<string> }) => {
electronAPI.ipcRenderer.on('event-subscribed-keys-update', (_event, value: { keyDown: Set<string>, keyUp: Set<string> }) => {
preloadData.subscribedKeys.keyDown = value.keyDown;
preloadData.subscribedKeys.keyUp = value.keyUp;
})
electronAPI.ipcRenderer.on('toast', (_event, message: string, icon: ToastIcon = ToastIcon.INFO, duration: number = 5000) => {
toast(message, icon, duration);
})
electronAPI.contextBridge.exposeInMainWorld('targetAPI', {
sendPlaybackUpdate: (update: PlaybackUpdateMessage) => electronAPI.ipcRenderer.send('send-playback-update', update),
sendVolumeUpdate: (update: VolumeUpdateMessage) => electronAPI.ipcRenderer.send('send-volume-update', update),