@effect-app/infra 4.0.0-beta.99 → 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 +2884 -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 -511
  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
@@ -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, Context, copy, Duration, Effect, Exit, type Fiber, Layer, Option, S, Schedule } 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 Context.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 { Context, Effect } from "effect-app"
2
- import { Operation } from "effect-app/Operations"
3
- import { makeRepo } from "./Model.js"
4
-
5
- export class OperationsRepo extends Context.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 { subMinutes } from "date-fns"
5
- import { Effect, Fiber, type NonEmptyReadonlyArray, Option, S, Tracer } from "effect-app"
6
- import { type NonEmptyString255 } from "effect-app/Schema"
7
- import { pretty } from "effect-app/utils"
8
- import { SqlClient } from "effect/unstable/sql"
9
- import { SQLModel } from "../adapters/SQL.js"
10
- import { InfraLogger } from "../logger.js"
11
-
12
- export const QueueId = S.Finite.pipe(S.brand("QueueId"))
13
- export type QueueId = typeof QueueId.Type
14
-
15
- // TODO: let the model track and Auto Generate versionColumn on every update instead
16
- export function makeSQLQueue<
17
- Evt extends { id: S.StringId; _tag: string },
18
- DrainEvt extends { id: S.StringId; _tag: string },
19
- EvtE,
20
- DrainEvtE
21
- >(
22
- queueName: NonEmptyString255,
23
- queueDrainName: NonEmptyString255,
24
- schema: S.Codec<Evt, EvtE>,
25
- drainSchema: S.Codec<DrainEvt, DrainEvtE>
26
- ) {
27
- return Effect.gen(function*() {
28
- const base = {
29
- id: SQLModel.Generated(QueueId),
30
- meta: SQLModel.JsonFromString(QueueMeta),
31
- name: S.NonEmptyString255,
32
- createdAt: SQLModel.DateTimeInsert,
33
- updatedAt: SQLModel.DateTimeUpdate,
34
- // TODO: at+owner
35
- processingAt: SQLModel.FieldOption(S.Date),
36
- finishedAt: SQLModel.FieldOption(S.Date),
37
- etag: S.String // TODO: use a SQLModel thing that auto updates it?
38
- // TODO: record locking.. / optimistic locking
39
- // rowVersion: SQLModel.DateTimeFromNumberWithNow
40
- }
41
- class Queue extends SQLModel.Class<Queue>("Queue")({
42
- body: SQLModel.JsonFromString(schema),
43
- ...base
44
- }) {}
45
- class Drain extends SQLModel.Class<Drain>("Drain")({
46
- body: SQLModel.JsonFromString(drainSchema),
47
- ...base
48
- }) {}
49
- const sql = yield* SqlClient.SqlClient
50
-
51
- const queueRepo = yield* SQLModel.makeRepository(Queue, {
52
- tableName: "queue",
53
- spanPrefix: "QueueRepo",
54
- idColumn: "id",
55
- versionColumn: "etag"
56
- })
57
-
58
- const drainRepo = yield* SQLModel.makeRepository(Drain, {
59
- tableName: "queue",
60
- spanPrefix: "DrainRepo",
61
- idColumn: "id",
62
- versionColumn: "etag"
63
- })
64
-
65
- const decodeDrain = S.decodeEffect(Drain)
66
-
67
- const drain = Effect
68
- .sync(() => subMinutes(new Date(), 15))
69
- .pipe(
70
- Effect
71
- .andThen((limit) =>
72
- sql<typeof Drain.Encoded>`SELECT *
73
- FROM queue
74
- WHERE name = ${queueDrainName} AND finishedAt IS NULL AND (processingAt IS NULL OR processingAt < ${limit.getTime()})
75
- LIMIT 1`
76
- )
77
- )
78
-
79
- const q = {
80
- offer: Effect.fnUntraced(function*(body: Evt, meta: typeof QueueMeta.Type) {
81
- yield* queueRepo.insertVoid(Queue.insert.make({
82
- body,
83
- meta,
84
- name: queueName,
85
- processingAt: Option.none(),
86
- finishedAt: Option.none(),
87
- etag: crypto.randomUUID()
88
- }))
89
- }),
90
- take: Effect.gen(function*() {
91
- while (true) {
92
- const [first] = yield* drain.pipe(Effect.withTracerEnabled(false)) // disable sql tracer otherwise we spam it..
93
- if (first) {
94
- const dec = yield* decodeDrain(first)
95
- const { createdAt, updatedAt, ...rest } = dec
96
- return yield* drainRepo.update(
97
- Drain.update.make({ ...rest, processingAt: Option.some(new Date()) }) // auto in lib , etag: crypto.randomUUID()
98
- )
99
- }
100
- if (first) return first
101
- yield* Effect.sleep(250)
102
- }
103
- }),
104
- finish: Effect.fn(function*({ createdAt, updatedAt, ...q }: Drain) {
105
- return yield* drainRepo.updateVoid(Drain.update.make({ ...q, finishedAt: Option.some(new Date()) })) // auto in lib , etag: crypto.randomUUID()
106
- })
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
- }