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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: beb5ee5b3d3bdf18dc5f0f228868d99aaa915f72b023d0054c38842730773be3
4
- data.tar.gz: 3d5b872a9d5e94e9ea7ffbb70764b312a484b9f66c3f2e55c9430ca4a80977ba
3
+ metadata.gz: cd9bfe313c82a020e678e20a9ca2980e3e7127328a925bc22bf85ce0c6e34c9f
4
+ data.tar.gz: d28b5801801938d574a35800cad49f37e43c57b716a2b7104a12002684662fba
5
5
  SHA512:
6
- metadata.gz: 21f8fcdead5170e9ddae226845bde6af3225fce7776cde26463f57eb45fa3c6ac04e278cbf2d82c2854e827ba3873a892a2a47d3614762f49229e70a59b5f0b8
7
- data.tar.gz: f83aed8ea7c7c7adefa6db38ad976f89f8d08a6e80911fc057adeef3033f5c644701cbd7c052708832359a447e6187303fac6d11c9a2f7b0ff92e10449ff80fd
6
+ metadata.gz: 382b94d20063c64f2ee9743c5b6d5417b45cd410fdd18e5e58fda4a82863ee908a5c45e578d0f67cf842f3ac9d85160b32e3fc1bde59a6ab167d11dc8a02035a
7
+ data.tar.gz: e5a74e976a9aa30882f2d2a0fca3ec2ec93e82f97d5365f8826004959bc9dc815d98baf0ef4483dc88c525b9b86170d6c28ec20101b9fa4046d4e7def971b83d
@@ -5,10 +5,11 @@ require "json"
5
5
  class Driq
6
6
  include MonitorMixin
7
7
 
8
- def initialize(max_size=100)
8
+ def initialize(size=100)
9
9
  super()
10
10
  @last = 0
11
- @max_size = max_size
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)
@@ -1,3 +1,3 @@
1
1
  class Driq
2
- VERSION = "0.2.0"
2
+ VERSION = "0.3.0"
3
3
  end
@@ -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>
@@ -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.2.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-03 00:00:00.000000000 Z
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: {}