@effect-app/infra 4.0.0-beta.26 → 4.0.0-beta.260

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 (503) hide show
  1. package/CHANGELOG.md +1966 -0
  2. package/_check.sh +1 -1
  3. package/dist/CUPS.d.ts +30 -11
  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 +487 -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 +111 -147
  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 +2 -2
  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 -9
  22. package/dist/MainFiberSet.d.ts.map +1 -1
  23. package/dist/MainFiberSet.js +10 -6
  24. package/dist/QueueMaker/SQLQueue.d.ts +8 -9
  25. package/dist/QueueMaker/SQLQueue.d.ts.map +1 -1
  26. package/dist/QueueMaker/SQLQueue.js +138 -120
  27. package/dist/QueueMaker/errors.d.ts +5 -3
  28. package/dist/QueueMaker/errors.d.ts.map +1 -1
  29. package/dist/QueueMaker/errors.js +4 -2
  30. package/dist/QueueMaker/memQueue.d.ts +10 -6
  31. package/dist/QueueMaker/memQueue.d.ts.map +1 -1
  32. package/dist/QueueMaker/memQueue.js +84 -68
  33. package/dist/QueueMaker/sbqueue.d.ts +9 -5
  34. package/dist/QueueMaker/sbqueue.d.ts.map +1 -1
  35. package/dist/QueueMaker/sbqueue.js +60 -58
  36. package/dist/RequestFiberSet.d.ts +10 -7
  37. package/dist/RequestFiberSet.d.ts.map +1 -1
  38. package/dist/RequestFiberSet.js +13 -8
  39. package/dist/SQL/Model.d.ts +468 -0
  40. package/dist/SQL/Model.d.ts.map +1 -0
  41. package/dist/SQL/Model.js +469 -0
  42. package/dist/SQL.d.ts +2 -0
  43. package/dist/SQL.d.ts.map +1 -0
  44. package/dist/{adapters/SQL.js → SQL.js} +1 -1
  45. package/dist/ServiceBus.d.ts +61 -0
  46. package/dist/ServiceBus.d.ts.map +1 -0
  47. package/dist/ServiceBus.js +108 -0
  48. package/dist/Store/Cosmos/query.d.ts +15 -4
  49. package/dist/Store/Cosmos/query.d.ts.map +1 -1
  50. package/dist/Store/Cosmos/query.js +179 -41
  51. package/dist/Store/Cosmos.d.ts +3 -3
  52. package/dist/Store/Cosmos.d.ts.map +1 -1
  53. package/dist/Store/Cosmos.js +344 -246
  54. package/dist/Store/Disk.d.ts +5 -5
  55. package/dist/Store/Disk.d.ts.map +1 -1
  56. package/dist/Store/Disk.js +78 -38
  57. package/dist/Store/Memory.d.ts +7 -10
  58. package/dist/Store/Memory.d.ts.map +1 -1
  59. package/dist/Store/Memory.js +326 -66
  60. package/dist/Store/SQL/Pg.d.ts +4 -0
  61. package/dist/Store/SQL/Pg.d.ts.map +1 -0
  62. package/dist/Store/SQL/Pg.js +232 -0
  63. package/dist/Store/SQL/query.d.ts +49 -0
  64. package/dist/Store/SQL/query.d.ts.map +1 -0
  65. package/dist/Store/SQL/query.js +527 -0
  66. package/dist/Store/SQL.d.ts +21 -0
  67. package/dist/Store/SQL.d.ts.map +1 -0
  68. package/dist/Store/SQL.js +449 -0
  69. package/dist/Store/codeFilter.d.ts +5 -5
  70. package/dist/Store/codeFilter.d.ts.map +1 -1
  71. package/dist/Store/codeFilter.js +6 -3
  72. package/dist/Store/index.d.ts +7 -5
  73. package/dist/Store/index.d.ts.map +1 -1
  74. package/dist/Store/index.js +18 -5
  75. package/dist/Store/utils.d.ts +4 -3
  76. package/dist/Store/utils.d.ts.map +1 -1
  77. package/dist/Store/utils.js +5 -5
  78. package/dist/WorkflowEngineCosmos.d.ts +29 -0
  79. package/dist/WorkflowEngineCosmos.d.ts.map +1 -0
  80. package/dist/WorkflowEngineCosmos.js +521 -0
  81. package/dist/WorkflowEngineSqlite.d.ts +24 -0
  82. package/dist/WorkflowEngineSqlite.d.ts.map +1 -0
  83. package/dist/WorkflowEngineSqlite.js +550 -0
  84. package/dist/arbs.d.ts +2 -2
  85. package/dist/arbs.d.ts.map +1 -1
  86. package/dist/arbs.js +5 -3
  87. package/dist/codec.d.ts +5 -0
  88. package/dist/codec.d.ts.map +1 -0
  89. package/dist/codec.js +5 -0
  90. package/dist/cosmos-client.d.ts +16 -0
  91. package/dist/cosmos-client.d.ts.map +1 -0
  92. package/dist/cosmos-client.js +11 -0
  93. package/dist/errorReporter.d.ts +7 -5
  94. package/dist/errorReporter.d.ts.map +1 -1
  95. package/dist/errorReporter.js +23 -27
  96. package/dist/errors.d.ts +1 -1
  97. package/dist/fileUtil.d.ts +2 -2
  98. package/dist/fileUtil.d.ts.map +1 -1
  99. package/dist/fileUtil.js +2 -2
  100. package/dist/index.d.ts +3 -2
  101. package/dist/index.d.ts.map +1 -1
  102. package/dist/index.js +3 -2
  103. package/dist/internal/RequestContextMiddleware.d.ts +5 -0
  104. package/dist/internal/RequestContextMiddleware.d.ts.map +1 -0
  105. package/dist/internal/RequestContextMiddleware.js +45 -0
  106. package/dist/internal/auth.d.ts +53 -0
  107. package/dist/internal/auth.d.ts.map +1 -0
  108. package/dist/internal/auth.js +180 -0
  109. package/dist/internal/events.d.ts +11 -0
  110. package/dist/internal/events.d.ts.map +1 -0
  111. package/dist/internal/events.js +49 -0
  112. package/dist/internal/health.d.ts +3 -0
  113. package/dist/internal/health.d.ts.map +1 -0
  114. package/dist/internal/health.js +5 -0
  115. package/dist/layerUtils.d.ts +32 -0
  116. package/dist/layerUtils.d.ts.map +1 -0
  117. package/dist/layerUtils.js +17 -0
  118. package/dist/logger/jsonLogger.d.ts +2 -2
  119. package/dist/logger/jsonLogger.d.ts.map +1 -1
  120. package/dist/logger/jsonLogger.js +5 -3
  121. package/dist/logger/logFmtLogger.d.ts +2 -2
  122. package/dist/logger/logFmtLogger.d.ts.map +1 -1
  123. package/dist/logger/logFmtLogger.js +3 -3
  124. package/dist/logger/shared.d.ts +3 -3
  125. package/dist/logger/shared.d.ts.map +1 -1
  126. package/dist/logger/shared.js +5 -5
  127. package/dist/logger.d.ts +1 -1
  128. package/dist/logger.d.ts.map +1 -1
  129. package/dist/memQueue.d.ts +15 -0
  130. package/dist/memQueue.d.ts.map +1 -0
  131. package/dist/memQueue.js +21 -0
  132. package/dist/middlewares.d.ts +10 -0
  133. package/dist/middlewares.d.ts.map +1 -0
  134. package/dist/{api/middlewares.js → middlewares.js} +1 -1
  135. package/dist/mongo-client.d.ts +11 -0
  136. package/dist/mongo-client.d.ts.map +1 -0
  137. package/dist/mongo-client.js +15 -0
  138. package/dist/otel.d.ts +75 -0
  139. package/dist/otel.d.ts.map +1 -0
  140. package/dist/otel.js +65 -0
  141. package/dist/rateLimit.d.ts +12 -4
  142. package/dist/rateLimit.d.ts.map +1 -1
  143. package/dist/rateLimit.js +7 -12
  144. package/dist/redis-client.d.ts +42 -0
  145. package/dist/redis-client.d.ts.map +1 -0
  146. package/dist/redis-client.js +98 -0
  147. package/dist/reportError.d.ts +4 -0
  148. package/dist/reportError.d.ts.map +1 -0
  149. package/dist/reportError.js +28 -0
  150. package/dist/routing/middleware/RouterMiddleware.d.ts +16 -0
  151. package/dist/routing/middleware/RouterMiddleware.d.ts.map +1 -0
  152. package/dist/{api/routing → routing}/middleware/RouterMiddleware.js +1 -1
  153. package/dist/routing/middleware/middleware.d.ts +48 -0
  154. package/dist/routing/middleware/middleware.d.ts.map +1 -0
  155. package/dist/routing/middleware/middleware.js +128 -0
  156. package/dist/routing/middleware.d.ts +3 -0
  157. package/dist/routing/middleware.d.ts.map +1 -0
  158. package/dist/{api/routing → routing}/middleware.js +1 -2
  159. package/dist/routing/schema/jwt.d.ts +4 -0
  160. package/dist/routing/schema/jwt.d.ts.map +1 -0
  161. package/dist/routing/schema/jwt.js +13 -0
  162. package/dist/routing/tsort.d.ts +8 -0
  163. package/dist/routing/tsort.d.ts.map +1 -0
  164. package/dist/routing/tsort.js +51 -0
  165. package/dist/routing/utils.d.ts +19 -0
  166. package/dist/routing/utils.d.ts.map +1 -0
  167. package/dist/routing/utils.js +45 -0
  168. package/dist/routing.d.ts +184 -0
  169. package/dist/routing.d.ts.map +1 -0
  170. package/dist/routing.js +236 -0
  171. package/dist/test.d.ts +3 -3
  172. package/dist/test.d.ts.map +1 -1
  173. package/dist/test.js +2 -2
  174. package/dist/util.d.ts +3 -0
  175. package/dist/util.d.ts.map +1 -0
  176. package/dist/util.js +14 -0
  177. package/dist/vitest.d.ts +1 -1
  178. package/docs/cluster-storage.md +26 -0
  179. package/docs/workflow-engine.md +262 -0
  180. package/examples/query.ts +47 -39
  181. package/package.json +31 -345
  182. package/run.sh +1 -0
  183. package/src/CUPS.ts +52 -13
  184. package/src/ClusterCosmos.ts +954 -0
  185. package/src/ClusterServiceBus.ts +242 -0
  186. package/src/{api/ContextProvider.ts → ContextProvider.ts} +19 -16
  187. package/src/Emailer/Sendgrid.ts +82 -59
  188. package/src/Emailer/fake.ts +3 -3
  189. package/src/MainFiberSet.ts +12 -10
  190. package/src/QueueMaker/SQLQueue.ts +153 -156
  191. package/src/QueueMaker/errors.ts +3 -1
  192. package/src/QueueMaker/memQueue.ts +113 -107
  193. package/src/QueueMaker/sbqueue.ts +78 -90
  194. package/src/RequestFiberSet.ts +13 -8
  195. package/src/{adapters/SQL → SQL}/Model.ts +42 -41
  196. package/src/ServiceBus.ts +219 -0
  197. package/src/Store/Cosmos/query.ts +216 -52
  198. package/src/Store/Cosmos.ts +493 -353
  199. package/src/Store/Disk.ts +109 -69
  200. package/src/Store/Memory.ts +365 -96
  201. package/src/Store/SQL/Pg.ts +363 -0
  202. package/src/Store/SQL/query.ts +603 -0
  203. package/src/Store/SQL.ts +735 -0
  204. package/src/Store/codeFilter.ts +8 -5
  205. package/src/Store/index.ts +21 -6
  206. package/src/Store/utils.ts +26 -24
  207. package/src/WorkflowEngineCosmos.ts +719 -0
  208. package/src/WorkflowEngineSqlite.ts +813 -0
  209. package/src/arbs.ts +5 -3
  210. package/src/{adapters/cosmos-client.ts → cosmos-client.ts} +5 -3
  211. package/src/errorReporter.ts +66 -76
  212. package/src/fileUtil.ts +1 -1
  213. package/src/index.ts +2 -1
  214. package/src/{api/internal → internal}/RequestContextMiddleware.ts +23 -6
  215. package/src/internal/auth.ts +272 -0
  216. package/src/{api/internal → internal}/events.ts +22 -13
  217. package/src/{api/layerUtils.ts → layerUtils.ts} +14 -10
  218. package/src/logger/jsonLogger.ts +4 -2
  219. package/src/logger/logFmtLogger.ts +2 -2
  220. package/src/logger/shared.ts +5 -4
  221. package/src/{adapters/memQueue.ts → memQueue.ts} +5 -4
  222. package/src/{adapters/mongo-client.ts → mongo-client.ts} +4 -2
  223. package/src/otel.ts +152 -0
  224. package/src/rateLimit.ts +34 -23
  225. package/src/{adapters/redis-client.ts → redis-client.ts} +7 -3
  226. package/src/{api/reportError.ts → reportError.ts} +3 -2
  227. package/src/{api/routing → routing}/middleware/RouterMiddleware.ts +5 -4
  228. package/src/{api/routing → routing}/middleware/middleware.ts +62 -17
  229. package/src/routing/middleware.ts +4 -0
  230. package/src/{api/routing → routing}/schema/jwt.ts +2 -1
  231. package/src/{api/routing → routing}/utils.ts +2 -1
  232. package/src/routing.ts +768 -0
  233. package/src/test.ts +2 -2
  234. package/test/auth.test.ts +101 -0
  235. package/test/cluster-cosmos.test.ts +503 -0
  236. package/test/cluster-servicebus.test.ts +180 -0
  237. package/test/contextProvider.test.ts +15 -12
  238. package/test/controller.test.ts +28 -32
  239. package/test/cosmos-query.test.ts +159 -0
  240. package/test/dist/_check-agg-infer.test-d.d.ts +2 -0
  241. package/test/dist/_check-agg-infer.test-d.d.ts.map +1 -0
  242. package/test/dist/_check-agg-infer.test-d.js +19 -0
  243. package/test/dist/_check-proj-infer.test-d.d.ts +2 -0
  244. package/test/dist/_check-proj-infer.test-d.d.ts.map +1 -0
  245. package/test/dist/_check-proj-infer.test-d.js +16 -0
  246. package/test/dist/_check-tighten.test-d.d.ts +2 -0
  247. package/test/dist/_check-tighten.test-d.d.ts.map +1 -0
  248. package/test/dist/_check-tighten.test-d.js +21 -0
  249. package/test/dist/auth.test.d.ts.map +1 -0
  250. package/test/dist/cluster-cosmos.test.d.ts.map +1 -0
  251. package/test/dist/cluster-servicebus.test.d.ts.map +1 -0
  252. package/test/dist/contextProvider.test.d.ts.map +1 -1
  253. package/test/dist/controller.test.d.ts.map +1 -1
  254. package/test/dist/cosmos-query.test.d.ts.map +1 -0
  255. package/test/dist/date-query.test.d.ts.map +1 -0
  256. package/test/dist/fixtures.d.ts +30 -12
  257. package/test/dist/fixtures.d.ts.map +1 -1
  258. package/test/dist/fixtures.js +17 -10
  259. package/test/dist/query.test.d.ts.map +1 -1
  260. package/test/dist/rawQuery.test.d.ts.map +1 -1
  261. package/test/dist/repository-ext.test.d.ts.map +1 -0
  262. package/test/dist/requires.test.d.ts.map +1 -1
  263. package/test/dist/router-generator.test.d.ts.map +1 -0
  264. package/test/dist/routing-interruptibility.test.d.ts.map +1 -0
  265. package/test/dist/rpc-context-map-streaming.test.d.ts.map +1 -0
  266. package/test/dist/rpc-e2e-invalidation.test.d.ts.map +1 -0
  267. package/test/dist/rpc-multi-middleware.test.d.ts.map +1 -1
  268. package/test/dist/rpc-stream-fullstack.test.d.ts.map +1 -0
  269. package/test/dist/sql-store.test.d.ts.map +1 -0
  270. package/test/dist/workflow-engine-cosmos.test.d.ts.map +1 -0
  271. package/test/dist/workflow-engine-sqlite.test.d.ts.map +1 -0
  272. package/test/fixtures.ts +16 -9
  273. package/test/layerUtils.test.ts +2 -2
  274. package/test/query.test.ts +905 -40
  275. package/test/rawQuery.test.ts +340 -22
  276. package/test/repository-ext.test.ts +62 -0
  277. package/test/requires.test.ts +10 -5
  278. package/test/router-generator.test.ts +187 -0
  279. package/test/routing-interruptibility.test.ts +66 -0
  280. package/test/rpc-context-map-streaming.test.ts +262 -0
  281. package/test/rpc-e2e-invalidation.test.ts +256 -0
  282. package/test/rpc-multi-middleware.test.ts +85 -10
  283. package/test/rpc-stream-fullstack.test.ts +304 -0
  284. package/test/sql-store.test.ts +1711 -0
  285. package/test/validateSample.test.ts +26 -14
  286. package/test/workflow-engine-cosmos.test.ts +354 -0
  287. package/test/workflow-engine-sqlite.test.ts +299 -0
  288. package/tsconfig.examples.json +1 -1
  289. package/tsconfig.json +2 -1
  290. package/tsconfig.json.bak +2 -2
  291. package/tsconfig.src.json +35 -35
  292. package/tsconfig.test.json +2 -2
  293. package/dist/Emailer/service.d.ts +0 -55
  294. package/dist/Emailer/service.d.ts.map +0 -1
  295. package/dist/Emailer/service.js +0 -6
  296. package/dist/Emailer.d.ts +0 -2
  297. package/dist/Emailer.d.ts.map +0 -1
  298. package/dist/Emailer.js +0 -2
  299. package/dist/Model/Repository/ext.d.ts +0 -41
  300. package/dist/Model/Repository/ext.d.ts.map +0 -1
  301. package/dist/Model/Repository/ext.js +0 -65
  302. package/dist/Model/Repository/internal/internal.d.ts +0 -59
  303. package/dist/Model/Repository/internal/internal.d.ts.map +0 -1
  304. package/dist/Model/Repository/internal/internal.js +0 -316
  305. package/dist/Model/Repository/legacy.d.ts +0 -19
  306. package/dist/Model/Repository/legacy.d.ts.map +0 -1
  307. package/dist/Model/Repository/legacy.js +0 -2
  308. package/dist/Model/Repository/makeRepo.d.ts +0 -49
  309. package/dist/Model/Repository/makeRepo.d.ts.map +0 -1
  310. package/dist/Model/Repository/makeRepo.js +0 -24
  311. package/dist/Model/Repository/service.d.ts +0 -89
  312. package/dist/Model/Repository/service.d.ts.map +0 -1
  313. package/dist/Model/Repository/service.js +0 -2
  314. package/dist/Model/Repository/validation.d.ts +0 -42
  315. package/dist/Model/Repository/validation.d.ts.map +0 -1
  316. package/dist/Model/Repository/validation.js +0 -32
  317. package/dist/Model/Repository.d.ts +0 -6
  318. package/dist/Model/Repository.d.ts.map +0 -1
  319. package/dist/Model/Repository.js +0 -6
  320. package/dist/Model/dsl.d.ts +0 -32
  321. package/dist/Model/dsl.d.ts.map +0 -1
  322. package/dist/Model/dsl.js +0 -44
  323. package/dist/Model/filter/filterApi.d.ts +0 -30
  324. package/dist/Model/filter/filterApi.d.ts.map +0 -1
  325. package/dist/Model/filter/filterApi.js +0 -2
  326. package/dist/Model/filter/types/errors.d.ts +0 -29
  327. package/dist/Model/filter/types/errors.d.ts.map +0 -1
  328. package/dist/Model/filter/types/errors.js +0 -2
  329. package/dist/Model/filter/types/fields.d.ts +0 -15
  330. package/dist/Model/filter/types/fields.d.ts.map +0 -1
  331. package/dist/Model/filter/types/fields.js +0 -2
  332. package/dist/Model/filter/types/path/common.d.ts +0 -316
  333. package/dist/Model/filter/types/path/common.d.ts.map +0 -1
  334. package/dist/Model/filter/types/path/common.js +0 -2
  335. package/dist/Model/filter/types/path/eager.d.ts +0 -95
  336. package/dist/Model/filter/types/path/eager.d.ts.map +0 -1
  337. package/dist/Model/filter/types/path/eager.js +0 -31
  338. package/dist/Model/filter/types/path/index.d.ts +0 -4
  339. package/dist/Model/filter/types/path/index.d.ts.map +0 -1
  340. package/dist/Model/filter/types/path/index.js +0 -3
  341. package/dist/Model/filter/types/utils.d.ts +0 -79
  342. package/dist/Model/filter/types/utils.d.ts.map +0 -1
  343. package/dist/Model/filter/types/utils.js +0 -2
  344. package/dist/Model/filter/types/validator.d.ts +0 -30
  345. package/dist/Model/filter/types/validator.d.ts.map +0 -1
  346. package/dist/Model/filter/types/validator.js +0 -2
  347. package/dist/Model/filter/types.d.ts +0 -5
  348. package/dist/Model/filter/types.d.ts.map +0 -1
  349. package/dist/Model/filter/types.js +0 -7
  350. package/dist/Model/query/dsl.d.ts +0 -248
  351. package/dist/Model/query/dsl.d.ts.map +0 -1
  352. package/dist/Model/query/dsl.js +0 -104
  353. package/dist/Model/query/new-kid-interpreter.d.ts +0 -28
  354. package/dist/Model/query/new-kid-interpreter.d.ts.map +0 -1
  355. package/dist/Model/query/new-kid-interpreter.js +0 -165
  356. package/dist/Model/query.d.ts +0 -15
  357. package/dist/Model/query.d.ts.map +0 -1
  358. package/dist/Model/query.js +0 -3
  359. package/dist/Model.d.ts +0 -4
  360. package/dist/Model.d.ts.map +0 -1
  361. package/dist/Model.js +0 -4
  362. package/dist/Operations.d.ts +0 -55
  363. package/dist/Operations.d.ts.map +0 -1
  364. package/dist/Operations.js +0 -102
  365. package/dist/OperationsRepo.d.ts +0 -41
  366. package/dist/OperationsRepo.d.ts.map +0 -1
  367. package/dist/OperationsRepo.js +0 -14
  368. package/dist/QueueMaker/service.d.ts +0 -11
  369. package/dist/QueueMaker/service.d.ts.map +0 -1
  370. package/dist/QueueMaker/service.js +0 -4
  371. package/dist/RequestContext.d.ts +0 -63
  372. package/dist/RequestContext.d.ts.map +0 -1
  373. package/dist/RequestContext.js +0 -49
  374. package/dist/Store/ContextMapContainer.d.ts +0 -14
  375. package/dist/Store/ContextMapContainer.d.ts.map +0 -1
  376. package/dist/Store/ContextMapContainer.js +0 -16
  377. package/dist/Store/service.d.ts +0 -108
  378. package/dist/Store/service.d.ts.map +0 -1
  379. package/dist/Store/service.js +0 -71
  380. package/dist/Store.d.ts +0 -2
  381. package/dist/Store.d.ts.map +0 -1
  382. package/dist/Store.js +0 -2
  383. package/dist/adapters/SQL/Model.d.ts +0 -479
  384. package/dist/adapters/SQL/Model.d.ts.map +0 -1
  385. package/dist/adapters/SQL/Model.js +0 -478
  386. package/dist/adapters/SQL.d.ts +0 -2
  387. package/dist/adapters/SQL.d.ts.map +0 -1
  388. package/dist/adapters/ServiceBus.d.ts +0 -58
  389. package/dist/adapters/ServiceBus.d.ts.map +0 -1
  390. package/dist/adapters/ServiceBus.js +0 -99
  391. package/dist/adapters/cosmos-client.d.ts +0 -14
  392. package/dist/adapters/cosmos-client.d.ts.map +0 -1
  393. package/dist/adapters/cosmos-client.js +0 -9
  394. package/dist/adapters/index.d.ts +0 -2
  395. package/dist/adapters/index.d.ts.map +0 -1
  396. package/dist/adapters/index.js +0 -2
  397. package/dist/adapters/logger.d.ts +0 -9
  398. package/dist/adapters/logger.d.ts.map +0 -1
  399. package/dist/adapters/logger.js +0 -3
  400. package/dist/adapters/memQueue.d.ts +0 -13
  401. package/dist/adapters/memQueue.d.ts.map +0 -1
  402. package/dist/adapters/memQueue.js +0 -20
  403. package/dist/adapters/mongo-client.d.ts +0 -10
  404. package/dist/adapters/mongo-client.d.ts.map +0 -1
  405. package/dist/adapters/mongo-client.js +0 -13
  406. package/dist/adapters/redis-client.d.ts +0 -39
  407. package/dist/adapters/redis-client.d.ts.map +0 -1
  408. package/dist/adapters/redis-client.js +0 -94
  409. package/dist/api/ContextProvider.d.ts +0 -31
  410. package/dist/api/ContextProvider.d.ts.map +0 -1
  411. package/dist/api/ContextProvider.js +0 -38
  412. package/dist/api/codec.d.ts +0 -5
  413. package/dist/api/codec.d.ts.map +0 -1
  414. package/dist/api/codec.js +0 -5
  415. package/dist/api/internal/RequestContextMiddleware.d.ts +0 -5
  416. package/dist/api/internal/RequestContextMiddleware.d.ts.map +0 -1
  417. package/dist/api/internal/RequestContextMiddleware.js +0 -35
  418. package/dist/api/internal/auth.d.ts +0 -15
  419. package/dist/api/internal/auth.d.ts.map +0 -1
  420. package/dist/api/internal/auth.js +0 -47
  421. package/dist/api/internal/events.d.ts +0 -9
  422. package/dist/api/internal/events.d.ts.map +0 -1
  423. package/dist/api/internal/events.js +0 -42
  424. package/dist/api/internal/health.d.ts +0 -3
  425. package/dist/api/internal/health.d.ts.map +0 -1
  426. package/dist/api/internal/health.js +0 -5
  427. package/dist/api/layerUtils.d.ts +0 -24
  428. package/dist/api/layerUtils.d.ts.map +0 -1
  429. package/dist/api/layerUtils.js +0 -16
  430. package/dist/api/middlewares.d.ts +0 -10
  431. package/dist/api/middlewares.d.ts.map +0 -1
  432. package/dist/api/reportError.d.ts +0 -4
  433. package/dist/api/reportError.d.ts.map +0 -1
  434. package/dist/api/reportError.js +0 -27
  435. package/dist/api/routing/middleware/RouterMiddleware.d.ts +0 -15
  436. package/dist/api/routing/middleware/RouterMiddleware.d.ts.map +0 -1
  437. package/dist/api/routing/middleware/middleware.d.ts +0 -9
  438. package/dist/api/routing/middleware/middleware.d.ts.map +0 -1
  439. package/dist/api/routing/middleware/middleware.js +0 -92
  440. package/dist/api/routing/middleware.d.ts +0 -4
  441. package/dist/api/routing/middleware.d.ts.map +0 -1
  442. package/dist/api/routing/schema/jwt.d.ts +0 -4
  443. package/dist/api/routing/schema/jwt.d.ts.map +0 -1
  444. package/dist/api/routing/schema/jwt.js +0 -12
  445. package/dist/api/routing/tsort.d.ts +0 -8
  446. package/dist/api/routing/tsort.d.ts.map +0 -1
  447. package/dist/api/routing/tsort.js +0 -51
  448. package/dist/api/routing/utils.d.ts +0 -19
  449. package/dist/api/routing/utils.d.ts.map +0 -1
  450. package/dist/api/routing/utils.js +0 -44
  451. package/dist/api/routing.d.ts +0 -138
  452. package/dist/api/routing.d.ts.map +0 -1
  453. package/dist/api/routing.js +0 -166
  454. package/dist/api/setupRequest.d.ts +0 -12
  455. package/dist/api/setupRequest.d.ts.map +0 -1
  456. package/dist/api/setupRequest.js +0 -44
  457. package/dist/api/util.d.ts +0 -3
  458. package/dist/api/util.d.ts.map +0 -1
  459. package/dist/api/util.js +0 -14
  460. package/eslint.config.mjs +0 -24
  461. package/src/Emailer/service.ts +0 -52
  462. package/src/Emailer.ts +0 -1
  463. package/src/Model/Repository/ext.ts +0 -283
  464. package/src/Model/Repository/internal/internal.ts +0 -577
  465. package/src/Model/Repository/legacy.ts +0 -27
  466. package/src/Model/Repository/makeRepo.ts +0 -139
  467. package/src/Model/Repository/service.ts +0 -627
  468. package/src/Model/Repository/validation.ts +0 -31
  469. package/src/Model/Repository.ts +0 -5
  470. package/src/Model/dsl.ts +0 -128
  471. package/src/Model/filter/filterApi.ts +0 -60
  472. package/src/Model/filter/types/errors.ts +0 -47
  473. package/src/Model/filter/types/fields.ts +0 -50
  474. package/src/Model/filter/types/path/common.ts +0 -404
  475. package/src/Model/filter/types/path/eager.ts +0 -298
  476. package/src/Model/filter/types/path/index.ts +0 -4
  477. package/src/Model/filter/types/utils.ts +0 -128
  478. package/src/Model/filter/types/validator.ts +0 -46
  479. package/src/Model/filter/types.ts +0 -6
  480. package/src/Model/query/dsl.ts +0 -2110
  481. package/src/Model/query/new-kid-interpreter.ts +0 -210
  482. package/src/Model/query.ts +0 -13
  483. package/src/Model.ts +0 -3
  484. package/src/Operations.ts +0 -235
  485. package/src/OperationsRepo.ts +0 -16
  486. package/src/QueueMaker/service.ts +0 -17
  487. package/src/RequestContext.ts +0 -63
  488. package/src/Store/ContextMapContainer.ts +0 -20
  489. package/src/Store/service.ts +0 -184
  490. package/src/Store.ts +0 -1
  491. package/src/adapters/ServiceBus.ts +0 -209
  492. package/src/adapters/index.ts +0 -0
  493. package/src/adapters/logger.ts +0 -3
  494. package/src/api/internal/auth.ts +0 -68
  495. package/src/api/routing/middleware.ts +0 -6
  496. package/src/api/routing.ts +0 -598
  497. package/src/api/setupRequest.ts +0 -84
  498. /package/src/{adapters/SQL.ts → SQL.ts} +0 -0
  499. /package/src/{api/codec.ts → codec.ts} +0 -0
  500. /package/src/{api/internal → internal}/health.ts +0 -0
  501. /package/src/{api/middlewares.ts → middlewares.ts} +0 -0
  502. /package/src/{api/routing → routing}/tsort.ts +0 -0
  503. /package/src/{api/util.ts → util.ts} +0 -0
