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 +4 -4
- data/lib/wands/js/queue.rb +43 -0
- data/lib/wands/js/web_socket.rb +48 -0
- data/lib/wands/version.rb +1 -1
- data/lib/wands/web_socket.rb +7 -0
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e0f4387102cd8565a88e6d29beeda55459d62afa1b6d553d3024726898ce25ff
|
4
|
+
data.tar.gz: 786f17cecaf4093a46f2b7ab1d50084402a367f42cd222ec67fe33c4f6cca48e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
data/lib/wands/web_socket.rb
CHANGED
@@ -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.
|
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-
|
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.
|
81
|
+
version: 3.4.0
|
80
82
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
81
83
|
requirements:
|
82
84
|
- - ">="
|