@effect-app/infra 4.0.0-beta.31 → 4.0.0-beta.310

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 (473) hide show
  1. package/CHANGELOG.md +2361 -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 +31 -42
  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 +253 -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 +472 -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 +2 -2
  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.map +1 -1
  109. package/dist/middlewares.d.ts.map +1 -0
  110. package/dist/{api/middlewares.js → middlewares.js} +1 -1
  111. package/dist/{adapters/mongo-client.d.ts → mongo-client.d.ts} +3 -2
  112. package/dist/mongo-client.d.ts.map +1 -0
  113. package/dist/mongo-client.js +15 -0
  114. package/dist/otel.d.ts +75 -0
  115. package/dist/otel.d.ts.map +1 -0
  116. package/dist/otel.js +84 -0
  117. package/dist/rateLimit.d.ts +11 -3
  118. package/dist/rateLimit.d.ts.map +1 -1
  119. package/dist/rateLimit.js +7 -12
  120. package/dist/{adapters/redis-client.d.ts → redis-client.d.ts} +5 -2
  121. package/dist/redis-client.d.ts.map +1 -0
  122. package/dist/redis-client.js +98 -0
  123. package/dist/{api/reportError.d.ts → reportError.d.ts} +1 -1
  124. package/dist/reportError.d.ts.map +1 -0
  125. package/dist/reportError.js +28 -0
  126. package/dist/{api/routing → routing}/middleware/RouterMiddleware.d.ts +4 -3
  127. package/dist/routing/middleware/RouterMiddleware.d.ts.map +1 -0
  128. package/dist/{api/routing → routing}/middleware/RouterMiddleware.js +1 -1
  129. package/dist/routing/middleware/middleware.d.ts +48 -0
  130. package/dist/routing/middleware/middleware.d.ts.map +1 -0
  131. package/dist/routing/middleware/middleware.js +152 -0
  132. package/dist/{api/routing → routing}/middleware.d.ts +0 -1
  133. package/dist/routing/middleware.d.ts.map +1 -0
  134. package/dist/{api/routing → routing}/middleware.js +1 -2
  135. package/dist/routing/schema/jwt.d.ts.map +1 -0
  136. package/dist/routing/schema/jwt.js +13 -0
  137. package/dist/routing/tsort.d.ts.map +1 -0
  138. package/dist/routing/tsort.js +51 -0
  139. package/dist/{api/routing → routing}/utils.d.ts +3 -3
  140. package/dist/routing/utils.d.ts.map +1 -0
  141. package/dist/routing/utils.js +45 -0
  142. package/dist/routing.d.ts +182 -0
  143. package/dist/routing.d.ts.map +1 -0
  144. package/dist/routing.js +256 -0
  145. package/dist/test.d.ts +2 -2
  146. package/dist/test.d.ts.map +1 -1
  147. package/dist/test.js +2 -2
  148. package/dist/util.d.ts.map +1 -0
  149. package/dist/util.js +14 -0
  150. package/docs/cluster-storage.md +26 -0
  151. package/docs/workflow-engine.md +262 -0
  152. package/examples/query.ts +47 -39
  153. package/package.json +38 -352
  154. package/src/CUPS.ts +53 -14
  155. package/src/ClusterCosmos.ts +1118 -0
  156. package/src/ClusterServiceBus.ts +242 -0
  157. package/src/{api/ContextProvider.ts → ContextProvider.ts} +20 -17
  158. package/src/Emailer/Sendgrid.ts +83 -60
  159. package/src/Emailer/fake.ts +4 -4
  160. package/src/MainFiberSet.ts +32 -13
  161. package/src/QueueMaker/errors.ts +3 -1
  162. package/src/{adapters/SQL → SQL}/Model.ts +42 -41
  163. package/src/SQL.ts +1 -0
  164. package/src/Store/Cosmos/query.ts +218 -54
  165. package/src/Store/Cosmos.ts +529 -365
  166. package/src/Store/Disk.ts +112 -70
  167. package/src/Store/Memory.ts +365 -99
  168. package/src/Store/SQL/Pg.ts +389 -0
  169. package/src/Store/SQL/query.ts +603 -0
  170. package/src/Store/SQL.ts +766 -0
  171. package/src/Store/codeFilter.ts +8 -6
  172. package/src/Store/index.ts +25 -10
  173. package/src/Store/utils.ts +32 -25
  174. package/src/WorkflowEngineCosmos.ts +749 -0
  175. package/src/WorkflowEngineSqlite.ts +813 -0
  176. package/src/arbs.ts +5 -3
  177. package/src/{adapters/cosmos-client.ts → cosmos-client.ts} +5 -3
  178. package/src/errorReporter.ts +68 -78
  179. package/src/fileUtil.ts +1 -1
  180. package/src/index.ts +2 -1
  181. package/src/{api/internal → internal}/RequestContextMiddleware.ts +23 -6
  182. package/src/internal/auth.ts +272 -0
  183. package/src/{api/internal → internal}/events.ts +22 -13
  184. package/src/{api/layerUtils.ts → layerUtils.ts} +14 -10
  185. package/src/logger/jsonLogger.ts +5 -3
  186. package/src/logger/logFmtLogger.ts +3 -3
  187. package/src/logger/shared.ts +5 -4
  188. package/src/middlewares.ts +10 -0
  189. package/src/{adapters/mongo-client.ts → mongo-client.ts} +4 -2
  190. package/src/otel.ts +177 -0
  191. package/src/rateLimit.ts +34 -23
  192. package/src/{adapters/redis-client.ts → redis-client.ts} +7 -3
  193. package/src/{api/reportError.ts → reportError.ts} +3 -2
  194. package/src/{api/routing → routing}/middleware/RouterMiddleware.ts +5 -4
  195. package/src/routing/middleware/middleware.ts +196 -0
  196. package/src/routing/middleware.ts +4 -0
  197. package/src/{api/routing → routing}/schema/jwt.ts +2 -1
  198. package/src/{api/routing → routing}/utils.ts +2 -1
  199. package/src/routing.ts +823 -0
  200. package/src/test.ts +4 -4
  201. package/src/vitest.ts +1 -1
  202. package/test/auth.test.ts +101 -0
  203. package/test/cluster-cosmos.test.ts +612 -0
  204. package/test/cluster-servicebus.test.ts +180 -0
  205. package/test/cluster-sqlite.test.ts +205 -0
  206. package/test/contextProvider.test.ts +15 -12
  207. package/test/controller.test.ts +28 -32
  208. package/test/cosmos-query.test.ts +228 -0
  209. package/test/dist/auth.test.d.ts.map +1 -0
  210. package/test/dist/cluster-cosmos.test.d.ts.map +1 -0
  211. package/test/dist/cluster-servicebus.test.d.ts.map +1 -0
  212. package/test/dist/cluster-sqlite.test.d.ts.map +1 -0
  213. package/test/dist/contextProvider.test.d.ts.map +1 -1
  214. package/test/dist/controller.test.d.ts.map +1 -1
  215. package/test/dist/cosmos-query.test.d.ts.map +1 -0
  216. package/test/dist/fixtures.d.ts +29 -11
  217. package/test/dist/fixtures.d.ts.map +1 -1
  218. package/test/dist/fixtures.js +17 -10
  219. package/test/dist/query.test.d.ts.map +1 -1
  220. package/test/dist/rawQuery.test.d.ts.map +1 -1
  221. package/test/dist/repository-ext.test.d.ts.map +1 -0
  222. package/test/dist/requires.test.d.ts.map +1 -1
  223. package/test/dist/router-generator.test.d.ts.map +1 -0
  224. package/test/dist/routing-interruptibility.test.d.ts.map +1 -0
  225. package/test/dist/rpc-context-map-streaming.test.d.ts.map +1 -0
  226. package/test/dist/rpc-e2e-invalidation.test.d.ts.map +1 -0
  227. package/test/dist/rpc-multi-middleware.test.d.ts.map +1 -1
  228. package/test/dist/rpc-stream-fullstack.test.d.ts.map +1 -0
  229. package/test/dist/sql-store.test.d.ts.map +1 -0
  230. package/test/dist/workflow-engine-cosmos.test.d.ts.map +1 -0
  231. package/test/dist/workflow-engine-sqlite.test.d.ts.map +1 -0
  232. package/test/fixtures.ts +16 -9
  233. package/test/layerUtils.test.ts +2 -2
  234. package/test/query.test.ts +1130 -41
  235. package/test/rawQuery.test.ts +340 -22
  236. package/test/repository-ext.test.ts +426 -0
  237. package/test/requires.test.ts +10 -5
  238. package/test/router-generator.test.ts +187 -0
  239. package/test/routing-interruptibility.test.ts +66 -0
  240. package/test/rpc-context-map-streaming.test.ts +262 -0
  241. package/test/rpc-e2e-invalidation.test.ts +418 -0
  242. package/test/rpc-multi-middleware.test.ts +85 -10
  243. package/test/rpc-stream-fullstack.test.ts +304 -0
  244. package/test/sql-store.test.ts +1711 -0
  245. package/test/validateSample.test.ts +26 -14
  246. package/test/workflow-engine-cosmos.test.ts +345 -0
  247. package/test/workflow-engine-sqlite.test.ts +297 -0
  248. package/tsconfig.examples.json +1 -1
  249. package/tsconfig.json +9 -2
  250. package/tsconfig.src.json +35 -35
  251. package/tsconfig.test.json +2 -2
  252. package/dist/Emailer/service.d.ts +0 -55
  253. package/dist/Emailer/service.d.ts.map +0 -1
  254. package/dist/Emailer/service.js +0 -6
  255. package/dist/Emailer.d.ts +0 -2
  256. package/dist/Emailer.d.ts.map +0 -1
  257. package/dist/Emailer.js +0 -2
  258. package/dist/Model/Repository/ext.d.ts +0 -41
  259. package/dist/Model/Repository/ext.d.ts.map +0 -1
  260. package/dist/Model/Repository/ext.js +0 -65
  261. package/dist/Model/Repository/internal/internal.d.ts +0 -59
  262. package/dist/Model/Repository/internal/internal.d.ts.map +0 -1
  263. package/dist/Model/Repository/internal/internal.js +0 -316
  264. package/dist/Model/Repository/legacy.d.ts +0 -19
  265. package/dist/Model/Repository/legacy.d.ts.map +0 -1
  266. package/dist/Model/Repository/legacy.js +0 -2
  267. package/dist/Model/Repository/makeRepo.d.ts +0 -49
  268. package/dist/Model/Repository/makeRepo.d.ts.map +0 -1
  269. package/dist/Model/Repository/makeRepo.js +0 -24
  270. package/dist/Model/Repository/service.d.ts +0 -89
  271. package/dist/Model/Repository/service.d.ts.map +0 -1
  272. package/dist/Model/Repository/service.js +0 -2
  273. package/dist/Model/Repository/validation.d.ts +0 -42
  274. package/dist/Model/Repository/validation.d.ts.map +0 -1
  275. package/dist/Model/Repository/validation.js +0 -32
  276. package/dist/Model/Repository.d.ts +0 -6
  277. package/dist/Model/Repository.d.ts.map +0 -1
  278. package/dist/Model/Repository.js +0 -6
  279. package/dist/Model/dsl.d.ts +0 -32
  280. package/dist/Model/dsl.d.ts.map +0 -1
  281. package/dist/Model/dsl.js +0 -44
  282. package/dist/Model/filter/filterApi.d.ts +0 -30
  283. package/dist/Model/filter/filterApi.d.ts.map +0 -1
  284. package/dist/Model/filter/filterApi.js +0 -2
  285. package/dist/Model/filter/types/errors.d.ts +0 -29
  286. package/dist/Model/filter/types/errors.d.ts.map +0 -1
  287. package/dist/Model/filter/types/errors.js +0 -2
  288. package/dist/Model/filter/types/fields.d.ts +0 -15
  289. package/dist/Model/filter/types/fields.d.ts.map +0 -1
  290. package/dist/Model/filter/types/fields.js +0 -2
  291. package/dist/Model/filter/types/path/common.d.ts +0 -316
  292. package/dist/Model/filter/types/path/common.d.ts.map +0 -1
  293. package/dist/Model/filter/types/path/common.js +0 -2
  294. package/dist/Model/filter/types/path/eager.d.ts +0 -95
  295. package/dist/Model/filter/types/path/eager.d.ts.map +0 -1
  296. package/dist/Model/filter/types/path/eager.js +0 -31
  297. package/dist/Model/filter/types/path/index.d.ts +0 -4
  298. package/dist/Model/filter/types/path/index.d.ts.map +0 -1
  299. package/dist/Model/filter/types/path/index.js +0 -3
  300. package/dist/Model/filter/types/utils.d.ts +0 -79
  301. package/dist/Model/filter/types/utils.d.ts.map +0 -1
  302. package/dist/Model/filter/types/utils.js +0 -2
  303. package/dist/Model/filter/types/validator.d.ts +0 -30
  304. package/dist/Model/filter/types/validator.d.ts.map +0 -1
  305. package/dist/Model/filter/types/validator.js +0 -2
  306. package/dist/Model/filter/types.d.ts +0 -5
  307. package/dist/Model/filter/types.d.ts.map +0 -1
  308. package/dist/Model/filter/types.js +0 -7
  309. package/dist/Model/query/dsl.d.ts +0 -248
  310. package/dist/Model/query/dsl.d.ts.map +0 -1
  311. package/dist/Model/query/dsl.js +0 -104
  312. package/dist/Model/query/new-kid-interpreter.d.ts +0 -28
  313. package/dist/Model/query/new-kid-interpreter.d.ts.map +0 -1
  314. package/dist/Model/query/new-kid-interpreter.js +0 -165
  315. package/dist/Model/query.d.ts +0 -15
  316. package/dist/Model/query.d.ts.map +0 -1
  317. package/dist/Model/query.js +0 -3
  318. package/dist/Model.d.ts +0 -4
  319. package/dist/Model.d.ts.map +0 -1
  320. package/dist/Model.js +0 -4
  321. package/dist/Operations.d.ts +0 -55
  322. package/dist/Operations.d.ts.map +0 -1
  323. package/dist/Operations.js +0 -102
  324. package/dist/OperationsRepo.d.ts +0 -41
  325. package/dist/OperationsRepo.d.ts.map +0 -1
  326. package/dist/OperationsRepo.js +0 -14
  327. package/dist/QueueMaker/SQLQueue.d.ts +0 -16
  328. package/dist/QueueMaker/SQLQueue.d.ts.map +0 -1
  329. package/dist/QueueMaker/SQLQueue.js +0 -130
  330. package/dist/QueueMaker/memQueue.d.ts +0 -11
  331. package/dist/QueueMaker/memQueue.d.ts.map +0 -1
  332. package/dist/QueueMaker/memQueue.js +0 -76
  333. package/dist/QueueMaker/sbqueue.d.ts +0 -12
  334. package/dist/QueueMaker/sbqueue.d.ts.map +0 -1
  335. package/dist/QueueMaker/sbqueue.js +0 -91
  336. package/dist/QueueMaker/service.d.ts +0 -11
  337. package/dist/QueueMaker/service.d.ts.map +0 -1
  338. package/dist/QueueMaker/service.js +0 -4
  339. package/dist/RequestContext.d.ts +0 -63
  340. package/dist/RequestContext.d.ts.map +0 -1
  341. package/dist/RequestContext.js +0 -49
  342. package/dist/RequestFiberSet.d.ts +0 -36
  343. package/dist/RequestFiberSet.d.ts.map +0 -1
  344. package/dist/RequestFiberSet.js +0 -78
  345. package/dist/Store/ContextMapContainer.d.ts +0 -14
  346. package/dist/Store/ContextMapContainer.d.ts.map +0 -1
  347. package/dist/Store/ContextMapContainer.js +0 -16
  348. package/dist/Store/service.d.ts +0 -108
  349. package/dist/Store/service.d.ts.map +0 -1
  350. package/dist/Store/service.js +0 -71
  351. package/dist/Store.d.ts +0 -2
  352. package/dist/Store.d.ts.map +0 -1
  353. package/dist/Store.js +0 -2
  354. package/dist/adapters/SQL/Model.d.ts.map +0 -1
  355. package/dist/adapters/SQL/Model.js +0 -478
  356. package/dist/adapters/SQL.d.ts.map +0 -1
  357. package/dist/adapters/ServiceBus.d.ts +0 -58
  358. package/dist/adapters/ServiceBus.d.ts.map +0 -1
  359. package/dist/adapters/ServiceBus.js +0 -99
  360. package/dist/adapters/cosmos-client.d.ts.map +0 -1
  361. package/dist/adapters/cosmos-client.js +0 -9
  362. package/dist/adapters/index.d.ts +0 -2
  363. package/dist/adapters/index.d.ts.map +0 -1
  364. package/dist/adapters/index.js +0 -2
  365. package/dist/adapters/logger.d.ts +0 -9
  366. package/dist/adapters/logger.d.ts.map +0 -1
  367. package/dist/adapters/logger.js +0 -3
  368. package/dist/adapters/memQueue.d.ts +0 -13
  369. package/dist/adapters/memQueue.d.ts.map +0 -1
  370. package/dist/adapters/memQueue.js +0 -20
  371. package/dist/adapters/mongo-client.d.ts.map +0 -1
  372. package/dist/adapters/mongo-client.js +0 -13
  373. package/dist/adapters/redis-client.d.ts.map +0 -1
  374. package/dist/adapters/redis-client.js +0 -94
  375. package/dist/api/ContextProvider.d.ts +0 -31
  376. package/dist/api/ContextProvider.d.ts.map +0 -1
  377. package/dist/api/ContextProvider.js +0 -38
  378. package/dist/api/codec.d.ts.map +0 -1
  379. package/dist/api/codec.js +0 -5
  380. package/dist/api/internal/RequestContextMiddleware.d.ts +0 -5
  381. package/dist/api/internal/RequestContextMiddleware.d.ts.map +0 -1
  382. package/dist/api/internal/RequestContextMiddleware.js +0 -35
  383. package/dist/api/internal/auth.d.ts +0 -15
  384. package/dist/api/internal/auth.d.ts.map +0 -1
  385. package/dist/api/internal/auth.js +0 -47
  386. package/dist/api/internal/events.d.ts +0 -9
  387. package/dist/api/internal/events.d.ts.map +0 -1
  388. package/dist/api/internal/events.js +0 -42
  389. package/dist/api/internal/health.d.ts.map +0 -1
  390. package/dist/api/internal/health.js +0 -5
  391. package/dist/api/layerUtils.d.ts.map +0 -1
  392. package/dist/api/layerUtils.js +0 -16
  393. package/dist/api/middlewares.d.ts.map +0 -1
  394. package/dist/api/reportError.d.ts.map +0 -1
  395. package/dist/api/reportError.js +0 -27
  396. package/dist/api/routing/middleware/RouterMiddleware.d.ts.map +0 -1
  397. package/dist/api/routing/middleware/middleware.d.ts +0 -9
  398. package/dist/api/routing/middleware/middleware.d.ts.map +0 -1
  399. package/dist/api/routing/middleware/middleware.js +0 -92
  400. package/dist/api/routing/middleware.d.ts.map +0 -1
  401. package/dist/api/routing/schema/jwt.d.ts.map +0 -1
  402. package/dist/api/routing/schema/jwt.js +0 -12
  403. package/dist/api/routing/tsort.d.ts.map +0 -1
  404. package/dist/api/routing/tsort.js +0 -51
  405. package/dist/api/routing/utils.d.ts.map +0 -1
  406. package/dist/api/routing/utils.js +0 -44
  407. package/dist/api/routing.d.ts +0 -138
  408. package/dist/api/routing.d.ts.map +0 -1
  409. package/dist/api/routing.js +0 -166
  410. package/dist/api/setupRequest.d.ts +0 -12
  411. package/dist/api/setupRequest.d.ts.map +0 -1
  412. package/dist/api/setupRequest.js +0 -44
  413. package/dist/api/util.d.ts.map +0 -1
  414. package/dist/api/util.js +0 -14
  415. package/eslint.config.mjs +0 -24
  416. package/src/Emailer/service.ts +0 -52
  417. package/src/Emailer.ts +0 -1
  418. package/src/Model/Repository/ext.ts +0 -283
  419. package/src/Model/Repository/internal/internal.ts +0 -577
  420. package/src/Model/Repository/legacy.ts +0 -27
  421. package/src/Model/Repository/makeRepo.ts +0 -139
  422. package/src/Model/Repository/service.ts +0 -627
  423. package/src/Model/Repository/validation.ts +0 -31
  424. package/src/Model/Repository.ts +0 -5
  425. package/src/Model/dsl.ts +0 -128
  426. package/src/Model/filter/filterApi.ts +0 -60
  427. package/src/Model/filter/types/errors.ts +0 -47
  428. package/src/Model/filter/types/fields.ts +0 -50
  429. package/src/Model/filter/types/path/common.ts +0 -404
  430. package/src/Model/filter/types/path/eager.ts +0 -298
  431. package/src/Model/filter/types/path/index.ts +0 -4
  432. package/src/Model/filter/types/utils.ts +0 -128
  433. package/src/Model/filter/types/validator.ts +0 -46
  434. package/src/Model/filter/types.ts +0 -6
  435. package/src/Model/query/dsl.ts +0 -2110
  436. package/src/Model/query/new-kid-interpreter.ts +0 -210
  437. package/src/Model/query.ts +0 -13
  438. package/src/Model.ts +0 -3
  439. package/src/Operations.ts +0 -235
  440. package/src/OperationsRepo.ts +0 -16
  441. package/src/QueueMaker/SQLQueue.ts +0 -189
  442. package/src/QueueMaker/memQueue.ts +0 -130
  443. package/src/QueueMaker/sbqueue.ts +0 -137
  444. package/src/QueueMaker/service.ts +0 -17
  445. package/src/RequestContext.ts +0 -63
  446. package/src/RequestFiberSet.ts +0 -105
  447. package/src/Store/ContextMapContainer.ts +0 -20
  448. package/src/Store/index.test.ts.bak +0 -112
  449. package/src/Store/service.ts +0 -184
  450. package/src/Store.ts +0 -1
  451. package/src/adapters/SQL.ts +0 -1
  452. package/src/adapters/ServiceBus.ts +0 -209
  453. package/src/adapters/index.ts +0 -0
  454. package/src/adapters/logger.ts +0 -3
  455. package/src/adapters/memQueue.ts +0 -21
  456. package/src/api/internal/auth.ts +0 -68
  457. package/src/api/middlewares.ts +0 -10
  458. package/src/api/routing/middleware/middleware.ts +0 -128
  459. package/src/api/routing/middleware.ts +0 -6
  460. package/src/api/routing.ts +0 -598
  461. package/src/api/setupRequest.ts +0 -84
  462. package/tsconfig.json.bak +0 -12
  463. /package/dist/{adapters/SQL.d.ts → SQL.d.ts} +0 -0
  464. /package/dist/{api/codec.d.ts → codec.d.ts} +0 -0
  465. /package/dist/{api/internal → internal}/health.d.ts +0 -0
  466. /package/dist/{api/middlewares.d.ts → middlewares.d.ts} +0 -0
  467. /package/dist/{api/routing → routing}/schema/jwt.d.ts +0 -0
  468. /package/dist/{api/routing → routing}/tsort.d.ts +0 -0
  469. /package/dist/{api/util.d.ts → util.d.ts} +0 -0
  470. /package/src/{api/codec.ts → codec.ts} +0 -0
  471. /package/src/{api/internal → internal}/health.ts +0 -0
  472. /package/src/{api/routing → routing}/tsort.ts +0 -0
  473. /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(wireSchema)
29
- const encodePublish = S.encodeEffect(wireSchemaJson)
30
- const drainW = S.Struct({ body: drainSchema, meta: QueueMeta })
31
- const drainWJson = S.fromJsonString(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(wireSchema)
25
- const encodePublish = S.encodeEffect(wireSchemaJson)
26
- const drainW = S.Struct({ body: drainSchema, meta: QueueMeta })
27
- const drainWJson = S.fromJsonString(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 { 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, Option, 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" && 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 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
- })