@effect-app/infra 4.0.0-beta.99 → 4.0.1

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