vesicle

High performance and flexible RPC framework for Node.JS

Usage no npm install needed!

<script type="module">
  import vesicle from 'https://cdn.skypack.dev/vesicle';
</script>

README

vesicle

NPM Version Node Version





High performance and flexible RPC framework for Node.JS

Installation

npm i vesicle -S

Usage

  • typescript
// server
import { Action, Factory, Module, Service } from 'vesicle';

@Service()
class Book {
  @Action()
  hi() {
    console.log('hello');
  }

  @Action()
  hi2() {
    throw new Error('asdad');
  }

  @Action()
  hello() {
    return 'hello';
  }
}

@Module([Book])
class AppModule {}

function bootstrap() {
  const app = Factory.create(AppModule);
  app.listen(6960);
}

bootstrap();

// client
import { Client } from 'vesicle';

const myclient = new Client({
  url: '172.19.2.10:6960,172.19.2.10:6971,192.168.1.61:6960'
});

myclient
  .call('book.hi')
  .then(ret => {
    console.log(ret);
  })
  .catch(err => {
    console.error(err);
  });
  • javascript
import { Server } from 'vesicle';
import { responseTime, LRU } from 'vesicle/middleware';

const server = new Server({ nodeID: 'node1' });

server.addAction({
  name: 'list',
  handler: () => {
    console.log(1);
  }
});

server.addAction({
  name: 'book.hello',
  handler: () => {
    return 'hello';
  }
});

server.addAction({
  name: 'book.hi',
  handler: async () => {
    await sleep(1000);
    return 'sleep hi';
  },
  use: responseTime
});

server.addAction({
  name: 'book.cache',
  handler: async () => {
    await sleep(5000);
    return 'cache book';
  },
  use: [responseTime, LRU]
});

server.addAction({
  name: 'book.hi2',
  handler: async () => {
    throw new Error('hi2');
  }
});

function sleep(delay = 1000) {
  return new Promise(resolve => setTimeout(resolve, delay));
}

server.listen(6960);

API

server

new Server({nodeID?: string; port?: number;})

create a server instance

.addAction( action: Action | Handler, service?: string, version?: string ): boolean

add a defined funtion

.listen(port: number)

start listen on specific port

client

new Client({ url: string; timeout?: number; retry?:number;connectTimeout?: number;})

url: entry url, combine with servers's url

timeout: max wait time for response

retry: retry times, when network error occurs, retry request

.call(action: string,parameter?: any,options: CallOptions = { retry: this.retry }): Promise<any>

invoke a remote funtion

Middleware

type Middleware = (context: Context, next: NextFunc) => any;

write style

export async function responseTime(context: Context, next: NextFunc) {
  let start = Date.now();
  await next();
  console.log(`${context.action.name} took:${Date.now() - start}ms`);
}
  • responseTime
  • LRU
  • auth
  • rate limiter
  • compress

Cluster

join in another node

import { request } from '../src/helper';

// join in a cluster
request(`172.19.2.10:6960/join`, { addr: '172.19.2.10:6970' })
  .then(ret => {
    console.log(ret);
  })
  .catch(err => {
    console.error(err);
  });

cluster infos

import { request } from '../src/helper';

// display cluster info
request(`172.19.2.10:6960/nodes`)
  // request(`172.19.2.10:6960/actions`)
  // request(`172.19.2.10:6960/connections`)
  .then(ret => {
    console.log(ret);
  })
  .catch(err => {
    console.error(err);
  });

Todo

  • xxx

License

MIT