{"record":{"id":"42f5fd5a43dd7097","repo":"RocketChat/Rocket.Chat","slug":"room-converter-not-found","errorCode":null,"errorMessage":"Room converter not found","messagePattern":"Room converter not found","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"apps/meteor/app/apps/server/bridges/rooms.ts","lineNumber":209,"sourceCode":"\tprotected async getAllRooms(filters: GetRoomsFilters = {}, options: GetRoomsOptions = {}, appId: string): Promise<Array<IRoomRaw>> {\n\t\tthis.orch.debugLog(`The App ${appId} is getting all rooms with options`, options);\n\n\t\tconst { limit = 100, skip = 0 } = options;\n\n\t\tconst findOptions: FindOptions<ICoreRoom> = {\n\t\t\tsort: { ts: -1 },\n\t\t\tskip,\n\t\t\tlimit: Math.min(limit, 100),\n\t\t\tprojection: rawRoomProjection,\n\t\t};\n\n\t\tconst { types, discussions, teams } = filters;\n\n\t\tconst rooms: IRoomRaw[] = [];\n\n\t\tconst roomConverter = this.orch.getConverters()?.get('rooms');\n\t\tif (!roomConverter) {\n\t\t\tthrow new Error('Room converter not found');\n\t\t}\n\n\t\tfor await (const room of Rooms.findAllByTypesAndDiscussionAndTeam({ types, discussions, teams }, findOptions)) {\n\t\t\tconst converted = await roomConverter.convertRoomRaw(room);\n\t\t\tif (converted) {\n\t\t\t\trooms.push(converted);\n\t\t\t}\n\t\t}\n\n\t\treturn rooms;\n\t}\n\n\tprotected async getDirectByUsernames(usernames: Array<string>, appId: string): Promise<IRoom | undefined> {\n\t\tthis.orch.debugLog(`The App ${appId} is getting direct room by usernames: \"${usernames}\"`);\n\t\tconst room = await Rooms.findDirectRoomContainingAllUsernames(usernames, {});\n\t\tif (!room) {\n\t\t\treturn undefined;\n\t\t}","sourceCodeStart":191,"sourceCodeEnd":227,"githubUrl":"https://github.com/RocketChat/Rocket.Chat/blob/b2c16d5842cbe6b69b59bdf6fc5e5f1afcd1f0b0/apps/meteor/app/apps/server/bridges/rooms.ts#L191-L227","documentation":"AppRoomBridge.getRooms (rooms listing with type/discussion/team filters) requires the 'rooms' converter in the orchestrator registry and throws when this.orch.getConverters()?.get('rooms') returns undefined. Like the messages case, it is an internal invariant — converter registration happens during apps subsystem startup, so its absence signals broken initialization.","triggerScenarios":"Invoking the get-rooms API before the orchestrator finished registering converters; apps framework toggled off/on around the call; a modified build where the rooms converter registration path was altered.","commonSituations":"Startup races in deployments that hit app endpoints immediately; custom forks trimming apps-engine integration; failed orchestrator startup logged earlier but unnoticed.","solutions":["Confirm the Apps framework is enabled and startup completed (check logs for the apps orchestrator)","Restart and inspect startup logs for converter registration errors","On forks, verify the 'rooms' converter registration code path is intact","If it persists on stock builds, gather logs and report to Rocket.Chat"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n  const rooms = await app.getRocketChat().getChat().getRooms(options);\n} catch (err) {\n  if (err instanceof Error && err.message === 'Room converter not found') {\n    app.getLogger().error('apps orchestrator not ready: room converter missing');\n    return [];\n  }\n  throw err;\n}","preventionTips":["Consider a room listing failure with this message an environment/initialization defect — check server logs","Avoid calling room listings during server startup windows","Monitor apps subsystem startup completion before enabling app endpoints","Report reproducible occurrences on unmodified builds upstream"],"tags":["apps-engine","rooms","converter","initialization","listing"],"backgroundTag":"converter-not-found","analyzedSha":"b2c16d5842cbe6b69b59bdf6fc5e5f1afcd1f0b0","analyzedAt":"2026-08-18T15:26:39.429Z","contentChangedAt":"2026-08-18T15:26:39.429Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}