@effect-app/infra 4.0.0-beta.32 → 4.0.0-beta.320

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 (480) hide show
  1. package/CHANGELOG.md +2462 -0
  2. package/_check.sh +1 -1
  3. package/dist/CUPS.d.ts +29 -10
  4. package/dist/CUPS.d.ts.map +1 -1
  5. package/dist/CUPS.js +35 -14
  6. package/dist/ClusterCosmos.d.ts +68 -0
  7. package/dist/ClusterCosmos.d.ts.map +1 -0
  8. package/dist/ClusterCosmos.js +576 -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/ContextProvider.d.ts +34 -0
  13. package/dist/ContextProvider.d.ts.map +1 -0
  14. package/dist/ContextProvider.js +40 -0
  15. package/dist/Emailer/Sendgrid.d.ts +110 -146
  16. package/dist/Emailer/Sendgrid.d.ts.map +1 -1
  17. package/dist/Emailer/Sendgrid.js +24 -19
  18. package/dist/Emailer/fake.d.ts +1 -1
  19. package/dist/Emailer/fake.d.ts.map +1 -1
  20. package/dist/Emailer/fake.js +4 -4
  21. package/dist/MainFiberSet.d.ts +12 -8
  22. package/dist/MainFiberSet.d.ts.map +1 -1
  23. package/dist/MainFiberSet.js +23 -7
  24. package/dist/QueueMaker/errors.d.ts +4 -2
  25. package/dist/QueueMaker/errors.d.ts.map +1 -1
  26. package/dist/QueueMaker/errors.js +4 -2
  27. package/dist/{adapters/SQL → SQL}/Model.d.ts +31 -42
  28. package/dist/SQL/Model.d.ts.map +1 -0
  29. package/dist/SQL/Model.js +469 -0
  30. package/dist/SQL.d.ts.map +1 -0
  31. package/dist/{adapters/SQL.js → SQL.js} +1 -1
  32. package/dist/Store/Cosmos/query.d.ts +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 +392 -256
  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 +87 -42
  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 +346 -76
  44. package/dist/Store/SQL/Pg.d.ts +4 -0
  45. package/dist/Store/SQL/Pg.d.ts.map +1 -0
  46. package/dist/Store/SQL/Pg.js +257 -0
  47. package/dist/Store/SQL/query.d.ts +53 -0
  48. package/dist/Store/SQL/query.d.ts.map +1 -0
  49. package/dist/Store/SQL/query.js +656 -0
  50. package/dist/Store/SQL.d.ts +21 -0
  51. package/dist/Store/SQL.d.ts.map +1 -0
  52. package/dist/Store/SQL.js +478 -0
  53. package/dist/Store/codeFilter.d.ts +4 -4
  54. package/dist/Store/codeFilter.d.ts.map +1 -1
  55. package/dist/Store/codeFilter.js +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 +18 -5
  59. package/dist/Store/jsonDocument.d.ts +13 -0
  60. package/dist/Store/jsonDocument.d.ts.map +1 -0
  61. package/dist/Store/jsonDocument.js +31 -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 +29 -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 +2 -2
  72. package/dist/arbs.d.ts.map +1 -1
  73. package/dist/arbs.js +5 -3
  74. package/dist/codec.d.ts.map +1 -0
  75. package/dist/codec.js +5 -0
  76. package/dist/{adapters/cosmos-client.d.ts → cosmos-client.d.ts} +4 -2
  77. package/dist/cosmos-client.d.ts.map +1 -0
  78. package/dist/cosmos-client.js +11 -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/internal/health.d.ts.map +1 -0
  98. package/dist/internal/health.js +5 -0
  99. package/dist/{api/layerUtils.d.ts → layerUtils.d.ts} +14 -6
  100. package/dist/layerUtils.d.ts.map +1 -0
  101. package/dist/layerUtils.js +17 -0
  102. package/dist/logger/jsonLogger.d.ts +1 -1
  103. package/dist/logger/jsonLogger.d.ts.map +1 -1
  104. package/dist/logger/jsonLogger.js +5 -3
  105. package/dist/logger/logFmtLogger.d.ts +1 -1
  106. package/dist/logger/logFmtLogger.d.ts.map +1 -1
  107. package/dist/logger/logFmtLogger.js +3 -3
  108. package/dist/logger/shared.d.ts +2 -2
  109. package/dist/logger/shared.d.ts.map +1 -1
  110. package/dist/logger/shared.js +5 -5
  111. package/dist/logger.d.ts +4 -4
  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} +3 -2
  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} +5 -2
  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 +4 -3
  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/routing/middleware/middleware.d.ts +48 -0
  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 +49 -41
  157. package/package.json +38 -352
  158. package/src/CUPS.ts +53 -14
  159. package/src/ClusterCosmos.ts +1154 -0
  160. package/src/ClusterServiceBus.ts +244 -0
  161. package/src/{api/ContextProvider.ts → ContextProvider.ts} +20 -17
  162. package/src/Emailer/Sendgrid.ts +83 -60
  163. package/src/Emailer/fake.ts +4 -4
  164. package/src/MainFiberSet.ts +32 -13
  165. package/src/QueueMaker/errors.ts +3 -1
  166. package/src/{adapters/SQL → SQL}/Model.ts +42 -41
  167. package/src/SQL.ts +1 -0
  168. package/src/Store/Cosmos/query.ts +275 -55
  169. package/src/Store/Cosmos.ts +537 -367
  170. package/src/Store/Disk.ts +137 -74
  171. package/src/Store/Memory.ts +402 -113
  172. package/src/Store/SQL/Pg.ts +402 -0
  173. package/src/Store/SQL/query.ts +748 -0
  174. package/src/Store/SQL.ts +786 -0
  175. package/src/Store/codeFilter.ts +78 -28
  176. package/src/Store/index.ts +25 -10
  177. package/src/Store/jsonDocument.ts +43 -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 +6 -4
  182. package/src/{adapters/cosmos-client.ts → cosmos-client.ts} +5 -3
  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 +22 -13
  189. package/src/{api/layerUtils.ts → layerUtils.ts} +14 -10
  190. package/src/logger/jsonLogger.ts +5 -3
  191. package/src/logger/logFmtLogger.ts +3 -3
  192. package/src/logger/shared.ts +5 -4
  193. package/src/middlewares.ts +10 -0
  194. package/src/{adapters/mongo-client.ts → mongo-client.ts} +4 -2
  195. package/src/otel.ts +177 -0
  196. package/src/rateLimit.ts +35 -24
  197. package/src/{adapters/redis-client.ts → redis-client.ts} +7 -3
  198. package/src/{api/reportError.ts → reportError.ts} +3 -2
  199. package/src/{api/routing → routing}/middleware/RouterMiddleware.ts +5 -4
  200. package/src/routing/middleware/middleware.ts +196 -0
  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/auth.test.ts +101 -0
  208. package/test/cluster-cosmos.test.ts +612 -0
  209. package/test/cluster-servicebus.test.ts +180 -0
  210. package/test/cluster-sqlite.test.ts +207 -0
  211. package/test/contextProvider.test.ts +15 -12
  212. package/test/controller.test.ts +28 -32
  213. package/test/cosmos-query.test.ts +323 -0
  214. package/test/dist/auth.test.d.ts.map +1 -0
  215. package/test/dist/cluster-cosmos.test.d.ts.map +1 -0
  216. package/test/dist/cluster-servicebus.test.d.ts.map +1 -0
  217. package/test/dist/cluster-sqlite.test.d.ts.map +1 -0
  218. package/test/dist/contextProvider.test.d.ts.map +1 -1
  219. package/test/dist/controller.test.d.ts.map +1 -1
  220. package/test/dist/cosmos-query.test.d.ts.map +1 -0
  221. package/test/dist/fixtures.d.ts +29 -11
  222. package/test/dist/fixtures.d.ts.map +1 -1
  223. package/test/dist/fixtures.js +17 -10
  224. package/test/dist/json-lower.test.d.ts.map +1 -0
  225. package/test/dist/query.test.d.ts.map +1 -1
  226. package/test/dist/rawQuery.test.d.ts.map +1 -1
  227. package/test/dist/repository-ext.test.d.ts.map +1 -0
  228. package/test/dist/requires.test.d.ts.map +1 -1
  229. package/test/dist/router-generator.test.d.ts.map +1 -0
  230. package/test/dist/routing-interruptibility.test.d.ts.map +1 -0
  231. package/test/dist/rpc-context-map-streaming.test.d.ts.map +1 -0
  232. package/test/dist/rpc-e2e-invalidation.test.d.ts.map +1 -0
  233. package/test/dist/rpc-multi-middleware.test.d.ts.map +1 -1
  234. package/test/dist/rpc-stream-fullstack.test.d.ts.map +1 -0
  235. package/test/dist/sql-store.test.d.ts.map +1 -0
  236. package/test/dist/workflow-engine-cosmos.test.d.ts.map +1 -0
  237. package/test/dist/workflow-engine-sqlite.test.d.ts.map +1 -0
  238. package/test/fixtures.ts +16 -9
  239. package/test/json-lower.test.ts +115 -0
  240. package/test/layerUtils.test.ts +2 -2
  241. package/test/query.test.ts +1384 -46
  242. package/test/rawQuery.test.ts +340 -22
  243. package/test/repository-ext.test.ts +456 -0
  244. package/test/requires.test.ts +10 -5
  245. package/test/router-generator.test.ts +187 -0
  246. package/test/routing-interruptibility.test.ts +66 -0
  247. package/test/rpc-context-map-streaming.test.ts +262 -0
  248. package/test/rpc-e2e-invalidation.test.ts +418 -0
  249. package/test/rpc-multi-middleware.test.ts +85 -10
  250. package/test/rpc-stream-fullstack.test.ts +304 -0
  251. package/test/sql-store.test.ts +1905 -0
  252. package/test/validateSample.test.ts +26 -14
  253. package/test/workflow-engine-cosmos.test.ts +345 -0
  254. package/test/workflow-engine-sqlite.test.ts +297 -0
  255. package/tsconfig.examples.json +1 -1
  256. package/tsconfig.json +9 -2
  257. package/tsconfig.src.json +35 -35
  258. package/tsconfig.test.json +2 -2
  259. package/dist/Emailer/service.d.ts +0 -55
  260. package/dist/Emailer/service.d.ts.map +0 -1
  261. package/dist/Emailer/service.js +0 -6
  262. package/dist/Emailer.d.ts +0 -2
  263. package/dist/Emailer.d.ts.map +0 -1
  264. package/dist/Emailer.js +0 -2
  265. package/dist/Model/Repository/ext.d.ts +0 -41
  266. package/dist/Model/Repository/ext.d.ts.map +0 -1
  267. package/dist/Model/Repository/ext.js +0 -65
  268. package/dist/Model/Repository/internal/internal.d.ts +0 -59
  269. package/dist/Model/Repository/internal/internal.d.ts.map +0 -1
  270. package/dist/Model/Repository/internal/internal.js +0 -316
  271. package/dist/Model/Repository/legacy.d.ts +0 -19
  272. package/dist/Model/Repository/legacy.d.ts.map +0 -1
  273. package/dist/Model/Repository/legacy.js +0 -2
  274. package/dist/Model/Repository/makeRepo.d.ts +0 -49
  275. package/dist/Model/Repository/makeRepo.d.ts.map +0 -1
  276. package/dist/Model/Repository/makeRepo.js +0 -24
  277. package/dist/Model/Repository/service.d.ts +0 -89
  278. package/dist/Model/Repository/service.d.ts.map +0 -1
  279. package/dist/Model/Repository/service.js +0 -2
  280. package/dist/Model/Repository/validation.d.ts +0 -42
  281. package/dist/Model/Repository/validation.d.ts.map +0 -1
  282. package/dist/Model/Repository/validation.js +0 -32
  283. package/dist/Model/Repository.d.ts +0 -6
  284. package/dist/Model/Repository.d.ts.map +0 -1
  285. package/dist/Model/Repository.js +0 -6
  286. package/dist/Model/dsl.d.ts +0 -32
  287. package/dist/Model/dsl.d.ts.map +0 -1
  288. package/dist/Model/dsl.js +0 -44
  289. package/dist/Model/filter/filterApi.d.ts +0 -30
  290. package/dist/Model/filter/filterApi.d.ts.map +0 -1
  291. package/dist/Model/filter/filterApi.js +0 -2
  292. package/dist/Model/filter/types/errors.d.ts +0 -29
  293. package/dist/Model/filter/types/errors.d.ts.map +0 -1
  294. package/dist/Model/filter/types/errors.js +0 -2
  295. package/dist/Model/filter/types/fields.d.ts +0 -15
  296. package/dist/Model/filter/types/fields.d.ts.map +0 -1
  297. package/dist/Model/filter/types/fields.js +0 -2
  298. package/dist/Model/filter/types/path/common.d.ts +0 -316
  299. package/dist/Model/filter/types/path/common.d.ts.map +0 -1
  300. package/dist/Model/filter/types/path/common.js +0 -2
  301. package/dist/Model/filter/types/path/eager.d.ts +0 -95
  302. package/dist/Model/filter/types/path/eager.d.ts.map +0 -1
  303. package/dist/Model/filter/types/path/eager.js +0 -31
  304. package/dist/Model/filter/types/path/index.d.ts +0 -4
  305. package/dist/Model/filter/types/path/index.d.ts.map +0 -1
  306. package/dist/Model/filter/types/path/index.js +0 -3
  307. package/dist/Model/filter/types/utils.d.ts +0 -79
  308. package/dist/Model/filter/types/utils.d.ts.map +0 -1
  309. package/dist/Model/filter/types/utils.js +0 -2
  310. package/dist/Model/filter/types/validator.d.ts +0 -30
  311. package/dist/Model/filter/types/validator.d.ts.map +0 -1
  312. package/dist/Model/filter/types/validator.js +0 -2
  313. package/dist/Model/filter/types.d.ts +0 -5
  314. package/dist/Model/filter/types.d.ts.map +0 -1
  315. package/dist/Model/filter/types.js +0 -7
  316. package/dist/Model/query/dsl.d.ts +0 -248
  317. package/dist/Model/query/dsl.d.ts.map +0 -1
  318. package/dist/Model/query/dsl.js +0 -104
  319. package/dist/Model/query/new-kid-interpreter.d.ts +0 -28
  320. package/dist/Model/query/new-kid-interpreter.d.ts.map +0 -1
  321. package/dist/Model/query/new-kid-interpreter.js +0 -165
  322. package/dist/Model/query.d.ts +0 -15
  323. package/dist/Model/query.d.ts.map +0 -1
  324. package/dist/Model/query.js +0 -3
  325. package/dist/Model.d.ts +0 -4
  326. package/dist/Model.d.ts.map +0 -1
  327. package/dist/Model.js +0 -4
  328. package/dist/Operations.d.ts +0 -55
  329. package/dist/Operations.d.ts.map +0 -1
  330. package/dist/Operations.js +0 -102
  331. package/dist/OperationsRepo.d.ts +0 -41
  332. package/dist/OperationsRepo.d.ts.map +0 -1
  333. package/dist/OperationsRepo.js +0 -14
  334. package/dist/QueueMaker/SQLQueue.d.ts +0 -16
  335. package/dist/QueueMaker/SQLQueue.d.ts.map +0 -1
  336. package/dist/QueueMaker/SQLQueue.js +0 -130
  337. package/dist/QueueMaker/memQueue.d.ts +0 -11
  338. package/dist/QueueMaker/memQueue.d.ts.map +0 -1
  339. package/dist/QueueMaker/memQueue.js +0 -76
  340. package/dist/QueueMaker/sbqueue.d.ts +0 -12
  341. package/dist/QueueMaker/sbqueue.d.ts.map +0 -1
  342. package/dist/QueueMaker/sbqueue.js +0 -91
  343. package/dist/QueueMaker/service.d.ts +0 -11
  344. package/dist/QueueMaker/service.d.ts.map +0 -1
  345. package/dist/QueueMaker/service.js +0 -4
  346. package/dist/RequestContext.d.ts +0 -63
  347. package/dist/RequestContext.d.ts.map +0 -1
  348. package/dist/RequestContext.js +0 -49
  349. package/dist/RequestFiberSet.d.ts +0 -36
  350. package/dist/RequestFiberSet.d.ts.map +0 -1
  351. package/dist/RequestFiberSet.js +0 -78
  352. package/dist/Store/ContextMapContainer.d.ts +0 -14
  353. package/dist/Store/ContextMapContainer.d.ts.map +0 -1
  354. package/dist/Store/ContextMapContainer.js +0 -16
  355. package/dist/Store/service.d.ts +0 -108
  356. package/dist/Store/service.d.ts.map +0 -1
  357. package/dist/Store/service.js +0 -71
  358. package/dist/Store.d.ts +0 -2
  359. package/dist/Store.d.ts.map +0 -1
  360. package/dist/Store.js +0 -2
  361. package/dist/adapters/SQL/Model.d.ts.map +0 -1
  362. package/dist/adapters/SQL/Model.js +0 -478
  363. package/dist/adapters/SQL.d.ts.map +0 -1
  364. package/dist/adapters/ServiceBus.d.ts +0 -58
  365. package/dist/adapters/ServiceBus.d.ts.map +0 -1
  366. package/dist/adapters/ServiceBus.js +0 -99
  367. package/dist/adapters/cosmos-client.d.ts.map +0 -1
  368. package/dist/adapters/cosmos-client.js +0 -9
  369. package/dist/adapters/index.d.ts +0 -2
  370. package/dist/adapters/index.d.ts.map +0 -1
  371. package/dist/adapters/index.js +0 -2
  372. package/dist/adapters/logger.d.ts +0 -9
  373. package/dist/adapters/logger.d.ts.map +0 -1
  374. package/dist/adapters/logger.js +0 -3
  375. package/dist/adapters/memQueue.d.ts +0 -13
  376. package/dist/adapters/memQueue.d.ts.map +0 -1
  377. package/dist/adapters/memQueue.js +0 -20
  378. package/dist/adapters/mongo-client.d.ts.map +0 -1
  379. package/dist/adapters/mongo-client.js +0 -13
  380. package/dist/adapters/redis-client.d.ts.map +0 -1
  381. package/dist/adapters/redis-client.js +0 -94
  382. package/dist/api/ContextProvider.d.ts +0 -31
  383. package/dist/api/ContextProvider.d.ts.map +0 -1
  384. package/dist/api/ContextProvider.js +0 -38
  385. package/dist/api/codec.d.ts.map +0 -1
  386. package/dist/api/codec.js +0 -5
  387. package/dist/api/internal/RequestContextMiddleware.d.ts +0 -5
  388. package/dist/api/internal/RequestContextMiddleware.d.ts.map +0 -1
  389. package/dist/api/internal/RequestContextMiddleware.js +0 -35
  390. package/dist/api/internal/auth.d.ts +0 -15
  391. package/dist/api/internal/auth.d.ts.map +0 -1
  392. package/dist/api/internal/auth.js +0 -47
  393. package/dist/api/internal/events.d.ts +0 -9
  394. package/dist/api/internal/events.d.ts.map +0 -1
  395. package/dist/api/internal/events.js +0 -42
  396. package/dist/api/internal/health.d.ts.map +0 -1
  397. package/dist/api/internal/health.js +0 -5
  398. package/dist/api/layerUtils.d.ts.map +0 -1
  399. package/dist/api/layerUtils.js +0 -16
  400. package/dist/api/middlewares.d.ts.map +0 -1
  401. package/dist/api/reportError.d.ts.map +0 -1
  402. package/dist/api/reportError.js +0 -27
  403. package/dist/api/routing/middleware/RouterMiddleware.d.ts.map +0 -1
  404. package/dist/api/routing/middleware/middleware.d.ts +0 -9
  405. package/dist/api/routing/middleware/middleware.d.ts.map +0 -1
  406. package/dist/api/routing/middleware/middleware.js +0 -92
  407. package/dist/api/routing/middleware.d.ts.map +0 -1
  408. package/dist/api/routing/schema/jwt.d.ts.map +0 -1
  409. package/dist/api/routing/schema/jwt.js +0 -12
  410. package/dist/api/routing/tsort.d.ts.map +0 -1
  411. package/dist/api/routing/tsort.js +0 -51
  412. package/dist/api/routing/utils.d.ts.map +0 -1
  413. package/dist/api/routing/utils.js +0 -44
  414. package/dist/api/routing.d.ts +0 -138
  415. package/dist/api/routing.d.ts.map +0 -1
  416. package/dist/api/routing.js +0 -166
  417. package/dist/api/setupRequest.d.ts +0 -12
  418. package/dist/api/setupRequest.d.ts.map +0 -1
  419. package/dist/api/setupRequest.js +0 -44
  420. package/dist/api/util.d.ts.map +0 -1
  421. package/dist/api/util.js +0 -14
  422. package/eslint.config.mjs +0 -24
  423. package/src/Emailer/service.ts +0 -52
  424. package/src/Emailer.ts +0 -1
  425. package/src/Model/Repository/ext.ts +0 -283
  426. package/src/Model/Repository/internal/internal.ts +0 -577
  427. package/src/Model/Repository/legacy.ts +0 -27
  428. package/src/Model/Repository/makeRepo.ts +0 -139
  429. package/src/Model/Repository/service.ts +0 -627
  430. package/src/Model/Repository/validation.ts +0 -31
  431. package/src/Model/Repository.ts +0 -5
  432. package/src/Model/dsl.ts +0 -128
  433. package/src/Model/filter/filterApi.ts +0 -60
  434. package/src/Model/filter/types/errors.ts +0 -47
  435. package/src/Model/filter/types/fields.ts +0 -50
  436. package/src/Model/filter/types/path/common.ts +0 -404
  437. package/src/Model/filter/types/path/eager.ts +0 -298
  438. package/src/Model/filter/types/path/index.ts +0 -4
  439. package/src/Model/filter/types/utils.ts +0 -128
  440. package/src/Model/filter/types/validator.ts +0 -46
  441. package/src/Model/filter/types.ts +0 -6
  442. package/src/Model/query/dsl.ts +0 -2110
  443. package/src/Model/query/new-kid-interpreter.ts +0 -210
  444. package/src/Model/query.ts +0 -13
  445. package/src/Model.ts +0 -3
  446. package/src/Operations.ts +0 -235
  447. package/src/OperationsRepo.ts +0 -16
  448. package/src/QueueMaker/SQLQueue.ts +0 -189
  449. package/src/QueueMaker/memQueue.ts +0 -130
  450. package/src/QueueMaker/sbqueue.ts +0 -137
  451. package/src/QueueMaker/service.ts +0 -17
  452. package/src/RequestContext.ts +0 -63
  453. package/src/RequestFiberSet.ts +0 -105
  454. package/src/Store/ContextMapContainer.ts +0 -20
  455. package/src/Store/index.test.ts.bak +0 -112
  456. package/src/Store/service.ts +0 -184
  457. package/src/Store.ts +0 -1
  458. package/src/adapters/SQL.ts +0 -1
  459. package/src/adapters/ServiceBus.ts +0 -209
  460. package/src/adapters/index.ts +0 -0
  461. package/src/adapters/logger.ts +0 -3
  462. package/src/adapters/memQueue.ts +0 -21
  463. package/src/api/internal/auth.ts +0 -68
  464. package/src/api/middlewares.ts +0 -10
  465. package/src/api/routing/middleware/middleware.ts +0 -128
  466. package/src/api/routing/middleware.ts +0 -6
  467. package/src/api/routing.ts +0 -598
  468. package/src/api/setupRequest.ts +0 -84
  469. package/tsconfig.json.bak +0 -12
  470. /package/dist/{adapters/SQL.d.ts → SQL.d.ts} +0 -0
  471. /package/dist/{api/codec.d.ts → codec.d.ts} +0 -0
  472. /package/dist/{api/internal → internal}/health.d.ts +0 -0
  473. /package/dist/{api/middlewares.d.ts → middlewares.d.ts} +0 -0
  474. /package/dist/{api/routing → routing}/schema/jwt.d.ts +0 -0
  475. /package/dist/{api/routing → routing}/tsort.d.ts +0 -0
  476. /package/dist/{api/util.d.ts → util.d.ts} +0 -0
  477. /package/src/{api/codec.ts → codec.ts} +0 -0
  478. /package/src/{api/internal → internal}/health.ts +0 -0
  479. /package/src/{api/routing → routing}/tsort.ts +0 -0
  480. /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, Effect, flow, type NonEmptyReadonlyArray, Option, Order, pipe, Ref, Result, Semaphore, ServiceMap, Struct } from "effect-app"
