Merge pull request #19386 from antobinary/merge-30-alpha1
chore: Merge 3.0.0-alpha.1 to develop
This commit is contained in:
commit
3f0c30b404
2
.github/dependabot.yml
vendored
2
.github/dependabot.yml
vendored
@ -48,7 +48,7 @@ updates:
|
||||
# upcoming release branch
|
||||
## excluding bigbluebutton-tests/playwright, bigbluebutton-tests/puppeteer, docs, bbb-graphql-client-test
|
||||
- package-ecosystem: npm
|
||||
directory: "/bbb-graphql-actions-adapter-server"
|
||||
directory: "/bbb-graphql-actions"
|
||||
target-branch: "v3.0.x-release"
|
||||
schedule:
|
||||
interval: daily
|
||||
|
2
.github/workflows/automated-tests.yml
vendored
2
.github/workflows/automated-tests.yml
vendored
@ -54,7 +54,7 @@ jobs:
|
||||
build-list: bbb-playback bbb-playback-notes bbb-playback-podcast bbb-playback-presentation bbb-playback-screenshare bbb-playback-video bbb-record-core
|
||||
- package: bbb-graphql-server
|
||||
build-name: bbb-graphql-server
|
||||
build-list: bbb-graphql-server bbb-graphql-middleware bbb-graphql-actions-adapter-server
|
||||
build-list: bbb-graphql-server bbb-graphql-middleware bbb-graphql-actions
|
||||
- package: bbb-etherpad
|
||||
cache-files-list: bbb-etherpad.placeholder.sh
|
||||
cache-urls-list: https://api.github.com/repos/mconf/ep_pad_ttl/commits https://api.github.com/repos/alangecker/bbb-etherpad-plugin/commits https://api.github.com/repos/mconf/ep_redis_publisher/commits https://api.github.com/repos/alangecker/bbb-etherpad-skin/commits
|
||||
|
@ -75,15 +75,15 @@ class BigBlueButtonActor(
|
||||
private def handleBbbCommonEnvCoreMsg(msg: BbbCommonEnvCoreMsg): Unit = {
|
||||
msg.core match {
|
||||
|
||||
case m: CreateMeetingReqMsg => handleCreateMeetingReqMsg(m)
|
||||
case m: RegisterUserReqMsg => handleRegisterUserReqMsg(m)
|
||||
case m: GetAllMeetingsReqMsg => handleGetAllMeetingsReqMsg(m)
|
||||
case m: GetRunningMeetingsReqMsg => handleGetRunningMeetingsReqMsg(m)
|
||||
case m: CheckAlivePingSysMsg => handleCheckAlivePingSysMsg(m)
|
||||
case m: ValidateConnAuthTokenSysMsg => handleValidateConnAuthTokenSysMsg(m)
|
||||
case _: UserGraphqlConnectionStablishedSysMsg => //Ignore
|
||||
case _: UserGraphqlConnectionClosedSysMsg => //Ignore
|
||||
case _ => log.warning("Cannot handle " + msg.envelope.name)
|
||||
case m: CreateMeetingReqMsg => handleCreateMeetingReqMsg(m)
|
||||
case m: RegisterUserReqMsg => handleRegisterUserReqMsg(m)
|
||||
case m: GetAllMeetingsReqMsg => handleGetAllMeetingsReqMsg(m)
|
||||
case m: GetRunningMeetingsReqMsg => handleGetRunningMeetingsReqMsg(m)
|
||||
case m: CheckAlivePingSysMsg => handleCheckAlivePingSysMsg(m)
|
||||
case m: ValidateConnAuthTokenSysMsg => handleValidateConnAuthTokenSysMsg(m)
|
||||
case _: UserGraphqlConnectionEstablishedSysMsg => //Ignore
|
||||
case _: UserGraphqlConnectionClosedSysMsg => //Ignore
|
||||
case _ => log.warning("Cannot handle " + msg.envelope.name)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -95,7 +95,7 @@ object PermissionCheck extends SystemConfiguration {
|
||||
for {
|
||||
regUser <- RegisteredUsers.findWithUserId(userId, liveMeeting.registeredUsers)
|
||||
} yield {
|
||||
Sender.sendInvalidateUserGraphqlConnectionSysMsg(liveMeeting.props.meetingProp.intId, regUser.id, regUser.sessionToken, reason, outGW)
|
||||
Sender.sendForceUserGraphqlReconnectionSysMsg(liveMeeting.props.meetingProp.intId, regUser.id, regUser.sessionToken, reason, outGW)
|
||||
}
|
||||
} else {
|
||||
// TODO: get this object a context so it can use the akka logging system
|
||||
|
@ -36,7 +36,7 @@ trait EjectUserFromBreakoutInternalMsgHdlr {
|
||||
Sender.sendDisconnectClientSysMsg(msg.breakoutId, registeredUser.id, msg.ejectedBy, msg.reasonCode, outGW)
|
||||
|
||||
// Force reconnection with graphql to refresh permissions
|
||||
Sender.sendInvalidateUserGraphqlConnectionSysMsg(liveMeeting.props.meetingProp.intId, registeredUser.id, registeredUser.sessionToken, msg.reasonCode, outGW)
|
||||
Sender.sendForceUserGraphqlReconnectionSysMsg(liveMeeting.props.meetingProp.intId, registeredUser.id, registeredUser.sessionToken, msg.reasonCode, outGW)
|
||||
|
||||
//send users update to parent meeting
|
||||
BreakoutHdlrHelpers.updateParentMeetingWithUsers(liveMeeting, eventBus)
|
||||
|
@ -85,7 +85,7 @@ object AssignPresenterActionHandler extends RightsManagementTrait {
|
||||
for {
|
||||
u <- RegisteredUsers.findWithUserId(oldPres.intId, liveMeeting.registeredUsers)
|
||||
} yield {
|
||||
Sender.sendInvalidateUserGraphqlConnectionSysMsg(liveMeeting.props.meetingProp.intId, oldPres.intId, u.sessionToken, "role_changed", outGW)
|
||||
Sender.sendForceUserGraphqlReconnectionSysMsg(liveMeeting.props.meetingProp.intId, oldPres.intId, u.sessionToken, "role_changed", outGW)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -100,7 +100,7 @@ object AssignPresenterActionHandler extends RightsManagementTrait {
|
||||
for {
|
||||
u <- RegisteredUsers.findWithUserId(newPres.intId, liveMeeting.registeredUsers)
|
||||
} yield {
|
||||
Sender.sendInvalidateUserGraphqlConnectionSysMsg(liveMeeting.props.meetingProp.intId, newPres.intId, u.sessionToken, "role_changed", outGW)
|
||||
Sender.sendForceUserGraphqlReconnectionSysMsg(liveMeeting.props.meetingProp.intId, newPres.intId, u.sessionToken, "role_changed", outGW)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,6 @@
|
||||
package org.bigbluebutton.core.apps.users
|
||||
|
||||
import org.bigbluebutton.ClientSettings.getConfigPropertyValueByPath
|
||||
import org.bigbluebutton.common2.msgs._
|
||||
import org.bigbluebutton.core.apps.RightsManagementTrait
|
||||
import org.bigbluebutton.core.models.{ UserState, Users2x }
|
||||
@ -29,9 +30,17 @@ trait ChangeUserReactionEmojiReqMsgHdlr extends RightsManagementTrait {
|
||||
outGW.send(msgEventChange)
|
||||
}
|
||||
|
||||
//Get durationInSeconds from Client config
|
||||
val userReactionExpire =
|
||||
getConfigPropertyValueByPath(liveMeeting.clientSettings, "public.userReaction.expire") match {
|
||||
case Some(durationInSeconds: Int) => durationInSeconds
|
||||
case _ =>
|
||||
log.debug("Config `public.userReaction.expire` not found.")
|
||||
30
|
||||
}
|
||||
for {
|
||||
user <- Users2x.findWithIntId(liveMeeting.users2x, msg.body.userId)
|
||||
newUserState <- Users2x.setReactionEmoji(liveMeeting.users2x, user.intId, msg.body.reactionEmoji)
|
||||
newUserState <- Users2x.setReactionEmoji(liveMeeting.users2x, user.intId, msg.body.reactionEmoji, userReactionExpire)
|
||||
} yield {
|
||||
if (user.reactionEmoji != msg.body.reactionEmoji) {
|
||||
broadcast(newUserState, msg.body.reactionEmoji)
|
||||
|
@ -73,7 +73,7 @@ trait ChangeUserRoleCmdMsgHdlr extends RightsManagementTrait {
|
||||
for {
|
||||
u <- RegisteredUsers.findWithUserId(uvo.intId, liveMeeting.registeredUsers)
|
||||
} yield {
|
||||
Sender.sendInvalidateUserGraphqlConnectionSysMsg(liveMeeting.props.meetingProp.intId, uvo.intId, u.sessionToken, "role_changed", outGW)
|
||||
Sender.sendForceUserGraphqlReconnectionSysMsg(liveMeeting.props.meetingProp.intId, uvo.intId, u.sessionToken, "role_changed", outGW)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -24,7 +24,7 @@ trait ClearAllUsersReactionCmdMsgHdlr extends RightsManagementTrait {
|
||||
user <- Users2x.findAll(liveMeeting.users2x)
|
||||
} yield {
|
||||
//Don't clear away and RaiseHand
|
||||
Users2x.setReactionEmoji(liveMeeting.users2x, user.intId, "none")
|
||||
Users2x.setReactionEmoji(liveMeeting.users2x, user.intId, "none", 0)
|
||||
}
|
||||
sendClearedAllUsersReactionEvtMsg(outGW, liveMeeting.props.meetingProp.intId, msg.header.userId)
|
||||
} else {
|
||||
|
@ -74,7 +74,7 @@ trait EjectUserFromMeetingCmdMsgHdlr extends RightsManagementTrait {
|
||||
Sender.sendDisconnectClientSysMsg(meetingId, ru.id, ejectedBy, EjectReasonCode.EJECT_USER, outGW)
|
||||
|
||||
// Force reconnection with graphql to refresh permissions
|
||||
Sender.sendInvalidateUserGraphqlConnectionSysMsg(liveMeeting.props.meetingProp.intId, registeredUser.id, registeredUser.sessionToken, EjectReasonCode.EJECT_USER, outGW)
|
||||
Sender.sendForceUserGraphqlReconnectionSysMsg(liveMeeting.props.meetingProp.intId, registeredUser.id, registeredUser.sessionToken, EjectReasonCode.EJECT_USER, outGW)
|
||||
}
|
||||
} else {
|
||||
// User is ejecting self, so just eject this userid not all sessions if joined using multiple
|
||||
@ -93,7 +93,7 @@ trait EjectUserFromMeetingCmdMsgHdlr extends RightsManagementTrait {
|
||||
Sender.sendDisconnectClientSysMsg(meetingId, userId, ejectedBy, EjectReasonCode.EJECT_USER, outGW)
|
||||
|
||||
// Force reconnection with graphql to refresh permissions
|
||||
Sender.sendInvalidateUserGraphqlConnectionSysMsg(liveMeeting.props.meetingProp.intId, registeredUser.id, registeredUser.sessionToken, EjectReasonCode.EJECT_USER, outGW)
|
||||
Sender.sendForceUserGraphqlReconnectionSysMsg(liveMeeting.props.meetingProp.intId, registeredUser.id, registeredUser.sessionToken, EjectReasonCode.EJECT_USER, outGW)
|
||||
}
|
||||
|
||||
}
|
||||
@ -129,7 +129,7 @@ trait EjectUserFromMeetingSysMsgHdlr {
|
||||
for {
|
||||
regUser <- RegisteredUsers.findWithUserId(userId, liveMeeting.registeredUsers)
|
||||
} yield {
|
||||
Sender.sendInvalidateUserGraphqlConnectionSysMsg(liveMeeting.props.meetingProp.intId, regUser.id, regUser.sessionToken, EjectReasonCode.SYSTEM_EJECT_USER, outGW)
|
||||
Sender.sendForceUserGraphqlReconnectionSysMsg(liveMeeting.props.meetingProp.intId, regUser.id, regUser.sessionToken, EjectReasonCode.SYSTEM_EJECT_USER, outGW)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -44,7 +44,7 @@ trait LockUserInMeetingCmdMsgHdlr extends RightsManagementTrait {
|
||||
for {
|
||||
u <- RegisteredUsers.findWithUserId(uvo.intId, liveMeeting.registeredUsers)
|
||||
} yield {
|
||||
Sender.sendInvalidateUserGraphqlConnectionSysMsg(liveMeeting.props.meetingProp.intId, uvo.intId, u.sessionToken, "lock_user_changed", outGW)
|
||||
Sender.sendForceUserGraphqlReconnectionSysMsg(liveMeeting.props.meetingProp.intId, uvo.intId, u.sessionToken, "lock_user_changed", outGW)
|
||||
}
|
||||
|
||||
log.info("Lock user. meetingId=" + props.meetingProp.intId + " userId=" + uvo.intId + " locked=" + uvo.locked)
|
||||
|
@ -49,7 +49,7 @@ trait RegisterUserReqMsgHdlr {
|
||||
Sender.sendDisconnectClientSysMsg(meetingId, userToRemove.id, SystemUser.ID, EjectReasonCode.DUPLICATE_USER, outGW)
|
||||
|
||||
// Force reconnection with graphql to refresh permissions
|
||||
Sender.sendInvalidateUserGraphqlConnectionSysMsg(liveMeeting.props.meetingProp.intId, userToRemove.id, userToRemove.sessionToken, EjectReasonCode.DUPLICATE_USER, outGW)
|
||||
Sender.sendForceUserGraphqlReconnectionSysMsg(liveMeeting.props.meetingProp.intId, userToRemove.id, userToRemove.sessionToken, EjectReasonCode.DUPLICATE_USER, outGW)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -51,7 +51,7 @@ trait UserJoinMeetingReqMsgHdlr extends HandlerHelpers {
|
||||
notifyPreviousUsersWithSameExtId(regUser)
|
||||
clearCachedVoiceUser(regUser)
|
||||
clearExpiredUserState(regUser)
|
||||
invalidateUserGraphqlConnection(regUser)
|
||||
ForceUserGraphqlReconnection(regUser)
|
||||
|
||||
newState
|
||||
}
|
||||
@ -146,7 +146,7 @@ trait UserJoinMeetingReqMsgHdlr extends HandlerHelpers {
|
||||
private def clearExpiredUserState(regUser: RegisteredUser) =
|
||||
UserStateDAO.updateExpired(regUser.id, false)
|
||||
|
||||
private def invalidateUserGraphqlConnection(regUser: RegisteredUser) =
|
||||
Sender.sendInvalidateUserGraphqlConnectionSysMsg(liveMeeting.props.meetingProp.intId, regUser.id, regUser.sessionToken, "user_joined", outGW)
|
||||
private def ForceUserGraphqlReconnection(regUser: RegisteredUser) =
|
||||
Sender.sendForceUserGraphqlReconnectionSysMsg(liveMeeting.props.meetingProp.intId, regUser.id, regUser.sessionToken, "user_joined", outGW)
|
||||
|
||||
}
|
||||
|
@ -31,7 +31,7 @@ trait UserLeaveReqMsgHdlr extends HandlerHelpers {
|
||||
ru <- RegisteredUsers.findWithUserId(msg.body.userId, liveMeeting.registeredUsers)
|
||||
} yield {
|
||||
RegisteredUsers.setUserLoggedOutFlag(liveMeeting.registeredUsers, ru)
|
||||
Sender.sendInvalidateUserGraphqlConnectionSysMsg(liveMeeting.props.meetingProp.intId, ru.id, ru.sessionToken, "user_loggedout", outGW)
|
||||
Sender.sendForceUserGraphqlReconnectionSysMsg(liveMeeting.props.meetingProp.intId, ru.id, ru.sessionToken, "user_loggedout", outGW)
|
||||
}
|
||||
}
|
||||
state
|
||||
|
@ -13,7 +13,7 @@ trait UserReactionTimeExpiredCmdMsgHdlr extends RightsManagementTrait {
|
||||
def handleUserReactionTimeExpiredCmdMsg(msg: UserReactionTimeExpiredCmdMsg) {
|
||||
val isNodeUser = msg.header.userId.equals("nodeJSapp")
|
||||
if (isNodeUser) {
|
||||
Users2x.setReactionEmoji(liveMeeting.users2x, msg.body.userId, "none")
|
||||
Users2x.setReactionEmoji(liveMeeting.users2x, msg.body.userId, "none", 0)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -88,7 +88,7 @@ object BreakoutRoomUserDAO {
|
||||
|
||||
def insertBreakoutRoom(userId: String, room: BreakoutRoom2x, liveMeeting: LiveMeeting) = {
|
||||
for {
|
||||
(redirectToHtml5JoinURL, redirectJoinURL) <- BreakoutHdlrHelpers.getRedirectUrls(liveMeeting, userId, liveMeeting.props.meetingProp.extId, room.sequence.toString)
|
||||
(redirectToHtml5JoinURL, redirectJoinURL) <- BreakoutHdlrHelpers.getRedirectUrls(liveMeeting, userId, room.externalId, room.sequence.toString)
|
||||
} yield {
|
||||
DatabaseConnection.db.run(BreakoutRoomUserDAO.prepareInsert(room.id, userId, redirectToHtml5JoinURL))
|
||||
.onComplete {
|
||||
|
@ -19,6 +19,7 @@ case class MeetingDbModel(
|
||||
presentationUploadExternalDescription: String,
|
||||
presentationUploadExternalUrl: String,
|
||||
learningDashboardAccessToken: String,
|
||||
logoutUrl: String,
|
||||
createdTime: Long,
|
||||
durationInSeconds: Int
|
||||
)
|
||||
@ -36,6 +37,7 @@ class MeetingDbTableDef(tag: Tag) extends Table[MeetingDbModel](tag, None, "meet
|
||||
presentationUploadExternalDescription,
|
||||
presentationUploadExternalUrl,
|
||||
learningDashboardAccessToken,
|
||||
logoutUrl,
|
||||
createdTime,
|
||||
durationInSeconds
|
||||
) <> (MeetingDbModel.tupled, MeetingDbModel.unapply)
|
||||
@ -50,6 +52,7 @@ class MeetingDbTableDef(tag: Tag) extends Table[MeetingDbModel](tag, None, "meet
|
||||
val presentationUploadExternalDescription = column[String]("presentationUploadExternalDescription")
|
||||
val presentationUploadExternalUrl = column[String]("presentationUploadExternalUrl")
|
||||
val learningDashboardAccessToken = column[String]("learningDashboardAccessToken")
|
||||
val logoutUrl = column[String]("logoutUrl")
|
||||
val createdTime = column[Long]("createdTime")
|
||||
val durationInSeconds = column[Int]("durationInSeconds")
|
||||
}
|
||||
@ -70,6 +73,7 @@ object MeetingDAO {
|
||||
presentationUploadExternalDescription = meetingProps.meetingProp.presentationUploadExternalDescription,
|
||||
presentationUploadExternalUrl = meetingProps.meetingProp.presentationUploadExternalUrl,
|
||||
learningDashboardAccessToken = meetingProps.password.learningDashboardAccessToken,
|
||||
logoutUrl = meetingProps.systemProps.logoutUrl,
|
||||
createdTime = meetingProps.durationProps.createdTime,
|
||||
durationInSeconds = meetingProps.durationProps.duration * 60
|
||||
)
|
||||
|
@ -23,13 +23,13 @@ class UserReactionDbTableDef(tag: Tag) extends Table[UserReactionDbModel](tag, "
|
||||
}
|
||||
|
||||
object UserReactionDAO {
|
||||
def insert(userId: String, reactionEmoji: String) = {
|
||||
def insert(userId: String, reactionEmoji: String, durationInSeconds: Int) = {
|
||||
DatabaseConnection.db.run(
|
||||
TableQuery[UserReactionDbTableDef].forceInsert(
|
||||
UserReactionDbModel(
|
||||
userId = userId,
|
||||
reactionEmoji = reactionEmoji,
|
||||
durationInSeconds = 60,
|
||||
durationInSeconds = durationInSeconds,
|
||||
createdAt = new java.sql.Timestamp(System.currentTimeMillis())
|
||||
)
|
||||
)
|
||||
|
@ -195,7 +195,7 @@ object Users2x {
|
||||
newUser
|
||||
}
|
||||
}
|
||||
def setReactionEmoji(users: Users2x, intId: String, reactionEmoji: String): Option[UserState] = {
|
||||
def setReactionEmoji(users: Users2x, intId: String, reactionEmoji: String, durationInSeconds: Int): Option[UserState] = {
|
||||
for {
|
||||
u <- findWithIntId(users, intId)
|
||||
} yield {
|
||||
@ -203,7 +203,7 @@ object Users2x {
|
||||
.modify(_.reactionChangedOn).setTo(System.currentTimeMillis())
|
||||
|
||||
users.save(newUser)
|
||||
UserReactionDAO.insert(intId, reactionEmoji)
|
||||
UserReactionDAO.insert(intId, reactionEmoji, durationInSeconds)
|
||||
newUser
|
||||
}
|
||||
}
|
||||
|
@ -450,8 +450,8 @@ class ReceivedJsonMsgHandlerActor(
|
||||
routeGenericMsg[TimerEndedPubMsg](envelope, jsonNode)
|
||||
|
||||
// Messages from Graphql Middleware
|
||||
case UserGraphqlConnectionStablishedSysMsg.NAME =>
|
||||
route[UserGraphqlConnectionStablishedSysMsg](meetingManagerChannel, envelope, jsonNode)
|
||||
case UserGraphqlConnectionEstablishedSysMsg.NAME =>
|
||||
route[UserGraphqlConnectionEstablishedSysMsg](meetingManagerChannel, envelope, jsonNode)
|
||||
|
||||
case UserGraphqlConnectionClosedSysMsg.NAME =>
|
||||
route[UserGraphqlConnectionClosedSysMsg](meetingManagerChannel, envelope, jsonNode)
|
||||
|
@ -1005,7 +1005,7 @@ class MeetingActor(
|
||||
for {
|
||||
regUser <- RegisteredUsers.findWithUserId(u.intId, liveMeeting.registeredUsers)
|
||||
} yield {
|
||||
Sender.sendInvalidateUserGraphqlConnectionSysMsg(liveMeeting.props.meetingProp.intId, regUser.id, regUser.sessionToken, EjectReasonCode.USER_INACTIVITY, outGW)
|
||||
Sender.sendForceUserGraphqlReconnectionSysMsg(liveMeeting.props.meetingProp.intId, regUser.id, regUser.sessionToken, EjectReasonCode.USER_INACTIVITY, outGW)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -246,12 +246,12 @@ object MsgBuilder {
|
||||
BbbCommonEnvCoreMsg(envelope, event)
|
||||
}
|
||||
|
||||
def buildInvalidateUserGraphqlConnectionSysMsg(meetingId: String, userId: String, sessionToken: String, reason: String): BbbCommonEnvCoreMsg = {
|
||||
def buildForceUserGraphqlReconnectionSysMsg(meetingId: String, userId: String, sessionToken: String, reason: String): BbbCommonEnvCoreMsg = {
|
||||
val routing = Routing.addMsgToClientRouting(MessageTypes.SYSTEM, meetingId, userId)
|
||||
val envelope = BbbCoreEnvelope(InvalidateUserGraphqlConnectionSysMsg.NAME, routing)
|
||||
val header = BbbCoreHeaderWithMeetingId(InvalidateUserGraphqlConnectionSysMsg.NAME, meetingId)
|
||||
val body = InvalidateUserGraphqlConnectionSysMsgBody(meetingId, userId, sessionToken, reason)
|
||||
val event = InvalidateUserGraphqlConnectionSysMsg(header, body)
|
||||
val envelope = BbbCoreEnvelope(ForceUserGraphqlReconnectionSysMsg.NAME, routing)
|
||||
val header = BbbCoreHeaderWithMeetingId(ForceUserGraphqlReconnectionSysMsg.NAME, meetingId)
|
||||
val body = ForceUserGraphqlReconnectionSysMsgBody(meetingId, userId, sessionToken, reason)
|
||||
val event = ForceUserGraphqlReconnectionSysMsg(header, body)
|
||||
|
||||
BbbCommonEnvCoreMsg(envelope, event)
|
||||
}
|
||||
|
@ -10,9 +10,9 @@ object Sender {
|
||||
outGW.send(ejectFromMeetingSystemEvent)
|
||||
}
|
||||
|
||||
def sendInvalidateUserGraphqlConnectionSysMsg(meetingId: String, userId: String, sessionToken: String, reason: String, outGW: OutMsgRouter): Unit = {
|
||||
val invalidateUserGraphqlConnectionSysMsg = MsgBuilder.buildInvalidateUserGraphqlConnectionSysMsg(meetingId, userId, sessionToken, reason)
|
||||
outGW.send(invalidateUserGraphqlConnectionSysMsg)
|
||||
def sendForceUserGraphqlReconnectionSysMsg(meetingId: String, userId: String, sessionToken: String, reason: String, outGW: OutMsgRouter): Unit = {
|
||||
val ForceUserGraphqlReconnectionSysMsg = MsgBuilder.buildForceUserGraphqlReconnectionSysMsg(meetingId, userId, sessionToken, reason)
|
||||
outGW.send(ForceUserGraphqlReconnectionSysMsg)
|
||||
}
|
||||
|
||||
def sendUserInactivityInspectMsg(meetingId: String, userId: String, responseDelay: Long, outGW: OutMsgRouter): Unit = {
|
||||
|
@ -26,13 +26,13 @@ class GraphqlActionsActor(
|
||||
private def handleBbbCommonEnvCoreMsg(msg: BbbCommonEnvCoreMsg): Unit = {
|
||||
msg.core match {
|
||||
// Messages from bbb-graphql-middleware
|
||||
case m: UserGraphqlConnectionStablishedSysMsg => handleUserGraphqlConnectionStablishedSysMsg(m)
|
||||
case m: UserGraphqlConnectionEstablishedSysMsg => handleUserGraphqlConnectionEstablishedSysMsg(m)
|
||||
case m: UserGraphqlConnectionClosedSysMsg => handleUserGraphqlConnectionClosedSysMsg(m)
|
||||
case _ => // message not to be handled.
|
||||
}
|
||||
}
|
||||
|
||||
private def handleUserGraphqlConnectionStablishedSysMsg(msg: UserGraphqlConnectionStablishedSysMsg) {
|
||||
private def handleUserGraphqlConnectionEstablishedSysMsg(msg: UserGraphqlConnectionEstablishedSysMsg) {
|
||||
UserGraphqlConnectionDAO.insert(msg.body.sessionToken, msg.body.browserConnectionId)
|
||||
}
|
||||
|
||||
|
@ -68,7 +68,8 @@ case class LockSettingsProps(
|
||||
)
|
||||
|
||||
case class SystemProps(
|
||||
html5InstanceId: Int
|
||||
html5InstanceId: Int,
|
||||
logoutUrl: String,
|
||||
)
|
||||
|
||||
case class GroupProps(
|
||||
|
@ -235,30 +235,30 @@ case class DeletedRecordingSysMsgBody(recordId: String)
|
||||
/**
|
||||
* Sent from akka-apps to graphql-middleware
|
||||
*/
|
||||
object InvalidateUserGraphqlConnectionSysMsg { val NAME = "InvalidateUserGraphqlConnectionSysMsg" }
|
||||
case class InvalidateUserGraphqlConnectionSysMsg(
|
||||
object ForceUserGraphqlReconnectionSysMsg { val NAME = "ForceUserGraphqlReconnectionSysMsg" }
|
||||
case class ForceUserGraphqlReconnectionSysMsg(
|
||||
header: BbbCoreHeaderWithMeetingId,
|
||||
body: InvalidateUserGraphqlConnectionSysMsgBody
|
||||
body: ForceUserGraphqlReconnectionSysMsgBody
|
||||
) extends BbbCoreMsg
|
||||
case class InvalidateUserGraphqlConnectionSysMsgBody(meetingId: String, userId: String, sessionToken: String, reason: String)
|
||||
case class ForceUserGraphqlReconnectionSysMsgBody(meetingId: String, userId: String, sessionToken: String, reason: String)
|
||||
|
||||
/**
|
||||
* Sent from graphql-middleware to akka-apps
|
||||
*/
|
||||
|
||||
object UserGraphqlConnectionInvalidatedEvtMsg { val NAME = "UserGraphqlConnectionInvalidatedEvtMsg" }
|
||||
case class UserGraphqlConnectionInvalidatedEvtMsg(
|
||||
object UserGraphqlReconnectionForcedEvtMsg { val NAME = "UserGraphqlReconnectionForcedEvtMsg" }
|
||||
case class UserGraphqlReconnectionForcedEvtMsg(
|
||||
header: BbbCoreBaseHeader,
|
||||
body: UserGraphqlConnectionInvalidatedEvtMsgBody
|
||||
body: UserGraphqlReconnectionForcedEvtMsgBody
|
||||
) extends BbbCoreMsg
|
||||
case class UserGraphqlConnectionInvalidatedEvtMsgBody(sessionToken: String, browserConnectionId: String)
|
||||
case class UserGraphqlReconnectionForcedEvtMsgBody(sessionToken: String, browserConnectionId: String)
|
||||
|
||||
object UserGraphqlConnectionStablishedSysMsg { val NAME = "UserGraphqlConnectionStablishedSysMsg" }
|
||||
case class UserGraphqlConnectionStablishedSysMsg(
|
||||
object UserGraphqlConnectionEstablishedSysMsg { val NAME = "UserGraphqlConnectionEstablishedSysMsg" }
|
||||
case class UserGraphqlConnectionEstablishedSysMsg(
|
||||
header: BbbCoreBaseHeader,
|
||||
body: UserGraphqlConnectionStablishedSysMsgBody
|
||||
body: UserGraphqlConnectionEstablishedSysMsgBody
|
||||
) extends BbbCoreMsg
|
||||
case class UserGraphqlConnectionStablishedSysMsgBody(sessionToken: String, browserConnectionId: String)
|
||||
case class UserGraphqlConnectionEstablishedSysMsgBody(sessionToken: String, browserConnectionId: String)
|
||||
|
||||
object UserGraphqlConnectionClosedSysMsg { val NAME = "UserGraphqlConnectionClosedSysMsg" }
|
||||
case class UserGraphqlConnectionClosedSysMsg(
|
||||
|
@ -411,7 +411,7 @@ public class MeetingService implements MessageListener {
|
||||
m.getUserInactivityInspectTimerInMinutes(), m.getUserInactivityThresholdInMinutes(),
|
||||
m.getUserActivitySignResponseDelayInMinutes(), m.getEndWhenNoModerator(), m.getEndWhenNoModeratorDelayInMinutes(),
|
||||
m.getMuteOnStart(), m.getAllowModsToUnmuteUsers(), m.getAllowModsToEjectCameras(), m.getMeetingKeepEvents(),
|
||||
m.breakoutRoomsParams, m.lockSettingsParams, m.getHtml5InstanceId(),
|
||||
m.breakoutRoomsParams, m.lockSettingsParams, m.getHtml5InstanceId(), m.getLogoutUrl(),
|
||||
m.getGroups(), m.getDisabledFeatures(), m.getNotifyRecordingIsOn(),
|
||||
m.getPresentationUploadExternalDescription(), m.getPresentationUploadExternalUrl(),
|
||||
m.getOverrideClientSettings());
|
||||
|
@ -42,6 +42,7 @@ public interface IBbbWebApiGWApp {
|
||||
BreakoutRoomsParams breakoutParams,
|
||||
LockSettingsParams lockSettingsParams,
|
||||
Integer html5InstanceId,
|
||||
String logoutUrl,
|
||||
ArrayList<Group> groups,
|
||||
ArrayList<String> disabledFeatures,
|
||||
Boolean notifyRecordingIsOn,
|
||||
|
@ -149,6 +149,7 @@ class BbbWebApiGWApp(
|
||||
breakoutParams: BreakoutRoomsParams,
|
||||
lockSettingsParams: LockSettingsParams,
|
||||
html5InstanceId: java.lang.Integer,
|
||||
logoutUrl: String,
|
||||
groups: java.util.ArrayList[Group],
|
||||
disabledFeatures: java.util.ArrayList[String],
|
||||
notifyRecordingIsOn: java.lang.Boolean,
|
||||
@ -230,7 +231,8 @@ class BbbWebApiGWApp(
|
||||
)
|
||||
|
||||
val systemProps = SystemProps(
|
||||
html5InstanceId
|
||||
html5InstanceId,
|
||||
logoutUrl
|
||||
)
|
||||
|
||||
val groupsAsVector: Vector[GroupProps] = groups.asScala.toVector.map(g => GroupProps(g.getGroupId(), g.getName(), g.getUsersExtId().asScala.toVector))
|
||||
|
@ -1,24 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
cd "$(dirname "$0")"
|
||||
|
||||
for var in "$@"
|
||||
do
|
||||
if [[ $var == --reset ]] ; then
|
||||
echo "Performing a full reset..."
|
||||
rm -rf node_modules
|
||||
fi
|
||||
done
|
||||
|
||||
if [ ! -d ./node_modules ] ; then
|
||||
npm ci --no-progress
|
||||
fi
|
||||
|
||||
npm run build
|
||||
|
||||
mv -f dist/index.js dist/bbb-graphql-actions-adapter-server.js
|
||||
sudo cp -rf dist/* /usr/local/bigbluebutton/bbb-graphql-actions-adapter-server/
|
||||
sudo systemctl restart bbb-graphql-actions-adapter-server
|
||||
echo ''
|
||||
echo ''
|
||||
echo '----------------'
|
||||
echo 'bbb-graphql-actions-adapter-server updated'
|
32
bbb-graphql-actions/deploy.sh
Executable file
32
bbb-graphql-actions/deploy.sh
Executable file
@ -0,0 +1,32 @@
|
||||
#!/usr/bin/env bash
|
||||
cd "$(dirname "$0")"
|
||||
|
||||
for var in "$@"
|
||||
do
|
||||
if [[ $var == --reset ]] ; then
|
||||
echo "Performing a full reset..."
|
||||
rm -rf node_modules
|
||||
fi
|
||||
done
|
||||
|
||||
if [ ! -d ./node_modules ] ; then
|
||||
npm ci --no-progress
|
||||
fi
|
||||
|
||||
npm run build
|
||||
|
||||
# handle renaming circa dec 2023
|
||||
if [[ -d /usr/local/bigbluebutton/bbb-graphql-actions-adapter-server ]] ; then
|
||||
sudo systemctl stop bbb-graphql-actions-adapter-server
|
||||
sudo rm -f /usr/lib/systemd/system/bbb-graphql-actions-adapter-server.service
|
||||
sudo systemctl daemon-reload
|
||||
sudo rm -rf /usr/local/bigbluebutton/bbb-graphql-actions-adapter-server
|
||||
fi
|
||||
|
||||
mv -f dist/index.js dist/bbb-graphql-actions.js
|
||||
sudo cp -rf dist/* /usr/local/bigbluebutton/bbb-graphql-actions
|
||||
sudo systemctl restart bbb-graphql-actions
|
||||
echo ''
|
||||
echo ''
|
||||
echo '----------------'
|
||||
echo 'bbb-graphql-actions updated'
|
@ -1,11 +1,11 @@
|
||||
{
|
||||
"name": "bbb-graphql-actions-adapter-server",
|
||||
"name": "bbb-graphql-actions",
|
||||
"version": "0.0.1",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "bbb-graphql-actions-adapter-server",
|
||||
"name": "bbb-graphql-actions",
|
||||
"version": "0.0.1",
|
||||
"license": "LGPL-3.0",
|
||||
"dependencies": {
|
@ -1,5 +1,5 @@
|
||||
{
|
||||
"name": "bbb-graphql-actions-adapter-server",
|
||||
"name": "bbb-graphql-actions",
|
||||
"version": "0.0.1",
|
||||
"description": "A server component designed to interface between Hasura GraphQL actions and BigBlueButton ecosystem.",
|
||||
"main": "index.ts",
|
||||
@ -10,7 +10,7 @@
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/bigbluebutton/bigbluebutton/tree/develop/bbb-graphql-actions-adapter-server"
|
||||
"url": "git+https://github.com/bigbluebutton/bigbluebutton/tree/develop/bbb-graphql-actions"
|
||||
},
|
||||
"keywords": [
|
||||
"bigbluebutton",
|
||||
@ -22,7 +22,7 @@
|
||||
"bugs": {
|
||||
"url": "https://github.com/bigbluebutton/bigbluebutton/issues"
|
||||
},
|
||||
"homepage": "https://github.com/bigbluebutton/bigbluebutton/tree/develop/bbb-graphql-actions-adapter-server#readme",
|
||||
"homepage": "https://github.com/bigbluebutton/bigbluebutton/tree/develop/bbb-graphql-actions#readme",
|
||||
"dependencies": {
|
||||
"@types/express": "^4.17.18",
|
||||
"@types/node": "^20.7.0",
|
@ -13,5 +13,5 @@ if [ ! -d ./node_modules ] ; then
|
||||
npm install
|
||||
fi
|
||||
|
||||
sudo systemctl stop bbb-graphql-actions-adapter-server
|
||||
sudo systemctl stop bbb-graphql-actions
|
||||
npm start
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user