react-native/local-cli
Philipp von Weitershausen ed903099b4 Add blob implementation with WebSocket integration
Summary:
This is the first PR from a series of PRs grabbou and me will make to add blob support to React Native. The next PR will include blob support for XMLHttpRequest.

I'd like to get this merged with minimal changes to preserve the attribution. My next PR can contain bigger changes.

Blobs are used to transfer binary data between server and client. Currently React Native lacks a way to deal with binary data. The only thing that comes close is uploading files through a URI.

Current workarounds to transfer binary data includes encoding and decoding them to base64 and and transferring them as string, which is not ideal, since it increases the payload size and the whole payload needs to be sent via the bridge every time changes are made.

The PR adds a way to deal with blobs via a new native module. The blob is constructed on the native side and the data never needs to pass through the bridge. Currently the only way to create a blob is to receive a blob from the server via websocket.

The PR is largely a direct port of https://github.com/silklabs/silk/tree/master/react-native-blobs by philikon into RN (with changes to integrate with RN), and attributed as such.

> **Note:** This is a breaking change for all people running iOS without CocoaPods. You will have to manually add `RCTBlob.xcodeproj` to your `Libraries` and then, add it to Build Phases. Just follow the process of manual linking. We'll also need to document this process in the release notes.

Related discussion - https://github.com/facebook/react-native/issues/11103

- `Image` can't show image when `URL.createObjectURL` is used with large images on Android

The websocket integration can be tested via a simple server,

```js
const fs = require('fs');
const http = require('http');

const WebSocketServer = require('ws').Server;

const wss = new WebSocketServer({
  server: http.createServer().listen(7232),
});

wss.on('connection', (ws) => {
  ws.on('message', (d) => {
    console.log(d);
  });

  ws.send(fs.readFileSync('./some-file'));
});
```

Then on the client,

```js
var ws = new WebSocket('ws://localhost:7232');

ws.binaryType = 'blob';

ws.onerror = (error) => {
  console.error(error);
};

ws.onmessage = (e) => {
  console.log(e.data);
  ws.send(e.data);
};
```

cc brentvatne ide
Closes https://github.com/facebook/react-native/pull/11417

Reviewed By: sahrens

Differential Revision: D5188484

Pulled By: javache

fbshipit-source-id: 6afcbc4d19aa7a27b0dc9d52701ba400e7d7e98f
2017-07-26 08:23:20 -07:00
..
__mocks__ Fix lint in local-cli 2016-11-14 11:13:42 -08:00
bundle metro-bundler: remove hardcoded AssetRegistry path 2017-07-24 17:16:39 -07:00
core metro-bundler: remove hardcoded AssetRegistry path 2017-07-24 17:16:39 -07:00
dependencies Add missing "getPolyfills" tag 2017-07-21 22:04:36 -07:00
eject Eject CLI command to re-create native folders 2017-02-03 12:58:46 -08:00
generator CLI: Add support for templates fetched from npm 2017-02-27 14:04:57 -08:00
info added info CLI command 2017-07-18 11:45:47 -07:00
init CLI: Add support for project templates 2017-02-06 12:31:25 -08:00
install Use Yarn for Install/Uninstall CLI if available 2017-02-02 05:13:33 -08:00
library Fix new-library to copy to current project 2017-05-29 12:46:08 -07:00
link Support additional dependency declaration format 2017-07-11 11:18:56 -07:00
logAndroid Use native Promise in local-cli 2016-11-21 10:28:34 -08:00
logIOS Use native Promise in local-cli 2016-11-21 10:28:34 -08:00
runAndroid Move packager launcher scripts outside of `packager/` 2017-05-23 16:17:09 -07:00
runIOS Run eslint on all js files 2017-07-12 14:09:53 -07:00
server metro-bundler: remove hardcoded AssetRegistry path 2017-07-24 17:16:39 -07:00
templates Add blob implementation with WebSocket integration 2017-07-26 08:23:20 -07:00
upgrade New upgrading process, relying on Git 2016-11-28 08:28:35 -08:00
util Upgrade metro-bundler to v0.10.0 2017-07-21 09:40:15 -07:00
.eslintrc disable `no-alert` eslint rule for node code 2017-05-03 06:51:47 -07:00
cli.js packager: centralize babelRegisterOnly callsites 2017-01-06 06:13:54 -08:00
cliEntry.js Stronger config types 2017-05-03 06:51:47 -07:00
commands.js added info CLI command 2017-07-18 11:45:47 -07:00
setup_env.bat Fix comments on .bat file 2015-10-28 21:36:07 -04:00
setup_env.sh CLI: Adding shebang to setup_env.sh script 2017-05-31 02:46:23 -07:00
wrong-react-native.js Run eslint on all js files 2017-07-12 14:09:53 -07:00