@effect-app/infra 4.0.0-beta.98 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (486) hide show
  1. package/CHANGELOG.md +2891 -0
  2. package/_check.sh +1 -1
  3. package/dist/CUPS.d.ts +28 -9
  4. package/dist/CUPS.d.ts.map +1 -1
  5. package/dist/CUPS.js +35 -14
  6. package/dist/ClusterCosmos.d.ts +67 -0
  7. package/dist/ClusterCosmos.d.ts.map +1 -0
  8. package/dist/ClusterCosmos.js +588 -0
  9. package/dist/ClusterServiceBus.d.ts +67 -0
  10. package/dist/ClusterServiceBus.d.ts.map +1 -0
  11. package/dist/ClusterServiceBus.js +84 -0
  12. package/dist/{api/ContextProvider.d.ts → ContextProvider.d.ts} +7 -4
  13. package/dist/ContextProvider.d.ts.map +1 -0
  14. package/dist/ContextProvider.js +40 -0
  15. package/dist/Emailer/Sendgrid.d.ts +110 -146
  16. package/dist/Emailer/Sendgrid.d.ts.map +1 -1
  17. package/dist/Emailer/Sendgrid.js +24 -19
  18. package/dist/Emailer/fake.d.ts +1 -1
  19. package/dist/Emailer/fake.d.ts.map +1 -1
  20. package/dist/Emailer/fake.js +4 -4
  21. package/dist/MainFiberSet.d.ts +11 -7
  22. package/dist/MainFiberSet.d.ts.map +1 -1
  23. package/dist/MainFiberSet.js +22 -6
  24. package/dist/QueueMaker/errors.d.ts +3 -1
  25. package/dist/QueueMaker/errors.d.ts.map +1 -1
  26. package/dist/QueueMaker/errors.js +4 -2
  27. package/dist/{adapters/SQL → SQL}/Model.d.ts +34 -45
  28. package/dist/SQL/Model.d.ts.map +1 -0
  29. package/dist/SQL/Model.js +469 -0
  30. package/dist/SQL.d.ts.map +1 -0
  31. package/dist/{adapters/SQL.js → SQL.js} +1 -1
  32. package/dist/Store/Cosmos/query.d.ts +16 -4
  33. package/dist/Store/Cosmos/query.d.ts.map +1 -1
  34. package/dist/Store/Cosmos/query.js +238 -42
  35. package/dist/Store/Cosmos.d.ts +2 -2
  36. package/dist/Store/Cosmos.d.ts.map +1 -1
  37. package/dist/Store/Cosmos.js +394 -319
  38. package/dist/Store/Disk.d.ts +4 -4
  39. package/dist/Store/Disk.d.ts.map +1 -1
  40. package/dist/Store/Disk.js +91 -39
  41. package/dist/Store/Memory.d.ts +7 -10
  42. package/dist/Store/Memory.d.ts.map +1 -1
  43. package/dist/Store/Memory.js +348 -78
  44. package/dist/Store/SQL/Pg.d.ts +2 -2
  45. package/dist/Store/SQL/Pg.d.ts.map +1 -1
  46. package/dist/Store/SQL/Pg.js +229 -154
  47. package/dist/Store/SQL/query.d.ts +19 -3
  48. package/dist/Store/SQL/query.d.ts.map +1 -1
  49. package/dist/Store/SQL/query.js +306 -12
  50. package/dist/Store/SQL.d.ts +22 -5
  51. package/dist/Store/SQL.d.ts.map +1 -1
  52. package/dist/Store/SQL.js +369 -98
  53. package/dist/Store/codeFilter.d.ts +4 -4
  54. package/dist/Store/codeFilter.d.ts.map +1 -1
  55. package/dist/Store/codeFilter.js +71 -22
  56. package/dist/Store/index.d.ts +6 -4
  57. package/dist/Store/index.d.ts.map +1 -1
  58. package/dist/Store/index.js +9 -6
  59. package/dist/Store/jsonDocument.d.ts +67 -0
  60. package/dist/Store/jsonDocument.d.ts.map +1 -0
  61. package/dist/Store/jsonDocument.js +107 -0
  62. package/dist/Store/utils.d.ts +21 -2
  63. package/dist/Store/utils.d.ts.map +1 -1
  64. package/dist/Store/utils.js +253 -10
  65. package/dist/WorkflowEngineCosmos.d.ts +30 -0
  66. package/dist/WorkflowEngineCosmos.d.ts.map +1 -0
  67. package/dist/WorkflowEngineCosmos.js +542 -0
  68. package/dist/WorkflowEngineSqlite.d.ts +24 -0
  69. package/dist/WorkflowEngineSqlite.d.ts.map +1 -0
  70. package/dist/WorkflowEngineSqlite.js +550 -0
  71. package/dist/arbs.d.ts +6 -3
  72. package/dist/arbs.d.ts.map +1 -1
  73. package/dist/arbs.js +20 -4
  74. package/dist/codec.d.ts.map +1 -0
  75. package/dist/codec.js +5 -0
  76. package/dist/cosmos-client.d.ts +40 -0
  77. package/dist/cosmos-client.d.ts.map +1 -0
  78. package/dist/cosmos-client.js +41 -0
  79. package/dist/errorReporter.d.ts +6 -4
  80. package/dist/errorReporter.d.ts.map +1 -1
  81. package/dist/errorReporter.js +23 -27
  82. package/dist/fileUtil.d.ts +1 -1
  83. package/dist/fileUtil.d.ts.map +1 -1
  84. package/dist/fileUtil.js +2 -2
  85. package/dist/index.d.ts +2 -1
  86. package/dist/index.d.ts.map +1 -1
  87. package/dist/index.js +3 -2
  88. package/dist/internal/RequestContextMiddleware.d.ts +5 -0
  89. package/dist/internal/RequestContextMiddleware.d.ts.map +1 -0
  90. package/dist/internal/RequestContextMiddleware.js +45 -0
  91. package/dist/internal/auth.d.ts +53 -0
  92. package/dist/internal/auth.d.ts.map +1 -0
  93. package/dist/internal/auth.js +180 -0
  94. package/dist/internal/events.d.ts +11 -0
  95. package/dist/internal/events.d.ts.map +1 -0
  96. package/dist/internal/events.js +49 -0
  97. package/dist/{api/internal → internal}/health.d.ts +1 -1
  98. package/dist/internal/health.d.ts.map +1 -0
  99. package/dist/internal/health.js +5 -0
  100. package/dist/{api/layerUtils.d.ts → layerUtils.d.ts} +10 -2
  101. package/dist/layerUtils.d.ts.map +1 -0
  102. package/dist/layerUtils.js +17 -0
  103. package/dist/logger/jsonLogger.d.ts +1 -1
  104. package/dist/logger/jsonLogger.d.ts.map +1 -1
  105. package/dist/logger/jsonLogger.js +5 -3
  106. package/dist/logger/logFmtLogger.d.ts +1 -1
  107. package/dist/logger/logFmtLogger.d.ts.map +1 -1
  108. package/dist/logger/logFmtLogger.js +3 -3
  109. package/dist/logger/shared.d.ts +2 -2
  110. package/dist/logger/shared.d.ts.map +1 -1
  111. package/dist/logger/shared.js +6 -6
  112. package/dist/logger.d.ts.map +1 -1
  113. package/dist/middlewares.d.ts.map +1 -0
  114. package/dist/{api/middlewares.js → middlewares.js} +1 -1
  115. package/dist/{adapters/mongo-client.d.ts → mongo-client.d.ts} +2 -1
  116. package/dist/mongo-client.d.ts.map +1 -0
  117. package/dist/mongo-client.js +15 -0
  118. package/dist/otel.d.ts +75 -0
  119. package/dist/otel.d.ts.map +1 -0
  120. package/dist/otel.js +84 -0
  121. package/dist/rateLimit.d.ts +11 -3
  122. package/dist/rateLimit.d.ts.map +1 -1
  123. package/dist/rateLimit.js +7 -12
  124. package/dist/{adapters/redis-client.d.ts → redis-client.d.ts} +4 -1
  125. package/dist/redis-client.d.ts.map +1 -0
  126. package/dist/redis-client.js +98 -0
  127. package/dist/{api/reportError.d.ts → reportError.d.ts} +1 -1
  128. package/dist/reportError.d.ts.map +1 -0
  129. package/dist/reportError.js +28 -0
  130. package/dist/{api/routing → routing}/middleware/RouterMiddleware.d.ts +2 -1
  131. package/dist/routing/middleware/RouterMiddleware.d.ts.map +1 -0
  132. package/dist/{api/routing → routing}/middleware/RouterMiddleware.js +1 -1
  133. package/dist/{api/routing → routing}/middleware/middleware.d.ts +11 -6
  134. package/dist/routing/middleware/middleware.d.ts.map +1 -0
  135. package/dist/routing/middleware/middleware.js +152 -0
  136. package/dist/{api/routing → routing}/middleware.d.ts +0 -1
  137. package/dist/routing/middleware.d.ts.map +1 -0
  138. package/dist/{api/routing → routing}/middleware.js +1 -2
  139. package/dist/routing/schema/jwt.d.ts.map +1 -0
  140. package/dist/routing/schema/jwt.js +12 -0
  141. package/dist/routing/tsort.d.ts.map +1 -0
  142. package/dist/routing/tsort.js +51 -0
  143. package/dist/{api/routing → routing}/utils.d.ts +3 -3
  144. package/dist/routing/utils.d.ts.map +1 -0
  145. package/dist/routing/utils.js +45 -0
  146. package/dist/routing.d.ts +182 -0
  147. package/dist/routing.d.ts.map +1 -0
  148. package/dist/routing.js +256 -0
  149. package/dist/test.d.ts +2 -2
  150. package/dist/test.d.ts.map +1 -1
  151. package/dist/test.js +5 -5
  152. package/dist/util.d.ts.map +1 -0
  153. package/dist/util.js +14 -0
  154. package/docs/cluster-storage.md +26 -0
  155. package/docs/workflow-engine.md +262 -0
  156. package/examples/query.ts +23 -19
  157. package/package.json +36 -364
  158. package/src/CUPS.ts +53 -14
  159. package/src/ClusterCosmos.ts +1170 -0
  160. package/src/ClusterServiceBus.ts +244 -0
  161. package/src/{api/ContextProvider.ts → ContextProvider.ts} +10 -7
  162. package/src/Emailer/Sendgrid.ts +83 -60
  163. package/src/Emailer/fake.ts +4 -4
  164. package/src/MainFiberSet.ts +31 -12
  165. package/src/QueueMaker/errors.ts +3 -1
  166. package/src/{adapters/SQL → SQL}/Model.ts +48 -47
  167. package/src/SQL.ts +1 -0
  168. package/src/Store/Cosmos/query.ts +275 -55
  169. package/src/Store/Cosmos.ts +597 -515
  170. package/src/Store/Disk.ts +145 -71
  171. package/src/Store/Memory.ts +420 -115
  172. package/src/Store/SQL/Pg.ts +352 -268
  173. package/src/Store/SQL/query.ts +366 -20
  174. package/src/Store/SQL.ts +742 -293
  175. package/src/Store/codeFilter.ts +78 -28
  176. package/src/Store/index.ts +18 -13
  177. package/src/Store/jsonDocument.ts +143 -0
  178. package/src/Store/utils.ts +307 -30
  179. package/src/WorkflowEngineCosmos.ts +749 -0
  180. package/src/WorkflowEngineSqlite.ts +813 -0
  181. package/src/arbs.ts +25 -5
  182. package/src/cosmos-client.ts +72 -0
  183. package/src/errorReporter.ts +68 -78
  184. package/src/fileUtil.ts +1 -1
  185. package/src/index.ts +2 -1
  186. package/src/{api/internal → internal}/RequestContextMiddleware.ts +23 -6
  187. package/src/internal/auth.ts +272 -0
  188. package/src/{api/internal → internal}/events.ts +18 -9
  189. package/src/{api/layerUtils.ts → layerUtils.ts} +7 -3
  190. package/src/logger/jsonLogger.ts +5 -3
  191. package/src/logger/logFmtLogger.ts +3 -3
  192. package/src/logger/shared.ts +6 -5
  193. package/src/middlewares.ts +10 -0
  194. package/src/{adapters/mongo-client.ts → mongo-client.ts} +3 -1
  195. package/src/otel.ts +177 -0
  196. package/src/rateLimit.ts +35 -24
  197. package/src/{adapters/redis-client.ts → redis-client.ts} +6 -2
  198. package/src/{api/reportError.ts → reportError.ts} +3 -2
  199. package/src/{api/routing → routing}/middleware/RouterMiddleware.ts +2 -1
  200. package/src/{api/routing → routing}/middleware/middleware.ts +75 -50
  201. package/src/routing/middleware.ts +4 -0
  202. package/src/{api/routing → routing}/schema/jwt.ts +2 -2
  203. package/src/{api/routing → routing}/utils.ts +2 -1
  204. package/src/routing.ts +823 -0
  205. package/src/test.ts +6 -6
  206. package/src/vitest.ts +1 -1
  207. package/test/arbs-magnitude.test.ts +33 -0
  208. package/test/arbs.test.ts +41 -0
  209. package/test/auth.test.ts +101 -0
  210. package/test/cluster-cosmos.test.ts +634 -0
  211. package/test/cluster-servicebus.test.ts +180 -0
  212. package/test/cluster-sqlite.test.ts +207 -0
  213. package/test/contextProvider.test.ts +11 -8
  214. package/test/controller.test.ts +23 -28
  215. package/test/cosmos-container-throughput.test.ts +80 -0
  216. package/test/cosmos-query.test.ts +368 -0
  217. package/test/dist/arbs-magnitude.test.d.ts.map +1 -0
  218. package/test/dist/arbs.test.d.ts.map +1 -0
  219. package/test/dist/auth.test.d.ts.map +1 -0
  220. package/test/dist/cluster-cosmos.test.d.ts.map +1 -0
  221. package/test/dist/cluster-servicebus.test.d.ts.map +1 -0
  222. package/test/dist/cluster-sqlite.test.d.ts.map +1 -0
  223. package/test/dist/contextProvider.test.d.ts.map +1 -1
  224. package/test/dist/controller.test.d.ts.map +1 -1
  225. package/test/dist/cosmos-container-throughput.test.d.ts.map +1 -0
  226. package/test/dist/cosmos-query.test.d.ts.map +1 -0
  227. package/test/dist/fixtures.d.ts +17 -9
  228. package/test/dist/fixtures.d.ts.map +1 -1
  229. package/test/dist/fixtures.js +8 -3
  230. package/test/dist/json-lower.test.d.ts.map +1 -0
  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/repository-legacy-document.test.d.ts.map +1 -0
  235. package/test/dist/requires.test.d.ts.map +1 -1
  236. package/test/dist/router-generator.test.d.ts.map +1 -0
  237. package/test/dist/routing-interruptibility.test.d.ts.map +1 -0
  238. package/test/dist/rpc-context-map-streaming.test.d.ts.map +1 -0
  239. package/test/dist/rpc-e2e-invalidation.test.d.ts.map +1 -0
  240. package/test/dist/rpc-multi-middleware.test.d.ts.map +1 -1
  241. package/test/dist/rpc-stream-fullstack.test.d.ts.map +1 -0
  242. package/test/dist/workflow-engine-cosmos.test.d.ts.map +1 -0
  243. package/test/dist/workflow-engine-sqlite.test.d.ts.map +1 -0
  244. package/test/fixtures.ts +7 -2
  245. package/test/json-lower.test.ts +129 -0
  246. package/test/layerUtils.test.ts +2 -2
  247. package/test/query.test.ts +1232 -42
  248. package/test/rawQuery.test.ts +432 -7
  249. package/test/repository-ext.test.ts +456 -0
  250. package/test/repository-legacy-document.test.ts +394 -0
  251. package/test/requires.test.ts +7 -3
  252. package/test/router-generator.test.ts +187 -0
  253. package/test/routing-interruptibility.test.ts +66 -0
  254. package/test/rpc-context-map-streaming.test.ts +265 -0
  255. package/test/rpc-e2e-invalidation.test.ts +421 -0
  256. package/test/rpc-multi-middleware.test.ts +17 -11
  257. package/test/rpc-stream-fullstack.test.ts +307 -0
  258. package/test/sql-store.test.ts +1202 -47
  259. package/test/validateSample.test.ts +70 -42
  260. package/test/workflow-engine-cosmos.test.ts +345 -0
  261. package/test/workflow-engine-sqlite.test.ts +297 -0
  262. package/tsconfig.examples.json +1 -1
  263. package/tsconfig.json +9 -1
  264. package/tsconfig.src.json +35 -35
  265. package/tsconfig.test.json +2 -2
  266. package/dist/Emailer/service.d.ts +0 -55
  267. package/dist/Emailer/service.d.ts.map +0 -1
  268. package/dist/Emailer/service.js +0 -6
  269. package/dist/Emailer.d.ts +0 -2
  270. package/dist/Emailer.d.ts.map +0 -1
  271. package/dist/Emailer.js +0 -2
  272. package/dist/Model/Repository/ext.d.ts +0 -41
  273. package/dist/Model/Repository/ext.d.ts.map +0 -1
  274. package/dist/Model/Repository/ext.js +0 -65
  275. package/dist/Model/Repository/internal/internal.d.ts +0 -59
  276. package/dist/Model/Repository/internal/internal.d.ts.map +0 -1
  277. package/dist/Model/Repository/internal/internal.js +0 -320
  278. package/dist/Model/Repository/legacy.d.ts +0 -19
  279. package/dist/Model/Repository/legacy.d.ts.map +0 -1
  280. package/dist/Model/Repository/legacy.js +0 -2
  281. package/dist/Model/Repository/makeRepo.d.ts +0 -49
  282. package/dist/Model/Repository/makeRepo.d.ts.map +0 -1
  283. package/dist/Model/Repository/makeRepo.js +0 -24
  284. package/dist/Model/Repository/service.d.ts +0 -89
  285. package/dist/Model/Repository/service.d.ts.map +0 -1
  286. package/dist/Model/Repository/service.js +0 -2
  287. package/dist/Model/Repository/validation.d.ts +0 -43
  288. package/dist/Model/Repository/validation.d.ts.map +0 -1
  289. package/dist/Model/Repository/validation.js +0 -32
  290. package/dist/Model/Repository.d.ts +0 -6
  291. package/dist/Model/Repository.d.ts.map +0 -1
  292. package/dist/Model/Repository.js +0 -6
  293. package/dist/Model/dsl.d.ts +0 -32
  294. package/dist/Model/dsl.d.ts.map +0 -1
  295. package/dist/Model/dsl.js +0 -44
  296. package/dist/Model/filter/filterApi.d.ts +0 -30
  297. package/dist/Model/filter/filterApi.d.ts.map +0 -1
  298. package/dist/Model/filter/filterApi.js +0 -2
  299. package/dist/Model/filter/types/errors.d.ts +0 -29
  300. package/dist/Model/filter/types/errors.d.ts.map +0 -1
  301. package/dist/Model/filter/types/errors.js +0 -2
  302. package/dist/Model/filter/types/fields.d.ts +0 -15
  303. package/dist/Model/filter/types/fields.d.ts.map +0 -1
  304. package/dist/Model/filter/types/fields.js +0 -2
  305. package/dist/Model/filter/types/path/common.d.ts +0 -316
  306. package/dist/Model/filter/types/path/common.d.ts.map +0 -1
  307. package/dist/Model/filter/types/path/common.js +0 -2
  308. package/dist/Model/filter/types/path/eager.d.ts +0 -95
  309. package/dist/Model/filter/types/path/eager.d.ts.map +0 -1
  310. package/dist/Model/filter/types/path/eager.js +0 -31
  311. package/dist/Model/filter/types/path/index.d.ts +0 -4
  312. package/dist/Model/filter/types/path/index.d.ts.map +0 -1
  313. package/dist/Model/filter/types/path/index.js +0 -3
  314. package/dist/Model/filter/types/utils.d.ts +0 -79
  315. package/dist/Model/filter/types/utils.d.ts.map +0 -1
  316. package/dist/Model/filter/types/utils.js +0 -2
  317. package/dist/Model/filter/types/validator.d.ts +0 -30
  318. package/dist/Model/filter/types/validator.d.ts.map +0 -1
  319. package/dist/Model/filter/types/validator.js +0 -2
  320. package/dist/Model/filter/types.d.ts +0 -5
  321. package/dist/Model/filter/types.d.ts.map +0 -1
  322. package/dist/Model/filter/types.js +0 -7
  323. package/dist/Model/query/dsl.d.ts +0 -248
  324. package/dist/Model/query/dsl.d.ts.map +0 -1
  325. package/dist/Model/query/dsl.js +0 -104
  326. package/dist/Model/query/new-kid-interpreter.d.ts +0 -28
  327. package/dist/Model/query/new-kid-interpreter.d.ts.map +0 -1
  328. package/dist/Model/query/new-kid-interpreter.js +0 -165
  329. package/dist/Model/query.d.ts +0 -15
  330. package/dist/Model/query.d.ts.map +0 -1
  331. package/dist/Model/query.js +0 -3
  332. package/dist/Model.d.ts +0 -4
  333. package/dist/Model.d.ts.map +0 -1
  334. package/dist/Model.js +0 -4
  335. package/dist/Operations.d.ts +0 -55
  336. package/dist/Operations.d.ts.map +0 -1
  337. package/dist/Operations.js +0 -102
  338. package/dist/OperationsRepo.d.ts +0 -41
  339. package/dist/OperationsRepo.d.ts.map +0 -1
  340. package/dist/OperationsRepo.js +0 -14
  341. package/dist/QueueMaker/SQLQueue.d.ts +0 -14
  342. package/dist/QueueMaker/SQLQueue.d.ts.map +0 -1
  343. package/dist/QueueMaker/SQLQueue.js +0 -132
  344. package/dist/QueueMaker/memQueue.d.ts +0 -11
  345. package/dist/QueueMaker/memQueue.d.ts.map +0 -1
  346. package/dist/QueueMaker/memQueue.js +0 -76
  347. package/dist/QueueMaker/sbqueue.d.ts +0 -12
  348. package/dist/QueueMaker/sbqueue.d.ts.map +0 -1
  349. package/dist/QueueMaker/sbqueue.js +0 -91
  350. package/dist/QueueMaker/service.d.ts +0 -11
  351. package/dist/QueueMaker/service.d.ts.map +0 -1
  352. package/dist/QueueMaker/service.js +0 -4
  353. package/dist/RequestContext.d.ts +0 -68
  354. package/dist/RequestContext.d.ts.map +0 -1
  355. package/dist/RequestContext.js +0 -49
  356. package/dist/RequestFiberSet.d.ts +0 -36
  357. package/dist/RequestFiberSet.d.ts.map +0 -1
  358. package/dist/RequestFiberSet.js +0 -78
  359. package/dist/Store/ContextMapContainer.d.ts +0 -25
  360. package/dist/Store/ContextMapContainer.d.ts.map +0 -1
  361. package/dist/Store/ContextMapContainer.js +0 -77
  362. package/dist/Store/service.d.ts +0 -111
  363. package/dist/Store/service.d.ts.map +0 -1
  364. package/dist/Store/service.js +0 -79
  365. package/dist/Store.d.ts +0 -2
  366. package/dist/Store.d.ts.map +0 -1
  367. package/dist/Store.js +0 -2
  368. package/dist/adapters/SQL/Model.d.ts.map +0 -1
  369. package/dist/adapters/SQL/Model.js +0 -478
  370. package/dist/adapters/SQL.d.ts.map +0 -1
  371. package/dist/adapters/ServiceBus.d.ts +0 -58
  372. package/dist/adapters/ServiceBus.d.ts.map +0 -1
  373. package/dist/adapters/ServiceBus.js +0 -99
  374. package/dist/adapters/cosmos-client.d.ts +0 -14
  375. package/dist/adapters/cosmos-client.d.ts.map +0 -1
  376. package/dist/adapters/cosmos-client.js +0 -9
  377. package/dist/adapters/index.d.ts +0 -2
  378. package/dist/adapters/index.d.ts.map +0 -1
  379. package/dist/adapters/index.js +0 -2
  380. package/dist/adapters/logger.d.ts +0 -9
  381. package/dist/adapters/logger.d.ts.map +0 -1
  382. package/dist/adapters/logger.js +0 -3
  383. package/dist/adapters/memQueue.d.ts +0 -13
  384. package/dist/adapters/memQueue.d.ts.map +0 -1
  385. package/dist/adapters/memQueue.js +0 -20
  386. package/dist/adapters/mongo-client.d.ts.map +0 -1
  387. package/dist/adapters/mongo-client.js +0 -13
  388. package/dist/adapters/redis-client.d.ts.map +0 -1
  389. package/dist/adapters/redis-client.js +0 -94
  390. package/dist/api/ContextProvider.d.ts.map +0 -1
  391. package/dist/api/ContextProvider.js +0 -38
  392. package/dist/api/codec.d.ts.map +0 -1
  393. package/dist/api/codec.js +0 -5
  394. package/dist/api/internal/RequestContextMiddleware.d.ts +0 -5
  395. package/dist/api/internal/RequestContextMiddleware.d.ts.map +0 -1
  396. package/dist/api/internal/RequestContextMiddleware.js +0 -35
  397. package/dist/api/internal/auth.d.ts +0 -15
  398. package/dist/api/internal/auth.d.ts.map +0 -1
  399. package/dist/api/internal/auth.js +0 -47
  400. package/dist/api/internal/events.d.ts +0 -9
  401. package/dist/api/internal/events.d.ts.map +0 -1
  402. package/dist/api/internal/events.js +0 -42
  403. package/dist/api/internal/health.d.ts.map +0 -1
  404. package/dist/api/internal/health.js +0 -5
  405. package/dist/api/layerUtils.d.ts.map +0 -1
  406. package/dist/api/layerUtils.js +0 -16
  407. package/dist/api/middlewares.d.ts.map +0 -1
  408. package/dist/api/reportError.d.ts.map +0 -1
  409. package/dist/api/reportError.js +0 -27
  410. package/dist/api/routing/middleware/RouterMiddleware.d.ts.map +0 -1
  411. package/dist/api/routing/middleware/middleware.d.ts.map +0 -1
  412. package/dist/api/routing/middleware/middleware.js +0 -130
  413. package/dist/api/routing/middleware.d.ts.map +0 -1
  414. package/dist/api/routing/schema/jwt.d.ts.map +0 -1
  415. package/dist/api/routing/schema/jwt.js +0 -12
  416. package/dist/api/routing/tsort.d.ts.map +0 -1
  417. package/dist/api/routing/tsort.js +0 -51
  418. package/dist/api/routing/utils.d.ts.map +0 -1
  419. package/dist/api/routing/utils.js +0 -44
  420. package/dist/api/routing.d.ts +0 -134
  421. package/dist/api/routing.d.ts.map +0 -1
  422. package/dist/api/routing.js +0 -167
  423. package/dist/api/setupRequest.d.ts +0 -15
  424. package/dist/api/setupRequest.d.ts.map +0 -1
  425. package/dist/api/setupRequest.js +0 -49
  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 -580
  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/SQLQueue.ts +0 -190
  455. package/src/QueueMaker/memQueue.ts +0 -130
  456. package/src/QueueMaker/sbqueue.ts +0 -137
  457. package/src/QueueMaker/service.ts +0 -17
  458. package/src/RequestContext.ts +0 -63
  459. package/src/RequestFiberSet.ts +0 -105
  460. package/src/Store/ContextMapContainer.ts +0 -116
  461. package/src/Store/index.test.ts.bak +0 -112
  462. package/src/Store/service.ts +0 -193
  463. package/src/Store.ts +0 -1
  464. package/src/adapters/SQL.ts +0 -1
  465. package/src/adapters/ServiceBus.ts +0 -209
  466. package/src/adapters/cosmos-client.ts +0 -16
  467. package/src/adapters/index.ts +0 -0
  468. package/src/adapters/logger.ts +0 -3
  469. package/src/adapters/memQueue.ts +0 -21
  470. package/src/api/internal/auth.ts +0 -68
  471. package/src/api/middlewares.ts +0 -10
  472. package/src/api/routing/middleware.ts +0 -6
  473. package/src/api/routing.ts +0 -598
  474. package/src/api/setupRequest.ts +0 -104
  475. package/test/dist/date-query.test.d.ts.map +0 -1
  476. package/tsconfig.json.bak +0 -12
  477. /package/dist/{adapters/SQL.d.ts → SQL.d.ts} +0 -0
  478. /package/dist/{api/codec.d.ts → codec.d.ts} +0 -0
  479. /package/dist/{api/middlewares.d.ts → middlewares.d.ts} +0 -0
  480. /package/dist/{api/routing → routing}/schema/jwt.d.ts +0 -0
  481. /package/dist/{api/routing → routing}/tsort.d.ts +0 -0
  482. /package/dist/{api/util.d.ts → util.d.ts} +0 -0
  483. /package/src/{api/codec.ts → codec.ts} +0 -0
  484. /package/src/{api/internal → internal}/health.ts +0 -0
  485. /package/src/{api/routing → routing}/tsort.ts +0 -0
  486. /package/src/{api/util.ts → util.ts} +0 -0
