RocketChat/Rocket.Chat · error · Meteor.Error

error-invalid-user

error-invalid-user

Error message

Invalid user

What it means

Thrown by 'autoTranslate.getSupportedLanguages' when there is no authenticated user. The method resolves the caller's translation provider via getSupportedLanguages(userId, targetLanguage), so a session is required. Note the thrown error's details use method: 'getSupportedLanguages' (without the autoTranslate. prefix) — a metadata mismatch to be aware of when matching on details.method.

Source

Thrown at apps/meteor/server/meteor-methods/platform/getSupportedLanguages.ts:20

import type { ServerMethods } from '@rocket.chat/ddp-client';
import { DDPRateLimiter } from 'meteor/ddp-rate-limiter';
import { Meteor } from 'meteor/meteor';

import { getSupportedLanguages } from '../../lib/autotranslate/functions/getSupportedLanguages';

declare module '@rocket.chat/ddp-client' {
	// eslint-disable-next-line @typescript-eslint/naming-convention
	interface ServerMethods {
		'autoTranslate.getSupportedLanguages'(targetLanguage: string): ISupportedLanguage[] | undefined;
	}
}

Meteor.methods<ServerMethods>({
	async 'autoTranslate.getSupportedLanguages'(targetLanguage) {
		const userId = Meteor.userId();

		if (!userId) {
			throw new Meteor.Error('error-invalid-user', 'Invalid user', {
				method: 'getSupportedLanguages',
			});
		}

		return getSupportedLanguages(userId, targetLanguage);
	},
});

DDPRateLimiter.addRule(
	{
		type: 'method',
		name: 'autoTranslate.getSupportedLanguages',
		userId(/* userId*/) {
			return true;
		},
	},
	5,
	60000,

View on GitHub (pinned to b2c16d5842)

Solutions

  1. Ensure a session exists before requesting supported languages
  2. Guard with Meteor.userId() and defer the call until login completes
  3. When inspecting error details, expect method 'getSupportedLanguages' rather than the full method name
  4. Prefer a REST equivalent for new integrations

Example fix

// before
const langs = await Meteor.callAsync('autoTranslate.getSupportedLanguages', targetLanguage);

// after
if (!Meteor.userId()) {
  // language list depends on the user's translation provider; wait for login
  return [];
}
const langs = await Meteor.callAsync('autoTranslate.getSupportedLanguages', targetLanguage);
Defensive patterns

Strategy: validation

Validate before calling

// client: supported languages depend on the logged-in user's provider
if (!Meteor.userId()) {
  // return a safe default instead of calling
}

Type guard

import { Meteor } from 'meteor/meteor';

const isMeteorError = (err: unknown, code?: string): err is Meteor.Error =>
  err instanceof Meteor.Error && (code === undefined || err.error === code);

Try / catch

try {
  const langs = await Meteor.callAsync('autoTranslate.getSupportedLanguages', targetLanguage);
} catch (err) {
  if (isMeteorError(err, 'error-invalid-user')) {
    // wait for login, then refetch
  } else {
    throw err;
  }
}

Prevention

When it happens

Trigger: Requesting supported translation languages from a logged-out client; the translation settings UI loads before login resolves; session expiry while the language picker fetches options.

Common situations: Language pickers rendered pre-login; expired sessions in long-open tabs; consumers matching on the error payload's method field hitting the name mismatch.

Related errors


AI-assisted analysis of RocketChat/Rocket.Chat@b2c16d5842 (2026-08-18). Data as JSON: /api/errors/71c2aa0a6509abb6. Report an issue: GitHub.