Summary: Due to bug in ReactNative `WebSocket` implementation, the `ws.close(1000)` method will not carry the provided `onclose` event number. It would close connection with `1001` instead. Technically, the `1001` also seems as normal status code to close WS connection, so likely we don't wanna use reconnect anyway. This only impacts older RN versions (iOS), as it was later fixed: https://github.com/facebook/react-native/pull/24950/files ## Changelog - Do not reconnect when WS close code is `1001` - GoingAway Pull Request resolved: https://github.com/facebook/flipper/pull/4506 Test Plan: Run `flipperClient.stop()`, then the connection should not be reconnected (only reproducible on RN env.) Reviewed By: lblasa Differential Revision: D43277366 Pulled By: passy fbshipit-source-id: bb39ec7debe53f15e75c850158188d56bf70375d
js-flipper
This package exposes JavaScript bindings to talk from web / Node.js directly to flipper.
Installation
yarn add js-flipper
Usage
How to build Flipper plugins is explained in the flipper documentation: Creating a Flipper plugin. Building a Flipper plugin involves building a plugin for the Desktop app, and a plugin that runs on a Device (web or Node.js). This package is only needed for the plugin that runs on the device (web / Node.js), and wants to use the WebSocket connection to communicate to Flipper.
This package exposes a flipperClient. It has:
addPluginmethod. It accepts apluginparameter, that registers a client plugin and will fire the relevant callbacks if the corresponding desktop plugin is selected in the Flipper Desktop. The full plugin API is documented here.startmethod. It starts the client. It has two arguments:appName- (required) the name displayed in Flipperoptionswhich conforms to the interfaceinterface FlipperClientOptions { // Make the client connect to a different URL urlBase?: string; // Override WebSocket implementation (Node.js folks, it is for you!) websocketFactory?: (url: string) => FlipperWebSocket; // Override how errors are handled (it is simple `console.error` by default) onError?: (e: unknown) => void; // Timeout after which client tries to reconnect to Flipper reconnectTimeout?: number; // Set device ID. Default: random ID persisted to local storage. getDeviceId?: () => Promise<string> | string }
Example (web)
An example plugin can be found in FlipperTicTacToe.js.
The corresponding Desktop plugin ships by default in Flipper, so importing the
above file and dropping the <FlipperTicTacToe /> component somewhere in your
application should work out of the box.
The sources of the corresponding Desktop plugin can be found here.
Node.js
Node.js does not have a built-in WebSocket implementation. You need to install any implementation of WebSockets for Node.js that is compatible with the interface of the web version.
import flipperClient from 'js-flipper';
// Say, you decided to go with 'ws'
// https://github.com/websockets/ws
import WebSocket from 'ws';
// Start the client and pass some options
// You might ask yourself why there is the second argument `{ origin: 'localhost:' }`
// Flipper Desktop verifies the `Origin` header for every WS connection. You need to set it to one of the whitelisted values (see `VALID_WEB_SOCKET_REQUEST_ORIGIN_PREFIXES`).
flipperClient.start('My cool nodejs app', { websocketFactory: url => new WebSocket(url, {origin: 'localhost:'}) });
An example plugin should be somewhat similar to what we have for React. It is currently WIP (do not confuse with RIP!).