@proompteng/temporal-bun-sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (448) hide show
  1. package/README.md +387 -0
  2. package/dist/bin/start-worker.js +3 -0
  3. package/dist/bin/temporal-bun.js +3 -0
  4. package/dist/src/activities/index.d.ts +6 -0
  5. package/dist/src/activities/index.d.ts.map +1 -0
  6. package/dist/src/activities/index.js +5 -0
  7. package/dist/src/activities/index.js.map +1 -0
  8. package/dist/src/activities/lifecycle.d.ts +48 -0
  9. package/dist/src/activities/lifecycle.d.ts.map +1 -0
  10. package/dist/src/activities/lifecycle.js +306 -0
  11. package/dist/src/activities/lifecycle.js.map +1 -0
  12. package/dist/src/bin/replay-command.d.ts +104 -0
  13. package/dist/src/bin/replay-command.d.ts.map +1 -0
  14. package/dist/src/bin/replay-command.js +582 -0
  15. package/dist/src/bin/replay-command.js.map +1 -0
  16. package/dist/src/bin/start-worker.d.ts +3 -0
  17. package/dist/src/bin/start-worker.d.ts.map +1 -0
  18. package/dist/src/bin/start-worker.js +29 -0
  19. package/dist/src/bin/start-worker.js.map +1 -0
  20. package/dist/src/bin/temporal-bun.d.ts +25 -0
  21. package/dist/src/bin/temporal-bun.d.ts.map +1 -0
  22. package/dist/src/bin/temporal-bun.js +427 -0
  23. package/dist/src/bin/temporal-bun.js.map +1 -0
  24. package/dist/src/build_id_preflight.d.ts +7 -0
  25. package/dist/src/build_id_preflight.d.ts.map +1 -0
  26. package/dist/src/build_id_preflight.js +123 -0
  27. package/dist/src/build_id_preflight.js.map +1 -0
  28. package/dist/src/client/headers.d.ts +4 -0
  29. package/dist/src/client/headers.d.ts.map +1 -0
  30. package/dist/src/client/headers.js +79 -0
  31. package/dist/src/client/headers.js.map +1 -0
  32. package/dist/src/client/index.d.ts +2 -0
  33. package/dist/src/client/index.d.ts.map +1 -0
  34. package/dist/src/client/index.js +2 -0
  35. package/dist/src/client/index.js.map +1 -0
  36. package/dist/src/client/interceptors.d.ts +17 -0
  37. package/dist/src/client/interceptors.d.ts.map +1 -0
  38. package/dist/src/client/interceptors.js +71 -0
  39. package/dist/src/client/interceptors.js.map +1 -0
  40. package/dist/src/client/layer.d.ts +10 -0
  41. package/dist/src/client/layer.d.ts.map +1 -0
  42. package/dist/src/client/layer.js +7 -0
  43. package/dist/src/client/layer.js.map +1 -0
  44. package/dist/src/client/retries.d.ts +13 -0
  45. package/dist/src/client/retries.d.ts.map +1 -0
  46. package/dist/src/client/retries.js +51 -0
  47. package/dist/src/client/retries.js.map +1 -0
  48. package/dist/src/client/serialization.d.ts +48 -0
  49. package/dist/src/client/serialization.d.ts.map +1 -0
  50. package/dist/src/client/serialization.js +310 -0
  51. package/dist/src/client/serialization.js.map +1 -0
  52. package/dist/src/client/serialization.test.d.ts +2 -0
  53. package/dist/src/client/serialization.test.d.ts.map +1 -0
  54. package/dist/src/client/serialization.test.js +251 -0
  55. package/dist/src/client/serialization.test.js.map +1 -0
  56. package/dist/src/client/transport.d.ts +12 -0
  57. package/dist/src/client/transport.d.ts.map +1 -0
  58. package/dist/src/client/transport.js +36 -0
  59. package/dist/src/client/transport.js.map +1 -0
  60. package/dist/src/client/types.d.ts +51 -0
  61. package/dist/src/client/types.d.ts.map +1 -0
  62. package/dist/src/client/types.js +7 -0
  63. package/dist/src/client/types.js.map +1 -0
  64. package/dist/src/client.d.ts +92 -0
  65. package/dist/src/client.d.ts.map +1 -0
  66. package/dist/src/client.js +666 -0
  67. package/dist/src/client.js.map +1 -0
  68. package/dist/src/common/duration.d.ts +4 -0
  69. package/dist/src/common/duration.d.ts.map +1 -0
  70. package/dist/src/common/duration.js +14 -0
  71. package/dist/src/common/duration.js.map +1 -0
  72. package/dist/src/common/index.d.ts +2 -0
  73. package/dist/src/common/index.d.ts.map +1 -0
  74. package/dist/src/common/index.js +2 -0
  75. package/dist/src/common/index.js.map +1 -0
  76. package/dist/src/common/payloads/converter.d.ts +16 -0
  77. package/dist/src/common/payloads/converter.d.ts.map +1 -0
  78. package/dist/src/common/payloads/converter.js +33 -0
  79. package/dist/src/common/payloads/converter.js.map +1 -0
  80. package/dist/src/common/payloads/failure.d.ts +7 -0
  81. package/dist/src/common/payloads/failure.d.ts.map +1 -0
  82. package/dist/src/common/payloads/failure.js +53 -0
  83. package/dist/src/common/payloads/failure.js.map +1 -0
  84. package/dist/src/common/payloads/index.d.ts +4 -0
  85. package/dist/src/common/payloads/index.d.ts.map +1 -0
  86. package/dist/src/common/payloads/index.js +4 -0
  87. package/dist/src/common/payloads/index.js.map +1 -0
  88. package/dist/src/common/payloads/json-codec.d.ts +16 -0
  89. package/dist/src/common/payloads/json-codec.d.ts.map +1 -0
  90. package/dist/src/common/payloads/json-codec.js +185 -0
  91. package/dist/src/common/payloads/json-codec.js.map +1 -0
  92. package/dist/src/common/sleep.d.ts +2 -0
  93. package/dist/src/common/sleep.d.ts.map +1 -0
  94. package/dist/src/common/sleep.js +3 -0
  95. package/dist/src/common/sleep.js.map +1 -0
  96. package/dist/src/config.d.ts +115 -0
  97. package/dist/src/config.d.ts.map +1 -0
  98. package/dist/src/config.js +505 -0
  99. package/dist/src/config.js.map +1 -0
  100. package/dist/src/core-bridge/client.d.ts +36 -0
  101. package/dist/src/core-bridge/client.d.ts.map +1 -0
  102. package/dist/src/core-bridge/client.js +111 -0
  103. package/dist/src/core-bridge/client.js.map +1 -0
  104. package/dist/src/core-bridge/index.d.ts +4 -0
  105. package/dist/src/core-bridge/index.d.ts.map +1 -0
  106. package/dist/src/core-bridge/index.js +4 -0
  107. package/dist/src/core-bridge/index.js.map +1 -0
  108. package/dist/src/core-bridge/runtime.d.ts +20 -0
  109. package/dist/src/core-bridge/runtime.d.ts.map +1 -0
  110. package/dist/src/core-bridge/runtime.js +62 -0
  111. package/dist/src/core-bridge/runtime.js.map +1 -0
  112. package/dist/src/core-bridge/runtime.test.d.ts +2 -0
  113. package/dist/src/core-bridge/runtime.test.d.ts.map +1 -0
  114. package/dist/src/core-bridge/runtime.test.js +68 -0
  115. package/dist/src/core-bridge/runtime.test.js.map +1 -0
  116. package/dist/src/index.d.ts +11 -0
  117. package/dist/src/index.d.ts.map +1 -0
  118. package/dist/src/index.js +7 -0
  119. package/dist/src/index.js.map +1 -0
  120. package/dist/src/internal/core-bridge/native.d.ts +176 -0
  121. package/dist/src/internal/core-bridge/native.d.ts.map +1 -0
  122. package/dist/src/internal/core-bridge/native.js +1208 -0
  123. package/dist/src/internal/core-bridge/native.js.map +1 -0
  124. package/dist/src/observability/index.d.ts +21 -0
  125. package/dist/src/observability/index.d.ts.map +1 -0
  126. package/dist/src/observability/index.js +19 -0
  127. package/dist/src/observability/index.js.map +1 -0
  128. package/dist/src/observability/logger.d.ts +28 -0
  129. package/dist/src/observability/logger.d.ts.map +1 -0
  130. package/dist/src/observability/logger.js +53 -0
  131. package/dist/src/observability/logger.js.map +1 -0
  132. package/dist/src/observability/metrics.d.ts +28 -0
  133. package/dist/src/observability/metrics.d.ts.map +1 -0
  134. package/dist/src/observability/metrics.js +355 -0
  135. package/dist/src/observability/metrics.js.map +1 -0
  136. package/dist/src/proto/google/api/annotations_pb.d.ts +14 -0
  137. package/dist/src/proto/google/api/annotations_pb.d.ts.map +1 -0
  138. package/dist/src/proto/google/api/annotations_pb.js +27 -0
  139. package/dist/src/proto/google/api/annotations_pb.js.map +1 -0
  140. package/dist/src/proto/google/api/http_pb.d.ts +441 -0
  141. package/dist/src/proto/google/api/http_pb.d.ts.map +1 -0
  142. package/dist/src/proto/google/api/http_pb.js +34 -0
  143. package/dist/src/proto/google/api/http_pb.js.map +1 -0
  144. package/dist/src/proto/temporal/api/activity/v1/message_pb.d.ts +67 -0
  145. package/dist/src/proto/temporal/api/activity/v1/message_pb.d.ts.map +1 -0
  146. package/dist/src/proto/temporal/api/activity/v1/message_pb.js +17 -0
  147. package/dist/src/proto/temporal/api/activity/v1/message_pb.js.map +1 -0
  148. package/dist/src/proto/temporal/api/batch/v1/message_pb.d.ts +464 -0
  149. package/dist/src/proto/temporal/api/batch/v1/message_pb.d.ts.map +1 -0
  150. package/dist/src/proto/temporal/api/batch/v1/message_pb.js +71 -0
  151. package/dist/src/proto/temporal/api/batch/v1/message_pb.js.map +1 -0
  152. package/dist/src/proto/temporal/api/command/v1/message_pb.d.ts +796 -0
  153. package/dist/src/proto/temporal/api/command/v1/message_pb.d.ts.map +1 -0
  154. package/dist/src/proto/temporal/api/command/v1/message_pb.js +106 -0
  155. package/dist/src/proto/temporal/api/command/v1/message_pb.js.map +1 -0
  156. package/dist/src/proto/temporal/api/common/v1/message_pb.d.ts +751 -0
  157. package/dist/src/proto/temporal/api/common/v1/message_pb.d.ts.map +1 -0
  158. package/dist/src/proto/temporal/api/common/v1/message_pb.js +133 -0
  159. package/dist/src/proto/temporal/api/common/v1/message_pb.js.map +1 -0
  160. package/dist/src/proto/temporal/api/deployment/v1/message_pb.d.ts +639 -0
  161. package/dist/src/proto/temporal/api/deployment/v1/message_pb.d.ts.map +1 -0
  162. package/dist/src/proto/temporal/api/deployment/v1/message_pb.js +83 -0
  163. package/dist/src/proto/temporal/api/deployment/v1/message_pb.js.map +1 -0
  164. package/dist/src/proto/temporal/api/enums/v1/batch_operation_pb.d.ts +80 -0
  165. package/dist/src/proto/temporal/api/enums/v1/batch_operation_pb.d.ts.map +1 -0
  166. package/dist/src/proto/temporal/api/enums/v1/batch_operation_pb.js +85 -0
  167. package/dist/src/proto/temporal/api/enums/v1/batch_operation_pb.js.map +1 -0
  168. package/dist/src/proto/temporal/api/enums/v1/command_type_pb.d.ts +89 -0
  169. package/dist/src/proto/temporal/api/enums/v1/command_type_pb.d.ts.map +1 -0
  170. package/dist/src/proto/temporal/api/enums/v1/command_type_pb.js +93 -0
  171. package/dist/src/proto/temporal/api/enums/v1/command_type_pb.js.map +1 -0
  172. package/dist/src/proto/temporal/api/enums/v1/common_pb.d.ts +314 -0
  173. package/dist/src/proto/temporal/api/enums/v1/common_pb.d.ts.map +1 -0
  174. package/dist/src/proto/temporal/api/enums/v1/common_pb.js +326 -0
  175. package/dist/src/proto/temporal/api/enums/v1/common_pb.js.map +1 -0
  176. package/dist/src/proto/temporal/api/enums/v1/deployment_pb.d.ts +186 -0
  177. package/dist/src/proto/temporal/api/enums/v1/deployment_pb.d.ts.map +1 -0
  178. package/dist/src/proto/temporal/api/enums/v1/deployment_pb.js +193 -0
  179. package/dist/src/proto/temporal/api/enums/v1/deployment_pb.js.map +1 -0
  180. package/dist/src/proto/temporal/api/enums/v1/event_type_pb.d.ts +407 -0
  181. package/dist/src/proto/temporal/api/enums/v1/event_type_pb.d.ts.map +1 -0
  182. package/dist/src/proto/temporal/api/enums/v1/event_type_pb.js +411 -0
  183. package/dist/src/proto/temporal/api/enums/v1/event_type_pb.js.map +1 -0
  184. package/dist/src/proto/temporal/api/enums/v1/failed_cause_pb.d.ts +371 -0
  185. package/dist/src/proto/temporal/api/enums/v1/failed_cause_pb.d.ts.map +1 -0
  186. package/dist/src/proto/temporal/api/enums/v1/failed_cause_pb.js +380 -0
  187. package/dist/src/proto/temporal/api/enums/v1/failed_cause_pb.js.map +1 -0
  188. package/dist/src/proto/temporal/api/enums/v1/namespace_pb.d.ts +73 -0
  189. package/dist/src/proto/temporal/api/enums/v1/namespace_pb.d.ts.map +1 -0
  190. package/dist/src/proto/temporal/api/enums/v1/namespace_pb.js +79 -0
  191. package/dist/src/proto/temporal/api/enums/v1/namespace_pb.js.map +1 -0
  192. package/dist/src/proto/temporal/api/enums/v1/nexus_pb.d.ts +35 -0
  193. package/dist/src/proto/temporal/api/enums/v1/nexus_pb.d.ts.map +1 -0
  194. package/dist/src/proto/temporal/api/enums/v1/nexus_pb.js +39 -0
  195. package/dist/src/proto/temporal/api/enums/v1/nexus_pb.js.map +1 -0
  196. package/dist/src/proto/temporal/api/enums/v1/query_pb.d.ts +58 -0
  197. package/dist/src/proto/temporal/api/enums/v1/query_pb.d.ts.map +1 -0
  198. package/dist/src/proto/temporal/api/enums/v1/query_pb.js +63 -0
  199. package/dist/src/proto/temporal/api/enums/v1/query_pb.js.map +1 -0
  200. package/dist/src/proto/temporal/api/enums/v1/reset_pb.d.ts +108 -0
  201. package/dist/src/proto/temporal/api/enums/v1/reset_pb.d.ts.map +1 -0
  202. package/dist/src/proto/temporal/api/enums/v1/reset_pb.js +114 -0
  203. package/dist/src/proto/temporal/api/enums/v1/reset_pb.js.map +1 -0
  204. package/dist/src/proto/temporal/api/enums/v1/schedule_pb.d.ts +67 -0
  205. package/dist/src/proto/temporal/api/enums/v1/schedule_pb.d.ts.map +1 -0
  206. package/dist/src/proto/temporal/api/enums/v1/schedule_pb.js +71 -0
  207. package/dist/src/proto/temporal/api/enums/v1/schedule_pb.js.map +1 -0
  208. package/dist/src/proto/temporal/api/enums/v1/task_queue_pb.d.ts +249 -0
  209. package/dist/src/proto/temporal/api/enums/v1/task_queue_pb.d.ts.map +1 -0
  210. package/dist/src/proto/temporal/api/enums/v1/task_queue_pb.js +259 -0
  211. package/dist/src/proto/temporal/api/enums/v1/task_queue_pb.js.map +1 -0
  212. package/dist/src/proto/temporal/api/enums/v1/update_pb.d.ts +78 -0
  213. package/dist/src/proto/temporal/api/enums/v1/update_pb.d.ts.map +1 -0
  214. package/dist/src/proto/temporal/api/enums/v1/update_pb.js +83 -0
  215. package/dist/src/proto/temporal/api/enums/v1/update_pb.js.map +1 -0
  216. package/dist/src/proto/temporal/api/enums/v1/workflow_pb.d.ts +408 -0
  217. package/dist/src/proto/temporal/api/enums/v1/workflow_pb.d.ts.map +1 -0
  218. package/dist/src/proto/temporal/api/enums/v1/workflow_pb.js +422 -0
  219. package/dist/src/proto/temporal/api/enums/v1/workflow_pb.js.map +1 -0
  220. package/dist/src/proto/temporal/api/errordetails/v1/message_pb.d.ts +331 -0
  221. package/dist/src/proto/temporal/api/errordetails/v1/message_pb.d.ts.map +1 -0
  222. package/dist/src/proto/temporal/api/errordetails/v1/message_pb.js +104 -0
  223. package/dist/src/proto/temporal/api/errordetails/v1/message_pb.js.map +1 -0
  224. package/dist/src/proto/temporal/api/export/v1/message_pb.d.ts +39 -0
  225. package/dist/src/proto/temporal/api/export/v1/message_pb.d.ts.map +1 -0
  226. package/dist/src/proto/temporal/api/export/v1/message_pb.js +20 -0
  227. package/dist/src/proto/temporal/api/export/v1/message_pb.js.map +1 -0
  228. package/dist/src/proto/temporal/api/failure/v1/message_pb.d.ts +381 -0
  229. package/dist/src/proto/temporal/api/failure/v1/message_pb.d.ts.map +1 -0
  230. package/dist/src/proto/temporal/api/failure/v1/message_pb.js +74 -0
  231. package/dist/src/proto/temporal/api/failure/v1/message_pb.js.map +1 -0
  232. package/dist/src/proto/temporal/api/filter/v1/message_pb.d.ts +73 -0
  233. package/dist/src/proto/temporal/api/filter/v1/message_pb.d.ts.map +1 -0
  234. package/dist/src/proto/temporal/api/filter/v1/message_pb.js +31 -0
  235. package/dist/src/proto/temporal/api/filter/v1/message_pb.js.map +1 -0
  236. package/dist/src/proto/temporal/api/history/v1/message_pb.d.ts +3136 -0
  237. package/dist/src/proto/temporal/api/history/v1/message_pb.d.ts.map +1 -0
  238. package/dist/src/proto/temporal/api/history/v1/message_pb.js +317 -0
  239. package/dist/src/proto/temporal/api/history/v1/message_pb.js.map +1 -0
  240. package/dist/src/proto/temporal/api/namespace/v1/message_pb.d.ts +242 -0
  241. package/dist/src/proto/temporal/api/namespace/v1/message_pb.d.ts.map +1 -0
  242. package/dist/src/proto/temporal/api/namespace/v1/message_pb.js +46 -0
  243. package/dist/src/proto/temporal/api/namespace/v1/message_pb.js.map +1 -0
  244. package/dist/src/proto/temporal/api/nexus/v1/message_pb.d.ts +549 -0
  245. package/dist/src/proto/temporal/api/nexus/v1/message_pb.d.ts.map +1 -0
  246. package/dist/src/proto/temporal/api/nexus/v1/message_pb.js +97 -0
  247. package/dist/src/proto/temporal/api/nexus/v1/message_pb.js.map +1 -0
  248. package/dist/src/proto/temporal/api/operatorservice/v1/request_response_pb.d.ts +499 -0
  249. package/dist/src/proto/temporal/api/operatorservice/v1/request_response_pb.d.ts.map +1 -0
  250. package/dist/src/proto/temporal/api/operatorservice/v1/request_response_pb.js +137 -0
  251. package/dist/src/proto/temporal/api/operatorservice/v1/request_response_pb.js.map +1 -0
  252. package/dist/src/proto/temporal/api/operatorservice/v1/service_pb.d.ts +153 -0
  253. package/dist/src/proto/temporal/api/operatorservice/v1/service_pb.d.ts.map +1 -0
  254. package/dist/src/proto/temporal/api/operatorservice/v1/service_pb.js +22 -0
  255. package/dist/src/proto/temporal/api/operatorservice/v1/service_pb.js.map +1 -0
  256. package/dist/src/proto/temporal/api/protocol/v1/message_pb.d.ts +64 -0
  257. package/dist/src/proto/temporal/api/protocol/v1/message_pb.d.ts.map +1 -0
  258. package/dist/src/proto/temporal/api/protocol/v1/message_pb.js +15 -0
  259. package/dist/src/proto/temporal/api/protocol/v1/message_pb.js.map +1 -0
  260. package/dist/src/proto/temporal/api/query/v1/message_pb.d.ts +96 -0
  261. package/dist/src/proto/temporal/api/query/v1/message_pb.d.ts.map +1 -0
  262. package/dist/src/proto/temporal/api/query/v1/message_pb.js +28 -0
  263. package/dist/src/proto/temporal/api/query/v1/message_pb.js.map +1 -0
  264. package/dist/src/proto/temporal/api/replication/v1/message_pb.d.ts +67 -0
  265. package/dist/src/proto/temporal/api/replication/v1/message_pb.d.ts.map +1 -0
  266. package/dist/src/proto/temporal/api/replication/v1/message_pb.js +26 -0
  267. package/dist/src/proto/temporal/api/replication/v1/message_pb.js.map +1 -0
  268. package/dist/src/proto/temporal/api/rules/v1/message_pb.d.ts +172 -0
  269. package/dist/src/proto/temporal/api/rules/v1/message_pb.d.ts.map +1 -0
  270. package/dist/src/proto/temporal/api/rules/v1/message_pb.js +35 -0
  271. package/dist/src/proto/temporal/api/rules/v1/message_pb.js.map +1 -0
  272. package/dist/src/proto/temporal/api/schedule/v1/message_pb.d.ts +779 -0
  273. package/dist/src/proto/temporal/api/schedule/v1/message_pb.d.ts.map +1 -0
  274. package/dist/src/proto/temporal/api/schedule/v1/message_pb.js +95 -0
  275. package/dist/src/proto/temporal/api/schedule/v1/message_pb.js.map +1 -0
  276. package/dist/src/proto/temporal/api/sdk/v1/enhanced_stack_trace_pb.d.ts +157 -0
  277. package/dist/src/proto/temporal/api/sdk/v1/enhanced_stack_trace_pb.d.ts.map +1 -0
  278. package/dist/src/proto/temporal/api/sdk/v1/enhanced_stack_trace_pb.js +34 -0
  279. package/dist/src/proto/temporal/api/sdk/v1/enhanced_stack_trace_pb.js.map +1 -0
  280. package/dist/src/proto/temporal/api/sdk/v1/task_complete_metadata_pb.d.ts +71 -0
  281. package/dist/src/proto/temporal/api/sdk/v1/task_complete_metadata_pb.d.ts.map +1 -0
  282. package/dist/src/proto/temporal/api/sdk/v1/task_complete_metadata_pb.js +14 -0
  283. package/dist/src/proto/temporal/api/sdk/v1/task_complete_metadata_pb.js.map +1 -0
  284. package/dist/src/proto/temporal/api/sdk/v1/user_metadata_pb.d.ts +37 -0
  285. package/dist/src/proto/temporal/api/sdk/v1/user_metadata_pb.d.ts.map +1 -0
  286. package/dist/src/proto/temporal/api/sdk/v1/user_metadata_pb.js +15 -0
  287. package/dist/src/proto/temporal/api/sdk/v1/user_metadata_pb.js.map +1 -0
  288. package/dist/src/proto/temporal/api/sdk/v1/worker_config_pb.d.ts +84 -0
  289. package/dist/src/proto/temporal/api/sdk/v1/worker_config_pb.d.ts.map +1 -0
  290. package/dist/src/proto/temporal/api/sdk/v1/worker_config_pb.js +24 -0
  291. package/dist/src/proto/temporal/api/sdk/v1/worker_config_pb.js.map +1 -0
  292. package/dist/src/proto/temporal/api/sdk/v1/workflow_metadata_pb.d.ts +99 -0
  293. package/dist/src/proto/temporal/api/sdk/v1/workflow_metadata_pb.d.ts.map +1 -0
  294. package/dist/src/proto/temporal/api/sdk/v1/workflow_metadata_pb.js +24 -0
  295. package/dist/src/proto/temporal/api/sdk/v1/workflow_metadata_pb.js.map +1 -0
  296. package/dist/src/proto/temporal/api/taskqueue/v1/message_pb.d.ts +757 -0
  297. package/dist/src/proto/temporal/api/taskqueue/v1/message_pb.d.ts.map +1 -0
  298. package/dist/src/proto/temporal/api/taskqueue/v1/message_pb.js +138 -0
  299. package/dist/src/proto/temporal/api/taskqueue/v1/message_pb.js.map +1 -0
  300. package/dist/src/proto/temporal/api/update/v1/message_pb.d.ts +230 -0
  301. package/dist/src/proto/temporal/api/update/v1/message_pb.d.ts.map +1 -0
  302. package/dist/src/proto/temporal/api/update/v1/message_pb.js +57 -0
  303. package/dist/src/proto/temporal/api/update/v1/message_pb.js.map +1 -0
  304. package/dist/src/proto/temporal/api/version/v1/message_pb.d.ts +85 -0
  305. package/dist/src/proto/temporal/api/version/v1/message_pb.d.ts.map +1 -0
  306. package/dist/src/proto/temporal/api/version/v1/message_pb.js +26 -0
  307. package/dist/src/proto/temporal/api/version/v1/message_pb.js.map +1 -0
  308. package/dist/src/proto/temporal/api/worker/v1/message_pb.d.ts +311 -0
  309. package/dist/src/proto/temporal/api/worker/v1/message_pb.d.ts.map +1 -0
  310. package/dist/src/proto/temporal/api/worker/v1/message_pb.js +42 -0
  311. package/dist/src/proto/temporal/api/worker/v1/message_pb.js.map +1 -0
  312. package/dist/src/proto/temporal/api/workflow/v1/message_pb.d.ts +1500 -0
  313. package/dist/src/proto/temporal/api/workflow/v1/message_pb.d.ts.map +1 -0
  314. package/dist/src/proto/temporal/api/workflow/v1/message_pb.js +183 -0
  315. package/dist/src/proto/temporal/api/workflow/v1/message_pb.js.map +1 -0
  316. package/dist/src/proto/temporal/api/workflowservice/v1/request_response_pb.d.ts +6967 -0
  317. package/dist/src/proto/temporal/api/workflowservice/v1/request_response_pb.d.ts.map +1 -0
  318. package/dist/src/proto/temporal/api/workflowservice/v1/request_response_pb.js +1073 -0
  319. package/dist/src/proto/temporal/api/workflowservice/v1/request_response_pb.js.map +1 -0
  320. package/dist/src/proto/temporal/api/workflowservice/v1/service_pb.d.ts +1305 -0
  321. package/dist/src/proto/temporal/api/workflowservice/v1/service_pb.d.ts.map +1 -0
  322. package/dist/src/proto/temporal/api/workflowservice/v1/service_pb.js +27 -0
  323. package/dist/src/proto/temporal/api/workflowservice/v1/service_pb.js.map +1 -0
  324. package/dist/src/runtime/cli-layer.d.ts +12 -0
  325. package/dist/src/runtime/cli-layer.d.ts.map +1 -0
  326. package/dist/src/runtime/cli-layer.js +19 -0
  327. package/dist/src/runtime/cli-layer.js.map +1 -0
  328. package/dist/src/runtime/config-layer.d.ts +9 -0
  329. package/dist/src/runtime/config-layer.d.ts.map +1 -0
  330. package/dist/src/runtime/config-layer.js +15 -0
  331. package/dist/src/runtime/config-layer.js.map +1 -0
  332. package/dist/src/runtime/effect-layers.d.ts +518 -0
  333. package/dist/src/runtime/effect-layers.d.ts.map +1 -0
  334. package/dist/src/runtime/effect-layers.js +68 -0
  335. package/dist/src/runtime/effect-layers.js.map +1 -0
  336. package/dist/src/runtime/worker-app.d.ts +14 -0
  337. package/dist/src/runtime/worker-app.d.ts.map +1 -0
  338. package/dist/src/runtime/worker-app.js +58 -0
  339. package/dist/src/runtime/worker-app.js.map +1 -0
  340. package/dist/src/telemetry/runtime.d.ts +5 -0
  341. package/dist/src/telemetry/runtime.d.ts.map +1 -0
  342. package/dist/src/telemetry/runtime.js +94 -0
  343. package/dist/src/telemetry/runtime.js.map +1 -0
  344. package/dist/src/worker/activity-context.d.ts +30 -0
  345. package/dist/src/worker/activity-context.d.ts.map +1 -0
  346. package/dist/src/worker/activity-context.js +9 -0
  347. package/dist/src/worker/activity-context.js.map +1 -0
  348. package/dist/src/worker/build-id.d.ts +20 -0
  349. package/dist/src/worker/build-id.d.ts.map +1 -0
  350. package/dist/src/worker/build-id.js +98 -0
  351. package/dist/src/worker/build-id.js.map +1 -0
  352. package/dist/src/worker/concurrency.d.ts +31 -0
  353. package/dist/src/worker/concurrency.d.ts.map +1 -0
  354. package/dist/src/worker/concurrency.js +129 -0
  355. package/dist/src/worker/concurrency.js.map +1 -0
  356. package/dist/src/worker/defaults.d.ts +9 -0
  357. package/dist/src/worker/defaults.d.ts.map +1 -0
  358. package/dist/src/worker/defaults.js +53 -0
  359. package/dist/src/worker/defaults.js.map +1 -0
  360. package/dist/src/worker/index.d.ts +7 -0
  361. package/dist/src/worker/index.d.ts.map +1 -0
  362. package/dist/src/worker/index.js +4 -0
  363. package/dist/src/worker/index.js.map +1 -0
  364. package/dist/src/worker/layer.d.ts +19 -0
  365. package/dist/src/worker/layer.d.ts.map +1 -0
  366. package/dist/src/worker/layer.js +71 -0
  367. package/dist/src/worker/layer.js.map +1 -0
  368. package/dist/src/worker/runtime.d.ts +59 -0
  369. package/dist/src/worker/runtime.d.ts.map +1 -0
  370. package/dist/src/worker/runtime.js +1415 -0
  371. package/dist/src/worker/runtime.js.map +1 -0
  372. package/dist/src/worker/service.d.ts +19 -0
  373. package/dist/src/worker/service.d.ts.map +1 -0
  374. package/dist/src/worker/service.js +14 -0
  375. package/dist/src/worker/service.js.map +1 -0
  376. package/dist/src/worker/sticky-cache.d.ts +41 -0
  377. package/dist/src/worker/sticky-cache.d.ts.map +1 -0
  378. package/dist/src/worker/sticky-cache.js +127 -0
  379. package/dist/src/worker/sticky-cache.js.map +1 -0
  380. package/dist/src/worker.d.ts +30 -0
  381. package/dist/src/worker.d.ts.map +1 -0
  382. package/dist/src/worker.js +82 -0
  383. package/dist/src/worker.js.map +1 -0
  384. package/dist/src/workflow/commands.d.ts +84 -0
  385. package/dist/src/workflow/commands.d.ts.map +1 -0
  386. package/dist/src/workflow/commands.js +159 -0
  387. package/dist/src/workflow/commands.js.map +1 -0
  388. package/dist/src/workflow/context.d.ts +119 -0
  389. package/dist/src/workflow/context.d.ts.map +1 -0
  390. package/dist/src/workflow/context.js +197 -0
  391. package/dist/src/workflow/context.js.map +1 -0
  392. package/dist/src/workflow/definition.d.ts +15 -0
  393. package/dist/src/workflow/definition.d.ts.map +1 -0
  394. package/dist/src/workflow/definition.js +19 -0
  395. package/dist/src/workflow/definition.js.map +1 -0
  396. package/dist/src/workflow/determinism.d.ts +54 -0
  397. package/dist/src/workflow/determinism.d.ts.map +1 -0
  398. package/dist/src/workflow/determinism.js +147 -0
  399. package/dist/src/workflow/determinism.js.map +1 -0
  400. package/dist/src/workflow/errors.d.ts +37 -0
  401. package/dist/src/workflow/errors.d.ts.map +1 -0
  402. package/dist/src/workflow/errors.js +35 -0
  403. package/dist/src/workflow/errors.js.map +1 -0
  404. package/dist/src/workflow/executor.d.ts +35 -0
  405. package/dist/src/workflow/executor.d.ts.map +1 -0
  406. package/dist/src/workflow/executor.js +178 -0
  407. package/dist/src/workflow/executor.js.map +1 -0
  408. package/dist/src/workflow/index.d.ts +8 -0
  409. package/dist/src/workflow/index.d.ts.map +1 -0
  410. package/dist/src/workflow/index.js +8 -0
  411. package/dist/src/workflow/index.js.map +1 -0
  412. package/dist/src/workflow/registry.d.ts +9 -0
  413. package/dist/src/workflow/registry.d.ts.map +1 -0
  414. package/dist/src/workflow/registry.js +51 -0
  415. package/dist/src/workflow/registry.js.map +1 -0
  416. package/dist/src/workflow/replay.d.ts +87 -0
  417. package/dist/src/workflow/replay.d.ts.map +1 -0
  418. package/dist/src/workflow/replay.js +759 -0
  419. package/dist/src/workflow/replay.js.map +1 -0
  420. package/dist/src/workflow/runtime/bootstrap.d.ts +15 -0
  421. package/dist/src/workflow/runtime/bootstrap.d.ts.map +1 -0
  422. package/dist/src/workflow/runtime/bootstrap.js +124 -0
  423. package/dist/src/workflow/runtime/bootstrap.js.map +1 -0
  424. package/dist/src/workflow/runtime/engine.d.ts +21 -0
  425. package/dist/src/workflow/runtime/engine.d.ts.map +1 -0
  426. package/dist/src/workflow/runtime/engine.js +73 -0
  427. package/dist/src/workflow/runtime/engine.js.map +1 -0
  428. package/dist/src/workflow/runtime/environment.d.ts +29 -0
  429. package/dist/src/workflow/runtime/environment.d.ts.map +1 -0
  430. package/dist/src/workflow/runtime/environment.js +298 -0
  431. package/dist/src/workflow/runtime/environment.js.map +1 -0
  432. package/dist/src/workflow/runtime/index.d.ts +7 -0
  433. package/dist/src/workflow/runtime/index.d.ts.map +1 -0
  434. package/dist/src/workflow/runtime/index.js +4 -0
  435. package/dist/src/workflow/runtime/index.js.map +1 -0
  436. package/dist/src/workflow/runtime/info.d.ts +5 -0
  437. package/dist/src/workflow/runtime/info.d.ts.map +1 -0
  438. package/dist/src/workflow/runtime/info.js +22 -0
  439. package/dist/src/workflow/runtime/info.js.map +1 -0
  440. package/dist/src/workflow/runtime/replay.d.ts +26 -0
  441. package/dist/src/workflow/runtime/replay.d.ts.map +1 -0
  442. package/dist/src/workflow/runtime/replay.js +254 -0
  443. package/dist/src/workflow/runtime/replay.js.map +1 -0
  444. package/dist/src/workflows/index.d.ts +3 -0
  445. package/dist/src/workflows/index.d.ts.map +1 -0
  446. package/dist/src/workflows/index.js +15 -0
  447. package/dist/src/workflows/index.js.map +1 -0
  448. package/package.json +74 -0
