@newtonschool/react_proctoring_library 0.0.17 → 0.0.20
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 +64 -40
- package/dist/components/ProctoredContextApp.js +108 -0
- package/dist/components/activity-tracker/index.js +3 -3
- package/dist/components/index.js +16 -0
- package/dist/components/index.scss +8 -0
- package/dist/components/permissions/index.js +12 -15
- package/dist/components/permissions/permission-body.js +1 -1
- package/dist/components/screenshare/index.js +40 -0
- package/dist/components/screenshare/index.scss +4 -0
- package/dist/constants/defaults.js +13 -5
- package/dist/hooks/useFullScreenData.js +6 -7
- package/dist/hooks/usePageVisibility.js +1 -1
- package/dist/index.js +6 -0
- package/dist/proctoringTracker/tracker.js +17 -0
- package/dist/proctoringTracker/trackerWrapper.js +1 -0
- package/dist/utils/breachUtils.js +22 -8
- package/dist/utils/webcamMicrophoneUtils.js +4 -2
- package/package.json +2 -2
- package/dist/utils/localStorageUtils.js +0 -33
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
require("core-js/modules/es.object.assign.js");
|
|
4
|
+
|
|
3
5
|
Object.defineProperty(exports, "__esModule", {
|
|
4
6
|
value: true
|
|
5
7
|
});
|
|
@@ -11,7 +13,7 @@ require("core-js/modules/es.promise.js");
|
|
|
11
13
|
|
|
12
14
|
var _react = _interopRequireWildcard(require("react"));
|
|
13
15
|
|
|
14
|
-
|
|
16
|
+
require("./index.scss");
|
|
15
17
|
|
|
16
18
|
var _utils = require("../utils");
|
|
17
19
|
|
|
@@ -27,12 +29,18 @@ var _webcamMicrophoneUtils = require("../utils/webcamMicrophoneUtils");
|
|
|
27
29
|
|
|
28
30
|
var _defaults = require("../constants/defaults");
|
|
29
31
|
|
|
32
|
+
var _activityTracker = _interopRequireDefault(require("./activity-tracker"));
|
|
33
|
+
|
|
34
|
+
var _browserUtils = require("../utils/browserUtils");
|
|
35
|
+
|
|
30
36
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
31
37
|
|
|
32
38
|
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); }
|
|
33
39
|
|
|
34
40
|
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; }
|
|
35
41
|
|
|
42
|
+
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
43
|
+
|
|
36
44
|
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
45
|
|
|
38
46
|
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; }
|
|
@@ -44,25 +52,43 @@ const isWebcamProcessingReliable = (0, _utils.isGPUAvailable)();
|
|
|
44
52
|
const ProctorApp = _ref => {
|
|
45
53
|
let {
|
|
46
54
|
proctoringIdentifier,
|
|
55
|
+
customPermissionView = null,
|
|
56
|
+
shouldRenderChildren = false,
|
|
57
|
+
permissionPassedProps = {},
|
|
47
58
|
children,
|
|
59
|
+
proctoredContext,
|
|
48
60
|
config,
|
|
49
61
|
getProctorParamValues = () => {},
|
|
50
62
|
getWebcamSnapshot = () => {},
|
|
51
63
|
getScreengrab = () => {}
|
|
52
64
|
} = _ref;
|
|
53
|
-
const
|
|
54
|
-
const
|
|
55
|
-
const
|
|
65
|
+
const [renderChildren, setRenderChildren] = (0, _react.useState)();
|
|
66
|
+
const context = (0, _react.useContext)(proctoredContext);
|
|
67
|
+
const {
|
|
68
|
+
actions,
|
|
69
|
+
permissions,
|
|
70
|
+
references,
|
|
71
|
+
permissionSetter,
|
|
72
|
+
customProps,
|
|
73
|
+
customSetter
|
|
74
|
+
} = context;
|
|
75
|
+
(0, _react.useEffect)(() => {
|
|
76
|
+
if (customProps.childrenRenderer === undefined) {
|
|
77
|
+
setRenderChildren(!shouldRenderChildren);
|
|
78
|
+
} else {
|
|
79
|
+
setRenderChildren(customProps.childrenRenderer);
|
|
80
|
+
}
|
|
81
|
+
}, [customProps]);
|
|
82
|
+
const CustomPermissionView = customPermissionView;
|
|
83
|
+
const browserDetails = {
|
|
84
|
+
isChrome: (0, _browserUtils.isChrome)()
|
|
85
|
+
};
|
|
56
86
|
const proctorParams = (0, _react.useMemo)(() => _objectSpread(_objectSpread({}, _defaults.defaultConfig), config.proctorParams), [config.proctorParams]);
|
|
57
87
|
const statistics = (0, _react.useRef)((0, _breachUtils.getInitialStats)(proctorParams));
|
|
58
88
|
const {
|
|
59
89
|
recurring = false,
|
|
60
90
|
recurringFetchInterval = 0
|
|
61
91
|
} = config;
|
|
62
|
-
const [audioPermission, setAudioPermission] = (0, _react.useState)();
|
|
63
|
-
const [videoPermission, setVideoPermission] = (0, _react.useState)();
|
|
64
|
-
const [screensharePermission, setScreensharePermission] = (0, _react.useState)(!proctorParams.screenshareSnapshots);
|
|
65
|
-
const firstFullScreenDone = (0, _react.useRef)(false);
|
|
66
92
|
const recurringFetchIntervalRef = (0, _react.useRef)(null);
|
|
67
93
|
const sendScreengrab = (0, _react.useCallback)(async function () {
|
|
68
94
|
let isBreach = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
|
@@ -78,9 +104,9 @@ const ProctorApp = _ref => {
|
|
|
78
104
|
let breachedParam = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "";
|
|
79
105
|
|
|
80
106
|
if (proctorParams.webcamSnapshots) {
|
|
81
|
-
const webcamSnapshot = (0, _utils.captureWebcamSnapshot)(webcamReference);
|
|
107
|
+
const webcamSnapshot = (0, _utils.captureWebcamSnapshot)(references.webcamReference);
|
|
82
108
|
|
|
83
|
-
if (webcamReference) {
|
|
109
|
+
if (references.webcamReference) {
|
|
84
110
|
getWebcamSnapshot(proctoringIdentifier, webcamSnapshot, isBreach, breachedParam);
|
|
85
111
|
}
|
|
86
112
|
}
|
|
@@ -90,12 +116,8 @@ const ProctorApp = _ref => {
|
|
|
90
116
|
let breachParam = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "";
|
|
91
117
|
getProctorParamValues(proctoringIdentifier, statistics.current, isBreach, breachParam);
|
|
92
118
|
}, [proctoringIdentifier, getProctorParamValues]);
|
|
93
|
-
const
|
|
94
|
-
|
|
95
|
-
setFullscreen
|
|
96
|
-
} = (0, _hooks.useFullscreenData)(firstFullScreenDone, proctorParams.fullscreenExit);
|
|
97
|
-
const [userCount, lookedAwayCount] = (0, _useWebcamData.default)(webcamReference, canvasReference, proctorParams);
|
|
98
|
-
const isTabSwitched = !(0, _hooks.usePageVisibility)(proctorParams.tabSwitch) && firstFullScreenDone.current;
|
|
119
|
+
const [userCount, lookedAwayCount] = (0, _useWebcamData.default)(references.webcamReference, references.canvasReference, proctorParams);
|
|
120
|
+
const isTabSwitched = !(0, _hooks.usePageVisibility)(proctorParams.tabSwitch);
|
|
99
121
|
(0, _react.useEffect)(() => {
|
|
100
122
|
if (recurring) {
|
|
101
123
|
recurringFetchIntervalRef.current = setInterval(() => {
|
|
@@ -113,9 +135,9 @@ const ProctorApp = _ref => {
|
|
|
113
135
|
const currentStats = {
|
|
114
136
|
userCount,
|
|
115
137
|
isTabSwitched,
|
|
116
|
-
|
|
138
|
+
isFullScreen: permissions.fullscreen,
|
|
117
139
|
lookedAwayCount,
|
|
118
|
-
|
|
140
|
+
isWebcamDataNotReliable: !isWebcamProcessingReliable
|
|
119
141
|
};
|
|
120
142
|
const breachData = (0, _breachUtils.getDataOnBreach)(statistics, currentStats, proctorParams);
|
|
121
143
|
(0, _utils.updateStatistics)(statistics, currentStats, proctorParams);
|
|
@@ -125,30 +147,32 @@ const ProctorApp = _ref => {
|
|
|
125
147
|
sendWebcamSnapshot(true, breachData.breachedParam);
|
|
126
148
|
sendScreengrab(true, breachData.breachedParam);
|
|
127
149
|
}
|
|
128
|
-
}, [userCount, isTabSwitched,
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
},
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
150
|
+
}, [userCount, isTabSwitched, permissions.fullscreen, lookedAwayCount, sendProctoredParamValues, sendWebcamSnapshot, sendScreengrab, proctorParams]);
|
|
151
|
+
return /*#__PURE__*/_react.default.createElement("div", {
|
|
152
|
+
className: "".concat(proctorParams.copyPasteProctoring ? "disable-copy-paste fullwidth" : "fullwidth")
|
|
153
|
+
}, (0, _breachUtils.showProctoredComponent)(proctorParams, actions.hasAllPermission) && renderChildren && children, !((0, _breachUtils.showProctoredComponent)(proctorParams, actions.hasAllPermission) && renderChildren) && customPermissionView && /*#__PURE__*/_react.default.createElement(CustomPermissionView, _extends({
|
|
154
|
+
permissions: permissions,
|
|
155
|
+
hasAllPermission: actions.hasAllPermission,
|
|
156
|
+
askPermission: actions.askPermission,
|
|
157
|
+
references: references,
|
|
158
|
+
actions: actions,
|
|
159
|
+
browserDetails: browserDetails,
|
|
160
|
+
renderChildren: () => {
|
|
161
|
+
setRenderChildren(true);
|
|
162
|
+
customSetter.childrenRenderer(true);
|
|
163
|
+
}
|
|
164
|
+
}, permissionPassedProps)), !((0, _breachUtils.showProctoredComponent)(proctorParams, actions.hasAllPermission) && renderChildren) && !customPermissionView && /*#__PURE__*/_react.default.createElement(_permissions.Permission, {
|
|
138
165
|
proctorParams: proctorParams,
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
screensharePermission: screensharePermission,
|
|
144
|
-
updateScreensharePermission: updateScreensharePermission
|
|
145
|
-
}), /*#__PURE__*/_react.default.createElement(_.ActivityTracker, {
|
|
166
|
+
permissions: permissions,
|
|
167
|
+
askPermission: actions.askPermission,
|
|
168
|
+
hasAllPermission: actions.hasAllPermission
|
|
169
|
+
}), /*#__PURE__*/_react.default.createElement(_activityTracker.default, {
|
|
146
170
|
proctorParams: proctorParams,
|
|
147
|
-
setAudioPermission:
|
|
148
|
-
setVideoPermission:
|
|
149
|
-
webcamReference: webcamReference,
|
|
150
|
-
canvasReference: canvasReference,
|
|
151
|
-
screenshareReference: screenshareReference
|
|
171
|
+
setAudioPermission: permissionSetter.audio,
|
|
172
|
+
setVideoPermission: permissionSetter.video,
|
|
173
|
+
webcamReference: references.webcamReference,
|
|
174
|
+
canvasReference: references.canvasReference,
|
|
175
|
+
screenshareReference: references.screenshareReference
|
|
152
176
|
}));
|
|
153
177
|
};
|
|
154
178
|
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
require("core-js/modules/web.dom-collections.iterator.js");
|
|
9
|
+
|
|
10
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
11
|
+
|
|
12
|
+
var _hooks = require("../hooks");
|
|
13
|
+
|
|
14
|
+
var _webcamMicrophoneUtils = require("../utils/webcamMicrophoneUtils");
|
|
15
|
+
|
|
16
|
+
var _defaults = require("../constants/defaults");
|
|
17
|
+
|
|
18
|
+
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); }
|
|
19
|
+
|
|
20
|
+
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; }
|
|
21
|
+
|
|
22
|
+
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; }
|
|
23
|
+
|
|
24
|
+
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; }
|
|
25
|
+
|
|
26
|
+
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; }
|
|
27
|
+
|
|
28
|
+
const ProctoredContextApp = _ref => {
|
|
29
|
+
let {
|
|
30
|
+
contextProvider,
|
|
31
|
+
config = {
|
|
32
|
+
proctorParams: _defaults.defaultConfig
|
|
33
|
+
},
|
|
34
|
+
children
|
|
35
|
+
} = _ref;
|
|
36
|
+
const proctorParams = (0, _react.useMemo)(() => _objectSpread(_objectSpread({}, _defaults.defaultConfig), config.proctorParams), [config.proctorParams]);
|
|
37
|
+
const {
|
|
38
|
+
isFullscreen,
|
|
39
|
+
setFullscreen
|
|
40
|
+
} = (0, _hooks.useFullscreenData)(proctorParams.fullscreenExit);
|
|
41
|
+
const [audioPermisison, setAudioPermission] = (0, _react.useState)();
|
|
42
|
+
const [videoPermission, setVideoPermission] = (0, _react.useState)();
|
|
43
|
+
const [screensharePermission, setScreensharePermission] = (0, _react.useState)();
|
|
44
|
+
const [customRenderer, setCustomRenderer] = (0, _react.useState)();
|
|
45
|
+
const webcamReference = (0, _react.useRef)(null);
|
|
46
|
+
const canvasReference = (0, _react.useRef)(null);
|
|
47
|
+
const screenshareReference = (0, _react.useRef)(null);
|
|
48
|
+
const Context = contextProvider;
|
|
49
|
+
const askPermissionAction = {
|
|
50
|
+
'screenshare': () => {
|
|
51
|
+
(0, _webcamMicrophoneUtils.setupScreensharePermission)(setScreensharePermission, screenshareReference);
|
|
52
|
+
},
|
|
53
|
+
'fullscreen': () => {
|
|
54
|
+
setFullscreen();
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
const getPermissionObj = {
|
|
58
|
+
'video': videoPermission,
|
|
59
|
+
'audio': audioPermisison,
|
|
60
|
+
'fullscreen': isFullscreen,
|
|
61
|
+
'screenshare': screensharePermission
|
|
62
|
+
};
|
|
63
|
+
const askPermission = (0, _react.useCallback)(requiredPermissions => {
|
|
64
|
+
requiredPermissions.forEach(element => {
|
|
65
|
+
if (!getPermissionObj[element] && askPermissionAction[element]) {
|
|
66
|
+
askPermissionAction[element]();
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
}, [getPermissionObj, askPermissionAction]);
|
|
70
|
+
const hasAllPermission = (0, _react.useCallback)(requiredPermissions => {
|
|
71
|
+
let hasPermission = true;
|
|
72
|
+
requiredPermissions.forEach(element => {
|
|
73
|
+
if (!getPermissionObj[element]) {
|
|
74
|
+
hasPermission = hasPermission && false;
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
return hasPermission;
|
|
78
|
+
}, [getPermissionObj]);
|
|
79
|
+
return /*#__PURE__*/_react.default.createElement(Context.Provider, {
|
|
80
|
+
value: {
|
|
81
|
+
permissions: getPermissionObj,
|
|
82
|
+
permissionSetter: {
|
|
83
|
+
'audio': setAudioPermission,
|
|
84
|
+
'video': setVideoPermission,
|
|
85
|
+
'screenshare': setScreensharePermission
|
|
86
|
+
},
|
|
87
|
+
customProps: {
|
|
88
|
+
'childrenRenderer': customRenderer
|
|
89
|
+
},
|
|
90
|
+
customSetter: {
|
|
91
|
+
'childrenRenderer': setCustomRenderer
|
|
92
|
+
},
|
|
93
|
+
proctorParams,
|
|
94
|
+
actions: {
|
|
95
|
+
'askPermission': askPermission,
|
|
96
|
+
'hasAllPermission': hasAllPermission
|
|
97
|
+
},
|
|
98
|
+
references: {
|
|
99
|
+
'webcamReference': webcamReference,
|
|
100
|
+
'canvasReference': canvasReference,
|
|
101
|
+
'screenshareReference': screenshareReference
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}, children);
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
var _default = ProctoredContextApp;
|
|
108
|
+
exports.default = _default;
|
|
@@ -32,9 +32,9 @@ const ActivityTracker = _ref => {
|
|
|
32
32
|
proctorParams,
|
|
33
33
|
webcamReference,
|
|
34
34
|
canvasReference,
|
|
35
|
+
screenshareReference,
|
|
35
36
|
setAudioPermission,
|
|
36
|
-
setVideoPermission
|
|
37
|
-
screenshareReference
|
|
37
|
+
setVideoPermission
|
|
38
38
|
} = _ref;
|
|
39
39
|
(0, _react.useEffect)(() => {
|
|
40
40
|
if ((0, _browserUtils.isChrome)()) {
|
|
@@ -141,7 +141,7 @@ const ActivityTracker = _ref => {
|
|
|
141
141
|
ref: canvasReference,
|
|
142
142
|
className: "captured-video-canvas",
|
|
143
143
|
id: "wc-ref"
|
|
144
|
-
})),
|
|
144
|
+
})), /*#__PURE__*/_react.default.createElement("video", {
|
|
145
145
|
ref: screenshareReference,
|
|
146
146
|
className: "captured-video-canvas",
|
|
147
147
|
id: "ss-ref"
|
package/dist/components/index.js
CHANGED
|
@@ -21,11 +21,27 @@ Object.defineProperty(exports, "ProctorApp", {
|
|
|
21
21
|
return _ProctorApp.default;
|
|
22
22
|
}
|
|
23
23
|
});
|
|
24
|
+
Object.defineProperty(exports, "ProctoredContextApp", {
|
|
25
|
+
enumerable: true,
|
|
26
|
+
get: function get() {
|
|
27
|
+
return _ProctoredContextApp.default;
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
Object.defineProperty(exports, "ScreenshareTracker", {
|
|
31
|
+
enumerable: true,
|
|
32
|
+
get: function get() {
|
|
33
|
+
return _screenshare.ScreenshareTracker;
|
|
34
|
+
}
|
|
35
|
+
});
|
|
24
36
|
|
|
25
37
|
var _activityTracker = _interopRequireDefault(require("./activity-tracker"));
|
|
26
38
|
|
|
27
39
|
var _permissions = require("./permissions");
|
|
28
40
|
|
|
41
|
+
var _screenshare = require("./screenshare");
|
|
42
|
+
|
|
29
43
|
var _ProctorApp = _interopRequireDefault(require("./ProctorApp"));
|
|
30
44
|
|
|
45
|
+
var _ProctoredContextApp = _interopRequireDefault(require("./ProctoredContextApp"));
|
|
46
|
+
|
|
31
47
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
@@ -30,14 +30,11 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|
|
30
30
|
const Permission = _ref => {
|
|
31
31
|
let {
|
|
32
32
|
proctorParams,
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
setFullscreen,
|
|
37
|
-
screensharePermission,
|
|
38
|
-
updateScreensharePermission
|
|
33
|
+
permissions,
|
|
34
|
+
askPermission,
|
|
35
|
+
hasAllPermission
|
|
39
36
|
} = _ref;
|
|
40
|
-
const showPermissionModal =
|
|
37
|
+
const showPermissionModal = !hasAllPermission((0, _breachUtils.getRequiredPermissionsFromProctorParams)(proctorParams));
|
|
41
38
|
return /*#__PURE__*/_react.default.createElement(_reactBootstrap.Modal, {
|
|
42
39
|
show: showPermissionModal,
|
|
43
40
|
size: "lg",
|
|
@@ -61,18 +58,18 @@ const Permission = _ref => {
|
|
|
61
58
|
}, /*#__PURE__*/_react.default.createElement("source", {
|
|
62
59
|
src: _askPermission.default
|
|
63
60
|
}), text.VIDEO_UNSUPPORTED_IN_BROWSER)), /*#__PURE__*/_react.default.createElement(_permissionBody.PermissionBody, {
|
|
64
|
-
showFullscreenText: !
|
|
65
|
-
showAudioPermissionText: !
|
|
66
|
-
showVideoPermissionText: !
|
|
67
|
-
showScreensharePermission: !
|
|
68
|
-
})), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Modal.Footer, null, !
|
|
61
|
+
showFullscreenText: !permissions.fullscreen,
|
|
62
|
+
showAudioPermissionText: !permissions.audio && (0, _breachUtils.isWebcamRequired)(proctorParams),
|
|
63
|
+
showVideoPermissionText: !permissions.video && (0, _breachUtils.isWebcamRequired)(proctorParams),
|
|
64
|
+
showScreensharePermission: !permissions.screenshare && proctorParams.screenshareSnapshots
|
|
65
|
+
})), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Modal.Footer, null, !permissions.screenshare && proctorParams.screenshareSnapshots && /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
|
|
69
66
|
onClick: () => {
|
|
70
|
-
|
|
67
|
+
askPermission(['screenshare']);
|
|
71
68
|
}
|
|
72
|
-
}, text.ALLOW_SCREENSHARE),
|
|
69
|
+
}, text.ALLOW_SCREENSHARE), !permissions.fullscreen && proctorParams.fullscreenExit && /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
|
|
73
70
|
variant: "primary",
|
|
74
71
|
onClick: () => {
|
|
75
|
-
|
|
72
|
+
askPermission(['fullscreen']);
|
|
76
73
|
}
|
|
77
74
|
}, text.ALLOW_FULLSCREEN)));
|
|
78
75
|
};
|
|
@@ -34,7 +34,7 @@ const PermissionBody = _ref => {
|
|
|
34
34
|
className: "mb-2"
|
|
35
35
|
}, text.PERMISSION_GENERIC), showScreensharePermission && /*#__PURE__*/_react.default.createElement("div", {
|
|
36
36
|
className: "mb-2"
|
|
37
|
-
}, (0, _browserUtils.isChrome)() && /*#__PURE__*/_react.default.createElement("strong", null, "Please switch to chrome"), /*#__PURE__*/_react.default.createElement("span", {
|
|
37
|
+
}, !(0, _browserUtils.isChrome)() && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("strong", null, "Please switch to chrome"), /*#__PURE__*/_react.default.createElement("br", null)), /*#__PURE__*/_react.default.createElement("span", {
|
|
38
38
|
className: "pr-2 font-weight-bold"
|
|
39
39
|
}, "Screenshare:"), text.PERMISSION_SCREENSHARE), showAudioPermissionText && showVideoPermissionText ? /*#__PURE__*/_react.default.createElement("div", {
|
|
40
40
|
className: "mb-2"
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.ScreenshareTracker = void 0;
|
|
7
|
+
|
|
8
|
+
require("core-js/modules/web.dom-collections.iterator.js");
|
|
9
|
+
|
|
10
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
11
|
+
|
|
12
|
+
var _webcamMicrophoneUtils = require("../../utils/webcamMicrophoneUtils");
|
|
13
|
+
|
|
14
|
+
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); }
|
|
15
|
+
|
|
16
|
+
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; }
|
|
17
|
+
|
|
18
|
+
const ScreenshareTracker = _ref => {
|
|
19
|
+
let {
|
|
20
|
+
triggerRequestPermission,
|
|
21
|
+
permissionChangeCallback
|
|
22
|
+
} = _ref;
|
|
23
|
+
const [screensharePermission, setScreensharePermission] = (0, _react.useState)();
|
|
24
|
+
const screenshareReference = (0, _react.useRef)(null);
|
|
25
|
+
(0, _react.useEffect)(() => {
|
|
26
|
+
permissionChangeCallback(screensharePermission);
|
|
27
|
+
}, [screensharePermission, permissionChangeCallback]);
|
|
28
|
+
(0, _react.useEffect)(() => {
|
|
29
|
+
if (triggerRequestPermission) {
|
|
30
|
+
(0, _webcamMicrophoneUtils.setupScreensharePermission)(setScreensharePermission, screenshareReference);
|
|
31
|
+
}
|
|
32
|
+
}, [triggerRequestPermission]);
|
|
33
|
+
return /*#__PURE__*/_react.default.createElement("video", {
|
|
34
|
+
ref: screenshareReference,
|
|
35
|
+
className: "captured-video-canvas",
|
|
36
|
+
id: "ss-ref"
|
|
37
|
+
});
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
exports.ScreenshareTracker = ScreenshareTracker;
|
|
@@ -3,20 +3,21 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.initialValues = exports.gpuTypes = exports.evaluateVideoIntervalInSeconds = exports.defaultConfig = exports.STATS_PARAMS = exports.INITIAL_STATISTICS = void 0;
|
|
6
|
+
exports.proctorParamsToPermission = exports.initialValues = exports.gpuTypes = exports.evaluateVideoIntervalInSeconds = exports.defaultConfig = exports.STATS_PARAMS = exports.INITIAL_STATISTICS = void 0;
|
|
7
7
|
const defaultConfig = {
|
|
8
8
|
people: true,
|
|
9
9
|
tabSwitch: true,
|
|
10
10
|
fullscreenExit: true,
|
|
11
11
|
lookedAway: true,
|
|
12
12
|
webcamSnapshots: true,
|
|
13
|
-
screenshareSnapshots: true
|
|
13
|
+
screenshareSnapshots: true,
|
|
14
|
+
copyPasteProctoring: true
|
|
14
15
|
};
|
|
15
16
|
exports.defaultConfig = defaultConfig;
|
|
16
17
|
const initialValues = {
|
|
17
18
|
isTabSwitched: false,
|
|
18
19
|
userCount: 0,
|
|
19
|
-
|
|
20
|
+
isWebcamDataNotReliable: true,
|
|
20
21
|
isWatching: true,
|
|
21
22
|
canOpenFullScreen: false,
|
|
22
23
|
isFullscreen: false,
|
|
@@ -29,7 +30,7 @@ const STATS_PARAMS = {
|
|
|
29
30
|
isFullscreen: "IS_FULLSCREEN",
|
|
30
31
|
lookedAwayCount: "LOOKED_AWAY_COUNT",
|
|
31
32
|
userCountMax: "USER_COUNT_MAX",
|
|
32
|
-
|
|
33
|
+
isWebcamNotReliable: "IS_WEBCAM_DATA_NOT_RELIABLE"
|
|
33
34
|
};
|
|
34
35
|
exports.STATS_PARAMS = STATS_PARAMS;
|
|
35
36
|
const INITIAL_STATISTICS = {
|
|
@@ -37,9 +38,16 @@ const INITIAL_STATISTICS = {
|
|
|
37
38
|
[STATS_PARAMS.isFullscreen]: initialValues.isFullscreen,
|
|
38
39
|
[STATS_PARAMS.lookedAwayCount]: initialValues.lookedAwayCount,
|
|
39
40
|
[STATS_PARAMS.userCountMax]: initialValues.userCount,
|
|
40
|
-
[STATS_PARAMS.
|
|
41
|
+
[STATS_PARAMS.isWebcamNotReliable]: initialValues.isWebcamDataNotReliable
|
|
41
42
|
};
|
|
42
43
|
exports.INITIAL_STATISTICS = INITIAL_STATISTICS;
|
|
44
|
+
const proctorParamsToPermission = {
|
|
45
|
+
fullscreenExit: "fullscreen",
|
|
46
|
+
lookedAway: "video",
|
|
47
|
+
webcamSnapshots: "video",
|
|
48
|
+
screenshareSnapshots: "screenshare"
|
|
49
|
+
};
|
|
50
|
+
exports.proctorParamsToPermission = proctorParamsToPermission;
|
|
43
51
|
const evaluateVideoIntervalInSeconds = 5;
|
|
44
52
|
exports.evaluateVideoIntervalInSeconds = evaluateVideoIntervalInSeconds;
|
|
45
53
|
const gpuTypes = ["intel", "apple", "amd", "radeon", "nvidia", "geforce"];
|
|
@@ -7,20 +7,19 @@ exports.default = useFullscreenData;
|
|
|
7
7
|
|
|
8
8
|
require("core-js/modules/web.dom-collections.iterator.js");
|
|
9
9
|
|
|
10
|
-
var _react = require("react");
|
|
10
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
11
11
|
|
|
12
12
|
var _utils = require("../utils");
|
|
13
13
|
|
|
14
|
+
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); }
|
|
15
|
+
|
|
16
|
+
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; }
|
|
17
|
+
|
|
14
18
|
const browserFullscreenElementProp = (0, _utils.getBrowserFullscreenElementProp)();
|
|
15
19
|
|
|
16
|
-
function useFullscreenData(
|
|
20
|
+
function useFullscreenData(isProctorParam) {
|
|
17
21
|
const fullScreenElement = (0, _react.useRef)(document.documentElement);
|
|
18
22
|
const [isFullscreen, setIsFullscreen] = (0, _react.useState)(document[browserFullscreenElementProp] != null);
|
|
19
|
-
(0, _react.useEffect)(() => {
|
|
20
|
-
if (isFullscreen && !firstFullScreenDone.current || !isProctorParam) {
|
|
21
|
-
firstFullScreenDone.current = true;
|
|
22
|
-
}
|
|
23
|
-
}, [isFullscreen, firstFullScreenDone, isProctorParam]);
|
|
24
23
|
|
|
25
24
|
const setFullscreen = () => {
|
|
26
25
|
if (!fullScreenElement || !fullScreenElement.current) {
|
package/dist/index.js
CHANGED
|
@@ -9,5 +9,11 @@ Object.defineProperty(exports, "ProctorApp", {
|
|
|
9
9
|
return _components.ProctorApp;
|
|
10
10
|
}
|
|
11
11
|
});
|
|
12
|
+
Object.defineProperty(exports, "ProctoredContextApp", {
|
|
13
|
+
enumerable: true,
|
|
14
|
+
get: function get() {
|
|
15
|
+
return _components.ProctoredContextApp;
|
|
16
|
+
}
|
|
17
|
+
});
|
|
12
18
|
|
|
13
19
|
var _components = require("./components");
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
class ProctoringTracker {
|
|
9
|
+
constructor() {}
|
|
10
|
+
|
|
11
|
+
askProctoredPermission() {}
|
|
12
|
+
|
|
13
|
+
hasProctoredPermission() {}
|
|
14
|
+
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
exports.default = ProctoringTracker;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.showProctoredComponent = exports.isWebcamRequired = exports.getInitialStats = exports.getDataOnBreach = void 0;
|
|
6
|
+
exports.showProctoredComponent = exports.isWebcamRequired = exports.getRequiredPermissionsFromProctorParams = exports.getInitialStats = exports.getDataOnBreach = void 0;
|
|
7
7
|
|
|
8
8
|
var _defaults = require("../constants/defaults");
|
|
9
9
|
|
|
@@ -37,12 +37,26 @@ const getInitialStats = proctorParams => {
|
|
|
37
37
|
|
|
38
38
|
exports.getInitialStats = getInitialStats;
|
|
39
39
|
|
|
40
|
+
const getRequiredPermissionsFromProctorParams = proctorParams => {
|
|
41
|
+
const requiredPermissions = [];
|
|
42
|
+
|
|
43
|
+
for (const key in proctorParams) {
|
|
44
|
+
if (proctorParams[key] && _defaults.proctorParamsToPermission[key]) {
|
|
45
|
+
requiredPermissions.push(_defaults.proctorParamsToPermission[key]);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return requiredPermissions;
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
exports.getRequiredPermissionsFromProctorParams = getRequiredPermissionsFromProctorParams;
|
|
53
|
+
|
|
40
54
|
const isWebcamRequired = proctorParams => proctorParams.people || proctorParams.lookedAway || proctorParams.webcamSnapshots;
|
|
41
55
|
|
|
42
56
|
exports.isWebcamRequired = isWebcamRequired;
|
|
43
57
|
|
|
44
|
-
const showProctoredComponent = (proctorParams,
|
|
45
|
-
return (
|
|
58
|
+
const showProctoredComponent = (proctorParams, hasAllPermission) => {
|
|
59
|
+
return hasAllPermission(getRequiredPermissionsFromProctorParams(proctorParams));
|
|
46
60
|
};
|
|
47
61
|
|
|
48
62
|
exports.showProctoredComponent = showProctoredComponent;
|
|
@@ -53,18 +67,18 @@ const getDataOnBreach = (statistics, currentData, proctorParams) => {
|
|
|
53
67
|
isTabSwitched,
|
|
54
68
|
isFullscreen,
|
|
55
69
|
lookedAwayCount,
|
|
56
|
-
|
|
70
|
+
isWebcamDataNotReliable
|
|
57
71
|
} = currentData;
|
|
58
72
|
const timestamp = Date.now();
|
|
59
73
|
const data = statistics.current;
|
|
60
|
-
const
|
|
74
|
+
const isWebCamNotReliableParam = _defaults.STATS_PARAMS.isWebcamNotReliable;
|
|
61
75
|
|
|
62
|
-
if (isWebcamRequired(proctorParams) && data[
|
|
76
|
+
if (isWebcamRequired(proctorParams) && data[isWebCamNotReliableParam]) {
|
|
63
77
|
return {
|
|
64
|
-
breachedParam:
|
|
78
|
+
breachedParam: isWebCamNotReliableParam,
|
|
65
79
|
timestamp,
|
|
66
80
|
data: _objectSpread(_objectSpread({}, data), {}, {
|
|
67
|
-
[
|
|
81
|
+
[isWebCamNotReliableParam]: isWebCamNotReliableParam
|
|
68
82
|
})
|
|
69
83
|
};
|
|
70
84
|
}
|
|
@@ -13,6 +13,8 @@ require("core-js/modules/es.array-buffer.slice.js");
|
|
|
13
13
|
|
|
14
14
|
require("core-js/modules/es.typed-array.uint8-array.js");
|
|
15
15
|
|
|
16
|
+
require("core-js/modules/es.typed-array.fill.js");
|
|
17
|
+
|
|
16
18
|
require("core-js/modules/es.typed-array.set.js");
|
|
17
19
|
|
|
18
20
|
require("core-js/modules/es.typed-array.sort.js");
|
|
@@ -151,6 +153,7 @@ const setupScreensharePermission = (setScreensharePermission, screenshareReferen
|
|
|
151
153
|
const track = stream.getTracks()[0];
|
|
152
154
|
|
|
153
155
|
if (track.getSettings().displaySurface === "monitor") {
|
|
156
|
+
setScreensharePermission(true);
|
|
154
157
|
screenshareReference.current.srcObject = stream;
|
|
155
158
|
|
|
156
159
|
screenshareReference.current.onloadedmetadata = e => {
|
|
@@ -159,9 +162,8 @@ const setupScreensharePermission = (setScreensharePermission, screenshareReferen
|
|
|
159
162
|
|
|
160
163
|
track.onended = e => {
|
|
161
164
|
setScreensharePermission(false);
|
|
165
|
+
screenshareReference.current.srcObject = null;
|
|
162
166
|
};
|
|
163
|
-
|
|
164
|
-
setScreensharePermission(true);
|
|
165
167
|
} else {
|
|
166
168
|
screenshareReference.current = null;
|
|
167
169
|
setScreensharePermission(false);
|
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.20",
|
|
4
4
|
"description": "Used to proctor online tests",
|
|
5
5
|
"author": "ayushkagrawal,shreyachandra",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -54,4 +54,4 @@
|
|
|
54
54
|
"@babel/preset-env": "^7.16.7",
|
|
55
55
|
"react-scripts": ">=5.0.0"
|
|
56
56
|
}
|
|
57
|
-
}
|
|
57
|
+
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.retrieveStatsFromLocalStorage = exports.removeStatsFromLocalStorage = exports.getStatistics = exports.addOrUpdateStatsToLocalStorage = void 0;
|
|
7
|
-
|
|
8
|
-
require("core-js/modules/es.json.stringify.js");
|
|
9
|
-
|
|
10
|
-
const addOrUpdateStatsToLocalStorage = (proctoringIdentifier, data) => {
|
|
11
|
-
const stringifiedData = JSON.stringify(data);
|
|
12
|
-
localStorage.setItem(proctoringIdentifier, stringifiedData);
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
exports.addOrUpdateStatsToLocalStorage = addOrUpdateStatsToLocalStorage;
|
|
16
|
-
|
|
17
|
-
const retrieveStatsFromLocalStorage = proctoringIdentifier => {
|
|
18
|
-
return localStorage.getItem(proctoringIdentifier);
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
exports.retrieveStatsFromLocalStorage = retrieveStatsFromLocalStorage;
|
|
22
|
-
|
|
23
|
-
const removeStatsFromLocalStorage = proctoringIdentifier => {
|
|
24
|
-
localStorage.removeItem(proctoringIdentifier);
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
exports.removeStatsFromLocalStorage = removeStatsFromLocalStorage;
|
|
28
|
-
|
|
29
|
-
const getStatistics = proctoringIdentifier => {
|
|
30
|
-
return JSON.parse(retrieveStatsFromLocalStorage(proctoringIdentifier));
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
exports.getStatistics = getStatistics;
|