merona 1.1.6 → 1.1.8
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.
- data/frame/handler/ping_handler.rb +13 -0
- data/frame/log/2013.2.27.log +4 -0
- data/frame/main.rb +4 -0
- data/frame/merona.rb +11 -9
- data/frame/protocol/ping_protocol.rb +4 -0
- data/lib/channel/channel.rb +2 -2
- data/lib/channel/channel_pool.rb +23 -10
- data/lib/packet/packet.rb +12 -10
- data/lib/process/process_pool.rb +2 -2
- data/lib/server/connection.rb +12 -1
- data/lib/server/server.rb +22 -0
- data/tests/test_ping.rb +42 -0
- metadata +4 -2
- data/lib/packet/chat_packet.rb +0 -26
data/frame/log/2013.2.27.log
CHANGED
@@ -10,3 +10,7 @@
|
|
10
10
|
[2013:2:27:8:27:58] [LOG] : quit by user
|
11
11
|
[2013:2:27:8:29:30] [LOG] : Merona engine started
|
12
12
|
[2013:2:27:8:29:31] [LOG] : quit by user
|
13
|
+
[2013:2:27:18:44:23] [LOG] : Merona engine started
|
14
|
+
[2013:2:27:18:44:25] [LOG] : quit by user
|
15
|
+
[2013:2:27:18:44:40] [LOG] : Merona engine started
|
16
|
+
[2013:2:27:18:44:42] [LOG] : quit by user
|
data/frame/main.rb
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
# Merona main
|
2
2
|
|
3
3
|
import 'merona'
|
4
|
+
|
5
|
+
import 'handler/*'
|
6
|
+
import 'protocol/*'
|
4
7
|
import 'config/*'
|
5
8
|
|
6
9
|
begin
|
@@ -19,6 +22,7 @@ begin
|
|
19
22
|
test.add_handler ChatHandler
|
20
23
|
test.add_handler PubsubHandler
|
21
24
|
test.add_handler SyncHandler
|
25
|
+
test.add_handler PingHandler
|
22
26
|
end
|
23
27
|
|
24
28
|
rescue
|
data/frame/merona.rb
CHANGED
@@ -1,20 +1,22 @@
|
|
1
1
|
# Merona entry
|
2
2
|
|
3
3
|
require 'rubygems'
|
4
|
+
require 'fileutils'
|
4
5
|
|
5
|
-
|
6
|
-
meorna_path.reverse!
|
7
|
-
meorna_path = path.split("/", 3)[2]
|
8
|
-
meorna_path.reverse!
|
9
|
-
meorna_path += "/lib"
|
10
|
-
|
11
|
-
$LOAD_PATH << meorna_path
|
12
|
-
$LOAD_PATH << File.dirname(File.expand_path(__FILE__))
|
6
|
+
FileUtils.cd(File.dirname(File.expand_path(__FILE__)), :verbose => true)
|
13
7
|
|
8
|
+
$merona_path = Gem::bin_path('merona', 'merona')
|
9
|
+
$merona_path.reverse!
|
10
|
+
$merona_path = $merona_path.split("/", 3)[2]
|
11
|
+
$merona_path.reverse!
|
12
|
+
$merona_path += "/lib"
|
13
|
+
|
14
|
+
$LOAD_PATH << $merona_path
|
15
|
+
$LOAD_PATH << "."
|
14
16
|
|
15
17
|
def import(_path)
|
16
18
|
if _path[_path.length-1] == '*'
|
17
|
-
path =
|
19
|
+
path = $merona_path + "/" + _path
|
18
20
|
Dir[path[0..path.length-1] + "*.rb"].each {|file| require file }
|
19
21
|
path = "./" + _path
|
20
22
|
Dir[path[0..path.length-1] + "*.rb"].each {|file| require file }
|
data/lib/channel/channel.rb
CHANGED
data/lib/channel/channel_pool.rb
CHANGED
@@ -5,6 +5,12 @@ class ChannelPool
|
|
5
5
|
def dispose
|
6
6
|
end
|
7
7
|
|
8
|
+
# ä�� �̸��� ��ūȭ�ؼ� �ֻ��� ������ ä�ο� ������ �� ����
|
9
|
+
# �ڵ� ������ �����Ų��.
|
10
|
+
#
|
11
|
+
# ex ) "ch.map.party"
|
12
|
+
# "ch.map"
|
13
|
+
# "ch"
|
8
14
|
def tokenize(name, &block)
|
9
15
|
token = name.split(".")
|
10
16
|
if token.size > 1
|
@@ -18,17 +24,20 @@ class ChannelPool
|
|
18
24
|
end
|
19
25
|
end
|
20
26
|
|
27
|
+
# ������ �̸��� ä���� �����Ѵ�
|
21
28
|
def subscribe(name, client)
|
22
29
|
tokenize(name) do |t|
|
23
30
|
subscribe t, client
|
24
31
|
end
|
25
32
|
|
26
33
|
if @channel[name] == nil
|
27
|
-
@channel[name] =
|
34
|
+
@channel[name] = Channel.new
|
28
35
|
end
|
29
36
|
|
30
|
-
@channel[name].
|
37
|
+
@channel[name].subscribe client
|
31
38
|
end
|
39
|
+
|
40
|
+
# ������ �̸��� ä���� ������ �����Ѵ�
|
32
41
|
def unsubscribe(name, client)
|
33
42
|
tokenize(name) do |t|
|
34
43
|
unsubscribe t, client
|
@@ -36,21 +45,25 @@ class ChannelPool
|
|
36
45
|
|
37
46
|
return if @channel[name] == nil
|
38
47
|
|
39
|
-
@channel[name].
|
40
|
-
|
41
|
-
if @channel[name].size == 0
|
42
|
-
@channel[name] = nil
|
48
|
+
if not @channel[name].unsubscribe(client)
|
49
|
+
@channel[name].delete name
|
43
50
|
end
|
44
51
|
end
|
45
|
-
|
46
|
-
|
47
|
-
|
52
|
+
|
53
|
+
# ������ �̸��� ä�ο� ��Ŷ�� �����Ѵ�
|
54
|
+
#
|
55
|
+
# to_super ���ڰ� true�� ��� ���� ä�� ��ο��� ��Ŷ�� ����
|
56
|
+
def publish(name, packet, to_super = false)
|
57
|
+
if to_super == true
|
58
|
+
tokenize(name) do |t|
|
59
|
+
publish t, packet
|
60
|
+
end
|
48
61
|
end
|
49
62
|
|
50
63
|
return if @channel[name] == nil
|
51
64
|
|
52
65
|
@channel[name].each do |client|
|
53
|
-
client.
|
66
|
+
client.publish packet
|
54
67
|
end
|
55
68
|
end
|
56
69
|
end
|
data/lib/packet/packet.rb
CHANGED
@@ -4,15 +4,16 @@ class Packet
|
|
4
4
|
attr_accessor :data
|
5
5
|
attr_accessor :ch
|
6
6
|
|
7
|
-
def initialize
|
7
|
+
def initialize(id = 0, ch = "*")
|
8
8
|
@data = {}
|
9
9
|
|
10
|
-
@id =
|
11
|
-
@ch =
|
10
|
+
@id = id
|
11
|
+
@ch = ch
|
12
12
|
end
|
13
13
|
def dispose
|
14
14
|
end
|
15
15
|
|
16
|
+
# ��Ŷ�� ������ �ִ´�
|
16
17
|
def push(name,data)
|
17
18
|
if name == nil
|
18
19
|
return
|
@@ -20,6 +21,8 @@ class Packet
|
|
20
21
|
|
21
22
|
@data[name] = data
|
22
23
|
end
|
24
|
+
|
25
|
+
# ��Ŷ���� ������ �����´�
|
23
26
|
def get(name)
|
24
27
|
if name == nil
|
25
28
|
return
|
@@ -28,24 +31,23 @@ class Packet
|
|
28
31
|
@data[name]
|
29
32
|
end
|
30
33
|
|
34
|
+
# ��Ŷ�� ������ �ִ´�
|
31
35
|
def []=(name,data)
|
32
36
|
push(name, data)
|
33
37
|
end
|
38
|
+
|
39
|
+
# ��Ŷ���� ������ �����´�
|
34
40
|
def [](name)
|
35
41
|
get(name)
|
36
42
|
end
|
37
43
|
|
44
|
+
# ��Ŷ�� ������ ä���� �����Ѵ�
|
38
45
|
def ch=(ch)
|
39
46
|
@ch = ch
|
40
47
|
end
|
48
|
+
|
49
|
+
# ��Ŷ�� ä�� ���� �����´�
|
41
50
|
def ch
|
42
51
|
@ch
|
43
52
|
end
|
44
|
-
|
45
|
-
def type=(type)
|
46
|
-
@data["type"] = type
|
47
|
-
end
|
48
|
-
def type
|
49
|
-
@data["type"]
|
50
|
-
end
|
51
53
|
end
|
data/lib/process/process_pool.rb
CHANGED
data/lib/server/connection.rb
CHANGED
@@ -6,6 +6,7 @@ class Connection < EM::Connection
|
|
6
6
|
attr_accessor :id
|
7
7
|
attr_reader :ip, :port
|
8
8
|
|
9
|
+
# ������ �ʱ�ȭ�� �� �ҷ����� �ҵ�
|
9
10
|
def initialize(*args)
|
10
11
|
@port, @ip = Socket.unpack_sockaddr_in(get_peername)
|
11
12
|
@server = args[0]
|
@@ -18,6 +19,7 @@ class Connection < EM::Connection
|
|
18
19
|
|
19
20
|
set_sock_opt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, CONNECTION_NODELAY)
|
20
21
|
end
|
22
|
+
# ������ ������ �� �ҷ����� �ҵ�
|
21
23
|
def unbind
|
22
24
|
@server.clients.delete self
|
23
25
|
@db.dispose
|
@@ -26,17 +28,26 @@ class Connection < EM::Connection
|
|
26
28
|
disconnect
|
27
29
|
end
|
28
30
|
|
31
|
+
# ���� Ŭ���̾�Ʈ�� ��Ŷ�� �����Ѵ�
|
32
|
+
#
|
33
|
+
# packet : ���� ��Ŷ
|
29
34
|
def send(packet)
|
30
35
|
send_object packet
|
31
36
|
end
|
37
|
+
|
38
|
+
# ���� Ŭ���̾�Ʈ�� ��Ŷ�� ���� �� �ҷ����� �ҵ�
|
39
|
+
#
|
40
|
+
# obj : ���ŵ� ��Ŷ
|
32
41
|
def receive_object(obj)
|
33
|
-
p obj
|
34
42
|
@server.process.enqueue(self, obj)
|
35
43
|
end
|
36
44
|
|
45
|
+
|
46
|
+
# ������ �����Ǿ��� �� �ҷ����� �ҵ�
|
37
47
|
def connect
|
38
48
|
Log.output("new connection from " + @ip)
|
39
49
|
end
|
50
|
+
# ������ ����� �� �ҷ����� �ҵ�
|
40
51
|
def disconnect
|
41
52
|
Log.output("lost connection " + @ip)
|
42
53
|
end
|
data/lib/server/server.rb
CHANGED
@@ -8,6 +8,11 @@ class Server
|
|
8
8
|
|
9
9
|
attr_accessor :clients
|
10
10
|
|
11
|
+
# ������ �����Ѵ�
|
12
|
+
#
|
13
|
+
# name : ������ �̸�
|
14
|
+
# port : ������ ��Ʈ
|
15
|
+
# klass : Connection �ڵ鷯 Ŭ����
|
11
16
|
def initialize(name,port,klass=Connection)
|
12
17
|
EventMachine.start_server("localhost", port, klass, self)
|
13
18
|
|
@@ -23,13 +28,22 @@ class Server
|
|
23
28
|
|
24
29
|
$server[@name] = self
|
25
30
|
end
|
31
|
+
|
32
|
+
# ������ �ڿ��� �����Ѵ�
|
26
33
|
def dispose
|
27
34
|
$server.delete @name
|
28
35
|
end
|
29
36
|
|
37
|
+
# ������ �ڵ鷯�� �߰��Ѵ�
|
38
|
+
#
|
39
|
+
# handler : �߰��� �ڵ鷯 Ŭ����
|
30
40
|
def add_handler(handler)
|
31
41
|
@handler.push handler.new
|
32
42
|
end
|
43
|
+
|
44
|
+
# ������ ��ϵ� �ڵ鷯�� �����Ѵ�
|
45
|
+
#
|
46
|
+
# handler : ������ �ڵ鷯 Ŭ����
|
33
47
|
def delete_handler(handler)
|
34
48
|
@handler.each do |value|
|
35
49
|
if value.class == handler
|
@@ -38,9 +52,17 @@ class Server
|
|
38
52
|
end
|
39
53
|
end
|
40
54
|
|
55
|
+
# �ش� ������ ������ Ŭ���̾�Ʈ ����� ���´�
|
56
|
+
#
|
57
|
+
# connection : ������ ����
|
41
58
|
def exclude(connection)
|
42
59
|
@clients.reject { |c| connection == c }
|
43
60
|
end
|
61
|
+
|
62
|
+
# ��� Ŭ���̾�Ʈ���� ��Ŷ�� ��ε�ij�����Ѵ�
|
63
|
+
#
|
64
|
+
# packet : ��ε�ij������ ��Ŷ
|
65
|
+
# exclusion : ������ Ŭ���̾�Ʈ
|
44
66
|
def broadcast(packet, exclusion = nil)
|
45
67
|
(exclusion ? exclude(exclusion) : @clients).each do |client|
|
46
68
|
client.send packet
|
data/tests/test_ping.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'eventmachine'
|
2
|
+
|
3
|
+
load '../lib/packet/packet.rb'
|
4
|
+
load '../lib/protocol/pubsub_protocol.rb'
|
5
|
+
load '../lib/protocol/sync_protocol.rb'
|
6
|
+
|
7
|
+
load 'test_util.rb'
|
8
|
+
|
9
|
+
require 'Win32API'
|
10
|
+
|
11
|
+
$t = Win32API.new("kernel32", "GetTickCount", nil, 'L')
|
12
|
+
$t.call()
|
13
|
+
|
14
|
+
class Connection < EM::Connection
|
15
|
+
include EM::P::ObjectProtocol
|
16
|
+
|
17
|
+
def initialize(*args)
|
18
|
+
p = Packet.new
|
19
|
+
p.id = Protocol::SUBSCRIBE
|
20
|
+
send_object p
|
21
|
+
|
22
|
+
p.id = 1
|
23
|
+
|
24
|
+
100.times do
|
25
|
+
p["ping"] = $t.call()
|
26
|
+
send_object p
|
27
|
+
p "send " + ($t.call() - p["ping"]).to_s
|
28
|
+
end
|
29
|
+
end
|
30
|
+
def unbind
|
31
|
+
end
|
32
|
+
|
33
|
+
def receive_object(obj)
|
34
|
+
p "reply " + ($t.call() - obj["ping"]).to_s
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
EM::run do
|
39
|
+
EM::connect "localhost", 9916, Connection
|
40
|
+
end
|
41
|
+
|
42
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: merona
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.8
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -80,7 +80,6 @@ files:
|
|
80
80
|
- lib/handler/sync_handler.rb
|
81
81
|
- lib/handler/user_handler.rb
|
82
82
|
- lib/merona.rb
|
83
|
-
- lib/packet/chat_packet.rb
|
84
83
|
- lib/packet/packet.rb
|
85
84
|
- lib/process/process_pool.rb
|
86
85
|
- lib/protocol/chat_protocol.rb
|
@@ -97,12 +96,15 @@ files:
|
|
97
96
|
- frame/config/config_server.rb
|
98
97
|
- frame/config/config_sharedmem.rb
|
99
98
|
- frame/database/account.db
|
99
|
+
- frame/handler/ping_handler.rb
|
100
100
|
- frame/log/2013.2.27.log
|
101
101
|
- frame/main.rb
|
102
102
|
- frame/merona.rb
|
103
|
+
- frame/protocol/ping_protocol.rb
|
103
104
|
- frame/run.bat
|
104
105
|
- tests/test_chat.rb
|
105
106
|
- tests/test_connect.rb
|
107
|
+
- tests/test_ping.rb
|
106
108
|
- tests/test_sqlite.rb
|
107
109
|
- tests/test_util.rb
|
108
110
|
- bin/merona
|
data/lib/packet/chat_packet.rb
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
class ChatPacket < Packet
|
2
|
-
def initialize
|
3
|
-
super
|
4
|
-
@id = Protocol::CHAT
|
5
|
-
end
|
6
|
-
|
7
|
-
def msg=(msg)
|
8
|
-
@data["msg"] = msg
|
9
|
-
end
|
10
|
-
def msg
|
11
|
-
@data["msg"]
|
12
|
-
end
|
13
|
-
|
14
|
-
def sender=(id)
|
15
|
-
@data["sender"] = id
|
16
|
-
end
|
17
|
-
def sender
|
18
|
-
@data["sender"]
|
19
|
-
end
|
20
|
-
def receiver(id)
|
21
|
-
@data["receiver"] = id
|
22
|
-
end
|
23
|
-
def receiver
|
24
|
-
@data["receiver"]
|
25
|
-
end
|
26
|
-
end
|