Skip to content

Commit

Permalink
#38
Browse files Browse the repository at this point in the history
- preset/bun: модуль провайдеров разбит на отдельные модули по провайдерам (patch)
- preset/node: переименования части провайдеров (patch)
  • Loading branch information
krutoo committed Mar 12, 2024
1 parent 7c6dc42 commit 7ab7ca0
Show file tree
Hide file tree
Showing 13 changed files with 160 additions and 145 deletions.
25 changes: 16 additions & 9 deletions src/preset/bun/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,16 @@ import { createPreset } from '../../di';
import { KnownToken } from '../../tokens';
import { PresetTuner } from '../isomorphic';
import { provideBaseConfig } from '../isomorphic/providers/base-config';
import { provideFetch } from '../isomorphic/providers/fetch';
import { provideKnownHttpApiHosts } from '../node/providers/known-http-api-hosts';
import { provideSsrBridgeServerSide } from '../node/providers/ssr-bridge-server-side';
import { BunProviders } from './providers';
import { provideConfigSource } from './providers/config-source';
import { provideLogger } from './providers/logger';
import { provideServe } from './providers/serve';
import { provideServeMetrics } from './providers/serve-metrics';
import { provideFetchMiddleware } from './providers/fetch-middleware';
import { provideServiceRoutes } from './providers/service-routes';
import { provideServeMiddleware } from './providers/serve-middleware';

/**
* Возвращает preset с зависимостями для запуска приложения в Bun.
Expand All @@ -16,26 +23,26 @@ export function PresetBun(customize?: PresetTuner) {
const preset = createPreset();

// config
preset.set(KnownToken.Config.source, BunProviders.configSource);
preset.set(KnownToken.Config.source, provideConfigSource);
preset.set(KnownToken.Config.base, provideBaseConfig);

// log
preset.set(KnownToken.logger, BunProviders.logger);
preset.set(KnownToken.logger, provideLogger);

// tracing
// @todo

// metrics
preset.set(KnownToken.Metrics.httpHandler, BunProviders.serveMetrics);
preset.set(KnownToken.Metrics.httpHandler, provideServeMetrics);

// http fetch
preset.set(KnownToken.Http.fetch, BunProviders.fetch);
preset.set(KnownToken.Http.Fetch.middleware, BunProviders.fetchMiddleware);
preset.set(KnownToken.Http.fetch, provideFetch);
preset.set(KnownToken.Http.Fetch.middleware, provideFetchMiddleware);

// http serve
preset.set(KnownToken.Http.serve, BunProviders.serve);
preset.set(KnownToken.Http.Serve.serviceRoutes, BunProviders.serviceRoutes);
preset.set(KnownToken.Http.Serve.middleware, BunProviders.serveMiddleware);
preset.set(KnownToken.Http.serve, provideServe);
preset.set(KnownToken.Http.Serve.serviceRoutes, provideServiceRoutes);
preset.set(KnownToken.Http.Serve.middleware, provideServeMiddleware);

// http api
preset.set(KnownToken.Http.Api.knownHosts, provideKnownHttpApiHosts);
Expand Down
6 changes: 6 additions & 0 deletions src/preset/bun/providers/config-source.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
/* eslint-disable require-jsdoc, jsdoc/require-jsdoc */
import { ConfigSource, createConfigSource } from '../../../config';

export function provideConfigSource(): ConfigSource {
return createConfigSource(Bun.env);
}
7 changes: 7 additions & 0 deletions src/preset/bun/providers/fetch-middleware.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
/* eslint-disable require-jsdoc, jsdoc/require-jsdoc */
import { Middleware } from '../../../http';

export function provideFetchMiddleware(): Middleware[] {
// @todo добавить логирование ошибок?
return [];
}
130 changes: 0 additions & 130 deletions src/preset/bun/providers/index.ts

This file was deleted.

19 changes: 19 additions & 0 deletions src/preset/bun/providers/log-handler-sentry.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
/* eslint-disable require-jsdoc, jsdoc/require-jsdoc */
import { Resolve } from '../../../di';
import { KnownToken } from '../../../tokens';
import { getCurrentHub, init } from '@sentry/bun';
import { createSentryHandler } from '../../../log/handler/sentry';

export function provideLogHandlerSentry(resolve: Resolve) {
const source = resolve(KnownToken.Config.source);

init({
dsn: source.require('SENTRY_DSN'),
release: source.require('SENTRY_RELEASE'),
environment: source.require('SENTRY_ENVIRONMENT'),
});

// ВАЖНО: передаем функцию чтобы брать текущий hub в момент вызова метода logger'а
// это нужно чтобы хлебные крошки в ошибках Sentry группировались по запросам
return createSentryHandler(getCurrentHub);
}
14 changes: 14 additions & 0 deletions src/preset/bun/providers/logger.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
/* eslint-disable require-jsdoc, jsdoc/require-jsdoc */
import { Resolve } from '../../../di';
import { Logger, createLogger } from '../../../log';
import { provideLogHandlerPino } from '../../node/providers/log-handler-pino';
import { provideLogHandlerSentry } from './log-handler-sentry';

export function provideLogger(resolve: Resolve): Logger {
const logger = createLogger();

logger.subscribe(provideLogHandlerPino(resolve));
logger.subscribe(provideLogHandlerSentry(resolve));

return logger;
}
20 changes: 20 additions & 0 deletions src/preset/bun/providers/serve-metrics.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/* eslint-disable require-jsdoc, jsdoc/require-jsdoc */
import { Handler } from '../../../http';
import { route, router } from '@krutoo/fetch-tools';
import PromClient from 'prom-client';

