Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions api/JamCallbackApi.gd
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
@tool
extends JamHttpBase
class_name JamCallbackApi
extends JamHttpBase

var session_id := OS.get_environment("SESSION_ID")
var session_id: String = OS.get_environment("SESSION_ID")

func _ready():
func _ready() -> void:
super()
api_url = OS.get_environment("CALLBACK_URL")
jwt.set_token(OS.get_environment("CALLBACK_KEY"))


func send_ready() -> Result:
print("Sending ready to %s" % api_url)
return await _json_http(
Expand All @@ -20,6 +21,7 @@ func send_ready() -> Result:
}
)


func check_token(username: String, token: String) -> Result:
return await _json_http(
"",
Expand All @@ -33,6 +35,7 @@ func check_token(username: String, token: String) -> Result:
}
)


func get_vars(var_names: Array[String]) -> Result:
return await _json_http(
"",
Expand Down
90 changes: 49 additions & 41 deletions api/JamClientApi.gd
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,59 @@ enum SessionStatus {
INIT, UNKNOWN, PROVISIONING, PENDING, ACTIVATING, RUNNING, READY, DEACTIVATING, STOPPING, DEPROVISIONING, STOPPED
}

func create_game_session(region: String="us-east-2") -> Result:
return await _json_http(
"/sessions/%s" % game_id,
HTTPClient.METHOD_POST,
{
"region": region
}
)


func join_game_session(join_id: String) -> Result:
return await _json_http(
"/sessions/%s/join/%s" % [game_id, join_id],
HTTPClient.METHOD_POST,
{}
)


func get_game_session(session_id: String) -> GameSessionResult:
return GameSessionResult.from_result(
await _json_http("/sessions/%s/check/%s" % [game_id, session_id])
)


func leave_game_session(session_id: String) -> Result:
return await _json_http(
"/sessions/%s/leave/%s" % [game_id, session_id],
HTTPClient.METHOD_POST,
{}
)


func get_guest_jwt(game_id_url_parameter: String) -> Result:
return await _json_http("/guest-auth/%s" % [game_id_url_parameter])


func check_guests_allowed(game_id_url_parameter: String) -> Result:
return await _json_http("/guest-auth/%s/allowed" % [game_id_url_parameter])


class GameSessionAddress:
extends RefCounted
var ip: String
var port: int
var domain: String


class PlayerInfo:
extends RefCounted
var user_id: String
var token: String


class GameSessionResult:
extends JamHttpBase.Result
var session_id: String = ""
Expand All @@ -29,10 +71,8 @@ class GameSessionResult:
var join_id: String = ""

static func from_result(res: Result) -> GameSessionResult:

#print(res.data)

var gres = GameSessionResult.new()
var gres: GameSessionResult = GameSessionResult.new()
gres.data = res.data
gres.errored = res.errored
gres.error_msg = res.error_msg
Expand All @@ -43,8 +83,8 @@ class GameSessionResult:
gres.status = SessionStatus.get(res.data["state"], SessionStatus.UNKNOWN)
gres.session_id = res.data["id"]
gres.region = res.data["region"]
for p in res.data["players"]:
var pinfo = PlayerInfo.new()
for p: Variant in res.data["players"]:
var pinfo: PlayerInfo = PlayerInfo.new()
pinfo.user_id = p["username"]
gres.players.push_back(pinfo)
if "joinToken" in p:
Expand All @@ -57,7 +97,8 @@ class GameSessionResult:
gres.join_id = res.data["joinCode"]

return gres



func has_unusable_status() -> bool:
return errored or [
SessionStatus.UNKNOWN,
Expand All @@ -66,7 +107,8 @@ class GameSessionResult:
SessionStatus.DEPROVISIONING,
SessionStatus.STOPPED
].has(status)



func busy_progress() -> float:
if status == SessionStatus.INIT:
return 1.0 / 6.0
Expand All @@ -82,37 +124,3 @@ class GameSessionResult:
return 1.0
else:
return 0.0

func create_game_session(region: String="us-east-2") -> Result:
return await _json_http(
"/sessions/%s" % game_id,
HTTPClient.METHOD_POST,
{
"region": region
}
)

func join_game_session(join_id: String) -> Result:
return await _json_http(
"/sessions/%s/join/%s" % [game_id, join_id],
HTTPClient.METHOD_POST,
{}
)

func get_game_session(session_id: String) -> GameSessionResult:
return GameSessionResult.from_result(
await _json_http("/sessions/%s/check/%s" % [game_id, session_id])
)

func leave_game_session(session_id: String) -> Result:
return await _json_http(
"/sessions/%s/leave/%s" % [game_id, session_id],
HTTPClient.METHOD_POST,
{}
)

func get_guest_jwt(game_id: String) -> Result:
return await _json_http("/guest-auth/%s" % [game_id])

func check_guests_allowed(game_id: String) -> Result:
return await _json_http("/guest-auth/%s/allowed" % [game_id])
6 changes: 4 additions & 2 deletions api/JamDataApi.gd
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,21 @@ extends JamHttpBase

var project_id: String = ""

func _ready():
func _ready() -> void:
super()
api_url = OS.get_environment("DATA_URL")
jwt.set_token(OS.get_environment("DATA_KEY"))


func put_object(key: String, object: Dictionary) -> Result:
var path := "/proj/%s/data/%s" % [project_id, key]
return await _json_http(
path,
HTTPClient.METHOD_POST,
object
)



func get_object(key: String) -> Result:
return await _json_http(
"/proj/%s/data/%s" % [project_id, key],
Expand Down
2 changes: 1 addition & 1 deletion api/JamDevModeApi.gd
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
extends JamHttpBase
class_name JamDevModeApi
extends JamHttpBase

func get_test_key(project_id: String, release: String, test_num: int) -> Result:
return await _json_http(
Expand Down
81 changes: 43 additions & 38 deletions api/JamHttpBase.gd
Original file line number Diff line number Diff line change
@@ -1,35 +1,18 @@
@tool
extends Node
class_name JamHttpBase
extends Node

var addon_version: String = "unknown"
var api_url: String
var jwt: JamJwt = JamJwt.new()

var pool: JamHttpRequestPool

class Result:
var data: Dictionary = {}
var errored: bool = false
var error_msg: String = ""

static func err(msg: String):
var r = Result.new()
r.errored = true
r.error_msg = msg
return r

static func ok(d: Dictionary):
var r = Result.new()
r.data = d
return r

func _ready():
var dir := (self.get_script() as Script).get_path().get_base_dir()
func _ready() -> void:
var dir: String = (self.get_script() as Script).get_path().get_base_dir()

var settings = ConfigFile.new()
var err = settings.load(dir + "/../settings.cfg")
if err != OK:
var settings: ConfigFile = ConfigFile.new()
var err: Error = settings.load(dir + "/../settings.cfg")
if not err == OK:
printerr("Failed to load api settings")
return
api_url = "https://%s" % settings.get_value("api", "domain")
Expand All @@ -39,36 +22,40 @@ func _ready():
pool = JamHttpRequestPool.new()
add_child(pool)


func _auth_headers() -> Array:
if not jwt.has_token():
return []
else:
return ["Authorization: Bearer %s" % jwt.get_token()]


func _json_auth_headers() -> Array:
return _auth_headers() + ["Content-type: application/json"]


func get_string_data(url: String) -> JamResult:
var h = pool.get_client()
var err = h.http.request(url)
if err != OK:
var h: JamHttpRequestPool.ScopedClient = pool.get_client()
var err: Error = h.http.request(url)
if not err == OK:
return JamResult.err("HTTP request error")

var resp = await h.http.request_completed
var resp: Variant = await h.http.request_completed
if resp[1] > 299:
return JamResult.err("HTTP error code %d" % [resp[1]])

var s = resp[3].get_string_from_utf8()
var s: String = resp[3].get_string_from_utf8()
if len(s) < 1:
return JamResult.err("Empty of invalid HTTP response")

return JamResult.ok(s)


func _json_http(route: String, method: HTTPClient.Method=HTTPClient.METHOD_GET, body: Variant=null) -> Result:
var result = Result.new()
var err
var h = pool.get_client()
if body != null:
var result: Result = Result.new()
var err: Error
var h: JamHttpRequestPool.ScopedClient = pool.get_client()
if not body == null:
err = h.http.request(
api_url + route,
_json_auth_headers(),
Expand All @@ -81,16 +68,16 @@ func _json_http(route: String, method: HTTPClient.Method=HTTPClient.METHOD_GET,
_json_auth_headers(),
method
)
if err != OK:
if not err == OK:
result.errored = true
result.error_msg = "HTTP request error"
return result

var resp = await h.http.request_completed
var response_code = resp[1]
var resp: Variant = await h.http.request_completed
var response_code: Variant = resp[1]
var response_body: String = resp[3].get_string_from_utf8()
var data = {}
if len(response_body) > 0:
var data: Dictionary = {}
if not response_body.is_empty():
data = JSON.parse_string(response_body)
if response_code > 299:
result.errored = true
Expand All @@ -106,3 +93,21 @@ func _json_http(route: String, method: HTTPClient.Method=HTTPClient.METHOD_GET,

result.data = data
return result


class Result:
var data: Dictionary = {}
var errored: bool = false
var error_msg: String = ""

static func err(msg: String) -> Result:
var r: Result = Result.new()
r.errored = true
r.error_msg = msg
return r


static func ok(d: Dictionary) -> Result:
var r: Result = Result.new()
r.data = d
return r
32 changes: 18 additions & 14 deletions api/JamHttpRequestPool.gd
Original file line number Diff line number Diff line change
@@ -1,31 +1,35 @@
@tool
extends Node
class_name JamHttpRequestPool
extends Node

func get_client() -> ScopedClient:
for c in get_children():
if not c.in_use:
return ScopedClient.new(c as HttpHolder)

var hh := HttpHolder.new()
add_child(hh)
return ScopedClient.new(hh)


class HttpHolder:
extends HTTPRequest
var in_use: bool =false
var in_use: bool = false


class ScopedClient:
extends RefCounted
var http: HttpHolder
func _init(holder: HttpHolder):

func _init(holder: HttpHolder) -> void:
http = holder
http.in_use = true
func _notification(what):

func _notification(what: int) -> void:
if what == NOTIFICATION_PREDELETE:
http.in_use = false

func get_client() -> ScopedClient:
for c in get_children():
if not c.in_use:
return ScopedClient.new(c as HttpHolder)

var hh := HttpHolder.new()
add_child(hh)
return ScopedClient.new(hh)




Loading