MorphCluster Sessions

Пакет @morphcluster/sessions предоставляет сервис управления сессиями пользователей в экосистеме MorphCluster. Он состоит из двух основных компонентов: Sessions (публичный API) и SessionsStorage (персистентное хранение в PostgreSQL). Сервис обеспечивает создание, проверку, удаление и листинг сессионных токенов с поддержкой административных прав.

Импорт

import { Sessions, SessionsStorage } from '@morphcluster/sessions';

Sessions

Назначение: Централизованное управление сессиями пользователей. Предоставляет методы для создания, удаления, получения и валидации токенов. Реализует двухуровневое кэширование: in‑memory для быстрого доступа и постоянное хранение в PostgreSQL через внутренний сервис SessionsStorage.

Наследует: ServiceRequire (из @morphcluster/core)

Зависимости (requirements):

Сервис Тип Описание
SessionsStorage обязательный Сервис персистентного хранения сессий в БД

Конфигурация:

Параметры передаются через объект config, который Sessions получает при создании. Основные настройки PostgreSQL извлекаются из config.common и передаются в SessionsStorage:

Сам Sessions не имеет собственных параметров, кроме тех, что нужны для настройки SessionsStorage.

Запросы (методы)

Все запросы описаны в service-schema.mjs и регистрируются через setSvcSchema.

Метод HTTP Права Параметры Ответ Описание
get POST anonymous: true { token: string } Session Получить сессию по токену. Сначала проверяется in‑memory кэш, затем PostgreSQL. Если сессия не найдена, выбрасывается ComplexError('Invalid Token', 'InvalidToken').
list POST needAdmin: true { filters?: { login?, isAdmin?, permanent? } } Session[] Получить список сессий из PostgreSQL по фильтрам. Параметр filters обязателен, но может быть пустым объектом.
create POST needAdmin: true { userId: number, login: string, isAdmin: boolean } { token: string } Создать новую сессию. Генерирует UUID-токен, сохраняет в памяти и асинхронно записывает в БД через SessionsStorage.insert.
delete POST needAdmin: true { token: string } void Удалить сессию. Удаляет из БД и из in‑memory кэша, если запись имеет тип "storage".
deleteMany POST needAdmin: true { filters: { login?, isAdmin?, permanent? } } number (rowCount) Удалить несколько сессий по фильтрам. Фильтры обязательны. Также очищает in‑memory кэш полностью.
setPermanent POST needAdmin: true { token: string, permanent: boolean } number (rowCount) Установить флаг постоянной сессии (не истекающей).

Вспомогательный метод validateHttp

Используется другими сервисами (например, FastifyGateway, Eventer) для проверки сессии из HTTP‑заголовка Authorization: Bearer <token>. Сигнатура:

async validateHttp(request, reply, log = null, needAdmin = false)

Внутреннее устройство

Жизненный цикл

Примечания


SessionsStorage

Назначение: Персистентное хранение сессий в PostgreSQL. Обеспечивает миграцию схемы БД, пул соединений и все CRUD-операции над таблицей sessions.

Наследует: ServiceRequire

Зависимости (requirements):

Сервис Тип Описание
PostgresMigrator обязательный Сервис миграции схемы БД (из @morphcluster/postgres-migrator)

Конфигурация: передаётся через объект config.pg:

Методы (внутренние, вызываются сервисом Sessions)

Метод Параметры Возврат Описание
byId(id) id: string Session или null Получить сессию по идентификатору (токену). Выполняет запрос SELECT ... WHERE id = $1.
insert(session) session: Session void Вставить новую сессию в таблицу.
list(req) req: { login?, isAdmin?, permanent? } Session[] Получить список сессий с динамическими фильтрами. Поля isAdmin и permanent приводятся к 0/1.
delete(id) id: string number (rowCount) Удалить одну сессию по ID.
deleteMany(req) req: { login?, isAdmin?, permanent? } number (rowCount) Удалить сессии по фильтрам.
setPemanent(id, perm) id: string, perm: boolean number (rowCount) Установить флаг permanent для сессии.

Жизненный цикл

Примечания


Тип Session

/**
 * @typedef {Object} Session
 * @property {string} token
 * @property {string} type       // "storage" или "invalid"
 * @property {number} userId
 * @property {string} login
 * @property {boolean} isAdmin
 */

Поле type используется в Sessions для различения записей: "storage" — сессия из БД, "invalid" — кэшированное отсутствие сессии.


Пример использования

import { ServiceHost, Config, Logger } from '@morphcluster/core';
import { Sessions } from '@morphcluster/sessions';

const host = new ServiceHost('main');
const config = new Config({
  common: {
    postgresUri: 'postgresql://user:pass@localhost:5432/mydb',
    timeZone: 'UTC'
  },
  pg: {
    schema: 'public'
  }
});

const sessions = new Sessions(host, config.values);
host.addService(sessions, 'Sessions');

await host.start(logger);

// Создание сессии администратора
const { token } = await sessions.sendRequest('create', {
  userId: 1,
  login: 'admin',
  isAdmin: true
}, log);

// Проверка сессии
const session = await sessions.sendRequest('get', { token }, log);
console.log(session.isAdmin); // true

Интеграция с другими сервисами


Revision #3
Created 21 June 2026 21:02:32 by Admin
Updated 26 June 2026 13:52:59 by Admin