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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (474) hide show
  1. package/CHANGELOG.md +2485 -0
  2. package/_check.sh +1 -1
  3. package/dist/CUPS.d.ts +29 -10
  4. package/dist/CUPS.d.ts.map +1 -1
  5. package/dist/CUPS.js +35 -14
  6. package/dist/ClusterCosmos.d.ts +64 -0
  7. package/dist/ClusterCosmos.d.ts.map +1 -0
  8. package/dist/ClusterCosmos.js +547 -0
  9. package/dist/ClusterServiceBus.d.ts +67 -0
  10. package/dist/ClusterServiceBus.d.ts.map +1 -0
  11. package/dist/ClusterServiceBus.js +82 -0
  12. package/dist/ContextProvider.d.ts +34 -0
  13. package/dist/ContextProvider.d.ts.map +1 -0
  14. package/dist/ContextProvider.js +40 -0
  15. package/dist/Emailer/Sendgrid.d.ts +110 -146
  16. package/dist/Emailer/Sendgrid.d.ts.map +1 -1
  17. package/dist/Emailer/Sendgrid.js +24 -19
  18. package/dist/Emailer/fake.d.ts +1 -1
  19. package/dist/Emailer/fake.d.ts.map +1 -1
  20. package/dist/Emailer/fake.js +4 -4
  21. package/dist/MainFiberSet.d.ts +12 -8
  22. package/dist/MainFiberSet.d.ts.map +1 -1
  23. package/dist/MainFiberSet.js +23 -7
  24. package/dist/QueueMaker/errors.d.ts +4 -2
  25. package/dist/QueueMaker/errors.d.ts.map +1 -1
  26. package/dist/QueueMaker/errors.js +4 -2
  27. package/dist/{adapters/SQL → SQL}/Model.d.ts +33 -47
  28. package/dist/SQL/Model.d.ts.map +1 -0
  29. package/dist/SQL/Model.js +469 -0
  30. package/dist/SQL.d.ts.map +1 -0
  31. package/dist/{adapters/SQL.js → SQL.js} +1 -1
  32. package/dist/Store/Cosmos/query.d.ts +14 -3
  33. package/dist/Store/Cosmos/query.d.ts.map +1 -1
  34. package/dist/Store/Cosmos/query.js +179 -41
  35. package/dist/Store/Cosmos.d.ts +2 -2
  36. package/dist/Store/Cosmos.d.ts.map +1 -1
  37. package/dist/Store/Cosmos.js +385 -254
  38. package/dist/Store/Disk.d.ts +4 -4
  39. package/dist/Store/Disk.d.ts.map +1 -1
  40. package/dist/Store/Disk.js +79 -39
  41. package/dist/Store/Memory.d.ts +5 -9
  42. package/dist/Store/Memory.d.ts.map +1 -1
  43. package/dist/Store/Memory.js +324 -67
  44. package/dist/Store/SQL/Pg.d.ts +4 -0
  45. package/dist/Store/SQL/Pg.d.ts.map +1 -0
  46. package/dist/Store/SQL/Pg.js +232 -0
  47. package/dist/Store/SQL/query.d.ts +49 -0
  48. package/dist/Store/SQL/query.d.ts.map +1 -0
  49. package/dist/Store/SQL/query.js +527 -0
  50. package/dist/Store/SQL.d.ts +21 -0
  51. package/dist/Store/SQL.d.ts.map +1 -0
  52. package/dist/Store/SQL.js +456 -0
  53. package/dist/Store/codeFilter.d.ts +4 -4
  54. package/dist/Store/codeFilter.d.ts.map +1 -1
  55. package/dist/Store/codeFilter.js +6 -4
  56. package/dist/Store/index.d.ts +6 -4
  57. package/dist/Store/index.d.ts.map +1 -1
  58. package/dist/Store/index.js +18 -5
  59. package/dist/Store/utils.d.ts +5 -2
  60. package/dist/Store/utils.d.ts.map +1 -1
  61. package/dist/Store/utils.js +9 -5
  62. package/dist/WorkflowEngineCosmos.d.ts +29 -0
  63. package/dist/WorkflowEngineCosmos.d.ts.map +1 -0
  64. package/dist/WorkflowEngineCosmos.js +542 -0
  65. package/dist/WorkflowEngineSqlite.d.ts +24 -0
  66. package/dist/WorkflowEngineSqlite.d.ts.map +1 -0
  67. package/dist/WorkflowEngineSqlite.js +550 -0
  68. package/dist/arbs.d.ts +1 -1
  69. package/dist/arbs.d.ts.map +1 -1
  70. package/dist/arbs.js +5 -3
  71. package/dist/codec.d.ts.map +1 -0
  72. package/dist/codec.js +5 -0
  73. package/dist/{adapters/cosmos-client.d.ts → cosmos-client.d.ts} +4 -2
  74. package/dist/cosmos-client.d.ts.map +1 -0
  75. package/dist/cosmos-client.js +11 -0
  76. package/dist/errorReporter.d.ts +6 -4
  77. package/dist/errorReporter.d.ts.map +1 -1
  78. package/dist/errorReporter.js +23 -27
  79. package/dist/fileUtil.d.ts +1 -1
  80. package/dist/fileUtil.d.ts.map +1 -1
  81. package/dist/fileUtil.js +4 -3
  82. package/dist/index.d.ts +2 -1
  83. package/dist/index.d.ts.map +1 -1
  84. package/dist/index.js +3 -2
  85. package/dist/internal/RequestContextMiddleware.d.ts +5 -0
  86. package/dist/internal/RequestContextMiddleware.d.ts.map +1 -0
  87. package/dist/internal/RequestContextMiddleware.js +45 -0
  88. package/dist/internal/auth.d.ts +53 -0
  89. package/dist/internal/auth.d.ts.map +1 -0
  90. package/dist/internal/auth.js +180 -0
  91. package/dist/internal/events.d.ts +11 -0
  92. package/dist/internal/events.d.ts.map +1 -0
  93. package/dist/internal/events.js +49 -0
  94. package/dist/internal/health.d.ts.map +1 -0
  95. package/dist/internal/health.js +5 -0
  96. package/dist/{api/layerUtils.d.ts → layerUtils.d.ts} +14 -6
  97. package/dist/layerUtils.d.ts.map +1 -0
  98. package/dist/layerUtils.js +17 -0
  99. package/dist/logger/jsonLogger.d.ts +1 -1
  100. package/dist/logger/jsonLogger.d.ts.map +1 -1
  101. package/dist/logger/jsonLogger.js +5 -3
  102. package/dist/logger/logFmtLogger.d.ts +1 -1
  103. package/dist/logger/logFmtLogger.d.ts.map +1 -1
  104. package/dist/logger/logFmtLogger.js +3 -3
  105. package/dist/logger/shared.d.ts +2 -2
  106. package/dist/logger/shared.d.ts.map +1 -1
  107. package/dist/logger/shared.js +5 -5
  108. package/dist/logger.d.ts +4 -4
  109. package/dist/logger.d.ts.map +1 -1
  110. package/dist/middlewares.d.ts.map +1 -0
  111. package/dist/{api/middlewares.js → middlewares.js} +1 -1
  112. package/dist/{adapters/mongo-client.d.ts → mongo-client.d.ts} +3 -2
  113. package/dist/mongo-client.d.ts.map +1 -0
  114. package/dist/mongo-client.js +15 -0
  115. package/dist/otel.d.ts +75 -0
  116. package/dist/otel.d.ts.map +1 -0
  117. package/dist/otel.js +65 -0
  118. package/dist/rateLimit.d.ts +11 -3
  119. package/dist/rateLimit.d.ts.map +1 -1
  120. package/dist/rateLimit.js +7 -12
  121. package/dist/{adapters/redis-client.d.ts → redis-client.d.ts} +6 -3
  122. package/dist/redis-client.d.ts.map +1 -0
  123. package/dist/redis-client.js +98 -0
  124. package/dist/{api/reportError.d.ts → reportError.d.ts} +1 -1
  125. package/dist/reportError.d.ts.map +1 -0
  126. package/dist/reportError.js +28 -0
  127. package/dist/{api/routing → routing}/middleware/RouterMiddleware.d.ts +4 -3
  128. package/dist/routing/middleware/RouterMiddleware.d.ts.map +1 -0
  129. package/dist/{api/routing → routing}/middleware/RouterMiddleware.js +1 -1
  130. package/dist/routing/middleware/middleware.d.ts +48 -0
  131. package/dist/routing/middleware/middleware.d.ts.map +1 -0
  132. package/dist/routing/middleware/middleware.js +152 -0
  133. package/dist/{api/routing → routing}/middleware.d.ts +0 -1
  134. package/dist/routing/middleware.d.ts.map +1 -0
  135. package/dist/{api/routing → routing}/middleware.js +1 -2
  136. package/dist/{api/routing → routing}/schema/jwt.d.ts +1 -1
  137. package/dist/routing/schema/jwt.d.ts.map +1 -0
  138. package/dist/routing/schema/jwt.js +13 -0
  139. package/dist/routing/tsort.d.ts.map +1 -0
  140. package/dist/routing/tsort.js +51 -0
  141. package/dist/{api/routing → routing}/utils.d.ts +3 -3
  142. package/dist/routing/utils.d.ts.map +1 -0
  143. package/dist/routing/utils.js +45 -0
  144. package/dist/routing.d.ts +182 -0
  145. package/dist/routing.d.ts.map +1 -0
  146. package/dist/routing.js +256 -0
  147. package/dist/test.d.ts +2 -2
  148. package/dist/test.d.ts.map +1 -1
  149. package/dist/test.js +2 -2
  150. package/dist/util.d.ts.map +1 -0
  151. package/dist/util.js +14 -0
  152. package/docs/cluster-storage.md +26 -0
  153. package/docs/workflow-engine.md +262 -0
  154. package/examples/query.ts +47 -39
  155. package/package.json +38 -352
  156. package/src/CUPS.ts +53 -14
  157. package/src/ClusterCosmos.ts +1118 -0
  158. package/src/ClusterServiceBus.ts +242 -0
  159. package/src/{api/ContextProvider.ts → ContextProvider.ts} +20 -17
  160. package/src/Emailer/Sendgrid.ts +83 -60
  161. package/src/Emailer/fake.ts +4 -4
  162. package/src/MainFiberSet.ts +32 -13
  163. package/src/QueueMaker/errors.ts +3 -1
  164. package/src/{adapters/SQL → SQL}/Model.ts +116 -110
  165. package/src/SQL.ts +1 -0
  166. package/src/Store/Cosmos/query.ts +218 -54
  167. package/src/Store/Cosmos.ts +529 -365
  168. package/src/Store/Disk.ts +112 -70
  169. package/src/Store/Memory.ts +366 -102
  170. package/src/Store/SQL/Pg.ts +363 -0
  171. package/src/Store/SQL/query.ts +603 -0
  172. package/src/Store/SQL.ts +746 -0
  173. package/src/Store/codeFilter.ts +8 -6
  174. package/src/Store/index.ts +25 -10
  175. package/src/Store/utils.ts +32 -25
  176. package/src/WorkflowEngineCosmos.ts +749 -0
  177. package/src/WorkflowEngineSqlite.ts +813 -0
  178. package/src/arbs.ts +5 -3
  179. package/src/{adapters/cosmos-client.ts → cosmos-client.ts} +5 -3
  180. package/src/errorReporter.ts +68 -78
  181. package/src/fileUtil.ts +3 -2
  182. package/src/index.ts +2 -1
  183. package/src/{api/internal → internal}/RequestContextMiddleware.ts +23 -6
  184. package/src/internal/auth.ts +272 -0
  185. package/src/{api/internal → internal}/events.ts +25 -15
  186. package/src/{api/layerUtils.ts → layerUtils.ts} +14 -10
  187. package/src/logger/jsonLogger.ts +5 -3
  188. package/src/logger/logFmtLogger.ts +3 -3
  189. package/src/logger/shared.ts +5 -4
  190. package/src/middlewares.ts +10 -0
  191. package/src/{adapters/mongo-client.ts → mongo-client.ts} +4 -2
  192. package/src/otel.ts +152 -0
  193. package/src/rateLimit.ts +34 -23
  194. package/src/{adapters/redis-client.ts → redis-client.ts} +7 -3
  195. package/src/{api/reportError.ts → reportError.ts} +3 -2
  196. package/src/{api/routing → routing}/middleware/RouterMiddleware.ts +5 -4
  197. package/src/routing/middleware/middleware.ts +196 -0
  198. package/src/routing/middleware.ts +4 -0
  199. package/src/{api/routing → routing}/schema/jwt.ts +4 -4
  200. package/src/{api/routing → routing}/utils.ts +2 -1
  201. package/src/routing.ts +823 -0
  202. package/src/test.ts +4 -4
  203. package/src/vitest.ts +1 -1
  204. package/test/auth.test.ts +101 -0
  205. package/test/cluster-cosmos.test.ts +612 -0
  206. package/test/cluster-servicebus.test.ts +180 -0
  207. package/test/cluster-sqlite.test.ts +205 -0
  208. package/test/contextProvider.test.ts +15 -12
  209. package/test/controller.test.ts +30 -32
  210. package/test/cosmos-query.test.ts +228 -0
  211. package/test/dist/auth.test.d.ts.map +1 -0
  212. package/test/dist/cluster-cosmos.test.d.ts.map +1 -0
  213. package/test/dist/cluster-servicebus.test.d.ts.map +1 -0
  214. package/test/dist/cluster-sqlite.test.d.ts.map +1 -0
  215. package/test/dist/contextProvider.test.d.ts.map +1 -1
  216. package/test/dist/controller.test.d.ts.map +1 -1
  217. package/test/dist/cosmos-query.test.d.ts.map +1 -0
  218. package/test/dist/fixtures.d.ts +29 -11
  219. package/test/dist/fixtures.d.ts.map +1 -1
  220. package/test/dist/fixtures.js +17 -10
  221. package/test/dist/query.test.d.ts.map +1 -1
  222. package/test/dist/rawQuery.test.d.ts.map +1 -1
  223. package/test/dist/repository-ext.test.d.ts.map +1 -0
  224. package/test/dist/requires.test.d.ts.map +1 -1
  225. package/test/dist/router-generator.test.d.ts.map +1 -0
  226. package/test/dist/routing-interruptibility.test.d.ts.map +1 -0
  227. package/test/dist/rpc-context-map-streaming.test.d.ts.map +1 -0
  228. package/test/dist/rpc-e2e-invalidation.test.d.ts.map +1 -0
  229. package/test/dist/rpc-multi-middleware.test.d.ts.map +1 -1
  230. package/test/dist/rpc-stream-fullstack.test.d.ts.map +1 -0
  231. package/test/dist/sql-store.test.d.ts.map +1 -0
  232. package/test/dist/workflow-engine-cosmos.test.d.ts.map +1 -0
  233. package/test/dist/workflow-engine-sqlite.test.d.ts.map +1 -0
  234. package/test/fixtures.ts +16 -9
  235. package/test/layerUtils.test.ts +2 -2
  236. package/test/query.test.ts +1007 -43
  237. package/test/rawQuery.test.ts +340 -22
  238. package/test/repository-ext.test.ts +178 -0
  239. package/test/requires.test.ts +10 -5
  240. package/test/router-generator.test.ts +187 -0
  241. package/test/routing-interruptibility.test.ts +66 -0
  242. package/test/rpc-context-map-streaming.test.ts +262 -0
  243. package/test/rpc-e2e-invalidation.test.ts +418 -0
  244. package/test/rpc-multi-middleware.test.ts +86 -11
  245. package/test/rpc-stream-fullstack.test.ts +304 -0
  246. package/test/sql-store.test.ts +1711 -0
  247. package/test/validateSample.test.ts +26 -14
  248. package/test/workflow-engine-cosmos.test.ts +345 -0
  249. package/test/workflow-engine-sqlite.test.ts +297 -0
  250. package/tsconfig.examples.json +1 -1
  251. package/tsconfig.json +3 -1
  252. package/tsconfig.src.json +35 -35
  253. package/tsconfig.test.json +2 -2
  254. package/dist/Emailer/service.d.ts +0 -55
  255. package/dist/Emailer/service.d.ts.map +0 -1
  256. package/dist/Emailer/service.js +0 -6
  257. package/dist/Emailer.d.ts +0 -2
  258. package/dist/Emailer.d.ts.map +0 -1
  259. package/dist/Emailer.js +0 -2
  260. package/dist/Model/Repository/ext.d.ts +0 -41
  261. package/dist/Model/Repository/ext.d.ts.map +0 -1
  262. package/dist/Model/Repository/ext.js +0 -65
  263. package/dist/Model/Repository/internal/internal.d.ts +0 -59
  264. package/dist/Model/Repository/internal/internal.d.ts.map +0 -1
  265. package/dist/Model/Repository/internal/internal.js +0 -316
  266. package/dist/Model/Repository/legacy.d.ts +0 -19
  267. package/dist/Model/Repository/legacy.d.ts.map +0 -1
  268. package/dist/Model/Repository/legacy.js +0 -2
  269. package/dist/Model/Repository/makeRepo.d.ts +0 -49
  270. package/dist/Model/Repository/makeRepo.d.ts.map +0 -1
  271. package/dist/Model/Repository/makeRepo.js +0 -24
  272. package/dist/Model/Repository/service.d.ts +0 -89
  273. package/dist/Model/Repository/service.d.ts.map +0 -1
  274. package/dist/Model/Repository/service.js +0 -2
  275. package/dist/Model/Repository/validation.d.ts +0 -42
  276. package/dist/Model/Repository/validation.d.ts.map +0 -1
  277. package/dist/Model/Repository/validation.js +0 -32
  278. package/dist/Model/Repository.d.ts +0 -6
  279. package/dist/Model/Repository.d.ts.map +0 -1
  280. package/dist/Model/Repository.js +0 -6
  281. package/dist/Model/dsl.d.ts +0 -32
  282. package/dist/Model/dsl.d.ts.map +0 -1
  283. package/dist/Model/dsl.js +0 -44
  284. package/dist/Model/filter/filterApi.d.ts +0 -30
  285. package/dist/Model/filter/filterApi.d.ts.map +0 -1
  286. package/dist/Model/filter/filterApi.js +0 -2
  287. package/dist/Model/filter/types/errors.d.ts +0 -29
  288. package/dist/Model/filter/types/errors.d.ts.map +0 -1
  289. package/dist/Model/filter/types/errors.js +0 -2
  290. package/dist/Model/filter/types/fields.d.ts +0 -15
  291. package/dist/Model/filter/types/fields.d.ts.map +0 -1
  292. package/dist/Model/filter/types/fields.js +0 -2
  293. package/dist/Model/filter/types/path/common.d.ts +0 -316
  294. package/dist/Model/filter/types/path/common.d.ts.map +0 -1
  295. package/dist/Model/filter/types/path/common.js +0 -2
  296. package/dist/Model/filter/types/path/eager.d.ts +0 -95
  297. package/dist/Model/filter/types/path/eager.d.ts.map +0 -1
  298. package/dist/Model/filter/types/path/eager.js +0 -31
  299. package/dist/Model/filter/types/path/index.d.ts +0 -4
  300. package/dist/Model/filter/types/path/index.d.ts.map +0 -1
  301. package/dist/Model/filter/types/path/index.js +0 -3
  302. package/dist/Model/filter/types/utils.d.ts +0 -79
  303. package/dist/Model/filter/types/utils.d.ts.map +0 -1
  304. package/dist/Model/filter/types/utils.js +0 -2
  305. package/dist/Model/filter/types/validator.d.ts +0 -30
  306. package/dist/Model/filter/types/validator.d.ts.map +0 -1
  307. package/dist/Model/filter/types/validator.js +0 -2
  308. package/dist/Model/filter/types.d.ts +0 -5
  309. package/dist/Model/filter/types.d.ts.map +0 -1
  310. package/dist/Model/filter/types.js +0 -7
  311. package/dist/Model/query/dsl.d.ts +0 -248
  312. package/dist/Model/query/dsl.d.ts.map +0 -1
  313. package/dist/Model/query/dsl.js +0 -104
  314. package/dist/Model/query/new-kid-interpreter.d.ts +0 -28
  315. package/dist/Model/query/new-kid-interpreter.d.ts.map +0 -1
  316. package/dist/Model/query/new-kid-interpreter.js +0 -165
  317. package/dist/Model/query.d.ts +0 -15
  318. package/dist/Model/query.d.ts.map +0 -1
  319. package/dist/Model/query.js +0 -3
  320. package/dist/Model.d.ts +0 -4
  321. package/dist/Model.d.ts.map +0 -1
  322. package/dist/Model.js +0 -4
  323. package/dist/Operations.d.ts +0 -55
  324. package/dist/Operations.d.ts.map +0 -1
  325. package/dist/Operations.js +0 -102
  326. package/dist/OperationsRepo.d.ts +0 -41
  327. package/dist/OperationsRepo.d.ts.map +0 -1
  328. package/dist/OperationsRepo.js +0 -14
  329. package/dist/QueueMaker/SQLQueue.d.ts +0 -16
  330. package/dist/QueueMaker/SQLQueue.d.ts.map +0 -1
  331. package/dist/QueueMaker/SQLQueue.js +0 -130
  332. package/dist/QueueMaker/memQueue.d.ts +0 -11
  333. package/dist/QueueMaker/memQueue.d.ts.map +0 -1
  334. package/dist/QueueMaker/memQueue.js +0 -75
  335. package/dist/QueueMaker/sbqueue.d.ts +0 -12
  336. package/dist/QueueMaker/sbqueue.d.ts.map +0 -1
  337. package/dist/QueueMaker/sbqueue.js +0 -89
  338. package/dist/QueueMaker/service.d.ts +0 -11
  339. package/dist/QueueMaker/service.d.ts.map +0 -1
  340. package/dist/QueueMaker/service.js +0 -4
  341. package/dist/RequestContext.d.ts +0 -63
  342. package/dist/RequestContext.d.ts.map +0 -1
  343. package/dist/RequestContext.js +0 -49
  344. package/dist/RequestFiberSet.d.ts +0 -36
  345. package/dist/RequestFiberSet.d.ts.map +0 -1
  346. package/dist/RequestFiberSet.js +0 -78
  347. package/dist/Store/ContextMapContainer.d.ts +0 -14
  348. package/dist/Store/ContextMapContainer.d.ts.map +0 -1
  349. package/dist/Store/ContextMapContainer.js +0 -16
  350. package/dist/Store/service.d.ts +0 -108
  351. package/dist/Store/service.d.ts.map +0 -1
  352. package/dist/Store/service.js +0 -71
  353. package/dist/Store.d.ts +0 -2
  354. package/dist/Store.d.ts.map +0 -1
  355. package/dist/Store.js +0 -2
  356. package/dist/adapters/SQL/Model.d.ts.map +0 -1
  357. package/dist/adapters/SQL/Model.js +0 -470
  358. package/dist/adapters/SQL.d.ts.map +0 -1
  359. package/dist/adapters/ServiceBus.d.ts +0 -58
  360. package/dist/adapters/ServiceBus.d.ts.map +0 -1
  361. package/dist/adapters/ServiceBus.js +0 -99
  362. package/dist/adapters/cosmos-client.d.ts.map +0 -1
  363. package/dist/adapters/cosmos-client.js +0 -9
  364. package/dist/adapters/index.d.ts +0 -2
  365. package/dist/adapters/index.d.ts.map +0 -1
  366. package/dist/adapters/index.js +0 -2
  367. package/dist/adapters/logger.d.ts +0 -9
  368. package/dist/adapters/logger.d.ts.map +0 -1
  369. package/dist/adapters/logger.js +0 -3
  370. package/dist/adapters/memQueue.d.ts +0 -13
  371. package/dist/adapters/memQueue.d.ts.map +0 -1
  372. package/dist/adapters/memQueue.js +0 -20
  373. package/dist/adapters/mongo-client.d.ts.map +0 -1
  374. package/dist/adapters/mongo-client.js +0 -13
  375. package/dist/adapters/redis-client.d.ts.map +0 -1
  376. package/dist/adapters/redis-client.js +0 -94
  377. package/dist/api/ContextProvider.d.ts +0 -31
  378. package/dist/api/ContextProvider.d.ts.map +0 -1
  379. package/dist/api/ContextProvider.js +0 -38
  380. package/dist/api/codec.d.ts.map +0 -1
  381. package/dist/api/codec.js +0 -5
  382. package/dist/api/internal/RequestContextMiddleware.d.ts +0 -5
  383. package/dist/api/internal/RequestContextMiddleware.d.ts.map +0 -1
  384. package/dist/api/internal/RequestContextMiddleware.js +0 -35
  385. package/dist/api/internal/auth.d.ts +0 -15
  386. package/dist/api/internal/auth.d.ts.map +0 -1
  387. package/dist/api/internal/auth.js +0 -47
  388. package/dist/api/internal/events.d.ts +0 -9
  389. package/dist/api/internal/events.d.ts.map +0 -1
  390. package/dist/api/internal/events.js +0 -40
  391. package/dist/api/internal/health.d.ts.map +0 -1
  392. package/dist/api/internal/health.js +0 -5
  393. package/dist/api/layerUtils.d.ts.map +0 -1
  394. package/dist/api/layerUtils.js +0 -16
  395. package/dist/api/middlewares.d.ts.map +0 -1
  396. package/dist/api/reportError.d.ts.map +0 -1
  397. package/dist/api/reportError.js +0 -27
  398. package/dist/api/routing/middleware/RouterMiddleware.d.ts.map +0 -1
  399. package/dist/api/routing/middleware/middleware.d.ts +0 -9
  400. package/dist/api/routing/middleware/middleware.d.ts.map +0 -1
  401. package/dist/api/routing/middleware/middleware.js +0 -92
  402. package/dist/api/routing/middleware.d.ts.map +0 -1
  403. package/dist/api/routing/schema/jwt.d.ts.map +0 -1
  404. package/dist/api/routing/schema/jwt.js +0 -12
  405. package/dist/api/routing/tsort.d.ts.map +0 -1
  406. package/dist/api/routing/tsort.js +0 -51
  407. package/dist/api/routing/utils.d.ts.map +0 -1
  408. package/dist/api/routing/utils.js +0 -44
  409. package/dist/api/routing.d.ts +0 -138
  410. package/dist/api/routing.d.ts.map +0 -1
  411. package/dist/api/routing.js +0 -166
  412. package/dist/api/setupRequest.d.ts +0 -12
  413. package/dist/api/setupRequest.d.ts.map +0 -1
  414. package/dist/api/setupRequest.js +0 -44
  415. package/dist/api/util.d.ts.map +0 -1
  416. package/dist/api/util.js +0 -14
  417. package/eslint.config.mjs +0 -24
  418. package/src/Emailer/service.ts +0 -52
  419. package/src/Emailer.ts +0 -1
  420. package/src/Model/Repository/ext.ts +0 -283
  421. package/src/Model/Repository/internal/internal.ts +0 -577
  422. package/src/Model/Repository/legacy.ts +0 -27
  423. package/src/Model/Repository/makeRepo.ts +0 -139
  424. package/src/Model/Repository/service.ts +0 -627
  425. package/src/Model/Repository/validation.ts +0 -31
  426. package/src/Model/Repository.ts +0 -5
  427. package/src/Model/dsl.ts +0 -128
  428. package/src/Model/filter/filterApi.ts +0 -60
  429. package/src/Model/filter/types/errors.ts +0 -47
  430. package/src/Model/filter/types/fields.ts +0 -50
  431. package/src/Model/filter/types/path/common.ts +0 -404
  432. package/src/Model/filter/types/path/eager.ts +0 -298
  433. package/src/Model/filter/types/path/index.ts +0 -4
  434. package/src/Model/filter/types/utils.ts +0 -128
  435. package/src/Model/filter/types/validator.ts +0 -46
  436. package/src/Model/filter/types.ts +0 -6
  437. package/src/Model/query/dsl.ts +0 -2110
  438. package/src/Model/query/new-kid-interpreter.ts +0 -210
  439. package/src/Model/query.ts +0 -13
  440. package/src/Model.ts +0 -3
  441. package/src/Operations.ts +0 -235
  442. package/src/OperationsRepo.ts +0 -16
  443. package/src/QueueMaker/SQLQueue.ts +0 -190
  444. package/src/QueueMaker/memQueue.ts +0 -131
  445. package/src/QueueMaker/sbqueue.ts +0 -134
  446. package/src/QueueMaker/service.ts +0 -17
  447. package/src/RequestContext.ts +0 -63
  448. package/src/RequestFiberSet.ts +0 -105
  449. package/src/Store/ContextMapContainer.ts +0 -20
  450. package/src/Store/index.test.ts.bak +0 -112
  451. package/src/Store/service.ts +0 -184
  452. package/src/Store.ts +0 -1
  453. package/src/adapters/SQL.ts +0 -1
  454. package/src/adapters/ServiceBus.ts +0 -209
  455. package/src/adapters/index.ts +0 -0
  456. package/src/adapters/logger.ts +0 -3
  457. package/src/adapters/memQueue.ts +0 -21
  458. package/src/api/internal/auth.ts +0 -68
  459. package/src/api/middlewares.ts +0 -10
  460. package/src/api/routing/middleware/middleware.ts +0 -128
  461. package/src/api/routing/middleware.ts +0 -6
  462. package/src/api/routing.ts +0 -597
  463. package/src/api/setupRequest.ts +0 -84
  464. package/tsconfig.json.bak +0 -12
  465. /package/dist/{adapters/SQL.d.ts → SQL.d.ts} +0 -0
  466. /package/dist/{api/codec.d.ts → codec.d.ts} +0 -0
  467. /package/dist/{api/internal → internal}/health.d.ts +0 -0
  468. /package/dist/{api/middlewares.d.ts → middlewares.d.ts} +0 -0
  469. /package/dist/{api/routing → routing}/tsort.d.ts +0 -0
  470. /package/dist/{api/util.d.ts → util.d.ts} +0 -0
  471. /package/src/{api/codec.ts → codec.ts} +0 -0
  472. /package/src/{api/internal → internal}/health.ts +0 -0
  473. /package/src/{api/routing → routing}/tsort.ts +0 -0
  474. /package/src/{api/util.ts → util.ts} +0 -0
