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
- Pass the call id unchanged in payload.blockId, exactly as delivered by the original interaction
- Validate the payload shape (blockId present) before dispatching
- 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
- Carry the call id in payload.blockId exactly as the popup delivered it
- Re-render the video popup from server state instead of caching reconstructed payloads
- Assert blockId presence in dev builds before dispatching join/info
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.