@sima-land/isomorph 9.0.7 → 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.
Files changed (530) hide show
  1. package/LICENSE +201 -0
  2. package/dist/cache/types.d.ts +7 -0
  3. package/dist/cache/types.js +3 -0
  4. package/dist/cache/types.js.map +1 -0
  5. package/dist/config/browser.d.ts +6 -0
  6. package/dist/config/browser.js +13 -0
  7. package/dist/config/browser.js.map +1 -0
  8. package/dist/config/index.d.ts +7 -0
  9. package/dist/config/index.js +20 -0
  10. package/dist/config/index.js.map +1 -0
  11. package/dist/config/node.d.ts +6 -0
  12. package/dist/config/node.js +19 -0
  13. package/dist/config/node.js.map +1 -0
  14. package/dist/config/types.d.ts +7 -0
  15. package/dist/config/types.js +3 -0
  16. package/dist/config/types.js.map +1 -0
  17. package/dist/config/utils.d.ts +5 -0
  18. package/dist/config/utils.js +12 -0
  19. package/dist/config/utils.js.map +1 -0
  20. package/dist/container/application.d.ts +25 -0
  21. package/dist/container/application.js +63 -0
  22. package/dist/container/application.js.map +1 -0
  23. package/dist/container/index.d.ts +18 -0
  24. package/dist/container/index.js +74 -0
  25. package/dist/container/index.js.map +1 -0
  26. package/dist/container/types.d.ts +14 -0
  27. package/dist/container/types.js +3 -0
  28. package/dist/container/types.js.map +1 -0
  29. package/dist/error-tracker/browser.d.ts +8 -0
  30. package/dist/error-tracker/browser.js +40 -0
  31. package/dist/error-tracker/browser.js.map +1 -0
  32. package/dist/error-tracker/node.d.ts +8 -0
  33. package/dist/error-tracker/node.js +40 -0
  34. package/dist/error-tracker/node.js.map +1 -0
  35. package/dist/error-tracker/types.d.ts +18 -0
  36. package/dist/error-tracker/types.js +3 -0
  37. package/dist/error-tracker/types.js.map +1 -0
  38. package/dist/error-tracker/utils.d.ts +12 -0
  39. package/dist/error-tracker/utils.js +19 -0
  40. package/dist/error-tracker/utils.js.map +1 -0
  41. package/dist/http-client/middleware/cookie.d.ts +19 -0
  42. package/dist/http-client/middleware/cookie.js +62 -0
  43. package/dist/http-client/middleware/cookie.js.map +1 -0
  44. package/dist/http-client/middleware/tracing.d.ts +32 -0
  45. package/dist/http-client/middleware/tracing.js +67 -0
  46. package/dist/http-client/middleware/tracing.js.map +1 -0
  47. package/dist/http-client/types.d.ts +6 -0
  48. package/dist/http-client/types.js +3 -0
  49. package/dist/http-client/types.js.map +1 -0
  50. package/dist/http-client/utils.d.ts +36 -0
  51. package/dist/http-client/utils.js +49 -0
  52. package/dist/http-client/utils.js.map +1 -0
  53. package/dist/http-server/constants.d.ts +4 -0
  54. package/dist/http-server/constants.js +8 -0
  55. package/dist/http-server/constants.js.map +1 -0
  56. package/dist/http-server/handler/health-check.d.ts +6 -0
  57. package/dist/http-server/handler/health-check.js +15 -0
  58. package/dist/http-server/handler/health-check.js.map +1 -0
  59. package/dist/http-server/middleware/logging.d.ts +10 -0
  60. package/dist/http-server/middleware/logging.js +31 -0
  61. package/dist/http-server/middleware/logging.js.map +1 -0
  62. package/dist/http-server/middleware/metrics.d.ts +23 -0
  63. package/dist/http-server/middleware/metrics.js +60 -0
  64. package/dist/http-server/middleware/metrics.js.map +1 -0
  65. package/dist/http-server/middleware/tracing.d.ts +8 -0
  66. package/dist/http-server/middleware/tracing.js +32 -0
  67. package/dist/http-server/middleware/tracing.js.map +1 -0
  68. package/dist/http-server/types.d.ts +25 -0
  69. package/dist/http-server/types.js +3 -0
  70. package/dist/http-server/types.js.map +1 -0
  71. package/dist/http-server/utils.d.ts +26 -0
  72. package/dist/http-server/utils.js +88 -0
  73. package/dist/http-server/utils.js.map +1 -0
  74. package/dist/logger/handler/console.d.ts +8 -0
  75. package/dist/logger/handler/console.js +36 -0
  76. package/dist/logger/handler/console.js.map +1 -0
  77. package/dist/logger/handler/sentry.d.ts +8 -0
  78. package/dist/logger/handler/sentry.js +36 -0
  79. package/dist/logger/handler/sentry.js.map +1 -0
  80. package/dist/logger/index.d.ts +6 -0
  81. package/dist/logger/index.js +31 -0
  82. package/dist/logger/index.js.map +1 -0
  83. package/dist/logger/types.d.ts +24 -0
  84. package/dist/logger/types.js +3 -0
  85. package/dist/logger/types.js.map +1 -0
  86. package/dist/metrics/constants.d.ts +4 -0
  87. package/dist/metrics/constants.js +8 -0
  88. package/dist/metrics/constants.js.map +1 -0
  89. package/dist/metrics/node.d.ts +18 -0
  90. package/dist/metrics/node.js +74 -0
  91. package/dist/metrics/node.js.map +1 -0
  92. package/dist/preset/index.d.ts +7 -0
  93. package/dist/preset/index.js +23 -0
  94. package/dist/preset/index.js.map +1 -0
  95. package/dist/preset/node/index.d.ts +15 -0
  96. package/dist/preset/node/index.js +90 -0
  97. package/dist/preset/node/index.js.map +1 -0
  98. package/dist/preset/node/response.d.ts +12 -0
  99. package/dist/preset/node/response.js +52 -0
  100. package/dist/preset/node/response.js.map +1 -0
  101. package/dist/preset/types.d.ts +7 -0
  102. package/dist/preset/types.js +3 -0
  103. package/dist/preset/types.js.map +1 -0
  104. package/dist/saga-runner/index.d.ts +8 -0
  105. package/dist/saga-runner/index.js +77 -0
  106. package/dist/saga-runner/index.js.map +1 -0
  107. package/dist/saga-runner/types.d.ts +10 -0
  108. package/dist/saga-runner/types.js +3 -0
  109. package/dist/saga-runner/types.js.map +1 -0
  110. package/dist/tokens.d.ts +40 -0
  111. package/dist/tokens.js +43 -0
  112. package/dist/tokens.js.map +1 -0
  113. package/dist/tracer/node.d.ts +10 -0
  114. package/dist/tracer/node.js +38 -0
  115. package/dist/tracer/node.js.map +1 -0
  116. package/dist/tracer/types.d.ts +2 -0
  117. package/dist/tracer/types.js +3 -0
  118. package/dist/tracer/types.js.map +1 -0
  119. package/dist/utils/browser/analytics/data-layer.d.ts +5 -0
  120. package/dist/utils/browser/analytics/data-layer.js +15 -0
  121. package/dist/utils/browser/analytics/data-layer.js.map +1 -0
  122. package/{helpers/analytics/index.d.ts → dist/utils/browser/analytics/oko.d.ts} +1 -6
  123. package/{helpers/analytics/index.js → dist/utils/browser/analytics/oko.js} +11 -20
  124. package/dist/utils/browser/analytics/oko.js.map +1 -0
  125. package/dist/utils/browser/storage/index.d.ts +4 -0
  126. package/dist/utils/browser/storage/index.js +63 -0
  127. package/dist/utils/browser/storage/index.js.map +1 -0
  128. package/dist/utils/number.d.ts +6 -0
  129. package/dist/utils/number.js +13 -0
  130. package/dist/utils/number.js.map +1 -0
  131. package/dist/utils/react/error-handlers/index.d.ts +38 -0
  132. package/dist/utils/react/error-handlers/index.js +47 -0
  133. package/dist/utils/react/error-handlers/index.js.map +1 -0
  134. package/dist/utils/redux/remote-data.d.ts +23 -0
  135. package/dist/utils/redux/remote-data.js +28 -0
  136. package/dist/utils/redux/remote-data.js.map +1 -0
  137. package/dist/utils/redux-saga/take-chain.d.ts +24 -0
  138. package/dist/utils/redux-saga/take-chain.js +56 -0
  139. package/dist/utils/redux-saga/take-chain.js.map +1 -0
  140. package/dist/utils/webpack/module-federation/index.d.ts +21 -0
  141. package/dist/utils/webpack/module-federation/index.js +74 -0
  142. package/dist/utils/webpack/module-federation/index.js.map +1 -0
  143. package/dist/utils/webpack/module-federation/types.d.ts +26 -0
  144. package/dist/utils/webpack/module-federation/types.js +3 -0
  145. package/dist/utils/webpack/module-federation/types.js.map +1 -0
  146. package/dist/utils/webpack/module-federation/utils.d.ts +15 -0
  147. package/dist/utils/webpack/module-federation/utils.js +36 -0
  148. package/dist/utils/webpack/module-federation/utils.js.map +1 -0
  149. package/package.json +50 -68
  150. package/readme.md +23 -0
  151. package/src/cache/types.ts +7 -0
  152. package/src/config/browser.ts +10 -0
  153. package/src/config/index.ts +18 -0
  154. package/src/config/node.ts +18 -0
  155. package/src/config/types.ts +9 -0
  156. package/src/config/utils.ts +7 -0
  157. package/src/container/application.ts +91 -0
  158. package/src/container/index.ts +79 -0
  159. package/src/container/types.ts +17 -0
  160. package/src/error-tracker/browser.ts +14 -0
  161. package/src/error-tracker/node.ts +14 -0
  162. package/src/error-tracker/types.ts +22 -0
  163. package/src/error-tracker/utils.ts +18 -0
  164. package/src/http-client/middleware/cookie.ts +73 -0
  165. package/src/{helpers/api/middlewares/trace-request-middleware.ts → http-client/middleware/tracing.ts} +28 -35
  166. package/src/http-client/types.ts +8 -0
  167. package/src/http-client/utils.ts +76 -0
  168. package/src/http-server/constants.ts +4 -0
  169. package/src/http-server/handler/health-check.ts +13 -0
  170. package/src/http-server/middleware/logging.ts +34 -0
  171. package/src/http-server/middleware/metrics.ts +87 -0
  172. package/src/http-server/middleware/tracing.ts +35 -0
  173. package/src/http-server/types.ts +29 -0
  174. package/src/http-server/utils.ts +105 -0
  175. package/src/logger/handler/console.ts +35 -0
  176. package/src/logger/handler/sentry.ts +38 -0
  177. package/src/logger/index.ts +31 -0
  178. package/src/logger/types.ts +28 -0
  179. package/src/metrics/constants.ts +4 -0
  180. package/src/metrics/node.ts +54 -0
  181. package/src/preset/index.ts +24 -0
  182. package/src/preset/node/index.ts +101 -0
  183. package/src/preset/node/response.ts +57 -0
  184. package/src/preset/types.ts +9 -0
  185. package/src/saga-runner/index.ts +59 -0
  186. package/src/saga-runner/types.ts +13 -0
  187. package/src/tokens.ts +54 -0
  188. package/src/tracer/node.ts +40 -0
  189. package/src/tracer/types.ts +3 -0
  190. package/src/utils/browser/analytics/__test__/data-layer.test.ts +50 -0
  191. package/src/utils/browser/analytics/__test__/oko.test.tsx +143 -0
  192. package/src/utils/browser/analytics/data-layer.ts +12 -0
  193. package/src/{helpers/analytics/index.ts → utils/browser/analytics/oko.ts} +10 -15
  194. package/src/utils/browser/storage/index.ts +75 -0
  195. package/src/utils/number.ts +8 -0
  196. package/src/utils/react/error-handlers/__test__/__snapshots__/index.test.tsx.snap +27 -0
  197. package/src/utils/react/error-handlers/__test__/index.test.tsx +64 -0
  198. package/src/utils/react/error-handlers/index.tsx +62 -0
  199. package/src/utils/redux/__test__/remote-data.test.ts +50 -0
  200. package/src/utils/redux/remote-data.ts +34 -0
  201. package/src/utils/redux-saga/__test__/take-chain.test.ts +141 -0
  202. package/src/utils/redux-saga/take-chain.ts +65 -0
  203. package/src/utils/webpack/module-federation/__test__/index.test.ts +246 -0
  204. package/src/utils/webpack/module-federation/index.ts +92 -0
  205. package/src/utils/webpack/module-federation/types.ts +44 -0
  206. package/src/utils/webpack/module-federation/utils.ts +43 -0
  207. package/cache/helpers.d.ts +0 -4
  208. package/cache/helpers.js +0 -39
  209. package/cache/helpers.js.map +0 -1
  210. package/cache/local-storage.d.ts +0 -34
  211. package/cache/local-storage.js +0 -90
  212. package/cache/local-storage.js.map +0 -1
  213. package/cache/redis.d.ts +0 -10
  214. package/cache/redis.js +0 -54
  215. package/cache/redis.js.map +0 -1
  216. package/cache/wrap-in-trace.d.ts +0 -8
  217. package/cache/wrap-in-trace.js +0 -68
  218. package/cache/wrap-in-trace.js.map +0 -1
  219. package/config/create.d.ts +0 -8
  220. package/config/create.js +0 -32
  221. package/config/create.js.map +0 -1
  222. package/config/helpers.d.ts +0 -11
  223. package/config/helpers.js +0 -71
  224. package/config/helpers.js.map +0 -1
  225. package/config/validate.d.ts +0 -18
  226. package/config/validate.js +0 -107
  227. package/config/validate.js.map +0 -1
  228. package/container/create-inject.d.ts +0 -7
  229. package/container/create-inject.js +0 -36
  230. package/container/create-inject.js.map +0 -1
  231. package/container/get-dependencies.d.ts +0 -13
  232. package/container/get-dependencies.js +0 -54
  233. package/container/get-dependencies.js.map +0 -1
  234. package/container/index.d.ts +0 -15
  235. package/container/index.js +0 -175
  236. package/container/index.js.map +0 -1
  237. package/container/is-container.d.ts +0 -7
  238. package/container/is-container.js +0 -17
  239. package/container/is-container.js.map +0 -1
  240. package/container/service-not-found-error.d.ts +0 -10
  241. package/container/service-not-found-error.js +0 -18
  242. package/container/service-not-found-error.js.map +0 -1
  243. package/create-proxy/create-proxy-middleware/index.d.ts +0 -16
  244. package/create-proxy/create-proxy-middleware/index.js +0 -47
  245. package/create-proxy/create-proxy-middleware/index.js.map +0 -1
  246. package/create-proxy/index.d.ts +0 -12
  247. package/create-proxy/index.js +0 -25
  248. package/create-proxy/index.js.map +0 -1
  249. package/create-response-sender/index.d.ts +0 -8
  250. package/create-response-sender/index.js +0 -42
  251. package/create-response-sender/index.js.map +0 -1
  252. package/get-dynamic-data/index.d.ts +0 -8
  253. package/get-dynamic-data/index.js +0 -23
  254. package/get-dynamic-data/index.js.map +0 -1
  255. package/graceful-shutdown/index.d.ts +0 -26
  256. package/graceful-shutdown/index.js +0 -87
  257. package/graceful-shutdown/index.js.map +0 -1
  258. package/helpers/add-error-handling/index.d.ts +0 -1
  259. package/helpers/add-error-handling/index.js +0 -42
  260. package/helpers/add-error-handling/index.js.map +0 -1
  261. package/helpers/analytics/index.js.map +0 -1
  262. package/helpers/api/create-enhancer.d.ts +0 -12
  263. package/helpers/api/create-enhancer.js +0 -52
  264. package/helpers/api/create-enhancer.js.map +0 -1
  265. package/helpers/api/create-instance.d.ts +0 -11
  266. package/helpers/api/create-instance.js +0 -39
  267. package/helpers/api/create-instance.js.map +0 -1
  268. package/helpers/api/middlewares/collect-cookie-middleware.d.ts +0 -10
  269. package/helpers/api/middlewares/collect-cookie-middleware.js +0 -39
  270. package/helpers/api/middlewares/collect-cookie-middleware.js.map +0 -1
  271. package/helpers/api/middlewares/count-api-response-time.d.ts +0 -12
  272. package/helpers/api/middlewares/count-api-response-time.js +0 -39
  273. package/helpers/api/middlewares/count-api-response-time.js.map +0 -1
  274. package/helpers/api/middlewares/error-handlers-middlewares.d.ts +0 -5
  275. package/helpers/api/middlewares/error-handlers-middlewares.js +0 -114
  276. package/helpers/api/middlewares/error-handlers-middlewares.js.map +0 -1
  277. package/helpers/api/middlewares/helpers.d.ts +0 -11
  278. package/helpers/api/middlewares/helpers.js +0 -27
  279. package/helpers/api/middlewares/helpers.js.map +0 -1
  280. package/helpers/api/middlewares/pass-headers-middleware.d.ts +0 -3
  281. package/helpers/api/middlewares/pass-headers-middleware.js +0 -27
  282. package/helpers/api/middlewares/pass-headers-middleware.js.map +0 -1
  283. package/helpers/api/middlewares/prepare-request-headers.d.ts +0 -5
  284. package/helpers/api/middlewares/prepare-request-headers.js +0 -20
  285. package/helpers/api/middlewares/prepare-request-headers.js.map +0 -1
  286. package/helpers/api/middlewares/set-http-agents-middleware.d.ts +0 -15
  287. package/helpers/api/middlewares/set-http-agents-middleware.js +0 -34
  288. package/helpers/api/middlewares/set-http-agents-middleware.js.map +0 -1
  289. package/helpers/api/middlewares/stages-trace-middleware.d.ts +0 -17
  290. package/helpers/api/middlewares/stages-trace-middleware.js +0 -57
  291. package/helpers/api/middlewares/stages-trace-middleware.js.map +0 -1
  292. package/helpers/api/middlewares/trace-request-middleware.d.ts +0 -24
  293. package/helpers/api/middlewares/trace-request-middleware.js +0 -69
  294. package/helpers/api/middlewares/trace-request-middleware.js.map +0 -1
  295. package/helpers/api/server-adapter/__fixtures__/fake-keys.d.ts +0 -10
  296. package/helpers/api/server-adapter/__fixtures__/fake-keys.js +0 -61
  297. package/helpers/api/server-adapter/__fixtures__/fake-keys.js.map +0 -1
  298. package/helpers/api/server-adapter/constants.d.ts +0 -5
  299. package/helpers/api/server-adapter/constants.js +0 -16
  300. package/helpers/api/server-adapter/constants.js.map +0 -1
  301. package/helpers/api/server-adapter/helpers.d.ts +0 -26
  302. package/helpers/api/server-adapter/helpers.js +0 -208
  303. package/helpers/api/server-adapter/helpers.js.map +0 -1
  304. package/helpers/api/server-adapter/index.d.ts +0 -10
  305. package/helpers/api/server-adapter/index.js +0 -118
  306. package/helpers/api/server-adapter/index.js.map +0 -1
  307. package/helpers/development/use-dot-env.d.ts +0 -6
  308. package/helpers/development/use-dot-env.js +0 -11
  309. package/helpers/development/use-dot-env.js.map +0 -1
  310. package/helpers/get-params/index.d.ts +0 -4
  311. package/helpers/get-params/index.js +0 -51
  312. package/helpers/get-params/index.js.map +0 -1
  313. package/helpers/http/request-getters.d.ts +0 -5
  314. package/helpers/http/request-getters.js +0 -49
  315. package/helpers/http/request-getters.js.map +0 -1
  316. package/helpers/http/statuses-validator.d.ts +0 -3
  317. package/helpers/http/statuses-validator.js +0 -25
  318. package/helpers/http/statuses-validator.js.map +0 -1
  319. package/helpers/logger/create-pino-instance/index.d.ts +0 -6
  320. package/helpers/logger/create-pino-instance/index.js +0 -39
  321. package/helpers/logger/create-pino-instance/index.js.map +0 -1
  322. package/helpers/logger/format-time/index.d.ts +0 -6
  323. package/helpers/logger/format-time/index.js +0 -9
  324. package/helpers/logger/format-time/index.js.map +0 -1
  325. package/helpers/metrics/index.d.ts +0 -23
  326. package/helpers/metrics/index.js +0 -42
  327. package/helpers/metrics/index.js.map +0 -1
  328. package/helpers/prometheus/index.d.ts +0 -4
  329. package/helpers/prometheus/index.js +0 -13
  330. package/helpers/prometheus/index.js.map +0 -1
  331. package/helpers/prometheus/measure-middleware.d.ts +0 -5
  332. package/helpers/prometheus/measure-middleware.js +0 -69
  333. package/helpers/prometheus/measure-middleware.js.map +0 -1
  334. package/helpers/prometheus/metric-adapter.d.ts +0 -36
  335. package/helpers/prometheus/metric-adapter.js +0 -98
  336. package/helpers/prometheus/metric-adapter.js.map +0 -1
  337. package/helpers/react/error-handlers/index.d.ts +0 -40
  338. package/helpers/react/error-handlers/index.js +0 -52
  339. package/helpers/react/error-handlers/index.js.map +0 -1
  340. package/helpers/redux/constants.d.ts +0 -5
  341. package/helpers/redux/constants.js +0 -14
  342. package/helpers/redux/constants.js.map +0 -1
  343. package/helpers/redux/create-compose-middleware.d.ts +0 -15
  344. package/helpers/redux/create-compose-middleware.js +0 -23
  345. package/helpers/redux/create-compose-middleware.js.map +0 -1
  346. package/helpers/redux/get-dev-compose-creator.d.ts +0 -6
  347. package/helpers/redux/get-dev-compose-creator.js +0 -13
  348. package/helpers/redux/get-dev-compose-creator.js.map +0 -1
  349. package/helpers/redux/prepare-on-ready.d.ts +0 -9
  350. package/helpers/redux/prepare-on-ready.js +0 -16
  351. package/helpers/redux/prepare-on-ready.js.map +0 -1
  352. package/helpers/redux/remote-data.d.ts +0 -40
  353. package/helpers/redux/remote-data.js +0 -91
  354. package/helpers/redux/remote-data.js.map +0 -1
  355. package/helpers/redux/selector/statuses.d.ts +0 -23
  356. package/helpers/redux/selector/statuses.js +0 -34
  357. package/helpers/redux/selector/statuses.js.map +0 -1
  358. package/helpers/redux/wait-on-store-readiness.d.ts +0 -11
  359. package/helpers/redux/wait-on-store-readiness.js +0 -29
  360. package/helpers/redux/wait-on-store-readiness.js.map +0 -1
  361. package/helpers/render/get-react-markup-data.d.ts +0 -14
  362. package/helpers/render/get-react-markup-data.js +0 -20
  363. package/helpers/render/get-react-markup-data.js.map +0 -1
  364. package/helpers/render/index.d.ts +0 -21
  365. package/helpers/render/index.js +0 -72
  366. package/helpers/render/index.js.map +0 -1
  367. package/helpers/render/render-app.d.ts +0 -12
  368. package/helpers/render/render-app.js +0 -12
  369. package/helpers/render/render-app.js.map +0 -1
  370. package/helpers/saga/__fixtures__/do-safe-request.d.ts +0 -43
  371. package/helpers/saga/__fixtures__/do-safe-request.js +0 -50
  372. package/helpers/saga/__fixtures__/do-safe-request.js.map +0 -1
  373. package/helpers/saga/cache-result.d.ts +0 -46
  374. package/helpers/saga/cache-result.js +0 -71
  375. package/helpers/saga/cache-result.js.map +0 -1
  376. package/helpers/saga/create-store.d.ts +0 -20
  377. package/helpers/saga/create-store.js +0 -106
  378. package/helpers/saga/create-store.js.map +0 -1
  379. package/helpers/saga/do-safe-request.d.ts +0 -38
  380. package/helpers/saga/do-safe-request.js +0 -45
  381. package/helpers/saga/do-safe-request.js.map +0 -1
  382. package/helpers/saga/safe-request.d.ts +0 -7
  383. package/helpers/saga/safe-request.js +0 -15
  384. package/helpers/saga/safe-request.js.map +0 -1
  385. package/helpers/saga/take-chain.d.ts +0 -20
  386. package/helpers/saga/take-chain.js +0 -56
  387. package/helpers/saga/take-chain.js.map +0 -1
  388. package/helpers/tracer/create-child-tracing-middleware.d.ts +0 -7
  389. package/helpers/tracer/create-child-tracing-middleware.js +0 -40
  390. package/helpers/tracer/create-child-tracing-middleware.js.map +0 -1
  391. package/helpers/tracer/index.d.ts +0 -24
  392. package/helpers/tracer/index.js +0 -144
  393. package/helpers/tracer/index.js.map +0 -1
  394. package/helpers/utils/check-feature-by-segment.d.ts +0 -2
  395. package/helpers/utils/check-feature-by-segment.js +0 -31
  396. package/helpers/utils/check-feature-by-segment.js.map +0 -1
  397. package/helpers/utils/format-object-keys.d.ts +0 -6
  398. package/helpers/utils/format-object-keys.js +0 -27
  399. package/helpers/utils/format-object-keys.js.map +0 -1
  400. package/helpers/utils/get-ms-from-hrt.d.ts +0 -2
  401. package/helpers/utils/get-ms-from-hrt.js +0 -22
  402. package/helpers/utils/get-ms-from-hrt.js.map +0 -1
  403. package/helpers/utils/is-match-pattern-list.d.ts +0 -8
  404. package/helpers/utils/is-match-pattern-list.js +0 -16
  405. package/helpers/utils/is-match-pattern-list.js.map +0 -1
  406. package/helpers/utils/is-not-empty-array.d.ts +0 -2
  407. package/helpers/utils/is-not-empty-array.js +0 -12
  408. package/helpers/utils/is-not-empty-array.js.map +0 -1
  409. package/helpers/utils/is-not-empty-string.d.ts +0 -2
  410. package/helpers/utils/is-not-empty-string.js +0 -15
  411. package/helpers/utils/is-not-empty-string.js.map +0 -1
  412. package/helpers/utils/is-numeric.d.ts +0 -7
  413. package/helpers/utils/is-numeric.js +0 -16
  414. package/helpers/utils/is-numeric.js.map +0 -1
  415. package/helpers/utils/wrap-in-measure-event.d.ts +0 -9
  416. package/helpers/utils/wrap-in-measure-event.js +0 -50
  417. package/helpers/utils/wrap-in-measure-event.js.map +0 -1
  418. package/logger/create-logger-middleware/index.d.ts +0 -14
  419. package/logger/create-logger-middleware/index.js +0 -41
  420. package/logger/create-logger-middleware/index.js.map +0 -1
  421. package/logger/create-sentry-instance/index.d.ts +0 -29
  422. package/logger/create-sentry-instance/index.js +0 -63
  423. package/logger/create-sentry-instance/index.js.map +0 -1
  424. package/logger/create-sentry-middleware/index.d.ts +0 -14
  425. package/logger/create-sentry-middleware/index.js +0 -19
  426. package/logger/create-sentry-middleware/index.js.map +0 -1
  427. package/logger/handler-creators/index.d.ts +0 -5
  428. package/logger/handler-creators/index.js +0 -41
  429. package/logger/handler-creators/index.js.map +0 -1
  430. package/logger/initialize-sentry-creator/index.d.ts +0 -17
  431. package/logger/initialize-sentry-creator/index.js +0 -35
  432. package/logger/initialize-sentry-creator/index.js.map +0 -1
  433. package/logger/sentry-logger/index.d.ts +0 -9
  434. package/logger/sentry-logger/index.js +0 -36
  435. package/logger/sentry-logger/index.js.map +0 -1
  436. package/module-federation/__example__/webpack-config.example.d.ts +0 -366
  437. package/module-federation/__example__/webpack-config.example.js +0 -51
  438. package/module-federation/__example__/webpack-config.example.js.map +0 -1
  439. package/module-federation/enhanced-module-federation-plugin.d.ts +0 -46
  440. package/module-federation/enhanced-module-federation-plugin.js +0 -72
  441. package/module-federation/enhanced-module-federation-plugin.js.map +0 -1
  442. package/module-federation/utils/index.d.ts +0 -8
  443. package/module-federation/utils/index.js +0 -28
  444. package/module-federation/utils/index.js.map +0 -1
  445. package/observe-middleware/index.d.ts +0 -9
  446. package/observe-middleware/index.js +0 -67
  447. package/observe-middleware/index.js.map +0 -1
  448. package/set-header-middleware/create.d.ts +0 -10
  449. package/set-header-middleware/create.js +0 -16
  450. package/set-header-middleware/create.js.map +0 -1
  451. package/src/cache/helpers.js +0 -32
  452. package/src/cache/local-storage.ts +0 -92
  453. package/src/cache/redis.js +0 -79
  454. package/src/cache/wrap-in-trace.js +0 -57
  455. package/src/config/create.js +0 -33
  456. package/src/config/helpers.js +0 -71
  457. package/src/config/validate.js +0 -114
  458. package/src/container/create-inject.js +0 -32
  459. package/src/container/get-dependencies.js +0 -46
  460. package/src/container/index.js +0 -188
  461. package/src/container/is-container.js +0 -14
  462. package/src/container/service-not-found-error.js +0 -14
  463. package/src/create-proxy/create-proxy-middleware/index.js +0 -47
  464. package/src/create-proxy/index.js +0 -27
  465. package/src/create-response-sender/index.js +0 -48
  466. package/src/get-dynamic-data/index.js +0 -26
  467. package/src/graceful-shutdown/index.js +0 -97
  468. package/src/helpers/add-error-handling/index.js +0 -24
  469. package/src/helpers/api/create-enhancer.js +0 -52
  470. package/src/helpers/api/create-instance.js +0 -42
  471. package/src/helpers/api/middlewares/collect-cookie-middleware.js +0 -27
  472. package/src/helpers/api/middlewares/count-api-response-time.js +0 -31
  473. package/src/helpers/api/middlewares/error-handlers-middlewares.js +0 -124
  474. package/src/helpers/api/middlewares/helpers.js +0 -26
  475. package/src/helpers/api/middlewares/pass-headers-middleware.js +0 -19
  476. package/src/helpers/api/middlewares/prepare-request-headers.js +0 -18
  477. package/src/helpers/api/middlewares/set-http-agents-middleware.js +0 -22
  478. package/src/helpers/api/middlewares/stages-trace-middleware.js +0 -46
  479. package/src/helpers/api/server-adapter/__fixtures__/fake-keys.js +0 -58
  480. package/src/helpers/api/server-adapter/constants.js +0 -12
  481. package/src/helpers/api/server-adapter/helpers.js +0 -244
  482. package/src/helpers/api/server-adapter/index.js +0 -155
  483. package/src/helpers/development/use-dot-env.js +0 -9
  484. package/src/helpers/get-params/index.js +0 -59
  485. package/src/helpers/http/request-getters.js +0 -42
  486. package/src/helpers/http/statuses-validator.js +0 -20
  487. package/src/helpers/logger/create-pino-instance/index.js +0 -41
  488. package/src/helpers/logger/format-time/index.js +0 -6
  489. package/src/helpers/metrics/index.js +0 -40
  490. package/src/helpers/prometheus/index.js +0 -9
  491. package/src/helpers/prometheus/measure-middleware.js +0 -73
  492. package/src/helpers/prometheus/metric-adapter.js +0 -99
  493. package/src/helpers/react/error-handlers/index.tsx +0 -68
  494. package/src/helpers/redux/constants.js +0 -10
  495. package/src/helpers/redux/create-compose-middleware.js +0 -24
  496. package/src/helpers/redux/get-dev-compose-creator.js +0 -9
  497. package/src/helpers/redux/prepare-on-ready.js +0 -16
  498. package/src/helpers/redux/remote-data.js +0 -124
  499. package/src/helpers/redux/selector/statuses.js +0 -30
  500. package/src/helpers/redux/wait-on-store-readiness.js +0 -40
  501. package/src/helpers/render/get-react-markup-data.js +0 -18
  502. package/src/helpers/render/index.js +0 -69
  503. package/src/helpers/render/render-app.js +0 -15
  504. package/src/helpers/saga/__fixtures__/do-safe-request.js +0 -49
  505. package/src/helpers/saga/cache-result.js +0 -77
  506. package/src/helpers/saga/create-store.js +0 -102
  507. package/src/helpers/saga/do-safe-request.js +0 -47
  508. package/src/helpers/saga/safe-request.js +0 -11
  509. package/src/helpers/saga/take-chain.js +0 -53
  510. package/src/helpers/tracer/create-child-tracing-middleware.js +0 -42
  511. package/src/helpers/tracer/index.js +0 -171
  512. package/src/helpers/utils/check-feature-by-segment.js +0 -32
  513. package/src/helpers/utils/format-object-keys.js +0 -23
  514. package/src/helpers/utils/get-ms-from-hrt.js +0 -16
  515. package/src/helpers/utils/is-match-pattern-list.js +0 -13
  516. package/src/helpers/utils/is-not-empty-array.js +0 -8
  517. package/src/helpers/utils/is-not-empty-string.js +0 -11
  518. package/src/helpers/utils/is-numeric.ts +0 -12
  519. package/src/helpers/utils/wrap-in-measure-event.js +0 -35
  520. package/src/logger/create-logger-middleware/index.js +0 -46
  521. package/src/logger/create-sentry-instance/index.js +0 -74
  522. package/src/logger/create-sentry-middleware/index.js +0 -16
  523. package/src/logger/handler-creators/index.js +0 -38
  524. package/src/logger/initialize-sentry-creator/index.js +0 -43
  525. package/src/logger/sentry-logger/index.js +0 -33
  526. package/src/module-federation/__example__/webpack-config.example.js +0 -57
  527. package/src/module-federation/enhanced-module-federation-plugin.js +0 -92
  528. package/src/module-federation/utils/index.js +0 -32
  529. package/src/observe-middleware/index.js +0 -70
  530. package/src/set-header-middleware/create.js +0 -17
