@effect-app/infra 4.0.0-beta.3 → 4.0.0-beta.300

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 (474) hide show
  1. package/CHANGELOG.md +2485 -0
  2. package/_check.sh +1 -1
  3. package/dist/CUPS.d.ts +29 -10
  4. package/dist/CUPS.d.ts.map +1 -1
  5. package/dist/CUPS.js +35 -14
  6. package/dist/ClusterCosmos.d.ts +64 -0
  7. package/dist/ClusterCosmos.d.ts.map +1 -0
  8. package/dist/ClusterCosmos.js +547 -0
  9. package/dist/ClusterServiceBus.d.ts +67 -0
  10. package/dist/ClusterServiceBus.d.ts.map +1 -0
  11. package/dist/ClusterServiceBus.js +82 -0
  12. package/dist/ContextProvider.d.ts +34 -0
  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 +12 -8
  22. package/dist/MainFiberSet.d.ts.map +1 -1
  23. package/dist/MainFiberSet.js +23 -7
  24. package/dist/QueueMaker/errors.d.ts +4 -2
  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 +33 -47
  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 +14 -3
  33. package/dist/Store/Cosmos/query.d.ts.map +1 -1
  34. package/dist/Store/Cosmos/query.js +179 -41
  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 +385 -254
  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 +79 -39
  41. package/dist/Store/Memory.d.ts +5 -9
  42. package/dist/Store/Memory.d.ts.map +1 -1
  43. package/dist/Store/Memory.js +324 -67
  44. package/dist/Store/SQL/Pg.d.ts +4 -0
  45. package/dist/Store/SQL/Pg.d.ts.map +1 -0
  46. package/dist/Store/SQL/Pg.js +232 -0
  47. package/dist/Store/SQL/query.d.ts +49 -0
  48. package/dist/Store/SQL/query.d.ts.map +1 -0
  49. package/dist/Store/SQL/query.js +527 -0
  50. package/dist/Store/SQL.d.ts +21 -0
  51. package/dist/Store/SQL.d.ts.map +1 -0
  52. package/dist/Store/SQL.js +456 -0
  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 +6 -4
  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 +18 -5
  59. package/dist/Store/utils.d.ts +5 -2
  60. package/dist/Store/utils.d.ts.map +1 -1
  61. package/dist/Store/utils.js +9 -5
  62. package/dist/WorkflowEngineCosmos.d.ts +29 -0
  63. package/dist/WorkflowEngineCosmos.d.ts.map +1 -0
  64. package/dist/WorkflowEngineCosmos.js +542 -0
  65. package/dist/WorkflowEngineSqlite.d.ts +24 -0
  66. package/dist/WorkflowEngineSqlite.d.ts.map +1 -0
  67. package/dist/WorkflowEngineSqlite.js +550 -0
  68. package/dist/arbs.d.ts +1 -1
  69. package/dist/arbs.d.ts.map +1 -1
  70. package/dist/arbs.js +5 -3
  71. package/dist/codec.d.ts.map +1 -0
  72. package/dist/codec.js +5 -0
  73. package/dist/{adapters/cosmos-client.d.ts → cosmos-client.d.ts} +4 -2
  74. package/dist/cosmos-client.d.ts.map +1 -0
  75. package/dist/cosmos-client.js +11 -0
  76. package/dist/errorReporter.d.ts +6 -4
  77. package/dist/errorReporter.d.ts.map +1 -1
  78. package/dist/errorReporter.js +23 -27
  79. package/dist/fileUtil.d.ts +1 -1
  80. package/dist/fileUtil.d.ts.map +1 -1
  81. package/dist/fileUtil.js +4 -3
  82. package/dist/index.d.ts +2 -1
  83. package/dist/index.d.ts.map +1 -1
  84. package/dist/index.js +3 -2
  85. package/dist/internal/RequestContextMiddleware.d.ts +5 -0
  86. package/dist/internal/RequestContextMiddleware.d.ts.map +1 -0
  87. package/dist/internal/RequestContextMiddleware.js +45 -0
  88. package/dist/internal/auth.d.ts +53 -0
  89. package/dist/internal/auth.d.ts.map +1 -0
  90. package/dist/internal/auth.js +180 -0
  91. package/dist/internal/events.d.ts +11 -0
  92. package/dist/internal/events.d.ts.map +1 -0
  93. package/dist/internal/events.js +49 -0
  94. package/dist/internal/health.d.ts.map +1 -0
  95. package/dist/internal/health.js +5 -0
  96. package/dist/{api/layerUtils.d.ts → layerUtils.d.ts} +14 -6
  97. package/dist/layerUtils.d.ts.map +1 -0
  98. package/dist/layerUtils.js +17 -0
  99. package/dist/logger/jsonLogger.d.ts +1 -1
  100. package/dist/logger/jsonLogger.d.ts.map +1 -1
  101. package/dist/logger/jsonLogger.js +5 -3
  102. package/dist/logger/logFmtLogger.d.ts +1 -1
  103. package/dist/logger/logFmtLogger.d.ts.map +1 -1
  104. package/dist/logger/logFmtLogger.js +3 -3
  105. package/dist/logger/shared.d.ts +2 -2
  106. package/dist/logger/shared.d.ts.map +1 -1
  107. package/dist/logger/shared.js +5 -5
  108. package/dist/logger.d.ts +4 -4
  109. package/dist/logger.d.ts.map +1 -1
  110. package/dist/middlewares.d.ts.map +1 -0
  111. package/dist/{api/middlewares.js → middlewares.js} +1 -1
  112. package/dist/{adapters/mongo-client.d.ts → mongo-client.d.ts} +3 -2
  113. package/dist/mongo-client.d.ts.map +1 -0
  114. package/dist/mongo-client.js +15 -0
  115. package/dist/otel.d.ts +75 -0
  116. package/dist/otel.d.ts.map +1 -0
  117. package/dist/otel.js +65 -0
  118. package/dist/rateLimit.d.ts +11 -3
  119. package/dist/rateLimit.d.ts.map +1 -1
  120. package/dist/rateLimit.js +7 -12
  121. package/dist/{adapters/redis-client.d.ts → redis-client.d.ts} +6 -3
  122. package/dist/redis-client.d.ts.map +1 -0
  123. package/dist/redis-client.js +98 -0
  124. package/dist/{api/reportError.d.ts → reportError.d.ts} +1 -1
  125. package/dist/reportError.d.ts.map +1 -0
  126. package/dist/reportError.js +28 -0
  127. package/dist/{api/routing → routing}/middleware/RouterMiddleware.d.ts +4 -3
  128. package/dist/routing/middleware/RouterMiddleware.d.ts.map +1 -0
  129. package/dist/{api/routing → routing}/middleware/RouterMiddleware.js +1 -1
  130. package/dist/routing/middleware/middleware.d.ts +48 -0
  131. package/dist/routing/middleware/middleware.d.ts.map +1 -0
  132. package/dist/routing/middleware/middleware.js +152 -0
  133. package/dist/{api/routing → routing}/middleware.d.ts +0 -1
  134. package/dist/routing/middleware.d.ts.map +1 -0
  135. package/dist/{api/routing → routing}/middleware.js +1 -2
  136. package/dist/{api/routing → routing}/schema/jwt.d.ts +1 -1
  137. package/dist/routing/schema/jwt.d.ts.map +1 -0
  138. package/dist/routing/schema/jwt.js +13 -0
  139. package/dist/routing/tsort.d.ts.map +1 -0
  140. package/dist/routing/tsort.js +51 -0
  141. package/dist/{api/routing → routing}/utils.d.ts +3 -3
  142. package/dist/routing/utils.d.ts.map +1 -0
  143. package/dist/routing/utils.js +45 -0
  144. package/dist/routing.d.ts +182 -0
  145. package/dist/routing.d.ts.map +1 -0
  146. package/dist/routing.js +256 -0
  147. package/dist/test.d.ts +2 -2
  148. package/dist/test.d.ts.map +1 -1
  149. package/dist/test.js +2 -2
  150. package/dist/util.d.ts.map +1 -0
  151. package/dist/util.js +14 -0
  152. package/docs/cluster-storage.md +26 -0
  153. package/docs/workflow-engine.md +262 -0
  154. package/examples/query.ts +47 -39
  155. package/package.json +38 -352
  156. package/src/CUPS.ts +53 -14
  157. package/src/ClusterCosmos.ts +1118 -0
  158. package/src/ClusterServiceBus.ts +242 -0
  159. package/src/{api/ContextProvider.ts → ContextProvider.ts} +20 -17
  160. package/src/Emailer/Sendgrid.ts +83 -60
  161. package/src/Emailer/fake.ts +4 -4
  162. package/src/MainFiberSet.ts +32 -13
  163. package/src/QueueMaker/errors.ts +3 -1
  164. package/src/{adapters/SQL → SQL}/Model.ts +116 -110
  165. package/src/SQL.ts +1 -0
  166. package/src/Store/Cosmos/query.ts +218 -54
  167. package/src/Store/Cosmos.ts +529 -365
  168. package/src/Store/Disk.ts +112 -70
  169. package/src/Store/Memory.ts +366 -102
  170. package/src/Store/SQL/Pg.ts +363 -0
  171. package/src/Store/SQL/query.ts +603 -0
  172. package/src/Store/SQL.ts +746 -0
  173. package/src/Store/codeFilter.ts +8 -6
  174. package/src/Store/index.ts +25 -10
  175. package/src/Store/utils.ts +32 -25
  176. package/src/WorkflowEngineCosmos.ts +749 -0
  177. package/src/WorkflowEngineSqlite.ts +813 -0
  178. package/src/arbs.ts +5 -3
  179. package/src/{adapters/cosmos-client.ts → cosmos-client.ts} +5 -3
  180. package/src/errorReporter.ts +68 -78
  181. package/src/fileUtil.ts +3 -2
  182. package/src/index.ts +2 -1
  183. package/src/{api/internal → internal}/RequestContextMiddleware.ts +23 -6
  184. package/src/internal/auth.ts +272 -0
  185. package/src/{api/internal → internal}/events.ts +25 -15
  186. package/src/{api/layerUtils.ts → layerUtils.ts} +14 -10
  187. package/src/logger/jsonLogger.ts +5 -3
  188. package/src/logger/logFmtLogger.ts +3 -3
  189. package/src/logger/shared.ts +5 -4
  190. package/src/middlewares.ts +10 -0
  191. package/src/{adapters/mongo-client.ts → mongo-client.ts} +4 -2
  192. package/src/otel.ts +152 -0
  193. package/src/rateLimit.ts +34 -23
  194. package/src/{adapters/redis-client.ts → redis-client.ts} +7 -3
  195. package/src/{api/reportError.ts → reportError.ts} +3 -2
  196. package/src/{api/routing → routing}/middleware/RouterMiddleware.ts +5 -4
  197. package/src/routing/middleware/middleware.ts +196 -0
  198. package/src/routing/middleware.ts +4 -0
  199. package/src/{api/routing → routing}/schema/jwt.ts +4 -4
  200. package/src/{api/routing → routing}/utils.ts +2 -1
  201. package/src/routing.ts +823 -0
  202. package/src/test.ts +4 -4
  203. package/src/vitest.ts +1 -1
  204. package/test/auth.test.ts +101 -0
  205. package/test/cluster-cosmos.test.ts +612 -0
  206. package/test/cluster-servicebus.test.ts +180 -0
  207. package/test/cluster-sqlite.test.ts +205 -0
  208. package/test/contextProvider.test.ts +15 -12
  209. package/test/controller.test.ts +30 -32
  210. package/test/cosmos-query.test.ts +228 -0
  211. package/test/dist/auth.test.d.ts.map +1 -0
  212. package/test/dist/cluster-cosmos.test.d.ts.map +1 -0
  213. package/test/dist/cluster-servicebus.test.d.ts.map +1 -0
  214. package/test/dist/cluster-sqlite.test.d.ts.map +1 -0
  215. package/test/dist/contextProvider.test.d.ts.map +1 -1
  216. package/test/dist/controller.test.d.ts.map +1 -1
  217. package/test/dist/cosmos-query.test.d.ts.map +1 -0
  218. package/test/dist/fixtures.d.ts +29 -11
  219. package/test/dist/fixtures.d.ts.map +1 -1
  220. package/test/dist/fixtures.js +17 -10
  221. package/test/dist/query.test.d.ts.map +1 -1
  222. package/test/dist/rawQuery.test.d.ts.map +1 -1
  223. package/test/dist/repository-ext.test.d.ts.map +1 -0
  224. package/test/dist/requires.test.d.ts.map +1 -1
  225. package/test/dist/router-generator.test.d.ts.map +1 -0
  226. package/test/dist/routing-interruptibility.test.d.ts.map +1 -0
  227. package/test/dist/rpc-context-map-streaming.test.d.ts.map +1 -0
  228. package/test/dist/rpc-e2e-invalidation.test.d.ts.map +1 -0
  229. package/test/dist/rpc-multi-middleware.test.d.ts.map +1 -1
  230. package/test/dist/rpc-stream-fullstack.test.d.ts.map +1 -0
  231. package/test/dist/sql-store.test.d.ts.map +1 -0
  232. package/test/dist/workflow-engine-cosmos.test.d.ts.map +1 -0
  233. package/test/dist/workflow-engine-sqlite.test.d.ts.map +1 -0
  234. package/test/fixtures.ts +16 -9
  235. package/test/layerUtils.test.ts +2 -2
  236. package/test/query.test.ts +1007 -43
  237. package/test/rawQuery.test.ts +340 -22
  238. package/test/repository-ext.test.ts +178 -0
  239. package/test/requires.test.ts +10 -5
  240. package/test/router-generator.test.ts +187 -0
  241. package/test/routing-interruptibility.test.ts +66 -0
  242. package/test/rpc-context-map-streaming.test.ts +262 -0
  243. package/test/rpc-e2e-invalidation.test.ts +418 -0
  244. package/test/rpc-multi-middleware.test.ts +86 -11
  245. package/test/rpc-stream-fullstack.test.ts +304 -0
  246. package/test/sql-store.test.ts +1711 -0
  247. package/test/validateSample.test.ts +26 -14
  248. package/test/workflow-engine-cosmos.test.ts +345 -0
  249. package/test/workflow-engine-sqlite.test.ts +297 -0
  250. package/tsconfig.examples.json +1 -1
  251. package/tsconfig.json +3 -1
  252. package/tsconfig.src.json +35 -35
  253. package/tsconfig.test.json +2 -2
  254. package/dist/Emailer/service.d.ts +0 -55
  255. package/dist/Emailer/service.d.ts.map +0 -1
  256. package/dist/Emailer/service.js +0 -6
  257. package/dist/Emailer.d.ts +0 -2
  258. package/dist/Emailer.d.ts.map +0 -1
  259. package/dist/Emailer.js +0 -2
  260. package/dist/Model/Repository/ext.d.ts +0 -41
  261. package/dist/Model/Repository/ext.d.ts.map +0 -1
  262. package/dist/Model/Repository/ext.js +0 -65
  263. package/dist/Model/Repository/internal/internal.d.ts +0 -59
  264. package/dist/Model/Repository/internal/internal.d.ts.map +0 -1
  265. package/dist/Model/Repository/internal/internal.js +0 -316
  266. package/dist/Model/Repository/legacy.d.ts +0 -19
  267. package/dist/Model/Repository/legacy.d.ts.map +0 -1
  268. package/dist/Model/Repository/legacy.js +0 -2
  269. package/dist/Model/Repository/makeRepo.d.ts +0 -49
  270. package/dist/Model/Repository/makeRepo.d.ts.map +0 -1
  271. package/dist/Model/Repository/makeRepo.js +0 -24
  272. package/dist/Model/Repository/service.d.ts +0 -89
  273. package/dist/Model/Repository/service.d.ts.map +0 -1
  274. package/dist/Model/Repository/service.js +0 -2
  275. package/dist/Model/Repository/validation.d.ts +0 -42
  276. package/dist/Model/Repository/validation.d.ts.map +0 -1
  277. package/dist/Model/Repository/validation.js +0 -32
  278. package/dist/Model/Repository.d.ts +0 -6
  279. package/dist/Model/Repository.d.ts.map +0 -1
  280. package/dist/Model/Repository.js +0 -6
  281. package/dist/Model/dsl.d.ts +0 -32
  282. package/dist/Model/dsl.d.ts.map +0 -1
  283. package/dist/Model/dsl.js +0 -44
  284. package/dist/Model/filter/filterApi.d.ts +0 -30
  285. package/dist/Model/filter/filterApi.d.ts.map +0 -1
  286. package/dist/Model/filter/filterApi.js +0 -2
  287. package/dist/Model/filter/types/errors.d.ts +0 -29
  288. package/dist/Model/filter/types/errors.d.ts.map +0 -1
  289. package/dist/Model/filter/types/errors.js +0 -2
  290. package/dist/Model/filter/types/fields.d.ts +0 -15
  291. package/dist/Model/filter/types/fields.d.ts.map +0 -1
  292. package/dist/Model/filter/types/fields.js +0 -2
  293. package/dist/Model/filter/types/path/common.d.ts +0 -316
  294. package/dist/Model/filter/types/path/common.d.ts.map +0 -1
  295. package/dist/Model/filter/types/path/common.js +0 -2
  296. package/dist/Model/filter/types/path/eager.d.ts +0 -95
  297. package/dist/Model/filter/types/path/eager.d.ts.map +0 -1
  298. package/dist/Model/filter/types/path/eager.js +0 -31
  299. package/dist/Model/filter/types/path/index.d.ts +0 -4
  300. package/dist/Model/filter/types/path/index.d.ts.map +0 -1
  301. package/dist/Model/filter/types/path/index.js +0 -3
  302. package/dist/Model/filter/types/utils.d.ts +0 -79
  303. package/dist/Model/filter/types/utils.d.ts.map +0 -1
  304. package/dist/Model/filter/types/utils.js +0 -2
  305. package/dist/Model/filter/types/validator.d.ts +0 -30
  306. package/dist/Model/filter/types/validator.d.ts.map +0 -1
  307. package/dist/Model/filter/types/validator.js +0 -2
  308. package/dist/Model/filter/types.d.ts +0 -5
  309. package/dist/Model/filter/types.d.ts.map +0 -1
  310. package/dist/Model/filter/types.js +0 -7
  311. package/dist/Model/query/dsl.d.ts +0 -248
  312. package/dist/Model/query/dsl.d.ts.map +0 -1
  313. package/dist/Model/query/dsl.js +0 -104
  314. package/dist/Model/query/new-kid-interpreter.d.ts +0 -28
  315. package/dist/Model/query/new-kid-interpreter.d.ts.map +0 -1
  316. package/dist/Model/query/new-kid-interpreter.js +0 -165
  317. package/dist/Model/query.d.ts +0 -15
  318. package/dist/Model/query.d.ts.map +0 -1
  319. package/dist/Model/query.js +0 -3
  320. package/dist/Model.d.ts +0 -4
  321. package/dist/Model.d.ts.map +0 -1
  322. package/dist/Model.js +0 -4
  323. package/dist/Operations.d.ts +0 -55
  324. package/dist/Operations.d.ts.map +0 -1
  325. package/dist/Operations.js +0 -102
  326. package/dist/OperationsRepo.d.ts +0 -41
  327. package/dist/OperationsRepo.d.ts.map +0 -1
  328. package/dist/OperationsRepo.js +0 -14
  329. package/dist/QueueMaker/SQLQueue.d.ts +0 -16
  330. package/dist/QueueMaker/SQLQueue.d.ts.map +0 -1
  331. package/dist/QueueMaker/SQLQueue.js +0 -130
  332. package/dist/QueueMaker/memQueue.d.ts +0 -11
  333. package/dist/QueueMaker/memQueue.d.ts.map +0 -1
  334. package/dist/QueueMaker/memQueue.js +0 -75
  335. package/dist/QueueMaker/sbqueue.d.ts +0 -12
  336. package/dist/QueueMaker/sbqueue.d.ts.map +0 -1
  337. package/dist/QueueMaker/sbqueue.js +0 -89
  338. package/dist/QueueMaker/service.d.ts +0 -11
  339. package/dist/QueueMaker/service.d.ts.map +0 -1
  340. package/dist/QueueMaker/service.js +0 -4
  341. package/dist/RequestContext.d.ts +0 -63
  342. package/dist/RequestContext.d.ts.map +0 -1
  343. package/dist/RequestContext.js +0 -49
  344. package/dist/RequestFiberSet.d.ts +0 -36
  345. package/dist/RequestFiberSet.d.ts.map +0 -1
  346. package/dist/RequestFiberSet.js +0 -78
  347. package/dist/Store/ContextMapContainer.d.ts +0 -14
  348. package/dist/Store/ContextMapContainer.d.ts.map +0 -1
  349. package/dist/Store/ContextMapContainer.js +0 -16
  350. package/dist/Store/service.d.ts +0 -108
  351. package/dist/Store/service.d.ts.map +0 -1
  352. package/dist/Store/service.js +0 -71
  353. package/dist/Store.d.ts +0 -2
  354. package/dist/Store.d.ts.map +0 -1
  355. package/dist/Store.js +0 -2
  356. package/dist/adapters/SQL/Model.d.ts.map +0 -1
  357. package/dist/adapters/SQL/Model.js +0 -470
  358. package/dist/adapters/SQL.d.ts.map +0 -1
  359. package/dist/adapters/ServiceBus.d.ts +0 -58
  360. package/dist/adapters/ServiceBus.d.ts.map +0 -1
  361. package/dist/adapters/ServiceBus.js +0 -99
  362. package/dist/adapters/cosmos-client.d.ts.map +0 -1
  363. package/dist/adapters/cosmos-client.js +0 -9
  364. package/dist/adapters/index.d.ts +0 -2
  365. package/dist/adapters/index.d.ts.map +0 -1
  366. package/dist/adapters/index.js +0 -2
  367. package/dist/adapters/logger.d.ts +0 -9
  368. package/dist/adapters/logger.d.ts.map +0 -1
  369. package/dist/adapters/logger.js +0 -3
  370. package/dist/adapters/memQueue.d.ts +0 -13
  371. package/dist/adapters/memQueue.d.ts.map +0 -1
  372. package/dist/adapters/memQueue.js +0 -20
  373. package/dist/adapters/mongo-client.d.ts.map +0 -1
  374. package/dist/adapters/mongo-client.js +0 -13
  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.map +0 -1
  381. package/dist/api/codec.js +0 -5
  382. package/dist/api/internal/RequestContextMiddleware.d.ts +0 -5
  383. package/dist/api/internal/RequestContextMiddleware.d.ts.map +0 -1
  384. package/dist/api/internal/RequestContextMiddleware.js +0 -35
  385. package/dist/api/internal/auth.d.ts +0 -15
  386. package/dist/api/internal/auth.d.ts.map +0 -1
  387. package/dist/api/internal/auth.js +0 -47
  388. package/dist/api/internal/events.d.ts +0 -9
  389. package/dist/api/internal/events.d.ts.map +0 -1
  390. package/dist/api/internal/events.js +0 -40
  391. package/dist/api/internal/health.d.ts.map +0 -1
  392. package/dist/api/internal/health.js +0 -5
  393. package/dist/api/layerUtils.d.ts.map +0 -1
  394. package/dist/api/layerUtils.js +0 -16
  395. package/dist/api/middlewares.d.ts.map +0 -1
  396. package/dist/api/reportError.d.ts.map +0 -1
  397. package/dist/api/reportError.js +0 -27
  398. package/dist/api/routing/middleware/RouterMiddleware.d.ts.map +0 -1
  399. package/dist/api/routing/middleware/middleware.d.ts +0 -9
  400. package/dist/api/routing/middleware/middleware.d.ts.map +0 -1
  401. package/dist/api/routing/middleware/middleware.js +0 -92
  402. package/dist/api/routing/middleware.d.ts.map +0 -1
  403. package/dist/api/routing/schema/jwt.d.ts.map +0 -1
  404. package/dist/api/routing/schema/jwt.js +0 -12
  405. package/dist/api/routing/tsort.d.ts.map +0 -1
  406. package/dist/api/routing/tsort.js +0 -51
  407. package/dist/api/routing/utils.d.ts.map +0 -1
  408. package/dist/api/routing/utils.js +0 -44
  409. package/dist/api/routing.d.ts +0 -138
  410. package/dist/api/routing.d.ts.map +0 -1
  411. package/dist/api/routing.js +0 -166
  412. package/dist/api/setupRequest.d.ts +0 -12
  413. package/dist/api/setupRequest.d.ts.map +0 -1
  414. package/dist/api/setupRequest.js +0 -44
  415. package/dist/api/util.d.ts.map +0 -1
  416. package/dist/api/util.js +0 -14
  417. package/eslint.config.mjs +0 -24
  418. package/src/Emailer/service.ts +0 -52
  419. package/src/Emailer.ts +0 -1
  420. package/src/Model/Repository/ext.ts +0 -283
  421. package/src/Model/Repository/internal/internal.ts +0 -577
  422. package/src/Model/Repository/legacy.ts +0 -27
  423. package/src/Model/Repository/makeRepo.ts +0 -139
  424. package/src/Model/Repository/service.ts +0 -627
  425. package/src/Model/Repository/validation.ts +0 -31
  426. package/src/Model/Repository.ts +0 -5
  427. package/src/Model/dsl.ts +0 -128
  428. package/src/Model/filter/filterApi.ts +0 -60
  429. package/src/Model/filter/types/errors.ts +0 -47
  430. package/src/Model/filter/types/fields.ts +0 -50
  431. package/src/Model/filter/types/path/common.ts +0 -404
  432. package/src/Model/filter/types/path/eager.ts +0 -298
  433. package/src/Model/filter/types/path/index.ts +0 -4
  434. package/src/Model/filter/types/utils.ts +0 -128
  435. package/src/Model/filter/types/validator.ts +0 -46
  436. package/src/Model/filter/types.ts +0 -6
  437. package/src/Model/query/dsl.ts +0 -2110
  438. package/src/Model/query/new-kid-interpreter.ts +0 -210
  439. package/src/Model/query.ts +0 -13
  440. package/src/Model.ts +0 -3
  441. package/src/Operations.ts +0 -235
  442. package/src/OperationsRepo.ts +0 -16
  443. package/src/QueueMaker/SQLQueue.ts +0 -190
  444. package/src/QueueMaker/memQueue.ts +0 -131
  445. package/src/QueueMaker/sbqueue.ts +0 -134
  446. package/src/QueueMaker/service.ts +0 -17
  447. package/src/RequestContext.ts +0 -63
  448. package/src/RequestFiberSet.ts +0 -105
  449. package/src/Store/ContextMapContainer.ts +0 -20
  450. package/src/Store/index.test.ts.bak +0 -112
  451. package/src/Store/service.ts +0 -184
  452. package/src/Store.ts +0 -1
  453. package/src/adapters/SQL.ts +0 -1
  454. package/src/adapters/ServiceBus.ts +0 -209
  455. package/src/adapters/index.ts +0 -0
  456. package/src/adapters/logger.ts +0 -3
  457. package/src/adapters/memQueue.ts +0 -21
  458. package/src/api/internal/auth.ts +0 -68
  459. package/src/api/middlewares.ts +0 -10
  460. package/src/api/routing/middleware/middleware.ts +0 -128
  461. package/src/api/routing/middleware.ts +0 -6
  462. package/src/api/routing.ts +0 -597
  463. package/src/api/setupRequest.ts +0 -84
  464. package/tsconfig.json.bak +0 -12
  465. /package/dist/{adapters/SQL.d.ts → SQL.d.ts} +0 -0
  466. /package/dist/{api/codec.d.ts → codec.d.ts} +0 -0
  467. /package/dist/{api/internal → internal}/health.d.ts +0 -0
  468. /package/dist/{api/middlewares.d.ts → middlewares.d.ts} +0 -0
  469. /package/dist/{api/routing → routing}/tsort.d.ts +0 -0
  470. /package/dist/{api/util.d.ts → util.d.ts} +0 -0
  471. /package/src/{api/codec.ts → codec.ts} +0 -0
  472. /package/src/{api/internal → internal}/health.ts +0 -0
  473. /package/src/{api/routing → routing}/tsort.ts +0 -0
  474. /package/src/{api/util.ts → util.ts} +0 -0
