@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,34 +1,273 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
2
 
3
- import { Array, Effect, flow, type NonEmptyReadonlyArray, Option, Order, pipe, Ref, Result, Semaphore, ServiceMap, Struct } from "effect-app"
4
- import { NonEmptyString255 } from "effect-app/Schema"
5
- import { get } from "effect-app/utils"
6
- import { InfraLogger } from "../logger.js"
7
- import type { FieldValues } from "../Model/filter/types.js"
8
- import { codeFilter, codeFilter3_ } from "./codeFilter.js"
9
- import { type FilterArgs, type PersistenceModelType, type Store, type StoreConfig, StoreMaker } from "./service.js"
10
- import { makeUpdateETag } from "./utils.js"
3
+ import * as Array from "effect-app/Array"
4
+ import type { NonEmptyReadonlyArray } from "effect-app/Array"
5
+ import * as Effect from "effect-app/Effect"
6
+ import type { FilterResult } from "effect-app/Model/filter/filterApi"
7
+ import type { FieldValues } from "effect-app/Model/filter/types"
8
+ import type { AggregateIrExpression, ComputedProjectionIrExpression, ComputedProjectionMathIrExpression } from "effect-app/Model/query"
9
+ import * as Option from "effect-app/Option"
10
+ import { type FilterArgs, type PersistenceModelType, type Store, type StoreConfig, storeId, StoreMaker } from "effect-app/Store"
11
+ import { assertUnreachable } from "effect-app/utils"
12
+ import { flow, pipe } from "effect/Function"
13
+ import * as Order from "effect/Order"
14
+ import * as Ref from "effect/Ref"
15
+ import * as Result from "effect/Result"
16
+ import * as Semaphore from "effect/Semaphore"
17
+ import * as Struct from "effect/Struct"
18
+ import { InfraLogger } from "../logger.ts"
19
+ import { annotateDb } from "../otel.ts"
20
+ import { codeFilter, codeFilter3_ } from "./codeFilter.ts"
21
+ import { get, makeUpdateETag } from "./utils.ts"
22
+
23
+ export { get } from "./utils.ts"
24
+
25
+ const stripRelationFilterPaths = (state: readonly FilterResult[], relationPath: string): readonly FilterResult[] => {
26
+ const prefix = `${relationPath}.-1.`
27
+ return state.map((entry) =>
28
+ "path" in entry
29
+ ? {
30
+ ...entry,
31
+ path: entry.path.startsWith(prefix) ? entry.path.slice(prefix.length) : entry.path
32
+ }
33
+ : {
34
+ ...entry,
35
+ result: stripRelationFilterPaths(entry.result, relationPath)
36
+ }
37
+ )
38
+ }
39
+
40
+ const emptyValueFor = (tag: ComputedProjectionIrExpression["_tag"]) => {
41
+ switch (tag) {
42
+ case "relation-count":
43
+ case "relation-distinct-count":
44
+ case "relation-sum":
45
+ case "relation-sum-expr":
46
+ case "relation-sum-expr-normalized":
47
+ return 0
48
+ case "relation-sum-expr-by":
49
+ return [] as unknown[]
50
+ case "relation-any":
51
+ return false
52
+ case "relation-every":
53
+ return true
54
+ case "relation-collect":
55
+ return [] as unknown[]
56
+ case "relation-collect-fields":
57
+ return [] as unknown[]
58
+ case "relation-length":
59
+ return 0
60
+ default:
61
+ return assertUnreachable(tag)
62
+ }
63
+ }
64
+
65
+ const computeProjectionValue = (
66
+ row: FieldValues,
67
+ computed: ComputedProjectionIrExpression
68
+ ) => {
69
+ const relation = get(row, computed.path)
70
+ if (!Array.isArray(relation)) {
71
+ return emptyValueFor(computed._tag)
72
+ }
73
+ if (computed._tag === "relation-length") {
74
+ return relation.length
75
+ }
76
+ const filter = stripRelationFilterPaths(computed.filter, computed.path)
77
+ // empty filter = unconditional match (codeFilter3_ uses eval on a built
78
+ // string and chokes on `( )`, so short-circuit before invoking it).
79
+ const matches = filter.length === 0
80
+ ? (_value: unknown) => true
81
+ : (value: unknown) => codeFilter3_(filter, value)
82
+ const evalExpr = (value: unknown, expression: ComputedProjectionMathIrExpression): number => {
83
+ switch (expression._tag) {
84
+ case "field": {
85
+ const v = get(value, expression.field)
86
+ return typeof v === "number" ? v : Number(v) || 0
87
+ }
88
+ case "mul":
89
+ return evalExpr(value, expression.left) * evalExpr(value, expression.right)
90
+ default:
91
+ return assertUnreachable(expression)
92
+ }
93
+ }
94
+ switch (computed._tag) {
95
+ case "relation-count":
96
+ return relation.reduce<number>((acc, value) => matches(value) ? acc + 1 : acc, 0)
97
+ case "relation-any":
98
+ return relation.some(matches)
99
+ case "relation-every":
100
+ return relation.every(matches)
101
+ case "relation-distinct-count": {
102
+ const seen = new Set<unknown>()
103
+ for (const value of relation) {
104
+ if (matches(value)) seen.add(get(value, computed.field))
105
+ }
106
+ return seen.size
107
+ }
108
+ case "relation-sum":
109
+ return relation.reduce<number>((acc, value) => {
110
+ if (!matches(value)) return acc
111
+ const v = get(value, computed.field)
112
+ return acc + (typeof v === "number" ? v : Number(v) || 0)
113
+ }, 0)
114
+ case "relation-sum-expr":
115
+ return relation.reduce<number>((acc, value) => {
116
+ if (!matches(value)) return acc
117
+ return acc + evalExpr(value, computed.expression)
118
+ }, 0)
119
+ case "relation-sum-expr-by": {
120
+ const totals = new Map<unknown, number>()
121
+ for (const value of relation) {
122
+ if (!matches(value)) continue
123
+ const unit = get(value, computed.unit)
124
+ const current = totals.get(unit) ?? 0
125
+ totals.set(unit, current + evalExpr(value, computed.expression))
126
+ }
127
+ return [...totals.entries()].map(([unit, total]) => ({ unit, total }))
128
+ }
129
+ case "relation-sum-expr-normalized":
130
+ return relation.reduce<number>((acc, value) => {
131
+ if (!matches(value)) return acc
132
+ const unit = get(value, computed.unit)
133
+ const factor = unit === computed.toBase ? 1 : computed.factors[String(unit)]
134
+ if (factor === undefined || !Number.isFinite(factor)) return acc
135
+ return acc + evalExpr(value, computed.expression) * factor
136
+ }, 0)
137
+ case "relation-collect": {
138
+ const out: unknown[] = []
139
+ const seen = computed.distinct ? new Set<unknown>() : undefined
140
+ for (const value of relation) {
141
+ if (!matches(value)) continue
142
+ const v = get(value, computed.field)
143
+ if (seen) {
144
+ if (seen.has(v)) continue
145
+ seen.add(v)
146
+ }
147
+ out.push(v)
148
+ }
149
+ return out
150
+ }
151
+ case "relation-collect-fields": {
152
+ const out: unknown[] = []
153
+ const seen = computed.distinct ? new Set<unknown>() : undefined
154
+ for (const value of relation) {
155
+ if (!matches(value)) continue
156
+ for (const field of computed.fields) {
157
+ const v = get(value, field)
158
+ if (seen) {
159
+ if (seen.has(v)) continue
160
+ seen.add(v)
161
+ }
162
+ out.push(v)
163
+ }
164
+ }
165
+ return out
166
+ }
167
+ default:
168
+ return assertUnreachable(computed)
169
+ }
170
+ }
171
+
172
+ const computeAggregateValue = <T extends FieldValues>(rows: readonly T[], agg: AggregateIrExpression): unknown => {
173
+ switch (agg._tag) {
174
+ case "agg-count":
175
+ return rows.length
176
+ case "agg-count-when": {
177
+ const filter = agg.filter
178
+ const matches = filter.length === 0 ? () => true : (row: unknown) => codeFilter3_(filter, row)
179
+ return rows.filter((row) => matches(row)).length
180
+ }
181
+ case "agg-sum":
182
+ return rows.reduce<number>((acc, row) => {
183
+ const v = get(row, agg.field)
184
+ return acc + (typeof v === "number" ? v : Number(v) || 0)
185
+ }, 0)
186
+ case "agg-min": {
187
+ let min: unknown = undefined
188
+ for (const row of rows) {
189
+ const v = get(row, agg.field)
190
+ if (v == null) continue
191
+ if (min === undefined || v < (min as any)) min = v
192
+ }
193
+ return min ?? null
194
+ }
195
+ case "agg-max": {
196
+ let max: unknown = undefined
197
+ for (const row of rows) {
198
+ const v = get(row, agg.field)
199
+ if (v == null) continue
200
+ if (max === undefined || v > (max as any)) max = v
201
+ }
202
+ return max ?? null
203
+ }
204
+ default:
205
+ return assertUnreachable(agg)
206
+ }
207
+ }
11
208
 