@@ -0,0 +1,91 @@
1
+ /* eslint-disable require-jsdoc, jsdoc/require-jsdoc */
2
+ import type { Container, Provider, Resolve, Token } from './types';
3
+ import type { Preset } from '../preset/types';
4
+ import { createContainer, createToken, NothingBoundError } from '.';
5
+
6
+ type ExtractType<T extends readonly Token<any>[]> = {
7
+ [index in keyof T]: T[index] extends T[number] ? ReturnType<T[index]['_resolve']> : never;
8
+ };
9
+
10
+ interface Binding<T> {
11
+ toValue: (value: T) => void;
12
+ toProvider: (provider: Provider<T>) => void;
13
+ }
14
+
15
+ export class Application {
16
+ private container?: Container;
17
+ private parent?: Application;
18
+ private presets: Preset[];
19
+ private providers: Map<Token<any>, Provider<any>>;
20
+
21
+ static readonly self = createToken('application/self');
22
+
23
+ constructor() {
24
+ this.providers = new Map();
25
+ this.presets = [];
26
+ }
27
+
28
+ bind<T>(token: Token<T>): Binding<T> {
29
+ return {
30
+ toValue: value => {
31
+ this.providers.set(token, () => value);
32
+ },
33
+ toProvider: provider => {
34
+ this.providers.set(token, provider);
35
+ },
36
+ };
37
+ }
38
+
39
+ get<T>(token: Token<T>): T {
40
+ try {
41
+ return this.getContainer().get(token);
42
+ } catch (error) {
43
+ if (error instanceof NothingBoundError && this.parent) {
44
+ return this.parent.get(token);
45
+ } else {
46
+ throw error;
47
+ }
48
+ }
49
+ }
50
+
51
+ private getContainer(): Container {
52
+ if (!this.container) {
53
+ this.container = this.configureContainer();
54
+ }
55
+
56
+ return this.container;
57
+ }
58
+
59
+ private configureContainer(): Container {
60
+ const container = createContainer();
61
+
62
+ container.set(Application.self, () => this);
63
+
64
+ for (const preset of this.presets) {
65
+ preset.apply(this);
66
+ }
67
+
68
+ const resolve: Resolve = token => this.get(token);
69
+
70
+ for (const [token, provider] of this.providers) {
71
+ container.set(token, () => provider(resolve));
72
+ }
73
+
74
+ return container;
75
+ }
76
+
77
+ attach(parent: Application): void {
78
+ this.parent = parent;
79
+ }
80
+
81
+ preset(preset: Preset): void {
82
+ this.presets.push(preset);
83
+ }
84
+
85
+ invoke<Tokens extends readonly Token<any>[]>(
86
+ tokens: [...Tokens],
87
+ fn: (...args: ExtractType<Tokens>) => void,
88
+ ): void {
89
+ fn(...(tokens.map(token => this.get(token)) as any));
90
+ }
91
+ }
@@ -0,0 +1,79 @@
1
+ /* eslint-disable require-jsdoc, jsdoc/require-jsdoc */
2
+ import type { Container, Provider, Token } from './types';
3
+
4
+ /**
5
+ * Возвращает новый токен.
6
+ * @param name Имя токена для отладки в случае ошибок.
7
+ * @return Токен.
8
+ */
9
+ export function createToken<T = never>(name?: string): Token<T> {
10
+ const key = Symbol(name);
11
+
12
+ return {
13
+ _key: key,
14
+ _resolve: (registry: Map<symbol, any>) => registry.get(key) as T,
15
+ };
16
+ }
17
+
18
+ export class NothingBoundError extends Error {
19
+ constructor(key: symbol) {
20
+ super(`Nothing bound to ${String(key)}`);
21
+ this.name = 'NothingBoundError';
22
+ }
23
+ }
24
+
25
+ export class CircularDependencyError extends Error {
26
+ constructor(trace: Token<any>[]) {
27
+ const names = trace.map(token => String(token._key)).join(' >> ');
28
+ super(`Circular dependency found, trace: ${names}`);
29
+ this.name = 'CircularDependencyError';
30
+ }
31
+ }
32
+
33
+ /**
34
+ * Возвращает новый DI-контейнер.
35
+ * @return DI-контейнер.
36
+ */
37
+ export function createContainer(): Container {
38
+ const cache = new Map<symbol, any>();
39
+ const registry = new Map<symbol, Provider<any>>();
40
+
41
+ function resolve<T>(token: Token<T>, chain: Token<any>[]): T {
42
+ if (chain.includes(token)) {
43
+ throw new CircularDependencyError([...chain, token]);
44
+ } else {
45
+ chain.push(token);
46
+ }
47
+
48
+ if (cache.has(token._key)) {
49
+ return cache.get(token._key);
50
+ } else if (registry.has(token._key)) {
51
+ const provider = registry.get(token._key);
52
+
53
+ if (typeof provider !== 'function') {
54
+ throw new Error('Provider is not a function');
55
+ }
56
+
57
+ const value = provider(otherToken => resolve(otherToken, chain));
58
+
59
+ // всегда как singleton
60
+ cache.set(token._key, value);
61
+
62
+ return value;
63
+ } else {
64
+ throw new NothingBoundError(token._key);
65
+ }
66
+ }
67
+
68
+ const container = {
69
+ set<T>(token: Token<T>, provider: Provider<T>): void {
70
+ registry.set(token._key, provider);
71
+ },
72
+
73
+ get<T>(token: Token<T>): T {
74
+ return resolve(token, []);
75
+ },
76
+ };
77
+
78
+ return container;
79
+ }
@@ -0,0 +1,17 @@
1
+ export interface Token<T> {
2
+ readonly _key: symbol;
3
+ readonly _resolve: (registry: Map<symbol, any>) => T;
4
+ }
5
+
6
+ export interface Resolve {
7
+ <T>(token: Token<T>): T;
8
+ }
9
+
10
+ export interface Provider<T> {
11
+ (resolve: Resolve): T;
12
+ }
13
+
14
+ export interface Container {
15
+ set: <T = never>(token: Token<T>, provider: Provider<T>) => void;
16
+ get: Resolve;
17
+ }
@@ -0,0 +1,14 @@
1
+ import type { SentryLib } from './types';
2
+ import * as Sentry from '@sentry/browser';
3
+
4
+ /**
5
+ * Возвращает новый набор из клиента Sentry и функций из пакета Sentry.
6
+ * @param options Опции создания клиента.
7
+ * @return Новый набор из клиента Sentry и функций из пакета Sentry.
8
+ */
9
+ export function createSentryLib(options: Sentry.BrowserOptions): SentryLib {
10
+ return {
11
+ client: new Sentry.BrowserClient(options),
12
+ withScope: Sentry.withScope,
13
+ };
14
+ }
@@ -0,0 +1,14 @@
1
+ import type { SentryLib } from './types';
2
+ import * as Sentry from '@sentry/node';
3
+
4
+ /**
5
+ * Возвращает новый набор из клиента Sentry и функций из пакета Sentry.
6
+ * @param options Опции создания клиента.
7
+ * @return Новый набор из клиента Sentry и функций из пакета Sentry.
8
+ */
9
+ export function createSentryLib(options: Sentry.NodeOptions): SentryLib {
10
+ return {
11
+ client: new Sentry.NodeClient(options),
12
+ withScope: Sentry.withScope,
13
+ };
14
+ }
@@ -0,0 +1,22 @@
1
+ import type { Client, Severity, Context, Extra } from '@sentry/types';
2
+ import type { withScope as withScopeBrowser } from '@sentry/browser';
3
+ import type { withScope as withScopeNode } from '@sentry/node';
4
+
5
+ export interface SentryLib {
6
+ client: Client;
7
+ withScope: typeof withScopeBrowser | typeof withScopeNode;
8
+ }
9
+
10
+ export interface SentryErrorData {
11
+ level?: Severity;
12
+
13
+ context?: {
14
+ key: string;
15
+ data: Context | null;
16
+ };
17
+
18
+ extra?: {
19
+ key: string;
20
+ data: Extra | null;
21
+ };
22
+ }
@@ -0,0 +1,18 @@
1
+ import { SentryErrorData } from './types';
2
+
3
+ /**
4
+ * Ошибка с данными для Sentry.
5
+ */
6
+ export class SentryError extends Error {
7
+ data: SentryErrorData;
8
+
9
+ /**
10
+ * @param message Сообщение.
11
+ * @param data Данные.
12
+ */
13
+ constructor(message: string, data: SentryErrorData = {}) {
14
+ super(message);
15
+ this.data = data;
16
+ this.name = 'SentryError';
17
+ }
18
+ }
@@ -0,0 +1,73 @@
1
+ import type { Request, Response } from 'express';
2
+ import type { Middleware } from 'middleware-axios';
3
+
4
+ export interface CookieStore {
5
+ set: (seCookie: string[]) => void;
6
+ asHeader: () => string;
7
+ }
8
+
9
+ /**
10
+ * Возвращает новый middleware для работы с cookie на сервере.
11
+ * @param request Входящий запрос.
12
+ * @param response Исходящий ответ.
13
+ * @return Middleware.
14
+ */
15
+ export function collectCookieMiddleware(request: Request, response: Response): Middleware<any> {
16
+ const store = createCookieStore(request.get('cookie'));
17
+
18
+ return async function (config, next) {
19
+ const result = await next({
20
+ ...config,
21
+ headers: {
22
+ ...config.headers,
23
+ Cookie: store.asHeader(),
24
+ },
25
+ });
26
+
27
+ if (result.headers['set-cookie']) {
28
+ store.set(result.headers['set-cookie']);
29
+ response.setHeader('cookie', store.asHeader());
30
+ }
31
+ };
32
+ }
33
+
34
+ /**
35
+ * Возвращает новое хранилище cookie.
36
+ * @param initialCookie Начальное значение cookie.
37
+ * @return Хранилище cookie.
38
+ */
39
+ export function createCookieStore(initialCookie?: string): CookieStore {
40
+ const data: Record<string, { name: string; value: string }> = {};
41
+
42
+ // eslint-disable-next-line require-jsdoc, jsdoc/require-jsdoc
43
+ function setItem(cookieItem: string) {
44
+ const [cookieName, cookieValue] = cookieItem.split('=').map(item => item.trim());
45
+
46
+ if (cookieName && cookieValue) {
47
+ data[cookieName] = { name: cookieName, value: cookieValue };
48
+ }
49
+ }
50
+
51
+ if (initialCookie && initialCookie.length) {
52
+ for (const item of initialCookie.split(';')) {
53
+ setItem(item);
54
+ }
55
+ }
56
+
57
+ // eslint-disable-next-line require-jsdoc, jsdoc/require-jsdoc
58
+ function set(setCookieHeaderValues: string[]): void {
59
+ for (const item of setCookieHeaderValues) {
60
+ const [cookie] = item.split(';');
61
+ setItem(cookie);
62
+ }
63
+ }
64
+
65
+ // eslint-disable-next-line require-jsdoc, jsdoc/require-jsdoc
66
+ function asHeader(): string {
67
+ return Object.values(data)
68
+ .map(cookie => `${cookie.name}=${cookie.value}`)
69
+ .join(';');
70
+ }
71
+
72
+ return { set, asHeader };
73
+ }
@@ -1,45 +1,42 @@
1
- import type { AxiosRequestConfig } from 'axios';
1
+ import type { AxiosDefaults, AxiosRequestConfig } from 'axios';
2
2
  import type { Middleware } from 'middleware-axios';
