restate-sdk 0.11.0 → 0.13.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 55781f5d8508c22ecf7c6e2a161f658403790fc0538e1028725e0c9c5d33ef0b
4
- data.tar.gz: ec0b68be695aaafd60188b54544533a0ee58166a3898a9d9d194b71754678fde
3
+ metadata.gz: 3ce15bde18d1b56824de0e89d3b01a2a8df327c0adf454c922d72bef60a9afae
4
+ data.tar.gz: 9ceb40425d0be8ffb705e8639a7dc911791c5e77de56965f8b9214b640c7a6e6
5
5
  SHA512:
6
- metadata.gz: 31521448b4cb29fc65cf59edbe4c46bfb88216bb565dbe18eff31ed0a58d7b68e80bd2d59ac338d422df424d2b121a96e2171eee692e9cd6a35373746313c69c
7
- data.tar.gz: a89ab1dc4a5921fd8cb73f8e9ca85229fb67a6d1468b1109f067bb298158c7022a18ba392f6f9cfd74265b2d0210289a006765e7e267ee77f56f6823eda07db2
6
+ metadata.gz: edd0c0a9a4dd9df432ca4ee736f96f96daaee2e5485437968b43c9f10de6f1acc7dea1510d2e96436d49a25045f4ef83819fbac09388a1f80dba317d86f157dd
7
+ data.tar.gz: d94297953c904448104d9b033d9eafabdc63e75f605235aedb31501070ce3b528a590ac1ab7186e4044d6f385039404c6bfbaf8d6c34a0af2d718d5a9efe0029
data/Cargo.lock CHANGED
@@ -561,7 +561,7 @@ dependencies = [
561
561
 
562
562
  [[package]]
563
563
  name = "restate_internal"
564
- version = "0.11.0"
564
+ version = "0.13.0"
565
565
  dependencies = [
566
566
  "magnus",
567
567
  "rb-sys",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "restate_internal"
3
- version = "0.11.0"
3
+ version = "0.13.0"
4
4
  edition = "2021"
5
5
  publish = false
6
6
 
@@ -129,6 +129,7 @@ struct RbFailure {
129
129
  code: u16,
130
130
  message: String,
131
131
  stacktrace: Option<String>,
132
+ metadata: Vec<(String, String)>,
132
133
  }
133
134
 
134
135
  impl RbFailure {
@@ -141,6 +142,17 @@ impl RbFailure {
141
142
  fn stacktrace(&self) -> Option<&str> {
142
143
  self.stacktrace.as_deref()
143
144
  }
145
+ fn metadata_array(&self) -> Result<RArray, Error> {
146
+ let ruby = Ruby::get().map_err(|_| Error::new(vm_error_class(), "Ruby not available"))?;
147
+ let ary = ruby.ary_new_capa(self.metadata.len());
148
+ for (k, v) in &self.metadata {
149
+ let pair = ruby.ary_new_capa(2);
150
+ pair.push(ruby.str_new(k))?;
151
+ pair.push(ruby.str_new(v))?;
152
+ ary.push(pair)?;
153
+ }
154
+ Ok(ary)
155
+ }
144
156
  }
145
157
 
146
158
  impl From<TerminalFailure> for RbFailure {
@@ -149,6 +161,7 @@ impl From<TerminalFailure> for RbFailure {
149
161
  code: f.code,
150
162
  message: f.message,
151
163
  stacktrace: None,
164
+ metadata: f.metadata,
152
165
  }
153
166
  }
154
167
  }
@@ -158,7 +171,7 @@ impl From<RbFailure> for TerminalFailure {
158
171
  TerminalFailure {
159
172
  code: f.code,
160
173
  message: f.message,
161
- metadata: vec![],
174
+ metadata: f.metadata,
162
175
  }
163
176
  }
164
177
  }
@@ -929,17 +942,36 @@ fn parse_headers_array(ary: RArray) -> Result<Vec<Header>, Error> {
929
942
 
930
943
  // Constructor functions (free functions for use with function! macro)
931
944
 
932
- fn rb_failure_new(code: u16, message: String, stacktrace: Value) -> RbFailure {
945
+ fn rb_failure_new(
946
+ code: u16,
947
+ message: String,
948
+ stacktrace: Value,
949
+ metadata: Value,
950
+ ) -> Result<RbFailure, Error> {
933
951
  let st = if stacktrace.is_nil() {
934
952
  None
935
953
  } else {
936
954
  Some(String::try_convert(stacktrace).unwrap_or_default())
937
955
  };
938
- RbFailure {
956
+ let md = if metadata.is_nil() {
957
+ Vec::new()
958
+ } else {
959
+ let ary = RArray::try_convert(metadata)?;
960
+ let mut out = Vec::with_capacity(ary.len());
961
+ for item in ary.into_iter() {
962
+ let pair = RArray::try_convert(item)?;
963
+ let k: String = pair.entry(0)?;
964
+ let v: String = pair.entry(1)?;
965
+ out.push((k, v));
966
+ }
967
+ out
968
+ };
969
+ Ok(RbFailure {
939
970
  code,
940
971
  message,
941
972
  stacktrace: st,
942
- }
973
+ metadata: md,
974
+ })
943
975
  }
944
976
 
945
977
  fn rb_exponential_retry_config_new(
@@ -1002,12 +1034,13 @@ fn init(ruby: &Ruby) -> Result<(), Error> {
1002
1034
  rh_class.define_method("status_code", method!(RbResponseHead::status_code, 0))?;
1003
1035
  rh_class.define_method("headers", method!(RbResponseHead::headers_array, 0))?;
1004
1036
 
1005
- // Failure - constructor takes (code, message, stacktrace_or_nil)
1037
+ // Failure - constructor takes (code, message, stacktrace_or_nil, metadata_or_nil)
1006
1038
  let failure_class = internal.define_class("Failure", ruby.class_object())?;
1007
- failure_class.define_singleton_method("new", function!(rb_failure_new, 3))?;
1039
+ failure_class.define_singleton_method("new", function!(rb_failure_new, 4))?;
1008
1040
  failure_class.define_method("code", method!(RbFailure::code, 0))?;
1009
1041
  failure_class.define_method("message", method!(RbFailure::message, 0))?;
1010
1042
  failure_class.define_method("stacktrace", method!(RbFailure::stacktrace, 0))?;
1043
+ failure_class.define_method("metadata", method!(RbFailure::metadata_array, 0))?;
1011
1044
 
1012
1045
  // Void, Suspended, StateKeys
1013
1046
  internal.define_class("Void", ruby.class_object())?;
@@ -20,9 +20,20 @@ module Restate
20
20
  attr_accessor :admin_url
21
21
 
22
22
  # Default headers sent with every ingress request.
23
+ # Can be a Hash or a callable (Proc/Lambda) returning a Hash.
24
+ # A callable is evaluated each time +Restate.client+ is called,
25
+ # which lets frameworks like Rails inject per-request context
26
+ # (e.g., team ID, shard routing, auth tokens).
27
+ #
28
+ # @example Static headers
29
+ # config.ingress_headers = { "Authorization" => "Bearer tok" }
30
+ #
31
+ # @example Dynamic headers
32
+ # config.ingress_headers = -> { { "X-Team-Id" => Current.team_id } }
23
33
  attr_accessor :ingress_headers
24
34
 
25
35
  # Default headers sent with every admin request.
36
+ # Accepts the same static Hash or callable forms as +ingress_headers+.
26
37
  attr_accessor :admin_headers
27
38
 
28
39
  def initialize
@@ -41,7 +41,7 @@ module Restate
41
41
  compact(
42
42
  protocolMode: protocol_mode,
43
43
  minProtocolVersion: 5,
44
- maxProtocolVersion: 5,
44
+ maxProtocolVersion: 6,
45
45
  services: services
46
46
  )
47
47
  end
@@ -133,8 +133,8 @@ module Restate
133
133
 
134
134
  # Build and return the Rack-compatible application.
135
135
  def app
136
- require_relative 'server'
137
- Server.new(self)
136
+ require_relative 'server/handler'
137
+ Server::Handler.new(self)
138
138
  end
139
139
 
140
140
  private
@@ -6,12 +6,14 @@ module Restate
6
6
  #
7
7
  # @example
8
8
  # raise Restate::TerminalError.new('not found', status_code: 404)
9
+ # raise Restate::TerminalError.new('bad input', metadata: { 'field' => 'name' })
9
10
  class TerminalError < StandardError
10
- attr_reader :status_code
11
+ attr_reader :status_code, :metadata
11
12
 
12
- def initialize(message = 'Internal Server Error', status_code: 500)
13
+ def initialize(message = 'Internal Server Error', status_code: 500, metadata: nil)
13
14
  super(message)
14
15
  @status_code = status_code
16
+ @metadata = metadata
15
17
  end
16
18
  end
17
19