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 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: {}