Merge pull request #653 from gthacoder/meteor-client-whiteboard-slowdown

HTML5 client: merging the whiteboard optimizations.
This commit is contained in:
Chad Pilkey 2015-06-09 15:37:13 -04:00
commit 101e44c8fe
8 changed files with 49 additions and 29 deletions

View File

@ -351,6 +351,7 @@ Handlebars.registerHelper 'whiteboardSize', (section) ->
else
setInSession 'display_usersList', false
setInSession 'display_menu', false
TimeSync.loggingEnabled = false # suppresses the log messages from timesync
@onLoadComplete = ->
document.title = "BigBlueButton #{BBB.getMeetingName() ? 'HTML5'}"

View File

@ -29,6 +29,9 @@ Template.slide.rendered = ->
wpm.scale(adjustedDimensions.width, adjustedDimensions.height)
@manuallyDisplayShapes = ->
return if Meteor.WhiteboardCleanStatus.findOne({in_progress: true})?
currentSlide = getCurrentSlideDoc()
wpm = @whiteboardPaperModel
shapes = Meteor.Shapes.find({whiteboardId: currentSlide?.slide?.id}).fetch()

View File

@ -4,3 +4,5 @@ Meteor.Meetings = new Meteor.Collection("meetings")
Meteor.Presentations = new Meteor.Collection("presentations")
Meteor.Shapes = new Meteor.Collection("shapes")
Meteor.Slides = new Meteor.Collection("slides")
Meteor.WhiteboardCleanStatus = new Meteor.Collection("whiteboard-clean-status")

View File

@ -55,29 +55,30 @@
Meteor.subscribe 'meetings', meetingId, onReady: =>
Meteor.subscribe 'presentations', meetingId, onReady: =>
Meteor.subscribe 'users', meetingId, userId, authToken, onError: onErrorFunction, onReady: =>
# done subscribing
onLoadComplete()
Meteor.subscribe 'whiteboard-clean-status', meetingId, onReady: =>
# done subscribing
onLoadComplete()
handleLogourUrlError = () ->
alert "Error: could not find the logoutURL"
setInSession("logoutURL", document.location.hostname)
return
# obtain the logoutURL
a = $.ajax({dataType: 'json', url: '/bigbluebutton/api/enter'})
a.done (data) ->
if data.response.logoutURL? # for a meeting with 0 users
setInSession("logoutURL", data.response.logoutURL)
handleLogourUrlError = () ->
alert "Error: could not find the logoutURL"
setInSession("logoutURL", document.location.hostname)
return
else
if data.response.logoutUrl? # for a running meeting
setInSession("logoutURL", data.response.logoutUrl)
# obtain the logoutURL
a = $.ajax({dataType: 'json', url: '/bigbluebutton/api/enter'})
a.done (data) ->
if data.response.logoutURL? # for a meeting with 0 users
setInSession("logoutURL", data.response.logoutURL)
return
else
handleLogourUrlError()
if data.response.logoutUrl? # for a running meeting
setInSession("logoutURL", data.response.logoutUrl)
return
else
handleLogourUrlError()
a.fail (data, textStatus, errorThrown) ->
handleLogourUrlError()
a.fail (data, textStatus, errorThrown) ->
handleLogourUrlError()
@render('main')

View File

@ -67,15 +67,13 @@
@removeAllShapesFromSlide = (meetingId, whiteboardId) ->
Meteor.log.info "removeAllShapesFromSlide__" + whiteboardId
if meetingId? and whiteboardId? and Meteor.Shapes.find({meetingId: meetingId, whiteboardId: whiteboardId})?
shapesOnSlide = Meteor.Shapes.find({meetingId: meetingId, whiteboardId: whiteboardId}).fetch()
Meteor.log.info "number of shapes:" + shapesOnSlide.length
for s in shapesOnSlide
Meteor.log.info "shape=" + s.shape.id
id = Meteor.Shapes.findOne({meetingId: meetingId, whiteboardId: whiteboardId, "shape.id": s.shape.id})
if id?
Meteor.Shapes.remove(id._id)
Meteor.log.info "----removed shape[" + s.shape.id + "] from " + whiteboardId
Meteor.log.info "remaining shapes on the slide:" + Meteor.Shapes.find({meetingId: meetingId, whiteboardId: whiteboardId}).fetch().length
Meteor.Shapes.remove {meetingId: meetingId, whiteboardId: whiteboardId}, ->
Meteor.log.info "clearing all shapes from slide"
# After shapes are cleared, wait 1 second and set cleaning off
Meteor.setTimeout ->
Meteor.WhiteboardCleanStatus.update({meetingId: meetingId}, {$set: {in_progress: false}})
, 1000
@removeShapeFromSlide = (meetingId, whiteboardId, shapeId) ->
shapeToRemove = Meteor.Shapes.findOne({meetingId: meetingId, whiteboardId: whiteboardId, "shape.id": shapeId})
@ -88,9 +86,13 @@
# called on server start and meeting end
@clearShapesCollection = (meetingId) ->
if meetingId?
Meteor.Shapes.remove({meetingId: meetingId}, Meteor.log.info "cleared Shapes Collection (meetingId: #{meetingId}!")
Meteor.Shapes.remove {}, ->
Meteor.log.info "cleared Shapes Collection (meetingId: #{meetingId}!"
Meteor.WhiteboardCleanStatus.update({meetingId: meetingId}, {$set: {in_progress: false}})
else
Meteor.Shapes.remove({}, Meteor.log.info "cleared Shapes Collection (all meetings)!")
Meteor.Shapes.remove {}, ->
Meteor.log.info "cleared Shapes Collection (all meetings)!"
Meteor.WhiteboardCleanStatus.update({meetingId: meetingId}, {$set: {in_progress: false}})
# --------------------------------------------------------------------------------------------
# end Private methods on server

View File

@ -70,3 +70,7 @@ Meteor.publish 'meetings', (meetingId) ->
Meteor.publish 'presentations', (meetingId) ->
Meteor.log.info "publishing presentations for #{meetingId}"
Meteor.Presentations.find({meetingId: meetingId})
Meteor.publish 'whiteboard-clean-status', (meetingId) ->
Meteor.log.info "whiteboard clean status #{meetingId}"
Meteor.WhiteboardCleanStatus.find({meetingId: meetingId})

View File

@ -219,6 +219,11 @@ class Meteor.RedisPubSub
return
if message.header.name is "get_whiteboard_shapes_reply" and message.payload.requester_id is "nodeJSapp"
# Create a whiteboard clean status or find one for the current meeting
if not Meteor.WhiteboardCleanStatus.findOne({meetingId: meetingId})?
Meteor.WhiteboardCleanStatus.insert({meetingId: meetingId, in_progress: false})
for shape in message.payload.shapes
whiteboardId = shape.wb_id
addShapeToCollection meetingId, whiteboardId, shape
@ -238,6 +243,7 @@ class Meteor.RedisPubSub
if message.header.name is "whiteboard_cleared_message"
whiteboardId = message.payload.whiteboard_id
Meteor.WhiteboardCleanStatus.update({meetingId: meetingId}, {$set: {'in_progress': true}})
removeAllShapesFromSlide meetingId, whiteboardId
return

View File

@ -2,6 +2,7 @@ Meteor.startup ->
Meteor.log.info "server start"
#remove all data
Meteor.WhiteboardCleanStatus.remove({})
clearUsersCollection()
clearChatCollection()
clearMeetingsCollection()