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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (486) hide show
  1. package/CHANGELOG.md +2891 -0
  2. package/_check.sh +1 -1
  3. package/dist/CUPS.d.ts +28 -9
  4. package/dist/CUPS.d.ts.map +1 -1
  5. package/dist/CUPS.js +35 -14
  6. package/dist/ClusterCosmos.d.ts +67 -0
  7. package/dist/ClusterCosmos.d.ts.map +1 -0
  8. package/dist/ClusterCosmos.js +588 -0
  9. package/dist/ClusterServiceBus.d.ts +67 -0
  10. package/dist/ClusterServiceBus.d.ts.map +1 -0
  11. package/dist/ClusterServiceBus.js +84 -0
  12. package/dist/{api/ContextProvider.d.ts → ContextProvider.d.ts} +7 -4
  13. package/dist/ContextProvider.d.ts.map +1 -0
  14. package/dist/ContextProvider.js +40 -0
  15. package/dist/Emailer/Sendgrid.d.ts +110 -146
  16. package/dist/Emailer/Sendgrid.d.ts.map +1 -1
  17. package/dist/Emailer/Sendgrid.js +24 -19
  18. package/dist/Emailer/fake.d.ts +1 -1
  19. package/dist/Emailer/fake.d.ts.map +1 -1
  20. package/dist/Emailer/fake.js +4 -4
  21. package/dist/MainFiberSet.d.ts +11 -7
  22. package/dist/MainFiberSet.d.ts.map +1 -1
  23. package/dist/MainFiberSet.js +22 -6
  24. package/dist/QueueMaker/errors.d.ts +3 -1
  25. package/dist/QueueMaker/errors.d.ts.map +1 -1
  26. package/dist/QueueMaker/errors.js +4 -2
  27. package/dist/{adapters/SQL → SQL}/Model.d.ts +34 -45
  28. package/dist/SQL/Model.d.ts.map +1 -0
  29. package/dist/SQL/Model.js +469 -0
  30. package/dist/SQL.d.ts.map +1 -0
  31. package/dist/{adapters/SQL.js → SQL.js} +1 -1
  32. package/dist/Store/Cosmos/query.d.ts +16 -4
  33. package/dist/Store/Cosmos/query.d.ts.map +1 -1
  34. package/dist/Store/Cosmos/query.js +238 -42
  35. package/dist/Store/Cosmos.d.ts +2 -2
  36. package/dist/Store/Cosmos.d.ts.map +1 -1
  37. package/dist/Store/Cosmos.js +394 -319
  38. package/dist/Store/Disk.d.ts +4 -4
  39. package/dist/Store/Disk.d.ts.map +1 -1
  40. package/dist/Store/Disk.js +91 -39
  41. package/dist/Store/Memory.d.ts +7 -10
  42. package/dist/Store/Memory.d.ts.map +1 -1
  43. package/dist/Store/Memory.js +348 -78
  44. package/dist/Store/SQL/Pg.d.ts +2 -2
  45. package/dist/Store/SQL/Pg.d.ts.map +1 -1
  46. package/dist/Store/SQL/Pg.js +229 -154
  47. package/dist/Store/SQL/query.d.ts +19 -3
  48. package/dist/Store/SQL/query.d.ts.map +1 -1
  49. package/dist/Store/SQL/query.js +306 -12
  50. package/dist/Store/SQL.d.ts +22 -5
  51. package/dist/Store/SQL.d.ts.map +1 -1
  52. package/dist/Store/SQL.js +369 -98
  53. package/dist/Store/codeFilter.d.ts +4 -4
  54. package/dist/Store/codeFilter.d.ts.map +1 -1
  55. package/dist/Store/codeFilter.js +71 -22
  56. package/dist/Store/index.d.ts +6 -4
  57. package/dist/Store/index.d.ts.map +1 -1
  58. package/dist/Store/index.js +9 -6
  59. package/dist/Store/jsonDocument.d.ts +67 -0
  60. package/dist/Store/jsonDocument.d.ts.map +1 -0
  61. package/dist/Store/jsonDocument.js +107 -0
  62. package/dist/Store/utils.d.ts +21 -2
  63. package/dist/Store/utils.d.ts.map +1 -1
  64. package/dist/Store/utils.js +253 -10
  65. package/dist/WorkflowEngineCosmos.d.ts +30 -0
  66. package/dist/WorkflowEngineCosmos.d.ts.map +1 -0
  67. package/dist/WorkflowEngineCosmos.js +542 -0
  68. package/dist/WorkflowEngineSqlite.d.ts +24 -0
  69. package/dist/WorkflowEngineSqlite.d.ts.map +1 -0
  70. package/dist/WorkflowEngineSqlite.js +550 -0
  71. package/dist/arbs.d.ts +6 -3
  72. package/dist/arbs.d.ts.map +1 -1
  73. package/dist/arbs.js +20 -4
  74. package/dist/codec.d.ts.map +1 -0
  75. package/dist/codec.js +5 -0
  76. package/dist/cosmos-client.d.ts +40 -0
  77. package/dist/cosmos-client.d.ts.map +1 -0
  78. package/dist/cosmos-client.js +41 -0
  79. package/dist/errorReporter.d.ts +6 -4
  80. package/dist/errorReporter.d.ts.map +1 -1
  81. package/dist/errorReporter.js +23 -27
  82. package/dist/fileUtil.d.ts +1 -1
  83. package/dist/fileUtil.d.ts.map +1 -1
  84. package/dist/fileUtil.js +2 -2
  85. package/dist/index.d.ts +2 -1
  86. package/dist/index.d.ts.map +1 -1
  87. package/dist/index.js +3 -2
  88. package/dist/internal/RequestContextMiddleware.d.ts +5 -0
  89. package/dist/internal/RequestContextMiddleware.d.ts.map +1 -0
  90. package/dist/internal/RequestContextMiddleware.js +45 -0
  91. package/dist/internal/auth.d.ts +53 -0
  92. package/dist/internal/auth.d.ts.map +1 -0
  93. package/dist/internal/auth.js +180 -0
  94. package/dist/internal/events.d.ts +11 -0
  95. package/dist/internal/events.d.ts.map +1 -0
  96. package/dist/internal/events.js +49 -0
  97. package/dist/{api/internal → internal}/health.d.ts +1 -1
  98. package/dist/internal/health.d.ts.map +1 -0
  99. package/dist/internal/health.js +5 -0
  100. package/dist/{api/layerUtils.d.ts → layerUtils.d.ts} +10 -2
  101. package/dist/layerUtils.d.ts.map +1 -0
  102. package/dist/layerUtils.js +17 -0
  103. package/dist/logger/jsonLogger.d.ts +1 -1
  104. package/dist/logger/jsonLogger.d.ts.map +1 -1
  105. package/dist/logger/jsonLogger.js +5 -3
  106. package/dist/logger/logFmtLogger.d.ts +1 -1
  107. package/dist/logger/logFmtLogger.d.ts.map +1 -1
  108. package/dist/logger/logFmtLogger.js +3 -3
  109. package/dist/logger/shared.d.ts +2 -2
  110. package/dist/logger/shared.d.ts.map +1 -1
  111. package/dist/logger/shared.js +6 -6
  112. package/dist/logger.d.ts.map +1 -1
  113. package/dist/middlewares.d.ts.map +1 -0
  114. package/dist/{api/middlewares.js → middlewares.js} +1 -1
  115. package/dist/{adapters/mongo-client.d.ts → mongo-client.d.ts} +2 -1
  116. package/dist/mongo-client.d.ts.map +1 -0
  117. package/dist/mongo-client.js +15 -0
  118. package/dist/otel.d.ts +75 -0
  119. package/dist/otel.d.ts.map +1 -0
  120. package/dist/otel.js +84 -0
  121. package/dist/rateLimit.d.ts +11 -3
  122. package/dist/rateLimit.d.ts.map +1 -1
  123. package/dist/rateLimit.js +7 -12
  124. package/dist/{adapters/redis-client.d.ts → redis-client.d.ts} +4 -1
  125. package/dist/redis-client.d.ts.map +1 -0
  126. package/dist/redis-client.js +98 -0
  127. package/dist/{api/reportError.d.ts → reportError.d.ts} +1 -1
  128. package/dist/reportError.d.ts.map +1 -0
  129. package/dist/reportError.js +28 -0
  130. package/dist/{api/routing → routing}/middleware/RouterMiddleware.d.ts +2 -1
  131. package/dist/routing/middleware/RouterMiddleware.d.ts.map +1 -0
  132. package/dist/{api/routing → routing}/middleware/RouterMiddleware.js +1 -1
  133. package/dist/{api/routing → routing}/middleware/middleware.d.ts +11 -6
  134. package/dist/routing/middleware/middleware.d.ts.map +1 -0
  135. package/dist/routing/middleware/middleware.js +152 -0
  136. package/dist/{api/routing → routing}/middleware.d.ts +0 -1
  137. package/dist/routing/middleware.d.ts.map +1 -0
  138. package/dist/{api/routing → routing}/middleware.js +1 -2
  139. package/dist/routing/schema/jwt.d.ts.map +1 -0
  140. package/dist/routing/schema/jwt.js +12 -0
  141. package/dist/routing/tsort.d.ts.map +1 -0
  142. package/dist/routing/tsort.js +51 -0
  143. package/dist/{api/routing → routing}/utils.d.ts +3 -3
  144. package/dist/routing/utils.d.ts.map +1 -0
  145. package/dist/routing/utils.js +45 -0
  146. package/dist/routing.d.ts +182 -0
  147. package/dist/routing.d.ts.map +1 -0
  148. package/dist/routing.js +256 -0
  149. package/dist/test.d.ts +2 -2
  150. package/dist/test.d.ts.map +1 -1
  151. package/dist/test.js +5 -5
  152. package/dist/util.d.ts.map +1 -0
  153. package/dist/util.js +14 -0
  154. package/docs/cluster-storage.md +26 -0
  155. package/docs/workflow-engine.md +262 -0
  156. package/examples/query.ts +23 -19
  157. package/package.json +36 -364
  158. package/src/CUPS.ts +53 -14
  159. package/src/ClusterCosmos.ts +1170 -0
  160. package/src/ClusterServiceBus.ts +244 -0
  161. package/src/{api/ContextProvider.ts → ContextProvider.ts} +10 -7
  162. package/src/Emailer/Sendgrid.ts +83 -60
  163. package/src/Emailer/fake.ts +4 -4
  164. package/src/MainFiberSet.ts +31 -12
  165. package/src/QueueMaker/errors.ts +3 -1
  166. package/src/{adapters/SQL → SQL}/Model.ts +48 -47
  167. package/src/SQL.ts +1 -0
  168. package/src/Store/Cosmos/query.ts +275 -55
  169. package/src/Store/Cosmos.ts +597 -515
  170. package/src/Store/Disk.ts +145 -71
  171. package/src/Store/Memory.ts +420 -115
  172. package/src/Store/SQL/Pg.ts +352 -268
  173. package/src/Store/SQL/query.ts +366 -20
  174. package/src/Store/SQL.ts +742 -293
  175. package/src/Store/codeFilter.ts +78 -28
  176. package/src/Store/index.ts +18 -13
  177. package/src/Store/jsonDocument.ts +143 -0
  178. package/src/Store/utils.ts +307 -30
  179. package/src/WorkflowEngineCosmos.ts +749 -0
  180. package/src/WorkflowEngineSqlite.ts +813 -0
  181. package/src/arbs.ts +25 -5
  182. package/src/cosmos-client.ts +72 -0
  183. package/src/errorReporter.ts +68 -78
  184. package/src/fileUtil.ts +1 -1
  185. package/src/index.ts +2 -1
  186. package/src/{api/internal → internal}/RequestContextMiddleware.ts +23 -6
  187. package/src/internal/auth.ts +272 -0
  188. package/src/{api/internal → internal}/events.ts +18 -9
  189. package/src/{api/layerUtils.ts → layerUtils.ts} +7 -3
  190. package/src/logger/jsonLogger.ts +5 -3
  191. package/src/logger/logFmtLogger.ts +3 -3
  192. package/src/logger/shared.ts +6 -5
  193. package/src/middlewares.ts +10 -0
  194. package/src/{adapters/mongo-client.ts → mongo-client.ts} +3 -1
  195. package/src/otel.ts +177 -0
  196. package/src/rateLimit.ts +35 -24
  197. package/src/{adapters/redis-client.ts → redis-client.ts} +6 -2
  198. package/src/{api/reportError.ts → reportError.ts} +3 -2
  199. package/src/{api/routing → routing}/middleware/RouterMiddleware.ts +2 -1
  200. package/src/{api/routing → routing}/middleware/middleware.ts +75 -50
  201. package/src/routing/middleware.ts +4 -0
  202. package/src/{api/routing → routing}/schema/jwt.ts +2 -2
  203. package/src/{api/routing → routing}/utils.ts +2 -1
  204. package/src/routing.ts +823 -0
  205. package/src/test.ts +6 -6
  206. package/src/vitest.ts +1 -1
  207. package/test/arbs-magnitude.test.ts +33 -0
  208. package/test/arbs.test.ts +41 -0
  209. package/test/auth.test.ts +101 -0
  210. package/test/cluster-cosmos.test.ts +634 -0
  211. package/test/cluster-servicebus.test.ts +180 -0
  212. package/test/cluster-sqlite.test.ts +207 -0
  213. package/test/contextProvider.test.ts +11 -8
  214. package/test/controller.test.ts +23 -28
  215. package/test/cosmos-container-throughput.test.ts +80 -0
  216. package/test/cosmos-query.test.ts +368 -0
  217. package/test/dist/arbs-magnitude.test.d.ts.map +1 -0
  218. package/test/dist/arbs.test.d.ts.map +1 -0
  219. package/test/dist/auth.test.d.ts.map +1 -0
  220. package/test/dist/cluster-cosmos.test.d.ts.map +1 -0
  221. package/test/dist/cluster-servicebus.test.d.ts.map +1 -0
  222. package/test/dist/cluster-sqlite.test.d.ts.map +1 -0
  223. package/test/dist/contextProvider.test.d.ts.map +1 -1
  224. package/test/dist/controller.test.d.ts.map +1 -1
  225. package/test/dist/cosmos-container-throughput.test.d.ts.map +1 -0
  226. package/test/dist/cosmos-query.test.d.ts.map +1 -0
  227. package/test/dist/fixtures.d.ts +17 -9
  228. package/test/dist/fixtures.d.ts.map +1 -1
  229. package/test/dist/fixtures.js +8 -3
  230. package/test/dist/json-lower.test.d.ts.map +1 -0
  231. package/test/dist/query.test.d.ts.map +1 -1
  232. package/test/dist/rawQuery.test.d.ts.map +1 -1
  233. package/test/dist/repository-ext.test.d.ts.map +1 -0
  234. package/test/dist/repository-legacy-document.test.d.ts.map +1 -0
  235. package/test/dist/requires.test.d.ts.map +1 -1
  236. package/test/dist/router-generator.test.d.ts.map +1 -0
  237. package/test/dist/routing-interruptibility.test.d.ts.map +1 -0
  238. package/test/dist/rpc-context-map-streaming.test.d.ts.map +1 -0
  239. package/test/dist/rpc-e2e-invalidation.test.d.ts.map +1 -0
  240. package/test/dist/rpc-multi-middleware.test.d.ts.map +1 -1
  241. package/test/dist/rpc-stream-fullstack.test.d.ts.map +1 -0
  242. package/test/dist/workflow-engine-cosmos.test.d.ts.map +1 -0
  243. package/test/dist/workflow-engine-sqlite.test.d.ts.map +1 -0
  244. package/test/fixtures.ts +7 -2
  245. package/test/json-lower.test.ts +129 -0
  246. package/test/layerUtils.test.ts +2 -2
  247. package/test/query.test.ts +1232 -42
  248. package/test/rawQuery.test.ts +432 -7
  249. package/test/repository-ext.test.ts +456 -0
  250. package/test/repository-legacy-document.test.ts +394 -0
  251. package/test/requires.test.ts +7 -3
  252. package/test/router-generator.test.ts +187 -0
  253. package/test/routing-interruptibility.test.ts +66 -0
  254. package/test/rpc-context-map-streaming.test.ts +265 -0
  255. package/test/rpc-e2e-invalidation.test.ts +421 -0
  256. package/test/rpc-multi-middleware.test.ts +17 -11
  257. package/test/rpc-stream-fullstack.test.ts +307 -0
  258. package/test/sql-store.test.ts +1202 -47
  259. package/test/validateSample.test.ts +70 -42
  260. package/test/workflow-engine-cosmos.test.ts +345 -0
  261. package/test/workflow-engine-sqlite.test.ts +297 -0
  262. package/tsconfig.examples.json +1 -1
  263. package/tsconfig.json +9 -1
  264. package/tsconfig.src.json +35 -35
  265. package/tsconfig.test.json +2 -2
  266. package/dist/Emailer/service.d.ts +0 -55
  267. package/dist/Emailer/service.d.ts.map +0 -1
  268. package/dist/Emailer/service.js +0 -6
  269. package/dist/Emailer.d.ts +0 -2
  270. package/dist/Emailer.d.ts.map +0 -1
  271. package/dist/Emailer.js +0 -2
  272. package/dist/Model/Repository/ext.d.ts +0 -41
  273. package/dist/Model/Repository/ext.d.ts.map +0 -1
  274. package/dist/Model/Repository/ext.js +0 -65
  275. package/dist/Model/Repository/internal/internal.d.ts +0 -59
  276. package/dist/Model/Repository/internal/internal.d.ts.map +0 -1
  277. package/dist/Model/Repository/internal/internal.js +0 -320
  278. package/dist/Model/Repository/legacy.d.ts +0 -19
  279. package/dist/Model/Repository/legacy.d.ts.map +0 -1
  280. package/dist/Model/Repository/legacy.js +0 -2
  281. package/dist/Model/Repository/makeRepo.d.ts +0 -49
  282. package/dist/Model/Repository/makeRepo.d.ts.map +0 -1
  283. package/dist/Model/Repository/makeRepo.js +0 -24
  284. package/dist/Model/Repository/service.d.ts +0 -89
  285. package/dist/Model/Repository/service.d.ts.map +0 -1
  286. package/dist/Model/Repository/service.js +0 -2
  287. package/dist/Model/Repository/validation.d.ts +0 -43
  288. package/dist/Model/Repository/validation.d.ts.map +0 -1
  289. package/dist/Model/Repository/validation.js +0 -32
  290. package/dist/Model/Repository.d.ts +0 -6
  291. package/dist/Model/Repository.d.ts.map +0 -1
  292. package/dist/Model/Repository.js +0 -6
  293. package/dist/Model/dsl.d.ts +0 -32
  294. package/dist/Model/dsl.d.ts.map +0 -1
  295. package/dist/Model/dsl.js +0 -44
  296. package/dist/Model/filter/filterApi.d.ts +0 -30
  297. package/dist/Model/filter/filterApi.d.ts.map +0 -1
  298. package/dist/Model/filter/filterApi.js +0 -2
  299. package/dist/Model/filter/types/errors.d.ts +0 -29
  300. package/dist/Model/filter/types/errors.d.ts.map +0 -1
  301. package/dist/Model/filter/types/errors.js +0 -2
  302. package/dist/Model/filter/types/fields.d.ts +0 -15
  303. package/dist/Model/filter/types/fields.d.ts.map +0 -1
  304. package/dist/Model/filter/types/fields.js +0 -2
  305. package/dist/Model/filter/types/path/common.d.ts +0 -316
  306. package/dist/Model/filter/types/path/common.d.ts.map +0 -1
  307. package/dist/Model/filter/types/path/common.js +0 -2
  308. package/dist/Model/filter/types/path/eager.d.ts +0 -95
  309. package/dist/Model/filter/types/path/eager.d.ts.map +0 -1
  310. package/dist/Model/filter/types/path/eager.js +0 -31
  311. package/dist/Model/filter/types/path/index.d.ts +0 -4
  312. package/dist/Model/filter/types/path/index.d.ts.map +0 -1
  313. package/dist/Model/filter/types/path/index.js +0 -3
  314. package/dist/Model/filter/types/utils.d.ts +0 -79
  315. package/dist/Model/filter/types/utils.d.ts.map +0 -1
  316. package/dist/Model/filter/types/utils.js +0 -2
  317. package/dist/Model/filter/types/validator.d.ts +0 -30
  318. package/dist/Model/filter/types/validator.d.ts.map +0 -1
  319. package/dist/Model/filter/types/validator.js +0 -2
  320. package/dist/Model/filter/types.d.ts +0 -5
  321. package/dist/Model/filter/types.d.ts.map +0 -1
  322. package/dist/Model/filter/types.js +0 -7
  323. package/dist/Model/query/dsl.d.ts +0 -248
  324. package/dist/Model/query/dsl.d.ts.map +0 -1
  325. package/dist/Model/query/dsl.js +0 -104
  326. package/dist/Model/query/new-kid-interpreter.d.ts +0 -28
  327. package/dist/Model/query/new-kid-interpreter.d.ts.map +0 -1
  328. package/dist/Model/query/new-kid-interpreter.js +0 -165
  329. package/dist/Model/query.d.ts +0 -15
  330. package/dist/Model/query.d.ts.map +0 -1
  331. package/dist/Model/query.js +0 -3
  332. package/dist/Model.d.ts +0 -4
  333. package/dist/Model.d.ts.map +0 -1
  334. package/dist/Model.js +0 -4
  335. package/dist/Operations.d.ts +0 -55
  336. package/dist/Operations.d.ts.map +0 -1
  337. package/dist/Operations.js +0 -102
  338. package/dist/OperationsRepo.d.ts +0 -41
  339. package/dist/OperationsRepo.d.ts.map +0 -1
  340. package/dist/OperationsRepo.js +0 -14
  341. package/dist/QueueMaker/SQLQueue.d.ts +0 -14
  342. package/dist/QueueMaker/SQLQueue.d.ts.map +0 -1
  343. package/dist/QueueMaker/SQLQueue.js +0 -132
  344. package/dist/QueueMaker/memQueue.d.ts +0 -11
  345. package/dist/QueueMaker/memQueue.d.ts.map +0 -1
  346. package/dist/QueueMaker/memQueue.js +0 -76
  347. package/dist/QueueMaker/sbqueue.d.ts +0 -12
  348. package/dist/QueueMaker/sbqueue.d.ts.map +0 -1
  349. package/dist/QueueMaker/sbqueue.js +0 -91
  350. package/dist/QueueMaker/service.d.ts +0 -11
  351. package/dist/QueueMaker/service.d.ts.map +0 -1
  352. package/dist/QueueMaker/service.js +0 -4
  353. package/dist/RequestContext.d.ts +0 -68
  354. package/dist/RequestContext.d.ts.map +0 -1
  355. package/dist/RequestContext.js +0 -49
  356. package/dist/RequestFiberSet.d.ts +0 -36
  357. package/dist/RequestFiberSet.d.ts.map +0 -1
  358. package/dist/RequestFiberSet.js +0 -78
  359. package/dist/Store/ContextMapContainer.d.ts +0 -25
  360. package/dist/Store/ContextMapContainer.d.ts.map +0 -1
  361. package/dist/Store/ContextMapContainer.js +0 -77
  362. package/dist/Store/service.d.ts +0 -111
  363. package/dist/Store/service.d.ts.map +0 -1
  364. package/dist/Store/service.js +0 -79
  365. package/dist/Store.d.ts +0 -2
  366. package/dist/Store.d.ts.map +0 -1
  367. package/dist/Store.js +0 -2
  368. package/dist/adapters/SQL/Model.d.ts.map +0 -1
  369. package/dist/adapters/SQL/Model.js +0 -478
  370. package/dist/adapters/SQL.d.ts.map +0 -1
  371. package/dist/adapters/ServiceBus.d.ts +0 -58
  372. package/dist/adapters/ServiceBus.d.ts.map +0 -1
  373. package/dist/adapters/ServiceBus.js +0 -99
  374. package/dist/adapters/cosmos-client.d.ts +0 -14
  375. package/dist/adapters/cosmos-client.d.ts.map +0 -1
  376. package/dist/adapters/cosmos-client.js +0 -9
  377. package/dist/adapters/index.d.ts +0 -2
  378. package/dist/adapters/index.d.ts.map +0 -1
  379. package/dist/adapters/index.js +0 -2
  380. package/dist/adapters/logger.d.ts +0 -9
  381. package/dist/adapters/logger.d.ts.map +0 -1
  382. package/dist/adapters/logger.js +0 -3
  383. package/dist/adapters/memQueue.d.ts +0 -13
  384. package/dist/adapters/memQueue.d.ts.map +0 -1
  385. package/dist/adapters/memQueue.js +0 -20
  386. package/dist/adapters/mongo-client.d.ts.map +0 -1
  387. package/dist/adapters/mongo-client.js +0 -13
  388. package/dist/adapters/redis-client.d.ts.map +0 -1
  389. package/dist/adapters/redis-client.js +0 -94
  390. package/dist/api/ContextProvider.d.ts.map +0 -1
  391. package/dist/api/ContextProvider.js +0 -38
  392. package/dist/api/codec.d.ts.map +0 -1
  393. package/dist/api/codec.js +0 -5
  394. package/dist/api/internal/RequestContextMiddleware.d.ts +0 -5
  395. package/dist/api/internal/RequestContextMiddleware.d.ts.map +0 -1
  396. package/dist/api/internal/RequestContextMiddleware.js +0 -35
  397. package/dist/api/internal/auth.d.ts +0 -15
  398. package/dist/api/internal/auth.d.ts.map +0 -1
  399. package/dist/api/internal/auth.js +0 -47
  400. package/dist/api/internal/events.d.ts +0 -9
  401. package/dist/api/internal/events.d.ts.map +0 -1
  402. package/dist/api/internal/events.js +0 -42
  403. package/dist/api/internal/health.d.ts.map +0 -1
  404. package/dist/api/internal/health.js +0 -5
  405. package/dist/api/layerUtils.d.ts.map +0 -1
  406. package/dist/api/layerUtils.js +0 -16
  407. package/dist/api/middlewares.d.ts.map +0 -1
  408. package/dist/api/reportError.d.ts.map +0 -1
  409. package/dist/api/reportError.js +0 -27
  410. package/dist/api/routing/middleware/RouterMiddleware.d.ts.map +0 -1
  411. package/dist/api/routing/middleware/middleware.d.ts.map +0 -1
  412. package/dist/api/routing/middleware/middleware.js +0 -130
  413. package/dist/api/routing/middleware.d.ts.map +0 -1
  414. package/dist/api/routing/schema/jwt.d.ts.map +0 -1
  415. package/dist/api/routing/schema/jwt.js +0 -12
  416. package/dist/api/routing/tsort.d.ts.map +0 -1
  417. package/dist/api/routing/tsort.js +0 -51
  418. package/dist/api/routing/utils.d.ts.map +0 -1
  419. package/dist/api/routing/utils.js +0 -44
  420. package/dist/api/routing.d.ts +0 -134
  421. package/dist/api/routing.d.ts.map +0 -1
  422. package/dist/api/routing.js +0 -167
  423. package/dist/api/setupRequest.d.ts +0 -15
  424. package/dist/api/setupRequest.d.ts.map +0 -1
  425. package/dist/api/setupRequest.js +0 -49
  426. package/dist/api/util.d.ts.map +0 -1
  427. package/dist/api/util.js +0 -14
  428. package/eslint.config.mjs +0 -24
  429. package/src/Emailer/service.ts +0 -52
  430. package/src/Emailer.ts +0 -1
  431. package/src/Model/Repository/ext.ts +0 -283
  432. package/src/Model/Repository/internal/internal.ts +0 -580
  433. package/src/Model/Repository/legacy.ts +0 -27
  434. package/src/Model/Repository/makeRepo.ts +0 -139
  435. package/src/Model/Repository/service.ts +0 -627
  436. package/src/Model/Repository/validation.ts +0 -31
  437. package/src/Model/Repository.ts +0 -5
  438. package/src/Model/dsl.ts +0 -128
  439. package/src/Model/filter/filterApi.ts +0 -60
  440. package/src/Model/filter/types/errors.ts +0 -47
  441. package/src/Model/filter/types/fields.ts +0 -50
  442. package/src/Model/filter/types/path/common.ts +0 -404
  443. package/src/Model/filter/types/path/eager.ts +0 -298
  444. package/src/Model/filter/types/path/index.ts +0 -4
  445. package/src/Model/filter/types/utils.ts +0 -128
  446. package/src/Model/filter/types/validator.ts +0 -46
  447. package/src/Model/filter/types.ts +0 -6
  448. package/src/Model/query/dsl.ts +0 -2110
  449. package/src/Model/query/new-kid-interpreter.ts +0 -210
  450. package/src/Model/query.ts +0 -13
  451. package/src/Model.ts +0 -3
  452. package/src/Operations.ts +0 -235
  453. package/src/OperationsRepo.ts +0 -16
  454. package/src/QueueMaker/SQLQueue.ts +0 -190
  455. package/src/QueueMaker/memQueue.ts +0 -130
  456. package/src/QueueMaker/sbqueue.ts +0 -137
  457. package/src/QueueMaker/service.ts +0 -17
  458. package/src/RequestContext.ts +0 -63
  459. package/src/RequestFiberSet.ts +0 -105
  460. package/src/Store/ContextMapContainer.ts +0 -116
  461. package/src/Store/index.test.ts.bak +0 -112
  462. package/src/Store/service.ts +0 -193
  463. package/src/Store.ts +0 -1
  464. package/src/adapters/SQL.ts +0 -1
  465. package/src/adapters/ServiceBus.ts +0 -209
  466. package/src/adapters/cosmos-client.ts +0 -16
  467. package/src/adapters/index.ts +0 -0
  468. package/src/adapters/logger.ts +0 -3
  469. package/src/adapters/memQueue.ts +0 -21
  470. package/src/api/internal/auth.ts +0 -68
  471. package/src/api/middlewares.ts +0 -10
  472. package/src/api/routing/middleware.ts +0 -6
  473. package/src/api/routing.ts +0 -598
  474. package/src/api/setupRequest.ts +0 -104
  475. package/test/dist/date-query.test.d.ts.map +0 -1
  476. package/tsconfig.json.bak +0 -12
  477. /package/dist/{adapters/SQL.d.ts → SQL.d.ts} +0 -0
  478. /package/dist/{api/codec.d.ts → codec.d.ts} +0 -0
  479. /package/dist/{api/middlewares.d.ts → middlewares.d.ts} +0 -0
  480. /package/dist/{api/routing → routing}/schema/jwt.d.ts +0 -0
  481. /package/dist/{api/routing → routing}/tsort.d.ts +0 -0
  482. /package/dist/{api/util.d.ts → util.d.ts} +0 -0
  483. /package/src/{api/codec.ts → codec.ts} +0 -0
  484. /package/src/{api/internal → internal}/health.ts +0 -0
  485. /package/src/{api/routing → routing}/tsort.ts +0 -0
  486. /package/src/{api/util.ts → util.ts} +0 -0