@@ -1,34 +1,276 @@
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"
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"
6
18
  import { InfraLogger } from "../logger.js"
7
- import type { FieldValues } from "../Model/filter/types.js"
19
+ import { annotateDb } from "../otel.js"
8
20
  import { codeFilter, codeFilter3_ } from "./codeFilter.js"
9
- import { type FilterArgs, type PersistenceModelType, type Store, type StoreConfig, StoreMaker } from "./service.js"
10
21
  import { makeUpdateETag } from "./utils.js"
11
22
 
23
+ /** Traverse an object by a dot-separated path string, e.g. `"a.b.c"`. */
24
+ export function get(obj: any, path: string): any {
25
+ return path.split(".").reduce((res: any, key: string) => (res != null ? res[key] : res), obj)
26
+ }
27
+
28
+ const stripRelationFilterPaths = (state: readonly FilterResult[], relationPath: string): readonly FilterResult[] => {
29
+ const prefix = `${relationPath}.-1.`
30
+ return state.map((entry) =>
31
+ "path" in entry
32
+ ? {
33
+ ...entry,
34
+ path: entry.path.startsWith(prefix) ? entry.path.slice(prefix.length) : entry.path
35
+ }
36
+ : {
37
+ ...entry,
38
+ result: stripRelationFilterPaths(entry.result, relationPath)
39
+ }
40
+ )
41
+ }
42
+
43
+ const emptyValueFor = (tag: ComputedProjectionIrExpression["_tag"]) => {
44
+ switch (tag) {
45
+ case "relation-count":
46
+ case "relation-distinct-count":
47
+ case "relation-sum":
48
+ case "relation-sum-expr":
49
+ case "relation-sum-expr-normalized":
50
+ return 0
51
+ case "relation-sum-expr-by":
52
+ return [] as unknown[]
53
+ case "relation-any":
54
+ return false
55
+ case "relation-every":
56
+ return true
57
+ case "relation-collect":
58
+ return [] as unknown[]
59
+ case "relation-collect-fields":
60
+ return [] as unknown[]
61
+ case "relation-length":
62
+ return 0
63
+ default:
64
+ return assertUnreachable(tag)
65
+ }
66
+ }
67
+
68
+ const computeProjectionValue = (
69
+ row: FieldValues,
70
+ computed: ComputedProjectionIrExpression
71
+ ) => {
72
+ const relation = get(row, computed.path)
73
+ if (!Array.isArray(relation)) {
74
+ return emptyValueFor(computed._tag)
75
+ }
76
+ if (computed._tag === "relation-length") {
77
+ return relation.length
78
+ }
79
+ const filter = stripRelationFilterPaths(computed.filter, computed.path)
80
+ // empty filter = unconditional match (codeFilter3_ uses eval on a built
81
+ // string and chokes on `( )`, so short-circuit before invoking it).
82
+ const matches = filter.length === 0
83
+ ? (_value: unknown) => true
84
+ : (value: unknown) => codeFilter3_(filter, value)
85
+ const evalExpr = (value: unknown, expression: ComputedProjectionMathIrExpression): number => {
86
+ switch (expression._tag) {
87
+ case "field": {
88
+ const v = get(value, expression.field)
89
+ return typeof v === "number" ? v : Number(v) || 0
90
+ }
91
+ case "mul":
92
+ return evalExpr(value, expression.left) * evalExpr(value, expression.right)
93
+ default:
94
+ return assertUnreachable(expression)
95
+ }
96
+ }
97
+ switch (computed._tag) {
98
+ case "relation-count":
99
+ return relation.reduce<number>((acc, value) => matches(value) ? acc + 1 : acc, 0)
100
+ case "relation-any":
101
+ return relation.some(matches)
102
+ case "relation-every":
103
+ return relation.every(matches)
104
+ case "relation-distinct-count": {
105
+ const seen = new Set<unknown>()
106
+ for (const value of relation) {
107
+ if (matches(value)) seen.add(get(value, computed.field))
108
+ }
109
+ return seen.size
110
+ }
111
+ case "relation-sum":
112
+ return relation.reduce<number>((acc, value) => {
113
+ if (!matches(value)) return acc
114
+ const v = get(value, computed.field)
115
+ return acc + (typeof v === "number" ? v : Number(v) || 0)
116
+ }, 0)
117
+ case "relation-sum-expr":
118
+ return relation.reduce<number>((acc, value) => {
119
+ if (!matches(value)) return acc
120
+ return acc + evalExpr(value, computed.expression)
121
+ }, 0)
122
+ case "relation-sum-expr-by": {
123
+ const totals = new Map<unknown, number>()
124
+ for (const value of relation) {
125
+ if (!matches(value)) continue
126
+ const unit = get(value, computed.unit)
127
+ const current = totals.get(unit) ?? 0
128
+ totals.set(unit, current + evalExpr(value, computed.expression))
129
+ }
130
+ return [...totals.entries()].map(([unit, total]) => ({ unit, total }))
131
+ }
132
+ case "relation-sum-expr-normalized":
133
+ return relation.reduce<number>((acc, value) => {
134
+ if (!matches(value)) return acc
135
+ const unit = get(value, computed.unit)
136
+ const factor = unit === computed.toBase ? 1 : computed.factors[String(unit)]
137
+ if (factor === undefined || !Number.isFinite(factor)) return acc
138
+ return acc + evalExpr(value, computed.expression) * factor
139
+ }, 0)
140
+ case "relation-collect": {
141
+ const out: unknown[] = []
142
+ const seen = computed.distinct ? new Set<unknown>() : undefined
143
+ for (const value of relation) {
144
+ if (!matches(value)) continue
145
+ const v = get(value, computed.field)
146
+ if (seen) {
147
+ if (seen.has(v)) continue
148
+ seen.add(v)
149
+ }
150
+ out.push(v)
151
+ }
152
+ return out
153
+ }
154
+ case "relation-collect-fields": {
155
+ const out: unknown[] = []
156
+ const seen = computed.distinct ? new Set<unknown>() : undefined
157
+ for (const value of relation) {
158
+ if (!matches(value)) continue
159
+ for (const field of computed.fields) {
160
+ const v = get(value, field)
161
+ if (seen) {
162
+ if (seen.has(v)) continue
163
+ seen.add(v)
164
+ }
165
+ out.push(v)
166
+ }
167
+ }
168
+ return out
169
+ }
170
+ default:
171
+ return assertUnreachable(computed)
172
+ }
173
+ }
174
+
175
+ const computeAggregateValue = <T extends FieldValues>(rows: readonly T[], agg: AggregateIrExpression): unknown => {
176
+ switch (agg._tag) {
177
+ case "agg-count":
178
+ return rows.length
179
+ case "agg-count-when": {
180
+ const filter = agg.filter
181
+ const matches = filter.length === 0 ? () => true : (row: unknown) => codeFilter3_(filter, row)
182
+ return rows.filter((row) => matches(row)).length
183
+ }
184
+ case "agg-sum":
185
+ return rows.reduce<number>((acc, row) => {
186
+ const v = get(row, agg.field)
187
+ return acc + (typeof v === "number" ? v : Number(v) || 0)
188
+ }, 0)
189
+ case "agg-min": {
190
+ let min: unknown = undefined
191
+ for (const row of rows) {
192
+ const v = get(row, agg.field)
193
+ if (v == null) continue
194
+ if (min === undefined || v < (min as any)) min = v
195
+ }
196
+ return min ?? null
197
+ }
198
+ case "agg-max": {
199
+ let max: unknown = undefined
200
+ for (const row of rows) {
201
+ const v = get(row, agg.field)
202
+ if (v == null) continue
203
+ if (max === undefined || v > (max as any)) max = v
204
+ }
205
+ return max ?? null
206
+ }
207
+ default:
208
+ return assertUnreachable(agg)
209
+ }
210
+ }
211
+
12
212
  export function memFilter<T extends FieldValues, U extends keyof T = never>(f: FilterArgs<T, U>) {
13
213
  type M = U extends undefined ? T : Pick<T, U>
14
214
  return ((c: T[]): M[] => {
15
- const select = (r: T[]): M[] => {
16
- const sel = f.select
215
+ const sel = f.select
216
+
217
+ const selectPerRow = (r: T[]): M[] => {
17
218
  if (!sel) return r as M[]
219
+
220
+ // Detect aggregate mode: any select item has `aggregate` key
221
+ const hasAggregates = sel.some((s) => typeof s === "object" && s !== null && "aggregate" in s)
222
+ if (hasAggregates) {
223
+ // GROUP BY + aggregate
224
+ const fieldItems = sel.filter((s): s is { key: string; path: string } =>
225
+ typeof s === "object" && s !== null && "path" in s && !("aggregate" in s)
226
+ )
227
+ const aggregateItems = sel.filter((s): s is { key: string; aggregate: AggregateIrExpression } =>
228
+ typeof s === "object" && s !== null && "aggregate" in s
229
+ )
230
+ const groups = new Map<string, T[]>()
231
+ for (const row of r) {
232
+ const key = fieldItems.map((fi) => JSON.stringify(get(row, fi.path))).join("\0")
233
+ const existing = groups.get(key) ?? []
234
+ existing.push(row)
235
+ groups.set(key, existing)
236
+ }
237
+ return [...groups.values()].map((rows) => {
238
+ const result: Record<string, unknown> = {}
239
+ for (const fi of fieldItems) result[fi.key] = get(rows[0]!, fi.path)
240
+ for (const ai of aggregateItems) result[ai.key] = computeAggregateValue(rows, ai.aggregate)
241
+ return result as M
242
+ })
243
+ }
244
+
18
245
  return r.map((i) => {
19
- const [keys, subKeys] = pipe(
246
+ const [keys, entries] = pipe(
20
247
  sel,
21
- Array.partition((r) =>
22
- typeof r === "string" ? Result.fail(String(r)) : Result.succeed(r as { key: string; subKeys: string[] })
23
- )
248
+ Array.partition((entry) => typeof entry === "string" ? Result.fail(String(entry)) : Result.succeed(entry))
249
+ )
250
+ const subKeys = entries.filter((entry): entry is { key: string; subKeys: readonly string[] } =>
251
+ typeof entry === "object" && entry !== null && "subKeys" in entry
252
+ )
253
+ const computedKeys = entries.filter((entry): entry is {
254
+ key: string
255
+ computed: ComputedProjectionIrExpression
256
+ } => typeof entry === "object" && entry !== null && "computed" in entry)
257
+ const pathKeys = entries.filter((entry): entry is { key: string; path: string } =>
258
+ typeof entry === "object" && entry !== null && "path" in entry && !("aggregate" in entry)
24
259
  )
25
260
  const n = Struct.pick(i, keys)
26
261
  subKeys.forEach((subKey) => {
27
262
  n[subKey.key] = i[subKey.key]!.map(Struct.pick(subKey.subKeys as never[]))
28
263
  })
264
+ computedKeys.forEach((entry) => {
265
+ ;(n as Record<string, unknown>)[entry.key] = computeProjectionValue(i, entry.computed)
266
+ })
267
+ pathKeys.forEach((entry) => {
268
+ ;(n as Record<string, unknown>)[entry.key] = get(i, entry.path)
269
+ })
29
270
  return n as M
30
- }) as any
271
+ })
31
272
  }
273
+
32
274
  const skip = f?.skip
33
275
  const limit = f?.limit
34
276
  const ords = Option.map(Option.fromNullishOr(f.order), (_) =>
@@ -50,7 +292,7 @@ export function memFilter<T extends FieldValues, U extends keyof T = never>(f: F
50
292
  c = Array.sortBy(...ords.value)(c)
51
293
  }
52
294
  if (!skip && limit === 1) {
53
- return select(
295
+ return selectPerRow(
54
296
  Array.findFirst(c, f.filter ? codeFilter(f.filter) : (_) => Option.some(_)).pipe(
55
297
  Option.map(Array.make),
56
298
  Option.getOrElse(
@@ -67,13 +309,10 @@ export function memFilter<T extends FieldValues, U extends keyof T = never>(f: F
67
309
  r = Array.take(r, limit)
68
310
  }
69
311
 
70
- return select(r)
312
+ return selectPerRow(r)
71
313
  })
72
314
  }
73
315
 
74
- const defaultNs: NonEmptyString255 = NonEmptyString255("primary")
75
- export class storeId extends ServiceMap.Reference("StoreId", { defaultValue: (): NonEmptyString255 => defaultNs }) {}
76
-
77
316
  function logQuery(f: FilterArgs<any, any>, defaultValues?: any) {
78
317
  return InfraLogger
79
318
  .logDebug("mem query")
@@ -151,43 +390,55 @@ export function makeMemoryStoreInt<IdKey extends keyof Encoded, Encoded extends
151
390
  withPermit
152
391
  )
153
392
  const s: Store<IdKey, Encoded> = {
393
+ seedNamespace: () => Effect.void,
394
+
154
395
  queryRaw: (query) =>
155
396
  all
156
397
  .pipe(
157
398
  // Effect.tap(() => logQuery(query, defaultValues)),
158
399
  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 })
400
+ annotateDb({
401
+ operation: "queryRaw",
402
+ system: "memory",
403
+ collection: modelName,
404
+ namespace,
405
+ entity: modelName
406
+ })
162
407
  ),
163
408
 
164
- all: all.pipe(Effect.withSpan("Memory.all [effect-app/infra/Store]", {
165
- attributes: {
166
- modelName,
167
- namespace
168
- }
169
- }, { captureStackTrace: false })),
409
+ all: all.pipe(annotateDb({
410
+ operation: "all",
411
+ system: "memory",
412
+ collection: modelName,
413
+ namespace,
414
+ entity: modelName
415
+ })),
170
416
  find: (id) =>
171
417
  Ref
172
418
  .get(store)
173
419
  .pipe(
174
420
  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 })
421
+ annotateDb({
422
+ operation: "find",
423
+ system: "memory",
424
+ collection: modelName,
425
+ namespace,
426
+ entity: modelName,
427
+ extra: { "app.entity.id": id as unknown }
428
+ })
182
429
  ),
183
430
  filter: (f) =>
184
431
  all
185
432
  .pipe(
186
433
  Effect.tap(() => logQuery(f, defaultValues)),
187
434
  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 })
435
+ annotateDb({
436
+ operation: "filter",
437
+ system: "memory",
438
+ collection: modelName,
439
+ namespace,
440
+ entity: modelName
441
+ })
191
442
  ),
192
443
  set: (e) =>
193
444
  s
@@ -202,10 +453,14 @@ export function makeMemoryStoreInt<IdKey extends keyof Encoded, Encoded extends
202
453
  )
