@temporalio/core-bridge 0.19.2 → 0.20.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 (124) hide show
  1. package/Cargo.lock +90 -157
  2. package/Cargo.toml +1 -0
  3. package/index.d.ts +11 -27
  4. package/package.json +3 -3
  5. package/releases/aarch64-apple-darwin/index.node +0 -0
  6. package/releases/aarch64-unknown-linux-gnu/index.node +0 -0
  7. package/releases/x86_64-apple-darwin/index.node +0 -0
  8. package/releases/x86_64-pc-windows-msvc/index.node +0 -0
  9. package/releases/x86_64-unknown-linux-gnu/index.node +0 -0
  10. package/sdk-core/.buildkite/docker/Dockerfile +1 -1
  11. package/sdk-core/.buildkite/docker/docker-compose.yaml +1 -1
  12. package/sdk-core/.cargo/config.toml +1 -0
  13. package/sdk-core/CODEOWNERS +1 -1
  14. package/sdk-core/bridge-ffi/include/sdk-core-bridge.h +119 -86
  15. package/sdk-core/bridge-ffi/src/lib.rs +311 -315
  16. package/sdk-core/bridge-ffi/src/wrappers.rs +108 -113
  17. package/sdk-core/client/Cargo.toml +13 -9
  18. package/sdk-core/client/LICENSE.txt +23 -0
  19. package/sdk-core/client/src/lib.rs +286 -174
  20. package/sdk-core/client/src/metrics.rs +86 -12
  21. package/sdk-core/client/src/raw.rs +566 -0
  22. package/sdk-core/client/src/retry.rs +137 -99
  23. package/sdk-core/core/Cargo.toml +15 -10
  24. package/sdk-core/core/LICENSE.txt +23 -0
  25. package/sdk-core/core/benches/workflow_replay.rs +79 -0
  26. package/sdk-core/core/src/abstractions.rs +38 -0
  27. package/sdk-core/core/src/core_tests/activity_tasks.rs +108 -182
  28. package/sdk-core/core/src/core_tests/child_workflows.rs +16 -11
  29. package/sdk-core/core/src/core_tests/determinism.rs +24 -12
  30. package/sdk-core/core/src/core_tests/local_activities.rs +53 -27
  31. package/sdk-core/core/src/core_tests/mod.rs +30 -43
  32. package/sdk-core/core/src/core_tests/queries.rs +82 -81
  33. package/sdk-core/core/src/core_tests/workers.rs +111 -296
  34. package/sdk-core/core/src/core_tests/workflow_cancels.rs +4 -4
  35. package/sdk-core/core/src/core_tests/workflow_tasks.rs +213 -241
  36. package/sdk-core/core/src/lib.rs +73 -318
  37. package/sdk-core/core/src/pollers/mod.rs +4 -6
  38. package/sdk-core/core/src/pollers/poll_buffer.rs +20 -14
  39. package/sdk-core/core/src/protosext/mod.rs +7 -10
  40. package/sdk-core/core/src/replay/mod.rs +11 -150
  41. package/sdk-core/core/src/telemetry/metrics.rs +35 -2
  42. package/sdk-core/core/src/telemetry/mod.rs +49 -16
  43. package/sdk-core/core/src/telemetry/prometheus_server.rs +14 -35
  44. package/sdk-core/core/src/test_help/mod.rs +104 -170
  45. package/sdk-core/core/src/worker/activities/activity_heartbeat_manager.rs +57 -34
  46. package/sdk-core/core/src/worker/activities/local_activities.rs +37 -17
  47. package/sdk-core/core/src/worker/activities.rs +23 -16
  48. package/sdk-core/core/src/worker/client/mocks.rs +86 -0
  49. package/sdk-core/core/src/worker/client.rs +209 -0
  50. package/sdk-core/core/src/worker/mod.rs +193 -105
  51. package/sdk-core/core/src/workflow/driven_workflow.rs +21 -6
  52. package/sdk-core/core/src/workflow/history_update.rs +107 -24
  53. package/sdk-core/core/src/workflow/machines/activity_state_machine.rs +2 -3
  54. package/sdk-core/core/src/workflow/machines/child_workflow_state_machine.rs +2 -3
  55. package/sdk-core/core/src/workflow/machines/mod.rs +20 -17
  56. package/sdk-core/core/src/workflow/machines/signal_external_state_machine.rs +56 -19
  57. package/sdk-core/core/src/workflow/machines/transition_coverage.rs +5 -0
  58. package/sdk-core/core/src/workflow/machines/upsert_search_attributes_state_machine.rs +230 -22
  59. package/sdk-core/core/src/workflow/machines/workflow_machines.rs +81 -115
  60. package/sdk-core/core/src/workflow/machines/workflow_task_state_machine.rs +4 -4
  61. package/sdk-core/core/src/workflow/mod.rs +13 -1
  62. package/sdk-core/core/src/workflow/workflow_tasks/mod.rs +43 -33
  63. package/sdk-core/core-api/Cargo.toml +9 -1
  64. package/sdk-core/core-api/LICENSE.txt +23 -0
  65. package/sdk-core/core-api/src/errors.rs +7 -38
  66. package/sdk-core/core-api/src/lib.rs +44 -52
  67. package/sdk-core/core-api/src/worker.rs +10 -2
  68. package/sdk-core/etc/deps.svg +127 -96
  69. package/sdk-core/protos/api_upstream/temporal/api/command/v1/message.proto +11 -7
  70. package/sdk-core/protos/api_upstream/temporal/api/enums/v1/failed_cause.proto +10 -0
  71. package/sdk-core/protos/api_upstream/temporal/api/enums/v1/namespace.proto +6 -1
  72. package/sdk-core/protos/api_upstream/temporal/api/enums/v1/workflow.proto +6 -0
  73. package/sdk-core/protos/api_upstream/temporal/api/errordetails/v1/message.proto +6 -0
  74. package/sdk-core/protos/api_upstream/temporal/api/history/v1/message.proto +2 -1
  75. package/sdk-core/protos/api_upstream/temporal/api/replication/v1/message.proto +3 -0
  76. package/sdk-core/protos/api_upstream/temporal/api/workflow/v1/message.proto +12 -0
  77. package/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/request_response.proto +25 -0
  78. package/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/service.proto +4 -0
  79. package/sdk-core/protos/local/temporal/sdk/core/bridge/bridge.proto +19 -35
  80. package/sdk-core/protos/local/temporal/sdk/core/core_interface.proto +2 -6
  81. package/sdk-core/protos/local/temporal/sdk/core/workflow_activation/workflow_activation.proto +53 -11
  82. package/sdk-core/protos/local/temporal/sdk/core/workflow_commands/workflow_commands.proto +14 -7
  83. package/sdk-core/protos/local/temporal/sdk/core/workflow_completion/workflow_completion.proto +3 -5
  84. package/sdk-core/sdk/Cargo.toml +16 -2
  85. package/sdk-core/sdk/LICENSE.txt +23 -0
  86. package/sdk-core/sdk/src/interceptors.rs +11 -0
  87. package/sdk-core/sdk/src/lib.rs +138 -150
  88. package/sdk-core/sdk/src/workflow_context/options.rs +86 -1
  89. package/sdk-core/sdk/src/workflow_context.rs +36 -17
  90. package/sdk-core/sdk/src/workflow_future.rs +19 -25
  91. package/sdk-core/sdk-core-protos/Cargo.toml +1 -1
  92. package/sdk-core/sdk-core-protos/build.rs +1 -0
  93. package/sdk-core/sdk-core-protos/src/history_info.rs +17 -4
  94. package/sdk-core/sdk-core-protos/src/lib.rs +251 -47
  95. package/sdk-core/test-utils/Cargo.toml +3 -1
  96. package/sdk-core/test-utils/src/canned_histories.rs +27 -0
  97. package/sdk-core/test-utils/src/histfetch.rs +3 -3
  98. package/sdk-core/test-utils/src/lib.rs +223 -68
  99. package/sdk-core/tests/integ_tests/client_tests.rs +27 -4
  100. package/sdk-core/tests/integ_tests/heartbeat_tests.rs +93 -14
  101. package/sdk-core/tests/integ_tests/polling_tests.rs +18 -12
  102. package/sdk-core/tests/integ_tests/queries_tests.rs +50 -53
  103. package/sdk-core/tests/integ_tests/workflow_tests/activities.rs +117 -103
  104. package/sdk-core/tests/integ_tests/workflow_tests/cancel_external.rs +8 -1
  105. package/sdk-core/tests/integ_tests/workflow_tests/cancel_wf.rs +10 -5
  106. package/sdk-core/tests/integ_tests/workflow_tests/child_workflows.rs +7 -1
  107. package/sdk-core/tests/integ_tests/workflow_tests/continue_as_new.rs +8 -3
  108. package/sdk-core/tests/integ_tests/workflow_tests/determinism.rs +7 -1
  109. package/sdk-core/tests/integ_tests/workflow_tests/local_activities.rs +76 -15
  110. package/sdk-core/tests/integ_tests/workflow_tests/patches.rs +19 -3
  111. package/sdk-core/tests/integ_tests/workflow_tests/replay.rs +39 -42
  112. package/sdk-core/tests/integ_tests/workflow_tests/resets.rs +84 -0
  113. package/sdk-core/tests/integ_tests/workflow_tests/signals.rs +30 -8
  114. package/sdk-core/tests/integ_tests/workflow_tests/stickyness.rs +21 -6
  115. package/sdk-core/tests/integ_tests/workflow_tests/timers.rs +26 -16
  116. package/sdk-core/tests/integ_tests/workflow_tests/upsert_search_attrs.rs +66 -0
  117. package/sdk-core/tests/integ_tests/workflow_tests.rs +78 -74
  118. package/sdk-core/tests/load_tests.rs +9 -6
  119. package/sdk-core/tests/main.rs +43 -10
  120. package/src/conversions.rs +7 -12
  121. package/src/lib.rs +322 -357
  122. package/sdk-core/client/src/mocks.rs +0 -167
  123. package/sdk-core/core/src/worker/dispatcher.rs +0 -171
  124. package/sdk-core/protos/local/temporal/sdk/core/bridge/service.proto +0 -61