@@ -0,0 +1,180 @@
1
+ import type { ServiceBusMessage, ServiceBusReceiverOptions } from "@azure/service-bus"
2
+ import { assert, describe, it } from "@effect/vitest"
3
+ import { Context, Effect, Layer, Option, Schema, Stream } from "effect"
4
+ import { ClusterSchema, EntityAddress, EntityId, EntityType, Envelope, Message, MessageStorage, Runners, ShardId, Sharding, ShardingConfig, Snowflake } from "effect/cluster"
5
+ import { Headers } from "effect/http"
6
+ import { Rpc } from "effect/rpc"
7
+ import { type ClusterServiceBusClient, layerClientFrom, layerRunners, makeStoragePoller } from "../src/ClusterServiceBus.js"
8
+
9
+ describe("ClusterServiceBus", () => {
10
+ it.effect("wakes storage polling from topic notifications", () =>
11
+ Effect.gen(function*() {
12
+ let processMessage: (() => Promise<void>) | undefined
13
+ let polls = 0
14
+ let receiverClosed = false
15
+ let subscriptionClosed = false
16
+
17
+ const client: ClusterServiceBusClient = {
18
+ createSender() {
19
+ throw new Error("unused")
20
+ },
21
+ createReceiver(topicName: string, subscriptionName: string, options?: ServiceBusReceiverOptions) {
22
+ assert.strictEqual(topicName, "cluster-notifications")
23
+ assert.strictEqual(subscriptionName, "runner-a")
24
+ assert.strictEqual(options?.receiveMode, "receiveAndDelete")
25
+ return {
26
+ subscribe(handlers) {
27
+ processMessage = handlers.processMessage
28
+ return {
29
+ close() {
30
+ subscriptionClosed = true
31
+ return Promise.resolve()
32
+ }
33
+ }
34
+ },
35
+ close() {
36
+ receiverClosed = true
37
+ return Promise.resolve()
38
+ }
39
+ }
40
+ },
41
+ close() {
42
+ return Promise.resolve()
43
+ }
44
+ }
45
+
46
+ const sharding = Sharding.Sharding.of({
47
+ activeEntityCount: Effect.succeed(0),
48
+ getRegistrationEvents: Stream.empty,
49
+ getShardId: () => ShardId.make("cluster-servicebus", 0),
50
+ getSnowflake: Effect.succeed(Snowflake.Snowflake(1n)),
51
+ hasShardId: () => false,
52
+ isShutdown: Effect.succeed(false),
53
+ makeClient: () => Effect.die("unused"),
54
+ notify: () => Effect.void,
55
+ pollStorage: Effect.sync(() => {
56
+ polls++
57
+ }),
58
+ registerEntity: () => Effect.void,
59
+ registerSingleton: () => Effect.void,
60
+ reset: () => Effect.succeed(false),
61
+ send: () => Effect.void,
62
+ sendOutgoing: () => Effect.void
63
+ })
64
+
65
+ yield* Effect
66
+ .scoped(
67
+ makeStoragePoller({
68
+ topicName: "cluster-notifications",
69
+ subscriptionName: "runner-a"
70
+ })
71
+ .pipe(
72
+ Effect.andThen(
73
+ Effect.gen(function*() {
74
+ if (processMessage === undefined) {
75
+ return yield* Effect.die("missing Service Bus subscription")
76
+ }
77
+ const runProcessMessage = processMessage
78
+ yield* Effect.promise(() => runProcessMessage())
79
+ assert.strictEqual(polls, 1)
80
+ })
81
+ )
82
+ )
83
+ )
84
+ .pipe(
85
+ Effect.provide(layerClientFrom(client)),
86
+ Effect.provide(Layer.succeed(Sharding.Sharding)(sharding))
87
+ )
88
+
89
+ assert.strictEqual(subscriptionClosed, true)
90
+ assert.strictEqual(receiverClosed, true)
91
+ }))
92
+
93
+ it.effect("publishes persisted storage notifications", () =>
94
+ Effect.gen(function*() {
95
+ const sent: Array<ServiceBusMessage> = []
96
+ let senderClosed = false
97
+
98
+ const client: ClusterServiceBusClient = {
99
+ createSender(topicName) {
100
+ assert.strictEqual(topicName, "cluster-notifications")
101
+ return {
102
+ sendMessages(message) {
103
+ sent.push(message)
104
+ return Promise.resolve()
105
+ },
106
+ close() {
107
+ senderClosed = true
108
+ return Promise.resolve()
109
+ }
110
+ }
111
+ },
112
+ createReceiver() {
113
+ throw new Error("unused")
114
+ },
115
+ close() {
116
+ return Promise.resolve()
117
+ }
118
+ }
119
+
120
+ yield* Effect.scoped(
121
+ Effect
122
+ .gen(function*() {
123
+ const runners = yield* Runners.Runners
124
+ yield* runners.notify({
125
+ address: Option.none(),
126
+ discard: true,
127
+ message: yield* makeOutgoingRequest
128
+ })
129
+ })
130
+ .pipe(
131
+ Effect.provide(layerRunners({ topicName: "cluster-notifications" })),
132
+ Effect.provide(layerClientFrom(client)),
133
+ Effect.provide(MessageStorage.layerNoop),
134
+ Effect.provide(ShardingConfig.layerDefaults)
135
+ )
136
+ )
137
+
138
+ assert.strictEqual(senderClosed, true)
139
+ assert.strictEqual(sent.length, 1)
140
+ assert.deepStrictEqual(sent[0]?.body, {
141
+ _tag: "EffectClusterStorageNotification",
142
+ envelopeId: "1",
143
+ requestId: "1",
144
+ shardId: "cluster-servicebus:1",
145
+ entityType: "TestEntity",
146
+ entityId: "entity-1"
147
+ })
148
+ assert.strictEqual(sent[0]?.contentType, "application/json")
149
+ assert.strictEqual(sent[0]?.correlationId, "1")
150
+ assert.strictEqual(sent[0]?.messageId, "1")
151
+ assert.strictEqual(sent[0]?.subject, "EffectClusterStorageNotification")
152
+ }))
153
+ })
154
+
155
+ const TestRpc = Rpc
156
+ .make("TestRpc", {
157
+ payload: { id: Schema.Number }
158
+ })
159
+ .annotate(ClusterSchema.Persisted, true)
160
+
161
+ const makeOutgoingRequest = Effect.sync(() =>
162
+ new Message.OutgoingRequest({
163
+ annotations: TestRpc.annotations,
164
+ context: Context.empty(),
165
+ envelope: Envelope.makeRequest<typeof TestRpc>({
166
+ address: EntityAddress.make({
167
+ entityId: EntityId.make("entity-1"),
168
+ entityType: EntityType.make("TestEntity"),
169
+ shardId: ShardId.make("cluster-servicebus", 1)
170
+ }),
171
+ headers: Headers.empty,
172
+ payload: { id: 1 },
173
+ requestId: Snowflake.Snowflake(1n),
174
+ tag: TestRpc._tag
175
+ }),
176
+ lastReceivedReply: Option.none(),
177
+ respond: () => Effect.void,
178
+ rpc: TestRpc
179
+ })
180
+ )
@@ -0,0 +1,207 @@
1
+ import { NodeCrypto } from "@effect/platform-node"
2
+ import { SqliteClient } from "@effect/sql-sqlite-node"
3
+ import { assert, describe, it } from "@effect/vitest"
4
+ import { Context, Duration, Effect, Exit, Fiber, Layer, Option, Schema } from "effect"
5
+ import { ClusterSchema, ClusterWorkflowEngine, RunnerAddress, RunnerHealth, Runners, Sharding, ShardingConfig, SqlMessageStorage, SqlRunnerStorage } from "effect/cluster"
6
+ import { DurableDeferred, Workflow } from "effect/workflow"
7
+
8
+ const testRunId = `${Date.now()}-${process.pid}-${Math.random().toString(16).slice(2)}`
9
+ const runnerPortBase = 10000 + Date.now() % 40000
10
+
11
+ describe("ClusterSqlite Workflow", () => {
12
+ it.live("resumes a running workflow suspended on a durable deferred", () =>
13
+ Effect
14
+ .gen(function*() {
15
+ const sharding = yield* Sharding.Sharding
16
+ const payload = { id: `deferred-${testRunId}` }
17
+ const executionId = yield* SqliteDeferredWorkflow.executionId(payload)
18
+
19
+ const fiber = yield* SqliteDeferredWorkflow.execute(payload).pipe(Effect.forkScoped)
20
+ yield* waitForDeferredWorkflowSuspended(executionId)
21
+
22
+ const token = yield* DurableDeferred.tokenFromPayload(SqliteDeferred, {
23
+ workflow: SqliteDeferredWorkflow,
24
+ payload
25
+ })
26
+ yield* DurableDeferred.done(SqliteDeferred, { token, exit: Exit.succeed("resolved") })
27
+ yield* sharding.pollStorage
28
+
29
+ const value = yield* Fiber.join(fiber).pipe(Effect.timeout(Duration.seconds(15)))
30
+ assert.strictEqual(value, `${payload.id}:resolved`)
31
+ assert.strictEqual(yield* waitForDeferredWorkflowComplete(executionId), `${payload.id}:resolved`)
32
+ })
33
+ .pipe(Effect.provide(clusterWorkflowLayer())), 30000)
34
+
35
+ it.live("progresses through sequential durable deferred steps", () =>
36
+ Effect
37
+ .gen(function*() {
38
+ const log = yield* StepLog
39
+ const sharding = yield* Sharding.Sharding
40
+ const payload = { id: `steps-${testRunId}` }
41
+ const executionId = yield* SequentialDeferredWorkflow.executionId(payload)
42
+
43
+ const fiber = yield* SequentialDeferredWorkflow.execute(payload).pipe(Effect.forkScoped)
44
+ yield* waitForSequentialWorkflowSuspended(executionId)
45
+
46
+ yield* completeStep(SequentialStep1, payload, "one")
47
+ yield* sharding.pollStorage
48
+ yield* waitForStep(log, "step-1")
49
+
50
+ yield* completeStep(SequentialStep2, payload, "two")
51
+ yield* sharding.pollStorage
52
+ yield* waitForStep(log, "step-2")
53
+
54
+ yield* completeStep(SequentialStep3, payload, "three")
55
+ yield* sharding.pollStorage
56
+
57
+ const value = yield* Fiber.join(fiber).pipe(Effect.timeout(Duration.seconds(15)))
58
+ assert.strictEqual(value, "one:two:three")
59
+ assert(log.steps.includes("step-3"))
60
+ })
61
+ .pipe(Effect.provide(clusterWorkflowLayer())), 30000)
62
+ })
63
+
64
+ class StepLog extends Context.Service<StepLog, { readonly steps: Array<string> }>()("StepLog") {
65
+ static readonly layer = Layer.effect(StepLog, Effect.sync(() => ({ steps: [] })))
66
+ }
67
+
68
+ const SqliteDeferred = DurableDeferred.make("ClusterSqlite/Deferred", { success: Schema.String })
69
+
70
+ const SqliteDeferredWorkflow = Workflow
71
+ .make("ClusterSqlite/DeferredWorkflow", {
72
+ payload: { id: Schema.String },
73
+ success: Schema.String,
74
+ idempotencyKey: ({ id }) => id
75
+ })
76
+ .annotate(ClusterSchema.ShardGroup, () => testShardGroup("workflow"))
77
+
78
+ const SqliteDeferredWorkflowLayer = SqliteDeferredWorkflow.toLayer(Effect.fnUntraced(function*({ id }) {
79
+ const value = yield* DurableDeferred.await(SqliteDeferred)
80
+ return `${id}:${value}`
81
+ }))
82
+
83
+ const SequentialStep1 = DurableDeferred.make("ClusterSqlite/SequentialStep1", { success: Schema.String })
84
+ const SequentialStep2 = DurableDeferred.make("ClusterSqlite/SequentialStep2", { success: Schema.String })
85
+ const SequentialStep3 = DurableDeferred.make("ClusterSqlite/SequentialStep3", { success: Schema.String })
86
+
87
+ const SequentialDeferredWorkflow = Workflow
88
+ .make("ClusterSqlite/SequentialDeferredWorkflow", {
89
+ payload: { id: Schema.String },
90
+ success: Schema.String,
91
+ idempotencyKey: ({ id }) => id
92
+ })
93
+ .annotate(ClusterSchema.ShardGroup, () => testShardGroup("workflow"))
94
+
95
+ const SequentialDeferredWorkflowLayer = SequentialDeferredWorkflow.toLayer(Effect.fnUntraced(function*() {
96
+ const log = yield* StepLog
97
+ const step1 = yield* DurableDeferred.await(SequentialStep1)
98
+ log.steps.push("step-1")
99
+ const step2 = yield* DurableDeferred.await(SequentialStep2)
100
+ log.steps.push("step-2")
101
+ const step3 = yield* DurableDeferred.await(SequentialStep3)
102
+ log.steps.push("step-3")
103
+ return `${step1}:${step2}:${step3}`
104
+ }))
105
+
106
+ const clusterWorkflowLayer = () => {
107
+ const prefix = "test_cluster_sqlite"
108
+ const config = ShardingConfig.layer({
109
+ runnerAddress: Option.some(testRunnerAddress(20)),
110
+ shardsPerGroup: 1,
111
+ availableShardGroups: [testShardGroup("workflow")],
112
+ assignedShardGroups: [testShardGroup("workflow")],
113
+ entityTerminationTimeout: 0,
114
+ entityMessagePollInterval: 50,
115
+ entityReplyPollInterval: 50,
116
+ refreshAssignmentsInterval: 0,
117
+ sendRetryInterval: 50
118
+ })
119
+ const storage = Layer
120
+ .merge(
121
+ SqlMessageStorage.layerWith({ prefix }),
122
+ Layer.orDie(SqlRunnerStorage.layerWith({ prefix }))
123
+ )
124
+ .pipe(Layer.provide(SqliteClient.layer({ filename: ":memory:" })))
125
+
126
+ return Layer
127
+ .merge(SqliteDeferredWorkflowLayer, SequentialDeferredWorkflowLayer)
128
+ .pipe(
129
+ Layer.provideMerge(StepLog.layer),
130
+ Layer.provideMerge(
131
+ ClusterWorkflowEngine.layer.pipe(
132
+ Layer.provideMerge(Sharding.layer),
133
+ Layer.provide(Runners.layerNoop),
134
+ Layer.provide(RunnerHealth.layerNoop),
135
+ Layer.provide(storage),
136
+ Layer.provide(config),
137
+ Layer.provide(NodeCrypto.layer)
138
+ )
139
+ )
140
+ )
141
+ }
142
+
143
+ const completeStep = <Success extends Schema.Top>(
144
+ deferred: DurableDeferred.DurableDeferred<Success, Schema.Never>,
145
+ payload: { readonly id: string },
146
+ value: Success["Type"]
147
+ ) =>
148
+ Effect.gen(function*() {
149
+ const token = yield* DurableDeferred.tokenFromPayload(deferred, {
150
+ workflow: SequentialDeferredWorkflow,
151
+ payload
152
+ })
153
+ yield* DurableDeferred.done(deferred, { token, exit: Exit.succeed(value) })
154
+ })
155
+
156
+ const waitForDeferredWorkflowSuspended = (executionId: string) => waitForSuspended(SqliteDeferredWorkflow, executionId)
157
+
158
+ const waitForSequentialWorkflowSuspended = (executionId: string) =>
159
+ waitForSuspended(SequentialDeferredWorkflow, executionId)
160
+
161
+ const waitForSuspended = <A, E, R>(
162
+ workflow: {
163
+ readonly poll: (
164
+ executionId: string
165
+ ) => Effect.Effect<Option.Option<Workflow.Result<A, E>>, never, R>
166
+ },
167
+ executionId: string
168
+ ) =>
169
+ Effect.gen(function*() {
170
+ const sharding = yield* Sharding.Sharding
171
+ for (let i = 0; i < 100; i++) {
172
+ yield* sharding.pollStorage
173
+ const polled = yield* workflow.poll(executionId)
174
+ if (Option.isSome(polled) && polled.value._tag === "Suspended") return
175
+ yield* Effect.sleep(Duration.millis(100))
176
+ }
177
+ return yield* Effect.fail(new Error(`Workflow ${executionId} did not suspend`))
178
+ })
179
+
180
+ const waitForDeferredWorkflowComplete = (executionId: string) =>
181
+ Effect.gen(function*() {
182
+ const sharding = yield* Sharding.Sharding
183
+ for (let i = 0; i < 100; i++) {
184
+ yield* sharding.pollStorage
185
+ const polled = yield* SqliteDeferredWorkflow.poll(executionId)
186
+ if (Option.isSome(polled) && polled.value._tag === "Complete") {
187
+ const exit = polled.value.exit
188
+ assert(Exit.isSuccess(exit))
189
+ return exit.value
190
+ }
191
+ yield* Effect.sleep(Duration.millis(100))
192
+ }
193
+ return yield* Effect.fail(new Error(`Workflow ${executionId} did not complete`))
194
+ })
195
+
196
+ const waitForStep = (log: StepLog["Service"], step: string) =>
197
+ Effect.gen(function*() {
198
+ for (let i = 0; i < 100; i++) {
199
+ if (log.steps.includes(step)) return
200
+ yield* Effect.sleep(Duration.millis(100))
201
+ }
202
+ return yield* Effect.fail(new Error(`Workflow did not reach ${step}`))
203
+ })
204
+
205
+ const testShardGroup = (label: string) => `cluster-sqlite-${testRunId}-${label}`
206
+
207
+ const testRunnerAddress = (offset: number) => RunnerAddress.make("localhost", runnerPortBase + offset)
@@ -1,8 +1,11 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
2
  /* eslint-disable @typescript-eslint/no-unsafe-member-access */
