Services with RPC and events over Ataraxia mesh network

Usage no npm install needed!

<script type="module">
  import ataraxiaServices from '';



npm version Dependencies Typedoc

Services with RPC and events for an Ataraxia network.

  • Based around well-defined contracts, making what a service supports very clear
  • Register services, allowing them to be consumed anywhere in the network
  • Access services via identifiers or events
  • Listen for when services become available or unavailable either globally or specifically on a single service
  • Support for remote events via Atvik, letting nodes listen to events from another node
  • Create proxy objects for a more natural way to call methods and listen to events, with support for type conversions and TypeScript declarations


To use services on top of a network install ataraxia-services:

npm install ataraxia-services

Services can then be consumed and registered by creating a Services instance on top of the network:

import { Services, ServiceContract, stringType } from 'ataraxia-services';

const net = ... // setup network with at least one transport

const services = new Services(net);

services.onServiceAvailable(service => console.log(, 'is now available'));
services.onServiceUnavailable(service => console.log(, 'is no longer available'));

// Join the network
await net.join();

// Join the services layer on top of the network
await services.join();

// Use contracts to describe services
const EchoService = new ServiceContract()
  .defineMethod('echo', {
    returnType: stringType,
    parameters: [
        name: 'message',
        type: stringType

// Easily register and expose services to other nodes
services.register('echo', EchoService.implement({
  echo(message) {
    return Promise.resolve(message);

// Consume a service registered anywhere, local or remote
const echoService = services.get('echo');
if(echoService.available) {
  // Call methods
  await'echo', 'Hello world');
  // Or create a proxy for a cleaner API
  const proxied =;
  await proxied.echo('Hello world');