{"record":{"id":"9ea7f0f04b3936dd","repo":"hcengineering/platform","slug":"no-token-available","errorCode":null,"errorMessage":"No token available","messagePattern":"No token available","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"plugins/export-resources/src/export.ts","lineNumber":46,"sourceCode":"  skipDeletedObsolete?: boolean,\n  exportOnlyEffective?: boolean,\n  includeChildren?: boolean\n): Promise<void> {\n  const lang = getCurrentLanguage()\n\n  addNotification(\n    await translate(plugin.string.ExportStarted, {}, lang),\n    await translate(plugin.string.ExportStartedMessage, {}, lang),\n    ExportNotification,\n    undefined,\n    NotificationSeverity.Info\n  )\n\n  try {\n    const baseUrl = getMetadata(plugin.metadata.ExportUrl)\n    const token = getMetadata(presentation.metadata.Token)\n    if (token == null) {\n      throw new Error('No token available')\n    }\n\n    const fieldMappers = {\n      'documents:class:ControlledDocument': {\n        author: '$currentUser',\n        owner: '$currentUser',\n        state: 'draft',\n        major: 1,\n        minor: 0,\n        reviewers: [],\n        controlledState: '',\n        seqNumber: '$generateSeqNumber',\n        code: '$generateCode'\n      },\n      'documents:class:DocumentMeta': {\n        author: '$currentUser',\n        owner: '$currentUser'\n      },","sourceCodeStart":28,"sourceCodeEnd":64,"githubUrl":"https://github.com/hcengineering/platform/blob/63e28dc96483967b2fc21c881b3f1023c1de7718/plugins/export-resources/src/export.ts#L28-L64","documentation":"exportToWorkspace reads the ExportUrl metadata and the current session Token. The token is required to authenticate against the export/target workspace endpoint; if presentation.metadata.Token is null, it throws 'No token available' rather than making an unauthenticated request.","triggerScenarios":"Calling exportToWorkspace before the user session/token has been established (not logged in), token metadata never set by the presentation plugin, or calling during early app startup before login completes.","commonSituations":"Export invoked from a background context or early lifecycle hook where the login plugin hasn't populated metadata yet; unauthenticated/guest sessions; token cleared after logout but export still triggered.","solutions":["Ensure the user is fully logged in and the presentation plugin has stored the token before triggering export.","Gate the export action on login state (e.g. only enable when authenticated).","Check that getMetadata(presentation.metadata.Token) is populated; if null, wait for login completion event.","Pass or obtain a token explicitly instead of relying on ambient metadata if used outside the main client context."],"exampleFix":"// before\nconst token = getMetadata(presentation.metadata.Token)\nif (token == null) {\n  throw new Error('No token available')\n}\n// after\nconst token = getMetadata(presentation.metadata.Token) ?? (await getTokenAfterLogin())\nif (token == null) {\n  throw new Error('No token available: ensure the user is logged in before exporting')\n}","handlingStrategy":"try-catch","validationCode":"const token = getMetadata(presentation.metadata.Token)\nif (token == null) {\n  throw new Error('Cannot export: no session token. Ensure the user is logged in.')\n}\nawait exportToWorkspace(...)","typeGuard":"function hasToken (t: string | null | undefined): t is string {\n  return t != null && t.length > 0\n}","tryCatchPattern":"try {\n  await exportToWorkspace(...)\n} catch (err) {\n  if (err instanceof Error && err.message === 'No token available') {\n    // prompt login or wait for auth-ready before retrying\n    await waitForLogin()\n    return retryExport()\n  }\n  throw err\n}","preventionTips":["Gate export actions on an authenticated state in the UI.","Wait for the login/auth-ready event before performing metadata-dependent operations.","Never invoke export logic in early startup hooks before presentation metadata is populated.","After logout, disable or defer any export flows."],"tags":["authentication","token","huly-platform"],"backgroundTag":"missing-auth-token","analyzedSha":"63e28dc96483967b2fc21c881b3f1023c1de7718","analyzedAt":"2026-08-29T15:21:27.377Z","schemaVersion":2},"datasetVersion":"2026-08-29T17:17:51.833Z"}