@@ -1,156 +1,187 @@
1
1
  <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
2
  <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
3
3
  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4
- <!-- Generated by graphviz version 2.50.0 (0)
4
+ <!-- Generated by graphviz version 2.43.0 (0)
5
5
  -->
6
- <!-- Pages: 1 -->
7
- <svg width="421pt" height="404pt"
8
- viewBox="0.00 0.00 420.50 404.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
9
- <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 400)">
10
- <polygon fill="white" stroke="transparent" points="-4,4 -4,-400 416.5,-400 416.5,4 -4,4"/>
6
+ <!-- Title: %3 Pages: 1 -->
7
+ <svg width="525pt" height="476pt"
8
+ viewBox="0.00 0.00 524.50 476.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
9
+ <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 472)">
10
+ <title>%3</title>
11
+ <polygon fill="white" stroke="transparent" points="-4,4 -4,-472 520.5,-472 520.5,4 -4,4"/>
11
12
  <!-- 0 -->
12
13
  <g id="node1" class="node">
13
14
  <title>0</title>
14
- <polygon fill="none" stroke="black" points="248,-396 132,-396 132,-360 248,-360 248,-396"/>
15
- <text text-anchor="middle" x="190" y="-374.3" font-family="Times,serif" font-size="14.00">temporal&#45;sdk&#45;core</text>
15
+ <polygon fill="none" stroke="black" points="173,-468 0,-468 0,-432 173,-432 173,-468"/>
16
+ <text text-anchor="middle" x="86.5" y="-446.3" font-family="Times,serif" font-size="14.00">temporal&#45;sdk&#45;core&#45;bridge&#45;ffi</text>
16
17
  </g>
17
18
  <!-- 1 -->
18
19
  <g id="node2" class="node">
19
20
  <title>1</title>
20
- <polygon fill="none" stroke="black" points="58,-324 0,-324 0,-288 58,-288 58,-324"/>
21
- <text text-anchor="middle" x="29" y="-302.3" font-family="Times,serif" font-size="14.00">rustfsm</text>
21
+ <polygon fill="none" stroke="black" points="369.5,-396 253.5,-396 253.5,-360 369.5,-360 369.5,-396"/>
22
+ <text text-anchor="middle" x="311.5" y="-374.3" font-family="Times,serif" font-size="14.00">temporal&#45;sdk&#45;core</text>
22
23
  </g>
