semola 0.5.3 → 0.6.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 (367) hide show
  1. package/README.md +18 -45
  2. package/dist/chunk-CKQMccvm.cjs +28 -0
  3. package/dist/lib/api/index.cjs +536 -4
  4. package/dist/lib/api/index.d.cts +270 -4
  5. package/dist/lib/api/index.d.mts +270 -4
  6. package/dist/lib/api/index.mjs +534 -2
  7. package/dist/lib/cache/index.cjs +47 -22
  8. package/dist/lib/cache/index.d.cts +14 -23
  9. package/dist/lib/cache/index.d.mts +14 -23
  10. package/dist/lib/cache/index.mjs +48 -25
  11. package/dist/lib/cron/index.cjs +734 -12
  12. package/dist/lib/cron/index.d.cts +145 -3
  13. package/dist/lib/cron/index.d.mts +145 -3
  14. package/dist/lib/cron/index.mjs +725 -3
  15. package/dist/lib/errors/index.d.cts +4 -4
  16. package/dist/lib/errors/index.d.mts +4 -4
  17. package/dist/lib/errors/index.mjs +0 -2
  18. package/dist/lib/i18n/index.d.cts +12 -4
  19. package/dist/lib/i18n/index.d.mts +12 -4
  20. package/dist/lib/i18n/index.mjs +0 -2
  21. package/dist/lib/logging/index.cjs +387 -17
  22. package/dist/lib/logging/index.d.cts +107 -6
  23. package/dist/lib/logging/index.d.mts +107 -6
  24. package/dist/lib/logging/index.mjs +373 -4
  25. package/dist/lib/orm/index.cjs +1641 -19
  26. package/dist/lib/orm/index.d.cts +402 -7
  27. package/dist/lib/orm/index.d.mts +402 -7
  28. package/dist/lib/orm/index.mjs +1630 -6
  29. package/dist/lib/policy/index.cjs +206 -20
  30. package/dist/lib/policy/index.d.cts +61 -5
  31. package/dist/lib/policy/index.d.mts +61 -5
  32. package/dist/lib/policy/index.mjs +187 -3
  33. package/dist/lib/prompts/index.cjs +374 -14
  34. package/dist/lib/prompts/index.d.cts +73 -29
  35. package/dist/lib/prompts/index.d.mts +73 -29
  36. package/dist/lib/prompts/index.mjs +361 -4
  37. package/dist/lib/pubsub/index.cjs +43 -19
  38. package/dist/lib/pubsub/index.d.cts +12 -22
  39. package/dist/lib/pubsub/index.d.mts +12 -22
  40. package/dist/lib/pubsub/index.mjs +44 -22
  41. package/dist/lib/queue/index.cjs +40 -10
  42. package/dist/lib/queue/index.d.cts +57 -8
  43. package/dist/lib/queue/index.d.mts +57 -8
  44. package/dist/lib/queue/index.mjs +39 -13
  45. package/dist/lib/workflow/index.cjs +285 -282
  46. package/dist/lib/workflow/index.d.cts +147 -4
  47. package/dist/lib/workflow/index.d.mts +147 -4
  48. package/dist/lib/workflow/index.mjs +278 -286
  49. package/package.json +11 -1
  50. package/dist/api/core/index.cjs +0 -206
  51. package/dist/api/core/index.d.cts +0 -21
  52. package/dist/api/core/index.d.cts.map +0 -1
  53. package/dist/api/core/index.d.mts +0 -21
  54. package/dist/api/core/index.d.mts.map +0 -1
  55. package/dist/api/core/index.mjs +0 -208
  56. package/dist/api/core/index.mjs.map +0 -1
  57. package/dist/api/core/types.d.cts +0 -107
  58. package/dist/api/core/types.d.cts.map +0 -1
  59. package/dist/api/core/types.d.mts +0 -107
  60. package/dist/api/core/types.d.mts.map +0 -1
  61. package/dist/api/middleware/index.cjs +0 -8
  62. package/dist/api/middleware/index.d.cts +0 -11
  63. package/dist/api/middleware/index.d.cts.map +0 -1
  64. package/dist/api/middleware/index.d.mts +0 -11
  65. package/dist/api/middleware/index.d.mts.map +0 -1
  66. package/dist/api/middleware/index.mjs +0 -10
  67. package/dist/api/middleware/index.mjs.map +0 -1
  68. package/dist/api/middleware/types.d.cts +0 -16
  69. package/dist/api/middleware/types.d.cts.map +0 -1
  70. package/dist/api/middleware/types.d.mts +0 -16
  71. package/dist/api/middleware/types.d.mts.map +0 -1
  72. package/dist/api/openapi/index.cjs +0 -254
  73. package/dist/api/openapi/index.mjs +0 -256
  74. package/dist/api/openapi/index.mjs.map +0 -1
  75. package/dist/api/openapi/types.d.cts +0 -60
  76. package/dist/api/openapi/types.d.cts.map +0 -1
  77. package/dist/api/openapi/types.d.mts +0 -60
  78. package/dist/api/openapi/types.d.mts.map +0 -1
  79. package/dist/api/validation/index.cjs +0 -64
  80. package/dist/api/validation/index.mjs +0 -61
  81. package/dist/api/validation/index.mjs.map +0 -1
  82. package/dist/cache/types.d.cts +0 -17
  83. package/dist/cache/types.d.cts.map +0 -1
  84. package/dist/cache/types.d.mts +0 -17
  85. package/dist/cache/types.d.mts.map +0 -1
  86. package/dist/cron/builder/index.cjs +0 -166
  87. package/dist/cron/builder/index.d.cts +0 -28
  88. package/dist/cron/builder/index.d.cts.map +0 -1
  89. package/dist/cron/builder/index.d.mts +0 -28
  90. package/dist/cron/builder/index.d.mts.map +0 -1
  91. package/dist/cron/builder/index.mjs +0 -163
  92. package/dist/cron/builder/index.mjs.map +0 -1
  93. package/dist/cron/builder/types.cjs +0 -27
  94. package/dist/cron/builder/types.d.cts +0 -79
  95. package/dist/cron/builder/types.d.cts.map +0 -1
  96. package/dist/cron/builder/types.d.mts +0 -79
  97. package/dist/cron/builder/types.d.mts.map +0 -1
  98. package/dist/cron/builder/types.mjs +0 -28
  99. package/dist/cron/builder/types.mjs.map +0 -1
  100. package/dist/cron/core/index.cjs +0 -308
  101. package/dist/cron/core/index.d.cts +0 -39
  102. package/dist/cron/core/index.d.cts.map +0 -1
  103. package/dist/cron/core/index.d.mts +0 -39
  104. package/dist/cron/core/index.d.mts.map +0 -1
  105. package/dist/cron/core/index.mjs +0 -310
  106. package/dist/cron/core/index.mjs.map +0 -1
  107. package/dist/cron/core/scanner.cjs +0 -237
  108. package/dist/cron/core/scanner.mjs +0 -238
  109. package/dist/cron/core/scanner.mjs.map +0 -1
  110. package/dist/cron/core/types.d.cts +0 -11
  111. package/dist/cron/core/types.d.cts.map +0 -1
  112. package/dist/cron/core/types.d.mts +0 -11
  113. package/dist/cron/core/types.d.mts.map +0 -1
  114. package/dist/errors/types.d.cts +0 -5
  115. package/dist/errors/types.d.cts.map +0 -1
  116. package/dist/errors/types.d.mts +0 -5
  117. package/dist/errors/types.d.mts.map +0 -1
  118. package/dist/i18n/types.d.cts +0 -13
  119. package/dist/i18n/types.d.cts.map +0 -1
  120. package/dist/i18n/types.d.mts +0 -13
  121. package/dist/i18n/types.d.mts.map +0 -1
  122. package/dist/lib/cache/index.d.cts.map +0 -1
  123. package/dist/lib/cache/index.d.mts.map +0 -1
  124. package/dist/lib/cache/index.mjs.map +0 -1
  125. package/dist/lib/errors/index.d.cts.map +0 -1
  126. package/dist/lib/errors/index.d.mts.map +0 -1
  127. package/dist/lib/errors/index.mjs.map +0 -1
  128. package/dist/lib/i18n/index.d.cts.map +0 -1
  129. package/dist/lib/i18n/index.d.mts.map +0 -1
  130. package/dist/lib/i18n/index.mjs.map +0 -1
  131. package/dist/lib/policy/index.d.cts.map +0 -1
  132. package/dist/lib/policy/index.d.mts.map +0 -1
  133. package/dist/lib/policy/index.mjs.map +0 -1
  134. package/dist/lib/prompts/index.d.cts.map +0 -1
  135. package/dist/lib/prompts/index.d.mts.map +0 -1
  136. package/dist/lib/prompts/index.mjs.map +0 -1
  137. package/dist/lib/pubsub/index.d.cts.map +0 -1
  138. package/dist/lib/pubsub/index.d.mts.map +0 -1
  139. package/dist/lib/pubsub/index.mjs.map +0 -1
  140. package/dist/lib/queue/index.d.cts.map +0 -1
  141. package/dist/lib/queue/index.d.mts.map +0 -1
  142. package/dist/lib/queue/index.mjs.map +0 -1
  143. package/dist/lib/workflow/index.d.cts.map +0 -1
  144. package/dist/lib/workflow/index.d.mts.map +0 -1
  145. package/dist/lib/workflow/index.mjs.map +0 -1
  146. package/dist/logging/core/index.cjs +0 -99
  147. package/dist/logging/core/index.d.cts +0 -26
  148. package/dist/logging/core/index.d.cts.map +0 -1
  149. package/dist/logging/core/index.d.mts +0 -26
  150. package/dist/logging/core/index.d.mts.map +0 -1
  151. package/dist/logging/core/index.mjs +0 -99
  152. package/dist/logging/core/index.mjs.map +0 -1
  153. package/dist/logging/core/types.cjs +0 -10
  154. package/dist/logging/core/types.d.cts +0 -22
  155. package/dist/logging/core/types.d.cts.map +0 -1
  156. package/dist/logging/core/types.d.mts +0 -22
  157. package/dist/logging/core/types.d.mts.map +0 -1
  158. package/dist/logging/core/types.mjs +0 -12
  159. package/dist/logging/core/types.mjs.map +0 -1
  160. package/dist/logging/formatter/index.cjs +0 -119
  161. package/dist/logging/formatter/index.d.cts +0 -27
  162. package/dist/logging/formatter/index.d.cts.map +0 -1
  163. package/dist/logging/formatter/index.d.mts +0 -27
  164. package/dist/logging/formatter/index.d.mts.map +0 -1
  165. package/dist/logging/formatter/index.mjs +0 -115
  166. package/dist/logging/formatter/index.mjs.map +0 -1
  167. package/dist/logging/formatter/types.d.cts +0 -5
  168. package/dist/logging/formatter/types.d.cts.map +0 -1
  169. package/dist/logging/formatter/types.d.mts +0 -5
  170. package/dist/logging/formatter/types.d.mts.map +0 -1
  171. package/dist/logging/provider/index.cjs +0 -165
  172. package/dist/logging/provider/index.d.cts +0 -28
  173. package/dist/logging/provider/index.d.cts.map +0 -1
  174. package/dist/logging/provider/index.d.mts +0 -28
  175. package/dist/logging/provider/index.d.mts.map +0 -1
  176. package/dist/logging/provider/index.mjs +0 -165
  177. package/dist/logging/provider/index.mjs.map +0 -1
  178. package/dist/logging/provider/types.d.cts +0 -23
  179. package/dist/logging/provider/types.d.cts.map +0 -1
  180. package/dist/logging/provider/types.d.mts +0 -23
  181. package/dist/logging/provider/types.d.mts.map +0 -1
  182. package/dist/node_modules/@standard-schema/spec/dist/index.d.cts +0 -80
  183. package/dist/node_modules/@standard-schema/spec/dist/index.d.cts.map +0 -1
  184. package/dist/node_modules/@standard-schema/spec/dist/index.d.mts +0 -80
  185. package/dist/node_modules/@standard-schema/spec/dist/index.d.mts.map +0 -1
  186. package/dist/orm/column.cjs +0 -137
  187. package/dist/orm/column.d.cts +0 -121
  188. package/dist/orm/column.d.cts.map +0 -1
  189. package/dist/orm/column.d.mts +0 -121
  190. package/dist/orm/column.d.mts.map +0 -1
  191. package/dist/orm/column.mjs +0 -132
  192. package/dist/orm/column.mjs.map +0 -1
  193. package/dist/orm/dialect/index.cjs +0 -14
  194. package/dist/orm/dialect/index.mjs +0 -16
  195. package/dist/orm/dialect/index.mjs.map +0 -1
  196. package/dist/orm/dialect/mysql.cjs +0 -31
  197. package/dist/orm/dialect/mysql.mjs +0 -33
  198. package/dist/orm/dialect/mysql.mjs.map +0 -1
  199. package/dist/orm/dialect/postgres.cjs +0 -23
  200. package/dist/orm/dialect/postgres.mjs +0 -25
  201. package/dist/orm/dialect/postgres.mjs.map +0 -1
  202. package/dist/orm/dialect/sqlite.cjs +0 -31
  203. package/dist/orm/dialect/sqlite.mjs +0 -33
  204. package/dist/orm/dialect/sqlite.mjs.map +0 -1
  205. package/dist/orm/dialect/utils.cjs +0 -8
  206. package/dist/orm/dialect/utils.mjs +0 -10
  207. package/dist/orm/dialect/utils.mjs.map +0 -1
  208. package/dist/orm/internal/table-columns.cjs +0 -31
  209. package/dist/orm/internal/table-columns.mjs +0 -32
  210. package/dist/orm/internal/table-columns.mjs.map +0 -1
  211. package/dist/orm/internal/table-lookup.cjs +0 -35
  212. package/dist/orm/internal/table-lookup.mjs +0 -35
  213. package/dist/orm/internal/table-lookup.mjs.map +0 -1
  214. package/dist/orm/internal/table-relations.cjs +0 -28
  215. package/dist/orm/internal/table-relations.mjs +0 -29
  216. package/dist/orm/internal/table-relations.mjs.map +0 -1
  217. package/dist/orm/migration/config.cjs +0 -7
  218. package/dist/orm/migration/config.d.cts +0 -7
  219. package/dist/orm/migration/config.d.cts.map +0 -1
  220. package/dist/orm/migration/config.d.mts +0 -7
  221. package/dist/orm/migration/config.d.mts.map +0 -1
  222. package/dist/orm/migration/config.mjs +0 -8
  223. package/dist/orm/migration/config.mjs.map +0 -1
  224. package/dist/orm/migration/types.d.cts +0 -20
  225. package/dist/orm/migration/types.d.cts.map +0 -1
  226. package/dist/orm/migration/types.d.mts +0 -20
  227. package/dist/orm/migration/types.d.mts.map +0 -1
  228. package/dist/orm/orm.cjs +0 -41
  229. package/dist/orm/orm.d.cts +0 -18
  230. package/dist/orm/orm.d.cts.map +0 -1
  231. package/dist/orm/orm.d.mts +0 -18
  232. package/dist/orm/orm.d.mts.map +0 -1
  233. package/dist/orm/orm.mjs +0 -43
  234. package/dist/orm/orm.mjs.map +0 -1
  235. package/dist/orm/relation.cjs +0 -18
  236. package/dist/orm/relation.d.cts +0 -8
  237. package/dist/orm/relation.d.cts.map +0 -1
  238. package/dist/orm/relation.d.mts +0 -8
  239. package/dist/orm/relation.d.mts.map +0 -1
  240. package/dist/orm/relation.mjs +0 -19
  241. package/dist/orm/relation.mjs.map +0 -1
  242. package/dist/orm/runtime/builders/mutations.cjs +0 -29
  243. package/dist/orm/runtime/builders/mutations.mjs +0 -28
  244. package/dist/orm/runtime/builders/mutations.mjs.map +0 -1
  245. package/dist/orm/runtime/builders/select.cjs +0 -18
  246. package/dist/orm/runtime/builders/select.mjs +0 -19
  247. package/dist/orm/runtime/builders/select.mjs.map +0 -1
  248. package/dist/orm/runtime/client.cjs +0 -90
  249. package/dist/orm/runtime/client.mjs +0 -92
  250. package/dist/orm/runtime/client.mjs.map +0 -1
  251. package/dist/orm/runtime/context.cjs +0 -49
  252. package/dist/orm/runtime/context.mjs +0 -51
  253. package/dist/orm/runtime/context.mjs.map +0 -1
  254. package/dist/orm/runtime/dialect/index.cjs +0 -11
  255. package/dist/orm/runtime/dialect/index.mjs +0 -13
  256. package/dist/orm/runtime/dialect/index.mjs.map +0 -1
  257. package/dist/orm/runtime/dialect/mysql.cjs +0 -95
  258. package/dist/orm/runtime/dialect/mysql.mjs +0 -97
  259. package/dist/orm/runtime/dialect/mysql.mjs.map +0 -1
  260. package/dist/orm/runtime/dialect/postgres.cjs +0 -51
  261. package/dist/orm/runtime/dialect/postgres.mjs +0 -53
  262. package/dist/orm/runtime/dialect/postgres.mjs.map +0 -1
  263. package/dist/orm/runtime/dialect/sqlite.cjs +0 -4
  264. package/dist/orm/runtime/dialect/sqlite.mjs +0 -7
  265. package/dist/orm/runtime/dialect/sqlite.mjs.map +0 -1
  266. package/dist/orm/runtime/errors.cjs +0 -19
  267. package/dist/orm/runtime/errors.mjs +0 -21
  268. package/dist/orm/runtime/errors.mjs.map +0 -1
  269. package/dist/orm/runtime/hydrate/many.cjs +0 -46
  270. package/dist/orm/runtime/hydrate/many.mjs +0 -48
  271. package/dist/orm/runtime/hydrate/many.mjs.map +0 -1
  272. package/dist/orm/runtime/hydrate/one.cjs +0 -38
  273. package/dist/orm/runtime/hydrate/one.mjs +0 -40
  274. package/dist/orm/runtime/hydrate/one.mjs.map +0 -1
  275. package/dist/orm/runtime/hydrate.cjs +0 -49
  276. package/dist/orm/runtime/hydrate.mjs +0 -51
  277. package/dist/orm/runtime/hydrate.mjs.map +0 -1
  278. package/dist/orm/runtime/rows.cjs +0 -30
  279. package/dist/orm/runtime/rows.mjs +0 -31
  280. package/dist/orm/runtime/rows.mjs.map +0 -1
  281. package/dist/orm/runtime/utils.cjs +0 -27
  282. package/dist/orm/runtime/utils.mjs +0 -27
  283. package/dist/orm/runtime/utils.mjs.map +0 -1
  284. package/dist/orm/sql/parse-array.cjs +0 -64
  285. package/dist/orm/sql/parse-array.mjs +0 -66
  286. package/dist/orm/sql/parse-array.mjs.map +0 -1
  287. package/dist/orm/sql/plan/select.cjs +0 -36
  288. package/dist/orm/sql/plan/select.mjs +0 -38
  289. package/dist/orm/sql/plan/select.mjs.map +0 -1
  290. package/dist/orm/sql/plan/where/operators.cjs +0 -95
  291. package/dist/orm/sql/plan/where/operators.mjs +0 -97
  292. package/dist/orm/sql/plan/where/operators.mjs.map +0 -1
  293. package/dist/orm/sql/plan/where.cjs +0 -59
  294. package/dist/orm/sql/plan/where.mjs +0 -61
  295. package/dist/orm/sql/plan/where.mjs.map +0 -1
  296. package/dist/orm/sql/serialize/clauses.cjs +0 -36
  297. package/dist/orm/sql/serialize/clauses.mjs +0 -37
  298. package/dist/orm/sql/serialize/clauses.mjs.map +0 -1
  299. package/dist/orm/sql/serialize/joins.cjs +0 -31
  300. package/dist/orm/sql/serialize/joins.mjs +0 -33
  301. package/dist/orm/sql/serialize/joins.mjs.map +0 -1
  302. package/dist/orm/sql/serialize/values.cjs +0 -30
  303. package/dist/orm/sql/serialize/values.mjs +0 -32
  304. package/dist/orm/sql/serialize/values.mjs.map +0 -1
  305. package/dist/orm/sql/serialize/where/predicate.cjs +0 -73
  306. package/dist/orm/sql/serialize/where/predicate.mjs +0 -75
  307. package/dist/orm/sql/serialize/where/predicate.mjs.map +0 -1
  308. package/dist/orm/sql/serialize/where/tree.cjs +0 -26
  309. package/dist/orm/sql/serialize/where/tree.mjs +0 -28
  310. package/dist/orm/sql/serialize/where/tree.mjs.map +0 -1
  311. package/dist/orm/sql/serialize/where.cjs +0 -10
  312. package/dist/orm/sql/serialize/where.mjs +0 -12
  313. package/dist/orm/sql/serialize/where.mjs.map +0 -1
  314. package/dist/orm/sql/serialize.cjs +0 -24
  315. package/dist/orm/sql/serialize.mjs +0 -25
  316. package/dist/orm/sql/serialize.mjs.map +0 -1
  317. package/dist/orm/table.cjs +0 -12
  318. package/dist/orm/table.d.cts +0 -12
  319. package/dist/orm/table.d.cts.map +0 -1
  320. package/dist/orm/table.d.mts +0 -12
  321. package/dist/orm/table.d.mts.map +0 -1
  322. package/dist/orm/table.mjs +0 -14
  323. package/dist/orm/table.mjs.map +0 -1
  324. package/dist/orm/types.d.cts +0 -183
  325. package/dist/orm/types.d.cts.map +0 -1
  326. package/dist/orm/types.d.mts +0 -183
  327. package/dist/orm/types.d.mts.map +0 -1
  328. package/dist/policy/helpers.cjs +0 -206
  329. package/dist/policy/helpers.d.cts +0 -50
  330. package/dist/policy/helpers.d.cts.map +0 -1
  331. package/dist/policy/helpers.d.mts +0 -50
  332. package/dist/policy/helpers.d.mts.map +0 -1
  333. package/dist/policy/helpers.mjs +0 -190
  334. package/dist/policy/helpers.mjs.map +0 -1
  335. package/dist/policy/types.d.cts +0 -16
  336. package/dist/policy/types.d.cts.map +0 -1
  337. package/dist/policy/types.d.mts +0 -16
  338. package/dist/policy/types.d.mts.map +0 -1
  339. package/dist/prompts/core/keys.cjs +0 -165
  340. package/dist/prompts/core/keys.mjs +0 -167
  341. package/dist/prompts/core/keys.mjs.map +0 -1
  342. package/dist/prompts/core/runtime.cjs +0 -104
  343. package/dist/prompts/core/runtime.mjs +0 -106
  344. package/dist/prompts/core/runtime.mjs.map +0 -1
  345. package/dist/prompts/core/session.cjs +0 -98
  346. package/dist/prompts/core/session.mjs +0 -100
  347. package/dist/prompts/core/session.mjs.map +0 -1
  348. package/dist/prompts/core/types.d.cts +0 -21
  349. package/dist/prompts/core/types.d.cts.map +0 -1
  350. package/dist/prompts/core/types.d.mts +0 -21
  351. package/dist/prompts/core/types.d.mts.map +0 -1
  352. package/dist/prompts/types.d.cts +0 -52
  353. package/dist/prompts/types.d.cts.map +0 -1
  354. package/dist/prompts/types.d.mts +0 -52
  355. package/dist/prompts/types.d.mts.map +0 -1
  356. package/dist/pubsub/types.d.cts +0 -10
  357. package/dist/pubsub/types.d.cts.map +0 -1
  358. package/dist/pubsub/types.d.mts +0 -10
  359. package/dist/pubsub/types.d.mts.map +0 -1
  360. package/dist/queue/types.d.cts +0 -47
  361. package/dist/queue/types.d.cts.map +0 -1
  362. package/dist/queue/types.d.mts +0 -47
  363. package/dist/queue/types.d.mts.map +0 -1
  364. package/dist/workflow/types.d.cts +0 -83
  365. package/dist/workflow/types.d.cts.map +0 -1
  366. package/dist/workflow/types.d.mts +0 -83
  367. package/dist/workflow/types.d.mts.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/lib/queue/index.ts"],"sourcesContent":["import { err, mightThrow, mightThrowSync, ok } from \"../errors/index.js\";\nimport type { Job, JobState, QueueOptions } from \"./types.js\";\n\nconst toMinimalJob = <T>(jobState: JobState<T>): Job<T> => ({\n id: jobState.id,\n data: jobState.data,\n attempts: jobState.attempts,\n maxRetries: jobState.maxRetries,\n createdAt: jobState.createdAt,\n});\n\nconst DEFAULT_RETRIES = 3;\nconst DEFAULT_TIMEOUT = 30000;\nconst DEFAULT_CONCURRENCY = 1;\nconst DEFAULT_POLL_INTERVAL = 100;\nconst MAX_BACKOFF_DELAY = 60000;\nconst BASE_BACKOFF_DELAY = 1000;\nconst BACKOFF_MULTIPLIER = 2;\nconst SHUTDOWN_POLL_INTERVAL = 10;\n\nexport class Queue<T> {\n private options: QueueOptions<T>;\n private running = true;\n private activeWorkers = 0;\n private retries: number;\n private timeout: number;\n private concurrency: number;\n private pollInterval: number;\n\n public constructor(options: QueueOptions<T>) {\n this.options = options;\n this.retries = options.retries ?? DEFAULT_RETRIES;\n this.timeout = options.timeout ?? DEFAULT_TIMEOUT;\n this.concurrency = options.concurrency ?? DEFAULT_CONCURRENCY;\n this.pollInterval = options.pollInterval ?? DEFAULT_POLL_INTERVAL;\n this.startWorkers();\n }\n\n public async enqueue(data: T) {\n const job: JobState<T> = {\n id: crypto.randomUUID(),\n data,\n attempts: 0,\n maxRetries: this.retries,\n createdAt: Date.now(),\n };\n\n const [serializeError, serialized] = this.serializeJob(job);\n if (serializeError || !serialized) {\n return err(\"QueueError\", \"Unable to serialize job data\");\n }\n\n const [enqueueError] = await this.enqueueJobData(serialized);\n if (enqueueError) {\n return err(\"QueueError\", \"Unable to enqueue job\");\n }\n\n return ok(job.id);\n }\n\n public async stop() {\n this.running = false;\n\n // Wait for all active workers to finish processing\n while (this.activeWorkers > 0) {\n await new Promise((resolve) =>\n setTimeout(resolve, SHUTDOWN_POLL_INTERVAL),\n );\n }\n }\n\n private waitForPollInterval() {\n return new Promise((resolve) => setTimeout(resolve, this.pollInterval));\n }\n\n private serializeJob(job: JobState<T>) {\n return mightThrowSync(() => JSON.stringify(job));\n }\n\n private async enqueueJobData(serialized: string) {\n const queueKey = `queue:${this.options.name}:jobs`;\n return mightThrow(this.options.redis.lpush(queueKey, serialized));\n }\n\n private async moveToDeadLetterQueue(jobData: string, parseError: unknown) {\n const deadLetterKey = `queue:${this.options.name}:dead-letter`;\n const deadLetterEntry = JSON.stringify({\n jobData,\n parseError: this.formatErrorMessage(parseError),\n timestamp: Date.now(),\n });\n\n return mightThrow(this.options.redis.lpush(deadLetterKey, deadLetterEntry));\n }\n\n private formatErrorMessage(error: unknown) {\n return error instanceof Error ? error.message : String(error);\n }\n\n private startWorkers() {\n for (let i = 0; i < this.concurrency; i++) {\n this.processJobs();\n }\n }\n\n private async processJobs() {\n while (this.running) {\n const queueKey = `queue:${this.options.name}:jobs`;\n\n const [popError, jobData] = await mightThrow(\n this.options.redis.rpop(queueKey),\n );\n\n if (popError) {\n await this.waitForPollInterval();\n continue;\n }\n\n if (!jobData) {\n await this.waitForPollInterval();\n continue;\n }\n\n const [parseError, job] = mightThrowSync<JobState<T>>(() =>\n JSON.parse(jobData),\n );\n\n if (parseError || !job) {\n // Handle malformed payload: preserve to dead-letter queue and notify\n await this.callOnErrorForParseFailure(jobData, parseError);\n await this.moveToDeadLetterQueue(jobData, parseError);\n\n await this.waitForPollInterval();\n continue;\n }\n\n // Skip processing if we've been stopped\n if (!this.running) {\n // Re-enqueue the job so it's not lost\n const [stringifyError, serialized] = this.serializeJob(job);\n\n if (!stringifyError && serialized) {\n await mightThrow(this.options.redis.lpush(queueKey, serialized));\n }\n\n break;\n }\n\n this.activeWorkers++;\n\n await mightThrow(this.handleJob(job));\n this.activeWorkers--;\n }\n }\n\n private async handleJob(job: JobState<T>) {\n const controller = new AbortController();\n\n const handlerPromise = Promise.resolve().then(() =>\n this.options.handler(job.data, controller.signal),\n );\n\n let timerId: NodeJS.Timeout | undefined;\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n timerId = setTimeout(() => {\n reject(new Error(`Job timeout after ${this.timeout}ms`));\n }, this.timeout);\n });\n\n const [handlerError] = await mightThrow(\n Promise.race([handlerPromise.then(() => undefined), timeoutPromise]),\n );\n\n if (timerId) {\n clearTimeout(timerId);\n }\n\n // Abort handler if timeout occurred\n if (handlerError && !controller.signal.aborted) {\n controller.abort();\n }\n\n if (!handlerError) {\n if (this.options.onSuccess) {\n await mightThrow(\n Promise.resolve(this.options.onSuccess(toMinimalJob(job))),\n );\n }\n\n return;\n }\n\n job.attempts++;\n\n const errorMsg = this.formatErrorMessage(handlerError);\n job.error = errorMsg;\n\n if (!job.errorHistory) {\n job.errorHistory = [];\n }\n job.errorHistory.push({\n attempt: job.attempts,\n error: errorMsg,\n timestamp: Date.now(),\n });\n\n // Check if we should retry. Attempt starts at 1, so we retry while attempts <= maxRetries\n if (job.attempts <= job.maxRetries) {\n if (this.options.onRetry) {\n const delay = Math.min(\n BASE_BACKOFF_DELAY * BACKOFF_MULTIPLIER ** (job.attempts - 1),\n MAX_BACKOFF_DELAY,\n );\n await mightThrow(\n Promise.resolve(\n this.options.onRetry({\n job: toMinimalJob(job),\n error: errorMsg,\n nextRetryDelayMs: delay,\n retriesRemaining: job.maxRetries - job.attempts,\n backoffMultiplier: BACKOFF_MULTIPLIER,\n }),\n ),\n );\n }\n await this.retryJob(job);\n } else {\n await this.callOnError(job);\n }\n }\n\n private async callOnError(job: JobState<T>) {\n if (!this.options.onError) {\n return;\n }\n\n await mightThrow(\n Promise.resolve(\n this.options.onError({\n job: toMinimalJob(job),\n lastError: job.error ?? \"\",\n totalDurationMs: Date.now() - job.createdAt,\n totalAttempts: job.attempts,\n errorHistory: job.errorHistory ?? [],\n }),\n ),\n );\n }\n\n private async callOnErrorForParseFailure(\n jobData: string,\n parseError: unknown,\n ) {\n if (!this.options.onParseError) {\n return;\n }\n\n await mightThrow(\n Promise.resolve(\n this.options.onParseError({\n rawJobData: jobData,\n parseError: this.formatErrorMessage(parseError),\n timestamp: Date.now(),\n }),\n ),\n );\n }\n\n private async retryJob(job: JobState<T>) {\n // Exponential backoff: 1st retry (attempts=1) -> 1000ms, 2nd (attempts=2) -> 2000ms, etc.\n const delay = Math.min(\n BASE_BACKOFF_DELAY * BACKOFF_MULTIPLIER ** (job.attempts - 1),\n MAX_BACKOFF_DELAY,\n );\n\n await new Promise((resolve) => setTimeout(resolve, delay));\n\n const [stringifyError, serialized] = this.serializeJob(job);\n\n if (stringifyError || !serialized) {\n job.error = `Failed to serialize job for retry: ${this.formatErrorMessage(stringifyError)}`;\n await this.callOnError(job);\n return;\n }\n\n const queueKey = `queue:${this.options.name}:jobs`;\n const [pushError] = await mightThrow(\n this.options.redis.lpush(queueKey, serialized),\n );\n\n if (pushError) {\n job.error = `Failed to re-enqueue job for retry: ${this.formatErrorMessage(pushError)}`;\n await this.callOnError(job);\n }\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../../../src/lib/workflow/index.ts"],"mappings":";;;cAq0Ca,cAAA,2BACX,OAAA,EAAS,eAAA,CAAgB,MAAA,EAAQ,OAAA,MAChC,QAAA,CAAS,MAAA,EAAQ,OAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../../src/lib/workflow/index.ts"],"mappings":";;;cAq0Ca,cAAA,2BACX,OAAA,EAAS,eAAA,CAAgB,MAAA,EAAQ,OAAA,MAChC,QAAA,CAAS,MAAA,EAAQ,OAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/lib/workflow/index.ts"],"sourcesContent":["import { err, mightThrow, mightThrowSync, ok } from \"../errors/index.js\";\nimport type {\n StepSnapshot,\n Workflow,\n WorkflowCancelResult,\n WorkflowExecution,\n WorkflowMeta,\n WorkflowMetaField,\n WorkflowOptions,\n WorkflowStartOptions,\n WorkflowStartResult,\n WorkflowStatus,\n} from \"./types.js\";\n\nconst DEFAULT_LOCK_TTL = 5 * 60 * 1000;\n\nconst now = () => Date.now();\n\nconst toErrorMessage = (error: unknown) => {\n if (error instanceof Error) {\n return error.message;\n }\n\n return String(error);\n};\n\nconst envelopeSerialize = (value: unknown) => {\n return JSON.stringify({ value });\n};\n\nconst envelopeDeserialize = (raw: string) => {\n const [parseError, parsed] = mightThrowSync(() => JSON.parse(raw));\n\n if (parseError) {\n throw parseError;\n }\n\n if (parsed === null) {\n return undefined;\n }\n\n if (typeof parsed !== \"object\") {\n return undefined;\n }\n\n if (\"value\" in parsed) {\n return parsed.value;\n }\n\n return undefined;\n};\n\nconst knownStatuses: WorkflowStatus[] = [\n \"pending\",\n \"running\",\n \"completed\",\n \"failed\",\n \"cancelled\",\n];\n\nclass WorkflowDefinition<TInput, TResult> {\n private options: WorkflowOptions<TInput, TResult>;\n private lockTTL: number;\n\n public constructor(options: WorkflowOptions<TInput, TResult>) {\n this.options = options;\n this.lockTTL = options.lockTTL ?? DEFAULT_LOCK_TTL;\n }\n\n public async start(input: TInput, options?: WorkflowStartOptions) {\n const executionId = options?.executionId ?? crypto.randomUUID();\n\n const [createError] = await this.createExecution(executionId, input);\n\n if (createError) {\n return err(createError.type, createError.message);\n }\n\n return this.execute(executionId, input);\n }\n\n public async run(input: TInput, options?: WorkflowStartOptions) {\n const [startError, startData] = await this.start(input, options);\n\n if (startError) {\n return err(startError.type, startError.message);\n }\n\n if (!startData) {\n return err(\"WorkflowError\", \"Unexpected empty start result\");\n }\n\n if (startData.status === \"cancelled\") {\n return err(\n \"WorkflowCancelledError\",\n `Workflow execution ${startData.executionId} was cancelled`,\n );\n }\n\n if (startData.status !== \"completed\") {\n return err(\n \"WorkflowExecutionError\",\n `Workflow execution ${startData.executionId} did not complete`,\n );\n }\n\n const [getError, execution] = await this.get(startData.executionId);\n\n if (getError) {\n return err(getError.type, getError.message);\n }\n\n if (!execution) {\n return err(\"WorkflowError\", \"Unexpected empty execution\");\n }\n\n return ok(execution.result);\n }\n\n public async resume(executionId: string) {\n const [getError, execution] = await this.get(executionId);\n\n if (getError) {\n return err(getError.type, getError.message);\n }\n\n if (!execution) {\n return err(\n \"WorkflowNotFoundError\",\n `Workflow execution ${executionId} not found`,\n );\n }\n\n if (execution.status === \"completed\") {\n return ok({ executionId, status: execution.status });\n }\n\n if (execution.status === \"cancelled\") {\n return ok({ executionId, status: execution.status });\n }\n\n return this.execute(executionId, execution.input);\n }\n\n public async get(executionId: string) {\n const [statusError, status] = await this.getMeta(executionId, \"status\");\n\n if (statusError) {\n return err(statusError.type, statusError.message);\n }\n\n if (!status) {\n return err(\n \"WorkflowNotFoundError\",\n `Workflow execution ${executionId} not found`,\n );\n }\n\n const normalizedStatus = this.normalizeStatus(status);\n\n if (!normalizedStatus) {\n return err(\n \"WorkflowStateError\",\n `Workflow execution ${executionId} has invalid status ${status}`,\n );\n }\n\n const [inputError, input] = await this.readInput(executionId);\n\n if (inputError) {\n return err(inputError.type, inputError.message);\n }\n\n if (input === null) {\n return err(\n \"WorkflowStateError\",\n `Workflow execution ${executionId} has invalid input`,\n );\n }\n\n const [resultError, result] = await this.readResult(executionId);\n\n if (resultError) {\n return err(resultError.type, resultError.message);\n }\n\n const [stepsError, steps] = await this.readStepSnapshots(executionId);\n\n if (stepsError) {\n return err(stepsError.type, stepsError.message);\n }\n\n const [createdAtError, createdAt] = await this.readNumberMeta(\n executionId,\n \"createdAt\",\n );\n\n if (createdAtError) {\n return err(createdAtError.type, createdAtError.message);\n }\n\n if (createdAt === null) {\n return err(\n \"WorkflowStateError\",\n `Workflow execution ${executionId} is missing createdAt`,\n );\n }\n\n const [updatedAtError, updatedAt] = await this.readNumberMeta(\n executionId,\n \"updatedAt\",\n );\n\n if (updatedAtError) {\n return err(updatedAtError.type, updatedAtError.message);\n }\n\n if (updatedAt === null) {\n return err(\n \"WorkflowStateError\",\n `Workflow execution ${executionId} is missing updatedAt`,\n );\n }\n\n const [metaError, errorMessage] = await this.getMeta(executionId, \"error\");\n\n if (metaError) {\n return err(metaError.type, metaError.message);\n }\n\n const [completedAtError, completedAt] = await this.readNumberMeta(\n executionId,\n \"completedAt\",\n );\n\n if (completedAtError) {\n return err(completedAtError.type, completedAtError.message);\n }\n\n const [failedAtError, failedAt] = await this.readNumberMeta(\n executionId,\n \"failedAt\",\n );\n\n if (failedAtError) {\n return err(failedAtError.type, failedAtError.message);\n }\n\n const [cancelledAtError, cancelledAt] = await this.readNumberMeta(\n executionId,\n \"cancelledAt\",\n );\n\n if (cancelledAtError) {\n return err(cancelledAtError.type, cancelledAtError.message);\n }\n\n const data: WorkflowExecution<TInput, TResult> = {\n id: executionId,\n name: this.options.name,\n status: normalizedStatus,\n input,\n result,\n error: errorMessage,\n createdAt,\n updatedAt,\n completedAt,\n failedAt,\n cancelledAt,\n steps,\n };\n\n return ok(data);\n }\n\n public async cancel(executionId: string) {\n const [getError, execution] = await this.get(executionId);\n\n if (getError) {\n return err(getError.type, getError.message);\n }\n\n if (!execution) {\n return err(\n \"WorkflowNotFoundError\",\n `Workflow execution ${executionId} not found`,\n );\n }\n\n if (execution.status === \"completed\") {\n return err(\n \"WorkflowStateError\",\n `Workflow execution ${executionId} is already completed`,\n );\n }\n\n const timestamp = now();\n\n const [statusError] = await this.setMeta(\n executionId,\n \"status\",\n \"cancelled\",\n );\n if (statusError) {\n return err(statusError.type, statusError.message);\n }\n\n const [updatedAtError] = await this.setMeta(\n executionId,\n \"updatedAt\",\n String(timestamp),\n );\n if (updatedAtError) {\n return err(updatedAtError.type, updatedAtError.message);\n }\n\n const [cancelledAtError] = await this.setMeta(\n executionId,\n \"cancelledAt\",\n String(timestamp),\n );\n if (cancelledAtError) {\n return err(cancelledAtError.type, cancelledAtError.message);\n }\n\n const [clearErrorError] = await this.setMeta(executionId, \"error\", \"\");\n\n if (clearErrorError) {\n return err(clearErrorError.type, clearErrorError.message);\n }\n\n const [clearFailedAtError] = await this.setMeta(\n executionId,\n \"failedAt\",\n \"\",\n );\n\n if (clearFailedAtError) {\n return err(clearFailedAtError.type, clearFailedAtError.message);\n }\n\n const response: WorkflowCancelResult = {\n executionId,\n createdAt: execution.createdAt,\n cancelledAt: timestamp,\n updatedAt: timestamp,\n status: \"cancelled\",\n };\n\n return ok(response);\n }\n\n private executionKey(executionId: string) {\n return `workflow:${this.options.name}:execution:${executionId}`;\n }\n\n private metaKey(executionId: string) {\n return `${this.executionKey(executionId)}:meta`;\n }\n\n private stepsKey(executionId: string) {\n return `${this.executionKey(executionId)}:steps`;\n }\n\n private lockKey(executionId: string) {\n return `${this.executionKey(executionId)}:lock`;\n }\n\n private async createExecution(executionId: string, input: TInput) {\n const [serializeError, serializedInput] = this.serializeInput(input);\n\n if (serializeError) {\n return err(\n \"WorkflowSerializationError\",\n `Unable to serialize workflow input for ${executionId}`,\n );\n }\n\n const timestamp = now();\n\n const [statusReadError, existingStatus] = await this.getMeta(\n executionId,\n \"status\",\n );\n\n if (statusReadError) {\n return err(statusReadError.type, statusReadError.message);\n }\n\n if (existingStatus) {\n return err(\n \"WorkflowStateError\",\n `Workflow execution ${executionId} already exists`,\n );\n }\n\n const metadata: WorkflowMeta = {\n status: \"pending\",\n input: serializedInput,\n result: \"\",\n error: \"\",\n createdAt: String(timestamp),\n updatedAt: String(timestamp),\n completedAt: \"\",\n failedAt: \"\",\n cancelledAt: \"\",\n steps: \"[]\",\n };\n\n const [writeError] = await mightThrow(\n this.options.redis.hset(this.metaKey(executionId), metadata),\n );\n\n if (writeError) {\n return err(\n \"WorkflowError\",\n `Unable to persist metadata for execution ${executionId}`,\n );\n }\n\n return ok(null);\n }\n\n private async execute(executionId: string, input: TInput) {\n const token = crypto.randomUUID();\n\n const [lockError] = await this.acquireLock(executionId, token);\n\n if (lockError) {\n return err(lockError.type, lockError.message);\n }\n\n const [statusCheckError, currentStatus] = await this.getMeta(\n executionId,\n \"status\",\n );\n\n if (statusCheckError) {\n await this.releaseLock(executionId, token);\n return err(statusCheckError.type, statusCheckError.message);\n }\n\n if (currentStatus === \"cancelled\") {\n await this.releaseLock(executionId, token);\n return err(\n \"WorkflowStateError\",\n `Workflow execution ${executionId} was cancelled`,\n );\n }\n\n const timestamp = now();\n\n const [runningStatusError] = await this.setMeta(\n executionId,\n \"status\",\n \"running\",\n );\n\n if (runningStatusError) {\n await this.releaseLock(executionId, token);\n return err(runningStatusError.type, runningStatusError.message);\n }\n\n const [runningUpdatedAtError] = await this.setMeta(\n executionId,\n \"updatedAt\",\n String(timestamp),\n );\n\n if (runningUpdatedAtError) {\n await this.releaseLock(executionId, token);\n return err(runningUpdatedAtError.type, runningUpdatedAtError.message);\n }\n\n const controller = new AbortController();\n\n const renewInterval = Math.floor(this.lockTTL / 3);\n\n let lockLost = false;\n\n const renewTimer = setInterval(async () => {\n const [renewError] = await this.extendLock(executionId, token);\n\n if (renewError) {\n lockLost = true;\n controller.abort();\n clearInterval(renewTimer);\n }\n }, renewInterval);\n\n const step = async <TStep>(\n name: string,\n handler: (\n inputValue: TInput,\n signal: AbortSignal,\n ) => TStep | Promise<TStep>,\n ) => {\n const [cancelledError, cancelled] = await this.isCancelled(executionId);\n\n if (cancelledError) {\n return Promise.reject(new Error(cancelledError.message));\n }\n\n if (cancelled) {\n controller.abort();\n return Promise.reject(new Error(\"Workflow cancelled\"));\n }\n\n const [readError, cachedStep] = await this.readStepOutput<TStep>(\n executionId,\n name,\n );\n\n if (readError) {\n return Promise.reject(new Error(readError.message));\n }\n\n if (cachedStep.found) {\n return cachedStep.value as TStep;\n }\n\n const [stepError, output] = await mightThrow(\n Promise.resolve(handler(input, controller.signal)),\n );\n\n if (stepError) {\n return Promise.reject(stepError);\n }\n\n const [writeError] = await this.writeStepOutput(\n executionId,\n name,\n output,\n );\n\n if (writeError) {\n return Promise.reject(new Error(writeError.message));\n }\n\n return output as TStep;\n };\n\n const [handlerError, result] = await mightThrow(\n Promise.resolve(\n this.options.handler({\n input,\n executionId,\n signal: controller.signal,\n step,\n }),\n ),\n );\n\n clearInterval(renewTimer);\n\n if (lockLost) {\n await this.releaseLock(executionId, token);\n\n return err(\n \"WorkflowLockError\",\n `Lock expired during execution ${executionId}`,\n );\n }\n\n const [cancelledError, cancelled] = await this.isCancelled(executionId);\n\n if (cancelledError) {\n await this.releaseLock(executionId, token);\n return err(cancelledError.type, cancelledError.message);\n }\n\n if (cancelled) {\n const cancelledAt = now();\n\n const [cancelledStatusError] = await this.setMeta(\n executionId,\n \"status\",\n \"cancelled\",\n );\n\n if (cancelledStatusError) {\n await this.releaseLock(executionId, token);\n return err(cancelledStatusError.type, cancelledStatusError.message);\n }\n\n const [cancelledUpdatedAtError] = await this.setMeta(\n executionId,\n \"updatedAt\",\n String(cancelledAt),\n );\n\n if (cancelledUpdatedAtError) {\n await this.releaseLock(executionId, token);\n return err(\n cancelledUpdatedAtError.type,\n cancelledUpdatedAtError.message,\n );\n }\n\n const [cancelledAtError] = await this.setMeta(\n executionId,\n \"cancelledAt\",\n String(cancelledAt),\n );\n\n if (cancelledAtError) {\n await this.releaseLock(executionId, token);\n return err(cancelledAtError.type, cancelledAtError.message);\n }\n\n await this.releaseLock(executionId, token);\n\n const response: WorkflowStartResult = {\n executionId,\n status: \"cancelled\",\n };\n\n return ok(response);\n }\n\n if (handlerError) {\n const failedAt = now();\n\n const [failedStatusError] = await this.setMeta(\n executionId,\n \"status\",\n \"failed\",\n );\n\n if (failedStatusError) {\n await this.releaseLock(executionId, token);\n return err(failedStatusError.type, failedStatusError.message);\n }\n\n const [failedMessageError] = await this.setMeta(\n executionId,\n \"error\",\n toErrorMessage(handlerError),\n );\n\n if (failedMessageError) {\n await this.releaseLock(executionId, token);\n return err(failedMessageError.type, failedMessageError.message);\n }\n\n const [failedUpdatedAtError] = await this.setMeta(\n executionId,\n \"updatedAt\",\n String(failedAt),\n );\n\n if (failedUpdatedAtError) {\n await this.releaseLock(executionId, token);\n return err(failedUpdatedAtError.type, failedUpdatedAtError.message);\n }\n\n const [failedAtError] = await this.setMeta(\n executionId,\n \"failedAt\",\n String(failedAt),\n );\n\n if (failedAtError) {\n await this.releaseLock(executionId, token);\n return err(failedAtError.type, failedAtError.message);\n }\n\n await this.releaseLock(executionId, token);\n\n return err(\n \"WorkflowExecutionError\",\n `Workflow execution ${executionId} failed: ${toErrorMessage(handlerError)}`,\n );\n }\n\n const [serializeResultError, serializedResult] =\n this.serializeResult(result);\n\n if (serializeResultError) {\n const failedAt = now();\n\n const [failedStatusError] = await this.setMeta(\n executionId,\n \"status\",\n \"failed\",\n );\n\n if (failedStatusError) {\n await this.releaseLock(executionId, token);\n return err(failedStatusError.type, failedStatusError.message);\n }\n\n const [failedMessageError] = await this.setMeta(\n executionId,\n \"error\",\n serializeResultError.message,\n );\n\n if (failedMessageError) {\n await this.releaseLock(executionId, token);\n return err(failedMessageError.type, failedMessageError.message);\n }\n\n const [failedUpdatedAtError] = await this.setMeta(\n executionId,\n \"updatedAt\",\n String(failedAt),\n );\n\n if (failedUpdatedAtError) {\n await this.releaseLock(executionId, token);\n return err(failedUpdatedAtError.type, failedUpdatedAtError.message);\n }\n\n const [failedAtError] = await this.setMeta(\n executionId,\n \"failedAt\",\n String(failedAt),\n );\n\n if (failedAtError) {\n await this.releaseLock(executionId, token);\n return err(failedAtError.type, failedAtError.message);\n }\n\n await this.releaseLock(executionId, token);\n\n return err(\n \"WorkflowSerializationError\",\n `Unable to serialize workflow result for ${executionId}`,\n );\n }\n\n const completedAt = now();\n\n const [completedResultError] = await this.setMeta(\n executionId,\n \"result\",\n serializedResult,\n );\n\n if (completedResultError) {\n await this.releaseLock(executionId, token);\n return err(completedResultError.type, completedResultError.message);\n }\n\n const [completedStatusError] = await this.setMeta(\n executionId,\n \"status\",\n \"completed\",\n );\n\n if (completedStatusError) {\n await this.releaseLock(executionId, token);\n return err(completedStatusError.type, completedStatusError.message);\n }\n\n const [completedClearErrorError] = await this.setMeta(\n executionId,\n \"error\",\n \"\",\n );\n\n if (completedClearErrorError) {\n await this.releaseLock(executionId, token);\n return err(\n completedClearErrorError.type,\n completedClearErrorError.message,\n );\n }\n\n const [completedClearFailedAtError] = await this.setMeta(\n executionId,\n \"failedAt\",\n \"\",\n );\n\n if (completedClearFailedAtError) {\n await this.releaseLock(executionId, token);\n return err(\n completedClearFailedAtError.type,\n completedClearFailedAtError.message,\n );\n }\n\n const [completedUpdatedAtError] = await this.setMeta(\n executionId,\n \"updatedAt\",\n String(completedAt),\n );\n\n if (completedUpdatedAtError) {\n await this.releaseLock(executionId, token);\n return err(completedUpdatedAtError.type, completedUpdatedAtError.message);\n }\n\n const [completedAtError] = await this.setMeta(\n executionId,\n \"completedAt\",\n String(completedAt),\n );\n\n if (completedAtError) {\n await this.releaseLock(executionId, token);\n return err(completedAtError.type, completedAtError.message);\n }\n\n await this.releaseLock(executionId, token);\n\n const response: WorkflowStartResult = {\n executionId,\n status: \"completed\",\n };\n\n return ok(response);\n }\n\n private async acquireLock(executionId: string, token: string) {\n const [lockError, lockResult] = await mightThrow(\n this.options.redis.set(\n this.lockKey(executionId),\n token,\n \"PX\",\n String(this.lockTTL),\n \"NX\",\n ),\n );\n\n if (lockError) {\n return err(\n \"WorkflowLockError\",\n `Unable to acquire lock for execution ${executionId}`,\n );\n }\n\n if (lockResult !== \"OK\") {\n return err(\n \"WorkflowLockError\",\n `Workflow execution ${executionId} is already running`,\n );\n }\n\n return ok(null);\n }\n\n private async releaseLock(executionId: string, token: string) {\n const script =\n \"if redis.call('GET', KEYS[1]) == ARGV[1] then return redis.call('DEL', KEYS[1]) else return 0 end\";\n\n const [evalError] = await mightThrow(\n this.options.redis.send(\"EVAL\", [\n script,\n \"1\",\n this.lockKey(executionId),\n token,\n ]),\n );\n\n if (evalError) {\n return err(\n \"WorkflowLockError\",\n `Unable to release lock for execution ${executionId}`,\n );\n }\n\n return ok(null);\n }\n\n private async extendLock(executionId: string, token: string) {\n const script =\n \"if redis.call('GET', KEYS[1]) == ARGV[1] then return redis.call('PEXPIRE', KEYS[1], ARGV[2]) else return 0 end\";\n\n const [evalError, result] = await mightThrow(\n this.options.redis.send(\"EVAL\", [\n script,\n \"1\",\n this.lockKey(executionId),\n token,\n String(this.lockTTL),\n ]),\n );\n\n if (evalError) {\n return err(\n \"WorkflowLockError\",\n `Unable to extend lock for execution ${executionId}`,\n );\n }\n\n if (result === 0) {\n return err(\n \"WorkflowLockError\",\n `Lock ownership lost for execution ${executionId}`,\n );\n }\n\n return ok(null);\n }\n\n private async isCancelled(executionId: string) {\n const [statusError, status] = await this.getMeta(executionId, \"status\");\n\n if (statusError) {\n return err(statusError.type, statusError.message);\n }\n\n return ok(status === \"cancelled\");\n }\n\n private async setMeta(\n executionId: string,\n field: WorkflowMetaField,\n value: string,\n ) {\n const [writeError] = await mightThrow(\n this.options.redis.hset(this.metaKey(executionId), field, value),\n );\n\n if (writeError) {\n return err(\n \"WorkflowError\",\n `Unable to persist ${field} for execution ${executionId}`,\n );\n }\n\n return ok(null);\n }\n\n private async getMeta(executionId: string, field: WorkflowMetaField) {\n const [readError, value] = await mightThrow(\n this.options.redis.hget(this.metaKey(executionId), field),\n );\n\n if (readError) {\n return err(\n \"WorkflowError\",\n `Unable to read ${field} for execution ${executionId}`,\n );\n }\n\n if (value === null || value === undefined) {\n return ok(null);\n }\n\n if (typeof value !== \"string\") {\n return err(\n \"WorkflowStateError\",\n `Invalid ${field} value for execution ${executionId}`,\n );\n }\n\n if (value.length === 0) {\n return ok(null);\n }\n\n return ok(value);\n }\n\n private async readNumberMeta(executionId: string, field: WorkflowMetaField) {\n const [readError, value] = await this.getMeta(executionId, field);\n\n if (readError) {\n return err(readError.type, readError.message);\n }\n\n if (!value) {\n return ok(null);\n }\n\n const parsed = Number(value);\n\n if (!Number.isFinite(parsed)) {\n return err(\n \"WorkflowStateError\",\n `Invalid ${field} value for execution ${executionId}`,\n );\n }\n\n return ok(parsed);\n }\n\n private runSerializer<T>(\n value: T,\n serializer: (v: T) => string,\n label: string,\n ) {\n const [serializeError, serialized] = mightThrowSync(() =>\n serializer(value),\n );\n\n if (serializeError) {\n return err(\n \"WorkflowSerializationError\",\n `Unable to serialize ${label}: ${toErrorMessage(serializeError)}`,\n );\n }\n\n if (typeof serialized !== \"string\") {\n return err(\n \"WorkflowSerializationError\",\n `${label} serializer must return a string`,\n );\n }\n\n return ok(serialized);\n }\n\n private runDeserializer<T>(\n raw: string,\n deserializer: (v: string) => T,\n label: string,\n ) {\n const [deserializeError, value] = mightThrowSync(() => deserializer(raw));\n\n if (deserializeError) {\n return err(\n \"WorkflowSerializationError\",\n `Unable to deserialize ${label}: ${toErrorMessage(deserializeError)}`,\n );\n }\n\n return ok(value);\n }\n\n private serializeInput(input: TInput) {\n return this.runSerializer(\n input,\n this.options.serializeInput ?? envelopeSerialize,\n \"workflow input\",\n );\n }\n\n private deserializeInput(raw: string) {\n const deserializer =\n this.options.deserializeInput ??\n ((value: string) => envelopeDeserialize(value) as TInput);\n\n return this.runDeserializer(raw, deserializer, \"workflow input\");\n }\n\n private serializeResult(result: TResult | null) {\n if (result === null) {\n return ok(envelopeSerialize(null));\n }\n\n return this.runSerializer(\n result,\n this.options.serializeResult ?? envelopeSerialize,\n \"workflow result\",\n );\n }\n\n private deserializeResult(raw: string) {\n const deserializer =\n this.options.deserializeResult ??\n ((value: string) => envelopeDeserialize(value) as TResult);\n\n return this.runDeserializer(raw, deserializer, \"workflow result\");\n }\n\n private serializeStepOutput(output: unknown) {\n return this.runSerializer(\n output,\n this.options.serializeStepOutput ?? envelopeSerialize,\n \"step output\",\n );\n }\n\n private deserializeStepOutput(raw: string) {\n const deserializer =\n this.options.deserializeStepOutput ??\n ((value: string) => envelopeDeserialize(value));\n\n return this.runDeserializer(raw, deserializer, \"step output\");\n }\n\n private async readInput(executionId: string) {\n const [readError, raw] = await this.getMeta(executionId, \"input\");\n\n if (readError) {\n return err(readError.type, readError.message);\n }\n\n if (!raw) {\n return err(\n \"WorkflowStateError\",\n `Workflow execution ${executionId} input not found`,\n );\n }\n\n return this.deserializeInput(raw);\n }\n\n private async readResult(executionId: string) {\n const [readError, raw] = await this.getMeta(executionId, \"result\");\n\n if (readError) {\n return err(readError.type, readError.message);\n }\n\n if (!raw) {\n return ok(null);\n }\n\n const [deserializeError, result] = this.deserializeResult(raw);\n\n if (deserializeError) {\n return err(deserializeError.type, deserializeError.message);\n }\n\n return ok(result);\n }\n\n private async writeStepOutput(\n executionId: string,\n stepName: string,\n output: unknown,\n ) {\n const [serializeError, serializedOutput] = this.serializeStepOutput(output);\n\n if (serializeError) {\n return err(\n \"WorkflowSerializationError\",\n `Unable to serialize step ${stepName} output`,\n );\n }\n\n const payload = {\n output: serializedOutput,\n completedAt: now(),\n };\n\n const [payloadError, payloadRaw] = mightThrowSync(() =>\n JSON.stringify(payload),\n );\n\n if (payloadError || typeof payloadRaw !== \"string\") {\n return err(\n \"WorkflowSerializationError\",\n `Unable to persist step ${stepName} output`,\n );\n }\n\n const [writeError] = await mightThrow(\n this.options.redis.hset(this.stepsKey(executionId), stepName, payloadRaw),\n );\n\n if (writeError) {\n return err(\n \"WorkflowError\",\n `Unable to persist step ${stepName} for execution ${executionId}`,\n );\n }\n\n const [stepNamesError, stepNames] = await this.readStepNames(executionId);\n\n if (stepNamesError) {\n return err(stepNamesError.type, stepNamesError.message);\n }\n\n if (!stepNames.includes(stepName)) {\n const nextStepNames = [...stepNames, stepName];\n\n const [serializeStepsError, serializedSteps] = mightThrowSync(() =>\n JSON.stringify(nextStepNames),\n );\n\n if (serializeStepsError || typeof serializedSteps !== \"string\") {\n return err(\n \"WorkflowSerializationError\",\n `Unable to persist step history for execution ${executionId}`,\n );\n }\n\n const [updateStepsError] = await this.setMeta(\n executionId,\n \"steps\",\n serializedSteps,\n );\n\n if (updateStepsError) {\n return err(updateStepsError.type, updateStepsError.message);\n }\n }\n\n const [updatedError] = await this.setMeta(\n executionId,\n \"updatedAt\",\n String(now()),\n );\n\n if (updatedError) {\n return err(updatedError.type, updatedError.message);\n }\n\n return ok(null);\n }\n\n private async readStepOutput<TStep>(executionId: string, stepName: string) {\n const [readError, payloadRaw] = await mightThrow(\n this.options.redis.hget(this.stepsKey(executionId), stepName),\n );\n\n if (readError) {\n return err(\n \"WorkflowError\",\n `Unable to read step ${stepName} for execution ${executionId}`,\n );\n }\n\n if (!payloadRaw) {\n return ok({ found: false, value: null });\n }\n\n if (typeof payloadRaw !== \"string\") {\n return err(\n \"WorkflowStateError\",\n `Invalid step payload for ${stepName} in execution ${executionId}`,\n );\n }\n\n const [parseError, parsed] = mightThrowSync(() => JSON.parse(payloadRaw));\n\n if (parseError || parsed === null || typeof parsed !== \"object\") {\n return err(\n \"WorkflowStateError\",\n `Invalid step payload for ${stepName} in execution ${executionId}`,\n );\n }\n\n if (typeof parsed.output !== \"string\") {\n return err(\n \"WorkflowStateError\",\n `Invalid step output for ${stepName} in execution ${executionId}`,\n );\n }\n\n const outputRaw = parsed.output;\n\n const [deserializeError, value] = this.deserializeStepOutput(outputRaw);\n\n if (deserializeError) {\n return err(deserializeError.type, deserializeError.message);\n }\n\n return ok({ found: true, value: value as TStep });\n }\n\n private async readStepNames(executionId: string) {\n const [readError, stepsRaw] = await this.getMeta(executionId, \"steps\");\n\n if (readError) {\n return [readError, []] as const;\n }\n\n if (!stepsRaw) {\n return ok([] as string[]);\n }\n\n const [parseError, values] = mightThrowSync(() => JSON.parse(stepsRaw));\n\n if (parseError || !Array.isArray(values)) {\n return err(\n \"WorkflowStateError\",\n `Invalid step index for execution ${executionId}`,\n );\n }\n\n const stepNames: string[] = [];\n\n for (const value of values) {\n if (typeof value === \"string\") {\n stepNames.push(value);\n }\n }\n\n return ok(stepNames);\n }\n\n private async readStepSnapshots(executionId: string) {\n const [stepNamesError, stepNames] = await this.readStepNames(executionId);\n\n if (stepNamesError) {\n return [stepNamesError, []] as const;\n }\n\n const steps: StepSnapshot[] = [];\n\n for (const stepName of stepNames) {\n const [readError, payloadRaw] = await mightThrow(\n this.options.redis.hget(this.stepsKey(executionId), stepName),\n );\n\n if (readError) {\n return err(\n \"WorkflowError\",\n `Unable to read step ${stepName} for execution ${executionId}`,\n );\n }\n\n if (!payloadRaw) {\n continue;\n }\n\n if (typeof payloadRaw !== \"string\") {\n return err(\n \"WorkflowStateError\",\n `Invalid step payload for ${stepName} in execution ${executionId}`,\n );\n }\n\n const [parseError, parsed] = mightThrowSync(() => JSON.parse(payloadRaw));\n\n if (parseError || parsed === null || typeof parsed !== \"object\") {\n return err(\n \"WorkflowStateError\",\n `Invalid step payload for ${stepName} in execution ${executionId}`,\n );\n }\n\n if (typeof parsed.completedAt !== \"number\") {\n return err(\n \"WorkflowStateError\",\n `Invalid step payload for ${stepName} in execution ${executionId}`,\n );\n }\n\n const completedAt = parsed.completedAt;\n\n steps.push({\n name: stepName,\n completedAt,\n });\n }\n\n return ok(steps);\n }\n\n private normalizeStatus(value: string) {\n for (const status of knownStatuses) {\n if (status === value) {\n return status;\n }\n }\n\n return null;\n }\n}\n\nexport const defineWorkflow = <TInput, TResult = void>(\n options: WorkflowOptions<TInput, TResult>,\n): Workflow<TInput, TResult> => {\n const workflow = new WorkflowDefinition(options);\n\n return {\n start: (input, startOptions) => workflow.start(input, startOptions),\n run: (input, startOptions) => workflow.run(input, startOptions),\n resume: (executionId) => workflow.resume(executionId),\n get: (executionId) => workflow.get(executionId),\n cancel: (executionId) => workflow.cancel(executionId),\n };\n};\n\nexport type {\n StepHandler,\n Workflow,\n WorkflowError,\n WorkflowExecution,\n WorkflowHandlerContext,\n WorkflowMeta,\n WorkflowMetaField,\n WorkflowOptions,\n WorkflowStartOptions,\n WorkflowStartResult,\n WorkflowStatus,\n} from \"./types.js\";\n"],"mappings":"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"}
