This is the Javascript client for the Fluence network. The main role of the JS client is to connect to the Fluence Network and allow you to integrate Aqua code into your application.
JS Client only supports the ESM format that means not every Node.js project can install it. You can read more here
-
Install the client:
npm i @fluencelabs/js-client
-
Add the following lines at the beginning of your code:
import { Fluence, randomKras } from "@fluencelabs/js-client"; Fluence.connect(randomKras());
Add a script tag with the JS Client module to your index.html
. The easiest way to do this is using a CDN (
like JSDELIVR or UNPKG).
Here is an example using the JSDELIVR CDN:
<head>
<title>Cool App</title>
<script type="module">
import {
Fluence,
randomKras,
} from "https://cdn.jsdelivr.net/npm/@fluencelabs/js-client/dist/browser/index.min.js";
Fluence.connect(randomKras());
</script>
</head>
If you cannot or don't want to use a CDN, feel free to get the script directly from
the npm package and host it yourself. You can find the script in
the /dist/browser
directory of the package. (Note: this option means that developers understand what they are doing and know
how to serve this file from their own web server.)
Once you've added the client, you can compile Aqua and run it in your application. To compile Aqua, use Fluence CLI.
-
Install the package:
npm i -D @fluencelabs/cli
-
Add a directory in your project for Aqua code, e.g.,
_aqua
. -
Put
*.aqua
files in that directory. -
Add a directory for compiled Aqua files inside your sources. For example, if your app source is located in the
src
directory, you can createsrc/_aqua
. -
To compile Aqua code once, run
npx fluence aqua -i ./_aqua -o ./src/_aqua/
. To watch the changes and to recompile on the fly, add the-w
flag:npx fluence aqua -w -i ./_aqua -o ./src/_aqua/
.Hint: it might be a good idea to add these scripts to your
package.json
file. For example, you project structure could look like this:┣ _aqua ┃ ┗ demo.aqua ┣ src ┃ ┣ _aqua ┃ ┃ ┗ demo.ts ┃ ┗ index.ts ┣ package-lock.json ┣ package.json ┗ tsconfig.json
Then, your
package.json
file should include the following lines:{ ... "scripts": { ... "aqua:compile": "fluence aqua -i ./aqua/ -o ./src/_aqua", "aqua:watch": "fluence aqua -w -i ./aqua/ -o ./src/_aqua" }, ... }
-
Now you can import and call Aqua code from your application like this:
import { getRelayTime } from "./_aqua/demo"; async function buttonClick() { const time = await getRelayTime(); alert("relay time: " + time); }
JS Client uses the debug library under the hood for logging. The log namespaces are structured on a per-component basis, following this structure:
fluence:<component>:trace
fluence:<component>:debug
fluence:<component>:error
Marine JS logs have a slightly different structure:
fluence:marine:<service id>:trace
fluence:marine:<service id>:debug
fluence:marine:<service id>:info
fluence:marine:<service id>:warn
fluence:marine:<service id>:error
Each level corresponds to a logging level in Marine JS.
Star (*
) character can be used as a wildcard to enable logs for multiple components at once. For example, DEBUG=fluence:*
will enable logs for all components. To exclude a component, use a minus sign before the component name. For example, DEBUG=fluence:*,-fluence:particle:*
particle
: everything related to particle processing queueaqua
: infrastructure of aqua compiler supportconnection
: connection layermarine
: Marine JS logs
Enable logs by passing the environment variable DEBUG
with the corresponding log level. For example:
DEBUG=fluence:* node --loader ts-node/esm ./src/index.ts
To enable logs, set the localStorage.debug
variable. For example:
localStorage.debug = "fluence:*";
NOTE
In Chromium-based web browsers (e.g. Brave, Chrome, and Electron), the JavaScript console will be default—only to show messages logged by debug if the "Verbose" log level is enabled.
JS client also has an API for low level interaction with AVM and Marine JS. It could be handy in advanced scenarios when a user fetches AIR dynamically or generates AIR without default Aqua compiler.
callAquaFunction
Allows to call aqua function without schema.
registerService
Gives an ability to register service without schema. Passed service
could be
- Plain object. In this case all function properties will be registered as AIR service functions.
- Class instance. All class methods without inherited ones will be registered as AIR service functions.
To hack on the Fluence JS Client itself, please refer to the development page.
The starting point for all documentation related to Fluence is fluence.dev. We also have an active YouTube channel.
Please, file an issue if you find a bug. You can also contact us at Discord or Telegram. We will do our best to resolve the issue ASAP.
Any interested person is welcome to contribute to the project. Please, make sure you read and follow some basic rules.
All software code is copyright (c) Fluence DAO, Inc. under the Apache-2.0 license.