Spaces:
Sleeping
Sleeping
File size: 1,856 Bytes
c4c046d 9a44a33 c4c046d 9a44a33 c4c046d 9a44a33 c4c046d |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 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 |
local cjson = require("cjson")
local websocket = require("resty.websocket.client")
local retried = 0
local conn = assert(websocket:new({max_payload_len = 1024 * 1024 * 8}))
assert(conn:connect("ws://localhost:8046/cgemma/session"))
while true do
local data, tp, err = conn:recv_frame()
while err == "again" do
local frag, ct
frag, ct, err = conn:recv_frame()
if ct ~= "continuation" then
conn:close()
error(err)
end
data = data..frag
end
if tp == "text" then
print(data)
io.flush()
local msg = cjson.decode(data)
if msg.op == "init" then
local bytes, err = conn:send_text(cjson.encode({
op = "create",
image = ngx.encode_base64(io.read("*a")),
lang = "zh",
poet = "海子"
}))
if not bytes then
error(err)
end
elseif msg.op == "stream" and not msg.token then
if retried == 0 then
assert(conn:send_text(cjson.encode({op = "retry"})))
elseif retried == 1 then
assert(conn:send_text(cjson.encode({
op = "retry",
lang = "en",
poet = "Emily Dickinson"
})))
elseif retried == 2 then
assert(conn:send_text(cjson.encode({op = "retry"})))
else
conn:close()
return
end
retried = retried + 1
end
elseif tp == "ping" then
local res, err = conn:send_pong()
if not res then
conn:close()
error(err)
end
elseif tp == "close" then
conn:close()
return
elseif tp ~= "pong" then
if err then
if conn.fatal then
conn:close()
error(err)
end
else
local res, err = conn:send_close(1003, "unsupported data type")
if not res then
conn:close()
error(err)
end
conn:close()
error("unsupported data type")
end
end
end
|