Skip to content

Commit 2f17427

Browse files
Use ArrayBuffer instead of Blob and handle other mobile quirks
1 parent d2f53d5 commit 2f17427

File tree

4 files changed

+12
-17
lines changed

4 files changed

+12
-17
lines changed

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

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import { WebSocketService } from './WebSocketService';
1010
import {
1111
getRestrictedWebSocketServiceMessenger,
1212
getRootWebSocketServiceMessenger,
13-
sleep,
1413
} from '../test-utils';
1514

1615
const MOCK_WEBSOCKET_URI = 'wss://metamask.io';
@@ -60,9 +59,7 @@ class MockWebSocket {
6059
this.#messageListener(
6160
new MessageEvent('message', {
6261
origin: this.#origin,
63-
data:
64-
// eslint-disable-next-line no-restricted-globals
65-
new Blob([bytes]),
62+
data: bytes.buffer,
6663
}),
6764
);
6865
}
@@ -213,9 +210,6 @@ describe('WebSocketService', () => {
213210
},
214211
);
215212

216-
// Wait for binary decoding.
217-
await sleep(1);
218-
219213
expect(rootMessenger.call).toHaveBeenNthCalledWith(
220214
4,
221215
'SnapController:handleRequest',

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

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ export class WebSocketService {
171171

172172
// eslint-disable-next-line no-restricted-globals
173173
const socket = new WebSocket(url, protocols);
174+
socket.binaryType = 'arraybuffer';
174175

175176
const { promise, resolve, reject } = createDeferredPromise();
176177

@@ -190,7 +191,8 @@ export class WebSocketService {
190191
origin,
191192
code: event.code,
192193
reason: event.reason,
193-
wasClean: event.wasClean,
194+
// wasClean is not available on mobile.
195+
wasClean: event.wasClean ?? null,
194196
});
195197
});
196198

@@ -204,21 +206,20 @@ export class WebSocketService {
204206

205207
socket.addEventListener('error', errorListener);
206208

207-
// eslint-disable-next-line @typescript-eslint/no-misused-promises
208-
socket.addEventListener('message', async (event) => {
209+
socket.addEventListener('message', (event) => {
209210
const isText = typeof event.data === 'string';
210211
const data = isText
211212
? { type: 'text' as const, message: event.data }
212213
: {
213214
type: 'binary' as const,
214-
// We assume binary data to be sent via Blob for now.
215-
message: Array.from(new Uint8Array(await event.data.arrayBuffer())),
215+
// We request that the WebSocket gives us an array buffer.
216+
message: Array.from(new Uint8Array(event.data)),
216217
};
217218

218219
this.#handleEvent(snapId, {
219220
type: 'message',
220221
id,
221-
origin: event.origin,
222+
origin,
222223
data,
223224
});
224225
});

packages/snaps-execution-environments/src/common/validation.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -365,8 +365,8 @@ const WebSocketCloseEventStruct = object({
365365
id: string(),
366366
origin: string(),
367367
code: number(),
368-
reason: string(),
369-
wasClean: boolean(),
368+
reason: nullable(string()),
369+
wasClean: nullable(boolean()),
370370
});
371371

372372
const WebSocketMessageEventStruct = object({

packages/snaps-sdk/src/types/handlers/web-socket-event.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ export type WebSocketCloseEvent = {
2626
id: string;
2727
origin: string;
2828
code: number;
29-
reason: string;
30-
wasClean: boolean;
29+
reason: string | null;
30+
wasClean: boolean | null;
3131
};
3232

3333
/**

0 commit comments

Comments
 (0)