4
- import { NonEmptyString255 } from "effect-app/Schema"
5
- import { get } from "effect-app/utils"
6
- import { InfraLogger } from "../logger.js"
7
- import type { FieldValues } from "../Model/filter/types.js"
8
- import { codeFilter, codeFilter3_ } from "./codeFilter.js"
9
- import { type FilterArgs, type PersistenceModelType, type Store, type StoreConfig, StoreMaker } from "./service.js"
10
- import { makeUpdateETag } from "./utils.js"
3
+ import * as Array from "effect-app/Array"
4
+ import type { NonEmptyReadonlyArray } from "effect-app/Array"
5
+ import * as Effect from "effect-app/Effect"
6
+ import type { FilterResult } from "effect-app/Model/filter/filterApi"
7
+ import type { FieldValues } from "effect-app/Model/filter/types"
8
+ import type { AggregateIrExpression, ComputedProjectionIrExpression, ComputedProjectionMathIrExpression } from "effect-app/Model/query"
9
+ import * as Option from "effect-app/Option"
10
+ import { type FilterArgs, type PersistenceModelType, type Store, type StoreConfig, storeId, StoreMaker } from "effect-app/Store"
11
+ import { assertUnreachable } from "effect-app/utils"
12
+ import { flow, pipe } from "effect/Function"
13
+ import * as Order from "effect/Order"
14
+ import * as Ref from "effect/Ref"
15
+ import * as Result from "effect/Result"
16
+ import * as Semaphore from "effect/Semaphore"
17
+ import * as Struct from "effect/Struct"
18
+ import { InfraLogger } from "../logger.ts"
19
+ import { annotateDb } from "../otel.ts"
20
+ import { codeFilter, codeFilter3_ } from "./codeFilter.ts"
21
+ import { makeJsonDocumentCodec } 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 [keys, entries] = 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 ServiceMap.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,38 @@ 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
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
+ const decodeDoc = (e: PM): PM => codec.decode(e)
104
346
  const items_ = yield* seed ?? Effect.sync(() => [])
