@effect-app/infra 4.0.0-beta.98 → 4.0.0

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