@vector-im/matrix-bot-sdk
Version:
TypeScript/JavaScript SDK for Matrix bots and appservices
56 lines • 2.59 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.AppserviceJoinRoomStrategy = void 0;
/**
* A join strategy for application services that proxies joins to an underlying join
* strategy while also trying to use the appservice's bot user to invite the underlying
* user if needed.
* @category Join strategies
*/
class AppserviceJoinRoomStrategy {
underlyingStrategy;
appservice;
constructor(underlyingStrategy, appservice) {
this.underlyingStrategy = underlyingStrategy;
this.appservice = appservice;
}
async joinRoom(roomIdOrAlias, userId, apiCall) {
try {
// First just try joining via the apiCall
return await apiCall(roomIdOrAlias);
}
catch (err) {
// If the user being joined is *not* the bridge bot, try and get the bridge bot to
// join them to the room.
if (userId !== this.appservice.botUserId) {
const client = this.appservice.botIntent.underlyingClient;
const roomId = await client.resolveRoom(roomIdOrAlias);
try {
// First start with having the bridge bot invite the user to the room
await client.inviteUser(userId, roomId);
}
catch (inviteErr) {
// The invite failed - use the underlying join strategy to join the room, just in case.
// If there's no join strategy, we want to fall through to an error.
if (this.underlyingStrategy)
return this.underlyingStrategy.joinRoom(roomId, userId, apiCall);
throw inviteErr;
}
// The invite succeeded - use the underlying join strategy to join the room or just call use
// the apiCall if no strategy exists. We are expecting success.
if (this.underlyingStrategy)
return this.underlyingStrategy.joinRoom(roomId, userId, apiCall);
else
return apiCall(roomId);
}
else if (this.underlyingStrategy) {
// If the user being joined *is* the bridge bot, try and use the join strategy to join.
return this.underlyingStrategy.joinRoom(roomIdOrAlias, userId, apiCall);
}
// Finally, if all else fails, throw.
throw err;
}
}
}
exports.AppserviceJoinRoomStrategy = AppserviceJoinRoomStrategy;
//# sourceMappingURL=AppserviceJoinRoomStrategy.js.map
;