From da084b79a9036fbd03c6f91a77e1ac4b65343edf Mon Sep 17 00:00:00 2001 From: Johan Dewe Date: Sat, 27 Feb 2016 13:31:01 +0100 Subject: [PATCH 1/2] Add support for sending binary data in websockets. Implements support for sending ArrayBuffers. --- Libraries/WebSocket/RCTWebSocketModule.m | 6 ++++++ Libraries/WebSocket/WebSocket.js | 6 +++--- Libraries/WebSocket/WebSocketBase.js | 2 +- package.json | 2 +- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/Libraries/WebSocket/RCTWebSocketModule.m b/Libraries/WebSocket/RCTWebSocketModule.m index 6e057f78b148c7..4dac8a99fed57e 100644 --- a/Libraries/WebSocket/RCTWebSocketModule.m +++ b/Libraries/WebSocket/RCTWebSocketModule.m @@ -61,6 +61,12 @@ - (void)dealloc [_sockets[socketID] send:message]; } +RCT_EXPORT_METHOD(sendBinary:(NSString *)base64String socketID:(nonnull NSNumber *)socketID) +{ + NSData *message = [[NSData alloc] initWithBase64EncodedString:base64String options:0]; + [_sockets[socketID] send:message]; +} + RCT_EXPORT_METHOD(close:(nonnull NSNumber *)socketID) { [_sockets[socketID] close]; diff --git a/Libraries/WebSocket/WebSocket.js b/Libraries/WebSocket/WebSocket.js index ec6f722ef7a8ab..df6afeac0c85d7 100644 --- a/Libraries/WebSocket/WebSocket.js +++ b/Libraries/WebSocket/WebSocket.js @@ -53,9 +53,9 @@ class WebSocket extends WebSocketBase { RCTWebSocketModule.send(message, this._socketId); } - sendArrayBufferImpl(): void { - // TODO - console.warn('Sending ArrayBuffers is not yet supported'); + sendArrayBufferImpl(data: ArrayBuffer): void { + var message = base64.fromByteArray(new Uint8Array(data)); + RCTWebSocketModule.sendBinary(message, this._socketId); } _closeWebSocket(id: number, code?: number, reason?: string): void { diff --git a/Libraries/WebSocket/WebSocketBase.js b/Libraries/WebSocket/WebSocketBase.js index 843ae403540c04..162e5ee7125dde 100644 --- a/Libraries/WebSocket/WebSocketBase.js +++ b/Libraries/WebSocket/WebSocketBase.js @@ -102,7 +102,7 @@ class WebSocketBase extends EventTarget { throw new Error('Subclass must define sendStringImpl method'); } - sendArrayBufferImpl(): void { + sendArrayBufferImpl(data: ArrayBuffer): void { throw new Error('Subclass must define sendArrayBufferImpl method'); } } diff --git a/package.json b/package.json index be9c68c74edfa4..b1d82e156a0e35 100644 --- a/package.json +++ b/package.json @@ -136,7 +136,7 @@ "babel-register": "^6.6.0", "babel-types": "^6.6.4", "babylon": "^6.6.4", - "base64-js": "^0.0.8", + "base64-js": "^1.0.4", "bser": "^1.0.2", "chalk": "^1.1.1", "connect": "^2.8.3", From e80baa2720f817d6561ec0a899979d11156c84d5 Mon Sep 17 00:00:00 2001 From: Jeremy Ong Date: Sun, 6 Mar 2016 17:01:17 -0800 Subject: [PATCH 2/2] Add sendBinary method to java WebSocket module --- .../modules/websocket/WebSocketModule.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/websocket/WebSocketModule.java b/ReactAndroid/src/main/java/com/facebook/react/modules/websocket/WebSocketModule.java index af8d79597884e5..e10a57e29c46de 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/websocket/WebSocketModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/websocket/WebSocketModule.java @@ -40,6 +40,7 @@ import okio.Buffer; import okio.BufferedSource; +import okio.ByteString; public class WebSocketModule extends ReactContextBaseJavaModule { @@ -182,6 +183,22 @@ public void send(String message, int id) { } } + @ReactMethod + public void sendBinary(String message, int id) { + WebSocket client = mWebSocketConnections.get(id); + if (client == null) { + // This is a programmer error + throw new RuntimeException("Cannot send a binary message. Unknown WebSocket id" + id); + } + try { + client.sendMessage( + WebSocket.PayloadType.BINARY, + new Buffer().write(ByteString.decodeBase64(message))); + } catch (IOException | IllegalStateException e) { + notifyWebSocketFailed(id, e.getMessage()); + } + } + private void notifyWebSocketFailed(int id, String message) { WritableMap params = Arguments.createMap(); params.putInt("id", id);