1- import { EventEmitter } from "node:events " ;
1+ import * as z from "zod " ;
22
33import {
44 type ClipboardDecrypter ,
@@ -7,11 +7,11 @@ import {
77import { type NotificationData , newNotification } from "./notification/index.ts" ;
88import { ipcRenderer } from "./typed-ipc-renderer.ts" ;
99
10- type ListenerType = ( ...arguments_ : any [ ] ) => void ;
10+ type ListenerType = ( ...arguments_ : unknown [ ] ) => void ;
1111
1212/* eslint-disable @typescript-eslint/naming-convention */
1313export type ElectronBridge = {
14- send_event : ( eventName : string | symbol , ...arguments_ : unknown [ ] ) => boolean ;
14+ send_event : ( eventName : string , ...arguments_ : unknown [ ] ) => boolean ;
1515 on_event : ( eventName : string , listener : ListenerType ) => void ;
1616 new_notification : (
1717 title : string ,
@@ -32,15 +32,26 @@ let idle = false;
3232// Indicates the time at which user was last active
3333let lastActive = Date . now ( ) ;
3434
35- export const bridgeEvents = new EventEmitter ( ) ; // eslint-disable-line unicorn/prefer-event-target
35+ export const bridgeEvents = new EventTarget ( ) ;
36+
37+ export class BridgeEvent extends Event {
38+ constructor (
39+ type : string ,
40+ public readonly arguments_ : unknown [ ] = [ ] ,
41+ ) {
42+ super ( type ) ;
43+ }
44+ }
3645
3746/* eslint-disable @typescript-eslint/naming-convention */
3847const electron_bridge : ElectronBridge = {
39- send_event : ( eventName : string | symbol , ...arguments_ : unknown [ ] ) : boolean =>
40- bridgeEvents . emit ( eventName , ... arguments_ ) ,
48+ send_event : ( eventName : string , ...arguments_ : unknown [ ] ) : boolean =>
49+ bridgeEvents . dispatchEvent ( new BridgeEvent ( eventName , arguments_ ) ) ,
4150
4251 on_event ( eventName : string , listener : ListenerType ) : void {
43- bridgeEvents . on ( eventName , listener ) ;
52+ bridgeEvents . addEventListener ( eventName , ( event ) => {
53+ listener ( ...z . instanceof ( BridgeEvent ) . parse ( event ) . arguments_ ) ;
54+ } ) ;
4455 } ,
4556
4657 new_notification : (
@@ -65,28 +76,25 @@ const electron_bridge: ElectronBridge = {
6576} ;
6677/* eslint-enable @typescript-eslint/naming-convention */
6778
68- bridgeEvents . on ( "total_unread_count" , ( unreadCount : unknown ) => {
69- if ( typeof unreadCount !== "number" ) {
70- throw new TypeError ( "Expected string for unreadCount" ) ;
71- }
72-
79+ bridgeEvents . addEventListener ( "total_unread_count" , ( event ) => {
80+ const [ unreadCount ] = z
81+ . tuple ( [ z . number ( ) ] )
82+ . parse ( z . instanceof ( BridgeEvent ) . parse ( event ) . arguments_ ) ;
7383 ipcRenderer . send ( "unread-count" , unreadCount ) ;
7484} ) ;
7585
76- bridgeEvents . on ( "realm_name" , ( realmName : unknown ) => {
77- if ( typeof realmName !== "string" ) {
78- throw new TypeError ( "Expected string for realmName" ) ;
79- }
80-
86+ bridgeEvents . addEventListener ( "realm_name" , ( event ) => {
87+ const [ realmName ] = z
88+ . tuple ( [ z . string ( ) ] )
89+ . parse ( z . instanceof ( BridgeEvent ) . parse ( event ) . arguments_ ) ;
8190 const serverUrl = location . origin ;
8291 ipcRenderer . send ( "realm-name-changed" , serverUrl , realmName ) ;
8392} ) ;
8493
85- bridgeEvents . on ( "realm_icon_url" , ( iconUrl : unknown ) => {
86- if ( typeof iconUrl !== "string" ) {
87- throw new TypeError ( "Expected string for iconUrl" ) ;
88- }
89-
94+ bridgeEvents . addEventListener ( "realm_icon_url" , ( event ) => {
95+ const [ iconUrl ] = z
96+ . tuple ( [ z . string ( ) ] )
97+ . parse ( z . instanceof ( BridgeEvent ) . parse ( event ) . arguments_ ) ;
9098 const serverUrl = location . origin ;
9199 ipcRenderer . send (
92100 "realm-icon-changed" ,
0 commit comments