@effect-app/infra 4.0.0-beta.99 → 4.0.1

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 +2901 -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 +240 -44
  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 -320
  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 +347 -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 +230 -155
  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 +308 -14
  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 +370 -99
  53. package/dist/Store/codeFilter.d.ts +5 -5
  54. package/dist/Store/codeFilter.d.ts.map +1 -1
  55. package/dist/Store/codeFilter.js +72 -23
  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 +257 -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 +277 -57
  169. package/src/Store/Cosmos.ts +597 -512
  170. package/src/Store/Disk.ts +145 -71
  171. package/src/Store/Memory.ts +419 -115
  172. package/src/Store/SQL/Pg.ts +352 -269
  173. package/src/Store/SQL/query.ts +368 -22
  174. package/src/Store/SQL.ts +742 -294
  175. package/src/Store/codeFilter.ts +79 -29
  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 +70 -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 +827 -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,130 +0,0 @@
1
- import { Cause, Tracer } from "effect"
2
- import { Effect, Fiber, flow, type NonEmptyReadonlyArray, S } from "effect-app"
3
- import { pretty } from "effect-app/utils"
4
- import * as Q from "effect/Queue"
5
- import { MemQueue } from "../adapters/memQueue.js"
6
- import { getRequestContext, setupRequestContextWithCustomSpan } from "../api/setupRequest.js"
7
- import { InfraLogger } from "../logger.js"
8
- import { reportNonInterruptedFailure, reportNonInterruptedFailureCause } from "./errors.js"
9
- import { type QueueBase, QueueMeta } from "./service.js"
10
-
11
- export function makeMemQueue<
12
- Evt extends { id: S.StringId; _tag: string },
13
- DrainEvt extends { id: S.StringId; _tag: string },
14
- EvtE,
15
- DrainEvtE
16
- >(
17
- queueName: string,
18
- queueDrainName: string,
19
- schema: S.Codec<Evt, EvtE>,
20
- drainSchema: S.Codec<DrainEvt, DrainEvtE>
21
- ) {
22
- return Effect.gen(function*() {
23
- const mem = yield* MemQueue
24
- const q = yield* mem.getOrCreateQueue(queueName)
25
- const qDrain = yield* mem.getOrCreateQueue(queueDrainName)
26
-
27
- const wireSchema = S.Struct({ body: schema, meta: QueueMeta })
28
- const wireSchemaJson = S.fromJsonString(S.toCodecJson(wireSchema))
29
- const encodePublish = S.encodeEffect(wireSchemaJson)
30
- const drainW = S.Struct({ body: drainSchema, meta: QueueMeta })
31
- const drainWJson = S.fromJsonString(S.toCodecJson(drainW))
32
-
33
- const parseDrain = flow(S.decodeUnknownEffect(drainWJson), Effect.orDie)
34
-
35
- const queue = {
36
- publish: (...messages: NonEmptyReadonlyArray<Evt>) =>
37
- getRequestContext
38
- .pipe(
39
- Effect.flatMap((requestContext) =>
40
- Effect
41
- .forEach(messages, (m) =>
42
- // we JSON encode, because that is what the wire also does, and it reveals holes in e.g unknown encoders (Date->String)
43
- encodePublish({ body: m, meta: requestContext }).pipe(
44
- Effect.orDie,
45
- // .tap((msg) => info("Publishing Mem Message: " + utils.inspect(msg)))
46
- Effect.flatMap((_) => Q.offer(q, _))
47
- ), { discard: true })
48
- ),
49
- Effect.withSpan("queue.publish: " + queueName, {
50
- kind: "producer",
51
- attributes: { "message_tags": messages.map((_) => _._tag) }
52
- }, { captureStackTrace: false })
53
- ),
54
- drain: <DrainE, DrainR>(
55
- handleEvent: (ks: DrainEvt) => Effect.Effect<void, DrainE, DrainR>,
56
- sessionId?: string
57
- ) => {
58
- const silenceAndReportError = reportNonInterruptedFailure({ name: "MemQueue.drain." + queueDrainName })
59
- const reportError = reportNonInterruptedFailureCause({ name: "MemQueue.drain." + queueDrainName })
60
- const processMessage = (msg: string) =>
61
- // we JSON parse, because that is what the wire also does, and it reveals holes in e.g unknown encoders (Date->String)
62
- parseDrain(msg).pipe(
63
- Effect.orDie,
64
- Effect
65
- .flatMap(({ body, meta }) => {
66
- let effect = InfraLogger
67
- .logDebug(`[${queueDrainName}] Processing incoming message`)
68
- .pipe(
69
- Effect.annotateLogs({ body: pretty(body), meta: pretty(meta) }),
70
- Effect.andThen(handleEvent(body)),
71
- silenceAndReportError,
72
- (_) =>
73
- setupRequestContextWithCustomSpan(
74
- _,
75
- meta,
76
- `queue.drain: ${queueDrainName}.${body._tag}`,
77
- {
78
- captureStackTrace: false,
79
- kind: "consumer",
80
- attributes: {
81
- "queue.name": queueDrainName,
82
- "queue.sessionId": sessionId,
83
- "queue.input": body
84
- }
85
- }
86
- )
87
- )
88
- if (meta.span) {
89
- effect = Effect.withParentSpan(effect, Tracer.externalSpan(meta.span))
90
- }
91
- return effect
92
- })
93
- )
94
- return Q
95
- .take(qDrain)
96
- .pipe(
97
- Effect
98
- .flatMap((x) =>
99
- processMessage(x).pipe(
100
- Effect.uninterruptible,
101
- Effect.forkChild,
102
- Effect.flatMap(Fiber.join),
103
- // normally a failed item would be returned to the queue and retried up to X times.
104
- Effect.flatMap((_) =>
105
- _._tag === "Failure" && !Cause.hasInterruptsOnly(_.cause)
106
- ? Q.offer(qDrain, x).pipe(
107
- // TODO: retry count tracking and max retries.
108
- Effect.delay("5 seconds"),
109
- Effect.tapCause(reportError),
110
- Effect.forkDetach
111
- )
112
- : Effect.void
113
- )
114
- )
115
- ),
116
- silenceAndReportError,
117
- Effect.withSpan(`queue.drain: ${queueDrainName}`, {
118
- attributes: {
119
- "queue.type": "mem",
120
- "queue.name": queueDrainName,
121
- "queue.sessionId": sessionId
122
- }
123
- }),
124
- Effect.forever
125
- )
126
- }
127
- }
128
- return queue as QueueBase<Evt, DrainEvt>
129
- })
130
- }
@@ -1,137 +0,0 @@
1
- import { Tracer } from "effect"
2
- import { Cause, Effect, flow, type NonEmptyReadonlyArray, S } from "effect-app"
3
- import type { StringId } from "effect-app/Schema"
4
- import { pretty } from "effect-app/utils"
5
- import { Receiver, Sender } from "../adapters/ServiceBus.js"
6
- import { getRequestContext, setupRequestContextWithCustomSpan } from "../api/setupRequest.js"
7
- import { InfraLogger } from "../logger.js"
8
- import { reportNonInterruptedFailure, reportNonInterruptedFailureCause, reportQueueError } from "./errors.js"
9
- import { type QueueBase, QueueMeta } from "./service.js"
10
-
11
- export function makeServiceBusQueue<
12
- Evt extends { id: StringId; _tag: string },
13
- DrainEvt extends { id: StringId; _tag: string },
14
- EvtE,
15
- DrainEvtE
16
- >(
17
- schema: S.Codec<Evt, EvtE>,
18
- drainSchema: S.Codec<DrainEvt, DrainEvtE>
19
- ) {
20
- const wireSchema = S.Struct({
21
- body: schema,
22
- meta: QueueMeta
23
- })
24
- const wireSchemaJson = S.fromJsonString(S.toCodecJson(wireSchema))
25
- const encodePublish = S.encodeEffect(wireSchemaJson)
26
- const drainW = S.Struct({ body: drainSchema, meta: QueueMeta })
27
- const drainWJson = S.fromJsonString(S.toCodecJson(drainW))
28
- const parseDrain = flow(S.decodeUnknownEffect(drainWJson), Effect.orDie)
29
-
30
- return Effect.gen(function*() {
31
- const sender = yield* Sender
32
- const receiver = yield* Receiver
33
- const silenceAndReportError = reportNonInterruptedFailure({ name: receiver.name })
34
- const reportError = reportNonInterruptedFailureCause({ name: receiver.name })
35
-
36
- // TODO: or do async?
37
- // This will make sure that the host receives the error (MainFiberSet.join), who will then interrupt everything and commence a shutdown and restart of app
38
- // const deferred = yield* Deferred.make<never, ServiceBusError | Error>()
39
-
40
- const queue = {
41
- drain: <DrainE, DrainR>(
42
- handleEvent: (ks: DrainEvt) => Effect.Effect<void, DrainE, DrainR>,
43
- sessionId?: string
44
- ) => {
45
- function processMessage(messageBody: unknown) {
46
- return parseDrain(messageBody).pipe(
47
- Effect.orDie,
48
- Effect
49
- .flatMap(({ body, meta }) => {
50
- let effect = InfraLogger
51
- .logDebug(`[${receiver.name}] Processing incoming message`)
52
- .pipe(
53
- Effect.annotateLogs({
54
- body: pretty(body),
55
- meta: pretty(meta)
56
- }),
57
- Effect.andThen(handleEvent(body)),
58
- Effect.orDie
59
- )
60
- // we silenceAndReportError here, so that the error is reported, and moves into the Exit.
61
- .pipe(
62
- silenceAndReportError,
63
- (_) =>
64
- setupRequestContextWithCustomSpan(
65
- _,
66
- meta,
67
- `queue.drain: ${receiver.name}${sessionId ? `#${sessionId}` : ""}.${body._tag}`,
68
- {
69
- captureStackTrace: false,
70
- kind: "consumer",
71
- attributes: {
72
- "queue.name": receiver.name,
73
- "queue.sessionId": sessionId,
74
- "queue.input": body
75
- }
76
- }
77
- )
78
- )
79
- if (meta.span) {
80
- effect = Effect.withParentSpan(effect, Tracer.externalSpan(meta.span))
81
- }
82
- return effect
83
- }),
84
- Effect
85
- // we reportError here, so that we report the error only, and keep flowing
86
- .tapCause(reportError),
87
- // we still need to flatten the Exit.
88
- Effect.flatMap((_) => _)
89
- )
90
- }
91
-
92
- return receiver
93
- .subscribe({
94
- processMessage: (x) => processMessage(x.body).pipe(Effect.uninterruptible),
95
- processError: (err) => reportQueueError(Cause.fail(err.error))
96
- // Deferred.completeWith(
97
- // deferred,
98
- // reportFatalQueueError(Cause.fail(err.error))
99
- // .pipe(Effect.andThen(Effect.fail(err.error)))
100
- // )
101
- }, sessionId)
102
- // .pipe(Effect.andThen(Deferred.await(deferred).pipe(Effect.orDie))),
103
- .pipe(
104
- Effect.andThen(Effect.never)
105
- )
106
- },
107
-
108
- publish: (...messages: NonEmptyReadonlyArray<Evt>) =>
109
- getRequestContext
110
- .pipe(
111
- Effect.flatMap((requestContext) =>
112
- Effect
113
- .forEach(messages, (m) =>
114
- encodePublish({
115
- body: m,
116
- meta: requestContext
117
- })
118
- .pipe(
119
- Effect.orDie,
120
- Effect.map((body) => ({
121
- body,
122
- messageId: m.id, /* correllationid: requestId */
123
- contentType: "application/json",
124
- sessionId: "sessionId" in m ? m.sessionId as string : undefined as unknown as string // TODO: optional
125
- }))
126
- ))
127
- .pipe(Effect.flatMap((msgs) => sender.sendMessages(msgs)))
128
- ),
129
- Effect.withSpan("queue.publish: " + sender.name, {
130
- kind: "producer",
131
- attributes: { "message_tags": messages.map((_) => _._tag) }
132
- }, { captureStackTrace: false })
133
- )
134
- }
135
- return queue as QueueBase<Evt, DrainEvt>
136
- })
137
- }
@@ -1,17 +0,0 @@
1
- import type { Effect, NonEmptyReadonlyArray, Scope } from "effect-app"
2
- import { RequestContext } from "../RequestContext.js"
3
-
4
- export interface QueueBase<Evt, DrainEvt> {
5
- drain: <DrainE, DrainR>(
6
- makeHandleEvent: (ks: DrainEvt) => Effect.Effect<void, DrainE, DrainR>,
7
- sessionId?: string
8
- ) => Effect.Effect<never, never, Scope.Scope | DrainR>
9
- publish: (
10
- ...messages: NonEmptyReadonlyArray<Evt>
11
- ) => Effect.Effect<void>
12
- }
13
-
14
- export interface QueueMakerOps {}
15
- export const QueueMaker: QueueMakerOps = {}
16
-
17
- export const QueueMeta = RequestContext
@@ -1,63 +0,0 @@
1
- import { Context, S } from "effect-app"
2
- import { UserProfileId } from "effect-app/ids"
3
- import { NonEmptyString255 } from "effect-app/Schema"
4
-
5
- export const Locale = S.Literals(["en", "de"])
6
- export type Locale = typeof Locale.Type
7
-
8
- export class LocaleRef extends Context.Reference("Locale", { defaultValue: (): Locale => "en" }) {}
9
-
10
- export class RequestContext extends S.ExtendedClass<
11
- RequestContext,
12
- RequestContext.Encoded
13
- >("RequestContext")({
14
- span: S.Struct({
15
- traceId: S.String,
16
- spanId: S.String,
17
- sampled: S.Boolean
18
- }),
19
- name: NonEmptyString255,
20
- locale: Locale,
21
- sourceId: S.optional(NonEmptyString255), // TODO?
22
- namespace: NonEmptyString255,
23
- /** @deprecated */
24
- userProfile: S.optional(S.Struct({ sub: UserProfileId })) //
25
- }) {
26
- // static Tag = Context.Tag<RequestContext>()
27
-
28
- static toMonitoring(this: void, self: RequestContext) {
29
- return {
30
- operationName: self.name,
31
- locale: self.locale
32
- }
33
- }
34
- }
35
-
36
- export const spanAttributes = (ctx: Pick<RequestContext, "locale" | "namespace"> & Partial<RequestContext>) => ({
37
- "request.name": ctx.name,
38
- "request.locale": ctx.locale,
39
- "request.namespace": ctx.namespace,
40
- ...ctx.sourceId ? { "request.source.id": ctx.sourceId } : {},
41
- ...(ctx.userProfile?.sub
42
- ? {
43
- "request.user.sub": ctx
44
- .userProfile
45
- .sub,
46
- "request.user.roles": "roles" in ctx
47
- .userProfile
48
- ? ctx.userProfile.roles
49
- : undefined
50
- }
51
- : {})
52
- })
53
-
54
- // codegen:start {preset: model}
55
- //
56
- /* eslint-disable */
57
- export namespace RequestContext {
58
- export interface Encoded extends S.Struct.Encoded<typeof RequestContext["fields"]> {}
59
- }
60
- /* eslint-enable */
61
- //
62
- // codegen:end
63
- //
@@ -1,105 +0,0 @@
1
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
- import { Context, Effect, Fiber, FiberSet, Layer, Option, type Tracer } from "effect-app"
3
- import { reportRequestError, reportUnknownRequestError } from "./api/reportError.js"
4
- import { InfraLogger } from "./logger.js"
5
-
6
- const getRootParentSpan = Effect.gen(function*() {
7
- let span: Tracer.AnySpan | null = yield* Effect.currentSpan.pipe(
8
- Effect.catchTag("NoSuchElementError", () => Effect.succeed(null))
9
- )
10
- if (!span) return span
11
- while (span._tag === "Span" && Option.isSome(span.parent)) {
12
- span = span.parent.value
13
- }
14
- return span
15
- })
16
-
17
- export const setRootParentSpan = <A, E, R>(self: Effect.Effect<A, E, R>) =>
18
- getRootParentSpan.pipe(Effect.andThen((span) => span ? Effect.withParentSpan(self, span) : self))
19
-
20
- const make = Effect.gen(function*() {
21
- const set = yield* FiberSet.make<any, any>()
22
- const add = (...fibers: Fiber.Fiber<any, any>[]) =>
23
- Effect.sync(() => fibers.forEach((_) => FiberSet.addUnsafe(set, _)))
24
- const addAll = (fibers: readonly Fiber.Fiber<any, any>[]) =>
25
- Effect.sync(() => fibers.forEach((_) => FiberSet.addUnsafe(set, _)))
26
- const join = FiberSet.size(set).pipe(
27
- Effect.andThen((count) => InfraLogger.logInfo(`Joining ${count} current fibers on the RequestFiberSet`)),
28
- Effect.andThen(FiberSet.join(set))
29
- )
30
- const run = FiberSet.run(set)
31
- const register = <A, E, R>(self: Effect.Effect<A, E, R>) =>
32
- self.pipe(Effect.forkChild, Effect.tap(add), Effect.andThen(Fiber.join))
33
-
34
- // const waitUntilEmpty = Effect.gen(function*() {
35
- // const currentSize = yield* FiberSet.size(set)
36
- // if (currentSize === 0) {
37
- // return
38
- // }
39
- // yield* Effect.logInfo("Waiting RequestFiberSet to be empty: " + currentSize)
40
- // while ((yield* FiberSet.size(set)) > 0) yield* Effect.sleep("250 millis")
41
- // yield* Effect.logDebug("RequestFiberSet is empty")
42
- // })
43
- // TODO: loop and interrupt all fibers in the set continuously?
44
- const interrupt = Fiber.interruptAll(set)
45
-
46
- /**
47
- * Forks the effect into a new fiber attached to the RequestFiberSet scope. Because the
48
- * new fiber isn't attached to the parent, when the fiber executing the
49
- * returned effect terminates, the forked fiber will continue running.
50
- * The fiber will be interrupted when the RequestFiberSet scope is closed.
51
- *
52
- * Reports errors.
53
- */
54
- function forkDaemonReport<R, E, A>(self: Effect.Effect<A, E, R>) {
55
- return self.pipe(
56
- reportRequestError,
57
- Effect.uninterruptible,
58
- run
59
- )
60
- }
61
-
62
- /**
63
- * Forks the effect into a new fiber attached to the RequestFiberSet scope. Because the
64
- * new fiber isn't attached to the parent, when the fiber executing the
65
- * returned effect terminates, the forked fiber will continue running.
66
- * The fiber will be interrupted when the RequestFiberSet scope is closed.
67
- *
68
- * Reports unexpected errors.
69
- */
70
- function forkDaemonReportUnexpected<R, E, A>(self: Effect.Effect<A, E, R>) {
71
- return self
72
- .pipe(
73
- reportUnknownRequestError,
74
- Effect.uninterruptible,
75
- run
76
- )
77
- }
78
-
79
- return {
80
- interrupt,
81
- join,
82
- run,
83
- add,
84
- addAll,
85
- register,
86
- forkDaemonReport,
87
- forkDaemonReportUnexpected
88
- }
89
- })
90
-
91
- /**
92
- * Whenever you fork a fiber for a Request, and you want to prevent dependent services to close prematurely on interruption,
93
- * like the ServiceBus Sender, you should register these fibers in this FiberSet.
94
- */
95
- export class RequestFiberSet extends Context.Service<RequestFiberSet>()("RequestFiberSet", { make }) {
96
- static readonly Live = Layer.effect(this, this.make)
97
- static readonly register = <A, E, R>(self: Effect.Effect<A, E, R>) =>
98
- this.asEffect().pipe(Effect.andThen((_) => _.register(self)))
99
- static readonly run = <A, E, R>(self: Effect.Effect<A, E, R>) =>
100
- this.asEffect().pipe(Effect.andThen((_) => _.run(self)))
101
- static readonly forkDaemonReport = <R, E, A>(self: Effect.Effect<A, E, R>) =>
102
- this.asEffect().pipe(Effect.andThen((_) => _.forkDaemonReport(self)))
103
- static readonly forkDaemonReportUnexpected = <R, E, A>(self: Effect.Effect<A, E, R>) =>
104
- this.asEffect().pipe(Effect.andThen((_) => _.forkDaemonReportUnexpected(self)))
105
- }
@@ -1,116 +0,0 @@
1
- import { Context, Data, Effect, type Exit, Layer, RequestResolver } from "effect-app"
2
- import type { NonEmptyArray } from "effect/Array"
3
- import { dual } from "effect/Function"
4
- import * as MutableHashMap from "effect/MutableHashMap"
5
- import type * as Request from "effect/Request"
6
- import { ContextMap } from "./service.js"
7
-
8
- // TODO: we have to create a new contextmap on every request.
9
- // we want to share one map during startup
10
- // but we want to make sure we don't re-use the startup map after startup
11
- // we can call another start after startup. but it would be even better if we could Die on accessing rootmap
12
- // we could also make the ContextMap optional, and when missing, issue a warning instead?
13
-
14
- export class ContextMapContainer extends Context.Reference("ContextMapContainer", {
15
- defaultValue: (): ContextMap | "root" => "root"
16
- }) {
17
- static readonly layer = Layer.effect(this, ContextMap.make.pipe(Effect.map(ContextMap.of)))
18
- }
19
-
20
- export class ContextMapNotStartedError extends Data.TaggedError("ContextMapNotStartedError") {}
21
-
22
- export const getContextMap = ContextMapContainer.asEffect().pipe(
23
- Effect.filterOrFail((_) => _ !== "root", () => new ContextMapNotStartedError())
24
- )
25
-
26
- export const withRequestResolverCache: {
27
- <A extends Request.Request<any, any>>(options: {
28
- readonly capacity: number
29
- readonly strategy?: "lru" | "fifo" | undefined
30
- }): (self: RequestResolver.RequestResolver<A>) => RequestResolver.RequestResolver<A>
31
- <A extends Request.Request<any, any>>(
32
- self: RequestResolver.RequestResolver<A>,
33
- options: {
34
- readonly capacity: number
35
- readonly strategy?: "lru" | "fifo" | undefined
36
- }
37
- ): RequestResolver.RequestResolver<A>
38
- } = dual(2, <A extends Request.Request<any, any>>(
39
- self: RequestResolver.RequestResolver<A>,
40
- options: {
41
- readonly capacity: number
42
- readonly strategy?: "lru" | "fifo" | undefined
43
- }
44
- ): RequestResolver.RequestResolver<A> => {
45
- const cacheKey = Symbol()
46
- const strategy = options.strategy ?? "lru"
47
- type CacheEntry = {
48
- readonly entry: Request.Entry<A>
49
- exit: Exit.Exit<Request.Success<A>, Request.Error<A>> | undefined
50
- }
51
- // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
52
- return RequestResolver.makeWith({
53
- ...(self as any),
54
- runAll(
55
- entries: NonEmptyArray<Request.Entry<A>>,
56
- key: unknown
57
- ) {
58
- return Effect.flatMap(
59
- getContextMap.pipe(Effect.orDie),
60
- (contextMap) => {
61
- const cache = contextMap.getOrCreateStore<MutableHashMap.MutableHashMap<A, CacheEntry>>(
62
- cacheKey,
63
- () => MutableHashMap.empty()
64
- )
65
-
66
- const uncached: Array<Request.Entry<A>> = []
67
- for (const entry of entries) {
68
- const ocached = MutableHashMap.get(cache, entry.request)
69
- if (ocached._tag === "None") {
70
- const cached: CacheEntry = { entry, exit: undefined }
71
- MutableHashMap.set(cache, entry.request, cached)
72
- const prevComplete = entry.completeUnsafe.bind(entry)
73
- entry.completeUnsafe = (exit) => {
74
- cached.exit = exit
75
- prevComplete(exit)
76
- }
77
- uncached.push(entry)
78
- } else {
79
- const cached = ocached.value
80
- if (cached.exit) {
81
- if (strategy === "lru") {
82
- MutableHashMap.remove(cache, cached.entry.request)
83
- MutableHashMap.set(cache, cached.entry.request, cached)
84
- }
85
- entry.completeUnsafe(cached.exit as any)
86
- } else {
87
- cached.entry.uninterruptible = true
88
- const prevComplete = cached.entry.completeUnsafe.bind(cached.entry)
89
- cached.entry.completeUnsafe = (exit) => {
90
- prevComplete(exit)
91
- entry.completeUnsafe(exit)
92
- }
93
- }
94
- }
95
- }
96
-
97
- if (uncached.length === 0) return Effect.void
98
-
99
- return Effect.onExit(
100
- (self as any).runAll(uncached, key),
101
- () => {
102
- let toRemove = MutableHashMap.size(cache) - options.capacity
103
- if (toRemove <= 0) return Effect.void
104
- for (const k of MutableHashMap.keys(cache)) {
105
- MutableHashMap.remove(cache, k)
106
- toRemove--
107
- if (toRemove <= 0) break
108
- }
109
- return Effect.void
110
- }
111
- )
112
- }
113
- )
114
- }
115
- })
116
- })
@@ -1,112 +0,0 @@
1
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
- import * as Test from "@effect-ts/jest/Test"
3
- import { describe, expect } from "@jest/globals"
4
-
5
- import { OptimisticConcurrencyException } from "../../errors.js"
6
-
7
- import { makeMemoryStore } from "./Memory.js"
8
-
9
- const { it } = Test.runtime()
10
-
11
- describe("Optimistic Concurrency", () => {
12
- describe("set", () => {
13
- it("works", () =>
14
- Effect.gen(function*($) {
15
- const existing = new Map<
16
- string,
17
- { _etag?: string | undefined; id: string; a: string }
18
- >()
19
- const { make } = makeMemoryStore()
20
- const store = yield* $(make("test", Effect.sync(() => existing)))
21
-
22
- const result1 = yield* $(store.set({ id: "1", a: "string", _etag: undefined }))
23
- const result2_1 = yield* $(
24
- store.set({ id: "2", a: "string", _etag: undefined })
25
- )
26
- const result2 = yield* $(store.set({ ...result1, a: "another-string" }))
27
- const result3 = yield* $(store.set({ ...result2, a: "another-string2" }))
28
- const failResult = yield* $(
29
- store.set({ ...result1, a: "another-string3" }).result
30
- )
31
- expect(result1._etag).toBeTruthy()
32
- expect(result2_1._etag).toBeTruthy()
33
- expect(result2._etag).toBeTruthy()
34
- expect(result3._etag).toBeTruthy()
35
-
36
- expect(result2._etag).not.toEqual(result1._etag)
37
- expect(result3._etag).not.toEqual(result2._etag)
38
-
39
- expect(Exit.untraced(failResult)).toEqual(
40
- Exit.fail(new OptimisticConcurrencyException("test", "1"))
41
- )
42
- console.log({ result1, result2 })
43
- }))
44
- })
45
-
46
- describe("bulkSet", () => {
47
- it("works", () =>
48
- Effect.gen(function*($) {
49
- const existing = new Map<
50
- string,
51
- { _etag?: string | undefined; id: string; a: string }
52
- >()
53
- const { make } = makeMemoryStore()
54
- const store = yield* $(make("test", Effect.sync(() => existing)))
55
-
56
- const [result1] = yield* $(
57
- store.bulkSet([{ id: "1", a: "string", _etag: undefined }])
58
- )
59
- const [result2_1] = yield* $(
60
- store.bulkSet([{ id: "2", a: "string", _etag: undefined }])
61
- )
62
- const [result2] = yield* $(store.bulkSet([{ ...result1, a: "another-string" }]))
63
- const [result3] = yield* $(
64
- store.bulkSet([{ ...result2, a: "another-string2" }])
65
- )
66
- const failResult = yield* $(
67
- store.bulkSet([{ ...result1, a: "another-string3" }]).result
68
- )
69
- expect(result1._etag).toBeTruthy()
70
- expect(result2_1._etag).toBeTruthy()
71
- expect(result2._etag).toBeTruthy()
72
- expect(result3._etag).toBeTruthy()
73
-
74
- expect(result2._etag).not.toEqual(result1._etag)
75
- expect(result3._etag).not.toEqual(result2._etag)
76
-
77
- expect(Exit.untraced(failResult)).toEqual(
78
- Exit.fail(new OptimisticConcurrencyException("test", "1"))
79
- )
80
- console.log({ result1, result2 })
81
- }))
82
- })
83
-
84
- describe("batchSet", () => {
85
- it("works", () =>
86
- Effect.gen(function*($) {
87
- const existing = new Map<
88
- string,
89
- { _etag?: string | undefined; id: string; a: string }
90
- >()
91
- const { make } = makeMemoryStore()
92
- const store = yield* $(make("test", Effect.sync(() => existing)))
93
-
94
- const item1 = { id: "1", a: "string", _etag: undefined }
95
- const item2 = { id: "2", a: "string", _etag: undefined }
96
-
97
- yield* $(store.batchSet([item1, item2]))
98
-
99
- const [result1, result2] = yield* $(
100
- Effect.collectAll([store.find("1"), store.find("2")])
101
- )
102
- const failResult = yield* $(
103
- store.batchSet([{ id: "1", a: "another-string3", _etag: "abc" }]).result
104
- )
105
- expect(result1).toEqual(Option.some({ ...item1, _etag: expect.any(String) }))
106
- expect(result2).toEqual(Option.some({ ...item2, _etag: expect.any(String) }))
107
- expect(Exit.untraced(failResult)).toEqual(
108
- Exit.fail(new OptimisticConcurrencyException("test", "1"))
109
- )
110
- }))
111
- })
112
- })