@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,12 +1,17 @@
1
- import { Tracer } from "effect"
2
- import { Cause, Effect, 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 type { StringId } from "effect-app/Schema"
4
6
  import { pretty } from "effect-app/utils"
5
- import { Receiver, Sender } from "../adapters/ServiceBus.js"
6
- import { getRequestContext, setupRequestContextWithCustomSpan } from "../api/setupRequest.js"
7
+ import * as Cause from "effect/Cause"
8
+ import { flow } from "effect/Function"
9
+ import * as Tracer from "effect/Tracer"
7
10
  import { InfraLogger } from "../logger.js"
11
+ import { messagingSpanArgs } from "../otel.js"
12
+ import { Receiver, Sender } from "../ServiceBus.js"
13
+ import { getRequestContext, setupRequestContextWithCustomSpan } from "../setupRequest.js"
8
14
  import { reportNonInterruptedFailure, reportNonInterruptedFailureCause, reportQueueError } from "./errors.js"
9
- import { type QueueBase, QueueMeta } from "./service.js"
10
15
 
11
16
  export function makeServiceBusQueue<
12
17
  Evt extends { id: StringId; _tag: string },
@@ -21,11 +26,11 @@ export function makeServiceBusQueue<
21
26
  body: schema,
22
27
  meta: QueueMeta
23
28
  })
24
- const wireSchemaJson = S.fromJsonString(wireSchema)
29
+ const wireSchemaJson = S.fromJsonString(S.toCodecJson(wireSchema))
25
30
  const encodePublish = S.encodeEffect(wireSchemaJson)
26
31
  const drainW = S.Struct({ body: drainSchema, meta: QueueMeta })
27
- const drainWJson = S.fromJsonString(drainW)
28
- const parseDrain = flow(S.decodeUnknownEffect(drainWJson), Effect.orDie)
32
+ const drainWJson = S.fromJsonString(S.toCodecJson(drainW))
33
+ const parseDrain = flow(S.decodeUnknownEffectConcurrently(drainWJson), Effect.orDie)
29
34
 
