comparison src/luan/modules/Rpc.luan @ 1520:d9a5405a3102

try statement
author Franklin Schmidt <fschmidt@gmail.com>
date Sun, 21 Jun 2020 18:14:13 -0600
parents 0ba144491a42
children c922446f53aa
comparison
equal deleted inserted replaced
1519:3ebf9781707c 1520:d9a5405a3102
13 local IoLuan = require "java:luan.modules.IoLuan" 13 local IoLuan = require "java:luan.modules.IoLuan"
14 local ByteArrayInputStream = require "java:java.io.ByteArrayInputStream" 14 local ByteArrayInputStream = require "java:java.io.ByteArrayInputStream"
15 local Luan = require "luan:Luan.luan" 15 local Luan = require "luan:Luan.luan"
16 local error = Luan.error 16 local error = Luan.error
17 local set_metatable = Luan.set_metatable or error() 17 local set_metatable = Luan.set_metatable or error()
18 local try = Luan.try or error()
19 local ipairs = Luan.ipairs or error() 18 local ipairs = Luan.ipairs or error()
20 local type = Luan.type or error() 19 local type = Luan.type or error()
21 local Boot = require "luan:Boot.luan" 20 local Boot = require "luan:Boot.luan"
22 local Io = require "luan:Io.luan" 21 local Io = require "luan:Io.luan"
23 local Thread = require "luan:Thread.luan" 22 local Thread = require "luan:Thread.luan"
110 client.write(call) 109 client.write(call)
111 if fn_name == "close" then 110 if fn_name == "close" then
112 client.close() 111 client.close()
113 return 112 return
114 end 113 end
115 return try { 114 try
116 function() 115 local result = client.read()
117 local result = client.read() 116 return luan_args(result.returnValues,result["in"])
118 return luan_args(result.returnValues,result["in"]) 117 catch e
118 local cause = e.java.getCause()
119 if cause ~= nil and cause.instanceof(RpcException) and cause.getMessage() == "luan" then
120 error(cause.values.get(0))
121 else
122 e.throw()
119 end 123 end
120 catch = function(e) 124 end
121 local cause = e.java.getCause()
122 if cause ~= nil and cause.instanceof(RpcException) and cause.getMessage() == "luan" then
123 error(cause.values.get(0))
124 else
125 e.throw()
126 end
127 end
128 }
129 end_function 125 end_function
130 end_function 126 end_function
131 127
132 Rpc.functions = {} 128 Rpc.functions = {}
133 129
150 local fn = fns[cmd] 146 local fn = fns[cmd]
151 if fn == nil then 147 if fn == nil then
152 server.write(JavaRpc.COMMAND_NOT_FOUND) 148 server.write(JavaRpc.COMMAND_NOT_FOUND)
153 return 149 return
154 end_if 150 end_if
155 local rtn = try { 151 local rtn
156 function() 152 try
157 return {fn(luan_args(call.args,call["in"]))} 153 rtn = {fn(luan_args(call.args,call["in"]))}
158 end 154 catch e
159 catch = function(e) 155 logger.warn(e)
160 logger.warn(e) 156 local ex = RpcException.new("luan",e.get_message())
161 local ex = RpcException.new("luan",e.get_message()) 157 server.write(ex)
162 server.write(ex) 158 return
163 return nil 159 end
164 end
165 }
166 if rtn==nil then return end
167 local binary_in, len_in = encode_binary(rtn) 160 local binary_in, len_in = encode_binary(rtn)
168 local result 161 local result
169 if binary_in == nil then 162 if binary_in == nil then
170 result = RpcResult.new(java_array(rtn)) 163 result = RpcResult.new(java_array(rtn))
171 else 164 else
209 else 202 else
210 socket_server = IoUtils.getSSLServerSocketFactory().createServerSocket(port) 203 socket_server = IoUtils.getSSLServerSocketFactory().createServerSocket(port)
211 socket_server.setEnabledCipherSuites(Rpc.cipher_suites) 204 socket_server.setEnabledCipherSuites(Rpc.cipher_suites)
212 end 205 end
213 while true do 206 while true do
214 try { 207 try
215 function() 208 local socket = socket_server.accept()
216 local socket = socket_server.accept() 209 local function server()
217 local function server() 210 local responder = nil
218 local responder = nil 211 try
219 try { 212 responder = rpc_responder(socket,fns)
220 function() 213 while not responder.is_closed() do
221 responder = rpc_responder(socket,fns) 214 responder.respond()
222 while not responder.is_closed() do 215 end
223 responder.respond() 216 catch e
224 end 217 logger.warn(e)
225 end 218 finally
226 catch = function(e) 219 responder and responder.after_close and responder.after_close()
227 logger.warn(e)
228 end
229 finally = function()
230 responder and responder.after_close and responder.after_close()
231 end
232 }
233 end 220 end
234 Thread.fork(server)
235 end 221 end
236 catch = function(e) 222 Thread.fork(server)
237 logger.error(e) 223 catch e
238 end 224 logger.error(e)
239 } 225 end
240 end_while 226 end_while
241 end_function 227 end_function
242 228
243 return Rpc 229 return Rpc