@effect-app/infra 4.0.0-beta.31 → 4.0.0-beta.310

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 (473) hide show
  1. package/CHANGELOG.md +2361 -0
  2. package/_check.sh +1 -1
  3. package/dist/CUPS.d.ts +29 -10
  4. package/dist/CUPS.d.ts.map +1 -1
  5. package/dist/CUPS.js +35 -14
  6. package/dist/ClusterCosmos.d.ts +64 -0
  7. package/dist/ClusterCosmos.d.ts.map +1 -0
  8. package/dist/ClusterCosmos.js +547 -0
  9. package/dist/ClusterServiceBus.d.ts +67 -0
  10. package/dist/ClusterServiceBus.d.ts.map +1 -0
  11. package/dist/ClusterServiceBus.js +82 -0
  12. package/dist/ContextProvider.d.ts +34 -0
  13. package/dist/ContextProvider.d.ts.map +1 -0
  14. package/dist/ContextProvider.js +40 -0
  15. package/dist/Emailer/Sendgrid.d.ts +110 -146
  16. package/dist/Emailer/Sendgrid.d.ts.map +1 -1
  17. package/dist/Emailer/Sendgrid.js +24 -19
  18. package/dist/Emailer/fake.d.ts +1 -1
  19. package/dist/Emailer/fake.d.ts.map +1 -1
  20. package/dist/Emailer/fake.js +4 -4
  21. package/dist/MainFiberSet.d.ts +12 -8
  22. package/dist/MainFiberSet.d.ts.map +1 -1
  23. package/dist/MainFiberSet.js +23 -7
  24. package/dist/QueueMaker/errors.d.ts +4 -2
  25. package/dist/QueueMaker/errors.d.ts.map +1 -1
  26. package/dist/QueueMaker/errors.js +4 -2
  27. package/dist/{adapters/SQL → SQL}/Model.d.ts +31 -42
  28. package/dist/SQL/Model.d.ts.map +1 -0
  29. package/dist/SQL/Model.js +469 -0
  30. package/dist/SQL.d.ts.map +1 -0
  31. package/dist/{adapters/SQL.js → SQL.js} +1 -1
  32. package/dist/Store/Cosmos/query.d.ts +14 -3
  33. package/dist/Store/Cosmos/query.d.ts.map +1 -1
  34. package/dist/Store/Cosmos/query.js +179 -41
  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 +385 -254
  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 +79 -39
  41. package/dist/Store/Memory.d.ts +5 -9
  42. package/dist/Store/Memory.d.ts.map +1 -1
  43. package/dist/Store/Memory.js +324 -67
  44. package/dist/Store/SQL/Pg.d.ts +4 -0
  45. package/dist/Store/SQL/Pg.d.ts.map +1 -0
  46. package/dist/Store/SQL/Pg.js +253 -0
  47. package/dist/Store/SQL/query.d.ts +49 -0
  48. package/dist/Store/SQL/query.d.ts.map +1 -0
  49. package/dist/Store/SQL/query.js +527 -0
  50. package/dist/Store/SQL.d.ts +21 -0
  51. package/dist/Store/SQL.d.ts.map +1 -0
  52. package/dist/Store/SQL.js +472 -0
  53. package/dist/Store/codeFilter.d.ts +4 -4
  54. package/dist/Store/codeFilter.d.ts.map +1 -1
  55. package/dist/Store/codeFilter.js +6 -4
  56. package/dist/Store/index.d.ts +6 -4
  57. package/dist/Store/index.d.ts.map +1 -1
  58. package/dist/Store/index.js +18 -5
  59. package/dist/Store/utils.d.ts +5 -2
  60. package/dist/Store/utils.d.ts.map +1 -1
  61. package/dist/Store/utils.js +9 -5
  62. package/dist/WorkflowEngineCosmos.d.ts +29 -0
  63. package/dist/WorkflowEngineCosmos.d.ts.map +1 -0
  64. package/dist/WorkflowEngineCosmos.js +542 -0
  65. package/dist/WorkflowEngineSqlite.d.ts +24 -0
  66. package/dist/WorkflowEngineSqlite.d.ts.map +1 -0
  67. package/dist/WorkflowEngineSqlite.js +550 -0
  68. package/dist/arbs.d.ts +1 -1
  69. package/dist/arbs.d.ts.map +1 -1
  70. package/dist/arbs.js +5 -3
  71. package/dist/codec.d.ts.map +1 -0
  72. package/dist/codec.js +5 -0
  73. package/dist/{adapters/cosmos-client.d.ts → cosmos-client.d.ts} +4 -2
  74. package/dist/cosmos-client.d.ts.map +1 -0
  75. package/dist/cosmos-client.js +11 -0
  76. package/dist/errorReporter.d.ts +6 -4
  77. package/dist/errorReporter.d.ts.map +1 -1
  78. package/dist/errorReporter.js +23 -27
  79. package/dist/fileUtil.d.ts +1 -1
  80. package/dist/fileUtil.d.ts.map +1 -1
  81. package/dist/fileUtil.js +2 -2
  82. package/dist/index.d.ts +2 -1
  83. package/dist/index.d.ts.map +1 -1
  84. package/dist/index.js +3 -2
  85. package/dist/internal/RequestContextMiddleware.d.ts +5 -0
  86. package/dist/internal/RequestContextMiddleware.d.ts.map +1 -0
  87. package/dist/internal/RequestContextMiddleware.js +45 -0
  88. package/dist/internal/auth.d.ts +53 -0
  89. package/dist/internal/auth.d.ts.map +1 -0
  90. package/dist/internal/auth.js +180 -0
  91. package/dist/internal/events.d.ts +11 -0
  92. package/dist/internal/events.d.ts.map +1 -0
  93. package/dist/internal/events.js +49 -0
  94. package/dist/internal/health.d.ts.map +1 -0
  95. package/dist/internal/health.js +5 -0
  96. package/dist/{api/layerUtils.d.ts → layerUtils.d.ts} +14 -6
  97. package/dist/layerUtils.d.ts.map +1 -0
  98. package/dist/layerUtils.js +17 -0
  99. package/dist/logger/jsonLogger.d.ts +1 -1
  100. package/dist/logger/jsonLogger.d.ts.map +1 -1
  101. package/dist/logger/jsonLogger.js +5 -3
  102. package/dist/logger/logFmtLogger.d.ts +1 -1
  103. package/dist/logger/logFmtLogger.d.ts.map +1 -1
  104. package/dist/logger/logFmtLogger.js +3 -3
  105. package/dist/logger/shared.d.ts +2 -2
  106. package/dist/logger/shared.d.ts.map +1 -1
  107. package/dist/logger/shared.js +5 -5
  108. package/dist/logger.d.ts.map +1 -1
  109. package/dist/middlewares.d.ts.map +1 -0
  110. package/dist/{api/middlewares.js → middlewares.js} +1 -1
  111. package/dist/{adapters/mongo-client.d.ts → mongo-client.d.ts} +3 -2
  112. package/dist/mongo-client.d.ts.map +1 -0
  113. package/dist/mongo-client.js +15 -0
  114. package/dist/otel.d.ts +75 -0
  115. package/dist/otel.d.ts.map +1 -0
  116. package/dist/otel.js +84 -0
  117. package/dist/rateLimit.d.ts +11 -3
  118. package/dist/rateLimit.d.ts.map +1 -1
  119. package/dist/rateLimit.js +7 -12
  120. package/dist/{adapters/redis-client.d.ts → redis-client.d.ts} +5 -2
  121. package/dist/redis-client.d.ts.map +1 -0
  122. package/dist/redis-client.js +98 -0
  123. package/dist/{api/reportError.d.ts → reportError.d.ts} +1 -1
  124. package/dist/reportError.d.ts.map +1 -0
  125. package/dist/reportError.js +28 -0
  126. package/dist/{api/routing → routing}/middleware/RouterMiddleware.d.ts +4 -3
  127. package/dist/routing/middleware/RouterMiddleware.d.ts.map +1 -0
  128. package/dist/{api/routing → routing}/middleware/RouterMiddleware.js +1 -1
  129. package/dist/routing/middleware/middleware.d.ts +48 -0
  130. package/dist/routing/middleware/middleware.d.ts.map +1 -0
  131. package/dist/routing/middleware/middleware.js +152 -0
  132. package/dist/{api/routing → routing}/middleware.d.ts +0 -1
  133. package/dist/routing/middleware.d.ts.map +1 -0
  134. package/dist/{api/routing → routing}/middleware.js +1 -2
  135. package/dist/routing/schema/jwt.d.ts.map +1 -0
  136. package/dist/routing/schema/jwt.js +13 -0
  137. package/dist/routing/tsort.d.ts.map +1 -0
  138. package/dist/routing/tsort.js +51 -0
  139. package/dist/{api/routing → routing}/utils.d.ts +3 -3
  140. package/dist/routing/utils.d.ts.map +1 -0
  141. package/dist/routing/utils.js +45 -0
  142. package/dist/routing.d.ts +182 -0
  143. package/dist/routing.d.ts.map +1 -0
  144. package/dist/routing.js +256 -0
  145. package/dist/test.d.ts +2 -2
  146. package/dist/test.d.ts.map +1 -1
  147. package/dist/test.js +2 -2
  148. package/dist/util.d.ts.map +1 -0
  149. package/dist/util.js +14 -0
  150. package/docs/cluster-storage.md +26 -0
  151. package/docs/workflow-engine.md +262 -0
  152. package/examples/query.ts +47 -39
  153. package/package.json +38 -352
  154. package/src/CUPS.ts +53 -14
  155. package/src/ClusterCosmos.ts +1118 -0
  156. package/src/ClusterServiceBus.ts +242 -0
  157. package/src/{api/ContextProvider.ts → ContextProvider.ts} +20 -17
  158. package/src/Emailer/Sendgrid.ts +83 -60
  159. package/src/Emailer/fake.ts +4 -4
  160. package/src/MainFiberSet.ts +32 -13
  161. package/src/QueueMaker/errors.ts +3 -1
  162. package/src/{adapters/SQL → SQL}/Model.ts +42 -41
  163. package/src/SQL.ts +1 -0
  164. package/src/Store/Cosmos/query.ts +218 -54
  165. package/src/Store/Cosmos.ts +529 -365
  166. package/src/Store/Disk.ts +112 -70
  167. package/src/Store/Memory.ts +365 -99
  168. package/src/Store/SQL/Pg.ts +389 -0
  169. package/src/Store/SQL/query.ts +603 -0
  170. package/src/Store/SQL.ts +766 -0
  171. package/src/Store/codeFilter.ts +8 -6
  172. package/src/Store/index.ts +25 -10
  173. package/src/Store/utils.ts +32 -25
  174. package/src/WorkflowEngineCosmos.ts +749 -0
  175. package/src/WorkflowEngineSqlite.ts +813 -0
  176. package/src/arbs.ts +5 -3
  177. package/src/{adapters/cosmos-client.ts → cosmos-client.ts} +5 -3
  178. package/src/errorReporter.ts +68 -78
  179. package/src/fileUtil.ts +1 -1
  180. package/src/index.ts +2 -1
  181. package/src/{api/internal → internal}/RequestContextMiddleware.ts +23 -6
  182. package/src/internal/auth.ts +272 -0
  183. package/src/{api/internal → internal}/events.ts +22 -13
  184. package/src/{api/layerUtils.ts → layerUtils.ts} +14 -10
  185. package/src/logger/jsonLogger.ts +5 -3
  186. package/src/logger/logFmtLogger.ts +3 -3
  187. package/src/logger/shared.ts +5 -4
  188. package/src/middlewares.ts +10 -0
  189. package/src/{adapters/mongo-client.ts → mongo-client.ts} +4 -2
  190. package/src/otel.ts +177 -0
  191. package/src/rateLimit.ts +34 -23
  192. package/src/{adapters/redis-client.ts → redis-client.ts} +7 -3
  193. package/src/{api/reportError.ts → reportError.ts} +3 -2
  194. package/src/{api/routing → routing}/middleware/RouterMiddleware.ts +5 -4
  195. package/src/routing/middleware/middleware.ts +196 -0
  196. package/src/routing/middleware.ts +4 -0
  197. package/src/{api/routing → routing}/schema/jwt.ts +2 -1
  198. package/src/{api/routing → routing}/utils.ts +2 -1
  199. package/src/routing.ts +823 -0
  200. package/src/test.ts +4 -4
  201. package/src/vitest.ts +1 -1
  202. package/test/auth.test.ts +101 -0
  203. package/test/cluster-cosmos.test.ts +612 -0
  204. package/test/cluster-servicebus.test.ts +180 -0
  205. package/test/cluster-sqlite.test.ts +205 -0
  206. package/test/contextProvider.test.ts +15 -12
  207. package/test/controller.test.ts +28 -32
  208. package/test/cosmos-query.test.ts +228 -0
  209. package/test/dist/auth.test.d.ts.map +1 -0
  210. package/test/dist/cluster-cosmos.test.d.ts.map +1 -0
  211. package/test/dist/cluster-servicebus.test.d.ts.map +1 -0
  212. package/test/dist/cluster-sqlite.test.d.ts.map +1 -0
  213. package/test/dist/contextProvider.test.d.ts.map +1 -1
  214. package/test/dist/controller.test.d.ts.map +1 -1
  215. package/test/dist/cosmos-query.test.d.ts.map +1 -0
  216. package/test/dist/fixtures.d.ts +29 -11
  217. package/test/dist/fixtures.d.ts.map +1 -1
  218. package/test/dist/fixtures.js +17 -10
  219. package/test/dist/query.test.d.ts.map +1 -1
  220. package/test/dist/rawQuery.test.d.ts.map +1 -1
  221. package/test/dist/repository-ext.test.d.ts.map +1 -0
  222. package/test/dist/requires.test.d.ts.map +1 -1
  223. package/test/dist/router-generator.test.d.ts.map +1 -0
  224. package/test/dist/routing-interruptibility.test.d.ts.map +1 -0
  225. package/test/dist/rpc-context-map-streaming.test.d.ts.map +1 -0
  226. package/test/dist/rpc-e2e-invalidation.test.d.ts.map +1 -0
  227. package/test/dist/rpc-multi-middleware.test.d.ts.map +1 -1
  228. package/test/dist/rpc-stream-fullstack.test.d.ts.map +1 -0
  229. package/test/dist/sql-store.test.d.ts.map +1 -0
  230. package/test/dist/workflow-engine-cosmos.test.d.ts.map +1 -0
  231. package/test/dist/workflow-engine-sqlite.test.d.ts.map +1 -0
  232. package/test/fixtures.ts +16 -9
  233. package/test/layerUtils.test.ts +2 -2
  234. package/test/query.test.ts +1130 -41
  235. package/test/rawQuery.test.ts +340 -22
  236. package/test/repository-ext.test.ts +426 -0
  237. package/test/requires.test.ts +10 -5
  238. package/test/router-generator.test.ts +187 -0
  239. package/test/routing-interruptibility.test.ts +66 -0
  240. package/test/rpc-context-map-streaming.test.ts +262 -0
  241. package/test/rpc-e2e-invalidation.test.ts +418 -0
  242. package/test/rpc-multi-middleware.test.ts +85 -10
  243. package/test/rpc-stream-fullstack.test.ts +304 -0
  244. package/test/sql-store.test.ts +1711 -0
  245. package/test/validateSample.test.ts +26 -14
  246. package/test/workflow-engine-cosmos.test.ts +345 -0
  247. package/test/workflow-engine-sqlite.test.ts +297 -0
  248. package/tsconfig.examples.json +1 -1
  249. package/tsconfig.json +9 -2
  250. package/tsconfig.src.json +35 -35
  251. package/tsconfig.test.json +2 -2
  252. package/dist/Emailer/service.d.ts +0 -55
  253. package/dist/Emailer/service.d.ts.map +0 -1
  254. package/dist/Emailer/service.js +0 -6
  255. package/dist/Emailer.d.ts +0 -2
  256. package/dist/Emailer.d.ts.map +0 -1
  257. package/dist/Emailer.js +0 -2
  258. package/dist/Model/Repository/ext.d.ts +0 -41
  259. package/dist/Model/Repository/ext.d.ts.map +0 -1
  260. package/dist/Model/Repository/ext.js +0 -65
  261. package/dist/Model/Repository/internal/internal.d.ts +0 -59
  262. package/dist/Model/Repository/internal/internal.d.ts.map +0 -1
  263. package/dist/Model/Repository/internal/internal.js +0 -316
  264. package/dist/Model/Repository/legacy.d.ts +0 -19
  265. package/dist/Model/Repository/legacy.d.ts.map +0 -1
  266. package/dist/Model/Repository/legacy.js +0 -2
  267. package/dist/Model/Repository/makeRepo.d.ts +0 -49
  268. package/dist/Model/Repository/makeRepo.d.ts.map +0 -1
  269. package/dist/Model/Repository/makeRepo.js +0 -24
  270. package/dist/Model/Repository/service.d.ts +0 -89
  271. package/dist/Model/Repository/service.d.ts.map +0 -1
  272. package/dist/Model/Repository/service.js +0 -2
  273. package/dist/Model/Repository/validation.d.ts +0 -42
  274. package/dist/Model/Repository/validation.d.ts.map +0 -1
  275. package/dist/Model/Repository/validation.js +0 -32
  276. package/dist/Model/Repository.d.ts +0 -6
  277. package/dist/Model/Repository.d.ts.map +0 -1
  278. package/dist/Model/Repository.js +0 -6
  279. package/dist/Model/dsl.d.ts +0 -32
  280. package/dist/Model/dsl.d.ts.map +0 -1
  281. package/dist/Model/dsl.js +0 -44
  282. package/dist/Model/filter/filterApi.d.ts +0 -30
  283. package/dist/Model/filter/filterApi.d.ts.map +0 -1
  284. package/dist/Model/filter/filterApi.js +0 -2
  285. package/dist/Model/filter/types/errors.d.ts +0 -29
  286. package/dist/Model/filter/types/errors.d.ts.map +0 -1
  287. package/dist/Model/filter/types/errors.js +0 -2
  288. package/dist/Model/filter/types/fields.d.ts +0 -15
  289. package/dist/Model/filter/types/fields.d.ts.map +0 -1
  290. package/dist/Model/filter/types/fields.js +0 -2
  291. package/dist/Model/filter/types/path/common.d.ts +0 -316
  292. package/dist/Model/filter/types/path/common.d.ts.map +0 -1
  293. package/dist/Model/filter/types/path/common.js +0 -2
  294. package/dist/Model/filter/types/path/eager.d.ts +0 -95
  295. package/dist/Model/filter/types/path/eager.d.ts.map +0 -1
  296. package/dist/Model/filter/types/path/eager.js +0 -31
  297. package/dist/Model/filter/types/path/index.d.ts +0 -4
  298. package/dist/Model/filter/types/path/index.d.ts.map +0 -1
  299. package/dist/Model/filter/types/path/index.js +0 -3
  300. package/dist/Model/filter/types/utils.d.ts +0 -79
  301. package/dist/Model/filter/types/utils.d.ts.map +0 -1
  302. package/dist/Model/filter/types/utils.js +0 -2
  303. package/dist/Model/filter/types/validator.d.ts +0 -30
  304. package/dist/Model/filter/types/validator.d.ts.map +0 -1
  305. package/dist/Model/filter/types/validator.js +0 -2
  306. package/dist/Model/filter/types.d.ts +0 -5
  307. package/dist/Model/filter/types.d.ts.map +0 -1
  308. package/dist/Model/filter/types.js +0 -7
  309. package/dist/Model/query/dsl.d.ts +0 -248
  310. package/dist/Model/query/dsl.d.ts.map +0 -1
  311. package/dist/Model/query/dsl.js +0 -104
  312. package/dist/Model/query/new-kid-interpreter.d.ts +0 -28
  313. package/dist/Model/query/new-kid-interpreter.d.ts.map +0 -1
  314. package/dist/Model/query/new-kid-interpreter.js +0 -165
  315. package/dist/Model/query.d.ts +0 -15
  316. package/dist/Model/query.d.ts.map +0 -1
  317. package/dist/Model/query.js +0 -3
  318. package/dist/Model.d.ts +0 -4
  319. package/dist/Model.d.ts.map +0 -1
  320. package/dist/Model.js +0 -4
  321. package/dist/Operations.d.ts +0 -55
  322. package/dist/Operations.d.ts.map +0 -1
  323. package/dist/Operations.js +0 -102
  324. package/dist/OperationsRepo.d.ts +0 -41
  325. package/dist/OperationsRepo.d.ts.map +0 -1
  326. package/dist/OperationsRepo.js +0 -14
  327. package/dist/QueueMaker/SQLQueue.d.ts +0 -16
  328. package/dist/QueueMaker/SQLQueue.d.ts.map +0 -1
  329. package/dist/QueueMaker/SQLQueue.js +0 -130
  330. package/dist/QueueMaker/memQueue.d.ts +0 -11
  331. package/dist/QueueMaker/memQueue.d.ts.map +0 -1
  332. package/dist/QueueMaker/memQueue.js +0 -76
  333. package/dist/QueueMaker/sbqueue.d.ts +0 -12
  334. package/dist/QueueMaker/sbqueue.d.ts.map +0 -1
  335. package/dist/QueueMaker/sbqueue.js +0 -91
  336. package/dist/QueueMaker/service.d.ts +0 -11
  337. package/dist/QueueMaker/service.d.ts.map +0 -1
  338. package/dist/QueueMaker/service.js +0 -4
  339. package/dist/RequestContext.d.ts +0 -63
  340. package/dist/RequestContext.d.ts.map +0 -1
  341. package/dist/RequestContext.js +0 -49
  342. package/dist/RequestFiberSet.d.ts +0 -36
  343. package/dist/RequestFiberSet.d.ts.map +0 -1
  344. package/dist/RequestFiberSet.js +0 -78
  345. package/dist/Store/ContextMapContainer.d.ts +0 -14
  346. package/dist/Store/ContextMapContainer.d.ts.map +0 -1
  347. package/dist/Store/ContextMapContainer.js +0 -16
  348. package/dist/Store/service.d.ts +0 -108
  349. package/dist/Store/service.d.ts.map +0 -1
  350. package/dist/Store/service.js +0 -71
  351. package/dist/Store.d.ts +0 -2
  352. package/dist/Store.d.ts.map +0 -1
  353. package/dist/Store.js +0 -2
  354. package/dist/adapters/SQL/Model.d.ts.map +0 -1
  355. package/dist/adapters/SQL/Model.js +0 -478
  356. package/dist/adapters/SQL.d.ts.map +0 -1
  357. package/dist/adapters/ServiceBus.d.ts +0 -58
  358. package/dist/adapters/ServiceBus.d.ts.map +0 -1
  359. package/dist/adapters/ServiceBus.js +0 -99
  360. package/dist/adapters/cosmos-client.d.ts.map +0 -1
  361. package/dist/adapters/cosmos-client.js +0 -9
  362. package/dist/adapters/index.d.ts +0 -2
  363. package/dist/adapters/index.d.ts.map +0 -1
  364. package/dist/adapters/index.js +0 -2
  365. package/dist/adapters/logger.d.ts +0 -9
  366. package/dist/adapters/logger.d.ts.map +0 -1
  367. package/dist/adapters/logger.js +0 -3
  368. package/dist/adapters/memQueue.d.ts +0 -13
  369. package/dist/adapters/memQueue.d.ts.map +0 -1
  370. package/dist/adapters/memQueue.js +0 -20
  371. package/dist/adapters/mongo-client.d.ts.map +0 -1
  372. package/dist/adapters/mongo-client.js +0 -13
  373. package/dist/adapters/redis-client.d.ts.map +0 -1
  374. package/dist/adapters/redis-client.js +0 -94
  375. package/dist/api/ContextProvider.d.ts +0 -31
  376. package/dist/api/ContextProvider.d.ts.map +0 -1
  377. package/dist/api/ContextProvider.js +0 -38
  378. package/dist/api/codec.d.ts.map +0 -1
  379. package/dist/api/codec.js +0 -5
  380. package/dist/api/internal/RequestContextMiddleware.d.ts +0 -5
  381. package/dist/api/internal/RequestContextMiddleware.d.ts.map +0 -1
  382. package/dist/api/internal/RequestContextMiddleware.js +0 -35
  383. package/dist/api/internal/auth.d.ts +0 -15
  384. package/dist/api/internal/auth.d.ts.map +0 -1
  385. package/dist/api/internal/auth.js +0 -47
  386. package/dist/api/internal/events.d.ts +0 -9
  387. package/dist/api/internal/events.d.ts.map +0 -1
  388. package/dist/api/internal/events.js +0 -42
  389. package/dist/api/internal/health.d.ts.map +0 -1
  390. package/dist/api/internal/health.js +0 -5
  391. package/dist/api/layerUtils.d.ts.map +0 -1
  392. package/dist/api/layerUtils.js +0 -16
  393. package/dist/api/middlewares.d.ts.map +0 -1
  394. package/dist/api/reportError.d.ts.map +0 -1
  395. package/dist/api/reportError.js +0 -27
  396. package/dist/api/routing/middleware/RouterMiddleware.d.ts.map +0 -1
  397. package/dist/api/routing/middleware/middleware.d.ts +0 -9
  398. package/dist/api/routing/middleware/middleware.d.ts.map +0 -1
  399. package/dist/api/routing/middleware/middleware.js +0 -92
  400. package/dist/api/routing/middleware.d.ts.map +0 -1
  401. package/dist/api/routing/schema/jwt.d.ts.map +0 -1
  402. package/dist/api/routing/schema/jwt.js +0 -12
  403. package/dist/api/routing/tsort.d.ts.map +0 -1
  404. package/dist/api/routing/tsort.js +0 -51
  405. package/dist/api/routing/utils.d.ts.map +0 -1
  406. package/dist/api/routing/utils.js +0 -44
  407. package/dist/api/routing.d.ts +0 -138
  408. package/dist/api/routing.d.ts.map +0 -1
  409. package/dist/api/routing.js +0 -166
  410. package/dist/api/setupRequest.d.ts +0 -12
  411. package/dist/api/setupRequest.d.ts.map +0 -1
  412. package/dist/api/setupRequest.js +0 -44
  413. package/dist/api/util.d.ts.map +0 -1
  414. package/dist/api/util.js +0 -14
  415. package/eslint.config.mjs +0 -24
  416. package/src/Emailer/service.ts +0 -52
  417. package/src/Emailer.ts +0 -1
  418. package/src/Model/Repository/ext.ts +0 -283
  419. package/src/Model/Repository/internal/internal.ts +0 -577
  420. package/src/Model/Repository/legacy.ts +0 -27
  421. package/src/Model/Repository/makeRepo.ts +0 -139
  422. package/src/Model/Repository/service.ts +0 -627
  423. package/src/Model/Repository/validation.ts +0 -31
  424. package/src/Model/Repository.ts +0 -5
  425. package/src/Model/dsl.ts +0 -128
  426. package/src/Model/filter/filterApi.ts +0 -60
  427. package/src/Model/filter/types/errors.ts +0 -47
  428. package/src/Model/filter/types/fields.ts +0 -50
  429. package/src/Model/filter/types/path/common.ts +0 -404
  430. package/src/Model/filter/types/path/eager.ts +0 -298
  431. package/src/Model/filter/types/path/index.ts +0 -4
  432. package/src/Model/filter/types/utils.ts +0 -128
  433. package/src/Model/filter/types/validator.ts +0 -46
  434. package/src/Model/filter/types.ts +0 -6
  435. package/src/Model/query/dsl.ts +0 -2110
  436. package/src/Model/query/new-kid-interpreter.ts +0 -210
  437. package/src/Model/query.ts +0 -13
  438. package/src/Model.ts +0 -3
  439. package/src/Operations.ts +0 -235
  440. package/src/OperationsRepo.ts +0 -16
  441. package/src/QueueMaker/SQLQueue.ts +0 -189
  442. package/src/QueueMaker/memQueue.ts +0 -130
  443. package/src/QueueMaker/sbqueue.ts +0 -137
  444. package/src/QueueMaker/service.ts +0 -17
  445. package/src/RequestContext.ts +0 -63
  446. package/src/RequestFiberSet.ts +0 -105
  447. package/src/Store/ContextMapContainer.ts +0 -20
  448. package/src/Store/index.test.ts.bak +0 -112
  449. package/src/Store/service.ts +0 -184
  450. package/src/Store.ts +0 -1
  451. package/src/adapters/SQL.ts +0 -1
  452. package/src/adapters/ServiceBus.ts +0 -209
  453. package/src/adapters/index.ts +0 -0
  454. package/src/adapters/logger.ts +0 -3
  455. package/src/adapters/memQueue.ts +0 -21
  456. package/src/api/internal/auth.ts +0 -68
  457. package/src/api/middlewares.ts +0 -10
  458. package/src/api/routing/middleware/middleware.ts +0 -128
  459. package/src/api/routing/middleware.ts +0 -6
  460. package/src/api/routing.ts +0 -598
  461. package/src/api/setupRequest.ts +0 -84
  462. package/tsconfig.json.bak +0 -12
  463. /package/dist/{adapters/SQL.d.ts → SQL.d.ts} +0 -0
  464. /package/dist/{api/codec.d.ts → codec.d.ts} +0 -0
  465. /package/dist/{api/internal → internal}/health.d.ts +0 -0
  466. /package/dist/{api/middlewares.d.ts → middlewares.d.ts} +0 -0
  467. /package/dist/{api/routing → routing}/schema/jwt.d.ts +0 -0
  468. /package/dist/{api/routing → routing}/tsort.d.ts +0 -0
  469. /package/dist/{api/util.d.ts → util.d.ts} +0 -0
  470. /package/src/{api/codec.ts → codec.ts} +0 -0
  471. /package/src/{api/internal → internal}/health.ts +0 -0
  472. /package/src/{api/routing → routing}/tsort.ts +0 -0
  473. /package/src/{api/util.ts → util.ts} +0 -0