105
- const defaultValues = _defaultValues ?? {}
347
+ const toJson = json?.toJson ?? toJsonQueryValue
348
+ const lowerFilter = json?.jsonifyFilter ?? jsonifyFilter
349
+ const encodedDefaults = toJson(_defaultValues ?? {}) as Partial<Encoded>
106
350
 
107
- const items = new Map([...items_].map((_) => [_[idKey], { _etag: undefined, ...defaultValues, ..._ }] as const))
351
+ const items = new Map(
352
+ [...items_].map((_) => {
353
+ const encoded = encodeDoc({ ...encodedDefaults, ..._ })
354
+ return [encoded[idKey], encoded] as const
355
+ })
356
+ )
108
357
  const store = Ref.makeUnsafe<ReadonlyMap<Encoded[IdKey], PM>>(items)
109
358
  const sem = Semaphore.makeUnsafe(1)
110
359
  const withPermit = sem.withPermits(1)
111
360
  const values = Effect.map(Ref.get(store), (s) => s.values())
112
361
 
113
- const all = Effect.map(values, Array.fromIterable)
362
+ const allStored = Effect.map(values, Array.fromIterable)
363
+ const all = Effect.map(allStored, (rows) => rows.map(decodeDoc))
114
364
 
115
365
  const batchSet = (items: NonEmptyReadonlyArray<PM>) =>