3
3
  import { expectTypeOf, it } from "@effect/vitest"
4
- import { Effect, Layer, Scope, Context } from "effect-app"
5
- import { ContextProvider, mergeContextProviders, MergedContextProvider } from "../src/api/ContextProvider.js"
4
+ import * as Context from "effect-app/Context"
5
+ import * as Effect from "effect-app/Effect"
6
+ import * as Layer from "effect-app/Layer"
7
+ import * as Scope from "effect/Scope"
8
+ import { ContextProvider, mergeContextProviders, MergedContextProvider } from "../src/ContextProvider.js"
6
9
  import { CustomError1, Some, SomeElse, SomeService } from "./fixtures.js"
7
10
 
8
11
  // @effect-diagnostics-next-line missingEffectServiceDependency:off
@@ -20,7 +23,7 @@ class MyContextProvider extends Context.Service<MyContextProvider>()(
20
23
  yield* Effect.logInfo("MyContextProviderGen", "this is a generator")
21
24
  yield* Effect.succeed("this is a generator")
22
25
 
23
- return Some.serviceMap({ a: 1 })
26
+ return Some.context({ a: 1 })
24
27
  })
25
28
  })
26
29
  }
@@ -37,7 +40,7 @@ class MyContextProvider2 extends Context.Service<MyContextProvider2>()(
37
40
  return Effect.gen(function*() {
38
41
  // we test without dependencies, so that we end up with an R of never.
39
42
 
40
- return SomeElse.serviceMap({ b: 2 })
43
+ return SomeElse.context({ b: 2 })
41
44
  })
42
45
  })
