@sima-land/isomorph 10.1.0 → 11.0.0-alpha.0
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/LICENSE +201 -0
- package/dist/cache/types.d.ts +7 -0
- package/dist/cache/types.js +3 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/config/browser.d.ts +6 -0
- package/dist/config/browser.js +13 -0
- package/dist/config/browser.js.map +1 -0
- package/dist/config/index.d.ts +7 -0
- package/dist/config/index.js +20 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/node.d.ts +6 -0
- package/dist/config/node.js +19 -0
- package/dist/config/node.js.map +1 -0
- package/dist/config/types.d.ts +7 -0
- package/dist/config/types.js +3 -0
- package/dist/config/types.js.map +1 -0
- package/dist/config/utils.d.ts +5 -0
- package/dist/config/utils.js +12 -0
- package/dist/config/utils.js.map +1 -0
- package/dist/container/application.d.ts +25 -0
- package/dist/container/application.js +63 -0
- package/dist/container/application.js.map +1 -0
- package/dist/container/index.d.ts +18 -0
- package/dist/container/index.js +74 -0
- package/dist/container/index.js.map +1 -0
- package/dist/container/types.d.ts +14 -0
- package/dist/container/types.js +3 -0
- package/dist/container/types.js.map +1 -0
- package/dist/error-tracker/browser.d.ts +8 -0
- package/dist/error-tracker/browser.js +40 -0
- package/dist/error-tracker/browser.js.map +1 -0
- package/dist/error-tracker/node.d.ts +8 -0
- package/dist/error-tracker/node.js +40 -0
- package/dist/error-tracker/node.js.map +1 -0
- package/dist/error-tracker/types.d.ts +18 -0
- package/dist/error-tracker/types.js +3 -0
- package/dist/error-tracker/types.js.map +1 -0
- package/dist/error-tracker/utils.d.ts +12 -0
- package/dist/error-tracker/utils.js +19 -0
- package/dist/error-tracker/utils.js.map +1 -0
- package/dist/http-client/middleware/cookie.d.ts +19 -0
- package/dist/http-client/middleware/cookie.js +62 -0
- package/dist/http-client/middleware/cookie.js.map +1 -0
- package/dist/http-client/middleware/tracing.d.ts +32 -0
- package/dist/http-client/middleware/tracing.js +67 -0
- package/dist/http-client/middleware/tracing.js.map +1 -0
- package/dist/http-client/types.d.ts +6 -0
- package/dist/http-client/types.js +3 -0
- package/dist/http-client/types.js.map +1 -0
- package/dist/http-client/utils.d.ts +36 -0
- package/dist/http-client/utils.js +49 -0
- package/dist/http-client/utils.js.map +1 -0
- package/dist/http-server/constants.d.ts +4 -0
- package/dist/http-server/constants.js +8 -0
- package/dist/http-server/constants.js.map +1 -0
- package/dist/http-server/handler/health-check.d.ts +6 -0
- package/dist/http-server/handler/health-check.js +15 -0
- package/dist/http-server/handler/health-check.js.map +1 -0
- package/dist/http-server/middleware/logging.d.ts +10 -0
- package/dist/http-server/middleware/logging.js +31 -0
- package/dist/http-server/middleware/logging.js.map +1 -0
- package/dist/http-server/middleware/metrics.d.ts +23 -0
- package/dist/http-server/middleware/metrics.js +60 -0
- package/dist/http-server/middleware/metrics.js.map +1 -0
- package/dist/http-server/middleware/tracing.d.ts +8 -0
- package/dist/http-server/middleware/tracing.js +32 -0
- package/dist/http-server/middleware/tracing.js.map +1 -0
- package/dist/http-server/types.d.ts +25 -0
- package/dist/http-server/types.js +3 -0
- package/dist/http-server/types.js.map +1 -0
- package/dist/http-server/utils.d.ts +26 -0
- package/dist/http-server/utils.js +88 -0
- package/dist/http-server/utils.js.map +1 -0
- package/dist/logger/handler/console.d.ts +8 -0
- package/dist/logger/handler/console.js +36 -0
- package/dist/logger/handler/console.js.map +1 -0
- package/dist/logger/handler/sentry.d.ts +8 -0
- package/dist/logger/handler/sentry.js +36 -0
- package/dist/logger/handler/sentry.js.map +1 -0
- package/dist/logger/index.d.ts +6 -0
- package/dist/logger/index.js +31 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/logger/types.d.ts +24 -0
- package/dist/logger/types.js +3 -0
- package/dist/logger/types.js.map +1 -0
- package/dist/metrics/constants.d.ts +4 -0
- package/dist/metrics/constants.js +8 -0
- package/dist/metrics/constants.js.map +1 -0
- package/dist/metrics/node.d.ts +18 -0
- package/dist/metrics/node.js +74 -0
- package/dist/metrics/node.js.map +1 -0
- package/dist/preset/index.d.ts +7 -0
- package/dist/preset/index.js +23 -0
- package/dist/preset/index.js.map +1 -0
- package/dist/preset/node/index.d.ts +15 -0
- package/dist/preset/node/index.js +90 -0
- package/dist/preset/node/index.js.map +1 -0
- package/dist/preset/node/response.d.ts +12 -0
- package/dist/preset/node/response.js +52 -0
- package/dist/preset/node/response.js.map +1 -0
- package/dist/preset/types.d.ts +7 -0
- package/dist/preset/types.js +3 -0
- package/dist/preset/types.js.map +1 -0
- package/dist/saga-runner/index.d.ts +8 -0
- package/dist/saga-runner/index.js +77 -0
- package/dist/saga-runner/index.js.map +1 -0
- package/dist/saga-runner/types.d.ts +10 -0
- package/dist/saga-runner/types.js +3 -0
- package/dist/saga-runner/types.js.map +1 -0
- package/dist/tokens.d.ts +40 -0
- package/dist/tokens.js +43 -0
- package/dist/tokens.js.map +1 -0
- package/dist/tracer/node.d.ts +10 -0
- package/dist/tracer/node.js +38 -0
- package/dist/tracer/node.js.map +1 -0
- package/dist/tracer/types.d.ts +2 -0
- package/dist/tracer/types.js +3 -0
- package/dist/tracer/types.js.map +1 -0
- package/{browser → dist/utils/browser}/analytics/data-layer.d.ts +0 -0
- package/{browser → dist/utils/browser}/analytics/data-layer.js +1 -2
- package/dist/utils/browser/analytics/data-layer.js.map +1 -0
- package/{browser → dist/utils/browser}/analytics/oko.d.ts +0 -0
- package/{browser → dist/utils/browser}/analytics/oko.js +6 -7
- package/dist/utils/browser/analytics/oko.js.map +1 -0
- package/dist/utils/browser/storage/index.d.ts +4 -0
- package/dist/utils/browser/storage/index.js +63 -0
- package/dist/utils/browser/storage/index.js.map +1 -0
- package/dist/utils/number.d.ts +6 -0
- package/dist/utils/number.js +13 -0
- package/dist/utils/number.js.map +1 -0
- package/dist/utils/react/error-handlers/index.d.ts +38 -0
- package/dist/utils/react/error-handlers/index.js +47 -0
- package/dist/utils/react/error-handlers/index.js.map +1 -0
- package/dist/utils/redux/remote-data.d.ts +23 -0
- package/dist/utils/redux/remote-data.js +28 -0
- package/dist/utils/redux/remote-data.js.map +1 -0
- package/dist/utils/redux-saga/take-chain.d.ts +24 -0
- package/dist/utils/redux-saga/take-chain.js +56 -0
- package/dist/utils/redux-saga/take-chain.js.map +1 -0
- package/dist/utils/webpack/module-federation/index.d.ts +21 -0
- package/dist/utils/webpack/module-federation/index.js +74 -0
- package/dist/utils/webpack/module-federation/index.js.map +1 -0
- package/dist/utils/webpack/module-federation/types.d.ts +26 -0
- package/dist/utils/webpack/module-federation/types.js +3 -0
- package/dist/utils/webpack/module-federation/types.js.map +1 -0
- package/dist/utils/webpack/module-federation/utils.d.ts +15 -0
- package/dist/utils/webpack/module-federation/utils.js +36 -0
- package/dist/utils/webpack/module-federation/utils.js.map +1 -0
- package/package.json +49 -63
- package/readme.md +23 -0
- package/src/cache/types.ts +7 -0
- package/src/config/browser.ts +10 -0
- package/src/config/index.ts +18 -0
- package/src/config/node.ts +18 -0
- package/src/config/types.ts +9 -0
- package/src/config/utils.ts +7 -0
- package/src/container/application.ts +91 -0
- package/src/container/index.ts +79 -0
- package/src/container/types.ts +17 -0
- package/src/error-tracker/browser.ts +14 -0
- package/src/error-tracker/node.ts +14 -0
- package/src/error-tracker/types.ts +22 -0
- package/src/error-tracker/utils.ts +18 -0
- package/src/http-client/middleware/cookie.ts +73 -0
- package/src/{helpers/api/middlewares/trace-request-middleware.ts → http-client/middleware/tracing.ts} +28 -35
- package/src/http-client/types.ts +8 -0
- package/src/http-client/utils.ts +76 -0
- package/src/http-server/constants.ts +4 -0
- package/src/http-server/handler/health-check.ts +13 -0
- package/src/http-server/middleware/logging.ts +34 -0
- package/src/http-server/middleware/metrics.ts +87 -0
- package/src/http-server/middleware/tracing.ts +35 -0
- package/src/http-server/types.ts +29 -0
- package/src/http-server/utils.ts +105 -0
- package/src/logger/handler/console.ts +35 -0
- package/src/logger/handler/sentry.ts +38 -0
- package/src/logger/index.ts +31 -0
- package/src/logger/types.ts +28 -0
- package/src/metrics/constants.ts +4 -0
- package/src/metrics/node.ts +54 -0
- package/src/preset/index.ts +24 -0
- package/src/preset/node/index.ts +101 -0
- package/src/preset/node/response.ts +57 -0
- package/src/preset/types.ts +9 -0
- package/src/saga-runner/index.ts +59 -0
- package/src/saga-runner/types.ts +13 -0
- package/src/tokens.ts +54 -0
- package/src/tracer/node.ts +40 -0
- package/src/tracer/types.ts +3 -0
- package/src/utils/browser/analytics/__test__/data-layer.test.ts +50 -0
- package/src/utils/browser/analytics/__test__/oko.test.tsx +143 -0
- package/src/{browser → utils/browser}/analytics/data-layer.ts +0 -0
- package/src/{browser → utils/browser}/analytics/oko.ts +6 -4
- package/src/utils/browser/storage/index.ts +75 -0
- package/src/utils/number.ts +8 -0
- package/src/utils/react/error-handlers/__test__/__snapshots__/index.test.tsx.snap +27 -0
- package/src/utils/react/error-handlers/__test__/index.test.tsx +64 -0
- package/src/utils/react/error-handlers/index.tsx +62 -0
- package/src/utils/redux/__test__/remote-data.test.ts +50 -0
- package/src/utils/redux/remote-data.ts +34 -0
- package/src/utils/redux-saga/__test__/take-chain.test.ts +141 -0
- package/src/utils/redux-saga/take-chain.ts +65 -0
- package/src/utils/webpack/module-federation/__test__/index.test.ts +246 -0
- package/src/utils/webpack/module-federation/index.ts +92 -0
- package/src/utils/webpack/module-federation/types.ts +44 -0
- package/src/utils/webpack/module-federation/utils.ts +43 -0
- package/browser/analytics/data-layer.js.map +0 -1
- package/browser/analytics/oko.js.map +0 -1
- package/cache/helpers.d.ts +0 -4
- package/cache/helpers.js +0 -39
- package/cache/helpers.js.map +0 -1
- package/cache/local-storage.d.ts +0 -34
- package/cache/local-storage.js +0 -90
- package/cache/local-storage.js.map +0 -1
- package/cache/redis.d.ts +0 -10
- package/cache/redis.js +0 -54
- package/cache/redis.js.map +0 -1
- package/cache/wrap-in-trace.d.ts +0 -8
- package/cache/wrap-in-trace.js +0 -68
- package/cache/wrap-in-trace.js.map +0 -1
- package/config/create.d.ts +0 -8
- package/config/create.js +0 -32
- package/config/create.js.map +0 -1
- package/config/helpers.d.ts +0 -11
- package/config/helpers.js +0 -71
- package/config/helpers.js.map +0 -1
- package/config/validate.d.ts +0 -18
- package/config/validate.js +0 -107
- package/config/validate.js.map +0 -1
- package/container/create-inject.d.ts +0 -7
- package/container/create-inject.js +0 -36
- package/container/create-inject.js.map +0 -1
- package/container/get-dependencies.d.ts +0 -13
- package/container/get-dependencies.js +0 -54
- package/container/get-dependencies.js.map +0 -1
- package/container/index.d.ts +0 -15
- package/container/index.js +0 -175
- package/container/index.js.map +0 -1
- package/container/is-container.d.ts +0 -7
- package/container/is-container.js +0 -17
- package/container/is-container.js.map +0 -1
- package/container/service-not-found-error.d.ts +0 -10
- package/container/service-not-found-error.js +0 -18
- package/container/service-not-found-error.js.map +0 -1
- package/create-proxy/create-proxy-middleware/index.d.ts +0 -16
- package/create-proxy/create-proxy-middleware/index.js +0 -47
- package/create-proxy/create-proxy-middleware/index.js.map +0 -1
- package/create-proxy/index.d.ts +0 -12
- package/create-proxy/index.js +0 -25
- package/create-proxy/index.js.map +0 -1
- package/create-response-sender/index.d.ts +0 -8
- package/create-response-sender/index.js +0 -42
- package/create-response-sender/index.js.map +0 -1
- package/get-dynamic-data/index.d.ts +0 -8
- package/get-dynamic-data/index.js +0 -23
- package/get-dynamic-data/index.js.map +0 -1
- package/graceful-shutdown/index.d.ts +0 -26
- package/graceful-shutdown/index.js +0 -87
- package/graceful-shutdown/index.js.map +0 -1
- package/helpers/add-error-handling/index.d.ts +0 -1
- package/helpers/add-error-handling/index.js +0 -42
- package/helpers/add-error-handling/index.js.map +0 -1
- package/helpers/api/create-enhancer.d.ts +0 -12
- package/helpers/api/create-enhancer.js +0 -52
- package/helpers/api/create-enhancer.js.map +0 -1
- package/helpers/api/create-instance.d.ts +0 -11
- package/helpers/api/create-instance.js +0 -39
- package/helpers/api/create-instance.js.map +0 -1
- package/helpers/api/middlewares/collect-cookie-middleware.d.ts +0 -10
- package/helpers/api/middlewares/collect-cookie-middleware.js +0 -39
- package/helpers/api/middlewares/collect-cookie-middleware.js.map +0 -1
- package/helpers/api/middlewares/count-api-response-time.d.ts +0 -12
- package/helpers/api/middlewares/count-api-response-time.js +0 -39
- package/helpers/api/middlewares/count-api-response-time.js.map +0 -1
- package/helpers/api/middlewares/error-handlers-middlewares.d.ts +0 -5
- package/helpers/api/middlewares/error-handlers-middlewares.js +0 -114
- package/helpers/api/middlewares/error-handlers-middlewares.js.map +0 -1
- package/helpers/api/middlewares/helpers.d.ts +0 -11
- package/helpers/api/middlewares/helpers.js +0 -27
- package/helpers/api/middlewares/helpers.js.map +0 -1
- package/helpers/api/middlewares/pass-headers-middleware.d.ts +0 -3
- package/helpers/api/middlewares/pass-headers-middleware.js +0 -27
- package/helpers/api/middlewares/pass-headers-middleware.js.map +0 -1
- package/helpers/api/middlewares/prepare-request-headers.d.ts +0 -5
- package/helpers/api/middlewares/prepare-request-headers.js +0 -20
- package/helpers/api/middlewares/prepare-request-headers.js.map +0 -1
- package/helpers/api/middlewares/set-http-agents-middleware.d.ts +0 -15
- package/helpers/api/middlewares/set-http-agents-middleware.js +0 -34
- package/helpers/api/middlewares/set-http-agents-middleware.js.map +0 -1
- package/helpers/api/middlewares/stages-trace-middleware.d.ts +0 -17
- package/helpers/api/middlewares/stages-trace-middleware.js +0 -57
- package/helpers/api/middlewares/stages-trace-middleware.js.map +0 -1
- package/helpers/api/middlewares/trace-request-middleware.d.ts +0 -24
- package/helpers/api/middlewares/trace-request-middleware.js +0 -69
- package/helpers/api/middlewares/trace-request-middleware.js.map +0 -1
- package/helpers/api/server-adapter/__fixtures__/fake-keys.d.ts +0 -10
- package/helpers/api/server-adapter/__fixtures__/fake-keys.js +0 -61
- package/helpers/api/server-adapter/__fixtures__/fake-keys.js.map +0 -1
- package/helpers/api/server-adapter/constants.d.ts +0 -5
- package/helpers/api/server-adapter/constants.js +0 -16
- package/helpers/api/server-adapter/constants.js.map +0 -1
- package/helpers/api/server-adapter/helpers.d.ts +0 -26
- package/helpers/api/server-adapter/helpers.js +0 -208
- package/helpers/api/server-adapter/helpers.js.map +0 -1
- package/helpers/api/server-adapter/index.d.ts +0 -10
- package/helpers/api/server-adapter/index.js +0 -118
- package/helpers/api/server-adapter/index.js.map +0 -1
- package/helpers/development/use-dot-env.d.ts +0 -6
- package/helpers/development/use-dot-env.js +0 -11
- package/helpers/development/use-dot-env.js.map +0 -1
- package/helpers/get-params/index.d.ts +0 -4
- package/helpers/get-params/index.js +0 -51
- package/helpers/get-params/index.js.map +0 -1
- package/helpers/http/request-getters.d.ts +0 -5
- package/helpers/http/request-getters.js +0 -49
- package/helpers/http/request-getters.js.map +0 -1
- package/helpers/http/statuses-validator.d.ts +0 -3
- package/helpers/http/statuses-validator.js +0 -25
- package/helpers/http/statuses-validator.js.map +0 -1
- package/helpers/logger/create-pino-instance/index.d.ts +0 -6
- package/helpers/logger/create-pino-instance/index.js +0 -39
- package/helpers/logger/create-pino-instance/index.js.map +0 -1
- package/helpers/logger/format-time/index.d.ts +0 -6
- package/helpers/logger/format-time/index.js +0 -9
- package/helpers/logger/format-time/index.js.map +0 -1
- package/helpers/metrics/index.d.ts +0 -23
- package/helpers/metrics/index.js +0 -42
- package/helpers/metrics/index.js.map +0 -1
- package/helpers/prometheus/index.d.ts +0 -4
- package/helpers/prometheus/index.js +0 -13
- package/helpers/prometheus/index.js.map +0 -1
- package/helpers/prometheus/measure-middleware.d.ts +0 -5
- package/helpers/prometheus/measure-middleware.js +0 -69
- package/helpers/prometheus/measure-middleware.js.map +0 -1
- package/helpers/prometheus/metric-adapter.d.ts +0 -36
- package/helpers/prometheus/metric-adapter.js +0 -98
- package/helpers/prometheus/metric-adapter.js.map +0 -1
- package/helpers/react/error-handlers/index.d.ts +0 -40
- package/helpers/react/error-handlers/index.js +0 -52
- package/helpers/react/error-handlers/index.js.map +0 -1
- package/helpers/redux/constants.d.ts +0 -5
- package/helpers/redux/constants.js +0 -14
- package/helpers/redux/constants.js.map +0 -1
- package/helpers/redux/create-compose-middleware.d.ts +0 -15
- package/helpers/redux/create-compose-middleware.js +0 -23
- package/helpers/redux/create-compose-middleware.js.map +0 -1
- package/helpers/redux/get-dev-compose-creator.d.ts +0 -6
- package/helpers/redux/get-dev-compose-creator.js +0 -13
- package/helpers/redux/get-dev-compose-creator.js.map +0 -1
- package/helpers/redux/prepare-on-ready.d.ts +0 -9
- package/helpers/redux/prepare-on-ready.js +0 -16
- package/helpers/redux/prepare-on-ready.js.map +0 -1
- package/helpers/redux/remote-data.d.ts +0 -40
- package/helpers/redux/remote-data.js +0 -91
- package/helpers/redux/remote-data.js.map +0 -1
- package/helpers/redux/selector/statuses.d.ts +0 -23
- package/helpers/redux/selector/statuses.js +0 -34
- package/helpers/redux/selector/statuses.js.map +0 -1
- package/helpers/redux/wait-on-store-readiness.d.ts +0 -11
- package/helpers/redux/wait-on-store-readiness.js +0 -29
- package/helpers/redux/wait-on-store-readiness.js.map +0 -1
- package/helpers/render/get-react-markup-data.d.ts +0 -14
- package/helpers/render/get-react-markup-data.js +0 -20
- package/helpers/render/get-react-markup-data.js.map +0 -1
- package/helpers/render/index.d.ts +0 -21
- package/helpers/render/index.js +0 -72
- package/helpers/render/index.js.map +0 -1
- package/helpers/render/render-app.d.ts +0 -12
- package/helpers/render/render-app.js +0 -12
- package/helpers/render/render-app.js.map +0 -1
- package/helpers/saga/__fixtures__/do-safe-request.d.ts +0 -43
- package/helpers/saga/__fixtures__/do-safe-request.js +0 -50
- package/helpers/saga/__fixtures__/do-safe-request.js.map +0 -1
- package/helpers/saga/cache-result.d.ts +0 -46
- package/helpers/saga/cache-result.js +0 -71
- package/helpers/saga/cache-result.js.map +0 -1
- package/helpers/saga/create-store.d.ts +0 -20
- package/helpers/saga/create-store.js +0 -106
- package/helpers/saga/create-store.js.map +0 -1
- package/helpers/saga/do-safe-request.d.ts +0 -38
- package/helpers/saga/do-safe-request.js +0 -45
- package/helpers/saga/do-safe-request.js.map +0 -1
- package/helpers/saga/safe-request.d.ts +0 -7
- package/helpers/saga/safe-request.js +0 -15
- package/helpers/saga/safe-request.js.map +0 -1
- package/helpers/saga/take-chain.d.ts +0 -20
- package/helpers/saga/take-chain.js +0 -56
- package/helpers/saga/take-chain.js.map +0 -1
- package/helpers/tracer/create-child-tracing-middleware.d.ts +0 -7
- package/helpers/tracer/create-child-tracing-middleware.js +0 -40
- package/helpers/tracer/create-child-tracing-middleware.js.map +0 -1
- package/helpers/tracer/index.d.ts +0 -24
- package/helpers/tracer/index.js +0 -144
- package/helpers/tracer/index.js.map +0 -1
- package/helpers/utils/check-feature-by-segment.d.ts +0 -2
- package/helpers/utils/check-feature-by-segment.js +0 -31
- package/helpers/utils/check-feature-by-segment.js.map +0 -1
- package/helpers/utils/format-object-keys.d.ts +0 -6
- package/helpers/utils/format-object-keys.js +0 -27
- package/helpers/utils/format-object-keys.js.map +0 -1
- package/helpers/utils/get-ms-from-hrt.d.ts +0 -2
- package/helpers/utils/get-ms-from-hrt.js +0 -22
- package/helpers/utils/get-ms-from-hrt.js.map +0 -1
- package/helpers/utils/is-match-pattern-list.d.ts +0 -8
- package/helpers/utils/is-match-pattern-list.js +0 -16
- package/helpers/utils/is-match-pattern-list.js.map +0 -1
- package/helpers/utils/is-not-empty-array.d.ts +0 -2
- package/helpers/utils/is-not-empty-array.js +0 -12
- package/helpers/utils/is-not-empty-array.js.map +0 -1
- package/helpers/utils/is-not-empty-string.d.ts +0 -2
- package/helpers/utils/is-not-empty-string.js +0 -15
- package/helpers/utils/is-not-empty-string.js.map +0 -1
- package/helpers/utils/is-numeric.d.ts +0 -7
- package/helpers/utils/is-numeric.js +0 -16
- package/helpers/utils/is-numeric.js.map +0 -1
- package/helpers/utils/wrap-in-measure-event.d.ts +0 -9
- package/helpers/utils/wrap-in-measure-event.js +0 -50
- package/helpers/utils/wrap-in-measure-event.js.map +0 -1
- package/logger/create-logger-middleware/index.d.ts +0 -14
- package/logger/create-logger-middleware/index.js +0 -41
- package/logger/create-logger-middleware/index.js.map +0 -1
- package/logger/create-sentry-instance/index.d.ts +0 -29
- package/logger/create-sentry-instance/index.js +0 -63
- package/logger/create-sentry-instance/index.js.map +0 -1
- package/logger/create-sentry-middleware/index.d.ts +0 -14
- package/logger/create-sentry-middleware/index.js +0 -19
- package/logger/create-sentry-middleware/index.js.map +0 -1
- package/logger/handler-creators/index.d.ts +0 -5
- package/logger/handler-creators/index.js +0 -41
- package/logger/handler-creators/index.js.map +0 -1
- package/logger/initialize-sentry-creator/index.d.ts +0 -17
- package/logger/initialize-sentry-creator/index.js +0 -35
- package/logger/initialize-sentry-creator/index.js.map +0 -1
- package/logger/sentry-logger/index.d.ts +0 -9
- package/logger/sentry-logger/index.js +0 -36
- package/logger/sentry-logger/index.js.map +0 -1
- package/module-federation/__example__/webpack-config.example.d.ts +0 -366
- package/module-federation/__example__/webpack-config.example.js +0 -58
- package/module-federation/__example__/webpack-config.example.js.map +0 -1
- package/module-federation/enhanced-module-federation-plugin.d.ts +0 -69
- package/module-federation/enhanced-module-federation-plugin.js +0 -97
- package/module-federation/enhanced-module-federation-plugin.js.map +0 -1
- package/module-federation/utils/index.d.ts +0 -16
- package/module-federation/utils/index.js +0 -33
- package/module-federation/utils/index.js.map +0 -1
- package/observe-middleware/index.d.ts +0 -9
- package/observe-middleware/index.js +0 -67
- package/observe-middleware/index.js.map +0 -1
- package/set-header-middleware/create.d.ts +0 -10
- package/set-header-middleware/create.js +0 -16
- package/set-header-middleware/create.js.map +0 -1
- package/src/cache/helpers.js +0 -32
- package/src/cache/local-storage.ts +0 -92
- package/src/cache/redis.js +0 -79
- package/src/cache/wrap-in-trace.js +0 -57
- package/src/config/create.js +0 -33
- package/src/config/helpers.js +0 -71
- package/src/config/validate.js +0 -114
- package/src/container/create-inject.js +0 -32
- package/src/container/get-dependencies.js +0 -46
- package/src/container/index.js +0 -188
- package/src/container/is-container.js +0 -14
- package/src/container/service-not-found-error.js +0 -14
- package/src/create-proxy/create-proxy-middleware/index.js +0 -47
- package/src/create-proxy/index.js +0 -27
- package/src/create-response-sender/index.js +0 -48
- package/src/get-dynamic-data/index.js +0 -26
- package/src/graceful-shutdown/index.js +0 -97
- package/src/helpers/add-error-handling/index.js +0 -24
- package/src/helpers/api/create-enhancer.js +0 -52
- package/src/helpers/api/create-instance.js +0 -42
- package/src/helpers/api/middlewares/collect-cookie-middleware.js +0 -27
- package/src/helpers/api/middlewares/count-api-response-time.js +0 -31
- package/src/helpers/api/middlewares/error-handlers-middlewares.js +0 -124
- package/src/helpers/api/middlewares/helpers.js +0 -26
- package/src/helpers/api/middlewares/pass-headers-middleware.js +0 -19
- package/src/helpers/api/middlewares/prepare-request-headers.js +0 -18
- package/src/helpers/api/middlewares/set-http-agents-middleware.js +0 -22
- package/src/helpers/api/middlewares/stages-trace-middleware.js +0 -46
- package/src/helpers/api/server-adapter/__fixtures__/fake-keys.js +0 -58
- package/src/helpers/api/server-adapter/constants.js +0 -12
- package/src/helpers/api/server-adapter/helpers.js +0 -244
- package/src/helpers/api/server-adapter/index.js +0 -155
- package/src/helpers/development/use-dot-env.js +0 -9
- package/src/helpers/get-params/index.js +0 -59
- package/src/helpers/http/request-getters.js +0 -42
- package/src/helpers/http/statuses-validator.js +0 -20
- package/src/helpers/logger/create-pino-instance/index.js +0 -41
- package/src/helpers/logger/format-time/index.js +0 -6
- package/src/helpers/metrics/index.js +0 -40
- package/src/helpers/prometheus/index.js +0 -9
- package/src/helpers/prometheus/measure-middleware.js +0 -73
- package/src/helpers/prometheus/metric-adapter.js +0 -99
- package/src/helpers/react/error-handlers/index.tsx +0 -68
- package/src/helpers/redux/constants.js +0 -10
- package/src/helpers/redux/create-compose-middleware.js +0 -24
- package/src/helpers/redux/get-dev-compose-creator.js +0 -9
- package/src/helpers/redux/prepare-on-ready.js +0 -16
- package/src/helpers/redux/remote-data.js +0 -124
- package/src/helpers/redux/selector/statuses.js +0 -30
- package/src/helpers/redux/wait-on-store-readiness.js +0 -40
- package/src/helpers/render/get-react-markup-data.js +0 -18
- package/src/helpers/render/index.js +0 -69
- package/src/helpers/render/render-app.js +0 -15
- package/src/helpers/saga/__fixtures__/do-safe-request.js +0 -49
- package/src/helpers/saga/cache-result.js +0 -77
- package/src/helpers/saga/create-store.js +0 -102
- package/src/helpers/saga/do-safe-request.js +0 -47
- package/src/helpers/saga/safe-request.js +0 -11
- package/src/helpers/saga/take-chain.js +0 -53
- package/src/helpers/tracer/create-child-tracing-middleware.js +0 -42
- package/src/helpers/tracer/index.js +0 -171
- package/src/helpers/utils/check-feature-by-segment.js +0 -32
- package/src/helpers/utils/format-object-keys.js +0 -23
- package/src/helpers/utils/get-ms-from-hrt.js +0 -16
- package/src/helpers/utils/is-match-pattern-list.js +0 -13
- package/src/helpers/utils/is-not-empty-array.js +0 -8
- package/src/helpers/utils/is-not-empty-string.js +0 -11
- package/src/helpers/utils/is-numeric.ts +0 -12
- package/src/helpers/utils/wrap-in-measure-event.js +0 -35
- package/src/logger/create-logger-middleware/index.js +0 -46
- package/src/logger/create-sentry-instance/index.js +0 -74
- package/src/logger/create-sentry-middleware/index.js +0 -16
- package/src/logger/handler-creators/index.js +0 -38
- package/src/logger/initialize-sentry-creator/index.js +0 -43
- package/src/logger/sentry-logger/index.js +0 -33
- package/src/module-federation/__example__/webpack-config.example.js +0 -64
- package/src/module-federation/enhanced-module-federation-plugin.js +0 -119
- package/src/module-federation/utils/index.js +0 -39
- package/src/observe-middleware/index.js +0 -70
- package/src/set-header-middleware/create.js +0 -17
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import type { Request, Response } from 'express';
|
|
2
|
+
import type { ConventionalJson, PageAssets } from './types';
|
|
3
|
+
import { isIP } from 'net';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Определяет IP входящего запроса.
|
|
7
|
+
* @param req Входящий запрос.
|
|
8
|
+
* @return IP.
|
|
9
|
+
*/
|
|
10
|
+
export function getXClientIp(req: Request): string {
|
|
11
|
+
const headerValue =
|
|
12
|
+
req.get('x-client-ip') || req.get('x-forwarded-for') || req.socket.remoteAddress || '';
|
|
13
|
+
|
|
14
|
+
return isIP(headerValue) ? headerValue : '';
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Определяет служебные заголовки по соглашению.
|
|
19
|
+
* @param req Входящий запрос.
|
|
20
|
+
* @return Служебные заголовки.
|
|
21
|
+
*/
|
|
22
|
+
export function getServiceHeaders(req: Request): Record<string, string | undefined> {
|
|
23
|
+
const result: Record<string, string | undefined> = {};
|
|
24
|
+
|
|
25
|
+
for (const [key] of Object.entries(req.headers)) {
|
|
26
|
+
if (key.toLowerCase().indexOf('simaland-') === 0) {
|
|
27
|
+
result[key] = req.header(key);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return result;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/* eslint-disable require-jsdoc, jsdoc/require-jsdoc */
|
|
35
|
+
export class PageResponse {
|
|
36
|
+
private type: 'html' | 'json';
|
|
37
|
+
private html: string;
|
|
38
|
+
private assets: PageAssets;
|
|
39
|
+
|
|
40
|
+
static create() {
|
|
41
|
+
return new PageResponse();
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
static defineFormat(req: Request): PageResponse['type'] {
|
|
45
|
+
let result: PageResponse['type'] = 'html';
|
|
46
|
+
|
|
47
|
+
if ((req.header('accept') || '').toLowerCase().includes('application/json')) {
|
|
48
|
+
result = 'json';
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return result;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
constructor() {
|
|
55
|
+
this.type = 'html';
|
|
56
|
+
this.html = '';
|
|
57
|
+
this.assets = { js: '', css: '' };
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
markup(html: string) {
|
|
61
|
+
this.html = html;
|
|
62
|
+
return this;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
script(url: string) {
|
|
66
|
+
this.assets.js = url;
|
|
67
|
+
return this;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
style(url: string) {
|
|
71
|
+
this.assets.css = url;
|
|
72
|
+
return this;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
format(type: PageResponse['type']) {
|
|
76
|
+
this.type = type;
|
|
77
|
+
return this;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
send(res: Response) {
|
|
81
|
+
switch (this.type) {
|
|
82
|
+
case 'json': {
|
|
83
|
+
const result: ConventionalJson = {
|
|
84
|
+
markup: this.html,
|
|
85
|
+
bundle_js: this.assets.js,
|
|
86
|
+
bundle_css: this.assets.css,
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
res.json(result);
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
case 'html': {
|
|
93
|
+
res.setHeader('simaland-bundle-js', this.assets.js);
|
|
94
|
+
res.setHeader('simaland-bundle-css', this.assets.css);
|
|
95
|
+
|
|
96
|
+
// @todo dev-шаблон?
|
|
97
|
+
res.send(this.html);
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
default:
|
|
101
|
+
throw Error(`Unknown response format ${String(this.type)}`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/* eslint-enable require-jsdoc, jsdoc/require-jsdoc */
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { BaseConfig } from '../../config/types';
|
|
2
|
+
import pino from 'pino';
|
|
3
|
+
import pinoPretty from 'pino-pretty';
|
|
4
|
+
import { LoggerEventHandler } from '../types';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Возвращает новый handler для logger'а для вывода событий в терминал.
|
|
8
|
+
* @param config Конфиг.
|
|
9
|
+
* @return Handler.
|
|
10
|
+
*/
|
|
11
|
+
export function createConsoleHandler(config: BaseConfig): LoggerEventHandler {
|
|
12
|
+
const isProd = config.env === 'production';
|
|
13
|
+
|
|
14
|
+
const logger = pino(
|
|
15
|
+
isProd
|
|
16
|
+
? {
|
|
17
|
+
formatters: {
|
|
18
|
+
// ВАЖНО: для Fluent необходимо наличие поля level: string
|
|
19
|
+
level: label => ({ level: label }),
|
|
20
|
+
},
|
|
21
|
+
}
|
|
22
|
+
: pinoPretty({ colorize: true }),
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
return function (event) {
|
|
26
|
+
switch (event.type) {
|
|
27
|
+
case 'info':
|
|
28
|
+
logger.info(event.data);
|
|
29
|
+
break;
|
|
30
|
+
case 'error':
|
|
31
|
+
logger.error(event.data);
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { SentryLib } from '../../error-tracker/types';
|
|
2
|
+
import type { LoggerEventHandler } from '../types';
|
|
3
|
+
import { SentryError } from '../../error-tracker/utils';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Возвращает новый handler для logger'а для отправки событий в Sentry.
|
|
7
|
+
* @param sentry Набор данных для работы с Sentry.
|
|
8
|
+
* @return Handler.
|
|
9
|
+
*/
|
|
10
|
+
export function createSentryHandler(sentry: SentryLib): LoggerEventHandler {
|
|
11
|
+
return event => {
|
|
12
|
+
if (event.type === 'error') {
|
|
13
|
+
const error = event.data;
|
|
14
|
+
|
|
15
|
+
if (error instanceof SentryError) {
|
|
16
|
+
const { level, context, extra } = error.data;
|
|
17
|
+
|
|
18
|
+
sentry.withScope(scope => {
|
|
19
|
+
if (level) {
|
|
20
|
+
scope.setLevel(level);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
if (context) {
|
|
24
|
+
scope.setContext(context.key, context.data);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
if (extra) {
|
|
28
|
+
scope.setExtra(extra.key, extra.data);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
sentry.client.captureException(error);
|
|
32
|
+
});
|
|
33
|
+
} else {
|
|
34
|
+
sentry.client.captureException(error);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Logger, LoggerEvent, LoggerEventType, LoggerEventHandler } from './types';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Возвращает новый logger - объект для журналирования событий подобно console.
|
|
5
|
+
* @return Logger.
|
|
6
|
+
*/
|
|
7
|
+
export function createLogger(): Logger {
|
|
8
|
+
const handlers: LoggerEventHandler[] = [];
|
|
9
|
+
|
|
10
|
+
// eslint-disable-next-line require-jsdoc, jsdoc/require-jsdoc
|
|
11
|
+
function createMethod(type: LoggerEventType) {
|
|
12
|
+
return function (data: any) {
|
|
13
|
+
const event: LoggerEvent = { type, data };
|
|
14
|
+
for (const handler of handlers) {
|
|
15
|
+
handler(event);
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
return {
|
|
21
|
+
log: createMethod('log'),
|
|
22
|
+
info: createMethod('info'),
|
|
23
|
+
warn: createMethod('warn'),
|
|
24
|
+
error: createMethod('error'),
|
|
25
|
+
debug: createMethod('debug'),
|
|
26
|
+
|
|
27
|
+
subscribe: handler => {
|
|
28
|
+
handlers.push(handler);
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export type LoggerEventType = 'error' | 'log' | 'info' | 'warn' | 'debug';
|
|
2
|
+
|
|
3
|
+
export interface LoggerEvent {
|
|
4
|
+
type: LoggerEventType;
|
|
5
|
+
data: unknown;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export interface LoggerEventHandler {
|
|
9
|
+
(event: LoggerEvent): void;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export interface Logger {
|
|
13
|
+
error(data: any): void;
|
|
14
|
+
log(data: any): void;
|
|
15
|
+
info(data: any): void;
|
|
16
|
+
warn(data: any): void;
|
|
17
|
+
debug(data: any): void;
|
|
18
|
+
subscribe(handler: LoggerEventHandler): void;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface ConventionalFluentInfo {
|
|
22
|
+
version: string;
|
|
23
|
+
latency: number;
|
|
24
|
+
method: string;
|
|
25
|
+
remote_ip: string;
|
|
26
|
+
route: string;
|
|
27
|
+
status: number;
|
|
28
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import express, { Application } from 'express';
|
|
2
|
+
import * as PromClient from 'prom-client';
|
|
3
|
+
import { ConventionalLabels } from './constants';
|
|
4
|
+
|
|
5
|
+
export interface DefaultNodeMetrics {
|
|
6
|
+
requestCount: PromClient.Counter<typeof ConventionalLabels.HTTP_RESPONSE[number]>;
|
|
7
|
+
responseDuration: PromClient.Histogram<typeof ConventionalLabels.HTTP_RESPONSE[number]>;
|
|
8
|
+
renderDuration: PromClient.Histogram<typeof ConventionalLabels.SSR[number]>;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Возвращает новое express-приложение, настроенное для выдачи информации о метриках.
|
|
13
|
+
* @return Приложение.
|
|
14
|
+
*/
|
|
15
|
+
export function createMetricsHttpApp(): Application {
|
|
16
|
+
const app = express();
|
|
17
|
+
|
|
18
|
+
PromClient.collectDefaultMetrics();
|
|
19
|
+
|
|
20
|
+
app.get('/', async function (req, res) {
|
|
21
|
+
const metrics = await PromClient.register.metrics();
|
|
22
|
+
|
|
23
|
+
res.setHeader('Content-Type', PromClient.register.contentType);
|
|
24
|
+
res.send(metrics);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
return app;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Возвращает набор готовых метрик по умолчанию для приложений.
|
|
32
|
+
* @return Набор метрик.
|
|
33
|
+
*/
|
|
34
|
+
export function createDefaultMetrics(): DefaultNodeMetrics {
|
|
35
|
+
return {
|
|
36
|
+
requestCount: new PromClient.Counter({
|
|
37
|
+
name: 'http_request_count',
|
|
38
|
+
help: 'Incoming HTTP request count',
|
|
39
|
+
labelNames: ConventionalLabels.HTTP_RESPONSE,
|
|
40
|
+
}),
|
|
41
|
+
responseDuration: new PromClient.Histogram({
|
|
42
|
+
name: 'http_response_duration_ms',
|
|
43
|
+
help: 'Duration of incoming HTTP requests in ms',
|
|
44
|
+
labelNames: ConventionalLabels.HTTP_RESPONSE,
|
|
45
|
+
buckets: [30, 100, 200, 500, 1000, 2500, 5000, 10000],
|
|
46
|
+
}),
|
|
47
|
+
renderDuration: new PromClient.Histogram({
|
|
48
|
+
name: 'render_duration_ms',
|
|
49
|
+
help: 'Duration of SSR ms',
|
|
50
|
+
labelNames: ConventionalLabels.SSR,
|
|
51
|
+
buckets: [0.1, 15, 50, 100, 250, 500, 800, 1500],
|
|
52
|
+
}),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Application } from '../container/application';
|
|
2
|
+
import type { Provider, Token } from '../container/types';
|
|
3
|
+
import type { Preset, PresetEntry } from './types';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Возвращает новый "preset" приложения - набор предустановленных компонентов которые можно переопределять.
|
|
7
|
+
* @param defaults Предустановленные зависимости.
|
|
8
|
+
* @return Preset.
|
|
9
|
+
*/
|
|
10
|
+
export function createPreset(defaults: PresetEntry[]): Preset {
|
|
11
|
+
const registry = new Map<Token<any>, Provider<any>>(defaults);
|
|
12
|
+
|
|
13
|
+
return {
|
|
14
|
+
override: <T>(token: Token<T>, provider: Provider<T>) => {
|
|
15
|
+
registry.set(token, provider);
|
|
16
|
+
},
|
|
17
|
+
|
|
18
|
+
apply: (container: Application) => {
|
|
19
|
+
for (const [token, provider] of registry) {
|
|
20
|
+
container.bind(token).toProvider(provider);
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/* eslint-disable require-jsdoc */
|
|
2
|
+
import type { Preset } from '../types';
|
|
3
|
+
import type { Provider } from '../../container/types';
|
|
4
|
+
import type { BaseConfig } from '../../config/types';
|
|
5
|
+
import type { Logger } from '../../logger/types';
|
|
6
|
+
import type { Tracer } from '@opentelemetry/api';
|
|
7
|
+
import type { DefaultMiddleware } from '../../http-server/types';
|
|
8
|
+
import { KnownToken as Token } from '../../tokens';
|
|
9
|
+
import { createPreset } from '..';
|
|
10
|
+
import { createConfigSource } from '../../config/node';
|
|
11
|
+
import { createBaseConfig } from '../../config';
|
|
12
|
+
import { createLogger } from '../../logger';
|
|
13
|
+
import { createTracer } from '../../tracer/node';
|
|
14
|
+
import { createConsoleHandler } from '../../logger/handler/console';
|
|
15
|
+
import { createSentryHandler } from '../../logger/handler/sentry';
|
|
16
|
+
import { createSentryLib } from '../../error-tracker/node';
|
|
17
|
+
import { loggingMiddleware } from '../../http-server/middleware/logging';
|
|
18
|
+
import { tracingMiddleware } from '../../http-server/middleware/tracing';
|
|
19
|
+
import {
|
|
20
|
+
renderMetricsMiddleware,
|
|
21
|
+
responseMetricsMiddleware,
|
|
22
|
+
} from '../../http-server/middleware/metrics';
|
|
23
|
+
import { createDefaultMetrics, createMetricsHttpApp } from '../../metrics/node';
|
|
24
|
+
import { JaegerExporter } from '@opentelemetry/exporter-jaeger';
|
|
25
|
+
import { create } from 'middleware-axios';
|
|
26
|
+
import Express from 'express';
|
|
27
|
+
import { Handlers } from '@sentry/node';
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Возвращает preset с зависимостями по умолчанию для frontend-микросервисов на Node.js.
|
|
31
|
+
* @return Preset.
|
|
32
|
+
*/
|
|
33
|
+
export function PresetNode(): Preset {
|
|
34
|
+
return createPreset([
|
|
35
|
+
[Token.Config.source, createConfigSource],
|
|
36
|
+
[Token.Config.base, provideBaseConfig],
|
|
37
|
+
[Token.logger, provideLogger],
|
|
38
|
+
[Token.tracer, provideTracer],
|
|
39
|
+
[Token.Http.Client.factory, () => create],
|
|
40
|
+
[Token.Http.Server.factory, () => Express],
|
|
41
|
+
[Token.Http.Server.Defaults.middleware, provideDefaultMiddleware],
|
|
42
|
+
[Token.Metrics.httpApp, createMetricsHttpApp],
|
|
43
|
+
]);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export const provideBaseConfig: Provider<BaseConfig> = resolve => {
|
|
47
|
+
const source = resolve(Token.Config.source);
|
|
48
|
+
|
|
49
|
+
return createBaseConfig(source);
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
export const provideLogger: Provider<Logger> = resolve => {
|
|
53
|
+
const source = resolve(Token.Config.source);
|
|
54
|
+
const config = resolve(Token.Config.base);
|
|
55
|
+
|
|
56
|
+
const sentry = createSentryLib({
|
|
57
|
+
dsn: source.get('SENTRY_DSN'),
|
|
58
|
+
release: source.get('SENTRY_RELEASE'),
|
|
59
|
+
environment: source.get('SENTRY_ENVIRONMENT'),
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
const logger = createLogger();
|
|
63
|
+
logger.subscribe(createConsoleHandler(config));
|
|
64
|
+
logger.subscribe(createSentryHandler(sentry));
|
|
65
|
+
|
|
66
|
+
return logger;
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
export const provideTracer: Provider<Tracer> = resolve => {
|
|
70
|
+
const source = resolve(Token.Config.source);
|
|
71
|
+
|
|
72
|
+
const exporter = new JaegerExporter({
|
|
73
|
+
endpoint: source.require('JAEGER_ENDPOINT'),
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
return createTracer(resolve(Token.Config.base), exporter);
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
export const provideDefaultMiddleware: Provider<DefaultMiddleware> = resolve => {
|
|
80
|
+
const config = resolve(Token.Config.base);
|
|
81
|
+
const logger = resolve(Token.logger);
|
|
82
|
+
const tracer = resolve(Token.tracer);
|
|
83
|
+
|
|
84
|
+
const metrics = createDefaultMetrics();
|
|
85
|
+
|
|
86
|
+
return {
|
|
87
|
+
start: [Handlers.requestHandler()],
|
|
88
|
+
logging: [loggingMiddleware(config, logger)],
|
|
89
|
+
tracing: [tracingMiddleware(tracer)],
|
|
90
|
+
metrics: [
|
|
91
|
+
responseMetricsMiddleware(config, {
|
|
92
|
+
counter: metrics.requestCount,
|
|
93
|
+
histogram: metrics.responseDuration,
|
|
94
|
+
}),
|
|
95
|
+
renderMetricsMiddleware(config, {
|
|
96
|
+
histogram: metrics.renderDuration,
|
|
97
|
+
}),
|
|
98
|
+
],
|
|
99
|
+
finish: [Handlers.errorHandler()],
|
|
100
|
+
};
|
|
101
|
+
};
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/* eslint-disable require-jsdoc */
|
|
2
|
+
import type { Preset } from '../types';
|
|
3
|
+
import type { Provider } from '../../container/types';
|
|
4
|
+
import type { SagaRunner } from '../../saga-runner/types';
|
|
5
|
+
import { KnownToken } from '../../tokens';
|
|
6
|
+
import { createPreset } from '..';
|
|
7
|
+
import { renderToString } from 'react-dom/server';
|
|
8
|
+
import { createSagaRunner } from '../../saga-runner';
|
|
9
|
+
import { RESPONSE_EVENT } from '../../http-server/constants';
|
|
10
|
+
import { PageResponse } from '../../http-server/utils';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Возвращает preset с зависимостями по умолчанию для работы в рамках ответа на http-запрос.
|
|
14
|
+
* @return Preset.
|
|
15
|
+
*/
|
|
16
|
+
export function PresetResponse(): Preset {
|
|
17
|
+
return createPreset([
|
|
18
|
+
[KnownToken.Response.sagaRunner, provideSagaRunner],
|
|
19
|
+
[KnownToken.Response.render, provideRender],
|
|
20
|
+
[KnownToken.Response.main, provideMain],
|
|
21
|
+
]);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export const provideSagaRunner: Provider<SagaRunner> = resolve => {
|
|
25
|
+
const logger = resolve(KnownToken.logger);
|
|
26
|
+
return createSagaRunner(logger);
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export const provideRender: Provider<(el: JSX.Element) => string | Promise<string>> = resolve => {
|
|
30
|
+
const { res } = resolve(KnownToken.Response.context);
|
|
31
|
+
|
|
32
|
+
return function render(element: JSX.Element): string {
|
|
33
|
+
res.emit(RESPONSE_EVENT.renderStart);
|
|
34
|
+
|
|
35
|
+
const result = renderToString(element);
|
|
36
|
+
|
|
37
|
+
res.emit(RESPONSE_EVENT.renderFinish);
|
|
38
|
+
|
|
39
|
+
return result;
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
export const provideMain: Provider<() => void> = resolve => {
|
|
44
|
+
const context = resolve(KnownToken.Response.context);
|
|
45
|
+
const assets = resolve(KnownToken.Response.assets);
|
|
46
|
+
const prepare = resolve(KnownToken.Response.prepare);
|
|
47
|
+
const render = resolve(KnownToken.Response.render);
|
|
48
|
+
|
|
49
|
+
return async function main() {
|
|
50
|
+
PageResponse.create()
|
|
51
|
+
.markup(await render(await prepare()))
|
|
52
|
+
.script(assets.js)
|
|
53
|
+
.style(assets.css)
|
|
54
|
+
.format(PageResponse.defineFormat(context.req))
|
|
55
|
+
.send(context.res);
|
|
56
|
+
};
|
|
57
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Application } from '../container/application';
|
|
2
|
+
import type { Token, Provider } from '../container/types';
|
|
3
|
+
|
|
4
|
+
export type PresetEntry<T = any> = [Token<T>, Provider<T>];
|
|
5
|
+
|
|
6
|
+
export interface Preset {
|
|
7
|
+
override: <T>(token: Token<T>, provider: Provider<T>) => void;
|
|
8
|
+
apply: (application: Application) => void;
|
|
9
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { Store } from '@reduxjs/toolkit';
|
|
2
|
+
import type { Logger } from '../logger/types';
|
|
3
|
+
import type { SagaRunner } from './types';
|
|
4
|
+
import createSagaMiddleware, { Saga, END } from 'redux-saga';
|
|
5
|
+
import { SentryError } from '../error-tracker/utils';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Возвращает новый runner для redux-saga.
|
|
9
|
+
* @param logger Logger.
|
|
10
|
+
* @return Runner.
|
|
11
|
+
*/
|
|
12
|
+
export function createSagaRunner(logger: Logger): SagaRunner {
|
|
13
|
+
const middleware = createSagaMiddleware({
|
|
14
|
+
onError: (error, { sagaStack }) => {
|
|
15
|
+
logger.error(
|
|
16
|
+
new SentryError(error.message, {
|
|
17
|
+
extra: { key: 'Saga stack', data: sagaStack },
|
|
18
|
+
}),
|
|
19
|
+
);
|
|
20
|
+
},
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
return {
|
|
24
|
+
middleware,
|
|
25
|
+
|
|
26
|
+
// eslint-disable-next-line require-jsdoc, jsdoc/require-jsdoc
|
|
27
|
+
prepare(store: Store, { timeout }: { timeout?: number } = {}) {
|
|
28
|
+
return {
|
|
29
|
+
// eslint-disable-next-line require-jsdoc, jsdoc/require-jsdoc
|
|
30
|
+
async run<S extends Saga>(saga: S, ...args: Parameters<S>) {
|
|
31
|
+
let ready = false;
|
|
32
|
+
|
|
33
|
+
await Promise.race([
|
|
34
|
+
// ждем пока сага выполнится
|
|
35
|
+
middleware
|
|
36
|
+
.run(saga, ...args)
|
|
37
|
+
.toPromise()
|
|
38
|
+
.then(() => {
|
|
39
|
+
ready = true;
|
|
40
|
+
}),
|
|
41
|
+
|
|
42
|
+
// если сага не выполнилась за положенное время - прерываем
|
|
43
|
+
typeof timeout === 'number' &&
|
|
44
|
+
Number.isFinite(timeout) &&
|
|
45
|
+
new Promise<void>(resolve => {
|
|
46
|
+
setTimeout(() => {
|
|
47
|
+
if (!ready) {
|
|
48
|
+
logger.error(Error('Сага прервана по таймауту'));
|
|
49
|
+
store.dispatch(END);
|
|
50
|
+
}
|
|
51
|
+
resolve();
|
|
52
|
+
}, timeout);
|
|
53
|
+
}),
|
|
54
|
+
]);
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Saga, SagaMiddleware } from 'redux-saga';
|
|
2
|
+
import type { Store } from '@reduxjs/toolkit';
|
|
3
|
+
|
|
4
|
+
export interface SagaRunner {
|
|
5
|
+
middleware: SagaMiddleware<any>;
|
|
6
|
+
|
|
7
|
+
prepare: (
|
|
8
|
+
store: Store,
|
|
9
|
+
options?: { timeout?: number },
|
|
10
|
+
) => {
|
|
11
|
+
run: <S extends Saga>(saga: S, ...args: Parameters<S>) => Promise<void>;
|
|
12
|
+
};
|
|
13
|
+
}
|
package/src/tokens.ts
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { createToken } from './container';
|
|
2
|
+
import type { Application } from 'express';
|
|
3
|
+
import type { DefaultMiddleware, PageAssets, ResponseContext } from './http-server/types';
|
|
4
|
+
import type { SagaRunner } from './saga-runner/types';
|
|
5
|
+
import type { Logger } from './logger/types';
|
|
6
|
+
import type { HttpClientFactory } from './http-client/types';
|
|
7
|
+
import type { ConfigSource, BaseConfig } from './config/types';
|
|
8
|
+
import type { Tracer } from './tracer/types';
|
|
9
|
+
import type { Cache } from './cache/types';
|
|
10
|
+
|
|
11
|
+
export const KnownToken = {
|
|
12
|
+
// config
|
|
13
|
+
Config: {
|
|
14
|
+
source: createToken<ConfigSource>('config.source'),
|
|
15
|
+
base: createToken<BaseConfig>('config.base'),
|
|
16
|
+
},
|
|
17
|
+
|
|
18
|
+
// cache
|
|
19
|
+
cache: createToken<Cache>('cache'),
|
|
20
|
+
|
|
21
|
+
// logging
|
|
22
|
+
logger: createToken<Logger>('logger'),
|
|
23
|
+
|
|
24
|
+
// tracing
|
|
25
|
+
tracer: createToken<Tracer>('tracer'),
|
|
26
|
+
|
|
27
|
+
// metrics
|
|
28
|
+
Metrics: {
|
|
29
|
+
httpApp: createToken<Application>('metrics.http-app'),
|
|
30
|
+
},
|
|
31
|
+
|
|
32
|
+
// http
|
|
33
|
+
Http: {
|
|
34
|
+
Client: {
|
|
35
|
+
factory: createToken<HttpClientFactory>('http.client.factory'),
|
|
36
|
+
},
|
|
37
|
+
Server: {
|
|
38
|
+
factory: createToken<() => Application>('http.server.factory'),
|
|
39
|
+
Defaults: {
|
|
40
|
+
middleware: createToken<DefaultMiddleware>('http.server.defaults.middleware'),
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
|
|
45
|
+
// scope: page response
|
|
46
|
+
Response: {
|
|
47
|
+
context: createToken<ResponseContext>('response/context'),
|
|
48
|
+
assets: createToken<PageAssets>('response/assets'),
|
|
49
|
+
prepare: createToken<() => JSX.Element | Promise<JSX.Element>>('response/prepare'),
|
|
50
|
+
render: createToken<(element: JSX.Element) => string | Promise<string>>('response/render'),
|
|
51
|
+
main: createToken<() => void>('response/main'),
|
|
52
|
+
sagaRunner: createToken<SagaRunner>('response/saga-runner'),
|
|
53
|
+
},
|
|
54
|
+
} as const;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { Tracer } from './types';
|
|
2
|
+
import type { BaseConfig } from '../config/types';
|
|
3
|
+
import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node';
|
|
4
|
+
import { BatchSpanProcessor, SpanExporter } from '@opentelemetry/tracing';
|
|
5
|
+
import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions';
|
|
6
|
+
import { registerInstrumentations } from '@opentelemetry/instrumentation';
|
|
7
|
+
import { ExpressInstrumentation } from '@opentelemetry/instrumentation-express';
|
|
8
|
+
import { HttpInstrumentation } from '@opentelemetry/instrumentation-http';
|
|
9
|
+
import { Resource } from '@opentelemetry/resources';
|
|
10
|
+
import { JaegerPropagator } from '@opentelemetry/propagator-jaeger';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Возвращает новый tracer - объект для трассировки стадий различных процессов.
|
|
14
|
+
* @param config Конфиг.
|
|
15
|
+
* @param exporter Экспортер данных трассировки.
|
|
16
|
+
* @return Tracer.
|
|
17
|
+
*/
|
|
18
|
+
export function createTracer(config: BaseConfig, exporter: SpanExporter): Tracer {
|
|
19
|
+
// @todo доделать по инструкции: https://selvaganesh93.medium.com/tracing-node-js-application-with-opentelemetry-jaeger-ui-9523c0ac8453
|
|
20
|
+
const provider = new NodeTracerProvider({
|
|
21
|
+
resource: new Resource({
|
|
22
|
+
[SemanticResourceAttributes.SERVICE_NAME]: config.appName,
|
|
23
|
+
[SemanticResourceAttributes.SERVICE_VERSION]: config.appVersion,
|
|
24
|
+
[SemanticResourceAttributes.DEPLOYMENT_ENVIRONMENT]: config.env,
|
|
25
|
+
}),
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
// @todo выяснить, почему не сходятся типы и приходится оставлять as any
|
|
29
|
+
provider.addSpanProcessor(new BatchSpanProcessor(exporter) as any);
|
|
30
|
+
|
|
31
|
+
provider.register({
|
|
32
|
+
propagator: new JaegerPropagator(),
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
registerInstrumentations({
|
|
36
|
+
instrumentations: [new ExpressInstrumentation(), new HttpInstrumentation()],
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
return provider.getTracer(config.appName, config.appVersion);
|
|
40
|
+
}
|