{"record":{"id":"7a4110c22d9f78f2","repo":"calcom/cal.diy","slug":"get-access-token-error","errorCode":null,"errorMessage":"get access token error","messagePattern":"get access token error","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/app-store/feishucalendar/lib/CalendarService.ts","lineNumber":121,"sourceCode":"        },\n        data: {\n          key: newFeishuAuthCredentials,\n        },\n      });\n\n      return newFeishuAuthCredentials.access_token;\n    } catch (error) {\n      this.log.error(\"FeishuCalendarService refreshAccessToken error\", error);\n      throw error;\n    }\n  };\n\n  private fetcher = async (endpoint: string, init?: RequestInit | undefined) => {\n    let accessToken = \"\";\n    try {\n      accessToken = await this.auth.getToken();\n    } catch {\n      throw new Error(\"get access token error\");\n    }\n\n    return fetch(`${this.url}${endpoint}`, {\n      method: \"GET\",\n      headers: {\n        Authorization: `Bearer ${accessToken}`,\n        \"Content-Type\": \"application/json\",\n        ...init?.headers,\n      },\n      ...init,\n    });\n  };\n\n  async createEvent(event: CalendarServiceEvent, credentialId: number): Promise<NewCalendarEventType> {\n    let eventId = \"\";\n    let eventRespData;\n    const mainHostDestinationCalendar = event.destinationCalendar\n      ? event.destinationCalendar.find((cal) => cal.credentialId === this.credential.id) ??","sourceCodeStart":103,"sourceCodeEnd":139,"githubUrl":"https://github.com/calcom/cal.diy/blob/176037d0afbe572f870a3c702985e7cd83fe6c0c/packages/app-store/feishucalendar/lib/CalendarService.ts#L103-L139","documentation":"Thrown by FeishuCalendarService.fetcher when this.auth.getToken() throws. The catch block discards the original error (a bare catch with no binding) and throws a generic 'get access token error', so the underlying cause — typically refreshAccessToken failure (error 554) or getAppAccessToken failure (errors 552/553) — is hidden from the caller.","triggerScenarios":"Any fetcher call (createEvent, updateEvent, deleteEvent, createAttendees, availability lookups) when getToken rejects: refresh token expired, app_ticket missing, app_access_token fetch failed, or network error during token refresh.","commonSituations":"Feishu credential expired (see 554); Feishu app_ticket not delivered (see 552); Feishu returned 10012 (see 553); transient network failure during refresh; app keys misconfigured.","solutions":["Inspect upstream Feishu logs to find the real token failure (the swallowed error is logged via this.log.error inside refreshAccessToken before propagation).","Resolve the underlying cause: refresh token (554), app_ticket webhook (552), or app_ticket validity (553).","Verify app_id/app_secret and that the Feishu app is published/approved.","Re-throw with the original cause preserved so callers can distinguish token failure from API failure."],"exampleFix":"// before - swallows cause\ntry {\n  accessToken = await this.auth.getToken();\n} catch {\n  throw new Error(\"get access token error\");\n}\n\n// after - preserve cause\ntry {\n  accessToken = await this.auth.getToken();\n} catch (err) {\n  throw new Error(\"Unable to obtain Feishu access token\", { cause: err });\n}","handlingStrategy":"try-catch","validationCode":"try { await this.auth.getToken(); } catch { /* will surface as 'get access token error' */ }","typeGuard":"const canGetToken = async (auth: { getToken: () => Promise<string> }): Promise<boolean> => {\n  try { await auth.getToken(); return true; } catch { return false; }\n};","tryCatchPattern":"try {\n  await calendarService.createEvent(event, credentialId);\n} catch (err) {\n  if (err instanceof Error && /get access token error/i.test(err.message)) {\n    // upstream token refresh failed; check Feishu credential health\n    logger.error(\"Feishu token acquisition failed for credential\", credentialId);\n  }\n  throw err;\n}","preventionTips":["Resolve the upstream token error (errors 552/553/554) first.","Patch fetcher to preserve cause so the real failure is visible.","Health-check Feishu credentials on a schedule."],"tags":["feishu","larksuite","access-token","error-swallowing","oauth"],"backgroundTag":null,"analyzedSha":"176037d0afbe572f870a3c702985e7cd83fe6c0c","analyzedAt":"2026-08-12T19:12:41.464Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}