@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.
Files changed (531) 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/{browser → dist/utils/browser}/analytics/data-layer.d.ts +0 -0
  120. package/{browser → dist/utils/browser}/analytics/data-layer.js +1 -2
  121. package/dist/utils/browser/analytics/data-layer.js.map +1 -0
  122. package/{browser → dist/utils/browser}/analytics/oko.d.ts +0 -0
  123. package/{browser → dist/utils/browser}/analytics/oko.js +6 -7
  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 +49 -63
  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/{browser → utils/browser}/analytics/data-layer.ts +0 -0
  193. package/src/{browser → utils/browser}/analytics/oko.ts +6 -4
  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/browser/analytics/data-layer.js.map +0 -1
  208. package/browser/analytics/oko.js.map +0 -1
  209. package/cache/helpers.d.ts +0 -4
  210. package/cache/helpers.js +0 -39
  211. package/cache/helpers.js.map +0 -1
  212. package/cache/local-storage.d.ts +0 -34
  213. package/cache/local-storage.js +0 -90
  214. package/cache/local-storage.js.map +0 -1
  215. package/cache/redis.d.ts +0 -10
  216. package/cache/redis.js +0 -54
  217. package/cache/redis.js.map +0 -1
  218. package/cache/wrap-in-trace.d.ts +0 -8
  219. package/cache/wrap-in-trace.js +0 -68
  220. package/cache/wrap-in-trace.js.map +0 -1
  221. package/config/create.d.ts +0 -8
  222. package/config/create.js +0 -32
  223. package/config/create.js.map +0 -1
  224. package/config/helpers.d.ts +0 -11
  225. package/config/helpers.js +0 -71
  226. package/config/helpers.js.map +0 -1
  227. package/config/validate.d.ts +0 -18
  228. package/config/validate.js +0 -107
  229. package/config/validate.js.map +0 -1
  230. package/container/create-inject.d.ts +0 -7
  231. package/container/create-inject.js +0 -36
  232. package/container/create-inject.js.map +0 -1
  233. package/container/get-dependencies.d.ts +0 -13
  234. package/container/get-dependencies.js +0 -54
  235. package/container/get-dependencies.js.map +0 -1
  236. package/container/index.d.ts +0 -15
  237. package/container/index.js +0 -175
  238. package/container/index.js.map +0 -1
  239. package/container/is-container.d.ts +0 -7
  240. package/container/is-container.js +0 -17
  241. package/container/is-container.js.map +0 -1
  242. package/container/service-not-found-error.d.ts +0 -10
  243. package/container/service-not-found-error.js +0 -18
  244. package/container/service-not-found-error.js.map +0 -1
  245. package/create-proxy/create-proxy-middleware/index.d.ts +0 -16
  246. package/create-proxy/create-proxy-middleware/index.js +0 -47
  247. package/create-proxy/create-proxy-middleware/index.js.map +0 -1
  248. package/create-proxy/index.d.ts +0 -12
  249. package/create-proxy/index.js +0 -25
  250. package/create-proxy/index.js.map +0 -1
  251. package/create-response-sender/index.d.ts +0 -8
  252. package/create-response-sender/index.js +0 -42
  253. package/create-response-sender/index.js.map +0 -1
  254. package/get-dynamic-data/index.d.ts +0 -8
  255. package/get-dynamic-data/index.js +0 -23
  256. package/get-dynamic-data/index.js.map +0 -1
  257. package/graceful-shutdown/index.d.ts +0 -26
  258. package/graceful-shutdown/index.js +0 -87
  259. package/graceful-shutdown/index.js.map +0 -1
  260. package/helpers/add-error-handling/index.d.ts +0 -1
  261. package/helpers/add-error-handling/index.js +0 -42
  262. package/helpers/add-error-handling/index.js.map +0 -1
  263. package/helpers/api/create-enhancer.d.ts +0 -12
  264. package/helpers/api/create-enhancer.js +0 -52
  265. package/helpers/api/create-enhancer.js.map +0 -1
  266. package/helpers/api/create-instance.d.ts +0 -11
  267. package/helpers/api/create-instance.js +0 -39
  268. package/helpers/api/create-instance.js.map +0 -1
  269. package/helpers/api/middlewares/collect-cookie-middleware.d.ts +0 -10
  270. package/helpers/api/middlewares/collect-cookie-middleware.js +0 -39
  271. package/helpers/api/middlewares/collect-cookie-middleware.js.map +0 -1
  272. package/helpers/api/middlewares/count-api-response-time.d.ts +0 -12
  273. package/helpers/api/middlewares/count-api-response-time.js +0 -39
  274. package/helpers/api/middlewares/count-api-response-time.js.map +0 -1
  275. package/helpers/api/middlewares/error-handlers-middlewares.d.ts +0 -5
  276. package/helpers/api/middlewares/error-handlers-middlewares.js +0 -114
  277. package/helpers/api/middlewares/error-handlers-middlewares.js.map +0 -1
  278. package/helpers/api/middlewares/helpers.d.ts +0 -11
  279. package/helpers/api/middlewares/helpers.js +0 -27
  280. package/helpers/api/middlewares/helpers.js.map +0 -1
  281. package/helpers/api/middlewares/pass-headers-middleware.d.ts +0 -3
  282. package/helpers/api/middlewares/pass-headers-middleware.js +0 -27
  283. package/helpers/api/middlewares/pass-headers-middleware.js.map +0 -1
  284. package/helpers/api/middlewares/prepare-request-headers.d.ts +0 -5
  285. package/helpers/api/middlewares/prepare-request-headers.js +0 -20
  286. package/helpers/api/middlewares/prepare-request-headers.js.map +0 -1
  287. package/helpers/api/middlewares/set-http-agents-middleware.d.ts +0 -15
  288. package/helpers/api/middlewares/set-http-agents-middleware.js +0 -34
  289. package/helpers/api/middlewares/set-http-agents-middleware.js.map +0 -1
  290. package/helpers/api/middlewares/stages-trace-middleware.d.ts +0 -17
  291. package/helpers/api/middlewares/stages-trace-middleware.js +0 -57
  292. package/helpers/api/middlewares/stages-trace-middleware.js.map +0 -1
  293. package/helpers/api/middlewares/trace-request-middleware.d.ts +0 -24
  294. package/helpers/api/middlewares/trace-request-middleware.js +0 -69
  295. package/helpers/api/middlewares/trace-request-middleware.js.map +0 -1
  296. package/helpers/api/server-adapter/__fixtures__/fake-keys.d.ts +0 -10
  297. package/helpers/api/server-adapter/__fixtures__/fake-keys.js +0 -61
  298. package/helpers/api/server-adapter/__fixtures__/fake-keys.js.map +0 -1
  299. package/helpers/api/server-adapter/constants.d.ts +0 -5
  300. package/helpers/api/server-adapter/constants.js +0 -16
  301. package/helpers/api/server-adapter/constants.js.map +0 -1
  302. package/helpers/api/server-adapter/helpers.d.ts +0 -26
  303. package/helpers/api/server-adapter/helpers.js +0 -208
  304. package/helpers/api/server-adapter/helpers.js.map +0 -1
  305. package/helpers/api/server-adapter/index.d.ts +0 -10
  306. package/helpers/api/server-adapter/index.js +0 -118
  307. package/helpers/api/server-adapter/index.js.map +0 -1
  308. package/helpers/development/use-dot-env.d.ts +0 -6
  309. package/helpers/development/use-dot-env.js +0 -11
  310. package/helpers/development/use-dot-env.js.map +0 -1
  311. package/helpers/get-params/index.d.ts +0 -4
  312. package/helpers/get-params/index.js +0 -51
  313. package/helpers/get-params/index.js.map +0 -1
  314. package/helpers/http/request-getters.d.ts +0 -5
  315. package/helpers/http/request-getters.js +0 -49
  316. package/helpers/http/request-getters.js.map +0 -1
  317. package/helpers/http/statuses-validator.d.ts +0 -3
  318. package/helpers/http/statuses-validator.js +0 -25
  319. package/helpers/http/statuses-validator.js.map +0 -1
  320. package/helpers/logger/create-pino-instance/index.d.ts +0 -6
  321. package/helpers/logger/create-pino-instance/index.js +0 -39
  322. package/helpers/logger/create-pino-instance/index.js.map +0 -1
  323. package/helpers/logger/format-time/index.d.ts +0 -6
  324. package/helpers/logger/format-time/index.js +0 -9
  325. package/helpers/logger/format-time/index.js.map +0 -1
  326. package/helpers/metrics/index.d.ts +0 -23
  327. package/helpers/metrics/index.js +0 -42
  328. package/helpers/metrics/index.js.map +0 -1
  329. package/helpers/prometheus/index.d.ts +0 -4
  330. package/helpers/prometheus/index.js +0 -13
  331. package/helpers/prometheus/index.js.map +0 -1
  332. package/helpers/prometheus/measure-middleware.d.ts +0 -5
  333. package/helpers/prometheus/measure-middleware.js +0 -69
  334. package/helpers/prometheus/measure-middleware.js.map +0 -1
  335. package/helpers/prometheus/metric-adapter.d.ts +0 -36
  336. package/helpers/prometheus/metric-adapter.js +0 -98
  337. package/helpers/prometheus/metric-adapter.js.map +0 -1
  338. package/helpers/react/error-handlers/index.d.ts +0 -40
  339. package/helpers/react/error-handlers/index.js +0 -52
  340. package/helpers/react/error-handlers/index.js.map +0 -1
  341. package/helpers/redux/constants.d.ts +0 -5
  342. package/helpers/redux/constants.js +0 -14
  343. package/helpers/redux/constants.js.map +0 -1
  344. package/helpers/redux/create-compose-middleware.d.ts +0 -15
  345. package/helpers/redux/create-compose-middleware.js +0 -23
  346. package/helpers/redux/create-compose-middleware.js.map +0 -1
  347. package/helpers/redux/get-dev-compose-creator.d.ts +0 -6
  348. package/helpers/redux/get-dev-compose-creator.js +0 -13
  349. package/helpers/redux/get-dev-compose-creator.js.map +0 -1
  350. package/helpers/redux/prepare-on-ready.d.ts +0 -9
  351. package/helpers/redux/prepare-on-ready.js +0 -16
  352. package/helpers/redux/prepare-on-ready.js.map +0 -1
  353. package/helpers/redux/remote-data.d.ts +0 -40
  354. package/helpers/redux/remote-data.js +0 -91
  355. package/helpers/redux/remote-data.js.map +0 -1
  356. package/helpers/redux/selector/statuses.d.ts +0 -23
  357. package/helpers/redux/selector/statuses.js +0 -34
  358. package/helpers/redux/selector/statuses.js.map +0 -1
  359. package/helpers/redux/wait-on-store-readiness.d.ts +0 -11
  360. package/helpers/redux/wait-on-store-readiness.js +0 -29
  361. package/helpers/redux/wait-on-store-readiness.js.map +0 -1
  362. package/helpers/render/get-react-markup-data.d.ts +0 -14
  363. package/helpers/render/get-react-markup-data.js +0 -20
  364. package/helpers/render/get-react-markup-data.js.map +0 -1
  365. package/helpers/render/index.d.ts +0 -21
  366. package/helpers/render/index.js +0 -72
  367. package/helpers/render/index.js.map +0 -1
  368. package/helpers/render/render-app.d.ts +0 -12
  369. package/helpers/render/render-app.js +0 -12
  370. package/helpers/render/render-app.js.map +0 -1
  371. package/helpers/saga/__fixtures__/do-safe-request.d.ts +0 -43
  372. package/helpers/saga/__fixtures__/do-safe-request.js +0 -50
  373. package/helpers/saga/__fixtures__/do-safe-request.js.map +0 -1
  374. package/helpers/saga/cache-result.d.ts +0 -46
  375. package/helpers/saga/cache-result.js +0 -71
  376. package/helpers/saga/cache-result.js.map +0 -1
  377. package/helpers/saga/create-store.d.ts +0 -20
  378. package/helpers/saga/create-store.js +0 -106
  379. package/helpers/saga/create-store.js.map +0 -1
  380. package/helpers/saga/do-safe-request.d.ts +0 -38
  381. package/helpers/saga/do-safe-request.js +0 -45
  382. package/helpers/saga/do-safe-request.js.map +0 -1
  383. package/helpers/saga/safe-request.d.ts +0 -7
  384. package/helpers/saga/safe-request.js +0 -15
  385. package/helpers/saga/safe-request.js.map +0 -1
  386. package/helpers/saga/take-chain.d.ts +0 -20
  387. package/helpers/saga/take-chain.js +0 -56
  388. package/helpers/saga/take-chain.js.map +0 -1
  389. package/helpers/tracer/create-child-tracing-middleware.d.ts +0 -7
  390. package/helpers/tracer/create-child-tracing-middleware.js +0 -40
  391. package/helpers/tracer/create-child-tracing-middleware.js.map +0 -1
  392. package/helpers/tracer/index.d.ts +0 -24
  393. package/helpers/tracer/index.js +0 -144
  394. package/helpers/tracer/index.js.map +0 -1
  395. package/helpers/utils/check-feature-by-segment.d.ts +0 -2
  396. package/helpers/utils/check-feature-by-segment.js +0 -31
  397. package/helpers/utils/check-feature-by-segment.js.map +0 -1
  398. package/helpers/utils/format-object-keys.d.ts +0 -6
  399. package/helpers/utils/format-object-keys.js +0 -27
  400. package/helpers/utils/format-object-keys.js.map +0 -1
  401. package/helpers/utils/get-ms-from-hrt.d.ts +0 -2
  402. package/helpers/utils/get-ms-from-hrt.js +0 -22
  403. package/helpers/utils/get-ms-from-hrt.js.map +0 -1
  404. package/helpers/utils/is-match-pattern-list.d.ts +0 -8
  405. package/helpers/utils/is-match-pattern-list.js +0 -16
  406. package/helpers/utils/is-match-pattern-list.js.map +0 -1
  407. package/helpers/utils/is-not-empty-array.d.ts +0 -2
  408. package/helpers/utils/is-not-empty-array.js +0 -12
  409. package/helpers/utils/is-not-empty-array.js.map +0 -1
  410. package/helpers/utils/is-not-empty-string.d.ts +0 -2
  411. package/helpers/utils/is-not-empty-string.js +0 -15
  412. package/helpers/utils/is-not-empty-string.js.map +0 -1
  413. package/helpers/utils/is-numeric.d.ts +0 -7
  414. package/helpers/utils/is-numeric.js +0 -16
  415. package/helpers/utils/is-numeric.js.map +0 -1
  416. package/helpers/utils/wrap-in-measure-event.d.ts +0 -9
  417. package/helpers/utils/wrap-in-measure-event.js +0 -50
  418. package/helpers/utils/wrap-in-measure-event.js.map +0 -1
  419. package/logger/create-logger-middleware/index.d.ts +0 -14
  420. package/logger/create-logger-middleware/index.js +0 -41
  421. package/logger/create-logger-middleware/index.js.map +0 -1
  422. package/logger/create-sentry-instance/index.d.ts +0 -29
  423. package/logger/create-sentry-instance/index.js +0 -63
  424. package/logger/create-sentry-instance/index.js.map +0 -1
  425. package/logger/create-sentry-middleware/index.d.ts +0 -14
  426. package/logger/create-sentry-middleware/index.js +0 -19
  427. package/logger/create-sentry-middleware/index.js.map +0 -1
  428. package/logger/handler-creators/index.d.ts +0 -5
  429. package/logger/handler-creators/index.js +0 -41
  430. package/logger/handler-creators/index.js.map +0 -1
  431. package/logger/initialize-sentry-creator/index.d.ts +0 -17
  432. package/logger/initialize-sentry-creator/index.js +0 -35
  433. package/logger/initialize-sentry-creator/index.js.map +0 -1
  434. package/logger/sentry-logger/index.d.ts +0 -9
  435. package/logger/sentry-logger/index.js +0 -36
  436. package/logger/sentry-logger/index.js.map +0 -1
  437. package/module-federation/__example__/webpack-config.example.d.ts +0 -366
  438. package/module-federation/__example__/webpack-config.example.js +0 -58
  439. package/module-federation/__example__/webpack-config.example.js.map +0 -1
  440. package/module-federation/enhanced-module-federation-plugin.d.ts +0 -69
  441. package/module-federation/enhanced-module-federation-plugin.js +0 -97
  442. package/module-federation/enhanced-module-federation-plugin.js.map +0 -1
  443. package/module-federation/utils/index.d.ts +0 -16
  444. package/module-federation/utils/index.js +0 -33
  445. package/module-federation/utils/index.js.map +0 -1
  446. package/observe-middleware/index.d.ts +0 -9
  447. package/observe-middleware/index.js +0 -67
  448. package/observe-middleware/index.js.map +0 -1
  449. package/set-header-middleware/create.d.ts +0 -10
  450. package/set-header-middleware/create.js +0 -16
  451. package/set-header-middleware/create.js.map +0 -1
  452. package/src/cache/helpers.js +0 -32
  453. package/src/cache/local-storage.ts +0 -92
  454. package/src/cache/redis.js +0 -79
  455. package/src/cache/wrap-in-trace.js +0 -57
  456. package/src/config/create.js +0 -33
  457. package/src/config/helpers.js +0 -71
  458. package/src/config/validate.js +0 -114
  459. package/src/container/create-inject.js +0 -32
  460. package/src/container/get-dependencies.js +0 -46
  461. package/src/container/index.js +0 -188
  462. package/src/container/is-container.js +0 -14
  463. package/src/container/service-not-found-error.js +0 -14
  464. package/src/create-proxy/create-proxy-middleware/index.js +0 -47
  465. package/src/create-proxy/index.js +0 -27
  466. package/src/create-response-sender/index.js +0 -48
  467. package/src/get-dynamic-data/index.js +0 -26
  468. package/src/graceful-shutdown/index.js +0 -97
  469. package/src/helpers/add-error-handling/index.js +0 -24
  470. package/src/helpers/api/create-enhancer.js +0 -52
  471. package/src/helpers/api/create-instance.js +0 -42
  472. package/src/helpers/api/middlewares/collect-cookie-middleware.js +0 -27
  473. package/src/helpers/api/middlewares/count-api-response-time.js +0 -31
  474. package/src/helpers/api/middlewares/error-handlers-middlewares.js +0 -124
  475. package/src/helpers/api/middlewares/helpers.js +0 -26
  476. package/src/helpers/api/middlewares/pass-headers-middleware.js +0 -19
  477. package/src/helpers/api/middlewares/prepare-request-headers.js +0 -18
  478. package/src/helpers/api/middlewares/set-http-agents-middleware.js +0 -22
  479. package/src/helpers/api/middlewares/stages-trace-middleware.js +0 -46
  480. package/src/helpers/api/server-adapter/__fixtures__/fake-keys.js +0 -58
  481. package/src/helpers/api/server-adapter/constants.js +0 -12
  482. package/src/helpers/api/server-adapter/helpers.js +0 -244
  483. package/src/helpers/api/server-adapter/index.js +0 -155
  484. package/src/helpers/development/use-dot-env.js +0 -9
  485. package/src/helpers/get-params/index.js +0 -59
  486. package/src/helpers/http/request-getters.js +0 -42
  487. package/src/helpers/http/statuses-validator.js +0 -20
  488. package/src/helpers/logger/create-pino-instance/index.js +0 -41
  489. package/src/helpers/logger/format-time/index.js +0 -6
  490. package/src/helpers/metrics/index.js +0 -40
  491. package/src/helpers/prometheus/index.js +0 -9
  492. package/src/helpers/prometheus/measure-middleware.js +0 -73
  493. package/src/helpers/prometheus/metric-adapter.js +0 -99
  494. package/src/helpers/react/error-handlers/index.tsx +0 -68
  495. package/src/helpers/redux/constants.js +0 -10
  496. package/src/helpers/redux/create-compose-middleware.js +0 -24
  497. package/src/helpers/redux/get-dev-compose-creator.js +0 -9
  498. package/src/helpers/redux/prepare-on-ready.js +0 -16
  499. package/src/helpers/redux/remote-data.js +0 -124
  500. package/src/helpers/redux/selector/statuses.js +0 -30
  501. package/src/helpers/redux/wait-on-store-readiness.js +0 -40
  502. package/src/helpers/render/get-react-markup-data.js +0 -18
  503. package/src/helpers/render/index.js +0 -69
  504. package/src/helpers/render/render-app.js +0 -15
  505. package/src/helpers/saga/__fixtures__/do-safe-request.js +0 -49
  506. package/src/helpers/saga/cache-result.js +0 -77
  507. package/src/helpers/saga/create-store.js +0 -102
  508. package/src/helpers/saga/do-safe-request.js +0 -47
  509. package/src/helpers/saga/safe-request.js +0 -11
  510. package/src/helpers/saga/take-chain.js +0 -53
  511. package/src/helpers/tracer/create-child-tracing-middleware.js +0 -42
  512. package/src/helpers/tracer/index.js +0 -171
  513. package/src/helpers/utils/check-feature-by-segment.js +0 -32
  514. package/src/helpers/utils/format-object-keys.js +0 -23
  515. package/src/helpers/utils/get-ms-from-hrt.js +0 -16
  516. package/src/helpers/utils/is-match-pattern-list.js +0 -13
  517. package/src/helpers/utils/is-not-empty-array.js +0 -8
  518. package/src/helpers/utils/is-not-empty-string.js +0 -11
  519. package/src/helpers/utils/is-numeric.ts +0 -12
  520. package/src/helpers/utils/wrap-in-measure-event.js +0 -35
  521. package/src/logger/create-logger-middleware/index.js +0 -46
  522. package/src/logger/create-sentry-instance/index.js +0 -74
  523. package/src/logger/create-sentry-middleware/index.js +0 -16
  524. package/src/logger/handler-creators/index.js +0 -38
  525. package/src/logger/initialize-sentry-creator/index.js +0 -43
  526. package/src/logger/sentry-logger/index.js +0 -33
  527. package/src/module-federation/__example__/webpack-config.example.js +0 -64
  528. package/src/module-federation/enhanced-module-federation-plugin.js +0 -119
  529. package/src/module-federation/utils/index.js +0 -39
  530. package/src/observe-middleware/index.js +0 -70
  531. 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,4 @@
1
+ export const ConventionalLabels = {
2
+ HTTP_RESPONSE: ['version', 'route', 'code', 'method'],
3
+ SSR: ['version', 'route', 'method'],
4
+ } as const;
@@ -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
+ }
@@ -0,0 +1,3 @@
1
+ import type { Tracer } from '@opentelemetry/api';
2
+
3
+ export type { Tracer };