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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (486) hide show
  1. package/CHANGELOG.md +2901 -0
  2. package/_check.sh +1 -1
  3. package/dist/CUPS.d.ts +28 -9
  4. package/dist/CUPS.d.ts.map +1 -1
  5. package/dist/CUPS.js +35 -14
  6. package/dist/ClusterCosmos.d.ts +67 -0
  7. package/dist/ClusterCosmos.d.ts.map +1 -0
  8. package/dist/ClusterCosmos.js +588 -0
  9. package/dist/ClusterServiceBus.d.ts +67 -0
  10. package/dist/ClusterServiceBus.d.ts.map +1 -0
  11. package/dist/ClusterServiceBus.js +84 -0
  12. package/dist/{api/ContextProvider.d.ts → ContextProvider.d.ts} +7 -4
  13. package/dist/ContextProvider.d.ts.map +1 -0
  14. package/dist/ContextProvider.js +40 -0
  15. package/dist/Emailer/Sendgrid.d.ts +110 -146
  16. package/dist/Emailer/Sendgrid.d.ts.map +1 -1
  17. package/dist/Emailer/Sendgrid.js +24 -19
  18. package/dist/Emailer/fake.d.ts +1 -1
  19. package/dist/Emailer/fake.d.ts.map +1 -1
  20. package/dist/Emailer/fake.js +4 -4
  21. package/dist/MainFiberSet.d.ts +11 -7
  22. package/dist/MainFiberSet.d.ts.map +1 -1
  23. package/dist/MainFiberSet.js +22 -6
  24. package/dist/QueueMaker/errors.d.ts +3 -1
  25. package/dist/QueueMaker/errors.d.ts.map +1 -1
  26. package/dist/QueueMaker/errors.js +4 -2
  27. package/dist/{adapters/SQL → SQL}/Model.d.ts +34 -45
  28. package/dist/SQL/Model.d.ts.map +1 -0
  29. package/dist/SQL/Model.js +469 -0
  30. package/dist/SQL.d.ts.map +1 -0
  31. package/dist/{adapters/SQL.js → SQL.js} +1 -1
  32. package/dist/Store/Cosmos/query.d.ts +16 -4
  33. package/dist/Store/Cosmos/query.d.ts.map +1 -1
  34. package/dist/Store/Cosmos/query.js +240 -44
  35. package/dist/Store/Cosmos.d.ts +2 -2
  36. package/dist/Store/Cosmos.d.ts.map +1 -1
  37. package/dist/Store/Cosmos.js +394 -320
  38. package/dist/Store/Disk.d.ts +4 -4
  39. package/dist/Store/Disk.d.ts.map +1 -1
  40. package/dist/Store/Disk.js +91 -39
  41. package/dist/Store/Memory.d.ts +7 -10
  42. package/dist/Store/Memory.d.ts.map +1 -1
  43. package/dist/Store/Memory.js +347 -78
  44. package/dist/Store/SQL/Pg.d.ts +2 -2
  45. package/dist/Store/SQL/Pg.d.ts.map +1 -1
  46. package/dist/Store/SQL/Pg.js +230 -155
  47. package/dist/Store/SQL/query.d.ts +19 -3
  48. package/dist/Store/SQL/query.d.ts.map +1 -1
  49. package/dist/Store/SQL/query.js +308 -14
  50. package/dist/Store/SQL.d.ts +22 -5
  51. package/dist/Store/SQL.d.ts.map +1 -1
  52. package/dist/Store/SQL.js +370 -99
  53. package/dist/Store/codeFilter.d.ts +5 -5
  54. package/dist/Store/codeFilter.d.ts.map +1 -1
  55. package/dist/Store/codeFilter.js +72 -23
  56. package/dist/Store/index.d.ts +6 -4
  57. package/dist/Store/index.d.ts.map +1 -1
  58. package/dist/Store/index.js +9 -6
  59. package/dist/Store/jsonDocument.d.ts +67 -0
  60. package/dist/Store/jsonDocument.d.ts.map +1 -0
  61. package/dist/Store/jsonDocument.js +107 -0
  62. package/dist/Store/utils.d.ts +21 -2
  63. package/dist/Store/utils.d.ts.map +1 -1
  64. package/dist/Store/utils.js +253 -10
  65. package/dist/WorkflowEngineCosmos.d.ts +30 -0
  66. package/dist/WorkflowEngineCosmos.d.ts.map +1 -0
  67. package/dist/WorkflowEngineCosmos.js +542 -0
  68. package/dist/WorkflowEngineSqlite.d.ts +24 -0
  69. package/dist/WorkflowEngineSqlite.d.ts.map +1 -0
  70. package/dist/WorkflowEngineSqlite.js +550 -0
  71. package/dist/arbs.d.ts +6 -3
  72. package/dist/arbs.d.ts.map +1 -1
  73. package/dist/arbs.js +20 -4
  74. package/dist/codec.d.ts.map +1 -0
  75. package/dist/codec.js +5 -0
  76. package/dist/cosmos-client.d.ts +40 -0
  77. package/dist/cosmos-client.d.ts.map +1 -0
  78. package/dist/cosmos-client.js +41 -0
  79. package/dist/errorReporter.d.ts +6 -4
  80. package/dist/errorReporter.d.ts.map +1 -1
  81. package/dist/errorReporter.js +23 -27
  82. package/dist/fileUtil.d.ts +1 -1
  83. package/dist/fileUtil.d.ts.map +1 -1
  84. package/dist/fileUtil.js +2 -2
  85. package/dist/index.d.ts +2 -1
  86. package/dist/index.d.ts.map +1 -1
  87. package/dist/index.js +3 -2
  88. package/dist/internal/RequestContextMiddleware.d.ts +5 -0
  89. package/dist/internal/RequestContextMiddleware.d.ts.map +1 -0
  90. package/dist/internal/RequestContextMiddleware.js +45 -0
  91. package/dist/internal/auth.d.ts +53 -0
  92. package/dist/internal/auth.d.ts.map +1 -0
  93. package/dist/internal/auth.js +180 -0
  94. package/dist/internal/events.d.ts +11 -0
  95. package/dist/internal/events.d.ts.map +1 -0
  96. package/dist/internal/events.js +49 -0
  97. package/dist/{api/internal → internal}/health.d.ts +1 -1
  98. package/dist/internal/health.d.ts.map +1 -0
  99. package/dist/internal/health.js +5 -0
  100. package/dist/{api/layerUtils.d.ts → layerUtils.d.ts} +10 -2
  101. package/dist/layerUtils.d.ts.map +1 -0
  102. package/dist/layerUtils.js +17 -0
  103. package/dist/logger/jsonLogger.d.ts +1 -1
  104. package/dist/logger/jsonLogger.d.ts.map +1 -1
  105. package/dist/logger/jsonLogger.js +5 -3
  106. package/dist/logger/logFmtLogger.d.ts +1 -1
  107. package/dist/logger/logFmtLogger.d.ts.map +1 -1
  108. package/dist/logger/logFmtLogger.js +3 -3
  109. package/dist/logger/shared.d.ts +2 -2
  110. package/dist/logger/shared.d.ts.map +1 -1
  111. package/dist/logger/shared.js +6 -6
  112. package/dist/logger.d.ts.map +1 -1
  113. package/dist/middlewares.d.ts.map +1 -0
  114. package/dist/{api/middlewares.js → middlewares.js} +1 -1
  115. package/dist/{adapters/mongo-client.d.ts → mongo-client.d.ts} +2 -1
  116. package/dist/mongo-client.d.ts.map +1 -0
  117. package/dist/mongo-client.js +15 -0
  118. package/dist/otel.d.ts +75 -0
  119. package/dist/otel.d.ts.map +1 -0
  120. package/dist/otel.js +84 -0
  121. package/dist/rateLimit.d.ts +11 -3
  122. package/dist/rateLimit.d.ts.map +1 -1
  123. package/dist/rateLimit.js +7 -12
  124. package/dist/{adapters/redis-client.d.ts → redis-client.d.ts} +4 -1
  125. package/dist/redis-client.d.ts.map +1 -0
  126. package/dist/redis-client.js +98 -0
  127. package/dist/{api/reportError.d.ts → reportError.d.ts} +1 -1
  128. package/dist/reportError.d.ts.map +1 -0
  129. package/dist/reportError.js +28 -0
  130. package/dist/{api/routing → routing}/middleware/RouterMiddleware.d.ts +2 -1
  131. package/dist/routing/middleware/RouterMiddleware.d.ts.map +1 -0
  132. package/dist/{api/routing → routing}/middleware/RouterMiddleware.js +1 -1
  133. package/dist/{api/routing → routing}/middleware/middleware.d.ts +11 -6
  134. package/dist/routing/middleware/middleware.d.ts.map +1 -0
  135. package/dist/routing/middleware/middleware.js +152 -0
  136. package/dist/{api/routing → routing}/middleware.d.ts +0 -1
  137. package/dist/routing/middleware.d.ts.map +1 -0
  138. package/dist/{api/routing → routing}/middleware.js +1 -2
  139. package/dist/routing/schema/jwt.d.ts.map +1 -0
  140. package/dist/routing/schema/jwt.js +12 -0
  141. package/dist/routing/tsort.d.ts.map +1 -0
  142. package/dist/routing/tsort.js +51 -0
  143. package/dist/{api/routing → routing}/utils.d.ts +3 -3
  144. package/dist/routing/utils.d.ts.map +1 -0
  145. package/dist/routing/utils.js +45 -0
  146. package/dist/routing.d.ts +182 -0
  147. package/dist/routing.d.ts.map +1 -0
  148. package/dist/routing.js +257 -0
  149. package/dist/test.d.ts +2 -2
  150. package/dist/test.d.ts.map +1 -1
  151. package/dist/test.js +5 -5
  152. package/dist/util.d.ts.map +1 -0
  153. package/dist/util.js +14 -0
  154. package/docs/cluster-storage.md +26 -0
  155. package/docs/workflow-engine.md +262 -0
  156. package/examples/query.ts +23 -19
  157. package/package.json +36 -364
  158. package/src/CUPS.ts +53 -14
  159. package/src/ClusterCosmos.ts +1170 -0
  160. package/src/ClusterServiceBus.ts +244 -0
  161. package/src/{api/ContextProvider.ts → ContextProvider.ts} +10 -7
  162. package/src/Emailer/Sendgrid.ts +83 -60
  163. package/src/Emailer/fake.ts +4 -4
  164. package/src/MainFiberSet.ts +31 -12
  165. package/src/QueueMaker/errors.ts +3 -1
  166. package/src/{adapters/SQL → SQL}/Model.ts +48 -47
  167. package/src/SQL.ts +1 -0
  168. package/src/Store/Cosmos/query.ts +277 -57
  169. package/src/Store/Cosmos.ts +597 -512
  170. package/src/Store/Disk.ts +145 -71
  171. package/src/Store/Memory.ts +419 -115
  172. package/src/Store/SQL/Pg.ts +352 -269
  173. package/src/Store/SQL/query.ts +368 -22
  174. package/src/Store/SQL.ts +742 -294
  175. package/src/Store/codeFilter.ts +79 -29
  176. package/src/Store/index.ts +18 -13
  177. package/src/Store/jsonDocument.ts +143 -0
  178. package/src/Store/utils.ts +307 -30
  179. package/src/WorkflowEngineCosmos.ts +749 -0
  180. package/src/WorkflowEngineSqlite.ts +813 -0
  181. package/src/arbs.ts +25 -5
  182. package/src/cosmos-client.ts +72 -0
  183. package/src/errorReporter.ts +70 -78
  184. package/src/fileUtil.ts +1 -1
  185. package/src/index.ts +2 -1
  186. package/src/{api/internal → internal}/RequestContextMiddleware.ts +23 -6
  187. package/src/internal/auth.ts +272 -0
  188. package/src/{api/internal → internal}/events.ts +18 -9
  189. package/src/{api/layerUtils.ts → layerUtils.ts} +7 -3
  190. package/src/logger/jsonLogger.ts +5 -3
  191. package/src/logger/logFmtLogger.ts +3 -3
  192. package/src/logger/shared.ts +6 -5
  193. package/src/middlewares.ts +10 -0
  194. package/src/{adapters/mongo-client.ts → mongo-client.ts} +3 -1
  195. package/src/otel.ts +177 -0
  196. package/src/rateLimit.ts +35 -24
  197. package/src/{adapters/redis-client.ts → redis-client.ts} +6 -2
  198. package/src/{api/reportError.ts → reportError.ts} +3 -2
  199. package/src/{api/routing → routing}/middleware/RouterMiddleware.ts +2 -1
  200. package/src/{api/routing → routing}/middleware/middleware.ts +75 -50
  201. package/src/routing/middleware.ts +4 -0
  202. package/src/{api/routing → routing}/schema/jwt.ts +2 -2
  203. package/src/{api/routing → routing}/utils.ts +2 -1
  204. package/src/routing.ts +827 -0
  205. package/src/test.ts +6 -6
  206. package/src/vitest.ts +1 -1
  207. package/test/arbs-magnitude.test.ts +33 -0
  208. package/test/arbs.test.ts +41 -0
  209. package/test/auth.test.ts +101 -0
  210. package/test/cluster-cosmos.test.ts +634 -0
  211. package/test/cluster-servicebus.test.ts +180 -0
  212. package/test/cluster-sqlite.test.ts +207 -0
  213. package/test/contextProvider.test.ts +11 -8
  214. package/test/controller.test.ts +23 -28
  215. package/test/cosmos-container-throughput.test.ts +80 -0
  216. package/test/cosmos-query.test.ts +368 -0
  217. package/test/dist/arbs-magnitude.test.d.ts.map +1 -0
  218. package/test/dist/arbs.test.d.ts.map +1 -0
  219. package/test/dist/auth.test.d.ts.map +1 -0
  220. package/test/dist/cluster-cosmos.test.d.ts.map +1 -0
  221. package/test/dist/cluster-servicebus.test.d.ts.map +1 -0
  222. package/test/dist/cluster-sqlite.test.d.ts.map +1 -0
  223. package/test/dist/contextProvider.test.d.ts.map +1 -1
  224. package/test/dist/controller.test.d.ts.map +1 -1
  225. package/test/dist/cosmos-container-throughput.test.d.ts.map +1 -0
  226. package/test/dist/cosmos-query.test.d.ts.map +1 -0
  227. package/test/dist/fixtures.d.ts +17 -9
  228. package/test/dist/fixtures.d.ts.map +1 -1
  229. package/test/dist/fixtures.js +8 -3
  230. package/test/dist/json-lower.test.d.ts.map +1 -0
  231. package/test/dist/query.test.d.ts.map +1 -1
  232. package/test/dist/rawQuery.test.d.ts.map +1 -1
  233. package/test/dist/repository-ext.test.d.ts.map +1 -0
  234. package/test/dist/repository-legacy-document.test.d.ts.map +1 -0
  235. package/test/dist/requires.test.d.ts.map +1 -1
  236. package/test/dist/router-generator.test.d.ts.map +1 -0
  237. package/test/dist/routing-interruptibility.test.d.ts.map +1 -0
  238. package/test/dist/rpc-context-map-streaming.test.d.ts.map +1 -0
  239. package/test/dist/rpc-e2e-invalidation.test.d.ts.map +1 -0
  240. package/test/dist/rpc-multi-middleware.test.d.ts.map +1 -1
  241. package/test/dist/rpc-stream-fullstack.test.d.ts.map +1 -0
  242. package/test/dist/workflow-engine-cosmos.test.d.ts.map +1 -0
  243. package/test/dist/workflow-engine-sqlite.test.d.ts.map +1 -0
  244. package/test/fixtures.ts +7 -2
  245. package/test/json-lower.test.ts +129 -0
  246. package/test/layerUtils.test.ts +2 -2
  247. package/test/query.test.ts +1232 -42
  248. package/test/rawQuery.test.ts +432 -7
  249. package/test/repository-ext.test.ts +456 -0
  250. package/test/repository-legacy-document.test.ts +394 -0
  251. package/test/requires.test.ts +7 -3
  252. package/test/router-generator.test.ts +187 -0
  253. package/test/routing-interruptibility.test.ts +66 -0
  254. package/test/rpc-context-map-streaming.test.ts +265 -0
  255. package/test/rpc-e2e-invalidation.test.ts +421 -0
  256. package/test/rpc-multi-middleware.test.ts +17 -11
  257. package/test/rpc-stream-fullstack.test.ts +307 -0
  258. package/test/sql-store.test.ts +1202 -47
  259. package/test/validateSample.test.ts +70 -42
  260. package/test/workflow-engine-cosmos.test.ts +345 -0
  261. package/test/workflow-engine-sqlite.test.ts +297 -0
  262. package/tsconfig.examples.json +1 -1
  263. package/tsconfig.json +9 -1
  264. package/tsconfig.src.json +35 -35
  265. package/tsconfig.test.json +2 -2
  266. package/dist/Emailer/service.d.ts +0 -55
  267. package/dist/Emailer/service.d.ts.map +0 -1
  268. package/dist/Emailer/service.js +0 -6
  269. package/dist/Emailer.d.ts +0 -2
  270. package/dist/Emailer.d.ts.map +0 -1
  271. package/dist/Emailer.js +0 -2
  272. package/dist/Model/Repository/ext.d.ts +0 -41
  273. package/dist/Model/Repository/ext.d.ts.map +0 -1
  274. package/dist/Model/Repository/ext.js +0 -65
  275. package/dist/Model/Repository/internal/internal.d.ts +0 -59
  276. package/dist/Model/Repository/internal/internal.d.ts.map +0 -1
  277. package/dist/Model/Repository/internal/internal.js +0 -320
  278. package/dist/Model/Repository/legacy.d.ts +0 -19
  279. package/dist/Model/Repository/legacy.d.ts.map +0 -1
  280. package/dist/Model/Repository/legacy.js +0 -2
  281. package/dist/Model/Repository/makeRepo.d.ts +0 -49
  282. package/dist/Model/Repository/makeRepo.d.ts.map +0 -1
  283. package/dist/Model/Repository/makeRepo.js +0 -24
  284. package/dist/Model/Repository/service.d.ts +0 -89
  285. package/dist/Model/Repository/service.d.ts.map +0 -1
  286. package/dist/Model/Repository/service.js +0 -2
  287. package/dist/Model/Repository/validation.d.ts +0 -43
  288. package/dist/Model/Repository/validation.d.ts.map +0 -1
  289. package/dist/Model/Repository/validation.js +0 -32
  290. package/dist/Model/Repository.d.ts +0 -6
  291. package/dist/Model/Repository.d.ts.map +0 -1
  292. package/dist/Model/Repository.js +0 -6
  293. package/dist/Model/dsl.d.ts +0 -32
  294. package/dist/Model/dsl.d.ts.map +0 -1
  295. package/dist/Model/dsl.js +0 -44
  296. package/dist/Model/filter/filterApi.d.ts +0 -30
  297. package/dist/Model/filter/filterApi.d.ts.map +0 -1
  298. package/dist/Model/filter/filterApi.js +0 -2
  299. package/dist/Model/filter/types/errors.d.ts +0 -29
  300. package/dist/Model/filter/types/errors.d.ts.map +0 -1
  301. package/dist/Model/filter/types/errors.js +0 -2
  302. package/dist/Model/filter/types/fields.d.ts +0 -15
  303. package/dist/Model/filter/types/fields.d.ts.map +0 -1
  304. package/dist/Model/filter/types/fields.js +0 -2
  305. package/dist/Model/filter/types/path/common.d.ts +0 -316
  306. package/dist/Model/filter/types/path/common.d.ts.map +0 -1
  307. package/dist/Model/filter/types/path/common.js +0 -2
  308. package/dist/Model/filter/types/path/eager.d.ts +0 -95
  309. package/dist/Model/filter/types/path/eager.d.ts.map +0 -1
  310. package/dist/Model/filter/types/path/eager.js +0 -31
  311. package/dist/Model/filter/types/path/index.d.ts +0 -4
  312. package/dist/Model/filter/types/path/index.d.ts.map +0 -1
  313. package/dist/Model/filter/types/path/index.js +0 -3
  314. package/dist/Model/filter/types/utils.d.ts +0 -79
  315. package/dist/Model/filter/types/utils.d.ts.map +0 -1
  316. package/dist/Model/filter/types/utils.js +0 -2
  317. package/dist/Model/filter/types/validator.d.ts +0 -30
  318. package/dist/Model/filter/types/validator.d.ts.map +0 -1
  319. package/dist/Model/filter/types/validator.js +0 -2
  320. package/dist/Model/filter/types.d.ts +0 -5
  321. package/dist/Model/filter/types.d.ts.map +0 -1
  322. package/dist/Model/filter/types.js +0 -7
  323. package/dist/Model/query/dsl.d.ts +0 -248
  324. package/dist/Model/query/dsl.d.ts.map +0 -1
  325. package/dist/Model/query/dsl.js +0 -104
  326. package/dist/Model/query/new-kid-interpreter.d.ts +0 -28
  327. package/dist/Model/query/new-kid-interpreter.d.ts.map +0 -1
  328. package/dist/Model/query/new-kid-interpreter.js +0 -165
  329. package/dist/Model/query.d.ts +0 -15
  330. package/dist/Model/query.d.ts.map +0 -1
  331. package/dist/Model/query.js +0 -3
  332. package/dist/Model.d.ts +0 -4
  333. package/dist/Model.d.ts.map +0 -1
  334. package/dist/Model.js +0 -4
  335. package/dist/Operations.d.ts +0 -55
  336. package/dist/Operations.d.ts.map +0 -1
  337. package/dist/Operations.js +0 -102
  338. package/dist/OperationsRepo.d.ts +0 -41
  339. package/dist/OperationsRepo.d.ts.map +0 -1
  340. package/dist/OperationsRepo.js +0 -14
  341. package/dist/QueueMaker/SQLQueue.d.ts +0 -14
  342. package/dist/QueueMaker/SQLQueue.d.ts.map +0 -1
  343. package/dist/QueueMaker/SQLQueue.js +0 -132
  344. package/dist/QueueMaker/memQueue.d.ts +0 -11
  345. package/dist/QueueMaker/memQueue.d.ts.map +0 -1
  346. package/dist/QueueMaker/memQueue.js +0 -76
  347. package/dist/QueueMaker/sbqueue.d.ts +0 -12
  348. package/dist/QueueMaker/sbqueue.d.ts.map +0 -1
  349. package/dist/QueueMaker/sbqueue.js +0 -91
  350. package/dist/QueueMaker/service.d.ts +0 -11
  351. package/dist/QueueMaker/service.d.ts.map +0 -1
  352. package/dist/QueueMaker/service.js +0 -4
  353. package/dist/RequestContext.d.ts +0 -68
  354. package/dist/RequestContext.d.ts.map +0 -1
  355. package/dist/RequestContext.js +0 -49
  356. package/dist/RequestFiberSet.d.ts +0 -36
  357. package/dist/RequestFiberSet.d.ts.map +0 -1
  358. package/dist/RequestFiberSet.js +0 -78
  359. package/dist/Store/ContextMapContainer.d.ts +0 -25
  360. package/dist/Store/ContextMapContainer.d.ts.map +0 -1
  361. package/dist/Store/ContextMapContainer.js +0 -77
  362. package/dist/Store/service.d.ts +0 -111
  363. package/dist/Store/service.d.ts.map +0 -1
  364. package/dist/Store/service.js +0 -79
  365. package/dist/Store.d.ts +0 -2
  366. package/dist/Store.d.ts.map +0 -1
  367. package/dist/Store.js +0 -2
  368. package/dist/adapters/SQL/Model.d.ts.map +0 -1
  369. package/dist/adapters/SQL/Model.js +0 -478
  370. package/dist/adapters/SQL.d.ts.map +0 -1
  371. package/dist/adapters/ServiceBus.d.ts +0 -58
  372. package/dist/adapters/ServiceBus.d.ts.map +0 -1
  373. package/dist/adapters/ServiceBus.js +0 -99
  374. package/dist/adapters/cosmos-client.d.ts +0 -14
  375. package/dist/adapters/cosmos-client.d.ts.map +0 -1
  376. package/dist/adapters/cosmos-client.js +0 -9
  377. package/dist/adapters/index.d.ts +0 -2
  378. package/dist/adapters/index.d.ts.map +0 -1
  379. package/dist/adapters/index.js +0 -2
  380. package/dist/adapters/logger.d.ts +0 -9
  381. package/dist/adapters/logger.d.ts.map +0 -1
  382. package/dist/adapters/logger.js +0 -3
  383. package/dist/adapters/memQueue.d.ts +0 -13
  384. package/dist/adapters/memQueue.d.ts.map +0 -1
  385. package/dist/adapters/memQueue.js +0 -20
  386. package/dist/adapters/mongo-client.d.ts.map +0 -1
  387. package/dist/adapters/mongo-client.js +0 -13
  388. package/dist/adapters/redis-client.d.ts.map +0 -1
  389. package/dist/adapters/redis-client.js +0 -94
  390. package/dist/api/ContextProvider.d.ts.map +0 -1
  391. package/dist/api/ContextProvider.js +0 -38
  392. package/dist/api/codec.d.ts.map +0 -1
  393. package/dist/api/codec.js +0 -5
  394. package/dist/api/internal/RequestContextMiddleware.d.ts +0 -5
  395. package/dist/api/internal/RequestContextMiddleware.d.ts.map +0 -1
  396. package/dist/api/internal/RequestContextMiddleware.js +0 -35
  397. package/dist/api/internal/auth.d.ts +0 -15
  398. package/dist/api/internal/auth.d.ts.map +0 -1
  399. package/dist/api/internal/auth.js +0 -47
  400. package/dist/api/internal/events.d.ts +0 -9
  401. package/dist/api/internal/events.d.ts.map +0 -1
  402. package/dist/api/internal/events.js +0 -42
  403. package/dist/api/internal/health.d.ts.map +0 -1
  404. package/dist/api/internal/health.js +0 -5
  405. package/dist/api/layerUtils.d.ts.map +0 -1
  406. package/dist/api/layerUtils.js +0 -16
  407. package/dist/api/middlewares.d.ts.map +0 -1
  408. package/dist/api/reportError.d.ts.map +0 -1
  409. package/dist/api/reportError.js +0 -27
  410. package/dist/api/routing/middleware/RouterMiddleware.d.ts.map +0 -1
  411. package/dist/api/routing/middleware/middleware.d.ts.map +0 -1
  412. package/dist/api/routing/middleware/middleware.js +0 -130
  413. package/dist/api/routing/middleware.d.ts.map +0 -1
  414. package/dist/api/routing/schema/jwt.d.ts.map +0 -1
  415. package/dist/api/routing/schema/jwt.js +0 -12
  416. package/dist/api/routing/tsort.d.ts.map +0 -1
  417. package/dist/api/routing/tsort.js +0 -51
  418. package/dist/api/routing/utils.d.ts.map +0 -1
  419. package/dist/api/routing/utils.js +0 -44
  420. package/dist/api/routing.d.ts +0 -134
  421. package/dist/api/routing.d.ts.map +0 -1
  422. package/dist/api/routing.js +0 -167
  423. package/dist/api/setupRequest.d.ts +0 -15
  424. package/dist/api/setupRequest.d.ts.map +0 -1
  425. package/dist/api/setupRequest.js +0 -49
  426. package/dist/api/util.d.ts.map +0 -1
  427. package/dist/api/util.js +0 -14
  428. package/eslint.config.mjs +0 -24
  429. package/src/Emailer/service.ts +0 -52
  430. package/src/Emailer.ts +0 -1
  431. package/src/Model/Repository/ext.ts +0 -283
  432. package/src/Model/Repository/internal/internal.ts +0 -580
  433. package/src/Model/Repository/legacy.ts +0 -27
  434. package/src/Model/Repository/makeRepo.ts +0 -139
  435. package/src/Model/Repository/service.ts +0 -627
  436. package/src/Model/Repository/validation.ts +0 -31
  437. package/src/Model/Repository.ts +0 -5
  438. package/src/Model/dsl.ts +0 -128
  439. package/src/Model/filter/filterApi.ts +0 -60
  440. package/src/Model/filter/types/errors.ts +0 -47
  441. package/src/Model/filter/types/fields.ts +0 -50
  442. package/src/Model/filter/types/path/common.ts +0 -404
  443. package/src/Model/filter/types/path/eager.ts +0 -298
  444. package/src/Model/filter/types/path/index.ts +0 -4
  445. package/src/Model/filter/types/utils.ts +0 -128
  446. package/src/Model/filter/types/validator.ts +0 -46
  447. package/src/Model/filter/types.ts +0 -6
  448. package/src/Model/query/dsl.ts +0 -2110
  449. package/src/Model/query/new-kid-interpreter.ts +0 -210
  450. package/src/Model/query.ts +0 -13
  451. package/src/Model.ts +0 -3
  452. package/src/Operations.ts +0 -235
  453. package/src/OperationsRepo.ts +0 -16
  454. package/src/QueueMaker/SQLQueue.ts +0 -190
  455. package/src/QueueMaker/memQueue.ts +0 -130
  456. package/src/QueueMaker/sbqueue.ts +0 -137
  457. package/src/QueueMaker/service.ts +0 -17
  458. package/src/RequestContext.ts +0 -63
  459. package/src/RequestFiberSet.ts +0 -105
  460. package/src/Store/ContextMapContainer.ts +0 -116
  461. package/src/Store/index.test.ts.bak +0 -112
  462. package/src/Store/service.ts +0 -193
  463. package/src/Store.ts +0 -1
  464. package/src/adapters/SQL.ts +0 -1
  465. package/src/adapters/ServiceBus.ts +0 -209
  466. package/src/adapters/cosmos-client.ts +0 -16
  467. package/src/adapters/index.ts +0 -0
  468. package/src/adapters/logger.ts +0 -3
  469. package/src/adapters/memQueue.ts +0 -21
  470. package/src/api/internal/auth.ts +0 -68
  471. package/src/api/middlewares.ts +0 -10
  472. package/src/api/routing/middleware.ts +0 -6
  473. package/src/api/routing.ts +0 -598
  474. package/src/api/setupRequest.ts +0 -104
  475. package/test/dist/date-query.test.d.ts.map +0 -1
  476. package/tsconfig.json.bak +0 -12
  477. /package/dist/{adapters/SQL.d.ts → SQL.d.ts} +0 -0
  478. /package/dist/{api/codec.d.ts → codec.d.ts} +0 -0
  479. /package/dist/{api/middlewares.d.ts → middlewares.d.ts} +0 -0
  480. /package/dist/{api/routing → routing}/schema/jwt.d.ts +0 -0
  481. /package/dist/{api/routing → routing}/tsort.d.ts +0 -0
  482. /package/dist/{api/util.d.ts → util.d.ts} +0 -0
  483. /package/src/{api/codec.ts → codec.ts} +0 -0
  484. /package/src/{api/internal → internal}/health.ts +0 -0
  485. /package/src/{api/routing → routing}/tsort.ts +0 -0
  486. /package/src/{api/util.ts → util.ts} +0 -0
