@temporalio/core-bridge 1.5.2 → 1.7.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 (194) hide show
  1. package/Cargo.lock +304 -112
  2. package/lib/index.d.ts +8 -6
  3. package/lib/index.js.map +1 -1
  4. package/package.json +9 -4
  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 +2 -2
  11. package/sdk-core/.buildkite/docker/docker-compose.yaml +1 -1
  12. package/sdk-core/.buildkite/pipeline.yml +2 -4
  13. package/sdk-core/.cargo/config.toml +5 -2
  14. package/sdk-core/.github/workflows/heavy.yml +29 -0
  15. package/sdk-core/Cargo.toml +1 -1
  16. package/sdk-core/README.md +20 -10
  17. package/sdk-core/client/src/lib.rs +215 -39
  18. package/sdk-core/client/src/metrics.rs +17 -8
  19. package/sdk-core/client/src/raw.rs +4 -4
  20. package/sdk-core/client/src/retry.rs +32 -20
  21. package/sdk-core/core/Cargo.toml +25 -12
  22. package/sdk-core/core/src/abstractions/take_cell.rs +28 -0
  23. package/sdk-core/core/src/abstractions.rs +204 -14
  24. package/sdk-core/core/src/core_tests/activity_tasks.rs +143 -50
  25. package/sdk-core/core/src/core_tests/child_workflows.rs +6 -5
  26. package/sdk-core/core/src/core_tests/determinism.rs +165 -2
  27. package/sdk-core/core/src/core_tests/local_activities.rs +431 -43
  28. package/sdk-core/core/src/core_tests/queries.rs +34 -16
  29. package/sdk-core/core/src/core_tests/workers.rs +8 -5
  30. package/sdk-core/core/src/core_tests/workflow_tasks.rs +588 -55
  31. package/sdk-core/core/src/ephemeral_server/mod.rs +113 -12
  32. package/sdk-core/core/src/internal_flags.rs +155 -0
  33. package/sdk-core/core/src/lib.rs +16 -9
  34. package/sdk-core/core/src/protosext/mod.rs +1 -1
  35. package/sdk-core/core/src/replay/mod.rs +16 -27
  36. package/sdk-core/core/src/telemetry/log_export.rs +1 -1
  37. package/sdk-core/core/src/telemetry/metrics.rs +69 -35
  38. package/sdk-core/core/src/telemetry/mod.rs +60 -21
  39. package/sdk-core/core/src/telemetry/prometheus_server.rs +19 -13
  40. package/sdk-core/core/src/test_help/mod.rs +73 -14
  41. package/sdk-core/core/src/worker/activities/activity_heartbeat_manager.rs +119 -160
  42. package/sdk-core/core/src/worker/activities/activity_task_poller_stream.rs +89 -0
  43. package/sdk-core/core/src/worker/activities/local_activities.rs +379 -129
  44. package/sdk-core/core/src/worker/activities.rs +350 -175
  45. package/sdk-core/core/src/worker/client/mocks.rs +22 -2
  46. package/sdk-core/core/src/worker/client.rs +18 -2
  47. package/sdk-core/core/src/worker/mod.rs +183 -64
  48. package/sdk-core/core/src/worker/workflow/bridge.rs +1 -3
  49. package/sdk-core/core/src/worker/workflow/driven_workflow.rs +3 -5
  50. package/sdk-core/core/src/worker/workflow/history_update.rs +916 -277
  51. package/sdk-core/core/src/worker/workflow/machines/activity_state_machine.rs +216 -183
  52. package/sdk-core/core/src/worker/workflow/machines/cancel_external_state_machine.rs +9 -12
  53. package/sdk-core/core/src/worker/workflow/machines/cancel_workflow_state_machine.rs +7 -9
  54. package/sdk-core/core/src/worker/workflow/machines/child_workflow_state_machine.rs +160 -87
  55. package/sdk-core/core/src/worker/workflow/machines/complete_workflow_state_machine.rs +13 -14
  56. package/sdk-core/core/src/worker/workflow/machines/continue_as_new_workflow_state_machine.rs +7 -9
  57. package/sdk-core/core/src/worker/workflow/machines/fail_workflow_state_machine.rs +14 -17
  58. package/sdk-core/core/src/worker/workflow/machines/local_activity_state_machine.rs +242 -110
  59. package/sdk-core/core/src/worker/workflow/machines/mod.rs +27 -19
  60. package/sdk-core/core/src/worker/workflow/machines/modify_workflow_properties_state_machine.rs +9 -11
  61. package/sdk-core/core/src/worker/workflow/machines/patch_state_machine.rs +321 -206
  62. package/sdk-core/core/src/worker/workflow/machines/signal_external_state_machine.rs +13 -18
  63. package/sdk-core/core/src/worker/workflow/machines/timer_state_machine.rs +20 -29
  64. package/sdk-core/core/src/worker/workflow/machines/transition_coverage.rs +2 -2
  65. package/sdk-core/core/src/worker/workflow/machines/upsert_search_attributes_state_machine.rs +257 -51
  66. package/sdk-core/core/src/worker/workflow/machines/workflow_machines/local_acts.rs +6 -17
  67. package/sdk-core/core/src/worker/workflow/machines/workflow_machines.rs +310 -150
  68. package/sdk-core/core/src/worker/workflow/machines/workflow_task_state_machine.rs +17 -20
  69. package/sdk-core/core/src/worker/workflow/managed_run/managed_wf_test.rs +31 -15
  70. package/sdk-core/core/src/worker/workflow/managed_run.rs +1052 -380
  71. package/sdk-core/core/src/worker/workflow/mod.rs +598 -390
  72. package/sdk-core/core/src/worker/workflow/run_cache.rs +40 -57
  73. package/sdk-core/core/src/worker/workflow/wft_extraction.rs +137 -0
  74. package/sdk-core/core/src/worker/workflow/wft_poller.rs +1 -4
  75. package/sdk-core/core/src/worker/workflow/workflow_stream/saved_wf_inputs.rs +117 -0
  76. package/sdk-core/core/src/worker/workflow/workflow_stream/tonic_status_serde.rs +24 -0
  77. package/sdk-core/core/src/worker/workflow/workflow_stream.rs +469 -718
  78. package/sdk-core/core-api/Cargo.toml +2 -1
  79. package/sdk-core/core-api/src/errors.rs +1 -34
  80. package/sdk-core/core-api/src/lib.rs +19 -9
  81. package/sdk-core/core-api/src/telemetry.rs +4 -6
  82. package/sdk-core/core-api/src/worker.rs +19 -1
  83. package/sdk-core/etc/deps.svg +115 -140
  84. package/sdk-core/etc/regen-depgraph.sh +5 -0
  85. package/sdk-core/fsm/rustfsm_procmacro/src/lib.rs +86 -61
  86. package/sdk-core/fsm/rustfsm_trait/src/lib.rs +29 -71
  87. package/sdk-core/histories/ends_empty_wft_complete.bin +0 -0
  88. package/sdk-core/histories/evict_while_la_running_no_interference-16_history.bin +0 -0
  89. package/sdk-core/histories/old_change_marker_format.bin +0 -0
  90. package/sdk-core/protos/api_upstream/.github/CODEOWNERS +2 -1
  91. package/sdk-core/protos/api_upstream/Makefile +6 -6
  92. package/sdk-core/protos/api_upstream/build/go.mod +7 -0
  93. package/sdk-core/protos/api_upstream/build/go.sum +5 -0
  94. package/sdk-core/protos/api_upstream/build/tools.go +29 -0
  95. package/sdk-core/protos/api_upstream/go.mod +6 -0
  96. package/sdk-core/protos/api_upstream/temporal/api/batch/v1/message.proto +9 -2
  97. package/sdk-core/protos/api_upstream/temporal/api/command/v1/message.proto +7 -26
  98. package/sdk-core/protos/api_upstream/temporal/api/common/v1/message.proto +13 -2
  99. package/sdk-core/protos/api_upstream/temporal/api/enums/v1/batch_operation.proto +3 -2
  100. package/sdk-core/protos/api_upstream/temporal/api/enums/v1/command_type.proto +3 -7
  101. package/sdk-core/protos/api_upstream/temporal/api/enums/v1/common.proto +3 -2
  102. package/sdk-core/protos/api_upstream/temporal/api/enums/v1/event_type.proto +8 -8
  103. package/sdk-core/protos/api_upstream/temporal/api/enums/v1/failed_cause.proto +25 -2
  104. package/sdk-core/protos/api_upstream/temporal/api/enums/v1/namespace.proto +2 -2
  105. package/sdk-core/protos/api_upstream/temporal/api/enums/v1/query.proto +2 -2
  106. package/sdk-core/protos/api_upstream/temporal/api/enums/v1/reset.proto +2 -2
  107. package/sdk-core/protos/api_upstream/temporal/api/enums/v1/schedule.proto +2 -2
  108. package/sdk-core/protos/api_upstream/temporal/api/enums/v1/task_queue.proto +2 -2
  109. package/sdk-core/protos/api_upstream/temporal/api/enums/v1/update.proto +24 -19
  110. package/sdk-core/protos/api_upstream/temporal/api/enums/v1/workflow.proto +2 -2
  111. package/sdk-core/protos/api_upstream/temporal/api/errordetails/v1/message.proto +2 -2
  112. package/sdk-core/protos/api_upstream/temporal/api/failure/v1/message.proto +2 -2
  113. package/sdk-core/protos/api_upstream/temporal/api/filter/v1/message.proto +2 -2
  114. package/sdk-core/protos/api_upstream/temporal/api/history/v1/message.proto +49 -26
  115. package/sdk-core/protos/api_upstream/temporal/api/namespace/v1/message.proto +4 -2
  116. package/sdk-core/protos/api_upstream/temporal/api/operatorservice/v1/request_response.proto +5 -2
  117. package/sdk-core/protos/api_upstream/temporal/api/operatorservice/v1/service.proto +2 -2
  118. package/sdk-core/protos/api_upstream/temporal/api/protocol/v1/message.proto +57 -0
  119. package/sdk-core/protos/api_upstream/temporal/api/query/v1/message.proto +2 -2
  120. package/sdk-core/protos/api_upstream/temporal/api/replication/v1/message.proto +2 -2
  121. package/sdk-core/protos/api_upstream/temporal/api/schedule/v1/message.proto +2 -2
  122. package/sdk-core/protos/api_upstream/temporal/api/sdk/v1/task_complete_metadata.proto +63 -0
  123. package/sdk-core/protos/api_upstream/temporal/api/taskqueue/v1/message.proto +2 -2
  124. package/sdk-core/protos/api_upstream/temporal/api/update/v1/message.proto +71 -6
  125. package/sdk-core/protos/api_upstream/temporal/api/version/v1/message.proto +2 -2
  126. package/sdk-core/protos/api_upstream/temporal/api/workflow/v1/message.proto +2 -2
  127. package/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/request_response.proto +64 -28
  128. package/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/service.proto +4 -4
  129. package/sdk-core/protos/local/temporal/sdk/core/activity_result/activity_result.proto +7 -8
  130. package/sdk-core/protos/local/temporal/sdk/core/activity_task/activity_task.proto +10 -7
  131. package/sdk-core/protos/local/temporal/sdk/core/child_workflow/child_workflow.proto +19 -30
  132. package/sdk-core/protos/local/temporal/sdk/core/common/common.proto +1 -0
  133. package/sdk-core/protos/local/temporal/sdk/core/core_interface.proto +1 -0
  134. package/sdk-core/protos/local/temporal/sdk/core/external_data/external_data.proto +8 -0
  135. package/sdk-core/protos/local/temporal/sdk/core/workflow_activation/workflow_activation.proto +67 -60
  136. package/sdk-core/protos/local/temporal/sdk/core/workflow_commands/workflow_commands.proto +85 -84
  137. package/sdk-core/protos/local/temporal/sdk/core/workflow_completion/workflow_completion.proto +9 -3
  138. package/sdk-core/protos/testsrv_upstream/temporal/api/testservice/v1/request_response.proto +2 -2
  139. package/sdk-core/protos/testsrv_upstream/temporal/api/testservice/v1/service.proto +2 -2
  140. package/sdk-core/sdk/Cargo.toml +5 -4
  141. package/sdk-core/sdk/src/lib.rs +108 -26
  142. package/sdk-core/sdk/src/workflow_context/options.rs +7 -1
  143. package/sdk-core/sdk/src/workflow_context.rs +24 -17
  144. package/sdk-core/sdk/src/workflow_future.rs +16 -15
  145. package/sdk-core/sdk-core-protos/Cargo.toml +5 -2
  146. package/sdk-core/sdk-core-protos/build.rs +36 -2
  147. package/sdk-core/sdk-core-protos/src/history_builder.rs +138 -106
  148. package/sdk-core/sdk-core-protos/src/history_info.rs +10 -1
  149. package/sdk-core/sdk-core-protos/src/lib.rs +272 -87
  150. package/sdk-core/sdk-core-protos/src/task_token.rs +12 -2
  151. package/sdk-core/test-utils/Cargo.toml +3 -1
  152. package/sdk-core/test-utils/src/canned_histories.rs +106 -296
  153. package/sdk-core/test-utils/src/histfetch.rs +1 -1
  154. package/sdk-core/test-utils/src/lib.rs +82 -23
  155. package/sdk-core/test-utils/src/wf_input_saver.rs +50 -0
  156. package/sdk-core/test-utils/src/workflows.rs +29 -0
  157. package/sdk-core/tests/fuzzy_workflow.rs +130 -0
  158. package/sdk-core/tests/{load_tests.rs → heavy_tests.rs} +125 -51
  159. package/sdk-core/tests/integ_tests/ephemeral_server_tests.rs +25 -3
  160. package/sdk-core/tests/integ_tests/heartbeat_tests.rs +10 -5
  161. package/sdk-core/tests/integ_tests/metrics_tests.rs +218 -16
  162. package/sdk-core/tests/integ_tests/polling_tests.rs +4 -47
  163. package/sdk-core/tests/integ_tests/queries_tests.rs +5 -128
  164. package/sdk-core/tests/integ_tests/visibility_tests.rs +83 -25
  165. package/sdk-core/tests/integ_tests/workflow_tests/activities.rs +161 -72
  166. package/sdk-core/tests/integ_tests/workflow_tests/cancel_external.rs +1 -0
  167. package/sdk-core/tests/integ_tests/workflow_tests/cancel_wf.rs +6 -13
  168. package/sdk-core/tests/integ_tests/workflow_tests/child_workflows.rs +80 -3
  169. package/sdk-core/tests/integ_tests/workflow_tests/continue_as_new.rs +6 -2
  170. package/sdk-core/tests/integ_tests/workflow_tests/determinism.rs +3 -10
  171. package/sdk-core/tests/integ_tests/workflow_tests/local_activities.rs +94 -200
  172. package/sdk-core/tests/integ_tests/workflow_tests/modify_wf_properties.rs +2 -4
  173. package/sdk-core/tests/integ_tests/workflow_tests/patches.rs +34 -28
  174. package/sdk-core/tests/integ_tests/workflow_tests/replay.rs +76 -7
  175. package/sdk-core/tests/integ_tests/workflow_tests/resets.rs +1 -0
  176. package/sdk-core/tests/integ_tests/workflow_tests/signals.rs +18 -14
  177. package/sdk-core/tests/integ_tests/workflow_tests/stickyness.rs +6 -20
  178. package/sdk-core/tests/integ_tests/workflow_tests/timers.rs +10 -21
  179. package/sdk-core/tests/integ_tests/workflow_tests/upsert_search_attrs.rs +7 -8
  180. package/sdk-core/tests/integ_tests/workflow_tests.rs +13 -14
  181. package/sdk-core/tests/main.rs +3 -13
  182. package/sdk-core/tests/runner.rs +75 -36
  183. package/sdk-core/tests/wf_input_replay.rs +32 -0
  184. package/src/conversions.rs +14 -8
  185. package/src/runtime.rs +9 -8
  186. package/ts/index.ts +8 -6
  187. package/sdk-core/bridge-ffi/Cargo.toml +0 -24
  188. package/sdk-core/bridge-ffi/LICENSE.txt +0 -23
  189. package/sdk-core/bridge-ffi/build.rs +0 -25
  190. package/sdk-core/bridge-ffi/include/sdk-core-bridge.h +0 -224
  191. package/sdk-core/bridge-ffi/src/lib.rs +0 -746
  192. package/sdk-core/bridge-ffi/src/wrappers.rs +0 -221
  193. package/sdk-core/protos/local/temporal/sdk/core/bridge/bridge.proto +0 -210
  194. package/sdk-core/sdk/src/conversions.rs +0 -8