116
366
  Effect
117
- .forEach(items, (i) => Effect.flatMap(s.find(i[idKey]), (current) => updateETag(i, idKey, current)))
367
+ .forEach(items, (i) => Effect.flatMap(s.find(i[idKey]), (current) => updateETag(encodeDoc(i), idKey, current)))
118
368
  .pipe(
119
369
  Effect
120
370
  .tap((items) =>
@@ -132,7 +382,7 @@ export function makeMemoryStoreInt<IdKey extends keyof Encoded, Encoded extends
132
382
  )
133
383
  ),
134
384
  Effect
135
- .map((_) => _),
385
+ .map((items) => items.map(decodeDoc) as unknown as NonEmptyReadonlyArray<PM>),
136
386
  withPermit
137
387
  )
138
388
 
@@ -151,61 +401,83 @@ export function makeMemoryStoreInt<IdKey extends keyof Encoded, Encoded extends
151
401
  withPermit
152
402
  )
153
403
  const s: Store<IdKey, Encoded> = {
404
+ seedNamespace: () => Effect.void,
405
+
154
406
  queryRaw: (query) =>
155
407
  all
156
408
  .pipe(
157
409
  // Effect.tap(() => logQuery(query, defaultValues)),
158
410
  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 })
411
+ annotateDb({
412
+ operation: "queryRaw",
413
+ system: "memory",
414
+ collection: modelName,
415
+ namespace,
416
+ entity: modelName
417
+ })
162
418
  ),
