driq 0.2.0 → 0.3.0
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/driq.rb +28 -2
- data/lib/driq/version.rb +1 -1
- data/sample/koto/koto.html +85 -0
- data/sample/koto/koto.rb +74 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cd9bfe313c82a020e678e20a9ca2980e3e7127328a925bc22bf85ce0c6e34c9f
|
4
|
+
data.tar.gz: d28b5801801938d574a35800cad49f37e43c57b716a2b7104a12002684662fba
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 382b94d20063c64f2ee9743c5b6d5417b45cd410fdd18e5e58fda4a82863ee908a5c45e578d0f67cf842f3ac9d85160b32e3fc1bde59a6ab167d11dc8a02035a
|
7
|
+
data.tar.gz: e5a74e976a9aa30882f2d2a0fca3ec2ec93e82f97d5365f8826004959bc9dc815d98baf0ef4483dc88c525b9b86170d6c28ec20101b9fa4046d4e7def971b83d
|
data/lib/driq.rb
CHANGED
@@ -5,10 +5,11 @@ require "json"
|
|
5
5
|
class Driq
|
6
6
|
include MonitorMixin
|
7
7
|
|
8
|
-
def initialize(
|
8
|
+
def initialize(size=100)
|
9
9
|
super()
|
10
10
|
@last = 0
|
11
|
-
@
|
11
|
+
@floor = size
|
12
|
+
@ceil = size * 2
|
12
13
|
@list = []
|
13
14
|
@event = new_cond
|
14
15
|
@closed = false
|
@@ -18,6 +19,7 @@ class Driq
|
|
18
19
|
synchronize do
|
19
20
|
cell = [make_key, value]
|
20
21
|
@list.push(cell)
|
22
|
+
@list = @list.last(@floor) if @list.size > @ceil
|
21
23
|
@event.broadcast
|
22
24
|
return cell.first
|
23
25
|
end
|
@@ -72,6 +74,30 @@ class Driq
|
|
72
74
|
end
|
73
75
|
end
|
74
76
|
|
77
|
+
class DriqDownstream < Driq
|
78
|
+
def initialize(upper, size=100)
|
79
|
+
super(size)
|
80
|
+
@upper = upper
|
81
|
+
Thread.new { download }
|
82
|
+
end
|
83
|
+
|
84
|
+
def write(value)
|
85
|
+
@upper.write(value)
|
86
|
+
end
|
87
|
+
|
88
|
+
def download
|
89
|
+
while true
|
90
|
+
ary = @upper.readpartial(@last, @ceil)
|
91
|
+
synchronize do
|
92
|
+
@list += ary
|
93
|
+
@list = @list.last(@floor) if @list.size > @ceil
|
94
|
+
@last = ary.last[0]
|
95
|
+
@event.broadcast
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
75
101
|
class Driq
|
76
102
|
class EventSource
|
77
103
|
def initialize(driq = nil)
|
data/lib/driq/version.rb
CHANGED
@@ -0,0 +1,85 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>Koto</title>
|
5
|
+
</head>
|
6
|
+
<style type="text/css" media="screen">
|
7
|
+
body {
|
8
|
+
font-family: Helvetica;
|
9
|
+
background: #FFFFFF;
|
10
|
+
color: #000000;
|
11
|
+
}
|
12
|
+
|
13
|
+
.EnterTofu input {
|
14
|
+
box-sizing: border-box;
|
15
|
+
width: 100%;
|
16
|
+
padding: 16px 6px 6px 6px;
|
17
|
+
font-size: 16px;
|
18
|
+
font-weight: normal;
|
19
|
+
background: #6d84a2;
|
20
|
+
}
|
21
|
+
|
22
|
+
.ListTofu > ul {
|
23
|
+
margin: 0;
|
24
|
+
padding: 0;
|
25
|
+
}
|
26
|
+
|
27
|
+
.ListTofu > ul > li {
|
28
|
+
border-bottom: 1px solid #E0E0E0;
|
29
|
+
padding: 8px 0 8px 10px;
|
30
|
+
font-size: 14px;
|
31
|
+
font-weight: bold;
|
32
|
+
list-style: none:
|
33
|
+
}
|
34
|
+
|
35
|
+
.ListTofu > ul > li.group {
|
36
|
+
top: -1px;
|
37
|
+
margin-bottom: -2px;
|
38
|
+
border-top: 1px solid #7d7d7d;
|
39
|
+
border-bottom: 1px solid #999999;
|
40
|
+
padding: 1px 5px;
|
41
|
+
font-size: 13px;
|
42
|
+
font-weight: bold;
|
43
|
+
text-shadow: rgba(0, 0, 0, 0.4) 0 1px 0;
|
44
|
+
color: #FFFFFF;
|
45
|
+
}
|
46
|
+
</style>
|
47
|
+
<body>
|
48
|
+
<div class="EnterTofu">
|
49
|
+
<input id='enter' type='text' size='40' name='str' value='' autocomplete='off' autofocus onchange="postNews();"/>
|
50
|
+
</div>
|
51
|
+
<div class="ListTofu">
|
52
|
+
<ul id="list">
|
53
|
+
</ul>
|
54
|
+
</div>
|
55
|
+
</body>
|
56
|
+
<script>
|
57
|
+
var evt = new EventSource('stream');
|
58
|
+
var input = document.querySelector("#enter");
|
59
|
+
var eventList = document.getElementById('list');
|
60
|
+
|
61
|
+
evt.onmessage = function(e) {
|
62
|
+
var entry = JSON.parse(e.data);
|
63
|
+
|
64
|
+
var newString = document.createElement("li");
|
65
|
+
newString.textContent = entry["text"];
|
66
|
+
|
67
|
+
var newGroup = document.createElement("li");
|
68
|
+
newGroup.textContent = entry["group"];
|
69
|
+
newGroup.classList.add("group");
|
70
|
+
newGroup.style.color = entry["color"];
|
71
|
+
|
72
|
+
eventList.prepend(newGroup, newString);
|
73
|
+
|
74
|
+
document.title = entry["text"];
|
75
|
+
};
|
76
|
+
|
77
|
+
function postNews() {
|
78
|
+
var xhr = new XMLHttpRequest();
|
79
|
+
xhr.open("POST", "news");
|
80
|
+
xhr.setRequestHeader("Content-Type", "application/json");
|
81
|
+
xhr.send(JSON.stringify({"text": input.value}));
|
82
|
+
input.value = "";
|
83
|
+
}
|
84
|
+
</script>
|
85
|
+
</html>
|
data/sample/koto/koto.rb
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'webrick'
|
2
|
+
require 'driq'
|
3
|
+
require 'driq/webrick'
|
4
|
+
require 'drb'
|
5
|
+
require 'digest/md5'
|
6
|
+
|
7
|
+
class Koto
|
8
|
+
def initialize(port, drb_url)
|
9
|
+
@src = Driq::EventSource.new
|
10
|
+
@svr = WEBrick::HTTPServer.new(:Port => port)
|
11
|
+
|
12
|
+
@svr.mount_proc('/') do |req, res|
|
13
|
+
on_index(req, res)
|
14
|
+
end
|
15
|
+
|
16
|
+
@svr.mount_proc('/stream') do |req, res|
|
17
|
+
on_stream(req, res)
|
18
|
+
end
|
19
|
+
|
20
|
+
@svr.mount_proc('/news') do |req, res|
|
21
|
+
on_news(req, res)
|
22
|
+
end
|
23
|
+
|
24
|
+
@front = {"src" => @src,
|
25
|
+
"webrick" => @svr,
|
26
|
+
"body" => File.read('koto.html')}
|
27
|
+
DRb.start_service(drb_url, @front)
|
28
|
+
end
|
29
|
+
|
30
|
+
def on_index(req, res)
|
31
|
+
res.body = @front["body"]
|
32
|
+
end
|
33
|
+
|
34
|
+
def on_stream(req, res)
|
35
|
+
last_event_id = req["Last-Event-ID"] || 0
|
36
|
+
res.content_type = 'text/event-stream'
|
37
|
+
res.chunked = true
|
38
|
+
res.body = WEBrick::ChunkedStream.new(Driq::EventStream.new(@src, last_event_id))
|
39
|
+
end
|
40
|
+
|
41
|
+
def on_news(req, res)
|
42
|
+
it = make_entry(req)
|
43
|
+
@src.write(it)
|
44
|
+
res.content_type = "text/plain"
|
45
|
+
res.body = "i know";
|
46
|
+
end
|
47
|
+
|
48
|
+
Color = Hash.new do |h, k|
|
49
|
+
md5 = Digest::MD5.new
|
50
|
+
md5 << k.to_s
|
51
|
+
r = 0b01111111 & md5.digest[0].unpack("c").first
|
52
|
+
g = 0b01111111 & md5.digest[1].unpack("c").first
|
53
|
+
b = 0b01111111 & md5.digest[2].unpack("c").first
|
54
|
+
h[k] = sprintf("#%02x%02x%02x", r, g, b)
|
55
|
+
end
|
56
|
+
|
57
|
+
def make_entry(req)
|
58
|
+
text = JSON.parse(req.body)["text"] || ""
|
59
|
+
from = req["X-Forwarded-For"] || req.peeraddr[2]
|
60
|
+
color = Color[from]
|
61
|
+
group = [from, Time.now.strftime("%H:%M")].join(" @ ")
|
62
|
+
{"text" => text, "group" => group, "color" => color}
|
63
|
+
end
|
64
|
+
|
65
|
+
def start
|
66
|
+
@svr.start
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
port = Integer(ENV['TOFU_PORT']) rescue 10510
|
71
|
+
drb_url = 'druby://localhost:55443'
|
72
|
+
|
73
|
+
koto = Koto.new(port, drb_url)
|
74
|
+
koto.start
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: driq
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Masatoshi SEKI
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-01-
|
11
|
+
date: 2020-01-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: test-unit
|
@@ -81,6 +81,8 @@ files:
|
|
81
81
|
- lib/driq.rb
|
82
82
|
- lib/driq/version.rb
|
83
83
|
- lib/driq/webrick.rb
|
84
|
+
- sample/koto/koto.html
|
85
|
+
- sample/koto/koto.rb
|
84
86
|
homepage: https://github.com/seki/Driq
|
85
87
|
licenses: []
|
86
88
|
metadata: {}
|