2023-07-04 20:50:53 +08:00
|
|
|
import { throttle } from 'radash';
|
2022-05-16 03:48:05 +08:00
|
|
|
import Pads, { PadsSessions, PadsUpdates } from '/imports/api/pads';
|
2021-10-16 03:07:13 +08:00
|
|
|
import { makeCall } from '/imports/ui/services/api';
|
|
|
|
import Auth from '/imports/ui/services/auth';
|
|
|
|
import Settings from '/imports/ui/services/settings';
|
2022-10-24 21:11:28 +08:00
|
|
|
import {
|
|
|
|
screenshareHasEnded,
|
2023-06-02 04:04:31 +08:00
|
|
|
isScreenBroadcasting,
|
2022-10-24 21:11:28 +08:00
|
|
|
} from '/imports/ui/components/screenshare/service';
|
2021-10-16 03:07:13 +08:00
|
|
|
|
2024-03-07 01:28:18 +08:00
|
|
|
const PADS_CONFIG = window.meetingClientSettings.public.pads;
|
2022-04-07 21:26:59 +08:00
|
|
|
const THROTTLE_TIMEOUT = 2000;
|
2021-10-16 03:07:13 +08:00
|
|
|
|
|
|
|
const getLang = () => {
|
|
|
|
const { locale } = Settings.application;
|
|
|
|
return locale ? locale.toLowerCase() : '';
|
|
|
|
};
|
|
|
|
|
|
|
|
const getParams = () => {
|
|
|
|
const config = {};
|
|
|
|
config.lang = getLang();
|
|
|
|
config.rtl = document.documentElement.getAttribute('dir') === 'rtl';
|
|
|
|
|
|
|
|
const params = Object.keys(config)
|
|
|
|
.map((key) => `${key}=${encodeURIComponent(config[key])}`)
|
|
|
|
.join('&');
|
|
|
|
return params;
|
|
|
|
};
|
|
|
|
|
|
|
|
const getPadId = (externalId) => makeCall('getPadId', externalId);
|
|
|
|
|
|
|
|
const createGroup = (externalId, model, name) => makeCall('createGroup', externalId, model, name);
|
|
|
|
|
|
|
|
const hasPad = (externalId) => {
|
|
|
|
const pad = Pads.findOne(
|
|
|
|
{
|
|
|
|
meetingId: Auth.meetingID,
|
|
|
|
externalId,
|
|
|
|
},
|
|
|
|
);
|
|
|
|
|
|
|
|
return pad !== undefined;
|
|
|
|
};
|
|
|
|
|
|
|
|
const createSession = (externalId) => makeCall('createSession', externalId);
|
|
|
|
|
2023-07-04 20:50:53 +08:00
|
|
|
const throttledCreateSession = throttle({ interval: THROTTLE_TIMEOUT }, createSession);
|
2022-04-07 21:26:59 +08:00
|
|
|
|
2021-10-16 03:07:13 +08:00
|
|
|
const buildPadURL = (padId) => {
|
|
|
|
if (padId) {
|
2022-05-16 03:48:05 +08:00
|
|
|
const padsSessions = PadsSessions.findOne({});
|
|
|
|
if (padsSessions && padsSessions.sessions) {
|
|
|
|
const params = getParams();
|
2023-07-04 20:50:53 +08:00
|
|
|
const sessionIds = padsSessions.sessions.map((session) => Object.values(session)).join(',');
|
2022-05-16 03:48:05 +08:00
|
|
|
const url = Auth.authenticateURL(`${PADS_CONFIG.url}/auth_session?padName=${padId}&sessionID=${sessionIds}&${params}`);
|
|
|
|
return url;
|
|
|
|
}
|
2021-10-16 03:07:13 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
return null;
|
|
|
|
};
|
|
|
|
|
|
|
|
const getRev = (externalId) => {
|
|
|
|
const updates = PadsUpdates.findOne(
|
|
|
|
{
|
|
|
|
meetingId: Auth.meetingID,
|
|
|
|
externalId,
|
|
|
|
}, { fields: { rev: 1 } },
|
|
|
|
);
|
|
|
|
|
|
|
|
return updates ? updates.rev : 0;
|
|
|
|
};
|
|
|
|
|
|
|
|
const getPadTail = (externalId) => {
|
|
|
|
const updates = PadsUpdates.findOne(
|
|
|
|
{
|
|
|
|
meetingId: Auth.meetingID,
|
|
|
|
externalId,
|
|
|
|
}, { fields: { tail: 1 } },
|
|
|
|
);
|
|
|
|
|
|
|
|
if (updates && updates.tail) return updates.tail;
|
|
|
|
|
|
|
|
return '';
|
|
|
|
};
|
|
|
|
|
|
|
|
const getPadContent = (externalId) => {
|
|
|
|
const updates = PadsUpdates.findOne(
|
|
|
|
{
|
|
|
|
meetingId: Auth.meetingID,
|
|
|
|
externalId,
|
|
|
|
}, { fields: { content: 1 } },
|
|
|
|
);
|
|
|
|
|
|
|
|
if (updates && updates.content) return updates.content;
|
|
|
|
|
|
|
|
return '';
|
|
|
|
};
|
|
|
|
|
2022-10-24 21:11:28 +08:00
|
|
|
const getPinnedPad = () => {
|
|
|
|
const pad = Pads.findOne({
|
|
|
|
meetingId: Auth.meetingID,
|
|
|
|
pinned: true,
|
|
|
|
}, {
|
|
|
|
fields: {
|
|
|
|
externalId: 1,
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
return pad;
|
|
|
|
};
|
|
|
|
|
2024-01-20 02:40:27 +08:00
|
|
|
const pinPad = (externalId, pinned, stopWatching) => {
|
2022-10-24 21:11:28 +08:00
|
|
|
if (pinned) {
|
|
|
|
// Stop external video sharing if it's running.
|
2024-03-25 23:19:25 +08:00
|
|
|
if (typeof stopWatching === 'function') stopWatching();
|
2022-10-24 21:11:28 +08:00
|
|
|
|
|
|
|
// Stop screen sharing if it's running.
|
2023-06-02 04:04:31 +08:00
|
|
|
if (isScreenBroadcasting()) screenshareHasEnded();
|
2022-10-24 21:11:28 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
makeCall('pinPad', externalId, pinned);
|
|
|
|
};
|
|
|
|
|
2023-07-13 03:58:39 +08:00
|
|
|
const throttledPinPad = throttle({ interval: 1000 }, pinPad);
|
2022-10-24 21:11:28 +08:00
|
|
|
|
2021-10-16 03:07:13 +08:00
|
|
|
export default {
|
|
|
|
getPadId,
|
|
|
|
createGroup,
|
|
|
|
hasPad,
|
2022-04-07 21:26:59 +08:00
|
|
|
createSession: (externalId) => throttledCreateSession(externalId),
|
2021-10-16 03:07:13 +08:00
|
|
|
buildPadURL,
|
|
|
|
getRev,
|
|
|
|
getPadTail,
|
|
|
|
getPadContent,
|
2022-03-15 23:02:54 +08:00
|
|
|
getParams,
|
2022-10-24 21:11:28 +08:00
|
|
|
getPinnedPad,
|
|
|
|
pinPad: throttledPinPad,
|
2021-10-16 03:07:13 +08:00
|
|
|
};
|