@ddd-ts-kit/aspects 0.0.0-stage → 0.1.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 (346) hide show
  1. package/README.md +381 -2
  2. package/dist/aspect/advice-factory.d.ts +9 -0
  3. package/dist/aspect/advice-factory.d.ts.map +1 -0
  4. package/dist/aspect/advice-factory.js +2 -0
  5. package/dist/aspect/advice-factory.js.map +1 -0
  6. package/dist/aspect/advice.d.ts +3 -0
  7. package/dist/aspect/advice.d.ts.map +1 -0
  8. package/dist/aspect/advice.js +2 -0
  9. package/dist/aspect/advice.js.map +1 -0
  10. package/dist/aspect/aspect-info.d.ts +12 -0
  11. package/dist/aspect/aspect-info.d.ts.map +1 -0
  12. package/dist/aspect/aspect-info.js +2 -0
  13. package/dist/aspect/aspect-info.js.map +1 -0
  14. package/dist/aspect/aspect-kind.d.ts +4 -0
  15. package/dist/aspect/aspect-kind.d.ts.map +1 -0
  16. package/dist/aspect/aspect-kind.js +2 -0
  17. package/dist/aspect/aspect-kind.js.map +1 -0
  18. package/dist/aspect/aspect-origins.d.ts +10 -0
  19. package/dist/aspect/aspect-origins.d.ts.map +1 -0
  20. package/dist/aspect/aspect-origins.js +3 -0
  21. package/dist/aspect/aspect-origins.js.map +1 -0
  22. package/dist/aspect/aspect.d.ts +9 -0
  23. package/dist/aspect/aspect.d.ts.map +1 -0
  24. package/dist/aspect/aspect.js +2 -0
  25. package/dist/aspect/aspect.js.map +1 -0
  26. package/dist/aspect/compose.d.ts +7 -0
  27. package/dist/aspect/compose.d.ts.map +1 -0
  28. package/dist/aspect/compose.js +11 -0
  29. package/dist/aspect/compose.js.map +1 -0
  30. package/dist/aspect/define-aspect.d.ts +5 -0
  31. package/dist/aspect/define-aspect.d.ts.map +1 -0
  32. package/dist/aspect/define-aspect.js +17 -0
  33. package/dist/aspect/define-aspect.js.map +1 -0
  34. package/dist/aspect/invocation.d.ts +6 -0
  35. package/dist/aspect/invocation.d.ts.map +1 -0
  36. package/dist/aspect/invocation.js +2 -0
  37. package/dist/aspect/invocation.js.map +1 -0
  38. package/dist/aspect/join-point.d.ts +13 -0
  39. package/dist/aspect/join-point.d.ts.map +1 -0
  40. package/dist/aspect/join-point.js +2 -0
  41. package/dist/aspect/join-point.js.map +1 -0
  42. package/dist/aspect/selector.d.ts +3 -0
  43. package/dist/aspect/selector.d.ts.map +1 -0
  44. package/dist/aspect/selector.js +2 -0
  45. package/dist/aspect/selector.js.map +1 -0
  46. package/dist/aspect/selectors.d.ts +14 -0
  47. package/dist/aspect/selectors.d.ts.map +1 -0
  48. package/dist/aspect/selectors.js +32 -0
  49. package/dist/aspect/selectors.js.map +1 -0
  50. package/dist/aspect/when.d.ts +8 -0
  51. package/dist/aspect/when.d.ts.map +1 -0
  52. package/dist/aspect/when.js +21 -0
  53. package/dist/aspect/when.js.map +1 -0
  54. package/dist/bulkhead/bulkhead-options.d.ts +10 -0
  55. package/dist/bulkhead/bulkhead-options.d.ts.map +1 -0
  56. package/dist/bulkhead/bulkhead-options.js +2 -0
  57. package/dist/bulkhead/bulkhead-options.js.map +1 -0
  58. package/dist/bulkhead/bulkhead.d.ts +11 -0
  59. package/dist/bulkhead/bulkhead.d.ts.map +1 -0
  60. package/dist/bulkhead/bulkhead.js +22 -0
  61. package/dist/bulkhead/bulkhead.js.map +1 -0
  62. package/dist/bulkhead/compartment.d.ts +13 -0
  63. package/dist/bulkhead/compartment.d.ts.map +1 -0
  64. package/dist/bulkhead/compartment.js +40 -0
  65. package/dist/bulkhead/compartment.js.map +1 -0
  66. package/dist/cached/cached.d.ts +26 -0
  67. package/dist/cached/cached.d.ts.map +1 -0
  68. package/dist/cached/cached.js +64 -0
  69. package/dist/cached/cached.js.map +1 -0
  70. package/dist/circuit-breaker/circuit-breaker-options.d.ts +20 -0
  71. package/dist/circuit-breaker/circuit-breaker-options.d.ts.map +1 -0
  72. package/dist/circuit-breaker/circuit-breaker-options.js +2 -0
  73. package/dist/circuit-breaker/circuit-breaker-options.js.map +1 -0
  74. package/dist/circuit-breaker/circuit-breaker.d.ts +11 -0
  75. package/dist/circuit-breaker/circuit-breaker.d.ts.map +1 -0
  76. package/dist/circuit-breaker/circuit-breaker.js +27 -0
  77. package/dist/circuit-breaker/circuit-breaker.js.map +1 -0
  78. package/dist/circuit-breaker/circuit-state-change.d.ts +10 -0
  79. package/dist/circuit-breaker/circuit-state-change.d.ts.map +1 -0
  80. package/dist/circuit-breaker/circuit-state-change.js +2 -0
  81. package/dist/circuit-breaker/circuit-state-change.js.map +1 -0
  82. package/dist/circuit-breaker/circuit-state-gauge.d.ts +8 -0
  83. package/dist/circuit-breaker/circuit-state-gauge.d.ts.map +1 -0
  84. package/dist/circuit-breaker/circuit-state-gauge.js +14 -0
  85. package/dist/circuit-breaker/circuit-state-gauge.js.map +1 -0
  86. package/dist/circuit-breaker/circuit-state.d.ts +2 -0
  87. package/dist/circuit-breaker/circuit-state.d.ts.map +1 -0
  88. package/dist/circuit-breaker/circuit-state.js +2 -0
  89. package/dist/circuit-breaker/circuit-state.js.map +1 -0
  90. package/dist/circuit-breaker/circuit.d.ts +22 -0
  91. package/dist/circuit-breaker/circuit.d.ts.map +1 -0
  92. package/dist/circuit-breaker/circuit.js +79 -0
  93. package/dist/circuit-breaker/circuit.js.map +1 -0
  94. package/dist/decorators/async-method-decorator.d.ts +13 -0
  95. package/dist/decorators/async-method-decorator.d.ts.map +1 -0
  96. package/dist/decorators/async-method-decorator.js +2 -0
  97. package/dist/decorators/async-method-decorator.js.map +1 -0
  98. package/dist/decorators/bulkhead.d.ts +5 -0
  99. package/dist/decorators/bulkhead.d.ts.map +1 -0
  100. package/dist/decorators/bulkhead.js +7 -0
  101. package/dist/decorators/bulkhead.js.map +1 -0
  102. package/dist/decorators/cached.d.ts +5 -0
  103. package/dist/decorators/cached.d.ts.map +1 -0
  104. package/dist/decorators/cached.js +7 -0
  105. package/dist/decorators/cached.js.map +1 -0
  106. package/dist/decorators/circuit-breaker.d.ts +5 -0
  107. package/dist/decorators/circuit-breaker.d.ts.map +1 -0
  108. package/dist/decorators/circuit-breaker.js +7 -0
  109. package/dist/decorators/circuit-breaker.js.map +1 -0
  110. package/dist/decorators/decorator-of.d.ts +9 -0
  111. package/dist/decorators/decorator-of.d.ts.map +1 -0
  112. package/dist/decorators/decorator-of.js +43 -0
  113. package/dist/decorators/decorator-of.js.map +1 -0
  114. package/dist/decorators/logged.d.ts +5 -0
  115. package/dist/decorators/logged.d.ts.map +1 -0
  116. package/dist/decorators/logged.js +7 -0
  117. package/dist/decorators/logged.js.map +1 -0
  118. package/dist/decorators/retry.d.ts +5 -0
  119. package/dist/decorators/retry.d.ts.map +1 -0
  120. package/dist/decorators/retry.js +7 -0
  121. package/dist/decorators/retry.js.map +1 -0
  122. package/dist/decorators/timed.d.ts +5 -0
  123. package/dist/decorators/timed.d.ts.map +1 -0
  124. package/dist/decorators/timed.js +7 -0
  125. package/dist/decorators/timed.js.map +1 -0
  126. package/dist/decorators/timeout.d.ts +5 -0
  127. package/dist/decorators/timeout.d.ts.map +1 -0
  128. package/dist/decorators/timeout.js +7 -0
  129. package/dist/decorators/timeout.js.map +1 -0
  130. package/dist/decorators.d.ts +10 -0
  131. package/dist/decorators.d.ts.map +1 -0
  132. package/dist/decorators.js +9 -0
  133. package/dist/decorators.js.map +1 -0
  134. package/dist/di/aspects.d.ts +19 -0
  135. package/dist/di/aspects.d.ts.map +1 -0
  136. package/dist/di/aspects.js +22 -0
  137. package/dist/di/aspects.js.map +1 -0
  138. package/dist/errors/aspect-not-allowed-error.d.ts +6 -0
  139. package/dist/errors/aspect-not-allowed-error.d.ts.map +1 -0
  140. package/dist/errors/aspect-not-allowed-error.js +9 -0
  141. package/dist/errors/aspect-not-allowed-error.js.map +1 -0
  142. package/dist/errors/bulkhead-full-error.d.ts +7 -0
  143. package/dist/errors/bulkhead-full-error.d.ts.map +1 -0
  144. package/dist/errors/bulkhead-full-error.js +10 -0
  145. package/dist/errors/bulkhead-full-error.js.map +1 -0
  146. package/dist/errors/circuit-open-error.d.ts +11 -0
  147. package/dist/errors/circuit-open-error.d.ts.map +1 -0
  148. package/dist/errors/circuit-open-error.js +14 -0
  149. package/dist/errors/circuit-open-error.js.map +1 -0
  150. package/dist/errors/is-business-refusal.d.ts +3 -0
  151. package/dist/errors/is-business-refusal.d.ts.map +1 -0
  152. package/dist/errors/is-business-refusal.js +6 -0
  153. package/dist/errors/is-business-refusal.js.map +1 -0
  154. package/dist/errors/timeout-error.d.ts +8 -0
  155. package/dist/errors/timeout-error.d.ts.map +1 -0
  156. package/dist/errors/timeout-error.js +12 -0
  157. package/dist/errors/timeout-error.js.map +1 -0
  158. package/dist/index.d.ts +46 -0
  159. package/dist/index.d.ts.map +1 -0
  160. package/dist/index.js +30 -0
  161. package/dist/index.js.map +1 -0
  162. package/dist/observability/log-call.d.ts +13 -0
  163. package/dist/observability/log-call.d.ts.map +1 -0
  164. package/dist/observability/log-call.js +22 -0
  165. package/dist/observability/log-call.js.map +1 -0
  166. package/dist/observability/logged.d.ts +22 -0
  167. package/dist/observability/logged.d.ts.map +1 -0
  168. package/dist/observability/logged.js +38 -0
  169. package/dist/observability/logged.js.map +1 -0
  170. package/dist/observability/logging-middleware.d.ts +13 -0
  171. package/dist/observability/logging-middleware.d.ts.map +1 -0
  172. package/dist/observability/logging-middleware.js +16 -0
  173. package/dist/observability/logging-middleware.js.map +1 -0
  174. package/dist/observability/metrics-middleware.d.ts +10 -0
  175. package/dist/observability/metrics-middleware.d.ts.map +1 -0
  176. package/dist/observability/metrics-middleware.js +12 -0
  177. package/dist/observability/metrics-middleware.js.map +1 -0
  178. package/dist/observability/observed.d.ts +14 -0
  179. package/dist/observability/observed.d.ts.map +1 -0
  180. package/dist/observability/observed.js +27 -0
  181. package/dist/observability/observed.js.map +1 -0
  182. package/dist/observability/safely.d.ts +3 -0
  183. package/dist/observability/safely.d.ts.map +1 -0
  184. package/dist/observability/safely.js +10 -0
  185. package/dist/observability/safely.js.map +1 -0
  186. package/dist/observability/stdout-logger.d.ts +45 -0
  187. package/dist/observability/stdout-logger.d.ts.map +1 -0
  188. package/dist/observability/stdout-logger.js +85 -0
  189. package/dist/observability/stdout-logger.js.map +1 -0
  190. package/dist/observability/time-call.d.ts +10 -0
  191. package/dist/observability/time-call.d.ts.map +1 -0
  192. package/dist/observability/time-call.js +11 -0
  193. package/dist/observability/time-call.js.map +1 -0
  194. package/dist/observability/timed.d.ts +19 -0
  195. package/dist/observability/timed.d.ts.map +1 -0
  196. package/dist/observability/timed.js +33 -0
  197. package/dist/observability/timed.js.map +1 -0
  198. package/dist/retry/backoff.d.ts +12 -0
  199. package/dist/retry/backoff.d.ts.map +1 -0
  200. package/dist/retry/backoff.js +2 -0
  201. package/dist/retry/backoff.js.map +1 -0
  202. package/dist/retry/delay-before-retry.d.ts +4 -0
  203. package/dist/retry/delay-before-retry.d.ts.map +1 -0
  204. package/dist/retry/delay-before-retry.js +10 -0
  205. package/dist/retry/delay-before-retry.js.map +1 -0
  206. package/dist/retry/full-jitter.d.ts +7 -0
  207. package/dist/retry/full-jitter.d.ts.map +1 -0
  208. package/dist/retry/full-jitter.js +8 -0
  209. package/dist/retry/full-jitter.js.map +1 -0
  210. package/dist/retry/is-transient.d.ts +6 -0
  211. package/dist/retry/is-transient.d.ts.map +1 -0
  212. package/dist/retry/is-transient.js +11 -0
  213. package/dist/retry/is-transient.js.map +1 -0
  214. package/dist/retry/jitter.d.ts +3 -0
  215. package/dist/retry/jitter.d.ts.map +1 -0
  216. package/dist/retry/jitter.js +2 -0
  217. package/dist/retry/jitter.js.map +1 -0
  218. package/dist/retry/no-jitter.d.ts +3 -0
  219. package/dist/retry/no-jitter.d.ts.map +1 -0
  220. package/dist/retry/no-jitter.js +2 -0
  221. package/dist/retry/no-jitter.js.map +1 -0
  222. package/dist/retry/retry.d.ts +20 -0
  223. package/dist/retry/retry.d.ts.map +1 -0
  224. package/dist/retry/retry.js +38 -0
  225. package/dist/retry/retry.js.map +1 -0
  226. package/dist/runtime/aspect-runtime-error.d.ts +6 -0
  227. package/dist/runtime/aspect-runtime-error.d.ts.map +1 -0
  228. package/dist/runtime/aspect-runtime-error.js +9 -0
  229. package/dist/runtime/aspect-runtime-error.js.map +1 -0
  230. package/dist/runtime/aspect-runtime.d.ts +15 -0
  231. package/dist/runtime/aspect-runtime.d.ts.map +1 -0
  232. package/dist/runtime/aspect-runtime.js +2 -0
  233. package/dist/runtime/aspect-runtime.js.map +1 -0
  234. package/dist/runtime/cache-or.d.ts +3 -0
  235. package/dist/runtime/cache-or.d.ts.map +1 -0
  236. package/dist/runtime/cache-or.js +6 -0
  237. package/dist/runtime/cache-or.js.map +1 -0
  238. package/dist/runtime/clock-or.d.ts +3 -0
  239. package/dist/runtime/clock-or.d.ts.map +1 -0
  240. package/dist/runtime/clock-or.js +7 -0
  241. package/dist/runtime/clock-or.js.map +1 -0
  242. package/dist/runtime/installed-runtime.d.ts +8 -0
  243. package/dist/runtime/installed-runtime.d.ts.map +1 -0
  244. package/dist/runtime/installed-runtime.js +16 -0
  245. package/dist/runtime/installed-runtime.js.map +1 -0
  246. package/dist/runtime/logger-or.d.ts +3 -0
  247. package/dist/runtime/logger-or.d.ts.map +1 -0
  248. package/dist/runtime/logger-or.js +6 -0
  249. package/dist/runtime/logger-or.js.map +1 -0
  250. package/dist/runtime/metrics-or.d.ts +3 -0
  251. package/dist/runtime/metrics-or.d.ts.map +1 -0
  252. package/dist/runtime/metrics-or.js +6 -0
  253. package/dist/runtime/metrics-or.js.map +1 -0
  254. package/dist/runtime/missing-collaborator.d.ts +2 -0
  255. package/dist/runtime/missing-collaborator.d.ts.map +1 -0
  256. package/dist/runtime/missing-collaborator.js +5 -0
  257. package/dist/runtime/missing-collaborator.js.map +1 -0
  258. package/dist/runtime/scheduler-or.d.ts +3 -0
  259. package/dist/runtime/scheduler-or.d.ts.map +1 -0
  260. package/dist/runtime/scheduler-or.js +6 -0
  261. package/dist/runtime/scheduler-or.js.map +1 -0
  262. package/dist/runtime/scheduler.d.ts +7 -0
  263. package/dist/runtime/scheduler.d.ts.map +1 -0
  264. package/dist/runtime/scheduler.js +5 -0
  265. package/dist/runtime/scheduler.js.map +1 -0
  266. package/dist/runtime/system-scheduler.d.ts +3 -0
  267. package/dist/runtime/system-scheduler.d.ts.map +1 -0
  268. package/dist/runtime/system-scheduler.js +9 -0
  269. package/dist/runtime/system-scheduler.js.map +1 -0
  270. package/dist/state/state-for.d.ts +5 -0
  271. package/dist/state/state-for.d.ts.map +1 -0
  272. package/dist/state/state-for.js +17 -0
  273. package/dist/state/state-for.js.map +1 -0
  274. package/dist/state/state-scope.d.ts +3 -0
  275. package/dist/state/state-scope.d.ts.map +1 -0
  276. package/dist/state/state-scope.js +2 -0
  277. package/dist/state/state-scope.js.map +1 -0
  278. package/dist/testing/create-aspect-fakes.d.ts +13 -0
  279. package/dist/testing/create-aspect-fakes.d.ts.map +1 -0
  280. package/dist/testing/create-aspect-fakes.js +15 -0
  281. package/dist/testing/create-aspect-fakes.js.map +1 -0
  282. package/dist/testing/manual-scheduler.d.ts +14 -0
  283. package/dist/testing/manual-scheduler.d.ts.map +1 -0
  284. package/dist/testing/manual-scheduler.js +30 -0
  285. package/dist/testing/manual-scheduler.js.map +1 -0
  286. package/dist/testing/with-aspect-runtime.d.ts +8 -0
  287. package/dist/testing/with-aspect-runtime.d.ts.map +1 -0
  288. package/dist/testing/with-aspect-runtime.js +10 -0
  289. package/dist/testing/with-aspect-runtime.js.map +1 -0
  290. package/dist/testing.d.ts +4 -0
  291. package/dist/testing.d.ts.map +1 -0
  292. package/dist/testing.js +4 -0
  293. package/dist/testing.js.map +1 -0
  294. package/dist/timeout/timeout.d.ts +21 -0
  295. package/dist/timeout/timeout.d.ts.map +1 -0
  296. package/dist/timeout/timeout.js +42 -0
  297. package/dist/timeout/timeout.js.map +1 -0
  298. package/dist/weaving/advise-method.d.ts +7 -0
  299. package/dist/weaving/advise-method.d.ts.map +1 -0
  300. package/dist/weaving/advise-method.js +19 -0
  301. package/dist/weaving/advise-method.js.map +1 -0
  302. package/dist/weaving/advise-methods.d.ts +13 -0
  303. package/dist/weaving/advise-methods.d.ts.map +1 -0
  304. package/dist/weaving/advise-methods.js +119 -0
  305. package/dist/weaving/advise-methods.js.map +1 -0
  306. package/dist/weaving/advise-prototype-method.d.ts +8 -0
  307. package/dist/weaving/advise-prototype-method.d.ts.map +1 -0
  308. package/dist/weaving/advise-prototype-method.js +30 -0
  309. package/dist/weaving/advise-prototype-method.js.map +1 -0
  310. package/dist/weaving/advised.d.ts +6 -0
  311. package/dist/weaving/advised.d.ts.map +1 -0
  312. package/dist/weaving/advised.js +19 -0
  313. package/dist/weaving/advised.js.map +1 -0
  314. package/dist/weaving/from-outside.d.ts +10 -0
  315. package/dist/weaving/from-outside.d.ts.map +1 -0
  316. package/dist/weaving/from-outside.js +29 -0
  317. package/dist/weaving/from-outside.js.map +1 -0
  318. package/dist/weaving/is-wrappable.d.ts +3 -0
  319. package/dist/weaving/is-wrappable.d.ts.map +1 -0
  320. package/dist/weaving/is-wrappable.js +7 -0
  321. package/dist/weaving/is-wrappable.js.map +1 -0
  322. package/dist/weaving/known-async.d.ts +4 -0
  323. package/dist/weaving/known-async.d.ts.map +1 -0
  324. package/dist/weaving/known-async.js +3 -0
  325. package/dist/weaving/known-async.js.map +1 -0
  326. package/dist/weaving/lifecycle-hooks.d.ts +3 -0
  327. package/dist/weaving/lifecycle-hooks.d.ts.map +1 -0
  328. package/dist/weaving/lifecycle-hooks.js +9 -0
  329. package/dist/weaving/lifecycle-hooks.js.map +1 -0
  330. package/dist/weaving/method.d.ts +2 -0
  331. package/dist/weaving/method.d.ts.map +1 -0
  332. package/dist/weaving/method.js +2 -0
  333. package/dist/weaving/method.js.map +1 -0
  334. package/dist/weaving/named.d.ts +4 -0
  335. package/dist/weaving/named.d.ts.map +1 -0
  336. package/dist/weaving/named.js +7 -0
  337. package/dist/weaving/named.js.map +1 -0
  338. package/dist/weaving/shadowed.d.ts +4 -0
  339. package/dist/weaving/shadowed.d.ts.map +1 -0
  340. package/dist/weaving/shadowed.js +14 -0
  341. package/dist/weaving/shadowed.js.map +1 -0
  342. package/dist/weaving/site-of.d.ts +5 -0
  343. package/dist/weaving/site-of.d.ts.map +1 -0
  344. package/dist/weaving/site-of.js +15 -0
  345. package/dist/weaving/site-of.js.map +1 -0
  346. package/package.json +40 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-call.d.ts","sourceRoot":"","sources":["../../src/observability/log-call.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAI7E,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,8CAA8C;IAC9C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,sFAAsF;IACtF,QAAQ,CAAC,MAAM,EAAE,MAAM,SAAS,CAAC;CAClC;AAOD,0FAA0F;AAC1F,wBAAgB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAclF"}
