hcengineering/platform · error

No token available

Error message

No token available

What it means

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.

Source

Thrown at plugins/export-resources/src/export.ts:46

  skipDeletedObsolete?: boolean,
  exportOnlyEffective?: boolean,
  includeChildren?: boolean
): Promise<void> {
  const lang = getCurrentLanguage()

  addNotification(
    await translate(plugin.string.ExportStarted, {}, lang),
    await translate(plugin.string.ExportStartedMessage, {}, lang),
    ExportNotification,
    undefined,
    NotificationSeverity.Info
  )

  try {
    const baseUrl = getMetadata(plugin.metadata.ExportUrl)
    const token = getMetadata(presentation.metadata.Token)
    if (token == null) {
      throw new Error('No token available')
    }

    const fieldMappers = {
      'documents:class:ControlledDocument': {
        author: '$currentUser',
        owner: '$currentUser',
        state: 'draft',
        major: 1,
        minor: 0,
        reviewers: [],
        controlledState: '',
        seqNumber: '$generateSeqNumber',
        code: '$generateCode'
      },
      'documents:class:DocumentMeta': {
        author: '$currentUser',
        owner: '$currentUser'
      },

View on GitHub (pinned to 63e28dc964)

Solutions

  1. Ensure the user is fully logged in and the presentation plugin has stored the token before triggering export.
  2. Gate the export action on login state (e.g. only enable when authenticated).
  3. Check that getMetadata(presentation.metadata.Token) is populated; if null, wait for login completion event.
  4. Pass or obtain a token explicitly instead of relying on ambient metadata if used outside the main client context.

Example fix

// before
const token = getMetadata(presentation.metadata.Token)
if (token == null) {
  throw new Error('No token available')
}
// after
const token = getMetadata(presentation.metadata.Token) ?? (await getTokenAfterLogin())
if (token == null) {
  throw new Error('No token available: ensure the user is logged in before exporting')
}
Defensive patterns

Strategy: try-catch

Validate before calling

const token = getMetadata(presentation.metadata.Token)
if (token == null) {
  throw new Error('Cannot export: no session token. Ensure the user is logged in.')
}
await exportToWorkspace(...)

Type guard

function hasToken (t: string | null | undefined): t is string {
  return t != null && t.length > 0
}

Try / catch

try {
  await exportToWorkspace(...)
} catch (err) {
  if (err instanceof Error && err.message === 'No token available') {
    // prompt login or wait for auth-ready before retrying
    await waitForLogin()
    return retryExport()
  }
  throw err
}

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Related errors


AI-assisted analysis of hcengineering/platform@63e28dc964 (2026-08-29). Data as JSON: /api/errors/9ea7f0f04b3936dd. Report an issue: GitHub.