43
46
  }
@@ -54,7 +57,7 @@ class MyContextProvider2Gen extends Context.Service<MyContextProvider2Gen>()(
54
57
  return function*() {
55
58
  // we test without dependencies, so that we end up with an R of never
56
59
 
57
- return SomeElse.serviceMap({ b: 2 })
60
+ return SomeElse.context({ b: 2 })
58
61
  }
59
62
  })
60
63
  }
@@ -77,7 +80,7 @@ class MyContextProviderGen extends Context.Service<MyContextProviderGen>()(
77
80
  yield* Effect.logInfo("MyContextProviderGen", "this is a generator")
78
81
  yield* Effect.succeed("this is a generator")
79
82
 
80
- return Some.serviceMap({ a: 1 })
83
+ return Some.context({ a: 1 })
81
84
  }
82
85
  })
83
86
  }
@@ -100,7 +103,7 @@ export const someContextProvider = ContextProvider({
100
103
  // currently the effectful context provider cannot trigger an error when building the per request context
101
104
  // if (Math.random() > 0.5) return yield* new CustomError2()
102
105
 
103
- return Some.serviceMap({ a: 1 })
106
+ return Some.context({ a: 1 })
104
107
  })
105
108
  })
106
109
  })
@@ -119,7 +122,7 @@ export const someContextProviderGen = ContextProvider({
119
122
  // currently the effectful context provider cannot trigger an error when building the per request context
120
123
  // if (Math.random() > 0.5) return yield* new CustomError2()
121
124
 
122
- return Some.serviceMap({ a: 1 })
125
+ return Some.context({ a: 1 })
123
126
  }
124
127
  })
