Indigo agent for NodeJS
This NodeJS module exposes functions to create Indigo agents using Javascript.
Copyright 2017 Stratumn SAS. All rights reserved.
Unless otherwise noted, the Stratumn Agent Javascript Library source files are distributed under the Apache License 2.0 found in the LICENSE file.
Creating an HTTP server for an agent
var express = require('express');
var Agent = require('@indigocore/agent');
var plugins = Agent.plugins;
var actions = require('./lib/actions');
var storeHttpClient = Agent.storeHttpClient(process.env.STRATUMN_STORE_URL || 'http://store:5000');
var fossilizerHttpClient = Agent.fossilizerHttpClient(process.env.STRATUMN_FOSSILIZER_URL || 'http://fossilizer:6000');
var agent = Agent.create({
agentUrl: 'http://localhost:3000',
});
agent.addProcess("my_first_process", actions, storeHttpClient, fossilizerHttpClient, {
plugins: [plugins.localTime]
});
var agentHttpServer = Agent.httpServer(agent, { cors: {} });
const app = express();
app.disable('x-powered-by');
app.use('/', agentHttpServer);
const server = Agent.websocketServer(app, storeHttpClient);
server.listen(3000, () => {
console.log('Listening on ' + server.address().port);
});
agent.addProcess("my_second_process", actions, storeHttpClient, fossilizerHttpClient, {
plugins: [plugins.localTime]
});
The documentation for the HTTP API is available in doc/swaggerDoc.md. It uses OpenAPI ver. 2 (fka Swagger). You can also use doc/swagger.json with Swagger UI for instance:
docker run -p 8080:8080 -e SWAGGER_JSON=/opt/swagger.json -v $(pwd)/doc:/opt swaggerapi/swagger-ui
Advanced usage
create
creates an agent instance.storeHttpClient
creates an instance to work with stores via HTTP.fossilizerHttpClient
creates an instance to work with fossilizers via HTTP.httpServer
creates an app for the agentwebsocketServer
bind websocket connection to app and returns server
Plugins
An agent plugin enriches the content of a segment. It may implement four methods:
-
willCreate(link)
is called right before a transition function from the agent's actions. It takes the existing link as an argument. It should be updated in-place.
-
didCreateLink(link)
is called whenever a link has been created by a transition function. It takes the new link as an argument. It should be updated in-place.
-
filterSegment(segment)
is called when segments are retrieved by the agent from the underlying storage. It should return true
if the plugins accepts the segment, false
otherwise.
Filters are applied sequentially in the reverse order they are defined.
All methods are optional. They can either be synchronous or return a Promise.
Available plugins:
agentUrl
: Saves in segment meta the URL that can be used to retrieve a segment.encryptedState
: Encrypts the state before the segment is saved. Filters out segment that cannot be decrypted.localTime
: Saves the local timestamp in the link meta information.stateHash
: Computes and adds the hash of the state in meta.
Development
To regenerate the HTTP API documentation, run:
$ npm run swagger:generate