|
5 | 5 | require "ferrum/client/web_socket" |
6 | 6 |
|
7 | 7 | module Ferrum |
| 8 | + class SessionClient |
| 9 | + attr_reader :client, :session_id |
| 10 | + |
| 11 | + def self.event_name(event, session_id) |
| 12 | + [event, session_id].compact.join("_") |
| 13 | + end |
| 14 | + |
| 15 | + def initialize(client, session_id) |
| 16 | + @client = client |
| 17 | + @session_id = session_id |
| 18 | + end |
| 19 | + |
| 20 | + def command(method, async: false, **params) |
| 21 | + message = build_message(method, params) |
| 22 | + @client.send_message(message, async: async) |
| 23 | + end |
| 24 | + |
| 25 | + def on(event, &block) |
| 26 | + @client.on(event_name(event), &block) |
| 27 | + end |
| 28 | + |
| 29 | + def subscribed?(event) |
| 30 | + @client.subscribed?(event_name(event)) |
| 31 | + end |
| 32 | + |
| 33 | + def respond_to_missing?(name, include_private) |
| 34 | + @client.respond_to?(name, include_private) |
| 35 | + end |
| 36 | + |
| 37 | + def method_missing(name, ...) |
| 38 | + @client.send(name, ...) |
| 39 | + end |
| 40 | + |
| 41 | + def close |
| 42 | + @client.subscriber.clear(session_id: session_id) |
| 43 | + end |
| 44 | + |
| 45 | + private |
| 46 | + |
| 47 | + def build_message(method, params) |
| 48 | + @client.build_message(method, params).merge(sessionId: session_id) |
| 49 | + end |
| 50 | + |
| 51 | + def event_name(event) |
| 52 | + self.class.event_name(event, session_id) |
| 53 | + end |
| 54 | + end |
| 55 | + |
8 | 56 | class Client |
9 | 57 | extend Forwardable |
10 | 58 | delegate %i[timeout timeout=] => :options |
11 | 59 |
|
12 | | - attr_reader :options |
| 60 | + attr_reader :options, :subscriber |
13 | 61 |
|
14 | 62 | def initialize(ws_url, options) |
15 | 63 | @command_id = 0 |
@@ -54,6 +102,10 @@ def subscribed?(event) |
54 | 102 | @subscriber.subscribed?(event) |
55 | 103 | end |
56 | 104 |
|
| 105 | + def session(session_id) |
| 106 | + SessionClient.new(self, session_id) |
| 107 | + end |
| 108 | + |
57 | 109 | def close |
58 | 110 | @ws.close |
59 | 111 | # Give a thread some time to handle a tail of messages |
|
0 commit comments