RocketChat/Rocket.Chat · error · Meteor.Error

error-creator-not-in-room

error-creator-not-in-room

Error message

The creator user must be part of the direct room

What it means

createDirectRoom throws error-creator-not-in-room when a federated direct room is being created but the user specified in options.creator does not appear among the resolved room members. For federated DMs the server needs a local creator record to build INVITED subscriptions with an inviter, so a missing creator makes the room state impossible to construct.

Source

Thrown at apps/meteor/server/lib/rooms/createDirectRoom.ts:160

				$setOnInsert: generateSubscription(roomMembers[0].name! || roomMembers[0].username!, roomMembers[0].username!, roomMembers[0], {
					...options?.subscriptionExtra,
				}),
			},
			{ upsert: true },
		);
		if (modifiedCount || upsertedCount) {
			void notifyOnSubscriptionChangedByRoomIdAndUserId(rid, roomMembers[0]._id, modifiedCount ? 'updated' : 'inserted');
		}
	} else {
		const memberIds = roomMembers.map((member) => member._id);
		const membersWithPreferences: IUser[] = await Users.find(
			{ _id: { $in: memberIds } },
			{ projection: { 'username': 1, 'settings.preferences': 1 } },
		).toArray();

		const creatorUser = roomMembers.find((member) => member._id === options?.creator);
		if (roomExtraData.federated && !creatorUser) {
			throw new Meteor.Error('error-creator-not-in-room', 'The creator user must be part of the direct room');
		}

		const roomNames = getNameForDMs(roomMembers);

		for (const member of membersWithPreferences) {
			const subscriptionStatus: Partial<ISubscription> =
				roomExtraData.federated && options.creator !== member._id && creatorUser
					? {
							status: 'INVITED',
							inviter: {
								_id: creatorUser._id,
								username: creatorUser.username!,
								name: creatorUser.name,
							},
							open: true,
							unread: 1,
							userMentions: 1,
						}

View on GitHub (pinned to 2a7de45707)

Solutions

  1. Ensure options.creator is set when creating federated direct rooms, e.g. { ...options, creator: options?.creator || owner?._id } (createRoom already does this for type 'd')
  2. Verify the creator user id is included in the members array passed to createDirectRoom so roomMembers.find(...) resolves it
  3. Check federation peer setup if the creator is a remote user: the local server must have the creator registered locally before creating the DM

Example fix

// before
await createDirectRoom(members, { federated: true }); // no creator

// after
await createDirectRoom(members, { federated: true }, { creator: owner._id });
Defensive patterns

Strategy: validation

Validate before calling

const creatorId = options?.creator || owner._id;
const memberIds = new Set(members.map(m => typeof m === 'string' ? m : m._id));
if (extraData.federated && !memberIds.has(creatorId)) {
  throw new Error(`Creator ${creatorId} must be included in members for federated DMs`);
}
await createDirectRoom(members, extraData, { creator: creatorId });

Type guard

const isCreatorInMembers = (
  members: IUser[] | string[],
  creatorId: string | undefined,
  federated: boolean,
): boolean =>
  !federated ||
  (creatorId !== undefined &&
    members.some(m => (typeof m === 'string' ? m === creatorId : m._id === creatorId)));

Try / catch

try {
  await createDirectRoom(members, extraData, { creator });
} catch (err) {
  if (err instanceof Meteor.Error && err.error === 'error-creator-not-in-room') {
    // include the creator id in members and retry once
  }
  throw err;
}

Prevention

When it happens

Trigger: Calling createDirectRoom (directly or via createRoom/createDirectMessage) with roomExtraData.federated = true while options.creator is undefined or references a user id that is not in the members array resolved from the passed usernames/user objects. The check is `roomExtraData.federated && !creatorUser` where creatorUser = roomMembers.find(m => m._id === options?.creator).

Common situations: Federation apps calling the room creation API without passing creator; passing a creator id that was not included in the member list (e.g. expecting the server to add the creator implicitly); federation enabled in settings while an integration or app still uses the non-federated call shape.

Related errors


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