Merge branch 'v2.0.x-release' into custom-parameters
This commit is contained in:
commit
5dc3fe82c2
@ -175,8 +175,11 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
}
|
||||
|
||||
private function cannotUseWebRTC(message:String):void {
|
||||
LOGGER.debug("Cannot use WebRTC Screensharing: " + message);
|
||||
|
||||
var logData:Object = UsersUtil.initLogData();
|
||||
logData.tags = ["webrtc-screenshare"];
|
||||
logData.logCode = "cannot-use-webrtc-screenshare";
|
||||
logData.reason = message;
|
||||
LOGGER.info(JSON.stringify(logData));
|
||||
displayFail(message);
|
||||
};
|
||||
|
||||
@ -192,7 +195,11 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
attempt to share
|
||||
*/
|
||||
private function webRTCWorksAndConfigured(message:String):void {
|
||||
LOGGER.debug("WebRTC Screenshare works, start sharing: " + message);
|
||||
var logData:Object = UsersUtil.initLogData();
|
||||
logData.tags = ["webrtc-screenshare"];
|
||||
logData.logCode = "webrtc-works-and-configured";
|
||||
logData.reason = message;
|
||||
LOGGER.info(JSON.stringify(logData));
|
||||
startWebRTCPublish();
|
||||
}
|
||||
|
||||
@ -202,12 +209,17 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
if (ExternalInterface.available) {
|
||||
var videoTag:String = "localWebRTCVideo";
|
||||
var onFail:Function = function(args:Object):void {
|
||||
LOGGER.debug("startWebRTCDeskshare - failed to publish WebRTC deskshare. " + ObjectUtil.toString(args));
|
||||
var logData:Object = UsersUtil.initLogData();
|
||||
logData.tags = ["webrtc-screenshare"];
|
||||
logData.logCode = "webrtc-failed-to-publish";
|
||||
|
||||
if (args is String) {
|
||||
logData.reason = args as String;
|
||||
displayFail(args as String);
|
||||
} else {
|
||||
displayFail();
|
||||
}
|
||||
LOGGER.info(JSON.stringify(logData));
|
||||
};
|
||||
ExternalInterface.addCallback("onFail", onFail);
|
||||
|
||||
@ -276,10 +288,12 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
var myArray :Array = rtmp.split('/');
|
||||
var meetingUrl:String = rtmp.substring(0, rtmp.lastIndexOf('/'));
|
||||
stream = rtmp.substring(rtmp.lastIndexOf('/')+1, rtmp.length);
|
||||
LOGGER.debug("WebRTCDesktopPublishWindow::startVideo meetingurl=[{0}] and stream=[{1}]",[meetingUrl, stream]);
|
||||
|
||||
JSLog.warn("WebRTCDesktopPublishWindow::startVideo meetingurl= ",meetingUrl);
|
||||
JSLog.warn("WebRTCDesktopPublishWindow::startVideo stream=", stream);
|
||||
var logData:Object = UsersUtil.initLogData();
|
||||
logData.tags = ["webrtc-screenshare"];
|
||||
logData.logCode = "webrtc-screenshare-start-playing-preview";
|
||||
logData.stream = stream;
|
||||
LOGGER.info(JSON.stringify(logData));
|
||||
|
||||
connection = new NetConnection();
|
||||
|
||||
|
@ -24,9 +24,6 @@ package org.bigbluebutton.modules.users.services
|
||||
|
||||
import org.as3commons.logging.api.ILogger;
|
||||
import org.as3commons.logging.api.getClassLogger;
|
||||
import org.bigbluebutton.common.toaster.Toaster;
|
||||
import org.bigbluebutton.common.toaster.message.ToastIcon;
|
||||
import org.bigbluebutton.common.toaster.message.ToastType;
|
||||
import org.bigbluebutton.core.BBB;
|
||||
import org.bigbluebutton.core.EventConstants;
|
||||
import org.bigbluebutton.core.TimerUtil;
|
||||
@ -470,6 +467,12 @@ package org.bigbluebutton.modules.users.services
|
||||
var vidWidth: Number = body.vidWidth as Number;
|
||||
var vidHeight: Number = body.vidHeight as Number;
|
||||
|
||||
var logData:Object = UsersUtil.initLogData();
|
||||
logData.tags = ["webrtc-screenshare"];
|
||||
logData.logCode = "screenshare-rtmp-broadcast-started";
|
||||
logData.stream = stream;
|
||||
LOGGER.info(JSON.stringify(logData));
|
||||
|
||||
var event:WebRTCViewStreamEvent = new WebRTCViewStreamEvent(WebRTCViewStreamEvent.START);
|
||||
|
||||
event.videoWidth = vidWidth;
|
||||
@ -485,6 +488,12 @@ package org.bigbluebutton.modules.users.services
|
||||
var vidWidth: Number = body.vidWidth as Number;
|
||||
var vidHeight: Number = body.vidHeight as Number;
|
||||
|
||||
var logData:Object = UsersUtil.initLogData();
|
||||
logData.tags = ["webrtc-screenshare"];
|
||||
logData.logCode = "screenshare-rtmp-broadcast-stopped";
|
||||
logData.stream = stream;
|
||||
LOGGER.info(JSON.stringify(logData));
|
||||
|
||||
var event:WebRTCViewStreamEvent = new WebRTCViewStreamEvent(WebRTCViewStreamEvent.STOP);
|
||||
|
||||
event.videoWidth = vidWidth;
|
||||
|
@ -145,7 +145,12 @@ package org.bigbluebutton.modules.whiteboard
|
||||
textUpdateListener.canvasMouseDown();
|
||||
|
||||
//LogUtil.debug("**** CanvasDisplay changePage. Clearing page *****");
|
||||
clearBoard();
|
||||
|
||||
// forcefully clear all annotations and cursors on whiteboard change
|
||||
_annotationsMap = new Object();
|
||||
wbCanvas.removeAllGraphics();
|
||||
|
||||
clearCursors();
|
||||
|
||||
var annotations:Array = whiteboardModel.getAnnotations(wbId);
|
||||
//LogUtil.debug("**** CanvasDisplay changePage [" + annotations.length + "] *****");
|
||||
@ -154,6 +159,11 @@ package org.bigbluebutton.modules.whiteboard
|
||||
}
|
||||
}
|
||||
|
||||
public function clearCursors():void {
|
||||
_cursors = new Object();
|
||||
wbCanvas.removeAllCursorChildren();
|
||||
}
|
||||
|
||||
public function drawCursor(userId:String, xPercent:Number, yPercent:Number):void {
|
||||
var showName: Boolean = LiveMeeting.inst().whiteboardModel.multiUser;
|
||||
|
||||
|
@ -27,9 +27,12 @@ package org.bigbluebutton.modules.whiteboard.views {
|
||||
import flash.geom.Point;
|
||||
|
||||
import mx.containers.Canvas;
|
||||
import mx.core.IChildList;
|
||||
import mx.managers.CursorManager;
|
||||
|
||||
import org.bigbluebutton.core.UsersUtil;
|
||||
import org.bigbluebutton.core.model.LiveMeeting;
|
||||
import org.bigbluebutton.core.model.users.User2x;
|
||||
import org.bigbluebutton.main.events.SwitchedPresenterEvent;
|
||||
import org.bigbluebutton.main.events.UserLeftEvent;
|
||||
import org.bigbluebutton.modules.whiteboard.WhiteboardCanvasDisplayModel;
|
||||
@ -268,6 +271,13 @@ package org.bigbluebutton.modules.whiteboard.views {
|
||||
else trace("Does not contain");
|
||||
}
|
||||
|
||||
public function removeAllGraphics():void {
|
||||
var children:IChildList = this.graphicObjectHolder.rawChildren;
|
||||
while (children.numChildren != 0) {
|
||||
children.removeChildAt(children.numChildren - 1);
|
||||
}
|
||||
}
|
||||
|
||||
public function addGraphic(child:DisplayObject):void {
|
||||
this.graphicObjectHolder.rawChildren.addChild(child);
|
||||
}
|
||||
@ -284,6 +294,13 @@ package org.bigbluebutton.modules.whiteboard.views {
|
||||
if (doesContainCursor(cursor)) this.cursorObjectHolder.rawChildren.removeChild(cursor);
|
||||
}
|
||||
|
||||
public function removeAllCursorChildren():void {
|
||||
var children:IChildList = this.cursorObjectHolder.rawChildren;
|
||||
while (children.numChildren != 0) {
|
||||
children.removeChildAt(children.numChildren - 1);
|
||||
}
|
||||
}
|
||||
|
||||
public function textToolbarSyncProxy(tobj:TextObject):void {
|
||||
textToolbar.syncPropsWith(tobj);
|
||||
}
|
||||
@ -341,11 +358,20 @@ package org.bigbluebutton.modules.whiteboard.views {
|
||||
//if (e.whiteboardId == currentWhiteboardId) {
|
||||
whiteboardToolbar.whiteboardAccessModified(e.multiUser);
|
||||
canvasModel.multiUserChange(e.multiUser);
|
||||
|
||||
if (!e.multiUser) {
|
||||
canvasDisplayModel.clearCursors();
|
||||
}
|
||||
//}
|
||||
}
|
||||
|
||||
private function onReceivedCursorPosition(e:WhiteboardCursorEvent):void {
|
||||
canvasDisplayModel.drawCursor(e.userId, e.xPercent, e.yPercent);
|
||||
var user:User2x = UsersUtil.getUser(e.userId);
|
||||
|
||||
// only draw the cursor if the user exists and it's in multiuser mode or they are the presenter
|
||||
if (user && (LiveMeeting.inst().whiteboardModel.multiUser || user.presenter)) {
|
||||
canvasDisplayModel.drawCursor(e.userId, e.xPercent, e.yPercent);
|
||||
}
|
||||
}
|
||||
|
||||
private function onEnableWhiteboardEvent(e:WhiteboardButtonEvent):void {
|
||||
@ -360,7 +386,7 @@ package org.bigbluebutton.modules.whiteboard.views {
|
||||
|
||||
stopDrawing();
|
||||
|
||||
removeCursor()
|
||||
removeCursor();
|
||||
|
||||
this.whiteboardEnabled = false;
|
||||
setWhiteboardInteractable();
|
||||
|
@ -60,6 +60,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
import org.bigbluebutton.modules.whiteboard.events.StopWhiteboardModuleEvent;
|
||||
import org.bigbluebutton.modules.whiteboard.events.WhiteboardAccessEvent;
|
||||
import org.bigbluebutton.modules.whiteboard.events.WhiteboardButtonEvent;
|
||||
import org.bigbluebutton.modules.whiteboard.models.AnnotationType;
|
||||
import org.bigbluebutton.modules.whiteboard.views.models.WhiteboardOptions;
|
||||
import org.bigbluebutton.util.i18n.ResourceUtil;
|
||||
|
||||
@ -96,9 +97,13 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
changeThickness();
|
||||
changeColor();
|
||||
}
|
||||
|
||||
penOnlyMultiUser();
|
||||
}
|
||||
|
||||
public function setCanvas(c:WhiteboardCanvas):void {
|
||||
wbOptions = Options.getOptions(WhiteboardOptions) as WhiteboardOptions;
|
||||
|
||||
canvas = c;
|
||||
|
||||
if (cpik) {
|
||||
@ -199,7 +204,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
}
|
||||
|
||||
public function positionToolbar(container:MDIWindow):void {
|
||||
wbOptions = Options.getOptions(WhiteboardOptions) as WhiteboardOptions;
|
||||
LOGGER.debug("Positioning whiteboard toolbar");
|
||||
containerToOverlay = container;
|
||||
containerToOverlay.addEventListener(MoveEvent.MOVE, setPositionAndDepth);
|
||||
@ -229,10 +233,12 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
} else {
|
||||
hideToolbar();
|
||||
}
|
||||
if (multiUser && wbOptions.onlyPenMUW) {
|
||||
scribbleBtn.dispatchEvent(new MouseEvent(MouseEvent.CLICK));
|
||||
} else if (!multiUser) {
|
||||
penOnlyMultiUser();
|
||||
}
|
||||
|
||||
private function penOnlyMultiUser() : void {
|
||||
if (multiUser && wbOptions.onlyPenMUW && !isPresenter) {
|
||||
setToolType(WhiteboardConstants.TYPE_SHAPE, AnnotationType.PENCIL);
|
||||
}
|
||||
}
|
||||
|
||||
|
13
bigbluebutton-html5/client/main.jsx
Normal file → Executable file
13
bigbluebutton-html5/client/main.jsx
Normal file → Executable file
@ -2,15 +2,18 @@
|
||||
import React from 'react';
|
||||
import { Meteor } from 'meteor/meteor';
|
||||
import { render } from 'react-dom';
|
||||
import { log } from '/imports/ui/services/api';
|
||||
import renderRoutes from '/imports/startup/client/routes';
|
||||
import logger from '/imports/startup/client/logger';
|
||||
|
||||
Meteor.startup(() => {
|
||||
render(renderRoutes(), document.getElementById('app'));
|
||||
|
||||
// Log all uncaught exceptions to the server
|
||||
// TODO: There is no StackTrace on the ErrorEvent object
|
||||
// Logs all uncaught exceptions to the client logger
|
||||
window.addEventListener('error', (e) => {
|
||||
log('error', e);
|
||||
const stack = e.error.stack;
|
||||
let message = e.error.toString();
|
||||
|
||||
// Checks if stack includes the message, if not add the two together.
|
||||
(stack.includes(message)) ? message = stack : message += `\n${stack}`;
|
||||
logger.error(message);
|
||||
});
|
||||
});
|
||||
|
@ -2,8 +2,10 @@ import _ from 'lodash';
|
||||
import VoiceUsers from '/imports/api/voice-users';
|
||||
import { Tracker } from 'meteor/tracker';
|
||||
import BaseAudioBridge from './base';
|
||||
import logger from '/imports/startup/client/logger';
|
||||
import { fetchStunTurnServers } from '/imports/utils/fetchStunTurnServers';
|
||||
|
||||
|
||||
const MEDIA = Meteor.settings.public.media;
|
||||
const MEDIA_TAG = MEDIA.mediaTag;
|
||||
const CALL_TRANSFER_TIMEOUT = MEDIA.callTransferTimeout;
|
||||
@ -379,7 +381,7 @@ export default class SIPBridge extends BaseAudioBridge {
|
||||
await audioContext.setSinkId(value);
|
||||
this.media.outputDeviceId = value;
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
logger.error(err);
|
||||
throw new Error(this.baseErrorCodes.MEDIA_ERROR);
|
||||
}
|
||||
}
|
||||
|
@ -7,23 +7,19 @@ const logClient = function (type, log, ...args) {
|
||||
const logContents = { ...args };
|
||||
|
||||
if (User) {
|
||||
const {
|
||||
meetingId, name, intId, extId, authToken,
|
||||
} = User;
|
||||
const serverInfo = {
|
||||
meetingId,
|
||||
userName: name,
|
||||
userIntId: intId,
|
||||
userExtId: extId,
|
||||
authToken,
|
||||
};
|
||||
logContents.serverInfo = serverInfo;
|
||||
if (User.meetingId === args[0].meetingId) {
|
||||
args[0].validUser = 'vaild';
|
||||
} else {
|
||||
args[0].validUser = 'invaild';
|
||||
}
|
||||
} else {
|
||||
args[0].validUser = 'notFound';
|
||||
}
|
||||
|
||||
if (typeof log === 'string' || log instanceof String) {
|
||||
Logger.log(type, `CLIENT LOG: ${log}\n`, logContents);
|
||||
Logger.log(type, `CLIENT LOG: ${log}`, logContents);
|
||||
} else {
|
||||
Logger.log(type, `CLIENT LOG: ${JSON.stringify(log)}\n`, logContents);
|
||||
Logger.log(type, `CLIENT LOG: ${JSON.stringify(log)}`, logContents);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -3,6 +3,7 @@ import SessionStorage from '/imports/ui/services/storage/session';
|
||||
import { setCustomLogoUrl } from '/imports/ui/components/user-list/service';
|
||||
import { log } from '/imports/ui/services/api';
|
||||
import deviceInfo from '/imports/utils/deviceInfo';
|
||||
import logger from '/imports/startup/client/logger';
|
||||
|
||||
// disconnected and trying to open a new connection
|
||||
const STATUS_CONNECTING = 'connecting';
|
||||
@ -17,6 +18,9 @@ export function joinRouteHandler(nextState, replace, callback) {
|
||||
callback();
|
||||
}
|
||||
|
||||
// Old credentials stored in memory were being used when joining a new meeting
|
||||
Auth.clearCredentials();
|
||||
|
||||
// use enter api to get params for the client
|
||||
const url = `/bigbluebutton/api/enter?sessionToken=${sessionToken}`;
|
||||
|
||||
@ -24,7 +28,8 @@ export function joinRouteHandler(nextState, replace, callback) {
|
||||
.then(response => response.json())
|
||||
.then(({ response }) => {
|
||||
const {
|
||||
returncode, meetingID, internalUserID, authToken, logoutUrl, customLogoURL, metadata, customdata
|
||||
returncode, meetingID, internalUserID, authToken, logoutUrl, customLogoURL, metadata,
|
||||
externUserID, fullname, confname, customdata,
|
||||
} = response;
|
||||
|
||||
if (returncode === 'FAILED') {
|
||||
@ -80,13 +85,32 @@ export function joinRouteHandler(nextState, replace, callback) {
|
||||
SessionStorage.setItem(METADATA_KEY, metakeys);
|
||||
SessionStorage.setItem(CUSTOM_DATA_KEY, customData);
|
||||
|
||||
Auth.set(meetingID, internalUserID, authToken, logoutUrl, sessionToken);
|
||||
Auth.set(
|
||||
meetingID, internalUserID, authToken, logoutUrl,
|
||||
sessionToken, fullname, externUserID, confname,
|
||||
);
|
||||
|
||||
const path = deviceInfo.type().isPhone ? '/' : '/users';
|
||||
const userInfo = window.navigator;
|
||||
|
||||
// Browser information is sent once on startup
|
||||
// Sent here instead of Meteor.startup, as the
|
||||
// user might not be validiated by then, thus user's data
|
||||
// would not be sent with this information
|
||||
const clientInfo = {
|
||||
language: userInfo.language,
|
||||
userAgent: userInfo.userAgent,
|
||||
screenSize: { width: window.screen.width, height: window.screen.height },
|
||||
windowSize: { width: window.innerWidth, height: window.innerHeight },
|
||||
bbbVersion: Meteor.settings.public.app.bbbServerVersion,
|
||||
location: window.location.href,
|
||||
};
|
||||
|
||||
replace({ pathname: path });
|
||||
|
||||
callback();
|
||||
|
||||
logger.info(JSON.stringify(clientInfo));
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -10,9 +10,13 @@ import LoadingScreen from '/imports/ui/components/loading-screen/component';
|
||||
import Settings from '/imports/ui/services/settings';
|
||||
import AudioManager from '/imports/ui/services/audio-manager';
|
||||
import IntlStartup from './intl';
|
||||
import logger from '/imports/startup/client/logger';
|
||||
|
||||
|
||||
import Users from '/imports/api/users';
|
||||
import Annotations from '/imports/api/annotations';
|
||||
import AnnotationsLocal from '/imports/ui/components/whiteboard/service';
|
||||
import IntlStartup from './intl';
|
||||
|
||||
const propTypes = {
|
||||
error: PropTypes.object,
|
||||
@ -42,6 +46,13 @@ class Base extends Component {
|
||||
this.updateErrorState = this.updateErrorState.bind(this);
|
||||
}
|
||||
|
||||
componentWillUpdate() {
|
||||
const { approved } = this.props;
|
||||
const isLoading = this.state.loading;
|
||||
|
||||
if (approved && isLoading) this.updateLoadingState(false);
|
||||
}
|
||||
|
||||
updateLoadingState(loading = false) {
|
||||
this.setState({
|
||||
loading,
|
||||
@ -75,7 +86,6 @@ class Base extends Component {
|
||||
if (loading || !subscriptionsReady) {
|
||||
return (<LoadingScreen>{loading}</LoadingScreen>);
|
||||
}
|
||||
|
||||
// this.props.annotationsHandler.stop();
|
||||
|
||||
return (<AppContainer {...this.props} baseControls={stateControls} />);
|
||||
@ -117,7 +127,7 @@ const BaseContainer = withRouter(withTracker(({ params, router }) => {
|
||||
|
||||
const subscriptionErrorHandler = {
|
||||
onError: (error) => {
|
||||
console.error(error);
|
||||
logger.error(error);
|
||||
return router.push('/logout');
|
||||
},
|
||||
};
|
||||
@ -142,6 +152,7 @@ const BaseContainer = withRouter(withTracker(({ params, router }) => {
|
||||
|
||||
const subscriptionsReady = subscriptionsHandlers.every(handler => handler.ready());
|
||||
return {
|
||||
approved: Users.findOne({ userId: Auth.userID, approved: true }) || false,
|
||||
locale,
|
||||
subscriptionsReady,
|
||||
annotationsHandler,
|
||||
|
79
bigbluebutton-html5/imports/startup/client/logger.js
Executable file
79
bigbluebutton-html5/imports/startup/client/logger.js
Executable file
@ -0,0 +1,79 @@
|
||||
import Auth from '/imports/ui/services/auth';
|
||||
import { Meteor } from 'meteor/meteor';
|
||||
import { createLogger, stdSerializers } from 'browser-bunyan';
|
||||
import { ConsoleFormattedStream } from '@browser-bunyan/console-formatted-stream';
|
||||
import { ConsoleRawStream } from '@browser-bunyan/console-raw-stream';
|
||||
import { ServerStream } from '@browser-bunyan/server-stream';
|
||||
import { nameFromLevel } from '@browser-bunyan/levels';
|
||||
|
||||
// The logger accepts "console","server", and "external" as targets
|
||||
// Multiple targets can be set as an array in the settings under public.log
|
||||
// To add more targets use the format { "target": "server", "level": "info" },
|
||||
// and add it to the public.log array
|
||||
// The accepted levels are "debug", "info", "warn", "error"
|
||||
// To send to URL, use the format {"target": "external","level": "info",
|
||||
// "url": "","method": ""}
|
||||
// externalURL is the end-point that logs will be sent to
|
||||
// Call the logger by doing a function call with the level name, I.e, logger.warn('Hi on warn')
|
||||
|
||||
const LOG_CONFIG = Meteor.settings.public.log || {};
|
||||
const { fullInfo } = Auth;
|
||||
|
||||
// Custom stream that logs to an end-point
|
||||
class ServerLoggerStream extends ServerStream {
|
||||
write(rec) {
|
||||
if (fullInfo.meetingId != null) {
|
||||
rec.clientInfo = fullInfo;
|
||||
}
|
||||
return super.write(rec);
|
||||
}
|
||||
}
|
||||
// Custom stream to log to the meteor server
|
||||
class MeteorStream {
|
||||
write(rec) {
|
||||
if (fullInfo.meetingId != null) {
|
||||
Meteor.call('logClient', nameFromLevel[rec.level], rec.msg, fullInfo);
|
||||
} else {
|
||||
Meteor.call('logClient', nameFromLevel[rec.level], rec.msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function createStreamForTarget(target, options) {
|
||||
const TARGET_EXTERNAL = 'external';
|
||||
const TARGET_CONSOLE = 'console';
|
||||
const TARGET_SERVER = 'server';
|
||||
|
||||
let Stream = ConsoleRawStream;
|
||||
switch (target) {
|
||||
case TARGET_EXTERNAL:
|
||||
Stream = ServerLoggerStream;
|
||||
break;
|
||||
case TARGET_CONSOLE:
|
||||
Stream = ConsoleFormattedStream;
|
||||
break;
|
||||
case TARGET_SERVER:
|
||||
Stream = MeteorStream;
|
||||
break;
|
||||
}
|
||||
|
||||
return new Stream(options);
|
||||
}
|
||||
|
||||
function generateLoggerStreams(config) {
|
||||
return config.map(({ target, level, ...streamOptions }) => ({
|
||||
level,
|
||||
stream: createStreamForTarget(target, streamOptions),
|
||||
}));
|
||||
}
|
||||
|
||||
// Creates the logger with the array of streams of the chosen targets
|
||||
const logger = createLogger({
|
||||
name: 'clientLogger',
|
||||
streams: generateLoggerStreams(LOG_CONFIG),
|
||||
serializers: stdSerializers,
|
||||
src: true,
|
||||
});
|
||||
|
||||
|
||||
export default logger;
|
7
bigbluebutton-html5/imports/ui/components/app/container.jsx
Normal file → Executable file
7
bigbluebutton-html5/imports/ui/components/app/container.jsx
Normal file → Executable file
@ -69,10 +69,9 @@ export default withRouter(injectIntl(withModalMounter(withTracker(({ router, int
|
||||
const currentUser = Users.findOne({ userId: Auth.userID });
|
||||
const isMeetingBreakout = meetingIsBreakout();
|
||||
|
||||
// TODO re-enable to show loading screen while waiting for guest approval
|
||||
// if (!currentUser.approved) {
|
||||
// baseControls.updateLoadingState(intl.formatMessage(intlMessages.waitingApprovalMessage));
|
||||
// }
|
||||
if (!currentUser.approved) {
|
||||
baseControls.updateLoadingState(intl.formatMessage(intlMessages.waitingApprovalMessage));
|
||||
}
|
||||
|
||||
// Check if user is removed out of the session
|
||||
Users.find({ userId: Auth.userID }).observeChanges({
|
||||
|
@ -83,9 +83,6 @@ class NavBar extends Component {
|
||||
this.props.toggleUserList();
|
||||
}
|
||||
|
||||
shouldComponentUpdate(nextProps) {
|
||||
return nextProps.breakouts.length !== this.props.breakouts.length;
|
||||
}
|
||||
componentDidUpdate(oldProps) {
|
||||
const {
|
||||
breakouts,
|
||||
|
@ -5,6 +5,7 @@ import Dropzone from 'react-dropzone';
|
||||
import update from 'immutability-helper';
|
||||
import cx from 'classnames';
|
||||
import _ from 'lodash';
|
||||
import logger from '/imports/startup/client/logger';
|
||||
|
||||
import { notify } from '/imports/ui/services/notification';
|
||||
import ModalFullscreen from '/imports/ui/components/modal/fullscreen/component';
|
||||
@ -203,7 +204,7 @@ class PresentationUploader extends Component {
|
||||
.catch((error) => {
|
||||
notify(this.props.intl.formatMessage(intlMessages.genericError), 'error');
|
||||
|
||||
console.error(error);
|
||||
logger.error(error);
|
||||
|
||||
this.setState({
|
||||
disableActions: false,
|
||||
|
@ -3,6 +3,8 @@ import { defineMessages, injectIntl } from 'react-intl';
|
||||
import { log } from '/imports/ui/services/api';
|
||||
import { notify } from '/imports/ui/services/notification';
|
||||
import VisibilityEvent from '/imports/utils/visibilityEvent';
|
||||
import logger from '/imports/startup/client/logger';
|
||||
|
||||
import VideoService from './service';
|
||||
import VideoList from './video-list/component';
|
||||
import { fetchWebRTCMappedStunTurnServers } from '/imports/utils/fetchStunTurnServers';
|
||||
@ -248,7 +250,7 @@ class VideoProvider extends Component {
|
||||
log('info', `Sending message: ${jsonMessage}`);
|
||||
ws.send(jsonMessage, (error) => {
|
||||
if (error) {
|
||||
console.error(`client: Websocket error "${error}" on message "${jsonMessage.id}"`);
|
||||
logger.error(`client: Websocket error "${error}" on message "${jsonMessage.id}"`);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
|
@ -3,6 +3,7 @@ import Auth from '/imports/ui/services/auth';
|
||||
import WhiteboardMultiUser from '/imports/api/whiteboard-multi-user/';
|
||||
import { AnnotationsStreamer } from '/imports/api/annotations';
|
||||
import addAnnotationQuery from '/imports/api/annotations/addAnnotation';
|
||||
import logger from '/imports/startup/client/logger';
|
||||
import { isEqual } from 'lodash';
|
||||
|
||||
const Annotations = new Mongo.Collection(null);
|
||||
@ -41,7 +42,7 @@ function handleAddedAnnotation({
|
||||
|
||||
Annotations.upsert(query.selector, query.modifier, (err) => {
|
||||
if (err) {
|
||||
console.error(err);
|
||||
logger.error(err);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -5,6 +5,7 @@ import KurentoBridge from '/imports/api/audio/client/bridge/kurento';
|
||||
import Auth from '/imports/ui/services/auth';
|
||||
import VoiceUsers from '/imports/api/voice-users';
|
||||
import SIPBridge from '/imports/api/audio/client/bridge/sip';
|
||||
import logger from '/imports/startup/client/logger';
|
||||
import { notify } from '/imports/ui/services/notification';
|
||||
|
||||
const MEDIA = Meteor.settings.public.media;
|
||||
@ -262,7 +263,7 @@ class AudioManager {
|
||||
this.error = error;
|
||||
this.notify(this.messages.error[error] || this.messages.error.GENERIC_ERROR, true);
|
||||
makeCall('failed callStateCallback audio', response);
|
||||
console.error('Audio Error:', error, bridgeError);
|
||||
logger.error('Audio Error:', error, bridgeError);
|
||||
this.exitAudio();
|
||||
this.onAudioExit();
|
||||
}
|
||||
|
53
bigbluebutton-html5/imports/ui/services/auth/index.js
Normal file → Executable file
53
bigbluebutton-html5/imports/ui/services/auth/index.js
Normal file → Executable file
@ -15,6 +15,9 @@ class Auth {
|
||||
this._authToken = Storage.getItem('authToken');
|
||||
this._sessionToken = Storage.getItem('sessionToken');
|
||||
this._logoutURL = Storage.getItem('logoutURL');
|
||||
this._confname = Storage.getItem('confname');
|
||||
this._externUserID = Storage.getItem('externUserID');
|
||||
this._fullname = Storage.getItem('fullname');
|
||||
this._loggedIn = {
|
||||
value: false,
|
||||
tracker: new Tracker.Dependency(),
|
||||
@ -66,6 +69,33 @@ class Auth {
|
||||
return this._logoutURL;
|
||||
}
|
||||
|
||||
set confname(confname) {
|
||||
this._confname = confname;
|
||||
Storage.setItem('confname', this._confname);
|
||||
}
|
||||
|
||||
get confname() {
|
||||
return this._confname;
|
||||
}
|
||||
|
||||
set externUserID(externUserID) {
|
||||
this._externUserID = externUserID;
|
||||
Storage.setItem('externUserID', this._externUserID);
|
||||
}
|
||||
|
||||
get externUserID() {
|
||||
return this._externUserID;
|
||||
}
|
||||
|
||||
set fullname(fullname) {
|
||||
this._fullname = fullname;
|
||||
Storage.setItem('fullname', this._fullname);
|
||||
}
|
||||
|
||||
get fullname() {
|
||||
return this._fullname;
|
||||
}
|
||||
|
||||
get loggedIn() {
|
||||
this._loggedIn.tracker.depend();
|
||||
return this._loggedIn.value;
|
||||
@ -83,15 +113,32 @@ class Auth {
|
||||
requesterToken: this.token,
|
||||
logoutURL: this.logoutURL,
|
||||
sessionToken: this.sessionToken,
|
||||
fullname: this.fullname,
|
||||
externUserID: this.externUserID,
|
||||
confname: this.confname
|
||||
};
|
||||
}
|
||||
|
||||
set(meetingId, requesterUserId, requesterToken, logoutURL, sessionToken) {
|
||||
get fullInfo() {
|
||||
return {
|
||||
sessionToken: this.sessionToken,
|
||||
meetingId: this.meetingID,
|
||||
requesterUserId: this.userID,
|
||||
fullname: this.fullname,
|
||||
confname: this.confname,
|
||||
externUserID: this.externUserID,
|
||||
};
|
||||
}
|
||||
|
||||
set(meetingId, requesterUserId, requesterToken, logoutURL, sessionToken, fullname, externUserID, confname) {
|
||||
this.meetingID = meetingId;
|
||||
this.userID = requesterUserId;
|
||||
this.token = requesterToken;
|
||||
this.logoutURL = logoutURL;
|
||||
this.sessionToken = sessionToken;
|
||||
this.fullname = fullname;
|
||||
this.externUserID = externUserID;
|
||||
this.confname = confname;
|
||||
}
|
||||
|
||||
clearCredentials(...args) {
|
||||
@ -101,7 +148,9 @@ class Auth {
|
||||
this.loggedIn = false;
|
||||
this.logoutURL = null;
|
||||
this.sessionToken = null;
|
||||
|
||||
this.fullname = null;
|
||||
this.externUserID = null
|
||||
this.confname = null;
|
||||
return Promise.resolve(...args);
|
||||
}
|
||||
|
||||
|
39
bigbluebutton-html5/package-lock.json
generated
39
bigbluebutton-html5/package-lock.json
generated
@ -3,6 +3,32 @@
|
||||
"requires": true,
|
||||
"lockfileVersion": 1,
|
||||
"dependencies": {
|
||||
"@browser-bunyan/console-formatted-stream": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@browser-bunyan/console-formatted-stream/-/console-formatted-stream-1.3.0.tgz",
|
||||
"integrity": "sha1-PcBZqlwbKnofJuJwbiveuaCbvlc=",
|
||||
"requires": {
|
||||
"@browser-bunyan/levels": "1.3.0"
|
||||
}
|
||||
},
|
||||
"@browser-bunyan/console-raw-stream": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@browser-bunyan/console-raw-stream/-/console-raw-stream-1.3.0.tgz",
|
||||
"integrity": "sha1-zPJLVvImUFgpfGUX++zqhOu3gYw=",
|
||||
"requires": {
|
||||
"@browser-bunyan/levels": "1.3.0"
|
||||
}
|
||||
},
|
||||
"@browser-bunyan/levels": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@browser-bunyan/levels/-/levels-1.3.0.tgz",
|
||||
"integrity": "sha1-oFIwOuXRofm2Pus6lElaL0KfSDE="
|
||||
},
|
||||
"@browser-bunyan/server-stream": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@browser-bunyan/server-stream/-/server-stream-1.3.0.tgz",
|
||||
"integrity": "sha1-U7MlP6T8WA6GrZoWNqA6ISo0W1Y="
|
||||
},
|
||||
"abbrev": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
|
||||
@ -401,6 +427,19 @@
|
||||
"concat-map": "0.0.1"
|
||||
}
|
||||
},
|
||||
<<<<<<< HEAD
|
||||
=======
|
||||
"browser-bunyan": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/browser-bunyan/-/browser-bunyan-1.3.0.tgz",
|
||||
"integrity": "sha1-JjeNxY16mAAsyb/Pui6l1xJEmZI=",
|
||||
"requires": {
|
||||
"@browser-bunyan/console-formatted-stream": "1.3.0",
|
||||
"@browser-bunyan/console-raw-stream": "1.3.0",
|
||||
"@browser-bunyan/levels": "1.3.0"
|
||||
}
|
||||
},
|
||||
>>>>>>> 33222e3... Client logger configured
|
||||
"browser-detect": {
|
||||
"version": "0.2.28",
|
||||
"resolved": "https://registry.npmjs.org/browser-detect/-/browser-detect-0.2.28.tgz",
|
||||
|
@ -28,7 +28,9 @@
|
||||
"but Meteor 1.6.0.1 doesn't see it there for some reason",
|
||||
"need to investigate"
|
||||
],
|
||||
"@browser-bunyan/server-stream": "^1.3.0",
|
||||
"babel-runtime": "~6.26.0",
|
||||
"browser-bunyan": "^1.3.0",
|
||||
"browser-detect": "^0.2.28",
|
||||
"classnames": "~2.2.5",
|
||||
"clipboard": "~1.7.1",
|
||||
|
@ -341,7 +341,11 @@
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
},
|
||||
"log": [
|
||||
{ "target": "server", "level": "info" }
|
||||
]
|
||||
},
|
||||
|
||||
"private": {
|
||||
|
@ -28,28 +28,28 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
<constructor-arg index="0" value="stun:stun.freeswitch.org"/>
|
||||
</bean>
|
||||
|
||||
<!--bean id="stun2" claturnturn.StunServer">
|
||||
<!--bean id="stun2" class="org.bigbluebutton.web.services.turn.StunServer">
|
||||
<constructor-arg index="0" value="stun:stun2.example.com"/>
|
||||
</bean-->
|
||||
|
||||
<!--bean id="iceCandidate1" claturnturn.RemoteIceCandidate">
|
||||
<!--bean id="iceCandidate1" class="org.bigbluebutton.web.services.turn.RemoteIceCandidate">
|
||||
<constructor-arg index="0" value="192.168.0.1"/>
|
||||
</bean-->
|
||||
|
||||
<!-- Turn servers are configured with a secret that's compatible with
|
||||
http://tools.ietf.org/html/draft-uberti-behorg.bigbluebutton.web.services.turnturn-rest-00
|
||||
as supported by the coturn and rfc5org.bigbluebutton.web.services.turnturn-serorg.bigbluebutton.web.services.turnturn servers -->
|
||||
http://tools.ietf.org/html/draft-uberti-behave-turn-rest-00
|
||||
as supported by the coturn and rfc5766-turn-server turn servers -->
|
||||
|
||||
<!--bean id="turn1" claturnturn.TurnServer">
|
||||
<!--bean id="turn1" class="org.bigbluebutton.web.services.turn.TurnServer">
|
||||
Secret:
|
||||
<constructor-arg index="0" value="secret"/>
|
||||
TURN server URL, org.bigbluebutton.web.services.turnturn: or turns:
|
||||
<constructor-arg index="1" valorg.bigbluebutton.web.services.turnturn:turn1.example.com"/>
|
||||
TURN server URL, use turn: or turns:
|
||||
<constructor-arg index="1" value="turn:turn1.example.com"/>
|
||||
TTL in seconds for shared secret
|
||||
<constructor-arg index="2" value="86400"/>
|
||||
</bean-->
|
||||
|
||||
<!--bean id="turn2" claturnturn.TurnServer">
|
||||
<!--bean id="turn2" class="org.bigbluebutton.web.services.turn.TurnServer">
|
||||
<constructor-arg index="0" value="secret"/>
|
||||
<constructor-arg index="1" value="turns:turn2.example.com:443"/>
|
||||
<constructor-arg index="2" value="86400"/>
|
||||
|
Loading…
Reference in New Issue
Block a user