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/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); 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",