203
454
  ),
204
455
  withPermit,
205
- Effect
206
- .withSpan("Memory.set [effect-app/infra/Store]", {
207
- attributes: { "repository.model_name": modelName, "repository.namespace": namespace }
208
- }, { captureStackTrace: false })
456
+ annotateDb({
457
+ operation: "set",
458
+ system: "memory",
459
+ collection: modelName,
460
+ namespace,
461
+ entity: modelName,
462
+ extra: { "app.entity.id": e[idKey] as unknown }
463
+ })
209
464
  ),
210
465
  batchRemove: (items: NonEmptyReadonlyArray<Encoded[IdKey]>) =>
211
466
  pipe(
@@ -216,10 +471,13 @@ export function makeMemoryStoreInt<IdKey extends keyof Encoded, Encoded extends
216
471
  Effect.filterOrFail((_) => _.length <= 100, () => "BatchRemove: a batch may not exceed 100 items"),
217
472
  Effect.orDie,
218
473
  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 })
474
+ annotateDb({
475
+ operation: "batchRemove",
476
+ system: "memory",
477
+ collection: modelName,
478
+ namespace,
479
+ entity: modelName
480
+ })
223
481
  )
224
482
  ),
225
483
  batchSet: (items: readonly [PM, ...PM[]]) =>
