RocketChat/Rocket.Chat · error · Error

invalid call

Error message

invalid call

What it means

VideoConfModule.blockAction (appId 'videoconf-core') takes payload.blockId as the video-call id for the 'join' and 'info' actions of the conferencing widget. If blockId is absent it throws 'invalid call' before any call lookup happens — this is a payload-shape failure, not an unknown-conference failure.

Source

Thrown at apps/meteor/server/modules/core-apps/videoconf.module.ts:19

import type { IUiKitCoreApp, UiKitCoreAppBlockActionPayload } from '@rocket.chat/core-services';
import { VideoConf } from '@rocket.chat/core-services';
import type * as UiKit from '@rocket.chat/ui-kit';

import { i18n } from '../../lib/i18n';

export class VideoConfModule implements IUiKitCoreApp {
	appId = 'videoconf-core';

	async blockAction(payload: UiKitCoreAppBlockActionPayload): Promise<UiKit.ServerInteraction | undefined> {
		const {
			triggerId,
			actionId,
			payload: { blockId: callId },
			user: { _id: userId } = {},
		} = payload;

		if (!callId) {
			throw new Error('invalid call');
		}

		if (actionId === 'join') {
			await VideoConf.join(userId, callId, {});
		}

		if (actionId === 'info') {
			const blocks = await VideoConf.getInfo(callId, userId);

			return {
				type: 'modal.open',
				triggerId,
				appId: this.appId,
				view: {
					appId: this.appId,
					id: `${callId}-info`,
					title: {
						type: 'plain_text',

View on GitHub (pinned to b2c16d5842)

Solutions

  1. Pass the call id unchanged in payload.blockId, exactly as delivered by the original interaction
  2. Validate the payload shape (blockId present) before dispatching
  3. Keep the original interaction object from the popup/ringer instead of reconstructing it

Example fix

// before
api.call('uiKit', { appId: 'videoconf-core', actionId: 'join', payload: {} }); // throws 'invalid call'

// after
api.call('uiKit', { appId: 'videoconf-core', actionId: 'join', payload: { blockId: callId } });
Defensive patterns

Strategy: validation

Validate before calling

const hasCallId = (p: any): boolean => Boolean(p?.payload?.blockId);

Type guard

const isVideoConfAction = (p: unknown): p is { payload: { blockId: string } } =>
  typeof p === 'object' && p !== null && typeof (p as any).payload?.blockId === 'string';

Prevention

When it happens

Trigger: Dispatching a videoconf-core blockAction (join/info buttons of the video call popup or ringing banner) whose payload has no blockId — reconstructed interaction objects or skeleton test payloads.

Common situations: Custom clients driving the video popup programmatically; payloads rebuilt after a re-render; copied payloads where blockId was renamed or dropped.

Related errors


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