@sima-land/isomorph 11.0.0-alpha.35 → 11.0.0-alpha.36
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/http/errors.d.ts +12 -0
- package/http/errors.js +17 -1
- package/http/errors.js.map +1 -1
- package/http/index.d.ts +2 -2
- package/http/index.js +3 -1
- package/http/index.js.map +1 -1
- package/package.json +7 -6
- package/preset/isomorphic/constants.d.ts +7 -0
- package/preset/isomorphic/constants.js +11 -0
- package/preset/isomorphic/constants.js.map +1 -0
- package/preset/isomorphic/providers/index.d.ts +22 -0
- package/preset/isomorphic/providers/index.js +38 -0
- package/preset/isomorphic/providers/index.js.map +1 -0
- package/preset/isomorphic/types.d.ts +43 -0
- package/{http-client → preset/isomorphic}/types.js.map +1 -1
- package/preset/{parts/utils.d.ts → isomorphic/utils/index.d.ts} +14 -6
- package/preset/{parts/utils.js → isomorphic/utils/index.js} +31 -5
- package/preset/isomorphic/utils/index.js.map +1 -0
- package/preset/node/handler/index.d.ts +10 -0
- package/preset/node/handler/index.js +38 -0
- package/preset/node/handler/index.js.map +1 -0
- package/preset/node/handler/providers/index.d.ts +35 -0
- package/preset/node/handler/providers/index.js +184 -0
- package/preset/node/handler/providers/index.js.map +1 -0
- package/preset/node/handler/utils/index.d.ts +46 -0
- package/preset/node/handler/utils/index.js +81 -0
- package/preset/node/handler/utils/index.js.map +1 -0
- package/preset/node/index.d.ts +2 -29
- package/preset/node/index.js +6 -289
- package/preset/node/index.js.map +1 -1
- package/preset/node/node/index.d.ts +8 -0
- package/preset/node/node/index.js +49 -0
- package/preset/node/node/index.js.map +1 -0
- package/preset/node/node/providers/index.d.ts +112 -0
- package/preset/node/node/providers/index.js +392 -0
- package/preset/node/node/providers/index.js.map +1 -0
- package/{http-client/middleware/tracing.d.ts → preset/node/node/utils/http-client/index.d.ts} +9 -0
- package/{http-client/middleware/tracing.js → preset/node/node/utils/http-client/index.js} +32 -3
- package/preset/node/node/utils/http-client/index.js.map +1 -0
- package/preset/node/node/utils/http-server/index.d.ts +7 -0
- package/preset/node/node/utils/http-server/index.js +21 -0
- package/preset/node/node/utils/http-server/index.js.map +1 -0
- package/preset/web/index.d.ts +8 -0
- package/preset/web/index.js +30 -0
- package/preset/web/index.js.map +1 -0
- package/preset/web/providers/index.d.ts +35 -0
- package/preset/{browser → web/providers}/index.js +32 -32
- package/preset/web/providers/index.js.map +1 -0
- package/tokens.d.ts +11 -11
- package/tokens.js +1 -2
- package/tokens.js.map +1 -1
- package/utils/axios/index.d.ts +4 -0
- package/utils/axios/index.js +13 -0
- package/utils/axios/index.js.map +1 -0
- package/utils/axios/middleware/cookie.d.ts +8 -0
- package/utils/axios/middleware/cookie.js +26 -0
- package/utils/axios/middleware/cookie.js.map +1 -0
- package/utils/axios/middleware/log.js.map +1 -0
- package/{http-client → utils/axios}/sauce/index.d.ts +1 -1
- package/{http-client → utils/axios}/sauce/index.js +1 -1
- package/utils/axios/sauce/index.js.map +1 -0
- package/{http-client/utils.d.ts → utils/axios/utils/index.d.ts} +0 -7
- package/{http-client/utils.js → utils/axios/utils/index.js} +2 -28
- package/utils/axios/utils/index.js.map +1 -0
- package/utils/express/handler/health-check.js.map +1 -0
- package/utils/express/index.d.ts +2 -0
- package/utils/express/index.js +8 -0
- package/utils/express/index.js.map +1 -0
- package/utils/express/utils/index.d.ts +7 -0
- package/utils/express/utils/index.js +20 -0
- package/utils/express/utils/index.js.map +1 -0
- package/utils/react/error-handlers/index.d.ts +1 -1
- package/utils/react/error-handlers/index.js.map +1 -1
- package/utils/web/analytics/data-layer.js +16 -0
- package/utils/web/analytics/data-layer.js.map +1 -0
- package/utils/web/analytics/oko.d.ts +6 -0
- package/utils/web/analytics/oko.js +16 -0
- package/utils/web/analytics/oko.js.map +1 -0
- package/utils/{browser → web}/storage/index.d.ts +1 -0
- package/utils/{browser → web}/storage/index.js +1 -0
- package/utils/web/storage/index.js.map +1 -0
- package/http-client/middleware/cookie.d.ts +0 -20
- package/http-client/middleware/cookie.js +0 -64
- package/http-client/middleware/cookie.js.map +0 -1
- package/http-client/middleware/headers.d.ts +0 -13
- package/http-client/middleware/headers.js +0 -25
- package/http-client/middleware/headers.js.map +0 -1
- package/http-client/middleware/log.js.map +0 -1
- package/http-client/middleware/tracing.js.map +0 -1
- package/http-client/sauce/index.js.map +0 -1
- package/http-client/types.d.ts +0 -6
- package/http-client/utils.js.map +0 -1
- package/http-server/constants.d.ts +0 -4
- package/http-server/constants.js +0 -8
- package/http-server/constants.js.map +0 -1
- package/http-server/errors.d.ts +0 -11
- package/http-server/errors.js +0 -18
- package/http-server/errors.js.map +0 -1
- package/http-server/handler/health-check.js.map +0 -1
- package/http-server/middleware/tracing.d.ts +0 -14
- package/http-server/middleware/tracing.js +0 -51
- package/http-server/middleware/tracing.js.map +0 -1
- package/http-server/types.d.ts +0 -20
- package/http-server/types.js +0 -3
- package/http-server/types.js.map +0 -1
- package/http-server/utils.d.ts +0 -43
- package/http-server/utils.js +0 -134
- package/http-server/utils.js.map +0 -1
- package/preset/browser/index.d.ts +0 -17
- package/preset/browser/index.js.map +0 -1
- package/preset/node/handler.d.ts +0 -20
- package/preset/node/handler.js +0 -208
- package/preset/node/handler.js.map +0 -1
- package/preset/parts/providers.d.ts +0 -7
- package/preset/parts/providers.js +0 -26
- package/preset/parts/providers.js.map +0 -1
- package/preset/parts/types.d.ts +0 -14
- package/preset/parts/types.js +0 -3
- package/preset/parts/types.js.map +0 -1
- package/preset/parts/utils.js.map +0 -1
- package/utils/browser/analytics/data-layer.js +0 -14
- package/utils/browser/analytics/data-layer.js.map +0 -1
- package/utils/browser/analytics/oko.d.ts +0 -13
- package/utils/browser/analytics/oko.js +0 -40
- package/utils/browser/analytics/oko.js.map +0 -1
- package/utils/browser/storage/index.js.map +0 -1
- /package/{http-client → preset/isomorphic}/types.js +0 -0
- /package/{http-client → utils/axios}/middleware/log.d.ts +0 -0
- /package/{http-client → utils/axios}/middleware/log.js +0 -0
- /package/{http-server → utils/express}/handler/health-check.d.ts +0 -0
- /package/{http-server → utils/express}/handler/health-check.js +0 -0
- /package/utils/{browser → web}/analytics/data-layer.d.ts +0 -0
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.provideSpecificParams = exports.providePageHelmet = exports.providePageRender = exports.provideHandlerMain = exports.provideHttpClientFactory = void 0;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const http_1 = require("../../../../http");
|
|
6
|
+
const tokens_1 = require("../../../../tokens");
|
|
7
|
+
const http_client_1 = require("../../node/utils/http-client");
|
|
8
|
+
const middleware_axios_1 = require("middleware-axios");
|
|
9
|
+
const utils_1 = require("../../../isomorphic/utils");
|
|
10
|
+
const axios_1 = require("../../../../utils/axios");
|
|
11
|
+
const constants_1 = require("../../../isomorphic/constants");
|
|
12
|
+
const react_1 = require("react");
|
|
13
|
+
const utils_2 = require("../utils");
|
|
14
|
+
const server_1 = require("react-dom/server");
|
|
15
|
+
/**
|
|
16
|
+
* Провайдер фабрики http-клиентов.
|
|
17
|
+
* @param resolve Функция для получения зависимости по токену.
|
|
18
|
+
* @return Фабрика.
|
|
19
|
+
*/
|
|
20
|
+
function provideHttpClientFactory(resolve) {
|
|
21
|
+
// @todo а что если привести все зависимости к виду:
|
|
22
|
+
// const getAppConfig = resolve.lazy(KnownToken.Config.base);
|
|
23
|
+
const appConfig = resolve(tokens_1.KnownToken.Config.base);
|
|
24
|
+
const tracer = resolve(tokens_1.KnownToken.Tracing.tracer);
|
|
25
|
+
const context = resolve(tokens_1.KnownToken.Http.Handler.context);
|
|
26
|
+
const logHandler = resolve(tokens_1.KnownToken.Http.Client.Middleware.Log.handler);
|
|
27
|
+
// @todo добавить при необходимости (но тогда в логе будет значительно больше ошибок)
|
|
28
|
+
// можно не отсылать ошибки из клиента если ответ от сервера уже ушел (writableEnded)
|
|
29
|
+
// const controller = new AbortController();
|
|
30
|
+
// context.res.on('finish', () => {
|
|
31
|
+
// controller.abort();
|
|
32
|
+
// });
|
|
33
|
+
// ВАЖНО: для всех клиентов в рамках обработчика должно быть одно хранилище cookie
|
|
34
|
+
const cookieStore = (0, http_1.createCookieStore)(context.req.header('cookie'));
|
|
35
|
+
cookieStore.subscribe(() => {
|
|
36
|
+
if (!context.res.writableEnded) {
|
|
37
|
+
context.res.setHeader('cookie', cookieStore.getCookies());
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
const defaultHeaders = (0, http_client_1.getRequestHeaders)(appConfig, context.req);
|
|
41
|
+
return (config = {}) => {
|
|
42
|
+
const client = (0, middleware_axios_1.create)({
|
|
43
|
+
...config,
|
|
44
|
+
headers: {
|
|
45
|
+
...defaultHeaders,
|
|
46
|
+
// @todo убрать as any
|
|
47
|
+
...config.headers,
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
client.use(utils_1.HttpStatus.axiosMiddleware());
|
|
51
|
+
client.use((0, http_client_1.tracingMiddleware)(tracer, context.res.locals.tracing.rootContext));
|
|
52
|
+
client.use((0, axios_1.logMiddleware)(logHandler));
|
|
53
|
+
client.use((0, axios_1.cookieMiddleware)(cookieStore));
|
|
54
|
+
return client;
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
exports.provideHttpClientFactory = provideHttpClientFactory;
|
|
58
|
+
/**
|
|
59
|
+
* Провайдер главной функции обработчика входящего http-запроса.
|
|
60
|
+
* @param resolve Функция для получения зависимости по токену.
|
|
61
|
+
* @return Главная функция.
|
|
62
|
+
*/
|
|
63
|
+
function provideHandlerMain(resolve) {
|
|
64
|
+
const config = resolve(tokens_1.KnownToken.Config.base);
|
|
65
|
+
const logger = resolve(tokens_1.KnownToken.logger);
|
|
66
|
+
const assetsInit = resolve(tokens_1.KnownToken.Http.Handler.Page.assets);
|
|
67
|
+
const render = resolve(tokens_1.KnownToken.Http.Handler.Page.render);
|
|
68
|
+
const extras = resolve(tokens_1.KnownToken.Http.Handler.Response.specificExtras);
|
|
69
|
+
const Helmet = resolve(tokens_1.KnownToken.Http.Handler.Page.helmet);
|
|
70
|
+
const { req, res } = resolve(tokens_1.KnownToken.Http.Handler.context);
|
|
71
|
+
const getAssets = typeof assetsInit === 'function' ? assetsInit : () => assetsInit;
|
|
72
|
+
/**
|
|
73
|
+
* Рендер JSX-элемента в строку.
|
|
74
|
+
* @param element Элемент.
|
|
75
|
+
* @return Строка.
|
|
76
|
+
*/
|
|
77
|
+
const elementToString = (element) => {
|
|
78
|
+
res.emit(constants_1.RESPONSE_EVENT_TYPE.renderStart);
|
|
79
|
+
const result = (0, server_1.renderToString)(element);
|
|
80
|
+
res.emit(constants_1.RESPONSE_EVENT_TYPE.renderFinish);
|
|
81
|
+
return result;
|
|
82
|
+
};
|
|
83
|
+
return async function main() {
|
|
84
|
+
try {
|
|
85
|
+
const assets = await getAssets();
|
|
86
|
+
const meta = extras.getMeta();
|
|
87
|
+
const jsx = ((0, jsx_runtime_1.jsx)(utils_2.HelmetContext.Provider, { value: { title: config.appName, assets }, children: (0, jsx_runtime_1.jsx)(Helmet, { children: await render() }) }));
|
|
88
|
+
switch ((0, utils_2.getResponseFormat)(req)) {
|
|
89
|
+
case 'html': {
|
|
90
|
+
res.setHeader('simaland-bundle-js', assets.js);
|
|
91
|
+
res.setHeader('simaland-bundle-css', assets.css);
|
|
92
|
+
if (assets.criticalJs) {
|
|
93
|
+
res.setHeader('simaland-critical-js', assets.criticalJs);
|
|
94
|
+
}
|
|
95
|
+
if (assets.criticalCss) {
|
|
96
|
+
res.setHeader('simaland-critical-css', assets.criticalCss);
|
|
97
|
+
}
|
|
98
|
+
if (meta) {
|
|
99
|
+
res.setHeader('simaland-meta', JSON.stringify(meta));
|
|
100
|
+
}
|
|
101
|
+
// ВАЖНО: DOCTYPE обязательно нужен так как влияет на то как браузер будет парсить html/css
|
|
102
|
+
// ВАЖНО: DOCTYPE нужен только когда отдаем полноценную страницу
|
|
103
|
+
if (config.env === 'development') {
|
|
104
|
+
res.send(`<!DOCTYPE html>${elementToString(jsx)}`);
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
res.send(elementToString(jsx));
|
|
108
|
+
}
|
|
109
|
+
break;
|
|
110
|
+
}
|
|
111
|
+
case 'json': {
|
|
112
|
+
res.json({
|
|
113
|
+
markup: elementToString(jsx),
|
|
114
|
+
bundle_js: assets.js,
|
|
115
|
+
bundle_css: assets.css,
|
|
116
|
+
critical_js: assets.criticalJs,
|
|
117
|
+
critical_css: assets.criticalCss,
|
|
118
|
+
meta,
|
|
119
|
+
});
|
|
120
|
+
break;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
let message;
|
|
126
|
+
let statusCode = 500; // по умолчанию, если на этапе подготовки страницы что-то не так, отдаем 500
|
|
127
|
+
if (error instanceof Error) {
|
|
128
|
+
message = error.message;
|
|
129
|
+
if (error instanceof http_1.ResponseError) {
|
|
130
|
+
statusCode = error.statusCode;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
message = String(error);
|
|
135
|
+
}
|
|
136
|
+
res.status(statusCode).send(message);
|
|
137
|
+
logger.error(error);
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
exports.provideHandlerMain = provideHandlerMain;
|
|
142
|
+
/**
|
|
143
|
+
* Провайдер render-функции.
|
|
144
|
+
* @return Render-Функция.
|
|
145
|
+
*/
|
|
146
|
+
function providePageRender() {
|
|
147
|
+
return () => ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("h1", { children: "Hello, world!" }), (0, jsx_runtime_1.jsx)("p", { children: "This is a stub page. Define the render component in your handler" })] }));
|
|
148
|
+
}
|
|
149
|
+
exports.providePageRender = providePageRender;
|
|
150
|
+
/**
|
|
151
|
+
* Провайдер helmet-компонента. Этот компонент является контейнером для результата render-функции.
|
|
152
|
+
* @param resolve Функция для получения зависимости по токену.
|
|
153
|
+
* @return Helmet-компонент.
|
|
154
|
+
*/
|
|
155
|
+
function providePageHelmet(resolve) {
|
|
156
|
+
const config = resolve(tokens_1.KnownToken.Config.base);
|
|
157
|
+
const { req } = resolve(tokens_1.KnownToken.Http.Handler.context);
|
|
158
|
+
return config.env === 'development' && (0, utils_2.getResponseFormat)(req) === 'html'
|
|
159
|
+
? utils_2.RegularHelmet
|
|
160
|
+
: react_1.Fragment;
|
|
161
|
+
}
|
|
162
|
+
exports.providePageHelmet = providePageHelmet;
|
|
163
|
+
/**
|
|
164
|
+
* Провайдер специфичных параметров, которые frontend-микросервис будет получать в запросе.
|
|
165
|
+
* @param resolve Функция для получения зависимости по токену.
|
|
166
|
+
* @return Параметры.
|
|
167
|
+
*/
|
|
168
|
+
function provideSpecificParams(resolve) {
|
|
169
|
+
const context = resolve(tokens_1.KnownToken.Http.Handler.context);
|
|
170
|
+
try {
|
|
171
|
+
const headerValue = context.req.header('simaland-params');
|
|
172
|
+
/**
|
|
173
|
+
* Node.js переводит в ASCII.
|
|
174
|
+
* @see {https://github.com/nodejs/node/issues/17390}
|
|
175
|
+
*/
|
|
176
|
+
const processedValue = headerValue ? Buffer.from(headerValue, 'binary').toString('utf8') : '';
|
|
177
|
+
return processedValue ? JSON.parse(processedValue) : {};
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
return {};
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
exports.provideSpecificParams = provideSpecificParams;
|
|
184
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/preset/node/handler/providers/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { PageAssets } from '../../../isomorphic/types';
|
|
3
|
+
import { Handler, Request } from 'express';
|
|
4
|
+
import { Application, Resolve } from '../../../../di';
|
|
5
|
+
export declare const HelmetContext: import("react").Context<{
|
|
6
|
+
title?: string | undefined;
|
|
7
|
+
assets?: PageAssets | undefined;
|
|
8
|
+
}>;
|
|
9
|
+
/**
|
|
10
|
+
* Простой Helmet-компонент.
|
|
11
|
+
* Выведет html, head и body.
|
|
12
|
+
* @param props Свойства.
|
|
13
|
+
* @return Элемент.
|
|
14
|
+
*/
|
|
15
|
+
export declare function RegularHelmet({ children }: {
|
|
16
|
+
children?: ReactNode;
|
|
17
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
18
|
+
/**
|
|
19
|
+
* Специфичные для наших микросервисов дополнительные данные ответа.
|
|
20
|
+
*/
|
|
21
|
+
export declare class SpecificExtras {
|
|
22
|
+
private _meta;
|
|
23
|
+
/**
|
|
24
|
+
* Установит мета-данные.
|
|
25
|
+
* @param meta Данные.
|
|
26
|
+
* @return Контекст.
|
|
27
|
+
*/
|
|
28
|
+
setMeta(meta: any): this;
|
|
29
|
+
/**
|
|
30
|
+
* Вернет установленные мета-данные.
|
|
31
|
+
* @return Данные.
|
|
32
|
+
*/
|
|
33
|
+
getMeta(): unknown;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Определит формат ответа.
|
|
37
|
+
* @param req Запрос.
|
|
38
|
+
* @return Формат.
|
|
39
|
+
*/
|
|
40
|
+
export declare function getResponseFormat(req: Request): 'html' | 'json';
|
|
41
|
+
/**
|
|
42
|
+
* Возвращает express-handler, создающий дочернее di-приложение при запросе.
|
|
43
|
+
* @param getApp Должна вернуть di-приложения запроса.
|
|
44
|
+
* @return Обработчик.
|
|
45
|
+
*/
|
|
46
|
+
export declare function HandlerProvider(getApp: () => Application): (resolve: Resolve) => Handler;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.HandlerProvider = exports.getResponseFormat = exports.SpecificExtras = exports.RegularHelmet = exports.HelmetContext = void 0;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const react_1 = require("react");
|
|
6
|
+
const di_1 = require("../../../../di");
|
|
7
|
+
const tokens_1 = require("../../../../tokens");
|
|
8
|
+
exports.HelmetContext = (0, react_1.createContext)({});
|
|
9
|
+
const resetCSS = `
|
|
10
|
+
* {
|
|
11
|
+
box-sizing: border-box;
|
|
12
|
+
}
|
|
13
|
+
body {
|
|
14
|
+
font-family: -apple-system,BlinkMacSystemFont,'Source Sans Pro',"Segoe UI",Roboto,"Helvetica Neue",Ubuntu,Arial,sans-serif;
|
|
15
|
+
margin: 0;
|
|
16
|
+
}
|
|
17
|
+
`;
|
|
18
|
+
/**
|
|
19
|
+
* Простой Helmet-компонент.
|
|
20
|
+
* Выведет html, head и body.
|
|
21
|
+
* @param props Свойства.
|
|
22
|
+
* @return Элемент.
|
|
23
|
+
*/
|
|
24
|
+
function RegularHelmet({ children }) {
|
|
25
|
+
const { title, assets } = (0, react_1.useContext)(exports.HelmetContext);
|
|
26
|
+
return ((0, jsx_runtime_1.jsxs)("html", { children: [(0, jsx_runtime_1.jsxs)("head", { children: [(0, jsx_runtime_1.jsx)("meta", { charSet: 'UTF-8' }), (0, jsx_runtime_1.jsx)("meta", { httpEquiv: 'X-UA-Compatible', content: 'IE=edge' }), (0, jsx_runtime_1.jsx)("meta", { name: 'viewport', content: 'width=device-width, initial-scale=1' }), (0, jsx_runtime_1.jsx)("title", { children: title ?? 'Document' }), (0, jsx_runtime_1.jsx)("link", { href: 'https://fonts.googleapis.com/css2?family=Source+Sans+Pro:ital,wght@0,200;0,300;0,400;0,600;0,700;0,900;1,200;1,300;1,400;1,600;1,700;1,900&display=swap', rel: 'stylesheet' }), (0, jsx_runtime_1.jsx)("style", { dangerouslySetInnerHTML: { __html: resetCSS } }), assets?.criticalCss && (0, jsx_runtime_1.jsx)("link", { rel: 'stylesheet', href: assets.criticalCss }), assets?.css && (0, jsx_runtime_1.jsx)("link", { rel: 'stylesheet', href: assets.css }), assets?.criticalJs && (0, jsx_runtime_1.jsx)("script", { src: assets.criticalJs })] }), (0, jsx_runtime_1.jsxs)("body", { children: [children, assets?.js && (0, jsx_runtime_1.jsx)("script", { src: assets.js })] })] }));
|
|
27
|
+
}
|
|
28
|
+
exports.RegularHelmet = RegularHelmet;
|
|
29
|
+
/**
|
|
30
|
+
* Специфичные для наших микросервисов дополнительные данные ответа.
|
|
31
|
+
*/
|
|
32
|
+
class SpecificExtras {
|
|
33
|
+
/**
|
|
34
|
+
* Установит мета-данные.
|
|
35
|
+
* @param meta Данные.
|
|
36
|
+
* @return Контекст.
|
|
37
|
+
*/
|
|
38
|
+
setMeta(meta) {
|
|
39
|
+
this._meta = meta;
|
|
40
|
+
return this;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Вернет установленные мета-данные.
|
|
44
|
+
* @return Данные.
|
|
45
|
+
*/
|
|
46
|
+
getMeta() {
|
|
47
|
+
return this._meta;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
exports.SpecificExtras = SpecificExtras;
|
|
51
|
+
/**
|
|
52
|
+
* Определит формат ответа.
|
|
53
|
+
* @param req Запрос.
|
|
54
|
+
* @return Формат.
|
|
55
|
+
*/
|
|
56
|
+
function getResponseFormat(req) {
|
|
57
|
+
let result = 'html';
|
|
58
|
+
if ((req.header('accept') || '').toLowerCase().includes('application/json')) {
|
|
59
|
+
result = 'json';
|
|
60
|
+
}
|
|
61
|
+
return result;
|
|
62
|
+
}
|
|
63
|
+
exports.getResponseFormat = getResponseFormat;
|
|
64
|
+
/**
|
|
65
|
+
* Возвращает express-handler, создающий дочернее di-приложение при запросе.
|
|
66
|
+
* @param getApp Должна вернуть di-приложения запроса.
|
|
67
|
+
* @return Обработчик.
|
|
68
|
+
*/
|
|
69
|
+
function HandlerProvider(getApp) {
|
|
70
|
+
return function provider(resolve) {
|
|
71
|
+
const parent = resolve(di_1.CURRENT_APP);
|
|
72
|
+
return function handler(req, res, next) {
|
|
73
|
+
const app = getApp();
|
|
74
|
+
app.attach(parent);
|
|
75
|
+
app.bind(tokens_1.KnownToken.Http.Handler.context).toValue({ req, res, next });
|
|
76
|
+
app.get(tokens_1.KnownToken.Http.Handler.main)();
|
|
77
|
+
};
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
exports.HandlerProvider = HandlerProvider;
|
|
81
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/preset/node/handler/utils/index.tsx"],"names":[],"mappings":";;;;AAAA,iCAA6D;AAG7D,uCAAmE;AACnE,+CAAgD;AAEnC,QAAA,aAAa,GAAG,IAAA,qBAAa,EAA0C,EAAE,CAAC,CAAC;AAExF,MAAM,QAAQ,GAAG;;;;;;;;CAQhB,CAAC;AAEF;;;;;GAKG;AACH,SAAgB,aAAa,CAAC,EAAE,QAAQ,EAA4B;IAClE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAA,kBAAU,EAAC,qBAAa,CAAC,CAAC;IAEpD,OAAO,CACL,6CACE,6CACE,iCAAM,OAAO,EAAC,OAAO,GAAG,EACxB,iCAAM,SAAS,EAAC,iBAAiB,EAAC,OAAO,EAAC,SAAS,GAAG,EACtD,iCAAM,IAAI,EAAC,UAAU,EAAC,OAAO,EAAC,qCAAqC,GAAG,EACtE,4CAAQ,KAAK,IAAI,UAAU,GAAS,EACpC,iCACE,IAAI,EAAC,yJAA6J,EAClK,GAAG,EAAC,YAAY,GAChB,EACF,kCAAO,uBAAuB,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAI,EAEvD,MAAM,EAAE,WAAW,IAAI,iCAAM,GAAG,EAAC,YAAY,EAAC,IAAI,EAAE,MAAM,CAAC,WAAW,GAAI,EAC1E,MAAM,EAAE,GAAG,IAAI,iCAAM,GAAG,EAAC,YAAY,EAAC,IAAI,EAAE,MAAM,CAAC,GAAG,GAAI,EAC1D,MAAM,EAAE,UAAU,IAAI,mCAAQ,GAAG,EAAE,MAAM,CAAC,UAAU,GAAI,IACpD,EACP,6CACG,QAAQ,EACR,MAAM,EAAE,EAAE,IAAI,mCAAQ,GAAG,EAAE,MAAM,CAAC,EAAE,GAAI,IACpC,IACF,CACR,CAAC;AACJ,CAAC;AA1BD,sCA0BC;AAED;;GAEG;AACH,MAAa,cAAc;IAGzB;;;;OAIG;IACH,OAAO,CAAC,IAAS;QACf,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACH,OAAO;QACL,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;CACF;AApBD,wCAoBC;AAED;;;;GAIG;AACH,SAAgB,iBAAiB,CAAC,GAAY;IAC5C,IAAI,MAAM,GAAoB,MAAM,CAAC;IAErC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE;QAC3E,MAAM,GAAG,MAAM,CAAC;KACjB;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AARD,8CAQC;AAED;;;;GAIG;AACH,SAAgB,eAAe,CAAC,MAAyB;IACvD,OAAO,SAAS,QAAQ,CAAC,OAAgB;QACvC,MAAM,MAAM,GAAG,OAAO,CAAC,gBAAW,CAAC,CAAC;QAEpC,OAAO,SAAS,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI;YACpC,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;YAErB,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACnB,GAAG,CAAC,IAAI,CAAC,mBAAU,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;YACtE,GAAG,CAAC,GAAG,CAAC,mBAAU,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,CAAC,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAZD,0CAYC"}
|
package/preset/node/index.d.ts
CHANGED
|
@@ -1,29 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import { ConfigSource } from '../../config';
|
|
4
|
-
import { Resolve, Preset } from '../../di';
|
|
5
|
-
import { StrictMap, KnownHttpApiKey, PresetTuner } from '../parts/types';
|
|
6
|
-
import { Application, Handler } from 'express';
|
|
7
|
-
import type { Tracer } from '@opentelemetry/api';
|
|
8
|
-
import { BasicTracerProvider, SpanExporter } from '@opentelemetry/sdk-trace-base';
|
|
9
|
-
import { Resource } from '@opentelemetry/resources';
|
|
10
|
-
/**
|
|
11
|
-
* Возвращает preset с зависимостями по умолчанию для frontend-микросервисов на Node.js.
|
|
12
|
-
* @param customize Получит функцию с помощью которой можно переопределить предустановленные провайдеры.
|
|
13
|
-
* @return Preset.
|
|
14
|
-
*/
|
|
15
|
-
export declare function PresetNode(customize?: PresetTuner): Preset;
|
|
16
|
-
export declare function provideConfigSource(): ConfigSource;
|
|
17
|
-
export declare function provideLogger(resolve: Resolve): Logger;
|
|
18
|
-
export declare function provideSentryHandler(resolve: Resolve): LogHandler;
|
|
19
|
-
export declare function providePinoHandler(resolve: Resolve): LogHandler;
|
|
20
|
-
export declare function provideTracer(resolve: Resolve): Tracer;
|
|
21
|
-
export declare function provideSpanExporter(resolve: Resolve): SpanExporter;
|
|
22
|
-
export declare function provideTracerProvider(resolve: Resolve): BasicTracerProvider;
|
|
23
|
-
export declare function provideTracerProviderResource(resolve: Resolve): Resource;
|
|
24
|
-
export declare function provideHttpServerLogMiddleware(resolve: Resolve): Handler;
|
|
25
|
-
export declare function provideHttpServerMetricsMiddleware(resolve: Resolve): Handler;
|
|
26
|
-
export declare function provideHttpServerTracingMiddleware(resolve: Resolve): Handler;
|
|
27
|
-
export declare function provideBridgeServerSide(resolve: Resolve): BridgeServerSide;
|
|
28
|
-
export declare function provideKnownHttpApiHosts(resolve: Resolve): StrictMap<KnownHttpApiKey>;
|
|
29
|
-
export declare function provideMetricsHttpApp(): Application;
|
|
1
|
+
export { PresetNode } from './node';
|
|
2
|
+
export { PresetHandler, HandlerProvider } from './handler';
|
package/preset/node/index.js
CHANGED
|
@@ -1,292 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
-
};
|
|
28
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
-
exports.
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
const utils_1 = require("../parts/utils");
|
|
36
|
-
const tokens_1 = require("../../tokens");
|
|
37
|
-
const providers_1 = require("../parts/providers");
|
|
38
|
-
const di_1 = require("../../di");
|
|
39
|
-
const tracing_1 = require("../../http-server/middleware/tracing");
|
|
40
|
-
const health_check_1 = require("../../http-server/handler/health-check");
|
|
41
|
-
const utils_2 = require("../../http-server/utils");
|
|
42
|
-
const number_1 = require("../../utils/number");
|
|
43
|
-
const constants_1 = require("../../http-server/constants");
|
|
44
|
-
// Node.js specific packages
|
|
45
|
-
const node_os_1 = __importDefault(require("node:os"));
|
|
46
|
-
const node_path_1 = __importDefault(require("node:path"));
|
|
47
|
-
// Node.js libraries (not isomorphic)
|
|
48
|
-
const dotenv_1 = require("dotenv");
|
|
49
|
-
const middleware_axios_1 = require("middleware-axios");
|
|
50
|
-
const node_1 = require("@sentry/node");
|
|
51
|
-
const PromClient = __importStar(require("prom-client"));
|
|
52
|
-
const express_1 = __importDefault(require("express"));
|
|
53
|
-
const pino_2 = __importDefault(require("pino"));
|
|
54
|
-
const pino_pretty_1 = __importDefault(require("pino-pretty"));
|
|
55
|
-
const sdk_trace_base_1 = require("@opentelemetry/sdk-trace-base");
|
|
56
|
-
const exporter_trace_otlp_http_1 = require("@opentelemetry/exporter-trace-otlp-http");
|
|
57
|
-
const propagator_jaeger_1 = require("@opentelemetry/propagator-jaeger");
|
|
58
|
-
const sdk_trace_node_1 = require("@opentelemetry/sdk-trace-node");
|
|
59
|
-
const resources_1 = require("@opentelemetry/resources");
|
|
60
|
-
const semantic_conventions_1 = require("@opentelemetry/semantic-conventions");
|
|
61
|
-
/**
|
|
62
|
-
* Возвращает preset с зависимостями по умолчанию для frontend-микросервисов на Node.js.
|
|
63
|
-
* @param customize Получит функцию с помощью которой можно переопределить предустановленные провайдеры.
|
|
64
|
-
* @return Preset.
|
|
65
|
-
*/
|
|
66
|
-
function PresetNode(customize) {
|
|
67
|
-
// ВАЖНО: используем .set() вместо аргумента defaults функции createPreset из-за скорости
|
|
68
|
-
const preset = (0, di_1.createPreset)();
|
|
69
|
-
// config
|
|
70
|
-
preset.set(tokens_1.KnownToken.Config.source, provideConfigSource);
|
|
71
|
-
preset.set(tokens_1.KnownToken.Config.base, providers_1.provideBaseConfig);
|
|
72
|
-
// log
|
|
73
|
-
preset.set(tokens_1.KnownToken.logger, provideLogger);
|
|
74
|
-
// tracing
|
|
75
|
-
preset.set(tokens_1.KnownToken.Tracing.tracer, provideTracer);
|
|
76
|
-
preset.set(tokens_1.KnownToken.Tracing.spanExporter, provideSpanExporter);
|
|
77
|
-
preset.set(tokens_1.KnownToken.Tracing.tracerProvider, provideTracerProvider);
|
|
78
|
-
preset.set(tokens_1.KnownToken.Tracing.tracerProviderResource, provideTracerProviderResource);
|
|
79
|
-
// metrics
|
|
80
|
-
preset.set(tokens_1.KnownToken.Metrics.httpApp, provideMetricsHttpApp);
|
|
81
|
-
// http client
|
|
82
|
-
preset.set(tokens_1.KnownToken.Http.Client.factory, () => middleware_axios_1.create);
|
|
83
|
-
// http server
|
|
84
|
-
preset.set(tokens_1.KnownToken.Http.Server.factory, () => express_1.default);
|
|
85
|
-
preset.set(tokens_1.KnownToken.Http.Server.Handlers.healthCheck, () => (0, health_check_1.healthCheck)());
|
|
86
|
-
preset.set(tokens_1.KnownToken.Http.Server.Middleware.request, () => node_1.Handlers.requestHandler());
|
|
87
|
-
preset.set(tokens_1.KnownToken.Http.Server.Middleware.log, provideHttpServerLogMiddleware);
|
|
88
|
-
preset.set(tokens_1.KnownToken.Http.Server.Middleware.metrics, provideHttpServerMetricsMiddleware);
|
|
89
|
-
preset.set(tokens_1.KnownToken.Http.Server.Middleware.tracing, provideHttpServerTracingMiddleware);
|
|
90
|
-
preset.set(tokens_1.KnownToken.Http.Server.Middleware.error, () => node_1.Handlers.errorHandler());
|
|
91
|
-
// http api
|
|
92
|
-
preset.set(tokens_1.KnownToken.Http.Api.knownHosts, provideKnownHttpApiHosts);
|
|
93
|
-
// ssr bridge
|
|
94
|
-
preset.set(tokens_1.KnownToken.SsrBridge.serverSide, provideBridgeServerSide);
|
|
95
|
-
if (customize) {
|
|
96
|
-
customize({ override: preset.set.bind(preset) });
|
|
97
|
-
}
|
|
98
|
-
return preset;
|
|
99
|
-
}
|
|
100
|
-
exports.PresetNode = PresetNode;
|
|
101
|
-
function provideConfigSource() {
|
|
102
|
-
const envName = process.env.NODE_ENV;
|
|
103
|
-
// подключаем соответствующий среде файл со значениями по умолчанию
|
|
104
|
-
if (envName) {
|
|
105
|
-
(0, dotenv_1.config)({ path: node_path_1.default.resolve(process.cwd(), `./.env.${envName}`) });
|
|
106
|
-
}
|
|
107
|
-
return (0, config_1.createConfigSource)(process.env);
|
|
108
|
-
}
|
|
109
|
-
exports.provideConfigSource = provideConfigSource;
|
|
110
|
-
function provideLogger(resolve) {
|
|
111
|
-
const logger = (0, log_1.createLogger)();
|
|
112
|
-
// @todo возможно надо придумать как не давать вызывать провайдеры внутри провайдеров
|
|
113
|
-
logger.subscribe(providePinoHandler(resolve));
|
|
114
|
-
logger.subscribe(provideSentryHandler(resolve));
|
|
115
|
-
return logger;
|
|
116
|
-
}
|
|
117
|
-
exports.provideLogger = provideLogger;
|
|
118
|
-
function provideSentryHandler(resolve) {
|
|
119
|
-
const source = resolve(tokens_1.KnownToken.Config.source);
|
|
120
|
-
// экспериментально пробуем не использовать вручную созданный клиент
|
|
121
|
-
(0, node_1.init)({
|
|
122
|
-
dsn: source.require('SENTRY_DSN'),
|
|
123
|
-
release: source.require('SENTRY_RELEASE'),
|
|
124
|
-
environment: source.require('SENTRY_ENVIRONMENT'),
|
|
125
|
-
});
|
|
126
|
-
// ВАЖНО: передаем функцию чтобы брать текущий hub в момент вызова метода logger'а
|
|
127
|
-
// это нужно чтобы хлебные крошки в ошибках Sentry группировались по запросам
|
|
128
|
-
return (0, sentry_1.createSentryHandler)(node_1.getCurrentHub);
|
|
129
|
-
}
|
|
130
|
-
exports.provideSentryHandler = provideSentryHandler;
|
|
131
|
-
function providePinoHandler(resolve) {
|
|
132
|
-
const config = resolve(tokens_1.KnownToken.Config.base);
|
|
133
|
-
const pinoLogger = (0, pino_2.default)(config.env === 'production'
|
|
134
|
-
? {
|
|
135
|
-
formatters: {
|
|
136
|
-
// ВАЖНО: для Fluent необходимо наличие поля level: string
|
|
137
|
-
level: label => ({ level: label }),
|
|
138
|
-
},
|
|
139
|
-
}
|
|
140
|
-
: (0, pino_pretty_1.default)({
|
|
141
|
-
colorize: true,
|
|
142
|
-
translateTime: 'yyyy-mm-dd HH:MM:ss.l o',
|
|
143
|
-
}));
|
|
144
|
-
return (0, pino_1.createPinoHandler)(pinoLogger);
|
|
145
|
-
}
|
|
146
|
-
exports.providePinoHandler = providePinoHandler;
|
|
147
|
-
function provideTracer(resolve) {
|
|
148
|
-
const config = resolve(tokens_1.KnownToken.Config.base);
|
|
149
|
-
const provider = resolve(tokens_1.KnownToken.Tracing.tracerProvider);
|
|
150
|
-
return provider.getTracer(config.appName, config.appVersion);
|
|
151
|
-
}
|
|
152
|
-
exports.provideTracer = provideTracer;
|
|
153
|
-
function provideSpanExporter(resolve) {
|
|
154
|
-
const source = resolve(tokens_1.KnownToken.Config.source);
|
|
155
|
-
return new exporter_trace_otlp_http_1.OTLPTraceExporter({
|
|
156
|
-
url: source.require('JAEGER_AGENT_URL'),
|
|
157
|
-
});
|
|
158
|
-
}
|
|
159
|
-
exports.provideSpanExporter = provideSpanExporter;
|
|
160
|
-
function provideTracerProvider(resolve) {
|
|
161
|
-
const exporter = resolve(tokens_1.KnownToken.Tracing.spanExporter);
|
|
162
|
-
const resource = resolve(tokens_1.KnownToken.Tracing.tracerProviderResource);
|
|
163
|
-
const provider = new sdk_trace_node_1.NodeTracerProvider({ resource });
|
|
164
|
-
provider.addSpanProcessor(new sdk_trace_base_1.BatchSpanProcessor(exporter));
|
|
165
|
-
provider.register({ propagator: new propagator_jaeger_1.JaegerPropagator() });
|
|
166
|
-
return provider;
|
|
167
|
-
}
|
|
168
|
-
exports.provideTracerProvider = provideTracerProvider;
|
|
169
|
-
function provideTracerProviderResource(resolve) {
|
|
170
|
-
const config = resolve(tokens_1.KnownToken.Config.base);
|
|
171
|
-
return new resources_1.Resource({
|
|
172
|
-
[semantic_conventions_1.SemanticResourceAttributes.HOST_NAME]: node_os_1.default.hostname(),
|
|
173
|
-
[semantic_conventions_1.SemanticResourceAttributes.SERVICE_NAME]: config.appName,
|
|
174
|
-
[semantic_conventions_1.SemanticResourceAttributes.SERVICE_VERSION]: config.appVersion,
|
|
175
|
-
[semantic_conventions_1.SemanticResourceAttributes.DEPLOYMENT_ENVIRONMENT]: config.env,
|
|
176
|
-
});
|
|
177
|
-
}
|
|
178
|
-
exports.provideTracerProviderResource = provideTracerProviderResource;
|
|
179
|
-
function provideHttpServerLogMiddleware(resolve) {
|
|
180
|
-
const config = resolve(tokens_1.KnownToken.Config.base);
|
|
181
|
-
const logger = resolve(tokens_1.KnownToken.logger);
|
|
182
|
-
return (req, res, next) => {
|
|
183
|
-
const start = process.hrtime.bigint();
|
|
184
|
-
const remoteIp = (0, utils_2.getXClientIp)(req);
|
|
185
|
-
const startMsg = {
|
|
186
|
-
type: 'http.request[incoming]',
|
|
187
|
-
version: config.appVersion,
|
|
188
|
-
route: req.originalUrl,
|
|
189
|
-
method: req.method,
|
|
190
|
-
remote_ip: remoteIp,
|
|
191
|
-
};
|
|
192
|
-
logger.info(startMsg);
|
|
193
|
-
res.once('finish', () => {
|
|
194
|
-
const finish = process.hrtime.bigint();
|
|
195
|
-
const finishMsg = {
|
|
196
|
-
type: 'http.response[outgoing]',
|
|
197
|
-
version: config.appVersion,
|
|
198
|
-
route: req.originalUrl,
|
|
199
|
-
method: req.method,
|
|
200
|
-
status: res.statusCode,
|
|
201
|
-
remote_ip: remoteIp,
|
|
202
|
-
latency: (0, number_1.toMilliseconds)(finish - start),
|
|
203
|
-
};
|
|
204
|
-
logger.info(finishMsg);
|
|
205
|
-
});
|
|
206
|
-
next();
|
|
207
|
-
};
|
|
208
|
-
}
|
|
209
|
-
exports.provideHttpServerLogMiddleware = provideHttpServerLogMiddleware;
|
|
210
|
-
function provideHttpServerMetricsMiddleware(resolve) {
|
|
211
|
-
const config = resolve(tokens_1.KnownToken.Config.base);
|
|
212
|
-
const ConventionalLabels = {
|
|
213
|
-
HTTP_RESPONSE: ['version', 'route', 'code', 'method'],
|
|
214
|
-
SSR: ['version', 'route', 'method'],
|
|
215
|
-
};
|
|
216
|
-
const requestCount = new PromClient.Counter({
|
|
217
|
-
name: 'http_request_count',
|
|
218
|
-
help: 'Incoming HTTP request count',
|
|
219
|
-
labelNames: ConventionalLabels.HTTP_RESPONSE,
|
|
220
|
-
});
|
|
221
|
-
const responseDuration = new PromClient.Histogram({
|
|
222
|
-
name: 'http_response_duration_ms',
|
|
223
|
-
help: 'Duration of incoming HTTP requests in ms',
|
|
224
|
-
labelNames: ConventionalLabels.HTTP_RESPONSE,
|
|
225
|
-
buckets: [30, 100, 200, 500, 1000, 2500, 5000, 10000],
|
|
226
|
-
});
|
|
227
|
-
const renderDuration = new PromClient.Histogram({
|
|
228
|
-
name: 'render_duration_ms',
|
|
229
|
-
help: 'Duration of SSR ms',
|
|
230
|
-
labelNames: ConventionalLabels.SSR,
|
|
231
|
-
buckets: [0.1, 15, 50, 100, 250, 500, 800, 1500],
|
|
232
|
-
});
|
|
233
|
-
const getLabels = (req, res) => ({
|
|
234
|
-
version: config.appVersion,
|
|
235
|
-
route: req.baseUrl + req.path,
|
|
236
|
-
code: res.statusCode,
|
|
237
|
-
method: req.method,
|
|
238
|
-
});
|
|
239
|
-
return (req, res, next) => {
|
|
240
|
-
const responseStart = process.hrtime.bigint();
|
|
241
|
-
requestCount.inc(getLabels(req, res), 1);
|
|
242
|
-
res.once(constants_1.RESPONSE_EVENT.renderStart, () => {
|
|
243
|
-
const renderStart = process.hrtime.bigint();
|
|
244
|
-
res.once(constants_1.RESPONSE_EVENT.renderFinish, () => {
|
|
245
|
-
const renderFinish = process.hrtime.bigint();
|
|
246
|
-
renderDuration.observe({
|
|
247
|
-
version: config.appVersion,
|
|
248
|
-
method: req.method,
|
|
249
|
-
route: req.baseUrl + req.path,
|
|
250
|
-
}, (0, number_1.toMilliseconds)(renderStart - renderFinish));
|
|
251
|
-
});
|
|
252
|
-
});
|
|
253
|
-
res.once('finish', () => {
|
|
254
|
-
const responseFinish = process.hrtime.bigint();
|
|
255
|
-
responseDuration.observe(getLabels(req, res), (0, number_1.toMilliseconds)(responseFinish - responseStart));
|
|
256
|
-
});
|
|
257
|
-
next();
|
|
258
|
-
};
|
|
259
|
-
}
|
|
260
|
-
exports.provideHttpServerMetricsMiddleware = provideHttpServerMetricsMiddleware;
|
|
261
|
-
function provideHttpServerTracingMiddleware(resolve) {
|
|
262
|
-
const tracer = resolve(tokens_1.KnownToken.Tracing.tracer);
|
|
263
|
-
return (0, tracing_1.tracingMiddleware)(tracer);
|
|
264
|
-
}
|
|
265
|
-
exports.provideHttpServerTracingMiddleware = provideHttpServerTracingMiddleware;
|
|
266
|
-
function provideBridgeServerSide(resolve) {
|
|
267
|
-
const config = resolve(tokens_1.KnownToken.Config.base);
|
|
268
|
-
return ssr_1.SsrBridge.prepare(config.appName);
|
|
269
|
-
}
|
|
270
|
-
exports.provideBridgeServerSide = provideBridgeServerSide;
|
|
271
|
-
function provideKnownHttpApiHosts(resolve) {
|
|
272
|
-
const source = resolve(tokens_1.KnownToken.Config.source);
|
|
273
|
-
return new utils_1.HttpApiHostPool({
|
|
274
|
-
ilium: 'API_URL_ILIUM',
|
|
275
|
-
simaV3: 'API_URL_SIMALAND_V3',
|
|
276
|
-
simaV4: 'API_URL_SIMALAND_V4',
|
|
277
|
-
simaV6: 'API_URL_SIMALAND_V6',
|
|
278
|
-
}, source);
|
|
279
|
-
}
|
|
280
|
-
exports.provideKnownHttpApiHosts = provideKnownHttpApiHosts;
|
|
281
|
-
function provideMetricsHttpApp() {
|
|
282
|
-
PromClient.collectDefaultMetrics();
|
|
283
|
-
const app = (0, express_1.default)();
|
|
284
|
-
app.get('/', async function (req, res) {
|
|
285
|
-
const metrics = await PromClient.register.metrics();
|
|
286
|
-
res.setHeader('Content-Type', PromClient.register.contentType);
|
|
287
|
-
res.send(metrics);
|
|
288
|
-
});
|
|
289
|
-
return app;
|
|
290
|
-
}
|
|
291
|
-
exports.provideMetricsHttpApp = provideMetricsHttpApp;
|
|
3
|
+
exports.HandlerProvider = exports.PresetHandler = exports.PresetNode = void 0;
|
|
4
|
+
var node_1 = require("./node");
|
|
5
|
+
Object.defineProperty(exports, "PresetNode", { enumerable: true, get: function () { return node_1.PresetNode; } });
|
|
6
|
+
var handler_1 = require("./handler");
|
|
7
|
+
Object.defineProperty(exports, "PresetHandler", { enumerable: true, get: function () { return handler_1.PresetHandler; } });
|
|
8
|
+
Object.defineProperty(exports, "HandlerProvider", { enumerable: true, get: function () { return handler_1.HandlerProvider; } });
|
|
292
9
|
//# sourceMappingURL=index.js.map
|