Skip to main content

common

Base module consisted of the architectural blocks for typical tramvai app. This module is required at most cases and is used a lot by the other modules.

Installation​

First install @tramvai/module-common

npm i @tramvai/module-common

Add CommonModule to the modules list

import { createApp } from '@tramvai/core';
import { CommonModule } from '@tramvai/module-common';

createApp({
modules: [CommonModule],
});

Explanation​

Submodules​

CommandModule​

Module that adds implementation for the commandLineRunner and defines default command lines

This module logs with id command:command-line-runner

StateModule​

Adds state-manager

ActionModule​

Implements action system

This module logs with id action:action-page-runner

CookieModule​

Add providers that works with cookie. See docs

EnvironmentModule​

Implements work with environment variables both on server and client. See docs

PubSub​

Provides PubSub interface to implement communication between components. See docs

This modules logs with id pubsub

LogModule​

Module for logging. Uses @tramvai/module-log

CacheModule​

Module that implements caches.

It provides next functionality:

  • create new cache instance (instance of lru-cache by default)
  • clear all of the previously create caches
  • subscribe on cache clearance event to execute own cache clearance actions
  • adds papi-route /clear-cache that will trigger caches clear event

This modules logs with id cache:papi-clear-cache

Cache types​

You can create different cache types with CREATE_CACHE_TOKEN factory:

  • LRU - @tinkoff/lru-cache-nano

    This type of cache is created by default. To create it explicitly you must pass 'memory' as the first argument, and options as the second.

    provide({
    provide: CACHE_TOKEN,
    scope: Scope.SINGLETON,
    useFactory: ({ createCache }) =>
    createCache('memory', {
    max: 100,
    ttl: 24 * 60 * 60 * 1000, // 1 day
    ttlResolution: 60 * 1000, // 1 minute
    allowStale: true,
    updateAgeOnGet: true,
    }),
    deps: {
    createCache: CREATE_CACHE_TOKEN,
    },
    });
  • LFU - @akashbabu/lfu-cache

    To create it you must pass 'memory-lfu' as the first argument, cache options - as second.

    provide({
    provide: CACHE_TOKEN,
    scope: Scope.SINGLETON,
    useFactory: ({ createCache }) =>
    createCache('memory-lfu', {
    max: 20,
    evictCount: 5,
    maxAge: 24 * 60 * 60 * 1000, // 1 day
    }),
    deps: {
    createCache: CREATE_CACHE_TOKEN,
    },
    });
Cache metrics​

To turn cache hit/miss rate monitoring, cache size, you need to provide cache name in options:

provide({
provide: CACHE_TOKEN,
scope: Scope.SINGLETON,
useFactory: ({ createCache }) =>
createCache('memory', {
name: 'cache-name',
}),
deps: {
createCache: CREATE_CACHE_TOKEN,
},
});

Cache name have to be unique, factory will throw exception in case of cache name duplication.

Metric module should be provided in your application.

Server cache metrics:

  • cache_hit{name, method} counter
  • cache_miss{name, method} counter
  • cache_max{name} gauge
  • cache_size{name} gauge

By default hit/miss rate is computed as a sum of all data access attempts (methods has, peek, get).

RequestManagerModule​

Wrapper for the client request

ResponseManagerModule​

Wrapper for the client response

How to​

Create cache​

import { provide } from '@tramvai/core';

export const providers = [
provide({
provide: MY_MODULE_PROVIDER_FACTORY,
scope: Scope.SINGLETON,
useFactory: ({ createCache }) => {
const cache = createCache('memory', ...args); // type of the cache and any additional options that will be passed to the cache constructor

return someFactory({ cache });
},
deps: {
createCache: CREATE_CACHE_TOKEN,
},
}),

provide({
provide: REGISTER_CLEAR_CACHE_TOKEN,
scope: Scope.SINGLETON,
useFactory: ({ cache }) => {
return async () => {
await cache.reset();
console.log('my module cache cleared');
};
},
deps: {
cache: MY_MODULE_CACHE,
},
}),

provide({
provide: commandLineListTokens.clear,
useFactory: ({ clearCache }) => {
return function clear() {
clearCache(); // clear caches explicitly
};
},
deps: {
clearCache: CLEAR_CACHE_TOKEN,
},
}),
];

Exported tokens​