30
35
  return Effect.gen(function*() {
31
36
  const sender = yield* Sender
@@ -42,96 +47,79 @@ export function makeServiceBusQueue<
42
47
  handleEvent: (ks: DrainEvt) => Effect.Effect<void, DrainE, DrainR>,
43
48
  sessionId?: string
44
49
  ) => {
45
- function processMessage(messageBody: unknown) {
46
- return parseDrain(messageBody).pipe(
47
- Effect.orDie,
48
- Effect
49
- .flatMap(({ body, meta }) => {
50
- let effect = InfraLogger
51
- .logDebug(`[${receiver.name}] Processing incoming message`)
52
- .pipe(
53
- Effect.annotateLogs({
54
- body: pretty(body),
55
- meta: pretty(meta)
56
- }),
57
- Effect.andThen(handleEvent(body)),
58
- Effect.orDie
59
- )
60
- // we silenceAndReportError here, so that the error is reported, and moves into the Exit.
61
- .pipe(
62
- silenceAndReportError,
63
- (_) =>
64
- setupRequestContextWithCustomSpan(
65
- _,
66
- meta,
67
- `queue.drain: ${receiver.name}${sessionId ? `#${sessionId}` : ""}.${body._tag}`,
68
- {
69
- captureStackTrace: false,
70
- kind: "consumer",
71
- attributes: {
72
- "queue.name": receiver.name,
73
- "queue.sessionId": sessionId,
74
- "queue.input": body
75
- }
76
- }
77
- )
78
- )
79
- if (meta.span) {
80
- effect = Effect.withParentSpan(effect, Tracer.externalSpan(meta.span))
81
- }
82
- return effect
83
- }),
84
- Effect
85
- // we reportError here, so that we report the error only, and keep flowing
86
- .tapCause(reportError),
87
- // we still need to flatten the Exit.
88
- Effect.flatMap((_) => _)
89
- )
90
- }
50
+ const processMessage = Effect.fnUntraced(function*(messageBody: unknown) {
51
+ const { body, meta } = yield* parseDrain(messageBody).pipe(Effect.orDie)
52
+ let effect = InfraLogger
53
+ .logDebug(`[${receiver.name}] Processing incoming message`)
54
+ .pipe(
55
+ Effect.annotateLogs({ body: pretty(body), meta: pretty(meta) }),
56
+ Effect.andThen(handleEvent(body)),
57
+ Effect.orDie,
58
+ // we silenceAndReportError here, so that the error is reported, and moves into the Exit.
59
+ silenceAndReportError,
60
+ (_) => {
61
+ const args = messagingSpanArgs({
62
+ operation: "process",
63
+ system: "servicebus",
64
+ destination: receiver.name,
65
+ messageId: body.id,
66
+ conversationId: sessionId,
67
+ extra: { "messaging.message.type": body._tag, "messaging.message.body": body }
68
+ }, "consumer")
69
+ return setupRequestContextWithCustomSpan(
70
+ _,
71
+ meta,
72
+ args.name,
73
+ {
74
+ captureStackTrace: false,
75
+ kind: args.kind,
76
+ attributes: args.attributes
77
+ }
78
+ )
79
+ }
80
+ )
81
+ if (meta.span) {
82
+ effect = Effect.withParentSpan(effect, Tracer.externalSpan(meta.span))
83
+ }
84
+ // we reportError here, so that we report the error only, and keep flowing
85
+ const exit = yield* Effect.tapCause(effect, reportError)
86
+ return yield* exit
87
+ })
91
88
 
92
89
  return receiver
93
90
  .subscribe({
94
91
  processMessage: (x) => processMessage(x.body).pipe(Effect.uninterruptible),
95
92
  processError: (err) => reportQueueError(Cause.fail(err.error))
96
- // Deferred.completeWith(
97
- // deferred,
98
- // reportFatalQueueError(Cause.fail(err.error))
99
- // .pipe(Effect.andThen(Effect.fail(err.error)))
100
- // )
101
93
  }, sessionId)
102
- // .pipe(Effect.andThen(Deferred.await(deferred).pipe(Effect.orDie))),
103
- .pipe(
104
- Effect.andThen(Effect.never)
105
- )
94
+ .pipe(Effect.andThen(Effect.never))
106
95
  },
107
96
 
108
- publish: (...messages: NonEmptyReadonlyArray<Evt>) =>
109
- getRequestContext
110
- .pipe(
111
- Effect.flatMap((requestContext) =>
112
- Effect
113
- .forEach(messages, (m) =>
114
- encodePublish({
115
- body: m,
116
- meta: requestContext
117
- })
118
- .pipe(
119
- Effect.orDie,
120
- Effect.map((body) => ({
121
- body,
122
- messageId: m.id, /* correllationid: requestId */
123
- contentType: "application/json",
124
- sessionId: "sessionId" in m ? m.sessionId as string : undefined as unknown as string // TODO: optional
125
- }))
126
- ))
127
- .pipe(Effect.flatMap((msgs) => sender.sendMessages(msgs)))
128
- ),
129
- Effect.withSpan("queue.publish: " + sender.name, {
130
- kind: "producer",
131
- attributes: { "message_tags": messages.map((_) => _._tag) }
132
- }, { captureStackTrace: false })
133
- )
97
+ publish: Effect.fn(`publish ${sender.name}`, {
98
+ kind: "producer",
99
+ attributes: {
100
+ "messaging.system": "servicebus",
101
+ "messaging.operation.name": "publish",
102
+ "messaging.destination.name": sender.name
103
+ }
104
+ })(function*(...messages: NonEmptyReadonlyArray<Evt>) {
105
+ yield* Effect.annotateCurrentSpan({
106
+ "messaging.batch.message_count": messages.length,
107
+ "messaging.message.types": messages.map((_) => _._tag)
108
+ })
109
+ const requestContext = yield* getRequestContext
110
+ const msgs = yield* Effect.forEach(messages, (m) =>
111
+ encodePublish({ body: m, meta: requestContext }).pipe(
112
+ Effect.orDie,
113
+ Effect.map((body) => ({
114
+ body,
115
+ messageId: m.id, /* correllationid: requestId */
116
+ contentType: "application/json",
117
+ sessionId: "sessionId" in m ? m.sessionId as string : undefined as unknown as string // TODO: optional
118
+ }))
119
+ ))
120
+ yield* sender.sendMessages(msgs)
121
+ })
134
122
  }
