Skip to content

v1.6.2

Choose a tag to compare

@Daiivr Daiivr released this 25 May 03:25

Trade Portal — Automatic asset cache-busting

🇬🇧 English

Why

Every time TradePortal.js, TradePortal.css, or TradePortal.html changed, users (and Cloudflare) kept serving the stale cached version. New features (tooltips, toast, Poké Ball backgrounds, etc.) would silently fail to appear until someone did a manual Cloudflare purge + browser hard refresh.

What changed

  • Content-hashed asset version token. On server start, BotServer now computes a single SHA-1 hash (first 10 hex chars) over the combined bytes of the embedded TradePortal.js, TradePortal.css, and TradePortal.html. This value is cached for the process lifetime under a thread-safe lazy initializer — zero per-request overhead.
  • HTML token replacement. TradePortal.html now references its sibling assets via a __ASSET_VER__ placeholder:
    <link rel="stylesheet" href="/TradePortal.css?v=__ASSET_VER__">
    <script src="/TradePortal.js?v=__ASSET_VER__" type="module"></script>
    A new helper LoadTradePortalHtml() substitutes the placeholder with the live AssetVersion on every /trade request, and the route now goes through it.
  • Graceful fallback. If hashing the embedded resources fails for any reason, the version falls back to a timestamp-based token (DateTime.UtcNow.Ticks in hex) so cache-busting still works.

Result

  • Every rebuild → new content → new hash → new asset URL → Cloudflare and browsers fetch fresh JS/CSS automatically.
  • No more manual Cloudflare purges or Ctrl+Shift+R after deploying.
  • Existing Cloudflare allowlist rules still work — http.request.uri.path does not include the query string, so /TradePortal.css?v=abc still matches eq "/TradePortal.css".
  • HTML keeps its Cache-Control: no-cache (correct, since it's the entry point that carries the new token); JS/CSS can safely live in the edge cache forever because their URL changes whenever their content does.

New developer workflow

  1. Edit TradePortal.{js,css,html}
  2. Rebuild
  3. Restart the bot
  4. Users see the change on next page load — no purge, no hard refresh

🇪🇸 Español

Por qué

Cada vez que cambiaban TradePortal.js, TradePortal.css o TradePortal.html, los usuarios (y Cloudflare) seguían sirviendo la versión vieja desde caché. Funcionalidades nuevas (tooltips, toast, fondo con Pokébolas, etc.) no aparecían hasta hacer purge manual en Cloudflare + hard refresh en el navegador.

Qué cambió

  • Token de versión basado en hash del contenido. Al arrancar el servidor, BotServer calcula una sola vez un hash SHA-1 (primeros 10 caracteres hex) sobre los bytes combinados de los recursos embebidos TradePortal.js, TradePortal.css y TradePortal.html. El valor se cachea durante toda la vida del proceso con un lazy initializer thread-safe — cero overhead por petición.
  • Sustitución de token en el HTML. TradePortal.html ahora referencia sus assets hermanos con un placeholder __ASSET_VER__:
    <link rel="stylesheet" href="/TradePortal.css?v=__ASSET_VER__">
    <script src="/TradePortal.js?v=__ASSET_VER__" type="module"></script>
    Un nuevo helper LoadTradePortalHtml() sustituye el placeholder por el AssetVersion real en cada petición a /trade, y la ruta ahora pasa por ahí.
  • Fallback elegante. Si el hash falla por cualquier razón, la versión cae a un token basado en timestamp (DateTime.UtcNow.Ticks en hex), garantizando que el cache-busting siga funcionando.

Resultado

  • Cada rebuild → contenido nuevo → hash nuevo → URL nueva → Cloudflare y navegadores descargan JS/CSS frescos automáticamente.
  • Adiós a purgar manualmente Cloudflare o pulsar Ctrl+Shift+R después de cada deploy.
  • Las reglas existentes de Cloudflare siguen funcionando — http.request.uri.path no incluye la query string, así que /TradePortal.css?v=abc sigue matcheando eq "/TradePortal.css".
  • El HTML mantiene su Cache-Control: no-cache (correcto, ya que es el entry point que lleva el token nuevo); JS/CSS pueden vivir indefinidamente en la caché del edge porque su URL cambia cuando su contenido cambia.

Nuevo flujo de trabajo

  1. Editas TradePortal.{js,css,html}
  2. Rebuild
  3. Reinicias el bot
  4. Los usuarios ven el cambio al recargar — sin purge, sin hard refresh