23
24
  <!-- 0&#45;&gt;1 -->
24
25
  <g id="edge1" class="edge">
25
26
  <title>0&#45;&gt;1</title>
26
- <path fill="none" stroke="black" d="M150.61,-359.88C125.27,-348.86 92.5,-334.61 67.36,-323.68"/>
27
- <polygon fill="black" stroke="black" points="68.7,-320.44 58.13,-319.67 65.91,-326.86 68.7,-320.44"/>
28
- </g>
29
- <!-- 4 -->
30
- <g id="node3" class="node">
31
- <title>4</title>
32
- <polygon fill="none" stroke="black" points="214,-108 114,-108 114,-72 214,-72 214,-108"/>
33
- <text text-anchor="middle" x="164" y="-86.3" font-family="Times,serif" font-size="14.00">temporal&#45;client</text>
34
- </g>
35
- <!-- 0&#45;&gt;4 -->
36
- <g id="edge2" class="edge">
37
- <title>0&#45;&gt;4</title>
38
- <path fill="none" stroke="black" d="M181.7,-359.96C171.44,-325.92 157.74,-247.02 153,-180 151.87,-164.04 152.7,-160 153,-144 153.16,-135.58 153.46,-126.42 154.19,-118.12"/>
39
- <polygon fill="black" stroke="black" points="157.67,-118.52 155.37,-108.18 150.71,-117.7 157.67,-118.52"/>
40
- </g>
41
- <!-- 0&#45;&gt;4 -->
42
- <g id="edge3" class="edge">
43
- <title>0&#45;&gt;4</title>
44
- <path fill="none" stroke="blue" d="M191.8,-359.96C189.44,-325.92 175.74,-247.02 171,-180 169.87,-164.04 170.7,-160 171,-144 171.16,-135.68 171.45,-126.63 171.37,-118.4"/>
45
- <polygon fill="blue" stroke="blue" points="174.86,-118.05 171.01,-108.18 167.87,-118.3 174.86,-118.05"/>
46
- </g>
47
- <!-- 5 -->
48
- <g id="node4" class="node">
49
- <title>5</title>
50
- <polygon fill="none" stroke="black" points="319.5,-36 164.5,-36 164.5,0 319.5,0 319.5,-36"/>
51
- <text text-anchor="middle" x="242" y="-14.3" font-family="Times,serif" font-size="14.00">temporal&#45;sdk&#45;core&#45;protos</text>
52
- </g>
53
- <!-- 0&#45;&gt;5 -->
54
- <g id="edge6" class="edge">
55
- <title>0&#45;&gt;5</title>
56
- <path fill="none" stroke="black" d="M165.88,-359.82C135.16,-335.73 86,-288.78 86,-235 86,-235 86,-235 86,-161 86,-120.55 78.76,-102.78 105,-72 118.09,-56.64 136.18,-45.72 154.93,-37.95"/>
57
- <polygon fill="black" stroke="black" points="156.39,-41.14 164.46,-34.27 153.87,-34.6 156.39,-41.14"/>
27
+ <path fill="none" stroke="black" d="M141.25,-431.97C173.1,-422.06 213.42,-409.51 246.83,-399.12"/>
28
+ <polygon fill="black" stroke="black" points="247.99,-402.42 256.5,-396.11 245.91,-395.74 247.99,-402.42"/>
58
29
  </g>
59
30
  <!-- 6 -->
60
31
  <g id="node5" class="node">
61
32
  <title>6</title>
62
- <polygon fill="none" stroke="black" points="307.5,-180 170.5,-180 170.5,-144 307.5,-144 307.5,-180"/>
63
- <text text-anchor="middle" x="239" y="-158.3" font-family="Times,serif" font-size="14.00">temporal&#45;sdk&#45;core&#45;api</text>
33
+ <polygon fill="none" stroke="black" points="401,-36 246,-36 246,0 401,0 401,-36"/>
34
+ <text text-anchor="middle" x="323.5" y="-14.3" font-family="Times,serif" font-size="14.00">temporal&#45;sdk&#45;core&#45;protos</text>
64
35
  </g>
65
36
  <!-- 0&#45;&gt;6 -->
66
- <g id="edge5" class="edge">
37
+ <g id="edge3" class="edge">
67
38
  <title>0&#45;&gt;6</title>
68
- <path fill="none" stroke="black" d="M193.8,-359.93C197.8,-342.01 204.29,-313.01 210,-288 217.68,-254.36 226.68,-215.68 232.6,-190.36"/>
69
- <polygon fill="black" stroke="black" points="236.06,-190.92 234.93,-180.38 229.24,-189.32 236.06,-190.92"/>
39
+ <path fill="none" stroke="black" d="M78.81,-431.91C67.71,-405.62 48.5,-353.45 48.5,-307 48.5,-307 48.5,-307 48.5,-161 48.5,-75.33 155.16,-41.29 235.63,-27.8"/>
40
+ <polygon fill="black" stroke="black" points="236.47,-31.21 245.8,-26.18 235.37,-24.3 236.47,-31.21"/>
70
41
  </g>
71
42
  <!-- 7 -->
72
43
  <g id="node6" class="node">
73
44
  <title>7</title>
74
- <polygon fill="none" stroke="black" points="412.5,-252 323.5,-252 323.5,-216 412.5,-216 412.5,-252"/>
75
- <text text-anchor="middle" x="368" y="-230.3" font-family="Times,serif" font-size="14.00">temporal&#45;sdk</text>
45
+ <polygon fill="none" stroke="black" points="266,-180 129,-180 129,-144 266,-144 266,-180"/>
46
+ <text text-anchor="middle" x="197.5" y="-158.3" font-family="Times,serif" font-size="14.00">temporal&#45;sdk&#45;core&#45;api</text>
76
47
  </g>
77
48
  <!-- 0&#45;&gt;7 -->
78
- <g id="edge4" class="edge">
49
+ <g id="edge2" class="edge">
79
50
  <title>0&#45;&gt;7</title>
