@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,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
259
  n[subKey.key] = i[subKey.key]!.map(Struct.pick(subKey.subKeys as never[]))
28
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)
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,13 +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 extends ServiceMap.Reference("StoreId", { defaultValue: (): NonEmptyString255 => defaultNs }) {}
76
-
77
313
  function logQuery(f: FilterArgs<any, any>, defaultValues?: any) {
78
314
  return InfraLogger
79
315
  .logDebug("mem query")
@@ -151,43 +387,55 @@ export function makeMemoryStoreInt<IdKey extends keyof Encoded, Encoded extends
151
387
  withPermit
152
388
  )
153
389
  const s: Store<IdKey, Encoded> = {
390
+ seedNamespace: () => Effect.void,
391
+
154
392
  queryRaw: (query) =>
155
393
  all
156
394
  .pipe(
157
395
  // Effect.tap(() => logQuery(query, defaultValues)),
158
396
  Effect.map(query.memory),
159
- Effect.withSpan("Memory.queryRaw [effect-app/infra/Store]", {
160
- attributes: { "repository.model_name": modelName, "repository.namespace": namespace }
161
- }, { captureStackTrace: false })
397
+ annotateDb({
398
+ operation: "queryRaw",
399
+ system: "memory",
400
+ collection: modelName,
401
+ namespace,
402
+ entity: modelName
403
+ })
162
404
  ),
163
405
 
164
- all: all.pipe(Effect.withSpan("Memory.all [effect-app/infra/Store]", {
165
- attributes: {
166
- modelName,
167
- namespace
168
- }
169
- }, { captureStackTrace: false })),
406
+ all: all.pipe(annotateDb({
407
+ operation: "all",
408
+ system: "memory",
409
+ collection: modelName,
410
+ namespace,
411
+ entity: modelName
412
+ })),
170
413
  find: (id) =>
171
414
  Ref
172
415
  .get(store)
173
416
  .pipe(
174
417
  Effect.map((_) => Option.fromNullishOr(_.get(id))),
175
- Effect
176
- .withSpan("Memory.find [effect-app/infra/Store]", {
177
- attributes: {
178
- modelName,
179
- namespace
180
- }
181
- }, { captureStackTrace: false })
418
+ annotateDb({
419
+ operation: "find",
420
+ system: "memory",
421
+ collection: modelName,
422
+ namespace,
423
+ entity: modelName,
424
+ extra: { "app.entity.id": id }
425
+ })
182
426
  ),
183
427
  filter: (f) =>
184
428
  all
185
429
  .pipe(
186
430
  Effect.tap(() => logQuery(f, defaultValues)),
187
431
  Effect.map(memFilter(f)),
188
- Effect.withSpan("Memory.filter [effect-app/infra/Store]", {
189
- attributes: { "repository.model_name": modelName, "repository.namespace": namespace }
190
- }, { captureStackTrace: false })
432
+ annotateDb({
433
+ operation: "filter",
434
+ system: "memory",
435
+ collection: modelName,
436
+ namespace,
437
+ entity: modelName
438
+ })
191
439
  ),
192
440
  set: (e) =>
193
441
  s
@@ -202,10 +450,14 @@ export function makeMemoryStoreInt<IdKey extends keyof Encoded, Encoded extends
202
450
  )
203
451
  ),
204
452
  withPermit,
205
- Effect
206
- .withSpan("Memory.set [effect-app/infra/Store]", {
207
- attributes: { "repository.model_name": modelName, "repository.namespace": namespace }
208
- }, { 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] }
460
+ })
209
461
  ),
210
462
  batchRemove: (items: NonEmptyReadonlyArray<Encoded[IdKey]>) =>
211
463
  pipe(
@@ -216,10 +468,13 @@ export function makeMemoryStoreInt<IdKey extends keyof Encoded, Encoded extends
216
468
  Effect.filterOrFail((_) => _.length <= 100, () => "BatchRemove: a batch may not exceed 100 items"),
217
469
  Effect.orDie,
218
470
  Effect.andThen(batchRemove),
219
- Effect
220
- .withSpan("Memory.batchRemove [effect-app/infra/Store]", {
221
- attributes: { "repository.model_name": modelName, "repository.namespace": namespace }
222
- }, { captureStackTrace: false })
471
+ annotateDb({
472
+ operation: "batchRemove",
473
+ system: "memory",
474
+ collection: modelName,
475
+ namespace,
476
+ entity: modelName
477
+ })
223
478
  )
