@effect-app/infra 4.0.0-beta.25 → 4.0.0-beta.250

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 (472) hide show
  1. package/CHANGELOG.md +1892 -0
  2. package/_check.sh +1 -1
  3. package/dist/CUPS.d.ts +30 -11
  4. package/dist/CUPS.d.ts.map +1 -1
  5. package/dist/CUPS.js +35 -14
  6. package/dist/ContextProvider.d.ts +34 -0
  7. package/dist/ContextProvider.d.ts.map +1 -0
  8. package/dist/ContextProvider.js +40 -0
  9. package/dist/Emailer/Sendgrid.d.ts +111 -147
  10. package/dist/Emailer/Sendgrid.d.ts.map +1 -1
  11. package/dist/Emailer/Sendgrid.js +24 -19
  12. package/dist/Emailer/fake.d.ts +2 -2
  13. package/dist/Emailer/fake.d.ts.map +1 -1
  14. package/dist/Emailer/fake.js +4 -4
  15. package/dist/MainFiberSet.d.ts +12 -9
  16. package/dist/MainFiberSet.d.ts.map +1 -1
  17. package/dist/MainFiberSet.js +10 -6
  18. package/dist/QueueMaker/SQLQueue.d.ts +8 -9
  19. package/dist/QueueMaker/SQLQueue.d.ts.map +1 -1
  20. package/dist/QueueMaker/SQLQueue.js +138 -120
  21. package/dist/QueueMaker/errors.d.ts +5 -3
  22. package/dist/QueueMaker/errors.d.ts.map +1 -1
  23. package/dist/QueueMaker/errors.js +4 -2
  24. package/dist/QueueMaker/memQueue.d.ts +10 -6
  25. package/dist/QueueMaker/memQueue.d.ts.map +1 -1
  26. package/dist/QueueMaker/memQueue.js +84 -68
  27. package/dist/QueueMaker/sbqueue.d.ts +9 -5
  28. package/dist/QueueMaker/sbqueue.d.ts.map +1 -1
  29. package/dist/QueueMaker/sbqueue.js +60 -58
  30. package/dist/RequestFiberSet.d.ts +10 -7
  31. package/dist/RequestFiberSet.d.ts.map +1 -1
  32. package/dist/RequestFiberSet.js +13 -8
  33. package/dist/SQL/Model.d.ts +468 -0
  34. package/dist/SQL/Model.d.ts.map +1 -0
  35. package/dist/SQL/Model.js +469 -0
  36. package/dist/SQL.d.ts +2 -0
  37. package/dist/SQL.d.ts.map +1 -0
  38. package/dist/{adapters/SQL.js → SQL.js} +1 -1
  39. package/dist/ServiceBus.d.ts +61 -0
  40. package/dist/ServiceBus.d.ts.map +1 -0
  41. package/dist/ServiceBus.js +108 -0
  42. package/dist/Store/Cosmos/query.d.ts +15 -4
  43. package/dist/Store/Cosmos/query.d.ts.map +1 -1
  44. package/dist/Store/Cosmos/query.js +179 -41
  45. package/dist/Store/Cosmos.d.ts +3 -3
  46. package/dist/Store/Cosmos.d.ts.map +1 -1
  47. package/dist/Store/Cosmos.js +345 -246
  48. package/dist/Store/Disk.d.ts +5 -5
  49. package/dist/Store/Disk.d.ts.map +1 -1
  50. package/dist/Store/Disk.js +77 -37
  51. package/dist/Store/Memory.d.ts +9 -6
  52. package/dist/Store/Memory.d.ts.map +1 -1
  53. package/dist/Store/Memory.js +328 -63
  54. package/dist/Store/SQL/Pg.d.ts +4 -0
  55. package/dist/Store/SQL/Pg.d.ts.map +1 -0
  56. package/dist/Store/SQL/Pg.js +233 -0
  57. package/dist/Store/SQL/query.d.ts +49 -0
  58. package/dist/Store/SQL/query.d.ts.map +1 -0
  59. package/dist/Store/SQL/query.js +527 -0
  60. package/dist/Store/SQL.d.ts +21 -0
  61. package/dist/Store/SQL.d.ts.map +1 -0
  62. package/dist/Store/SQL.js +450 -0
  63. package/dist/Store/codeFilter.d.ts +5 -5
  64. package/dist/Store/codeFilter.d.ts.map +1 -1
  65. package/dist/Store/codeFilter.js +6 -3
  66. package/dist/Store/index.d.ts +7 -5
  67. package/dist/Store/index.d.ts.map +1 -1
  68. package/dist/Store/index.js +18 -5
  69. package/dist/Store/utils.d.ts +4 -3
  70. package/dist/Store/utils.d.ts.map +1 -1
  71. package/dist/Store/utils.js +5 -5
  72. package/dist/arbs.d.ts +2 -2
  73. package/dist/arbs.d.ts.map +1 -1
  74. package/dist/arbs.js +5 -3
  75. package/dist/codec.d.ts +5 -0
  76. package/dist/codec.d.ts.map +1 -0
  77. package/dist/codec.js +5 -0
  78. package/dist/cosmos-client.d.ts +16 -0
  79. package/dist/cosmos-client.d.ts.map +1 -0
  80. package/dist/cosmos-client.js +11 -0
  81. package/dist/errorReporter.d.ts +7 -5
  82. package/dist/errorReporter.d.ts.map +1 -1
  83. package/dist/errorReporter.js +23 -27
  84. package/dist/errors.d.ts +1 -1
  85. package/dist/fileUtil.d.ts +2 -2
  86. package/dist/fileUtil.d.ts.map +1 -1
  87. package/dist/fileUtil.js +2 -2
  88. package/dist/index.d.ts +3 -2
  89. package/dist/index.d.ts.map +1 -1
  90. package/dist/index.js +3 -2
  91. package/dist/internal/RequestContextMiddleware.d.ts +5 -0
  92. package/dist/internal/RequestContextMiddleware.d.ts.map +1 -0
  93. package/dist/internal/RequestContextMiddleware.js +46 -0
  94. package/dist/internal/auth.d.ts +53 -0
  95. package/dist/internal/auth.d.ts.map +1 -0
  96. package/dist/internal/auth.js +180 -0
  97. package/dist/internal/events.d.ts +11 -0
  98. package/dist/internal/events.d.ts.map +1 -0
  99. package/dist/internal/events.js +49 -0
  100. package/dist/internal/health.d.ts +3 -0
  101. package/dist/internal/health.d.ts.map +1 -0
  102. package/dist/internal/health.js +5 -0
  103. package/dist/layerUtils.d.ts +32 -0
  104. package/dist/layerUtils.d.ts.map +1 -0
  105. package/dist/layerUtils.js +17 -0
  106. package/dist/logger/jsonLogger.d.ts +2 -2
  107. package/dist/logger/jsonLogger.d.ts.map +1 -1
  108. package/dist/logger/jsonLogger.js +5 -3
  109. package/dist/logger/logFmtLogger.d.ts +2 -2
  110. package/dist/logger/logFmtLogger.d.ts.map +1 -1
  111. package/dist/logger/logFmtLogger.js +3 -3
  112. package/dist/logger/shared.d.ts +3 -3
  113. package/dist/logger/shared.d.ts.map +1 -1
  114. package/dist/logger/shared.js +4 -4
  115. package/dist/logger.d.ts +1 -1
  116. package/dist/logger.d.ts.map +1 -1
  117. package/dist/memQueue.d.ts +15 -0
  118. package/dist/memQueue.d.ts.map +1 -0
  119. package/dist/memQueue.js +21 -0
  120. package/dist/middlewares.d.ts +10 -0
  121. package/dist/middlewares.d.ts.map +1 -0
  122. package/dist/{api/middlewares.js → middlewares.js} +1 -1
  123. package/dist/mongo-client.d.ts +11 -0
  124. package/dist/mongo-client.d.ts.map +1 -0
  125. package/dist/mongo-client.js +15 -0
  126. package/dist/otel.d.ts +75 -0
  127. package/dist/otel.d.ts.map +1 -0
  128. package/dist/otel.js +65 -0
  129. package/dist/rateLimit.d.ts +12 -4
  130. package/dist/rateLimit.d.ts.map +1 -1
  131. package/dist/rateLimit.js +7 -12
  132. package/dist/redis-client.d.ts +42 -0
  133. package/dist/redis-client.d.ts.map +1 -0
  134. package/dist/redis-client.js +98 -0
  135. package/dist/reportError.d.ts +4 -0
  136. package/dist/reportError.d.ts.map +1 -0
  137. package/dist/reportError.js +28 -0
  138. package/dist/routing/middleware/RouterMiddleware.d.ts +16 -0
  139. package/dist/routing/middleware/RouterMiddleware.d.ts.map +1 -0
  140. package/dist/{api/routing → routing}/middleware/RouterMiddleware.js +1 -1
  141. package/dist/routing/middleware/middleware.d.ts +48 -0
  142. package/dist/routing/middleware/middleware.d.ts.map +1 -0
  143. package/dist/routing/middleware/middleware.js +128 -0
  144. package/dist/routing/middleware.d.ts +3 -0
  145. package/dist/routing/middleware.d.ts.map +1 -0
  146. package/dist/{api/routing → routing}/middleware.js +1 -2
  147. package/dist/routing/schema/jwt.d.ts +4 -0
  148. package/dist/routing/schema/jwt.d.ts.map +1 -0
  149. package/dist/routing/schema/jwt.js +13 -0
  150. package/dist/routing/tsort.d.ts +8 -0
  151. package/dist/routing/tsort.d.ts.map +1 -0
  152. package/dist/routing/tsort.js +51 -0
  153. package/dist/routing/utils.d.ts +19 -0
  154. package/dist/routing/utils.d.ts.map +1 -0
  155. package/dist/routing/utils.js +45 -0
  156. package/dist/routing.d.ts +184 -0
  157. package/dist/routing.d.ts.map +1 -0
  158. package/dist/routing.js +236 -0
  159. package/dist/setupRequest.d.ts +19 -0
  160. package/dist/setupRequest.d.ts.map +1 -0
  161. package/dist/setupRequest.js +70 -0
  162. package/dist/test.d.ts +3 -3
  163. package/dist/test.d.ts.map +1 -1
  164. package/dist/test.js +2 -2
  165. package/dist/util.d.ts +3 -0
  166. package/dist/util.d.ts.map +1 -0
  167. package/dist/util.js +14 -0
  168. package/dist/vitest.d.ts +1 -1
  169. package/examples/query.ts +47 -39
  170. package/package.json +123 -234
  171. package/src/CUPS.ts +52 -13
  172. package/src/{api/ContextProvider.ts → ContextProvider.ts} +19 -16
  173. package/src/Emailer/Sendgrid.ts +82 -59
  174. package/src/Emailer/fake.ts +3 -3
  175. package/src/MainFiberSet.ts +12 -10
  176. package/src/QueueMaker/SQLQueue.ts +153 -156
  177. package/src/QueueMaker/errors.ts +3 -1
  178. package/src/QueueMaker/memQueue.ts +113 -107
  179. package/src/QueueMaker/sbqueue.ts +78 -90
  180. package/src/RequestFiberSet.ts +13 -8
  181. package/src/{adapters/SQL → SQL}/Model.ts +42 -41
  182. package/src/ServiceBus.ts +219 -0
  183. package/src/Store/Cosmos/query.ts +216 -52
  184. package/src/Store/Cosmos.ts +494 -353
  185. package/src/Store/Disk.ts +108 -68
  186. package/src/Store/Memory.ts +367 -93
  187. package/src/Store/SQL/Pg.ts +364 -0
  188. package/src/Store/SQL/query.ts +603 -0
  189. package/src/Store/SQL.ts +736 -0
  190. package/src/Store/codeFilter.ts +8 -5
  191. package/src/Store/index.ts +21 -6
  192. package/src/Store/utils.ts +26 -24
  193. package/src/arbs.ts +5 -3
  194. package/src/{adapters/cosmos-client.ts → cosmos-client.ts} +5 -3
  195. package/src/errorReporter.ts +66 -76
  196. package/src/fileUtil.ts +1 -1
  197. package/src/index.ts +2 -1
  198. package/src/internal/RequestContextMiddleware.ts +60 -0
  199. package/src/internal/auth.ts +272 -0
  200. package/src/{api/internal → internal}/events.ts +22 -13
  201. package/src/{api/layerUtils.ts → layerUtils.ts} +14 -10
  202. package/src/logger/jsonLogger.ts +4 -2
  203. package/src/logger/logFmtLogger.ts +2 -2
  204. package/src/logger/shared.ts +4 -3
  205. package/src/{adapters/memQueue.ts → memQueue.ts} +5 -4
  206. package/src/{adapters/mongo-client.ts → mongo-client.ts} +4 -2
  207. package/src/otel.ts +152 -0
  208. package/src/rateLimit.ts +34 -23
  209. package/src/{adapters/redis-client.ts → redis-client.ts} +7 -3
  210. package/src/{api/reportError.ts → reportError.ts} +3 -2
  211. package/src/{api/routing → routing}/middleware/RouterMiddleware.ts +5 -4
  212. package/src/{api/routing → routing}/middleware/middleware.ts +62 -17
  213. package/src/routing/middleware.ts +4 -0
  214. package/src/{api/routing → routing}/schema/jwt.ts +2 -1
  215. package/src/{api/routing → routing}/utils.ts +2 -1
  216. package/src/routing.ts +768 -0
  217. package/src/setupRequest.ts +135 -0
  218. package/src/test.ts +2 -2
  219. package/test/auth.test.ts +101 -0
  220. package/test/contextProvider.test.ts +15 -12
  221. package/test/controller.test.ts +28 -32
  222. package/test/cosmos-query.test.ts +159 -0
  223. package/test/dist/auth.test.d.ts.map +1 -0
  224. package/test/dist/contextProvider.test.d.ts.map +1 -1
  225. package/test/dist/controller.test.d.ts.map +1 -1
  226. package/test/dist/cosmos-query.test.d.ts.map +1 -0
  227. package/test/dist/date-query.test.d.ts.map +1 -0
  228. package/test/dist/fixtures.d.ts +30 -12
  229. package/test/dist/fixtures.d.ts.map +1 -1
  230. package/test/dist/fixtures.js +17 -10
  231. package/test/dist/query.test.d.ts.map +1 -1
  232. package/test/dist/rawQuery.test.d.ts.map +1 -1
  233. package/test/dist/repository-ext.test.d.ts.map +1 -0
  234. package/test/dist/requires.test.d.ts.map +1 -1
  235. package/test/dist/router-generator.test.d.ts.map +1 -0
  236. package/test/dist/routing-interruptibility.test.d.ts.map +1 -0
  237. package/test/dist/rpc-context-map-streaming.test.d.ts.map +1 -0
  238. package/test/dist/rpc-e2e-invalidation.test.d.ts.map +1 -0
  239. package/test/dist/rpc-multi-middleware.test.d.ts.map +1 -1
  240. package/test/dist/rpc-stream-fullstack.test.d.ts.map +1 -0
  241. package/test/dist/sql-store.test.d.ts.map +1 -0
  242. package/test/fixtures.ts +16 -9
  243. package/test/layerUtils.test.ts +2 -2
  244. package/test/query.test.ts +903 -40
  245. package/test/rawQuery.test.ts +340 -22
  246. package/test/repository-ext.test.ts +62 -0
  247. package/test/requires.test.ts +10 -5
  248. package/test/router-generator.test.ts +187 -0
  249. package/test/routing-interruptibility.test.ts +66 -0
  250. package/test/rpc-context-map-streaming.test.ts +262 -0
  251. package/test/rpc-e2e-invalidation.test.ts +256 -0
  252. package/test/rpc-multi-middleware.test.ts +85 -10
  253. package/test/rpc-stream-fullstack.test.ts +304 -0
  254. package/test/sql-store.test.ts +1711 -0
  255. package/test/validateSample.test.ts +19 -14
  256. package/tsconfig.examples.json +1 -1
  257. package/tsconfig.json +2 -1
  258. package/tsconfig.json.bak +2 -2
  259. package/tsconfig.src.json +35 -35
  260. package/tsconfig.test.json +2 -2
  261. package/dist/Emailer/service.d.ts +0 -55
  262. package/dist/Emailer/service.d.ts.map +0 -1
  263. package/dist/Emailer/service.js +0 -6
  264. package/dist/Emailer.d.ts +0 -2
  265. package/dist/Emailer.d.ts.map +0 -1
  266. package/dist/Emailer.js +0 -2
  267. package/dist/Model/Repository/ext.d.ts +0 -41
  268. package/dist/Model/Repository/ext.d.ts.map +0 -1
  269. package/dist/Model/Repository/ext.js +0 -65
  270. package/dist/Model/Repository/internal/internal.d.ts +0 -59
  271. package/dist/Model/Repository/internal/internal.d.ts.map +0 -1
  272. package/dist/Model/Repository/internal/internal.js +0 -316
  273. package/dist/Model/Repository/legacy.d.ts +0 -19
  274. package/dist/Model/Repository/legacy.d.ts.map +0 -1
  275. package/dist/Model/Repository/legacy.js +0 -2
  276. package/dist/Model/Repository/makeRepo.d.ts +0 -49
  277. package/dist/Model/Repository/makeRepo.d.ts.map +0 -1
  278. package/dist/Model/Repository/makeRepo.js +0 -24
  279. package/dist/Model/Repository/service.d.ts +0 -89
  280. package/dist/Model/Repository/service.d.ts.map +0 -1
  281. package/dist/Model/Repository/service.js +0 -2
  282. package/dist/Model/Repository/validation.d.ts +0 -42
  283. package/dist/Model/Repository/validation.d.ts.map +0 -1
  284. package/dist/Model/Repository/validation.js +0 -32
  285. package/dist/Model/Repository.d.ts +0 -6
  286. package/dist/Model/Repository.d.ts.map +0 -1
  287. package/dist/Model/Repository.js +0 -6
  288. package/dist/Model/dsl.d.ts +0 -32
  289. package/dist/Model/dsl.d.ts.map +0 -1
  290. package/dist/Model/dsl.js +0 -44
  291. package/dist/Model/filter/filterApi.d.ts +0 -30
  292. package/dist/Model/filter/filterApi.d.ts.map +0 -1
  293. package/dist/Model/filter/filterApi.js +0 -2
  294. package/dist/Model/filter/types/errors.d.ts +0 -29
  295. package/dist/Model/filter/types/errors.d.ts.map +0 -1
  296. package/dist/Model/filter/types/errors.js +0 -2
  297. package/dist/Model/filter/types/fields.d.ts +0 -15
  298. package/dist/Model/filter/types/fields.d.ts.map +0 -1
  299. package/dist/Model/filter/types/fields.js +0 -2
  300. package/dist/Model/filter/types/path/common.d.ts +0 -316
  301. package/dist/Model/filter/types/path/common.d.ts.map +0 -1
  302. package/dist/Model/filter/types/path/common.js +0 -2
  303. package/dist/Model/filter/types/path/eager.d.ts +0 -95
  304. package/dist/Model/filter/types/path/eager.d.ts.map +0 -1
  305. package/dist/Model/filter/types/path/eager.js +0 -31
  306. package/dist/Model/filter/types/path/index.d.ts +0 -4
  307. package/dist/Model/filter/types/path/index.d.ts.map +0 -1
  308. package/dist/Model/filter/types/path/index.js +0 -3
  309. package/dist/Model/filter/types/utils.d.ts +0 -79
  310. package/dist/Model/filter/types/utils.d.ts.map +0 -1
  311. package/dist/Model/filter/types/utils.js +0 -2
  312. package/dist/Model/filter/types/validator.d.ts +0 -30
  313. package/dist/Model/filter/types/validator.d.ts.map +0 -1
  314. package/dist/Model/filter/types/validator.js +0 -2
  315. package/dist/Model/filter/types.d.ts +0 -5
  316. package/dist/Model/filter/types.d.ts.map +0 -1
  317. package/dist/Model/filter/types.js +0 -7
  318. package/dist/Model/query/dsl.d.ts +0 -248
  319. package/dist/Model/query/dsl.d.ts.map +0 -1
  320. package/dist/Model/query/dsl.js +0 -104
  321. package/dist/Model/query/new-kid-interpreter.d.ts +0 -28
  322. package/dist/Model/query/new-kid-interpreter.d.ts.map +0 -1
  323. package/dist/Model/query/new-kid-interpreter.js +0 -165
  324. package/dist/Model/query.d.ts +0 -15
  325. package/dist/Model/query.d.ts.map +0 -1
  326. package/dist/Model/query.js +0 -3
  327. package/dist/Model.d.ts +0 -4
  328. package/dist/Model.d.ts.map +0 -1
  329. package/dist/Model.js +0 -4
  330. package/dist/Operations.d.ts +0 -55
  331. package/dist/Operations.d.ts.map +0 -1
  332. package/dist/Operations.js +0 -102
  333. package/dist/OperationsRepo.d.ts +0 -41
  334. package/dist/OperationsRepo.d.ts.map +0 -1
  335. package/dist/OperationsRepo.js +0 -14
  336. package/dist/QueueMaker/service.d.ts +0 -11
  337. package/dist/QueueMaker/service.d.ts.map +0 -1
  338. package/dist/QueueMaker/service.js +0 -4
  339. package/dist/RequestContext.d.ts +0 -63
  340. package/dist/RequestContext.d.ts.map +0 -1
  341. package/dist/RequestContext.js +0 -49
  342. package/dist/Store/ContextMapContainer.d.ts +0 -14
  343. package/dist/Store/ContextMapContainer.d.ts.map +0 -1
  344. package/dist/Store/ContextMapContainer.js +0 -16
  345. package/dist/Store/service.d.ts +0 -108
  346. package/dist/Store/service.d.ts.map +0 -1
  347. package/dist/Store/service.js +0 -71
  348. package/dist/Store.d.ts +0 -2
  349. package/dist/Store.d.ts.map +0 -1
  350. package/dist/Store.js +0 -2
  351. package/dist/adapters/SQL/Model.d.ts +0 -479
  352. package/dist/adapters/SQL/Model.d.ts.map +0 -1
  353. package/dist/adapters/SQL/Model.js +0 -478
  354. package/dist/adapters/SQL.d.ts +0 -2
  355. package/dist/adapters/SQL.d.ts.map +0 -1
  356. package/dist/adapters/ServiceBus.d.ts +0 -58
  357. package/dist/adapters/ServiceBus.d.ts.map +0 -1
  358. package/dist/adapters/ServiceBus.js +0 -99
  359. package/dist/adapters/cosmos-client.d.ts +0 -14
  360. package/dist/adapters/cosmos-client.d.ts.map +0 -1
  361. package/dist/adapters/cosmos-client.js +0 -9
  362. package/dist/adapters/index.d.ts +0 -2
  363. package/dist/adapters/index.d.ts.map +0 -1
  364. package/dist/adapters/index.js +0 -2
  365. package/dist/adapters/logger.d.ts +0 -9
  366. package/dist/adapters/logger.d.ts.map +0 -1
  367. package/dist/adapters/logger.js +0 -3
  368. package/dist/adapters/memQueue.d.ts +0 -13
  369. package/dist/adapters/memQueue.d.ts.map +0 -1
  370. package/dist/adapters/memQueue.js +0 -20
  371. package/dist/adapters/mongo-client.d.ts +0 -10
  372. package/dist/adapters/mongo-client.d.ts.map +0 -1
  373. package/dist/adapters/mongo-client.js +0 -13
  374. package/dist/adapters/redis-client.d.ts +0 -39
  375. package/dist/adapters/redis-client.d.ts.map +0 -1
  376. package/dist/adapters/redis-client.js +0 -94
  377. package/dist/api/ContextProvider.d.ts +0 -31
  378. package/dist/api/ContextProvider.d.ts.map +0 -1
  379. package/dist/api/ContextProvider.js +0 -38
  380. package/dist/api/codec.d.ts +0 -5
  381. package/dist/api/codec.d.ts.map +0 -1
  382. package/dist/api/codec.js +0 -5
  383. package/dist/api/internal/RequestContextMiddleware.d.ts +0 -5
  384. package/dist/api/internal/RequestContextMiddleware.d.ts.map +0 -1
  385. package/dist/api/internal/RequestContextMiddleware.js +0 -35
  386. package/dist/api/internal/auth.d.ts +0 -15
  387. package/dist/api/internal/auth.d.ts.map +0 -1
  388. package/dist/api/internal/auth.js +0 -47
  389. package/dist/api/internal/events.d.ts +0 -9
  390. package/dist/api/internal/events.d.ts.map +0 -1
  391. package/dist/api/internal/events.js +0 -42
  392. package/dist/api/internal/health.d.ts +0 -3
  393. package/dist/api/internal/health.d.ts.map +0 -1
  394. package/dist/api/internal/health.js +0 -5
  395. package/dist/api/layerUtils.d.ts +0 -24
  396. package/dist/api/layerUtils.d.ts.map +0 -1
  397. package/dist/api/layerUtils.js +0 -16
  398. package/dist/api/middlewares.d.ts +0 -10
  399. package/dist/api/middlewares.d.ts.map +0 -1
  400. package/dist/api/reportError.d.ts +0 -4
  401. package/dist/api/reportError.d.ts.map +0 -1
  402. package/dist/api/reportError.js +0 -27
  403. package/dist/api/routing/middleware/RouterMiddleware.d.ts +0 -15
  404. package/dist/api/routing/middleware/RouterMiddleware.d.ts.map +0 -1
  405. package/dist/api/routing/middleware/middleware.d.ts +0 -9
  406. package/dist/api/routing/middleware/middleware.d.ts.map +0 -1
  407. package/dist/api/routing/middleware/middleware.js +0 -92
  408. package/dist/api/routing/middleware.d.ts +0 -4
  409. package/dist/api/routing/middleware.d.ts.map +0 -1
  410. package/dist/api/routing/schema/jwt.d.ts +0 -4
  411. package/dist/api/routing/schema/jwt.d.ts.map +0 -1
  412. package/dist/api/routing/schema/jwt.js +0 -12
  413. package/dist/api/routing/tsort.d.ts +0 -8
  414. package/dist/api/routing/tsort.d.ts.map +0 -1
  415. package/dist/api/routing/tsort.js +0 -51
  416. package/dist/api/routing/utils.d.ts +0 -19
  417. package/dist/api/routing/utils.d.ts.map +0 -1
  418. package/dist/api/routing/utils.js +0 -44
  419. package/dist/api/routing.d.ts +0 -138
  420. package/dist/api/routing.d.ts.map +0 -1
  421. package/dist/api/routing.js +0 -166
  422. package/dist/api/setupRequest.d.ts +0 -12
  423. package/dist/api/setupRequest.d.ts.map +0 -1
  424. package/dist/api/setupRequest.js +0 -44
  425. package/dist/api/util.d.ts +0 -3
  426. package/dist/api/util.d.ts.map +0 -1
  427. package/dist/api/util.js +0 -14
  428. package/eslint.config.mjs +0 -24
  429. package/src/Emailer/service.ts +0 -52
  430. package/src/Emailer.ts +0 -1
  431. package/src/Model/Repository/ext.ts +0 -283
  432. package/src/Model/Repository/internal/internal.ts +0 -577
  433. package/src/Model/Repository/legacy.ts +0 -27
  434. package/src/Model/Repository/makeRepo.ts +0 -139
  435. package/src/Model/Repository/service.ts +0 -627
  436. package/src/Model/Repository/validation.ts +0 -31
  437. package/src/Model/Repository.ts +0 -5
  438. package/src/Model/dsl.ts +0 -128
  439. package/src/Model/filter/filterApi.ts +0 -60
  440. package/src/Model/filter/types/errors.ts +0 -47
  441. package/src/Model/filter/types/fields.ts +0 -50
  442. package/src/Model/filter/types/path/common.ts +0 -404
  443. package/src/Model/filter/types/path/eager.ts +0 -298
  444. package/src/Model/filter/types/path/index.ts +0 -4
  445. package/src/Model/filter/types/utils.ts +0 -128
  446. package/src/Model/filter/types/validator.ts +0 -46
  447. package/src/Model/filter/types.ts +0 -6
  448. package/src/Model/query/dsl.ts +0 -2110
  449. package/src/Model/query/new-kid-interpreter.ts +0 -210
  450. package/src/Model/query.ts +0 -13
  451. package/src/Model.ts +0 -3
  452. package/src/Operations.ts +0 -235
  453. package/src/OperationsRepo.ts +0 -16
  454. package/src/QueueMaker/service.ts +0 -17
  455. package/src/RequestContext.ts +0 -63
  456. package/src/Store/ContextMapContainer.ts +0 -20
  457. package/src/Store/service.ts +0 -184
  458. package/src/Store.ts +0 -1
  459. package/src/adapters/ServiceBus.ts +0 -209
  460. package/src/adapters/index.ts +0 -0
  461. package/src/adapters/logger.ts +0 -3
  462. package/src/api/internal/RequestContextMiddleware.ts +0 -42
  463. package/src/api/internal/auth.ts +0 -68
  464. package/src/api/routing/middleware.ts +0 -6
  465. package/src/api/routing.ts +0 -598
  466. package/src/api/setupRequest.ts +0 -84
  467. /package/src/{adapters/SQL.ts → SQL.ts} +0 -0
  468. /package/src/{api/codec.ts → codec.ts} +0 -0
  469. /package/src/{api/internal → internal}/health.ts +0 -0
  470. /package/src/{api/middlewares.ts → middlewares.ts} +0 -0
  471. /package/src/{api/routing → routing}/tsort.ts +0 -0
  472. /package/src/{api/util.ts → util.ts} +0 -0
