Перейти до основного вмісту

Тунелі

інформація

Тунелі - функціональна група, яка описує перелік методів використання зʼєднання відповідного зʼєднувача. використовуватись при описі бізнес-схеми. Тунелі не зберігають стану, а екземпляр тунелю створюється лише перед виконанням його методу, після чого знищується, очищуючи оперативну памʼять від цього екземпляра тунелю.

Архітектура

Кожен тунель індивідуально налаштований під конкретний з'єднувач та містить перелік методів для взаємодії з цим з'єднувачем. Тунелі можуть бути використані як у ядрі обчислень, так і у бізнес-схемі.

tunnels-arch.svg

примітка

Тунель функціонує як проміжний шар між обробкою з'єднань та безпосереднім доступом і використанням цього з'єднання.

Перелік

X-Fiber підтримує слідуючий перелік тунелів:

НазваДоступОпис
MongoTunnelЗовнішнійОпис методів по роботі з колекціями та документами NoSQL бази данних MongoDB.
TypeormTunnelЗовнішнійОпис методів створення таблиць, опису звʼязків та створення запитів до SQL бази даних.
RedisTunnelЗагальнийОпис методів створення запитів до NoSQL Redis
RabbitMQTunnelЗагальнийОпис методів створення повідомлень, слухачів та отримувачів цих повідомлень.

Застосування

1. Використання тунелю в ядрі обчислень:

import { inversify } from '~packages'
import { AbstractService } from './abstract.service'

import type {
IPermissionService,
NPermissionService,
IDiscoveryService,
ILoggerService
} from '~types'

const { injectable, inject } = inversify

@injectable()
export class PermissionService extends AbstractService implements IPermissionService {
protected readonly _SERVICE_NAME = PermissionService.name;

constructor(
@inject(CoreSymbols.DiscoveryService)
protected readonly _discoveryService: IDiscoveryService,
@inject(CoreSymbols.LoggerService)
protected readonly _loggerService: ILoggerService,
// ... other inject structures
) {
super();
}

public async createRole(
role: string,
info: NPermissionService.RoleInfo
): Promise<void> {
const tunnel = container.get<IRedisTunnel>(CoreSymbols.RedisTunnel);

try {
if (info.routes.length > 0) {
const routes = info.routes.map((r) => r.route + "-" + r.method);
await tunnel.addSet(`role:${role}:routes`, routes);
}

if (info.events.length > 0) {
const events = info.events.map((r) => r.event + "-" + r.type);
await tunnel.addSet(`role:${role}:events`, events);
}
} catch (e) {
// ... throw logic
}
}

// ... other methods
}

де:

  • PermissionService - клас сервісу прав доступу.
    • createRole - метод створення ролі.
      • tunnel - Redis тунель, який надає перелік методів для взаємодії з Redis.

1. Використання тунелю в бізнес-схемі:

import {setMongoRepo} from "@x-fiber/calculator";

type User = { name: string, login: string }
type Repository = {
create: (user: User) => Promise<void>
getById: (id: string) => Promise<User | null>
}

export const repository = setMongoRepo<User & { _id: string }, Repository>({
create: async (provider: Provider, agents: Agents, data: User): Promise<void> => {
try {
await provider.create(data)
} catch (e) {
agents.logger.error(e)
throw agents.errors.throwRepo(e)
}
},
getById: async (provider: Provider, agents: Agents, data: string): Promise<User | null> => {
// ... handler logic
}
});

де:

  • Типи:
    • User - проста структура моделі бази даних MongoDB.
    • Repository - перелік методів по роботі з колекцією бази даних MongoDB.
    • setMongoRepo - вбудована функція з ядра обчислень, для опису переліку методів по роботі з колекцією.
    • Provider - тип провайдера з переліком методів по роботі з колекцією MongoDB.
    • Agents - перелік агентів функціональності
  • Структури:
    • repository - обʼєкт з переліком методів по роботі з колекцією бази даних, який дорівнює типу Repository.
      • create - метод створення документа в колекції бази даних MongoDB.
      • getById - метод отримання документа по його унікальному ідентифікатору.