hoangsonww / hoangsonww/GhostIO-Invisible-Data-Prefetch

Service Worker–Based Persistent Prefetch Cache

Open
#2 0 comments 0 reactions 1 assignee Claimed by @hoangsonww View on GitHub
bug documentation duplicate enhancement good first issue help wanted question
Dominant language
TypeScript
Stars
13
Forks
8
PR merge metrics
No merged PRs in 30d

Description

**Summary**
Introduce a **service worker layer** to persist GhostIO’s prefetched data beyond the in-memory cache. This allows cached API responses to survive page reloads, browser restarts, and offline usage.

---

## Why

* Current GhostIO caching is **in-memory only** (lost on reload).
* SPAs and dashboards often reload or navigate across routes → prefetched data is discarded.
* Developers want **persistent, offline-ready prefetching** (PWA-style).
* Aligns with GhostIO’s goal of improving UX speed + reliability.

---

## Scope (MVP)

1. **Service Worker Integration**

* Register a service worker that listens for GhostIO-prefetched requests.
* Store prefetched responses in the Cache Storage API.

2. **Persistent Cache Retrieval**

* When `ghost.get(url)` is called:

* First check in-memory cache.
* If not found, check service worker cache.
* If found, hydrate into memory and return.

3. **Configurable Cache Policy**

* `persistPrefetch` (default: false).
* `cacheTTL` option: expiry time for persistent entries.
* `maxPersistentSize`: optional limit for storage size.

4. **Offline Support**

* If user is offline, GhostIO can still serve cached data from service worker.

---

## Example Usage

```ts
import { GhostIO } from "ghost-io";

const ghost = new GhostIO({
persistPrefetch: true,
cacheTTL: 1000 * 60 * 60, // 1 hour
});

// Prefetch API data
ghost.prefetch("/api/dashboard");

// Later, even after reload:
const data = await ghost.get("/api/dashboard");
console.log(data); // served from service worker cache if available
```

---

## Acceptance Criteria

* Prefetched data persists across reloads and browser restarts.
* Expired cache entries are evicted according to TTL.
* Works seamlessly with existing `registerAxios` integration.
* Fallback to live network fetch if no cache available.

---

## Tasks

* [ ] Add service worker registration + setup.
* [ ] Implement `persistPrefetch` and `cacheTTL` config options.
* [ ] Extend `ghost.get(url)` to check persistent cache.
* [ ] Add eviction policy for expired items.
* [ ] Write Jest/e2e tests for persistence + offline scenarios.
* [ ] Update README with usage + config examples.

---

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.