cache data.js (#153)

* cache data.js

* fix etag check

* use an md5 hash of the data for the etag
This commit is contained in:
Kent Rasmussen
2024-09-12 22:23:18 +02:00
committed by GitHub
parent 234ee1fe71
commit 2cd97ecfaa
+72 -44
View File
@@ -5,6 +5,7 @@ from admin import *
from crons import * from crons import *
from tests import * from tests import *
from tasks import * from tasks import *
import hashlib
@ndb.toplevel @ndb.toplevel
@app.route('/comm') @app.route('/comm')
@@ -157,53 +158,80 @@ def serve_codejs():
else: request.response.set_data("game_log('load_code: Code not found',colors.code_error)") else: request.response.set_data("game_log('load_code: Code not found',colors.code_error)")
return request.response return request.response
# Cache when data is prepared
cached_data = None
cached_data_hash = None
@app.route('/data.js',methods=['GET','POST']) @app.route('/data.js',methods=['GET','POST'])
@ndb.toplevel @ndb.toplevel
def serve_datajs(): def serve_datajs():
domain=gdi(request); additional="" global cached_data
geometry={} global cached_data_hash
for name in maps:
key=maps[name]["key"] init_request(request)
if maps[name].get("ignore"): continue
#if name=="test" and not is_sdk: key="test" additional=""
#logging.info(key)
geometry[name]=get_by_iid("map|%s"%key).info.data if request.values.get("reload"):
data={ additional="add_log('Game data reloaded','#32A3B0');\napply_backup()\n"
"version":game_version, elif cached_data_hash != None and request.headers.get('If-None-Match') == cached_data_hash:
"achievements":achievements, # The ETag matches
"animations":animations, request.response.status_code = 304
"monsters":monsters, return request.response
"sprites":sprites,
"maps":maps, if cached_data == None or cached_data_hash == None:
"geometry":geometry, geometry={}
"npcs":npcs,
"tilesets":tilesets, for name in maps:
"imagesets":imagesets, key=maps[name]["key"]
"items":items, if maps[name].get("ignore"): continue
"sets":sets, #if name=="test" and not is_sdk: key="test"
"craft":craft, #logging.info(key)
"titles":titles, geometry[name]=get_by_iid("map|%s"%key).info.data
"tokens":tokens,
"dismantle":dismantle, data={
"conditions":conditions, "version":game_version,
"cosmetics":cosmetics, "achievements":achievements,
"emotions":emotions, "animations":animations,
"projectiles":projectiles, "monsters":monsters,
"classes":classes, "sprites":sprites,
"dimensions":dimensions, "maps":maps,
"images":precomputed.images, "geometry":geometry,
"levels":levels, "npcs":npcs,
"positions":positions, "tilesets":tilesets,
"skills":skills, "imagesets":imagesets,
"events":events, "items":items,
"games":games, "sets":sets,
"multipliers":multipliers, "craft":craft,
#"codes":codes, "titles":titles,
"docs":docs, "tokens":tokens,
"drops":drops, "dismantle":dismantle,
} "conditions":conditions,
if request.values.get("reload"): additional="add_log('Game data reloaded','#32A3B0');\napply_backup()\n" "cosmetics":cosmetics,
request.response.set_data("var G=%s;\n%s"%(json.dumps(data),additional)) "emotions":emotions,
"projectiles":projectiles,
"classes":classes,
"dimensions":dimensions,
"images":precomputed.images,
"levels":levels,
"positions":positions,
"skills":skills,
"events":events,
"games":games,
"multipliers":multipliers,
#"codes":codes,
"docs":docs,
"drops":drops,
}
cached_data = json.dumps(data)
cached_data_hash = hashlib.md5(cached_data).hexdigest()
# The browser should cache this
request.response.headers['ETag'] = cached_data_hash
request.response.headers['Cache-Control'] = "max-age=31536000" # 1 Year
request.response.set_data("var G=%s;\n%s"%(cached_data,additional))
return request.response return request.response