Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Шаг 73 #38 #120

Merged
merged 1 commit into from
Mar 13, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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;
}
Loading