export function provideServeMetrics(): Handler {
// @todo задействовать когда Bun реализует pref_hooks.monitorEventLoopDelay (https://github.com/siimon/prom-client/issues/570)
// PromClient.collectDefaultMetrics();

return router(
route.get('/', async () => {
const metrics = await PromClient.register.metrics();
const headers = new Headers();

headers.set('Content-Type', PromClient.register.contentType);

return new Response(metrics, { headers });
}),
);
}
29 changes: 29 additions & 0 deletions src/preset/bun/providers/serve-middleware.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
/* eslint-disable require-jsdoc, jsdoc/require-jsdoc */
import { Resolve } from '../../../di';
import { KnownToken } from '../../../tokens';
import { runWithAsyncContext } from '@sentry/bun';
import { ServerMiddleware } from '../../server/types';
import { getServeLogging } from '../../server/utils/get-serve-logging';
import { getServeErrorLogging } from '../../server/utils/get-serve-error-logging';
import { getServeMeasuring } from '../../server/utils/get-serve-measuring';

export function provideServeMiddleware(resolve: Resolve): ServerMiddleware[] {
const config = resolve(KnownToken.Config.base);
const logger = resolve(KnownToken.logger);

return [
// ВАЖНО: изолируем хлебные крошки чтобы они группировались по входящим запросам
(request, next) => runWithAsyncContext(async () => next(request)),

// ВАЖНО: слой логирования ошибки ПЕРЕД остальными слоями чтобы не упустить ошибки выше
getServeErrorLogging(logger),

// @todo tracing

// метрики
getServeMeasuring(config),

// ВАЖНО: слой логирования запроса и ответа ПОСЛЕ остальных слоев чтобы использовать актуальные данные
getServeLogging(logger),
];
}
31 changes: 31 additions & 0 deletions src/preset/bun/providers/serve.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
/* eslint-disable require-jsdoc, jsdoc/require-jsdoc */
import { Resolve } from '../../../di';
import { KnownToken } from '../../../tokens';
import { Handler } from '../../../http';
import { route, router } from '@krutoo/fetch-tools';
import { applyServerMiddleware } from '../../server/utils/apply-server-middleware';

export function provideServe(resolve: Resolve): Handler {
const middleware = resolve(KnownToken.Http.Serve.middleware);
const routes = resolve(KnownToken.Http.Serve.routes);
const serviceRoutes = resolve(KnownToken.Http.Serve.serviceRoutes);

const enhance = applyServerMiddleware(...middleware);

return router(
// маршруты с промежуточными слоями
...routes.map(([pattern, handler]) => {
const enhancedHandler = enhance(handler);

return route.get(pattern, request => enhancedHandler(request, { events: new EventTarget() }));
}),

// @todo вместо routes обрабатывать pageRoutes с помощью route.get() из новой версии fetch-tools (для явности)
// @todo также добавить apiRoutes и обрабатывать их с помощью с помощью route()?

// служебные маршруты (без промежуточных слоев)
...serviceRoutes.map(([pattern, handler]) =>
route(pattern, request => handler(request, { events: new EventTarget() })),
),
);
}
12 changes: 12 additions & 0 deletions src/preset/bun/providers/service-routes.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
/* eslint-disable require-jsdoc, jsdoc/require-jsdoc */
import { ServerHandler } from '../../server/types';
import { getStatsHandler } from '../utils/get-stats-handler';
import { getHealthCheck } from '../../server/utils/get-health-check';

export function provideServiceRoutes(): Array<[string, ServerHandler]> {
return [
// служебные маршруты (без промежуточных слоев)
['/healthcheck', getHealthCheck()],
['/stats', getStatsHandler()],
];
}
2 changes: 1 addition & 1 deletion src/preset/node/providers/log-handler-pino.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import { KnownToken } from '../../../tokens';
* @param resolve Функция для получения зависимости по токену.
* @return Обработчик.
*/
export function providePinoHandler(resolve: Resolve): LogHandler {
export function provideLogHandlerPino(resolve: Resolve): LogHandler {
const config = resolve(KnownToken.Config.base);

const pinoLogger = pino(
Expand Down
2 changes: 1 addition & 1 deletion src/preset/node/providers/log-handler-sentry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import { KnownToken } from '../../../tokens';
* @param resolve Функция для получения зависимости по токену.
* @return Обработчик.
*/
export function provideSentryHandler(resolve: Resolve): LogHandler {
export function provideLogHandlerSentry(resolve: Resolve): LogHandler {
const source = resolve(KnownToken.Config.source);

// экспериментально пробуем не использовать вручную созданный клиент
Expand Down
8 changes: 4 additions & 4 deletions src/preset/node/providers/logger.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Resolve } from '../../../di';
import { Logger, createLogger } from '../../../log';
import { providePinoHandler } from './log-handler-pino';
import { provideSentryHandler } from './log-handler-sentry';
import { provideLogHandlerPino } from './log-handler-pino';
import { provideLogHandlerSentry } from './log-handler-sentry';

/**
* Провайдер Logger'а.
Expand All @@ -12,8 +12,8 @@ export function provideLogger(resolve: Resolve): Logger {
const logger = createLogger();

// @todo возможно надо придумать как не давать вызывать провайдеры внутри провайдеров
logger.subscribe(providePinoHandler(resolve));
logger.subscribe(provideSentryHandler(resolve));
logger.subscribe(provideLogHandlerPino(resolve));
logger.subscribe(provideLogHandlerSentry(resolve));

return logger;
}

0 comments on commit 7ab7ca0

Please sign in to comment.