{"record":{"id":"9933ea7e4b110b73","repo":"RocketChat/Rocket.Chat","slug":"video-conf-provider-unavailable","errorCode":null,"errorMessage":"video-conf-provider-unavailable","messagePattern":"video-conf-provider-unavailable","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"apps/meteor/server/services/video-conference/service.ts","lineNumber":187,"sourceCode":"\t\t\t\tname: 'Error on VideoConf.join',\n\t\t\t\terr,\n\t\t\t});\n\t\t\tthrow err;\n\t\t});\n\t}\n\n\tpublic async getInfo(callId: VideoConference['_id'], uid: IUser['_id'] | undefined): Promise<UiKit.ModalSurfaceLayout> {\n\t\tconst call = await VideoConferenceModel.findOneById(callId);\n\t\tif (!call) {\n\t\t\tthrow new Error('invalid-call');\n\t\t}\n\n\t\tif (!videoConfTypes.isCallManagedByApp(call)) {\n\t\t\treturn [];\n\t\t}\n\n\t\tif (!videoConfProviders.isProviderAvailable(call.providerName)) {\n\t\t\tthrow new Error('video-conf-provider-unavailable');\n\t\t}\n\n\t\tlet user: Pick<Required<IUser>, '_id' | 'username' | 'name' | 'avatarETag'> | null = null;\n\n\t\tif (uid) {\n\t\t\tuser = await Users.findOneById<Pick<Required<IUser>, '_id' | 'username' | 'name' | 'avatarETag'>>(uid, {\n\t\t\t\tprojection: { name: 1, username: 1, avatarETag: 1 },\n\t\t\t});\n\t\t\tif (!user) {\n\t\t\t\tthrow new Error('failed-to-load-own-data');\n\t\t\t}\n\t\t}\n\n\t\tconst blocks = await (await this.getProviderManager()).getVideoConferenceInfo(call.providerName, call, user || undefined).catch((e) => {\n\t\t\tthrow new Error(e);\n\t\t});\n\n\t\tif (blocks?.length) {","sourceCodeStart":169,"sourceCodeEnd":205,"githubUrl":"https://github.com/RocketChat/Rocket.Chat/blob/e4b8178b205510181a96ceefee043d0abcd13e5a/apps/meteor/server/services/video-conference/service.ts#L169-L205","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Reinstall/enable the provider app (Administration > Apps) and confirm it registers the video conferencing provider","Check the app's status and logs via the apps API after upgrades","If the provider switch was intentional, hide the info UI for calls with the old providerName","Wrap getInfo in a fallback that renders a 'provider unavailable' block"],"exampleFix":"// before\nconst blocks = await VideoConfService.getInfo(callId, uid);\n\n// after\nconst call = await VideoConferenceModel.findOneById(callId);\nif (call && !videoConfProviders.isProviderAvailable(call.providerName)) {\n  return [{ type: 'section', text: { type: 'mrkdwn', text: 'Call provider unavailable' } }];\n}\nconst blocks = await VideoConfService.getInfo(callId, uid);","handlingStrategy":"fallback","validationCode":"const call = await VideoConferenceModel.findOneById(callId);\nif (call && !videoConfProviders.isProviderAvailable(call.providerName)) {\n  // provider gone: render a fallback instead of calling getInfo\n  return fallbackBlocks();\n}","typeGuard":null,"tryCatchPattern":"try {\n  const blocks = await VideoConfService.getInfo(callId, uid);\n} catch (err) {\n  if (err instanceof Error && err.message === 'video-conf-provider-unavailable') {\n    return [{ type: 'section', text: { type: 'mrkdwn', text: 'Video conferencing provider is not available' } }];\n  }\n  throw err;\n}","preventionTips":["Warn admins that uninstalling a video app orphans existing call messages","Health-check provider registration after app upgrades","Never assume providerName from old calls still resolves"],"tags":["video-conference","apps-engine","provider"],"backgroundTag":"provider-not-available","analyzedSha":"e4b8178b205510181a96ceefee043d0abcd13e5a","analyzedAt":"2026-08-18T15:26:39.429Z","contentChangedAt":"2026-08-18T15:26:39.429Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}