12
209
  export function memFilter<T extends FieldValues, U extends keyof T = never>(f: FilterArgs<T, U>) {
13
210
  type M = U extends undefined ? T : Pick<T, U>
14
211
  return ((c: T[]): M[] => {
15
- const select = (r: T[]): M[] => {
16
- const sel = f.select
212
+ const sel = f.select
213
+
214
+ const selectPerRow = (r: T[]): M[] => {
17
215
  if (!sel) return r as M[]
216
+
217
+ // Detect aggregate mode: any select item has `aggregate` key
218
+ const hasAggregates = sel.some((s) => typeof s === "object" && s !== null && "aggregate" in s)
219
+ if (hasAggregates) {
220
+ // GROUP BY + aggregate
221
+ const fieldItems = sel.filter((s): s is { key: string; path: string } =>
222
+ typeof s === "object" && s !== null && "path" in s && !("aggregate" in s)
223
+ )
224
+ const aggregateItems = sel.filter((s): s is { key: string; aggregate: AggregateIrExpression } =>
225
+ typeof s === "object" && s !== null && "aggregate" in s
226
+ )
227
+ const groups = new Map<string, T[]>()
228
+ for (const row of r) {
229
+ const key = fieldItems.map((fi) => JSON.stringify(get(row, fi.path))).join("\0")
230
+ const existing = groups.get(key) ?? []
231
+ existing.push(row)
232
+ groups.set(key, existing)
233
+ }
234
+ return [...groups.values()].map((rows) => {
235
+ const result: Record<string, unknown> = {}
236
+ for (const fi of fieldItems) result[fi.key] = get(rows[0]!, fi.path)
237
+ for (const ai of aggregateItems) result[ai.key] = computeAggregateValue(rows, ai.aggregate)
238
+ return result as M
239
+ })
240
+ }
241
+
18
242
  return r.map((i) => {
19
- const [keys, subKeys] = pipe(
243
+ const [keys, entries] = pipe(
20
244
  sel,
21
- Array.partition((r) =>
22
- typeof r === "string" ? Result.fail(String(r)) : Result.succeed(r as { key: string; subKeys: string[] })
23
- )
245
+ Array.partition((entry) => typeof entry === "string" ? Result.fail(String(entry)) : Result.succeed(entry))
246
+ )
247
+ const subKeys = entries.filter((entry): entry is { key: string; subKeys: readonly string[] } =>
248
+ typeof entry === "object" && entry !== null && "subKeys" in entry
249
+ )
250
+ const computedKeys = entries.filter((entry): entry is {
251
+ key: string
252
+ computed: ComputedProjectionIrExpression
253
+ } => typeof entry === "object" && entry !== null && "computed" in entry)
254
+ const pathKeys = entries.filter((entry): entry is { key: string; path: string } =>
255
+ typeof entry === "object" && entry !== null && "path" in entry && !("aggregate" in entry)
24
256
  )
25
257
  const n = Struct.pick(i, keys)
26
258
  subKeys.forEach((subKey) => {
27
- n[subKey.key] = i[subKey.key]!.map(Struct.pick(subKey.subKeys))
259
+ n[subKey.key] = i[subKey.key]!.map(Struct.pick(subKey.subKeys as never[]))
260
+ })
261
+ computedKeys.forEach((entry) => {
262
+ ;(n as Record<string, unknown>)[entry.key] = computeProjectionValue(i, entry.computed)
263
+ })
264
+ pathKeys.forEach((entry) => {
265
+ ;(n as Record<string, unknown>)[entry.key] = get(i, entry.path)
28
266
  })
29
267
  return n as M
30
- }) as any
268
+ })
31
269
  }
270
+
32
271
  const skip = f?.skip
33
272
  const limit = f?.limit
34
273
  const ords = Option.map(Option.fromNullishOr(f.order), (_) =>
@@ -50,7 +289,7 @@ export function memFilter<T extends FieldValues, U extends keyof T = never>(f: F
50
289
  c = Array.sortBy(...ords.value)(c)
51
290
  }
52
291
  if (!skip && limit === 1) {
53
- return select(
292
+ return selectPerRow(
54
293
  Array.findFirst(c, f.filter ? codeFilter(f.filter) : (_) => Option.some(_)).pipe(
55
294
  Option.map(Array.make),
56
295
  Option.getOrElse(
@@ -67,15 +306,10 @@ export function memFilter<T extends FieldValues, U extends keyof T = never>(f: F
67
306
  r = Array.take(r, limit)
68
307
  }
69
308
 
70
- return select(r)
309
+ return selectPerRow(r)
71
310
  })
72
311
  }
73
312
 
74
- const defaultNs: NonEmptyString255 = NonEmptyString255("primary")
75
- export class storeId
76
- extends ServiceMap.Reference("StoreId", { defaultValue: (): NonEmptyString255 => defaultNs })
77
- {}
78
-
79
313
  function logQuery(f: FilterArgs<any, any>, defaultValues?: any) {
80
314
  return InfraLogger
81
315
  .logDebug("mem query")
@@ -153,43 +387,55 @@ export function makeMemoryStoreInt<IdKey extends keyof Encoded, Encoded extends
153
387
  withPermit
154
388
  )
155
389
  const s: Store<IdKey, Encoded> = {
390
+ seedNamespace: () => Effect.void,
391
+
156
392
  queryRaw: (query) =>
157
393
  all
158
394
  .pipe(
159
395
  // Effect.tap(() => logQuery(query, defaultValues)),
160
396
  Effect.map(query.memory),
161
- Effect.withSpan("Memory.queryRaw [effect-app/infra/Store]", {
162
- attributes: { "repository.model_name": modelName, "repository.namespace": namespace }
163
- }, { captureStackTrace: false })
397
+ annotateDb({
398
+ operation: "queryRaw",
399
+ system: "memory",
400
+ collection: modelName,
401
+ namespace,
402
+ entity: modelName
403
+ })
164
404
  ),
165
405
 
166
- all: all.pipe(Effect.withSpan("Memory.all [effect-app/infra/Store]", {
167
- attributes: {
168
- modelName,
169
- namespace
170
- }
171
- }, { captureStackTrace: false })),
406
+ all: all.pipe(annotateDb({
407
+ operation: "all",
408
+ system: "memory",
409
+ collection: modelName,
410
+ namespace,
411
+ entity: modelName
412
+ })),
172
413
  find: (id) =>
173
414
  Ref
174
415
  .get(store)
175
416
  .pipe(
176
417
  Effect.map((_) => Option.fromNullishOr(_.get(id))),
177
- Effect
178
- .withSpan("Memory.find [effect-app/infra/Store]", {
179
- attributes: {
180
- modelName,
181
- namespace
182
- }
183
- }, { captureStackTrace: false })
418
+ annotateDb({
419
+ operation: "find",
420
+ system: "memory",
421
+ collection: modelName,
422
+ namespace,
423
+ entity: modelName,
424
+ extra: { "app.entity.id": id as unknown }
425
+ })
184
426
  ),
185
427
  filter: (f) =>
186
428
  all
187
429
  .pipe(
188
430
  Effect.tap(() => logQuery(f, defaultValues)),
189
431
  Effect.map(memFilter(f)),
190
- Effect.withSpan("Memory.filter [effect-app/infra/Store]", {
191
- attributes: { "repository.model_name": modelName, "repository.namespace": namespace }
192
- }, { captureStackTrace: false })
432
+ annotateDb({
433
+ operation: "filter",
434
+ system: "memory",
435
+ collection: modelName,
436
+ namespace,
437
+ entity: modelName
438
+ })
193
439
  ),
194
440
  set: (e) =>
195
441
  s
@@ -204,10 +450,14 @@ export function makeMemoryStoreInt<IdKey extends keyof Encoded, Encoded extends
204
450
  )
205
451
  ),
206
452
  withPermit,
207
- Effect
208
- .withSpan("Memory.set [effect-app/infra/Store]", {
209
- attributes: { "repository.model_name": modelName, "repository.namespace": namespace }
210
- }, { captureStackTrace: false })
453
+ annotateDb({
454
+ operation: "set",
455
+ system: "memory",
456
+ collection: modelName,
457
+ namespace,
458
+ entity: modelName,
459
+ extra: { "app.entity.id": e[idKey] as unknown }
460
+ })
211
461
  ),
212
462
  batchRemove: (items: NonEmptyReadonlyArray<Encoded[IdKey]>) =>
213
463
  pipe(
@@ -218,10 +468,13 @@ export function makeMemoryStoreInt<IdKey extends keyof Encoded, Encoded extends
218
468
  Effect.filterOrFail((_) => _.length <= 100, () => "BatchRemove: a batch may not exceed 100 items"),
219
469
  Effect.orDie,
220
470
  Effect.andThen(batchRemove),
221
- Effect
222
- .withSpan("Memory.batchRemove [effect-app/infra/Store]", {
223
- attributes: { "repository.model_name": modelName, "repository.namespace": namespace }
224
- }, { captureStackTrace: false })
471
+ annotateDb({
472
+ operation: "batchRemove",
473
+ system: "memory",
474
+ collection: modelName,
475
+ namespace,
476
+ entity: modelName
477
+ })
225
478
  )
226
479
  ),
227
480
  batchSet: (items: readonly [PM, ...PM[]]) =>
@@ -233,18 +486,25 @@ export function makeMemoryStoreInt<IdKey extends keyof Encoded, Encoded extends
233
486
  Effect.filterOrFail((_) => _.length <= 100, () => "BatchSet: a batch may not exceed 100 items"),
234
487
  Effect.orDie,
235
488
  Effect.andThen(batchSet),
236
- Effect
237
- .withSpan("Memory.batchSet [effect-app/infra/Store]", {
238
- attributes: { "repository.model_name": modelName, "repository.namespace": namespace }
239
- }, { captureStackTrace: false })
489
+ annotateDb({
490
+ operation: "batchSet",
491
+ system: "memory",
492
+ collection: modelName,
493
+ namespace,
494
+ entity: modelName
495
+ })
240
496
  )
241
497
  ),
242
498
  bulkSet: flow(
243
499
  batchSet,
244
500
  (_) =>
245
- _.pipe(Effect.withSpan("Memory.bulkSet [effect-app/infra/Store]", {
246
- attributes: { "repository.model_name": modelName, "repository.namespace": namespace }
247
- }, { captureStackTrace: false }))
501
+ _.pipe(annotateDb({
502
+ operation: "bulkSet",
503
+ system: "memory",
504
+ collection: modelName,
505
+ namespace,
506
+ entity: modelName
507
+ }))
248
508
  )
249
509
  }
