mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-08-28 06:28:01 +01:00
Chunking (#19200)
* fix tgui chunking bug on 2 chunks * ugh * ugh * should be fine * people might have longer pint times
This commit is contained in:
@@ -24,38 +24,10 @@
|
||||
|
||||
deltimer(partial_packets["timeout"])
|
||||
partial_packets = null
|
||||
if (!rustg_json_is_valid(assembled_payload))
|
||||
log_tgui(usr, "Error: Invalid JSON")
|
||||
return
|
||||
return json_decode(assembled_payload)
|
||||
|
||||
/datum/tgui_say/proc/clear_oversized_payload()
|
||||
partial_packets = null
|
||||
|
||||
/datum/tgui/proc/handle_packets(id, total_packets, packet)
|
||||
id = text2num(id)
|
||||
|
||||
var/total = text2num(total_packets)
|
||||
if(id == 1)
|
||||
if(total > MAX_MESSAGE_CHUNKS)
|
||||
return null
|
||||
|
||||
partial_packets = list("chunks" = new /list(total),
|
||||
"timeout" = addtimer(CALLBACK(src, PROC_REF(clear_oversized_payload)), 10 SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_STOPPABLE)
|
||||
)
|
||||
|
||||
var/list/chunks = partial_packets["chunks"]
|
||||
chunks[id] = packet
|
||||
|
||||
if(id != total)
|
||||
if(id > 1)
|
||||
partial_packets["timeout"] = addtimer(CALLBACK(src, PROC_REF(clear_oversized_payload)), 10 SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_STOPPABLE)
|
||||
return null
|
||||
|
||||
var/assembled_payload = ""
|
||||
for(var/received_packet in partial_packets["chunks"])
|
||||
assembled_payload += received_packet
|
||||
|
||||
deltimer(partial_packets["timeout"])
|
||||
partial_packets = null
|
||||
return json_decode(assembled_payload)
|
||||
|
||||
/datum/tgui/proc/clear_oversized_payload()
|
||||
partial_packets = null
|
||||
|
||||
@@ -380,11 +380,6 @@
|
||||
// Pass act type messages to tgui_act
|
||||
if(type && copytext(type, 1, 5) == "act/")
|
||||
var/act_type = copytext(type, 5)
|
||||
var/id = href_list["packetId"]
|
||||
if(!isnull(id))
|
||||
payload = handle_packets(id, href_list["totalPackets"], href_list["packet"])
|
||||
if(!payload)
|
||||
return FALSE
|
||||
#ifdef TGUI_DEBUGGING
|
||||
log_tgui(user, "Action: [act_type] [href_list["payload"]], Window: [window.id], Source: [src_object]")
|
||||
#endif
|
||||
|
||||
@@ -407,7 +407,7 @@
|
||||
"type" = message_type,
|
||||
"count" = chunk_count,
|
||||
"chunks" = list(),
|
||||
"timeout" = addtimer(CALLBACK(src, PROC_REF(remove_oversized_payload), payload_id), 1 SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_STOPPABLE)
|
||||
"timeout" = addtimer(CALLBACK(src, PROC_REF(remove_oversized_payload), payload_id), 10 SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_STOPPABLE)
|
||||
)
|
||||
|
||||
/datum/tgui_window/proc/append_payload_chunk(payload_id, chunk)
|
||||
@@ -421,9 +421,12 @@
|
||||
var/message_type = payload["type"]
|
||||
var/final_payload = chunks.Join()
|
||||
remove_oversized_payload(payload_id)
|
||||
if (!rustg_json_is_valid(final_payload))
|
||||
log_tgui(usr, "Error: Invalid JSON")
|
||||
return
|
||||
on_message(message_type, json_decode(final_payload), list("type" = message_type, "payload" = final_payload, "tgui" = TRUE, "window_id" = id))
|
||||
else
|
||||
payload["timeout"] = addtimer(CALLBACK(src, PROC_REF(remove_oversized_payload), payload_id), 1 SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_STOPPABLE)
|
||||
payload["timeout"] = addtimer(CALLBACK(src, PROC_REF(remove_oversized_payload), payload_id), 10 SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_STOPPABLE)
|
||||
|
||||
/datum/tgui_window/proc/remove_oversized_payload(payload_id)
|
||||
oversized_payloads -= payload_id
|
||||
|
||||
Reference in New Issue
Block a user