163
419
 
164
- all: all.pipe(Effect.withSpan("Memory.all [effect-app/infra/Store]", {
165
- attributes: {
166
- modelName,
167
- namespace
168
- }
169
- }, { captureStackTrace: false })),
420
+ all: all.pipe(annotateDb({
421
+ operation: "all",
422
+ system: "memory",
423
+ collection: modelName,
424
+ namespace,
425
+ entity: modelName
426
+ })),
170
427
  find: (id) =>
171
428
  Ref
172
429
  .get(store)
173
430
  .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 })
431
+ Effect.map((_) => Option.fromNullishOr(_.get(id)).pipe(Option.map(decodeDoc))),
432
+ annotateDb({
433
+ operation: "find",
434
+ system: "memory",
435
+ collection: modelName,
436
+ namespace,
437
+ entity: modelName,
438
+ extra: { "app.entity.id": id }
439
+ })
182
440
  ),
183
- filter: (f) =>
184
- all
441
+ filter: <U extends keyof Encoded = never>(f: FilterArgs<Encoded, U>) =>
442
+ allStored
185
443
  .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 })
444
+ Effect.tap(() => logQuery(f, encodedDefaults)),
445
+ Effect.map(memFilter({ ...f, filter: f.filter ? lowerFilter(f.filter) : f.filter })),
446
+ Effect.map((rows): (U extends undefined ? Encoded : Pick<Encoded, U>)[] =>
447
+ f.select
448
+ ? rows as (U extends undefined ? Encoded : Pick<Encoded, U>)[]
449
+ : rows.map(decodeDoc) as (U extends undefined ? Encoded : Pick<Encoded, U>)[]
450
+ ),
451
+ annotateDb({
452
+ operation: "filter",
453
+ system: "memory",
454
+ collection: modelName,
455
+ namespace,
456
+ entity: modelName
457
+ })
191
458
  ),
