RocketChat/Rocket.Chat · error · Meteor.Error
error-action-not-allowed
error-action-not-allowed
Error message
Login neccessary
What it means
Thrown by 'autoTranslate.getProviderUiMetadata' when there is no authenticated user. Unlike its sibling methods it uses the code 'error-action-not-allowed' with the message 'Login neccessary' (typo present in source) instead of 'error-invalid-user' — code matching must target 'error-action-not-allowed'. It guards metadata (name/displayName) about registered auto-translate providers such as DeepL.
Source
Thrown at apps/meteor/server/meteor-methods/platform/getProviderUiMetadata.ts:16
import type { ServerMethods } from '@rocket.chat/ddp-client';
import { Meteor } from 'meteor/meteor';
import { TranslationProviderRegistry } from '../../lib/autotranslate/autotranslate';
declare module '@rocket.chat/ddp-client' {
// eslint-disable-next-line @typescript-eslint/naming-convention
interface ServerMethods {
'autoTranslate.getProviderUiMetadata'(): Record<string, { name: string; displayName: string }>;
}
}
Meteor.methods<ServerMethods>({
'autoTranslate.getProviderUiMetadata'() {
if (!Meteor.userId()) {
throw new Meteor.Error('error-action-not-allowed', 'Login neccessary', {
method: 'autoTranslate.getProviderUiMetadata',
});
}
return Object.fromEntries(
TranslationProviderRegistry.getProviders().map((provider) => {
const { name, displayName } = provider._getProviderMetadata();
return [name, { name, displayName }];
}),
);
},
});
View on GitHub (pinned to b2c16d5842)
Solutions
- Ensure the user is logged in before requesting provider metadata
- Gate the call with Meteor.userId() and defer it until the session is ready
- When catching, match error.error === 'error-action-not-allowed' — not 'error-invalid-user'
Example fix
// before
const providers = await Meteor.callAsync('autoTranslate.getProviderUiMetadata');
// after
if (!Meteor.userId()) {
// provider metadata requires a session; skip until logged in
return {};
}
const providers = await Meteor.callAsync('autoTranslate.getProviderUiMetadata'); Defensive patterns
Strategy: validation
Validate before calling
// client: provider metadata requires a session
if (!Meteor.userId()) {
// skip the metadata fetch until logged in
} 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 {
await Meteor.callAsync('autoTranslate.getProviderUiMetadata');
} catch (err) {
// note: this method throws 'error-action-not-allowed', not 'error-invalid-user'
if (isMeteorError(err, 'error-action-not-allowed')) {
// re-authenticate, then refetch provider metadata
} else {
throw err;
}
} Prevention
- Match on 'error-action-not-allowed' for this method — its auth error code differs from sibling methods
- Defer settings-panel fetches until the user session is ready
When it happens
Trigger: Calling autoTranslate.getProviderUiMetadata anonymously; the auto-translate settings panel loads before the login state resolves; session expired while the admin translation settings were open.
Common situations: Settings screens fetched with a stale token; components mounting before user data is ready; translation provider metadata used in pre-login UI by mistake.
Related errors
AI-assisted analysis of RocketChat/Rocket.Chat@b2c16d5842 (2026-08-18).
Data as JSON: /api/errors/9a9b4337078a3204.
Report an issue: GitHub.