restate-sdk 0.5.1 → 0.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.
- checksums.yaml +4 -4
- data/Cargo.lock +1 -1
- data/README.md +16 -4
- data/ext/restate_internal/Cargo.toml +1 -1
- data/lib/restate/client.rb +181 -0
- data/lib/restate/config.rb +42 -0
- data/lib/restate/endpoint.rb +68 -0
- data/lib/restate/handler.rb +24 -10
- data/lib/restate/server.rb +2 -1
- data/lib/restate/server_context.rb +8 -3
- data/lib/restate/service.rb +22 -0
- data/lib/restate/service_dsl.rb +66 -2
- data/lib/restate/service_proxy.rb +84 -0
- data/lib/restate/testing.rb +7 -2
- data/lib/restate/version.rb +1 -1
- data/lib/restate/virtual_object.rb +24 -0
- data/lib/restate/workflow.rb +24 -0
- data/lib/restate.rb +297 -48
- data/lib/tapioca/dsl/compilers/restate.rb +4 -5
- data/rbi/restate-sdk.rbi +293 -18
- metadata +5 -2
data/rbi/restate-sdk.rbi
CHANGED
|
@@ -14,25 +14,204 @@ module Restate
|
|
|
14
14
|
end
|
|
15
15
|
def self.endpoint(*services, protocol: nil, identity_keys: nil); end
|
|
16
16
|
|
|
17
|
-
#
|
|
18
|
-
sig { returns(Restate::Context) }
|
|
19
|
-
def self.current_context; end
|
|
17
|
+
# ── Durable execution ──
|
|
20
18
|
|
|
21
|
-
#
|
|
22
|
-
sig
|
|
23
|
-
|
|
19
|
+
# Execute a durable side effect. Returns a DurableFuture.
|
|
20
|
+
sig do
|
|
21
|
+
params(
|
|
22
|
+
name: String, serde: T.untyped, retry_policy: T.nilable(RunRetryPolicy),
|
|
23
|
+
background: T::Boolean, action: T.proc.returns(T.untyped)
|
|
24
|
+
).returns(DurableFuture)
|
|
25
|
+
end
|
|
26
|
+
def self.run(name, serde: Restate::JsonSerde, retry_policy: nil, background: false, &action); end
|
|
27
|
+
|
|
28
|
+
# Convenience shortcut for +run(...).await+. Returns the result directly.
|
|
29
|
+
sig do
|
|
30
|
+
params(
|
|
31
|
+
name: String, serde: T.untyped, retry_policy: T.nilable(RunRetryPolicy),
|
|
32
|
+
background: T::Boolean, action: T.proc.returns(T.untyped)
|
|
33
|
+
).returns(T.untyped)
|
|
34
|
+
end
|
|
35
|
+
def self.run_sync(name, serde: Restate::JsonSerde, retry_policy: nil, background: false, &action); end
|
|
36
|
+
|
|
37
|
+
# Durable timer that survives handler restarts.
|
|
38
|
+
sig { params(seconds: Numeric).returns(DurableFuture) }
|
|
39
|
+
def self.sleep(seconds); end
|
|
40
|
+
|
|
41
|
+
# ── State operations (VirtualObject / Workflow) ──
|
|
42
|
+
|
|
43
|
+
# Durably retrieve a state entry. Returns nil if unset.
|
|
44
|
+
sig { params(name: String, serde: T.untyped).returns(T.untyped) }
|
|
45
|
+
def self.get(name, serde: Restate::JsonSerde); end
|
|
46
|
+
|
|
47
|
+
# Durably retrieve a state entry, returning a DurableFuture instead of blocking.
|
|
48
|
+
sig { params(name: String, serde: T.untyped).returns(DurableFuture) }
|
|
49
|
+
def self.get_async(name, serde: Restate::JsonSerde); end
|
|
50
|
+
|
|
51
|
+
# Durably set a state entry.
|
|
52
|
+
sig { params(name: String, value: T.untyped, serde: T.untyped).void }
|
|
53
|
+
def self.set(name, value, serde: Restate::JsonSerde); end
|
|
54
|
+
|
|
55
|
+
# Durably remove a single state entry.
|
|
56
|
+
sig { params(name: String).void }
|
|
57
|
+
def self.clear(name); end
|
|
58
|
+
|
|
59
|
+
# Durably remove all state entries.
|
|
60
|
+
sig { void }
|
|
61
|
+
def self.clear_all; end
|
|
62
|
+
|
|
63
|
+
# List all state entry names.
|
|
64
|
+
sig { returns(T.untyped) }
|
|
65
|
+
def self.state_keys; end
|
|
66
|
+
|
|
67
|
+
# List all state entry names, returning a DurableFuture.
|
|
68
|
+
sig { returns(DurableFuture) }
|
|
69
|
+
def self.state_keys_async; end
|
|
70
|
+
|
|
71
|
+
# ── Service communication ──
|
|
72
|
+
|
|
73
|
+
# Durably call a handler on a Restate service.
|
|
74
|
+
sig do
|
|
75
|
+
params(
|
|
76
|
+
service: T.any(String, T::Class[T.anything]), handler: T.any(String, Symbol),
|
|
77
|
+
arg: T.untyped, key: T.nilable(String), idempotency_key: T.nilable(String),
|
|
78
|
+
headers: T.nilable(T::Hash[String, String]), input_serde: T.untyped, output_serde: T.untyped
|
|
79
|
+
).returns(DurableCallFuture)
|
|
80
|
+
end
|
|
81
|
+
def self.service_call(service, handler, arg, key: nil, idempotency_key: nil, headers: nil,
|
|
82
|
+
input_serde: T.unsafe(nil), output_serde: T.unsafe(nil)); end
|
|
83
|
+
|
|
84
|
+
# Fire-and-forget send to a Restate service handler.
|
|
85
|
+
sig do
|
|
86
|
+
params(
|
|
87
|
+
service: T.any(String, T::Class[T.anything]), handler: T.any(String, Symbol),
|
|
88
|
+
arg: T.untyped, key: T.nilable(String), delay: T.nilable(Numeric),
|
|
89
|
+
idempotency_key: T.nilable(String), headers: T.nilable(T::Hash[String, String]),
|
|
90
|
+
input_serde: T.untyped
|
|
91
|
+
).returns(SendHandle)
|
|
92
|
+
end
|
|
93
|
+
def self.service_send(service, handler, arg, key: nil, delay: nil, idempotency_key: nil,
|
|
94
|
+
headers: nil, input_serde: T.unsafe(nil)); end
|
|
95
|
+
|
|
96
|
+
# Durably call a handler on a Restate virtual object.
|
|
97
|
+
sig do
|
|
98
|
+
params(
|
|
99
|
+
service: T.any(String, T::Class[T.anything]), handler: T.any(String, Symbol),
|
|
100
|
+
key: String, arg: T.untyped, idempotency_key: T.nilable(String),
|
|
101
|
+
headers: T.nilable(T::Hash[String, String]), input_serde: T.untyped, output_serde: T.untyped
|
|
102
|
+
).returns(DurableCallFuture)
|
|
103
|
+
end
|
|
104
|
+
def self.object_call(service, handler, key, arg, idempotency_key: nil, headers: nil,
|
|
105
|
+
input_serde: T.unsafe(nil), output_serde: T.unsafe(nil)); end
|
|
106
|
+
|
|
107
|
+
# Fire-and-forget send to a Restate virtual object handler.
|
|
108
|
+
sig do
|
|
109
|
+
params(
|
|
110
|
+
service: T.any(String, T::Class[T.anything]), handler: T.any(String, Symbol),
|
|
111
|
+
key: String, arg: T.untyped, delay: T.nilable(Numeric),
|
|
112
|
+
idempotency_key: T.nilable(String), headers: T.nilable(T::Hash[String, String]),
|
|
113
|
+
input_serde: T.untyped
|
|
114
|
+
).returns(SendHandle)
|
|
115
|
+
end
|
|
116
|
+
def self.object_send(service, handler, key, arg, delay: nil, idempotency_key: nil,
|
|
117
|
+
headers: nil, input_serde: T.unsafe(nil)); end
|
|
118
|
+
|
|
119
|
+
# Durably call a handler on a Restate workflow.
|
|
120
|
+
sig do
|
|
121
|
+
params(
|
|
122
|
+
service: T.any(String, T::Class[T.anything]), handler: T.any(String, Symbol),
|
|
123
|
+
key: String, arg: T.untyped, idempotency_key: T.nilable(String),
|
|
124
|
+
headers: T.nilable(T::Hash[String, String]), input_serde: T.untyped, output_serde: T.untyped
|
|
125
|
+
).returns(DurableCallFuture)
|
|
126
|
+
end
|
|
127
|
+
def self.workflow_call(service, handler, key, arg, idempotency_key: nil, headers: nil,
|
|
128
|
+
input_serde: T.unsafe(nil), output_serde: T.unsafe(nil)); end
|
|
129
|
+
|
|
130
|
+
# Fire-and-forget send to a Restate workflow handler.
|
|
131
|
+
sig do
|
|
132
|
+
params(
|
|
133
|
+
service: T.any(String, T::Class[T.anything]), handler: T.any(String, Symbol),
|
|
134
|
+
key: String, arg: T.untyped, delay: T.nilable(Numeric),
|
|
135
|
+
idempotency_key: T.nilable(String), headers: T.nilable(T::Hash[String, String]),
|
|
136
|
+
input_serde: T.untyped
|
|
137
|
+
).returns(SendHandle)
|
|
138
|
+
end
|
|
139
|
+
def self.workflow_send(service, handler, key, arg, delay: nil, idempotency_key: nil,
|
|
140
|
+
headers: nil, input_serde: T.unsafe(nil)); end
|
|
141
|
+
|
|
142
|
+
# Durably call a handler using raw bytes (no serialization).
|
|
143
|
+
sig do
|
|
144
|
+
params(
|
|
145
|
+
service: String, handler: String, arg: String,
|
|
146
|
+
key: T.nilable(String), idempotency_key: T.nilable(String),
|
|
147
|
+
headers: T.nilable(T::Hash[String, String])
|
|
148
|
+
).returns(DurableCallFuture)
|
|
149
|
+
end
|
|
150
|
+
def self.generic_call(service, handler, arg, key: nil, idempotency_key: nil, headers: nil); end
|
|
151
|
+
|
|
152
|
+
# Fire-and-forget send using raw bytes (no serialization).
|
|
153
|
+
sig do
|
|
154
|
+
params(
|
|
155
|
+
service: String, handler: String, arg: String,
|
|
156
|
+
key: T.nilable(String), delay: T.nilable(Numeric),
|
|
157
|
+
idempotency_key: T.nilable(String), headers: T.nilable(T::Hash[String, String])
|
|
158
|
+
).returns(SendHandle)
|
|
159
|
+
end
|
|
160
|
+
def self.generic_send(service, handler, arg, key: nil, delay: nil, idempotency_key: nil, headers: nil); end
|
|
161
|
+
|
|
162
|
+
# ── Awakeables ──
|
|
163
|
+
|
|
164
|
+
# Create an awakeable for external callbacks. Returns [awakeable_id, DurableFuture].
|
|
165
|
+
sig { params(serde: T.untyped).returns([String, DurableFuture]) }
|
|
166
|
+
def self.awakeable(serde: Restate::JsonSerde); end
|
|
24
167
|
|
|
25
|
-
#
|
|
26
|
-
sig {
|
|
27
|
-
def self.
|
|
168
|
+
# Resolve an awakeable with a success value.
|
|
169
|
+
sig { params(awakeable_id: String, payload: T.untyped, serde: T.untyped).void }
|
|
170
|
+
def self.resolve_awakeable(awakeable_id, payload, serde: Restate::JsonSerde); end
|
|
28
171
|
|
|
29
|
-
#
|
|
30
|
-
sig {
|
|
31
|
-
def self.
|
|
172
|
+
# Reject an awakeable with a terminal failure.
|
|
173
|
+
sig { params(awakeable_id: String, message: String, code: Integer).void }
|
|
174
|
+
def self.reject_awakeable(awakeable_id, message, code: 500); end
|
|
32
175
|
|
|
33
|
-
#
|
|
34
|
-
|
|
35
|
-
|
|
176
|
+
# ── Promises (Workflow only) ──
|
|
177
|
+
|
|
178
|
+
# Get a durable promise value, blocking until resolved.
|
|
179
|
+
sig { params(name: String, serde: T.untyped).returns(T.untyped) }
|
|
180
|
+
def self.promise(name, serde: Restate::JsonSerde); end
|
|
181
|
+
|
|
182
|
+
# Peek at a durable promise without blocking. Returns nil if not yet resolved.
|
|
183
|
+
sig { params(name: String, serde: T.untyped).returns(T.untyped) }
|
|
184
|
+
def self.peek_promise(name, serde: Restate::JsonSerde); end
|
|
185
|
+
|
|
186
|
+
# Resolve a durable promise with a value.
|
|
187
|
+
sig { params(name: String, payload: T.untyped, serde: T.untyped).void }
|
|
188
|
+
def self.resolve_promise(name, payload, serde: Restate::JsonSerde); end
|
|
189
|
+
|
|
190
|
+
# Reject a durable promise with a terminal failure.
|
|
191
|
+
sig { params(name: String, message: String, code: Integer).void }
|
|
192
|
+
def self.reject_promise(name, message, code: 500); end
|
|
193
|
+
|
|
194
|
+
# ── Futures ──
|
|
195
|
+
|
|
196
|
+
# Wait until any of the given futures completes. Returns [completed, remaining].
|
|
197
|
+
sig { params(futures: DurableFuture).returns([T::Array[DurableFuture], T::Array[DurableFuture]]) }
|
|
198
|
+
def self.wait_any(*futures); end
|
|
199
|
+
|
|
200
|
+
# ── Request metadata ──
|
|
201
|
+
|
|
202
|
+
# Returns metadata about the current invocation (id, headers, raw body).
|
|
203
|
+
sig { returns(T.untyped) }
|
|
204
|
+
def self.request; end
|
|
205
|
+
|
|
206
|
+
# Returns the key for this virtual object or workflow invocation.
|
|
207
|
+
sig { returns(String) }
|
|
208
|
+
def self.key; end
|
|
209
|
+
|
|
210
|
+
# ── Invocation control ──
|
|
211
|
+
|
|
212
|
+
# Request cancellation of another invocation.
|
|
213
|
+
sig { params(invocation_id: String).void }
|
|
214
|
+
def self.cancel_invocation(invocation_id); end
|
|
36
215
|
|
|
37
216
|
class TerminalError < StandardError
|
|
38
217
|
sig { returns(Integer) }
|
|
@@ -277,13 +456,106 @@ module Restate
|
|
|
277
456
|
end
|
|
278
457
|
|
|
279
458
|
# Stateless service base class.
|
|
280
|
-
class Service
|
|
459
|
+
class Service
|
|
460
|
+
sig { returns(ServiceCallProxy) }
|
|
461
|
+
def self.call; end
|
|
462
|
+
|
|
463
|
+
sig { params(delay: T.nilable(Numeric)).returns(ServiceSendProxy) }
|
|
464
|
+
def self.send!(delay: nil); end
|
|
465
|
+
end
|
|
281
466
|
|
|
282
467
|
# Keyed virtual object base class.
|
|
283
|
-
class VirtualObject
|
|
468
|
+
class VirtualObject
|
|
469
|
+
sig { params(key: String).returns(ServiceCallProxy) }
|
|
470
|
+
def self.call(key); end
|
|
471
|
+
|
|
472
|
+
sig { params(key: String, delay: T.nilable(Numeric)).returns(ServiceSendProxy) }
|
|
473
|
+
def self.send!(key, delay: nil); end
|
|
474
|
+
|
|
475
|
+
sig { params(name: Symbol, default: T.untyped, serde: T.untyped).void }
|
|
476
|
+
def self.state(name, default: nil, serde: nil); end
|
|
477
|
+
end
|
|
284
478
|
|
|
285
479
|
# Durable workflow base class.
|
|
286
|
-
class Workflow
|
|
480
|
+
class Workflow
|
|
481
|
+
sig { params(key: String).returns(ServiceCallProxy) }
|
|
482
|
+
def self.call(key); end
|
|
483
|
+
|
|
484
|
+
sig { params(key: String, delay: T.nilable(Numeric)).returns(ServiceSendProxy) }
|
|
485
|
+
def self.send!(key, delay: nil); end
|
|
486
|
+
|
|
487
|
+
sig { params(name: Symbol, default: T.untyped, serde: T.untyped).void }
|
|
488
|
+
def self.state(name, default: nil, serde: nil); end
|
|
489
|
+
end
|
|
490
|
+
|
|
491
|
+
# Proxy for fluent durable calls.
|
|
492
|
+
class ServiceCallProxy; end
|
|
493
|
+
|
|
494
|
+
# Proxy for fluent fire-and-forget sends.
|
|
495
|
+
class ServiceSendProxy; end
|
|
496
|
+
|
|
497
|
+
# Global SDK configuration.
|
|
498
|
+
class Config
|
|
499
|
+
sig { returns(String) }
|
|
500
|
+
attr_accessor :ingress_url
|
|
501
|
+
|
|
502
|
+
sig { returns(String) }
|
|
503
|
+
attr_accessor :admin_url
|
|
504
|
+
|
|
505
|
+
sig { returns(T::Hash[String, String]) }
|
|
506
|
+
attr_accessor :ingress_headers
|
|
507
|
+
|
|
508
|
+
sig { returns(T::Hash[String, String]) }
|
|
509
|
+
attr_accessor :admin_headers
|
|
510
|
+
end
|
|
511
|
+
|
|
512
|
+
# Configure the SDK globally.
|
|
513
|
+
sig { params(block: T.proc.params(arg0: Config).void).void }
|
|
514
|
+
def self.configure(&block); end
|
|
515
|
+
|
|
516
|
+
# Returns the global configuration.
|
|
517
|
+
sig { returns(Config) }
|
|
518
|
+
def self.config; end
|
|
519
|
+
|
|
520
|
+
# Returns a pre-configured Client using the global config.
|
|
521
|
+
sig { returns(Client) }
|
|
522
|
+
def self.client; end
|
|
523
|
+
|
|
524
|
+
# HTTP client for invoking Restate services and managing the runtime.
|
|
525
|
+
class Client
|
|
526
|
+
sig do
|
|
527
|
+
params(ingress_url: String, admin_url: String,
|
|
528
|
+
ingress_headers: T::Hash[String, String],
|
|
529
|
+
admin_headers: T::Hash[String, String]).void
|
|
530
|
+
end
|
|
531
|
+
def initialize(ingress_url: 'http://localhost:8080', admin_url: 'http://localhost:9070',
|
|
532
|
+
ingress_headers: {}, admin_headers: {}); end
|
|
533
|
+
|
|
534
|
+
sig { params(service: T.any(String, T::Class[T.anything])).returns(ClientServiceProxy) }
|
|
535
|
+
def service(service); end
|
|
536
|
+
|
|
537
|
+
sig { params(service: T.any(String, T::Class[T.anything]), key: String).returns(ClientServiceProxy) }
|
|
538
|
+
def object(service, key); end
|
|
539
|
+
|
|
540
|
+
sig { params(service: T.any(String, T::Class[T.anything]), key: String).returns(ClientServiceProxy) }
|
|
541
|
+
def workflow(service, key); end
|
|
542
|
+
|
|
543
|
+
sig { params(awakeable_id: String, payload: T.untyped).void }
|
|
544
|
+
def resolve_awakeable(awakeable_id, payload); end
|
|
545
|
+
|
|
546
|
+
sig { params(awakeable_id: String, message: String, code: Integer).void }
|
|
547
|
+
def reject_awakeable(awakeable_id, message, code: 500); end
|
|
548
|
+
|
|
549
|
+
sig { params(invocation_id: String).void }
|
|
550
|
+
def cancel_invocation(invocation_id); end
|
|
551
|
+
|
|
552
|
+
sig { params(invocation_id: String).void }
|
|
553
|
+
def kill_invocation(invocation_id); end
|
|
554
|
+
|
|
555
|
+
end
|
|
556
|
+
|
|
557
|
+
# Proxy for HTTP client calls.
|
|
558
|
+
class ClientServiceProxy; end
|
|
287
559
|
|
|
288
560
|
class Endpoint
|
|
289
561
|
sig { params(services: T.untyped).void }
|
|
@@ -298,6 +570,9 @@ module Restate
|
|
|
298
570
|
sig { params(key: String).void }
|
|
299
571
|
def identity_key(key); end
|
|
300
572
|
|
|
573
|
+
sig { params(klass: T.untyped, args: T.untyped, kwargs: T.untyped).returns(T.self_type) }
|
|
574
|
+
def use(klass, *args, **kwargs); end
|
|
575
|
+
|
|
301
576
|
sig { returns(T.untyped) }
|
|
302
577
|
def app; end
|
|
303
578
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: restate-sdk
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.7.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Restate Developers
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2026-03-
|
|
11
|
+
date: 2026-03-20 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: async
|
|
@@ -69,6 +69,8 @@ files:
|
|
|
69
69
|
- ext/restate_internal/extconf.rb
|
|
70
70
|
- ext/restate_internal/src/lib.rs
|
|
71
71
|
- lib/restate.rb
|
|
72
|
+
- lib/restate/client.rb
|
|
73
|
+
- lib/restate/config.rb
|
|
72
74
|
- lib/restate/context.rb
|
|
73
75
|
- lib/restate/discovery.rb
|
|
74
76
|
- lib/restate/durable_future.rb
|
|
@@ -80,6 +82,7 @@ files:
|
|
|
80
82
|
- lib/restate/server_context.rb
|
|
81
83
|
- lib/restate/service.rb
|
|
82
84
|
- lib/restate/service_dsl.rb
|
|
85
|
+
- lib/restate/service_proxy.rb
|
|
83
86
|
- lib/restate/testing.rb
|
|
84
87
|
- lib/restate/version.rb
|
|
85
88
|
- lib/restate/virtual_object.rb
|