Skip to content

Commit 2e7ba42

Browse files
Use hash private
1 parent 7751e46 commit 2e7ba42

File tree

1 file changed

+44
-33
lines changed

1 file changed

+44
-33
lines changed

packages/snaps-controllers/src/websocket/WebSocketService.ts

Lines changed: 44 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
import type { RestrictedMessenger } from '@metamask/base-controller';
22
import { rpcErrors } from '@metamask/rpc-errors';
3-
import type { SnapId, WebSocketEvent } from '@metamask/snaps-sdk';
3+
import type {
4+
GetWebSocketsResult,
5+
SnapId,
6+
WebSocketEvent,
7+
} from '@metamask/snaps-sdk';
48
import { HandlerType, logError } from '@metamask/snaps-utils';
59
import { assert, createDeferredPromise } from '@metamask/utils';
610
import { nanoid } from 'nanoid';
@@ -15,31 +19,39 @@ import { METAMASK_ORIGIN } from '../snaps';
1519

1620
const serviceName = 'WebSocketService';
1721

18-
export type OpenWebSocket = {
22+
export type WebSocketServiceOpenAction = {
1923
type: `${typeof serviceName}:open`;
20-
handler: WebSocketService['open'];
24+
handler: (
25+
snapId: SnapId,
26+
url: string,
27+
protocols?: string[],
28+
) => Promise<string>;
2129
};
2230

23-
export type CloseWebSocket = {
31+
export type WebSocketServiceCloseAction = {
2432
type: `${typeof serviceName}:close`;
25-
handler: WebSocketService['close'];
33+
handler: (snapId: SnapId, id: string) => void;
2634
};
2735

28-
export type SendWebSocketMessage = {
36+
export type WebSocketServiceSendMessageAction = {
2937
type: `${typeof serviceName}:sendMessage`;
30-
handler: WebSocketService['sendMessage'];
38+
handler: (
39+
snapId: SnapId,
40+
id: string,
41+
data: string | number[],
42+
) => Promise<void>;
3143
};
3244

33-
export type GetAll = {
45+
export type WebSocketServiceGetAllAction = {
3446
type: `${typeof serviceName}:getAll`;
35-
handler: WebSocketService['getAll'];
47+
handler: (snapId: SnapId) => GetWebSocketsResult;
3648
};
3749

3850
export type WebSocketServiceActions =
39-
| OpenWebSocket
40-
| CloseWebSocket
41-
| SendWebSocketMessage
42-
| GetAll;
51+
| WebSocketServiceOpenAction
52+
| WebSocketServiceCloseAction
53+
| WebSocketServiceSendMessageAction
54+
| WebSocketServiceGetAllAction;
4355

4456
export type WebSocketServiceAllowedActions = HandleSnapRequest;
4557

@@ -81,35 +93,34 @@ export class WebSocketService {
8193

8294
this.#messenger.registerActionHandler(
8395
`${serviceName}:open`,
84-
this.open.bind(this),
96+
async (...args) => this.#open(...args),
8597
);
8698

87-
this.#messenger.registerActionHandler(
88-
`${serviceName}:close`,
89-
this.close.bind(this),
99+
this.#messenger.registerActionHandler(`${serviceName}:close`, (...args) =>
100+
this.#close(...args),
90101
);
91102

92103
this.#messenger.registerActionHandler(
93104
`${serviceName}:sendMessage`,
94-
this.sendMessage.bind(this),
105+
async (...args) => this.#sendMessage(...args),
95106
);
96107

97-
this.#messenger.registerActionHandler(
98-
`${serviceName}:getAll`,
99-
this.getAll.bind(this),
108+
this.#messenger.registerActionHandler(`${serviceName}:getAll`, (...args) =>
109+
this.#getAll(...args),
100110
);
101111

102112
this.#messenger.subscribe('SnapController:snapUpdated', (snap) => {
103-
this.closeAll(snap.id);
113+
this.#closeAll(snap.id);
104114
});
105115

106116
this.#messenger.subscribe('SnapController:snapUninstalled', (snap) => {
107-
this.closeAll(snap.id);
117+
this.#closeAll(snap.id);
108118
});
109119

110-
// Due to local Snaps not currently triggering uninstalled we also close connections for new Snaps.
120+
// Due to local Snaps not currently emitting snapUinstalled we also have to
121+
// listen to snapInstalled.
111122
this.#messenger.subscribe('SnapController:snapInstalled', (snap) => {
112-
this.closeAll(snap.id);
123+
this.#closeAll(snap.id);
113124
});
114125
}
115126

@@ -125,7 +136,7 @@ export class WebSocketService {
125136
}
126137

127138
#exists(snapId: SnapId, url: string) {
128-
return this.getAll(snapId).some((socket) => socket.url === url);
139+
return this.#getAll(snapId).some((socket) => socket.url === url);
129140
}
130141

131142
#handleEvent(snapId: SnapId, event: WebSocketEvent) {
@@ -144,7 +155,7 @@ export class WebSocketService {
144155
});
145156
}
146157

147-
async open(snapId: SnapId, url: string, protocols?: string[]) {
158+
async #open(snapId: SnapId, url: string, protocols?: string[]) {
148159
assert(
149160
!this.#exists(snapId, url),
150161
`An open WebSocket connection to ${url} already exists.`,
@@ -225,21 +236,21 @@ export class WebSocketService {
225236
return id;
226237
}
227238

228-
close(snapId: SnapId, id: string) {
239+
#close(snapId: SnapId, id: string) {
229240
const { socket } = this.#get(snapId, id);
230241

231242
socket.close();
232243

233244
this.#sockets.delete(id);
234245
}
235246

236-
closeAll(snapId: SnapId) {
237-
for (const socket of this.getAll(snapId)) {
238-
this.close(snapId, socket.id);
247+
#closeAll(snapId: SnapId) {
248+
for (const socket of this.#getAll(snapId)) {
249+
this.#close(snapId, socket.id);
239250
}
240251
}
241252

242-
async sendMessage(snapId: SnapId, id: string, data: string | number[]) {
253+
async #sendMessage(snapId: SnapId, id: string, data: string | number[]) {
243254
const { socket, openPromise } = this.#get(snapId, id);
244255

245256
await openPromise;
@@ -249,7 +260,7 @@ export class WebSocketService {
249260
socket.send(wrappedData);
250261
}
251262

252-
getAll(snapId: SnapId) {
263+
#getAll(snapId: SnapId) {
253264
return [...this.#sockets.values()]
254265
.filter((socket) => socket.snapId === snapId)
255266
.map((socket) => ({

0 commit comments

Comments
 (0)