80
- <path fill="none" stroke="blue" d="M224.19,-359.83C242.9,-350.78 265.76,-338.54 284,-324 307.09,-305.6 328.26,-279.21 343.85,-259.94"/>
81
- <polygon fill="blue" stroke="blue" points="346.58,-262.13 350.18,-252.17 341.15,-257.71 346.58,-262.13"/>
51
+ <path fill="none" stroke="black" d="M85.71,-431.86C84.92,-401.65 85.97,-337.48 105.5,-288 120.88,-249.04 151.5,-211.31 173.18,-187.68"/>
52
+ <polygon fill="black" stroke="black" points="175.88,-189.92 180.16,-180.23 170.77,-185.14 175.88,-189.92"/>
53
+ </g>
54
+ <!-- 2 -->
55
+ <g id="node3" class="node">
56
+ <title>2</title>
57
+ <polygon fill="none" stroke="black" points="172.5,-324 114.5,-324 114.5,-288 172.5,-288 172.5,-324"/>
58
+ <text text-anchor="middle" x="143.5" y="-302.3" font-family="Times,serif" font-size="14.00">rustfsm</text>
59
+ </g>
60
+ <!-- 1&#45;&gt;2 -->
61
+ <g id="edge4" class="edge">
62
+ <title>1&#45;&gt;2</title>
63
+ <path fill="none" stroke="black" d="M270.4,-359.88C243.41,-348.63 208.34,-334.02 181.91,-323"/>
64
+ <polygon fill="black" stroke="black" points="183.17,-319.74 172.59,-319.12 180.47,-326.2 183.17,-319.74"/>
65
+ </g>
66
+ <!-- 5 -->
67
+ <g id="node4" class="node">
68
+ <title>5</title>
69
+ <polygon fill="none" stroke="black" points="412.5,-108 312.5,-108 312.5,-72 412.5,-72 412.5,-108"/>
70
+ <text text-anchor="middle" x="362.5" y="-86.3" font-family="Times,serif" font-size="14.00">temporal&#45;client</text>
71
+ </g>
72
+ <!-- 1&#45;&gt;5 -->
73
+ <g id="edge5" class="edge">
74
+ <title>1&#45;&gt;5</title>
75
+ <path fill="none" stroke="black" d="M369.63,-361.71C391.38,-353.54 414.82,-341.45 431.5,-324 455.23,-299.18 453.17,-285.75 459.5,-252 462.45,-236.27 464.68,-231.14 459.5,-216 445.69,-175.67 412.97,-138.29 389.35,-115.12"/>
76
+ <polygon fill="black" stroke="black" points="391.67,-112.5 382.03,-108.11 386.83,-117.55 391.67,-112.5"/>
77
+ </g>
78
+ <!-- 1&#45;&gt;6 -->
79
+ <g id="edge8" class="edge">
80
+ <title>1&#45;&gt;6</title>
81
+ <path fill="none" stroke="black" d="M369.7,-363.34C430.3,-345.24 516.5,-306.87 516.5,-235 516.5,-235 516.5,-235 516.5,-161 516.5,-98.28 449.55,-60.18 394.51,-39.46"/>
82
+ <polygon fill="black" stroke="black" points="395.69,-36.16 385.1,-36.04 393.3,-42.74 395.69,-36.16"/>
83
+ </g>
84
+ <!-- 1&#45;&gt;7 -->
85
+ <g id="edge7" class="edge">
86
+ <title>1&#45;&gt;7</title>
87
+ <path fill="none" stroke="black" d="M264.03,-359.96C247.39,-351.64 230.2,-339.91 219.5,-324 192.37,-283.65 191.8,-224.66 194.32,-190.41"/>
88
+ <polygon fill="black" stroke="black" points="197.83,-190.49 195.22,-180.22 190.86,-189.87 197.83,-190.49"/>
82
89
  </g>
83
90
  <!-- 8 -->
84
91
  <g id="node7" class="node">
85
92
  <title>8</title>
86
- <polygon fill="none" stroke="black" points="283.5,-324 218.5,-324 218.5,-288 283.5,-288 283.5,-324"/>
87
- <text text-anchor="middle" x="251" y="-302.3" font-family="Times,serif" font-size="14.00">test_utils</text>
93
+ <polygon fill="none" stroke="black" points="450,-252 361,-252 361,-216 450,-216 450,-252"/>
94
+ <text text-anchor="middle" x="405.5" y="-230.3" font-family="Times,serif" font-size="14.00">temporal&#45;sdk</text>
88
95
  </g>
89
- <!-- 0&#45;&gt;8 -->
90
- <g id="edge7" class="edge">
91
- <title>0&#45;&gt;8</title>
92
- <path fill="none" stroke="blue" d="M199.16,-359.7C205.68,-351.22 214.51,-340.86 223.1,-331.58"/>
93
- <polygon fill="blue" stroke="blue" points="225.85,-333.77 230.2,-324.1 220.78,-328.95 225.85,-333.77"/>
96
+ <!-- 1&#45;&gt;8 -->
97
+ <g id="edge6" class="edge">
98
+ <title>1&#45;&gt;8</title>
99
+ <path fill="none" stroke="blue" d="M354.05,-359.78C369.82,-351.61 386.07,-340.02 395.5,-324 406.38,-305.52 405.76,-280.93 404.34,-262.27"/>
100
+ <polygon fill="blue" stroke="blue" points="407.81,-261.75 403.49,-252.07 400.83,-262.32 407.81,-261.75"/>
94
101
  </g>
95
- <!-- 4&#45;&gt;5 -->
96
- <g id="edge8" class="edge">
97
- <title>4&#45;&gt;5</title>
98
- <path fill="none" stroke="black" d="M183.28,-71.7C192.92,-63.05 204.73,-52.45 215.23,-43.03"/>
99
- <polygon fill="black" stroke="black" points="217.84,-45.39 222.94,-36.1 213.16,-40.18 217.84,-45.39"/>
102
+ <!-- 9 -->
103
+ <g id="node8" class="node">
104
+ <title>9</title>
105
+ <polygon fill="none" stroke="black" points="395,-324 228,-324 228,-288 395,-288 395,-324"/>
106
+ <text text-anchor="middle" x="311.5" y="-302.3" font-family="Times,serif" font-size="14.00">temporal&#45;sdk&#45;core&#45;test&#45;utils</text>
100
107
  </g>