@@ -0,0 +1,244 @@
1
+ import { ServiceBusClient, type ServiceBusClientOptions, type ServiceBusMessage, type ServiceBusReceiverOptions, type ServiceBusSenderOptions, type SubscribeOptions } from "@azure/service-bus"
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 ClusterError from "effect/cluster/ClusterError"
6
+ import { Persisted } from "effect/cluster/ClusterSchema"
7
+ import type * as Message from "effect/cluster/Message"
8
+ import type * as MessageStorage from "effect/cluster/MessageStorage"
9
+ import type * as RunnerHealth from "effect/cluster/RunnerHealth"
10
+ import * as Runners from "effect/cluster/Runners"
11
+ import type * as RunnerStorage from "effect/cluster/RunnerStorage"
12
+ import * as Sharding from "effect/cluster/Sharding"
13
+ import type * as ShardingConfig from "effect/cluster/ShardingConfig"
14
+ import * as Snowflake from "effect/cluster/Snowflake"
15
+ import * as Data from "effect/Data"
16
+ import type * as Rpc from "effect/rpc/Rpc"
17
+ import * as Schema from "effect/Schema"
18
+ import * as Scope from "effect/Scope"
19
+
20
+ export interface ClusterServiceBusSender {
21
+ readonly sendMessages: (messages: ServiceBusMessage) => Promise<void>
22
+ readonly close: () => Promise<void>
23
+ }
24
+
25
+ export interface ClusterServiceBusSubscription {
26
+ readonly close: () => Promise<void>
27
+ }
28
+
29
+ export interface ClusterServiceBusReceiver {
30
+ readonly subscribe: (
31
+ handlers: {
32
+ readonly processMessage: () => Promise<void>
33
+ readonly processError: (args: {
34
+ readonly error: Error
35
+ readonly entityPath?: string | undefined
36
+ readonly errorSource: string
37
+ readonly fullyQualifiedNamespace: string
38
+ }) => Promise<void>
39
+ },
40
+ options?: SubscribeOptions | undefined
41
+ ) => ClusterServiceBusSubscription
42
+ readonly close: () => Promise<void>
43
+ }
44
+
45
+ export interface ClusterServiceBusClient {
46
+ readonly createSender: (
47
+ topicName: string,
48
+ options?: ServiceBusSenderOptions | undefined
49
+ ) => ClusterServiceBusSender
50
+ readonly createReceiver: (
51
+ topicName: string,
52
+ subscriptionName: string,
53
+ options?: ServiceBusReceiverOptions | undefined
54
+ ) => ClusterServiceBusReceiver
55
+ readonly close: () => Promise<void>
56
+ }
57
+
58
+ export class ClusterServiceBus extends Context.Service<ClusterServiceBus, {
59
+ readonly client: ClusterServiceBusClient
60
+ }>()("@effect-app/infra/ClusterServiceBus") {}
61
+
62
+ export interface TopicOptions {
63
+ readonly topicName: string
64
+ readonly senderOptions?: ServiceBusSenderOptions | undefined
65
+ }
66
+
67
+ export interface SubscriptionOptions extends TopicOptions {
68
+ readonly subscriptionName: string
69
+ readonly receiverOptions?: ServiceBusReceiverOptions | undefined
70
+ readonly subscribeOptions?: SubscribeOptions | undefined
71
+ }
72
+
73
+ export interface StorageNotification {
74
+ readonly _tag: "EffectClusterStorageNotification"
75
+ readonly envelopeId: string
76
+ readonly requestId: string
77
+ readonly shardId: string
78
+ readonly entityType: string
79
+ readonly entityId: string
80
+ }
81
+
82
+ export const layerClient = (
83
+ connectionString: string,
84
+ options?: ServiceBusClientOptions | undefined
85
+ ): Layer.Layer<ClusterServiceBus> =>
86
+ Layer.effect(
87
+ ClusterServiceBus,
88
+ Effect.acquireRelease(
89
+ Effect.sync(() => ClusterServiceBus.of({ client: new ServiceBusClient(connectionString, options) })),
90
+ ({ client }) => Effect.promise(() => client.close()).pipe(Effect.ignore)
91
+ )
92
+ )
93
+
94
+ export const layerClientFrom = (client: ClusterServiceBusClient): Layer.Layer<ClusterServiceBus> =>
95
+ Layer.succeed(ClusterServiceBus)(ClusterServiceBus.of({ client }))
96
+
97
+ export const makeRunners: (
98
+ options: TopicOptions
99
+ ) => Effect.Effect<
100
+ Runners.Runners["Service"],
101
+ never,
102
+ | ClusterServiceBus
103
+ | MessageStorage.MessageStorage
104
+ | ShardingConfig.ShardingConfig
105
+ | Snowflake.Generator
106
+ | Scope.Scope
107
+ > = Effect.fnUntraced(function*(options) {
108
+ const serviceBus = yield* ClusterServiceBus
109
+ const scope = yield* Effect.scope
110
+ const sender = serviceBus.client.createSender(options.topicName, options.senderOptions)
111
+
112
+ yield* Scope.addFinalizer(scope, Effect.promise(() => sender.close()).pipe(Effect.ignore))
113
+
114
+ const publish = <R extends Rpc.Any>(message: Message.Outgoing<R>) =>
115
+ Effect
116
+ .tryPromise({
117
+ try: () => sender.sendMessages(storageNotification(message)),
118
+ catch: (cause) => new ServiceBusPublishError({ cause })
119
+ })
120
+ .pipe(
121
+ Effect.catch((cause) => Effect.logDebug("Could not publish cluster storage notification", cause))
122
+ )
123
+
124
+ return yield* Runners.make({
125
+ codecFor: Schema.toCodecJson,
126
+ ping: (address) => Effect.fail(new ClusterError.RunnerUnavailable({ address })),
127
+ send: ({ address, message }) => {
128
+ const persisted = Context.get(message.rpc.annotations, Persisted)
129
+ return (persisted ? publish(message) : Effect.void).pipe(
130
+ Effect.andThen(Effect.fail(new ClusterError.RunnerUnavailable({ address })))
131
+ )
132
+ },
133
+ notify: ({ message }) => publish(message),
134
+ onRunnerUnavailable: () => Effect.void
135
+ })
136
+ })
137
+
138
+ export const layerRunners = (
139
+ options: TopicOptions
140
+ ): Layer.Layer<
141
+ Runners.Runners,
142
+ never,
143
+ ClusterServiceBus | MessageStorage.MessageStorage | ShardingConfig.ShardingConfig
144
+ > =>
145
+ Layer.effect(Runners.Runners, makeRunners(options)).pipe(
146
+ Layer.provide(Snowflake.layerGenerator)
147
+ )
148
+
149
+ export const makeStoragePoller: (
150
+ options: SubscriptionOptions
151
+ ) => Effect.Effect<void, never, ClusterServiceBus | Sharding.Sharding | Scope.Scope> = Effect.fnUntraced(
152
+ function*(options) {
153
+ const serviceBus = yield* ClusterServiceBus
154
+ const sharding = yield* Sharding.Sharding
155
+ const scope = yield* Effect.scope
156
+ const receiver = serviceBus.client.createReceiver(
157
+ options.topicName,
158
+ options.subscriptionName,
159
+ {
160
+ receiveMode: "receiveAndDelete",
161
+ ...options.receiverOptions
162
+ }
163
+ )
164
+ const subscription = receiver.subscribe(
165
+ {
166
+ processMessage: () =>
167
+ Effect.runPromise(
168
+ sharding.pollStorage.pipe(
169
+ Effect.catchCause((cause) => Effect.logDebug("Could not wake cluster storage poller", cause))
170
+ )
171
+ ),
172
+ processError: (args) =>
173
+ Effect.runPromise(
174
+ Effect.logDebug("Error receiving cluster storage notification", args.error).pipe(
175
+ Effect.annotateLogs({
176
+ entityPath: args.entityPath,
177
+ errorSource: args.errorSource,
178
+ fullyQualifiedNamespace: args.fullyQualifiedNamespace
179
+ })
180
+ )
181
+ )
182
+ },
183
+ options.subscribeOptions
184
+ )
185
+
186
+ yield* Scope.addFinalizer(
187
+ scope,
188
+ Effect.promise(() => subscription.close()).pipe(
189
+ Effect.andThen(Effect.promise(() => receiver.close())),
190
+ Effect.ignore
191
+ )
192
+ )
193
+ }
194
+ )
195
+
196
+ export const layerStoragePoller = (
197
+ options: SubscriptionOptions
198
+ ): Layer.Layer<never, never, ClusterServiceBus | Sharding.Sharding> => Layer.effectDiscard(makeStoragePoller(options))
199
+
200
+ export const layer = (
201
+ options: SubscriptionOptions
202
+ ): Layer.Layer<
203
+ Sharding.Sharding | Runners.Runners,
204
+ never,
205
+ | ClusterServiceBus
206
+ | MessageStorage.MessageStorage
207
+ | RunnerHealth.RunnerHealth
208
+ | RunnerStorage.RunnerStorage
209
+ | ShardingConfig.ShardingConfig
210
+ > => {
211
+ const sharding = Sharding.layer.pipe(
212
+ Layer.provideMerge(layerRunners(options))
213
+ )
214
+ return Layer.merge(
215
+ sharding,
216
+ layerStoragePoller(options).pipe(
217
+ Layer.provide(sharding)
218
+ )
219
+ )
220
+ }
221
+
222
+ const storageNotification = <R extends Rpc.Any>(message: Message.Outgoing<R>): ServiceBusMessage => {
223
+ const envelope = message.envelope
224
+ const envelopeId = envelope._tag === "Request" ? envelope.requestId : envelope.id
225
+ const body: StorageNotification = {
226
+ _tag: "EffectClusterStorageNotification",
227
+ envelopeId: String(envelopeId),
228
+ requestId: String(envelope.requestId),
229
+ shardId: envelope.address.shardId.toString(),
230
+ entityType: envelope.address.entityType,
231
+ entityId: envelope.address.entityId
232
+ }
233
+ return {
234
+ body,
235
+ contentType: "application/json",
236
+ correlationId: body.requestId,
237
+ messageId: body.envelopeId,
238
+ subject: body._tag
239
+ }
240
+ }
241
+
242
+ class ServiceBusPublishError extends Data.TaggedError("ServiceBusPublishError")<{
243
+ readonly cause: unknown
244
+ }> {}
@@ -1,10 +1,14 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
- import { Context, Effect, Layer, type NonEmptyReadonlyArray, pipe, type Scope } from "effect-app"
2
+ import type { NonEmptyReadonlyArray } from "effect-app/Array"
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 { pipe } from "effect/Function"
7
+ import type * as Scope from "effect/Scope"
3
8
 
