Merge remote-tracking branch 'upstream/v2.6.x-release' into v2.6-tests-fixes

This commit is contained in:
Anton B 2022-12-14 15:51:26 -03:00
commit 282a81b0e9
31 changed files with 675 additions and 469 deletions

View File

@ -11,7 +11,7 @@ stages:
# define which docker image to use for builds # define which docker image to use for builds
default: default:
image: gitlab.senfcall.de:5050/senfcall-public/docker-bbb-build:v2022-07-12 image: gitlab.senfcall.de:5050/senfcall-public/docker-bbb-build:v2022-12-08-meteor-290
# This stage uses git to find out since when each package has been unmodified. # This stage uses git to find out since when each package has been unmodified.
# it then checks an API endpoint on the package server to find out for which of # it then checks an API endpoint on the package server to find out for which of

View File

@ -47,6 +47,7 @@ import org.bigbluebutton.api.domain.BreakoutRoomsParams;
import org.bigbluebutton.api.domain.LockSettingsParams; import org.bigbluebutton.api.domain.LockSettingsParams;
import org.bigbluebutton.api.domain.Meeting; import org.bigbluebutton.api.domain.Meeting;
import org.bigbluebutton.api.domain.Group; import org.bigbluebutton.api.domain.Group;
import org.bigbluebutton.api.service.ServiceUtils;
import org.bigbluebutton.api.util.ParamsUtil; import org.bigbluebutton.api.util.ParamsUtil;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -685,7 +686,7 @@ public class ParamsProcessorUtil {
String parentMeetingId = ""; String parentMeetingId = "";
if (isBreakout) { if (isBreakout) {
internalMeetingId = params.get(ApiParams.MEETING_ID); internalMeetingId = params.get(ApiParams.MEETING_ID);
parentMeetingId = params.get(ApiParams.PARENT_MEETING_ID); parentMeetingId = ServiceUtils.findMeetingFromMeetingID(params.get(ApiParams.PARENT_MEETING_ID)).getInternalId();
// We rebuild the the external meeting using the has of the parent // We rebuild the the external meeting using the has of the parent
// meeting, the shared timestamp and the sequence number // meeting, the shared timestamp and the sequence number
String timeStamp = StringUtils.substringAfter(internalMeetingId, "-"); String timeStamp = StringUtils.substringAfter(internalMeetingId, "-");

View File

@ -1 +1 @@
BIGBLUEBUTTON_RELEASE=2.6.0-beta.2 BIGBLUEBUTTON_RELEASE=2.6.0-beta.3

View File

@ -5,20 +5,20 @@
meteor-base@1.5.1 meteor-base@1.5.1
mobile-experience@1.1.0 mobile-experience@1.1.0
mongo@1.15.0 mongo@1.16.3
reactive-var@1.0.11 reactive-var@1.0.12
standard-minifier-css@1.8.1 standard-minifier-css@1.8.3
standard-minifier-js@2.8.0 standard-minifier-js@2.8.1
es5-shim@4.8.0 es5-shim@4.8.0
ecmascript@0.16.2 ecmascript@0.16.4
shell-server@0.5.0 shell-server@0.5.0
static-html@1.3.2 static-html@1.3.2
react-meteor-data react-meteor-data
session@1.2.0 session@1.2.1
tracker@1.2.0 tracker@1.2.1
check@1.3.1 check@1.3.2
rocketchat:streamer rocketchat:streamer
meteortesting:mocha meteortesting:mocha

View File

@ -1 +1 @@
METEOR@2.7.3 METEOR@2.9.0

View File

@ -1,6 +1,6 @@
allow-deny@1.1.1 allow-deny@1.1.1
autoupdate@1.8.0 autoupdate@1.8.0
babel-compiler@7.9.0 babel-compiler@7.10.1
babel-runtime@1.5.1 babel-runtime@1.5.1
base64@1.0.12 base64@1.0.12
binary-heap@1.0.11 binary-heap@1.0.11
@ -9,21 +9,21 @@ boilerplate-generator@1.7.1
caching-compiler@1.2.2 caching-compiler@1.2.2
caching-html-compiler@1.2.1 caching-html-compiler@1.2.1
callback-hook@1.4.0 callback-hook@1.4.0
check@1.3.1 check@1.3.2
ddp@1.4.0 ddp@1.4.1
ddp-client@2.5.0 ddp-client@2.6.1
ddp-common@1.4.0 ddp-common@1.4.0
ddp-server@2.5.0 ddp-server@2.6.0
diff-sequence@1.1.1 diff-sequence@1.1.2
dynamic-import@0.7.2 dynamic-import@0.7.2
ecmascript@0.16.2 ecmascript@0.16.4
ecmascript-runtime@0.8.0 ecmascript-runtime@0.8.0
ecmascript-runtime-client@0.12.1 ecmascript-runtime-client@0.12.1
ecmascript-runtime-server@0.11.0 ecmascript-runtime-server@0.11.0
ejson@1.1.2 ejson@1.1.3
es5-shim@4.8.0 es5-shim@4.8.0
fetch@0.1.1 fetch@0.1.2
geojson-utils@1.0.10 geojson-utils@1.0.11
hot-code-push@1.0.4 hot-code-push@1.0.4
html-tools@1.1.3 html-tools@1.1.3
htmljs@1.1.1 htmljs@1.1.1
@ -33,46 +33,46 @@ inter-process-messaging@0.1.1
launch-screen@1.3.0 launch-screen@1.3.0
lmieulet:meteor-coverage@4.1.0 lmieulet:meteor-coverage@4.1.0
logging@1.3.1 logging@1.3.1
meteor@1.10.0 meteor@1.10.3
meteor-base@1.5.1 meteor-base@1.5.1
meteortesting:browser-tests@1.3.5 meteortesting:browser-tests@1.3.5
meteortesting:mocha@2.0.3 meteortesting:mocha@2.0.3
meteortesting:mocha-core@8.1.2 meteortesting:mocha-core@8.1.2
minifier-css@1.6.0 minifier-css@1.6.2
minifier-js@2.7.4 minifier-js@2.7.5
minimongo@1.8.0 minimongo@1.9.1
mobile-experience@1.1.0 mobile-experience@1.1.0
mobile-status-bar@1.1.0 mobile-status-bar@1.1.0
modern-browsers@0.1.8 modern-browsers@0.1.9
modules@0.18.0 modules@0.19.0
modules-runtime@0.13.0 modules-runtime@0.13.1
mongo@1.15.0 mongo@1.16.3
mongo-decimal@0.1.3 mongo-decimal@0.1.3
mongo-dev-server@1.1.0 mongo-dev-server@1.1.0
mongo-id@1.0.8 mongo-id@1.0.8
npm-mongo@4.3.1 npm-mongo@4.12.1
ordered-dict@1.1.0 ordered-dict@1.1.0
promise@0.12.0 promise@0.12.2
random@1.2.0 random@1.2.1
react-fast-refresh@0.2.3 react-fast-refresh@0.2.3
react-meteor-data@2.5.1 react-meteor-data@2.5.1
reactive-dict@1.3.0 reactive-dict@1.3.1
reactive-var@1.0.11 reactive-var@1.0.12
reload@1.3.1 reload@1.3.1
retry@1.1.0 retry@1.1.0
rocketchat:streamer@1.1.0 rocketchat:streamer@1.1.0
routepolicy@1.1.1 routepolicy@1.1.1
session@1.2.0 session@1.2.1
shell-server@0.5.0 shell-server@0.5.0
socket-stream-client@0.5.0 socket-stream-client@0.5.0
spacebars-compiler@1.3.1 spacebars-compiler@1.3.1
standard-minifier-css@1.8.1 standard-minifier-css@1.8.3
standard-minifier-js@2.8.0 standard-minifier-js@2.8.1
static-html@1.3.2 static-html@1.3.2
templating-tools@1.2.2 templating-tools@1.2.2
tracker@1.2.0 tracker@1.2.1
typescript@4.5.4 typescript@4.6.4
underscore@1.0.10 underscore@1.0.11
url@1.3.2 url@1.3.2
webapp@1.13.1 webapp@1.13.2
webapp-hashing@1.1.0 webapp-hashing@1.1.1

View File

@ -27,74 +27,52 @@ import Users, { CurrentUser } from '/imports/api/users';
import { Slides, SlidePositions } from '/imports/api/slides'; import { Slides, SlidePositions } from '/imports/api/slides';
// Custom Publishers // Custom Publishers
export const localCurrentPollSync = new AbstractCollection(CurrentPoll, CurrentPoll); export const localCollectionRegistry = {
export const localCurrentUserSync = new AbstractCollection(CurrentUser, CurrentUser); localCurrentPollSync: new AbstractCollection(CurrentPoll, CurrentPoll),
export const localSlidesSync = new AbstractCollection(Slides, Slides); localCurrentUserSync: new AbstractCollection(CurrentUser, CurrentUser),
export const localSlidePositionsSync = new AbstractCollection(SlidePositions, SlidePositions); localSlidesSync: new AbstractCollection(Slides, Slides),
export const localPollsSync = new AbstractCollection(Polls, Polls); localSlidePositionsSync: new AbstractCollection(SlidePositions, SlidePositions),
export const localPresentationsSync = new AbstractCollection(Presentations, Presentations); localPollsSync: new AbstractCollection(Polls, Polls),
export const localPresentationPodsSync = new AbstractCollection(PresentationPods, PresentationPods); localPresentationsSync: new AbstractCollection(Presentations, Presentations),
export const localPresentationUploadTokenSync = new AbstractCollection(PresentationUploadToken, PresentationUploadToken); localPresentationPodsSync: new AbstractCollection(PresentationPods, PresentationPods),
export const localScreenshareSync = new AbstractCollection(Screenshare, Screenshare); localPresentationUploadTokenSync: new AbstractCollection(
export const localUserInfosSync = new AbstractCollection(UserInfos, UserInfos); PresentationUploadToken,
export const localUsersPersistentDataSync = new AbstractCollection(UsersPersistentData, UsersPersistentData); PresentationUploadToken,
export const localUserSettingsSync = new AbstractCollection(UserSettings, UserSettings); ),
export const localVideoStreamsSync = new AbstractCollection(VideoStreams, VideoStreams); localScreenshareSync: new AbstractCollection(Screenshare, Screenshare),
export const localVoiceUsersSync = new AbstractCollection(VoiceUsers, VoiceUsers); localUserInfosSync: new AbstractCollection(UserInfos, UserInfos),
export const localWhiteboardMultiUserSync = new AbstractCollection(WhiteboardMultiUser, WhiteboardMultiUser); localUsersPersistentDataSync: new AbstractCollection(UsersPersistentData, UsersPersistentData),
export const localGroupChatSync = new AbstractCollection(GroupChat, GroupChat); localUserSettingsSync: new AbstractCollection(UserSettings, UserSettings),
export const localConnectionStatusSync = new AbstractCollection(ConnectionStatus, ConnectionStatus); localVideoStreamsSync: new AbstractCollection(VideoStreams, VideoStreams),
export const localCaptionsSync = new AbstractCollection(Captions, Captions); localVoiceUsersSync: new AbstractCollection(VoiceUsers, VoiceUsers),
export const localPadsSync = new AbstractCollection(Pads, Pads); localWhiteboardMultiUserSync: new AbstractCollection(WhiteboardMultiUser, WhiteboardMultiUser),
export const localPadsSessionsSync = new AbstractCollection(PadsSessions, PadsSessions); localGroupChatSync: new AbstractCollection(GroupChat, GroupChat),
export const localPadsUpdatesSync = new AbstractCollection(PadsUpdates, PadsUpdates); localConnectionStatusSync: new AbstractCollection(ConnectionStatus, ConnectionStatus),
export const localAuthTokenValidationSync = new AbstractCollection(AuthTokenValidation, AuthTokenValidation); localCaptionsSync: new AbstractCollection(Captions, Captions),
export const localAnnotationsSync = new AbstractCollection(Annotations, Annotations); localPadsSync: new AbstractCollection(Pads, Pads),
export const localRecordMeetingsSync = new AbstractCollection(RecordMeetings, RecordMeetings); localPadsSessionsSync: new AbstractCollection(PadsSessions, PadsSessions),
export const localExternalVideoMeetingsSync = new AbstractCollection(ExternalVideoMeetings, ExternalVideoMeetings); localPadsUpdatesSync: new AbstractCollection(PadsUpdates, PadsUpdates),
export const localMeetingTimeRemainingSync = new AbstractCollection(MeetingTimeRemaining, MeetingTimeRemaining); localAuthTokenValidationSync: new AbstractCollection(AuthTokenValidation, AuthTokenValidation),
export const localUsersTypingSync = new AbstractCollection(UsersTyping, UsersTyping); localAnnotationsSync: new AbstractCollection(Annotations, Annotations),
export const localBreakoutsSync = new AbstractCollection(Breakouts, Breakouts); localRecordMeetingsSync: new AbstractCollection(RecordMeetings, RecordMeetings),
export const localBreakoutsHistorySync = new AbstractCollection(BreakoutsHistory, BreakoutsHistory); localExternalVideoMeetingsSync: new AbstractCollection(
export const localGuestUsersSync = new AbstractCollection(guestUsers, guestUsers); ExternalVideoMeetings,
export const localMeetingsSync = new AbstractCollection(Meetings, Meetings); ExternalVideoMeetings,
export const localUsersSync = new AbstractCollection(Users, Users); ),
export const localNotificationsSync = new AbstractCollection(Notifications, Notifications); localMeetingTimeRemainingSync: new AbstractCollection(MeetingTimeRemaining, MeetingTimeRemaining),
localUsersTypingSync: new AbstractCollection(UsersTyping, UsersTyping),
localBreakoutsSync: new AbstractCollection(Breakouts, Breakouts),
localBreakoutsHistorySync: new AbstractCollection(BreakoutsHistory, BreakoutsHistory),
localGuestUsersSync: new AbstractCollection(guestUsers, guestUsers),
localMeetingsSync: new AbstractCollection(Meetings, Meetings),
localUsersSync: new AbstractCollection(Users, Users),
localNotificationsSync: new AbstractCollection(Notifications, Notifications),
};
const collectionMirrorInitializer = () => { const collectionMirrorInitializer = () => {
localCurrentPollSync.setupListeners(); Object.values(localCollectionRegistry).forEach((localCollection) => {
localCurrentUserSync.setupListeners(); localCollection.setupListeners();
localSlidesSync.setupListeners(); });
localSlidePositionsSync.setupListeners();
localPollsSync.setupListeners();
localPresentationsSync.setupListeners();
localPresentationPodsSync.setupListeners();
localPresentationUploadTokenSync.setupListeners();
localScreenshareSync.setupListeners();
localUserInfosSync.setupListeners();
localUsersPersistentDataSync.setupListeners();
localUserSettingsSync.setupListeners();
localVideoStreamsSync.setupListeners();
localVoiceUsersSync.setupListeners();
localWhiteboardMultiUserSync.setupListeners();
localGroupChatSync.setupListeners();
localConnectionStatusSync.setupListeners();
localCaptionsSync.setupListeners();
localPadsSync.setupListeners();
localPadsSessionsSync.setupListeners();
localPadsUpdatesSync.setupListeners();
localAuthTokenValidationSync.setupListeners();
localAnnotationsSync.setupListeners();
localRecordMeetingsSync.setupListeners();
localExternalVideoMeetingsSync.setupListeners();
localMeetingTimeRemainingSync.setupListeners();
localUsersTypingSync.setupListeners();
localBreakoutsSync.setupListeners();
localBreakoutsHistorySync.setupListeners();
localGuestUsersSync.setupListeners();
localMeetingsSync.setupListeners();
localUsersSync.setupListeners();
localNotificationsSync.setupListeners();
}; };
export default collectionMirrorInitializer; export default collectionMirrorInitializer;

View File

@ -228,6 +228,7 @@ class App extends Component {
layoutContextDispatch, layoutContextDispatch,
numCameras, numCameras,
presentationIsOpen, presentationIsOpen,
ignorePollNotifications,
} = this.props; } = this.props;
this.renderDarkMode(); this.renderDarkMode();

View File

@ -311,5 +311,6 @@ export default injectIntl(withModalMounter(withTracker(({ intl, baseControls })
hidePresentation: getFromUserSettings('bbb_hide_presentation', LAYOUT_CONFIG.hidePresentation), hidePresentation: getFromUserSettings('bbb_hide_presentation', LAYOUT_CONFIG.hidePresentation),
hideActionsBar: getFromUserSettings('bbb_hide_actions_bar', false), hideActionsBar: getFromUserSettings('bbb_hide_actions_bar', false),
isModalOpen: !!getModal(), isModalOpen: !!getModal(),
ignorePollNotifications: Session.get('ignorePollNotifications'),
}; };
})(AppContainer))); })(AppContainer)));