101
- <!-- 6&#45;&gt;4 -->
108
+ <!-- 1&#45;&gt;9 -->
102
109
  <g id="edge9" class="edge">
103
- <title>6&#45;&gt;4</title>
104
- <path fill="none" stroke="black" d="M220.46,-143.7C211.2,-135.05 199.84,-124.45 189.74,-115.03"/>
105
- <polygon fill="black" stroke="black" points="192.02,-112.37 182.33,-108.1 187.25,-117.49 192.02,-112.37"/>
110
+ <title>1&#45;&gt;9</title>
111
+ <path fill="none" stroke="blue" d="M305.58,-359.7C304.79,-351.98 304.56,-342.71 304.9,-334.11"/>
112
+ <polygon fill="blue" stroke="blue" points="308.4,-334.32 305.6,-324.1 301.42,-333.84 308.4,-334.32"/>
106
113
  </g>
107
- <!-- 6&#45;&gt;5 -->
114
+ <!-- 5&#45;&gt;6 -->
108
115
  <g id="edge10" class="edge">
109
- <title>6&#45;&gt;5</title>
110
- <path fill="none" stroke="black" d="M239.36,-143.87C239.87,-119.67 240.81,-75.21 241.42,-46.39"/>
111
- <polygon fill="black" stroke="black" points="244.92,-46.26 241.64,-36.19 237.93,-46.11 244.92,-46.26"/>
112
- </g>
113
- <!-- 7&#45;&gt;0 -->
114
- <g id="edge11" class="edge">
115
- <title>7&#45;&gt;0</title>
116
- <path fill="none" stroke="black" d="M363.18,-252.17C352.26,-271.5 328.39,-302.97 302,-324 286.4,-336.43 267.42,-347.19 249.5,-355.7"/>
117
- <polygon fill="black" stroke="black" points="247.88,-352.6 240.25,-359.95 250.8,-358.96 247.88,-352.6"/>
116
+ <title>5&#45;&gt;6</title>
117
+ <path fill="none" stroke="black" d="M352.86,-71.7C348.37,-63.64 342.94,-53.89 337.98,-44.98"/>
118
+ <polygon fill="black" stroke="black" points="340.95,-43.14 333.03,-36.1 334.84,-46.54 340.95,-43.14"/>
118
119
  </g>
119
120
  <!-- 7&#45;&gt;5 -->
120
- <g id="edge13" class="edge">
121
+ <g id="edge11" class="edge">
121
122
  <title>7&#45;&gt;5</title>
122
- <path fill="none" stroke="black" d="M371.05,-215.88C375.69,-184.29 380.99,-116.06 350,-72 340.45,-58.42 326.41,-48.16 311.6,-40.47"/>
123
- <polygon fill="black" stroke="black" points="312.84,-37.19 302.31,-36.01 309.81,-43.5 312.84,-37.19"/>
123
+ <path fill="none" stroke="black" d="M237.86,-143.88C260.52,-134.26 288.97,-122.19 312.97,-112.01"/>
124
+ <polygon fill="black" stroke="black" points="314.43,-115.2 322.27,-108.07 311.69,-108.75 314.43,-115.2"/>
124
125
  </g>
125
126
  <!-- 7&#45;&gt;6 -->
126
127
  <g id="edge12" class="edge">
127
128
  <title>7&#45;&gt;6</title>
128
- <path fill="none" stroke="black" d="M336.44,-215.88C319.34,-206.6 298.02,-195.03 279.68,-185.08"/>
129
- <polygon fill="black" stroke="black" points="281.14,-181.88 270.68,-180.19 277.8,-188.04 281.14,-181.88"/>
129
+ <path fill="none" stroke="black" d="M210.74,-143.85C225.01,-125.62 248.63,-96.14 270.5,-72 279.24,-62.36 289.24,-52.16 298.18,-43.31"/>
130
+ <polygon fill="black" stroke="black" points="300.7,-45.74 305.39,-36.24 295.8,-40.75 300.7,-45.74"/>
130
131
  </g>
131
- <!-- 8&#45;&gt;0 -->
132
- <g id="edge15" class="edge">
133
- <title>8&#45;&gt;0</title>
134
- <path fill="none" stroke="black" d="M241.99,-324.1C235.51,-332.55 226.69,-342.9 218.1,-352.2"/>
135
- <polygon fill="black" stroke="black" points="215.33,-350.03 210.99,-359.7 220.41,-354.85 215.33,-350.03"/>
132
+ <!-- 8&#45;&gt;1 -->
133
+ <g id="edge14" class="edge">
134
+ <title>8&#45;&gt;1</title>
135
+ <path fill="none" stroke="black" d="M416.59,-252.07C423.07,-271.04 426.51,-301.89 413.5,-324 405.57,-337.47 392.82,-347.8 378.95,-355.62"/>
136
+ <polygon fill="black" stroke="black" points="376.99,-352.69 369.71,-360.39 380.2,-358.91 376.99,-352.69"/>
136
137
  </g>
137
138
  <!-- 8&#45;&gt;5 -->
138
- <g id="edge17" class="edge">
139
+ <g id="edge13" class="edge">
139
140
  <title>8&#45;&gt;5</title>
140
- <path fill="none" stroke="black" d="M266.47,-287.62C290.36,-258.6 332,-198.15 317,-144 306.53,-106.2 281.25,-68.36 262.93,-44.38"/>
141
- <polygon fill="black" stroke="black" points="265.45,-41.92 256.54,-36.2 259.94,-46.23 265.45,-41.92"/>
141
+ <path fill="none" stroke="black" d="M400.31,-215.87C392.95,-191.56 379.4,-146.82 370.68,-118.01"/>
142
+ <polygon fill="black" stroke="black" points="373.95,-116.75 367.71,-108.19 367.25,-118.77 373.95,-116.75"/>
142
143
  </g>
143
144
  <!-- 8&#45;&gt;6 -->
144
145
  <g id="edge16" class="edge">
145
146
  <title>8&#45;&gt;6</title>
