@adventurelabs/scout-core 1.0.114 → 1.0.116
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/dist/hooks/useScoutRefresh.js +29 -38
- package/dist/store/scout.d.ts +8 -3
- package/dist/store/scout.js +8 -4
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { useEffect, useCallback, useRef, useMemo } from "react";
|
|
2
2
|
import { useAppDispatch } from "../store/hooks";
|
|
3
3
|
import { useStore } from "react-redux";
|
|
4
|
-
import { EnumScoutStateStatus, setHerdModules, setStatus, setHerdModulesLoadingState, setHerdModulesLoadedInMs,
|
|
4
|
+
import { EnumScoutStateStatus, setHerdModules, setStatus, setHerdModulesLoadingState, setHerdModulesLoadedInMs, setHerdModulesApiServerProcessingDuration, setHerdModulesApiTotalRequestDuration, setUserApiDuration, setDataProcessingDuration, setCacheLoadDuration, setUser, setDataSource, setDataSourceInfo, } from "../store/scout";
|
|
5
5
|
import { EnumHerdModulesLoadingState } from "../types/herd_module";
|
|
6
6
|
import { server_load_herd_modules } from "../helpers/herds";
|
|
7
7
|
import { scoutCache } from "../helpers/cache";
|
|
@@ -167,7 +167,7 @@ export function useScoutRefresh(options = {}) {
|
|
|
167
167
|
: "No specific changes identified";
|
|
168
168
|
}, [normalizeHerdModulesForComparison, sortHerdModulesById]);
|
|
169
169
|
// Helper function to conditionally dispatch only if business data has changed
|
|
170
|
-
const conditionalDispatch = useCallback((newData, currentData, actionCreator, dataType, skipTimestampOnlyUpdates =
|
|
170
|
+
const conditionalDispatch = useCallback((newData, currentData, actionCreator, dataType, skipTimestampOnlyUpdates = true) => {
|
|
171
171
|
// For herd modules, sort both datasets by ID before comparison
|
|
172
172
|
let dataToCompare = newData;
|
|
173
173
|
let currentToCompare = currentData;
|
|
@@ -185,7 +185,7 @@ export function useScoutRefresh(options = {}) {
|
|
|
185
185
|
console.log(`[useScoutRefresh] ${dataType} business data changed, updating store`);
|
|
186
186
|
// Add debugging for unexpected business changes
|
|
187
187
|
if (skipTimestampOnlyUpdates && dataType.includes("Herd modules")) {
|
|
188
|
-
const changes = findBusinessDataChanges(
|
|
188
|
+
const changes = findBusinessDataChanges(dataToCompare, currentToCompare);
|
|
189
189
|
console.log(`[useScoutRefresh] ${dataType} changes: ${changes}`);
|
|
190
190
|
}
|
|
191
191
|
dispatch(actionCreator(newData)); // Always dispatch original unsorted data
|
|
@@ -239,7 +239,6 @@ export function useScoutRefresh(options = {}) {
|
|
|
239
239
|
if (cacheFirst) {
|
|
240
240
|
const cacheStartTime = Date.now();
|
|
241
241
|
try {
|
|
242
|
-
console.log("[useScoutRefresh] Loading from cache...");
|
|
243
242
|
const cacheResult = await scoutCache.getHerdModules();
|
|
244
243
|
cacheLoadDuration = Date.now() - cacheStartTime;
|
|
245
244
|
timingRefs.current.cacheLoadDuration = cacheLoadDuration;
|
|
@@ -264,19 +263,24 @@ export function useScoutRefresh(options = {}) {
|
|
|
264
263
|
}
|
|
265
264
|
// If cache is fresh, we still background fetch but don't wait
|
|
266
265
|
if (!cacheResult.isStale) {
|
|
267
|
-
console.log("[useScoutRefresh] Cache is fresh, background fetching fresh data...");
|
|
268
266
|
// Background fetch fresh data without blocking
|
|
269
267
|
(async () => {
|
|
270
268
|
try {
|
|
271
|
-
console.log("[useScoutRefresh] Starting background fetch...");
|
|
272
269
|
const backgroundStartTime = Date.now();
|
|
273
270
|
const [backgroundHerdModulesResult, backgroundUserResult] = await Promise.all([
|
|
274
271
|
(async () => {
|
|
275
272
|
const start = Date.now();
|
|
276
273
|
const result = await server_load_herd_modules();
|
|
277
|
-
const
|
|
278
|
-
|
|
279
|
-
|
|
274
|
+
const totalDuration = Date.now() - start;
|
|
275
|
+
const serverDuration = result.server_processing_time_ms || totalDuration;
|
|
276
|
+
const clientOverhead = totalDuration - serverDuration;
|
|
277
|
+
console.log(`[useScoutRefresh] Background API timing breakdown:`);
|
|
278
|
+
console.log(` - Server processing: ${serverDuration}ms`);
|
|
279
|
+
console.log(` - Client overhead: ${clientOverhead}ms`);
|
|
280
|
+
console.log(` - Total request: ${totalDuration}ms`);
|
|
281
|
+
timingRefs.current.herdModulesDuration = serverDuration;
|
|
282
|
+
dispatch(setHerdModulesApiServerProcessingDuration(serverDuration));
|
|
283
|
+
dispatch(setHerdModulesApiTotalRequestDuration(totalDuration));
|
|
280
284
|
return result;
|
|
281
285
|
})(),
|
|
282
286
|
(async () => {
|
|
@@ -289,7 +293,6 @@ export function useScoutRefresh(options = {}) {
|
|
|
289
293
|
})(),
|
|
290
294
|
]);
|
|
291
295
|
const backgroundDuration = Date.now() - backgroundStartTime;
|
|
292
|
-
console.log(`[useScoutRefresh] Background fetch completed in ${backgroundDuration}ms`);
|
|
293
296
|
// Validate background responses
|
|
294
297
|
if (backgroundHerdModulesResult.data &&
|
|
295
298
|
Array.isArray(backgroundHerdModulesResult.data) &&
|
|
@@ -298,7 +301,6 @@ export function useScoutRefresh(options = {}) {
|
|
|
298
301
|
// Update cache with fresh data
|
|
299
302
|
try {
|
|
300
303
|
await scoutCache.setHerdModules(backgroundHerdModulesResult.data, cacheTtlMs);
|
|
301
|
-
console.log(`[useScoutRefresh] Background cache updated with TTL: ${Math.round(cacheTtlMs / 1000)}s`);
|
|
302
304
|
}
|
|
303
305
|
catch (cacheError) {
|
|
304
306
|
console.warn("[useScoutRefresh] Background cache save failed:", cacheError);
|
|
@@ -321,7 +323,6 @@ export function useScoutRefresh(options = {}) {
|
|
|
321
323
|
source: EnumDataSource.DATABASE,
|
|
322
324
|
timestamp: Date.now(),
|
|
323
325
|
}));
|
|
324
|
-
console.log("[useScoutRefresh] Background fetch completed and store updated");
|
|
325
326
|
}
|
|
326
327
|
else {
|
|
327
328
|
console.warn("[useScoutRefresh] Background fetch returned invalid data");
|
|
@@ -334,13 +335,11 @@ export function useScoutRefresh(options = {}) {
|
|
|
334
335
|
const totalDuration = Date.now() - startTime;
|
|
335
336
|
dispatch(setHerdModulesLoadedInMs(totalDuration));
|
|
336
337
|
dispatch(setStatus(EnumScoutStateStatus.DONE_LOADING));
|
|
337
|
-
console.log(`[useScoutRefresh] Cache-first refresh completed in ${totalDuration}ms (background fetch in progress)`);
|
|
338
338
|
onRefreshComplete?.();
|
|
339
339
|
return;
|
|
340
340
|
}
|
|
341
341
|
}
|
|
342
342
|
else {
|
|
343
|
-
console.log("[useScoutRefresh] No cached data found");
|
|
344
343
|
}
|
|
345
344
|
}
|
|
346
345
|
catch (cacheError) {
|
|
@@ -350,23 +349,19 @@ export function useScoutRefresh(options = {}) {
|
|
|
350
349
|
}
|
|
351
350
|
}
|
|
352
351
|
// Step 2: Load fresh data from API
|
|
353
|
-
console.log("[useScoutRefresh] Loading fresh data from API...");
|
|
354
352
|
const parallelStartTime = Date.now();
|
|
355
353
|
const [herdModulesResult, userResult] = await Promise.all([
|
|
356
354
|
(async () => {
|
|
357
355
|
const start = Date.now();
|
|
358
|
-
console.log(`[useScoutRefresh] Starting herd modules request at ${new Date(start).toISOString()}`);
|
|
359
356
|
const result = await server_load_herd_modules();
|
|
360
|
-
const
|
|
361
|
-
|
|
362
|
-
return { result,
|
|
357
|
+
const totalDuration = Date.now() - start;
|
|
358
|
+
const serverDuration = result.server_processing_time_ms || totalDuration;
|
|
359
|
+
return { result, totalDuration, serverDuration, start };
|
|
363
360
|
})(),
|
|
364
361
|
(async () => {
|
|
365
362
|
const start = Date.now();
|
|
366
|
-
console.log(`[useScoutRefresh] Starting user request at ${new Date(start).toISOString()}`);
|
|
367
363
|
const { data } = await supabase.auth.getUser();
|
|
368
364
|
const duration = Date.now() - start;
|
|
369
|
-
console.log(`[useScoutRefresh] User request completed in ${duration}ms`);
|
|
370
365
|
return {
|
|
371
366
|
result: { data: data.user, status: "success" },
|
|
372
367
|
duration,
|
|
@@ -379,13 +374,20 @@ export function useScoutRefresh(options = {}) {
|
|
|
379
374
|
// Extract results and timing
|
|
380
375
|
const herdModulesResponse = herdModulesResult.result;
|
|
381
376
|
const res_new_user = userResult.result;
|
|
382
|
-
const
|
|
377
|
+
const herdModulesServerDuration = herdModulesResult.serverDuration;
|
|
378
|
+
const herdModulesTotalDuration = herdModulesResult.totalDuration;
|
|
383
379
|
const userApiDuration = userResult.duration;
|
|
380
|
+
const clientOverhead = herdModulesTotalDuration - herdModulesServerDuration;
|
|
381
|
+
console.log(`[useScoutRefresh] Fresh API timing breakdown:`);
|
|
382
|
+
console.log(` - Server processing: ${herdModulesServerDuration}ms`);
|
|
383
|
+
console.log(` - Client overhead: ${clientOverhead}ms`);
|
|
384
|
+
console.log(` - Total request: ${herdModulesTotalDuration}ms`);
|
|
384
385
|
// Store timing values
|
|
385
|
-
timingRefs.current.herdModulesDuration =
|
|
386
|
+
timingRefs.current.herdModulesDuration = herdModulesServerDuration;
|
|
386
387
|
timingRefs.current.userApiDuration = userApiDuration;
|
|
387
388
|
// Dispatch timing actions
|
|
388
|
-
dispatch(
|
|
389
|
+
dispatch(setHerdModulesApiServerProcessingDuration(herdModulesServerDuration));
|
|
390
|
+
dispatch(setHerdModulesApiTotalRequestDuration(herdModulesTotalDuration));
|
|
389
391
|
dispatch(setUserApiDuration(userApiDuration));
|
|
390
392
|
// Validate API responses
|
|
391
393
|
const validationStartTime = Date.now();
|
|
@@ -435,15 +437,8 @@ export function useScoutRefresh(options = {}) {
|
|
|
435
437
|
const loadingDuration = Date.now() - startTime;
|
|
436
438
|
dispatch(setHerdModulesLoadedInMs(loadingDuration));
|
|
437
439
|
dispatch(setStatus(EnumScoutStateStatus.DONE_LOADING));
|
|
438
|
-
// Log
|
|
439
|
-
console.log(`[useScoutRefresh] Refresh completed
|
|
440
|
-
console.log(` - Total duration: ${loadingDuration}ms`);
|
|
441
|
-
console.log(` - Cache load: ${cacheLoadDuration}ms`);
|
|
442
|
-
console.log(` - Herd modules API: ${herdModulesDuration}ms`);
|
|
443
|
-
console.log(` - User API: ${userApiDuration}ms`);
|
|
444
|
-
console.log(` - Cache save: ${timingRefs.current.cacheSaveDuration}ms`);
|
|
445
|
-
console.log(` - Data processing: ${dataProcessingDuration}ms`);
|
|
446
|
-
console.log(` - Cache TTL: ${Math.round(cacheTtlMs / 1000)}s`);
|
|
440
|
+
// Log concise completion summary
|
|
441
|
+
console.log(`[useScoutRefresh] Refresh completed in ${loadingDuration}ms (Server: ${herdModulesServerDuration}ms, Total API: ${herdModulesTotalDuration}ms)`);
|
|
447
442
|
onRefreshComplete?.();
|
|
448
443
|
}
|
|
449
444
|
catch (error) {
|
|
@@ -460,10 +455,7 @@ export function useScoutRefresh(options = {}) {
|
|
|
460
455
|
dispatch(setHerdModulesLoadedInMs(loadingDuration));
|
|
461
456
|
dispatch(setStatus(EnumScoutStateStatus.DONE_LOADING));
|
|
462
457
|
// Log essential error metrics
|
|
463
|
-
console.log(`[useScoutRefresh] Refresh failed
|
|
464
|
-
console.log(` - Total duration: ${loadingDuration}ms`);
|
|
465
|
-
console.log(` - Herd modules: ${timingRefs.current.herdModulesDuration}ms`);
|
|
466
|
-
console.log(` - User API: ${timingRefs.current.userApiDuration}ms`);
|
|
458
|
+
console.log(`[useScoutRefresh] Refresh failed after ${loadingDuration}ms`);
|
|
467
459
|
// Call completion callback even on error for consistency
|
|
468
460
|
onRefreshComplete?.();
|
|
469
461
|
}
|
|
@@ -489,7 +481,6 @@ export function useScoutRefresh(options = {}) {
|
|
|
489
481
|
const clearCache = useCallback(async () => {
|
|
490
482
|
try {
|
|
491
483
|
await scoutCache.clearHerdModules();
|
|
492
|
-
console.log("[useScoutRefresh] Cache cleared successfully");
|
|
493
484
|
}
|
|
494
485
|
catch (error) {
|
|
495
486
|
console.error("[useScoutRefresh] Failed to clear cache:", error);
|
package/dist/store/scout.d.ts
CHANGED
|
@@ -11,7 +11,8 @@ export interface ScoutState {
|
|
|
11
11
|
status: EnumScoutStateStatus;
|
|
12
12
|
herd_modules_loading_state: EnumHerdModulesLoadingState;
|
|
13
13
|
herd_modules_loaded_in_ms: number | null;
|
|
14
|
-
|
|
14
|
+
herd_modules_api_server_processing_ms: number | null;
|
|
15
|
+
herd_modules_api_total_request_ms: number | null;
|
|
15
16
|
user_api_duration_ms: number | null;
|
|
16
17
|
data_processing_duration_ms: number | null;
|
|
17
18
|
cache_load_duration_ms: number | null;
|
|
@@ -43,7 +44,11 @@ export declare const scoutSlice: import("@reduxjs/toolkit").Slice<ScoutState, {
|
|
|
43
44
|
payload: any;
|
|
44
45
|
type: string;
|
|
45
46
|
}) => void;
|
|
46
|
-
|
|
47
|
+
setHerdModulesApiServerProcessingDuration: (state: import("immer").WritableDraft<ScoutState>, action: {
|
|
48
|
+
payload: any;
|
|
49
|
+
type: string;
|
|
50
|
+
}) => void;
|
|
51
|
+
setHerdModulesApiTotalRequestDuration: (state: import("immer").WritableDraft<ScoutState>, action: {
|
|
47
52
|
payload: any;
|
|
48
53
|
type: string;
|
|
49
54
|
}) => void;
|
|
@@ -160,6 +165,6 @@ export declare const scoutSlice: import("@reduxjs/toolkit").Slice<ScoutState, {
|
|
|
160
165
|
type: string;
|
|
161
166
|
}) => void;
|
|
162
167
|
}, "scout", "scout", import("@reduxjs/toolkit").SliceSelectors<ScoutState>>;
|
|
163
|
-
export declare const setHerdModules: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setHerdModules">, setStatus: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setStatus">, setHerdModulesLoadingState: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setHerdModulesLoadingState">, setHerdModulesLoadedInMs: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setHerdModulesLoadedInMs">,
|
|
168
|
+
export declare const setHerdModules: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setHerdModules">, setStatus: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setStatus">, setHerdModulesLoadingState: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setHerdModulesLoadingState">, setHerdModulesLoadedInMs: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setHerdModulesLoadedInMs">, setHerdModulesApiServerProcessingDuration: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setHerdModulesApiServerProcessingDuration">, setHerdModulesApiTotalRequestDuration: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setHerdModulesApiTotalRequestDuration">, setUserApiDuration: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setUserApiDuration">, setDataProcessingDuration: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setDataProcessingDuration">, setCacheLoadDuration: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setCacheLoadDuration">, setActiveHerdId: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setActiveHerdId">, setActiveDeviceId: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setActiveDeviceId">, setDataSource: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setDataSource">, setDataSourceInfo: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setDataSourceInfo">, appendEventsToHerdModule: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/appendEventsToHerdModule">, replaceEventsForHerdModule: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/replaceEventsForHerdModule">, updateEventValuesForHerdModule: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/updateEventValuesForHerdModule">, updatePageIndexForHerdModule: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/updatePageIndexForHerdModule">, appendPlansToHerdModule: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/appendPlansToHerdModule">, setUser: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setUser">, addTag: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/addTag">, deleteTag: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/deleteTag">, updateTag: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/updateTag">, addNewDeviceToHerdModule: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/addNewDeviceToHerdModule">, updateDeviceForHerdModule: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/updateDeviceForHerdModule">, addDevice: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/addDevice">, deleteDevice: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/deleteDevice">, updateDevice: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/updateDevice">, addPlan: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/addPlan">, deletePlan: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/deletePlan">, updatePlan: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/updatePlan">, addSessionToStore: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/addSessionToStore">, deleteSessionFromStore: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/deleteSessionFromStore">, updateSessionInStore: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/updateSessionInStore">, setActiveHerdGpsTrackersConnectivity: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setActiveHerdGpsTrackersConnectivity">;
|
|
164
169
|
declare const _default: import("redux").Reducer<ScoutState>;
|
|
165
170
|
export default _default;
|
package/dist/store/scout.js
CHANGED
|
@@ -12,7 +12,8 @@ const initialState = {
|
|
|
12
12
|
herd_modules_loading_state: EnumHerdModulesLoadingState.NOT_LOADING,
|
|
13
13
|
herd_modules_loaded_in_ms: null,
|
|
14
14
|
// Initialize timing variables
|
|
15
|
-
|
|
15
|
+
herd_modules_api_server_processing_ms: null,
|
|
16
|
+
herd_modules_api_total_request_ms: null,
|
|
16
17
|
user_api_duration_ms: null,
|
|
17
18
|
data_processing_duration_ms: null,
|
|
18
19
|
cache_load_duration_ms: null,
|
|
@@ -42,8 +43,11 @@ export const scoutSlice = createSlice({
|
|
|
42
43
|
setHerdModulesLoadedInMs: (state, action) => {
|
|
43
44
|
state.herd_modules_loaded_in_ms = action.payload;
|
|
44
45
|
},
|
|
45
|
-
|
|
46
|
-
state.
|
|
46
|
+
setHerdModulesApiServerProcessingDuration: (state, action) => {
|
|
47
|
+
state.herd_modules_api_server_processing_ms = action.payload;
|
|
48
|
+
},
|
|
49
|
+
setHerdModulesApiTotalRequestDuration: (state, action) => {
|
|
50
|
+
state.herd_modules_api_total_request_ms = action.payload;
|
|
47
51
|
},
|
|
48
52
|
setUserApiDuration: (state, action) => {
|
|
49
53
|
state.user_api_duration_ms = action.payload;
|
|
@@ -269,5 +273,5 @@ export const scoutSlice = createSlice({
|
|
|
269
273
|
},
|
|
270
274
|
});
|
|
271
275
|
// Action creators are generated for each case reducer function
|
|
272
|
-
export const { setHerdModules, setStatus, setHerdModulesLoadingState, setHerdModulesLoadedInMs,
|
|
276
|
+
export const { setHerdModules, setStatus, setHerdModulesLoadingState, setHerdModulesLoadedInMs, setHerdModulesApiServerProcessingDuration, setHerdModulesApiTotalRequestDuration, setUserApiDuration, setDataProcessingDuration, setCacheLoadDuration, setActiveHerdId, setActiveDeviceId, setDataSource, setDataSourceInfo, appendEventsToHerdModule, replaceEventsForHerdModule, updateEventValuesForHerdModule, updatePageIndexForHerdModule, appendPlansToHerdModule, setUser, addTag, deleteTag, updateTag, addNewDeviceToHerdModule, updateDeviceForHerdModule, addDevice, deleteDevice, updateDevice, addPlan, deletePlan, updatePlan, addSessionToStore, deleteSessionFromStore, updateSessionInStore, setActiveHerdGpsTrackersConnectivity, } = scoutSlice.actions;
|
|
273
277
|
export default scoutSlice.reducer;
|