@@ -11,6 +11,26 @@ import type {
11
11
IpcMessage ,
12
12
} from './types.js' ;
13
13
14
+ function isIpcMessage ( value : unknown ) : value is IpcMessage {
15
+ return (
16
+ typeof value === 'object' &&
17
+ value !== null &&
18
+ 'id' in value &&
19
+ 'kind' in value &&
20
+ 'data' in value
21
+ ) ;
22
+ }
23
+
24
+ function getErrorMessage ( data : unknown ) : string {
25
+ if ( typeof data === 'object' && data !== null && 'message' in data ) {
26
+ const record = data as Record < string , unknown > ;
27
+ if ( typeof record . message === 'string' ) {
28
+ return record . message ;
29
+ }
30
+ }
31
+ return String ( data ) ;
32
+ }
33
+
14
34
/**
15
35
* Browser implementation of RslintService using web workers
16
36
*/
@@ -39,18 +59,18 @@ export class BrowserRslintService implements RslintServiceInterface {
39
59
/**
40
60
* Initialize the web worker
41
61
*/
42
- private async ensureWorker ( wasmUrl : string ) : Promise < Worker > {
62
+ private ensureWorker ( wasmUrl : string ) : void {
43
63
if ( ! this . worker ) {
44
64
this . worker = new Worker ( this . workerUrl , { name : 'rslint-worker.js' } ) ;
45
65
46
- this . worker . onmessage = event => {
66
+ this . worker . onmessage = ( event : MessageEvent < Uint8Array > ) => {
47
67
this . handlePacket ( event . data ) ;
48
68
} ;
49
69
50
- this . worker . onerror = error => {
70
+ this . worker . onerror = ( error : ErrorEvent ) => {
51
71
console . error ( 'Worker error:' , error ) ;
52
72
// Reject all pending messages
53
- for ( const [ id , pending ] of this . pendingMessages ) {
73
+ for ( const [ , pending ] of this . pendingMessages ) {
54
74
pending . reject ( new Error ( `Worker error: ${ error . message } ` ) ) ;
55
75
}
56
76
this . pendingMessages . clear ( ) ;
@@ -60,7 +80,6 @@ export class BrowserRslintService implements RslintServiceInterface {
60
80
data : { version : '1.0.0' , wasmURL : wasmUrl } ,
61
81
} ) ;
62
82
}
63
- return this . worker ;
64
83
}
65
84
66
85
/**
@@ -100,8 +119,12 @@ export class BrowserRslintService implements RslintServiceInterface {
100
119
101
120
// Handle the message
102
121
try {
103
- const parsed : IpcMessage = JSON . parse ( message ) ;
104
- this . handleResponse ( parsed ) ;
122
+ const parsed = JSON . parse ( message ) as unknown ;
123
+ if ( isIpcMessage ( parsed ) ) {
124
+ this . handleResponse ( parsed ) ;
125
+ } else {
126
+ console . error ( 'Invalid message format:' , parsed ) ;
127
+ }
105
128
} catch ( err ) {
106
129
console . error ( 'Error parsing message:' , err ) ;
107
130
}
@@ -139,8 +162,8 @@ export class BrowserRslintService implements RslintServiceInterface {
139
162
/**
140
163
* Send a message to the worker
141
164
*/
142
- async sendMessage ( kind : string , data : any ) : Promise < any > {
143
- return new Promise ( ( resolve , reject ) => {
165
+ async sendMessage ( kind : string , data : unknown ) : Promise < unknown > {
166
+ const result = await new Promise < unknown > ( ( resolve , reject ) => {
144
167
const id = this . nextMessageId ++ ;
145
168
const message : IpcMessage = { id, kind, data } ;
146
169
@@ -150,6 +173,7 @@ export class BrowserRslintService implements RslintServiceInterface {
150
173
// Send message to worker
151
174
this . worker ! . postMessage ( message ) ;
152
175
} ) ;
176
+ return result ;
153
177
}
154
178
155
179
/**
@@ -163,7 +187,7 @@ export class BrowserRslintService implements RslintServiceInterface {
163
187
this . pendingMessages . delete ( id ) ;
164
188
165
189
if ( kind === 'error' ) {
166
- pending . reject ( new Error ( data . message ) ) ;
190
+ pending . reject ( new Error ( getErrorMessage ( data ) ) ) ;
167
191
} else {
168
192
pending . resolve ( data ) ;
169
193
}
0 commit comments