146
- <path fill="none" stroke="black" d="M249.55,-287.87C247.51,-263.67 243.75,-219.21 241.31,-190.39"/>
147
- <polygon fill="black" stroke="black" points="244.78,-189.86 240.45,-180.19 237.81,-190.45 244.78,-189.86"/>
147
+ <path fill="none" stroke="black" d="M413.59,-215.56C426.78,-184.32 448.83,-117.84 421.5,-72 413.54,-58.64 400.91,-48.45 387.34,-40.75"/>
148
+ <polygon fill="black" stroke="black" points="388.8,-37.56 378.32,-36.04 385.56,-43.77 388.8,-37.56"/>
148
149
  </g>
149
150
  <!-- 8&#45;&gt;7 -->
150
- <g id="edge14" class="edge">
151
+ <g id="edge15" class="edge">
151
152
  <title>8&#45;&gt;7</title>
152
- <path fill="none" stroke="black" d="M279.62,-287.88C294.92,-278.72 313.94,-267.34 330.42,-257.48"/>
153
- <polygon fill="black" stroke="black" points="332.48,-260.33 339.27,-252.19 328.89,-254.32 332.48,-260.33"/>
153
+ <path fill="none" stroke="black" d="M360.88,-217.98C330.78,-207.86 290.71,-194.37 257.79,-183.29"/>
154
+ <polygon fill="black" stroke="black" points="258.86,-179.96 248.26,-180.08 256.62,-186.59 258.86,-179.96"/>
155
+ </g>
156
+ <!-- 9&#45;&gt;1 -->
157
+ <g id="edge19" class="edge">
158
+ <title>9&#45;&gt;1</title>
159
+ <path fill="none" stroke="black" d="M317.4,-324.1C318.2,-331.79 318.44,-341.05 318.1,-349.67"/>
160
+ <polygon fill="black" stroke="black" points="314.61,-349.48 317.42,-359.7 321.59,-349.96 314.61,-349.48"/>
161
+ </g>
162
+ <!-- 9&#45;&gt;5 -->
163
+ <g id="edge17" class="edge">
164
+ <title>9&#45;&gt;5</title>
165
+ <path fill="none" stroke="black" d="M315.59,-287.85C324.43,-250.75 345.39,-162.81 356.04,-118.1"/>
166
+ <polygon fill="black" stroke="black" points="359.48,-118.77 358.39,-108.23 352.67,-117.15 359.48,-118.77"/>
167
+ </g>
168
+ <!-- 9&#45;&gt;6 -->
169
+ <g id="edge21" class="edge">
170
+ <title>9&#45;&gt;6</title>
171
+ <path fill="none" stroke="black" d="M308.43,-287.86C302.03,-249.05 288.97,-151.64 303.5,-72 305.11,-63.2 308.1,-53.95 311.29,-45.7"/>
172
+ <polygon fill="black" stroke="black" points="314.62,-46.79 315.19,-36.21 308.15,-44.12 314.62,-46.79"/>
173
+ </g>
174
+ <!-- 9&#45;&gt;7 -->
175
+ <g id="edge20" class="edge">
176
+ <title>9&#45;&gt;7</title>
177
+ <path fill="none" stroke="black" d="M297.75,-287.87C277.81,-263.03 240.73,-216.85 217.68,-188.14"/>
178
+ <polygon fill="black" stroke="black" points="220.29,-185.8 211.3,-180.19 214.83,-190.18 220.29,-185.8"/>
179
+ </g>
180
+ <!-- 9&#45;&gt;8 -->
181
+ <g id="edge18" class="edge">
182
+ <title>9&#45;&gt;8</title>
183
+ <path fill="none" stroke="black" d="M334.74,-287.7C346.69,-278.8 361.42,-267.82 374.35,-258.2"/>
184
+ <polygon fill="black" stroke="black" points="376.6,-260.88 382.53,-252.1 372.42,-255.27 376.6,-260.88"/>
154
185
  </g>
155
186
  </g>
156
187
  </svg>