3
- import { Tracer, Tags, FORMAT_HTTP_HEADERS, SpanContext } from 'opentracing';
3
+ import { Context, Tracer, SpanStatusCode } from '@opentelemetry/api';
4
+ import { SemanticAttributes } from '@opentelemetry/semantic-conventions';
4
5
 
5
6
  /**
6
- * Создаёт middleware для трассировки запросов в API.
7
- * @param options Параметры для создания middleware.
8
- * @param options.tracer Объект трейсера.
9
- * @param options.context Объект родительского контекста.
10
- * @return Middleware для трассировки запросов в API.
7
+ * Возвращает новый middleware для трассировки исходящих запросов.
8
+ * @param tracer Трейсер.
9
+ * @param rootContext Контекст.
10
+ * @return Middleware.
11
11
  */
12
- const createTraceRequestMiddleware = ({ tracer, context }: {
13
- tracer: Tracer;
14
- context: SpanContext;
15
- }): Middleware<any> => async function (config, next, defaults) {
12
+ export function tracingMiddleware(tracer: Tracer, rootContext: Context): Middleware<any> {
13
+ return async function (config, next, defaults) {
16
14
  const { method, url, foundId } = getRequestInfo(config, defaults);
15
+ const span = tracer.startSpan(`HTTP ${method} ${url}`, undefined, rootContext);
17
16
 
18
- const span = tracer.startSpan(`HTTP ${method} ${url}`, {
19
- childOf: context,
20
- });
21
-
22
- if (!config.headers) {
23
- config.headers = {};
24
- }
25
-
26
- span.addTags({
27
- [Tags.HTTP_URL]: url,
28
- [Tags.HTTP_METHOD]: method,
29
- 'request.params': { ...config.params },
30
- 'request.headers': { ...config.headers },
17
+ span.setAttributes({
18
+ [SemanticAttributes.HTTP_URL]: url,
19
+ [SemanticAttributes.HTTP_METHOD]: method,
31
20
 
32
21
  // если нашли id - добавляем в теги
33
22
  ...(foundId && { 'request.id': foundId }),
34
23
  });
35
24
 
36
- tracer.inject(span, FORMAT_HTTP_HEADERS, config.headers);
25
+ try {
26
+ await next(config);
27
+ } catch (error) {
28
+ span.setStatus({
29
+ code: SpanStatusCode.ERROR,
30
+ message: 'HTTP Request failed',
31
+ });
37
32
 
38
- const response = await next(config);
33
+ // не прячем ошибку
34
+ throw error;
35
+ }
39
36
 
40
- span.setTag(Tags.HTTP_STATUS_CODE, response.status);
41
- span.finish();
37
+ span.end();
42
38
  };
39
+ }
43
40
 
44
41
  /**
45
42
  * Формирует базовые данные запроса.
@@ -48,9 +45,9 @@ const createTraceRequestMiddleware = ({ tracer, context }: {
48
45
  * @param defaults Базовый конфиг экземпляра Axios.
49
46
  * @return Базовые данные запроса.
50
47
  */
51
- const getRequestInfo = (
48
+ export const getRequestInfo = (
52
49
  config: AxiosRequestConfig,
53
- defaults: AxiosRequestConfig
50
+ defaults: AxiosDefaults,
54
51
  ): {
55
52
  method: string;
56
53
  url: string;
@@ -78,9 +75,5 @@ const getRequestInfo = (
78
75
  export const hideFirstId = (url: string): [string, number | undefined] => {
79
76
  const found = /\d{2,}/.exec(url);
80
77
 
81
- return found
82
- ? [url.replace(found[0], '{id}'), Number(found[0])]
83
- : [url, undefined];
78
+ return found ? [url.replace(found[0], '{id}'), Number(found[0])] : [url, undefined];
84
79
  };
85
-
86
- export default createTraceRequestMiddleware;
@@ -0,0 +1,8 @@
1
+ import type { AxiosRequestConfig } from 'axios';
2
+ import type { AxiosInstanceWrapper } from 'middleware-axios';
3
+
4
+ export type HttpClient = AxiosInstanceWrapper;
5
+
6
+ export interface HttpClientFactory {
7
+ (config: AxiosRequestConfig): HttpClient;
8
+ }
@@ -0,0 +1,76 @@
1
+ import { getServiceHeaders, getXClientIp } from '../http-server/utils';
2
+ import type { Request } from 'express';
3
+ import type { BaseConfig } from '../config/types';
4
+ import type { AxiosInstance } from 'axios';
5
+ import type { AxiosInstanceWrapper, MethodName } from 'middleware-axios';
6
+
7
+ // @todo передавать заголовки
8
+ export type SauceResponse<T = any> =
9
+ | {
10
+ ok: true;
11
+ data: T;
12
+ }
13
+ | {
14
+ ok: false;
15
+ error: any;
16
+ };
17
+
18
+ export interface SauceMethod<K extends MethodName> {
19
+ <T>(...args: Parameters<AxiosInstanceWrapper[K]>): Promise<SauceResponse<T>>;
20
+ }
21
+
22
+ export interface Sauce {
23
+ readonly get: SauceMethod<'get'>;
24
+ readonly delete: SauceMethod<'delete'>;
25
+ readonly head: SauceMethod<'head'>;
26
+ readonly options: SauceMethod<'options'>;
27
+ readonly post: SauceMethod<'post'>;
28
+ readonly put: SauceMethod<'put'>;
29
+ readonly patch: SauceMethod<'patch'>;
30
+ }
31
+
32
+ /**
33
+ * Оборачивает экземпляр axios. Все методы обертки возвращают promise, который никогда не попадают в состояние rejected.
34
+ * @param instance Экземпляр axios или AxiosInstanceWrapper.
35
+ * @return Обертка.
36
+ */
37
+ export function sauce(instance: AxiosInstance | AxiosInstanceWrapper): Sauce {
38
+ // eslint-disable-next-line require-jsdoc, jsdoc/require-jsdoc
39
+ function createMethod<Key extends MethodName>(methodName: Key) {
40
+ return async function <Data = any>(
41
+ ...args: Parameters<AxiosInstance[Key]>
42
+ ): Promise<SauceResponse<Data>> {
43
+ try {
44
+ const response = await instance[methodName](...(args as [any]));
45
+ return { ok: true, data: response.data };
46
+ } catch (error) {
47
+ return { ok: false, error };
48
+ }
49
+ };
50
+ }
51
+
52
+ return {
53
+ get: createMethod('get'),
54
+ delete: createMethod('delete'),
55
+ head: createMethod('head'),
56
+ options: createMethod('options'),
57
+ post: createMethod('post'),
58
+ put: createMethod('put'),
59
+ patch: createMethod('patch'),
60
+ };
61
+ }
62
+
63
+ /**
64
+ * Формирует заголовки для исходящих запросов с сервера по соглашению.
65
+ * @param config Конфиг.
66
+ * @param request Входящий запрос.
67
+ * @return Заголовки для исходящих запросов.
68
+ */
69
+ export function getRequestHeaders(config: BaseConfig, request: Request): Record<string, string> {
70
+ return {
71
+ 'X-Client-Ip': getXClientIp(request),
72
+ 'User-Agent': `simaland-${config.appName}/${config.appVersion}`,
73
+ Cookie: request.get('cookie') || '',
74
+ ...getServiceHeaders(request),
75
+ };
76
+ }
@@ -0,0 +1,4 @@
1
+ export const RESPONSE_EVENT = {
2
+ renderStart: Symbol('render:start'),
3
+ renderFinish: Symbol('render:finish'),
4
+ } as const;
@@ -0,0 +1,13 @@
1
+ import type { Handler } from 'express';
2
+
3
+ /**
4
+ * Обработчик, отвечающий данными о времени работы приложения.
5
+ * @return Обработчик http-запроса.
6
+ */
7
+ export function healthCheck(): Handler {
8
+ const startTime = Date.now();
9
+
10
+ return (req, res) => {
11
+ res.json({ uptime: Date.now() - startTime });
12
+ };
13
+ }
@@ -0,0 +1,34 @@
1
+ import type { Handler } from 'express';
2
+ import type { BaseConfig } from '../../config/types';
3
+ import type { Logger, ConventionalFluentInfo } from '../../logger/types';
4
+ import { getXClientIp } from '../utils';
5
+ import { toMilliseconds } from '../../utils/number';
6
+
7
+ /**
8
+ * Возвращает новый middleware для логирования запросов.
9
+ * @param config Конфиг.
10
+ * @param logger Logger.
11
+ * @return Middleware.
12
+ */
13
+ export function loggingMiddleware(config: BaseConfig, logger: Logger): Handler {
14
+ return function (req, res, next) {
15
+ const start = process.hrtime.bigint();
16
+
17
+ res.once('finish', () => {
18
+ const finish = process.hrtime.bigint();
19
+
20
+ const message: ConventionalFluentInfo = {
21
+ version: config.appVersion,
22
+ route: req.originalUrl,
23
+ method: req.method,
24
+ status: res.statusCode,
25
+ remote_ip: getXClientIp(req),
26
+ latency: toMilliseconds(finish - start),
27
+ };
28
+
29
+ logger.info(message);
30
+ });
31
+
32
+ next();
33
+ };
34
+ }
@@ -0,0 +1,87 @@
1
+ import type { Request, Response, Handler } from 'express';
2
+ import type { BaseConfig } from '../../config/types';
3
+ import * as PromClient from 'prom-client';
4
+ import { toMilliseconds } from '../../utils/number';
5
+ import { RESPONSE_EVENT } from '../constants';
6
+ import { ConventionalLabels } from '../../metrics/constants';
7
+
8
+ /**
9
+ * Возвращает новый middleware для формирования метрик входящего запроса.
10
+ * @param config Конфиг.
11
+ * @param metrics Метрики - счетчик запросов и гистограмма длительности ответа.
12
+ * @return Middleware.
13
+ */
14
+ export function responseMetricsMiddleware(
15
+ config: BaseConfig,
16
+ metrics: {
17
+ counter: PromClient.Counter<typeof ConventionalLabels.HTTP_RESPONSE[number]>;
18
+ histogram: PromClient.Histogram<typeof ConventionalLabels.HTTP_RESPONSE[number]>;
19
+ },
20
+ ): Handler {
21
+ // eslint-disable-next-line require-jsdoc, jsdoc/require-jsdoc
22
+ function resolveLabels(
23
+ req: Request,
24
+ res: Response,
25
+ ): Record<typeof ConventionalLabels.HTTP_RESPONSE[number], string | number> {
26
+ return {
27
+ version: config.appVersion,
28
+ route: req.baseUrl + req.path,
29
+ code: res.statusCode,
30
+ method: req.method,
31
+ };
32
+ }
33
+
34
+ return (req, res, next) => {
35
+ const start = process.hrtime.bigint();
36
+
37
+ metrics.counter.inc(resolveLabels(req, res), 1);
38
+
39
+ res.once('finish', () => {
40
+ const finish = process.hrtime.bigint();
41
+
42
+ metrics.histogram.observe(resolveLabels(req, res), toMilliseconds(finish - start));
43
+ });
44
+
45
+ next();
46
+ };
47
+ }
48
+
49
+ /**
50
+ * Возвращает новый middleware для формирования метрик рендеринга верстки.
51
+ * @param config Конфиг.
52
+ * @param metrics Метрики - гистограмма длительности рендеринга.
53
+ * @return Middleware.
54
+ */
55
+ export function renderMetricsMiddleware(
56
+ config: BaseConfig,
57
+ metrics: {
58
+ histogram: PromClient.Histogram<typeof ConventionalLabels.SSR[number]>;
59
+ },
60
+ ): Handler {
61
+ return (req, res, next) => {
62
+ let start: bigint | undefined;
63
+
64
+ res.once(RESPONSE_EVENT.renderStart, () => {
65
+ start = process.hrtime.bigint();
66
+ });
67
+
68
+ res.once(RESPONSE_EVENT.renderFinish, () => {
69
+ if (typeof start !== 'bigint') {
70
+ throw Error('Looks like "render start" event not emitted');
71
+ }
72
+
73
+ const finish = process.hrtime.bigint();
74
+
75
+ metrics.histogram.observe(
76
+ {
77
+ version: config.appVersion,
78
+ method: req.method,
79
+ route: req.baseUrl + req.path,
80
+ },
81
+ toMilliseconds(finish - start),
82
+ );
83
+ });
84
+
85
+ next();
86
+ };
87
+ }