@@ -1,99 +0,0 @@
1
- const require_lib_errors_index = require("../../lib/errors/index.cjs");
2
- const require_index = require("../formatter/index.cjs");
3
- let node_path = require("node:path");
4
- //#region src/lib/logging/core/index.ts
5
- const PROVIDER_OPTION_DEFAULT = {
6
- formatter: new require_index.BaseFormatter(),
7
- level: "debug"
8
- };
9
- const STACK_FRAME_IDX = 1;
10
- var StackData = class {
11
- stack = [];
12
- constructor(fn) {
13
- const oldStackTrace = Error.prepareStackTrace;
14
- const [stackTraceError] = require_lib_errors_index.mightThrowSync(() => {
15
- Error.prepareStackTrace = (_, stack) => {
16
- return stack.map((callSite) => {
17
- return {
18
- fileName: callSite.getFileName(),
19
- column: callSite.getColumnNumber(),
20
- row: callSite.getLineNumber(),
21
- functionCall: callSite.getFunctionName()
22
- };
23
- });
24
- };
25
- Error.captureStackTrace(this, fn);
26
- this.stack;
27
- });
28
- Error.prepareStackTrace = oldStackTrace;
29
- if (stackTraceError) this.stack = [];
30
- }
31
- retrieveFrame() {
32
- if (this.stack.length === 0) return void 0;
33
- return this.stack[STACK_FRAME_IDX];
34
- }
35
- };
36
- var AbstractLogger = class {
37
- providers;
38
- prefix;
39
- constructor(prefix, providers) {
40
- this.prefix = prefix;
41
- this.providers = providers;
42
- }
43
- createLogData(level, msg, prefix) {
44
- const logCall = new StackData(this.createLogData).retrieveFrame();
45
- let logData = {
46
- level,
47
- msg,
48
- prefix
49
- };
50
- if (!logCall) return logData;
51
- const { column, fileName, functionCall, row } = logCall;
52
- if (fileName) logData = {
53
- ...logData,
54
- fileName: (0, node_path.basename)(fileName)
55
- };
56
- if (column) logData = {
57
- ...logData,
58
- column: String(column)
59
- };
60
- if (row) logData = {
61
- ...logData,
62
- row: String(row)
63
- };
64
- if (functionCall) logData = {
65
- ...logData,
66
- method: functionCall
67
- };
68
- return logData;
69
- }
70
- };
71
- var Logger = class extends AbstractLogger {
72
- debug(msg) {
73
- const data = this.createLogData("debug", msg, this.prefix);
74
- this.run(data);
75
- }
76
- info(msg) {
77
- const data = this.createLogData("info", msg, this.prefix);
78
- this.run(data);
79
- }
80
- warning(msg) {
81
- const data = this.createLogData("warning", msg, this.prefix);
82
- this.run(data);
83
- }
84
- error(msg) {
85
- const data = this.createLogData("error", msg, this.prefix);
86
- this.run(data);
87
- }
88
- critical(msg) {
89
- const data = this.createLogData("critical", msg, this.prefix);
90
- this.run(data);
91
- }
92
- run(data) {
93
- for (let i = 0; i < this.providers.length; i++) this.providers[i]?.execute(data);
94
- }
95
- };
96
- //#endregion
97
- exports.AbstractLogger = AbstractLogger;
98
- exports.Logger = Logger;
99
- exports.PROVIDER_OPTION_DEFAULT = PROVIDER_OPTION_DEFAULT;
@@ -1,26 +0,0 @@
1
- import { LogDataType, LogLevelType, LogMessageType } from "./types.cjs";
2
- import { LoggerProvider } from "../provider/index.cjs";
3
-
4
- //#region src/lib/logging/core/index.d.ts
5
- declare abstract class AbstractLogger {
6
- protected providers: LoggerProvider[];
7
- protected prefix: string;
8
- constructor(prefix: string, providers: [LoggerProvider, ...LoggerProvider[]]);
9
- abstract debug(msg: LogMessageType): void;
10
- abstract info(msg: LogMessageType): void;
11
- abstract warning(msg: LogMessageType): void;
12
- abstract error(msg: LogMessageType): void;
13
- abstract critical(msg: LogMessageType): void;
14
- protected createLogData(level: LogLevelType, msg: LogMessageType, prefix: string): LogDataType;
15
- }
16
- declare class Logger extends AbstractLogger {
17
- debug(msg: LogMessageType): void;
18
- info(msg: LogMessageType): void;
19
- warning(msg: LogMessageType): void;
20
- error(msg: LogMessageType): void;
21
- critical(msg: LogMessageType): void;
22
- private run;
23
- }
24
- //#endregion
25
- export { AbstractLogger, Logger };
26
- //# sourceMappingURL=index.d.cts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../../../src/lib/logging/core/index.ts"],"mappings":";;;;uBAuDsB,cAAA;EAAA,UACV,SAAA,EAAW,cAAA;EAAA,UACX,MAAA;cAGR,MAAA,UACA,SAAA,GAAY,cAAA,KAAmB,cAAA;EAAA,SAMjB,KAAA,CAAM,GAAA,EAAK,cAAA;EAAA,SACX,IAAA,CAAK,GAAA,EAAK,cAAA;EAAA,SACV,OAAA,CAAQ,GAAA,EAAK,cAAA;EAAA,SACb,KAAA,CAAM,GAAA,EAAK,cAAA;EAAA,SACX,QAAA,CAAS,GAAA,EAAK,cAAA;EAAA,UAEpB,aAAA,CACR,KAAA,EAAO,YAAA,EACP,GAAA,EAAK,cAAA,EACL,MAAA,WACC,WAAA;AAAA;AAAA,cA+BQ,MAAA,SAAe,cAAA;EACnB,KAAA,CAAM,GAAA,EAAK,cAAA;EAKX,IAAA,CAAK,GAAA,EAAK,cAAA;EAKV,OAAA,CAAQ,GAAA,EAAK,cAAA;EAKb,KAAA,CAAM,GAAA,EAAK,cAAA;EAKX,QAAA,CAAS,GAAA,EAAK,cAAA;EAAA,QAKb,GAAA;AAAA"}
@@ -1,26 +0,0 @@
1
- import { LogDataType, LogLevelType, LogMessageType } from "./types.mjs";
2
- import { LoggerProvider } from "../provider/index.mjs";
3
-
4
- //#region src/lib/logging/core/index.d.ts
5
- declare abstract class AbstractLogger {
6
- protected providers: LoggerProvider[];
7
- protected prefix: string;
8
- constructor(prefix: string, providers: [LoggerProvider, ...LoggerProvider[]]);
9
- abstract debug(msg: LogMessageType): void;
10
- abstract info(msg: LogMessageType): void;
11
- abstract warning(msg: LogMessageType): void;
12
- abstract error(msg: LogMessageType): void;
13
- abstract critical(msg: LogMessageType): void;
14
- protected createLogData(level: LogLevelType, msg: LogMessageType, prefix: string): LogDataType;
15
- }
16
- declare class Logger extends AbstractLogger {
17
- debug(msg: LogMessageType): void;
18
- info(msg: LogMessageType): void;
19
- warning(msg: LogMessageType): void;
20
- error(msg: LogMessageType): void;
21
- critical(msg: LogMessageType): void;
22
- private run;
23
- }
24
- //#endregion
25
- export { AbstractLogger, Logger };
26
- //# sourceMappingURL=index.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../../src/lib/logging/core/index.ts"],"mappings":";;;;uBAuDsB,cAAA;EAAA,UACV,SAAA,EAAW,cAAA;EAAA,UACX,MAAA;cAGR,MAAA,UACA,SAAA,GAAY,cAAA,KAAmB,cAAA;EAAA,SAMjB,KAAA,CAAM,GAAA,EAAK,cAAA;EAAA,SACX,IAAA,CAAK,GAAA,EAAK,cAAA;EAAA,SACV,OAAA,CAAQ,GAAA,EAAK,cAAA;EAAA,SACb,KAAA,CAAM,GAAA,EAAK,cAAA;EAAA,SACX,QAAA,CAAS,GAAA,EAAK,cAAA;EAAA,UAEpB,aAAA,CACR,KAAA,EAAO,YAAA,EACP,GAAA,EAAK,cAAA,EACL,MAAA,WACC,WAAA;AAAA;AAAA,cA+BQ,MAAA,SAAe,cAAA;EACnB,KAAA,CAAM,GAAA,EAAK,cAAA;EAKX,IAAA,CAAK,GAAA,EAAK,cAAA;EAKV,OAAA,CAAQ,GAAA,EAAK,cAAA;EAKb,KAAA,CAAM,GAAA,EAAK,cAAA;EAKX,QAAA,CAAS,GAAA,EAAK,cAAA;EAAA,QAKb,GAAA;AAAA"}
@@ -1,99 +0,0 @@
1
- import { mightThrowSync } from "../../lib/errors/index.mjs";
2
- import { BaseFormatter } from "../formatter/index.mjs";
3
- import { basename } from "node:path";
4
- //#region src/lib/logging/core/index.ts
5
- const PROVIDER_OPTION_DEFAULT = {
6
- formatter: new BaseFormatter(),
7
- level: "debug"
8
- };
9
- const STACK_FRAME_IDX = 1;
10
- var StackData = class {
11
- stack = [];
12
- constructor(fn) {
13
- const oldStackTrace = Error.prepareStackTrace;
14
- const [stackTraceError] = mightThrowSync(() => {
15
- Error.prepareStackTrace = (_, stack) => {
16
- return stack.map((callSite) => {
17
- return {
18
- fileName: callSite.getFileName(),
19
- column: callSite.getColumnNumber(),
20
- row: callSite.getLineNumber(),
21
- functionCall: callSite.getFunctionName()
22
- };
23
- });
24
- };
25
- Error.captureStackTrace(this, fn);
26
- this.stack;
27
- });
28
- Error.prepareStackTrace = oldStackTrace;
29
- if (stackTraceError) this.stack = [];
30
- }
31
- retrieveFrame() {
32
- if (this.stack.length === 0) return void 0;
33
- return this.stack[STACK_FRAME_IDX];
34
- }
35
- };
36
- var AbstractLogger = class {
37
- providers;
38
- prefix;
39
- constructor(prefix, providers) {
40
- this.prefix = prefix;
41
- this.providers = providers;
42
- }
43
- createLogData(level, msg, prefix) {
44
- const logCall = new StackData(this.createLogData).retrieveFrame();
45
- let logData = {
46
- level,
47
- msg,
48
- prefix
49
- };
50
- if (!logCall) return logData;
51
- const { column, fileName, functionCall, row } = logCall;
52
- if (fileName) logData = {
53
- ...logData,
54
- fileName: basename(fileName)
55
- };
56
- if (column) logData = {
57
- ...logData,
58
- column: String(column)
59
- };
60
- if (row) logData = {
61
- ...logData,
62
- row: String(row)
63
- };
64
- if (functionCall) logData = {
65
- ...logData,
66
- method: functionCall
67
- };
68
- return logData;
69
- }
70
- };
71
- var Logger = class extends AbstractLogger {
72
- debug(msg) {
73
- const data = this.createLogData("debug", msg, this.prefix);
74
- this.run(data);
75
- }
76
- info(msg) {
77
- const data = this.createLogData("info", msg, this.prefix);
78
- this.run(data);
79
- }
80
- warning(msg) {
81
- const data = this.createLogData("warning", msg, this.prefix);
82
- this.run(data);
83
- }
84
- error(msg) {
85
- const data = this.createLogData("error", msg, this.prefix);
86
- this.run(data);
87
- }
88
- critical(msg) {
89
- const data = this.createLogData("critical", msg, this.prefix);
90
- this.run(data);
91
- }
92
- run(data) {
93
- for (let i = 0; i < this.providers.length; i++) this.providers[i]?.execute(data);
94
- }
95
- };
96
- //#endregion
97
- export { AbstractLogger, Logger, PROVIDER_OPTION_DEFAULT };
98
-
99
- //# sourceMappingURL=index.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/lib/logging/core/index.ts"],"sourcesContent":["import { basename } from \"node:path\";\nimport { mightThrowSync } from \"../../errors/index.js\";\nimport { BaseFormatter } from \"../formatter/index.js\";\nimport type { LoggerProvider } from \"../provider/index.js\";\nimport type { ProviderOptions } from \"../provider/types.js\";\nimport type { LogDataType, LogLevelType, LogMessageType } from \"./types.js\";\n\nexport const PROVIDER_OPTION_DEFAULT: ProviderOptions = {\n formatter: new BaseFormatter(),\n level: \"debug\",\n} as const;\n\nconst STACK_FRAME_IDX = 1;\n\nexport type StackTraceData = {\n fileName: string | null;\n column: number | null;\n row: number | null;\n functionCall: string | null;\n};\n\nexport class StackData {\n private stack: StackTraceData[] = [];\n\n public constructor(fn: Function) {\n const oldStackTrace = Error.prepareStackTrace;\n const [stackTraceError] = mightThrowSync(() => {\n Error.prepareStackTrace = (_, stack) => {\n return stack.map<StackTraceData>((callSite) => {\n return {\n fileName: callSite.getFileName(),\n column: callSite.getColumnNumber(),\n row: callSite.getLineNumber(),\n functionCall: callSite.getFunctionName(),\n };\n });\n };\n\n Error.captureStackTrace(this, fn);\n this.stack; // Invoke the getter for `stack`.\n });\n\n Error.prepareStackTrace = oldStackTrace;\n if (stackTraceError) this.stack = [];\n }\n\n public retrieveFrame() {\n if (this.stack.length === 0) return undefined;\n\n // Access the second stack frame because I need to ignore\n // a logging function's stack frame (e.g \"debug()\" and \"info()\")\n return this.stack[STACK_FRAME_IDX];\n }\n}\n\nexport abstract class AbstractLogger {\n protected providers: LoggerProvider[];\n protected prefix: string;\n\n public constructor(\n prefix: string,\n providers: [LoggerProvider, ...LoggerProvider[]],\n ) {\n this.prefix = prefix;\n this.providers = providers;\n }\n\n public abstract debug(msg: LogMessageType): void;\n public abstract info(msg: LogMessageType): void;\n public abstract warning(msg: LogMessageType): void;\n public abstract error(msg: LogMessageType): void;\n public abstract critical(msg: LogMessageType): void;\n\n protected createLogData(\n level: LogLevelType,\n msg: LogMessageType,\n prefix: string,\n ): LogDataType {\n const stack = new StackData(this.createLogData);\n const logCall = stack.retrieveFrame();\n let logData: LogDataType = { level, msg, prefix };\n\n if (!logCall) {\n return logData;\n }\n\n const { column, fileName, functionCall, row } = logCall;\n\n if (fileName) {\n logData = { ...logData, fileName: basename(fileName) };\n }\n\n if (column) {\n logData = { ...logData, column: String(column) };\n }\n\n if (row) {\n logData = { ...logData, row: String(row) };\n }\n\n if (functionCall) {\n logData = { ...logData, method: functionCall };\n }\n\n return logData;\n }\n}\n\nexport class Logger extends AbstractLogger {\n public debug(msg: LogMessageType) {\n const data = this.createLogData(\"debug\", msg, this.prefix);\n this.run(data);\n }\n\n public info(msg: LogMessageType) {\n const data = this.createLogData(\"info\", msg, this.prefix);\n this.run(data);\n }\n\n public warning(msg: LogMessageType) {\n const data = this.createLogData(\"warning\", msg, this.prefix);\n this.run(data);\n }\n\n public error(msg: LogMessageType) {\n const data = this.createLogData(\"error\", msg, this.prefix);\n this.run(data);\n }\n\n public critical(msg: LogMessageType) {\n const data = this.createLogData(\"critical\", msg, this.prefix);\n this.run(data);\n }\n\n private run(data: LogDataType) {\n for (let i = 0; i < this.providers.length; i++) {\n const provider = this.providers[i];\n provider?.execute(data);\n }\n }\n}\n"],"mappings":";;;;AAOA,MAAa,0BAA2C;CACtD,WAAW,IAAI,eAAe;CAC9B,OAAO;CACR;AAED,MAAM,kBAAkB;AASxB,IAAa,YAAb,MAAuB;CACrB,QAAkC,EAAE;CAEpC,YAAmB,IAAc;EAC/B,MAAM,gBAAgB,MAAM;EAC5B,MAAM,CAAC,mBAAmB,qBAAqB;AAC7C,SAAM,qBAAqB,GAAG,UAAU;AACtC,WAAO,MAAM,KAAqB,aAAa;AAC7C,YAAO;MACL,UAAU,SAAS,aAAa;MAChC,QAAQ,SAAS,iBAAiB;MAClC,KAAK,SAAS,eAAe;MAC7B,cAAc,SAAS,iBAAiB;MACzC;MACD;;AAGJ,SAAM,kBAAkB,MAAM,GAAG;AACjC,QAAK;IACL;AAEF,QAAM,oBAAoB;AAC1B,MAAI,gBAAiB,MAAK,QAAQ,EAAE;;CAGtC,gBAAuB;AACrB,MAAI,KAAK,MAAM,WAAW,EAAG,QAAO,KAAA;AAIpC,SAAO,KAAK,MAAM;;;AAItB,IAAsB,iBAAtB,MAAqC;CACnC;CACA;CAEA,YACE,QACA,WACA;AACA,OAAK,SAAS;AACd,OAAK,YAAY;;CASnB,cACE,OACA,KACA,QACa;EAEb,MAAM,UADQ,IAAI,UAAU,KAAK,cAAc,CACzB,eAAe;EACrC,IAAI,UAAuB;GAAE;GAAO;GAAK;GAAQ;AAEjD,MAAI,CAAC,QACH,QAAO;EAGT,MAAM,EAAE,QAAQ,UAAU,cAAc,QAAQ;AAEhD,MAAI,SACF,WAAU;GAAE,GAAG;GAAS,UAAU,SAAS,SAAS;GAAE;AAGxD,MAAI,OACF,WAAU;GAAE,GAAG;GAAS,QAAQ,OAAO,OAAO;GAAE;AAGlD,MAAI,IACF,WAAU;GAAE,GAAG;GAAS,KAAK,OAAO,IAAI;GAAE;AAG5C,MAAI,aACF,WAAU;GAAE,GAAG;GAAS,QAAQ;GAAc;AAGhD,SAAO;;;AAIX,IAAa,SAAb,cAA4B,eAAe;CACzC,MAAa,KAAqB;EAChC,MAAM,OAAO,KAAK,cAAc,SAAS,KAAK,KAAK,OAAO;AAC1D,OAAK,IAAI,KAAK;;CAGhB,KAAY,KAAqB;EAC/B,MAAM,OAAO,KAAK,cAAc,QAAQ,KAAK,KAAK,OAAO;AACzD,OAAK,IAAI,KAAK;;CAGhB,QAAe,KAAqB;EAClC,MAAM,OAAO,KAAK,cAAc,WAAW,KAAK,KAAK,OAAO;AAC5D,OAAK,IAAI,KAAK;;CAGhB,MAAa,KAAqB;EAChC,MAAM,OAAO,KAAK,cAAc,SAAS,KAAK,KAAK,OAAO;AAC1D,OAAK,IAAI,KAAK;;CAGhB,SAAgB,KAAqB;EACnC,MAAM,OAAO,KAAK,cAAc,YAAY,KAAK,KAAK,OAAO;AAC7D,OAAK,IAAI,KAAK;;CAGhB,IAAY,MAAmB;AAC7B,OAAK,IAAI,IAAI,GAAG,IAAI,KAAK,UAAU,QAAQ,IACxB,MAAK,UAAU,IACtB,QAAQ,KAAK"}
@@ -1,10 +0,0 @@
1
- //#region src/lib/logging/core/types.ts
2
- const LogLevel = {
3
- debug: 10,
4
- info: 20,
5
- warning: 30,
6
- error: 40,
7
- critical: 50
8
- };
9
- //#endregion
10
- exports.LogLevel = LogLevel;
@@ -1,22 +0,0 @@
1
- //#region src/lib/logging/core/types.d.ts
2
- declare const LogLevel: {
3
- readonly debug: 10;
4
- readonly info: 20;
5
- readonly warning: 30;
6
- readonly error: 40;
7
- readonly critical: 50;
8
- };
9
- type LogLevelType = keyof typeof LogLevel;
10
- type LogMessageType = string | object | number | boolean;
11
- type LogDataType = {
12
- prefix: string;
13
- level: LogLevelType;
14
- msg: LogMessageType;
15
- row?: string;
16
- column?: string;
17
- fileName?: string;
18
- method?: string;
19
- };
20
- //#endregion
21
- export { LogDataType, LogLevel, LogLevelType, LogMessageType };
22
- //# sourceMappingURL=types.d.cts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.cts","names":[],"sources":["../../../src/lib/logging/core/types.ts"],"mappings":";cAAa,QAAA;EAAA;;;;;;KAQD,YAAA,gBAA4B,QAAA;AAAA,KAE5B,cAAA;AAAA,KAEA,WAAA;EACV,MAAA;EACA,KAAA,EAAO,YAAA;EACP,GAAA,EAAK,cAAA;EACL,GAAA;EACA,MAAA;EACA,QAAA;EACA,MAAA;AAAA"}
@@ -1,22 +0,0 @@
1
- //#region src/lib/logging/core/types.d.ts
2
- declare const LogLevel: {
3
- readonly debug: 10;
4
- readonly info: 20;
5
- readonly warning: 30;
6
- readonly error: 40;
7
- readonly critical: 50;
8
- };
9
- type LogLevelType = keyof typeof LogLevel;
10
- type LogMessageType = string | object | number | boolean;
11
- type LogDataType = {
12
- prefix: string;
13
- level: LogLevelType;
14
- msg: LogMessageType;
15
- row?: string;
16
- column?: string;
17
- fileName?: string;
18
- method?: string;
19
- };
20
- //#endregion
21
- export { LogDataType, LogLevel, LogLevelType, LogMessageType };
22
- //# sourceMappingURL=types.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.mts","names":[],"sources":["../../../src/lib/logging/core/types.ts"],"mappings":";cAAa,QAAA;EAAA;;;;;;KAQD,YAAA,gBAA4B,QAAA;AAAA,KAE5B,cAAA;AAAA,KAEA,WAAA;EACV,MAAA;EACA,KAAA,EAAO,YAAA;EACP,GAAA,EAAK,cAAA;EACL,GAAA;EACA,MAAA;EACA,QAAA;EACA,MAAA;AAAA"}
@@ -1,12 +0,0 @@
1
- //#region src/lib/logging/core/types.ts
2
- const LogLevel = {
3
- debug: 10,
4
- info: 20,
5
- warning: 30,
6
- error: 40,
7
- critical: 50
8
- };
9
- //#endregion
10
- export { LogLevel };
11
-
12
- //# sourceMappingURL=types.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.mjs","names":[],"sources":["../../../src/lib/logging/core/types.ts"],"sourcesContent":["export const LogLevel = {\n debug: 10,\n info: 20,\n warning: 30,\n error: 40,\n critical: 50,\n} as const;\n\nexport type LogLevelType = keyof typeof LogLevel;\n\nexport type LogMessageType = string | object | number | boolean;\n\nexport type LogDataType = {\n prefix: string;\n level: LogLevelType;\n msg: LogMessageType;\n row?: string;\n column?: string;\n fileName?: string;\n method?: string;\n};\n"],"mappings":";AAAA,MAAa,WAAW;CACtB,OAAO;CACP,MAAM;CACN,SAAS;CACT,OAAO;CACP,UAAU;CACX"}
@@ -1,119 +0,0 @@
1
- //#region src/lib/logging/formatter/index.ts
2
- var Formatter = class {
3
- dateFmt;
4
- constructor(dateFmt) {
5
- this.dateFmt = dateFmt;
6
- }
7
- };
8
- var BaseFormatter = class extends Formatter {
9
- constructor(dateFmt = isoDateTimeFormat) {
10
- super(dateFmt);
11
- }
12
- format(logData) {
13
- let { prefix, level, msg, fileName, row, column, method } = logData;
14
- const timestamp = this.dateFmt();
15
- const levelType = level.toUpperCase();
16
- if (typeof msg === "object") msg = JSON.stringify(msg);
17
- const fileData = `${prefix}/${fileName}:${row}:${column}`;
18
- let header = `[${levelType}]`;
19
- if (method) header = `${header}\t[${method}]\t[${fileData}]`;
20
- else header = `${header}\t[${fileData}]`;
21
- return `${timestamp} ${header} : ${msg}`;
22
- }
23
- formatError(logData, error) {
24
- const { prefix, fileName, row, column, method } = logData;
25
- const timestamp = this.dateFmt();
26
- const fileData = `${prefix}/${fileName}:${row}:${column}`;
27
- let errorMsg = `Error name="${error.name}" Error message="${error.message}"`;
28
- let header = "[ERROR]";
29
- if (method) header = `${header}\t[${method}]\t[${fileData}]`;
30
- else header = `${header}\t[${fileData}]`;
31
- if (error.cause) errorMsg = `${errorMsg}\n\tError cause="${error.cause}"`;
32
- if (error.stack) errorMsg = `${errorMsg}\n\tStack trace="${error.stack}"`;
33
- return `${timestamp} ${header} : ${errorMsg}`;
34
- }
35
- };
36
- var JSONFormatter = class extends Formatter {
37
- constructor(dateFmt = isoDateTimeFormat) {
38
- super(dateFmt);
39
- }
40
- format(logData) {
41
- const { prefix, level, msg, fileName, row, column, method } = logData;
42
- const timestamp = this.dateFmt();
43
- const levelType = level.toUpperCase();
44
- let position = {};
45
- if (method) position = { method };
46
- position = {
47
- ...position,
48
- fileName,
49
- row,
50
- column
51
- };
52
- return JSON.stringify({
53
- timestamp,
54
- level: levelType,
55
- prefix,
56
- position,
57
- msg
58
- });
59
- }
60
- formatError(logData, error) {
61
- const { prefix, fileName, row, column, method } = logData;
62
- const timestamp = this.dateFmt();
63
- let errorMsg = {
64
- errorName: error.name,
65
- errorMessage: error.message
66
- };
67
- let position = {};
68
- if (method) position = { method };
69
- position = {
70
- ...position,
71
- fileName,
72
- row,
73
- column
74
- };
75
- if (error.cause) errorMsg = {
76
- ...errorMsg,
77
- errorCause: error.cause
78
- };
79
- if (error.stack) errorMsg = {
80
- ...errorMsg,
81
- stackTrace: error.stack
82
- };
83
- return JSON.stringify({
84
- timestamp,
85
- level: "ERROR",
86
- prefix,
87
- position,
88
- msg: errorMsg
89
- });
90
- }
91
- };
92
- function isoDateTimeFormat() {
93
- return (/* @__PURE__ */ new Date()).toISOString();
94
- }
95
- function isoDateFormat() {
96
- const date = isoDateTimeFormat().split("T")[0];
97
- if (!date) return "";
98
- return date;
99
- }
100
- function dmyFormat() {
101
- const isoDate = isoDateFormat();
102
- if (!isoDate) return "";
103
- const info = isoDate.split("-");
104
- return `${info[2]}-${info[1]}-${info[0]}`;
105
- }
106
- function mdyFormat() {
107
- const isoDate = isoDateFormat();
108
- if (!isoDate) return "";
109
- const info = isoDate.split("-");
110
- return `${info[1]}-${info[2]}-${info[0]}`;
111
- }
112
- //#endregion
113
- exports.BaseFormatter = BaseFormatter;
114
- exports.Formatter = Formatter;
115
- exports.JSONFormatter = JSONFormatter;
116
- exports.dmyFormat = dmyFormat;
117
- exports.isoDateFormat = isoDateFormat;
118
- exports.isoDateTimeFormat = isoDateTimeFormat;
119
- exports.mdyFormat = mdyFormat;