@@ -1,19 +1,25 @@
1
- import { getRequestContext, setupRequestContextWithCustomSpan } from "@effect-app/infra/api/setupRequest"
2
1
  import { reportNonInterruptedFailure } from "@effect-app/infra/QueueMaker/errors"
3
- import { type QueueBase, QueueMeta } from "@effect-app/infra/QueueMaker/service"
2
+ import { getRequestContext, setupRequestContextWithCustomSpan } from "@effect-app/infra/setupRequest"
4
3
  import { subMinutes } from "date-fns"
5
- import { Effect, Fiber, type NonEmptyReadonlyArray, Option, S, Tracer } from "effect-app"
6
- import type { NonEmptyString255 } from "effect-app/Schema"
4
+ import type { NonEmptyReadonlyArray } from "effect-app/Array"
5
+ import * as Effect from "effect-app/Effect"
6
+ import * as Option from "effect-app/Option"
7
+ import { type QueueBase, QueueMeta } from "effect-app/QueueMaker"
8
+ import * as S from "effect-app/Schema"
9
+ import { type NonEmptyString255 } from "effect-app/Schema"
7
10
  import { pretty } from "effect-app/utils"
11
+ import * as Fiber from "effect/Fiber"
12
+ import * as Tracer from "effect/Tracer"
8
13
  import { SqlClient } from "effect/unstable/sql"
