17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
# File 'lib/msgpack/rpc/server.rb', line 17
def included(klass)
m = Module.new {
@@error = Class.new(StandardError) {
def initialize(label, data)
super("error ocurred on precedure \"#{label}\"")
@data = data
end
attr_reader :data
}
@@deferred = Class.new {
def initialize(id, klass)
@id = id
@klass = klass
end
def resolve(result)
packet = [1, @id, nil, result].to_msgpack
@klass.instance_eval {send_data(packet)}
class << self
undef_method :resolve, :reject
end
end
def reject(error)
packet = [1, @id, error, nil].to_msgpack
@klass.instance_eval {
send_data(packet)
if not error.kind_of?(Exception)
label = caller_locations(3..3)[0].base_label
error = @@error.new(label, error)
end
error.set_backtrace(caller(3..-1))
error_occured(error)
}
class << self
undef_method :resolve, :reject
end
end
}
klass.instance_variable_set(:@remote_public, [])
klass.instance_variable_set(:@remote_async, [])
klass.instance_variable_set(:@msgpack_options, {})
def remote_public(meth = nil)
@remote_public << meth if meth
return @remote_public
end
def remote_async(meth = nil)
@remote_async << meth if meth
return @remote_async
end
def msgpack_options(opts = :none)
if opts.nil? || opts.kind_of?(Hash)
@msgpack_options = opts
end
return @msgpack_options
end
def new_unpacker
return MessagePack::Unpacker.new(@msgpack_options || {})
end
}
klass.extend(m)
end
|