Logo

github Download
WASM & ReactJS

Installing WasmThemis in ReactJS application #

This article is addressed application developers on React who want to use Themis to make cryptographic features in their products. The key step is configuring Webpack to use Themis.

Configure Webpack #

The second step is configuring Webpack. Webpack is the most useful tool for modern JavaScript applications, not only for React applications.

WasmThemis code is generated by Emscripten to be universal. It includes some references to Node.js modules for Node.js support, but they are not accessible in web browsers.

1. Create ReactJS application #

The easiest way to create a new application is to use the command

npx create-react-app my-app

or

yarn create react-app my-app --template typescript

Let us check that’s all correct.

cd my-app
yarn start

2. Use react-app-rewired #

Add react-app-rewired package to tweak create-react-app webpack config without eject.

yarn add react-app-rewired --dev

react-app-rewired gives all the benefits of create-react-app without the limitations of “no config”. You can add plugins and loaders whatever you need.

3. Install copy-webpack-plugin #

Install the webpack copy plugin that will copy libthemis.wasm to the output directory.

yarn add copy-webpack-plugin --dev

Be sure to add --dev option because you need to add the previous two packages to development dependencies.

4. Install Themis and Buffer #

Install WasmThemis if you haven’t previously, and Buffer (used for base64 conversions).

yarn add wasm-themis
yarn add buffer

5. Update package.json #

To use react-app-rewired, update package.json: replace start, build and test values in section “scripts” with the next values.

"scripts": {
   "start": "react-app-rewired start",
   "build": "react-app-rewired build",
   "test" : "react-app-rewired test",
    ... // don't change eject
Important: Do NOT flip the call for the eject script. That gets run only once for a project, after which you are given full control over the webpack configuration making react-app-rewired no longer required. There are no configuration options to rewire for the eject script.

6. Configure config-overrides.js #

Create (or configure already created) config-overrides.js (in the application folder):

const fs = require('fs');
const path = require('path');
const CopyWebpackPlugin = require('copy-webpack-plugin');
const CWD_PATH = fs.realpathSync(process.cwd());
const buildPath = process.env.BUILD_PATH || 'build';
const resolveApp = relativePath => path.resolve(CWD_PATH, relativePath);
const WASM_PATH = path.join(CWD_PATH, 'node_modules', 'wasm-themis/src/libthemis.wasm');
const SCRIPTS_PATH = path.join(resolveApp(buildPath), 'static/js/');
module.exports = function override(config, env) {
   if (!config.plugins) {
       config.plugins = [];
   }
   config.plugins.push(
       new CopyWebpackPlugin({ patterns: [{ from: WASM_PATH, to: SCRIPTS_PATH }] })
   );
   config['resolve']['fallback'] = {
       crypto: false,
       fs: false,
       http: false,
       https: false,
       net: false,
       path: false,
       stream: false,
       tls: false,
       util: false,
       url: false,
       zlib: false,
   }
   return config;
}

This config does two things: it copies libthemis.wasm file to the javascript build folder, and resolves unavailable modules, so WasmThemis can run in the browser.

7. Initialize Themis #

In your application code, initialize Themis and wait for it.

Important: WebAssembly code is loaded and compiled asynchronously so you have to wait for the initialize() promise to complete before using any Themis functions. If Themis is called too early, you will see an error message.
import { initialize } from 'wasm-themis';

function App() {
    useEffect(() => {
        initialize().then(() => {
            console.log("Themis initialized");
        }).catch( err => {
            // Themis initialization must be only once.
        })
    }, []);
}

We recommend to initialize Themis in useEffect() hook or componentDidMount() method.

Next steps #

You are good to go! Next browse code samples or read feature guides to learn how to use WasmThemis effectively.