next-pwa-pack
Version:
PWA cache provider for Next.js/React apps (service worker, manifest, offline page, SPA cache, offline)
45 lines (44 loc) • 1.78 kB
JavaScript
"use client";
import { useEffect, useRef } from "react";
import { updateSWCache } from "../pwaActions";
export default function SSERevalidateListener({ sseEndpoint = "/api/pwa/cache-events", enabled = true, }) {
const eventSourceRef = useRef(null);
useEffect(() => {
if (!enabled || typeof window === "undefined") {
console.log("[PWA-SSE] SSE disabled or not in browser");
return;
}
console.log("[PWA-SSE] Starting SSE listener for:", sseEndpoint);
const eventSource = new EventSource(sseEndpoint);
eventSourceRef.current = eventSource;
eventSource.onopen = () => {
console.log("[PWA-SSE] Connected to server");
};
eventSource.onmessage = (event) => {
try {
const data = JSON.parse(event.data);
console.log("[PWA-SSE] Received event:", data);
if (data.type === "revalidate") {
// Ревалидация по URL (для service worker кеша)
if (data.urls && Array.isArray(data.urls)) {
console.log("[PWA-SSE] Revalidating URLs:", data.urls);
updateSWCache(data.urls);
}
}
}
catch (error) {
console.warn("[PWA-SSE] Failed to parse message:", error);
}
};
eventSource.onerror = (error) => {
console.warn("[PWA-SSE] Connection error:", error);
};
return () => {
console.log("[PWA-SSE] Cleaning up SSE connection");
if (eventSourceRef.current) {
eventSourceRef.current.close();
}
};
}, [sseEndpoint, enabled]);
return null;
}