View File

@ -10,6 +10,7 @@ import { stripTags, unescapeHtml } from '/imports/utils/string-utils';
import Service from '../service'; import Service from '../service';
import Styled from './styles'; import Styled from './styles';
import { usePreviousValue } from '/imports/ui/components/utils/hooks'; import { usePreviousValue } from '/imports/ui/components/utils/hooks';
import { Session } from 'meteor/session';
const CHAT_CONFIG = Meteor.settings.public.chat; const CHAT_CONFIG = Meteor.settings.public.chat;
const PUBLIC_CHAT_CLEAR = CHAT_CONFIG.chat_clear; const PUBLIC_CHAT_CLEAR = CHAT_CONFIG.chat_clear;
@ -193,9 +194,11 @@ const ChatAlert = (props) => {
const mappedMessage = Service.mapGroupMessage(timeWindow); const mappedMessage = Service.mapGroupMessage(timeWindow);
let content = null; let content = null;
let isPollResult = false;
if (mappedMessage) { if (mappedMessage) {
if (mappedMessage.id.includes(POLL_RESULT_KEY)) { if (mappedMessage.id.includes(POLL_RESULT_KEY)) {
content = createPollMessage(); content = createPollMessage();
isPollResult = true;
} else { } else {
content = createMessage(mappedMessage.sender.name, mappedMessage.content.slice(-5)); content = createMessage(mappedMessage.sender.name, mappedMessage.content.slice(-5));
} }
@ -218,10 +221,22 @@ const ChatAlert = (props) => {
: <span>{intl.formatMessage(intlMessages.appToastChatPrivate)}</span> : <span>{intl.formatMessage(intlMessages.appToastChatPrivate)}</span>
} }
onOpen={ onOpen={
() => setUnreadMessages(newUnreadMessages) () => {
if (isPollResult) {
Session.set('ignorePollNotifications', true);
}
setUnreadMessages(newUnreadMessages);
}
} }
onClose={ onClose={
() => setUnreadMessages(newUnreadMessages) () => {
if (isPollResult) {
Session.set('ignorePollNotifications', false);
}
setUnreadMessages(newUnreadMessages);
}
} }
alertDuration={timeWindow.durationDiff} alertDuration={timeWindow.durationDiff}
layoutContextDispatch={layoutContextDispatch} layoutContextDispatch={layoutContextDispatch}

View File

@ -8,11 +8,7 @@ import Users from '/imports/api/users';
import AnnotationsTextService from '/imports/ui/components/whiteboard/annotations/text/service'; import AnnotationsTextService from '/imports/ui/components/whiteboard/annotations/text/service';
import { Annotations as AnnotationsLocal } from '/imports/ui/components/whiteboard/service'; import { Annotations as AnnotationsLocal } from '/imports/ui/components/whiteboard/service';
import { import {
localBreakoutsSync, localCollectionRegistry,
localBreakoutsHistorySync,
localGuestUsersSync,
localMeetingsSync,
localUsersSync,
} from '/client/collection-mirror-initializer'; } from '/client/collection-mirror-initializer';
import SubscriptionRegistry, { subscriptionReactivity } from '../../services/subscription-registry/subscriptionRegistry'; import SubscriptionRegistry, { subscriptionReactivity } from '../../services/subscription-registry/subscriptionRegistry';
import { isChatEnabled } from '/imports/ui/services/features'; import { isChatEnabled } from '/imports/ui/services/features';
@ -30,6 +26,13 @@ const SUBSCRIPTIONS = [
'pads', 'pads-sessions', 'pads-updates', 'notifications', 'audio-captions', 'pads', 'pads-sessions', 'pads-updates', 'notifications', 'audio-captions',
'layout-meetings', 'layout-meetings',
]; ];
const {
localBreakoutsSync,
localBreakoutsHistorySync,
localGuestUsersSync,
localMeetingsSync,
localUsersSync,
} = localCollectionRegistry;
const EVENT_NAME = 'bbb-group-chat-messages-subscription-has-stoppped'; const EVENT_NAME = 'bbb-group-chat-messages-subscription-has-stoppped';
const EVENT_NAME_SUBSCRIPTION_READY = 'bbb-group-chat-messages-subscriptions-ready'; const EVENT_NAME_SUBSCRIPTION_READY = 'bbb-group-chat-messages-subscriptions-ready';
@ -165,6 +168,10 @@ export default withTracker(() => {
}, },
...subscriptionErrorHandler, ...subscriptionErrorHandler,
}); });
Object.values(localCollectionRegistry).forEach(
(localCollection) => localCollection.checkForStaleData(),
);
} }
return { return {

View File

@ -25,13 +25,17 @@ const intlMessages = defineMessages({
let annotationsStreamListener = null; let annotationsStreamListener = null;
export function addAnnotationToDiscardedList(annotation) {
if (!discardedList.includes(annotation)) discardedList.push(annotation);
}
const clearPreview = (annotation) => { const clearPreview = (annotation) => {
UnsentAnnotations.remove({ id: annotation }); UnsentAnnotations.remove({ id: annotation });
}; };
const clearFakeAnnotations = () => { const clearFakeAnnotations = () => {
UnsentAnnotations.remove({}); UnsentAnnotations.remove({});
Annotations.remove({ id: /-fake/g, annotationType: { $ne: 'text' } }); Annotations.remove({ id: /-fake/g });
} }
function handleAddedAnnotation({ function handleAddedAnnotation({

View File

@ -238,6 +238,8 @@ export default class WhiteboardOverlay extends Component {
setTextShapeActiveId, setTextShapeActiveId,
contextMenuHandler, contextMenuHandler,
clearPreview, clearPreview,
addAnnotationToDiscardedList,
undoAnnotation,
updateCursor, updateCursor,
} = this.props; } = this.props;
@ -255,6 +257,8 @@ export default class WhiteboardOverlay extends Component {
setTextShapeActiveId, setTextShapeActiveId,
contextMenuHandler, contextMenuHandler,
clearPreview, clearPreview,
addAnnotationToDiscardedList,
undoAnnotation,
}; };
return ( return (
@ -319,4 +323,6 @@ WhiteboardOverlay.propTypes = {
setTextShapeActiveId: PropTypes.func.isRequired, setTextShapeActiveId: PropTypes.func.isRequired,
// Defines a handler to publish cursor position to the server // Defines a handler to publish cursor position to the server
updateCursor: PropTypes.func.isRequired, updateCursor: PropTypes.func.isRequired,
addAnnotationToDiscardedList: PropTypes.func.isRequired,
undoAnnotation: PropTypes.func.isRequired,
}; };

View File

@ -2,6 +2,7 @@ import React from 'react';
import { withTracker } from 'meteor/react-meteor-data'; import { withTracker } from 'meteor/react-meteor-data';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import WhiteboardOverlayService from './service'; import WhiteboardOverlayService from './service';
import WhiteboardToolbarService from '../whiteboard-toolbar/service';
import WhiteboardOverlay from './component'; import WhiteboardOverlay from './component';
const WhiteboardOverlayContainer = (props) => { const WhiteboardOverlayContainer = (props) => {
@ -15,10 +16,12 @@ const WhiteboardOverlayContainer = (props) => {
}; };
export default withTracker(() => ({ export default withTracker(() => ({
undoAnnotation: WhiteboardToolbarService.undoAnnotation,
clearPreview: WhiteboardOverlayService.clearPreview, clearPreview: WhiteboardOverlayService.clearPreview,
contextMenuHandler: WhiteboardOverlayService.contextMenuHandler, contextMenuHandler: WhiteboardOverlayService.contextMenuHandler,
sendAnnotation: WhiteboardOverlayService.sendAnnotation, sendAnnotation: WhiteboardOverlayService.sendAnnotation,
sendLiveSyncPreviewAnnotation: WhiteboardOverlayService.sendLiveSyncPreviewAnnotation, sendLiveSyncPreviewAnnotation: WhiteboardOverlayService.sendLiveSyncPreviewAnnotation,
addAnnotationToDiscardedList: WhiteboardOverlayService.addAnnotationToDiscardedList,
setTextShapeActiveId: WhiteboardOverlayService.setTextShapeActiveId, setTextShapeActiveId: WhiteboardOverlayService.setTextShapeActiveId,
resetTextShapeSession: WhiteboardOverlayService.resetTextShapeSession, resetTextShapeSession: WhiteboardOverlayService.resetTextShapeSession,
drawSettings: WhiteboardOverlayService.getWhiteboardToolbarValues(), drawSettings: WhiteboardOverlayService.getWhiteboardToolbarValues(),

View File

@ -1,6 +1,6 @@
import Storage from '/imports/ui/services/storage/session'; import Storage from '/imports/ui/services/storage/session';
import Auth from '/imports/ui/services/auth'; import Auth from '/imports/ui/services/auth';
import { sendAnnotation, sendLiveSyncPreviewAnnotation, clearPreview } from '/imports/ui/components/whiteboard/service'; import { sendAnnotation, sendLiveSyncPreviewAnnotation, clearPreview, addAnnotationToDiscardedList } from '/imports/ui/components/whiteboard/service';
import { publishCursorUpdate } from '/imports/ui/components/cursor/service'; import { publishCursorUpdate } from '/imports/ui/components/cursor/service';
const DRAW_SETTINGS = 'drawSettings'; const DRAW_SETTINGS = 'drawSettings';
@ -55,6 +55,7 @@ const updateCursor = (payload) => {
}; };
export default { export default {
addAnnotationToDiscardedList,
sendAnnotation, sendAnnotation,
sendLiveSyncPreviewAnnotation, sendLiveSyncPreviewAnnotation,
getWhiteboardToolbarValues, getWhiteboardToolbarValues,

View File

@ -218,11 +218,12 @@ export default class TextDrawListener extends Component {
} }
// second case is when a user finished writing the text and publishes the final result // second case is when a user finished writing the text and publishes the final result
} else if (isRightClick) {
this.discardAnnotation();
} else { } else {
// publishing the final shape and resetting the state // publishing the final shape and resetting the state
this.sendLastMessage(); this.sendLastMessage();
if (isRightClick) {
this.discardAnnotation();
}
} }
} }
@ -485,15 +486,18 @@ export default class TextDrawListener extends Component {
discardAnnotation() { discardAnnotation() {
const { const {
actions, actions,
whiteboardId,
} = this.props; } = this.props;
const { const {
getCurrentShapeId, getCurrentShapeId,
clearPreview, undoAnnotation,
addAnnotationToDiscardedList,
} = actions; } = actions;
this.resetState(); this.resetState();
clearPreview(getCurrentShapeId()); undoAnnotation(whiteboardId);
addAnnotationToDiscardedList(getCurrentShapeId());
} }
render() { render() {
@ -598,5 +602,7 @@ TextDrawListener.propTypes = {
resetTextShapeSession: PropTypes.func.isRequired, resetTextShapeSession: PropTypes.func.isRequired,
// Defines a function that sets a session value for the current active text shape // Defines a function that sets a session value for the current active text shape
setTextShapeActiveId: PropTypes.func.isRequired, setTextShapeActiveId: PropTypes.func.isRequired,
undoAnnotation: PropTypes.func.isRequired,
addAnnotationToDiscardedList: PropTypes.func.isRequired,
}).isRequired, }).isRequired,
}; };

View File

@ -2,7 +2,7 @@ import SubscriptionRegistry from '/imports/ui/services/subscription-registry/sub
import CollectionEventsBroker from '/imports/ui/services/LiveDataEventBroker/LiveDataEventBroker'; import CollectionEventsBroker from '/imports/ui/services/LiveDataEventBroker/LiveDataEventBroker';
/* /*
This class connects a local collection with the LiveDataEventBroker, propagating the changes of a server-side published cursor to a local collection. This class connects a local collection with the LiveDataEventBroker, propagating the changes of a server-side published cursor to a local collection.
It also guarantee that in case of a reconnection or a re-subscription, the data is only removed after subscription is ready, avoiding the situation of missing data during re-synchronization. It also guarantee that in case of a reconnection or a re-subscription, the data is only removed after subscription is ready, avoiding the situation of missing data during re-synchronization.
*/ */
@ -15,6 +15,7 @@ class LocalCollectionSynchronizer {
this.lastSubscriptionId = ''; this.lastSubscriptionId = '';
this.options = options; this.options = options;
this.ignoreDeletes = false; this.ignoreDeletes = false;
this.checkForStaleData = this.checkForStaleData.bind(this);
} }
/* /*
@ -31,26 +32,12 @@ class LocalCollectionSynchronizer {
const self = this; const self = this;
const addedCallback = function (item) { const addedCallback = function (item) {
const subscription = SubscriptionRegistry
.getSubscription(self.serverCollection._name);
if (item.id === 'publication-stop-marker' && item.stopped) { if (item.id === 'publication-stop-marker' && item.stopped) {
self.ignoreDeletes = true; self.ignoreDeletes = true;
return; return;
} }
// If the subscriptionId changes means the subscriptions was redone
// or theres more than one subscription per collection
if (subscription && (self.lastSubscriptionId !== subscription.subscriptionId)) {
const wasEmpty = self.lastSubscriptionId === '';
self.lastSubscriptionId = subscription.subscriptionId;
if (!wasEmpty) {
self.callWhenSubscriptionReady(() => {
self.ignoreDeletes = false;
Session.set('globalIgnoreDeletes', false);
self.removeOldSubscriptionData();
});
}
}
self.checkForStaleData();
const selector = { referenceId: item.referenceId }; const selector = { referenceId: item.referenceId };
const itemExistInCollection = self.localCollection.findOne(selector); const itemExistInCollection = self.localCollection.findOne(selector);
@ -117,6 +104,24 @@ class LocalCollectionSynchronizer {
return tempPromise; return tempPromise;
} }
checkForStaleData() {
const subscription = SubscriptionRegistry.getSubscription(this.serverCollection._name);
// If the subscriptionId changes means the subscriptions was redone
// or theres more than one subscription per collection
if (subscription && (this.lastSubscriptionId !== subscription.subscriptionId)) {
const wasEmpty = this.lastSubscriptionId === '';
this.lastSubscriptionId = subscription.subscriptionId;
if (!wasEmpty) {
this.callWhenSubscriptionReady(() => {
this.ignoreDeletes = false;
Session.set('globalIgnoreDeletes', false);
this.removeOldSubscriptionData();
});
}
}
}
/* /*
This method removes data from previous subscriptions after the current one is ready. This method removes data from previous subscriptions after the current one is ready.
*/ */

View File

@ -16,7 +16,7 @@ const SETTINGS = [
]; ];
const CHANGED_SETTINGS = 'changed_settings'; const CHANGED_SETTINGS = 'changed_settings';
const DEFAULT_SETTINGS = 'dafault_settings'; const DEFAULT_SETTINGS = 'default_settings';
class Settings { class Settings {
constructor(defaultValues = {}) { constructor(defaultValues = {}) {

View File

@ -1677,6 +1677,7 @@
"version": "6.12.6", "version": "6.12.6",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dev": true,
"requires": { "requires": {
"fast-deep-equal": "^3.1.1", "fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0", "fast-json-stable-stringify": "^2.0.0",
@ -1739,11 +1740,6 @@
} }
} }
}, },
"any-promise": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
"integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8="
},
"argparse": { "argparse": {
"version": "1.0.10", "version": "1.0.10",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
@ -2027,19 +2023,6 @@
} }
} }
}, },
"asn1": {
"version": "0.2.4",
"resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
"integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
"requires": {
"safer-buffer": "~2.1.0"
}
},
"assert-plus": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
},
"assertion-error": { "assertion-error": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
@ -2063,11 +2046,6 @@
"resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz",
"integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==" "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g=="
}, },
"asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
},
"attr-accept": { "attr-accept": {
"version": "1.1.3", "version": "1.1.3",
"resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-1.1.3.tgz", "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-1.1.3.tgz",
@ -2101,16 +2079,6 @@
"resolved": "https://registry.npmjs.org/autosize/-/autosize-4.0.4.tgz", "resolved": "https://registry.npmjs.org/autosize/-/autosize-4.0.4.tgz",
"integrity": "sha512-5yxLQ22O0fCRGoxGfeLSNt3J8LB1v+umtpMnPW6XjkTWXKoN0AmXAIhelJcDtFT/Y/wYWmfE+oqU10Q0b8FhaQ==" "integrity": "sha512-5yxLQ22O0fCRGoxGfeLSNt3J8LB1v+umtpMnPW6XjkTWXKoN0AmXAIhelJcDtFT/Y/wYWmfE+oqU10Q0b8FhaQ=="
}, },
"aws-sign2": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
"integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
},
"aws4": {
"version": "1.11.0",
"resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
"integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA=="
},
"axe-core": { "axe-core": {
"version": "4.4.1", "version": "4.4.1",
"resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.1.tgz", "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.1.tgz",
@ -2169,14 +2137,6 @@
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
"dev": true "dev": true
}, },
"bcrypt-pbkdf": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
"integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
"requires": {
"tweetnacl": "^0.14.3"
}
},
"bintrees": { "bintrees": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.1.tgz", "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.1.tgz",
@ -2286,11 +2246,6 @@
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001332.tgz", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001332.tgz",
"integrity": "sha512-10T30NYOEQtN6C11YGg411yebhvpnC6Z102+B95eAsN0oB6KUs01ivE8u+G6FMIRtIrVlYXhL+LUwQ3/hXwDWw==" "integrity": "sha512-10T30NYOEQtN6C11YGg411yebhvpnC6Z102+B95eAsN0oB6KUs01ivE8u+G6FMIRtIrVlYXhL+LUwQ3/hXwDWw=="
}, },
"caseless": {
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
"integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
},
"chai": { "chai": {
"version": "4.2.0", "version": "4.2.0",
"resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz",
@ -2421,14 +2376,6 @@
"text-hex": "1.0.x" "text-hex": "1.0.x"
} }
}, },
"combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"requires": {
"delayed-stream": "~1.0.0"
}
},
"commander": { "commander": {
"version": "8.3.0", "version": "8.3.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
@ -2463,11 +2410,6 @@
"integrity": "sha512-Lb+/XT4WC4PaCWWtZpNPaXmjiNDUe5CJuUtbkMrIM1kb1T/jJoAIp+bkVP/r5lHzMr+ZAAF8XHp7+my6Ol0ysQ==", "integrity": "sha512-Lb+/XT4WC4PaCWWtZpNPaXmjiNDUe5CJuUtbkMrIM1kb1T/jJoAIp+bkVP/r5lHzMr+ZAAF8XHp7+my6Ol0ysQ==",
"dev": true "dev": true
}, },
"core-util-is": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
},
"cosmiconfig": { "cosmiconfig": {
"version": "5.2.1", "version": "5.2.1",
"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz",
@ -2575,14 +2517,6 @@
"resolved": "https://registry.npmjs.org/darkreader/-/darkreader-4.9.46.tgz", "resolved": "https://registry.npmjs.org/darkreader/-/darkreader-4.9.46.tgz",
"integrity": "sha512-K+MG74C8mGXvrsY47geAQdAbKU2mw8zVCa/WT4vtW3UDgzYCmthCcLnY0+FR3RQRMOyY2fULxqREZhfVQ346AA==" "integrity": "sha512-K+MG74C8mGXvrsY47geAQdAbKU2mw8zVCa/WT4vtW3UDgzYCmthCcLnY0+FR3RQRMOyY2fULxqREZhfVQ346AA=="
}, },
"dashdash": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
"integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
"requires": {
"assert-plus": "^1.0.0"
}
},
"debug": { "debug": {
"version": "2.6.9", "version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
@ -2620,11 +2554,6 @@
"object-keys": "^1.0.12" "object-keys": "^1.0.12"
} }
}, },
"delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
},
"denque": { "denque": {
"version": "1.5.0", "version": "1.5.0",
"resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz", "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz",
@ -2695,15 +2624,6 @@
"domhandler": "^4.2.0" "domhandler": "^4.2.0"
} }
}, },
"ecc-jsbn": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
"integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
"requires": {
"jsbn": "~0.1.0",
"safer-buffer": "^2.1.0"
}
},
"electron-to-chromium": { "electron-to-chromium": {
"version": "1.4.117", "version": "1.4.117",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.117.tgz", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.117.tgz",
@ -3392,25 +3312,17 @@
"resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz",
"integrity": "sha1-KueOhdmJQVhnCwPUe+wfA72Ru50=" "integrity": "sha1-KueOhdmJQVhnCwPUe+wfA72Ru50="
}, },
"extend": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
},
"extsprintf": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
"integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
},
"fast-deep-equal": { "fast-deep-equal": {
"version": "3.1.3", "version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
"dev": true
}, },
"fast-json-stable-stringify": { "fast-json-stable-stringify": {
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
"dev": true
}, },
"fast-levenshtein": { "fast-levenshtein": {
"version": "2.0.6", "version": "2.0.6",
@ -3536,21 +3448,6 @@
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz",
"integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==" "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w=="
}, },
"forever-agent": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
"integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
},
"form-data": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
"integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
"requires": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.6",
"mime-types": "^2.1.12"
}
},
"fraction.js": { "fraction.js": {
"version": "4.2.0", "version": "4.2.0",
"resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz",
@ -3627,14 +3524,6 @@
"get-intrinsic": "^1.1.1" "get-intrinsic": "^1.1.1"
} }
}, },
"getpass": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
"integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
"requires": {
"assert-plus": "^1.0.0"
}
},
"glob": { "glob": {
"version": "7.1.7", "version": "7.1.7",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
@ -3675,20 +3564,6 @@
} }
} }
}, },
"har-schema": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
"integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
},
"har-validator": {
"version": "5.1.5",
"resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
"integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
"requires": {
"ajv": "^6.12.3",
"har-schema": "^2.0.0"
}
},
"hark": { "hark": {
"version": "1.2.3", "version": "1.2.3",
"resolved": "https://registry.npmjs.org/hark/-/hark-1.2.3.tgz", "resolved": "https://registry.npmjs.org/hark/-/hark-1.2.3.tgz",
@ -3767,16 +3642,6 @@
"entities": "^2.0.0" "entities": "^2.0.0"
} }
}, },
"http-signature": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
"integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
"requires": {
"assert-plus": "^1.0.0",
"jsprim": "^1.2.2",
"sshpk": "^1.7.0"
}
},
"human-signals": { "human-signals": {
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
@ -3859,6 +3724,14 @@
"resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz",
"integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ=="
}, },
"iconv-lite": {
"version": "0.4.24",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
"requires": {
"safer-buffer": ">= 2.1.2 < 3"
}
},
"idb-keyval": { "idb-keyval": {
"version": "6.2.0", "version": "6.2.0",
"resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.2.0.tgz", "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.2.0.tgz",
@ -4111,11 +3984,6 @@
"has-symbols": "^1.0.2" "has-symbols": "^1.0.2"
} }
}, },
"is-typedarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
"integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
},
"is-weakref": { "is-weakref": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
@ -4131,11 +3999,6 @@
"integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
"dev": true "dev": true
}, },
"isstream": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
"integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
},
"js-tokens": { "js-tokens": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@ -4151,11 +4014,6 @@
"esprima": "^4.0.0" "esprima": "^4.0.0"
} }
}, },
"jsbn": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
"integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
},
"jsesc": { "jsesc": {
"version": "2.5.2", "version": "2.5.2",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
@ -4173,15 +4031,11 @@
"integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
"dev": true "dev": true
}, },
"json-schema": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
"integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="
},
"json-schema-traverse": { "json-schema-traverse": {
"version": "0.4.1", "version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
"dev": true
}, },
"json-stable-stringify-without-jsonify": { "json-stable-stringify-without-jsonify": {
"version": "1.0.1", "version": "1.0.1",
@ -4189,11 +4043,6 @@
"integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
"dev": true "dev": true
}, },
"json-stringify-safe": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
"integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
},
"json5": { "json5": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
@ -4203,17 +4052,6 @@
"minimist": "^1.2.0" "minimist": "^1.2.0"
} }
}, },
"jsprim": {
"version": "1.4.2",
"resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
"integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
"requires": {
"assert-plus": "1.0.0",
"extsprintf": "1.3.0",
"json-schema": "0.4.0",
"verror": "1.10.0"
}
},
"jss": { "jss": {
"version": "10.9.0", "version": "10.9.0",
"resolved": "https://registry.npmjs.org/jss/-/jss-10.9.0.tgz", "resolved": "https://registry.npmjs.org/jss/-/jss-10.9.0.tgz",
@ -4521,8 +4359,7 @@
"lodash.merge": { "lodash.merge": {
"version": "4.6.2", "version": "4.6.2",
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="
"dev": true
}, },
"lodash.truncate": { "lodash.truncate": {
"version": "4.4.2", "version": "4.4.2",
@ -5402,19 +5239,6 @@
"picomatch": "^2.2.3" "picomatch": "^2.2.3"
} }
}, },
"mime-db": {
"version": "1.48.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz",
"integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ=="
},
"mime-types": {
"version": "2.1.31",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz",
"integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==",
"requires": {
"mime-db": "1.48.0"
}
},
"mimic-fn": { "mimic-fn": {
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
@ -5457,10 +5281,30 @@
"integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
"dev": true "dev": true
}, },
"next-tick": { "needle": {
"version": "1.1.0", "version": "2.9.1",
"resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz",
"integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==",
"requires": {
"debug": "^3.2.6",
"iconv-lite": "^0.4.4",
"sax": "^1.2.4"
},
"dependencies": {
"debug": {
"version": "3.2.7",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
"integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
"requires": {
"ms": "^2.1.1"
}
},
"ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
}
}
}, },
"nice-try": { "nice-try": {
"version": "1.0.5", "version": "1.0.5",
@ -5513,11 +5357,6 @@
} }
} }
}, },
"oauth-sign": {
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
"integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
},
"object-assign": { "object-assign": {
"version": "4.1.1", "version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@ -5955,11 +5794,6 @@
"resolved": "https://registry.npmjs.org/perfect-freehand/-/perfect-freehand-1.2.0.tgz", "resolved": "https://registry.npmjs.org/perfect-freehand/-/perfect-freehand-1.2.0.tgz",
"integrity": "sha512-h/0ikF1M3phW7CwpZ5MMvKnfpHficWoOEyr//KVNTxV4F6deRK1eYMtHyBKEAKFK0aXIEUK9oBvlF6PNXMDsAw==" "integrity": "sha512-h/0ikF1M3phW7CwpZ5MMvKnfpHficWoOEyr//KVNTxV4F6deRK1eYMtHyBKEAKFK0aXIEUK9oBvlF6PNXMDsAw=="
}, },
"performance-now": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
"integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
},
"picocolors": { "picocolors": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
@ -6024,15 +5858,12 @@
"dev": true "dev": true
}, },
"probe-image-size": { "probe-image-size": {
"version": "4.1.1", "version": "7.2.3",
"resolved": "https://registry.npmjs.org/probe-image-size/-/probe-image-size-4.1.1.tgz", "resolved": "https://registry.npmjs.org/probe-image-size/-/probe-image-size-7.2.3.tgz",
"integrity": "sha512-42LqKZqTLxH/UvAZ2/cKhAsR4G/Y6B7i7fI2qtQu9hRBK4YjS6gqO+QRtwTjvojUx4+/+JuOMzLoFyRecT9qRw==", "integrity": "sha512-HubhG4Rb2UH8YtV4ba0Vp5bQ7L78RTONYu/ujmCu5nBI8wGv24s4E9xSKBi0N1MowRpxk76pFCpJtW0KPzOK0w==",
"requires": { "requires": {
"any-promise": "^1.3.0", "lodash.merge": "^4.6.2",
"deepmerge": "^4.0.0", "needle": "^2.5.2",
"inherits": "^2.0.3",
"next-tick": "^1.0.0",
"request": "^2.83.0",
"stream-parser": "~0.3.1" "stream-parser": "~0.3.1"
} }
}, },
@ -6060,11 +5891,6 @@
"react-is": "^16.13.1" "react-is": "^16.13.1"
} }
}, },
"psl": {
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
"integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
},
"pump": { "pump": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
@ -6078,12 +5904,8 @@
"punycode": { "punycode": {
"version": "2.1.1", "version": "2.1.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
}, "dev": true
"qs": {
"version": "6.5.2",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
"integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
}, },
"queue": { "queue": {
"version": "6.0.2", "version": "6.0.2",
@ -6408,33 +6230,6 @@
"integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
"dev": true "dev": true
}, },
"request": {
"version": "2.88.2",
"resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
"integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
"requires": {
"aws-sign2": "~0.7.0",
"aws4": "^1.8.0",
"caseless": "~0.12.0",
"combined-stream": "~1.0.6",
"extend": "~3.0.2",
"forever-agent": "~0.6.1",
"form-data": "~2.3.2",
"har-validator": "~5.1.3",
"http-signature": "~1.2.0",
"is-typedarray": "~1.0.0",
"isstream": "~0.1.2",
"json-stringify-safe": "~5.0.1",
"mime-types": "~2.1.19",
"oauth-sign": "~0.9.0",
"performance-now": "^2.1.0",
"qs": "~6.5.2",
"safe-buffer": "^5.1.2",
"tough-cookie": "~2.5.0",
"tunnel-agent": "^0.6.0",
"uuid": "^3.3.2"
}
},
"require-from-string": { "require-from-string": {
"version": "2.0.2", "version": "2.0.2",
"resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
@ -6538,6 +6333,11 @@
} }
} }
}, },
"sax": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
"integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
},
"scheduler": { "scheduler": {
"version": "0.20.2", "version": "0.20.2",
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz",
@ -6728,22 +6528,6 @@
"integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
"dev": true "dev": true
}, },
"sshpk": {
"version": "1.16.1",
"resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
"integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
"requires": {
"asn1": "~0.2.3",
"assert-plus": "^1.0.0",
"bcrypt-pbkdf": "^1.0.0",
"dashdash": "^1.12.0",
"ecc-jsbn": "~0.1.1",
"getpass": "^0.1.1",
"jsbn": "~0.1.0",
"safer-buffer": "^2.0.2",
"tweetnacl": "~0.14.0"
}
},
"stack-trace": { "stack-trace": {
"version": "0.0.10", "version": "0.0.10",
"resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
@ -6752,7 +6536,7 @@
"stream-parser": { "stream-parser": {
"version": "0.3.1", "version": "0.3.1",
"resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz", "resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz",
"integrity": "sha1-FhhUhpRCACGhGC/wrxkRwSl2F3M=", "integrity": "sha512-bJ/HgKq41nlKvlhccD5kaCr/P+Hu0wPNKPJOH7en+YrJu/9EgqUF+88w5Jb6KNcjOFMhfX4B2asfeAtIGuHObQ==",
"requires": { "requires": {
"debug": "2" "debug": "2"
} }
@ -7090,15 +6874,6 @@
"is-number": "^7.0.0" "is-number": "^7.0.0"
} }
}, },
"tough-cookie": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
"integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
"requires": {
"psl": "^1.1.28",
"punycode": "^2.1.1"
}
},
"triple-beam": { "triple-beam": {
"version": "1.3.0", "version": "1.3.0",
"resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz",
@ -7121,19 +6896,6 @@
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
"integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
}, },
"tunnel-agent": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
"integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
"requires": {
"safe-buffer": "^5.0.1"
}
},
"tweetnacl": {
"version": "0.14.5",
"resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
"integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
},
"type-check": { "type-check": {
"version": "0.4.0", "version": "0.4.0",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
@ -7165,6 +6927,7 @@
"version": "4.4.1", "version": "4.4.1",
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
"integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
"dev": true,
"requires": { "requires": {
"punycode": "^2.1.0" "punycode": "^2.1.0"
} }
@ -7206,11 +6969,6 @@
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
}, },
"uuid": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
"integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
},
"v8-compile-cache": { "v8-compile-cache": {
"version": "2.3.0", "version": "2.3.0",
"resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
@ -7227,16 +6985,6 @@
"spdx-expression-parse": "^3.0.0" "spdx-expression-parse": "^3.0.0"
} }
}, },
"verror": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
"integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
"requires": {
"assert-plus": "^1.0.0",
"core-util-is": "1.0.2",
"extsprintf": "^1.2.0"
}
},
"warning": { "warning": {
"version": "4.0.3", "version": "4.0.3",
"resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz",

View File

@ -56,7 +56,7 @@
"meteor-node-stubs": "^1.2.1", "meteor-node-stubs": "^1.2.1",
"postcss-nested": "^5.0.6", "postcss-nested": "^5.0.6",
"mobx": "6.4.2", "mobx": "6.4.2",
"probe-image-size": "^4.1.1", "probe-image-size": "^7.2.3",
"prom-client": "^13.2.0", "prom-client": "^13.2.0",
"prop-types": "^15.8.1", "prop-types": "^15.8.1",
"queue": "^6.0.2", "queue": "^6.0.2",

View File

@ -654,7 +654,7 @@
"app.toast.meetingMuteOn.label": "Alle Teilnehmer wurden stummgeschaltet", "app.toast.meetingMuteOn.label": "Alle Teilnehmer wurden stummgeschaltet",
"app.toast.meetingMuteOff.label": "Konferenz-Stummschaltung ausgeschaltet", "app.toast.meetingMuteOff.label": "Konferenz-Stummschaltung ausgeschaltet",
"app.toast.setEmoji.raiseHand": "Sie haben Ihre Hand gehoben", "app.toast.setEmoji.raiseHand": "Sie haben Ihre Hand gehoben",
"app.toast.setEmoji.lowerHand": "Habe meine Hand gesenkt", "app.toast.setEmoji.lowerHand": "Ihre Hand wurde gesenkt",
"app.toast.promotedLabel": "Zur Moderation ernannt worden", "app.toast.promotedLabel": "Zur Moderation ernannt worden",
"app.toast.demotedLabel": "Nun wieder in der Rolle eine:r Teilnehmer:in", "app.toast.demotedLabel": "Nun wieder in der Rolle eine:r Teilnehmer:in",
"app.notification.recordingStart": "Diese Konferenz wird jetzt aufgezeichnet", "app.notification.recordingStart": "Diese Konferenz wird jetzt aufgezeichnet",

View File

@ -1112,7 +1112,7 @@
"app.layout.modal.confirm": "Confirm", "app.layout.modal.confirm": "Confirm",
"app.layout.modal.cancel": "Cancel", "app.layout.modal.cancel": "Cancel",
"app.layout.modal.layoutLabel": "Select your layout", "app.layout.modal.layoutLabel": "Select your layout",
"app.layout.modal.keepPushingLayoutLabel": "Keep pushing to everyone", "app.layout.modal.keepPushingLayoutLabel": "Push layout to all",
"app.layout.modal.pushLayoutLabel": "Push to everyone", "app.layout.modal.pushLayoutLabel": "Push to everyone",
"app.layout.modal.layoutToastLabel": "Layout settings changed", "app.layout.modal.layoutToastLabel": "Layout settings changed",
"app.layout.modal.layoutSingular": "Layout", "app.layout.modal.layoutSingular": "Layout",

View File

@ -92,3 +92,18 @@ sudo systemctl reload nginx
Meteor messages for Big Blue Button sessions will now be recorded for later review. Meteor messages for Big Blue Button sessions will now be recorded for later review.
It doesn't seem necessary to relay cookies, but that could be done by giving a `--ws-relay-header=Cookie` argument to `websockify`. It doesn't seem necessary to relay cookies, but that could be done by giving a `--ws-relay-header=Cookie` argument to `websockify`.
You can print the browser console log to standard output by setting the environment variable `CONSOLE`:
```
$ CONSOLE= npm test chat -- --project=firefox
```
`CONSOLE` can be blank (as in the example), or can be a comma-separated list of the following options:
| Option | Meaning |
| ------ | ------- |
| color | (or "colour") colorize the output |
| label | label each line with the BigBlueButton user |
| norefs | remove JavaScript reference URLs |
| nots | remove timestamps |
| nocl | remove "clientLogger:" strings |

View File

@ -0,0 +1,125 @@
// const util = require('node:util');
const { expect } = require("@playwright/test");
const Page = require('../core/page');
const parameters = require('../core/parameters');
const { apiCall, createMeeting } = require('../core/helpers');
const e = require('../core/elements');
function getMeetings() {
return apiCall('getMeetings', {});
}
function getMeetingInfo(meetingID) {
return apiCall('getMeetingInfo', {meetingID: meetingID});
}
class API {
constructor(browser, context, page) {
this.modPage = new Page(browser, page);
this.browser = browser;
this.context = context;
this.userPages = [];
}
async getNewPageTab() {
return this.browser.newPage();
}
async testGetMeetings() {
const meetingId = await createMeeting(parameters);
const modPage = new Page(this.browser, await this.getNewPageTab());
const userPage = new Page(this.browser, await this.getNewPageTab());
await Promise.all([
modPage.init(true, false, { meetingId, fullName: 'Moderator' }),
userPage.init(false, false, { meetingId, fullName: 'Attendee' }),
]);
await Promise.all([
modPage.joinMicrophone(),
userPage.joinMicrophone()
]);
/* hasJoinedVoice: ['true'] is not part of these expectedUser patterns because it isn't consistently true
* in the API's returned data structures. Is there something we can await on the browser page that
* should ensure that the API will report hasJoinedVoice?
*/
const expectedUsers = [expect.objectContaining({fullName: ['Moderator'],
role: ['MODERATOR'],
isPresenter: ['true'],
}),
expect.objectContaining({fullName: ['Attendee'],
role: ['VIEWER'],
isPresenter: ['false'],
})
];
const expectedMeeting = {meetingName : [meetingId],
running : ['true'],
participantCount : ['2'],
moderatorCount : ['1'],
isBreakout: ['false'],
attendees: [{ attendee: expect.arrayContaining(expectedUsers) }]
};
/* check that this meeting is in the server's list of all meetings */
const response = await getMeetings();
expect(response.response.returncode).toEqual(['SUCCESS']);
expect(response.response.meetings[0].meeting).toContainEqual(expect.objectContaining(expectedMeeting));
await modPage.page.close();
await userPage.page.close();
}
async testGetMeetingInfo() {
const meetingId = await createMeeting(parameters);
const modPage = new Page(this.browser, await this.getNewPageTab());
const userPage = new Page(this.browser, await this.getNewPageTab());
await Promise.all([
modPage.init(true, false, { meetingId, fullName: 'Moderator' }),
userPage.init(false, false, { meetingId, fullName: 'Attendee' }),
]);
await Promise.all([
modPage.joinMicrophone(),
userPage.joinMicrophone()
]);
/* hasJoinedVoice: ['true'] is not part of these expectedUser patterns because it isn't consistently true
* in the API's returned data structures. Is there something we can await on the browser page that
* should ensure that the API will report hasJoinedVoice?
*/
const expectedUsers = [expect.objectContaining({fullName: ['Moderator'],
role: ['MODERATOR'],
isPresenter: ['true'],
}),
expect.objectContaining({fullName: ['Attendee'],
role: ['VIEWER'],
isPresenter: ['false'],
})
];
const expectedMeeting = {meetingName : [meetingId],
running : ['true'],
participantCount : ['2'],
moderatorCount : ['1'],
isBreakout: ['false'],
attendees: [{ attendee: expect.arrayContaining(expectedUsers) }]
};
/* check that we can retrieve this meeting by its meetingId */
const response2 = await getMeetingInfo(meetingId);
expect(response2.response.returncode).toEqual(['SUCCESS']);
expect(response2.response).toMatchObject(expectedMeeting);
/* check that we can retrieve this meeting by its internal meeting ID */
const response3 = await getMeetingInfo(response2.response.internalMeetingID[0]);
expect(response3.response.returncode).toEqual(['SUCCESS']);
expect(response3.response).toMatchObject(expectedMeeting);
await modPage.page.close();
await userPage.page.close();
}
}
exports.API = API;

View File

@ -0,0 +1,16 @@
const { test } = require('@playwright/test');
const { API } = require('./api.js');
test.describe.parallel('API', () => {
test('getMeetings', async ({ browser, context, page }) => {
const api = new API(browser, context, page);
await api.testGetMeetings();
});
test('getMeetingInfo', async ({ browser, context, page }) => {
const api = new API(browser, context, page);
await api.testGetMeetingInfo();
});
});

View File

@ -2,6 +2,11 @@ require('dotenv').config();
const sha1 = require('sha1'); const sha1 = require('sha1');
const axios = require('axios'); const axios = require('axios');
const { test } = require('@playwright/test'); const { test } = require('@playwright/test');
const xml2js = require('xml2js');
const { expect } = require("@playwright/test");
const parameters = require('./parameters');
function getRandomInt(min, max) { function getRandomInt(min, max) {
min = Math.ceil(min); min = Math.ceil(min);
@ -9,8 +14,21 @@ function getRandomInt(min, max) {
return Math.floor(Math.random() * (max - min)) + min; return Math.floor(Math.random() * (max - min)) + min;
} }
async function createMeeting(params, customParameter, customMeetingId) { function apiCallUrl(name, callParams) {
const meetingID = (customMeetingId) ? customMeetingId : `random-${getRandomInt(1000000, 10000000).toString()}`; const query = new URLSearchParams(callParams).toString();
const apicall = `${name}${query}${parameters.secret}`;
const checksum = sha1(apicall);
const url = `${parameters.server}/${name}?${query}&checksum=${checksum}`;
return url;
}
function apiCall(name, callParams) {
const url = apiCallUrl(name, callParams);
return axios.get(url, { adapter: 'http' }).then(response => xml2js.parseStringPromise(response.data));
}
function createMeetingUrl(params, customParameter) {
const meetingID = `random-${getRandomInt(1000000, 10000000).toString()}`;
const mp = params.moderatorPW; const mp = params.moderatorPW;
const ap = params.attendeePW; const ap = params.attendeePW;
const query = customParameter !== undefined ? `name=${meetingID}&meetingID=${meetingID}&attendeePW=${ap}&moderatorPW=${mp}` const query = customParameter !== undefined ? `name=${meetingID}&meetingID=${meetingID}&attendeePW=${ap}&moderatorPW=${mp}`
@ -20,8 +38,20 @@ async function createMeeting(params, customParameter, customMeetingId) {
const apicall = `create${query}${params.secret}`; const apicall = `create${query}${params.secret}`;
const checksum = sha1(apicall); const checksum = sha1(apicall);
const url = `${params.server}/create?${query}&checksum=${checksum}`; const url = `${params.server}/create?${query}&checksum=${checksum}`;
await axios.get(url, { adapter: 'http' }); return url;
return meetingID; }
function createMeetingPromise(params, customParameter) {
const url = createMeetingUrl(params, customParameter);
return axios.get(url, { adapter: 'http' });
}
async function createMeeting(params, customParameter) {
const promise = createMeetingPromise(params, customParameter);
const response = await promise;
expect(response.status).toEqual(200);
const xmlresponse = await xml2js.parseStringPromise(response.data);
return xmlresponse.response.meetingID[0];
} }
function getJoinURL(meetingID, params, moderator, customParameter) { function getJoinURL(meetingID, params, moderator, customParameter) {
@ -47,6 +77,10 @@ function sleep(time) {
} }
exports.getRandomInt = getRandomInt; exports.getRandomInt = getRandomInt;
exports.apiCallUrl = apiCallUrl;
exports.apiCall = apiCall;
exports.createMeetingUrl = createMeetingUrl;
exports.createMeetingPromise = createMeetingPromise;
exports.createMeeting = createMeeting; exports.createMeeting = createMeeting;
exports.getJoinURL = getJoinURL; exports.getJoinURL = getJoinURL;
exports.linkIssue = linkIssue; exports.linkIssue = linkIssue;

View File

@ -1,13 +1,86 @@
require('dotenv').config(); require('dotenv').config();
const { expect, default: test } = require('@playwright/test'); const { expect, default: test } = require('@playwright/test');
const { readFileSync } = require('fs'); const { readFileSync } = require('fs');
const { format } = require('node:util');
// This is version 4 of chalk, not version 5, which uses ESM
const chalk = require('chalk');
const parameters = require('./parameters'); const parameters = require('./parameters');
const helpers = require('./helpers'); const helpers = require('./helpers');
const e = require('./elements'); const e = require('./elements');
const { env } = require('node:process');
const { ELEMENT_WAIT_TIME, ELEMENT_WAIT_LONGER_TIME, VIDEO_LOADING_WAIT_TIME } = require('./constants'); const { ELEMENT_WAIT_TIME, ELEMENT_WAIT_LONGER_TIME, VIDEO_LOADING_WAIT_TIME } = require('./constants');
const { checkElement, checkElementLengthEqualTo } = require('./util'); const { checkElement, checkElementLengthEqualTo } = require('./util');
const { generateSettingsData, getSettings } = require('./settings'); const { generateSettingsData, getSettings } = require('./settings');
function formatWithCss(CONSOLE_options, ...args) {
// For Chrome, args[0] is a format string that we will process using
// node.js's util.format, but that function discards css style
// information from "%c" format specifiers. So first loop over the
// format string, replacing every "%c" with "%s" and replacing the
// corresponding css style with an ANSI color sequence.
//
// See https://console.spec.whatwg.org/ sections 2.2.1 and 2.3.4
let split_arg0 = args[0].split("%");
for (let i=1, j=1; i<split_arg0.length; i++, j++) {
if (split_arg0[i].startsWith('c')) {
split_arg0[i] = 's' + split_arg0[i].substr(1);
const styles = args[j].split(';');
args[j] = '';
for (const style of styles) {
const stdStyle = style.trim().toLowerCase();
if (stdStyle.startsWith('color:') && CONSOLE_options.colorize) {
const color = stdStyle.substr(6).trim();
args[j] = chalk.keyword(color)._styler.open;
} else if (stdStyle.startsWith('font-size:') && CONSOLE_options.drop_references) {
// For Chrome, we "drop references" by discarding everything after a font size change
split_arg0.length = i;
args.length = j;
}
}
} else if (split_arg0[i] == "") {
// format is "%%", so don't do special processing for
// split_arg0[i+1], and only increment i, not j
i ++; // NOSONAR
}
}
args[0] = split_arg0.join('%');
return format(...args);
}
async function console_format(msg, CONSOLE_options) {
// see playwright consoleMessage class documentation
const args = await Promise.all(msg.args().map(itm => itm.jsonValue()));
let result = formatWithCss(CONSOLE_options, ...args);
if (CONSOLE_options.drop_references) {
// For Firefox, we "drop references" by discarding a URL at the end of the line
result = result.replace(/https:\/\/\S*$/, '');
}
if (CONSOLE_options.noClientLogger) {
result = result.replace(/clientLogger: /, '');
}
if (CONSOLE_options.drop_timestamps) {
// timestamp formatting is a bit complicated, with four "%s" fields and corresponding arguments,
// so just filter them out (if requested) after all the other formatting is done
result = result.replace(/\[\d\d:\d\d:\d\d:\d\d\d\d\] /, '');
}
if (CONSOLE_options.line_label) {
if (CONSOLE_options.colorize) {
result = chalk.keyword('green')(CONSOLE_options.line_label) + result;
} else {
result = CONSOLE_options.line_label + result;
}
}
return result;
}
class Page { class Page {
constructor(browser, page) { constructor(browser, page) {
this.browser = browser; this.browser = browser;
@ -31,7 +104,19 @@ class Page {
if (fullName) this.initParameters.fullName = fullName; if (fullName) this.initParameters.fullName = fullName;
this.username = this.initParameters.fullName; this.username = this.initParameters.fullName;
this.meetingId = (meetingId) ? meetingId : await helpers.createMeeting(parameters, customParameter, customMeetingId); if (env.CONSOLE !== undefined) {
const CONSOLE_strings = env.CONSOLE.split(',').map(opt => opt.trim().toLowerCase());
const CONSOLE_options = {
colorize: CONSOLE_strings.includes('color') || CONSOLE_strings.includes('colour'),
drop_references: CONSOLE_strings.includes('norefs'),
drop_timestamps: CONSOLE_strings.includes('nots'),
line_label: CONSOLE_strings.includes('label') ? this.username + " " : undefined,
noClientLogger: CONSOLE_strings.includes('nocl') || CONSOLE_strings.includes('noclientlogger'),
};
this.page.on('console', async (msg) => console.log(await console_format(msg, CONSOLE_options)));
}
this.meetingId = (meetingId) ? meetingId : await helpers.createMeeting(parameters, customParameter);
const joinUrl = helpers.getJoinURL(this.meetingId, this.initParameters, isModerator, customParameter); const joinUrl = helpers.getJoinURL(this.meetingId, this.initParameters, isModerator, customParameter);
const response = await this.page.goto(joinUrl); const response = await this.page.goto(joinUrl);
await expect(response.ok()).toBeTruthy(); await expect(response.ok()).toBeTruthy();

View File

@ -7,9 +7,11 @@
"dependencies": { "dependencies": {
"@playwright/test": "^1.28.1", "@playwright/test": "^1.28.1",
"axios": "^1.2.0", "axios": "^1.2.0",
"chalk": "^4.1.2",
"dotenv": "^16.0.0", "dotenv": "^16.0.0",
"playwright": "^1.28.1", "playwright": "^1.28.1",
"sha1": "^1.1.1" "sha1": "^1.1.1",
"xml2js": "^0.4.23"
} }
}, },
"node_modules/@playwright/test": { "node_modules/@playwright/test": {
@ -28,9 +30,23 @@
} }
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "18.11.9", "version": "18.11.15",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.15.tgz",
"integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==" "integrity": "sha512-VkhBbVo2+2oozlkdHXLrb3zjsRkpdnaU2bXmX8Wgle3PUi569eLRaHGlgETQHR7lLL1w7GiG3h9SnePhxNDecw=="
},
"node_modules/ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
}, },
"node_modules/asynckit": { "node_modules/asynckit": {
"version": "0.4.0", "version": "0.4.0",
@ -38,15 +54,30 @@
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
}, },
"node_modules/axios": { "node_modules/axios": {
"version": "1.2.0", "version": "1.2.1",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.2.0.tgz", "resolved": "https://registry.npmjs.org/axios/-/axios-1.2.1.tgz",
"integrity": "sha512-zT7wZyNYu3N5Bu0wuZ6QccIf93Qk1eV8LOewxgjOZFd2DenOs98cJ7+Y6703d0wkaXGY6/nZd4EweJaHz9uzQw==", "integrity": "sha512-I88cFiGu9ryt/tfVEi4kX2SITsvDddTajXTOFmt2uK1ZVA8LytjtdeyefdQWEf5PU8w+4SSJDoYnggflB5tW4A==",
"dependencies": { "dependencies": {
"follow-redirects": "^1.15.0", "follow-redirects": "^1.15.0",
"form-data": "^4.0.0", "form-data": "^4.0.0",
"proxy-from-env": "^1.1.0" "proxy-from-env": "^1.1.0"
} }
}, },
"node_modules/chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/charenc": { "node_modules/charenc": {
"version": "0.0.2", "version": "0.0.2",
"resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz",
@ -55,6 +86,22 @@
"node": "*" "node": "*"
} }
}, },
"node_modules/color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dependencies": {
"color-name": "~1.1.4"
},
"engines": {
"node": ">=7.0.0"
}
},
"node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
},
"node_modules/combined-stream": { "node_modules/combined-stream": {
"version": "1.0.8", "version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
@ -122,6 +169,14 @@
"node": ">= 6" "node": ">= 6"
} }
}, },
"node_modules/has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"engines": {
"node": ">=8"
}
},
"node_modules/mime-db": { "node_modules/mime-db": {
"version": "1.52.0", "version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
@ -172,6 +227,11 @@
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
}, },
"node_modules/sax": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
"integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
},
"node_modules/sha1": { "node_modules/sha1": {
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz", "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz",
@ -183,6 +243,37 @@
"engines": { "engines": {
"node": "*" "node": "*"
} }
},
"node_modules/supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/xml2js": {
"version": "0.4.23",
"resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz",
"integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==",
"dependencies": {
"sax": ">=0.6.0",
"xmlbuilder": "~11.0.0"
},
"engines": {
"node": ">=4.0.0"
}
},
"node_modules/xmlbuilder": {
"version": "11.0.1",
"resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
"integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==",
"engines": {
"node": ">=4.0"
}
} }
}, },
"dependencies": { "dependencies": {
@ -196,9 +287,17 @@
} }
}, },
"@types/node": { "@types/node": {
"version": "18.11.9", "version": "18.11.15",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.15.tgz",
"integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==" "integrity": "sha512-VkhBbVo2+2oozlkdHXLrb3zjsRkpdnaU2bXmX8Wgle3PUi569eLRaHGlgETQHR7lLL1w7GiG3h9SnePhxNDecw=="
},
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"requires": {
"color-convert": "^2.0.1"
}
}, },
"asynckit": { "asynckit": {
"version": "0.4.0", "version": "0.4.0",
@ -206,20 +305,42 @@
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
}, },
"axios": { "axios": {
"version": "1.2.0", "version": "1.2.1",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.2.0.tgz", "resolved": "https://registry.npmjs.org/axios/-/axios-1.2.1.tgz",
"integrity": "sha512-zT7wZyNYu3N5Bu0wuZ6QccIf93Qk1eV8LOewxgjOZFd2DenOs98cJ7+Y6703d0wkaXGY6/nZd4EweJaHz9uzQw==", "integrity": "sha512-I88cFiGu9ryt/tfVEi4kX2SITsvDddTajXTOFmt2uK1ZVA8LytjtdeyefdQWEf5PU8w+4SSJDoYnggflB5tW4A==",
"requires": { "requires": {
"follow-redirects": "^1.15.0", "follow-redirects": "^1.15.0",
"form-data": "^4.0.0", "form-data": "^4.0.0",
"proxy-from-env": "^1.1.0" "proxy-from-env": "^1.1.0"
} }
}, },
"chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
}
},
"charenc": { "charenc": {
"version": "0.0.2", "version": "0.0.2",
"resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz",
"integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==" "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA=="
}, },
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"requires": {
"color-name": "~1.1.4"
}
},
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
},
"combined-stream": { "combined-stream": {
"version": "1.0.8", "version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
@ -258,6 +379,11 @@
"mime-types": "^2.1.12" "mime-types": "^2.1.12"
} }
}, },
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
},
"mime-db": { "mime-db": {
"version": "1.52.0", "version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
@ -289,6 +415,11 @@
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
}, },
"sax": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
"integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
},
"sha1": { "sha1": {
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz", "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz",
@ -297,6 +428,28 @@
"charenc": ">= 0.0.1", "charenc": ">= 0.0.1",
"crypt": ">= 0.0.1" "crypt": ">= 0.0.1"
} }
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"requires": {
"has-flag": "^4.0.0"
}
},
"xml2js": {
"version": "0.4.23",
"resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz",
"integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==",
"requires": {
"sax": ">=0.6.0",
"xmlbuilder": "~11.0.0"
}
},
"xmlbuilder": {
"version": "11.0.1",
"resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
"integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="
} }
} }
} }

