Skip to content

Commit 998760a

Browse files
committed
Add more types to variables
1 parent cbe6b5a commit 998760a

File tree

5 files changed

+122
-21
lines changed

5 files changed

+122
-21
lines changed

src/background/index.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
import '../../src/polyfills';
99
import { logger as console } from '../shared/logger';
1010
import { IS_EVENTPAGE, IS_FIREFOX, IS_MV3 } from '../env';
11+
import { ExtensionRequestMessage, ExtensionResponseMessage } from '../types/extension';
12+
import { WebSocketIncomingMessage } from '../types/websocket';
1113
import Config from './config';
1214
import { findTm } from './find_tm';
1315
import Storage from './storage';
@@ -146,14 +148,14 @@ const init = async () => {
146148
const setupWebSocketRelay = (wsClient: LocalWebSocketClient) => {
147149
const allowedActions = ['list', 'get', 'set', 'patch'];
148150

149-
wsClient.listen(async (msg: any) => {
151+
wsClient.listen(async (msg: WebSocketIncomingMessage) => {
150152
console.log('WebSocket message received:', msg);
151153

152-
if (!msg?.action || !allowedActions.includes(msg.action)) return;
154+
if (!msg?.action || !allowedActions.includes(msg.action as string)) return;
153155

154156
msg = { method: 'userscripts', args: {...msg, messageId: msg.messageId, activeUrls: [MAIN_URL]} };
155157

156-
await handleMessage(msg, (response: any) => {
158+
await handleMessage(msg, (response?: ExtensionResponseMessage) => {
157159
try {
158160
wsClient.send({ id: msg.messageId, response });
159161
} catch (e) {
@@ -163,13 +165,13 @@ const init = async () => {
163165
});
164166
};
165167

166-
runtime.onMessage.addListener((request: any, sender: any, sendResponse: any) => {
168+
runtime.onMessage.addListener((request: ExtensionRequestMessage, sender: { id: string }, sendResponse: ExtensionResponseMessage) => {
167169

168170
if (sender.id === runtime.id) {
169171
switch(request.method){
170172
case 'connectWebSocket': {
171173
console.log('Connecting WebSocket client with request:', request);
172-
const { authorization, port } = request.args || {};
174+
const { authorization, port } = (request.args as { authorization?: string; port?: number }) || {};
173175
if (!authorization || !port) {
174176
sendResponse({ ok: false, error: 'Missing authorization or port' });
175177
return true;

src/background/websocket.ts

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,26 @@
1+
import { WebSocketIncomingMessage } from '../types/websocket';
2+
3+
interface Alarm {
4+
name: string;
5+
scheduledTime: number;
6+
periodInMinutes?: number;
7+
}
8+
19
export class LocalWebSocketClient {
210
private ws: WebSocket;
311
public connected: Promise<this>;
412
private resolveConnected!: (value: this) => void;
5-
private rejectConnected!: (reason?: any) => void;
6-
private messageListeners: Array<(msg: any) => void> = [];
13+
private rejectConnected!: (reason?: Event | Error | string) => void;
14+
private messageListeners: Array<(msg: WebSocketIncomingMessage) => void> = [];
715

816
constructor(auth: string, port: number) {
917
const wsUrl = `ws://localhost:${port}`;
10-
this.connected = new Promise(() => {}); // Appease the Typescript gods
18+
this.connected = new Promise(() => void(0)); // Appease the Typescript gods
1119
this._prepareConnection();
1220
try {
1321
this.ws = new WebSocket(wsUrl);
1422
} catch (err) {
15-
this.rejectConnected(err);
23+
this.rejectConnected(err as Error);
1624
throw err;
1725
}
1826
this.ws.onopen = async () => {
@@ -23,7 +31,7 @@ export class LocalWebSocketClient {
2331

2432
(async function (socket: LocalWebSocketClient) {
2533

26-
async function keepGoingAlarm(alarm: any) {
34+
async function keepGoingAlarm(alarm: Alarm) {
2735
if (alarm.name !== 'KeepWebsocketAlive') return;
2836
console.debug('Websocket keepAlive PING');
2937

@@ -69,31 +77,31 @@ export class LocalWebSocketClient {
6977
chrome.alarms.clear('KeepWebsocketAlive')
7078
};
7179

72-
this.ws.onmessage = (event) => {
80+
this.ws.onmessage = (event: MessageEvent) => {
7381
try {
74-
const data = JSON.parse(event.data);
82+
const data: { method: string; token: string } = JSON.parse(event.data);
7583
if (data.method !== 'auth' || data.token !== auth[1]) {
7684
console.error('WebSocket authentication failed', data.method, port); // Not mentioning the auth purposefully
7785
this.rejectConnected('Server Auth failed');
7886
this.ws.close();
7987
}
8088

81-
this.ws.onmessage = (event) => {
82-
let msg = event.data;
89+
this.ws.onmessage = (event: MessageEvent) => {
90+
let msg: string | WebSocketIncomingMessage = event.data;
8391
try {
84-
msg = JSON.parse(event.data);
92+
msg = JSON.parse(event.data) as WebSocketIncomingMessage;
8593
} catch {}
8694
if (data.method === 'ping') {
8795
console.debug('pong!');
8896
return this.ws.send(JSON.stringify({ method: 'pong' }));
8997
}
90-
this.messageListeners.forEach(fn => fn(msg));
98+
this.messageListeners.forEach(fn => fn(msg as WebSocketIncomingMessage));
9199
};
92100
this.ws.send(JSON.stringify({ method: 'authOK' }));
93101
this.resolveConnected(this);
94102
console.log('Ready for messaging:');
95103
} catch (e) {
96-
this.rejectConnected(e);
104+
this.rejectConnected(e as Error);
97105
throw e;
98106
}
99107
};
@@ -128,11 +136,11 @@ export class LocalWebSocketClient {
128136
}
129137

130138

131-
public listen(listener: (msg: any) => void) {
139+
public listen(listener: (msg: WebSocketIncomingMessage) => void) {
132140
this.messageListeners.push(listener);
133141
}
134142

135-
public send(msg: any) {
143+
public send(msg: string | Record<string, unknown>) {
136144
if (this.ws.readyState == WebSocket.OPEN) {
137145
this.ws.send(typeof msg === 'string' ? msg : JSON.stringify(msg));
138146
} else {

src/popup/popup_code_input.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
/// <reference types="chrome" />
22
import { hasHostPermission, requestHostPermission } from '../shared/host_permission';
3+
import { WebSocketConnectResponse, VSCodeDevConfigResponse } from '../types/extension';
34

45
const { runtime } = chrome;
56

@@ -19,7 +20,7 @@ function connect(authorization: string, port: number) {
1920
runtime.sendMessage({
2021
method: 'connectWebSocket',
2122
args: { authorization, port }
22-
}, (response: any) => {
23+
}, (response: WebSocketConnectResponse) => {
2324
const feedback = document.getElementById('result') as HTMLDivElement;
2425
if (response.ok) {
2526
feedback.textContent = `WebSocket connection initiated.`;
@@ -34,7 +35,7 @@ document.addEventListener('DOMContentLoaded', async () => {
3435
let openOnline = document.getElementById('openOnline') as HTMLButtonElement;
3536
openOnline.disabled = true;
3637

37-
let vscodeConf = await runtime.sendMessage({ method: 'vscodeDevConfig' });
38+
let vscodeConf = await runtime.sendMessage({ method: 'vscodeDevConfig' }) as VSCodeDevConfigResponse;
3839

3940
let hpp = await hasHostPermission(vscodeConf.host);
4041

src/types/extension.d.ts

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
// Chrome Extension Message Types
2+
3+
export interface ChromeExtensionRequest {
4+
method: string;
5+
args?: Record<string, unknown>;
6+
}
7+
8+
export interface WebSocketConnectRequest extends ChromeExtensionRequest {
9+
method: 'connectWebSocket';
10+
args: {
11+
authorization: string;
12+
port: number;
13+
};
14+
}
15+
16+
export interface UserscriptsRequest extends ChromeExtensionRequest {
17+
method: 'userscripts';
18+
args: Record<string, unknown>;
19+
}
20+
21+
export interface MethodRequest extends ChromeExtensionRequest {
22+
method: 'openOnlineEditor' | 'vscodeDevConfig';
23+
}
24+
25+
export type ExtensionRequestMessage =
26+
| ChromeExtensionRequest
27+
| MethodRequest
28+
| UserscriptsRequest
29+
| WebSocketConnectRequest;
30+
31+
32+
export interface WebSocketConnectResponse {
33+
ok: boolean;
34+
error?: string;
35+
}
36+
37+
export interface VSCodeDevConfigResponse {
38+
host: string;
39+
}
40+
41+
export type ExtensionResponseMessage =
42+
| WebSocketConnectResponse
43+
| VSCodeDevConfigResponse
44+
| Record<string, unknown>;

src/types/websocket.d.ts

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// WebSocket Communication Types
2+
3+
export interface WebSocketMessage {
4+
method: string;
5+
[key: string]: unknown;
6+
}
7+
8+
9+
export interface WebSocketMethodMessage extends WebSocketMessage {
10+
method: 'authOK' | 'ping' | 'pong';
11+
}
12+
13+
export interface WebSocketAuthMessage extends WebSocketMessage {
14+
method: 'auth';
15+
token: string;
16+
}
17+
18+
export interface WebSocketClosedMessage extends WebSocketMessage {
19+
method: 'closed';
20+
reason: string;
21+
}
22+
23+
export interface WebSocketActionMessage extends WebSocketMessage {
24+
action: 'list' | 'get' | 'set' | 'patch';
25+
messageId: string;
26+
[key: string]: unknown;
27+
}
28+
29+
export type WebSocketIncomingMessage =
30+
| WebSocketAuthMessage
31+
| WebSocketMethodMessage
32+
| WebSocketClosedMessage
33+
| WebSocketActionMessage
34+
| WebSocketMessage;
35+
36+
37+
export interface WebSocketResponse {
38+
id: string;
39+
response: unknown;
40+
}
41+
42+
export type WebSocketOutgoingMessage =
43+
| WebSocketAuthMessage
44+
| WebSocketMethodMessage
45+
| WebSocketResponse
46+
| WebSocketMessage;

0 commit comments

Comments
 (0)