@@ -1,210 +0,0 @@
1
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
- /* eslint-disable @typescript-eslint/no-unsafe-assignment */
3
- import { Array, identity, Match, Option, pipe, S } from "effect-app"
4
- import { toNonEmptyArray } from "effect-app/Array"
5
- import { dropUndefinedT } from "effect-app/utils"
6
- import type { FilterResult } from "../filter/filterApi.js"
7
- import type { FieldValues } from "../filter/types.js"
8
- import type { FieldPath } from "../filter/types/path/eager.js"
9
- import { make, type Q, type QAll } from "../query/dsl.js"
10
-
11
- type Result<TFieldValues extends FieldValues, A = TFieldValues, R = never> = {
12
- filter: FilterResult[]
13
- schema: S.Codec<A, TFieldValues, R> | undefined
14
- limit: number | undefined
15
- skip: number | undefined
16
- order: { key: FieldPath<TFieldValues>; direction: "ASC" | "DESC" }[]
17
- ttype: "one" | "many" | "count" | undefined
18
- mode: "collect" | "project" | "transform" | undefined
19
- }
20
-
21
- const interpret = <
22
- TFieldValues extends FieldValues,
23
- TFieldValuesRefined extends TFieldValues = TFieldValues,
24
- A = TFieldValues,
25
- R = never
26
- >(_: QAll<TFieldValues, TFieldValuesRefined, A, R>) => {
27
- const a = _ as Q<TFieldValues>
28
-
29
- const data: Result<TFieldValues, any, any> = {
30
- filter: [],
31
- schema: undefined,
32
- limit: undefined,
33
- skip: undefined,
34
- order: [],
35
- ttype: undefined,
36
- mode: undefined
37
- }
38
-
39
- const upd = (
40
- v: Result<TFieldValues, any, any>
41
- ) => {
42
- data.filter.push(...v.filter)
43
- data.order.push(...v.order)
44
- if (v.limit !== undefined) data.limit = v.limit
45
- if (v.skip !== undefined) data.skip = v.skip
46
- if (v.ttype !== undefined) data.ttype = v.ttype
47
- if (v.schema !== undefined) data.schema = v.schema
48
- if (v.mode !== undefined) data.mode = v.mode
49
- }
50
-
51
- const applyPath = (path: string) => (_: FilterResult): FilterResult =>
52
- _.t === "where" || _.t === "and" || _.t === "or"
53
- ? { ..._, path: `${path}.-1.${_.path}` }
54
- : { ..._, result: _.result.map(applyPath(path)) }
55
-
56
- pipe(
57
- a,
58
- Match.valueTags({
59
- value: () => {
60
- // data.filter.push(value)
61
- },
62
- where: ({ current, operation, relation, subPath }) => {
63
- upd(interpret(current))
64
- if (typeof operation === "function") {
65
- data.filter.push(
66
- {
67
- t: "where-scope",
68
- result: interpret(operation(make())).filter.map(subPath ? applyPath(subPath) : identity),
69
- relation
70
- }
71
- )
72
- } else {
73
- data.filter.push(
74
- {
75
- t: "where",
76
- path: operation[0],
77
- op: operation.length === 2 ? "eq" : operation[1],
78
- value: operation.length === 2 ? operation[1] : operation[2]
79
- }
80
- )
81
- }
82
- },
83
- and: ({ current, operation, relation }) => {
84
- upd(interpret(current))
85
- if (typeof operation === "function") {
86
- data.filter.push(
87
- { t: "and-scope", result: interpret(operation(make())).filter, relation }
88
- )
89
- } else {
90
- data.filter.push(
91
- {
92
- t: "and",
93
- path: operation[0],
94
- op: operation.length === 2 ? "eq" : operation[1],
95
- value: operation.length === 2 ? operation[1] : operation[2]
96
- }
97
- )
98
- }
99
- },
100
- or: ({ current, operation, relation }) => {
101
- upd(interpret(current))
102
- if (typeof operation === "function") {
103
- data.filter.push(
104
- { t: "or-scope", result: interpret(operation(make())).filter, relation }
105
- )
106
- } else {
107
- data.filter.push(
108
- {
109
- t: "or",
110
- path: operation[0],
111
- op: operation.length === 2 ? "eq" : operation[1],
112
- value: operation.length === 2 ? operation[1] : operation[2]
113
- }
114
- )
115
- }
116
- },
117
- one: ({ current }) => {
118
- upd(interpret(current))
119
- data.limit = 1
120
- data.ttype = "one"
121
- },
122
- count: ({ current }) => {
123
- upd(interpret(current))
124
- data.ttype = "count"
125
- data.schema = S.Struct({ id: S.String }) as any
126
- },
127
- order: ({ current, direction, field }) => {
128
- upd(interpret(current))
129
- data.order.push({ key: field, direction })
130
- },
131
- page: (v) => {
132
- upd(interpret(v.current))
133
- data.limit = v.take
134
- data.skip = v.skip
135
- },
136
- project: (v) => {
137
- upd(interpret(v.current))
138
- data.schema = v.schema
139
- data.mode = v.mode
140
- }
141
- })
142
- )
143
-
144
- return data
145
- }
146
-
147
- const walkTransformation = (t: S.AST.AST): S.AST.AST => {
148
- if (S.AST.isDeclaration(t) && t.typeParameters.length > 0) {
149
- return walkTransformation(t.typeParameters[0]!)
150
- }
151
- return t
152
- }
153
-
154
- export const toFilter = <
155
- TFieldValues extends FieldValues,
156
- A,
157
- R,
158
- TFieldValuesRefined extends TFieldValues = TFieldValues
159
- >(
160
- q: QAll<TFieldValues, TFieldValuesRefined, A, R>
161
- ) => {
162
- // TODO: Native interpreter for each db adapter, instead of the intermediate "new-kid" format
163
- const a = interpret(q)
164
- const schema = a.schema
165
- let select: (keyof TFieldValues | { key: string; subKeys: string[] })[] = []
166
- // TODO: support more complex (nested) schemas?
167
- if (schema) {
168
- const t = walkTransformation(schema.ast)
169
- if (S.AST.isObjects(t)) {
170
- select = t.propertySignatures.map((_) => _.name as string)
171
- for (const prop of t.propertySignatures) {
172
- if (S.AST.isArrays(prop.type)) {
173
- // make sure we only select when there are actually type literals in the tuple...
174
- // otherwise we might be dealing with strings etc.
175
- // TODO; be more strict, can't support arrays with unions that have non TypeLiteral members etc..
176
- const arraySelect = {
177
- key: prop.name as string,
178
- subKeys: Array.flatMap(
179
- prop.type.rest,
180
- (x) => {
181
- const t = walkTransformation(x)
182
- return S.AST.isObjects(t) ? t.propertySignatures.map((y) => y.name as string) : []
183
- }
184
- )
185
- }
186
- if (arraySelect.subKeys.length > 0) {
187
- select.push(arraySelect)
188
- // make sure we don't double select?
189
- if (select.includes(prop.name as string)) {
190
- select.splice(select.indexOf(prop.name as string), 1)
191
- }
192
- }
193
- }
194
- }
195
- }
196
- }
197
- return dropUndefinedT({
198
- t: null as unknown as TFieldValues,
199
- limit: a.limit,
200
- skip: a.skip,
201
- select: Option.getOrUndefined(toNonEmptyArray(select)),
202
- schema,
203
- order: Option.getOrUndefined(toNonEmptyArray(a.order)),
204
- ttype: a.ttype,
205
- mode: a.mode ?? "transform",
206
- filter: a.filter.length
207
- ? a.filter
208
- : undefined
209
- })
210
- }
@@ -1,13 +0,0 @@
1
- export * from "./query/dsl.js"
2
- export * from "./query/new-kid-interpreter.js"
3
-
4
- export interface RawQuery<Encoded, Out> {
5
- cosmos: (vals: { name: string }) => {
6
- query: string
7
- parameters: {
8
- name: string
9
- value: any
10
- }[]
11
- }
12
- memory: (t: readonly Encoded[]) => readonly Out[]
13
- }
package/src/Model.ts DELETED
@@ -1,3 +0,0 @@
1
- export * from "./Model/dsl.js"
2
- export * as Q from "./Model/query.js"
3
- export { makeRepo } from "./Model/Repository.js"
package/src/Operations.ts DELETED
@@ -1,235 +0,0 @@
1
- import { reportError } from "@effect-app/infra/errorReporter"
2
- import { subHours } from "date-fns"
3
- import { Cause, copy, Duration, Effect, Exit, type Fiber, Layer, Option, S, Schedule, ServiceMap } from "effect-app"
4
- import { annotateLogscoped } from "effect-app/Effect"
5
- import { dual, pipe } from "effect-app/Function"
6
- import { Operation, OperationFailure, OperationId, type OperationProgress, OperationSuccess } from "effect-app/Operations"
7
- import { NonEmptyString2k } from "effect-app/Schema"
8
- import * as Scope from "effect/Scope"
9
- import { setupRequestContextFromCurrent } from "./api/setupRequest.js"
10
- import { MainFiberSet } from "./MainFiberSet.js"
11
- import { where } from "./Model/query.js"
12
- import { OperationsRepo } from "./OperationsRepo.js"
13
- import { batch } from "./rateLimit.js"
14
- import { RequestFiberSet } from "./RequestFiberSet.js"
15
-
16
- const reportAppError = reportError("Operations.Cleanup")
17
-
18
- const make = Effect.gen(function*() {
19
- const repo = yield* OperationsRepo
20
- const reqFiberSet = yield* RequestFiberSet
21
- const makeOp = Effect.sync(() => OperationId.make())
22
-
23
- const register = (title: NonEmptyString2k) =>
24
- Effect.tap(
25
- makeOp,
26
- (id) =>
27
- Effect.andThen(
28
- annotateLogscoped("operationId", id),
29
- Effect.acquireRelease(addOp(id, title), (_, exit) => finishOp(id, exit))
30
- )
31
- )
32
-
33
- const cleanup = Effect.sync(() => subHours(new Date(), 1)).pipe(
34
- Effect.andThen((before) => repo.query(where("updatedAt", "lt", before.toISOString()))),
35
- Effect.andThen((ops) => pipe(ops, batch(100, Effect.succeed, (items) => repo.removeAndPublish(items)))),
36
- setupRequestContextFromCurrent("Operations.cleanup")
37
- )
38
-
39
- function addOp(id: OperationId, title: NonEmptyString2k) {
40
- return repo.save(new Operation({ id, title })).pipe(Effect.orDie)
41
- }
42
- function findOp(id: OperationId) {
43
- return repo.find(id)
44
- }
45
- function finishOp(id: OperationId, exit: Exit.Exit<unknown, unknown>) {
46
- return Effect
47
- .flatMap(repo.get(id).pipe(Effect.orDie), (_) =>
48
- repo
49
- .save(
50
- copy(_, {
51
- updatedAt: new Date(),
52
- result: Exit.isSuccess(exit)
53
- ? new OperationSuccess()
54
- : new OperationFailure({
55
- message: Cause.hasInterruptsOnly(exit.cause)
56
- ? NonEmptyString2k("Interrupted")
57
- : Cause.hasDies(exit.cause)
58
- ? NonEmptyString2k("Unknown error")
59
- : Cause
60
- .findErrorOption(exit.cause)
61
- .pipe(
62
- Option.flatMap((_) =>
63
- typeof _ === "object" && _ !== null && "message" in _ && S.is(NonEmptyString2k)(_.message)
64
- ? Option.some(_.message)
65
- : Option.none()
66
- ),
67
- Option.getOrNull
68
- )
69
- })
70
- })
71
- )
72
- .pipe(Effect.orDie))
73
- }
74
- function update(id: OperationId, progress: OperationProgress) {
75
- return Effect.flatMap(
76
- repo.get(id).pipe(Effect.orDie),
77
- (_) => repo.save(copy(_, { updatedAt: new Date(), progress })).pipe(Effect.orDie)
78
- )
79
- }
80
-
81
- function fork<R, R2, E, E2, A, A2>(
82
- self: (id: OperationId) => Effect.Effect<A, E, R>,
83
- fnc: (id: OperationId) => Effect.Effect<A2, E2, R2>,
84
- title: NonEmptyString2k
85
- ): Effect.Effect<
86
- RunningOperation<A, E>,
87
- never,
88
- Exclude<R, Scope.Scope> | Exclude<R2, Scope.Scope>
89
- > {
90
- return Effect
91
- .flatMap(
92
- Scope.make(),
93
- (scope) =>
94
- register(title)
95
- .pipe(
96
- Scope.provide(scope),
97
- Effect.flatMap((id) =>
98
- reqFiberSet
99
- .forkDaemonReportUnexpected(Scope.use(
100
- self(id).pipe(Effect.withSpan(title, {}, { captureStackTrace: false })),
101
- scope
102
- ))
103
- .pipe(Effect.map((fiber): RunningOperation<A, E> => ({ fiber, id })))
104
- ),
105
- Effect.tap(({ id }) =>
106
- Effect.interruptible(fnc(id)).pipe(
107
- Effect.forkScoped,
108
- Scope.provide(scope)
109
- )
110
- )
111
- )
112
- )
113
- }
114
-
115
- const fork2: {
116
- (title: NonEmptyString2k): <R, E, A>(
117
- self: (opId: OperationId) => Effect.Effect<A, E, R>
118
- ) => Effect.Effect<RunningOperation<A, E>, never, Exclude<R, Scope.Scope>>
119
- <R, E, A>(
120
- self: (opId: OperationId) => Effect.Effect<A, E, R>,
121
- title: NonEmptyString2k
122
- ): Effect.Effect<RunningOperation<A, E>, never, Exclude<R, Scope.Scope>>
123
- } = dual(
124
- 2,
125
- <R, E, A>(self: (opId: OperationId) => Effect.Effect<A, E, R>, title: NonEmptyString2k) =>
126
- Effect.flatMap(
127
- Scope.make(),
128
- (scope) =>
129
- register(title)
130
- .pipe(
131
- Scope.provide(scope),
132
- Effect
133
- .flatMap((id) =>
134
- reqFiberSet
135
- .forkDaemonReportUnexpected(Scope.use(
136
- self(id).pipe(Effect.withSpan(title, {}, { captureStackTrace: false })),
137
- scope
138
- ))
139
- .pipe(Effect.map((fiber): RunningOperation<A, E> => ({ fiber, id })))
140
- )
141
- )
142
- )
143
- )
144
-
145
- const forkOperation: {
146
- (title: NonEmptyString2k): <R, E, A>(
147
- self: Effect.Effect<A, E, R>
148
- ) => Effect.Effect<RunningOperation<A, E>, never, Exclude<R, Scope.Scope>>
149
- <R, E, A>(
150
- self: Effect.Effect<A, E, R>,
151
- title: NonEmptyString2k
152
- ): Effect.Effect<RunningOperation<A, E>, never, Exclude<R, Scope.Scope>>
153
- } = dual(
154
- 2,
155
- <R, E, A>(self: Effect.Effect<A, E, R>, title: NonEmptyString2k) =>
156
- Effect.flatMap(
157
- Scope.make(),
158
- (scope) =>
159
- register(title)
160
- .pipe(
161
- Scope.provide(scope),
162
- Effect
163
- .flatMap((id) =>
164
- reqFiberSet
165
- .forkDaemonReportUnexpected(Scope.use(
166
- self.pipe(Effect.withSpan(title, {}, { captureStackTrace: false })),
167
- scope
168
- ))
169
- .pipe(Effect.map((fiber): RunningOperation<A, E> => ({ fiber, id })))
170
- )
171
- )
172
- )
173
- )
174
-
175
- function forkOperationFunction<R, E, A, Inp>(fnc: (inp: Inp) => Effect.Effect<A, E, R>, title: NonEmptyString2k) {
176
- return (inp: Inp) => fnc(inp).pipe((_) => forkOperation(_, title))
177
- }
178
-
179
- return {
180
- cleanup,
181
- register,
182
- fork,
183
- fork2,
184
- forkOperation,
185
- forkOperationFunction,
186
- all: repo.all,
187
- find: findOp,
188
- update
189
- }
190
- })
191
-
192
- export class Operations extends ServiceMap.Opaque<Operations>()("effect-app/Operations", { make }) {
193
- private static readonly CleanupLive = this
194
- .use((_) =>
195
- _.cleanup.pipe(
196
- Effect.exit,
197
- Effect
198
- .flatMap((_) => {
199
- if (Exit.isSuccess(_)) {
200
- return Effect.void
201
- } else {
202
- return reportAppError(_.cause)
203
- }
204
- }),
205
- Effect.schedule(Schedule.fixed(Duration.minutes(20))),
206
- Effect.map((_) => _ as never),
207
- MainFiberSet.run
208
- )
209
- )
210
- .pipe(Layer.effectDiscard, Layer.provide(MainFiberSet.Live))
211
-
212
- static readonly Live = this.CleanupLive.pipe(
213
- Layer.provideMerge(this.toLayer(this.make)),
214
- Layer.provide(RequestFiberSet.Live)
215
- )
216
-
217
- static readonly forkOperation = (title: NonEmptyString2k) => <R, E, A>(self: Effect.Effect<A, E, R>) =>
218
- this.use((_) => _.forkOperation(self, title))
219
- static readonly forkOperationFunction =
220
- <R, E, A, Inp>(fnc: (inp: Inp) => Effect.Effect<A, E, R>, title: NonEmptyString2k) => (inp: Inp) =>
221
- this.use((_) => _.forkOperationFunction(fnc, title)(inp))
222
- static readonly fork = <R, R2, E, E2, A, A2>(
223
- self: (id: OperationId) => Effect.Effect<A, E, R>,
224
- fnc: (id: OperationId) => Effect.Effect<A2, E2, R2>,
225
- title: NonEmptyString2k
226
- ) => this.use((_) => _.fork(self, fnc, title))
227
-
228
- static readonly fork2 = (title: NonEmptyString2k) => <R, E, A>(self: (opId: OperationId) => Effect.Effect<A, E, R>) =>
229
- this.use((_) => _.fork2(self, title))
230
- }
231
-
232
- export interface RunningOperation<A, E> {
233
- id: OperationId
234
- fiber: Fiber.Fiber<A, E>
235
- }
@@ -1,16 +0,0 @@
1
- import { Effect, ServiceMap } from "effect-app"
2
- import { Operation } from "effect-app/Operations"
3
- import { makeRepo } from "./Model.js"
4
-
5
- export class OperationsRepo extends ServiceMap.Service<OperationsRepo>()(
6
- "OperationRepo",
7
- {
8
- make: Effect.gen(function*() {
9
- return yield* makeRepo("Operation", Operation, {
10
- config: {
11
- allowNamespace: () => true
12
- }
13
- })
14
- })
15
- }
16
- ) {}
@@ -1,190 +0,0 @@
1
- import { getRequestContext, setupRequestContextWithCustomSpan } from "@effect-app/infra/api/setupRequest"
2
- import { reportNonInterruptedFailure } from "@effect-app/infra/QueueMaker/errors"
3
- import { type QueueBase, QueueMeta } from "@effect-app/infra/QueueMaker/service"
4
- import { SqlClient } from "effect/unstable/sql"
5
- import { subMinutes } from "date-fns"
6
- import { Effect, Fiber, Option, S, Tracer } from "effect-app"
7
- import type { NonEmptyString255 } from "effect-app/Schema"
8
- import { pretty } from "effect-app/utils"
9
- import type { NonEmptyReadonlyArray } from "effect-app"
10
- import { SQLModel } from "../adapters/SQL.js"
11
- import { InfraLogger } from "../logger.js"
12
-
13
- export const QueueId = S.Number.pipe(S.brand("QueueId"))
14
- export type QueueId = typeof QueueId.Type
15
-
16
- // TODO: let the model track and Auto Generate versionColumn on every update instead
17
- export function makeSQLQueue<
18
- Evt extends { id: S.StringId; _tag: string },
19
- DrainEvt extends { id: S.StringId; _tag: string },
20
- EvtE,
21
- DrainEvtE
22
- >(
23
- queueName: NonEmptyString255,
24
- queueDrainName: NonEmptyString255,
25
- schema: S.Codec<Evt, EvtE>,
26
- drainSchema: S.Codec<DrainEvt, DrainEvtE>
27
- ) {
28
- return Effect.gen(function*() {
29
- const base = {
30
- id: SQLModel.Generated(QueueId),
31
- meta: SQLModel.JsonFromString(QueueMeta),
32
- name: S.NonEmptyString255,
33
- createdAt: SQLModel.DateTimeInsert,
34
- updatedAt: SQLModel.DateTimeUpdate,
35
- // TODO: at+owner
36
- processingAt: SQLModel.FieldOption(S.Date),
37
- finishedAt: SQLModel.FieldOption(S.Date),
38
- etag: S.String // TODO: use a SQLModel thing that auto updates it?
39
- // TODO: record locking.. / optimistic locking
40
- // rowVersion: SQLModel.DateTimeFromNumberWithNow
41
- }
42
- class Queue extends SQLModel.Class<Queue>("Queue")({
43
- body: SQLModel.JsonFromString(schema),
44
- ...base
45
- }) {}
46
- class Drain extends SQLModel.Class<Drain>("Drain")({
47
- body: SQLModel.JsonFromString(drainSchema),
48
- ...base
49
- }) {}
50
- const sql = yield* SqlClient.SqlClient
51
-
52
- const queueRepo = yield* SQLModel.makeRepository(Queue, {
53
- tableName: "queue",
54
- spanPrefix: "QueueRepo",
55
- idColumn: "id",
56
- versionColumn: "etag"
57
- })
58
-
59
- const drainRepo = yield* SQLModel.makeRepository(Drain, {
60
- tableName: "queue",
61
- spanPrefix: "DrainRepo",
62
- idColumn: "id",
63
- versionColumn: "etag"
64
- })
65
-
66
- const decodeDrain = S.decodeEffect(Drain)
67
-
68
- const drain = Effect
69
- .sync(() => subMinutes(new Date(), 15))
70
- .pipe(
71
- Effect
72
- .andThen((limit) =>
73
- sql<typeof Drain.Encoded>`SELECT *
74
- FROM queue
75
- WHERE name = ${queueDrainName} AND finishedAt IS NULL AND (processingAt IS NULL OR processingAt < ${limit.getTime()})
76
- LIMIT 1`
77
- )
78
- )
79
-
80
- const q = {
81
- offer: Effect.fnUntraced(function*(body: Evt, meta: typeof QueueMeta.Type) {
82
- yield* queueRepo.insertVoid({
83
- body,
84
- meta,
85
- name: queueName,
86
- processingAt: Option.none(),
87
- finishedAt: Option.none(),
88
- etag: crypto.randomUUID()
89
- })
90
- }),
91
- take: Effect.gen(function*() {
92
- while (true) {
93
- const [first] = yield* drain.pipe(Effect.withTracerEnabled(false)) // disable sql tracer otherwise we spam it..
94
- if (first) {
95
- const dec = yield* decodeDrain(first)
96
- const { createdAt, updatedAt, ...rest } = dec
97
- return yield* drainRepo.update(
98
- { ...rest, processingAt: Option.some(new Date()) } // auto in lib , etag: crypto.randomUUID()
99
- )
100
- }
101
- if (first) return first
102
- yield* Effect.sleep(250)
103
- }
104
- }),
105
- finish: ({ createdAt, updatedAt, ...q }: Drain) =>
106
- drainRepo.updateVoid({ ...q, finishedAt: Option.some(new Date()) }) // auto in lib , etag: crypto.randomUUID()
107
- }
108
- const queue = {
109
- publish: (...messages: NonEmptyReadonlyArray<Evt>) =>
110
- getRequestContext
111
- .pipe(
112
- Effect.flatMap((requestContext) =>
113
- Effect
114
- .forEach(
115
- messages,
116
- (m) => q.offer(m, requestContext),
117
- {
118
- discard: true
119
- }
120
- )
121
- ),
122
- Effect.withSpan("queue.publish: " + queueName, {
123
- kind: "producer",
124
- attributes: { "message_tags": messages.map((_) => _._tag) }
125
- }, { captureStackTrace: false })
126
- ),
127
- drain: <DrainE, DrainR>(
128
- handleEvent: (ks: DrainEvt) => Effect.Effect<void, DrainE, DrainR>,
129
- sessionId?: string
130
- ) => {
131
- const silenceAndReportError = reportNonInterruptedFailure({ name: "MemQueue.drain." + queueDrainName })
132
- const processMessage = (msg: Drain) =>
133
- Effect
134
- .succeed(msg)
135
- .pipe(Effect
136
- .flatMap(({ body, meta }) => {
137
- let effect = InfraLogger
138
- .logDebug(`[${queueDrainName}] Processing incoming message`)
139
- .pipe(
140
- Effect.annotateLogs({ body: pretty(body), meta: pretty(meta) }),
141
- Effect.andThen(handleEvent(body)),
142
- silenceAndReportError,
143
- (_) =>
144
- setupRequestContextWithCustomSpan(
145
- _,
146
- meta,
147
- `queue.drain: ${queueDrainName}.${body._tag}`,
148
- {
149
- captureStackTrace: false,
150
- kind: "consumer",
151
- attributes: {
152
- "queue.name": queueDrainName,
153
- "queue.sessionId": sessionId,
154
- "queue.input": body
155
- }
156
- }
157
- )
158
- )
159
- if (meta.span) {
160
- effect = Effect.withParentSpan(effect, Tracer.externalSpan(meta.span))
161
- }
162
- return effect
163
- }))
164
-
165
- return q
166
- .take
167
- .pipe(
168
- Effect.flatMap((x) =>
169
- processMessage(x).pipe(
170
- Effect.uninterruptible,
171
- Effect.forkChild,
172
- Effect.flatMap(Fiber.join),
173
- Effect.tap(q.finish(x))
174
- )
175
- ),
176
- silenceAndReportError,
177
- Effect.withSpan(`queue.drain: ${queueDrainName}`, {
178
- attributes: {
179
- "queue.type": "sql",
180
- "queue.name": queueDrainName,
181
- "queue.sessionId": sessionId
182
- }
183
- }),
184
- Effect.forever
185
- )
186
- }
187
- }
188
- return queue as QueueBase<Evt, DrainEvt>
189
- })
190
- }