@@ -1,9 +1,14 @@
1
- import { Effect, S } from "effect-app"
1
+ import * as Effect from "effect-app/Effect"
2
+ import * as Layer from "effect-app/Layer"
3
+ import { makeRepo, ValidationError, ValidationResult } from "effect-app/Model/Repository"
4
+ import { RepositoryRegistryLive } from "effect-app/Model/Repository/Registry"
5
+ import * as S from "effect-app/Schema"
6
+ import { setupRequestContextFromCurrent } from "effect-app/setupRequest"
2
7
  import { describe, expect, it } from "vitest"
3
- import { setupRequestContextFromCurrent } from "../src/api/setupRequest.js"
4
- import { makeRepo, ValidationError, ValidationResult } from "../src/Model/Repository.js"
5
8
  import { MemoryStoreLive } from "../src/Store/Memory.js"
6
9
 
10
+ const TestStoreLive = Layer.merge(MemoryStoreLive, RepositoryRegistryLive)
11
+
7
12
  // simple schema for valid items
8
13
  class SimpleItem extends S.Class<SimpleItem>("SimpleItem")({
9
14
  id: S.String,
@@ -25,15 +30,16 @@ describe("validateSample", () => {
25
30
 
26
31
  const result = yield* repo.validateSample({ percentage: 1.0 }) // 100%
27
32
 
28
- expect(result).toBeInstanceOf(ValidationResult)
33
+ expect(S.is(ValidationResult)(result)).toBe(true)
29
34
  expect(result.total).toBe(3)
30
35
  expect(result.sampled).toBe(3)
31
36
  expect(result.valid).toBe(3)
32
37
  expect(result.errors).toHaveLength(0)
33
38
  })
34
39
  .pipe(
35
- Effect.provide(MemoryStoreLive),
40
+ Effect.provide(TestStoreLive),
36
41
  setupRequestContextFromCurrent(),
42
+ Effect.scoped,
37
43
  Effect.runPromise
38
44
  ))
39
45
 
@@ -59,7 +65,7 @@ describe("validateSample", () => {
59
65
 
60
66
  const result = yield* repo.validateSample({ percentage: 1.0 }) // 100%
61
67
 
62
- expect(result).toBeInstanceOf(ValidationResult)
68
+ expect(S.is(ValidationResult)(result)).toBe(true)
63
69
  expect(result.total).toBe(3)
64
70
  expect(result.sampled).toBe(3)
65
71
  expect(result.valid).toBe(1)
@@ -67,7 +73,7 @@ describe("validateSample", () => {
67
73
 
68
74
  // verify error structure
69
75
  for (const error of result.errors) {
70
- expect(error).toBeInstanceOf(ValidationError)
76
+ expect(S.is(ValidationError)(error)).toBe(true)
71
77
  expect(error.id).toBeDefined()
72
78
  expect(error.rawData).toBeDefined()
73
79
  expect(error.jitMResult).toBeDefined()
@@ -80,8 +86,9 @@ describe("validateSample", () => {
80
86
  expect(failingIds).toContain("3")
81
87
  })
82
88
  .pipe(
83
- Effect.provide(MemoryStoreLive),
89
+ Effect.provide(TestStoreLive),
84
90
  setupRequestContextFromCurrent(),
91
+ Effect.scoped,
85
92
  Effect.runPromise
86
93
  ))
87
94
 
@@ -98,8 +105,9 @@ describe("validateSample", () => {
98
105
  expect(result.errors).toHaveLength(0)
99
106
  })
100
107
  .pipe(
101
- Effect.provide(MemoryStoreLive),
108
+ Effect.provide(TestStoreLive),
102
109
  setupRequestContextFromCurrent(),
110
+ Effect.scoped,
103
111
  Effect.runPromise
104
112
  ))
105
113
 
@@ -127,8 +135,9 @@ describe("validateSample", () => {
127
135
  expect(result.errors).toHaveLength(0)
128
136
  })
129
137
  .pipe(
130
- Effect.provide(MemoryStoreLive),
138
+ Effect.provide(TestStoreLive),
131
139
  setupRequestContextFromCurrent(),
140
+ Effect.scoped,
132
141
  Effect.runPromise
133
142
  ))
134
143
 
@@ -138,7 +147,7 @@ describe("validateSample", () => {
138
147
  // schema that expects a 'status' field
139
148
  class ItemWithStatus extends S.Class<ItemWithStatus>("ItemWithStatus")({
140
149
  id: S.String,
141
- status: S.Literal("active", "inactive")
150
+ status: S.Literals(["active", "inactive"])
142
151
  }) {}
143
152
 
144
153
  // jitM that adds default status for items
@@ -161,8 +170,9 @@ describe("validateSample", () => {
161
170
  expect(result.errors).toHaveLength(0)
162
171
  })
163
172
  .pipe(
164
- Effect.provide(MemoryStoreLive),
173
+ Effect.provide(TestStoreLive),
165
174
  setupRequestContextFromCurrent(),
175
+ Effect.scoped,
166
176
  Effect.runPromise
167
177
  ))
168
178
 
@@ -208,8 +218,9 @@ describe("validateSample", () => {
208
218
  expect((error.error as any)._tag).toBe("SchemaError")
209
219
  })
210
220
  .pipe(
211
- Effect.provide(MemoryStoreLive),
221
+ Effect.provide(TestStoreLive),
212
222
  setupRequestContextFromCurrent(),
223
+ Effect.scoped,
213
224
  Effect.runPromise
214
225
  ))
215
226
 
@@ -230,8 +241,9 @@ describe("validateSample", () => {
230
241
  expect(result.errors).toHaveLength(0)
231
242
  })
232
243
  .pipe(
233
- Effect.provide(MemoryStoreLive),
244
+ Effect.provide(TestStoreLive),
234
245
  setupRequestContextFromCurrent(),
246
+ Effect.scoped,
235
247
  Effect.runPromise
236
248
  ))
237
249
  })