9
- import { SQLModel } from "../adapters/SQL.js"
10
14
  import { InfraLogger } from "../logger.js"
15
+ import { messagingSpanArgs } from "../otel.js"
16
+ import { SQLModel } from "../SQL.js"
11
17
 
12
- export const QueueId = S.Number.pipe(S.brand("QueueId"))
18
+ export const QueueId = S.Finite.pipe(S.brand("QueueId"))
13
19
  export type QueueId = typeof QueueId.Type
14
20
 
15
21
  // TODO: let the model track and Auto Generate versionColumn on every update instead
16
- export function makeSQLQueue<
22
+ export const makeSQLQueue = Effect.fnUntraced(function*<
17
23
  Evt extends { id: S.StringId; _tag: string },
18
24
  DrainEvt extends { id: S.StringId; _tag: string },
19
25
  EvtE,
@@ -24,166 +30,157 @@ export function makeSQLQueue<
24
30
  schema: S.Codec<Evt, EvtE>,
25
31
  drainSchema: S.Codec<DrainEvt, DrainEvtE>
26
32
  ) {
27
- return Effect.gen(function*() {
28
- const base = {
29
- id: SQLModel.Generated(QueueId),
30
- meta: SQLModel.JsonFromString(QueueMeta),
31
- name: S.NonEmptyString255,
32
- createdAt: SQLModel.DateTimeInsert,
33
- updatedAt: SQLModel.DateTimeUpdate,
34
- // TODO: at+owner
35
- processingAt: SQLModel.FieldOption(S.Date),
36
- finishedAt: SQLModel.FieldOption(S.Date),
37
- etag: S.String // TODO: use a SQLModel thing that auto updates it?
38
- // TODO: record locking.. / optimistic locking
39
- // rowVersion: SQLModel.DateTimeFromNumberWithNow
40
- }
41
- class Queue extends SQLModel.Class<Queue>("Queue")({
42
- body: SQLModel.JsonFromString(schema),
43
- ...base
44
- }) {}
45
- class Drain extends SQLModel.Class<Drain>("Drain")({
46
- body: SQLModel.JsonFromString(drainSchema),
47
- ...base
48
- }) {}
49
- const sql = yield* SqlClient.SqlClient
33
+ const base = {
34
+ id: SQLModel.Generated(QueueId),
35
+ meta: SQLModel.JsonFromString(QueueMeta),
36
+ name: S.NonEmptyString255,
37
+ createdAt: SQLModel.DateTimeInsert,
38
+ updatedAt: SQLModel.DateTimeUpdate,
39
+ // TODO: at+owner
40
+ processingAt: SQLModel.FieldOption(S.Date),
41
+ finishedAt: SQLModel.FieldOption(S.Date),
42
+ etag: S.String // TODO: use a SQLModel thing that auto updates it?
43
+ // TODO: record locking.. / optimistic locking
44
+ // rowVersion: SQLModel.DateTimeFromNumberWithNow
45
+ }
46
+ class Queue extends SQLModel.Class<Queue>("Queue")({
47
+ body: SQLModel.JsonFromString(schema),
48
+ ...base
49
+ }) {}
50
+ class Drain extends SQLModel.Class<Drain>("Drain")({
51
+ body: SQLModel.JsonFromString(drainSchema),
52
+ ...base
53
+ }) {}
54
+ const sql = yield* SqlClient.SqlClient
50
55
 
51
- const queueRepo = yield* SQLModel.makeRepository(Queue, {
52
- tableName: "queue",
53
- spanPrefix: "QueueRepo",
54
- idColumn: "id",
55
- versionColumn: "etag"
56
- })
56
+ const queueRepo = yield* SQLModel.makeRepository(Queue, {
57
+ tableName: "queue",
58
+ spanPrefix: "QueueRepo",
59
+ idColumn: "id",
60
+ versionColumn: "etag"
61
+ })
57
62
 
58
- const drainRepo = yield* SQLModel.makeRepository(Drain, {
59
- tableName: "queue",
60
- spanPrefix: "DrainRepo",
61
- idColumn: "id",
62
- versionColumn: "etag"
63
- })
63
+ const drainRepo = yield* SQLModel.makeRepository(Drain, {
64
+ tableName: "queue",
65
+ spanPrefix: "DrainRepo",
66
+ idColumn: "id",
67
+ versionColumn: "etag"
68
+ })
64
69
 
65
- const decodeDrain = S.decodeEffect(Drain)
70
+ const decodeDrain = S.decodeEffectConcurrently(Drain)
66
71
 
67
- const drain = Effect
68
- .sync(() => subMinutes(new Date(), 15))
69
- .pipe(
70
- Effect
71
- .andThen((limit) =>
72
- sql<typeof Drain.Encoded>`SELECT *
72
+ const drain = Effect.gen(function*() {
73
+ const limit = subMinutes(new Date(), 15)
74
+ return yield* sql<typeof Drain.Encoded>`SELECT *
73
75
  FROM queue
74
76
  WHERE name = ${queueDrainName} AND finishedAt IS NULL AND (processingAt IS NULL OR processingAt < ${limit.getTime()})
75
77
  LIMIT 1`
76
- )
77
- )
78
+ })
78
79
 
79
- const q = {
80
- offer: Effect.fnUntraced(function*(body: Evt, meta: typeof QueueMeta.Type) {
81
- yield* queueRepo.insertVoid({
82
- body,
83
- meta,
84
- name: queueName,
85
- processingAt: Option.none(),
86
- finishedAt: Option.none(),
87
- etag: crypto.randomUUID()
88
- })
89
- }),
90
- take: Effect.gen(function*() {
91
- while (true) {
92
- const [first] = yield* drain.pipe(Effect.withTracerEnabled(false)) // disable sql tracer otherwise we spam it..
93
- if (first) {
94
- const dec = yield* decodeDrain(first)
95
- const { createdAt, updatedAt, ...rest } = dec
96
- return yield* drainRepo.update(
97
- { ...rest, processingAt: Option.some(new Date()) } // auto in lib , etag: crypto.randomUUID()
98
- )
99
- }
100
- if (first) return first
101
- yield* Effect.sleep(250)
80
+ const q = {
81
+ offer: Effect.fnUntraced(function*(body: Evt, meta: typeof QueueMeta.Type) {
82
+ yield* queueRepo.insertVoid(Queue.insert.make({
83
+ body,
84
+ meta,
85
+ name: queueName,
86
+ processingAt: Option.none(),
87
+ finishedAt: Option.none(),
88
+ etag: crypto.randomUUID()
89
+ }))
90
+ }),
91
+ take: Effect.gen(function*() {
92
+ while (true) {
93
+ const [first] = yield* drain.pipe(Effect.withTracerEnabled(false)) // disable sql tracer otherwise we spam it..
94
+ if (first) {
95
+ const dec = yield* decodeDrain(first)
96
+ const { createdAt, updatedAt, ...rest } = dec
97
+ return yield* drainRepo.update(
98
+ Drain.update.make({ ...rest, processingAt: Option.some(new Date()) }) // auto in lib , etag: crypto.randomUUID()
99
+ )
102
100
  }
103
- }),
104
- finish: ({ createdAt, updatedAt, ...q }: Drain) =>
105
- drainRepo.updateVoid({ ...q, finishedAt: Option.some(new Date()) }) // auto in lib , etag: crypto.randomUUID()
106
- }
107
- const queue = {
108
- publish: (...messages: NonEmptyReadonlyArray<Evt>) =>
109
- getRequestContext
101
+ if (first) return first
102
+ yield* Effect.sleep(250)
103
+ }
104
+ }),
105
+ finish: Effect.fn(function*({ createdAt, updatedAt, ...q }: Drain) {
106
+ return yield* drainRepo.updateVoid(Drain.update.make({ ...q, finishedAt: Option.some(new Date()) })) // auto in lib , etag: crypto.randomUUID()
107
+ })
108
+ }
109
+ const queue = {
110
+ publish: Effect.fn(`publish ${queueName}`, {
111
+ kind: "producer",
112
+ attributes: {
113
+ "messaging.system": "sql",
114
+ "messaging.operation.name": "publish",
115
+ "messaging.destination.name": queueName
116
+ }
117
+ })(function*(
118
+ ...messages: NonEmptyReadonlyArray<Evt>
119
+ ) {
120
+ yield* Effect.annotateCurrentSpan({
121
+ "messaging.batch.message_count": messages.length,
122
+ "messaging.message.types": messages.map((_) => _._tag)
123
+ })
124
+ const requestContext = yield* getRequestContext
125
+ yield* Effect.forEach(messages, (m) => q.offer(m, requestContext), { discard: true })
126
+ }),
127
+ drain: <DrainE, DrainR>(
128
+ handleEvent: (ks: DrainEvt) => Effect.Effect<void, DrainE, DrainR>,
129
+ sessionId?: string
130
+ ) => {
131
+ const silenceAndReportError = reportNonInterruptedFailure({ name: "MemQueue.drain." + queueDrainName })
132
+ const processMessage = Effect.fnUntraced(function*({ body, meta }: Drain) {
133
+ let effect = InfraLogger
134
+ .logDebug(`[${queueDrainName}] Processing incoming message`)
110
135
  .pipe(
111
- Effect.flatMap((requestContext) =>
112
- Effect
113
- .forEach(
114
- messages,
115
- (m) => q.offer(m, requestContext),
116
- {
117
- discard: true
118
- }
119
- )
120
- ),
121
- Effect.withSpan("queue.publish: " + queueName, {
122
- kind: "producer",
123
- attributes: { "message_tags": messages.map((_) => _._tag) }
124
- }, { captureStackTrace: false })
125
- ),
126
- drain: <DrainE, DrainR>(
127
- handleEvent: (ks: DrainEvt) => Effect.Effect<void, DrainE, DrainR>,
128
- sessionId?: string
129
- ) => {
130
- const silenceAndReportError = reportNonInterruptedFailure({ name: "MemQueue.drain." + queueDrainName })
131
- const processMessage = (msg: Drain) =>
132
- Effect
133
- .succeed(msg)
134
- .pipe(Effect
135
- .flatMap(({ body, meta }) => {
136
- let effect = InfraLogger
137
- .logDebug(`[${queueDrainName}] Processing incoming message`)
138
- .pipe(
139
- Effect.annotateLogs({ body: pretty(body), meta: pretty(meta) }),
140
- Effect.andThen(handleEvent(body)),
141
- silenceAndReportError,
142
- (_) =>
143
- setupRequestContextWithCustomSpan(
144
- _,
145
- meta,
146
- `queue.drain: ${queueDrainName}.${body._tag}`,
147
- {
148
- captureStackTrace: false,
149
- kind: "consumer",
150
- attributes: {
151
- "queue.name": queueDrainName,
152
- "queue.sessionId": sessionId,
153
- "queue.input": body
154
- }
155
- }
156
- )
157
- )
158
- if (meta.span) {
159
- effect = Effect.withParentSpan(effect, Tracer.externalSpan(meta.span))
136
+ Effect.annotateLogs({ body: pretty(body), meta: pretty(meta) }),
137
+ Effect.andThen(handleEvent(body)),
138
+ silenceAndReportError,
139
+ (_) => {
140
+ const args = messagingSpanArgs({
141
+ operation: "process",
142
+ system: "sql",
143
+ destination: queueDrainName,
144
+ messageId: body.id,
145
+ conversationId: sessionId,
146
+ extra: { "messaging.message.type": body._tag, "messaging.message.body": body }
147
+ }, "consumer")
148
+ return setupRequestContextWithCustomSpan(
149
+ _,
150
+ meta,
151
+ args.name,
152
+ {
153
+ captureStackTrace: false,
154
+ kind: args.kind,
155
+ attributes: args.attributes
160
156
  }
161
- return effect
162
- }))
163
-
164
- return q
165
- .take
166
- .pipe(
167
- Effect.flatMap((x) =>
168
- processMessage(x).pipe(
169
- Effect.uninterruptible,
170
- Effect.forkChild,
171
- Effect.flatMap(Fiber.join),
172
- Effect.tap(q.finish(x))
173
157
  )
174
- ),
175
- silenceAndReportError,
176
- Effect.withSpan(`queue.drain: ${queueDrainName}`, {
177
- attributes: {
178
- "queue.type": "sql",
179
- "queue.name": queueDrainName,
180
- "queue.sessionId": sessionId
181
- }
182
- }),
183
- Effect.forever
158
+ }
184
159
  )
185
- }
160
+ if (meta.span) {
161
+ effect = Effect.withParentSpan(effect, Tracer.externalSpan(meta.span))
162
+ }
163
+ return yield* effect
164
+ })
165
+
166
+ return Effect.fn(`receive ${queueDrainName}`, {
167
+ kind: "consumer",
168
+ attributes: {
169
+ "messaging.system": "sql",
170
+ "messaging.operation.name": "receive",
171
+ "messaging.destination.name": queueDrainName,
172
+ ...(sessionId !== undefined && { "messaging.message.conversation_id": sessionId })
173
+ }
174
+ })(function*() {
175
+ const x = yield* q.take
176
+ yield* processMessage(x).pipe(
177
+ Effect.uninterruptible,
178
+ Effect.forkChild,
179
+ Effect.flatMap(Fiber.join),
180
+ Effect.tap(q.finish(x))
181
+ )
182
+ }, (effect) => effect.pipe(silenceAndReportError, Effect.forever))()
186
183
  }
187
- return queue as QueueBase<Evt, DrainEvt>
188
- })
189
- }
184
+ }
185
+ return queue as QueueBase<Evt, DrainEvt>
186
+ })
@@ -1,5 +1,7 @@
1
1
  import { reportError } from "@effect-app/infra/errorReporter"
2
- import { Cause, Effect, Exit } from "effect-app"
2
+ import * as Effect from "effect-app/Effect"
3
+ import * as Cause from "effect/Cause"
4
+ import * as Exit from "effect/Exit"
3
5
 
4
6
  const reportQueueError_ = reportError("Queue")
5
7
 
@@ -1,14 +1,20 @@
1
- import { Cause, Tracer } from "effect"
2
- import { Effect, Fiber, flow, type NonEmptyReadonlyArray, S } from "effect-app"
1
+ import type { NonEmptyReadonlyArray } from "effect-app/Array"
2
+ import * as Effect from "effect-app/Effect"
3
+ import { QueueMeta } from "effect-app/QueueMaker"
4
+ import * as S from "effect-app/Schema"
3
5
  import { pretty } from "effect-app/utils"
6
+ import * as Cause from "effect/Cause"
7
+ import * as Fiber from "effect/Fiber"
8
+ import { flow } from "effect/Function"
4
9
  import * as Q from "effect/Queue"
5
- import { MemQueue } from "../adapters/memQueue.js"
6
- import { getRequestContext, setupRequestContextWithCustomSpan } from "../api/setupRequest.js"
10
+ import * as Tracer from "effect/Tracer"
7
11
  import { InfraLogger } from "../logger.js"
12
+ import { MemQueue } from "../memQueue.js"
13
+ import { messagingSpanArgs } from "../otel.js"
14
+ import { getRequestContext, setupRequestContextWithCustomSpan } from "../setupRequest.js"
8
15
  import { reportNonInterruptedFailure, reportNonInterruptedFailureCause } from "./errors.js"
9
- import { type QueueBase, QueueMeta } from "./service.js"
10
16
 
11
- export function makeMemQueue<
17
+ export const makeMemQueue = Effect.fnUntraced(function*<
12
18
  Evt extends { id: S.StringId; _tag: string },
13
19
  DrainEvt extends { id: S.StringId; _tag: string },
14
20
  EvtE,
@@ -19,112 +25,112 @@ export function makeMemQueue<
19
25
  schema: S.Codec<Evt, EvtE>,
20
26
  drainSchema: S.Codec<DrainEvt, DrainEvtE>
21
27
  ) {
22
- return Effect.gen(function*() {
23
- const mem = yield* MemQueue
24
- const q = yield* mem.getOrCreateQueue(queueName)
25
- const qDrain = yield* mem.getOrCreateQueue(queueDrainName)
28
+ const mem = yield* MemQueue
29
+ const q = yield* mem.getOrCreateQueue(queueName)
30
+ const qDrain = yield* mem.getOrCreateQueue(queueDrainName)
26
31
 
27
- const wireSchema = S.Struct({ body: schema, meta: QueueMeta })
28
- const wireSchemaJson = S.fromJsonString(wireSchema)
29
- const encodePublish = S.encodeEffect(wireSchemaJson)
30
- const drainW = S.Struct({ body: drainSchema, meta: QueueMeta })
31
- const drainWJson = S.fromJsonString(drainW)
32
+ const wireSchema = S.Struct({ body: schema, meta: QueueMeta })
33
+ const wireSchemaJson = S.fromJsonString(S.toCodecJson(wireSchema))
34
+ const encodePublish = S.encodeEffect(wireSchemaJson)
35
+ const drainW = S.Struct({ body: drainSchema, meta: QueueMeta })
36
+ const drainWJson = S.fromJsonString(S.toCodecJson(drainW))
32
37
 
33
- const parseDrain = flow(S.decodeUnknownEffect(drainWJson), Effect.orDie)
38
+ const parseDrain = flow(S.decodeUnknownEffectConcurrently(drainWJson), Effect.orDie)
34
39
 
35
- const queue = {
36
- publish: (...messages: NonEmptyReadonlyArray<Evt>) =>
37
- getRequestContext
38
- .pipe(
39
- Effect.flatMap((requestContext) =>
40
- Effect
41
- .forEach(messages, (m) =>
42
- // we JSON encode, because that is what the wire also does, and it reveals holes in e.g unknown encoders (Date->String)
43
- encodePublish({ body: m, meta: requestContext }).pipe(
44
- Effect.orDie,
45
- // .tap((msg) => info("Publishing Mem Message: " + utils.inspect(msg)))
46
- Effect.flatMap((_) => Q.offer(q, _))
47
- ), { discard: true })
48
- ),
49
- Effect.withSpan("queue.publish: " + queueName, {
50
- kind: "producer",
51
- attributes: { "message_tags": messages.map((_) => _._tag) }
52
- }, { captureStackTrace: false })
53
- ),
54
- drain: <DrainE, DrainR>(
55
- handleEvent: (ks: DrainEvt) => Effect.Effect<void, DrainE, DrainR>,
56
- sessionId?: string
57
- ) => {
58
- const silenceAndReportError = reportNonInterruptedFailure({ name: "MemQueue.drain." + queueDrainName })
59
- const reportError = reportNonInterruptedFailureCause({ name: "MemQueue.drain." + queueDrainName })
60
- const processMessage = (msg: string) =>
61
- // we JSON parse, because that is what the wire also does, and it reveals holes in e.g unknown encoders (Date->String)
62
- parseDrain(msg).pipe(
40
+ const queue = {
41
+ publish: Effect.fn(`publish ${queueName}`, {
42
+ kind: "producer",
43
+ attributes: {
44
+ "messaging.system": "memory",
45
+ "messaging.operation.name": "publish",
46
+ "messaging.destination.name": queueName
47
+ }
48
+ })(function*(
49
+ ...messages: NonEmptyReadonlyArray<Evt>
50
+ ) {
51
+ yield* Effect.annotateCurrentSpan({
52
+ "messaging.batch.message_count": messages.length,
53
+ "messaging.message.types": messages.map((_) => _._tag)
54
+ })
55
+ const requestContext = yield* getRequestContext
56
+ // we JSON encode, because that is what the wire also does, and it reveals holes in e.g unknown encoders (Date->String)
57
+ yield* Effect.forEach(
58
+ messages,
59
+ (m) =>
60
+ encodePublish({ body: m, meta: requestContext }).pipe(
63
61
  Effect.orDie,
64
- Effect
65
- .flatMap(({ body, meta }) => {
66
- let effect = InfraLogger
67
- .logDebug(`[${queueDrainName}] Processing incoming message`)
68
- .pipe(
69
- Effect.annotateLogs({ body: pretty(body), meta: pretty(meta) }),
70
- Effect.andThen(handleEvent(body)),
71
- silenceAndReportError,
72
- (_) =>
73
- setupRequestContextWithCustomSpan(
74
- _,
75
- meta,
76
- `queue.drain: ${queueDrainName}.${body._tag}`,
77
- {
78
- captureStackTrace: false,
79
- kind: "consumer",
80
- attributes: {
81
- "queue.name": queueDrainName,
82
- "queue.sessionId": sessionId,
83
- "queue.input": body
84
- }
85
- }
86
- )
87
- )
88
- if (meta.span) {
89
- effect = Effect.withParentSpan(effect, Tracer.externalSpan(meta.span))
90
- }
91
- return effect
92
- })
93
- )
94
- return Q
95
- .take(qDrain)
62
+ Effect.flatMap((_) => Q.offer(q, _))
63
+ ),
64
+ { discard: true }
65
+ )
66
+ }),
67
+ drain: <DrainE, DrainR>(
68
+ handleEvent: (ks: DrainEvt) => Effect.Effect<void, DrainE, DrainR>,
69
+ sessionId?: string
70
+ ) => {
71
+ const silenceAndReportError = reportNonInterruptedFailure({ name: "MemQueue.drain." + queueDrainName })
72
+ const reportError = reportNonInterruptedFailureCause({ name: "MemQueue.drain." + queueDrainName })
73
+ const processMessage = Effect.fnUntraced(function*(msg: string) {
74
+ // we JSON parse, because that is what the wire also does, and it reveals holes in e.g unknown encoders (Date->String)
75
+ const { body, meta } = yield* parseDrain(msg).pipe(Effect.orDie)
76
+ let effect = InfraLogger
77
+ .logDebug(`[${queueDrainName}] Processing incoming message`)
96
78
  .pipe(
97
- Effect
98
- .flatMap((x) =>
99
- processMessage(x).pipe(
100
- Effect.uninterruptible,
101
- Effect.forkChild,
102
- Effect.flatMap(Fiber.join),
103
- // normally a failed item would be returned to the queue and retried up to X times.
104
- Effect.flatMap((_) =>
105
- _._tag === "Failure" && !Cause.hasInterruptsOnly(_.cause)
106
- ? Q.offer(qDrain, x).pipe(
107
- // TODO: retry count tracking and max retries.
108
- Effect.delay("5 seconds"),
109
- Effect.tapCause(reportError),
110
- Effect.forkDetach
111
- )
112
- : Effect.void
113
- )
114
- )
115
- ),
79
+ Effect.annotateLogs({ body: pretty(body), meta: pretty(meta) }),
80
+ Effect.andThen(handleEvent(body)),
116
81
  silenceAndReportError,
117
- Effect.withSpan(`queue.drain: ${queueDrainName}`, {
118
- attributes: {
119
- "queue.type": "mem",
120
- "queue.name": queueDrainName,
121
- "queue.sessionId": sessionId
122
- }
123
- }),
124
- Effect.forever
82
+ (_) => {
83
+ const args = messagingSpanArgs({
84
+ operation: "process",
85
+ system: "memory",
86
+ destination: queueDrainName,
87
+ messageId: body.id,
88
+ conversationId: sessionId,
89
+ extra: { "messaging.message.type": body._tag, "messaging.message.body": body }
90
+ }, "consumer")
91
+ return setupRequestContextWithCustomSpan(
92
+ _,
93
+ meta,
94
+ args.name,
95
+ {
96
+ captureStackTrace: false,
97
+ kind: args.kind,
98
+ attributes: args.attributes
99
+ }
100
+ )
101
+ }
125
102
  )
126
- }
103
+ if (meta.span) {
104
+ effect = Effect.withParentSpan(effect, Tracer.externalSpan(meta.span))
105
+ }
106
+ return yield* effect
107
+ })
108
+ return Effect.fn(`receive ${queueDrainName}`, {
109
+ kind: "consumer",
110
+ attributes: {
111
+ "messaging.system": "memory",
112
+ "messaging.operation.name": "receive",
113
+ "messaging.destination.name": queueDrainName,
114
+ ...(sessionId !== undefined && { "messaging.message.conversation_id": sessionId })
115
+ }
116
+ })(function*() {
117
+ const x = yield* Q.take(qDrain)
118
+ const exit = yield* processMessage(x).pipe(
119
+ Effect.uninterruptible,
120
+ Effect.forkChild,
121
+ Effect.flatMap(Fiber.join)
122
+ )
123
+ if (exit._tag === "Failure" && !Cause.hasInterruptsOnly(exit.cause)) {
124
+ // normally a failed item would be returned to the queue and retried up to X times.
125
+ yield* Q.offer(qDrain, x).pipe(
126
+ // TODO: retry count tracking and max retries.
127
+ Effect.delay("5 seconds"),
128
+ Effect.tapCause(reportError),
129
+ Effect.forkDetach
130
+ )
131
+ }
132
+ }, (effect) => effect.pipe(silenceAndReportError, Effect.forever))()
127
133
  }
128
- return queue as QueueBase<Evt, DrainEvt>
129
- })
130
- }
134
+ }
135
+ return queue
136
+ })