diff --git a/src/app/router.tsx b/src/app/router.tsx index c70f40b..49d04f5 100644 --- a/src/app/router.tsx +++ b/src/app/router.tsx @@ -13,7 +13,7 @@ export function getRouter() { gcTime: 5 * 60 * 1000, // 5 minutes refetchOnWindowFocus: false, refetchOnReconnect: "always", - retry: 3, + retry: 1, }, }, }); diff --git a/src/lib/tanstack-query/utils/to-server-result.ts b/src/lib/tanstack-query/utils/to-server-result.ts index d6d6f4c..d910b37 100644 --- a/src/lib/tanstack-query/utils/to-server-result.ts +++ b/src/lib/tanstack-query/utils/to-server-result.ts @@ -1,5 +1,7 @@ import { logger } from "../../logger"; import { ErrorType, ServerError, ServerResult } from "../types"; +import { pbAdmin } from "../../pocketbase/client"; +import { getRequest } from "@tanstack/react-start/server"; export const createServerError = ( type: ErrorType, @@ -15,14 +17,53 @@ export const createServerError = ( context, }); -export const toServerResult = async (serverFn: () => Promise): Promise> => { +export const toServerResult = async ( + serverFn: () => Promise +): Promise> => { + const startTime = Date.now(); + try { const data = await serverFn(); return { success: true, data }; } catch (error) { + const duration = Date.now() - startTime; logger.error('Server Fn Error', error); const mappedError = mapKnownError(error); + + let fnName = 'unknown'; + try { + const request = getRequest(); + const url = new URL(request.url); + + const functionId = url.searchParams.get('_serverFnId') || url.pathname; + + if (functionId.includes('--')) { + const match = functionId.match(/--([^_]+)_/); + fnName = match?.[1] || functionId.split('--')[1]?.split('_')[0] || 'unknown'; + } else { + fnName = serverFn.name || 'unknown'; + } + } catch { + fnName = serverFn.name || 'unknown'; + } + + try { + await pbAdmin.authPromise; + await pbAdmin.createActivity({ + name: fnName, + duration, + success: false, + error: mappedError.message, + arguments: { + errorType: mappedError.code, + statusCode: mappedError.statusCode, + userMessage: mappedError.userMessage, + }, + }); + } catch (activityError) { + } + return { success: false, error: mappedError }; } };