4
9
  import { type HttpRouter } from "effect-app/http"
5
10
  import { type EffectGenUtils } from "effect-app/utils/gen"
6
- import { type Yieldable } from "effect/Effect"
7
- import { type ContextTagWithDefault, type GetContext, type LayerUtils, mergeContexts } from "./layerUtils.js"
11
+ import { type ContextTagWithDefault, type GetContext, type LayerUtils, mergeContexts } from "./layerUtils.ts"
8
12
 
9
13
  export interface ContextProviderId {
10
14
  _tag: "ContextProvider"
@@ -38,7 +42,7 @@ type TDepsArr<TDeps extends ReadonlyArray<any>> = {
38
42
  > // & { _tag: infer _3 }
39
43
  ) // [_YW] extends [never] if no yield* is used and just some context is returned
40
44
  ? [_YW] extends [never] ? TDeps[K]
41
- : [_YW] extends [Yieldable<any, infer _2, never, infer _R>] ? [_R] extends [HttpRouter.Provided] ? TDeps[K]
45
+ : [_YW] extends [Effect.Effect<any, never, infer _R>] ? [_R] extends [HttpRouter.Provided] ? TDeps[K]
42
46
  : `HttpLayerRouter.Provided is the only requirement ${TDeps[K]["Service"][
43
47
  "_tag"
44
48
  ]}'s returned effect can have`
@@ -97,9 +101,8 @@ export const ContextProvider = <
97
101
  effect: Effect.Effect<
98
102
  | Effect.Effect<ContextProviderA, never, ContextProviderR>
99
103
  | (() => Generator<
100
- Yieldable<any, any, never, ContextProviderR>,
101
- ContextProviderA,
102
- any
104
+ Effect.Effect<any, never, ContextProviderR>,
105
+ ContextProviderA
103
106
  >),
104
107
  MakeContextProviderE,
105
108
  MakeContextProviderR | Scope.Scope
@@ -1,63 +1,85 @@
1
- import type { EmailData } from "@sendgrid/helpers/classes/email-address.js"
2
1
  import type { MailContent } from "@sendgrid/helpers/classes/mail.js"
3
2
  import sgMail from "@sendgrid/mail"
4
- import { Array, Effect, Equivalence, Redacted } from "effect-app"
3
+ import * as Array from "effect-app/Array"
4
+ import * as Effect from "effect-app/Effect"
5
+ import { type EmailData, Emailer, type EmailMsg, type EmailMsgOptionalFrom, SendMailError } from "effect-app/Emailer"
5
6
  import { dropUndefinedT } from "effect-app/utils"
7
+ import * as Equivalence from "effect/Equivalence"
8
+ import * as Redacted from "effect/Redacted"
6
9
  import { inspect } from "util"
7
- import { InfraLogger } from "../logger.js"
8
- import { Emailer, type EmailMsg, type EmailMsgOptionalFrom, type SendgridConfig, SendMailError } from "./service.js"
10
+ import { InfraLogger } from "../logger.ts"
9
11
 
10
- const makeSendgrid = ({ apiKey, defaultFrom, defaultReplyTo, realMail, subjectPrefix }: SendgridConfig) =>
12
+ export interface SendgridConfig {
13
+ defaultReplyTo?: EmailData
14
+ subjectPrefix: string
15
+ realMail: boolean
16
+ defaultFrom: EmailData
17
+ apiKey: Redacted.Redacted
18
+ /**
19
+ * Email address used for fake/test recipients. Use `{i}` as a placeholder for
20
+ * an auto-incrementing index to ensure uniqueness.
21
+ *
22
+ * @example "test+{i}@example.com"
23
+ */
24
+ fakeMailAddress: string
25
+ }
26
+
27
+ const makeSendgrid = (
28
+ { apiKey, defaultFrom, defaultReplyTo, fakeMailAddress, realMail, subjectPrefix }: SendgridConfig
29
+ ) =>
11
30
  Effect.sync(() => {
12
31
  sgMail.setApiKey(Redacted.value(apiKey))
13
32
 
14
33
  return Emailer.of({
15
- sendMail: Effect.fn("Sendgrid.sendMail")(function*(msg_: EmailMsgOptionalFrom) {
16
- const msg: EmailMsg = dropUndefinedT({
17
- ...msg_,
18
- from: msg_.from ?? defaultFrom,
19
- replyTo: msg_.replyTo ?? (msg_.from ? undefined : defaultReplyTo)
20
- })
21
- const render = renderMessage(!realMail)
34
+ sendMail: Effect.fn("Emailer.sendMail", { attributes: { "messaging.system": "sendgrid" } })(
35
+ function*(msg_: EmailMsgOptionalFrom) {
36
+ const replyTo = msg_.replyTo ?? (msg_.from ? undefined : defaultReplyTo)
37
+ const msg = dropUndefinedT({
38
+ ...msg_,
39
+ from: msg_.from ?? defaultFrom,
40
+ replyTo
41
+ }) satisfies EmailMsg
42
+ const render = renderMessage(!realMail, fakeMailAddress)
22
43
 
23
- const renderedMsg_ = render(msg)
24
- const renderedMsg = {
25
- ...renderedMsg_ as Omit<typeof renderedMsg_, "content">,
26
- subject: `${subjectPrefix}${renderedMsg_.subject}`,
27
- ..."content" in renderedMsg_
28
- ? { content: [...renderedMsg_.content] as [MailContent, ...MailContent[]] }
29
- : {}
30
- }
31
- yield* InfraLogger.logDebug("Sending email").pipe(Effect.annotateLogs("msg", inspect(renderedMsg, false, 5)))
44
+ const renderedMsg_ = render(msg)
45
+ const renderedMsg = {
46
+ ...renderedMsg_ as Omit<typeof renderedMsg_, "content">,
47
+ subject: `${subjectPrefix}${renderedMsg_.subject}`,
48
+ ..."content" in renderedMsg_
49
+ ? { content: [...renderedMsg_.content] as [MailContent, ...MailContent[]] }
50
+ : {}
51
+ }
52
+ yield* InfraLogger.logDebug("Sending email").pipe(Effect.annotateLogs("msg", inspect(renderedMsg, false, 5)))
32
53
 
33
- const ret = yield* Effect
34
- .callback<
35
- [sgMail.ClientResponse, Record<string, unknown>],
36
- Error | sgMail.ResponseError
37
- >(
38
- (resume) =>
39
- void sgMail.send(
40
- renderedMsg as any, // sue me
41
- msg.isMultiple ?? true,
42
- (err, result) =>
43
- err
44
- ? resume(Effect.fail(err))
45
- : resume(Effect.sync(() => result))
46
- )
47
- )
48
- .pipe(Effect.mapError((raw) => new SendMailError({ raw })))
54
+ const ret = yield* Effect
55
+ .callback<
56
+ [sgMail.ClientResponse, Record<string, unknown>],
57
+ Error | sgMail.ResponseError
58
+ >(
59
+ (resume) =>
60
+ void sgMail.send(
61
+ renderedMsg as any, // sue me
62
+ msg.isMultiple ?? true,
63
+ (err, result) =>
64
+ err
65
+ ? resume(Effect.fail(err))
66
+ : resume(Effect.sync(() => result))
67
+ )
68
+ )
69
+ .pipe(Effect.mapError((raw) => new SendMailError({ raw })))
49
70
 
50
- // const event = {
51
- // name: "EmailSent",
52
- // properties: {
53
- // templateId: msg.templateId
54
- // }
55
- // }
56
- // yield* InfraLogger.logDebug("Tracking email event").annotateLogs("event", event.$$.pretty)
57
- // const { trackEvent } = yield* AiContextService
58
- // trackEvent(event)
59
- return ret
60
- })
71
+ // const event = {
72
+ // name: "EmailSent",
73
+ // properties: {
74
+ // templateId: msg.templateId
75
+ // }
76
+ // }
77
+ // yield* InfraLogger.logDebug("Tracking email event").annotateLogs("event", event.$$.pretty)
78
+ // const { trackEvent } = yield* AiContextService
79
+ // trackEvent(event)
80
+ return ret
81
+ }
82
+ )
61
83
  })
62
84
  })
63
85
 
@@ -68,23 +90,24 @@ export function Sendgrid(config: SendgridConfig) {
68
90
  /**
69
91
  * @hidden
70
92
  */
71
- export function renderMessage(forceFake: boolean) {
93
+ export function renderMessage(forceFake: boolean, fakeMailAddress: string) {
72
94
  let i = 0
73
95
  const makeId = () => i++
96
+ const makeFakeEmail = () => fakeMailAddress.replace("{i}", String(makeId()))
74
97
  return forceFake
75
98
  ? (msg: EmailMsg) =>
76
99
  dropUndefinedT({
77
100
  ...msg,
78
- to: msg.to && renderFake(msg.to, makeId),
79
- cc: msg.cc && renderFake(msg.cc, makeId),
80
- bcc: msg.bcc && renderFake(msg.bcc, makeId)
101
+ to: msg.to && renderFake(msg.to, makeFakeEmail),
102
+ cc: msg.cc && renderFake(msg.cc, makeFakeEmail),
103
+ bcc: msg.bcc && renderFake(msg.bcc, makeFakeEmail)
81
104
  })
82
105
  : (msg: EmailMsg) =>
83
106
  dropUndefinedT({
84
107
  ...msg,
85
- to: msg.to && renderFakeIfTest(msg.to, makeId),
86
- cc: msg.cc && renderFakeIfTest(msg.cc, makeId),
87
- bcc: msg.bcc && renderFakeIfTest(msg.bcc, makeId)
108
+ to: msg.to && renderFakeIfTest(msg.to, makeFakeEmail),
109
+ cc: msg.cc && renderFakeIfTest(msg.cc, makeFakeEmail),
110
+ bcc: msg.bcc && renderFakeIfTest(msg.bcc, makeFakeEmail)
88
111
  })
89
112
  }
90
113
 
@@ -100,10 +123,10 @@ export function isTestAddress(to: EmailData) {
100
123
  )
101
124
  }
102
125
 
103
- function renderFake(addr: EmailData | readonly EmailData[], makeId: () => number) {
126
+ function renderFake(addr: EmailData | readonly EmailData[], makeEmail: () => string) {
104
127
  return {
105
128
  name: renderMailData(addr),
106
- email: `test+${makeId()}@nomizz.com`
129
+ email: makeEmail()
107
130
  }
108
131
  }
109
132
  const eq = Equivalence.mapInput(
@@ -117,14 +140,14 @@ function isEmailDataArray(md: EmailData | readonly EmailData[]): md is readonly
117
140
 
118
141
  // TODO: should just not add any already added email address
119
142
  // https://stackoverflow.com/a/53603076/11595834
120
- function renderFakeIfTest(addr: EmailData | readonly EmailData[], makeId: () => number) {
143
+ function renderFakeIfTest(addr: EmailData | readonly EmailData[], makeEmail: () => string) {
121
144
  if (isEmailDataArray(addr)) {
122
145
  return Array.dedupeWith(
123
- addr.map((x) => (isTestAddress(x) ? renderFake(x, makeId) : x)),
146
+ addr.map((x) => (isTestAddress(x) ? renderFake(x, makeEmail) : x)),
124
147
  eq
125
148
  )
126
149
  }
127
- return isTestAddress(addr) ? renderFake(addr, makeId) : addr
150
+ return isTestAddress(addr) ? renderFake(addr, makeEmail) : addr
128
151
  }
129
152
 
130
153
  function renderMailData(md: EmailData | readonly EmailData[]): string {
@@ -1,13 +1,13 @@
1
- import { Effect } from "effect-app"
1
+ import * as Effect from "effect-app/Effect"
2
+ import { Emailer } from "effect-app/Emailer"
2
3
  import { pretty } from "effect-app/utils"
3
- import { InfraLogger } from "../logger.js"
4
- import { Emailer } from "./service.js"
4
+ import { InfraLogger } from "../logger.ts"
5
5
 
6
6
  const makeFake = InfraLogger
7
7
  .logInfo("FAKE Emailer Service enabled")
8
8
  .pipe(Effect.map(() =>
9
9
  Emailer.of({
10
- sendMail: Effect.fn("Fake.sendMail")((msg) =>
10
+ sendMail: Effect.fn("Emailer.sendMail", { attributes: { "messaging.system": "fake" } })((msg) =>
11
11
  InfraLogger
12
12
  .logDebug(`Fake send mail`)
13
13
  .pipe(Effect.annotateLogs("msg", pretty(msg)))
@@ -1,14 +1,34 @@
1
- import { Context, Effect, Fiber, FiberSet, Layer } from "effect-app"
2
- import type {} from "effect/Scope"
3
- import { InfraLogger } from "./logger.js"
4
- import { reportNonInterruptedFailureCause } from "./QueueMaker/errors.js"
5
- import { setRootParentSpan } from "./RequestFiberSet.js"
1
+ import * as Context from "effect-app/Context"
2
+ import * as Effect from "effect-app/Effect"
3
+ import * as Layer from "effect-app/Layer"
4
+ import * as Option from "effect-app/Option"
5
+ import * as Fiber from "effect/Fiber"
6
+ import * as FiberSet from "effect/FiberSet"
7
+ import type * as Tracer from "effect/Tracer"
8
+
9
+ import { InfraLogger } from "./logger.ts"
10
+ import { reportNonInterruptedFailureCause } from "./QueueMaker/errors.ts"
11
+
12
+ // Walk to the root span so a daemon fiber's spans aren't parented to a span that
13
+ // may already be closing (e.g. the originating request).
14
+ const getRootParentSpan = Effect.gen(function*() {
15
+ let span: Tracer.AnySpan | null = yield* Effect.currentSpan.pipe(
16
+ Effect.catchTag("NoSuchElementError", () => Effect.succeed(null))
17
+ )
18
+ if (!span) return span
19
+ while (span._tag === "Span" && Option.isSome(span.parent)) {
20
+ span = span.parent.value
21
+ }
22
+ return span
23
+ })
24
+
25
+ export const setRootParentSpan = <A, E, R>(self: Effect.Effect<A, E, R>) =>
26
+ getRootParentSpan.pipe(Effect.andThen((span) => span ? Effect.withParentSpan(self, span) : self))
6
27
 
7
28
  const make = Effect.gen(function*() {
8
29
  const set = yield* FiberSet.make<unknown, never>()
9
- const add = (...fibers: Fiber.Fiber<never, never>[]) =>
10
- Effect.sync(() => fibers.forEach((_) => FiberSet.addUnsafe(set, _)))
11
- const addAll = (fibers: readonly Fiber.Fiber<never, never>[]) =>
30
+ const add = (...fibers: Fiber.Fiber<never>[]) => Effect.sync(() => fibers.forEach((_) => FiberSet.addUnsafe(set, _)))
31
+ const addAll = (fibers: readonly Fiber.Fiber<never>[]) =>
12
32
  Effect.sync(() => fibers.forEach((_) => FiberSet.addUnsafe(set, _)))
13
33
  const join = FiberSet.size(set).pipe(
14
34
  Effect.andThen((count) => InfraLogger.logDebug(`Joining ${count} current fibers on the MainFiberSet`)),
@@ -64,13 +84,12 @@ const make = Effect.gen(function*() {
64
84
  */
65
85
  export class MainFiberSet extends Context.Service<MainFiberSet>()("MainFiberSet", { make }) {
66
86
  static readonly Live = Layer.effect(this, this.make)
67
- static readonly JoinLive = this.asEffect().pipe(
87
+ static readonly JoinLive = this.pipe(
68
88
  Effect.andThen((_) => _.join),
69
89
  Layer.effectDiscard,
70
90
  Layer.provide(this.Live)
71
91
  )
72
- static readonly run = <A, R>(self: Effect.Effect<A, never, R>) =>
73
- this.asEffect().pipe(Effect.andThen((_) => _.run(self)))
92
+ static readonly run = <A, R>(self: Effect.Effect<A, never, R>) => this.pipe(Effect.andThen((_) => _.run(self)))
74
93
  static readonly forkDaemonReport = <A, E, R>(self: Effect.Effect<A, E, R>) =>
75
- this.asEffect().pipe(Effect.andThen((_) => _.forkDaemonReport(self)))
94
+ this.pipe(Effect.andThen((_) => _.forkDaemonReport(self)))
76
95
  }
@@ -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