# Huz.Com > Component > Callback

- General callback storage for basic, context, name, pair, entity and route
- Provides central/easy routing append

## Standards
- Language: `TS`
- Eslint: `Yes`
- Static Code Analysis: `Yes` *IntelliJ Code Inspections*
- DDD - Document Driven: `Yes`
- EDD - Exception Driven: `Yes`
- TDD - Test Driven: `Yes` [go to test folder](./test/Callback.spec.ts)
- Standards Complied: [Huz Standards](https://gitlab.azerdev.com/huz.byorbit/be/documentation/standards)

## Commands
- ``npm run clear`` *// clears "dist" folder*
- ``npm run lint`` *// runs eslint for static code analysis*
- ``npm run test`` *// runs test files in "test" folder*
- ``npm run build`` *// builds JS files at "dist" folder*
- ``npm publish`` *or* ``npm run publix`` *// publishes "dist" folder to npm*

## Install
``npm i @huz-com/callback``

## For Context
````javascript
const {callback} = require('@huz-com/callback');
// default language for your platform, it based on request or constant
callback.context.add('defaultLanguage', (req) => {return 'tr'});
// current profile language for your platform, it based on request or constant
callback.context.add('currentLanguage', (req) => {return 'tr'});

// and .. whatever
````

## For Entity & Enums
````javascript
const {callback} = require('@huz-com/callback');
class GameService {

    constructor () {
        // in order to call as callback or function reference
        this.findNameAsync = this.findNameAsync.bind(this);
        this.findNameListAsync = this.findNameListAsync.bind(this);
        this.findPairAsync = this.findPairAsync.bind(this);
        this.findDocAsync = this.findDocAsync.bind(this);
        this.route = this.route.bind(this);
        
        callback.namer.add('Game', this.findNameAsync, this.findNameListAsync);
        callback.pair.add('Game', this.findPairAsync, null);
        callback.doc.add('Game', this.findDocAsync, null);
        callback.route.add('Game', this.route);
    }

    /**
     * @param {string} id
     * @param {?Record<string, any>} opt
     * @param {?Req} req
     * @returns {Promise<string>}
     */
    async findNameAsync(id, opt = null, req = null) {
        // your own code which returns name of entity
        return 'Game-' + id;
    }
    /**
     * @param {Array<string>} ids
     * @param {?Record<string, any>} opt
     * @param {?Req} req
     * @returns {Promise<Array<string>>}
     */
    async findNameListAsync(ids, opt = null, req = null) {
        // your own code which return name of entities
        return ['Game-1', 'Game-2'];
    }
    /**
     * @param {string} id
     * @param {?Record<string, any>} opt
     * @param {?Req} req
     * @returns {Promise<{id: string, name: string}>}
     */
    async findPairAsync(id, opt = null, req = null) {
        // your own code which returns pair of entity
        return {id, name: 'Game-' + id};
    }
    /**
     * @param {string} id
     * @param {?Record<string, any>} opt
     * @param {?Req} req
     * @returns {Promise<{id: string, name: string, description: string}>}
     */
    async findDocAsync(id, opt = null, req = null) {
        // your own code which returns record of entity
        return {id, name: 'Game-' + id, description: ''};
    }
    route(router) {
        // your custom router
    }
}
````

## At Route Initializing
> Append all routes to Express route
````javascript
const {callback} = require('@huz-com/callback');
callback.route.build(router);
````

## At Runtime
> Anywhere in your project
> Supports loosely-coupled architecture, so you don't import Game or Context components
````javascript
const {callback} = require('@huz-com/callback');
// express's request object
const req = null;
await callback.namer.findAsync('Game', 101, null, req); // returns name of game with id 101
await callback.namer.findListAsync('Game', [101, 102], null, req); // returns name of games with id 101 and 102
await callback.pair.findAsync('Game', 101, null, req); // returns pair of game with id 101
await callback.doc.findAsync('Game', 101, null, req); // returns doc of game with id 101

callback.context.run('currentLanguage', req) // returns profile's language
````