250
510
  return s
@@ -252,56 +512,60 @@ export function makeMemoryStoreInt<IdKey extends keyof Encoded, Encoded extends
252
512
  }
253
513
 
254
514
  export const makeMemoryStore = () => ({
255
- make: <IdKey extends keyof Encoded, Encoded extends FieldValues, R, E>(
515
+ make: Effect.fnUntraced(function*<IdKey extends keyof Encoded, Encoded extends FieldValues, R, E>(
256
516
  modelName: string,
257
517
  idKey: IdKey,
258
518
  seed?: Effect.Effect<Iterable<Encoded>, E, R>,
259
519
  config?: StoreConfig<Encoded>
260
- ) =>
261
- Effect.gen(function*() {
262
- const storesSem = Semaphore.makeUnsafe(1)
263
- const primary = yield* makeMemoryStoreInt<IdKey, Encoded, R, E>(
264
- modelName,
265
- idKey,
266
- "primary",
267
- seed,
268
- config?.defaultValues
269
- )
270
- const ctx = yield* Effect.services<R>()
271
- const stores = new Map([["primary", primary]])
272
- const getStore = !config?.allowNamespace
273
- ? Effect.succeed(primary)
274
- : storeId.asEffect().pipe(Effect.flatMap((namespace) => {
275
- const store = stores.get(namespace)
276
- if (store) {
277
- return Effect.succeed(store)
278
- }
279
- if (!config.allowNamespace!(namespace)) {
280
- throw new Error(`Namespace ${namespace} not allowed!`)
281
- }
282
- return storesSem.withPermits(1)(Effect.suspend(() => {
283
- const store = stores.get(namespace)
284
- if (store) return Effect.sync(() => store)
285
- return makeMemoryStoreInt(modelName, idKey, namespace, seed, config?.defaultValues)
286
- .pipe(
287
- Effect.orDie,
288
- Effect.provide(ctx),
289
- Effect.tap((store) => Effect.sync(() => stores.set(namespace, store)))
290
- )
291
- }))
292
- }))
293
- const s: Store<IdKey, Encoded> = {
294
- all: Effect.flatMap(getStore, (_) => _.all),
295
- queryRaw: (...args) => Effect.flatMap(getStore, (_) => _.queryRaw(...args)),
296
- find: (...args) => Effect.flatMap(getStore, (_) => _.find(...args)),
297
- filter: (...args) => Effect.flatMap(getStore, (_) => _.filter(...args)),
298
- set: (...args) => Effect.flatMap(getStore, (_) => _.set(...args)),
299
- batchSet: (...args) => Effect.flatMap(getStore, (_) => _.batchSet(...args)),
300
- bulkSet: (...args) => Effect.flatMap(getStore, (_) => _.bulkSet(...args)),
301
- batchRemove: (...args) => Effect.flatMap(getStore, (_) => _.batchRemove(...args))
520
+ ) {
521
+ const primary = yield* makeMemoryStoreInt<IdKey, Encoded, R, E>(
522
+ modelName,
523
+ idKey,
524
+ "primary",
525
+ seed,
526
+ config?.defaultValues
527
+ )
528
+ const ctx = yield* Effect.context<R>()
529
+ const stores = new Map([["primary", primary]])
530
+ const semaphores = new Map<string, Semaphore.Semaphore>()
531
+ const getSem = (ns: string) => {
532
+ let sem = semaphores.get(ns)
533
+ if (!sem) {
534
+ sem = Semaphore.makeUnsafe(1)
535
+ semaphores.set(ns, sem)
302
536
  }
303
- return s
304
- })
537
+ return sem
538
+ }
539
+ const ensureStore = (namespace: string) =>
540
+ getSem(namespace).withPermits(1)(Effect.suspend(() => {
541
+ const store = stores.get(namespace)
542
+ if (store) return Effect.succeed(store)
543
+ if (config?.allowNamespace && !config.allowNamespace(namespace)) {
544
+ throw new Error(`Namespace ${namespace} not allowed!`)
545
+ }
546
+ return makeMemoryStoreInt(modelName, idKey, namespace, seed, config?.defaultValues)
547
+ .pipe(
548
+ Effect.orDie,
549
+ Effect.provide(ctx),
550
+ Effect.tap((store) => Effect.sync(() => stores.set(namespace, store)))
551
+ )
552
+ }))
553
+ const getStore = !config?.allowNamespace
554
+ ? Effect.succeed(primary)
555
+ : storeId.pipe(Effect.flatMap((namespace) => ensureStore(namespace)))
556
+ const s: Store<IdKey, Encoded> = {
557
+ seedNamespace: (namespace) => ensureStore(namespace).pipe(Effect.asVoid),
558
+ all: Effect.flatMap(getStore, (_) => _.all),
559
+ queryRaw: (...args) => Effect.flatMap(getStore, (_) => _.queryRaw(...args)),
560
+ find: (...args) => Effect.flatMap(getStore, (_) => _.find(...args)),
561
+ filter: (...args) => Effect.flatMap(getStore, (_) => _.filter(...args)),
562
+ set: (...args) => Effect.flatMap(getStore, (_) => _.set(...args)),
563
+ batchSet: (...args) => Effect.flatMap(getStore, (_) => _.batchSet(...args)),
564
+ bulkSet: (...args) => Effect.flatMap(getStore, (_) => _.bulkSet(...args)),
565
+ batchRemove: (...args) => Effect.flatMap(getStore, (_) => _.batchRemove(...args))
566
+ }
567
+ return s
568
+ })
305
569
  })
306
570
 
307
571
  export const MemoryStoreLive = StoreMaker.toLayer(Effect.sync(() => makeMemoryStore()))