@@ -48,17 +48,21 @@ message ScheduleActivityTaskCommandAttributes {
48
48
  temporal.api.taskqueue.v1.TaskQueue task_queue = 4;
49
49
  temporal.api.common.v1.Header header = 5;
50
50
  temporal.api.common.v1.Payloads input = 6;
51
- // Indicates how long the caller is willing to wait for activity completion. Limits how long
52
- // retries will be attempted. Either this or `start_to_close_timeout` must be specified. When
53
- // not specified, defaults to the workflow execution timeout.
51
+ // Indicates how long the caller is willing to wait for activity completion. The "schedule" time
52
+ // is when the activity is initially scheduled, not when the most recent retry is scheduled.
53
+ // Limits how long retries will be attempted. Either this or `start_to_close_timeout` must be
54
+ // specified. When not specified, defaults to the workflow execution timeout.
54
55
  //
55
56
  // (-- api-linter: core::0140::prepositions=disabled
56
57
  // aip.dev/not-precedent: "to" is used to indicate interval. --)
57
58
  google.protobuf.Duration schedule_to_close_timeout = 7 [(gogoproto.stdduration) = true];
58
- // Limits the time an activity task can stay in a task queue before a worker picks it up. This
59
- // timeout is always non retryable, as all a retry would achieve is to put it back into the same
60
- // queue. Defaults to `schedule_to_close_timeout` or workflow execution timeout if that is not
61
- // specified.
59
+ // Limits the time an activity task can stay in a task queue before a worker picks it up. The
60
+ // "schedule" time is when the most recent retry is scheduled. This timeout should usually not
61
+ // be set: it's useful in specific scenarios like worker-specific task queues. This timeout is
62
+ // always non retryable, as all a retry would achieve is to put it back into the same queue.
63
+ // Defaults to `schedule_to_close_timeout` or workflow execution timeout if that is not
64
+ // specified. More info:
65
+ // https://docs.temporal.io/docs/content/what-is-a-schedule-to-start-timeout/
62
66
  //
63
67
  // (-- api-linter: core::0140::prepositions=disabled
64
68
  // aip.dev/not-precedent: "to" is used to indicate interval. --)
@@ -82,3 +82,13 @@ enum SignalExternalWorkflowExecutionFailedCause {
82
82
  SIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED = 0;
83
83
  SIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_EXTERNAL_WORKFLOW_EXECUTION_NOT_FOUND = 1;
84
84
  }
85
+
86
+ enum ResourceExhaustedCause {
87
+ RESOURCE_EXHAUSTED_CAUSE_UNSPECIFIED = 0;
88
+ // Caller exceeds request per second limit.
89
+ RESOURCE_EXHAUSTED_CAUSE_RPS_LIMIT = 1;
90
+ // Caller exceeds max concurrent request limit.
91
+ RESOURCE_EXHAUSTED_CAUSE_CONCURRENT_LIMIT = 2;
92
+ // System overloaded.
93
+ RESOURCE_EXHAUSTED_CAUSE_SYSTEM_OVERLOADED = 3;
94
+ }
@@ -36,7 +36,6 @@ enum NamespaceState {
36
36
  NAMESPACE_STATE_REGISTERED = 1;
37
37
  NAMESPACE_STATE_DEPRECATED = 2;
38
38
  NAMESPACE_STATE_DELETED = 3;
39
- NAMESPACE_STATE_HANDOVER = 4;
40
39
  }
41
40
 
42
41
  enum ArchivalState {
@@ -44,3 +43,9 @@ enum ArchivalState {
44
43
  ARCHIVAL_STATE_DISABLED = 1;
45
44
  ARCHIVAL_STATE_ENABLED = 2;
46
45
  }
46
+
47
+ enum ReplicationState {
48
+ REPLICATION_STATE_UNSPECIFIED = 0;
49
+ REPLICATION_STATE_NORMAL = 1;
50
+ REPLICATION_STATE_HANDOVER = 2;
51
+ }
@@ -87,6 +87,12 @@ enum PendingActivityState {
87
87
  PENDING_ACTIVITY_STATE_CANCEL_REQUESTED = 3;
88
88
  }
89
89
 
90
+ enum PendingWorkflowTaskState {
91
+ PENDING_WORKFLOW_TASK_STATE_UNSPECIFIED = 0;
92
+ PENDING_WORKFLOW_TASK_STATE_SCHEDULED = 1;
93
+ PENDING_WORKFLOW_TASK_STATE_STARTED = 2;
94
+ }
95
+
90
96
  enum HistoryEventFilterType {
91
97
  HISTORY_EVENT_FILTER_TYPE_UNSPECIFIED = 0;
92
98
  HISTORY_EVENT_FILTER_TYPE_ALL_EVENT = 1;
@@ -33,6 +33,8 @@ option java_outer_classname = "MessageProto";
33
33
  option ruby_package = "Temporal::Api::ErrorDetails::V1";
34
34
  option csharp_namespace = "Temporal.Api.ErrorDetails.V1";
35
35
 
36
+ import "temporal/api/enums/v1/failed_cause.proto";
37
+
36
38
  message NotFoundFailure {
37
39
  string current_cluster = 1;
38
40
  string active_cluster = 2;
@@ -72,3 +74,7 @@ message QueryFailedFailure {
72
74
  message PermissionDeniedFailure {
73
75
  string reason = 1;
74
76
  }
77
+
78
+ message ResourceExhaustedFailure {
79
+ temporal.api.enums.v1.ResourceExhaustedCause cause = 1;
80
+ }
@@ -81,7 +81,8 @@ message WorkflowExecutionStartedEventAttributes {
81
81
  google.protobuf.Timestamp workflow_execution_expiration_time = 19 [(gogoproto.stdtime) = true];
82
82
  // If this workflow runs on a cron schedule, it will appear here
83
83
  string cron_schedule = 20;
84
- // TODO: What is this? Appears unused.
84
+ // For a cron workflow, this contains the amount of time between when this iteration of
85
+ // the cron workflow was scheduled and when it should run next per its cron_schedule.
85
86
  google.protobuf.Duration first_workflow_task_backoff = 21 [(gogoproto.stdduration) = true];
86
87
  temporal.api.common.v1.Memo memo = 22;
87
88
  temporal.api.common.v1.SearchAttributes search_attributes = 23;
@@ -31,6 +31,8 @@ option java_outer_classname = "MessageProto";
31
31
  option ruby_package = "Temporal::Api::Replication::V1";
32
32
  option csharp_namespace = "Temporal.Api.Replication.V1";
33
33
 
34
+ import "temporal/api/enums/v1/namespace.proto";
35
+
34
36
  message ClusterReplicationConfig {
35
37
  string cluster_name = 1;
36
38
  }
@@ -38,4 +40,5 @@ message ClusterReplicationConfig {
38
40
  message NamespaceReplicationConfig {
39
41
  string active_cluster_name = 1;
40
42
  repeated ClusterReplicationConfig clusters = 2;
43
+ temporal.api.enums.v1.ReplicationState state = 3;
41
44
  }
@@ -89,6 +89,18 @@ message PendingChildExecutionInfo {
89
89
  temporal.api.enums.v1.ParentClosePolicy parent_close_policy = 5;
90
90
  }
91
91
 
92
+ message PendingWorkflowTaskInfo {
93
+ temporal.api.enums.v1.PendingWorkflowTaskState state = 1;
94
+ google.protobuf.Timestamp scheduled_time = 2 [(gogoproto.stdtime) = true];
95
+ // original_scheduled_time is the scheduled time of the first workflow task during workflow task heartbeat.
96
+ // Heartbeat workflow task is done by RespondWorkflowTaskComplete with ForceCreateNewWorkflowTask == true and no command
97
+ // In this case, OriginalScheduledTime won't change. Then when current time - original_scheduled_time exceeds
98
+ // some threshold, the workflow task will be forced timeout.
99
+ google.protobuf.Timestamp original_scheduled_time = 3 [(gogoproto.stdtime) = true];
100
+ google.protobuf.Timestamp started_time = 4 [(gogoproto.stdtime) = true];
101
+ int32 attempt = 5;
102
+ }
103
+
92
104
  message ResetPoints {
93
105
  repeated ResetPointInfo points = 1;
94
106
  }
@@ -708,6 +708,7 @@ message DescribeWorkflowExecutionResponse {
708
708
  temporal.api.workflow.v1.WorkflowExecutionInfo workflow_execution_info = 2;
709
709
  repeated temporal.api.workflow.v1.PendingActivityInfo pending_activities = 3;
710
710
  repeated temporal.api.workflow.v1.PendingChildExecutionInfo pending_children = 4;
711
+ temporal.api.workflow.v1.PendingWorkflowTaskInfo pending_workflow_task = 5;
711
712
  }
712
713
 
713
714
  message DescribeTaskQueueRequest {
@@ -739,6 +740,30 @@ message GetClusterInfoResponse {
739
740
  string visibility_store = 8;
740
741
  }
741
742
 
743
+ message GetSystemInfoRequest {
744
+ }
745
+
746
+ message GetSystemInfoResponse {
747
+ // Version of the server.
748
+ string server_version = 1;
749
+
750
+ // All capabilities the system supports.
751
+ Capabilities capabilities = 2;
752
+
753
+ // System capability details.
754
+ message Capabilities {
755
+ // True if signal and query headers are supported.
756
+ bool signal_and_query_header = 1;
757
+
758
+ // True if internal errors are differentiated from other types of errors for purposes of
759
+ // retrying non-internal errors.
760
+ //
761
+ // When unset/false, clients retry all failures. When true, clients should only retry
762
+ // non-internal errors.
763
+ bool internal_error_differentiation = 2;
764
+ }
765
+ }
766
+
742
767
  message ListTaskQueuePartitionsRequest {
743
768
  string namespace = 1;
744
769
  temporal.api.taskqueue.v1.TaskQueue task_queue = 2;
@@ -312,6 +312,10 @@ service WorkflowService {
312
312
  rpc GetClusterInfo(GetClusterInfoRequest) returns (GetClusterInfoResponse){
313
313
  }
314
314
 
315
+ // GetSystemInfo returns information about the system.
316
+ rpc GetSystemInfo(GetSystemInfoRequest) returns (GetSystemInfoResponse) {
317
+ }
318
+
315
319
  rpc ListTaskQueuePartitions(ListTaskQueuePartitionsRequest) returns (ListTaskQueuePartitionsResponse) {
316
320
  }
317
321
  }
@@ -20,21 +20,23 @@ enum LogLevel {
20
20
  TRACE = 6;
21
21
  }
22
22
 
23
- message InitRequest {
24
- GatewayOptions gateway_options = 1;
25
- TelemetryOptions telemetry_options = 2;
26
-
27
- message GatewayOptions {
28
- string target_url = 1;
29
- string namespace = 2;
30
- string client_name = 3;
31
- string client_version = 4;
32
- map<string, string> static_headers = 5;
33
- string identity = 6;
34
- string worker_binary_id = 7;
35
- TlsConfig tls_config = 8;
36
- RetryConfig retry_config = 9;
37
- }
23
+ message InitTelemetryRequest {
24
+ string otel_collector_url = 1;
25
+ string tracing_filter = 2;
26
+ LogLevel log_forwarding_level = 3;
27
+ string prometheus_export_bind_address = 4;
28
+ }
29
+
30
+ message CreateClientRequest {
31
+ string target_url = 1;
32
+ string namespace = 2;
33
+ string client_name = 3;
34
+ string client_version = 4;
35
+ map<string, string> static_headers = 5;
36
+ string identity = 6;
37
+ string worker_binary_id = 7;
38
+ TlsConfig tls_config = 8;
39
+ RetryConfig retry_config = 9;
38
40
 
39
41
  message TlsConfig {
40
42
  bytes server_root_ca_cert = 1;
@@ -51,13 +53,6 @@ message InitRequest {
51
53
  google.protobuf.Duration max_elapsed_time = 5;
52
54
  google.protobuf.UInt32Value max_retries = 6;
53
55
  }
54
-
55
- message TelemetryOptions {
56
- string otel_collector_url = 1;
57
- string tracing_filter = 2;
58
- LogLevel log_forwarding_level = 3;
59
- string prometheus_export_bind_address = 4;
60
- }
61
56
  }
62
57
 
63
58
  message InitResponse {
@@ -68,7 +63,7 @@ message InitResponse {
68
63
  }
69
64
  }
70
65
 
71
- message RegisterWorkerRequest {
66
+ message CreateWorkerRequest {
72
67
  string task_queue = 1;
73
68
  google.protobuf.UInt32Value max_cached_workflows = 2;
74
69
  google.protobuf.UInt32Value max_outstanding_workflow_tasks = 3;
@@ -88,12 +83,10 @@ message RegisterWorkerResponse {
88
83
 
89
84
  message Error {
90
85
  string message = 1;
91
- bool worker_already_registered = 2;
92
86
  }
93
87
  }
94
88
 
95
89
  message PollWorkflowActivationRequest {
96
- string task_queue = 1;
97
90
  }
98
91
 
99
92
  message PollWorkflowActivationResponse {
@@ -109,7 +102,6 @@ message PollWorkflowActivationResponse {
109
102
  }
110
103
 
111
104
  message PollActivityTaskRequest {
112
- string task_queue = 1;
113
105
  }
114
106
 
115
107
  message PollActivityTaskResponse {
@@ -161,8 +153,7 @@ message RecordActivityHeartbeatResponse {
161
153
  }
162
154
 
163
155
  message RequestWorkflowEvictionRequest {
164
- string task_queue = 1;
165
- string run_id = 2;
156
+ string run_id = 1;
166
157
  }
167
158
 
168
159
  message RequestWorkflowEvictionResponse {
@@ -173,14 +164,7 @@ message RequestWorkflowEvictionResponse {
173
164
  }
174
165
  }
175
166
 
176
- message ShutdownRequest {
177
- }
178
-
179
- message ShutdownResponse {
180
- }
181
-
182
167
  message ShutdownWorkerRequest {
183
- string task_queue = 1;
184
168
  }
185
169
 
186
170
  message ShutdownWorkerResponse {
@@ -19,15 +19,11 @@ import "temporal/sdk/core/workflow_completion/workflow_completion.proto";
19
19
  // A request as given to `record_activity_heartbeat`
20
20
  message ActivityHeartbeat {
21
21
  bytes task_token = 1;
22
- // The task queue / worker this activity is associated with
23
- string task_queue = 2;
24
- repeated common.Payload details = 3;
22
+ repeated common.Payload details = 2;
25
23
  }
26
24
 
27
25
  // A request as given to `complete_activity_task`
28
26
  message ActivityTaskCompletion {
29
27
  bytes task_token = 1;
30
- // The task queue / worker this task is associated with
31
- string task_queue = 2;
32
- activity_result.ActivityExecutionResult result = 3;
28
+ activity_result.ActivityExecutionResult result = 2;
33
29
  }