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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "miolo-react",
3
- "version": "3.0.0-beta.213",
3
+ "version": "3.0.0-beta.214",
4
4
  "description": "React utils for miolo",
5
5
  "author": "Donato Lorenzo <donato@afialapis.com>",
6
6
  "contributors": [
@@ -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
- const [socketInited, setSocketInited] = useState(false)
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
- if (cache === true) {
63
- if (typeof window !== "undefined") {
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, name, cache]
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, cache, logger])
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
- if (typeof window !== "undefined") {
147
- import("idb-keyval")
148
- .then(({ get }) => {
149
- get(`ssr-cache-${name}`)
150
- .then((cached) => {
151
- if (cached && cached.ts < backendVersion) {
152
- logger.info(
153
- `[miolo-react][ssr][${name}] ssr-versions mismatch for ${name}, invalidating`
154
- )
155
- invalidateCache(name, () => {
156
- if (autoRefresh === true) {
157
- refreshSsrData()
158
- }
159
- })
160
- } else {
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, invalidateCache, refreshSsrData, autoRefresh]
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
- let cached = null
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 && cached.data !== undefined) {
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 (ttl !== undefined && Date.now() - cached.ts > ttl * 1000) {
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, ttl, parseData, cache, logger])
218
+ }, [status, refreshSsrData, effect, name, parseData, cacheGet, logger])
226
219
 
227
220
  useEffect(() => {
228
- if (cache === true) {
229
- if (ssrDataFromContext !== undefined && typeof window !== "undefined") {
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
- }, [logger, ssrDataFromContext, name, cache])
224
+ }, [ssrDataFromContext, cacheSet])
242
225
 
243
226
  useEffect(() => {
244
- if (socket === undefined) {
227
+ if (!socket || cache !== true) {
245
228
  return
246
229
  }
247
230
 
248
- if (socketInited) {
249
- return
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
- socket.on("connect", () => {
254
- logger.verbose(`[miolo-react][ssr][${name}] Socket connected`)
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
- logger.verbose(`[miolo-react][ssr][${name}] Attaching ssr/cache socket handlers`)
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
- socket.on("ssr-versions", checkCacheVersions)
252
+ const onRefresh = async (data) => {
253
+ if (data.name !== name) return
262
254
 
263
- socket.on("ssr-invalidate", (data) => {
264
- logger.verbose(`[miolo-react][ssr][${name}] ssr-invalidate ${JSON.stringify(data)}`)
265
- if (data.exclude_socket_id && data.exclude_socket_id === socket.id) {
266
- logger.verbose(
267
- `[miolo-react][ssr][${name}] ssr-invalidate ${data.name} ignored for socketid ${socket.id}`
268
- )
269
- return
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
- name,
294
- cache,
295
- socket,
296
- socketInited,
297
- checkCacheVersions,
298
- logger,
299
- invalidateCache,
300
- refreshSsrData
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: (callback) => invalidateCache(name, callback),
307
+ invalidate: cacheInvalidate,
321
308
  error,
322
309
  ok: error === undefined,
323
310
  ready: status === "loaded"