192
459
  set: (e) =>
193
460
  s
194
461
  .find(e[idKey])
195
462
  .pipe(
196
- Effect.flatMap((current) => updateETag(e, idKey, current)),
463
+ Effect.flatMap((current) => updateETag(encodeDoc(e), idKey, current.pipe(Option.map(encodeDoc)))),
197
464
  Effect
198
- .tap((e) =>
465
+ .tap((stored) =>
199
466
  Ref.get(store).pipe(
200
- Effect.map((_) => new Map([..._, [e[idKey], e]])),
467
+ Effect.map((_) => new Map([..._, [stored[idKey], stored]])),
201
468
  Effect.flatMap((_) => Ref.set(store, _))
202
469
  )
203
470
  ),
471
+ Effect.map(decodeDoc),
204
472
  withPermit,
205
- Effect
206
- .withSpan("Memory.set [effect-app/infra/Store]", {
207
- attributes: { "repository.model_name": modelName, "repository.namespace": namespace }
208
- }, { captureStackTrace: false })
473
+ annotateDb({
474
+ operation: "set",
475
+ system: "memory",
476
+ collection: modelName,
477
+ namespace,
478
+ entity: modelName,
479
+ extra: { "app.entity.id": e[idKey] }
480
+ })
209
481
  ),
210
482
  batchRemove: (items: NonEmptyReadonlyArray<Encoded[IdKey]>) =>
211
483
  pipe(
@@ -216,10 +488,13 @@ export function makeMemoryStoreInt<IdKey extends keyof Encoded, Encoded extends
216
488
  Effect.filterOrFail((_) => _.length <= 100, () => "BatchRemove: a batch may not exceed 100 items"),
217
489
  Effect.orDie,
218
490
  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 })
