Skip to content

Commit 4a43313

Browse files
chore: attempt to clean up underlying transport when streams are GC'd (#117)
1 parent aef32b1 commit 4a43313

File tree

3 files changed

+31
-0
lines changed

3 files changed

+31
-0
lines changed

lib/openai/internal/type/base_stream.rb

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,21 @@ module Type
1111
module BaseStream
1212
include Enumerable
1313

14+
class << self
15+
# Attempt to close the underlying transport when the stream itself is garbage
16+
# collected.
17+
#
18+
# This should not be relied upon for resource clean up, as the garbage collector
19+
# is not guaranteed to run.
20+
#
21+
# @param stream [Enumerable<Object>]
22+
#
23+
# @return [Proc]
24+
#
25+
# @see https://rubyapi.org/3.1/o/objectspace#method-c-define_finalizer
26+
def defer_closing(stream) = ->(_id) { OpenAI::Internal::Util.close_fused!(stream) }
27+
end
28+
1429
# @return [void]
1530
def close = OpenAI::Internal::Util.close_fused!(@iterator)
1631

@@ -49,6 +64,8 @@ def initialize(model:, url:, status:, response:, stream:)
4964
@response = response
5065
@stream = stream
5166
@iterator = iterator
67+
68+
ObjectSpace.define_finalizer(self, OpenAI::Internal::Type::BaseStream.defer_closing(@stream))
5269
end
5370
end
5471
end

rbi/lib/openai/internal/type/base_stream.rbi

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,16 @@ module OpenAI
1010
Message = type_member(:in)
1111
Elem = type_member(:out)
1212

13+
class << self
14+
# Attempt to close the underlying transport when the stream itself is garbage
15+
# collected.
16+
#
17+
# This should not be relied upon for resource clean up, as the garbage collector
18+
# is not guaranteed to run.
19+
sig { params(stream: T::Enumerable[T.anything]).returns(T.proc.params(arg0: Integer).void) }
20+
def defer_closing(stream); end
21+
end
22+
1323
sig { void }
1424
def close; end
1525

sig/openai/internal/type/base_stream.rbs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ module OpenAI
44
module BaseStream[Message, Elem]
55
include Enumerable[Elem]
66

7+
def self.defer_closing: (
8+
Enumerable[top] stream
9+
) -> (^(Integer arg0) -> void)
10+
711
def close: -> void
812

913
private def iterator: -> Enumerable[Elem]

0 commit comments

Comments
 (0)