Skip to content

Instantly share code, notes, and snippets.

@pdx91
Created August 14, 2025 02:20
Show Gist options
  • Select an option

  • Save pdx91/06584f809a2049f0e2785b26a02859bf to your computer and use it in GitHub Desktop.

Select an option

Save pdx91/06584f809a2049f0e2785b26a02859bf to your computer and use it in GitHub Desktop.
frame_cache_controller.js
import { Controller } from "@hotwired/stimulus"
import store from "lib/cache_store"
export default class extends Controller {
static targets = []
static values = { expiresAt: Number }
async connect() {
const deferredSrc = this.element.getAttribute("deferred-src")
if (!deferredSrc) return
await this.get(this.element.id)
}
async set(event) {
const frameElement = await this.#parseHtml(event)
if (frameElement) {
await store.write(this.element.id, frameElement.outerHTML, this.expiresAtValue)
}
}
async get(key) {
try {
const cache = await store.fetch(key)
if (cache) {
const parser = new DOMParser()
const doc = parser.parseFromString(cache, "text/html")
const frameElement = doc.querySelector(`turbo-frame#${key}`)
if (frameElement) {
this.element.innerHTML = frameElement.innerHTML
this.element.setAttribute("complete", "")
}
} else {
this.#setSrc()
}
} catch (error) {
this.#setSrc()
}
}
async #parseHtml(event) {
const html = await event.detail.fetchResponse.responseHTML
const parser = new DOMParser()
const doc = parser.parseFromString(html, "text/html")
const frameElement = doc.querySelector(`turbo-frame#${this.element.id}`)
return frameElement
}
#setSrc() {
this.element.src = this.element.getAttribute("deferred-src")
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment