wands 0.7.1 → 0.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2ff15ed69b467d1e411cd365eaa50eda03bbf17188e28d59af035649d03fe4d1
4
- data.tar.gz: 707706ce2ab599fbd4f5e55418c9b4b04c80f4b35534c6990c3b8f22e2db7fde
3
+ metadata.gz: e0f4387102cd8565a88e6d29beeda55459d62afa1b6d553d3024726898ce25ff
4
+ data.tar.gz: 786f17cecaf4093a46f2b7ab1d50084402a367f42cd222ec67fe33c4f6cca48e
5
5
  SHA512:
6
- metadata.gz: 422227325903cb3559d9b87d5dc652dfd7a6f15fe74f9c57d6440995552a260f73eda337bcbb302f8f816c553d0c84e1045f6eebc7f47e3d64b5d31ffbb1d55e
7
- data.tar.gz: a85c29f3f30654b3325805bb0084e22683d96273ebff267c43f34007b200f45914e79c84c64da43224ccf11ac09ad621b612d3c2aba79635ec3157093e398f07
6
+ metadata.gz: 1d53f26ba63a535f853a29d70a28f5bf8be05e820e2b0fd39519e0351091c7587b53a0cef3777fa8099fe1cd0272c1bd74aeb41269ae307a98109fbb2ef2d61f
7
+ data.tar.gz: 8e7195b9106893b2bc1fea0031b2cd88affbf374840db4dc3d196b12ed0c8366051ab8ba7d3b4b76505fbe83ecfb184ca00f39d5e2dc509ea586faef6677edb2
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Wands
4
+ module JS
5
+ # A blocking queue that can be used for waiting for asynchronous events.
6
+ class Queue
7
+
8
+ def self.wait_once
9
+ queue = new
10
+ yield queue
11
+ queue.pop
12
+ end
13
+
14
+ def initialize
15
+ @waiter = nil
16
+ @buffer = []
17
+ end
18
+
19
+ def push(message)
20
+ if @waiter
21
+ @waiter.apply message
22
+ @waiter = nil
23
+ else
24
+ @buffer << message
25
+ end
26
+ end
27
+ alias << push
28
+
29
+ def pop
30
+ # message is received
31
+ # return message
32
+ return @buffer.shift unless @buffer.empty?
33
+
34
+ # message is not received
35
+ # set promise and wait
36
+ resolve = nil
37
+ promise = ::JS.global[:Promise].new { resolve = it }
38
+ @waiter = resolve
39
+ promise.await
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "uri"
4
+ require_relative "queue"
5
+
6
+ module Wands
7
+ module JS
8
+ # WebSocket class for when JavaScript is available in the browser.
9
+ # All methods are synchronous and blocking, compatible with the Socket class.
10
+ module WebSocket
11
+ def self.prepended(base) = base.singleton_class.prepend(ClassMethods)
12
+
13
+ # The class methods module
14
+ module ClassMethods
15
+ def open(host, port)
16
+ uri = URI::HTTP.build(host:, port:)
17
+ ws = ::JS.global[:WebSocket].new(uri.to_s)
18
+
19
+ instance = new(ws)
20
+ ws.addEventListener("message") do |event|
21
+ instance << event
22
+ end
23
+
24
+ Queue.wait_once do |queue|
25
+ ws.addEventListener("open") { queue.push(nil) }
26
+ end
27
+
28
+ instance
29
+ end
30
+ end
31
+
32
+ def initialize(web_socket)
33
+ @ws = web_socket
34
+ @queue = Queue.new
35
+ end
36
+
37
+ def puts(str)
38
+ raise "socket is closed" unless @ws[:readyState] == 1
39
+
40
+ @ws.send(str)
41
+ end
42
+
43
+ def gets = @queue.pop
44
+
45
+ def <<(event) = @queue << event[:data]
46
+ end
47
+ end
48
+ end
data/lib/wands/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Wands
4
- VERSION = "0.7.1"
4
+ VERSION = "0.7.2"
5
5
  end
@@ -7,6 +7,7 @@ require "protocol/websocket/text_frame"
7
7
  require_relative "upgrade_request"
8
8
  require_relative "http_response"
9
9
  require_relative "response_exception"
10
+ require_relative "js/web_socket" if defined? JS
10
11
 
11
12
  module Wands
12
13
  # This is a class that represents WebSocket, which has the same interface as TCPSocket.
@@ -25,6 +26,7 @@ module Wands
25
26
  class WebSocket
26
27
  include Protocol::WebSocket::Headers
27
28
  extend Forwardable
29
+ prepend JS::WebSocket if defined? JS
28
30
 
29
31
  def_delegators :@socket, :addr, :remote_address, :close, :to_io, :eof?
30
32
 
@@ -82,6 +84,11 @@ module Wands
82
84
  frame.write(@socket)
83
85
  end
84
86
 
87
+ def close
88
+ @socket.close
89
+ @socket = nil
90
+ end
91
+
85
92
  private
86
93
 
87
94
  def read_next_binary_frame
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wands
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.1
4
+ version: 0.7.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - shigeru.nakajima
8
8
  bindir: exe
9
9
  cert_chain: []
10
- date: 2025-03-17 00:00:00.000000000 Z
10
+ date: 2025-03-20 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: protocol-websocket
@@ -56,6 +56,8 @@ files:
56
56
  - Rakefile
57
57
  - lib/wands.rb
58
58
  - lib/wands/http_response.rb
59
+ - lib/wands/js/queue.rb
60
+ - lib/wands/js/web_socket.rb
59
61
  - lib/wands/response_exception.rb
60
62
  - lib/wands/upgrade_request.rb
61
63
  - lib/wands/version.rb
@@ -76,7 +78,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
76
78
  requirements:
77
79
  - - ">="
78
80
  - !ruby/object:Gem::Version
79
- version: 3.1.0
81
+ version: 3.4.0
80
82
  required_rubygems_version: !ruby/object:Gem::Requirement
81
83
  requirements:
82
84
  - - ">="