@@ -0,0 +1,345 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ /**
3
+ * Workflow engine conformance tests.
4
+ *
5
+ * The `runSuite` body is engine-agnostic: it runs against
6
+ * `WorkflowEngine.layerMemory` (fast, always) and — when `COSMOS_TEST_URL`
7
+ * is set — against the Cosmos adapter (`layerCosmos`) pointed at a Cosmos
8
+ * emulator. Both must satisfy the same observable contract: idempotent
9
+ * execution, activity replay (no double side effects), suspend → durable-
10
+ * deferred completion → resume with a correctly decoded result, interrupt
11
+ * propagation, and first-writer-wins deferred completion.
12
+ *
13
+ * A second describe block (Cosmos emulator only) exercises adapter
14
+ * internals — the recovery poller (driving execs whose lease has lapsed)
15
+ * and the clock poller (firing past-due clocks) — by seeding rows
16
+ * directly against the Cosmos container.
17
+ */
18
+ import { assert, describe, it } from "@effect/vitest"
19
+ import { Context, Duration, Effect, Exit, Layer, Option, Redacted, Schema } from "effect"
20
+ import { Activity, DurableDeferred, Workflow, WorkflowEngine } from "effect/unstable/workflow"
21
+ import { CosmosClient, CosmosClientLayer } from "../src/cosmos-client.js"
22
+ import { layerCosmos } from "../src/WorkflowEngineCosmos.js"
23
+
24
+ // --- Shared mutable counter for activity-side-effect assertions --------
25
+
26
+ class CounterRef extends Context.Service<CounterRef, { count: number }>()("CounterRef") {
27
+ static readonly layer = Layer.effect(CounterRef, Effect.sync(() => ({ count: 0 })))
28
+ }
29
+
30
+ // --- Workflow definitions ----------------------------------------------
31
+
32
+ const IncrementWorkflow = Workflow.make("WorkflowEngineCosmos/IncrementWorkflow", {
33
+ payload: { value: Schema.Number },
34
+ success: Schema.Number,
35
+ idempotencyKey: ({ value }) => String(value)
36
+ })
37
+
38
+ const IncrementHandler = IncrementWorkflow.toLayer(({ value }) => Effect.succeed(value + 1))
39
+
40
+ // Counts activity body invocations across re-executes so the test can
41
+ // prove side-effects don't repeat when a persisted result is available.
42
+ const CounterWorkflow = Workflow.make("WorkflowEngineCosmos/CounterWorkflow", {
43
+ payload: { id: Schema.String },
44
+ success: Schema.Number,
45
+ idempotencyKey: ({ id }) => id
46
+ })
47
+
48
+ const CounterHandler = CounterWorkflow.toLayer(Effect.fn(function*() {
49
+ const counter = yield* CounterRef
50
+ return yield* Activity.make({
51
+ name: "Bump",
52
+ success: Schema.Number,
53
+ execute: Effect.sync(() => {
54
+ counter.count++
55
+ return counter.count
56
+ })
57
+ })
58
+ }))
59
+
60
+ // Suspends on a deferred, then composes the persisted activity result
61
+ // with the resumed deferred value. Exercises Result/Exit round-trip.
62
+ const Trigger = DurableDeferred.make("WorkflowEngineCosmos/Trigger", { success: Schema.String })
63
+
64
+ const SuspendWorkflow = Workflow.make("WorkflowEngineCosmos/SuspendWorkflow", {
65
+ payload: { id: Schema.String },
66
+ success: Schema.String,
67
+ idempotencyKey: ({ id }) => id
68
+ })
69
+
70
+ const SuspendHandler = SuspendWorkflow.toLayer(Effect.fn(function*({ id }) {
71
+ const n = yield* Activity.make({
72
+ name: "step",
73
+ success: Schema.Number,
74
+ execute: Effect.succeed(1)
75
+ })
76
+ const v = yield* DurableDeferred.await(Trigger)
77
+ return `${id}:${n}:${v}`
78
+ }))
79
+
80
+ // Plain durable-deferred await — used to assert first-writer-wins on done().
81
+ const AwaitOnly = Workflow.make("WorkflowEngineCosmos/AwaitOnly", {
82
+ payload: { id: Schema.String },
83
+ success: Schema.String,
84
+ idempotencyKey: ({ id }) => id
85
+ })
86
+
87
+ const AwaitOnlyHandler = AwaitOnly.toLayer(Effect.fn(function*() {
88
+ return yield* DurableDeferred.await(Trigger)
89
+ }))
90
+
91
+ const Handlers = Layer.mergeAll(IncrementHandler, SuspendHandler, CounterHandler, AwaitOnlyHandler)
92
+
93
+ // Helper that polls until the workflow completes (or `maxIterations` elapse).
94
+ const waitForComplete = (
95
+ workflow: { readonly poll: (id: string) => Effect.Effect<Option.Option<Workflow.Result<any, any>>, never, any> },
96
+ executionId: string,
97
+ step = Duration.millis(10),
98
+ maxIterations = 200
99
+ ) =>
100
+ Effect.gen(function*() {
101
+ for (let i = 0; i < maxIterations; i++) {
102
+ const polled = yield* workflow.poll(executionId)
103
+ if (Option.isSome(polled) && polled.value._tag === "Complete") {
104
+ return polled.value
105
+ }
106
+ yield* Effect.sleep(step)
107
+ }
108
+ return undefined
109
+ })
110
+
111
+ const runSuite = (engineLayer: Layer.Layer<WorkflowEngine.WorkflowEngine>) => {
112
+ const TestLayer = Handlers.pipe(
113
+ Layer.provideMerge(CounterRef.layer),
114
+ Layer.provideMerge(engineLayer)
115
+ )
116
+
117
+ it.live("executes a workflow and polls the result", () =>
118
+ Effect
119
+ .gen(function*() {
120
+ const executionId = yield* IncrementWorkflow.execute({ value: 41 }, { discard: true })
121
+ const result = yield* IncrementWorkflow.execute({ value: 41 })
122
+ const polled = yield* IncrementWorkflow.poll(executionId)
123
+
124
+ assert.strictEqual(result, 42)
125
+ assert(
126
+ Option.isSome(polled)
127
+ && polled.value._tag === "Complete"
128
+ && Exit.isSuccess(polled.value.exit)
129
+ )
130
+ assert.strictEqual(polled.value.exit.value, 42)
131
+ })
132
+ .pipe(Effect.provide(TestLayer)))
133
+
134
+ it.live("re-executing the same id is idempotent", () =>
135
+ Effect
136
+ .gen(function*() {
137
+ const a = yield* IncrementWorkflow.execute({ value: 7 })
138
+ const b = yield* IncrementWorkflow.execute({ value: 7 })
139
+ assert.strictEqual(a, b)
140
+ })
141
+ .pipe(Effect.provide(TestLayer)))
142
+
143
+ it.live("activity side effects run once across re-executions", () =>
144
+ Effect
145
+ .gen(function*() {
146
+ const counter = yield* CounterRef
147
+ yield* CounterWorkflow.execute({ id: "once" })
148
+ yield* CounterWorkflow.execute({ id: "once" })
149
+ yield* CounterWorkflow.execute({ id: "once" })
150
+ assert.strictEqual(counter.count, 1)
151
+ })
152
+ .pipe(Effect.provide(TestLayer)))
153
+
154
+ it.live("suspends on a durable deferred, then resumes with the decoded result", () =>
155
+ Effect
156
+ .gen(function*() {
157
+ // The execution suspends on `Trigger`; completing the deferred resumes
158
+ // it (the workflow body replays, the `step` activity is served from its
159
+ // persisted result), and the final value round-trips through the engine.
160
+ const executionId = yield* SuspendWorkflow.execute({ id: "abc" }, { discard: true })
161
+
162
+ const token = yield* DurableDeferred.tokenFromPayload(Trigger, {
163
+ workflow: SuspendWorkflow,
164
+ payload: { id: "abc" }
165
+ })
166
+ yield* DurableDeferred.done(Trigger, { token, exit: Exit.succeed("ok") })
167
+
168
+ const done = yield* waitForComplete(SuspendWorkflow, executionId)
169
+ assert(done && Exit.isSuccess(done.exit))
170
+ assert.strictEqual(done.exit.value, "abc:1:ok")
171
+ })
172
+ .pipe(Effect.provide(TestLayer)))
173
+
174
+ it.live("deferredDone is idempotent (first-writer-wins)", () =>
175
+ Effect
176
+ .gen(function*() {
177
+ const executionId = yield* AwaitOnly.execute({ id: "dup" }, { discard: true })
178
+ const token = yield* DurableDeferred.tokenFromPayload(Trigger, {
179
+ workflow: AwaitOnly,
180
+ payload: { id: "dup" }
181
+ })
182
+ yield* DurableDeferred.done(Trigger, { token, exit: Exit.succeed("first") })
183
+ // Second completion must lose; the workflow body sees "first".
184
+ yield* DurableDeferred.done(Trigger, { token, exit: Exit.succeed("second") })
185
+
186
+ const done = yield* waitForComplete(AwaitOnly, executionId)
187
+ assert(done && Exit.isSuccess(done.exit))
188
+ assert.strictEqual(done.exit.value, "first")
189
+ })
190
+ .pipe(Effect.provide(TestLayer)))
191
+
192
+ it.live("interrupt eventually completes a suspended execution", () =>
193
+ Effect
194
+ .gen(function*() {
195
+ const executionId = yield* AwaitOnly.execute({ id: "int" }, { discard: true })
196
+ // Give the workflow time to suspend on the deferred.
197
+ yield* Effect.sleep(Duration.millis(50))
198
+ yield* AwaitOnly.interrupt(executionId)
199
+
200
+ // Interrupt collapses the suspended execution into a completion. A
201
+ // durable engine re-drives across several storage round-trips, so poll
202
+ // until it reports Complete rather than asserting a fixed delay.
203
+ const done = yield* waitForComplete(AwaitOnly, executionId)
204
+ assert(done !== undefined && done._tag === "Complete")
205
+ })
206
+ .pipe(Effect.provide(TestLayer)))
207
+ }
208
+
209
+ describe("WorkflowEngine (in-memory)", () => {
210
+ runSuite(WorkflowEngine.layerMemory)
211
+ })
212
+
213
+ // --- Cosmos-emulator-only adapter tests --------------------------------
214
+ //
215
+ // Opt-in. Run with e.g.
216
+ // COSMOS_TEST_URL="https://localhost:8081" COSMOS_TEST_DB="workflow-test" \
217
+ // NODE_TLS_REJECT_UNAUTHORIZED=0 pnpm vitest run workflow-engine-cosmos
218
+ const cosmosUrl = process.env["COSMOS_TEST_URL"]
219
+ const cosmosDb = process.env["COSMOS_TEST_DB"] ?? "workflow-test"
220
+
221
+ describe.skipIf(!cosmosUrl)("WorkflowEngine (Cosmos) — conformance", () => {
222
+ runSuite(
223
+ layerCosmos({
224
+ url: Redacted.make(cosmosUrl ?? ""),
225
+ dbName: cosmosDb,
226
+ prefix: `test-${Date.now()}-`,
227
+ // Tight cadences so the suite doesn't wait on the background pollers.
228
+ recoveryInterval: Duration.seconds(2),
229
+ clockPollInterval: Duration.seconds(1)
230
+ })
231
+ )
232
+ })
233
+
234
+ describe.skipIf(!cosmosUrl)("WorkflowEngine (Cosmos) — adapter internals", () => {
235
+ // Each test gets its own container prefix so seeded docs don't leak.
236
+ const prefixFor = (label: string) => `test-${Date.now()}-${label}-`
237
+
238
+ const adapterLayer = (prefix: string) =>
239
+ Layer
240
+ .mergeAll(
241
+ IncrementHandler,
242
+ AwaitOnlyHandler,
243
+ CounterRef.layer,
244
+ CosmosClientLayer(cosmosUrl ?? "", cosmosDb)
245
+ )
246
+ .pipe(
247
+ Layer.provideMerge(
248
+ layerCosmos({
249
+ url: Redacted.make(cosmosUrl ?? ""),
250
+ dbName: cosmosDb,
251
+ prefix,
252
+ recoveryInterval: Duration.millis(500),
253
+ clockPollInterval: Duration.millis(500)
254
+ })
255
+ )
256
+ )
257
+
258
+ it.live("recovery poller drives execs with stale leases", () => {
259
+ const prefix = prefixFor("recovery")
260
+ const containerId = `${prefix}workflow-engine`
261
+ return Effect
262
+ .gen(function*() {
263
+ const { db } = yield* CosmosClient
264
+ const container = db.container(containerId)
265
+ // Pre-seed a running exec whose lease has already expired and whose
266
+ // payload is the schema-encoded form of `{ value: 99 }`.
267
+ yield* Effect.promise(() =>
268
+ container.items.upsert({
269
+ id: "exec",
270
+ _partitionKey: "recover-1",
271
+ type: "exec",
272
+ workflowName: IncrementWorkflow._tag,
273
+ payload: JSON.stringify({ value: 99 }),
274
+ status: "running",
275
+ suspended: false,
276
+ interrupted: false,
277
+ worker: "ghost",
278
+ leaseExpiresAt: new Date(Date.now() - 60_000).toISOString(),
279
+ etag: "seed"
280
+ })
281
+ )
282
+
283
+ // Wait for the recovery poller (500ms cadence) to drive it.
284
+ yield* Effect.sleep(Duration.seconds(2))
285
+
286
+ const polled = yield* IncrementWorkflow.poll("recover-1")
287
+ assert(
288
+ Option.isSome(polled)
289
+ && polled.value._tag === "Complete"
290
+ && Exit.isSuccess(polled.value.exit)
291
+ )
292
+ assert.strictEqual(polled.value.exit.value, 100)
293
+ })
294
+ .pipe(Effect.provide(adapterLayer(prefix)))
295
+ })
296
+
297
+ it.live("clock poller fires past-due clocks", () => {
298
+ const prefix = prefixFor("clocks")
299
+ const containerId = `${prefix}workflow-engine`
300
+ return Effect
301
+ .gen(function*() {
302
+ const { db } = yield* CosmosClient
303
+ const container = db.container(containerId)
304
+ // Seed an exec + a clock that fired in the past. No in-process timer
305
+ // exists (we never called scheduleClock), so only the poller can
306
+ // resolve the deferred.
307
+ yield* Effect.promise(() =>
308
+ container.items.upsert({
309
+ id: "exec",
310
+ _partitionKey: "exec-clock",
311
+ type: "exec",
312
+ workflowName: AwaitOnly._tag,
313
+ payload: JSON.stringify({ id: "wake" }),
314
+ status: "running",
315
+ suspended: false,
316
+ interrupted: false,
317
+ etag: "seed"
318
+ })
319
+ )
320
+ yield* Effect.promise(() =>
321
+ container.items.upsert({
322
+ id: "clock::wake",
323
+ _partitionKey: "exec-clock",
324
+ type: "clock",
325
+ workflowName: AwaitOnly._tag,
326
+ deferredName: Trigger.name,
327
+ fireAt: new Date(Date.now() - 60_000).toISOString()
328
+ })
329
+ )
330
+
331
+ yield* Effect.sleep(Duration.seconds(2))
332
+
333
+ // The clock fire is a deferred-complete; assert the deferred row
334
+ // now exists for this execution.
335
+ const deferred = yield* Effect.promise(() =>
336
+ container.item(encodeURIComponent(`deferred::${Trigger.name}`), "exec-clock").read<{ exit: string }>()
337
+ )
338
+ assert(deferred.resource !== undefined)
339
+ // And the clock doc has been deleted.
340
+ const clockGone = yield* Effect.promise(() => container.item("clock::wake", "exec-clock").read())
341
+ assert.strictEqual(clockGone.statusCode, 404)
342
+ })
343
+ .pipe(Effect.provide(adapterLayer(prefix)))
344
+ })
345
+ })