@@ -1,131 +0,0 @@
1
- import { Cause, Tracer } from "effect"
2
- import { Effect, Fiber, flow, S } from "effect-app"
3
- import * as Q from "effect/Queue"
4
- import { pretty } from "effect-app/utils"
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 { NonEmptyReadonlyArray } from "effect-app"
10
- import { type QueueBase, QueueMeta } from "./service.js"
11
-
12
- export function makeMemQueue<
13
- Evt extends { id: S.StringId; _tag: string },
14
- DrainEvt extends { id: S.StringId; _tag: string },
15
- EvtE,
16
- DrainEvtE
17
- >(
18
- queueName: string,
19
- queueDrainName: string,
20
- schema: S.Codec<Evt, EvtE>,
21
- drainSchema: S.Codec<DrainEvt, DrainEvtE>
22
- ) {
23
- return Effect.gen(function*() {
24
- const mem = yield* MemQueue
25
- const q = yield* mem.getOrCreateQueue(queueName)
26
- const qDrain = yield* mem.getOrCreateQueue(queueDrainName)
27
-
28
- const wireSchema = S.Struct({ body: schema, meta: QueueMeta })
29
- const drainW = S.Struct({ body: drainSchema, meta: QueueMeta })
30
- const parseDrain = flow(S.decodeUnknownEffect(drainW), Effect.orDie)
31
-
32
- const queue = {
33
- publish: (...messages: NonEmptyReadonlyArray<Evt>) =>
34
- getRequestContext
35
- .pipe(
36
- Effect.flatMap((requestContext) =>
37
- Effect
38
- .forEach(messages, (m) =>
39
- // we JSON encode, because that is what the wire also does, and it reveals holes in e.g unknown encoders (Date->String)
40
- S.encodeEffect(wireSchema)({ body: m, meta: requestContext }).pipe(
41
- Effect.orDie,
42
- Effect
43
- .map(JSON.stringify),
44
- // .tap((msg) => info("Publishing Mem Message: " + utils.inspect(msg)))
45
- Effect.flatMap((_) => Q.offer(q, _))
46
- ), { discard: true })
47
- ),
48
- Effect.withSpan("queue.publish: " + queueName, {
49
- kind: "producer",
50
- attributes: { "message_tags": messages.map((_) => _._tag) }
51
- }, { captureStackTrace: false })
52
- ),
53
- drain: <DrainE, DrainR>(
54
- handleEvent: (ks: DrainEvt) => Effect.Effect<void, DrainE, DrainR>,
55
- sessionId?: string
56
- ) => {
57
- const silenceAndReportError = reportNonInterruptedFailure({ name: "MemQueue.drain." + queueDrainName })
58
- const reportError = reportNonInterruptedFailureCause({ name: "MemQueue.drain." + queueDrainName })
59
- const processMessage = (msg: string) =>
60
- // we JSON parse, because that is what the wire also does, and it reveals holes in e.g unknown encoders (Date->String)
61
- Effect
62
- .sync(() => JSON.parse(msg))
63
- .pipe(
64
- Effect.flatMap(parseDrain),
65
- Effect.orDie,
66
- Effect
67
- .flatMap(({ body, meta }) => {
68
- let effect = InfraLogger
69
- .logDebug(`[${queueDrainName}] Processing incoming message`)
70
- .pipe(
71
- Effect.annotateLogs({ body: pretty(body), meta: pretty(meta) }),
72
- Effect.andThen(handleEvent(body)),
73
- silenceAndReportError,
74
- (_) =>
75
- setupRequestContextWithCustomSpan(
76
- _,
77
- meta,
78
- `queue.drain: ${queueDrainName}.${body._tag}`,
79
- {
80
- captureStackTrace: false,
81
- kind: "consumer",
82
- attributes: {
83
- "queue.name": queueDrainName,
84
- "queue.sessionId": sessionId,
85
- "queue.input": body
86
- }
87
- }
88
- )
89
- )
90
- if (meta.span) {
91
- effect = Effect.withParentSpan(effect, Tracer.externalSpan(meta.span))
92
- }
93
- return effect
94
- })
95
- )
96
- return Q.take(qDrain)
97
- .pipe(
98
- Effect
99
- .flatMap((x) =>
100
- processMessage(x).pipe(
101
- Effect.uninterruptible,
102
- Effect.forkChild,
103
- Effect.flatMap(Fiber.join),
104
- // normally a failed item would be returned to the queue and retried up to X times.
105
- Effect.flatMap((_) =>
106
- _._tag === "Failure" && !Cause.hasInterruptsOnly(_.cause)
107
- ? Q.offer(qDrain, x).pipe(
108
- // TODO: retry count tracking and max retries.
109
- Effect.delay("5 seconds"),
110
- Effect.tapCause(reportError),
111
- Effect.forkDetach
112
- )
113
- : Effect.void
114
- )
115
- )
116
- ),
117
- silenceAndReportError,
118
- Effect.withSpan(`queue.drain: ${queueDrainName}`, {
119
- attributes: {
120
- "queue.type": "mem",
121
- "queue.name": queueDrainName,
122
- "queue.sessionId": sessionId
123
- }
124
- }),
125
- Effect.forever
126
- )
127
- }
128
- }
129
- return queue as QueueBase<Evt, DrainEvt>
130
- })
131
- }
@@ -1,134 +0,0 @@
1
- import { Tracer } from "effect"
2
- import { Cause, Effect, flow, 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 { NonEmptyReadonlyArray } from "effect-app"
10
- import { type QueueBase, QueueMeta } from "./service.js"
11
-
12
- export function makeServiceBusQueue<
13
- Evt extends { id: StringId; _tag: string },
14
- DrainEvt extends { id: StringId; _tag: string },
15
- EvtE,
16
- DrainEvtE
17
- >(
18
- schema: S.Codec<Evt, EvtE>,
19
- drainSchema: S.Codec<DrainEvt, DrainEvtE>
20
- ) {
21
- const wireSchema = S.Struct({
22
- body: schema,
23
- meta: QueueMeta
24
- })
25
- const drainW = S.Struct({ body: drainSchema, meta: QueueMeta })
26
- const parseDrain = flow(S.decodeUnknownEffect(drainW), Effect.orDie)
27
-
28
- return Effect.gen(function*() {
29
- const sender = yield* Sender
30
- const receiver = yield* Receiver
31
- const silenceAndReportError = reportNonInterruptedFailure({ name: receiver.name })
32
- const reportError = reportNonInterruptedFailureCause({ name: receiver.name })
33
-
34
- // TODO: or do async?
35
- // 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
36
- // const deferred = yield* Deferred.make<never, ServiceBusError | Error>()
37
-
38
- const queue = {
39
- drain: <DrainE, DrainR>(
40
- handleEvent: (ks: DrainEvt) => Effect.Effect<void, DrainE, DrainR>,
41
- sessionId?: string
42
- ) => {
43
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
44
- function processMessage(messageBody: any) {
45
- return Effect
46
- .sync(() => JSON.parse(messageBody))
47
- .pipe(
48
- Effect.flatMap((x) => parseDrain(x)),
49
- Effect.orDie,
50
- Effect
51
- .flatMap(({ body, meta }) => {
52
- let effect = InfraLogger
53
- .logDebug(`[${receiver.name}] Processing incoming message`)
54
- .pipe(
55
- Effect.annotateLogs({
56
- body: pretty(body),
57
- meta: pretty(meta)
58
- }),
59
- Effect.andThen(handleEvent(body)),
60
- Effect.orDie
61
- )
62
- // we silenceAndReportError here, so that the error is reported, and moves into the Exit.
63
- .pipe(
64
- silenceAndReportError,
65
- (_) =>
66
- setupRequestContextWithCustomSpan(
67
- _,
68
- meta,
69
- `queue.drain: ${receiver.name}${sessionId ? `#${sessionId}` : ""}.${body._tag}`,
70
- {
71
- captureStackTrace: false,
72
- kind: "consumer",
73
- attributes: {
74
- "queue.name": receiver.name,
75
- "queue.sessionId": sessionId,
76
- "queue.input": body
77
- }
78
- }
79
- )
80
- )
81
- if (meta.span) {
82
- effect = Effect.withParentSpan(effect, Tracer.externalSpan(meta.span))
83
- }
84
- return effect
85
- }),
86
- Effect
87
- // we reportError here, so that we report the error only, and keep flowing
88
- .tapCause(reportError),
89
- // we still need to flatten the Exit.
90
- Effect.flatMap((_) => _)
91
- )
92
- }
93
-
94
- return receiver
95
- .subscribe({
96
- processMessage: (x) => processMessage(x.body).pipe(Effect.uninterruptible),
97
- processError: (err) => reportQueueError(Cause.fail(err.error))
98
- // Deferred.completeWith(
99
- // deferred,
100
- // reportFatalQueueError(Cause.fail(err.error))
101
- // .pipe(Effect.andThen(Effect.fail(err.error)))
102
- // )
103
- }, sessionId)
104
- // .pipe(Effect.andThen(Deferred.await(deferred).pipe(Effect.orDie))),
105
- .pipe(
106
- Effect.andThen(Effect.never)
107
- )
108
- },
109
-
110
- publish: (...messages: NonEmptyReadonlyArray<Evt>) =>
111
- getRequestContext
112
- .pipe(
113
- Effect.flatMap((requestContext) =>
114
- Effect.forEach(messages, (m) =>
115
- S.encodeEffect(wireSchema)({
116
- body: m,
117
- meta: requestContext
118
- }).pipe(Effect.orDie, Effect.map((encoded) => ({
119
- body: JSON.stringify(encoded),
120
- messageId: m.id, /* correllationid: requestId */
121
- contentType: "application/json",
122
- sessionId: "sessionId" in m ? m.sessionId as string : undefined as unknown as string // TODO: optional
123
- }))))
124
- .pipe(Effect.flatMap((msgs) => sender.sendMessages(msgs)))
125
- ),
126
- Effect.withSpan("queue.publish: " + sender.name, {
127
- kind: "producer",
128
- attributes: { "message_tags": messages.map((_) => _._tag) }
129
- }, { captureStackTrace: false })
130
- )
131
- }
132
- return queue as QueueBase<Evt, DrainEvt>
133
- })
134
- }
@@ -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 { S, ServiceMap } from "effect-app"
2
- import { UserProfileId } from "effect-app/ids"
3
- import { NonEmptyString255 } from "effect-app/Schema"
4
-
5
- export const Locale = S.Literal("en", "de")
6
- export type Locale = typeof Locale.Type
7
-
8
- export class LocaleRef extends ServiceMap.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 = ServiceMap.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 { Effect, Fiber, FiberSet, Layer, ServiceMap, 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" && span.parent !== undefined) {
12
- span = span.parent
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 ServiceMap.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,20 +0,0 @@
1
- import { Data, Effect, Layer, ServiceMap } from "effect-app"
2
- import { ContextMap } from "./service.js"
3
-
4
- // TODO: we have to create a new contextmap on every request.
5
- // we want to share one map during startup
6
- // but we want to make sure we don't re-use the startup map after startup
7
- // we can call another start after startup. but it would be even better if we could Die on accessing rootmap
8
- // we could also make the ContextMap optional, and when missing, issue a warning instead?
9
-
10
- export class ContextMapContainer extends ServiceMap.Reference("ContextMapContainer", {
11
- defaultValue: (): ContextMap | "root" => "root"
12
- }) {
13
- static readonly layer = Layer.effect(this, ContextMap.make.pipe(Effect.map(ContextMap.of)))
14
- }
15
-
16
- export class ContextMapNotStartedError extends Data.TaggedError("ContextMapNotStartedError") {}
17
-
18
- export const getContextMap = ContextMapContainer.asEffect().pipe(
19
- Effect.filterOrFail((_) => _ !== "root", () => new ContextMapNotStartedError())
20
- )
@@ -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
- })