miolo-react 3.0.0-beta.213 → 3.0.0-beta.214
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/ssr/useSsrDataOrReload.mjs +124 -137
package/package.json
CHANGED
|
@@ -51,25 +51,57 @@ const useSsrDataOrReload = (context, miolo, name, options) => {
|
|
|
51
51
|
)
|
|
52
52
|
const [status, setStatus] = useState(ssrDataFromContext !== undefined ? "loaded" : "idle")
|
|
53
53
|
const [error, setError] = useState(undefined)
|
|
54
|
-
|
|
54
|
+
|
|
55
|
+
const cacheInvalidate = useCallback(async () => {
|
|
56
|
+
if (typeof window !== "undefined") {
|
|
57
|
+
const { del } = await import("idb-keyval")
|
|
58
|
+
await del(`ssr-cache-${name}`)
|
|
59
|
+
}
|
|
60
|
+
}, [name])
|
|
61
|
+
|
|
62
|
+
const cacheSet = useCallback(
|
|
63
|
+
async (data) => {
|
|
64
|
+
if (cache === true) {
|
|
65
|
+
if (typeof window !== "undefined") {
|
|
66
|
+
try {
|
|
67
|
+
const { set } = await import("idb-keyval")
|
|
68
|
+
await set(`ssr-cache-${name}`, { data: _makeSerializable(data), ts: Date.now() })
|
|
69
|
+
} catch (err) {
|
|
70
|
+
logger.error(`[miolo-react][ssr][${name}] error setting cache for ${name}: ${err}`)
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
[logger, cache, name]
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
const cacheGet = useCallback(async () => {
|
|
79
|
+
if (cache === true) {
|
|
80
|
+
if (typeof window !== "undefined") {
|
|
81
|
+
try {
|
|
82
|
+
const { get } = await import("idb-keyval")
|
|
83
|
+
const cached = await get(`ssr-cache-${name}`)
|
|
84
|
+
if (cached && cached.data !== undefined) {
|
|
85
|
+
const expired = ttl !== undefined && Date.now() - cached.ts > ttl * 1000
|
|
86
|
+
return [cached.data, expired, cached.ts]
|
|
87
|
+
}
|
|
88
|
+
} catch (err) {
|
|
89
|
+
logger.error(`[miolo-react][ssr][${name}] error getting cache for ${name}: ${err}`)
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return [null, false]
|
|
94
|
+
}, [logger, cache, name, ttl])
|
|
55
95
|
|
|
56
96
|
const updateSsrData = useCallback(
|
|
57
97
|
(data) => {
|
|
58
98
|
setStatus("loading")
|
|
59
99
|
setSsrData(parseData(data))
|
|
60
|
-
setStatus("loaded")
|
|
61
100
|
setError(undefined)
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
import("idb-keyval").then(({ set }) => {
|
|
65
|
-
set(`ssr-cache-${name}`, { data: _makeSerializable(data), ts: Date.now() }).catch(
|
|
66
|
-
() => {}
|
|
67
|
-
)
|
|
68
|
-
})
|
|
69
|
-
}
|
|
70
|
-
}
|
|
101
|
+
setStatus("loaded")
|
|
102
|
+
/*await*/ cacheSet(data)
|
|
71
103
|
},
|
|
72
|
-
[parseData,
|
|
104
|
+
[parseData, cacheSet]
|
|
73
105
|
)
|
|
74
106
|
|
|
75
107
|
const refreshSsrData = useCallback(async () => {
|
|
@@ -100,38 +132,15 @@ const useSsrDataOrReload = (context, miolo, name, options) => {
|
|
|
100
132
|
}
|
|
101
133
|
|
|
102
134
|
if (newData !== undefined) {
|
|
103
|
-
if (cache === true) {
|
|
104
|
-
if (typeof window !== "undefined") {
|
|
105
|
-
try {
|
|
106
|
-
const { set } = await import("idb-keyval")
|
|
107
|
-
await set(`ssr-cache-${name}`, { data: _makeSerializable(newData), ts: Date.now() })
|
|
108
|
-
} catch (err) {
|
|
109
|
-
console.error(err)
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
135
|
setSsrData(parseData(newData))
|
|
136
|
+
/*await*/ cacheSet(newData)
|
|
114
137
|
}
|
|
115
138
|
|
|
116
139
|
setStatus("loaded")
|
|
117
|
-
}, [status, context, fetcher, loader, url, params, parseData, name,
|
|
118
|
-
|
|
119
|
-
const invalidateCache = useCallback((tName, callback = undefined) => {
|
|
120
|
-
if (typeof window !== "undefined") {
|
|
121
|
-
import("idb-keyval").then(({ del }) => {
|
|
122
|
-
del(`ssr-cache-${tName}`)
|
|
123
|
-
.catch(() => {})
|
|
124
|
-
.then(() => {
|
|
125
|
-
if (callback) {
|
|
126
|
-
callback()
|
|
127
|
-
}
|
|
128
|
-
})
|
|
129
|
-
})
|
|
130
|
-
}
|
|
131
|
-
}, [])
|
|
140
|
+
}, [status, context, fetcher, loader, url, params, parseData, name, cacheSet, logger])
|
|
132
141
|
|
|
133
142
|
const checkCacheVersions = useCallback(
|
|
134
|
-
(versions) => {
|
|
143
|
+
async (versions) => {
|
|
135
144
|
logger.verbose(
|
|
136
145
|
`[miolo-react][ssr][${name}] Backend versions received: ${JSON.stringify(versions)}`
|
|
137
146
|
)
|
|
@@ -143,31 +152,25 @@ const useSsrDataOrReload = (context, miolo, name, options) => {
|
|
|
143
152
|
`[miolo-react][ssr][${name}] Backend version for ${name} is ${backendVersion}`
|
|
144
153
|
)
|
|
145
154
|
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
logger.verbose(`[miolo-react][ssr][${name}] ssr-versions match for ${name}`)
|
|
162
|
-
}
|
|
163
|
-
})
|
|
164
|
-
.catch(() => {})
|
|
165
|
-
})
|
|
166
|
-
.catch(() => {})
|
|
155
|
+
const [cached, expired, ts] = await cacheGet()
|
|
156
|
+
if (cached) {
|
|
157
|
+
if (expired || ts < backendVersion) {
|
|
158
|
+
logger.info(
|
|
159
|
+
`[miolo-react][ssr][${name}] ssr-versions mismatch for ${name}, invalidating`
|
|
160
|
+
)
|
|
161
|
+
await cacheInvalidate()
|
|
162
|
+
if (autoRefresh === true) {
|
|
163
|
+
refreshSsrData()
|
|
164
|
+
}
|
|
165
|
+
} else {
|
|
166
|
+
logger.verbose(`[miolo-react][ssr][${name}] ssr-versions match for ${name}`)
|
|
167
|
+
}
|
|
168
|
+
} else {
|
|
169
|
+
logger.warn(`[miolo-react][ssr][${name}] No cached data found for ${name}`)
|
|
167
170
|
}
|
|
168
171
|
}
|
|
169
172
|
},
|
|
170
|
-
[name, logger,
|
|
173
|
+
[name, logger, cacheGet, cacheInvalidate, refreshSsrData, autoRefresh]
|
|
171
174
|
)
|
|
172
175
|
|
|
173
176
|
useEffect(() => {
|
|
@@ -186,23 +189,13 @@ const useSsrDataOrReload = (context, miolo, name, options) => {
|
|
|
186
189
|
effect === true
|
|
187
190
|
|
|
188
191
|
if (changed === true) {
|
|
189
|
-
|
|
190
|
-
if (cache === true) {
|
|
191
|
-
if (typeof window !== "undefined") {
|
|
192
|
-
try {
|
|
193
|
-
const { get } = await import("idb-keyval")
|
|
194
|
-
cached = await get(`ssr-cache-${name}`)
|
|
195
|
-
} catch (err) {
|
|
196
|
-
console.error(err)
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
}
|
|
192
|
+
const [cached, expired, _ts] = await cacheGet()
|
|
200
193
|
|
|
201
|
-
if (cached
|
|
194
|
+
if (cached) {
|
|
202
195
|
logger.verbose(`[miolo-react][ssr][${name}] read data for ${name} from cache`)
|
|
203
196
|
setSsrData(parseData(cached.data))
|
|
204
197
|
|
|
205
|
-
if (
|
|
198
|
+
if (expired) {
|
|
206
199
|
logger.verbose(`[miolo-react][ssr][${name}] expired cache for ${name}, refreshing`)
|
|
207
200
|
refreshSsrData()
|
|
208
201
|
} else {
|
|
@@ -222,83 +215,77 @@ const useSsrDataOrReload = (context, miolo, name, options) => {
|
|
|
222
215
|
return () => {
|
|
223
216
|
mounted = false
|
|
224
217
|
}
|
|
225
|
-
}, [status, refreshSsrData, effect, name,
|
|
218
|
+
}, [status, refreshSsrData, effect, name, parseData, cacheGet, logger])
|
|
226
219
|
|
|
227
220
|
useEffect(() => {
|
|
228
|
-
if (
|
|
229
|
-
|
|
230
|
-
logger.verbose(`[miolo-react][ssr][${name}] read data for ${name} from context`)
|
|
231
|
-
|
|
232
|
-
import("idb-keyval").then(({ set }) => {
|
|
233
|
-
logger.verbose(`[miolo-react][ssr][${name}] writing data for ${name} to cache`)
|
|
234
|
-
set(`ssr-cache-${name}`, {
|
|
235
|
-
data: _makeSerializable(ssrDataFromContext),
|
|
236
|
-
ts: Date.now()
|
|
237
|
-
}).catch(() => {})
|
|
238
|
-
})
|
|
239
|
-
}
|
|
221
|
+
if (ssrDataFromContext !== undefined) {
|
|
222
|
+
/*await*/ cacheSet(ssrDataFromContext)
|
|
240
223
|
}
|
|
241
|
-
}, [
|
|
224
|
+
}, [ssrDataFromContext, cacheSet])
|
|
242
225
|
|
|
243
226
|
useEffect(() => {
|
|
244
|
-
if (socket
|
|
227
|
+
if (!socket || cache !== true) {
|
|
245
228
|
return
|
|
246
229
|
}
|
|
247
230
|
|
|
248
|
-
|
|
249
|
-
|
|
231
|
+
const onConnect = () => {
|
|
232
|
+
logger.verbose(`[miolo-react][ssr][${name}] Socket connected, subscribing`)
|
|
233
|
+
socket.emit("ssr-subscribe", name)
|
|
234
|
+
logger.verbose(`[miolo-react][ssr][${name}] Asking for ssr-versions`)
|
|
235
|
+
socket.emit("ssr-versions")
|
|
250
236
|
}
|
|
251
|
-
setSocketInited(true)
|
|
252
237
|
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
if (cache === true) {
|
|
256
|
-
logger.verbose(`[miolo-react][ssr][${name}] Asking for ssr-versions`)
|
|
257
|
-
socket.emit("ssr-versions")
|
|
238
|
+
const onInvalidate = async (data) => {
|
|
239
|
+
if (data.name !== name) return
|
|
258
240
|
|
|
259
|
-
|
|
241
|
+
logger.verbose(`[miolo-react][ssr][${name}] ssr-invalidate ${JSON.stringify(data)}`)
|
|
242
|
+
if (data.exclude_socket_id && data.exclude_socket_id === socket.id) {
|
|
243
|
+
logger.verbose(
|
|
244
|
+
`[miolo-react][ssr][${name}] ssr-invalidate ${data.name} ignored for socketid ${socket.id}`
|
|
245
|
+
)
|
|
246
|
+
return
|
|
247
|
+
}
|
|
248
|
+
logger.info(`[miolo-react][ssr][${name}] ssr-invalidate ${data.name}`)
|
|
249
|
+
await cacheInvalidate()
|
|
250
|
+
}
|
|
260
251
|
|
|
261
|
-
|
|
252
|
+
const onRefresh = async (data) => {
|
|
253
|
+
if (data.name !== name) return
|
|
262
254
|
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
logger.info(`[miolo-react][ssr][${name}] ssr-invalidate ${data.name}`)
|
|
272
|
-
invalidateCache(data.name)
|
|
273
|
-
})
|
|
274
|
-
|
|
275
|
-
socket.on("ssr-refresh", (data) => {
|
|
276
|
-
logger.verbose(
|
|
277
|
-
`[miolo-react][ssr][${name}] ssr-refresh ${JSON.stringify(data)} - my socket id: ${socket.id}`
|
|
278
|
-
)
|
|
279
|
-
if (data.exclude_socket_id && data.exclude_socket_id === socket.id) {
|
|
280
|
-
logger.verbose(
|
|
281
|
-
`[miolo-react][ssr][${name}] ssr-refresh ${data.name} ignored for socketid ${socket.id}`
|
|
282
|
-
)
|
|
283
|
-
return
|
|
284
|
-
}
|
|
285
|
-
logger.info(`[miolo-react][ssr][${name}] ssr-refresh ${data.name}`)
|
|
286
|
-
invalidateCache(data.name, () => {
|
|
287
|
-
refreshSsrData()
|
|
288
|
-
})
|
|
289
|
-
})
|
|
255
|
+
logger.verbose(
|
|
256
|
+
`[miolo-react][ssr][${name}] ssr-refresh ${JSON.stringify(data)} - my socket id: ${socket.id}`
|
|
257
|
+
)
|
|
258
|
+
if (data.exclude_socket_id && data.exclude_socket_id === socket.id) {
|
|
259
|
+
logger.verbose(
|
|
260
|
+
`[miolo-react][ssr][${name}] ssr-refresh ${data.name} ignored for socketid ${socket.id}`
|
|
261
|
+
)
|
|
262
|
+
return
|
|
290
263
|
}
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
264
|
+
logger.info(`[miolo-react][ssr][${name}] ssr-refresh ${data.name}`)
|
|
265
|
+
await cacheInvalidate()
|
|
266
|
+
refreshSsrData()
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
logger.verbose(`[miolo-react][ssr][${name}] Attaching ssr/cache socket handlers`)
|
|
270
|
+
|
|
271
|
+
if (socket.connected) {
|
|
272
|
+
onConnect()
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
socket.on("connect", onConnect)
|
|
276
|
+
socket.on("ssr-versions", checkCacheVersions)
|
|
277
|
+
socket.on("ssr-invalidate", onInvalidate)
|
|
278
|
+
socket.on("ssr-refresh", onRefresh)
|
|
279
|
+
|
|
280
|
+
return () => {
|
|
281
|
+
logger.verbose(`[miolo-react][ssr][${name}] Detaching ssr/cache socket handlers`)
|
|
282
|
+
socket.emit("ssr-unsubscribe", name)
|
|
283
|
+
socket.off("connect", onConnect)
|
|
284
|
+
socket.off("ssr-versions", checkCacheVersions)
|
|
285
|
+
socket.off("ssr-invalidate", onInvalidate)
|
|
286
|
+
socket.off("ssr-refresh", onRefresh)
|
|
287
|
+
}
|
|
288
|
+
}, [name, cache, socket, checkCacheVersions, logger, cacheInvalidate, refreshSsrData])
|
|
302
289
|
|
|
303
290
|
useOnWindowFocus(() => {
|
|
304
291
|
if (cache !== true) {
|
|
@@ -317,7 +304,7 @@ const useSsrDataOrReload = (context, miolo, name, options) => {
|
|
|
317
304
|
data: ssrData,
|
|
318
305
|
setData: updateSsrData,
|
|
319
306
|
refresh: refreshSsrData,
|
|
320
|
-
invalidate:
|
|
307
|
+
invalidate: cacheInvalidate,
|
|
321
308
|
error,
|
|
322
309
|
ok: error === undefined,
|
|
323
310
|
ready: status === "loaded"
|