Class: A2A::Faraday::Middleware::JsonRpc::Response

Inherits:
Faraday::Middleware
  • Object
show all
Defined in:
lib/a2a/faraday/middleware/json_rpc/response.rb

Overview

Faraday response middleware that unwraps JSON-RPC 2.0 responses and converts the result into A2A::Schema::Definition objects.

Reads env.request.context to determine which Schema class to instantiate. If no operation is set, passes through.

Raises on JSON-RPC error responses.

Instance Method Summary collapse

Instance Method Details

#on_complete(env) ⇒ Object



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/a2a/faraday/middleware/json_rpc/response.rb', line 21

def on_complete(env)
  operation = env.request.context&.dig(:a2a_operation)
  return unless operation

  parsed = env.body
  return if parsed.nil?

  # Handle string bodies (if JSON response middleware hasn't run)
  if parsed.is_a?(String)
    return if parsed.empty?
    parsed = JSON.parse(parsed)
  end

  # Handle JSON-RPC error responses
  if parsed.is_a?(Hash) && (err = parsed["error"])
    raise A2A::JsonRpcError.new(err["message"], code: err["code"], data: err["data"])
  end

  # Extract result from JSON-RPC envelope
  result = parsed.is_a?(Hash) && parsed.key?("result") ? parsed["result"] : parsed

  schema_class = operation.response_schema
  unless schema_class
    env.body = result
    return
  end

  env.body = schema_class.new(result)
rescue JSON::ParserError
  # Leave body as-is if JSON parsing fails
end