@@ -231,18 +489,25 @@ export function makeMemoryStoreInt<IdKey extends keyof Encoded, Encoded extends
231
489
  Effect.filterOrFail((_) => _.length <= 100, () => "BatchSet: a batch may not exceed 100 items"),
232
490
  Effect.orDie,
233
491
  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 })
492
+ annotateDb({
493
+ operation: "batchSet",
494
+ system: "memory",
495
+ collection: modelName,
496
+ namespace,
497
+ entity: modelName
498
+ })
238
499
  )
239
500
  ),
240
501
  bulkSet: flow(
241
502
  batchSet,
242
503
  (_) =>
243
- _.pipe(Effect.withSpan("Memory.bulkSet [effect-app/infra/Store]", {
244
- attributes: { "repository.model_name": modelName, "repository.namespace": namespace }
245
- }, { captureStackTrace: false }))
504
+ _.pipe(annotateDb({
505
+ operation: "bulkSet",
506
+ system: "memory",
507
+ collection: modelName,
508
+ namespace,
509
+ entity: modelName
510
+ }))
246
511
  )
247
512
  }
248
513
  return s
@@ -250,56 +515,60 @@ export function makeMemoryStoreInt<IdKey extends keyof Encoded, Encoded extends
250
515
  }
251
516
 