View File

@ -12,6 +12,8 @@
"axios": "^1.2.0", "axios": "^1.2.0",
"dotenv": "^16.0.0", "dotenv": "^16.0.0",
"playwright": "^1.28.1", "playwright": "^1.28.1",
"sha1": "^1.1.1" "chalk": "^4.1.2",
"sha1": "^1.1.1",
"xml2js": "^0.4.23"
} }
} }

View File

@ -1,4 +1,4 @@
. ./opts-global.sh . ./opts-global.sh
AKKA_APPS="bbb-fsesl-akka,bbb-apps-akka" AKKA_APPS="bbb-fsesl-akka,bbb-apps-akka"
OPTS="$OPTS -t deb -d netcat-openbsd,bbb-html5,bbb-playback-presentation,bbb-playback,bbb-freeswitch-core,$AKKA_APPS" OPTS="$OPTS -t deb -d netcat-openbsd,stun-client,bbb-html5,bbb-playback-presentation,bbb-playback,bbb-freeswitch-core,$AKKA_APPS"

View File

@ -7,7 +7,7 @@ PACKAGE=$(echo $TARGET | cut -d'_' -f1)
VERSION=$(echo $TARGET | cut -d'_' -f2) VERSION=$(echo $TARGET | cut -d'_' -f2)
DISTRO=$(echo $TARGET | cut -d'_' -f3) DISTRO=$(echo $TARGET | cut -d'_' -f3)
NODE_VERSION="14.19.3" NODE_VERSION="14.21.1"
NODE_DIRNAME="node-v${NODE_VERSION}-linux-x64" NODE_DIRNAME="node-v${NODE_VERSION}-linux-x64"
# #