|
|
@ -1,8 +1,11 @@ |
|
|
|
require_relative "proto" |
|
|
|
require_relative "hyde/hyde" |
|
|
|
require 'webrick/websocket' |
|
|
|
require "json" |
|
|
|
|
|
|
|
Users = Heimdall::UserCache.new |
|
|
|
SocketsMap = {} |
|
|
|
NotifyList = {} |
|
|
|
|
|
|
|
def _require_keys(dict,key_dict) |
|
|
|
raise KeyError, "not a dict" unless dict.kind_of? Hash |
|
|
@ -34,11 +37,6 @@ end |
|
|
|
|
|
|
|
server = Hyde::Server.new Port: 8000 do |
|
|
|
path "user" do |
|
|
|
preprocess do |ctx| |
|
|
|
puts ctx.request.query.inspect |
|
|
|
puts ctx.request.body.inspect |
|
|
|
end |
|
|
|
|
|
|
|
path "find" do |
|
|
|
index ["by-username"] |
|
|
|
|
|
|
@ -99,8 +97,9 @@ server = Hyde::Server.new Port: 8000 do |
|
|
|
new_user = Heimdall::User.new(data) |
|
|
|
Users.add(new_user) |
|
|
|
_send_json(res,{ |
|
|
|
uid: new_user.UID |
|
|
|
status: true |
|
|
|
}) |
|
|
|
NotifyList[new_user.UID] = [] |
|
|
|
rescue JSON::ParserError => jsonerror |
|
|
|
_throw_error(res,jsonerror) |
|
|
|
rescue KeyError => keyerror |
|
|
@ -117,9 +116,20 @@ server = Hyde::Server.new Port: 8000 do |
|
|
|
to: String |
|
|
|
}) |
|
|
|
new_message = Heimdall::Message.new(data) |
|
|
|
Users.get(new_message.to).direct.send(new_message) |
|
|
|
user = Users.get(new_message.to) |
|
|
|
if NotifyList[user.UID].length != 0 then |
|
|
|
NotifyList[user.UID].each { |sockid| |
|
|
|
sock = SocketsMap[sockid] |
|
|
|
msg = new_message.to_struct |
|
|
|
msg["user"] = Users.get(msg["from"]).to_card |
|
|
|
sock.puts(JSON::fast_generate(msg)) |
|
|
|
} |
|
|
|
user.direct.send_silent(new_message) |
|
|
|
else |
|
|
|
user.direct.send(new_message) |
|
|
|
end |
|
|
|
_send_json(res,{ |
|
|
|
uid: new_message.UID |
|
|
|
status: true |
|
|
|
}) |
|
|
|
rescue JSON::ParserError => jsonerror |
|
|
|
_throw_error(res,jsonerror) |
|
|
@ -174,6 +184,24 @@ server = Hyde::Server.new Port: 8000 do |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
post "listen" do |ctx| |
|
|
|
req,res = ctx.request, ctx.response |
|
|
|
begin |
|
|
|
data = _parse_json(req.body, { |
|
|
|
websocket: String, |
|
|
|
protocol_id: String |
|
|
|
}) |
|
|
|
uid = Users.get(data["protocol_id"]).UID |
|
|
|
raise KeyError, "websocket does not exist" unless SocketsMap.has_key? data["websocket"] |
|
|
|
NotifyList[uid].append data["websocket"] |
|
|
|
_send_json(res, { |
|
|
|
status: true |
|
|
|
}) |
|
|
|
rescue KeyError => keyerror |
|
|
|
_throw_error(res,keyerror) |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
post "delete" do |ctx| |
|
|
|
req,res = ctx.request, ctx.response |
|
|
|
begin |
|
|
@ -182,8 +210,10 @@ server = Hyde::Server.new Port: 8000 do |
|
|
|
}) |
|
|
|
id = data["protocol_id"] |
|
|
|
_send_json(res, { |
|
|
|
uid: Users.get(id).UID |
|
|
|
status: true |
|
|
|
}) |
|
|
|
user = Users.get(id) |
|
|
|
NotifyList.delete(user.UID) |
|
|
|
Users.delete(id) |
|
|
|
rescue Heimdall::ProtocolError => protoerr |
|
|
|
_throw_error(res,protoerr) |
|
|
@ -198,4 +228,48 @@ server = Hyde::Server.new Port: 8000 do |
|
|
|
|
|
|
|
end |
|
|
|
|
|
|
|
at_exit do |
|
|
|
server.shutdown |
|
|
|
end |
|
|
|
|
|
|
|
class WebsocketUID < Heimdall::UID |
|
|
|
def initialize |
|
|
|
@UID_prefix = "websocket" |
|
|
|
super |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
class EventServlet < WEBrick::Websocket::Servlet |
|
|
|
def socket_open(sock) |
|
|
|
@UID = WebsocketUID.new |
|
|
|
@connected_listeners = [] |
|
|
|
SocketsMap[@UID.UID] = sock |
|
|
|
sock.puts(JSON::fast_generate({ |
|
|
|
websocket: @UID.UID.to_s |
|
|
|
})) |
|
|
|
end |
|
|
|
|
|
|
|
def socket_close(sock) |
|
|
|
SocketsMap.delete @UID.UID |
|
|
|
NotifyList.each do |k,v| |
|
|
|
if v.include? @UID.UID |
|
|
|
v.delete @UID.UID |
|
|
|
end |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
def socket_text(sock,text) |
|
|
|
# do nothing |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
Thread.new do |
|
|
|
websocket_server = WEBrick::Websocket::HTTPServer.new Port:8001 |
|
|
|
websocket_server.mount "/", EventServlet |
|
|
|
websocket_server.start |
|
|
|
at_exit do |
|
|
|
websocket_server.shutdown |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
server.start |