125
128
  })
@@ -1,16 +1,20 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
2
  /* eslint-disable @typescript-eslint/no-unsafe-member-access */
3
- import { type MakeContext, type MakeErrors, makeRouter } from "@effect-app/infra/api/routing"
3
+ import { type MakeContext, type MakeErrors, makeRouter } from "@effect-app/infra/routing"
4
4
  import { expect, expectTypeOf, it } from "@effect/vitest"
5
- import { Context, Effect, Layer, S, Scope } from "effect-app"
6
5
  import { InvalidStateError, makeRpcClient, UnauthorizedError } from "effect-app/client"
6
+ import * as Context from "effect-app/Context"
7
+ import * as Effect from "effect-app/Effect"
8
+ import * as Layer from "effect-app/Layer"
7
9
  import { DefaultGenericMiddlewares } from "effect-app/middleware"
8
10
  import * as RpcX from "effect-app/rpc"
9
11
  import { MiddlewareMaker } from "effect-app/rpc"
12
+ import * as S from "effect-app/Schema"
10
13
  import { TypeTestId } from "effect-app/TypeTest"
11
- import { type RpcSerialization } from "effect/unstable/rpc"
12
- import { DefaultGenericMiddlewaresLive, DevModeMiddlewareLive } from "../src/api/routing/middleware.js"
13
- import { sort } from "../src/api/routing/tsort.js"
14
+ import { type RpcSerialization } from "effect/rpc"
15
+ import * as Scope from "effect/Scope"
16
+ import { DefaultGenericMiddlewaresLive, DevModeMiddlewareLive } from "../src/routing/middleware.js"
17
+ import { sort } from "../src/routing/tsort.js"
14
18
  import { AllowAnonymous, AllowAnonymousLive, CustomError1, RequestContextMap, RequireRoles, RequireRolesLive, Some, SomeElse, SomeService, Test, TestLive } from "./fixtures.js"
