From bb25fb5eb04df382ecb865bc02f1db06fa6a0967 Mon Sep 17 00:00:00 2001 From: Mishio595 Date: Sat, 10 Nov 2018 11:39:55 -0700 Subject: Sharding changes, non-functional --- lib/client/client.ml | 5 +++ lib/client/sharder.ml | 102 ++++++++++++++++++++++++++++++++++---------------- 2 files changed, 74 insertions(+), 33 deletions(-) (limited to 'lib') diff --git a/lib/client/client.ml b/lib/client/client.ml index e69de29..94817ab 100644 --- a/lib/client/client.ml +++ b/lib/client/client.ml @@ -0,0 +1,5 @@ +let notify t data = + Yojson.Basic.pretty_print Format.std_formatter data; + print_newline (); + print_endline t; + () \ No newline at end of file diff --git a/lib/client/sharder.ml b/lib/client/sharder.ml index df5767e..4189066 100644 --- a/lib/client/sharder.ml +++ b/lib/client/sharder.ml @@ -16,15 +16,12 @@ module Shard = struct shard: int list; send: Frame.t -> unit Lwt.t; recv: unit -> Frame.t Lwt.t; + ready: unit Lwt.t; } let parse (frame : Frame.t) = - try - frame.content - |> Yojson.Basic.from_string - with Yojson.Json_error err -> - print_endline err; - `String "" + frame.content + |> Yojson.Basic.from_string let encode term = let content = term |> Yojson.Basic.to_string in @@ -35,16 +32,56 @@ module Shard = struct let content = match payload with | None -> None | Some p -> - Some (Yojson.Basic.to_string (`Assoc [ + Some (Yojson.Basic.to_string @@ `Assoc [ ("op", `Int (Opcode.to_int ev)); ("d", p); - ])) + ]) in let frame = Frame.create ?content () in shard.send frame |> ignore; shard + let heartbeat shard = + let seq = match shard.seq with + | 0 -> `Null + | i -> `Int i + in + let payload = `Assoc [ + ("op", `Int 1); + ("d", seq); + ] in + push_frame ~payload shard HEARTBEAT + + let dispatch shard payload resolver = + let t = List.assoc "t" payload + |> Yojson.Basic.Util.to_string in + let seq = List.assoc "s" payload + |> Yojson.Basic.Util.to_int in + let data = List.assoc "d" payload in + shard.seq <- seq; + let _ = match t with + | "READY" -> Lwt.wakeup_later resolver () + | _ -> () + in + Client.notify t data; + shard + + let set_status shard game = + let d = `Assoc [ + ("status", `String "online"); + ("afk", `Bool false); + ("game", `Assoc [ + ("name", `String game); + ("type", `Int 0) + ]) + ] in + let payload = `Assoc [ + ("op", `Int 3); + ("d", d) + ] in + shard.ready >|= fun _ -> push_frame ~payload shard STATUS_UPDATE + let initialize shard data = print_endline "Initializing..."; let hb = match shard.hb with @@ -53,22 +90,15 @@ module Shard = struct Yojson.Basic.Util.to_assoc data |> Yojson.Basic.Util.to_int in - let seq = match shard.seq with - | 0 -> `Null - | i -> `Int i - in - let payload = `Assoc [ - ("op", `Int 1); - ("d", seq); - ] in + heartbeat shard |> ignore; Lwt_engine.on_timer - (Float.of_int hb_interval) + (Float.of_int hb_interval /. 1000.0) true - (fun _ev -> push_frame ~payload shard HEARTBEAT |> ignore) + (fun _ev -> heartbeat shard |> ignore) end | Some s -> s in - let shard = { shard with hb = Some hb; } in + shard.hb <- Some hb; match shard.session with | None -> let payload = `Assoc [ @@ -91,28 +121,27 @@ module Shard = struct ] in push_frame ~payload shard RECONNECT - - - let handle_frame shard (term : Yojson.Basic.json) = - Yojson.Basic.pretty_print Format.std_formatter term; - print_newline (); + let handle_frame shard (term : Yojson.Basic.json) resolver = match term with | `Assoc term -> begin + Yojson.Basic.pretty_print Format.std_formatter @@ `Assoc term; + print_newline (); let op = List.assoc "op" term |> Yojson.Basic.Util.to_int |> Opcode.from_int in match op with - | DISPATCH -> print_endline "OP 0"; shard (* TODO dispatch *) - | HEARTBEAT -> push_frame shard HEARTBEAT + | DISPATCH -> dispatch shard term resolver + | HEARTBEAT -> heartbeat shard | RECONNECT -> print_endline "OP 7"; shard (* TODO reconnect *) | INVALID_SESSION -> print_endline "OP 9"; shard (* TODO invalid session *) | HELLO -> let data = List.assoc "d" term in initialize shard data - | _opcode -> print_endline "no match"; shard + | HEARTBEAT_ACK -> shard + | opcode -> print_endline @@ "Invalid Opcode:" ^ Opcode.to_string opcode; shard end - | _ -> shard + | _ -> print_endline "Invalid payload"; shard let create data = let uri = (data.url ^ "?v=7&encoding=json") |> Uri.of_string in @@ -126,22 +155,29 @@ module Shard = struct client uri >>= fun (recv, send) -> - let rec recv_forever shard = begin - recv () + let (ready, ready_resolver) = Lwt.task () in + let rec recv_forever s = begin + s.recv () >>= fun frame -> - Lwt.return @@ handle_frame shard @@ parse frame - >>= fun shard -> recv_forever shard + match frame.opcode with + | Text -> + let p = parse frame in + handle_frame s p ready_resolver + |> Lwt.return + | _ -> Lwt.return s + >>= fun s -> recv_forever s end in let shard = { send; recv; + ready; hb = None; seq = 0; shard = data.shards; session = None; token = data.token; } in - recv_forever shard + Lwt.return (shard, recv_forever shard) (* Not sure why the return is needed *) end type t = { -- cgit v1.2.3 From 8423dfc0576b4b98de0b41738646740f27924df9 Mon Sep 17 00:00:00 2001 From: Mishio595 Date: Sat, 10 Nov 2018 13:40:37 -0700 Subject: Fix to sharding changes --- lib/client/client.ml | 6 +++--- lib/client/sharder.ml | 28 +++++++++++----------------- 2 files changed, 14 insertions(+), 20 deletions(-) (limited to 'lib') diff --git a/lib/client/client.ml b/lib/client/client.ml index 94817ab..3e90432 100644 --- a/lib/client/client.ml +++ b/lib/client/client.ml @@ -1,5 +1,5 @@ -let notify t data = - Yojson.Basic.pretty_print Format.std_formatter data; +let notify _t _data = + (* Yojson.Basic.pretty_print Format.std_formatter data; print_newline (); - print_endline t; + print_endline t; *) () \ No newline at end of file diff --git a/lib/client/sharder.ml b/lib/client/sharder.ml index 4189066..953a38f 100644 --- a/lib/client/sharder.ml +++ b/lib/client/sharder.ml @@ -38,6 +38,7 @@ module Shard = struct ]) in let frame = Frame.create ?content () in + print_endline @@ Frame.show frame; shard.send frame |> ignore; shard @@ -61,25 +62,22 @@ module Shard = struct let data = List.assoc "d" payload in shard.seq <- seq; let _ = match t with - | "READY" -> Lwt.wakeup_later resolver () + | "READY" -> Lwt.wakeup resolver () | _ -> () in Client.notify t data; shard let set_status shard game = - let d = `Assoc [ + let payload = `Assoc [ ("status", `String "online"); ("afk", `Bool false); + ("since", `Null); ("game", `Assoc [ ("name", `String game); ("type", `Int 0) ]) ] in - let payload = `Assoc [ - ("op", `Int 3); - ("d", d) - ] in shard.ready >|= fun _ -> push_frame ~payload shard STATUS_UPDATE let initialize shard data = @@ -90,7 +88,6 @@ module Shard = struct Yojson.Basic.Util.to_assoc data |> Yojson.Basic.Util.to_int in - heartbeat shard |> ignore; Lwt_engine.on_timer (Float.of_int hb_interval /. 1000.0) true @@ -124,8 +121,8 @@ module Shard = struct let handle_frame shard (term : Yojson.Basic.json) resolver = match term with | `Assoc term -> begin - Yojson.Basic.pretty_print Format.std_formatter @@ `Assoc term; - print_newline (); + (* Yojson.Basic.pretty_print Format.std_formatter @@ `Assoc term; + print_newline (); *) let op = List.assoc "op" term |> Yojson.Basic.Util.to_int |> Opcode.from_int @@ -144,7 +141,7 @@ module Shard = struct | _ -> print_endline "Invalid payload"; shard let create data = - let uri = (data.url ^ "?v=7&encoding=json") |> Uri.of_string in + let uri = (data.url ^ "?v=6&encoding=json") |> Uri.of_string in let http_uri = Uri.with_scheme uri (Some "https") in let headers = Http.Base.process_request_headers () in Resolver_lwt.resolve_uri ~uri:http_uri Resolver_lwt_unix.system >>= fun endp -> @@ -159,12 +156,9 @@ module Shard = struct let rec recv_forever s = begin s.recv () >>= fun frame -> - match frame.opcode with - | Text -> - let p = parse frame in - handle_frame s p ready_resolver - |> Lwt.return - | _ -> Lwt.return s + let p = parse frame in + handle_frame s p ready_resolver + |> Lwt.return >>= fun s -> recv_forever s end in let shard = { @@ -177,7 +171,7 @@ module Shard = struct session = None; token = data.token; } in - Lwt.return (shard, recv_forever shard) (* Not sure why the return is needed *) + Lwt.return (shard, recv_forever shard) end type t = { -- cgit v1.2.3