react-native/local-cli/templates
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
..
HelloNavigation Ran PropTypes -> prop-types codemod against Libraries/FBReactKit/js/react-native-github 2017-04-12 16:15:15 -07:00
HelloWorld Add blob implementation with WebSocket integration 2017-07-26 08:23:20 -07:00
README.md CLI: Add basic Navigation template (Chat) 2017-02-02 03:28:35 -08:00

README.md

App templates

This folder contains basic app templates. These get expanded by 'react-native init' when creating a new app to make it easier for anyone to get started.

Chat Example

This is an example React Native app demonstrates ListViews, text input and navigation between a few screens.

screenshot 2017-01-13 17 24 37 screenshot 2017-01-13 17 24 40

Purpose

One problem with React Native is that it is not trivial to get started: react-native init creates a very simple app that renders some text. Everyone then has to figure out how to do very basic things such as adding a list of items fetched from a server, navigating to a screen when a list item is tapped, or handling text input.

This app is a template used by react-native init so it is easier for anyone to get up and running quickly by having an app with a few screens, a ListView and a TextInput that works well with the software keyboard.

Best practices

Another purpose of this app is to define best practices such as:

  • The folder structure of a standalone React Native app
  • A style guide for JavaScript and React - for this we use the AirBnb style guide
  • Naming conventions

We need your feedback to settle on a good set of best practices. Have you built React Native apps? If so, please use the issues in the repo mkonicek/ChatExample to discuss what you think are the best practices that this example should be using.

Running the app locally

cd ChatExample
yarn
react-native run-ios
react-native run-android

(In case you want to use react-navigation master):

# Install dependencies:
cd react-navigation
yarn
yarn pack --filename react-navigation-1.0.0-alpha.tgz
cd ChatExample
yarn
yarn add ~/code/react-navigation/react-navigation-1.0.0-alpha.tgz