@newtonschool/react_proctoring_library 0.0.14 → 0.0.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/ProctorApp.js +57 -34
- package/dist/components/activity-tracker/index.js +9 -11
- package/dist/components/permissions/index.js +9 -4
- package/dist/components/permissions/permission-body.js +1 -1
- package/dist/constants/text.js +6 -4
- package/dist/utils/breachUtils.js +1 -6
- package/dist/utils/index.js +26 -0
- package/dist/utils/webcamMicrophoneUtils.js +39 -10
- package/package.json +2 -1
|
@@ -7,6 +7,8 @@ exports.default = exports.ProctorApp = void 0;
|
|
|
7
7
|
|
|
8
8
|
require("core-js/modules/web.dom-collections.iterator.js");
|
|
9
9
|
|
|
10
|
+
require("core-js/modules/es.promise.js");
|
|
11
|
+
|
|
10
12
|
var _react = _interopRequireWildcard(require("react"));
|
|
11
13
|
|
|
12
14
|
var _ = require(".");
|
|
@@ -23,12 +25,20 @@ var _useWebcamData = _interopRequireDefault(require("../hooks/useWebcamData"));
|
|
|
23
25
|
|
|
24
26
|
var _breachUtils = require("../utils/breachUtils");
|
|
25
27
|
|
|
28
|
+
var _webcamMicrophoneUtils = require("../utils/webcamMicrophoneUtils");
|
|
29
|
+
|
|
26
30
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
27
31
|
|
|
28
32
|
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
29
33
|
|
|
30
34
|
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
31
35
|
|
|
36
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
37
|
+
|
|
38
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
39
|
+
|
|
40
|
+
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
41
|
+
|
|
32
42
|
const isWebcamProcessingReliable = (0, _utils.isGPUAvailable)();
|
|
33
43
|
|
|
34
44
|
const ProctorApp = _ref => {
|
|
@@ -42,31 +52,31 @@ const ProctorApp = _ref => {
|
|
|
42
52
|
} = _ref;
|
|
43
53
|
const webcamReference = (0, _react.useRef)(null);
|
|
44
54
|
const canvasReference = (0, _react.useRef)(null);
|
|
55
|
+
const screenshareReference = (0, _react.useRef)(null);
|
|
45
56
|
const statistics = (0, _react.useRef)(_defaults.INITIAL_STATISTICS);
|
|
57
|
+
|
|
58
|
+
const proctorParams = _objectSpread(_objectSpread({}, {
|
|
59
|
+
people: true,
|
|
60
|
+
tabSwitch: true,
|
|
61
|
+
fullscreenExit: true,
|
|
62
|
+
lookedAway: true
|
|
63
|
+
}), config.proctorParams);
|
|
64
|
+
|
|
46
65
|
const {
|
|
47
|
-
proctorParams,
|
|
48
66
|
recurring = false,
|
|
49
|
-
recurringFetchInterval = 0
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
// fullscreenExit = true,
|
|
55
|
-
// lookedAway = true,
|
|
56
|
-
// } = proctorParams;
|
|
57
|
-
|
|
58
|
-
const [audioPermission, setAudioPermission] = (0, _react.useState)(false);
|
|
59
|
-
const [videoPermission, setVideoPermission] = (0, _react.useState)(false);
|
|
60
|
-
const [screensharePermission, setScreensharePermission] = (0, _react.useState)(!trackScreenshare);
|
|
67
|
+
recurringFetchInterval = 0
|
|
68
|
+
} = config;
|
|
69
|
+
const [audioPermission, setAudioPermission] = (0, _react.useState)();
|
|
70
|
+
const [videoPermission, setVideoPermission] = (0, _react.useState)();
|
|
71
|
+
const [screensharePermission, setScreensharePermission] = (0, _react.useState)();
|
|
61
72
|
const firstFullScreenDone = (0, _react.useRef)(false);
|
|
62
|
-
const
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
let recurringFetchIntervalRef = (0, _react.useRef)(null);
|
|
73
|
+
const recurringFetchIntervalRef = (0, _react.useRef)(null);
|
|
74
|
+
const sendScreengrab = (0, _react.useCallback)(async function () {
|
|
75
|
+
let isBreach = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
|
76
|
+
let breachData = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
77
|
+
const screenshot = await (0, _webcamMicrophoneUtils.captureScreenshot)();
|
|
78
|
+
getScreengrab(proctoringIdentifier, screenshot, isBreach, breachData.breachedParam);
|
|
79
|
+
}, [getScreengrab, proctoringIdentifier]);
|
|
70
80
|
(0, _react.useEffect)(() => {
|
|
71
81
|
if (recurring) {
|
|
72
82
|
recurringFetchIntervalRef.current = setInterval(() => {
|
|
@@ -76,13 +86,22 @@ const ProctorApp = _ref => {
|
|
|
76
86
|
if (webcamReference) {
|
|
77
87
|
getWebcamSnapshot(proctoringIdentifier, webcamSnapshot, false);
|
|
78
88
|
}
|
|
89
|
+
|
|
90
|
+
sendScreengrab();
|
|
79
91
|
}, recurringFetchInterval);
|
|
80
92
|
}
|
|
81
93
|
|
|
82
94
|
return () => {
|
|
83
95
|
clearInterval(recurringFetchIntervalRef.current);
|
|
84
96
|
};
|
|
85
|
-
}, [
|
|
97
|
+
}, [recurring, recurringFetchInterval, proctoringIdentifier, getWebcamSnapshot, getProctorParamValues, sendScreengrab]);
|
|
98
|
+
const {
|
|
99
|
+
isFullscreen,
|
|
100
|
+
setFullscreen,
|
|
101
|
+
fullScreenExitCount
|
|
102
|
+
} = (0, _hooks.useFullscreenData)(firstFullScreenDone);
|
|
103
|
+
const [userCount, lookedAwayCount] = (0, _useWebcamData.default)(webcamReference, canvasReference);
|
|
104
|
+
const tabSwitchCount = (0, _hooks.useTabSwitchCount)(firstFullScreenDone);
|
|
86
105
|
(0, _react.useEffect)(() => {
|
|
87
106
|
const currentStats = {
|
|
88
107
|
userCount,
|
|
@@ -91,7 +110,7 @@ const ProctorApp = _ref => {
|
|
|
91
110
|
lookedAwayCount,
|
|
92
111
|
isWebcamDataReliable: isWebcamProcessingReliable
|
|
93
112
|
};
|
|
94
|
-
const breachData = (0, _breachUtils.getDataOnBreach)(statistics, currentStats
|
|
113
|
+
const breachData = (0, _breachUtils.getDataOnBreach)(statistics, currentStats);
|
|
95
114
|
|
|
96
115
|
if (breachData) {
|
|
97
116
|
getProctorParamValues(breachData.proctoringIdentifier, breachData.data, true, breachData.breachedParam);
|
|
@@ -100,35 +119,39 @@ const ProctorApp = _ref => {
|
|
|
100
119
|
const webcamSnapshot = (0, _utils.captureWebcamSnapshot)(webcamReference);
|
|
101
120
|
|
|
102
121
|
if (webcamSnapshot) {
|
|
103
|
-
getWebcamSnapshot(
|
|
122
|
+
getWebcamSnapshot(proctoringIdentifier, webcamSnapshot, true, breachData.breachedParam);
|
|
104
123
|
}
|
|
105
|
-
} else {
|
|
124
|
+
} else {
|
|
125
|
+
sendScreengrab(true, breachData);
|
|
106
126
|
}
|
|
107
|
-
|
|
108
|
-
(0, _utils.updateStatistics)(statistics, currentStats);
|
|
109
127
|
}
|
|
110
|
-
|
|
128
|
+
|
|
129
|
+
(0, _utils.updateStatistics)(statistics, currentStats);
|
|
130
|
+
}, [userCount, tabSwitchCount, fullScreenExitCount, lookedAwayCount, getProctorParamValues, getWebcamSnapshot, sendScreengrab, proctoringIdentifier]);
|
|
131
|
+
const updateScreensharePermission = (0, _react.useCallback)(() => {
|
|
132
|
+
(0, _webcamMicrophoneUtils.setupScreensharePermission)(setScreensharePermission, screenshareReference);
|
|
133
|
+
}, []);
|
|
111
134
|
|
|
112
135
|
if (proctoringIdentifier === undefined) {
|
|
113
136
|
// todo
|
|
114
137
|
return;
|
|
115
138
|
}
|
|
116
139
|
|
|
117
|
-
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_permissions.Permission, {
|
|
140
|
+
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, isFullscreen && audioPermission && videoPermission && screensharePermission && children, /*#__PURE__*/_react.default.createElement(_permissions.Permission, {
|
|
118
141
|
isFullscreen: isFullscreen,
|
|
119
142
|
audioPermisison: audioPermission,
|
|
120
143
|
videoPermission: videoPermission,
|
|
144
|
+
setFullscreen: setFullscreen,
|
|
121
145
|
screensharePermission: screensharePermission,
|
|
122
|
-
|
|
123
|
-
setFullscreen: setFullscreen
|
|
146
|
+
updateScreensharePermission: updateScreensharePermission
|
|
124
147
|
}), /*#__PURE__*/_react.default.createElement(_.ActivityTracker, {
|
|
125
148
|
setAudioPermission: setAudioPermission,
|
|
126
149
|
setVideoPermission: setVideoPermission,
|
|
127
150
|
webcamReference: webcamReference,
|
|
128
151
|
canvasReference: canvasReference,
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
})
|
|
152
|
+
screenshareReference: screenshareReference,
|
|
153
|
+
updateScreensharePermission: updateScreensharePermission
|
|
154
|
+
}));
|
|
132
155
|
};
|
|
133
156
|
|
|
134
157
|
exports.ProctorApp = ProctorApp;
|
|
@@ -35,19 +35,14 @@ const ActivityTracker = _ref => {
|
|
|
35
35
|
canvasReference,
|
|
36
36
|
setAudioPermission,
|
|
37
37
|
setVideoPermission,
|
|
38
|
-
|
|
39
|
-
|
|
38
|
+
updateScreensharePermission,
|
|
39
|
+
screenshareReference
|
|
40
40
|
} = _ref;
|
|
41
|
-
const videoReference = (0, _react.useRef)(null);
|
|
42
41
|
(0, _react.useEffect)(() => {
|
|
43
42
|
if (isChrome) {
|
|
44
43
|
(0, _webcamMicrophoneUtils.updateVideoPermissions)(setVideoPermission);
|
|
45
44
|
(0, _webcamMicrophoneUtils.updateAudioPermissions)(setAudioPermission);
|
|
46
|
-
|
|
47
|
-
if (trackScreenshare) {
|
|
48
|
-
(0, _webcamMicrophoneUtils.updateScreensharePermission)(setScreensharePermission, videoReference);
|
|
49
|
-
}
|
|
50
|
-
|
|
45
|
+
updateScreensharePermission();
|
|
51
46
|
(0, _webcamMicrophoneUtils.getVideoPermissionQuery)().then(status => {
|
|
52
47
|
status.onchange = evt => {
|
|
53
48
|
(0, _webcamMicrophoneUtils.updateVideoPermissions)(setVideoPermission);
|
|
@@ -63,7 +58,7 @@ const ActivityTracker = _ref => {
|
|
|
63
58
|
(0, _webcamMicrophoneUtils.updateAudioPermissions)("Audio Permission", err);
|
|
64
59
|
});
|
|
65
60
|
}
|
|
66
|
-
}, [setVideoPermission, setAudioPermission,
|
|
61
|
+
}, [setVideoPermission, setAudioPermission, updateScreensharePermission]);
|
|
67
62
|
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_reactWebcam.default, {
|
|
68
63
|
audio: true,
|
|
69
64
|
muted: true,
|
|
@@ -145,9 +140,12 @@ const ActivityTracker = _ref => {
|
|
|
145
140
|
className: "captured-video-canvas"
|
|
146
141
|
}), /*#__PURE__*/_react.default.createElement("canvas", {
|
|
147
142
|
ref: canvasReference,
|
|
148
|
-
className: "captured-video-canvas"
|
|
143
|
+
className: "captured-video-canvas",
|
|
144
|
+
id: "wc-ref"
|
|
149
145
|
}), /*#__PURE__*/_react.default.createElement("video", {
|
|
150
|
-
|
|
146
|
+
ref: screenshareReference,
|
|
147
|
+
className: "captured-video-canvas",
|
|
148
|
+
id: "ss-ref"
|
|
151
149
|
}));
|
|
152
150
|
};
|
|
153
151
|
|
|
@@ -30,11 +30,12 @@ const Permission = _ref => {
|
|
|
30
30
|
isFullscreen,
|
|
31
31
|
audioPermisison,
|
|
32
32
|
videoPermission,
|
|
33
|
+
setFullscreen,
|
|
33
34
|
screensharePermission,
|
|
34
35
|
trackScreenshare,
|
|
35
|
-
|
|
36
|
+
updateScreensharePermission
|
|
36
37
|
} = _ref;
|
|
37
|
-
const showPermissionModal =
|
|
38
|
+
const showPermissionModal = isFullscreen === false || audioPermisison === false || videoPermission === false || trackScreenshare && screensharePermission === false;
|
|
38
39
|
return /*#__PURE__*/_react.default.createElement(_reactBootstrap.Modal, {
|
|
39
40
|
show: showPermissionModal,
|
|
40
41
|
size: "lg",
|
|
@@ -43,7 +44,7 @@ const Permission = _ref => {
|
|
|
43
44
|
centered: true
|
|
44
45
|
}, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Modal.Header, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Modal.Title, null, text.PERMISSION_TITLE)), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Modal.Body, {
|
|
45
46
|
className: "font-medium"
|
|
46
|
-
}, /*#__PURE__*/_react.default.createElement(
|
|
47
|
+
}, /*#__PURE__*/_react.default.createElement("div", {
|
|
47
48
|
style: {
|
|
48
49
|
borderRadius: "20px"
|
|
49
50
|
}
|
|
@@ -62,7 +63,11 @@ const Permission = _ref => {
|
|
|
62
63
|
showAudioPermissionText: !audioPermisison,
|
|
63
64
|
showVideoPermissionText: !videoPermission,
|
|
64
65
|
showScreensharePermission: !screensharePermission && trackScreenshare
|
|
65
|
-
}))
|
|
66
|
+
})), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Modal.Footer, null, !screensharePermission && /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
|
|
67
|
+
onClick: () => {
|
|
68
|
+
updateScreensharePermission();
|
|
69
|
+
}
|
|
70
|
+
}, text.ALLOW_SCREENSHARE), !isFullscreen && /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
|
|
66
71
|
variant: "primary",
|
|
67
72
|
onClick: () => {
|
|
68
73
|
setFullscreen();
|
|
@@ -34,7 +34,7 @@ const PermissionBody = _ref => {
|
|
|
34
34
|
className: "mb-2"
|
|
35
35
|
}, /*#__PURE__*/_react.default.createElement("span", {
|
|
36
36
|
className: "pr-2 font-weight-bold"
|
|
37
|
-
}, "
|
|
37
|
+
}, "Screenshare:"), text.PERMISSION_SCREENSHARE), showAudioPermissionText && showVideoPermissionText ? /*#__PURE__*/_react.default.createElement("div", {
|
|
38
38
|
className: "mb-2"
|
|
39
39
|
}, /*#__PURE__*/_react.default.createElement("span", {
|
|
40
40
|
className: "pr-2 font-weight-bold"
|
package/dist/constants/text.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.WATCHING_SCREEN = exports.VIDEO_UNSUPPORTED_IN_BROWSER = exports.USER_COUNT_LABEL = exports.REQUEST_VIDEO_AUDIO_PERMISSIONS_HEADING = exports.REQUEST_VIDEO_AUDIO_PERMISSIONS_DESC = exports.REQUEST_PERMISSION = exports.PERMISSION_VIDEO = exports.PERMISSION_TITLE = exports.PERMISSION_SCREENSHARE = exports.PERMISSION_GENERIC = exports.PERMISSION_FULLSCREEN = exports.PERMISSION_AUDIO_VIDEO = exports.PERMISSION_AUDIO = exports.NO_CAMERA_AVAILABLE = exports.NO_AUDIO_DEVICE_AVAILABLE = exports.NOT_WATCHING_SCREEN = exports.MESSAGE = exports.FULLSCREEN_ERROR_MESSAGE = exports.DENY_FULLSCREEN = exports.CAMERA_UNAVAILABLE_INSECURE_CONN = exports.BROWSER_BLOCKED_PERMISSION_RESOLVED_RECHECK = exports.BROWSER_BLOCKED_PERMISSION_NEXT_STEP = exports.BROWSER_BLOCKED_PERMISSION_DIRECTION = exports.BROWSER_BLOCKED_PERMISSION_DIALOG = exports.BROWSER_BLOCKED_PERMISSION = exports.ALLOW_FULLSCREEN = void 0;
|
|
6
|
+
exports.WATCHING_SCREEN = exports.VIDEO_UNSUPPORTED_IN_BROWSER = exports.USER_COUNT_LABEL = exports.REQUEST_VIDEO_AUDIO_PERMISSIONS_HEADING = exports.REQUEST_VIDEO_AUDIO_PERMISSIONS_DESC = exports.REQUEST_PERMISSION = exports.PERMISSION_VIDEO = exports.PERMISSION_TITLE = exports.PERMISSION_SCREENSHARE = exports.PERMISSION_GENERIC = exports.PERMISSION_FULLSCREEN = exports.PERMISSION_AUDIO_VIDEO = exports.PERMISSION_AUDIO = exports.NO_CAMERA_AVAILABLE = exports.NO_AUDIO_DEVICE_AVAILABLE = exports.NOT_WATCHING_SCREEN = exports.MESSAGE = exports.FULLSCREEN_ERROR_MESSAGE = exports.DENY_FULLSCREEN = exports.CAMERA_UNAVAILABLE_INSECURE_CONN = exports.BROWSER_BLOCKED_PERMISSION_RESOLVED_RECHECK = exports.BROWSER_BLOCKED_PERMISSION_NEXT_STEP = exports.BROWSER_BLOCKED_PERMISSION_DIRECTION = exports.BROWSER_BLOCKED_PERMISSION_DIALOG = exports.BROWSER_BLOCKED_PERMISSION = exports.ALLOW_SCREENSHARE = exports.ALLOW_FULLSCREEN = void 0;
|
|
7
7
|
const WATCHING_SCREEN = "You are watching the screen";
|
|
8
8
|
exports.WATCHING_SCREEN = WATCHING_SCREEN;
|
|
9
9
|
const NOT_WATCHING_SCREEN = "You are not watching the screen";
|
|
@@ -20,6 +20,8 @@ const DENY_FULLSCREEN = "Deny";
|
|
|
20
20
|
exports.DENY_FULLSCREEN = DENY_FULLSCREEN;
|
|
21
21
|
const ALLOW_FULLSCREEN = "Switch to Fullscreen";
|
|
22
22
|
exports.ALLOW_FULLSCREEN = ALLOW_FULLSCREEN;
|
|
23
|
+
const ALLOW_SCREENSHARE = "Share Screen";
|
|
24
|
+
exports.ALLOW_SCREENSHARE = ALLOW_SCREENSHARE;
|
|
23
25
|
const NO_CAMERA_AVAILABLE = "No Camera available for use.";
|
|
24
26
|
exports.NO_CAMERA_AVAILABLE = NO_CAMERA_AVAILABLE;
|
|
25
27
|
const NO_AUDIO_DEVICE_AVAILABLE = "No audio device available for use";
|
|
@@ -48,11 +50,11 @@ const PERMISSION_GENERIC = "This screen requires following permissions for conti
|
|
|
48
50
|
exports.PERMISSION_GENERIC = PERMISSION_GENERIC;
|
|
49
51
|
const PERMISSION_FULLSCREEN = "Please allow us to switch your screen to fullscreen mode.";
|
|
50
52
|
exports.PERMISSION_FULLSCREEN = PERMISSION_FULLSCREEN;
|
|
51
|
-
const PERMISSION_SCREENSHARE = "Please choose to share the entire screen out of all the screen share options.";
|
|
52
|
-
exports.PERMISSION_SCREENSHARE = PERMISSION_SCREENSHARE;
|
|
53
53
|
const PERMISSION_AUDIO_VIDEO = "Your browser or system settings have disallowed Microphone and Camera permissions. Please permit this website to access microphone and camera. Refresh after you've given the permission to access the screen";
|
|
54
54
|
exports.PERMISSION_AUDIO_VIDEO = PERMISSION_AUDIO_VIDEO;
|
|
55
55
|
const PERMISSION_VIDEO = "Your browser or system settings have disallowed Camera permissions. Please permit this website to access the camera. Refresh after you've given the permission to access the screen";
|
|
56
56
|
exports.PERMISSION_VIDEO = PERMISSION_VIDEO;
|
|
57
57
|
const PERMISSION_AUDIO = "Your browser or system settings have disallowed Microphone permissions. Please permit this website to access the microphone. Refresh after you've given the permission to access the screen";
|
|
58
|
-
exports.PERMISSION_AUDIO = PERMISSION_AUDIO;
|
|
58
|
+
exports.PERMISSION_AUDIO = PERMISSION_AUDIO;
|
|
59
|
+
const PERMISSION_SCREENSHARE = "Please share your entire screen";
|
|
60
|
+
exports.PERMISSION_SCREENSHARE = PERMISSION_SCREENSHARE;
|
|
@@ -11,7 +11,7 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
|
|
|
11
11
|
|
|
12
12
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
13
13
|
|
|
14
|
-
const getDataOnBreach = (statistics, currentData
|
|
14
|
+
const getDataOnBreach = (statistics, currentData) => {
|
|
15
15
|
const {
|
|
16
16
|
userCount,
|
|
17
17
|
tabSwitchCount,
|
|
@@ -24,7 +24,6 @@ const getDataOnBreach = (statistics, currentData, proctoringIdentifier) => {
|
|
|
24
24
|
|
|
25
25
|
if (data.IS_WEBCAM_DATA_RELIABLE !== isWebcamDataReliable) {
|
|
26
26
|
return {
|
|
27
|
-
proctoringIdentifier,
|
|
28
27
|
breachedParam: "IS_WEBCAM_DATA_RELIABLE",
|
|
29
28
|
timestamp,
|
|
30
29
|
data: _objectSpread(_objectSpread({}, data), {}, {
|
|
@@ -35,7 +34,6 @@ const getDataOnBreach = (statistics, currentData, proctoringIdentifier) => {
|
|
|
35
34
|
|
|
36
35
|
if (data.USER_COUNT_MAX < userCount) {
|
|
37
36
|
return {
|
|
38
|
-
proctoringIdentifier,
|
|
39
37
|
breachedParam: "USER_COUNT_MAX",
|
|
40
38
|
timestamp,
|
|
41
39
|
data: _objectSpread(_objectSpread({}, data), {}, {
|
|
@@ -46,7 +44,6 @@ const getDataOnBreach = (statistics, currentData, proctoringIdentifier) => {
|
|
|
46
44
|
|
|
47
45
|
if (data.TAB_SWITCH_COUNT !== tabSwitchCount) {
|
|
48
46
|
return {
|
|
49
|
-
proctoringIdentifier,
|
|
50
47
|
breachedParam: "TAB_SWITCH_COUNT",
|
|
51
48
|
timestamp,
|
|
52
49
|
data: _objectSpread(_objectSpread({}, data), {}, {
|
|
@@ -57,7 +54,6 @@ const getDataOnBreach = (statistics, currentData, proctoringIdentifier) => {
|
|
|
57
54
|
|
|
58
55
|
if (data.FULLSCREEN_EXIT_COUNT !== fullScreenExitCount) {
|
|
59
56
|
return {
|
|
60
|
-
proctoringIdentifier,
|
|
61
57
|
breachedParam: "FULLSCREEN_EXIT_COUNT",
|
|
62
58
|
timestamp,
|
|
63
59
|
data: _objectSpread(_objectSpread({}, data), {}, {
|
|
@@ -68,7 +64,6 @@ const getDataOnBreach = (statistics, currentData, proctoringIdentifier) => {
|
|
|
68
64
|
|
|
69
65
|
if (data.LOOKED_AWAY_COUNT !== lookedAwayCount) {
|
|
70
66
|
return {
|
|
71
|
-
proctoringIdentifier,
|
|
72
67
|
breachedParam: "LOOKED_AWAY_COUNT",
|
|
73
68
|
timestamp,
|
|
74
69
|
data: _objectSpread(_objectSpread({}, data), {}, {
|
package/dist/utils/index.js
CHANGED
|
@@ -3,6 +3,12 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
+
Object.defineProperty(exports, "addOrUpdateStatsToLocalStorage", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function get() {
|
|
9
|
+
return _localStorageUtils.addOrUpdateStatsToLocalStorage;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
6
12
|
Object.defineProperty(exports, "captureWebcamSnapshot", {
|
|
7
13
|
enumerable: true,
|
|
8
14
|
get: function get() {
|
|
@@ -39,6 +45,12 @@ Object.defineProperty(exports, "getIsDocumentVisible", {
|
|
|
39
45
|
return _browserUtils.getIsDocumentVisible;
|
|
40
46
|
}
|
|
41
47
|
});
|
|
48
|
+
Object.defineProperty(exports, "getStatistics", {
|
|
49
|
+
enumerable: true,
|
|
50
|
+
get: function get() {
|
|
51
|
+
return _localStorageUtils.getStatistics;
|
|
52
|
+
}
|
|
53
|
+
});
|
|
42
54
|
Object.defineProperty(exports, "getVideoPermission", {
|
|
43
55
|
enumerable: true,
|
|
44
56
|
get: function get() {
|
|
@@ -69,6 +81,18 @@ Object.defineProperty(exports, "isWebcamVideoValid", {
|
|
|
69
81
|
return _webcamMicrophoneUtils.isWebcamVideoValid;
|
|
70
82
|
}
|
|
71
83
|
});
|
|
84
|
+
Object.defineProperty(exports, "removeStatsFromLocalStorage", {
|
|
85
|
+
enumerable: true,
|
|
86
|
+
get: function get() {
|
|
87
|
+
return _localStorageUtils.removeStatsFromLocalStorage;
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
Object.defineProperty(exports, "retrieveStatsFromLocalStorage", {
|
|
91
|
+
enumerable: true,
|
|
92
|
+
get: function get() {
|
|
93
|
+
return _localStorageUtils.retrieveStatsFromLocalStorage;
|
|
94
|
+
}
|
|
95
|
+
});
|
|
72
96
|
Object.defineProperty(exports, "sendDataOnBreach", {
|
|
73
97
|
enumerable: true,
|
|
74
98
|
get: function get() {
|
|
@@ -82,6 +106,8 @@ Object.defineProperty(exports, "updateStatistics", {
|
|
|
82
106
|
}
|
|
83
107
|
});
|
|
84
108
|
|
|
109
|
+
var _localStorageUtils = require("./localStorageUtils");
|
|
110
|
+
|
|
85
111
|
var _webcamMicrophoneUtils = require("./webcamMicrophoneUtils");
|
|
86
112
|
|
|
87
113
|
var _browserUtils = require("./browserUtils");
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.updateVideoPermissions = exports.updateStatistics = exports.
|
|
6
|
+
exports.updateVideoPermissions = exports.updateStatistics = exports.updateAudioPermissions = exports.setupScreensharePermission = exports.isWebcamVideoValid = exports.getVideoPermissionQuery = exports.getVideoPermission = exports.getGlancePercentage = exports.getAudioVideoPermission = exports.getAudioPermissionQuery = exports.getAudioPermission = exports.captureWebcamSnapshot = exports.captureScreenshot = void 0;
|
|
7
7
|
|
|
8
8
|
require("core-js/modules/es.regexp.exec.js");
|
|
9
9
|
|
|
@@ -19,8 +19,14 @@ require("core-js/modules/es.typed-array.sort.js");
|
|
|
19
19
|
|
|
20
20
|
require("core-js/modules/es.typed-array.to-locale-string.js");
|
|
21
21
|
|
|
22
|
+
require("core-js/modules/es.promise.js");
|
|
23
|
+
|
|
22
24
|
var _ = require(".");
|
|
23
25
|
|
|
26
|
+
var _html2canvas = _interopRequireDefault(require("html2canvas"));
|
|
27
|
+
|
|
28
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
29
|
+
|
|
24
30
|
const isWebcamVideoValid = webcamReference => webcamReference !== null && webcamReference !== undefined && typeof webcamReference.current !== "undefined" && webcamReference.current !== null && webcamReference.current.video.readyState === 4;
|
|
25
31
|
|
|
26
32
|
exports.isWebcamVideoValid = isWebcamVideoValid;
|
|
@@ -124,21 +130,33 @@ const updateVideoPermissions = setVideoPermission => {
|
|
|
124
130
|
|
|
125
131
|
exports.updateVideoPermissions = updateVideoPermissions;
|
|
126
132
|
|
|
127
|
-
const
|
|
128
|
-
video: true
|
|
129
|
-
audio: true
|
|
133
|
+
const setupScreensharePermission = (setScreensharePermission, screenshareReference) => navigator.mediaDevices.getDisplayMedia({
|
|
134
|
+
video: true
|
|
130
135
|
}).then(stream => {
|
|
131
|
-
|
|
132
|
-
|
|
136
|
+
const track = stream.getTracks()[0];
|
|
137
|
+
|
|
138
|
+
if (track.getSettings().displaySurface === "monitor") {
|
|
139
|
+
screenshareReference.current.srcObject = stream;
|
|
140
|
+
|
|
141
|
+
screenshareReference.current.onloadedmetadata = e => {
|
|
142
|
+
screenshareReference.current.play();
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
track.onended = e => {
|
|
146
|
+
setScreensharePermission(false);
|
|
147
|
+
};
|
|
148
|
+
|
|
133
149
|
setScreensharePermission(true);
|
|
134
150
|
} else {
|
|
151
|
+
screenshareReference.current = null;
|
|
135
152
|
setScreensharePermission(false);
|
|
136
153
|
}
|
|
137
|
-
}).catch(
|
|
154
|
+
}).catch(e => {
|
|
155
|
+
screenshareReference.current = null;
|
|
138
156
|
setScreensharePermission(false);
|
|
139
157
|
});
|
|
140
158
|
|
|
141
|
-
exports.
|
|
159
|
+
exports.setupScreensharePermission = setupScreensharePermission;
|
|
142
160
|
|
|
143
161
|
const getVideoPermissionQuery = () => navigator.permissions.query({
|
|
144
162
|
name: "camera"
|
|
@@ -170,8 +188,19 @@ const captureWebcamSnapshot = webcamReference => {
|
|
|
170
188
|
try {
|
|
171
189
|
const b64Snapshot = webcamReference.current.getScreenshot();
|
|
172
190
|
return b64DataURItoBlob(b64Snapshot);
|
|
173
|
-
} catch (
|
|
191
|
+
} catch (e) {// pass
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
|
|
195
|
+
exports.captureWebcamSnapshot = captureWebcamSnapshot;
|
|
196
|
+
|
|
197
|
+
const captureScreenshot = async () => {
|
|
198
|
+
try {
|
|
199
|
+
const canvas = await (0, _html2canvas.default)(document.querySelector("#ss-ref"));
|
|
200
|
+
const b64Snapshot = canvas.toDataURL("image/jpeg");
|
|
201
|
+
return b64DataURItoBlob(b64Snapshot);
|
|
202
|
+
} catch (e) {// pass
|
|
174
203
|
}
|
|
175
204
|
};
|
|
176
205
|
|
|
177
|
-
exports.
|
|
206
|
+
exports.captureScreenshot = captureScreenshot;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@newtonschool/react_proctoring_library",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.15",
|
|
4
4
|
"description": "Used to proctor online tests",
|
|
5
5
|
"author": "ayushkagrawal,shreyachandra",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
"@tensorflow/tfjs": "^3.9.0",
|
|
18
18
|
"bootstrap": "^5.1.3",
|
|
19
19
|
"core-js": "^3.22.7",
|
|
20
|
+
"html2canvas": "^1.4.1",
|
|
20
21
|
"react-bootstrap": "^2.0.4",
|
|
21
22
|
"react-webcam": "^6.0.0"
|
|
22
23
|
},
|