@@ -0,0 +1,22 @@
1
+ import { observed } from './observed.js';
2
+ import { safely } from './safely.js';
3
+ /** The three entries of one call: started, then succeeded or failed with the duration. */
4
+ export function logCall(call, proceed) {
5
+ safely(() => {
6
+ write(call, 'debug', { word: 'started' });
7
+ });
8
+ return observed(call.clock, proceed, ({ durationMs, error, refused }) => {
9
+ if (error === undefined) {
10
+ write(call, call.level, { word: 'succeeded', fields: { durationMs } });
11
+ return;
12
+ }
13
+ write(call, refused ? 'warn' : 'error', { word: 'failed', fields: { durationMs, ...error } });
14
+ });
15
+ }
16
+ function write(call, level, outcome) {
17
+ if (!call.logger.isLevelEnabled(level)) {
18
+ return;
19
+ }
20
+ call.logger[level](`${call.operation} ${outcome.word}`, { ...call.fields(), ...outcome.fields });
21
+ }
22
+ //# sourceMappingURL=log-call.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-call.js","sourceRoot":"","sources":["../../src/observability/log-call.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAiBrC,0FAA0F;AAC1F,MAAM,UAAU,OAAO,CAAI,IAAgB,EAAE,OAAyB;IACpE,MAAM,CAAC,GAAG,EAAE;QACV,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE;QACtE,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;YAEvE,OAAO;QACT,CAAC;QAED,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,GAAG,KAAK,EAAE,EAAE,CAAC,CAAC;IAChG,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,KAAK,CAAC,IAAgB,EAAE,KAAe,EAAE,OAAgB;IAChE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;QACvC,OAAO;IACT,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;AACnG,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { Clock, LogFields, LogLevel, Logger } from '@ddd-ts-kit/kernel';
2
+ import type { AdviceFactory } from '../aspect/advice-factory.js';
3
+ import type { Aspect } from '../aspect/aspect.js';
4
+ export interface LoggedOptions {
5
+ /** Level of the entry written on success. Default `info`. The start entry is `debug`. */
6
+ readonly level?: LogLevel;
7
+ /** Added to every entry: static fields, or a function read at each entry that is written. Never call data. */
8
+ readonly fields?: LogFields | (() => LogFields);
9
+ /** Defaults to the logger of the aspect runtime. */
10
+ readonly logger?: Logger;
11
+ /** Defaults to the clock of the aspect runtime. */
12
+ readonly clock?: Clock;
13
+ }
14
+ /**
15
+ * Three entries per call: `<Class>.<method> started` (debug), then `succeeded` or `failed`
16
+ * with the duration. A failure carries the class of the error and its code, at `warn` for a
17
+ * business refusal and `error` for a fault. Never arguments, results or error messages, and
18
+ * nothing is built for an entry the logger would not write.
19
+ */
20
+ export declare function logged(options?: LoggedOptions): Aspect;
21
+ export declare function loggedAdvice(options?: LoggedOptions): AdviceFactory;
22
+ //# sourceMappingURL=logged.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logged.d.ts","sourceRoot":"","sources":["../../src/observability/logged.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAOlD,MAAM,WAAW,aAAa;IAC5B,yFAAyF;IACzF,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC;IAC1B,8GAA8G;IAC9G,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,GAAG,CAAC,MAAM,SAAS,CAAC,CAAC;IAChD,oDAAoD;IACpD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,mDAAmD;IACnD,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;CACxB;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,OAAO,GAAE,aAAkB,GAAG,MAAM,CAE1D;AAED,wBAAgB,YAAY,CAAC,OAAO,GAAE,aAAkB,GAAG,aAAa,CAiBvE"}
@@ -0,0 +1,38 @@
1
+ import { defineAspect } from '../aspect/define-aspect.js';
2
+ import { clockOr } from '../runtime/clock-or.js';
3
+ import { loggerOr } from '../runtime/logger-or.js';
4
+ import { logCall } from './log-call.js';
5
+ /**
6
+ * Three entries per call: `<Class>.<method> started` (debug), then `succeeded` or `failed`
7
+ * with the duration. A failure carries the class of the error and its code, at `warn` for a
8
+ * business refusal and `error` for a fault. Never arguments, results or error messages, and
9
+ * nothing is built for an entry the logger would not write.
10
+ */
11
+ export function logged(options = {}) {
12
+ return defineAspect(loggedAdvice(options));
13
+ }
14
+ export function loggedAdvice(options = {}) {
15
+ return (joinPoint) => {
16
+ const operation = `${joinPoint.className}.${joinPoint.method}`;
17
+ const subject = subjectFields(joinPoint);
18
+ return ({ proceed }) => logCall({
19
+ logger: loggerOr(options.logger),
20
+ clock: clockOr(options.clock),
21
+ level: options.level ?? 'info',
22
+ operation,
23
+ fields: () => ({ ...subject, ...extraFields(options) }),
24
+ }, proceed);
25
+ };
26
+ }
27
+ function subjectFields(joinPoint) {
28
+ return {
29
+ class: joinPoint.className,
30
+ method: joinPoint.method,
31
+ ...(joinPoint.kind === undefined ? {} : { kind: joinPoint.kind }),
32
+ ...(joinPoint.context === undefined ? {} : { context: joinPoint.context }),
33
+ };
34
+ }
35
+ function extraFields(options) {
36
+ return typeof options.fields === 'function' ? options.fields() : (options.fields ?? {});
37
+ }
38
+ //# sourceMappingURL=logged.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logged.js","sourceRoot":"","sources":["../../src/observability/logged.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAaxC;;;;;GAKG;AACH,MAAM,UAAU,MAAM,CAAC,OAAO,GAAkB,EAAE;IAChD,OAAO,YAAY,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAO,GAAkB,EAAE;IACtD,OAAO,CAAC,SAAS,EAAE,EAAE;QACnB,MAAM,SAAS,GAAG,GAAG,SAAS,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;QAC/D,MAAM,OAAO,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;QAEzC,OAAO,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CACrB,OAAO,CACL;YACE,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC;YAChC,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;YAC7B,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,MAAM;YAC9B,SAAS;YACT,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,GAAG,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;SACxD,EACD,OAAO,CACR,CAAC;IACN,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,SAAoB;IACzC,OAAO;QACL,KAAK,EAAE,SAAS,CAAC,SAAS;QAC1B,MAAM,EAAE,SAAS,CAAC,MAAM;QACxB,GAAG,CAAC,SAAS,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC;QACjE,GAAG,CAAC,SAAS,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC;KAC3E,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,OAAsB;IACzC,OAAO,OAAO,OAAO,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;AAC1F,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { BusMiddleware, Clock, LogLevel, Logger } from '@ddd-ts-kit/kernel';
2
+ export interface LoggingMiddlewareOptions {
3
+ /** Level of the entry written on success. Default `info`. */
4
+ readonly level?: LogLevel;
5
+ /** Defaults to the clock of the aspect runtime, then to the system clock. */
6
+ readonly clock?: Clock;
7
+ }
8
+ /**
9
+ * `logged` for use cases: the same three entries around every command and query, named after
10
+ * the message class, with `messageKind`. Never the content of the message or of the answer.
11
+ */
12
+ export declare function loggingMiddleware(logger: Logger, options?: LoggingMiddlewareOptions): BusMiddleware;
13
+ //# sourceMappingURL=logging-middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging-middleware.d.ts","sourceRoot":"","sources":["../../src/observability/logging-middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAIjF,MAAM,WAAW,wBAAwB;IACvC,6DAA6D;IAC7D,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC;IAC1B,6EAA6E;IAC7E,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,wBAA6B,GAAG,aAAa,CAYvG"}
@@ -0,0 +1,16 @@
1
+ import { clockOr } from '../runtime/clock-or.js';
2
+ import { logCall } from './log-call.js';
3
+ /**
4
+ * `logged` for use cases: the same three entries around every command and query, named after
5
+ * the message class, with `messageKind`. Never the content of the message or of the answer.
6
+ */
7
+ export function loggingMiddleware(logger, options = {}) {
8
+ return (_message, next, info) => logCall({
9
+ logger,
10
+ clock: clockOr(options.clock),
11
+ level: options.level ?? 'info',
12
+ operation: `${info.kind} ${info.name}`,
13
+ fields: () => ({ message: info.name, messageKind: info.kind }),
14
+ }, next);
15
+ }
16
+ //# sourceMappingURL=logging-middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging-middleware.js","sourceRoot":"","sources":["../../src/observability/logging-middleware.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AASxC;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAc,EAAE,OAAO,GAA6B,EAAE;IACtF,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAC9B,OAAO,CACL;QACE,MAAM;QACN,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;QAC7B,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,MAAM;QAC9B,SAAS,EAAE,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE;QACtC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;KAC/D,EACD,IAAI,CACL,CAAC;AACN,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { BusMiddleware, Clock, Metrics } from '@ddd-ts-kit/kernel';
2
+ export interface MetricsMiddlewareOptions {
3
+ /** Prefix of the two series: `<name>_duration_ms` and `<name>_total`. Default `use_case`. */
4
+ readonly name?: string;
5
+ /** Defaults to the clock of the aspect runtime, then to the system clock. */
6
+ readonly clock?: Clock;
7
+ }
8
+ /** `timed` for use cases: duration and outcome of every command and query, labelled `message` and `kind`. */
9
+ export declare function metricsMiddleware(metrics: Metrics, options?: MetricsMiddlewareOptions): BusMiddleware;
10
+ //# sourceMappingURL=metrics-middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics-middleware.d.ts","sourceRoot":"","sources":["../../src/observability/metrics-middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAIxE,MAAM,WAAW,wBAAwB;IACvC,6FAA6F;IAC7F,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,6EAA6E;IAC7E,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;CACxB;AAED,6GAA6G;AAC7G,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,GAAE,wBAA6B,GAAG,aAAa,CAWzG"}
@@ -0,0 +1,12 @@
1
+ import { clockOr } from '../runtime/clock-or.js';
2
+ import { timeCall } from './time-call.js';
3
+ /** `timed` for use cases: duration and outcome of every command and query, labelled `message` and `kind`. */
4
+ export function metricsMiddleware(metrics, options = {}) {
5
+ return (_message, next, info) => timeCall({
6
+ metrics,
7
+ clock: clockOr(options.clock),
8
+ name: options.name ?? 'use_case',
9
+ labels: { message: info.name, kind: info.kind },
10
+ }, next);
11
+ }
12
+ //# sourceMappingURL=metrics-middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics-middleware.js","sourceRoot":"","sources":["../../src/observability/metrics-middleware.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAS1C,6GAA6G;AAC7G,MAAM,UAAU,iBAAiB,CAAC,OAAgB,EAAE,OAAO,GAA6B,EAAE;IACxF,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAC9B,QAAQ,CACN;QACE,OAAO;QACP,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;QAC7B,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,UAAU;QAChC,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;KAChD,EACD,IAAI,CACL,CAAC;AACN,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { type Clock, type ErrorIdentity } from '@ddd-ts-kit/kernel';
2
+ export interface CallOutcome {
3
+ readonly durationMs: number;
4
+ /** Present when the call failed. */
5
+ readonly error?: ErrorIdentity;
6
+ /** True when the failure is a business refusal rather than a fault. */
7
+ readonly refused: boolean;
8
+ }
9
+ /**
10
+ * Runs the call and reports how it went, once. The result and the error pass through
11
+ * untouched; a report that throws never changes the outcome of the call.
12
+ */
13
+ export declare function observed<T>(clock: Clock, call: () => Promise<T>, report: (outcome: CallOutcome) => void): Promise<T>;
14
+ //# sourceMappingURL=observed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observed.d.ts","sourceRoot":"","sources":["../../src/observability/observed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,KAAK,EAAE,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAInF,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,oCAAoC;IACpC,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC;IAC/B,uEAAuE;IACvE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,CAAC,EAC9B,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACtB,MAAM,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,GACrC,OAAO,CAAC,CAAC,CAAC,CAsBZ"}
@@ -0,0 +1,27 @@
1
+ import { identifyError } from '@ddd-ts-kit/kernel';
2
+ import { isBusinessRefusal } from '../errors/is-business-refusal.js';
3
+ import { safely } from './safely.js';
4
+ /**
5
+ * Runs the call and reports how it went, once. The result and the error pass through
6
+ * untouched; a report that throws never changes the outcome of the call.
7
+ */
8
+ export async function observed(clock, call, report) {
9
+ const startedAt = clock.now().getTime();
10
+ const elapsed = () => clock.now().getTime() - startedAt;
11
+ let result;
12
+ try {
13
+ result = await call();
14
+ }
15
+ catch (error) {
16
+ const outcome = { durationMs: elapsed(), error: identifyError(error), refused: isBusinessRefusal(error) };
17
+ safely(() => {
18
+ report(outcome);
19
+ });
20
+ throw error;
21
+ }
22
+ safely(() => {
23
+ report({ durationMs: elapsed(), refused: false });
24
+ });
25
+ return result;
26
+ }
27
+ //# sourceMappingURL=observed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observed.js","sourceRoot":"","sources":["../../src/observability/observed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAkC,MAAM,oBAAoB,CAAC;AACnF,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAUrC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,KAAY,EACZ,IAAsB,EACtB,MAAsC;IAEtC,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IACxC,MAAM,OAAO,GAAG,GAAW,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,GAAG,SAAS,CAAC;IAChE,IAAI,MAAS,CAAC;IAEd,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;IACxB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;QAE1G,MAAM,CAAC,GAAG,EAAE;YACV,MAAM,CAAC,OAAO,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,MAAM,KAAK,CAAC;IACd,CAAC;IAED,MAAM,CAAC,GAAG,EAAE;QACV,MAAM,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Observation must never break what it observes. */
2
+ export declare function safely(act: () => void): void;
3
+ //# sourceMappingURL=safely.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safely.d.ts","sourceRoot":"","sources":["../../src/observability/safely.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,IAAI,GAAG,IAAI,CAM5C"}
@@ -0,0 +1,10 @@
1
+ /** Observation must never break what it observes. */
2
+ export function safely(act) {
3
+ try {
4
+ act();
5
+ }
6
+ catch {
7
+ return;
8
+ }
9
+ }
10
+ //# sourceMappingURL=safely.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safely.js","sourceRoot":"","sources":["../../src/observability/safely.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,MAAM,UAAU,MAAM,CAAC,GAAe;IACpC,IAAI,CAAC;QACH,GAAG,EAAE,CAAC;IACR,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;AACH,CAAC"}
@@ -0,0 +1,45 @@
1
+ import { type Clock, type LogFields, type LogLevel, type Logger } from '@ddd-ts-kit/kernel';
2
+ export interface StdoutLoggerOptions {
3
+ /** Entries below it are not written. Default `info`. */
4
+ readonly level?: LogLevel;
5
+ /**
6
+ * Read at each entry: correlation fields of the work in progress, such as the trace ids of
7
+ * the tracing package or `logFieldsOf` of the current execution context.
8
+ */
9
+ readonly fields?: () => LogFields;
10
+ /** Added to every entry: service name, version, environment. */
11
+ readonly base?: LogFields;
12
+ /**
13
+ * Writes `SCRUBBED_MESSAGE` for the message of every logged error that is not a
14
+ * `DomainError`. Default `false`: see "StdoutLogger" in the README for the trade-off.
15
+ */
16
+ readonly scrubMessages?: boolean;
17
+ /** Defaults to the clock of the aspect runtime, then to the system clock. */
18
+ readonly clock?: Clock;
19
+ /** Receives each line, newline included. Defaults to the standard output. */
20
+ readonly write?: (line: string) => void;
21
+ }
22
+ /**
23
+ * The `Logger` port as JSON lines: one object per entry with `time`, `level`, `message`, then
24
+ * the fields. What a container platform collects as it is.
25
+ */
26
+ export declare class StdoutLogger implements Logger {
27
+ private readonly options;
28
+ constructor(options?: StdoutLoggerOptions);
29
+ debug(message: string, fields?: LogFields): void;
30
+ info(message: string, fields?: LogFields): void;
31
+ warn(message: string, fields?: LogFields): void;
32
+ error(message: string, fields?: LogFields): void;
33
+ child(fields: LogFields): StdoutLogger;
34
+ isLevelEnabled(level: LogLevel): boolean;
35
+ /**
36
+ * Resolves once the standard output took every line written so far; at once with a `write`
37
+ * of the project, which is called before each log call returns. The logger stays usable.
38
+ */
39
+ flush(): Promise<void>;
40
+ private writeEntry;
41
+ private serialized;
42
+ private ambientFields;
43
+ private boundWith;
44
+ }
45
+ //# sourceMappingURL=stdout-logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdout-logger.d.ts","sourceRoot":"","sources":["../../src/observability/stdout-logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,KAAK,EACV,KAAK,SAAS,EACd,KAAK,QAAQ,EACb,KAAK,MAAM,EACZ,MAAM,oBAAoB,CAAC;AAG5B,MAAM,WAAW,mBAAmB;IAClC,wDAAwD;IACxD,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC;IAC1B;;;OAGG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,SAAS,CAAC;IAClC,gEAAgE;IAChE,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC;IAC1B;;;OAGG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,6EAA6E;IAC7E,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;IACvB,6EAA6E;IAC7E,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAQD;;;GAGG;AACH,qBAAa,YAAa,YAAW,MAAM;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAApC,YAA6B,OAAO,GAAE,mBAAwB,EAAI;IAElE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,GAAG,IAAI,CAE/C;IAED,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,GAAG,IAAI,CAE9C;IAED,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,GAAG,IAAI,CAE9C;IAED,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,GAAG,IAAI,CAE/C;IAED,KAAK,CAAC,MAAM,EAAE,SAAS,GAAG,YAAY,CAErC;IAED,cAAc,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAEvC;IAED;;;OAGG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAcrB;IAED,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,SAAS;CAOlB"}
@@ -0,0 +1,85 @@
1
+ import { LOG_LEVELS, UNWRITABLE_FIELDS, describeErrorFields, } from '@ddd-ts-kit/kernel';
2
+ import { clockOr } from '../runtime/clock-or.js';
3
+ /**
4
+ * The `Logger` port as JSON lines: one object per entry with `time`, `level`, `message`, then
5
+ * the fields. What a container platform collects as it is.
6
+ */
7
+ export class StdoutLogger {
8
+ options;
9
+ constructor(options = {}) {
10
+ this.options = options;
11
+ }
12
+ debug(message, fields) {
13
+ this.writeEntry('debug', message, fields);
14
+ }
15
+ info(message, fields) {
16
+ this.writeEntry('info', message, fields);
17
+ }
18
+ warn(message, fields) {
19
+ this.writeEntry('warn', message, fields);
20
+ }
21
+ error(message, fields) {
22
+ this.writeEntry('error', message, fields);
23
+ }
24
+ child(fields) {
25
+ return new StdoutLogger({ ...this.options, base: this.boundWith(fields) });
26
+ }
27
+ isLevelEnabled(level) {
28
+ return LOG_LEVELS.indexOf(level) >= LOG_LEVELS.indexOf(this.options.level ?? 'info');
29
+ }
30
+ /**
31
+ * Resolves once the standard output took every line written so far; at once with a `write`
32
+ * of the project, which is called before each log call returns. The logger stays usable.
33
+ */
34
+ flush() {
35
+ if (this.options.write !== undefined) {
36
+ return Promise.resolve();
37
+ }
38
+ return new Promise((resolve) => {
39
+ try {
40
+ process.stdout.write('', () => {
41
+ resolve();
42
+ });
43
+ }
44
+ catch {
45
+ resolve();
46
+ }
47
+ });
48
+ }
49
+ writeEntry(level, message, fields = {}) {
50
+ if (!this.isLevelEnabled(level)) {
51
+ return;
52
+ }
53
+ const header = { time: clockOr(this.options.clock).now().toISOString(), level, message };
54
+ (this.options.write ?? writeToStdout)(`${this.serialized(header, fields)}\n`);
55
+ }
56
+ serialized(header, fields) {
57
+ try {
58
+ const written = describeErrorFields({ ...this.options.base, ...this.ambientFields(), ...fields }, this.options);
59
+ return JSON.stringify({ ...header, ...written, ...header });
60
+ }
61
+ catch {
62
+ return JSON.stringify({ ...header, ...UNWRITABLE_FIELDS });
63
+ }
64
+ }
65
+ ambientFields() {
66
+ try {
67
+ return this.options.fields?.() ?? {};
68
+ }
69
+ catch {
70
+ return {};
71
+ }
72
+ }
73
+ boundWith(fields) {
74
+ try {
75
+ return { ...this.options.base, ...fields };
76
+ }
77
+ catch {
78
+ return { ...this.options.base, ...UNWRITABLE_FIELDS };
79
+ }
80
+ }
81
+ }
82
+ function writeToStdout(line) {
83
+ process.stdout.write(line);
84
+ }
85
+ //# sourceMappingURL=stdout-logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdout-logger.js","sourceRoot":"","sources":["../../src/observability/stdout-logger.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,mBAAmB,GAKpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AA6BjD;;;GAGG;AACH,MAAM,OAAO,YAAY;IACM,OAAO;IAApC,YAA6B,OAAO,GAAwB,EAAE;uBAAjC,OAAO;IAA6B,CAAC;IAElE,KAAK,CAAC,OAAe,EAAE,MAAkB;QACvC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,MAAkB;QACtC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,MAAkB;QACtC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,MAAkB;QACvC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,MAAiB;QACrB,OAAO,IAAI,YAAY,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,cAAc,CAAC,KAAe;QAC5B,OAAO,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,CAAC;IACvF,CAAC;IAED;;;OAGG;IACH,KAAK;QACH,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACrC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC3B,CAAC;QAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,IAAI,CAAC;gBACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE;oBAC5B,OAAO,EAAE,CAAC;gBACZ,CAAC,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,UAAU,CAAC,KAAe,EAAE,OAAe,EAAE,MAAM,GAAc,EAAE;QACzE,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAEzF,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,aAAa,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAChF,CAAC;IAEO,UAAU,CAAC,MAAc,EAAE,MAAiB;QAClD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,mBAAmB,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,EAAE,GAAG,MAAM,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAEhH,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,MAAM,EAAE,GAAG,OAAO,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;QAC9D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,MAAM,EAAE,GAAG,iBAAiB,EAAE,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAEO,aAAa;QACnB,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,SAAS,CAAC,MAAiB;QACjC,IAAI,CAAC;YACH,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,iBAAiB,EAAE,CAAC;QACxD,CAAC;IACH,CAAC;CACF;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { Clock, MetricLabels, Metrics } from '@ddd-ts-kit/kernel';
2
+ export interface TimedCall {
3
+ readonly metrics: Metrics;
4
+ readonly clock: Clock;
5
+ readonly name: string;
6
+ readonly labels: MetricLabels;
7
+ }
8
+ /** The duration and the outcome of one call, in the two series named after `name`. */
9
+ export declare function timeCall<T>(call: TimedCall, proceed: () => Promise<T>): Promise<T>;
10
+ //# sourceMappingURL=time-call.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time-call.d.ts","sourceRoot":"","sources":["../../src/observability/time-call.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAGvE,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;CAC/B;AAED,sFAAsF;AACtF,wBAAgB,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CASlF"}
@@ -0,0 +1,11 @@
1
+ import { observed } from './observed.js';
2
+ /** The duration and the outcome of one call, in the two series named after `name`. */
3
+ export function timeCall(call, proceed) {
4
+ const { metrics, name, labels } = call;
5
+ return observed(call.clock, proceed, ({ durationMs, error }) => {
6
+ const outcome = error === undefined ? 'success' : 'failure';
7
+ metrics.histogram(`${name}_duration_ms`).record(durationMs, { ...labels, outcome });
8
+ metrics.counter(`${name}_total`).increment({ ...labels, outcome, error_code: error?.errorCode });
9
+ });
10
+ }
11
+ //# sourceMappingURL=time-call.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time-call.js","sourceRoot":"","sources":["../../src/observability/time-call.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AASzC,sFAAsF;AACtF,MAAM,UAAU,QAAQ,CAAI,IAAe,EAAE,OAAyB;IACpE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAEvC,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE;QAC7D,MAAM,OAAO,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QAE5D,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI,cAAc,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;QACpF,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,QAAQ,CAAC,CAAC,SAAS,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IACnG,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { Clock, Metrics } from '@ddd-ts-kit/kernel';
2
+ import type { AdviceFactory } from '../aspect/advice-factory.js';
3
+ import type { Aspect } from '../aspect/aspect.js';
4
+ export interface TimedOptions {
5
+ /** Prefix of the two series: `<name>_duration_ms` and `<name>_total`. Default `dependency_call`. */
6
+ readonly name?: string;
7
+ /** Defaults to the metrics of the aspect runtime. */
8
+ readonly metrics?: Metrics;
9
+ /** Defaults to the clock of the aspect runtime. */
10
+ readonly clock?: Clock;
11
+ }
12
+ /**
13
+ * Per call: a duration in the histogram `<name>_duration_ms` and one in the counter
14
+ * `<name>_total`, labelled `class`, `method`, `kind`, `context`, `outcome`, and `error_code`
15
+ * on a failure that has one. Labels are names from the code, never values of a call.
16
+ */
17
+ export declare function timed(options?: TimedOptions): Aspect;
18
+ export declare function timedAdvice(options?: TimedOptions): AdviceFactory;
19
+ //# sourceMappingURL=timed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timed.d.ts","sourceRoot":"","sources":["../../src/observability/timed.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAgB,OAAO,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAOlD,MAAM,WAAW,YAAY;IAC3B,oGAAoG;IACpG,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,qDAAqD;IACrD,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,mDAAmD;IACnD,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;CACxB;AAID;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,OAAO,GAAE,YAAiB,GAAG,MAAM,CAExD;AAED,wBAAgB,WAAW,CAAC,OAAO,GAAE,YAAiB,GAAG,aAAa,CAerE"}
@@ -0,0 +1,33 @@
1
+ import { defineAspect } from '../aspect/define-aspect.js';
2
+ import { clockOr } from '../runtime/clock-or.js';
3
+ import { metricsOr } from '../runtime/metrics-or.js';
4
+ import { timeCall } from './time-call.js';
5
+ const DEFAULT_NAME = 'dependency_call';
6
+ /**
7
+ * Per call: a duration in the histogram `<name>_duration_ms` and one in the counter
8
+ * `<name>_total`, labelled `class`, `method`, `kind`, `context`, `outcome`, and `error_code`
9
+ * on a failure that has one. Labels are names from the code, never values of a call.
10
+ */
11
+ export function timed(options = {}) {
12
+ return defineAspect(timedAdvice(options));
13
+ }
14
+ export function timedAdvice(options = {}) {
15
+ return (joinPoint) => {
16
+ const labels = subjectLabels(joinPoint);
17
+ return ({ proceed }) => timeCall({
18
+ metrics: metricsOr(options.metrics),
19
+ clock: clockOr(options.clock),
20
+ name: options.name ?? DEFAULT_NAME,
21
+ labels,
22
+ }, proceed);
23
+ };
24
+ }
25
+ function subjectLabels(joinPoint) {
26
+ return {
27
+ class: joinPoint.className,
28
+ method: joinPoint.method,
29
+ kind: joinPoint.kind,
30
+ context: joinPoint.context,
31
+ };
32
+ }
33
+ //# sourceMappingURL=timed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timed.js","sourceRoot":"","sources":["../../src/observability/timed.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAW1C,MAAM,YAAY,GAAG,iBAAiB,CAAC;AAEvC;;;;GAIG;AACH,MAAM,UAAU,KAAK,CAAC,OAAO,GAAiB,EAAE;IAC9C,OAAO,YAAY,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAO,GAAiB,EAAE;IACpD,OAAO,CAAC,SAAS,EAAE,EAAE;QACnB,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;QAExC,OAAO,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CACrB,QAAQ,CACN;YACE,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC;YACnC,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;YAC7B,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,YAAY;YAClC,MAAM;SACP,EACD,OAAO,CACR,CAAC;IACN,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,SAAoB;IACzC,OAAO;QACL,KAAK,EAAE,SAAS,CAAC,SAAS;QAC1B,MAAM,EAAE,SAAS,CAAC,MAAM;QACxB,IAAI,EAAE,SAAS,CAAC,IAAI;QACpB,OAAO,EAAE,SAAS,CAAC,OAAO;KAC3B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { Jitter } from './jitter.js';
2
+ export interface Backoff {
3
+ /** Delay before the first retry. */
4
+ readonly baseMs: number;
5
+ /** Multiplies the delay at each retry. Default 2. */
6
+ readonly factor?: number;
7
+ /** The delay never exceeds it. Default 30 seconds. */
8
+ readonly maxMs?: number;
9
+ /** Default `fullJitter()`. */
10
+ readonly jitter?: Jitter;
11
+ }
12
+ //# sourceMappingURL=backoff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backoff.d.ts","sourceRoot":"","sources":["../../src/retry/backoff.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,WAAW,OAAO;IACtB,oCAAoC;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,qDAAqD;IACrD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,sDAAsD;IACtD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,8BAA8B;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=backoff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backoff.js","sourceRoot":"","sources":["../../src/retry/backoff.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ import type { Backoff } from './backoff.js';
2
+ /** The delay waited after the failed attempt of that number, the first being 1. */
3
+ export declare function delayBeforeRetry(attempt: number, backoff: Backoff): number;
4
+ //# sourceMappingURL=delay-before-retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delay-before-retry.d.ts","sourceRoot":"","sources":["../../src/retry/delay-before-retry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAM5C,mFAAmF;AACnF,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAK1E"}
@@ -0,0 +1,10 @@
1
+ import { fullJitter } from './full-jitter.js';
2
+ const DEFAULT_FACTOR = 2;
3
+ const DEFAULT_MAX_MS = 30_000;
4
+ /** The delay waited after the failed attempt of that number, the first being 1. */
5
+ export function delayBeforeRetry(attempt, backoff) {
6
+ const exponential = backoff.baseMs * (backoff.factor ?? DEFAULT_FACTOR) ** (attempt - 1);
7
+ const capped = Math.min(exponential, backoff.maxMs ?? DEFAULT_MAX_MS);
8
+ return Math.max(0, (backoff.jitter ?? fullJitter())(capped, attempt));
9
+ }
10
+ //# sourceMappingURL=delay-before-retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delay-before-retry.js","sourceRoot":"","sources":["../../src/retry/delay-before-retry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,cAAc,GAAG,CAAC,CAAC;AACzB,MAAM,cAAc,GAAG,MAAM,CAAC;AAE9B,mFAAmF;AACnF,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAE,OAAgB;IAChE,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,cAAc,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;IACzF,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,KAAK,IAAI,cAAc,CAAC,CAAC;IAEtE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,IAAI,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AACxE,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { Jitter } from './jitter.js';
2
+ /**
3
+ * A delay anywhere between zero and the computed one, so that callers failing together do not
4
+ * retry together. Give a seeded `random` to make it deterministic.
5
+ */
6
+ export declare function fullJitter(random?: () => number): Jitter;
7
+ //# sourceMappingURL=full-jitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"full-jitter.d.ts","sourceRoot":"","sources":["../../src/retry/full-jitter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,GAAE,MAAM,MAAoB,GAAG,MAAM,CAErE"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * A delay anywhere between zero and the computed one, so that callers failing together do not
3
+ * retry together. Give a seeded `random` to make it deterministic.
4
+ */
5
+ export function fullJitter(random = Math.random) {
6
+ return (delayMs) => random() * delayMs;
7
+ }
8
+ //# sourceMappingURL=full-jitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"full-jitter.js","sourceRoot":"","sources":["../../src/retry/full-jitter.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,MAAM,GAAiB,IAAI,CAAC,MAAM;IAC3D,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC;AACzC,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Worth another attempt: anything but a business refusal and the two refusals of this package
3
+ * that protect a dependency (an open circuit, a full bulkhead).
4
+ */
5
+ export declare function isTransient(error: unknown): boolean;
6
+ //# sourceMappingURL=is-transient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-transient.d.ts","sourceRoot":"","sources":["../../src/retry/is-transient.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAEnD"}
@@ -0,0 +1,11 @@
1
+ import { BulkheadFullError } from '../errors/bulkhead-full-error.js';
2
+ import { CircuitOpenError } from '../errors/circuit-open-error.js';
3
+ import { isBusinessRefusal } from '../errors/is-business-refusal.js';
4
+ /**
5
+ * Worth another attempt: anything but a business refusal and the two refusals of this package
6
+ * that protect a dependency (an open circuit, a full bulkhead).
7
+ */
8
+ export function isTransient(error) {
9
+ return !(isBusinessRefusal(error) || error instanceof CircuitOpenError || error instanceof BulkheadFullError);
10
+ }
11
+ //# sourceMappingURL=is-transient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-transient.js","sourceRoot":"","sources":["../../src/retry/is-transient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAErE;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,OAAO,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,KAAK,YAAY,gBAAgB,IAAI,KAAK,YAAY,iBAAiB,CAAC,CAAC;AAChH,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Turns the computed delay before a retry into the one that is waited. */
2
+ export type Jitter = (delayMs: number, attempt: number) => number;
3
+ //# sourceMappingURL=jitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jitter.d.ts","sourceRoot":"","sources":["../../src/retry/jitter.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,MAAM,MAAM,MAAM,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=jitter.js.map