491
+ annotateDb({
492
+ operation: "batchRemove",
493
+ system: "memory",
494
+ collection: modelName,
495
+ namespace,
496
+ entity: modelName
497
+ })
223
498
  )
224
499
  ),
225
500
  batchSet: (items: readonly [PM, ...PM[]]) =>
@@ -231,18 +506,25 @@ export function makeMemoryStoreInt<IdKey extends keyof Encoded, Encoded extends
231
506
  Effect.filterOrFail((_) => _.length <= 100, () => "BatchSet: a batch may not exceed 100 items"),
232
507
  Effect.orDie,
233
508
  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 })
509
+ annotateDb({
510
+ operation: "batchSet",
511
+ system: "memory",
512
+ collection: modelName,
513
+ namespace,
514
+ entity: modelName
515
+ })
238
516
  )
239
517
  ),
240
518
  bulkSet: flow(
241
519
  batchSet,
242
520
  (_) =>
243
- _.pipe(Effect.withSpan("Memory.bulkSet [effect-app/infra/Store]", {
244
- attributes: { "repository.model_name": modelName, "repository.namespace": namespace }
245
- }, { captureStackTrace: false }))
521
+ _.pipe(annotateDb({
522
+ operation: "bulkSet",
523
+ system: "memory",
524
+ collection: modelName,
525
+ namespace,
526
+ entity: modelName
527
+ }))
246
528
  )
247
529
  }
248
530
  return s
@@ -250,56 +532,63 @@ export function makeMemoryStoreInt<IdKey extends keyof Encoded, Encoded extends
250
532
  }
251
533
 
