diff options
Diffstat (limited to 'pkg/net-ssh-multi-1.1/lib/net/ssh/multi/channel_proxy.rb')
-rw-r--r-- | pkg/net-ssh-multi-1.1/lib/net/ssh/multi/channel_proxy.rb | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/pkg/net-ssh-multi-1.1/lib/net/ssh/multi/channel_proxy.rb b/pkg/net-ssh-multi-1.1/lib/net/ssh/multi/channel_proxy.rb new file mode 100644 index 0000000..df5c04c --- /dev/null +++ b/pkg/net-ssh-multi-1.1/lib/net/ssh/multi/channel_proxy.rb @@ -0,0 +1,50 @@ +module Net; module SSH; module Multi + + # The ChannelProxy is a delegate class that represents a channel that has + # not yet been opened. It is only used when Net::SSH::Multi is running with + # with a concurrent connections limit (see Net::SSH::Multi::Session#concurrent_connections). + # + # You'll never need to instantiate one of these directly, and will probably + # (if all goes well!) never even notice when one of these is in use. Essentially, + # it is spawned by a Net::SSH::Multi::PendingConnection when the pending + # connection is asked to open a channel. Any actions performed on the + # channel proxy will then be recorded, until a real channel is set as the + # delegate (see #delegate_to). At that point, all recorded actions will be + # replayed on the channel, and any subsequent actions will be immediately + # delegated to the channel. + class ChannelProxy + # This is the "on confirm" callback that gets called when the real channel + # is opened. + attr_reader :on_confirm + + # Instantiates a new channel proxy with the given +on_confirm+ callback. + def initialize(&on_confirm) + @on_confirm = on_confirm + @recordings = [] + @channel = nil + end + + # Instructs the proxy to delegate all further actions to the given +channel+ + # (which must be an instance of Net::SSH::Connection::Channel). All recorded + # actions are immediately replayed, in order, against the delegate channel. + def delegate_to(channel) + @channel = channel + @recordings.each do |sym, args, block| + @channel.__send__(sym, *args, &block) + end + end + + # If a channel delegate has been specified (see #delegate_to), the method + # will be immediately sent to the delegate. Otherwise, the call is added + # to the list of recorded method calls, to be played back when a delegate + # is specified. + def method_missing(sym, *args, &block) + if @channel + @channel.__send__(sym, *args, &block) + else + @recordings << [sym, args, block] + end + end + end + +end; end; end
\ No newline at end of file |