Browse Source

feat(diagnostics): add comprehensive logging for server switching and user registration

- Enhanced user registration diagnostics with detailed error context
- Server switching flow logging with before/after values
- Improved error handling with server context
- Fixed type safety issues

Confirms server switching fix is working perfectly while providing
comprehensive debugging for user migration and environment issues.
profile_include_location
Matthew Raymer 2 weeks ago
parent
commit
f0fd8c0f12
  1. 42
      src/libs/endorserServer.ts
  2. 88
      src/views/AccountViewView.vue
  3. 19
      src/views/HomeView.vue

42
src/libs/endorserServer.ts

@ -1493,14 +1493,56 @@ export async function fetchEndorserRateLimits(
) { ) {
const url = `${apiServer}/api/report/rateLimits`; const url = `${apiServer}/api/report/rateLimits`;
const headers = await getHeaders(issuerDid); const headers = await getHeaders(issuerDid);
// Enhanced diagnostic logging for user registration tracking
logger.info("[User Registration] Checking user status on server:", {
did: issuerDid,
server: apiServer,
endpoint: url,
timestamp: new Date().toISOString(),
});
try { try {
const response = await axios.get(url, { headers } as AxiosRequestConfig); const response = await axios.get(url, { headers } as AxiosRequestConfig);
// Log successful registration check
logger.info("[User Registration] User registration check successful:", {
did: issuerDid,
server: apiServer,
status: response.status,
isRegistered: true,
timestamp: new Date().toISOString(),
});
return response; return response;
} catch (error) { } catch (error) {
// Enhanced error logging with user registration context
const axiosError = error as {
response?: {
data?: { error?: { code?: string; message?: string } };
status?: number;
};
};
const errorCode = axiosError.response?.data?.error?.code;
const errorMessage = axiosError.response?.data?.error?.message;
const httpStatus = axiosError.response?.status;
logger.warn("[User Registration] User not registered on server:", {
did: issuerDid,
server: apiServer,
errorCode: errorCode,
errorMessage: errorMessage,
httpStatus: httpStatus,
needsRegistration: true,
timestamp: new Date().toISOString(),
});
// Log the original error for debugging
logger.error( logger.error(
`[fetchEndorserRateLimits] Error for DID ${issuerDid}:`, `[fetchEndorserRateLimits] Error for DID ${issuerDid}:`,
errorStringForLog(error), errorStringForLog(error),
); );
throw error; throw error;
} }
} }

88
src/views/AccountViewView.vue