252
534
  export const makeMemoryStore = () => ({
253
- make: <IdKey extends keyof Encoded, Encoded extends FieldValues, R, E>(
535
+ make: Effect.fnUntraced(function*<IdKey extends keyof Encoded, Encoded extends FieldValues, R, E>(
254
536
  modelName: string,
255
537
  idKey: IdKey,
256
538
  seed?: Effect.Effect<Iterable<Encoded>, E, R>,
257
539
  config?: StoreConfig<Encoded>
258
- ) =>
259
- Effect.gen(function*() {
260
- const storesSem = Semaphore.makeUnsafe(1)
261
- const primary = yield* makeMemoryStoreInt<IdKey, Encoded, R, E>(
262
- modelName,
263
- idKey,
264
- "primary",
265
- seed,
266
- config?.defaultValues
267
- )
268
- const ctx = yield* Effect.services<R>()
269
- const stores = new Map([["primary", primary]])
270
- const getStore = !config?.allowNamespace
271
- ? Effect.succeed(primary)
272
- : storeId.asEffect().pipe(Effect.flatMap((namespace) => {
273
- const store = stores.get(namespace)
274
- if (store) {
275
- return Effect.succeed(store)
276
- }
277
- if (!config.allowNamespace!(namespace)) {
278
- throw new Error(`Namespace ${namespace} not allowed!`)
279
- }
280
- return storesSem.withPermits(1)(Effect.suspend(() => {
281
- const store = stores.get(namespace)
282
- if (store) return Effect.sync(() => store)
283
- return makeMemoryStoreInt(modelName, idKey, namespace, seed, config?.defaultValues)
284
- .pipe(
285
- Effect.orDie,
286
- Effect.provide(ctx),
287
- Effect.tap((store) => Effect.sync(() => stores.set(namespace, store)))
288
- )
289
- }))
290
- }))
291
- const s: Store<IdKey, Encoded> = {
292
- all: Effect.flatMap(getStore, (_) => _.all),
293
- queryRaw: (...args) => Effect.flatMap(getStore, (_) => _.queryRaw(...args)),
294
- find: (...args) => Effect.flatMap(getStore, (_) => _.find(...args)),
295
- filter: (...args) => Effect.flatMap(getStore, (_) => _.filter(...args)),
296
- set: (...args) => Effect.flatMap(getStore, (_) => _.set(...args)),
297
- batchSet: (...args) => Effect.flatMap(getStore, (_) => _.batchSet(...args)),
298
- bulkSet: (...args) => Effect.flatMap(getStore, (_) => _.bulkSet(...args)),
299
- batchRemove: (...args) => Effect.flatMap(getStore, (_) => _.batchRemove(...args))
540
+ ) {
541
+ const json = makeJsonLower(config)
542
+ const primary = yield* makeMemoryStoreInt<IdKey, Encoded, R, E>(
543
+ modelName,
544
+ idKey,
545
+ "primary",
546
+ seed,
547
+ config?.defaultValues,
548
+ config?.schema,
549
+ json
550
+ )
551
+ const ctx = yield* Effect.context<R>()
552
+ const stores = new Map([["primary", primary]])
553
+ const semaphores = new Map<string, Semaphore.Semaphore>()
554
+ const getSem = (ns: string) => {
555
+ let sem = semaphores.get(ns)
556
+ if (!sem) {
557
+ sem = Semaphore.makeUnsafe(1)
558
+ semaphores.set(ns, sem)
300
559
  }
301
- return s
302
- })
560
+ return sem
561
+ }
562
+ const ensureStore = (namespace: string) =>
563
+ getSem(namespace).withPermits(1)(Effect.suspend(() => {
564
+ const store = stores.get(namespace)
565
+ if (store) return Effect.succeed(store)
566
+ if (config?.allowNamespace && !config.allowNamespace(namespace)) {
567
+ throw new Error(`Namespace ${namespace} not allowed!`)
568
+ }
569
+ return makeMemoryStoreInt(modelName, idKey, namespace, seed, config?.defaultValues, config?.schema, json)
570
+ .pipe(
571
+ Effect.orDie,
572
+ Effect.provide(ctx),
573
+ Effect.tap((store) => Effect.sync(() => stores.set(namespace, store)))
574
+ )
575
+ }))
576
+ const getStore = !config?.allowNamespace
577
+ ? Effect.succeed(primary)
578
+ : storeId.pipe(Effect.flatMap((namespace) => ensureStore(namespace)))
579
+ const s: Store<IdKey, Encoded> = {
580
+ seedNamespace: (namespace) => ensureStore(namespace).pipe(Effect.asVoid),
581
+ all: Effect.flatMap(getStore, (_) => _.all),
582
+ queryRaw: (...args) => Effect.flatMap(getStore, (_) => _.queryRaw(...args)),
583
+ find: (...args) => Effect.flatMap(getStore, (_) => _.find(...args)),
584
+ filter: (...args) => Effect.flatMap(getStore, (_) => _.filter(...args)),
585
+ set: (...args) => Effect.flatMap(getStore, (_) => _.set(...args)),
586
+ batchSet: (...args) => Effect.flatMap(getStore, (_) => _.batchSet(...args)),
587
+ bulkSet: (...args) => Effect.flatMap(getStore, (_) => _.bulkSet(...args)),
588
+ batchRemove: (...args) => Effect.flatMap(getStore, (_) => _.batchRemove(...args))
589
+ }
590
+ return s
591
+ })
303
592
  })
304
593
 
305
594
  export const MemoryStoreLive = StoreMaker.toLayer(Effect.sync(() => makeMemoryStore()))