@@ -0,0 +1,588 @@
1
+ import * as Arr from "effect-app/Array";
2
+ import * as Effect from "effect-app/Effect";
3
+ import * as Layer from "effect-app/Layer";
4
+ import * as Option from "effect-app/Option";
5
+ import * as Cause from "effect/Cause";
6
+ import { PersistenceError } from "effect/cluster/ClusterError";
7
+ import * as MessageStorage from "effect/cluster/MessageStorage";
8
+ import { SaveResultEncoded } from "effect/cluster/MessageStorage";
9
+ import * as RunnerStorage from "effect/cluster/RunnerStorage";
10
+ import * as ShardId from "effect/cluster/ShardId";
11
+ import * as ShardingConfig from "effect/cluster/ShardingConfig";
12
+ import * as Snowflake from "effect/cluster/Snowflake";
13
+ import * as Duration from "effect/Duration";
14
+ import * as Redacted from "effect/Redacted";
15
+ import { CosmosClient, CosmosClientLayer, createContainerIfNotExists } from "./cosmos-client.js";
16
+ import { annotateCosmosResponse, annotateDb } from "./otel.js";
17
+ const withTracerDisabled = Effect.withTracerEnabled(false);
18
+ const refailPersistence = (effect) => PersistenceError.refail(effect);
19
+ const cosmosId = (id) => encodeURIComponent(id);
20
+ const messagePartition = (shardId) => `message::${shardId}`;
21
+ const messageDocId = (envelope, primaryKey) => cosmosId(primaryKey === null ? envelopeId(envelope) : `primary::${primaryKey}`);
22
+ const replyPartition = (requestId) => `reply::${requestId}`;
23
+ const runnerDocId = (address) => cosmosId(`runner::${address}`);
24
+ const lockDocId = (shardId) => cosmosId(`lock::${shardId}`);
25
+ const tenMinutes = Duration.toMillis(Duration.minutes(10));
26
+ const maxCosmosBatchOperations = 100;
27
+ const isSuccessfulStatus = (statusCode) => statusCode !== undefined && statusCode >= 200 && statusCode < 300;
28
+ const isCosmosStatus = (u, code) => Cause.isUnknownError(u)
29
+ ? isCosmosStatus(u.cause, code)
30
+ : typeof u === "object" && u !== null && "code" in u && u.code === code;
31
+ const isConflict = (u) => isCosmosStatus(u, 409);
32
+ const isNotFound = (u) => isCosmosStatus(u, 404);
33
+ const isPreconditionFailed = (u) => isCosmosStatus(u, 412);
34
+ const respBytes = (resp) => resp.diagnostics?.clientSideRequestStatistics?.totalResponsePayloadLengthInBytes ?? 0;
35
+ const annotateItem = (resp) => annotateCosmosResponse({
36
+ requestCharge: resp.requestCharge,
37
+ statusCode: resp.statusCode,
38
+ responseBytes: respBytes(resp)
39
+ });
40
+ const annotateFeed = (resp) => annotateCosmosResponse({
41
+ requestCharge: resp.requestCharge,
42
+ returnedRows: resp.resources.length,
43
+ responseBytes: respBytes(resp)
44
+ });
45
+ const envelopeId = (envelope) => envelope._tag === "Request" ? envelope.requestId : envelope.id;
46
+ const envelopeToDoc = (envelope, primaryKey, deliverAt) => {
47
+ switch (envelope._tag) {
48
+ case "Request":
49
+ return {
50
+ id: messageDocId(envelope, primaryKey),
51
+ _partitionKey: messagePartition(ShardId.toString(envelope.address.shardId)),
52
+ type: "message",
53
+ rowid: envelope.requestId,
54
+ messageId: primaryKey,
55
+ shardId: ShardId.toString(envelope.address.shardId),
56
+ entityType: envelope.address.entityType,
57
+ entityId: envelope.address.entityId,
58
+ kind: "Request",
59
+ tag: envelope.tag,
60
+ payload: envelope.payload,
61
+ headers: envelope.headers,
62
+ traceId: envelope.traceId,
63
+ spanId: envelope.spanId,
64
+ sampled: envelope.sampled,
65
+ processed: false,
66
+ requestId: envelope.requestId,
67
+ replyId: null,
68
+ lastReplyId: null,
69
+ lastRead: null,
70
+ deliverAt
71
+ };
72
+ case "AckChunk":
73
+ return {
74
+ id: cosmosId(envelope.id),
75
+ _partitionKey: messagePartition(ShardId.toString(envelope.address.shardId)),
76
+ type: "message",
77
+ rowid: envelope.id,
78
+ messageId: primaryKey,
79
+ shardId: ShardId.toString(envelope.address.shardId),
80
+ entityType: envelope.address.entityType,
81
+ entityId: envelope.address.entityId,
82
+ kind: "AckChunk",
83
+ tag: null,
84
+ payload: null,
85
+ headers: null,
86
+ processed: false,
87
+ requestId: envelope.requestId,
88
+ replyId: envelope.replyId,
89
+ lastReplyId: null,
90
+ lastRead: null,
91
+ deliverAt
92
+ };
93
+ case "Interrupt":
94
+ return {
95
+ id: cosmosId(envelope.id),
96
+ _partitionKey: messagePartition(ShardId.toString(envelope.address.shardId)),
97
+ type: "message",
98
+ rowid: envelope.id,
99
+ messageId: primaryKey,
100
+ shardId: ShardId.toString(envelope.address.shardId),
101
+ entityType: envelope.address.entityType,
102
+ entityId: envelope.address.entityId,
103
+ kind: "Interrupt",
104
+ tag: null,
105
+ payload: null,
106
+ headers: null,
107
+ processed: false,
108
+ requestId: envelope.requestId,
109
+ replyId: null,
110
+ lastReplyId: null,
111
+ lastRead: null,
112
+ deliverAt
113
+ };
114
+ }
115
+ };
116
+ const envelopeFromDoc = (doc, lastSentReply) => {
117
+ switch (doc.kind) {
118
+ case "Request": {
119
+ const envelope = {
120
+ _tag: "Request",
121
+ requestId: doc.requestId,
122
+ address: {
123
+ shardId: shardIdFromString(doc.shardId),
124
+ entityType: doc.entityType,
125
+ entityId: doc.entityId
126
+ },
127
+ tag: doc.tag ?? "",
128
+ payload: doc.payload,
129
+ headers: doc.headers ?? {},
130
+ ...(doc.traceId !== undefined && { traceId: doc.traceId }),
131
+ ...(doc.spanId !== undefined && { spanId: doc.spanId }),
132
+ ...(doc.sampled !== undefined && { sampled: doc.sampled })
133
+ };
134
+ return {
135
+ envelope,
136
+ lastSentReply
137
+ };
138
+ }
139
+ case "AckChunk":
140
+ return {
141
+ envelope: {
142
+ _tag: "AckChunk",
143
+ id: doc.rowid,
144
+ requestId: doc.requestId,
145
+ replyId: doc.replyId ?? "",
146
+ address: {
147
+ shardId: shardIdFromString(doc.shardId),
148
+ entityType: doc.entityType,
149
+ entityId: doc.entityId
150
+ }
151
+ },
152
+ lastSentReply: Option.none()
153
+ };
154
+ case "Interrupt":
155
+ return {
156
+ envelope: {
157
+ _tag: "Interrupt",
158
+ id: doc.rowid,
159
+ requestId: doc.requestId,
160
+ address: {
161
+ shardId: shardIdFromString(doc.shardId),
162
+ entityType: doc.entityType,
163
+ entityId: doc.entityId
164
+ }
165
+ },
166
+ lastSentReply: Option.none()
167
+ };
168
+ }
169
+ };
170
+ const replyToDoc = (reply) => reply._tag === "WithExit"
171
+ ? {
172
+ id: cosmosId(reply.id),
173
+ _partitionKey: replyPartition(reply.requestId),
174
+ type: "reply",
175
+ rowid: reply.id,
176
+ kind: "WithExit",
177
+ requestId: reply.requestId,
178
+ payload: reply.exit,
179
+ sequence: null,
180
+ acked: false
181
+ }
182
+ : {
183
+ id: cosmosId(reply.id),
184
+ _partitionKey: replyPartition(reply.requestId),
185
+ type: "reply",
186
+ rowid: reply.id,
187
+ kind: "Chunk",
188
+ requestId: reply.requestId,
189
+ payload: reply.values,
190
+ sequence: reply.sequence,
191
+ acked: false
192
+ };
193
+ const replyFromDoc = (doc) => doc.kind === "WithExit"
194
+ ? {
195
+ _tag: "WithExit",
196
+ id: doc.rowid,
197
+ requestId: doc.requestId,
198
+ exit: doc.payload
199
+ }
200
+ : {
201
+ _tag: "Chunk",
202
+ id: doc.rowid,
203
+ requestId: doc.requestId,
204
+ values: doc.payload,
205
+ sequence: doc.sequence ?? 0
206
+ };
207
+ const shardIdFromString = (shardId) => ShardId.fromStringEncoded(shardId);
208
+ const machineIdCounterDocId = cosmosId("machine-id-counter");
209
+ const createContainer = (prefix, throughput) => Effect.fnUntraced(function* () {
210
+ const { db } = yield* CosmosClient;
211
+ const containerId = `${prefix}cluster`;
212
+ yield* Effect
213
+ .tryPromise(() => createContainerIfNotExists(db, {
214
+ id: containerId,
215
+ partitionKey: { paths: ["/_partitionKey"], version: 2 }
216
+ }, throughput))
217
+ .pipe(Effect.catchIf(isConflict, () => Effect.void));
218
+ return db.container(containerId);
219
+ });
220
+ export const makeMessageStorage = Effect.fnUntraced(function* (options) {
221
+ const prefix = options?.prefix ?? "cluster-";
222
+ const container = yield* createContainer(prefix, options)().pipe(Effect.orDie);
223
+ const containerId = `${prefix}cluster`;
224
+ const annotate = (operation) => annotateDb({ operation, system: "cosmosdb", collection: containerId, entity: "cluster-message-storage" });
225
+ const readMessage = (id, partitionKey) => Effect.tryPromise(() => container.item(id, partitionKey).read()).pipe(Effect.tap(annotateItem), Effect.map((resp) => Option.fromNullishOr(resp.resource)), Effect.catchIf(isNotFound, () => Effect.succeed(Option.none())));
226
+ const queryMessages = (query, parameters) => Effect
227
+ .tryPromise(() => container.items.query({ query, parameters: Array.from(parameters) }).fetchAll())
228
+ .pipe(Effect.tap(annotateFeed), Effect.map((resp) => resp.resources));
229
+ const queryReplies = (query, parameters) => Effect
230
+ .tryPromise(() => container.items.query({ query, parameters: Array.from(parameters) }).fetchAll())
231
+ .pipe(Effect.tap(annotateFeed), Effect.map((resp) => resp.resources));
232
+ const lastReply = (replyId) => replyId === null
233
+ ? Effect.succeed(Option.none())
234
+ : queryReplies("SELECT * FROM c WHERE c.type = 'reply' AND c.rowid = @id", [{ name: "@id", value: replyId }])
235
+ .pipe(Effect.map((docs) => Option.map(Option.fromNullishOr(docs[0]), replyFromDoc)));
236
+ const markReplyAcked = (requestId, replyId) => Effect
237
+ .tryPromise(() => container.item(cosmosId(replyId), replyPartition(requestId)).patch([
238
+ { op: "set", path: "/acked", value: true }
239
+ ]))
240
+ .pipe(Effect.tap(annotateItem), Effect.asVoid, Effect.catchIf(isNotFound, () => Effect.void), Effect.catchIf(isPreconditionFailed, () => Effect.void));
241
+ const claimMessageRead = (doc, now) => Effect
242
+ .tryPromise(() => container.item(doc.id, doc._partitionKey).patch([{ op: "set", path: "/lastRead", value: now }], { accessCondition: { type: "IfMatch", condition: doc._etag ?? "" } }))
243
+ .pipe(Effect.tap(annotateItem), Effect.as(true), Effect.catchIf(isPreconditionFailed, () => Effect.succeed(false)));
244
+ const batchDocs = (docs, operation, fallback) => Effect.forEach(Arr.groupByT(docs, (doc) => doc._partitionKey), ([partitionKey, partitionDocs]) => Effect.forEach(Arr.chunksOf(partitionDocs, maxCosmosBatchOperations), (chunk) => {
245
+ const operations = chunk.map(operation);
246
+ return Effect
247
+ .tryPromise(() => container.items.batch(operations, partitionKey))
248
+ .pipe(Effect.tap(annotateItem), Effect.flatMap((resp) => {
249
+ const failed = resp.result?.find((result) => !isSuccessfulStatus(result.statusCode));
250
+ return failed === undefined ? Effect.void : Effect.fail(failed.statusCode);
251
+ }), Effect.catchIf(() => true, () => Effect.forEach(chunk, fallback, { discard: true })));
252
+ }, { discard: true }), { discard: true });
253
+ const patchDoc = (doc, resourceBody) => Effect.tryPromise(() => container.item(doc.id, doc._partitionKey).patch(resourceBody)).pipe(Effect.tap(annotateItem), Effect.asVoid, Effect.catchIf(isNotFound, () => Effect.void));
254
+ const patchDocs = (docs, resourceBody) => batchDocs(docs, (doc) => ({
255
+ operationType: "Patch",
256
+ id: doc.id,
257
+ resourceBody: resourceBody(doc)
258
+ }), (doc) => patchDoc(doc, resourceBody(doc)));
259
+ const deleteDoc = (doc) => Effect.tryPromise(() => container.item(doc.id, doc._partitionKey).delete()).pipe(Effect.tap(annotateItem), Effect.asVoid, Effect.catchIf(isNotFound, () => Effect.void));
260
+ const deleteDocs = (docs) => batchDocs(docs, (doc) => ({
261
+ operationType: "Delete",
262
+ id: doc.id
263
+ }), deleteDoc);
264
+ return yield* MessageStorage.makeEncoded({
265
+ saveEnvelope: ({ deliverAt, envelope, primaryKey }) => Effect
266
+ .gen(function* () {
267
+ const doc = envelopeToDoc(envelope, primaryKey, deliverAt);
268
+ if (envelope._tag === "AckChunk") {
269
+ yield* markReplyAcked(envelope.requestId, envelope.replyId);
270
+ const pendingAcks = yield* queryMessages("SELECT * FROM c WHERE c.type = 'message' AND c.kind = 'AckChunk' AND c.processed = false AND c.requestId = @requestId", [{ name: "@requestId", value: envelope.requestId }]);
271
+ yield* patchDocs(pendingAcks, () => [{ op: "set", path: "/processed", value: true }]);
272
+ }
273
+ return yield* Effect.tryPromise(() => container.items.create(doc)).pipe(Effect.tap(annotateItem), Effect.as(SaveResultEncoded.Success()), Effect.catchIf(isConflict, () => readMessage(doc.id, doc._partitionKey).pipe(Effect.flatMap((found) => Option.match(found, {
274
+ onNone: () => Effect.succeed(SaveResultEncoded.Success()),
275
+ onSome: (existing) => lastReply(existing.lastReplyId).pipe(Effect.map((lastReceivedReply) => SaveResultEncoded.Duplicate({
276
+ originalId: Snowflake.Snowflake(existing.requestId),
277
+ lastReceivedReply
278
+ })))
279
+ })))));
280
+ })
281
+ .pipe(annotate("saveEnvelope"), refailPersistence, withTracerDisabled),
282
+ saveReply: (reply) => Effect
283
+ .gen(function* () {
284
+ const doc = replyToDoc(reply);
285
+ yield* Effect.tryPromise(() => container.items.create(doc)).pipe(Effect.tap(annotateItem), Effect.catchIf(isConflict, () => Effect.void));
286
+ const messages = yield* queryMessages("SELECT * FROM c WHERE c.type = 'message' AND c.requestId = @requestId", [{ name: "@requestId", value: reply.requestId }]);
287
+ const updatedMessages = reply._tag === "WithExit"
288
+ ? messages
289
+ : messages.filter((message) => message.id === reply.requestId || message.kind === "Request");
290
+ yield* patchDocs(updatedMessages, () => reply._tag === "WithExit"
291
+ ? [
292
+ { op: "set", path: "/processed", value: true },
293
+ { op: "set", path: "/lastReplyId", value: reply.id }
294
+ ]
295
+ : [{ op: "set", path: "/lastReplyId", value: reply.id }]);
296
+ })
297
+ .pipe(annotate("saveReply"), refailPersistence, withTracerDisabled),
298
+ clearReplies: (requestId, options) => Effect
299
+ .gen(function* () {
300
+ const id = String(requestId);
301
+ const messages = yield* queryMessages("SELECT * FROM c WHERE c.type = 'message' AND c.requestId = @requestId", [{ name: "@requestId", value: id }]);
302
+ const request = messages.find((message) => message.kind === "Request");
303
+ if (!request)
304
+ return;
305
+ if (options?.expectedReplyId !== undefined
306
+ && request.lastReplyId !== String(options.expectedReplyId))
307
+ return;
308
+ const replies = yield* queryReplies("SELECT * FROM c WHERE c.type = 'reply' AND c.requestId = @requestId AND c.kind = 'WithExit'", [
309
+ { name: "@requestId", value: id }
310
+ ]);
311
+ yield* deleteDocs(replies);
312
+ yield* deleteDocs(messages.filter((message) => message.kind === "Interrupt"));
313
+ yield* patchDocs(messages.filter((message) => message.kind !== "Interrupt"), () => [
314
+ { op: "set", path: "/processed", value: false },
315
+ { op: "set", path: "/lastReplyId", value: null },
316
+ { op: "set", path: "/lastRead", value: null }
317
+ ]);
318
+ })
319
+ .pipe(annotate("clearReplies"), refailPersistence, withTracerDisabled),
320
+ requestIdForPrimaryKey: (primaryKey) => queryMessages("SELECT * FROM c WHERE c.type = 'message' AND c.messageId = @primaryKey", [
321
+ { name: "@primaryKey", value: primaryKey }
322
+ ])
323
+ .pipe(Effect.map((docs) => Option.map(Option.fromNullishOr(docs[0]?.requestId), Snowflake.Snowflake)), annotate("requestIdForPrimaryKey"), refailPersistence, withTracerDisabled),
324
+ repliesFor: (requestIds) => queryReplies("SELECT * FROM c WHERE c.type = 'reply' AND ARRAY_CONTAINS(@requestIds, c.requestId) AND (c.kind = 'WithExit' OR (c.kind = 'Chunk' AND c.acked = false)) ORDER BY c.rowid", [{ name: "@requestIds", value: Array.from(requestIds) }])
325
+ .pipe(Effect.map(Arr.map(replyFromDoc)), annotate("repliesFor"), refailPersistence, withTracerDisabled),
326
+ repliesForUnfiltered: (requestIds) => queryReplies("SELECT * FROM c WHERE c.type = 'reply' AND ARRAY_CONTAINS(@requestIds, c.requestId) ORDER BY c.rowid", [{ name: "@requestIds", value: Array.from(requestIds) }])
327
+ .pipe(Effect.map(Arr.map(replyFromDoc)), annotate("repliesForUnfiltered"), refailPersistence, withTracerDisabled),
328
+ unprocessedMessages: (shardIds, now, options) => {
329
+ if (options?.addresses !== undefined && options.addresses.length === 0) {
330
+ return Effect.succeed([]);
331
+ }
332
+ const parameters = [
333
+ { name: "@shardIds", value: Array.from(shardIds) },
334
+ { name: "@lastReadBefore", value: now - tenMinutes },
335
+ { name: "@now", value: now }
336
+ ];
337
+ let query = "SELECT * FROM c WHERE c.type = 'message' AND ARRAY_CONTAINS(@shardIds, c.shardId) AND c.processed = false AND (NOT IS_DEFINED(c.lastRead) OR IS_NULL(c.lastRead) OR c.lastRead < @lastReadBefore) AND (NOT IS_DEFINED(c.deliverAt) OR IS_NULL(c.deliverAt) OR c.deliverAt <= @now)";
338
+ if (options?.addresses !== undefined) {
339
+ const match = addressClauses(options.addresses, "a");
340
+ query += ` AND (${match.sql})`;
341
+ parameters.push(...match.parameters);
342
+ }
343
+ query += " ORDER BY c.rowid";
344
+ if (options?.limit !== undefined) {
345
+ query += ` OFFSET 0 LIMIT ${Math.floor(options.limit)}`;
346
+ }
347
+ return queryMessages(query, parameters)
348
+ .pipe(Effect.flatMap((docs) => collectUnprocessed(docs, now, claimMessageRead, queryReplies)), annotate("unprocessedMessages"), refailPersistence, withTracerDisabled);
349
+ },
350
+ unprocessedMessagesById: (messageIds, now) => queryMessages("SELECT * FROM c WHERE c.type = 'message' AND (ARRAY_CONTAINS(@messageIds, c.id) OR ARRAY_CONTAINS(@messageIds, c.requestId)) AND c.processed = false AND (NOT IS_DEFINED(c.deliverAt) OR IS_NULL(c.deliverAt) OR c.deliverAt <= @now) ORDER BY c.rowid", [
351
+ { name: "@messageIds", value: Array.from(messageIds, String) },
352
+ { name: "@now", value: now }
353
+ ])
354
+ .pipe(Effect.flatMap((docs) => collectUnprocessedById(docs, queryReplies)), annotate("unprocessedMessagesById"), refailPersistence, withTracerDisabled),
355
+ resetRequests: (requestIds) => {
356
+ if (requestIds.length === 0)
357
+ return Effect.void;
358
+ return queryMessages("SELECT * FROM c WHERE c.type = 'message' AND c.processed = false AND (ARRAY_CONTAINS(@requestIds, c.id) OR ARRAY_CONTAINS(@requestIds, c.requestId))", [{ name: "@requestIds", value: Array.from(requestIds, String) }])
359
+ .pipe(Effect.flatMap((docs) => patchDocs(docs, () => [{ op: "set", path: "/lastRead", value: null }])), annotate("resetRequests"), refailPersistence, withTracerDisabled);
360
+ },
361
+ resetAddresses: (addresses) => {
362
+ if (addresses.length === 0)
363
+ return Effect.void;
364
+ const match = addressClauses(addresses, "r");
365
+ return queryMessages(`SELECT * FROM c WHERE c.type = 'message' AND c.processed = false AND (${match.sql})`, match.parameters)
366
+ .pipe(Effect.flatMap((docs) => patchDocs(docs, () => [{ op: "set", path: "/lastRead", value: null }])), annotate("resetAddresses"), refailPersistence, withTracerDisabled);
367
+ },
368
+ clearAddress: (address) => queryMessages("SELECT * FROM c WHERE c.type = 'message' AND c.entityType = @entityType AND c.entityId = @entityId", [
369
+ { name: "@entityType", value: address.entityType },
370
+ { name: "@entityId", value: address.entityId }
371
+ ])
372
+ .pipe(Effect.flatMap((messages) => {
373
+ if (!Arr.isArrayNonEmpty(messages))
374
+ return Effect.void;
375
+ const requestIds = Array.from(new Set(messages.map((message) => message.requestId)));
376
+ return queryReplies("SELECT * FROM c WHERE c.type = 'reply' AND ARRAY_CONTAINS(@requestIds, c.requestId)", [{ name: "@requestIds", value: requestIds }])
377
+ .pipe(Effect.flatMap((replies) => deleteDocs(replies)), Effect.andThen(deleteDocs(messages)));
378
+ }), annotate("clearAddress"), refailPersistence, withTracerDisabled),
379
+ resetShards: (shardIds) => queryMessages("SELECT * FROM c WHERE c.type = 'message' AND c.processed = false AND ARRAY_CONTAINS(@shardIds, c.shardId)", [{ name: "@shardIds", value: Array.from(shardIds) }])
380
+ .pipe(Effect.flatMap((docs) => patchDocs(docs, () => [{ op: "set", path: "/lastRead", value: null }])), annotate("resetShards"), refailPersistence, withTracerDisabled),
381
+ withTransaction: (effect) => effect
382
+ });
383
+ });
384
+ const addressClauses = (addresses, prefix) => {
385
+ const parameters = [];
386
+ const clauses = [];
387
+ for (const [i, address] of addresses.entries()) {
388
+ const shard = `@${prefix}s${i}`;
389
+ const entityType = `@${prefix}t${i}`;
390
+ const entityId = `@${prefix}e${i}`;
391
+ clauses.push(`(c.shardId = ${shard} AND c.entityType = ${entityType} AND c.entityId = ${entityId})`);
392
+ parameters.push({ name: shard, value: ShardId.toString(address.shardId) }, { name: entityType, value: address.entityType }, { name: entityId, value: address.entityId });
393
+ }
394
+ return { sql: clauses.join(" OR "), parameters };
395
+ };
396
+ const collectUnprocessed = (docs, now, claimMessageRead, queryReplies) => Effect.gen(function* () {
397
+ const messages = [];
398
+ const activeRequestIds = yield* activeReplyRequestIds(docs, queryReplies);
399
+ const lastReplies = yield* lastRepliesById(docs, activeRequestIds, queryReplies);
400
+ for (const doc of docs) {
401
+ if (activeRequestIds.has(doc.requestId))
402
+ continue;
403
+ const sentReply = Option.fromNullishOr(doc.lastReplyId === null ? undefined : lastReplies.get(doc.lastReplyId));
404
+ const claimed = yield* claimMessageRead(doc, now);
405
+ if (claimed) {
406
+ messages.push(envelopeFromDoc({ ...doc, lastRead: now }, sentReply));
407
+ }
408
+ }
409
+ return messages;
410
+ });
411
+ const collectUnprocessedById = (docs, queryReplies) => Effect.gen(function* () {
412
+ const messages = [];
413
+ const activeRequestIds = yield* activeReplyRequestIds(docs, queryReplies);
414
+ const lastReplies = yield* lastRepliesById(docs, activeRequestIds, queryReplies);
415
+ for (const doc of docs) {
416
+ if (activeRequestIds.has(doc.requestId))
417
+ continue;
418
+ const sentReply = Option.fromNullishOr(doc.lastReplyId === null ? undefined : lastReplies.get(doc.lastReplyId));
419
+ messages.push(envelopeFromDoc(doc, sentReply));
420
+ }
421
+ return messages;
422
+ });
423
+ const activeReplyRequestIds = (docs, queryReplies) => {
424
+ const requestIds = Array.from(new Set(docs.map((doc) => doc.requestId)));
425
+ if (!Arr.isArrayNonEmpty(requestIds))
426
+ return Effect.succeed(new Set());
427
+ return queryReplies("SELECT * FROM c WHERE c.type = 'reply' AND ARRAY_CONTAINS(@requestIds, c.requestId) AND (c.kind = 'WithExit' OR (c.kind = 'Chunk' AND c.acked = false))", [{ name: "@requestIds", value: requestIds }])
428
+ .pipe(Effect.map((replies) => new Set(replies.map((reply) => reply.requestId))));
429
+ };
430
+ const lastRepliesById = (docs, activeRequestIds, queryReplies) => {
431
+ const replyIds = Array.from(new Set(docs
432
+ .flatMap((doc) => activeRequestIds.has(doc.requestId) || doc.lastReplyId === null ? [] : [doc.lastReplyId])));
433
+ if (!Arr.isArrayNonEmpty(replyIds))
434
+ return Effect.succeed(new Map());
435
+ return queryReplies("SELECT * FROM c WHERE c.type = 'reply' AND ARRAY_CONTAINS(@replyIds, c.rowid)", [{ name: "@replyIds", value: replyIds }])
436
+ .pipe(Effect.map((replies) => new Map(replies.map((reply) => [reply.rowid, replyFromDoc(reply)]))));
437
+ };
438
+ export const makeRunnerStorage = Effect.fnUntraced(function* (options) {
439
+ const prefix = options?.prefix ?? "cluster-";
440
+ const container = yield* createContainer(prefix, options)().pipe(Effect.orDie);
441
+ const config = yield* ShardingConfig.ShardingConfig;
442
+ const expires = Duration.toMillis(Duration.fromInputUnsafe(config.shardLockExpiration));
443
+ const containerId = `${prefix}cluster`;
444
+ const annotate = (operation) => annotateDb({ operation, system: "cosmosdb", collection: containerId, entity: "cluster-runner-storage" });
445
+ const queryRunners = (query, parameters) => Effect
446
+ .tryPromise(() => container
447
+ .items
448
+ .query({ query, parameters: Array.from(parameters) }, { partitionKey: "runner" })
449
+ .fetchAll())
450
+ .pipe(Effect.tap(annotateFeed), Effect.map((resp) => resp.resources));
451
+ const deleteRunner = (doc) => Effect
452
+ .tryPromise(() => container.item(doc.id, "runner").delete({
453
+ accessCondition: { type: "IfMatch", condition: doc._etag ?? "" }
454
+ }))
455
+ .pipe(Effect.tap(annotateItem), Effect.asVoid, Effect.catchIf(isNotFound, () => Effect.void), Effect.catchIf(isPreconditionFailed, () => Effect.void));
456
+ const readRunner = (address) => Effect.tryPromise(() => container.item(runnerDocId(address), "runner").read()).pipe(Effect.tap(annotateItem), Effect.map((resp) => Option.fromNullishOr(resp.resource)), Effect.catchIf(isNotFound, () => Effect.succeed(Option.none())));
457
+ // Allocate a unique, monotonically increasing machine id via an atomic
458
+ // server-side `incr` on a single counter doc — mirrors SQL's auto-increment
459
+ // `machine_id` PK. A per-address string hash (the previous approach) could
460
+ // collide mod 1024 across distinct runners, yielding duplicate Snowflake ids.
461
+ // The counter doc is seeded at init below, so it always exists here.
462
+ const allocateMachineId = Effect
463
+ .tryPromise(() => container.item(machineIdCounterDocId, "runner").patch([
464
+ { op: "incr", path: "/value", value: 1 }
465
+ ]))
466
+ .pipe(Effect.tap(annotateItem), Effect.map((resp) => resp.resource.value));
467
+ // Seed the counter once (create-if-missing); a lost create race is fine.
468
+ yield* Effect
469
+ .tryPromise(() => container.items.create({
470
+ id: machineIdCounterDocId,
471
+ _partitionKey: "runner",
472
+ type: "machine-id-counter",
473
+ value: 0
474
+ }))
475
+ .pipe(Effect.catchIf(isConflict, () => Effect.void), Effect.orDie);
476
+ const readLock = (shardId) => Effect.tryPromise(() => container.item(lockDocId(shardId), "lock").read()).pipe(Effect.tap(annotateItem), Effect.map((resp) => Option.fromNullishOr(resp.resource)), Effect.catchIf(isNotFound, () => Effect.succeed(Option.none())));
477
+ const writeLock = (doc) => Effect
478
+ .tryPromise(() => container.item(doc.id, "lock").replace(doc, {
479
+ accessCondition: { type: "IfMatch", condition: doc._etag ?? "" }
480
+ }))
481
+ .pipe(Effect.tap(annotateItem), Effect.as(true), Effect.catchIf(isPreconditionFailed, () => Effect.succeed(false)));
482
+ const deleteLock = (doc) => Effect
483
+ .tryPromise(() => container.item(doc.id, "lock").delete({
484
+ accessCondition: { type: "IfMatch", condition: doc._etag ?? "" }
485
+ }))
486
+ .pipe(Effect.tap(annotateItem), Effect.asVoid, Effect.catchIf(isNotFound, () => Effect.void), Effect.catchIf(isPreconditionFailed, () => Effect.void));
487
+ const createLock = (address, shardId, now) => Effect
488
+ .tryPromise(() => container.items.create({
489
+ id: lockDocId(shardId),
490
+ _partitionKey: "lock",
491
+ type: "lock",
492
+ shardId,
493
+ address,
494
+ acquiredAt: now
495
+ }))
496
+ .pipe(Effect.tap(annotateItem), Effect.as(true), Effect.catchIf(isConflict, () => Effect.succeed(false)));
497
+ const tryAcquire = (address, shardId, now) => readLock(shardId).pipe(Effect.flatMap((lock) => Option.match(lock, {
498
+ onNone: () => createLock(address, shardId, now),
499
+ onSome: (doc) => {
500
+ if (doc.address !== address && now - doc.acquiredAt <= expires) {
501
+ return Effect.succeed(false);
502
+ }
503
+ doc.address = address;
504
+ doc.acquiredAt = now;
505
+ return writeLock(doc);
506
+ }
507
+ })), Effect.map((acquired) => acquired ? Option.some(shardId) : Option.none()));
508
+ return RunnerStorage.makeEncoded({
509
+ getRunners: Effect.sync(() => Date.now()).pipe(Effect.flatMap((now) => queryRunners("SELECT * FROM c WHERE c.type = 'runner' AND c.lastHeartbeat > @expiresAt", [
510
+ { name: "@expiresAt", value: now - expires }
511
+ ])), Effect.map((docs) => docs.map((doc) => [doc.runner, doc.healthy])), annotate("getRunners"), refailPersistence, withTracerDisabled),
512
+ register: (address, runner, healthy) => Effect
513
+ .gen(function* () {
514
+ const now = Date.now();
515
+ // Reuse a previously-allocated machine id for this address (stable per
516
+ // address, like SQL's RETURNING on conflict); allocate a fresh unique
517
+ // one on first registration.
518
+ const existing = yield* readRunner(address);
519
+ const machineId = Option.isSome(existing) && existing.value.machineId !== undefined
520
+ ? existing.value.machineId
521
+ : yield* allocateMachineId;
522
+ yield* Effect
523
+ .tryPromise(() => container.items.upsert({
524
+ id: runnerDocId(address),
525
+ _partitionKey: "runner",
526
+ type: "runner",
527
+ address,
528
+ runner,
529
+ healthy,
530
+ lastHeartbeat: now,
531
+ machineId
532
+ }))
533
+ .pipe(Effect.tap(annotateItem));
534
+ return machineId;
535
+ })
536
+ .pipe(annotate("register"), refailPersistence, withTracerDisabled),
537
+ unregister: (address) => Effect.sync(() => Date.now()).pipe(Effect.flatMap((now) => queryRunners("SELECT * FROM c WHERE c.type = 'runner' AND (c.address = @address OR c.lastHeartbeat < @expiresAt)", [
538
+ { name: "@address", value: address },
539
+ { name: "@expiresAt", value: now - expires }
540
+ ])), Effect.flatMap((docs) => Effect.forEach(docs, deleteRunner, { discard: true })), annotate("unregister"), refailPersistence, withTracerDisabled),
541
+ setRunnerHealth: (address, healthy) => Effect
542
+ .tryPromise(() => container.item(runnerDocId(address), "runner").patch([
543
+ { op: "set", path: "/healthy", value: healthy }
544
+ ]))
545
+ .pipe(Effect.tap(annotateItem), Effect.asVoid, Effect.catchIf(isNotFound, () => Effect.void), annotate("setRunnerHealth"), refailPersistence, withTracerDisabled),
546
+ acquire: (address, shardIds) => Effect.sync(() => Date.now()).pipe(Effect.flatMap((now) => Effect.forEach(shardIds, (shardId) => tryAcquire(address, shardId, now))), Effect.map(Arr.getSomes), annotate("acquire"), refailPersistence, withTracerDisabled),
547
+ refresh: (address, shardIds) => Effect
548
+ .gen(function* () {
549
+ const now = Date.now();
550
+ yield* Effect
551
+ .tryPromise(() => container.item(runnerDocId(address), "runner").patch([
552
+ { op: "set", path: "/lastHeartbeat", value: now }
553
+ ]))
554
+ .pipe(Effect.tap(annotateItem), Effect.asVoid, Effect.catchIf(isNotFound, () => Effect.void));
555
+ const refreshed = yield* Effect.forEach(shardIds, (shardId) => readLock(shardId).pipe(Effect.flatMap((lock) => Option.match(lock, {
556
+ onNone: () => Effect.succeed(Option.none()),
557
+ onSome: (doc) => {
558
+ if (doc.address !== address)
559
+ return Effect.succeed(Option.none());
560
+ doc.acquiredAt = now;
561
+ return writeLock(doc).pipe(Effect.map((ok) => ok ? Option.some(shardId) : Option.none()));
562
+ }
563
+ }))));
564
+ return Arr.getSomes(refreshed);
565
+ })
566
+ .pipe(annotate("refresh"), refailPersistence, withTracerDisabled),
567
+ release: (address, shardId) => readLock(shardId).pipe(Effect.flatMap((lock) => Option.match(lock, {
568
+ onNone: () => Effect.void,
569
+ onSome: (doc) => doc.address === address
570
+ ? deleteLock(doc)
571
+ : Effect.void
572
+ })), annotate("release"), refailPersistence, withTracerDisabled),
573
+ releaseAll: (address) => Effect
574
+ .tryPromise(() => container
575
+ .items
576
+ .query({
577
+ query: "SELECT * FROM c WHERE c.type = 'lock' AND c.address = @address",
578
+ parameters: [{ name: "@address", value: address }]
579
+ }, { partitionKey: "lock" })
580
+ .fetchAll())
581
+ .pipe(Effect.tap(annotateFeed), Effect.flatMap((resp) => Effect.forEach(resp.resources, deleteLock, { discard: true })), annotate("releaseAll"), refailPersistence, withTracerDisabled)
582
+ });
583
+ });
584
+ export const layerMessageStorage = (options) => Layer.effect(MessageStorage.MessageStorage, makeMessageStorage(options)).pipe(Layer.provide(Snowflake.layerGenerator));
585
+ export const layerRunnerStorage = (options) => Layer.effect(RunnerStorage.RunnerStorage, makeRunnerStorage(options));
586
+ export const layerStorage = (options) => Layer.merge(layerMessageStorage(options), layerRunnerStorage(options));
587
+ export const layerCosmos = (config) => layerStorage({ prefix: config.prefix, autoscaleMaxThroughput: config.autoscaleMaxThroughput }).pipe(Layer.provide(CosmosClientLayer(Redacted.value(config.url), config.dbName)));
588
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2x1c3RlckNvc21vcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9DbHVzdGVyQ29zbW9zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxHQUFHLE1BQU0sa0JBQWtCLENBQUE7QUFDdkMsT0FBTyxLQUFLLE1BQU0sTUFBTSxtQkFBbUIsQ0FBQTtBQUMzQyxPQUFPLEtBQUssS0FBSyxNQUFNLGtCQUFrQixDQUFBO0FBQ3pDLE9BQU8sS0FBSyxNQUFNLE1BQU0sbUJBQW1CLENBQUE7QUFDM0MsT0FBTyxLQUFLLEtBQUssTUFBTSxjQUFjLENBQUE7QUFDckMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNkJBQTZCLENBQUE7QUFFOUQsT0FBTyxLQUFLLGNBQWMsTUFBTSwrQkFBK0IsQ0FBQTtBQUMvRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQTtBQUVqRSxPQUFPLEtBQUssYUFBYSxNQUFNLDhCQUE4QixDQUFBO0FBQzdELE9BQU8sS0FBSyxPQUFPLE1BQU0sd0JBQXdCLENBQUE7QUFDakQsT0FBTyxLQUFLLGNBQWMsTUFBTSwrQkFBK0IsQ0FBQTtBQUMvRCxPQUFPLEtBQUssU0FBUyxNQUFNLDBCQUEwQixDQUFBO0FBQ3JELE9BQU8sS0FBSyxRQUFRLE1BQU0saUJBQWlCLENBQUE7QUFDM0MsT0FBTyxLQUFLLFFBQVEsTUFBTSxpQkFBaUIsQ0FBQTtBQUMzQyxPQUFPLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFrQywwQkFBMEIsRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBQ2hJLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxVQUFVLEVBQUUsTUFBTSxXQUFXLENBQUE7QUEyRjlELE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFBO0FBQzFELE1BQU0saUJBQWlCLEdBQUcsQ0FBVSxNQUE4QixFQUFFLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FB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