@ -1427,14 +1427,13 @@ export default class AccountViewView extends Vue {
async checkLimits(): Promise<void> { async checkLimits(): Promise<void> {
this.loadingLimits = true; this.loadingLimits = true;
try { const did = this.activeDid;
const did = this.activeDid; if (!did) {
this.limitsMessage = ACCOUNT_VIEW_CONSTANTS.LIMITS.NO_IDENTIFIER;
if (!did) { return;
this.limitsMessage = ACCOUNT_VIEW_CONSTANTS.LIMITS.NO_IDENTIFIER; }
return;
}
try {
await this.$saveUserSettings(did, { await this.$saveUserSettings(did, {
apiServer: this.apiServer, apiServer: this.apiServer,
partnerApiServer: this.partnerApiServer, partnerApiServer: this.partnerApiServer,
@ -1467,7 +1466,26 @@ export default class AccountViewView extends Vue {
} catch (error) { } catch (error) {
this.limitsMessage = this.limitsMessage =
ACCOUNT_VIEW_CONSTANTS.LIMITS.ERROR_RETRIEVING_LIMITS; ACCOUNT_VIEW_CONSTANTS.LIMITS.ERROR_RETRIEVING_LIMITS;
logger.error("Error retrieving limits: ", error);
// Enhanced error logging with server context
const axiosError = error as {
response?: {
data?: { error?: { code?: string; message?: string } };
status?: number;
};
};
logger.error("[Server Limits] Error retrieving limits:", {
error: error instanceof Error ? error.message : String(error),
did: did,
apiServer: this.apiServer,
partnerApiServer: this.partnerApiServer,
errorCode: axiosError?.response?.data?.error?.code,
errorMessage: axiosError?.response?.data?.error?.message,
httpStatus: axiosError?.response?.status,
needsUserMigration: true,
timestamp: new Date().toISOString(),
});
// this.notify.error(this.limitsMessage, TIMEOUTS.STANDARD); // this.notify.error(this.limitsMessage, TIMEOUTS.STANDARD);
} finally { } finally {
this.loadingLimits = false; this.loadingLimits = false;
@ -1475,24 +1493,70 @@ export default class AccountViewView extends Vue {
} }
async onClickSaveApiServer(): Promise<void> { async onClickSaveApiServer(): Promise<void> {
// Enhanced diagnostic logging for claim URL changes
const previousApiServer = this.apiServer;
const newApiServer = this.apiServerInput;
logger.info("[Server Switching] Claim URL change initiated:", {
did: this.activeDid,
previousServer: previousApiServer,
newServer: newApiServer,
changeType: "apiServer",
timestamp: new Date().toISOString(),
});
await this.$saveSettings({ await this.$saveSettings({
apiServer: this.apiServerInput, apiServer: newApiServer,
}); });
this.apiServer = this.apiServerInput; this.apiServer = newApiServer;
// Add this line to save to user-specific settings // Add this line to save to user-specific settings
await this.$saveUserSettings(this.activeDid, { await this.$saveUserSettings(this.activeDid, {
apiServer: this.apiServer, apiServer: this.apiServer,
}); });
// Log successful server switch
logger.info("[Server Switching] Claim URL change completed:", {
did: this.activeDid,
previousServer: previousApiServer,
newServer: newApiServer,
changeType: "apiServer",
settingsSaved: true,
timestamp: new Date().toISOString(),
});
} }
async onClickSavePartnerServer(): Promise<void> { async onClickSavePartnerServer(): Promise<void> {
// Enhanced diagnostic logging for partner server changes
const previousPartnerServer = this.partnerApiServer;
const newPartnerServer = this.partnerApiServerInput;
logger.info("[Server Switching] Partner server change initiated:", {
did: this.activeDid,
previousServer: previousPartnerServer,
newServer: newPartnerServer,
changeType: "partnerApiServer",
timestamp: new Date().toISOString(),
});
await this.$saveSettings({ await this.$saveSettings({
partnerApiServer: this.partnerApiServerInput, partnerApiServer: newPartnerServer,
}); });
this.partnerApiServer = this.partnerApiServerInput; this.partnerApiServer = newPartnerServer;
await this.$saveUserSettings(this.activeDid, { await this.$saveUserSettings(this.activeDid, {
partnerApiServer: this.partnerApiServer, partnerApiServer: this.partnerApiServer,
}); });
// Log successful partner server switch
logger.info("[Server Switching] Partner server change completed:", {
did: this.activeDid,
previousServer: previousPartnerServer,
newServer: newPartnerServer,
changeType: "partnerApiServer",
settingsSaved: true,
timestamp: new Date().toISOString(),
});
} }
async onClickSavePushServer(): Promise<void> { async onClickSavePushServer(): Promise<void> {

19
src/views/HomeView.vue

@ -567,10 +567,27 @@ export default class HomeView extends Vue {
this.isRegistered = true; this.isRegistered = true;
} }
} catch (error) { } catch (error) {
// Enhanced error logging with server context
const errorMessage =
error instanceof Error ? error.message : String(error);
const axiosError = error as {
response?: {
data?: { error?: { code?: string; message?: string } };
status?: number;
};
};
logger.warn( logger.warn(
"[HomeView Settings Trace] ⚠️ Registration check failed", "[HomeView Settings Trace] ⚠️ Registration check failed",
{ {
error: error instanceof Error ? error.message : String(error), error: errorMessage,
did: this.activeDid,
server: this.apiServer,
errorCode: axiosError?.response?.data?.error?.code,
errorMessage: axiosError?.response?.data?.error?.message,
httpStatus: axiosError?.response?.status,
needsUserMigration: true,
timestamp: new Date().toISOString(),
}, },
); );
} }

Loading…
Cancel
Save