diff --git a/Libraries/WebSocket/RCTWebSocketModule.m b/Libraries/WebSocket/RCTWebSocketModule.m index a1933533194126..e0d85734025fe5 100644 --- a/Libraries/WebSocket/RCTWebSocketModule.m +++ b/Libraries/WebSocket/RCTWebSocketModule.m @@ -76,8 +76,18 @@ - (void)dealloc - (void)webSocket:(RCTSRWebSocket *)webSocket didReceiveMessage:(id)message { + + NSString * type; + if ([message isKindOfClass:[NSData class]]) { + type = @"binary"; + message = [message base64EncodedStringWithOptions:0]; + } else { + type = @"text"; + } + [_bridge.eventDispatcher sendDeviceEventWithName:@"websocketMessage" body:@{ @"data": message, + @"type": type, @"id": webSocket.reactTag }]; } diff --git a/Libraries/WebSocket/WebSocket.js b/Libraries/WebSocket/WebSocket.js index 3ce40bc6772824..9906f0256dabcc 100644 --- a/Libraries/WebSocket/WebSocket.js +++ b/Libraries/WebSocket/WebSocket.js @@ -17,6 +17,8 @@ var Platform = require('Platform'); var WebSocketBase = require('WebSocketBase'); var WebSocketEvent = require('WebSocketEvent'); +var base64 = require('base64-js'); + var WebSocketId = 0; var CLOSE_NORMAL = 1000; @@ -78,9 +80,20 @@ class WebSocket extends WebSocketBase { if (ev.id !== id) { return; } - var event = new WebSocketEvent('message', { - data: ev.data - }); + + var message; + + if (ev.type === 'text') { + message = { + data: ev.data + }; + } else if (ev.type === 'binary') { + message = { + data: base64.toByteArray(ev.data).buffer + }; + } + + var event = new WebSocketEvent('message', message); this.onmessage && this.onmessage(event); this.dispatchEvent(event); }), diff --git a/package.json b/package.json index 5be50c910962f8..0cfe98c90f245f 100644 --- a/package.json +++ b/package.json @@ -83,6 +83,7 @@ "babel-polyfill": "^6.0.16", "babel-types": "^6.1.2", "babylon": "^6.1.2", + "base64-js": "0.0.8", "bser": "^1.0.2", "chalk": "^1.1.1", "connect": "^2.8.3",