135
- return queue as QueueBase<Evt, DrainEvt>
123
+ return queue
136
124
  })
137
125
  }
@@ -1,7 +1,13 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
- import { Effect, Fiber, FiberSet, Layer, Option, ServiceMap, type Tracer } from "effect-app"
3
- import { reportRequestError, reportUnknownRequestError } from "./api/reportError.js"
2
+ import * as Context from "effect-app/Context"
3
+ import * as Effect from "effect-app/Effect"
4
+ import * as Layer from "effect-app/Layer"
5
+ import * as Option from "effect-app/Option"
6
+ import * as Fiber from "effect/Fiber"
7
+ import * as FiberSet from "effect/FiberSet"
8
+ import type * as Tracer from "effect/Tracer"
4
9
  import { InfraLogger } from "./logger.js"
10
+ import { reportRequestError, reportUnknownRequestError } from "./reportError.js"
5
11
 
6
12
  const getRootParentSpan = Effect.gen(function*() {
7
13
  let span: Tracer.AnySpan | null = yield* Effect.currentSpan.pipe(
@@ -92,14 +98,13 @@ const make = Effect.gen(function*() {
92
98
  * Whenever you fork a fiber for a Request, and you want to prevent dependent services to close prematurely on interruption,
93
99
  * like the ServiceBus Sender, you should register these fibers in this FiberSet.
94
100
  */
95
- export class RequestFiberSet extends ServiceMap.Service<RequestFiberSet>()("RequestFiberSet", { make }) {
101
+ export class RequestFiberSet extends Context.Service<RequestFiberSet>()("RequestFiberSet", { make }) {
96
102
  static readonly Live = Layer.effect(this, this.make)
97
103
  static readonly register = <A, E, R>(self: Effect.Effect<A, E, R>) =>
98
- this.asEffect().pipe(Effect.andThen((_) => _.register(self)))
99
- static readonly run = <A, E, R>(self: Effect.Effect<A, E, R>) =>
100
- this.asEffect().pipe(Effect.andThen((_) => _.run(self)))
104
+ this.pipe(Effect.andThen((_) => _.register(self)))
105
+ static readonly run = <A, E, R>(self: Effect.Effect<A, E, R>) => this.pipe(Effect.andThen((_) => _.run(self)))
101
106
  static readonly forkDaemonReport = <R, E, A>(self: Effect.Effect<A, E, R>) =>
102
- this.asEffect().pipe(Effect.andThen((_) => _.forkDaemonReport(self)))
107
+ this.pipe(Effect.andThen((_) => _.forkDaemonReport(self)))
103
108
  static readonly forkDaemonReportUnexpected = <R, E, A>(self: Effect.Effect<A, E, R>) =>
104
- this.asEffect().pipe(Effect.andThen((_) => _.forkDaemonReportUnexpected(self)))
109
+ this.pipe(Effect.andThen((_) => _.forkDaemonReportUnexpected(self)))
105
110
  }
@@ -24,6 +24,7 @@ import * as VariantSchema from "effect/unstable/schema/VariantSchema"
24
24
  import { SqlClient } from "effect/unstable/sql/SqlClient"
25
25
  import * as SqlResolver from "effect/unstable/sql/SqlResolver"
26
26
  import * as SqlSchema from "effect/unstable/sql/SqlSchema"
27
+ import { type DbSystem, withDbSpan } from "../otel.js"
27
28
 
28
29
  const {
29
30
  Class,
@@ -73,7 +74,7 @@ export {
73
74
  * @since 1.0.0
74
75
  * @category constructors
75
76
  * @example
76
- * import { Schema } from "effect"
77
+ * import * as Schema from "effect/Schema"
77
78
  * import { Model } from "effect/unstable/schema"
78
79
  *
79
80
  * export const GroupId = Schema.Number.pipe(Schema.brand("GroupId"))
@@ -545,9 +546,15 @@ export const DateTimeUpdateFromNumber: DateTimeUpdateFromNumber = Field({
545
546
  */
546
547
  export interface JsonFromString<S extends Schema.Top> extends
547
548
  VariantSchema.Field<{
548
- readonly select: Schema.fromJsonString<S>
549
- readonly insert: Schema.fromJsonString<S>
550
- readonly update: Schema.fromJsonString<S>
549
+ readonly select: Schema.fromJsonString<
550
+ Schema.Codec<S["Type"], Schema.Json, S["DecodingServices"], S["EncodingServices"]>
551
+ >
552
+ readonly insert: Schema.fromJsonString<
553
+ Schema.Codec<S["Type"], Schema.Json, S["DecodingServices"], S["EncodingServices"]>
554
+ >
555
+ readonly update: Schema.fromJsonString<
556
+ Schema.Codec<S["Type"], Schema.Json, S["DecodingServices"], S["EncodingServices"]>
557
+ >
551
558
  readonly json: S
552
559
  readonly jsonCreate: S
553
560
  readonly jsonUpdate: S
@@ -565,7 +572,7 @@ export interface JsonFromString<S extends Schema.Top> extends
565
572
  export const JsonFromString = <S extends Schema.Top>(
566
573
  schema: S
567
574
  ): JsonFromString<S> => {
568
- const parsed = Schema.fromJsonString(schema)
575
+ const parsed = Schema.fromJsonString(Schema.toCodecJson(schema))
569
576
  return Field({
570
577
  select: parsed,
571
578
  insert: parsed,
@@ -590,6 +597,7 @@ export const makeRepository = <
590
597
  readonly spanPrefix: string
591
598
  readonly idColumn: Id
592
599
  readonly versionColumn?: string | undefined
600
+ readonly dbSystem?: DbSystem | undefined
593
601
  }): Effect.Effect<
594
602
  {
595
603
  readonly insert: (
@@ -623,6 +631,15 @@ export const makeRepository = <
623
631
  const idSchema = Model.fields[options.idColumn] as Schema.Top
624
632
  const idColumn = options.idColumn as string
625
633
  const versionColumn = options.versionColumn
634
+ const system: DbSystem = options.dbSystem ?? "other_sql"
635
+ const opSpan = (operation: string, idValue?: unknown) =>
636
+ withDbSpan({
637
+ operation,
638
+ system,
639
+ collection: options.tableName,
640
+ entity: options.spanPrefix,
641
+ ...(idValue !== undefined && { extra: { "app.entity.id": idValue } })
642
+ })
626
643
 
627
644
  const insertSchema = SqlSchema.findOne({
628
645
  Request: Model.insert,
@@ -644,9 +661,7 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = LAST_INSERT_ID(
644
661
  ): Effect.Effect<S["Type"], Schema.SchemaError, S["DecodingServices"] | S["insert"]["EncodingServices"]> =>
645
662
  insertSchema(insert).pipe(
646
663
  Effect.catchTag("NoSuchElementError", Effect.die),
647
- Effect.withSpan(`${options.spanPrefix}.insert`, {}, {
648
- captureStackTrace: false
649
- })
664
+ opSpan("insert")
650
665
  ) as any
651
666
 
652
667
  const insertVoidSchema = SqlSchema.void({
@@ -657,9 +672,7 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = LAST_INSERT_ID(
657
672
  insert: S["insert"]["Type"]
658
673
  ): Effect.Effect<void, Schema.SchemaError, S["insert"]["EncodingServices"]> =>
659
674
  insertVoidSchema(insert).pipe(
660
- Effect.withSpan(`${options.spanPrefix}.insertVoid`, {}, {
661
- captureStackTrace: false
662
- })
675
+ opSpan("insertVoid")
663
676
  ) as any
664
677
 
665
678
  const updateSchema = SqlSchema.findOne({
@@ -706,11 +719,7 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = ${request[idCol
706
719
  ): Effect.Effect<S["Type"], Schema.SchemaError, S["DecodingServices"] | S["update"]["EncodingServices"]> =>
707
720
  updateSchema(update).pipe(
708
721
  Effect.catchTag("NoSuchElementError", Effect.die),
709
- Effect.withSpan(`${options.spanPrefix}.update`, {
710
- attributes: { id: (update as any)[idColumn] }
711
- }, {
712
- captureStackTrace: false
713
- })
722
+ opSpan("update", (update as any)[idColumn])
714
723
  ) as any
715
724
 
716
725
  const updateVoidSchema = SqlSchema.void({
@@ -729,11 +738,7 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = ${request[idCol
729
738
  update: S["update"]["Type"]
730
739
  ): Effect.Effect<void, Schema.SchemaError, S["update"]["EncodingServices"]> =>
731
740
  updateVoidSchema(update).pipe(
732
- Effect.withSpan(`${options.spanPrefix}.updateVoid`, {
733
- attributes: { id: (update as any)[idColumn] }
734
- }, {
735
- captureStackTrace: false
736
- })
741
+ opSpan("updateVoid", (update as any)[idColumn])
737
742
  ) as any
738
743
 
739
744
  const findByIdSchema = SqlSchema.findOneOption({
@@ -749,9 +754,7 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = ${request[idCol
749
754
  S["DecodingServices"] | S["fields"][Id]["EncodingServices"]
750
755
  > =>
751
756
  findByIdSchema(id).pipe(
752
- Effect.withSpan(`${options.spanPrefix}.findById`, { attributes: { id } }, {
753
- captureStackTrace: false
754
- })
757
+ opSpan("findById", id)
755
758
  ) as any
756
759
 
757
760
  const deleteSchema = SqlSchema.void({
@@ -762,11 +765,7 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = ${request[idCol
762
765
  id: S["fields"][Id]["Type"]
763
766
  ): Effect.Effect<void, Schema.SchemaError, S["fields"][Id]["EncodingServices"]> =>
764
767
  deleteSchema(id).pipe(
765
- Effect.withSpan(`${options.spanPrefix}.delete`, {
766
- attributes: { id }
767
- }, {
768
- captureStackTrace: false
769
- })
768
+ opSpan("delete", id)
770
769
  ) as any
771
770
 
772
771
  return { insert, insertVoid, update, updateVoid, findById, delete: delete_ } as const
@@ -789,6 +788,7 @@ export const makeDataLoaders = <
789
788
  readonly idColumn: Id
790
789
  readonly window: Input
791
790
  readonly maxBatchSize?: number | undefined
791
+ readonly dbSystem?: DbSystem | undefined
792
792
  }
793
793
  ): Effect.Effect<
794
794
  {
@@ -821,6 +821,15 @@ export const makeDataLoaders = <
821
821
  const idSchema = Model.fields[options.idColumn] as Schema.Top
822
822
  const idColumn = options.idColumn as string
823
823
  const setMaxBatchSize = options.maxBatchSize ? RequestResolver.batchN(options.maxBatchSize) : identity
824
+ const system: DbSystem = options.dbSystem ?? "other_sql"
825
+ const opSpan = (operation: string, idValue?: unknown) =>
826
+ withDbSpan({
827
+ operation,
828
+ system,
829
+ collection: options.tableName,
830
+ entity: options.spanPrefix,
831
+ ...(idValue !== undefined && { extra: { "app.entity.id": idValue } })
832
+ })
824
833
 
825
834
  const insertResolver = SqlResolver
826
835
  .ordered({
@@ -854,9 +863,7 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = LAST_INSERT_ID(
854
863
  > =>
855
864
  insertExecute(insert).pipe(
856
865
  Effect.catchTag("ResultLengthMismatch", Effect.die),
857
- Effect.withSpan(`${options.spanPrefix}.insert`, {}, {
858
- captureStackTrace: false
859
- })
866
+ opSpan("insert")
860
867
  ) as any
861
868
 
862
869
  const insertVoidResolver = SqlResolver
@@ -874,9 +881,7 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = LAST_INSERT_ID(
874
881
  insert: S["insert"]["Type"]
875
882
  ): Effect.Effect<void, Schema.SchemaError, S["insert"]["EncodingServices"]> =>
876
883
  insertVoidExecute(insert).pipe(
877
- Effect.withSpan(`${options.spanPrefix}.insertVoid`, {}, {
878
- captureStackTrace: false
879
- })
884
+ opSpan("insertVoid")
880
885
  ) as any
881
886
 
882
887
  const findByIdResolver = SqlResolver
@@ -902,9 +907,7 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = LAST_INSERT_ID(
902
907
  S["DecodingServices"] | S["fields"][Id]["EncodingServices"]
903
908
  > =>
904
909
  findByIdExecute(id).pipe(
905
- Effect.withSpan(`${options.spanPrefix}.findById`, { attributes: { id } }, {
906
- captureStackTrace: false
907
- })
910
+ opSpan("findById", id)
908
911
  ) as any
909
912
 
910
913
  const deleteResolver = SqlResolver
@@ -922,9 +925,7 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = LAST_INSERT_ID(
922
925
  id: S["fields"][Id]["Type"]
923
926
  ): Effect.Effect<void, Schema.SchemaError, S["fields"][Id]["EncodingServices"]> =>
924
927
  deleteExecute(id).pipe(
925
- Effect.withSpan(`${options.spanPrefix}.delete`, { attributes: { id } }, {
926
- captureStackTrace: false
927
- })
928
+ opSpan("delete", id)
928
929
  ) as any
929
930
 
930
931
  return { insert, insertVoid, findById, delete: delete_ } as const
@@ -0,0 +1,219 @@
1
+ /* eslint-disable @typescript-eslint/prefer-promise-reject-errors */
2
+ import { type OperationOptionsBase, type ProcessErrorArgs, ServiceBusClient, type ServiceBusMessage, type ServiceBusMessageBatch, type ServiceBusReceivedMessage, type ServiceBusReceiver } from "@azure/service-bus"
3
+ import * as Context from "effect-app/Context"
4
+ import * as Effect from "effect-app/Effect"
5
+ import * as Layer from "effect-app/Layer"
6
+ import * as Cause from "effect/Cause"
7
+ import * as Exit from "effect/Exit"
8
+ import * as FiberSet from "effect/FiberSet"
9
+ import type * as Scope from "effect/Scope"
10
+ import { InfraLogger } from "./logger.js"
11
+
12
+ const logged = (name: string) => <A, E, R>(self: Effect.Effect<A, E, R>) =>
13
+ Effect.logInfo(name).pipe(
14
+ Effect.andThen(self),
15
+ Effect.tap(Effect.logInfo(name + " done")),
16
+ Effect.withLogSpan(name)
17
+ )
18
+
19
+ function makeClient(url: string) {
20
+ return Effect.acquireRelease(
21
+ Effect.sync(() => new ServiceBusClient(url)).pipe(logged("ServiceBus.client.create")),
22
+ (client) => Effect.promise(() => client.close()).pipe(logged("ServiceBus.client.close"))
23
+ )
24
+ }
25
+
26
+ export class ServiceBusClientTag
27
+ extends Context.Opaque<ServiceBusClientTag, ServiceBusClient>()("@services/Client", { make: makeClient })
28
+ {
29
+ static readonly layer = (url: string) => this.toLayer(this.make(url))
30
+ }
31
+
32
+ const makeSender_ = Effect.fnUntraced(function*(queueName: string) {
33
+ const serviceBusClient = yield* ServiceBusClientTag
34
+
35
+ return yield* Effect.acquireRelease(
36
+ Effect.sync(() => serviceBusClient.createSender(queueName)).pipe(
37
+ logged(`ServiceBus.sender.create ${queueName}`)
38
+ ),
39
+ (sender) => Effect.promise(() => sender.close()).pipe(logged(`ServiceBus.sender.close ${queueName}`))
40
+ )
41
+ })
42
+
43
+ const makeSender = Effect.fnUntraced(function*(name: string) {
44
+ const sender = yield* makeSender_(name)
45
+ const sendMessages = Effect.fnUntraced(function*(
46
+ messages: ServiceBusMessage | ServiceBusMessage[] | ServiceBusMessageBatch,
47
+ options?: Omit<OperationOptionsBase, "abortSignal">
48
+ ) {
49
+ return yield* Effect.promise((abortSignal) => sender.sendMessages(messages, { ...options, abortSignal }))
50
+ })
51
+
52
+ return { name, sendMessages }
53
+ })
54
+
55
+ export class Sender extends Context.Opaque<Sender, {
56
+ name: string
57
+ sendMessages: (
58
+ messages: ServiceBusMessage | ServiceBusMessage[] | ServiceBusMessageBatch,
59
+ options?: Omit<OperationOptionsBase, "abortSignal">
60
+ ) => Effect.Effect<void>
61
+ }>()("Sender", { make: makeSender }) {
62
+ static readonly layer = (name: string) => this.toLayer(this.make(name))
63
+ }
64
+
65
+ export const SenderTag = <Id>() => <Key extends string>(queueName: Key) => {
66
+ const tag = Context.Service<Id, Sender>(`ServiceBus.Sender.${queueName}`)
67
+
68
+ return Object.assign(tag, {
69
+ layer: Layer.effect(
70
+ tag,
71
+ Sender.make(queueName).pipe(Effect.map(Sender.of))
72
+ )
73
+ })
74
+ }
75
+
76
+ const makeReceiver = Effect.fnUntraced(function*(name: string) {
77
+ const serviceBusClient = yield* ServiceBusClientTag
78
+
79
+ const makeReceiver = Effect.fnUntraced(
80
+ function*(queueName: string, waitTillEmpty: Effect.Effect<void>, sessionId?: string) {
81
+ const annotate = sessionId !== undefined
82
+ ? Effect.annotateLogs({ "messaging.session.id": sessionId })
83
+ : <A, E, R>(self: Effect.Effect<A, E, R>): Effect.Effect<A, E, R> => self
84
+ return yield* Effect.acquireRelease(
85
+ (sessionId
86
+ ? Effect.promise(() => serviceBusClient.acceptSession(queueName, sessionId))
87
+ : Effect.sync(() => serviceBusClient.createReceiver(queueName)))
88
+ .pipe(logged(`ServiceBus.receiver.create ${queueName}`), annotate),
89
+ (r) =>
90
+ waitTillEmpty.pipe(
91
+ logged(`ServiceBus.receiver.waitTillEmpty ${queueName}`),
92
+ Effect.andThen(
93
+ Effect.promise(() => r.close()).pipe(
94
+ logged(`ServiceBus.receiver.close ${queueName}`)
95
+ )
96
+ ),
97
+ logged(`ServiceBus.receiver.release ${queueName}`),
98
+ annotate
99
+ )
100
+ )
101
+ }
102
+ )
103
+
104
+ const make = (waitTillEmpty: Effect.Effect<void>) => makeReceiver(name, waitTillEmpty)
105
+
106
+ const makeSession = (sessionId: string, waitTillEmpty: Effect.Effect<void>) =>
107
+ makeReceiver(name, waitTillEmpty, sessionId)
108
+
109
+ return {
110
+ name,
111
+ make,
112
+ makeSession,
113
+ subscribe: Effect.fnUntraced(function*<RMsg, RErr>(hndlr: MessageHandlers<RMsg, RErr>, sessionId?: string) {
114
+ const fs = yield* FiberSet.make()
115
+ const fr = yield* FiberSet.runtime(fs)<RMsg | RErr>()
116
+ const wait = Effect
117
+ .gen(function*() {
118
+ if ((yield* FiberSet.size(fs)) > 0) {
119
+ yield* InfraLogger.logDebug("Waiting ServiceBusFiberSet to be empty: " + (yield* FiberSet.size(fs)))
120
+ }
121
+ while ((yield* FiberSet.size(fs)) > 0) yield* Effect.sleep("250 millis")
122
+ })
123
+ const r = yield* sessionId
124
+ ? makeSession(
125
+ sessionId,
126
+ wait
127
+ )
128
+ : make(wait)
129
+
130
+ const runEffect = <E>(effect: Effect.Effect<void, E, RMsg | RErr>) =>
131
+ new Promise<void>((resolve, reject) =>
132
+ fr(effect)
133
+ .addObserver((exit) => {
134
+ if (Exit.isSuccess(exit)) {
135
+ resolve(exit.value)
136
+ } else {
137
+ // disable @typescript-eslint/prefer-promise-reject-errors
138
+ reject(Cause.pretty(exit.cause))
139
+ }
140
+ })
141
+ )
142
+
143
+ const annotate = sessionId !== undefined
144
+ ? Effect.annotateLogs({ "messaging.session.id": sessionId })
145
+ : <A, E, R>(self: Effect.Effect<A, E, R>): Effect.Effect<A, E, R> => self
146
+ yield* Effect.acquireRelease(
147
+ Effect
148
+ .sync(() => {
149
+ const s = r
150
+ .subscribe({
151
+ processError: (err) =>
152
+ runEffect(
153
+ hndlr
154
+ .processError(err)
155
+ .pipe(
156
+ Effect.catchCause((cause) => Effect.logError("ServiceBus Error", cause)),
157
+ annotate
158
+ )
159
+ ),
160
+ processMessage: (msg) => runEffect(hndlr.processMessage(msg).pipe(annotate))
161
+ // DO NOT CATCH ERRORS here as they should return to the queue!
162
+ })
163
+ return { close: Effect.promise(() => s.close()) }
164
+ })
165
+ .pipe(logged("ServiceBus.subscription.create"), annotate),
166
+ (subscription) =>
167
+ subscription.close.pipe(
168
+ logged("ServiceBus.subscription.close"),
169
+ annotate
170
+ )
171
+ ) as Effect.Effect<void, never, Scope.Scope> // wth is going on here
172
+ })
173
+ }
174
+ })
175
+
176
+ export class Receiver extends Context.Opaque<Receiver, {
177
+ name: string
178
+ make: (waitTillEmpty: Effect.Effect<void>) => Effect.Effect<ServiceBusReceiver, never, Scope.Scope>
179
+ makeSession: (
180
+ sessionId: string,
181
+ waitTillEmpty: Effect.Effect<void>
182
+ ) => Effect.Effect<ServiceBusReceiver, never, Scope.Scope>
183
+ subscribe<RMsg, RErr>(
184
+ hndlr: MessageHandlers<RMsg, RErr>,
185
+ sessionId?: string
186
+ ): Effect.Effect<void, never, Scope.Scope | RMsg | RErr>
187
+ }>()("Receiver") {
188
+ static readonly make = makeReceiver
189
+ static readonly layer = (name: string) => this.toLayer(makeReceiver(name))
190
+ }
191
+
192
+ export const ReceiverTag = <Id>() => <Key extends string>(queueName: Key) => {
193
+ const tag = Context.Service<Id, Receiver>(`ServiceBus.Receiver.${queueName}`)
194
+
195
+ return Object.assign(tag, {
196
+ layer: Layer.effect(
197
+ tag,
198
+ makeReceiver(queueName).pipe(Effect.map(Receiver.of))
199
+ )
200
+ })
201
+ }
202
+
203
+ export const SenderReceiver = (queue: string, queueDrain?: string) =>
204
+ Layer.mergeAll(Sender.layer(queue), Receiver.layer(queueDrain ?? queue))
205
+
206
+ export interface MessageHandlers<RMsg, RErr> {
207
+ /**
208
+ * Handler that processes messages from service bus.
209
+ *
210
+ * @param message - A message received from Service Bus.
211
+ */
212
+ processMessage(message: ServiceBusReceivedMessage): Effect.Effect<void, never, RMsg>
213
+ /**
214
+ * Handler that processes errors that occur during receiving.
215
+ * @param args - The error and additional context to indicate where
216
+ * the error originated.
217
+ */
218
+ processError(args: ProcessErrorArgs): Effect.Effect<void, never, RErr>
219
+ }