diff --git a/src/createRoom.ts b/src/createRoom.ts index 25e7257289..daf8594e23 100644 --- a/src/createRoom.ts +++ b/src/createRoom.ts @@ -219,7 +219,19 @@ export default async function createRoom(opts: IOpts): Promise { if (opts.spinner) modal = Modal.createDialog(Spinner, null, 'mx_Dialog_spinner'); let roomId; - return client.createRoom(createOpts).finally(function() { + return client.createRoom(createOpts).catch(function(err) { + // NB This checks for the Synapse-specific error condition of a room creation + // having been denied because the requesting user wanted to publish the room, + // but the server denies them that permission (via room_list_publication_rules). + // The check below responds by retrying without publishing the room. + if (err.httpStatus === 403 && err.errcode === "M_UNKNOWN" && err.data.error === "Not allowed to publish room") { + console.warn("Failed to publish room, try again without publishing it"); + createOpts.visibility = Visibility.Private; + return client.createRoom(createOpts); + } else { + return Promise.reject(err); + } + }).finally(function() { if (modal) modal.close(); }).then(function(res) { roomId = res.room_id;