driq 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- 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: {}
|