11import type { RestrictedMessenger } from '@metamask/base-controller' ;
22import { 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' ;
48import { HandlerType , logError } from '@metamask/snaps-utils' ;
59import { assert , createDeferredPromise } from '@metamask/utils' ;
610import { nanoid } from 'nanoid' ;
@@ -15,31 +19,39 @@ import { METAMASK_ORIGIN } from '../snaps';
1519
1620const 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
3850export type WebSocketServiceActions =
39- | OpenWebSocket
40- | CloseWebSocket
41- | SendWebSocketMessage
42- | GetAll ;
51+ | WebSocketServiceOpenAction
52+ | WebSocketServiceCloseAction
53+ | WebSocketServiceSendMessageAction
54+ | WebSocketServiceGetAllAction ;
4355
4456export 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