15
19
 
16
20
  class MyContextProvider extends RpcX.RpcMiddleware.Tag<MyContextProvider, {
@@ -188,13 +192,6 @@ const middlewareQuater = MiddlewareMaker
188
192
 
189
193
  expectTypeOf(middleware["Service"]).toEqualTypeOf<typeof middlewareQuater["Service"]>()
190
194
 
191
- const middleware2 = MiddlewareMaker
192
- .Tag()("middleware", RequestContextMap)
193
- .middleware(MyContextProvider)
194
- .middleware(RequireRoles, Test)
195
- .middleware(AllowAnonymous)
196
- .middleware(...DefaultGenericMiddlewares, BogusMiddleware, MyContextProvider2)
197
-
198
195
  export const middleware3 = MiddlewareMaker
199
196
  .Tag()("middleware", RequestContextMap)
200
197
  .middleware(...genericMiddlewares)
@@ -202,15 +199,17 @@ export const middleware3 = MiddlewareMaker
202
199
  .middleware(Test)
203
200
  .middleware(BogusMiddleware)
204
201
 
205
- export const { TaggedRequestFor } = makeRpcClient(RequestContextMap)
202
+ export const { TaggedRequestFor } = makeRpcClient(middleware)
206
203
  const Req = TaggedRequestFor("Something")
204
+ const Command = Req.Command
205
+ const Query = Req.Query
207
206
 
208
- export class Eff extends Req<Eff>()("Eff", {}, { success: S.Void }) {}
209
- export class Gen extends Req<Gen>()("Gen", {}) {}
207
+ export class Eff extends Command<Eff>()("Eff", {}, { success: S.Void }) {}
208
+ export class Gen extends Command<Gen>()("Gen", {}) {}
210
209
 
211
210
  expectTypeOf(Eff.error).toEqualTypeOf<typeof Gen.error>()
212
211
 
213
- export class DoSomething extends Req<DoSomething>()("DoSomething", {
212
+ export class DoSomething extends Command<DoSomething>()("DoSomething", {
214
213
  id: S.String
215
214
  }, { success: S.Void }) {}
216
215
 
@@ -228,11 +227,11 @@ export class DoSomething extends Req<DoSomething>()("DoSomething", {
228
227
  // )
229
228
  // )
230
229
 
231
- export class GetSomething extends Req<GetSomething>()("GetSomething", {
230
+ export class GetSomething extends Query<GetSomething>()("GetSomething", {
232
231
  id: S.String
233
- }, { success: S.String }) {}
232
+ }, { success: S.String, error: UnauthorizedError }) {}
234
233
 
235
- export class GetSomething2 extends Req<GetSomething2>()("GetSomething2", {
234
+ export class GetSomething2 extends Query<GetSomething2>()("GetSomething2", {
236
235
  id: S.String
237
236
  }, { success: S.FiniteFromString }) {}
238
237
 
@@ -254,7 +253,7 @@ export class SomethingService extends Context.Service<SomethingService>()(
254
253
  static Default = Layer.effect(this, this.make)
255
254
  }
256
255
 
257
- declare const a: {
256
+ declare const _a: {
258
257
  (opt: { a: 1 }): void
259
258
  (opt: { a: 2 }): void
260
259
  (opt: { b: 3 }): void
@@ -285,13 +284,9 @@ export class SomethingService2 extends Context.Service<SomethingService2>()(
285
284
  static Default = Layer.effect(this, this.make)
286
285
  }
287
286
 
288
- export const { Router, matchAll } = makeRouter(
289
- middleware
290
- )
287
+ export const { Router, matchAll } = makeRouter(middleware.Default)
291
288
 
292
- export const r2 = makeRouter(
293
- Object.assign(middleware2, { Default: middleware2.layer.pipe(Layer.provide([...MiddlewaresLive])) })
294
- )
289
+ export const r2 = makeRouter(middleware.Default)
295
290
 
296
291
  const router = Router(Something)({
297
292
  dependencies: [
@@ -349,7 +344,7 @@ const router = Router(Something)({
349
344
  }
350
345
  },
351
346
  GetSomething2: {
352
- raw: Some.use(() => Effect.succeed("12"))
347
+ raw: () => Some.use(() => Effect.succeed("12"))
353
348
  }
354
349
  })
355
350
  }
@@ -414,7 +409,7 @@ const router2 = r2.Router(Something)({
414
409
  }
415
410
  },
416
411
  GetSomething2: {
417
- raw: Some.use(() => Effect.succeed("12"))
412
+ raw: () => Some.use(() => Effect.succeed("12"))
418
413
  }
419
414
  })
420
415
  }
@@ -0,0 +1,80 @@
1
+ import { describe, expect, it } from "@effect/vitest"
2
+ import { type ContainerDb, createContainerIfNotExists } from "../src/cosmos-client.js"
3
+
4
+ const body = { id: "prefix-Orders", partitionKey: { paths: ["/_partitionKey"], version: 2 } }
5
+
6
+ const fakeDb = (opts: {
7
+ readonly read: () => Promise<unknown>
8
+ readonly sharedOffer: boolean
9
+ readonly offerError?: unknown
10
+ }) => {
11
+ const calls = { created: [] as Array<unknown>, offerReads: 0 }
12
+ const db: ContainerDb = {
13
+ container: () => ({ read: opts.read }),
14
+ containers: {
15
+ createIfNotExists: (req) => {
16
+ calls.created.push(req)
17
+ return Promise.resolve({})
18
+ }
19
+ },
20
+ readOffer: () => {
21
+ calls.offerReads++
22
+ if (opts.offerError !== undefined) return Promise.reject(opts.offerError)
23
+ return Promise.resolve({ resource: opts.sharedOffer ? { id: "offer" } : undefined })
24
+ }
25
+ }
26
+ return { calls, db }
27
+ }
28
+
29
+ const existing = () => Promise.resolve({})
30
+ const missing = () => Promise.reject({ code: 404 })
31
+
32
+ describe("createContainerIfNotExists", () => {
33
+ it("keeps the Cosmos default when no autoscale max is configured", async () => {
34
+ const { calls, db } = fakeDb({ read: missing, sharedOffer: false })
35
+ await createContainerIfNotExists(db, body)
36
+ expect(calls.created).toEqual([body])
37
+ expect(calls.offerReads).toBe(0)
38
+ })
39
+
40
+ it("creates a missing container with autoscale in a database without shared throughput", async () => {
41
+ const { calls, db } = fakeDb({ read: missing, sharedOffer: false })
42
+ await createContainerIfNotExists(db, body, { autoscaleMaxThroughput: 1000 })
43
+ expect(calls.created).toEqual([{ ...body, maxThroughput: 1000 }])
44
+ })
45
+
46
+ it("lets a missing container share the database throughput when the database has an offer", async () => {
47
+ const { calls, db } = fakeDb({ read: missing, sharedOffer: true })
48
+ await createContainerIfNotExists(db, body, { autoscaleMaxThroughput: 1000 })
49
+ expect(calls.created).toEqual([body])
50
+ })
51
+
52
+ it("leaves existing containers untouched", async () => {
53
+ const { calls, db } = fakeDb({ read: existing, sharedOffer: false })
54
+ await createContainerIfNotExists(db, body, { autoscaleMaxThroughput: 1000 })
55
+ expect(calls.created).toEqual([])
56
+ expect(calls.offerReads).toBe(0)
57
+ })
58
+
59
+ it("propagates container read errors other than not found", async () => {
60
+ const { calls, db } = fakeDb({ read: () => Promise.reject({ code: 403 }), sharedOffer: false })
61
+ await expect(createContainerIfNotExists(db, body, { autoscaleMaxThroughput: 1000 })).rejects.toEqual({
62
+ code: 403
63
+ })
64
+ expect(calls.created).toEqual([])
65
+ })
66
+
67
+ it("creates without throughput when offer reads are rejected as serverless", async () => {
68
+ const { calls, db } = fakeDb({
69
+ read: missing,
70
+ sharedOffer: false,
71
+ offerError: {
72
+ code: 400,
73
+ message: "Reading or replacing offers is not supported for serverless accounts."
74
+ }
75
+ })
76
+ await createContainerIfNotExists(db, body, { autoscaleMaxThroughput: 1000 })
77
+ expect(calls.created).toEqual([body])
78
+ expect(calls.offerReads).toBe(1)
79
+ })
80
+ })