Skip to content

Commit a41c8c5

Browse files
authored
Merge pull request #5 from browserbase/release-please--branches--main--changes--next
release: 0.4.0
2 parents e5df5ac + aa27433 commit a41c8c5

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+1415
-191
lines changed

.release-please-manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
{
2-
".": "0.3.0"
2+
".": "0.4.0"
33
}

.stats.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
configured_endpoints: 7
2-
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/browserbase%2Fstagehand-e96507dd78e76fccc77ba7fb09704da127ead6f4d73ea854e9b2150e90787ff4.yml
3-
openapi_spec_hash: 0c2548b8fdd6de6789b19123e69609c1
4-
config_hash: c3abb41dbe698d59b3bf12f393013d54
2+
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/browserbase%2Fstagehand-f7d6b6489159f611a2bfdc267ce0a6fc0455bed1ffa0c310044baaa5d8381b9b.yml
3+
openapi_spec_hash: cd88d8068abfde8382da0bed674e440c
4+
config_hash: 5c69fb596588b8ace08203858518c149

CHANGELOG.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,18 @@
11
# Changelog
22

3+
## 0.4.0 (2025-12-19)
4+
5+
Full Changelog: [v0.3.0...v0.4.0](https://github.com/browserbase/stagehand-ruby/compare/v0.3.0...v0.4.0)
6+
7+
### Features
8+
9+
* **api:** manual updates ([c93a988](https://github.com/browserbase/stagehand-ruby/commit/c93a988374918f841643a84145b3008970b665a7))
10+
11+
12+
### Bug Fixes
13+
14+
* issue where json.parse errors when receiving HTTP 204 with nobody ([fc3e31e](https://github.com/browserbase/stagehand-ruby/commit/fc3e31e00944a7fdf89e367e281bc0510847d15e))
15+
316
## 0.3.0 (2025-12-17)
417

518
Full Changelog: [v0.2.0...v0.3.0](https://github.com/browserbase/stagehand-ruby/compare/v0.2.0...v0.3.0)

Gemfile.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ GIT
1111
PATH
1212
remote: .
1313
specs:
14-
stagehand (0.3.0)
14+
stagehand (0.4.0)
1515
connection_pool
1616

1717
GEM

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ To use this gem, install via Bundler by adding the following to your application
1717
<!-- x-release-please-start-version -->
1818

1919
```ruby
20-
gem "stagehand", "~> 0.3.0"
20+
gem "stagehand", "~> 0.4.0"
2121
```
2222

2323
<!-- x-release-please-end -->

lib/stagehand.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
require_relative "stagehand/internal/type/hash_of"
4545
require_relative "stagehand/internal/type/base_model"
4646
require_relative "stagehand/internal/type/base_page"
47+
require_relative "stagehand/internal/type/base_stream"
4748
require_relative "stagehand/internal/type/request_parameters"
4849
require_relative "stagehand/internal"
4950
require_relative "stagehand/request_options"
@@ -52,6 +53,7 @@
5253
require_relative "stagehand/internal/transport/base_client"
5354
require_relative "stagehand/internal/transport/pooled_net_requester"
5455
require_relative "stagehand/client"
56+
require_relative "stagehand/internal/stream"
5557
require_relative "stagehand/models/action"
5658
require_relative "stagehand/models/model_config"
5759
require_relative "stagehand/models/session_act_params"
@@ -68,5 +70,6 @@
6870
require_relative "stagehand/models/session_observe_response"
6971
require_relative "stagehand/models/session_start_params"
7072
require_relative "stagehand/models/session_start_response"
73+
require_relative "stagehand/models/stream_event"
7174
require_relative "stagehand/models"
7275
require_relative "stagehand/resources/sessions"

lib/stagehand/internal/stream.rb

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
# frozen_string_literal: true
2+
3+
module Stagehand
4+
module Internal
5+
# @generic Elem
6+
#
7+
# @example
8+
# stream.each do |event|
9+
# puts(event)
10+
# end
11+
class Stream
12+
include Stagehand::Internal::Type::BaseStream
13+
14+
# @api private
15+
#
16+
# @return [Enumerable<generic<Elem>>]
17+
private def iterator
18+
# rubocop:disable Metrics/BlockLength
19+
@iterator ||= Stagehand::Internal::Util.chain_fused(@stream) do |y|
20+
consume = false
21+
22+
@stream.each do |msg|
23+
next if consume
24+
25+
case msg
26+
in {data: String => data} if data.start_with?("finished")
27+
consume = true
28+
next
29+
in {data: String => data} if data.start_with?("error")
30+
decoded = Kernel.then do
31+
JSON.parse(data, symbolize_names: true)
32+
rescue JSON::ParserError
33+
data
34+
end
35+
err = Stagehand::Errors::APIStatusError.for(
36+
url: @url,
37+
status: @status,
38+
headers: @headers,
39+
body: decoded,
40+
request: nil,
41+
response: @response
42+
)
43+
raise err
44+
in {event: nil, data: String => data}
45+
decoded = JSON.parse(data, symbolize_names: true)
46+
unwrapped = Stagehand::Internal::Util.dig(decoded, @unwrap)
47+
y << Stagehand::Internal::Type::Converter.coerce(@model, unwrapped)
48+
else
49+
end
50+
end
51+
end
52+
# rubocop:enable Metrics/BlockLength
53+
end
54+
end
55+
end
56+
end

lib/stagehand/internal/transport/base_client.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -549,7 +549,9 @@ def inspect
549549
)
550550
),
551551
page: T.nilable(T::Class[Stagehand::Internal::Type::BasePage[Stagehand::Internal::Type::BaseModel]]),
552-
stream: T.nilable(T::Class[T.anything]),
552+
stream: T.nilable(
553+
T::Class[Stagehand::Internal::Type::BaseStream[T.anything, Stagehand::Internal::Type::BaseModel]]
554+
),
553555
model: T.nilable(Stagehand::Internal::Type::Converter::Input),
554556
options: T.nilable(Stagehand::RequestOptions::OrHash)
555557
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
# frozen_string_literal: true
2+
3+
module Stagehand
4+
module Internal
5+
module Type
6+
# @api private
7+
#
8+
# @generic Elem
9+
#
10+
# This module provides a base implementation for streaming responses in the SDK.
11+
#
12+
# @see https://rubyapi.org/3.2/o/enumerable
13+
module BaseStream
14+
include Enumerable
15+
16+
# @return [Integer]
17+
attr_reader :status
18+
19+
# @return [Hash{String=>String}]
20+
attr_reader :headers
21+
22+
# @api public
23+
#
24+
# @return [void]
25+
def close = Stagehand::Internal::Util.close_fused!(@iterator)
26+
27+
# @api private
28+
#
29+
# @return [Enumerable<generic<Elem>>]
30+
private def iterator = (raise NotImplementedError)
31+
32+
# @api public
33+
#
34+
# @param blk [Proc]
35+
#
36+
# @yieldparam [generic<Elem>]
37+
# @return [void]
38+
def each(&blk)
39+
unless block_given?
40+
raise ArgumentError.new("A block must be given to ##{__method__}")
41+
end
42+
@iterator.each(&blk)
43+
end
44+
45+
# @api public
46+
#
47+
# @return [Enumerator<generic<Elem>>]
48+
def to_enum = @iterator
49+
50+
alias_method :enum_for, :to_enum
51+
52+
# @api private
53+
#
54+
# @param model [Class, Stagehand::Internal::Type::Converter]
55+
# @param url [URI::Generic]
56+
# @param status [Integer]
57+
# @param headers [Hash{String=>String}]
58+
# @param response [Net::HTTPResponse]
59+
# @param unwrap [Symbol, Integer, Array<Symbol, Integer>, Proc]
60+
# @param stream [Enumerable<Object>]
61+
def initialize(model:, url:, status:, headers:, response:, unwrap:, stream:)
62+
@model = model
63+
@url = url
64+
@status = status
65+
@headers = headers
66+
@response = response
67+
@unwrap = unwrap
68+
@stream = stream
69+
@iterator = iterator
70+
end
71+
72+
# @api private
73+
#
74+
# @return [String]
75+
def inspect
76+
model = Stagehand::Internal::Type::Converter.inspect(@model, depth: 1)
77+
78+
"#<#{self.class}[#{model}]:0x#{object_id.to_s(16)}>"
79+
end
80+
end
81+
end
82+
end
83+
end

lib/stagehand/internal/util.rb

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -657,7 +657,8 @@ def force_charset!(content_type, text:)
657657
def decode_content(headers, stream:, suppress_error: false)
658658
case (content_type = headers["content-type"])
659659
in Stagehand::Internal::Util::JSON_CONTENT
660-
json = stream.to_a.join
660+
return nil if (json = stream.to_a.join).empty?
661+
661662
begin
662663
JSON.parse(json, symbolize_names: true)
663664
rescue JSON::ParserError => e
@@ -667,7 +668,11 @@ def decode_content(headers, stream:, suppress_error: false)
667668
in Stagehand::Internal::Util::JSONL_CONTENT
668669
lines = decode_lines(stream)
669670
chain_fused(lines) do |y|
670-
lines.each { y << JSON.parse(_1, symbolize_names: true) }
671+
lines.each do
672+
next if _1.empty?
673+
674+
y << JSON.parse(_1, symbolize_names: true)
675+
end
671676
end
672677
in %r{^text/event-stream}
673678
lines = decode_lines(stream)

0 commit comments

Comments
 (0)