252
517
  export const makeMemoryStore = () => ({
253
- make: <IdKey extends keyof Encoded, Encoded extends FieldValues, R, E>(
518
+ make: Effect.fnUntraced(function*<IdKey extends keyof Encoded, Encoded extends FieldValues, R, E>(
254
519
  modelName: string,
255
520
  idKey: IdKey,
256
521
  seed?: Effect.Effect<Iterable<Encoded>, E, R>,
257
522
  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))
523
+ ) {
524
+ const primary = yield* makeMemoryStoreInt<IdKey, Encoded, R, E>(
525
+ modelName,
526
+ idKey,
527
+ "primary",
528
+ seed,
529
+ config?.defaultValues
530
+ )
531
+ const ctx = yield* Effect.context<R>()
532
+ const stores = new Map([["primary", primary]])
533
+ const semaphores = new Map<string, Semaphore.Semaphore>()
534
+ const getSem = (ns: string) => {
535
+ let sem = semaphores.get(ns)
536
+ if (!sem) {
537
+ sem = Semaphore.makeUnsafe(1)
538
+ semaphores.set(ns, sem)
300
539
  }
301
- return s
302
- })
540
+ return sem
541
+ }
542
+ const ensureStore = (namespace: string) =>
543
+ getSem(namespace).withPermits(1)(Effect.suspend(() => {
544
+ const store = stores.get(namespace)
545
+ if (store) return Effect.succeed(store)
546
+ if (config?.allowNamespace && !config.allowNamespace(namespace)) {
547
+ throw new Error(`Namespace ${namespace} not allowed!`)
548
+ }
549
+ return makeMemoryStoreInt(modelName, idKey, namespace, seed, config?.defaultValues)
550
+ .pipe(
551
+ Effect.orDie,
552
+ Effect.provide(ctx),
553
+ Effect.tap((store) => Effect.sync(() => stores.set(namespace, store)))
554
+ )
555
+ }))
556
+ const getStore = !config?.allowNamespace
557
+ ? Effect.succeed(primary)
558
+ : storeId.pipe(Effect.flatMap((namespace) => ensureStore(namespace)))
559
+ const s: Store<IdKey, Encoded> = {
560
+ seedNamespace: (namespace) => ensureStore(namespace).pipe(Effect.asVoid),
561
+ all: Effect.flatMap(getStore, (_) => _.all),
562
+ queryRaw: (...args) => Effect.flatMap(getStore, (_) => _.queryRaw(...args)),
563
+ find: (...args) => Effect.flatMap(getStore, (_) => _.find(...args)),
564
+ filter: (...args) => Effect.flatMap(getStore, (_) => _.filter(...args)),
565
+ set: (...args) => Effect.flatMap(getStore, (_) => _.set(...args)),
566
+ batchSet: (...args) => Effect.flatMap(getStore, (_) => _.batchSet(...args)),
567
+ bulkSet: (...args) => Effect.flatMap(getStore, (_) => _.bulkSet(...args)),
568
+ batchRemove: (...args) => Effect.flatMap(getStore, (_) => _.batchRemove(...args))
569
+ }
570
+ return s
571
+ })
303
572
  })
304
573
 
305
574
  export const MemoryStoreLive = StoreMaker.toLayer(Effect.sync(() => makeMemoryStore()))