temporalio 0.4.0 → 0.5.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.
- checksums.yaml +4 -4
- data/.yardopts +1 -1
- data/Cargo.lock +679 -437
- data/Cargo.toml +5 -5
- data/README.md +98 -34
- data/ext/Cargo.toml +3 -3
- data/lib/temporalio/activity/cancellation_details.rb +58 -0
- data/lib/temporalio/activity/context.rb +10 -1
- data/lib/temporalio/activity/definition.rb +41 -3
- data/lib/temporalio/activity/info.rb +25 -4
- data/lib/temporalio/activity.rb +2 -0
- data/lib/temporalio/api/activity/v1/message.rb +1 -1
- data/lib/temporalio/api/batch/v1/message.rb +4 -2
- data/lib/temporalio/api/cloud/account/v1/message.rb +1 -1
- data/lib/temporalio/api/cloud/cloudservice/v1/request_response.rb +11 -2
- data/lib/temporalio/api/cloud/cloudservice/v1/service.rb +2 -2
- data/lib/temporalio/api/cloud/identity/v1/message.rb +7 -2
- data/lib/temporalio/api/cloud/namespace/v1/message.rb +6 -2
- data/lib/temporalio/api/cloud/nexus/v1/message.rb +3 -2
- data/lib/temporalio/api/cloud/operation/v1/message.rb +1 -1
- data/lib/temporalio/api/cloud/region/v1/message.rb +1 -1
- data/lib/temporalio/api/cloud/resource/v1/message.rb +1 -1
- data/lib/temporalio/api/cloud/sink/v1/message.rb +1 -1
- data/lib/temporalio/api/cloud/usage/v1/message.rb +1 -1
- data/lib/temporalio/api/command/v1/message.rb +2 -2
- data/lib/temporalio/api/common/v1/grpc_status.rb +1 -1
- data/lib/temporalio/api/common/v1/message.rb +3 -2
- data/lib/temporalio/api/deployment/v1/message.rb +3 -2
- data/lib/temporalio/api/enums/v1/batch_operation.rb +1 -1
- data/lib/temporalio/api/enums/v1/command_type.rb +1 -1
- data/lib/temporalio/api/enums/v1/common.rb +5 -2
- data/lib/temporalio/api/enums/v1/deployment.rb +3 -2
- data/lib/temporalio/api/enums/v1/event_type.rb +2 -2
- data/lib/temporalio/api/enums/v1/failed_cause.rb +2 -2
- data/lib/temporalio/api/enums/v1/namespace.rb +1 -1
- data/lib/temporalio/api/enums/v1/nexus.rb +1 -1
- data/lib/temporalio/api/enums/v1/query.rb +1 -1
- data/lib/temporalio/api/enums/v1/reset.rb +1 -1
- data/lib/temporalio/api/enums/v1/schedule.rb +1 -1
- data/lib/temporalio/api/enums/v1/task_queue.rb +1 -1
- data/lib/temporalio/api/enums/v1/update.rb +1 -1
- data/lib/temporalio/api/enums/v1/workflow.rb +2 -2
- data/lib/temporalio/api/errordetails/v1/message.rb +1 -1
- data/lib/temporalio/api/export/v1/message.rb +1 -1
- data/lib/temporalio/api/failure/v1/message.rb +3 -2
- data/lib/temporalio/api/filter/v1/message.rb +1 -1
- data/lib/temporalio/api/history/v1/message.rb +4 -2
- data/lib/temporalio/api/namespace/v1/message.rb +1 -1
- data/lib/temporalio/api/nexus/v1/message.rb +2 -2
- data/lib/temporalio/api/operatorservice/v1/request_response.rb +1 -1
- data/lib/temporalio/api/operatorservice/v1/service.rb +1 -1
- data/lib/temporalio/api/payload_visitor.rb +87 -0
- data/lib/temporalio/api/protocol/v1/message.rb +1 -1
- data/lib/temporalio/api/query/v1/message.rb +1 -1
- data/lib/temporalio/api/replication/v1/message.rb +1 -1
- data/lib/temporalio/api/rules/v1/message.rb +27 -0
- data/lib/temporalio/api/schedule/v1/message.rb +2 -2
- data/lib/temporalio/api/sdk/v1/enhanced_stack_trace.rb +1 -1
- data/lib/temporalio/api/sdk/v1/task_complete_metadata.rb +1 -1
- data/lib/temporalio/api/sdk/v1/user_metadata.rb +1 -1
- data/lib/temporalio/api/sdk/v1/workflow_metadata.rb +1 -1
- data/lib/temporalio/api/taskqueue/v1/message.rb +2 -2
- data/lib/temporalio/api/testservice/v1/request_response.rb +1 -1
- data/lib/temporalio/api/testservice/v1/service.rb +1 -1
- data/lib/temporalio/api/update/v1/message.rb +1 -1
- data/lib/temporalio/api/version/v1/message.rb +1 -1
- data/lib/temporalio/api/worker/v1/message.rb +30 -0
- data/lib/temporalio/api/workflow/v1/message.rb +14 -2
- data/lib/temporalio/api/workflowservice/v1/request_response.rb +19 -2
- data/lib/temporalio/api/workflowservice/v1/service.rb +2 -2
- data/lib/temporalio/client/async_activity_handle.rb +12 -4
- data/lib/temporalio/client/connection/cloud_service.rb +60 -0
- data/lib/temporalio/client/connection/workflow_service.rb +105 -0
- data/lib/temporalio/client/interceptor.rb +25 -7
- data/lib/temporalio/client/schedule.rb +10 -2
- data/lib/temporalio/client/with_start_workflow_operation.rb +9 -1
- data/lib/temporalio/client/workflow_handle.rb +50 -10
- data/lib/temporalio/client/workflow_update_handle.rb +9 -3
- data/lib/temporalio/client.rb +110 -6
- data/lib/temporalio/common_enums.rb +14 -0
- data/lib/temporalio/contrib/open_telemetry.rb +13 -9
- data/lib/temporalio/converters/data_converter.rb +18 -8
- data/lib/temporalio/converters/failure_converter.rb +6 -3
- data/lib/temporalio/converters/payload_converter/binary_null.rb +2 -2
- data/lib/temporalio/converters/payload_converter/binary_plain.rb +2 -2
- data/lib/temporalio/converters/payload_converter/binary_protobuf.rb +2 -2
- data/lib/temporalio/converters/payload_converter/composite.rb +6 -4
- data/lib/temporalio/converters/payload_converter/encoding.rb +4 -2
- data/lib/temporalio/converters/payload_converter/json_plain.rb +2 -2
- data/lib/temporalio/converters/payload_converter/json_protobuf.rb +2 -2
- data/lib/temporalio/converters/payload_converter.rb +16 -6
- data/lib/temporalio/error/failure.rb +19 -1
- data/lib/temporalio/error.rb +1 -1
- data/lib/temporalio/internal/bridge/api/activity_result/activity_result.rb +1 -1
- data/lib/temporalio/internal/bridge/api/activity_task/activity_task.rb +3 -2
- data/lib/temporalio/internal/bridge/api/child_workflow/child_workflow.rb +1 -1
- data/lib/temporalio/internal/bridge/api/common/common.rb +1 -1
- data/lib/temporalio/internal/bridge/api/core_interface.rb +1 -1
- data/lib/temporalio/internal/bridge/api/external_data/external_data.rb +1 -1
- data/lib/temporalio/internal/bridge/api/nexus/nexus.rb +3 -2
- data/lib/temporalio/internal/bridge/api/workflow_activation/workflow_activation.rb +2 -2
- data/lib/temporalio/internal/bridge/api/workflow_commands/workflow_commands.rb +3 -2
- data/lib/temporalio/internal/bridge/api/workflow_completion/workflow_completion.rb +1 -1
- data/lib/temporalio/internal/bridge/worker.rb +28 -4
- data/lib/temporalio/internal/bridge.rb +1 -1
- data/lib/temporalio/internal/client/implementation.rb +60 -52
- data/lib/temporalio/internal/proto_utils.rb +4 -4
- data/lib/temporalio/internal/worker/activity_worker.rb +93 -20
- data/lib/temporalio/internal/worker/workflow_instance/child_workflow_handle.rb +8 -6
- data/lib/temporalio/internal/worker/workflow_instance/context.rb +65 -24
- data/lib/temporalio/internal/worker/workflow_instance/details.rb +5 -2
- data/lib/temporalio/internal/worker/workflow_instance/external_workflow_handle.rb +2 -2
- data/lib/temporalio/internal/worker/workflow_instance/illegal_call_tracer.rb +64 -18
- data/lib/temporalio/internal/worker/workflow_instance/outbound_implementation.rb +28 -14
- data/lib/temporalio/internal/worker/workflow_instance.rb +58 -23
- data/lib/temporalio/internal/worker/workflow_worker.rb +16 -6
- data/lib/temporalio/priority.rb +59 -0
- data/lib/temporalio/testing/activity_environment.rb +17 -2
- data/lib/temporalio/testing/workflow_environment.rb +3 -3
- data/lib/temporalio/version.rb +1 -1
- data/lib/temporalio/versioning_override.rb +56 -0
- data/lib/temporalio/worker/deployment_options.rb +45 -0
- data/lib/temporalio/worker/illegal_workflow_call_validator.rb +64 -0
- data/lib/temporalio/worker/interceptor.rb +13 -1
- data/lib/temporalio/worker/poller_behavior.rb +61 -0
- data/lib/temporalio/worker/thread_pool.rb +1 -1
- data/lib/temporalio/worker/workflow_executor/thread_pool.rb +2 -1
- data/lib/temporalio/worker/workflow_replayer.rb +12 -13
- data/lib/temporalio/worker.rb +63 -27
- data/lib/temporalio/worker_deployment_version.rb +67 -0
- data/lib/temporalio/workflow/child_workflow_handle.rb +10 -2
- data/lib/temporalio/workflow/definition.rb +183 -33
- data/lib/temporalio/workflow/external_workflow_handle.rb +3 -1
- data/lib/temporalio/workflow/info.rb +4 -1
- data/lib/temporalio/workflow.rb +61 -9
- data/lib/temporalio.rb +1 -0
- data/temporalio.gemspec +1 -0
- metadata +12 -3
data/lib/temporalio/client.rb
CHANGED
@@ -19,9 +19,11 @@ require 'temporalio/common_enums'
|
|
19
19
|
require 'temporalio/converters'
|
20
20
|
require 'temporalio/error'
|
21
21
|
require 'temporalio/internal/client/implementation'
|
22
|
+
require 'temporalio/priority'
|
22
23
|
require 'temporalio/retry_policy'
|
23
24
|
require 'temporalio/runtime'
|
24
25
|
require 'temporalio/search_attributes'
|
26
|
+
require 'temporalio/versioning_override'
|
25
27
|
require 'temporalio/workflow/definition'
|
26
28
|
|
27
29
|
module Temporalio
|
@@ -48,6 +50,16 @@ module Temporalio
|
|
48
50
|
# Options as returned from {options} for +**to_h+ splat use in {initialize}. See {initialize} for details.
|
49
51
|
class Options; end # rubocop:disable Lint/EmptyClass
|
50
52
|
|
53
|
+
ListWorkflowPage = Data.define(:executions, :next_page_token)
|
54
|
+
|
55
|
+
# A page of workflow executions returned by {Client#list_workflow_page}.
|
56
|
+
#
|
57
|
+
# @!attribute executions
|
58
|
+
# @return [Array<WorkflowExecution>] List of workflow executions in this page.
|
59
|
+
# @!attribute next_page_token
|
60
|
+
# @return [String, nil] Token for the next page of results. nil if there are no more results.
|
61
|
+
class ListWorkflowPage; end # rubocop:disable Lint/EmptyClass
|
62
|
+
|
51
63
|
# Connect to Temporal server. This is a shortcut for +Connection.new+ followed by +Client.new+.
|
52
64
|
#
|
53
65
|
# @param target_host [String] +host:port+ for the Temporal server. For local development, this is often
|
@@ -216,6 +228,13 @@ module Temporalio
|
|
216
228
|
# with `cron_schedule`.
|
217
229
|
# @param request_eager_start [Boolean] Potentially reduce the latency to start this workflow by encouraging the
|
218
230
|
# server to start it on a local worker running with this same client. This is currently experimental.
|
231
|
+
# @param versioning_override [VersioningOverride, nil] Override the version of the workflow.
|
232
|
+
# This is currently experimental.
|
233
|
+
# @param priority [Priority] Priority of the workflow. This is currently experimental.
|
234
|
+
# @param arg_hints [Array<Object>, nil] Overrides converter hints for arguments if any. If unset/nil and the
|
235
|
+
# workflow definition has arg hints, those are used by default.
|
236
|
+
# @param result_hint [Object, nil] Overrides converter hint for result if any. If unset/nil and the workflow
|
237
|
+
# definition has result hint, it is used by default.
|
219
238
|
# @param rpc_options [RPCOptions, nil] Advanced RPC options.
|
220
239
|
#
|
221
240
|
# @return [WorkflowHandle] A workflow handle to the started workflow.
|
@@ -239,10 +258,17 @@ module Temporalio
|
|
239
258
|
search_attributes: nil,
|
240
259
|
start_delay: nil,
|
241
260
|
request_eager_start: false,
|
261
|
+
versioning_override: nil,
|
262
|
+
priority: Priority.default,
|
263
|
+
arg_hints: nil,
|
264
|
+
result_hint: nil,
|
242
265
|
rpc_options: nil
|
243
266
|
)
|
267
|
+
# Take hints from definition if there is a definition
|
268
|
+
workflow, defn_arg_hints, defn_result_hint =
|
269
|
+
Workflow::Definition._workflow_type_and_hints_from_workflow_parameter(workflow)
|
244
270
|
@impl.start_workflow(Interceptor::StartWorkflowInput.new(
|
245
|
-
workflow
|
271
|
+
workflow:,
|
246
272
|
args:,
|
247
273
|
workflow_id: id,
|
248
274
|
task_queue:,
|
@@ -260,6 +286,10 @@ module Temporalio
|
|
260
286
|
start_delay:,
|
261
287
|
request_eager_start:,
|
262
288
|
headers: {},
|
289
|
+
versioning_override:,
|
290
|
+
priority:,
|
291
|
+
arg_hints: arg_hints || defn_arg_hints,
|
292
|
+
result_hint: result_hint || defn_result_hint,
|
263
293
|
rpc_options:
|
264
294
|
))
|
265
295
|
end
|
@@ -292,6 +322,13 @@ module Temporalio
|
|
292
322
|
# with `cron_schedule`.
|
293
323
|
# @param request_eager_start [Boolean] Potentially reduce the latency to start this workflow by encouraging the
|
294
324
|
# server to start it on a local worker running with this same client. This is currently experimental.
|
325
|
+
# @param versioning_override [VersioningOverride, nil] Override the version of the workflow.
|
326
|
+
# This is currently experimental.
|
327
|
+
# @param priority [Priority] Priority for the workflow. This is currently experimental.
|
328
|
+
# @param arg_hints [Array<Object>, nil] Overrides converter hints for arguments if any. If unset/nil and the
|
329
|
+
# workflow definition has arg hints, those are used by default.
|
330
|
+
# @param result_hint [Object, nil] Overrides converter hint for result if any. If unset/nil and the workflow
|
331
|
+
# definition has result hint, it is used by default.
|
295
332
|
# @param rpc_options [RPCOptions, nil] Advanced RPC options.
|
296
333
|
#
|
297
334
|
# @return [Object] Successful result of the workflow.
|
@@ -316,6 +353,10 @@ module Temporalio
|
|
316
353
|
search_attributes: nil,
|
317
354
|
start_delay: nil,
|
318
355
|
request_eager_start: false,
|
356
|
+
versioning_override: nil,
|
357
|
+
priority: Priority.default,
|
358
|
+
arg_hints: nil,
|
359
|
+
result_hint: nil,
|
319
360
|
rpc_options: nil
|
320
361
|
)
|
321
362
|
start_workflow(
|
@@ -336,6 +377,10 @@ module Temporalio
|
|
336
377
|
search_attributes:,
|
337
378
|
start_delay:,
|
338
379
|
request_eager_start:,
|
380
|
+
versioning_override:,
|
381
|
+
priority:,
|
382
|
+
arg_hints:,
|
383
|
+
result_hint:,
|
339
384
|
rpc_options:
|
340
385
|
).result
|
341
386
|
end
|
@@ -347,14 +392,18 @@ module Temporalio
|
|
347
392
|
# interactions occur on the latest of the workflow ID.
|
348
393
|
# @param first_execution_run_id [String, nil] First execution run ID used for some calls like cancellation and
|
349
394
|
# termination to ensure the affected workflow is only within the same chain as this given run ID.
|
395
|
+
# @param result_hint [Object, nil] Converter hint for the workflow's result.
|
350
396
|
#
|
351
397
|
# @return [WorkflowHandle] The workflow handle.
|
352
398
|
def workflow_handle(
|
353
399
|
workflow_id,
|
354
400
|
run_id: nil,
|
355
|
-
first_execution_run_id: nil
|
401
|
+
first_execution_run_id: nil,
|
402
|
+
result_hint: nil
|
356
403
|
)
|
357
|
-
WorkflowHandle.new(
|
404
|
+
WorkflowHandle.new(
|
405
|
+
client: self, id: workflow_id, run_id:, result_run_id: run_id, first_execution_run_id:, result_hint:
|
406
|
+
)
|
358
407
|
end
|
359
408
|
|
360
409
|
# Start an update, possibly starting the workflow at the same time if it doesn't exist (depending upon ID conflict
|
@@ -368,6 +417,10 @@ module Temporalio
|
|
368
417
|
# @param wait_for_stage [WorkflowUpdateWaitStage] Required stage to wait until returning. ADMITTED is not
|
369
418
|
# currently supported. See https://docs.temporal.io/workflows#update for more details.
|
370
419
|
# @param id [String] ID of the update.
|
420
|
+
# @param arg_hints [Array<Object>, nil] Overrides converter hints for update arguments if any. If unset/nil and the
|
421
|
+
# update definition has arg hints, those are used by default.
|
422
|
+
# @param result_hint [Object, nil] Overrides converter hint for update result if any. If unset/nil and the update
|
423
|
+
# definition has result hint, it is used by default.
|
371
424
|
# @param rpc_options [RPCOptions, nil] Advanced RPC options.
|
372
425
|
#
|
373
426
|
# @return [WorkflowUpdateHandle] The update handle.
|
@@ -381,15 +434,20 @@ module Temporalio
|
|
381
434
|
start_workflow_operation:,
|
382
435
|
wait_for_stage:,
|
383
436
|
id: SecureRandom.uuid,
|
437
|
+
arg_hints: nil,
|
438
|
+
result_hint: nil,
|
384
439
|
rpc_options: nil
|
385
440
|
)
|
441
|
+
update, defn_arg_hints, defn_result_hint = Workflow::Definition::Update._name_and_hints_from_parameter(update)
|
386
442
|
@impl.start_update_with_start_workflow(
|
387
443
|
Interceptor::StartUpdateWithStartWorkflowInput.new(
|
388
444
|
update_id: id,
|
389
|
-
update
|
445
|
+
update:,
|
390
446
|
args:,
|
391
447
|
wait_for_stage:,
|
392
448
|
start_workflow_operation:,
|
449
|
+
arg_hints: arg_hints || defn_arg_hints,
|
450
|
+
result_hint: result_hint || defn_result_hint,
|
393
451
|
headers: {},
|
394
452
|
rpc_options:
|
395
453
|
)
|
@@ -405,6 +463,10 @@ module Temporalio
|
|
405
463
|
# @param start_workflow_operation [WithStartWorkflowOperation] Required with-start workflow operation. This must
|
406
464
|
# have an `id_conflict_policy` set.
|
407
465
|
# @param id [String] ID of the update.
|
466
|
+
# @param arg_hints [Array<Object>, nil] Overrides converter hints for update arguments if any. If unset/nil and the
|
467
|
+
# update definition has arg hints, those are used by default.
|
468
|
+
# @param result_hint [Object, nil] Overrides converter hint for update result if any. If unset/nil and the update
|
469
|
+
# definition has result hint, it is used by default.
|
408
470
|
# @param rpc_options [RPCOptions, nil] Advanced RPC options.
|
409
471
|
#
|
410
472
|
# @return [Object] Successful update result.
|
@@ -418,6 +480,8 @@ module Temporalio
|
|
418
480
|
*args,
|
419
481
|
start_workflow_operation:,
|
420
482
|
id: SecureRandom.uuid,
|
483
|
+
arg_hints: nil,
|
484
|
+
result_hint: nil,
|
421
485
|
rpc_options: nil
|
422
486
|
)
|
423
487
|
start_update_with_start_workflow(
|
@@ -426,6 +490,8 @@ module Temporalio
|
|
426
490
|
start_workflow_operation:,
|
427
491
|
wait_for_stage: WorkflowUpdateWaitStage::COMPLETED,
|
428
492
|
id:,
|
493
|
+
arg_hints:,
|
494
|
+
result_hint:,
|
429
495
|
rpc_options:
|
430
496
|
).result
|
431
497
|
end
|
@@ -436,6 +502,8 @@ module Temporalio
|
|
436
502
|
# @param args [Array<Object>] Signal arguments.
|
437
503
|
# @param start_workflow_operation [WithStartWorkflowOperation] Required with-start workflow operation. This may not
|
438
504
|
# support all `id_conflict_policy` options.
|
505
|
+
# @param arg_hints [Array<Object>, nil] Overrides converter hints for signal arguments if any. If unset/nil and the
|
506
|
+
# signal definition has arg hints, those are used by default.
|
439
507
|
# @param rpc_options [RPCOptions, nil] Advanced RPC options.
|
440
508
|
#
|
441
509
|
# @return [WorkflowHandle] A workflow handle to the workflow.
|
@@ -445,13 +513,16 @@ module Temporalio
|
|
445
513
|
signal,
|
446
514
|
*args,
|
447
515
|
start_workflow_operation:,
|
516
|
+
arg_hints: nil,
|
448
517
|
rpc_options: nil
|
449
518
|
)
|
519
|
+
signal, defn_arg_hints = Workflow::Definition::Signal._name_and_hints_from_parameter(signal)
|
450
520
|
@impl.signal_with_start_workflow(
|
451
521
|
Interceptor::SignalWithStartWorkflowInput.new(
|
452
|
-
signal
|
522
|
+
signal:,
|
453
523
|
args:,
|
454
524
|
start_workflow_operation:,
|
525
|
+
arg_hints: arg_hints || defn_arg_hints,
|
455
526
|
rpc_options:
|
456
527
|
)
|
457
528
|
)
|
@@ -468,7 +539,40 @@ module Temporalio
|
|
468
539
|
#
|
469
540
|
# @see https://docs.temporal.io/visibility
|
470
541
|
def list_workflows(query = nil, rpc_options: nil)
|
471
|
-
|
542
|
+
next_page_token = nil
|
543
|
+
Enumerator.new do |yielder|
|
544
|
+
loop do
|
545
|
+
list_workflow_page_input = Interceptor::ListWorkflowPageInput.new(
|
546
|
+
query: query,
|
547
|
+
rpc_options: rpc_options,
|
548
|
+
next_page_token: next_page_token,
|
549
|
+
page_size: nil
|
550
|
+
)
|
551
|
+
page = @impl.list_workflow_page(list_workflow_page_input)
|
552
|
+
page.executions.each { |execution| yielder << execution }
|
553
|
+
next_page_token = page.next_page_token
|
554
|
+
break if (next_page_token || '').empty?
|
555
|
+
end
|
556
|
+
end
|
557
|
+
end
|
558
|
+
|
559
|
+
# List workflows one page at a time.
|
560
|
+
#
|
561
|
+
# @param query [String, nil] A Temporal visibility list filter.
|
562
|
+
# @param page_size [Integer, nil] Maximum number of results to return.
|
563
|
+
# @param next_page_token [String, nil] Token for the next page of results. If not set, the first page is returned.
|
564
|
+
# @param rpc_options [RPCOptions, nil] Advanced RPC options.
|
565
|
+
#
|
566
|
+
# @return [ListWorkflowPage] Page of workflow executions, along with a next_page_token to keep fetching.
|
567
|
+
#
|
568
|
+
# @raise [Error::RPCError] RPC error from call.
|
569
|
+
#
|
570
|
+
# @see https://docs.temporal.io/visibility
|
571
|
+
def list_workflow_page(query = nil, page_size: nil, next_page_token: nil, rpc_options: nil)
|
572
|
+
@impl.list_workflow_page(Interceptor::ListWorkflowPageInput.new(query:,
|
573
|
+
next_page_token:,
|
574
|
+
page_size:,
|
575
|
+
rpc_options:))
|
472
576
|
end
|
473
577
|
|
474
578
|
# Count workflows.
|
@@ -38,4 +38,18 @@ module Temporalio
|
|
38
38
|
# Terminate the running workflow before starting a new one.
|
39
39
|
TERMINATE_EXISTING = Api::Enums::V1::WorkflowIdConflictPolicy::WORKFLOW_ID_CONFLICT_POLICY_TERMINATE_EXISTING
|
40
40
|
end
|
41
|
+
|
42
|
+
# Specifies when a workflow might move from a worker of one Build Id to another.
|
43
|
+
#
|
44
|
+
# WARNING: Experimental API.
|
45
|
+
module VersioningBehavior
|
46
|
+
# Unspecified versioning behavior. By default, workers opting into worker versioning will
|
47
|
+
# be required to specify a behavior.
|
48
|
+
UNSPECIFIED = Api::Enums::V1::VersioningBehavior::VERSIONING_BEHAVIOR_UNSPECIFIED
|
49
|
+
# The workflow will be pinned to the current Build ID unless manually moved.
|
50
|
+
PINNED = Api::Enums::V1::VersioningBehavior::VERSIONING_BEHAVIOR_PINNED
|
51
|
+
# The workflow will automatically move to the latest version (default Build ID of the task
|
52
|
+
# queue) when the next task is dispatched.
|
53
|
+
AUTO_UPGRADE = Api::Enums::V1::VersioningBehavior::VERSIONING_BEHAVIOR_AUTO_UPGRADE
|
54
|
+
end
|
41
55
|
end
|
@@ -452,16 +452,20 @@ module Temporalio
|
|
452
452
|
attributes = { 'temporalWorkflowID' => Temporalio::Workflow.info.workflow_id,
|
453
453
|
'temporalRunID' => Temporalio::Workflow.info.run_id }.merge(attributes)
|
454
454
|
|
455
|
-
|
456
|
-
# which uses error highlighting and
|
455
|
+
time = Temporalio::Workflow.now.dup
|
456
|
+
# Disable illegal call tracing because OTel asks for full exception message which uses error highlighting and
|
457
|
+
# such which accesses File#path, and they also use loggers accessing current time
|
457
458
|
Temporalio::Workflow::Unsafe.illegal_call_tracing_disabled do
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
459
|
+
# Disable durable scheduler because 1) synchronous/non-batch span processors in OTel use network (though
|
460
|
+
# could have just used Unafe.io_enabled for this if not for the next point) and 2) OTel uses Ruby Timeout
|
461
|
+
# which we don't want to use durable timers.
|
462
|
+
Temporalio::Workflow::Unsafe.durable_scheduler_disabled do
|
463
|
+
span = root.tracer.start_span(name, attributes:, links:, start_timestamp: time, kind:) # steep:ignore
|
464
|
+
# Record exception if present
|
465
|
+
span.record_exception(exception) if exception
|
466
|
+
# Finish the span (returns self)
|
467
|
+
span.finish(end_timestamp: time)
|
468
|
+
end
|
465
469
|
end
|
466
470
|
end
|
467
471
|
end
|
@@ -40,9 +40,10 @@ module Temporalio
|
|
40
40
|
# Convert a Ruby value to a payload and encode it.
|
41
41
|
#
|
42
42
|
# @param value [Object] Ruby value.
|
43
|
+
# @param hint [Object, nil] Hint, if any, to assist conversion.
|
43
44
|
# @return [Api::Common::V1::Payload] Converted and encoded payload.
|
44
|
-
def to_payload(value)
|
45
|
-
payload = payload_converter.to_payload(value)
|
45
|
+
def to_payload(value, hint: nil)
|
46
|
+
payload = payload_converter.to_payload(value, hint:)
|
46
47
|
payload = payload_codec.encode([payload]).first if payload_codec
|
47
48
|
payload
|
48
49
|
end
|
@@ -50,9 +51,13 @@ module Temporalio
|
|
50
51
|
# Convert multiple Ruby values to a payload set and encode it.
|
51
52
|
#
|
52
53
|
# @param values [Object] Ruby values, converted to array via {::Array}.
|
54
|
+
# @param hints [Array<Object>, nil] Hints, if any, to assist conversion. Note, when using the default converter
|
55
|
+
# that converts a payload at a time, hints for each value are taken from the array at that value's index. So if
|
56
|
+
# there are fewer hints than values, some values will not have a hint. Similarly if there are more hints than
|
57
|
+
# values, the trailing hints are not used.
|
53
58
|
# @return [Api::Common::V1::Payloads] Converted and encoded payload set.
|
54
|
-
def to_payloads(values)
|
55
|
-
payloads = payload_converter.to_payloads(values)
|
59
|
+
def to_payloads(values, hints: nil)
|
60
|
+
payloads = payload_converter.to_payloads(values, hints:)
|
56
61
|
payloads.payloads.replace(payload_codec.encode(payloads.payloads)) if payload_codec && !payloads.payloads.empty?
|
57
62
|
payloads
|
58
63
|
end
|
@@ -60,23 +65,28 @@ module Temporalio
|
|
60
65
|
# Decode and convert a payload to a Ruby value.
|
61
66
|
#
|
62
67
|
# @param payload [Api::Common::V1::Payload] Encoded payload.
|
68
|
+
# @param hint [Object, nil] Hint, if any, to assist conversion.
|
63
69
|
# @return [Object] Decoded and converted Ruby value.
|
64
|
-
def from_payload(payload)
|
70
|
+
def from_payload(payload, hint: nil)
|
65
71
|
payload = payload_codec.decode([payload]).first if payload_codec
|
66
|
-
payload_converter.from_payload(payload)
|
72
|
+
payload_converter.from_payload(payload, hint:)
|
67
73
|
end
|
68
74
|
|
69
75
|
# Decode and convert a payload set to Ruby values.
|
70
76
|
#
|
71
77
|
# @param payloads [Api::Common::V1::Payloads, nil] Encoded payload set.
|
78
|
+
# @param hints [Array<Object>, nil] Hints, if any, to assist conversion. Note, when using the default converter
|
79
|
+
# that converts a value at a time, hints for each payload are taken from the array at that payload's index. So
|
80
|
+
# if there are fewer hints than payloads, some payloads will not have a hint. Similarly if there are more hints
|
81
|
+
# than payloads, the trailing hints are not used.
|
72
82
|
# @return [Array<Object>] Decoded and converted Ruby values.
|
73
|
-
def from_payloads(payloads)
|
83
|
+
def from_payloads(payloads, hints: nil)
|
74
84
|
return [] unless payloads && !payloads.payloads.empty?
|
75
85
|
|
76
86
|
if payload_codec && !payloads.payloads.empty?
|
77
87
|
payloads = Api::Common::V1::Payloads.new(payloads: payload_codec.decode(payloads.payloads))
|
78
88
|
end
|
79
|
-
payload_converter.from_payloads(payloads)
|
89
|
+
payload_converter.from_payloads(payloads, hints:)
|
80
90
|
end
|
81
91
|
|
82
92
|
# Convert a Ruby error to a Temporal failure and encode it.
|
@@ -45,7 +45,8 @@ module Temporalio
|
|
45
45
|
type: error.type,
|
46
46
|
non_retryable: error.non_retryable,
|
47
47
|
details: converter.to_payloads(error.details),
|
48
|
-
next_retry_delay: Internal::ProtoUtils.seconds_to_duration(error.next_retry_delay)
|
48
|
+
next_retry_delay: Internal::ProtoUtils.seconds_to_duration(error.next_retry_delay),
|
49
|
+
category: error.category
|
49
50
|
)
|
50
51
|
when Error::TimeoutError
|
51
52
|
failure.timeout_failure_info = Api::Failure::V1::TimeoutFailureInfo.new(
|
@@ -85,7 +86,7 @@ module Temporalio
|
|
85
86
|
)
|
86
87
|
else
|
87
88
|
failure.application_failure_info = Api::Failure::V1::ApplicationFailureInfo.new(
|
88
|
-
type: error.class.name
|
89
|
+
type: error.class.name.to_s.split('::').last
|
89
90
|
)
|
90
91
|
end
|
91
92
|
|
@@ -132,7 +133,9 @@ module Temporalio
|
|
132
133
|
non_retryable: failure.application_failure_info.non_retryable,
|
133
134
|
next_retry_delay: Internal::ProtoUtils.duration_to_seconds(
|
134
135
|
failure.application_failure_info.next_retry_delay
|
135
|
-
)
|
136
|
+
),
|
137
|
+
category: Internal::ProtoUtils.enum_to_int(Api::Enums::V1::ApplicationErrorCategory,
|
138
|
+
failure.application_failure_info.category)
|
136
139
|
)
|
137
140
|
elsif failure.timeout_failure_info
|
138
141
|
Error::TimeoutError.new(
|
@@ -16,7 +16,7 @@ module Temporalio
|
|
16
16
|
end
|
17
17
|
|
18
18
|
# (see Encoding.to_payload)
|
19
|
-
def to_payload(value)
|
19
|
+
def to_payload(value, hint: nil) # rubocop:disable Lint/UnusedMethodArgument
|
20
20
|
return nil unless value.nil?
|
21
21
|
|
22
22
|
Api::Common::V1::Payload.new(
|
@@ -25,7 +25,7 @@ module Temporalio
|
|
25
25
|
end
|
26
26
|
|
27
27
|
# (see Encoding.from_payload)
|
28
|
-
def from_payload(payload) # rubocop:disable Lint/UnusedMethodArgument
|
28
|
+
def from_payload(payload, hint: nil) # rubocop:disable Lint/UnusedMethodArgument
|
29
29
|
nil
|
30
30
|
end
|
31
31
|
end
|
@@ -16,7 +16,7 @@ module Temporalio
|
|
16
16
|
end
|
17
17
|
|
18
18
|
# (see Encoding.to_payload)
|
19
|
-
def to_payload(value)
|
19
|
+
def to_payload(value, hint: nil) # rubocop:disable Lint/UnusedMethodArgument
|
20
20
|
return nil unless value.is_a?(String) && value.encoding == ::Encoding::ASCII_8BIT
|
21
21
|
|
22
22
|
Temporalio::Api::Common::V1::Payload.new(
|
@@ -26,7 +26,7 @@ module Temporalio
|
|
26
26
|
end
|
27
27
|
|
28
28
|
# (see Encoding.from_payload)
|
29
|
-
def from_payload(payload)
|
29
|
+
def from_payload(payload, hint: nil) # rubocop:disable Lint/UnusedMethodArgument
|
30
30
|
payload.data
|
31
31
|
end
|
32
32
|
end
|
@@ -17,7 +17,7 @@ module Temporalio
|
|
17
17
|
end
|
18
18
|
|
19
19
|
# (see Encoding.to_payload)
|
20
|
-
def to_payload(value)
|
20
|
+
def to_payload(value, hint: nil) # rubocop:disable Lint/UnusedMethodArgument
|
21
21
|
return nil unless value.is_a?(Google::Protobuf::MessageExts)
|
22
22
|
|
23
23
|
# @type var value: Google::Protobuf::MessageExts
|
@@ -28,7 +28,7 @@ module Temporalio
|
|
28
28
|
end
|
29
29
|
|
30
30
|
# (see Encoding.from_payload)
|
31
|
-
def from_payload(payload)
|
31
|
+
def from_payload(payload, hint: nil) # rubocop:disable Lint/UnusedMethodArgument
|
32
32
|
type = payload.metadata['messageType']
|
33
33
|
# @type var desc: untyped
|
34
34
|
desc = Google::Protobuf::DescriptorPool.generated_pool.lookup(type)
|
@@ -32,14 +32,15 @@ module Temporalio
|
|
32
32
|
# Convert Ruby value to a payload by going over each encoding converter in order until one can convert.
|
33
33
|
#
|
34
34
|
# @param value [Object] Ruby value to convert.
|
35
|
+
# @param hint [Object, nil] Hint, if any, to assist conversion.
|
35
36
|
# @return [Api::Common::V1::Payload] Converted payload.
|
36
37
|
# @raise [ConverterNotFound] If no converters can process the value.
|
37
|
-
def to_payload(value)
|
38
|
+
def to_payload(value, hint: nil)
|
38
39
|
# As a special case, raw values just return the payload within
|
39
40
|
return value.payload if value.is_a?(RawValue)
|
40
41
|
|
41
42
|
converters.each_value do |converter|
|
42
|
-
payload = converter.to_payload(value)
|
43
|
+
payload = converter.to_payload(value, hint:)
|
43
44
|
return payload unless payload.nil?
|
44
45
|
end
|
45
46
|
raise ConverterNotFound, "Value of type #{value} has no known converter"
|
@@ -48,17 +49,18 @@ module Temporalio
|
|
48
49
|
# Convert payload to Ruby value based on its +encoding+ metadata on the payload.
|
49
50
|
#
|
50
51
|
# @param payload [Api::Common::V1::Payload] Payload to convert.
|
52
|
+
# @param hint [Object, nil] Hint, if any, to assist conversion.
|
51
53
|
# @return [Object] Converted Ruby value.
|
52
54
|
# @raise [EncodingNotSet] If encoding not set on the metadata.
|
53
55
|
# @raise [ConverterNotFound] If no converter found for the encoding.
|
54
|
-
def from_payload(payload)
|
56
|
+
def from_payload(payload, hint: nil)
|
55
57
|
encoding = payload.metadata['encoding']
|
56
58
|
raise EncodingNotSet, 'Missing payload encoding' unless encoding
|
57
59
|
|
58
60
|
converter = converters[encoding]
|
59
61
|
raise ConverterNotFound, "No converter for encoding #{encoding}" unless converter
|
60
62
|
|
61
|
-
converter.from_payload(payload)
|
63
|
+
converter.from_payload(payload, hint:)
|
62
64
|
end
|
63
65
|
end
|
64
66
|
end
|
@@ -16,8 +16,9 @@ module Temporalio
|
|
16
16
|
# handle it, the resulting payload must have +encoding+ metadata on the payload set to the value of {encoding}.
|
17
17
|
#
|
18
18
|
# @param value [Object] Ruby value to possibly convert.
|
19
|
+
# @param hint [Object, nil] Hint, if any, to assist conversion.
|
19
20
|
# @return [Api::Common::V1::Payload, nil] Converted payload if it can handle it, +nil+ otherwise.
|
20
|
-
def to_payload(value)
|
21
|
+
def to_payload(value, hint: nil)
|
21
22
|
raise NotImplementedError
|
22
23
|
end
|
23
24
|
|
@@ -25,8 +26,9 @@ module Temporalio
|
|
25
26
|
# will error if it cannot convert.
|
26
27
|
#
|
27
28
|
# @param payload [Api::Common::V1::Payload] Payload to convert.
|
29
|
+
# @param hint [Object, nil] Hint, if any, to assist conversion.
|
28
30
|
# @return [Object] Converted Ruby value.
|
29
|
-
def from_payload(payload)
|
31
|
+
def from_payload(payload, hint: nil)
|
30
32
|
raise NotImplementedError
|
31
33
|
end
|
32
34
|
end
|
@@ -27,7 +27,7 @@ module Temporalio
|
|
27
27
|
end
|
28
28
|
|
29
29
|
# (see Encoding.to_payload)
|
30
|
-
def to_payload(value)
|
30
|
+
def to_payload(value, hint: nil) # rubocop:disable Lint/UnusedMethodArgument
|
31
31
|
Api::Common::V1::Payload.new(
|
32
32
|
metadata: { 'encoding' => ENCODING },
|
33
33
|
data: JSON.generate(value, @generate_options).b
|
@@ -35,7 +35,7 @@ module Temporalio
|
|
35
35
|
end
|
36
36
|
|
37
37
|
# (see Encoding.from_payload)
|
38
|
-
def from_payload(payload)
|
38
|
+
def from_payload(payload, hint: nil) # rubocop:disable Lint/UnusedMethodArgument
|
39
39
|
JSON.parse(payload.data, @parse_options)
|
40
40
|
end
|
41
41
|
end
|
@@ -17,7 +17,7 @@ module Temporalio
|
|
17
17
|
end
|
18
18
|
|
19
19
|
# (see Encoding.to_payload)
|
20
|
-
def to_payload(value)
|
20
|
+
def to_payload(value, hint: nil) # rubocop:disable Lint/UnusedMethodArgument
|
21
21
|
return nil unless value.is_a?(Google::Protobuf::MessageExts)
|
22
22
|
|
23
23
|
Api::Common::V1::Payload.new(
|
@@ -27,7 +27,7 @@ module Temporalio
|
|
27
27
|
end
|
28
28
|
|
29
29
|
# (see Encoding.from_payload)
|
30
|
-
def from_payload(payload)
|
30
|
+
def from_payload(payload, hint: nil) # rubocop:disable Lint/UnusedMethodArgument
|
31
31
|
type = payload.metadata['messageType']
|
32
32
|
# @type var desc: untyped
|
33
33
|
desc = Google::Protobuf::DescriptorPool.generated_pool.lookup(type)
|
@@ -34,37 +34,47 @@ module Temporalio
|
|
34
34
|
# Convert a Ruby value to a payload.
|
35
35
|
#
|
36
36
|
# @param value [Object] Ruby value.
|
37
|
+
# @param hint [Object, nil] Hint, if any, to assist conversion.
|
37
38
|
# @return [Api::Common::V1::Payload] Converted payload.
|
38
|
-
def to_payload(value)
|
39
|
+
def to_payload(value, hint: nil)
|
39
40
|
raise NotImplementedError
|
40
41
|
end
|
41
42
|
|
42
43
|
# Convert multiple Ruby values to a payload set.
|
43
44
|
#
|
44
45
|
# @param values [Object] Ruby values, converted to array via {::Array}.
|
46
|
+
# @param hints [Array<Object>, nil] Hints, if any, to assist conversion. Note, when using the default converter
|
47
|
+
# that converts a payload at a time, hints for each value are taken from the array at that value's index. So if
|
48
|
+
# there are fewer hints than values, some values will not have a hint. Similarly if there are more hints than
|
49
|
+
# values, the trailing hints are not used.
|
45
50
|
# @return [Api::Common::V1::Payloads] Converted payload set.
|
46
|
-
def to_payloads(values)
|
51
|
+
def to_payloads(values, hints: nil)
|
47
52
|
Api::Common::V1::Payloads.new(
|
48
|
-
payloads: Array(values).map { |value| to_payload(value) }
|
53
|
+
payloads: Array(values).zip(Array(hints)).map { |value, hint| to_payload(value, hint:) }
|
49
54
|
)
|
50
55
|
end
|
51
56
|
|
52
57
|
# Convert a payload to a Ruby value.
|
53
58
|
#
|
54
59
|
# @param payload [Api::Common::V1::Payload] Payload.
|
60
|
+
# @param hint [Object, nil] Hint, if any, to assist conversion.
|
55
61
|
# @return [Object] Converted Ruby value.
|
56
|
-
def from_payload(payload)
|
62
|
+
def from_payload(payload, hint: nil)
|
57
63
|
raise NotImplementedError
|
58
64
|
end
|
59
65
|
|
60
66
|
# Convert a payload set to Ruby values.
|
61
67
|
#
|
62
68
|
# @param payloads [Api::Common::V1::Payloads, nil] Payload set.
|
69
|
+
# @param hints [Array<Object>, nil] Hints, if any, to assist conversion. Note, when using the default converter
|
70
|
+
# that converts a value at a time, hints for each payload are taken from the array at that payload's index. So
|
71
|
+
# if there are fewer hints than payloads, some payloads will not have a hint. Similarly if there are more hints
|
72
|
+
# than payloads, the trailing hints are not used.
|
63
73
|
# @return [Array<Object>] Converted Ruby values.
|
64
|
-
def from_payloads(payloads)
|
74
|
+
def from_payloads(payloads, hints: nil)
|
65
75
|
return [] unless payloads
|
66
76
|
|
67
|
-
payloads.payloads.map { |payload| from_payload(payload) }
|
77
|
+
payloads.payloads.zip(Array(hints)).map { |payload, hint| from_payload(payload, hint:) }
|
68
78
|
end
|
69
79
|
end
|
70
80
|
end
|
@@ -46,6 +46,9 @@ module Temporalio
|
|
46
46
|
# @return [Float, nil] Delay in seconds before the next activity retry attempt.
|
47
47
|
attr_reader :next_retry_delay
|
48
48
|
|
49
|
+
# @return [Category] Error category.
|
50
|
+
attr_reader :category
|
51
|
+
|
49
52
|
# Create an application error.
|
50
53
|
#
|
51
54
|
# @param message [String] Error message.
|
@@ -53,18 +56,33 @@ module Temporalio
|
|
53
56
|
# @param type [String, nil] Error type.
|
54
57
|
# @param non_retryable [Boolean] Whether this error should be considered non-retryable.
|
55
58
|
# @param next_retry_delay [Float, nil] Specific amount of time to delay before next retry.
|
56
|
-
|
59
|
+
# @param category [Category] Error category.
|
60
|
+
def initialize(
|
61
|
+
message,
|
62
|
+
*details,
|
63
|
+
type: nil,
|
64
|
+
non_retryable: false,
|
65
|
+
next_retry_delay: nil,
|
66
|
+
category: Category::UNSPECIFIED
|
67
|
+
)
|
57
68
|
super(message)
|
58
69
|
@details = details
|
59
70
|
@type = type
|
60
71
|
@non_retryable = non_retryable
|
61
72
|
@next_retry_delay = next_retry_delay
|
73
|
+
@category = category
|
62
74
|
end
|
63
75
|
|
64
76
|
# @return [Boolean] Inverse of {non_retryable}.
|
65
77
|
def retryable?
|
66
78
|
!@non_retryable
|
67
79
|
end
|
80
|
+
|
81
|
+
# Error category.
|
82
|
+
module Category
|
83
|
+
UNSPECIFIED = Api::Enums::V1::ApplicationErrorCategory::APPLICATION_ERROR_CATEGORY_UNSPECIFIED
|
84
|
+
BENIGN = Api::Enums::V1::ApplicationErrorCategory::APPLICATION_ERROR_CATEGORY_BENIGN
|
85
|
+
end
|
68
86
|
end
|
69
87
|
|
70
88
|
# Error raised on workflow/activity cancellation.
|