224
479
  ),
225
480
  batchSet: (items: readonly [PM, ...PM[]]) =>
@@ -231,18 +486,25 @@ export function makeMemoryStoreInt<IdKey extends keyof Encoded, Encoded extends
231
486
  Effect.filterOrFail((_) => _.length <= 100, () => "BatchSet: a batch may not exceed 100 items"),
232
487
  Effect.orDie,
233
488
  Effect.andThen(batchSet),
234
- Effect
235
- .withSpan("Memory.batchSet [effect-app/infra/Store]", {
236
- attributes: { "repository.model_name": modelName, "repository.namespace": namespace }
237
- }, { captureStackTrace: false })
489
+ annotateDb({
490
+ operation: "batchSet",
491
+ system: "memory",
492
+ collection: modelName,
493
+ namespace,
494
+ entity: modelName
495
+ })
238
496
  )
239
497
  ),
240
498
  bulkSet: flow(
241
499
  batchSet,
242
500
  (_) =>
243
- _.pipe(Effect.withSpan("Memory.bulkSet [effect-app/infra/Store]", {
244
- attributes: { "repository.model_name": modelName, "repository.namespace": namespace }
245
- }, { captureStackTrace: false }))
501
+ _.pipe(annotateDb({
502
+ operation: "bulkSet",
503
+ system: "memory",
504
+ collection: modelName,
505
+ namespace,
506
+ entity: modelName
507
+ }))
246
508
  )
247
509
  }
248
510
  return s
@@ -250,56 +512,60 @@ export function makeMemoryStoreInt<IdKey extends keyof Encoded, Encoded extends
250
512
  }
251
513
 
252
514
  export const makeMemoryStore = () => ({
253
- make: <IdKey extends keyof Encoded, Encoded extends FieldValues, R, E>(
515
+ make: Effect.fnUntraced(function*<IdKey extends keyof Encoded, Encoded extends FieldValues, R, E>(
254
516
  modelName: string,
255
517
  idKey: IdKey,
256
518
  seed?: Effect.Effect<Iterable<Encoded>, E, R>,
257
519
  config?: StoreConfig<Encoded>
258
- ) =>
259
- Effect.gen(function*() {
260
- const storesSem = Semaphore.makeUnsafe(1)
261
- const primary = yield* makeMemoryStoreInt<IdKey, Encoded, R, E>(
262
- modelName,
263
- idKey,
264
- "primary",
265
- seed,
266
- config?.defaultValues
267
- )
268
- const ctx = yield* Effect.services<R>()
269
- const stores = new Map([["primary", primary]])
270
- const getStore = !config?.allowNamespace
271
- ? Effect.succeed(primary)
272
- : storeId.asEffect().pipe(Effect.flatMap((namespace) => {
273
- const store = stores.get(namespace)
274
- if (store) {
275
- return Effect.succeed(store)
276
- }
277
- if (!config.allowNamespace!(namespace)) {
278
- throw new Error(`Namespace ${namespace} not allowed!`)
279
- }
280
- return storesSem.withPermits(1)(Effect.suspend(() => {
281
- const store = stores.get(namespace)
282
- if (store) return Effect.sync(() => store)
283
- return makeMemoryStoreInt(modelName, idKey, namespace, seed, config?.defaultValues)
284
- .pipe(
285
- Effect.orDie,
286
- Effect.provide(ctx),
287
- Effect.tap((store) => Effect.sync(() => stores.set(namespace, store)))
288
- )
289
- }))
290
- }))
291
- const s: Store<IdKey, Encoded> = {
292
- all: Effect.flatMap(getStore, (_) => _.all),
293
- queryRaw: (...args) => Effect.flatMap(getStore, (_) => _.queryRaw(...args)),
294
- find: (...args) => Effect.flatMap(getStore, (_) => _.find(...args)),
295
- filter: (...args) => Effect.flatMap(getStore, (_) => _.filter(...args)),
296
- set: (...args) => Effect.flatMap(getStore, (_) => _.set(...args)),
297
- batchSet: (...args) => Effect.flatMap(getStore, (_) => _.batchSet(...args)),
298
- bulkSet: (...args) => Effect.flatMap(getStore, (_) => _.bulkSet(...args)),
299
- 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)
300
536
  }
301
- return s
302
- })
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
+ })
303
569
  })
304
570
 
305
571
  export const MemoryStoreLive = StoreMaker.toLayer(Effect.sync(() => makeMemoryStore()))