@@ -0,0 +1,1415 @@
1
+ import { pathToFileURL } from 'node:url';
2
+ import { create } from '@bufbuild/protobuf';
3
+ import { Code, ConnectError, createClient } from '@connectrpc/connect';
4
+ import { createGrpcTransport } from '@connectrpc/connect-node';
5
+ import { Cause, Effect, Exit, Fiber } from 'effect';
6
+ import { makeActivityLifecycle, } from '../activities/lifecycle';
7
+ import { buildTransportOptions, normalizeTemporalAddress } from '../client';
8
+ import { durationFromMillis, durationToMillis } from '../common/duration';
9
+ import { createDefaultDataConverter, decodePayloadsToValues, encodeValuesToPayloads, } from '../common/payloads/converter';
10
+ import { encodeErrorToFailure, encodeFailurePayloads, failureToError } from '../common/payloads/failure';
11
+ import { sleep } from '../common/sleep';
12
+ import { loadTemporalConfig } from '../config';
13
+ import { createObservabilityServices } from '../observability';
14
+ import { CommandSchema, RecordMarkerCommandAttributesSchema, } from '../proto/temporal/api/command/v1/message_pb';
15
+ import { PayloadsSchema, WorkflowExecutionSchema, } from '../proto/temporal/api/common/v1/message_pb';
16
+ import { WorkerDeploymentOptionsSchema, } from '../proto/temporal/api/deployment/v1/message_pb';
17
+ import { CommandType } from '../proto/temporal/api/enums/v1/command_type_pb';
18
+ import { WorkerVersioningMode } from '../proto/temporal/api/enums/v1/deployment_pb';
19
+ import { EventType } from '../proto/temporal/api/enums/v1/event_type_pb';
20
+ import { WorkflowTaskFailedCause } from '../proto/temporal/api/enums/v1/failed_cause_pb';
21
+ import { HistoryEventFilterType, TimeoutType, VersioningBehavior } from '../proto/temporal/api/enums/v1/workflow_pb';
22
+ import { StickyExecutionAttributesSchema, TaskQueueSchema, } from '../proto/temporal/api/taskqueue/v1/message_pb';
23
+ import { GetWorkflowExecutionHistoryRequestSchema, PollActivityTaskQueueRequestSchema, PollWorkflowTaskQueueRequestSchema, RespondActivityTaskCanceledRequestSchema, RespondActivityTaskCompletedRequestSchema, RespondActivityTaskFailedRequestSchema, RespondWorkflowTaskCompletedRequestSchema, RespondWorkflowTaskFailedRequestSchema, } from '../proto/temporal/api/workflowservice/v1/request_response_pb';
24
+ import { WorkflowService } from '../proto/temporal/api/workflowservice/v1/service_pb';
25
+ import { WorkflowNondeterminismError } from '../workflow/errors';
26
+ import { WorkflowExecutor } from '../workflow/executor';
27
+ import { WorkflowRegistry } from '../workflow/registry';
28
+ import { DETERMINISM_MARKER_NAME, diffDeterminismState, encodeDeterminismMarkerDetails, ingestWorkflowHistory, resolveHistoryLastEventId, } from '../workflow/replay';
29
+ import { runWithActivityContext } from './activity-context';
30
+ import { checkWorkerVersioningCapability, registerWorkerBuildIdCompatibility } from './build-id';
31
+ import { makeWorkerScheduler, } from './concurrency';
32
+ import { makeStickyCache, } from './sticky-cache';
33
+ const POLL_TIMEOUT_MS = 60_000;
34
+ const RESPOND_TIMEOUT_MS = 15_000;
35
+ const HISTORY_FETCH_TIMEOUT_MS = 60_000;
36
+ const HEARTBEAT_RETRY_INITIAL_DELAY_MS = 250;
37
+ const HEARTBEAT_RETRY_MAX_DELAY_MS = 5_000;
38
+ const HEARTBEAT_RETRY_MAX_ATTEMPTS = 5;
39
+ const HEARTBEAT_RETRY_BACKOFF = 2;
40
+ const HEARTBEAT_RETRY_JITTER = 0.2;
41
+ const STICKY_QUEUE_PREFIX = 'sticky';
42
+ const COMPLETION_COMMAND_TYPES = new Set([
43
+ CommandType.COMPLETE_WORKFLOW_EXECUTION,
44
+ CommandType.FAIL_WORKFLOW_EXECUTION,
45
+ CommandType.CONTINUE_AS_NEW_WORKFLOW_EXECUTION,
46
+ ]);
47
+ export class WorkerRuntime {
48
+ static async create(options = {}) {
49
+ const config = options.config ?? (await loadTemporalConfig());
50
+ const dataConverter = options.dataConverter ?? createDefaultDataConverter();
51
+ const namespace = options.namespace ?? config.namespace;
52
+ if (!namespace) {
53
+ throw new Error('Temporal namespace must be provided');
54
+ }
55
+ const taskQueue = options.taskQueue ?? config.taskQueue;
56
+ if (!taskQueue) {
57
+ throw new Error('Temporal task queue must be provided');
58
+ }
59
+ const identity = options.identity ?? config.workerIdentity;
60
+ const workflows = await loadWorkflows(options.workflowsPath, options.workflows);
61
+ if (workflows.length === 0) {
62
+ throw new Error('No workflow definitions were registered; provide workflows or workflowsPath');
63
+ }
64
+ const registry = new WorkflowRegistry();
65
+ registry.registerMany(workflows);
66
+ const executor = new WorkflowExecutor({
67
+ registry,
68
+ dataConverter,
69
+ });
70
+ const activities = options.activities ?? {};
71
+ const observability = await Effect.runPromise(createObservabilityServices({
72
+ logLevel: config.logLevel,
73
+ logFormat: config.logFormat,
74
+ metrics: config.metricsExporter,
75
+ }, {
76
+ logger: options.logger,
77
+ metricsRegistry: options.metrics,
78
+ metricsExporter: options.metricsExporter,
79
+ }));
80
+ const { logger, metricsRegistry, metricsExporter } = observability;
81
+ const runtimeMetrics = await WorkerRuntime.#initMetrics(metricsRegistry);
82
+ let workflowService;
83
+ if (options.workflowService) {
84
+ workflowService = options.workflowService;
85
+ }
86
+ else {
87
+ const shouldUseTls = Boolean(config.tls || config.allowInsecureTls);
88
+ const baseUrl = normalizeTemporalAddress(config.address, shouldUseTls);
89
+ const transport = createGrpcTransport(buildTransportOptions(baseUrl, config));
90
+ workflowService = createClient(WorkflowService, transport);
91
+ }
92
+ const workflowConcurrency = options.concurrency?.workflow ?? config.workerWorkflowConcurrency;
93
+ const defaultActivityConcurrency = options.concurrency?.activity ?? config.workerActivityConcurrency;
94
+ const activityConcurrency = defaultActivityConcurrency > 0 ? defaultActivityConcurrency : 1;
95
+ const workflowPollerCount = options.pollers?.workflow ?? Math.max(1, workflowConcurrency);
96
+ const scheduler = await Effect.runPromise(makeWorkerScheduler({
97
+ workflowConcurrency,
98
+ activityConcurrency,
99
+ hooks: options.schedulerHooks,
100
+ logger,
101
+ }));
102
+ const stickyCacheCandidate = options.stickyCache;
103
+ const hasStickyCacheInstance = WorkerRuntime.#isStickyCacheInstance(stickyCacheCandidate);
104
+ const stickyCacheOptions = hasStickyCacheInstance ? undefined : stickyCacheCandidate;
105
+ const stickyCacheSize = stickyCacheOptions?.size ?? config.workerStickyCacheSize;
106
+ const stickyCacheTtlMs = stickyCacheOptions?.ttlMs ?? config.workerStickyTtlMs;
107
+ const stickyCacheHooks = {
108
+ onEvict: (entry, reason) => logger.log('debug', 'sticky cache eviction', {
109
+ namespace: entry.key.namespace,
110
+ taskQueue,
111
+ workflowId: entry.key.workflowId,
112
+ runId: entry.key.runId,
113
+ workflowType: entry.workflowType,
114
+ reason,
115
+ }),
116
+ };
117
+ const stickyCache = hasStickyCacheInstance
118
+ ? stickyCacheCandidate
119
+ : await Effect.runPromise(makeStickyCache({
120
+ maxEntries: stickyCacheSize,
121
+ ttlMs: stickyCacheTtlMs,
122
+ metrics: {
123
+ hits: runtimeMetrics.stickyCacheHit,
124
+ misses: runtimeMetrics.stickyCacheMiss,
125
+ evictions: runtimeMetrics.stickyCacheEviction,
126
+ },
127
+ hooks: stickyCacheHooks,
128
+ }));
129
+ const stickyQueue = WorkerRuntime.#buildStickyQueueName(taskQueue, identity);
130
+ const stickyScheduleToStartTimeoutMs = stickyCacheTtlMs;
131
+ const stickySchedulingEnabled = options.stickyScheduling ??
132
+ (config.stickySchedulingEnabled &&
133
+ (hasStickyCacheInstance ? config.workerStickyCacheSize > 0 : stickyCacheSize > 0));
134
+ const deploymentName = options.deployment?.name ?? config.workerDeploymentName ?? WorkerRuntime.#defaultDeploymentName(taskQueue);
135
+ const buildId = options.deployment?.buildId ?? config.workerBuildId ?? identity;
136
+ const workerVersioningMode = options.deployment?.versioningMode ?? WorkerVersioningMode.UNVERSIONED;
137
+ const versioningBehavior = workerVersioningMode === WorkerVersioningMode.VERSIONED
138
+ ? (options.deployment?.versioningBehavior ?? VersioningBehavior.PINNED)
139
+ : null;
140
+ const deploymentOptions = create(WorkerDeploymentOptionsSchema, {
141
+ deploymentName,
142
+ buildId,
143
+ workerVersioningMode,
144
+ });
145
+ if (workerVersioningMode === WorkerVersioningMode.VERSIONED) {
146
+ const capability = await checkWorkerVersioningCapability(workflowService, namespace, taskQueue);
147
+ if (capability.supported) {
148
+ await registerWorkerBuildIdCompatibility(workflowService, namespace, taskQueue, buildId, { logger });
149
+ }
150
+ else {
151
+ await Effect.runPromise(logger.log('warn', 'skipping worker build ID registration', {
152
+ namespace,
153
+ taskQueue,
154
+ reason: capability.reason ?? 'unknown capability error',
155
+ note: 'Temporal CLI dev server (scripts/start-temporal-cli.ts) does not implement worker versioning yet',
156
+ }));
157
+ }
158
+ }
159
+ const activityLifecycle = await Effect.runPromise(makeActivityLifecycle({
160
+ heartbeatIntervalMs: config.activityHeartbeatIntervalMs,
161
+ heartbeatRpcTimeoutMs: config.activityHeartbeatRpcTimeoutMs,
162
+ heartbeatRetry: {
163
+ initialIntervalMs: HEARTBEAT_RETRY_INITIAL_DELAY_MS,
164
+ maxIntervalMs: HEARTBEAT_RETRY_MAX_DELAY_MS,
165
+ backoffCoefficient: HEARTBEAT_RETRY_BACKOFF,
166
+ maxAttempts: HEARTBEAT_RETRY_MAX_ATTEMPTS,
167
+ jitterRatio: HEARTBEAT_RETRY_JITTER,
168
+ },
169
+ observability: {
170
+ logger,
171
+ heartbeatRetryCounter: runtimeMetrics.heartbeatRetries,
172
+ heartbeatFailureCounter: runtimeMetrics.heartbeatFailures,
173
+ },
174
+ }));
175
+ await Effect.runPromise(logger.log('info', 'temporal worker runtime configured', {
176
+ namespace,
177
+ taskQueue,
178
+ identity,
179
+ workflowConcurrency,
180
+ activityConcurrency,
181
+ stickySchedulingEnabled,
182
+ deploymentName,
183
+ buildId,
184
+ logLevel: config.logLevel,
185
+ logFormat: config.logFormat,
186
+ metricsExporter: config.metricsExporter.type,
187
+ }));
188
+ return new WorkerRuntime({
189
+ config,
190
+ workflowService,
191
+ dataConverter,
192
+ registry,
193
+ executor,
194
+ activities,
195
+ logger,
196
+ metricsRegistry,
197
+ metricsExporter,
198
+ metrics: runtimeMetrics,
199
+ namespace,
200
+ taskQueue,
201
+ identity,
202
+ activityLifecycle,
203
+ scheduler,
204
+ stickyCache,
205
+ stickyQueue,
206
+ stickyScheduleToStartTimeoutMs,
207
+ deploymentOptions,
208
+ versioningBehavior,
209
+ stickySchedulingEnabled,
210
+ workflowPollerCount,
211
+ });
212
+ }
213
+ #config;
214
+ #workflowService;
215
+ #dataConverter;
216
+ #registry;
217
+ #executor;
218
+ #activities;
219
+ #logger;
220
+ #metricsRegistry;
221
+ #metrics;
222
+ #metricsExporter;
223
+ #namespace;
224
+ #taskQueue;
225
+ #identity;
226
+ #activityLifecycle;
227
+ #scheduler;
228
+ #stickyCache;
229
+ #stickyQueue;
230
+ #stickySchedulingEnabled;
231
+ #stickyAttributes;
232
+ #deploymentOptions;
233
+ #versioningBehavior;
234
+ #workflowPollerCount;
235
+ #running = false;
236
+ #runFiber = null;
237
+ #schedulerStarted = false;
238
+ #schedulerStopPromise = null;
239
+ constructor(params) {
240
+ this.#config = params.config;
241
+ this.#workflowService = params.workflowService;
242
+ this.#dataConverter = params.dataConverter;
243
+ this.#registry = params.registry;
244
+ this.#executor = params.executor;
245
+ this.#activities = params.activities;
246
+ this.#logger = params.logger;
247
+ this.#metricsRegistry = params.metricsRegistry;
248
+ this.#metrics = params.metrics;
249
+ this.#metricsExporter = params.metricsExporter;
250
+ this.#namespace = params.namespace;
251
+ this.#taskQueue = params.taskQueue;
252
+ this.#identity = params.identity;
253
+ this.#activityLifecycle = params.activityLifecycle;
254
+ this.#scheduler = params.scheduler;
255
+ this.#stickyCache = params.stickyCache;
256
+ this.#stickyQueue = params.stickyQueue;
257
+ this.#stickySchedulingEnabled = params.stickySchedulingEnabled;
258
+ this.#deploymentOptions = params.deploymentOptions;
259
+ this.#versioningBehavior = params.versioningBehavior;
260
+ this.#workflowPollerCount = params.workflowPollerCount;
261
+ this.#stickyAttributes = create(StickyExecutionAttributesSchema, {
262
+ workerTaskQueue: create(TaskQueueSchema, { name: this.#stickyQueue }),
263
+ scheduleToStartTimeout: durationFromMillis(params.stickyScheduleToStartTimeoutMs),
264
+ });
265
+ }
266
+ #isValidDeterminismSnapshot(state) {
267
+ if (!state) {
268
+ return false;
269
+ }
270
+ return state.commandHistory.length > 0 || state.randomValues.length > 0 || state.timeValues.length > 0;
271
+ }
272
+ #resolvePreviousHistoryEventId(response) {
273
+ const previous = response.previousStartedEventId;
274
+ if (previous === undefined || previous === null) {
275
+ return null;
276
+ }
277
+ if (typeof previous === 'bigint') {
278
+ return previous > 0n ? previous.toString() : null;
279
+ }
280
+ const numeric = Number(previous);
281
+ return Number.isFinite(numeric) && numeric > 0 ? numeric.toString() : null;
282
+ }
283
+ #resolveCurrentStartedEventId(response) {
284
+ const started = response.startedEventId;
285
+ if (started === undefined || started === null) {
286
+ return null;
287
+ }
288
+ if (typeof started === 'bigint') {
289
+ return started > 0n ? started.toString() : null;
290
+ }
291
+ const numeric = Number(started);
292
+ return Number.isFinite(numeric) && numeric > 0 ? numeric.toString() : null;
293
+ }
294
+ static #sanitizeTaskQueueComponent(value) {
295
+ return value.replace(/[^a-zA-Z0-9_-]/g, '-');
296
+ }
297
+ static #buildStickyQueueName(taskQueue, identity) {
298
+ const queueComponent = WorkerRuntime.#sanitizeTaskQueueComponent(taskQueue);
299
+ const identityComponent = WorkerRuntime.#sanitizeTaskQueueComponent(identity) || 'worker';
300
+ return `${queueComponent}-${STICKY_QUEUE_PREFIX}-${identityComponent}`;
301
+ }
302
+ static #defaultDeploymentName(taskQueue) {
303
+ const component = WorkerRuntime.#sanitizeTaskQueueComponent(taskQueue) || 'default';
304
+ return `${component}-deployment`;
305
+ }
306
+ static async #initMetrics(registry) {
307
+ const makeCounter = (name, description) => Effect.runPromise(registry.counter(name, description));
308
+ const makeHistogram = (name, description) => Effect.runPromise(registry.histogram(name, description));
309
+ return {
310
+ stickyCacheHit: await makeCounter('temporal_worker_sticky_cache_hits_total', 'Sticky cache reuse events'),
311
+ stickyCacheMiss: await makeCounter('temporal_worker_sticky_cache_misses_total', 'Sticky cache rebuild events'),
312
+ stickyCacheEviction: await makeCounter('temporal_worker_sticky_cache_evictions_total', 'Sticky cache evictions due to TTL/LRU'),
313
+ stickyCacheHeal: await makeCounter('temporal_worker_sticky_cache_heal_total', 'Sticky cache entries removed after determinism divergence'),
314
+ nondeterminism: await makeCounter('temporal_worker_nondeterminism_total', 'Workflow tasks failed because of nondeterminism mismatches'),
315
+ workflowPollLatency: await makeHistogram('temporal_worker_poll_latency_ms', 'Workflow task poll latency'),
316
+ activityPollLatency: await makeHistogram('temporal_worker_activity_poll_latency_ms', 'Activity task poll latency'),
317
+ workflowPollErrors: await makeCounter('temporal_worker_poll_errors_total', 'Workflow polling errors'),
318
+ activityPollErrors: await makeCounter('temporal_worker_activity_poll_errors_total', 'Activity polling errors'),
319
+ heartbeatRetries: await makeCounter('temporal_worker_heartbeat_retries_total', 'Activity heartbeat retries'),
320
+ heartbeatFailures: await makeCounter('temporal_worker_heartbeat_failures_total', 'Activity heartbeat failures'),
321
+ activityFailures: await makeCounter('temporal_worker_activity_failures_total', 'Activity failures delivered to Temporal'),
322
+ workflowFailures: await makeCounter('temporal_worker_workflow_failures_total', 'Workflow failure responses sent to Temporal'),
323
+ };
324
+ }
325
+ async run() {
326
+ if (this.#runFiber) {
327
+ await this.#awaitRuntimeFiber(this.#runFiber);
328
+ return;
329
+ }
330
+ this.#running = true;
331
+ const runtimeFiber = Effect.runFork(this.#buildRuntimeEffect());
332
+ this.#runFiber = runtimeFiber;
333
+ try {
334
+ await this.#awaitRuntimeFiber(runtimeFiber);
335
+ }
336
+ finally {
337
+ this.#runFiber = null;
338
+ this.#running = false;
339
+ }
340
+ }
341
+ async shutdown() {
342
+ this.#log('info', 'temporal worker shutdown requested', this.#runtimeLogFields({ running: this.#running }));
343
+ const runtimeFiber = this.#runFiber;
344
+ if (!runtimeFiber) {
345
+ await this.#stopScheduler();
346
+ await this.#flushMetrics();
347
+ this.#running = false;
348
+ this.#log('info', 'temporal worker shutdown complete', this.#runtimeLogFields({ drained: false }));
349
+ return;
350
+ }
351
+ await Effect.runPromise(Fiber.interrupt(runtimeFiber));
352
+ try {
353
+ await this.#awaitRuntimeFiber(runtimeFiber);
354
+ }
355
+ catch {
356
+ // ignore failures during shutdown; polling loops log errors before exiting
357
+ }
358
+ finally {
359
+ this.#runFiber = null;
360
+ this.#running = false;
361
+ }
362
+ this.#log('info', 'temporal worker shutdown complete', this.#runtimeLogFields({ drained: true }));
363
+ }
364
+ #buildRuntimeEffect() {
365
+ const runtime = this;
366
+ const workflowPollers = Array.from({ length: runtime.#workflowPollerCount }, () => runtime.#workflowPollerEffect(runtime.#taskQueue));
367
+ const stickyPollers = runtime.#stickySchedulingEnabled
368
+ ? Array.from({ length: runtime.#workflowPollerCount }, () => runtime.#workflowPollerEffect(runtime.#stickyQueue))
369
+ : [];
370
+ const activityPollers = runtime.#hasActivities() ? [runtime.#activityPollerEffect()] : [];
371
+ const pollerLoops = [...workflowPollers, ...stickyPollers, ...activityPollers];
372
+ return Effect.scoped(Effect.gen(function* () {
373
+ yield* Effect.promise(() => runtime.#startScheduler());
374
+ runtime.#log('info', 'temporal worker runtime started', runtime.#runtimeLogFields({
375
+ workflowPollers: runtime.#workflowPollerCount,
376
+ stickySchedulingEnabled: runtime.#stickySchedulingEnabled,
377
+ }));
378
+ if (pollerLoops.length > 0) {
379
+ yield* Effect.forEach(pollerLoops, (loop) => Effect.forkScoped(loop), { concurrency: 'unbounded' });
380
+ }
381
+ yield* Effect.never;
382
+ })).pipe(Effect.ensuring(Effect.promise(async () => {
383
+ await runtime.#stopScheduler();
384
+ await runtime.#flushMetrics();
385
+ runtime.#log('info', 'temporal worker runtime stopped', runtime.#runtimeLogFields());
386
+ })));
387
+ }
388
+ async #awaitRuntimeFiber(fiber) {
389
+ const exit = await Effect.runPromiseExit(Fiber.join(fiber));
390
+ if (Exit.isFailure(exit)) {
391
+ if (Cause.isInterrupted(exit.cause)) {
392
+ return;
393
+ }
394
+ throw Cause.squash(exit.cause);
395
+ }
396
+ }
397
+ async #startScheduler() {
398
+ if (this.#schedulerStarted) {
399
+ return;
400
+ }
401
+ await Effect.runPromise(this.#scheduler.start);
402
+ this.#schedulerStarted = true;
403
+ this.#log('info', 'worker scheduler started', this.#runtimeLogFields({ stickySchedulingEnabled: this.#stickySchedulingEnabled }));
404
+ }
405
+ async #stopScheduler() {
406
+ if (!this.#schedulerStarted) {
407
+ return;
408
+ }
409
+ if (!this.#schedulerStopPromise) {
410
+ this.#schedulerStopPromise = Effect.runPromise(this.#scheduler.stop).finally(() => {
411
+ this.#schedulerStarted = false;
412
+ this.#schedulerStopPromise = null;
413
+ this.#log('info', 'worker scheduler stopped', this.#runtimeLogFields());
414
+ });
415
+ }
416
+ await this.#schedulerStopPromise;
417
+ }
418
+ #workflowPollerEffect(queueName) {
419
+ const request = create(PollWorkflowTaskQueueRequestSchema, {
420
+ namespace: this.#namespace,
421
+ taskQueue: create(TaskQueueSchema, { name: queueName }),
422
+ identity: this.#identity,
423
+ deploymentOptions: this.#deploymentOptions,
424
+ });
425
+ const pollOnce = this.#withRpcAbort(async (signal) => {
426
+ const start = Date.now();
427
+ const response = await this.#workflowService.pollWorkflowTaskQueue(request, {
428
+ timeoutMs: POLL_TIMEOUT_MS,
429
+ signal,
430
+ });
431
+ this.#observeHistogram(this.#metrics.workflowPollLatency, Date.now() - start);
432
+ if (!response.taskToken || response.taskToken.length === 0) {
433
+ return;
434
+ }
435
+ await this.#enqueueWorkflowTask(response);
436
+ }).pipe(Effect.catchAll((error) => this.#isRpcAbortError(error) ? Effect.void : this.#handleWorkflowPollerError(queueName, error)));
437
+ return Effect.forever(pollOnce);
438
+ }
439
+ async #enqueueWorkflowTask(response) {
440
+ const taskToken = response.taskToken ?? new Uint8Array();
441
+ const envelope = {
442
+ taskToken,
443
+ execute: () => Effect.promise(async () => {
444
+ await this.#handleWorkflowTask(response, 0);
445
+ }),
446
+ };
447
+ await Effect.runPromise(this.#scheduler.enqueueWorkflow(envelope));
448
+ }
449
+ #activityPollerEffect() {
450
+ if (!this.#hasActivities()) {
451
+ return Effect.void;
452
+ }
453
+ const request = create(PollActivityTaskQueueRequestSchema, {
454
+ namespace: this.#namespace,
455
+ taskQueue: create(TaskQueueSchema, { name: this.#taskQueue }),
456
+ identity: this.#identity,
457
+ deploymentOptions: this.#deploymentOptions,
458
+ });
459
+ const pollOnce = this.#withRpcAbort(async (signal) => {
460
+ const start = Date.now();
461
+ const response = await this.#workflowService.pollActivityTaskQueue(request, {
462
+ timeoutMs: POLL_TIMEOUT_MS,
463
+ signal,
464
+ });
465
+ this.#observeHistogram(this.#metrics.activityPollLatency, Date.now() - start);
466
+ if (!response.taskToken || response.taskToken.length === 0) {
467
+ return;
468
+ }
469
+ await this.#enqueueActivityTask(response);
470
+ }).pipe(Effect.catchAll((error) => (this.#isRpcAbortError(error) ? Effect.void : this.#handleActivityPollerError(error))));
471
+ return Effect.forever(pollOnce);
472
+ }
473
+ #withRpcAbort(run) {
474
+ return Effect.acquireUseRelease(Effect.sync(() => new AbortController()), (controller) => Effect.tryPromise({
475
+ try: () => run(controller.signal),
476
+ catch: (error) => error,
477
+ }), (controller) => Effect.sync(() => {
478
+ controller.abort();
479
+ }));
480
+ }
481
+ #isRpcAbortError(error) {
482
+ return isAbortError(error) || (error instanceof ConnectError && error.code === Code.Canceled);
483
+ }
484
+ async #enqueueActivityTask(response) {
485
+ const taskToken = response.taskToken ?? new Uint8Array();
486
+ const envelope = {
487
+ taskToken,
488
+ handler: () => this.#processActivityTask(response),
489
+ args: [],
490
+ };
491
+ await Effect.runPromise(this.#scheduler.enqueueActivity(envelope));
492
+ }
493
+ #handleWorkflowPollerError(queueName, error) {
494
+ return Effect.promise(async () => {
495
+ this.#incrementCounter(this.#metrics.workflowPollErrors);
496
+ this.#log('warn', 'workflow polling failed', {
497
+ queueName,
498
+ namespace: this.#namespace,
499
+ error: error instanceof Error ? error.message : String(error),
500
+ });
501
+ await sleep(250);
502
+ }).pipe(Effect.catchAll(() => Effect.void));
503
+ }
504
+ #handleActivityPollerError(error) {
505
+ return Effect.promise(async () => {
506
+ this.#incrementCounter(this.#metrics.activityPollErrors);
507
+ this.#log('warn', 'activity polling failed', {
508
+ namespace: this.#namespace,
509
+ taskQueue: this.#taskQueue,
510
+ error: error instanceof Error ? error.message : String(error),
511
+ });
512
+ await sleep(250);
513
+ }).pipe(Effect.catchAll(() => Effect.void));
514
+ }
515
+ async #handleWorkflowTask(response, nondeterminismRetry = 0) {
516
+ const execution = this.#resolveWorkflowExecution(response);
517
+ const workflowTaskAttempt = Number(response.attempt ?? 1);
518
+ const historyEvents = await this.#collectWorkflowHistory(execution, response);
519
+ const workflowType = this.#resolveWorkflowType(response, historyEvents);
520
+ const args = await this.#decodeWorkflowArgs(historyEvents);
521
+ const workflowInfo = this.#buildWorkflowInfo(workflowType, execution);
522
+ const stickyKey = this.#buildStickyKey(execution.workflowId, execution.runId);
523
+ const stickyEntry = stickyKey ? await this.#getStickyEntry(stickyKey) : undefined;
524
+ const historyReplay = await this.#ingestDeterminismState(workflowInfo, historyEvents);
525
+ const hasHistorySnapshot = this.#isValidDeterminismSnapshot(historyReplay?.determinismState);
526
+ const baseLogFields = this.#workflowLogFields(execution, workflowType, {
527
+ workflowTaskAttempt,
528
+ stickyScheduling: this.#stickySchedulingEnabled,
529
+ nondeterminismRetry,
530
+ });
531
+ let previousState;
532
+ if (stickyEntry && this.#isValidDeterminismSnapshot(stickyEntry.determinismState)) {
533
+ const historyBaselineEventId = this.#resolvePreviousHistoryEventId(response) ?? historyReplay?.lastEventId ?? null;
534
+ const cacheMatchesHistory = (stickyEntry.lastEventId ?? null) === historyBaselineEventId;
535
+ if (cacheMatchesHistory) {
536
+ previousState = stickyEntry.determinismState;
537
+ this.#log('debug', 'sticky cache hit', {
538
+ ...baseLogFields,
539
+ cacheLastEventId: stickyEntry.lastEventId ?? null,
540
+ historyBaselineEventId,
541
+ });
542
+ this.#incrementCounter(this.#metrics.stickyCacheHit);
543
+ }
544
+ else if (hasHistorySnapshot && historyReplay) {
545
+ const diff = await Effect.runPromise(diffDeterminismState(stickyEntry.determinismState, historyReplay.determinismState));
546
+ const logLevel = diff.mismatches.length > 0 ? 'warn' : 'info';
547
+ this.#log(logLevel, 'sticky cache drift detected', {
548
+ ...baseLogFields,
549
+ cacheLastEventId: stickyEntry.lastEventId ?? null,
550
+ historyBaselineEventId,
551
+ mismatches: diff.mismatches,
552
+ });
553
+ previousState = historyReplay.determinismState;
554
+ }
555
+ }
556
+ else if (stickyEntry && this.#stickySchedulingEnabled) {
557
+ this.#log('info', 'sticky cache entry invalid; rebuilding snapshot', {
558
+ ...baseLogFields,
559
+ cacheLastEventId: stickyEntry.lastEventId ?? null,
560
+ });
561
+ }
562
+ else if (!stickyEntry && this.#stickySchedulingEnabled) {
563
+ this.#log('debug', 'sticky cache miss (no entry)', baseLogFields);
564
+ this.#incrementCounter(this.#metrics.stickyCacheMiss);
565
+ }
566
+ if (!previousState && hasHistorySnapshot && historyReplay) {
567
+ if (this.#stickySchedulingEnabled) {
568
+ this.#log('debug', 'sticky cache snapshot rebuilt from history', {
569
+ ...baseLogFields,
570
+ historyBaselineEventId: historyReplay.lastEventId ?? null,
571
+ });
572
+ }
573
+ previousState = historyReplay.determinismState;
574
+ }
575
+ const expectedDeterminismState = previousState;
576
+ try {
577
+ const activityResults = await this.#extractActivityResolutions(historyEvents);
578
+ const output = await this.#executor.execute({
579
+ workflowType,
580
+ workflowId: execution.workflowId,
581
+ runId: execution.runId,
582
+ namespace: this.#namespace,
583
+ taskQueue: this.#taskQueue,
584
+ arguments: args,
585
+ determinismState: previousState,
586
+ activityResults,
587
+ });
588
+ const cacheBaselineEventId = this.#resolveCurrentStartedEventId(response) ?? historyReplay?.lastEventId ?? null;
589
+ const shouldRecordMarker = output.completion === 'pending';
590
+ let commandsForResponse = output.commands;
591
+ if (stickyKey) {
592
+ if (output.completion === 'pending') {
593
+ await this.#upsertStickyEntry(stickyKey, output.determinismState, cacheBaselineEventId, workflowType);
594
+ this.#log('debug', 'sticky cache snapshot persisted', {
595
+ ...baseLogFields,
596
+ cacheBaselineEventId,
597
+ });
598
+ }
599
+ else {
600
+ await this.#removeStickyEntry(stickyKey);
601
+ this.#log('debug', 'sticky cache entry cleared (workflow completed)', baseLogFields);
602
+ }
603
+ }
604
+ if (shouldRecordMarker) {
605
+ const lastEventId = historyReplay?.lastEventId ??
606
+ this.#resolveWorkflowHistoryLastEventId(response) ??
607
+ stickyEntry?.lastEventId ??
608
+ null;
609
+ const markerDetails = await Effect.runPromise(encodeDeterminismMarkerDetails(this.#dataConverter, {
610
+ info: workflowInfo,
611
+ determinismState: output.determinismState,
612
+ lastEventId,
613
+ }));
614
+ const markerCommand = this.#buildDeterminismMarkerCommand(markerDetails);
615
+ commandsForResponse = this.#injectDeterminismMarker(commandsForResponse, markerCommand);
616
+ }
617
+ const completion = create(RespondWorkflowTaskCompletedRequestSchema, {
618
+ taskToken: response.taskToken,
619
+ commands: commandsForResponse,
620
+ identity: this.#identity,
621
+ namespace: this.#namespace,
622
+ deploymentOptions: this.#deploymentOptions,
623
+ ...(this.#stickySchedulingEnabled ? { stickyAttributes: this.#stickyAttributes } : {}),
624
+ ...(this.#versioningBehavior !== null ? { versioningBehavior: this.#versioningBehavior } : {}),
625
+ });
626
+ try {
627
+ await this.#workflowService.respondWorkflowTaskCompleted(completion, { timeoutMs: RESPOND_TIMEOUT_MS });
628
+ }
629
+ catch (rpcError) {
630
+ if (this.#isTaskNotFoundError(rpcError)) {
631
+ this.#logWorkflowTaskNotFound('respondWorkflowTaskCompleted', execution);
632
+ return;
633
+ }
634
+ throw rpcError;
635
+ }
636
+ }
637
+ catch (error) {
638
+ let stickyEntryCleared = false;
639
+ if (stickyKey) {
640
+ await this.#removeStickyEntry(stickyKey);
641
+ stickyEntryCleared = true;
642
+ }
643
+ if (this.#isTaskNotFoundError(error)) {
644
+ this.#logWorkflowTaskNotFound('respondWorkflowTaskCompleted', execution);
645
+ return;
646
+ }
647
+ if (error instanceof WorkflowNondeterminismError) {
648
+ const mismatches = await this.#computeNondeterminismMismatches(error, expectedDeterminismState);
649
+ if (stickyKey && stickyEntryCleared) {
650
+ this.#incrementCounter(this.#metrics.stickyCacheHeal);
651
+ this.#log('warn', 'sticky cache entry cleared after nondeterminism', {
652
+ ...baseLogFields,
653
+ cacheLastEventId: stickyEntry?.lastEventId ?? null,
654
+ });
655
+ }
656
+ if (nondeterminismRetry === 0) {
657
+ this.#log('info', 'retrying workflow task after nondeterminism', {
658
+ ...baseLogFields,
659
+ mismatches,
660
+ retryReason: 'history-refresh',
661
+ });
662
+ await this.#handleWorkflowTask(response, nondeterminismRetry + 1);
663
+ return;
664
+ }
665
+ this.#incrementCounter(this.#metrics.nondeterminism);
666
+ this.#log('error', 'workflow nondeterminism detected', {
667
+ ...baseLogFields,
668
+ mismatches,
669
+ });
670
+ const enriched = this.#augmentNondeterminismError(error, mismatches, {
671
+ execution,
672
+ workflowType,
673
+ stickyLastEventId: stickyEntry?.lastEventId ?? null,
674
+ historyLastEventId: historyReplay?.lastEventId ?? null,
675
+ workflowTaskAttempt,
676
+ });
677
+ await this.#failWorkflowTask(response, execution, enriched, WorkflowTaskFailedCause.NON_DETERMINISTIC_ERROR);
678
+ return;
679
+ }
680
+ if (stickyEntryCleared && this.#stickySchedulingEnabled) {
681
+ this.#log('debug', 'sticky cache entry cleared after workflow failure', baseLogFields);
682
+ }
683
+ await this.#failWorkflowTask(response, execution, error);
684
+ }
685
+ }
686
+ #buildStickyKey(workflowId, runId) {
687
+ if (!workflowId || !runId) {
688
+ return null;
689
+ }
690
+ return {
691
+ namespace: this.#namespace,
692
+ workflowId,
693
+ runId,
694
+ };
695
+ }
696
+ async #ingestDeterminismState(workflowInfo, historyEvents) {
697
+ if (historyEvents.length === 0) {
698
+ return undefined;
699
+ }
700
+ return await Effect.runPromise(ingestWorkflowHistory({
701
+ info: workflowInfo,
702
+ history: historyEvents,
703
+ dataConverter: this.#dataConverter,
704
+ }));
705
+ }
706
+ async #collectWorkflowHistory(execution, _response) {
707
+ const events = [];
708
+ let token;
709
+ while (true) {
710
+ const page = await this.#fetchWorkflowHistoryPage(execution, token);
711
+ if (page.events.length > 0) {
712
+ events.push(...page.events);
713
+ }
714
+ if (!page.nextPageToken || page.nextPageToken.length === 0) {
715
+ break;
716
+ }
717
+ token = page.nextPageToken;
718
+ }
719
+ return events;
720
+ }
721
+ async #extractActivityResolutions(events) {
722
+ const resolutions = new Map();
723
+ const scheduledActivityIds = new Map();
724
+ const normalizeEventId = (value) => {
725
+ if (value === undefined || value === null) {
726
+ return undefined;
727
+ }
728
+ if (typeof value === 'string') {
729
+ return value;
730
+ }
731
+ return value.toString();
732
+ };
733
+ const resolveActivityId = (attrs, scheduledEventId) => {
734
+ const direct = typeof attrs.activityId === 'string' ? attrs.activityId : undefined;
735
+ if (direct) {
736
+ return direct;
737
+ }
738
+ const key = normalizeEventId(scheduledEventId);
739
+ if (!key) {
740
+ return undefined;
741
+ }
742
+ return scheduledActivityIds.get(key);
743
+ };
744
+ for (const event of events) {
745
+ switch (event.eventType) {
746
+ case EventType.ACTIVITY_TASK_SCHEDULED: {
747
+ if (event.attributes?.case !== 'activityTaskScheduledEventAttributes') {
748
+ break;
749
+ }
750
+ const activityId = event.attributes.value.activityId;
751
+ const scheduledKey = normalizeEventId(event.eventId);
752
+ if (activityId && scheduledKey) {
753
+ scheduledActivityIds.set(scheduledKey, activityId);
754
+ }
755
+ break;
756
+ }
757
+ case EventType.ACTIVITY_TASK_COMPLETED: {
758
+ if (event.attributes?.case !== 'activityTaskCompletedEventAttributes') {
759
+ break;
760
+ }
761
+ const activityId = resolveActivityId(event.attributes.value, event.attributes.value.scheduledEventId);
762
+ if (!activityId) {
763
+ break;
764
+ }
765
+ const payloads = event.attributes.value.result?.payloads ?? [];
766
+ const decoded = await decodePayloadsToValues(this.#dataConverter, payloads);
767
+ const value = decoded.length === 0 ? undefined : decoded.length === 1 ? decoded[0] : Object.freeze([...decoded]);
768
+ resolutions.set(activityId, { status: 'completed', value });
769
+ break;
770
+ }
771
+ case EventType.ACTIVITY_TASK_FAILED: {
772
+ if (event.attributes?.case !== 'activityTaskFailedEventAttributes') {
773
+ break;
774
+ }
775
+ const activityId = resolveActivityId(event.attributes.value, event.attributes.value.scheduledEventId);
776
+ if (!activityId) {
777
+ break;
778
+ }
779
+ const failureError = (await failureToError(this.#dataConverter, event.attributes.value.failure)) ??
780
+ new Error(`Activity ${activityId} failed`);
781
+ resolutions.set(activityId, { status: 'failed', error: failureError });
782
+ break;
783
+ }
784
+ case EventType.ACTIVITY_TASK_TIMED_OUT: {
785
+ if (event.attributes?.case !== 'activityTaskTimedOutEventAttributes') {
786
+ break;
787
+ }
788
+ const activityId = resolveActivityId(event.attributes.value, event.attributes.value.scheduledEventId);
789
+ if (!activityId) {
790
+ break;
791
+ }
792
+ const timeoutFailure = event.attributes.value.failure?.failureInfo;
793
+ const timeoutTypeValue = timeoutFailure?.case === 'timeoutFailureInfo' ? timeoutFailure.value.timeoutType : undefined;
794
+ const timeoutType = timeoutTypeValue !== undefined ? (TimeoutType[timeoutTypeValue] ?? String(timeoutTypeValue)) : 'unknown';
795
+ const failureError = (await failureToError(this.#dataConverter, event.attributes.value.failure)) ??
796
+ new Error(`Activity ${activityId} timed out (${timeoutType})`);
797
+ resolutions.set(activityId, { status: 'failed', error: failureError });
798
+ break;
799
+ }
800
+ case EventType.ACTIVITY_TASK_CANCELED: {
801
+ if (event.attributes?.case !== 'activityTaskCanceledEventAttributes') {
802
+ break;
803
+ }
804
+ const activityId = resolveActivityId(event.attributes.value, event.attributes.value.scheduledEventId);
805
+ if (!activityId) {
806
+ break;
807
+ }
808
+ const details = await decodePayloadsToValues(this.#dataConverter, event.attributes.value.details?.payloads ?? []);
809
+ const error = new Error(`Activity ${activityId} was canceled`);
810
+ error.details = details;
811
+ resolutions.set(activityId, { status: 'failed', error });
812
+ break;
813
+ }
814
+ default:
815
+ break;
816
+ }
817
+ }
818
+ return resolutions;
819
+ }
820
+ async #fetchWorkflowHistoryPage(execution, nextPageToken) {
821
+ if (!execution.workflowId || !execution.runId) {
822
+ return { events: [], nextPageToken: new Uint8Array() };
823
+ }
824
+ const historyRequest = create(GetWorkflowExecutionHistoryRequestSchema, {
825
+ namespace: this.#namespace,
826
+ execution: create(WorkflowExecutionSchema, {
827
+ workflowId: execution.workflowId,
828
+ runId: execution.runId,
829
+ }),
830
+ maximumPageSize: 0,
831
+ ...(nextPageToken && nextPageToken.length > 0 ? { nextPageToken } : {}),
832
+ waitNewEvent: false,
833
+ historyEventFilterType: HistoryEventFilterType.ALL_EVENT,
834
+ skipArchival: true,
835
+ });
836
+ const historyResponse = await this.#workflowService.getWorkflowExecutionHistory(historyRequest, {
837
+ timeoutMs: HISTORY_FETCH_TIMEOUT_MS,
838
+ });
839
+ return {
840
+ events: historyResponse.history?.events ?? [],
841
+ nextPageToken: historyResponse.nextPageToken ?? new Uint8Array(),
842
+ };
843
+ }
844
+ #buildWorkflowInfo(workflowType, execution) {
845
+ return {
846
+ namespace: this.#namespace,
847
+ taskQueue: this.#taskQueue,
848
+ workflowId: execution.workflowId,
849
+ runId: execution.runId,
850
+ workflowType,
851
+ };
852
+ }
853
+ async #getStickyEntry(key) {
854
+ return await Effect.runPromise(this.#stickyCache.get(key));
855
+ }
856
+ async #upsertStickyEntry(key, state, lastEventId, workflowType) {
857
+ const entry = {
858
+ key,
859
+ determinismState: state,
860
+ lastEventId,
861
+ lastAccessed: Date.now(),
862
+ workflowType,
863
+ };
864
+ await Effect.runPromise(this.#stickyCache.upsert(entry));
865
+ }
866
+ #resolveWorkflowHistoryLastEventId(response) {
867
+ return resolveHistoryLastEventId(response.history?.events ?? []);
868
+ }
869
+ #isTaskNotFoundError(error) {
870
+ return error instanceof ConnectError && error.code === Code.NotFound;
871
+ }
872
+ #buildDeterminismMarkerCommand(details) {
873
+ return create(CommandSchema, {
874
+ commandType: CommandType.RECORD_MARKER,
875
+ attributes: {
876
+ case: 'recordMarkerCommandAttributes',
877
+ value: create(RecordMarkerCommandAttributesSchema, {
878
+ markerName: DETERMINISM_MARKER_NAME,
879
+ details,
880
+ }),
881
+ },
882
+ });
883
+ }
884
+ #injectDeterminismMarker(commands, marker) {
885
+ if (commands.some((command) => this.#isDeterminismMarkerCommand(command))) {
886
+ return commands;
887
+ }
888
+ const next = [...commands];
889
+ const completionIndex = next.findIndex((command) => COMPLETION_COMMAND_TYPES.has(command.commandType));
890
+ if (completionIndex === -1) {
891
+ next.push(marker);
892
+ return next;
893
+ }
894
+ next.splice(completionIndex, 0, marker);
895
+ return next;
896
+ }
897
+ #isDeterminismMarkerCommand(command) {
898
+ if (command.commandType !== CommandType.RECORD_MARKER) {
899
+ return false;
900
+ }
901
+ if (command.attributes?.case !== 'recordMarkerCommandAttributes') {
902
+ return false;
903
+ }
904
+ return command.attributes.value.markerName === DETERMINISM_MARKER_NAME;
905
+ }
906
+ #log(level, message, fields) {
907
+ void Effect.runPromise(this.#logger.log(level, message, fields));
908
+ }
909
+ #incrementCounter(counter, value = 1) {
910
+ void Effect.runPromise(counter.inc(value));
911
+ }
912
+ #observeHistogram(histogram, value) {
913
+ void Effect.runPromise(histogram.observe(value));
914
+ }
915
+ #workflowLogFields(execution, workflowType, extra) {
916
+ return {
917
+ namespace: this.#namespace,
918
+ taskQueue: this.#taskQueue,
919
+ workflowId: execution.workflowId,
920
+ runId: execution.runId,
921
+ workflowType,
922
+ ...(extra ?? {}),
923
+ };
924
+ }
925
+ #runtimeLogFields(extra) {
926
+ return {
927
+ namespace: this.#namespace,
928
+ taskQueue: this.#taskQueue,
929
+ identity: this.#identity,
930
+ ...(extra ?? {}),
931
+ };
932
+ }
933
+ async #computeNondeterminismMismatches(error, expectedState) {
934
+ const baseline = expectedState ?? {
935
+ commandHistory: [],
936
+ randomValues: [],
937
+ timeValues: [],
938
+ failureMetadata: undefined,
939
+ };
940
+ const hint = error.details?.hint;
941
+ if (!hint) {
942
+ return [];
943
+ }
944
+ const commandIndex = this.#parseIndexFromHint(hint, 'commandIndex');
945
+ const randomIndex = this.#parseIndexFromHint(hint, 'randomIndex');
946
+ const timeIndex = this.#parseIndexFromHint(hint, 'timeIndex');
947
+ const mutableActual = {
948
+ commandHistory: baseline.commandHistory.map((entry) => ({
949
+ intent: entry.intent,
950
+ metadata: entry.metadata ? { ...entry.metadata } : undefined,
951
+ })),
952
+ randomValues: [...baseline.randomValues],
953
+ timeValues: [...baseline.timeValues],
954
+ failureMetadata: baseline.failureMetadata ? { ...baseline.failureMetadata } : undefined,
955
+ };
956
+ let mutated = false;
957
+ if (commandIndex !== null) {
958
+ const received = error.details?.received;
959
+ if (received) {
960
+ if (commandIndex < mutableActual.commandHistory.length) {
961
+ mutableActual.commandHistory = mutableActual.commandHistory.map((entry, idx) => idx === commandIndex ? { intent: received, metadata: entry.metadata } : entry);
962
+ }
963
+ else {
964
+ mutableActual.commandHistory = [...mutableActual.commandHistory, { intent: received }];
965
+ }
966
+ mutated = true;
967
+ }
968
+ else if (commandIndex < mutableActual.commandHistory.length) {
969
+ mutableActual.commandHistory = mutableActual.commandHistory.filter((_, idx) => idx !== commandIndex);
970
+ mutated = true;
971
+ }
972
+ }
973
+ if (randomIndex !== null) {
974
+ this.#ensureArrayLength(mutableActual.randomValues, randomIndex);
975
+ mutableActual.randomValues[randomIndex] = Number.NaN;
976
+ mutated = true;
977
+ }
978
+ if (timeIndex !== null) {
979
+ this.#ensureArrayLength(mutableActual.timeValues, timeIndex);
980
+ mutableActual.timeValues[timeIndex] = Number.NaN;
981
+ mutated = true;
982
+ }
983
+ if (!mutated) {
984
+ return [];
985
+ }
986
+ const actualState = {
987
+ commandHistory: mutableActual.commandHistory,
988
+ randomValues: mutableActual.randomValues,
989
+ timeValues: mutableActual.timeValues,
990
+ failureMetadata: mutableActual.failureMetadata,
991
+ };
992
+ const diff = await Effect.runPromise(diffDeterminismState(baseline, actualState));
993
+ return diff.mismatches;
994
+ }
995
+ #augmentNondeterminismError(error, mismatches, context) {
996
+ if (mismatches.length === 0) {
997
+ return error;
998
+ }
999
+ const details = {
1000
+ ...(error.details ?? {}),
1001
+ mismatches,
1002
+ workflow: {
1003
+ namespace: this.#namespace,
1004
+ taskQueue: this.#taskQueue,
1005
+ workflowId: context.execution.workflowId,
1006
+ runId: context.execution.runId,
1007
+ workflowType: context.workflowType,
1008
+ },
1009
+ workflowTaskAttempt: context.workflowTaskAttempt,
1010
+ stickyCache: {
1011
+ cachedEventId: context.stickyLastEventId ?? undefined,
1012
+ historyLastEventId: context.historyLastEventId ?? undefined,
1013
+ },
1014
+ };
1015
+ const enriched = new WorkflowNondeterminismError(error.message, details);
1016
+ enriched.stack = error.stack;
1017
+ return enriched;
1018
+ }
1019
+ #parseIndexFromHint(hint, label) {
1020
+ const pattern = new RegExp(`${label}=(\\d+)`);
1021
+ const match = pattern.exec(hint);
1022
+ if (!match) {
1023
+ return null;
1024
+ }
1025
+ const value = Number.parseInt(match[1] ?? '', 10);
1026
+ return Number.isNaN(value) ? null : value;
1027
+ }
1028
+ #ensureArrayLength(array, index) {
1029
+ while (array.length <= index) {
1030
+ array.push(Number.NaN);
1031
+ }
1032
+ }
1033
+ static #isStickyCacheInstance(value) {
1034
+ if (!value || typeof value !== 'object') {
1035
+ return false;
1036
+ }
1037
+ const candidate = value;
1038
+ return (typeof candidate.upsert === 'function' &&
1039
+ typeof candidate.get === 'function' &&
1040
+ typeof candidate.remove === 'function');
1041
+ }
1042
+ async #removeStickyEntry(key) {
1043
+ await Effect.runPromise(this.#stickyCache.remove(key));
1044
+ }
1045
+ async #failWorkflowTask(response, execution, error, cause = WorkflowTaskFailedCause.UNSPECIFIED) {
1046
+ const failure = await encodeErrorToFailure(this.#dataConverter, error);
1047
+ const encoded = await encodeFailurePayloads(this.#dataConverter, failure);
1048
+ const failed = create(RespondWorkflowTaskFailedRequestSchema, {
1049
+ taskToken: response.taskToken,
1050
+ cause,
1051
+ failure: encoded,
1052
+ identity: this.#identity,
1053
+ namespace: this.#namespace,
1054
+ deploymentOptions: this.#deploymentOptions,
1055
+ });
1056
+ try {
1057
+ await this.#workflowService.respondWorkflowTaskFailed(failed, { timeoutMs: RESPOND_TIMEOUT_MS });
1058
+ this.#incrementCounter(this.#metrics.workflowFailures);
1059
+ }
1060
+ catch (rpcError) {
1061
+ if (this.#isTaskNotFoundError(rpcError)) {
1062
+ this.#logWorkflowTaskNotFound('respondWorkflowTaskFailed', execution);
1063
+ return;
1064
+ }
1065
+ throw rpcError;
1066
+ }
1067
+ }
1068
+ async #processActivityTask(response) {
1069
+ const cancelRequested = isActivityCancelRequested(response);
1070
+ if (cancelRequested) {
1071
+ await this.#cancelActivityTask(response);
1072
+ return;
1073
+ }
1074
+ const taskToken = response.taskToken;
1075
+ if (!taskToken || taskToken.length === 0) {
1076
+ await this.#failActivityTask(response, new Error('Activity task missing token'));
1077
+ return;
1078
+ }
1079
+ const activityType = response.activityType?.name;
1080
+ if (!activityType) {
1081
+ await this.#failActivityTask(response, new Error('Activity task missing type'));
1082
+ return;
1083
+ }
1084
+ const handler = this.#activities[activityType];
1085
+ if (!handler) {
1086
+ await this.#failActivityTask(response, new Error(`No handler registered for activity ${activityType}`));
1087
+ return;
1088
+ }
1089
+ const args = await decodePayloadsToValues(this.#dataConverter, response.input?.payloads ?? []);
1090
+ const heartbeatDetails = await decodePayloadsToValues(this.#dataConverter, response.heartbeatDetails?.payloads ?? []);
1091
+ const { context, abortController } = this.#createActivityContext(response, cancelRequested, heartbeatDetails);
1092
+ let heartbeatRegistration;
1093
+ try {
1094
+ heartbeatRegistration = await Effect.runPromise(this.#activityLifecycle.registerHeartbeat({
1095
+ context,
1096
+ workflowService: this.#workflowService,
1097
+ taskToken,
1098
+ identity: this.#identity,
1099
+ namespace: this.#namespace,
1100
+ dataConverter: this.#dataConverter,
1101
+ abortController,
1102
+ }));
1103
+ context.heartbeat = async (...details) => {
1104
+ context.info.lastHeartbeatDetails = details;
1105
+ const registration = heartbeatRegistration;
1106
+ if (!registration) {
1107
+ return;
1108
+ }
1109
+ await Effect.runPromise(registration.heartbeat(details));
1110
+ };
1111
+ }
1112
+ catch (registrationError) {
1113
+ this.#log('warn', 'failed to register heartbeat handler', {
1114
+ activityType,
1115
+ workflowId: context.info.workflowId,
1116
+ runId: context.info.runId,
1117
+ error: registrationError instanceof Error ? registrationError.message : String(registrationError),
1118
+ });
1119
+ context.heartbeat = async (...details) => {
1120
+ context.info.lastHeartbeatDetails = details;
1121
+ };
1122
+ }
1123
+ const retryPolicy = this.#convertRetryPolicy(response.retryPolicy);
1124
+ const retryDeadlineMs = this.#computeRetryDeadline(response);
1125
+ let retryState = {
1126
+ attempt: context.info.attempt,
1127
+ retryCount: 0,
1128
+ nextDelayMs: 0,
1129
+ };
1130
+ try {
1131
+ while (true) {
1132
+ try {
1133
+ const result = await runWithActivityContext(context, async () => await handler(...args));
1134
+ const payloads = await encodeValuesToPayloads(this.#dataConverter, result === undefined ? [] : [result]);
1135
+ const completion = create(RespondActivityTaskCompletedRequestSchema, {
1136
+ taskToken: response.taskToken,
1137
+ identity: this.#identity,
1138
+ namespace: this.#namespace,
1139
+ result: payloads && payloads.length > 0 ? create(PayloadsSchema, { payloads }) : undefined,
1140
+ deploymentOptions: this.#deploymentOptions,
1141
+ });
1142
+ await this.#workflowService.respondActivityTaskCompleted(completion, { timeoutMs: RESPOND_TIMEOUT_MS });
1143
+ break;
1144
+ }
1145
+ catch (error) {
1146
+ if (isAbortError(error)) {
1147
+ await this.#cancelActivityTask(response, context);
1148
+ return;
1149
+ }
1150
+ if (!retryPolicy || this.#isNonRetryableActivityError(error, retryPolicy)) {
1151
+ await this.#failActivityTask(response, error, context);
1152
+ return;
1153
+ }
1154
+ const nextRetry = await Effect.runPromise(this.#activityLifecycle.nextRetryDelay(retryPolicy, retryState));
1155
+ if (!nextRetry) {
1156
+ markErrorNonRetryable(error);
1157
+ await this.#failActivityTask(response, error, context);
1158
+ return;
1159
+ }
1160
+ if (retryDeadlineMs !== undefined && Date.now() + nextRetry.nextDelayMs > retryDeadlineMs) {
1161
+ markErrorNonRetryable(error);
1162
+ await this.#failActivityTask(response, error, context);
1163
+ return;
1164
+ }
1165
+ await sleep(nextRetry.nextDelayMs);
1166
+ context.throwIfCancelled();
1167
+ context.info.attempt = nextRetry.attempt;
1168
+ retryState = nextRetry;
1169
+ }
1170
+ }
1171
+ }
1172
+ finally {
1173
+ if (heartbeatRegistration) {
1174
+ try {
1175
+ await Effect.runPromise(heartbeatRegistration.shutdown);
1176
+ }
1177
+ catch (shutdownError) {
1178
+ this.#log('warn', 'heartbeat shutdown failed', {
1179
+ activityType,
1180
+ error: shutdownError instanceof Error ? shutdownError.message : String(shutdownError),
1181
+ });
1182
+ }
1183
+ }
1184
+ }
1185
+ }
1186
+ async #failActivityTask(response, error, context) {
1187
+ const failure = await encodeErrorToFailure(this.#dataConverter, error);
1188
+ const encoded = await encodeFailurePayloads(this.#dataConverter, failure);
1189
+ const lastHeartbeatDetails = await this.#encodeHeartbeatPayloads(context?.info.lastHeartbeatDetails, context?.info.cancellationReason);
1190
+ const request = create(RespondActivityTaskFailedRequestSchema, {
1191
+ taskToken: response.taskToken,
1192
+ identity: this.#identity,
1193
+ namespace: this.#namespace,
1194
+ failure: encoded,
1195
+ lastHeartbeatDetails,
1196
+ deploymentOptions: this.#deploymentOptions,
1197
+ });
1198
+ await this.#workflowService.respondActivityTaskFailed(request, { timeoutMs: RESPOND_TIMEOUT_MS });
1199
+ this.#incrementCounter(this.#metrics.activityFailures);
1200
+ }
1201
+ async #cancelActivityTask(response, context) {
1202
+ const details = await this.#encodeHeartbeatPayloads(context?.info.lastHeartbeatDetails, context?.info.cancellationReason);
1203
+ const request = create(RespondActivityTaskCanceledRequestSchema, {
1204
+ taskToken: response.taskToken,
1205
+ identity: this.#identity,
1206
+ namespace: this.#namespace,
1207
+ details,
1208
+ deploymentOptions: this.#deploymentOptions,
1209
+ });
1210
+ await this.#workflowService.respondActivityTaskCanceled(request, { timeoutMs: RESPOND_TIMEOUT_MS });
1211
+ }
1212
+ async #encodeHeartbeatPayloads(details, reason) {
1213
+ const finalDetails = details && details.length > 0
1214
+ ? details
1215
+ : reason
1216
+ ? [
1217
+ {
1218
+ cancellationReason: reason,
1219
+ },
1220
+ ]
1221
+ : undefined;
1222
+ if (!finalDetails) {
1223
+ return undefined;
1224
+ }
1225
+ const payloads = await encodeValuesToPayloads(this.#dataConverter, finalDetails);
1226
+ return payloads.length > 0 ? create(PayloadsSchema, { payloads }) : undefined;
1227
+ }
1228
+ #createActivityContext(response, cancelRequested, lastHeartbeatDetails) {
1229
+ const abortController = new AbortController();
1230
+ if (cancelRequested) {
1231
+ abortController.abort(createActivityAbortError('Activity cancellation requested by Temporal'));
1232
+ }
1233
+ const info = {
1234
+ activityId: response.activityId ?? '',
1235
+ activityType: response.activityType?.name ?? '',
1236
+ workflowNamespace: response.workflowNamespace ?? this.#namespace,
1237
+ workflowType: response.workflowType?.name ?? '',
1238
+ workflowId: response.workflowExecution?.workflowId ?? '',
1239
+ runId: response.workflowExecution?.runId ?? '',
1240
+ taskQueue: this.#taskQueue,
1241
+ attempt: Number(response.attempt ?? 1),
1242
+ isLocal: false,
1243
+ scheduledTime: timestampToDate(response.scheduledTime),
1244
+ startedTime: timestampToDate(response.startedTime),
1245
+ currentAttemptScheduledTime: timestampToDate(response.currentAttemptScheduledTime),
1246
+ heartbeatTimeoutMs: durationToMillis(response.heartbeatTimeout),
1247
+ scheduleToCloseTimeoutMs: durationToMillis(response.scheduleToCloseTimeout),
1248
+ startToCloseTimeoutMs: durationToMillis(response.startToCloseTimeout),
1249
+ lastHeartbeatDetails,
1250
+ lastHeartbeatTime: undefined,
1251
+ cancellationReason: cancelRequested ? 'poll-cancel-requested' : undefined,
1252
+ };
1253
+ const context = {
1254
+ info,
1255
+ cancellationSignal: abortController.signal,
1256
+ get isCancellationRequested() {
1257
+ return abortController.signal.aborted;
1258
+ },
1259
+ async heartbeat(...details) {
1260
+ info.lastHeartbeatDetails = details;
1261
+ },
1262
+ throwIfCancelled() {
1263
+ if (!abortController.signal.aborted) {
1264
+ return;
1265
+ }
1266
+ const reason = abortController.signal.reason;
1267
+ if (reason instanceof Error) {
1268
+ throw reason;
1269
+ }
1270
+ const error = createActivityAbortError(typeof reason === 'string' && reason.length > 0 ? reason : 'Activity cancelled by Temporal');
1271
+ throw error;
1272
+ },
1273
+ };
1274
+ return { context, abortController };
1275
+ }
1276
+ #convertRetryPolicy(policy) {
1277
+ if (!policy) {
1278
+ return undefined;
1279
+ }
1280
+ const initialIntervalMs = durationToMillis(policy.initialInterval);
1281
+ const maximumIntervalMs = durationToMillis(policy.maximumInterval);
1282
+ const backoffCoefficient = policy.backoffCoefficient !== 0 ? policy.backoffCoefficient : undefined;
1283
+ const maximumAttempts = policy.maximumAttempts > 0 ? policy.maximumAttempts : undefined;
1284
+ const nonRetryable = policy.nonRetryableErrorTypes.length > 0 ? [...policy.nonRetryableErrorTypes] : undefined;
1285
+ if (initialIntervalMs === undefined &&
1286
+ maximumIntervalMs === undefined &&
1287
+ backoffCoefficient === undefined &&
1288
+ maximumAttempts === undefined &&
1289
+ (nonRetryable === undefined || nonRetryable.length === 0)) {
1290
+ return undefined;
1291
+ }
1292
+ return {
1293
+ ...(initialIntervalMs !== undefined ? { initialIntervalMs } : {}),
1294
+ ...(backoffCoefficient !== undefined ? { backoffCoefficient } : {}),
1295
+ ...(maximumIntervalMs !== undefined ? { maximumIntervalMs } : {}),
1296
+ ...(maximumAttempts !== undefined ? { maximumAttempts } : {}),
1297
+ ...(nonRetryable !== undefined ? { nonRetryableErrorTypes: nonRetryable } : {}),
1298
+ };
1299
+ }
1300
+ #isNonRetryableActivityError(error, retry) {
1301
+ if (error && typeof error === 'object' && error.nonRetryable === true) {
1302
+ return true;
1303
+ }
1304
+ const errorName = error instanceof Error ? error.name : undefined;
1305
+ if (!errorName) {
1306
+ return false;
1307
+ }
1308
+ return Boolean(retry.nonRetryableErrorTypes?.includes(errorName));
1309
+ }
1310
+ #computeRetryDeadline(response) {
1311
+ const scheduleToClose = durationToMillis(response.scheduleToCloseTimeout);
1312
+ const startToClose = durationToMillis(response.startToCloseTimeout);
1313
+ const scheduledTime = timestampToDate(response.scheduledTime);
1314
+ const startedTime = timestampToDate(response.startedTime) ?? scheduledTime;
1315
+ const scheduleDeadline = scheduleToClose && scheduledTime ? scheduledTime.getTime() + scheduleToClose : undefined;
1316
+ const startDeadline = startToClose && startedTime ? startedTime.getTime() + startToClose : undefined;
1317
+ if (scheduleDeadline && startDeadline) {
1318
+ return Math.min(scheduleDeadline, startDeadline);
1319
+ }
1320
+ return scheduleDeadline ?? startDeadline ?? undefined;
1321
+ }
1322
+ async #flushMetrics() {
1323
+ try {
1324
+ await Effect.runPromise(this.#metricsExporter.flush());
1325
+ }
1326
+ catch (error) {
1327
+ this.#log('warn', 'failed to flush metrics exporter', {
1328
+ error: error instanceof Error ? error.message : String(error),
1329
+ });
1330
+ }
1331
+ }
1332
+ async #decodeWorkflowArgs(events) {
1333
+ const startEvent = this.#findWorkflowStartedEvent(events);
1334
+ if (!startEvent) {
1335
+ return [];
1336
+ }
1337
+ const attributes = startEvent.attributes?.case === 'workflowExecutionStartedEventAttributes'
1338
+ ? startEvent.attributes.value
1339
+ : undefined;
1340
+ if (!attributes) {
1341
+ return [];
1342
+ }
1343
+ const inputPayloads = attributes.input?.payloads ?? [];
1344
+ return await decodePayloadsToValues(this.#dataConverter, inputPayloads);
1345
+ }
1346
+ #resolveWorkflowType(response, events) {
1347
+ if (response.workflowType?.name) {
1348
+ return response.workflowType.name;
1349
+ }
1350
+ const startEvent = this.#findWorkflowStartedEvent(events);
1351
+ if (startEvent?.attributes?.case === 'workflowExecutionStartedEventAttributes') {
1352
+ const workflowTypeName = startEvent.attributes.value.workflowType?.name;
1353
+ if (workflowTypeName) {
1354
+ return workflowTypeName;
1355
+ }
1356
+ }
1357
+ throw new Error('Unable to resolve workflow type from workflow task');
1358
+ }
1359
+ #resolveWorkflowExecution(response) {
1360
+ const workflowId = response.workflowExecution?.workflowId ?? '';
1361
+ const runId = response.workflowExecution?.runId ?? '';
1362
+ return { workflowId, runId };
1363
+ }
1364
+ #findWorkflowStartedEvent(events) {
1365
+ return events.find((event) => event.eventType === EventType.WORKFLOW_EXECUTION_STARTED &&
1366
+ event.attributes?.case === 'workflowExecutionStartedEventAttributes');
1367
+ }
1368
+ #hasActivities() {
1369
+ return Object.keys(this.#activities).length > 0;
1370
+ }
1371
+ #logWorkflowTaskNotFound(context, execution) {
1372
+ this.#log('warn', 'workflow task already resolved', {
1373
+ context,
1374
+ workflowId: execution.workflowId,
1375
+ runId: execution.runId,
1376
+ });
1377
+ }
1378
+ }
1379
+ const timestampToDate = (timestamp) => {
1380
+ if (!timestamp) {
1381
+ return undefined;
1382
+ }
1383
+ const seconds = Number(timestamp.seconds ?? 0n);
1384
+ const nanos = timestamp.nanos ?? 0;
1385
+ return new Date(seconds * 1000 + Math.trunc(nanos / 1_000_000));
1386
+ };
1387
+ const createActivityAbortError = (message) => {
1388
+ const error = new Error(message);
1389
+ error.name = 'AbortError';
1390
+ return error;
1391
+ };
1392
+ const markErrorNonRetryable = (error) => {
1393
+ if (error && typeof error === 'object') {
1394
+ ;
1395
+ error.nonRetryable = true;
1396
+ }
1397
+ };
1398
+ const isActivityCancelRequested = (response) => Boolean(response.cancelRequested);
1399
+ const isAbortError = (error) => error instanceof Error && error.name === 'AbortError';
1400
+ async function loadWorkflows(workflowsPath, overrides) {
1401
+ if (overrides && overrides.length > 0) {
1402
+ return [...overrides];
1403
+ }
1404
+ if (!workflowsPath) {
1405
+ return [];
1406
+ }
1407
+ const moduleUrl = pathToFileURL(workflowsPath);
1408
+ const loaded = await import(moduleUrl.href);
1409
+ const exported = (loaded.workflows ?? loaded.default);
1410
+ if (Array.isArray(exported)) {
1411
+ return exported;
1412
+ }
1413
+ return [];
1414
+ }
1415
+ //# sourceMappingURL=runtime.js.map