package/lib/index.d.ts CHANGED
@@ -341,10 +341,10 @@ export interface TimeSkippingServerConfig {
341
341
  extraArgs?: string[];
342
342
  }
343
343
  /**
344
- * Configuration for temporalite.
344
+ * Configuration for the Temporal CLI dev server.
345
345
  */
346
- export interface TemporaliteConfig {
347
- type: 'temporalite';
346
+ export interface DevServerConfig {
347
+ type: 'dev-server';
348
348
  executable?: EphemeralServerExecutable;
349
349
  /**
350
350
  * Namespace to use - created at startup.
@@ -359,11 +359,13 @@ export interface TemporaliteConfig {
359
359
  */
360
360
  ip?: string;
361
361
  /**
362
- * Sqlite DB filename if persisting or non-persistent if none.
362
+ * Sqlite DB filename if persisting or non-persistent if none (default).
363
363
  */
364
364
  db_filename?: string;
365
365
  /**
366
366
  * Whether to enable the UI.
367
+ *
368
+ * @default false
367
369
  */
368
370
  ui?: boolean;
369
371
  /**
@@ -386,9 +388,9 @@ export interface TemporaliteConfig {
386
388
  /**
387
389
  * Configuration for spawning an ephemeral Temporal server.
388
390
  *
389
- * Both the time-skipping test server and temporalite are supported.
391
+ * Both the time-skipping test server and Temporal CLI dev server are supported.
390
392
  */
391
- export declare type EphemeralServerConfig = TimeSkippingServerConfig | TemporaliteConfig;
393
+ export declare type EphemeralServerConfig = TimeSkippingServerConfig | DevServerConfig;
392
394
  export interface Worker {
393
395
  type: 'Worker';
394
396
  }
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../ts/index.ts"],"names":[],"mappings":";;;AAigBA,mCAA0E;AAAjE,uGAAA,aAAa,OAAA;AAAE,wGAAA,cAAc,OAAA;AAAE,yGAAA,eAAe,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../ts/index.ts"],"names":[],"mappings":";;;AAmgBA,mCAA0E;AAAjE,uGAAA,aAAa,OAAA;AAAE,wGAAA,cAAc,OAAA;AAAE,yGAAA,eAAe,OAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@temporalio/core-bridge",
3
- "version": "1.5.2",
3
+ "version": "1.7.0",
4
4
  "description": "Temporal.io SDK Core<>Node bridge",
5
5
  "main": "index.js",
6
6
  "types": "lib/index.d.ts",
@@ -22,8 +22,8 @@
22
22
  "author": "Temporal Technologies Inc. <sdk@temporal.io>",
23
23
  "license": "MIT",
24
24
  "dependencies": {
25
- "@opentelemetry/api": "^1.1.0",
26
- "@temporalio/common": "^1.5.2",
25
+ "@opentelemetry/api": "^1.3.0",
26
+ "@temporalio/common": "1.7.0",
27
27
  "arg": "^5.0.2",
28
28
  "cargo-cp-artifact": "^0.1.6",
29
29
  "which": "^2.0.2"
@@ -31,6 +31,11 @@
31
31
  "bugs": {
32
32
  "url": "https://github.com/temporalio/sdk-typescript/issues"
33
33
  },
34
+ "repository": {
35
+ "type": "git",
36
+ "url": "git+https://github.com/temporalio/sdk-typescript.git",
37
+ "directory": "packages/core-bridge"
38
+ },
34
39
  "homepage": "https://github.com/temporalio/sdk-typescript/tree/main/packages/core-bridge",
35
40
  "files": [
36
41
  "scripts",
@@ -48,5 +53,5 @@
48
53
  "publishConfig": {
49
54
  "access": "public"
50
55
  },
51
- "gitHead": "d32adfd8537661c3740767ca1a3862392ca702e2"
56
+ "gitHead": "2b32bac62f879b35238b487d3aaed093a1e449a7"
52
57
  }
@@ -1,9 +1,9 @@
1
- FROM rust:1.65
1
+ FROM rust:1.68
2
2
 
3
3
  RUN rustup component add rustfmt && \
4
4
  rustup component add clippy
5
5
 
6
- RUN cargo install cargo-tarpaulin
6
+ # RUN cargo install cargo-tarpaulin
7
7
  RUN apt-get update && apt-get install -y protobuf-compiler
8
8
 
9
9
  WORKDIR /sdk-core
@@ -9,7 +9,7 @@ services:
9
9
  # - '9042:9042'
10
10
 
11
11
  temporal:
12
- image: temporalio/auto-setup:1.18.3
12
+ image: temporalio/auto-setup:1.20.0
13
13
  ports:
14
14
  - "7233:7233"
15
15
  - "7234:7234"
@@ -17,7 +17,7 @@ steps:
17
17
  agents:
18
18
  queue: "default"
19
19
  docker: "*"
20
- command: "cargo clippy --workspace --all-features --all-targets -- -D warnings && cargo clippy --test integ_tests --test load_tests --all-features -- --D warnings"
20
+ command: "cargo lint"
21
21
  timeout_in_minutes: 15
22
22
  plugins:
23
23
  - docker-compose#v3.0.0:
@@ -25,13 +25,11 @@ steps:
25
25
  config:
26
26
  - .buildkite/docker/docker-compose.yaml
27
27
  - .buildkite/docker/docker-compose-ci.yaml
28
- env:
29
- - TEMPORAL_SDK_CORE_BRIDGE_FFI_DISABLE_HEADER_CHANGE=true
30
28
  - label: "test"
31
29
  agents:
32
30
  queue: "default"
33
31
  docker: "*"
34
- command: "cargo tarpaulin --out Html --workspace && cargo test -- --include-ignored"
32
+ command: "cargo test -- --include-ignored"
35
33
  artifact_paths:
36
34
  - "tarpaulin-report.html"
37
35
  - "machine_coverage/*"
@@ -1,3 +1,6 @@
1
1
  [alias]
2
- integ-test = ["run", "--package", "temporal-sdk-core", "--example", "integ_runner"]
3
- lint = ["clippy", "--all", "--test", "integ_tests", "--test", "load_tests"]
2
+ integ-test = ["run", "--package", "temporal-sdk-core", "--example", "integ_runner", "--"]
3
+ wf-input-replay = ["run", "--package", "temporal-sdk-core", "--features", "save_wf_inputs",
4
+ "--example", "wf_input_replay", "--"]
5
+ lint = ["clippy", "--workspace", "--examples", "--all-features",
6
+ "--test", "integ_tests", "--test", "heavy_tests", "--", "--D", "warnings"]
@@ -0,0 +1,29 @@
1
+ name: Heavy Tests
2
+
3
+ on: # rebuild any PRs and main branch changes
4
+ pull_request:
5
+ push:
6
+ branches:
7
+ - master
8
+
9
+ jobs:
10
+ build-and-test:
11
+ timeout-minutes: 20
12
+ runs-on: ubuntu-latest-16-cores
13
+ steps:
14
+ - uses: actions/checkout@v2
15
+ with:
16
+ submodules: recursive
17
+ - uses: actions-rs/toolchain@v1
18
+ with:
19
+ toolchain: stable
20
+ - name: Install protoc
21
+ uses: arduino/setup-protoc@v1
22
+ with:
23
+ version: '3.x'
24
+ repo-token: ${{ secrets.GITHUB_TOKEN }}
25
+
26
+ - uses: actions-rs/cargo@v1
27
+ with:
28
+ command: integ-test
29
+ args: -c "--release" -c "--all-features" -t heavy_tests -- --test-threads 1
@@ -1,2 +1,2 @@
1
1
  [workspace]
2
- members = ["bridge-ffi", "core", "client", "core-api", "fsm", "test-utils", "sdk-core-protos", "sdk"]
2
+ members = ["core", "client", "core-api", "fsm", "test-utils", "sdk-core-protos", "sdk"]
@@ -1,23 +1,29 @@
1
1
  [![Build status](https://badge.buildkite.com/c23f47f4a827f04daece909963bd3a248496f0cdbabfbecee4.svg?branch=master)](https://buildkite.com/temporal/core-sdk?branch=master)
2
2
 
3
- Core SDK that can be used as a base for all other Temporal SDKs.
3
+ Core SDK that can be used as a base for other Temporal SDKs. It is currently used as the base of:
4
4
 
5
- # Getting started
5
+ - [TypeScript SDK](https://github.com/temporalio/sdk-typescript/)
6
+ - [Python SDK](https://github.com/temporalio/sdk-python/)
7
+ - [.NET SDK](https://github.com/temporalio/sdk-dotnet/)
8
+ - [Ruby SDK](https://github.com/temporalio/sdk-ruby/)
6
9
 
7
- See the [Architecture](ARCHITECTURE.md) doc for some high-level information.
10
+ For the reasoning behind the Core SDK, see:
8
11
 
9
- ## Dependencies
10
- * Protobuf compiler
12
+ - [Why Rust powers Temporal’s new Core SDK](https://temporal.io/blog/why-rust-powers-core-sdk).
13
+
14
+ See the [Architecture](ARCHITECTURE.md) doc for some high-level information about how Core works
15
+ and how language layers interact with it.
11
16
 
12
17
  # Development
13
18
 
19
+ You will need the `protoc` protobuf compiler installed to build Core.
20
+
14
21
  This repo is composed of multiple crates:
15
22
  * temporal-sdk-core-protos `./sdk-core-protos` - Holds the generated proto code and extensions
16
23
  * temporal-client `./client` - Defines client(s) for interacting with the Temporal gRPC service
17
24
  * temporal-sdk-core-api `./core-api` - Defines the API surface exposed by Core
18
25
  * temporal-sdk-core `./core` - The Core implementation
19
26
  * temporal-sdk `./sdk` - A (currently prototype) Rust SDK built on top of Core. Used for testing.
20
- * temporal-sdk-core-bridge-ffi `./bridge-ffi` - C API wrapper for Core
21
27
  * rustfsm `./fsm` - Implements a procedural macro used by core for defining state machines
22
28
  (contains subcrates). It is temporal agnostic.
23
29
 
@@ -25,7 +31,6 @@ Visualized (dev dependencies are in blue):
25
31
 
26
32
  ![Crate dependency graph](./etc/deps.svg)
27
33
 
28
-
29
34
  All the following commands are enforced for each pull request:
30
35
 
31
36
  ## Building and testing
@@ -52,9 +57,7 @@ it for a test, insert the below snippet at the start of the test. By default, tr
52
57
  to stdout in a (reasonably) pretty manner.
53
58
 
54
59
  ```rust
55
- crate::telemetry::telemetry_init(Default::default());
56
- let s = info_span!("Test start");
57
- let _enter = s.enter();
60
+ crate::telemetry::test_telem_console();
58
61
  ```
59
62
 
60
63
  The passed in options to initialization can be customized to export to an OTel collector, etc.
@@ -105,3 +108,10 @@ Any error which is returned from a public interface should be well-typed, and we
105
108
  Errors returned from things only used in testing are free to use
106
109
  [anyhow](https://github.com/dtolnay/anyhow) for less verbosity.
107
110
 
111
+
112
+ # The Rust "SDK"
113
+ This repo contains a *prototype* Rust sdk in the `sdk/` directory. This SDK should be considered
114
+ pre-alpha in terms of its API surface. Since it's still using Core underneath, it is generally
115
+ functional. We do not currently have any firm plans to productionize this SDK. If you want to write
116
+ workflows and activities in Rust, feel free to use it - but be aware that the API may change at any
117
+ time without warning and we do not provide any support guarantees.
@@ -13,14 +13,17 @@ mod retry;
13
13
  mod workflow_handle;
14
14
 
15
15
  pub use crate::retry::{CallType, RetryClient, RETRYABLE_ERROR_CODES};
16
+ pub use metrics::ClientMetricProvider;
16
17
  pub use raw::{HealthService, OperatorService, TestService, WorkflowService};
17
18
  pub use temporal_sdk_core_protos::temporal::api::{
19
+ enums::v1::ArchivalState,
18
20
  filter::v1::{StartTimeFilter, StatusFilter, WorkflowExecutionFilter, WorkflowTypeFilter},
19
21
  workflowservice::v1::{
20
22
  list_closed_workflow_executions_request::Filters as ListClosedFilters,
21
23
  list_open_workflow_executions_request::Filters as ListOpenFilters,
22
24
  },
23
25
  };
26
+ pub use tonic;
24
27
  pub use workflow_handle::{WorkflowExecutionInfo, WorkflowExecutionResult};
25
28
 
26
29
  use crate::{
@@ -32,7 +35,6 @@ use crate::{
32
35
  use backoff::{exponential, ExponentialBackoff, SystemClock};
33
36
  use http::uri::InvalidUri;
34
37
  use once_cell::sync::OnceCell;
35
- use opentelemetry::metrics::Meter;
36
38
  use parking_lot::RwLock;
37
39
  use std::{
38
40
  collections::HashMap,
@@ -51,6 +53,7 @@ use temporal_sdk_core_protos::{
51
53
  failure::v1::Failure,
52
54
  operatorservice::v1::operator_service_client::OperatorServiceClient,
53
55
  query::v1::WorkflowQuery,
56
+ replication::v1::ClusterReplicationConfig,
54
57
  taskqueue::v1::TaskQueue,
55
58
  testservice::v1::test_service_client::TestServiceClient,
56
59
  workflowservice::v1::{workflow_service_client::WorkflowServiceClient, *},
@@ -283,7 +286,7 @@ impl ClientOptions {
283
286
  pub async fn connect(
284
287
  &self,
285
288
  namespace: impl Into<String>,
286
- metrics_meter: Option<&Meter>,
289
+ metrics_meter: Option<&dyn ClientMetricProvider>,
287
290
  headers: Option<Arc<RwLock<HashMap<String, String>>>>,
288
291
  ) -> Result<RetryClient<Client>, ClientInitError> {
289
292
  let client = self
@@ -301,7 +304,7 @@ impl ClientOptions {
301
304
  /// See [RetryClient] for more
302
305
  pub async fn connect_no_namespace(
303
306
  &self,
304
- metrics_meter: Option<&Meter>,
307
+ metrics_meter: Option<&dyn ClientMetricProvider>,
305
308
  headers: Option<Arc<RwLock<HashMap<String, String>>>>,
306
309
  ) -> Result<RetryClient<ConfiguredClient<TemporalServiceClientWithMetrics>>, ClientInitError>
307
310
  {
@@ -592,6 +595,133 @@ impl Namespace {
592
595
  }
593
596
  }
594
597
 
598
+ /// Default workflow execution retention for a Namespace is 3 days
599
+ pub const DEFAULT_WORKFLOW_EXECUTION_RETENTION_PERIOD: Duration =
600
+ Duration::from_secs(60 * 60 * 24 * 3);
601
+
602
+ /// Helper struct for `register_namespace`.
603
+ #[derive(Clone, derive_builder::Builder)]
604
+ pub struct RegisterNamespaceOptions {
605
+ /// Name (required)
606
+ #[builder(setter(into))]
607
+ pub namespace: String,
608
+ /// Description (required)
609
+ #[builder(setter(into))]
610
+ pub description: String,
611
+ /// Owner's email
612
+ #[builder(setter(into), default)]
613
+ pub owner_email: String,
614
+ /// Workflow execution retention period
615
+ #[builder(default = "DEFAULT_WORKFLOW_EXECUTION_RETENTION_PERIOD")]
616
+ pub workflow_execution_retention_period: Duration,
617
+ /// Cluster settings
618
+ #[builder(setter(strip_option, custom), default)]
619
+ pub clusters: Vec<ClusterReplicationConfig>,
620
+ /// Active cluster name
621
+ #[builder(setter(into), default)]
622
+ pub active_cluster_name: String,
623
+ /// Custom Data
624
+ #[builder(default)]
625
+ pub data: HashMap<String, String>,
626
+ /// Security Token
627
+ #[builder(setter(into), default)]
628
+ pub security_token: String,
629
+ /// Global namespace
630
+ #[builder(default)]
631
+ pub is_global_namespace: bool,
632
+ /// History Archival setting
633
+ #[builder(setter(into), default = "ArchivalState::Unspecified")]
634
+ pub history_archival_state: ArchivalState,
635
+ /// History Archival uri
636
+ #[builder(setter(into), default)]
637
+ pub history_archival_uri: String,
638
+ /// Visibility Archival setting
639
+ #[builder(setter(into), default = "ArchivalState::Unspecified")]
640
+ pub visibility_archival_state: ArchivalState,
641
+ /// Visibility Archival uri
642
+ #[builder(setter(into), default)]
643
+ pub visibility_archival_uri: String,
644
+ }
645
+
646
+ impl RegisterNamespaceOptions {
647
+ /// Builder convenience. Less `use` imports
648
+ pub fn builder() -> RegisterNamespaceOptionsBuilder {
649
+ Default::default()
650
+ }
651
+ }
652
+
653
+ impl From<RegisterNamespaceOptions> for RegisterNamespaceRequest {
654
+ fn from(val: RegisterNamespaceOptions) -> Self {
655
+ RegisterNamespaceRequest {
656
+ namespace: val.namespace,
657
+ description: val.description,
658
+ owner_email: val.owner_email,
659
+ workflow_execution_retention_period: val
660
+ .workflow_execution_retention_period
661
+ .try_into()
662
+ .ok(),
663
+ clusters: val.clusters,
664
+ active_cluster_name: val.active_cluster_name,
665
+ data: val.data,
666
+ security_token: val.security_token,
667
+ is_global_namespace: val.is_global_namespace,
668
+ history_archival_state: val.history_archival_state as i32,
669
+ history_archival_uri: val.history_archival_uri,
670
+ visibility_archival_state: val.visibility_archival_state as i32,
671
+ visibility_archival_uri: val.visibility_archival_uri,
672
+ }
673
+ }
674
+ }
675
+
676
+ impl RegisterNamespaceOptionsBuilder {
677
+ /// Custum builder function for convenience
678
+ /// Warning: setting cluster_names could blow away any previously set cluster configs
679
+ pub fn cluster_names(&mut self, clusters: Vec<String>) {
680
+ self.clusters = Some(
681
+ clusters
682
+ .into_iter()
683
+ .map(|s| ClusterReplicationConfig { cluster_name: s })
684
+ .collect(),
685
+ );
686
+ }
687
+ }
688
+
689
+ /// Helper struct for `signal_with_start_workflow_execution`.
690
+ #[derive(Clone, derive_builder::Builder)]
691
+ pub struct SignalWithStartOptions {
692
+ /// Input payload for the workflow run
693
+ #[builder(setter(strip_option), default)]
694
+ pub input: Option<Payloads>,
695
+ /// Task Queue to target (required)
696
+ #[builder(setter(into))]
697
+ pub task_queue: String,
698
+ /// Workflow id for the workflow run
699
+ #[builder(setter(into))]
700
+ pub workflow_id: String,
701
+ /// Workflow type for the workflow run
702
+ #[builder(setter(into))]
703
+ pub workflow_type: String,
704
+ #[builder(setter(strip_option), default)]
705
+ /// Request id for idempotency/deduplication
706
+ pub request_id: Option<String>,
707
+ /// The signal name to send (required)
708
+ #[builder(setter(into))]
709
+ pub signal_name: String,
710
+ /// Payloads for the signal
711
+ #[builder(default)]
712
+ pub signal_input: Option<Payloads>,
713
+ #[builder(setter(strip_option), default)]
714
+ /// Headers for the signal
715
+ pub signal_header: Option<Header>,
716
+ }
717
+
718
+ impl SignalWithStartOptions {
719
+ /// Builder convenience. Less `use` imports
720
+ pub fn builder() -> SignalWithStartOptionsBuilder {
721
+ Default::default()
722
+ }
723
+ }
724
+
595
725
  /// This trait provides higher-level friendlier interaction with the server.
596
726
  /// See the [WorkflowService] trait for a lower-level client.
597
727
  #[cfg_attr(test, mockall::automock)]
@@ -677,15 +807,8 @@ pub trait WorkflowClientTrait {
677
807
  #[allow(clippy::too_many_arguments)]
678
808
  async fn signal_with_start_workflow_execution(
679
809
  &self,
680
- input: Option<Payloads>,
681
- task_queue: String,
682
- workflow_id: String,
683
- workflow_type: String,
684
- request_id: Option<String>,
685
- options: WorkflowOptions,
686
- signal_name: String,
687
- signal_input: Option<Payloads>,
688
- signal_header: Option<Header>,
810
+ options: SignalWithStartOptions,
811
+ workflow_options: WorkflowOptions,
689
812
  ) -> Result<SignalWithStartWorkflowExecutionResponse>;
690
813
 
691
814
  /// Request a query of a certain workflow instance
@@ -734,13 +857,19 @@ pub trait WorkflowClientTrait {
734
857
  run_id: Option<String>,
735
858
  ) -> Result<TerminateWorkflowExecutionResponse>;
736
859
 
860
+ /// Register a new namespace
861
+ async fn register_namespace(
862
+ &self,
863
+ options: RegisterNamespaceOptions,
864
+ ) -> Result<RegisterNamespaceResponse>;
865
+
737
866
  /// Lists all available namespaces
738
867
  async fn list_namespaces(&self) -> Result<ListNamespacesResponse>;
739
868
 
740
869
  /// Query namespace details
741
870
  async fn describe_namespace(&self, namespace: Namespace) -> Result<DescribeNamespaceResponse>;
742
871
 
743
- /// List open workflows with Standard Visibility filtering
872
+ /// List open workflow executions with Standard Visibility filtering
744
873
  async fn list_open_workflow_executions(
745
874
  &self,
746
875
  max_page_size: i32,
@@ -749,7 +878,7 @@ pub trait WorkflowClientTrait {
749
878
  filters: Option<ListOpenFilters>,
750
879
  ) -> Result<ListOpenWorkflowExecutionsResponse>;
751
880
 
752
- /// List closed workflows Standard Visibility filtering
881
+ /// List closed workflow executions Standard Visibility filtering
753
882
  async fn list_closed_workflow_executions(
754
883
  &self,
755
884
  max_page_size: i32,
@@ -758,14 +887,25 @@ pub trait WorkflowClientTrait {
758
887
  filters: Option<ListClosedFilters>,
759
888
  ) -> Result<ListClosedWorkflowExecutionsResponse>;
760
889
 
761
- /// List workflows with Advanced Visibility filtering
890
+ /// List workflow executions with Advanced Visibility filtering
762
891
  async fn list_workflow_executions(
763
892
  &self,
764
- max_page_size: i32,
893
+ page_size: i32,
765
894
  next_page_token: Vec<u8>,
766
895
  query: String,
767
896
  ) -> Result<ListWorkflowExecutionsResponse>;
768
897
 
898
+ /// List archived workflow executions
899
+ async fn list_archived_workflow_executions(
900
+ &self,
901
+ page_size: i32,
902
+ next_page_token: Vec<u8>,
903
+ query: String,
904
+ ) -> Result<ListArchivedWorkflowExecutionsResponse>;
905
+
906
+ /// Get Cluster Search Attributes
907
+ async fn get_search_attributes(&self) -> Result<GetSearchAttributesResponse>;
908
+
769
909
  /// Returns options that were used to initialize the client
770
910
  fn get_options(&self) -> &ClientOptions;
771
911
 
@@ -937,6 +1077,7 @@ impl WorkflowClientTrait for Client {
937
1077
  identity: self.inner.options.identity.clone(),
938
1078
  binary_checksum: self.bound_worker_build_id.clone().unwrap_or_default(),
939
1079
  namespace: self.namespace.clone(),
1080
+ messages: vec![],
940
1081
  };
941
1082
  Ok(self
942
1083
  .wf_svc()
@@ -973,42 +1114,43 @@ impl WorkflowClientTrait for Client {
973
1114
 
974
1115
  async fn signal_with_start_workflow_execution(
975
1116
  &self,
976
- input: Option<Payloads>,
977
- task_queue: String,
978
- workflow_id: String,
979
- workflow_type: String,
980
- request_id: Option<String>,
981
- options: WorkflowOptions,
982
- signal_name: String,
983
- signal_input: Option<Payloads>,
984
- signal_header: Option<Header>,
1117
+ options: SignalWithStartOptions,
1118
+ workflow_options: WorkflowOptions,
985
1119
  ) -> Result<SignalWithStartWorkflowExecutionResponse> {
986
1120
  Ok(self
987
1121
  .wf_svc()
988
1122
  .signal_with_start_workflow_execution(SignalWithStartWorkflowExecutionRequest {
989
1123
  namespace: self.namespace.clone(),
990
- workflow_id,
1124
+ workflow_id: options.workflow_id,
991
1125
  workflow_type: Some(WorkflowType {
992
- name: workflow_type,
1126
+ name: options.workflow_type,
993
1127
  }),
994
1128
  task_queue: Some(TaskQueue {
995
- name: task_queue,
1129
+ name: options.task_queue,
996
1130
  kind: TaskQueueKind::Normal as i32,
997
1131
  }),
998
- input,
999
- signal_name,
1000
- signal_input,
1132
+ input: options.input,
1133
+ signal_name: options.signal_name,
1134
+ signal_input: options.signal_input,
1001
1135
  identity: self.inner.options.identity.clone(),
1002
- request_id: request_id.unwrap_or_else(|| Uuid::new_v4().to_string()),
1003
- workflow_id_reuse_policy: options.id_reuse_policy as i32,
1004
- workflow_execution_timeout: options
1136
+ request_id: options
1137
+ .request_id
1138
+ .unwrap_or_else(|| Uuid::new_v4().to_string()),
1139
+ workflow_id_reuse_policy: workflow_options.id_reuse_policy as i32,
1140
+ workflow_execution_timeout: workflow_options
1005
1141
  .execution_timeout
1006
1142
  .and_then(|d| d.try_into().ok()),
1007
- workflow_run_timeout: options.execution_timeout.and_then(|d| d.try_into().ok()),
1008
- workflow_task_timeout: options.task_timeout.and_then(|d| d.try_into().ok()),
1009
- search_attributes: options.search_attributes.and_then(|d| d.try_into().ok()),
1010
- cron_schedule: options.cron_schedule.unwrap_or_default(),
1011
- header: signal_header,
1143
+ workflow_run_timeout: workflow_options
1144
+ .execution_timeout
1145
+ .and_then(|d| d.try_into().ok()),
1146
+ workflow_task_timeout: workflow_options
1147
+ .task_timeout
1148
+ .and_then(|d| d.try_into().ok()),
1149
+ search_attributes: workflow_options
1150
+ .search_attributes
1151
+ .and_then(|d| d.try_into().ok()),
1152
+ cron_schedule: workflow_options.cron_schedule.unwrap_or_default(),
1153
+ header: options.signal_header,
1012
1154
  ..Default::default()
1013
1155
  })
1014
1156
  .await?
@@ -1140,6 +1282,14 @@ impl WorkflowClientTrait for Client {
1140
1282
  .into_inner())
1141
1283
  }
1142
1284
 
1285
+ async fn register_namespace(
1286
+ &self,
1287
+ options: RegisterNamespaceOptions,
1288
+ ) -> Result<RegisterNamespaceResponse> {
1289
+ let req = Into::<RegisterNamespaceRequest>::into(options);
1290
+ Ok(self.wf_svc().register_namespace(req).await?.into_inner())
1291
+ }
1292
+
1143
1293
  async fn list_namespaces(&self) -> Result<ListNamespacesResponse> {
1144
1294
  Ok(self
1145
1295
  .wf_svc()
@@ -1214,6 +1364,32 @@ impl WorkflowClientTrait for Client {
1214
1364
  .into_inner())
1215
1365
  }
1216
1366
 
1367
+ async fn list_archived_workflow_executions(
1368
+ &self,
1369
+ page_size: i32,
1370
+ next_page_token: Vec<u8>,
1371
+ query: String,
1372
+ ) -> Result<ListArchivedWorkflowExecutionsResponse> {
1373
+ Ok(self
1374
+ .wf_svc()
1375
+ .list_archived_workflow_executions(ListArchivedWorkflowExecutionsRequest {
1376
+ namespace: self.namespace.clone(),
1377
+ page_size,
1378
+ next_page_token,
1379
+ query,
1380
+ })
1381
+ .await?
1382
+ .into_inner())
1383
+ }
1384
+
1385
+ async fn get_search_attributes(&self) -> Result<GetSearchAttributesResponse> {
1386
+ Ok(self
1387
+ .wf_svc()
1388
+ .get_search_attributes(GetSearchAttributesRequest {})
1389
+ .await?
1390
+ .into_inner())
1391
+ }
1392
+
1217
1393
  fn get_options(&self) -> &ClientOptions {
1218
1394
  &self.inner.options
1219
1395
  }