RocketChat/Rocket.Chat · error · Error

video-conf-provider-unavailable

Error message

video-conf-provider-unavailable

What it means

Thrown by VideoConferenceService.getInfo when videoConfProviders.isProviderAvailable(call.providerName) is false — the call references a provider app that is not currently installed/enabled. isCallManagedByApp already filtered non-app calls (those return [] earlier), so this error means an app that once managed the call is now unavailable or deregistered.

Source

Thrown at apps/meteor/server/services/video-conference/service.ts:187

				name: 'Error on VideoConf.join',
				err,
			});
			throw err;
		});
	}

	public async getInfo(callId: VideoConference['_id'], uid: IUser['_id'] | undefined): Promise<UiKit.ModalSurfaceLayout> {
		const call = await VideoConferenceModel.findOneById(callId);
		if (!call) {
			throw new Error('invalid-call');
		}

		if (!videoConfTypes.isCallManagedByApp(call)) {
			return [];
		}

		if (!videoConfProviders.isProviderAvailable(call.providerName)) {
			throw new Error('video-conf-provider-unavailable');
		}

		let user: Pick<Required<IUser>, '_id' | 'username' | 'name' | 'avatarETag'> | null = null;

		if (uid) {
			user = await Users.findOneById<Pick<Required<IUser>, '_id' | 'username' | 'name' | 'avatarETag'>>(uid, {
				projection: { name: 1, username: 1, avatarETag: 1 },
			});
			if (!user) {
				throw new Error('failed-to-load-own-data');
			}
		}

		const blocks = await (await this.getProviderManager()).getVideoConferenceInfo(call.providerName, call, user || undefined).catch((e) => {
			throw new Error(e);
		});

		if (blocks?.length) {

View on GitHub (pinned to e4b8178b20)

Solutions

  1. Reinstall/enable the provider app (Administration > Apps) and confirm it registers the video conferencing provider
  2. Check the app's status and logs via the apps API after upgrades
  3. If the provider switch was intentional, hide the info UI for calls with the old providerName
  4. Wrap getInfo in a fallback that renders a 'provider unavailable' block

Example fix

// before
const blocks = await VideoConfService.getInfo(callId, uid);

// after
const call = await VideoConferenceModel.findOneById(callId);
if (call && !videoConfProviders.isProviderAvailable(call.providerName)) {
  return [{ type: 'section', text: { type: 'mrkdwn', text: 'Call provider unavailable' } }];
}
const blocks = await VideoConfService.getInfo(callId, uid);
Defensive patterns

Strategy: fallback

Validate before calling

const call = await VideoConferenceModel.findOneById(callId);
if (call && !videoConfProviders.isProviderAvailable(call.providerName)) {
  // provider gone: render a fallback instead of calling getInfo
  return fallbackBlocks();
}

Try / catch

try {
  const blocks = await VideoConfService.getInfo(callId, uid);
} catch (err) {
  if (err instanceof Error && err.message === 'video-conf-provider-unavailable') {
    return [{ type: 'section', text: { type: 'mrkdwn', text: 'Video conferencing provider is not available' } }];
  }
  throw err;
}

Prevention

When it happens

Trigger: Requesting call info after the video conferencing app (e.g. Jitsi) was uninstalled, disabled, or failed to register its provider; calls created under provider A after the workspace switched to provider B; app restart leaving providers momentarily unregistered.

Common situations: Admin uninstalls the video app while old call messages remain clickable; app upgrade deregisters the provider briefly; Apps Engine startup failures leaving the provider registry empty.

Related errors


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