Skip to content

Commit

Permalink
Merge pull request #105 from sima-land/38-examples-bun
Browse files Browse the repository at this point in the history
Шаг 58 #38
  • Loading branch information
krutoo committed Mar 6, 2024
2 parents c3f0b61 + 18cd454 commit 2512751
Show file tree
Hide file tree
Showing 9 changed files with 90 additions and 39 deletions.
14 changes: 7 additions & 7 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 10 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@
},
"dependencies": {
"@humanwhocodes/env": "^2.2.2",
"@krutoo/fetch-tools": "^0.0.11",
"@krutoo/fetch-tools": "^0.0.12",
"@opentelemetry/api": "^1.4.1",
"@opentelemetry/exporter-prometheus": "^0.38.0",
"@opentelemetry/exporter-trace-otlp-http": "^0.39.1",
Expand Down Expand Up @@ -147,6 +147,12 @@
"import": "./dist/esm/preset/web/providers/index.js",
"default": "./dist/esm/preset/web/providers/index.js"
},
"./preset/server": {
"types": "./dist/types/preset/server/index.d.ts",
"require": "./dist/cjs/preset/server/index.js",
"import": "./dist/esm/preset/server/index.js",
"default": "./dist/esm/preset/server/index.js"
},
"./preset/node": {
"types": "./dist/types/preset/node/index.d.ts",
"require": "./dist/cjs/preset/node/index.js",
Expand Down Expand Up @@ -279,6 +285,9 @@
"preset/web/providers": [
"./dist/types/preset/web/providers/index.d.ts"
],
"preset/server": [
"./dist/types/preset/server/index.d.ts"
],
"preset/node": [
"./dist/types/preset/node/index.d.ts"
],
Expand Down
1 change: 1 addition & 0 deletions src/preset/bun/bun/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ export function PresetBun(customize?: PresetTuner) {

// 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);

// http api
Expand Down
36 changes: 25 additions & 11 deletions src/preset/bun/bun/providers/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import { createSentryHandler } from '../../../../log/handler/sentry';
import { healthCheck } from '../../../isomorphic/utils';
import { provideFetch } from '../../../isomorphic/providers';
import { toMilliseconds } from '../../../../utils';
import { ServerMiddleware } from '../../../server/types';
import { ServerHandler, ServerMiddleware } from '../../../server/types';
import { applyServerMiddleware } from '../../../server/utils';
import PromClient from 'prom-client';
import { RESPONSE_EVENT_TYPE } from '../../../isomorphic/constants';
Expand Down Expand Up @@ -58,24 +58,37 @@ export const BunProviders = {
serve(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(([pathname, handler]) => {
...routes.map(([pattern, handler]) => {
const enhancedHandler = enhance(handler);
return route(pathname, request => enhancedHandler(request, { events: new EventTarget() }));

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

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

// служебные маршруты (без промежуточных слоев)
route('/healthcheck', healthCheck()),
...serviceRoutes.map(([pattern, handler]) =>
route(pattern, request => handler(request, { events: new EventTarget() })),
),
);
},

serviceRoutes(): Array<[string, ServerHandler]> {
return [
// служебные маршруты (без промежуточных слоев)
['/healthcheck', healthCheck()],
];
},

serveMiddleware(resolve: Resolve): ServerMiddleware[] {
const config = resolve(KnownToken.Config.base);
const logger = resolve(KnownToken.logger);
Expand Down Expand Up @@ -184,14 +197,15 @@ export const BunProviders = {
// @todo задействовать когда Bun реализует pref_hooks.monitorEventLoopDelay (https://github.com/siimon/prom-client/issues/570)
// PromClient.collectDefaultMetrics();

// @todo здесь или в другом компоненте надо проверять путь и метод запроса
return async () => {
const metrics = await PromClient.register.metrics();
const headers = new Headers();
return router(
route.get('/', async () => {
const metrics = await PromClient.register.metrics();
const headers = new Headers();

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

return new Response(metrics, { headers });
};
return new Response(metrics, { headers });
}),
);
},
} as const;
20 changes: 14 additions & 6 deletions src/preset/bun/handler/providers/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -193,13 +193,21 @@ export const HandlerProviders = {
(request, next) => {
const innerController = new AbortController();

request.signal?.addEventListener('abort', () => {
innerController.abort();
});
request.signal?.addEventListener(
'abort',
() => {
innerController.abort();
},
{ once: true },
);

abortController.signal.addEventListener('abort', () => {
innerController.abort();
});
abortController.signal.addEventListener(
'abort',
() => {
innerController.abort();
},
{ once: true },
);

return next(new Request(request, { signal: innerController.signal }));
},
Expand Down
4 changes: 2 additions & 2 deletions src/preset/bun/handler/utils/index.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
/* eslint-disable require-jsdoc, jsdoc/require-jsdoc */
import type { ServerHandler } from '../../../server/types';
import { KnownToken } from '../../../../tokens';
import { CURRENT_APP, type Application, type Resolve } from '../../../../di';
import { CURRENT_APP, type Application, type Resolve, Provider } from '../../../../di';

export function HandlerProvider(getApp: () => Application) {
export function HandlerProvider(getApp: () => Application): Provider<ServerHandler> {
return (resolve: Resolve): ServerHandler => {
const parent = resolve(CURRENT_APP);

Expand Down
40 changes: 28 additions & 12 deletions src/preset/node/handler/providers/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -188,13 +188,21 @@ export function provideFetchMiddleware(resolve: Resolve): Middleware[] {
(request, next) => {
const innerController = new AbortController();

request.signal?.addEventListener('abort', () => {
innerController.abort();
});
request.signal?.addEventListener(
'abort',
() => {
innerController.abort();
},
{ once: true },
);

abortController.signal.addEventListener('abort', () => {
innerController.abort();
});
abortController.signal.addEventListener(
'abort',
() => {
innerController.abort();
},
{ once: true },
);

return next(new Request(request, { signal: innerController.signal }));
},
Expand Down Expand Up @@ -268,13 +276,21 @@ export function provideAxiosMiddleware(resolve: Resolve): AxiosMiddleware<any>[]
async (config, next) => {
const innerController = new AbortController();

abortController.signal.addEventListener('abort', () => {
innerController.abort();
});
abortController.signal.addEventListener(
'abort',
() => {
innerController.abort();
},
{ once: true },
);

config.signal?.addEventListener?.('abort', () => {
innerController.abort();
});
config.signal?.addEventListener?.(
'abort',
() => {
innerController.abort();
},
{ once: true },
);

await next({ ...config, signal: innerController.signal });
},
Expand Down
2 changes: 2 additions & 0 deletions src/preset/server/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export type { ServerHandler, ServerMiddleware, ServerHandlerContext } from './types';
export { getClientIp, getForwardedHeaders, getPageResponseFormat } from './utils';
1 change: 1 addition & 0 deletions src/tokens.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ export const KnownToken = {
serve: createToken<Handler>('serve'),
Serve: {
routes: createToken<Array<[string, ServerHandler]>>('serve/routes'),
serviceRoutes: createToken<Array<[string, ServerHandler]>>('serve/service-routes'),
middleware: createToken<ServerMiddleware[]>('serve/middleware'),
},

Expand Down

0 comments on commit 2512751

Please sign in to comment.