Complete rethinking and refactoring of the codebase. The codebase basically consists these 5 moving parts now: 1. Fluence client (and the Particle processor which might be merged with the client) - This part is responsible for initiating Request flows, managing existing requests flows (it keeps the queue of received particles), pulling right strings on request flows to update their state etc 2. Fluence connection - This part is responsible for connecting to network, sending\receiving particles 3. RequestFlow - This is where the state of particle execution process is kept. It is basically a state storage with some control levers to update the state. Each request flow contains some particle lifecycle methods and the AquaCallHandler where all callback logic is kept 4. RequestFlowBuilder - This is where requests are prepared by the user (the developer of the client application) before they are ready to be sent into the network. 5. AquaCallHandler - This is how interpreter callbacks are handled. It is very similar to express.js app and is made of middlewares. Aqua handler is the unified api for both callbacks for our Request flows and non-ours (i.e services that are expected to be called be other peers). See `AquaHandler.ts` for details
Fluence JS SDK
Official SDK for building web-based applications for Fluence
About Fluence
Fluence is an open application platform where apps can build on each other, share data and users
Layer | Tech | Scale | State | Based on |
---|---|---|---|---|
Execution | FCE | Single peer | Disk, network, external processes | Wasm, IT, Wasmer* |
Composition | Aquamarine | Involved peers | Results and signatures | ⇅, π-calculus |
Topology | TrustGraph, DHT* | Distributed with Kademlia* algo | Actual state of the network | libp2p |
Security & Accounting | Blockchain | Whole network | Licenses & payments | substrate? |

Installation
With npm
npm install @fluencelabs/fluence
With yarn
yarn add @fluencelabs/fluence
Getting started
Pick a node to connect to the Fluence network. The easiest way to do so is by using fluence-network-environment package
import { dev } from '@fluencelabs/fluence-network-environment';
export const relayNode = dev[0];
Initialize client
import { createClient, FluenceClient } from '@fluencelabs/fluence';
const client = await createClient(relayNode);
Respond to service function calls
subscribeToEvent(client, 'helloService', 'helloFunction', (args) => {
const [networkInfo] = args;
console.log(networkInfo);
});
Make a particle
const particle = new Particle(
`
(seq
(call myRelay ("peer" "identify") [] result)
(call %init_peer_id% ("helloService" "helloFunction") [result])
)`,
{
myRelay: client.relayPeerId,
},
);
Send it to the network
await sendParticle(client, particle);
Observe the result in browser console
{
"external_addresses": ["/ip4/1.2.3.4/tcp/7777", "/dns4/dev.fluence.dev/tcp/19002"]
}
Documentation
SDK Reference: readme.io
Detailed guide on building applications: readme.io
Sample applications:
- FluentPad: a collaborative text editor with users online status synchronization
- Other demos: (Chat app, Social feed app, Blog platform app)
About Fluence
Developing
Setting up Dev
Install node packages
npm install
Running tests
Tests are split into unit and integration categories. By default integration tests require a locally running Fluence node with 4310 port open for ws connections. The dependency can be started with docker
docker run --rm -e RUST_LOG="info" -p 1210:1210 -p 4310:4310 fluencelabs/fluence:freeze -t 1210 -w 4310 -k gKdiCSUr1TFGFEgu2t8Ch1XEUsrN5A2UfBLjSZvfci9SPR3NvZpACfcpPGC3eY4zma1pk7UvYv5zb1VjvPHwCjj
To run all tests in interactive mode
npm run test
To run only unit tests
npm run test:unit
To run only integration tests
npm run test:unit
To run all tests
npm run test:all
Contributing
While the project is still in the early stages of development, you are welcome to track progress and contribute. As the project is undergoing rapid changes, interested contributors should contact the team before embarking on larger pieces of work. All contributors should consult with and agree to our basic contributing rules.