@newtonschool/react_proctoring_library 0.0.25 → 0.0.26
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 +38 -62
- package/dist/components/activity-tracker/index.scss +1 -1
- package/dist/components/index.js +4 -4
- package/dist/components/index.scss +4 -0
- package/dist/components/proctor-app/Loadable.js +26 -0
- package/dist/components/proctor-app/index.js +181 -0
- package/dist/components/proctor-context-app/Loadable.js +26 -0
- package/dist/components/{ProctoredContextApp.js → proctor-context-app/index.js} +19 -19
- package/dist/utils/loadable.js +29 -0
- package/dist/utils/localStorageUtils.js +33 -0
- package/dist/utils/webcamMicrophoneUtils.js +3 -6
- package/package.json +2 -2
- package/dist/proctoringTracker/tracker.js +0 -17
- package/dist/proctoringTracker/trackerWrapper.js +0 -1
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
require("core-js/modules/es.object.assign.js");
|
|
4
|
-
|
|
5
3
|
Object.defineProperty(exports, "__esModule", {
|
|
6
4
|
value: true
|
|
7
5
|
});
|
|
@@ -15,6 +13,8 @@ var _react = _interopRequireWildcard(require("react"));
|
|
|
15
13
|
|
|
16
14
|
require("./index.scss");
|
|
17
15
|
|
|
16
|
+
var _ = require(".");
|
|
17
|
+
|
|
18
18
|
var _utils = require("../utils");
|
|
19
19
|
|
|
20
20
|
var _hooks = require("../hooks");
|
|
@@ -29,18 +29,12 @@ var _webcamMicrophoneUtils = require("../utils/webcamMicrophoneUtils");
|
|
|
29
29
|
|
|
30
30
|
var _defaults = require("../constants/defaults");
|
|
31
31
|
|
|
32
|
-
var _activityTracker = _interopRequireDefault(require("./activity-tracker"));
|
|
33
|
-
|
|
34
|
-
var _browserUtils = require("../utils/browserUtils");
|
|
35
|
-
|
|
36
32
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
37
33
|
|
|
38
34
|
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); }
|
|
39
35
|
|
|
40
36
|
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; }
|
|
41
37
|
|
|
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
|
-
|
|
44
38
|
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; }
|
|
45
39
|
|
|
46
40
|
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; }
|
|
@@ -52,43 +46,25 @@ const isWebcamProcessingReliable = (0, _utils.isGPUAvailable)();
|
|
|
52
46
|
const ProctorApp = _ref => {
|
|
53
47
|
let {
|
|
54
48
|
proctoringIdentifier,
|
|
55
|
-
customPermissionView = null,
|
|
56
|
-
shouldRenderChildren = false,
|
|
57
|
-
permissionPassedProps = {},
|
|
58
49
|
children,
|
|
59
|
-
proctoredContext,
|
|
60
50
|
config,
|
|
51
|
+
screensharePermission,
|
|
52
|
+
requestScreenshare = () => {},
|
|
61
53
|
getProctorParamValues = () => {},
|
|
62
54
|
getWebcamSnapshot = () => {},
|
|
63
55
|
getScreengrab = () => {}
|
|
64
56
|
} = _ref;
|
|
65
|
-
const
|
|
66
|
-
const
|
|
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
|
-
};
|
|
57
|
+
const webcamReference = (0, _react.useRef)(null);
|
|
58
|
+
const canvasReference = (0, _react.useRef)(null);
|
|
86
59
|
const proctorParams = (0, _react.useMemo)(() => _objectSpread(_objectSpread({}, _defaults.defaultConfig), config.proctorParams), [config.proctorParams]);
|
|
87
60
|
const statistics = (0, _react.useRef)((0, _breachUtils.getInitialStats)(proctorParams));
|
|
88
61
|
const {
|
|
89
62
|
recurring = false,
|
|
90
63
|
recurringFetchInterval = 0
|
|
91
64
|
} = config;
|
|
65
|
+
const [audioPermission, setAudioPermission] = (0, _react.useState)();
|
|
66
|
+
const [videoPermission, setVideoPermission] = (0, _react.useState)();
|
|
67
|
+
const firstFullScreenDone = (0, _react.useRef)(false);
|
|
92
68
|
const recurringFetchIntervalRef = (0, _react.useRef)(null);
|
|
93
69
|
const sendScreengrab = (0, _react.useCallback)(async function () {
|
|
94
70
|
let isBreach = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
|
@@ -104,9 +80,9 @@ const ProctorApp = _ref => {
|
|
|
104
80
|
let breachedParam = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "";
|
|
105
81
|
|
|
106
82
|
if (proctorParams.webcamSnapshots) {
|
|
107
|
-
const webcamSnapshot = (0, _utils.captureWebcamSnapshot)(
|
|
83
|
+
const webcamSnapshot = (0, _utils.captureWebcamSnapshot)(webcamReference);
|
|
108
84
|
|
|
109
|
-
if (
|
|
85
|
+
if (webcamReference) {
|
|
110
86
|
getWebcamSnapshot(proctoringIdentifier, webcamSnapshot, isBreach, breachedParam);
|
|
111
87
|
}
|
|
112
88
|
}
|
|
@@ -116,8 +92,12 @@ const ProctorApp = _ref => {
|
|
|
116
92
|
let breachParam = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "";
|
|
117
93
|
getProctorParamValues(proctoringIdentifier, statistics.current, isBreach, breachParam);
|
|
118
94
|
}, [proctoringIdentifier, getProctorParamValues]);
|
|
119
|
-
const
|
|
120
|
-
|
|
95
|
+
const {
|
|
96
|
+
isFullscreen,
|
|
97
|
+
setFullscreen
|
|
98
|
+
} = (0, _hooks.useFullscreenData)(firstFullScreenDone, proctorParams.fullscreenExit);
|
|
99
|
+
const [userCount, lookedAwayCount] = (0, _useWebcamData.default)(webcamReference, canvasReference, proctorParams);
|
|
100
|
+
const isTabSwitched = !(0, _hooks.usePageVisibility)(proctorParams.tabSwitch) && firstFullScreenDone.current;
|
|
121
101
|
(0, _react.useEffect)(() => {
|
|
122
102
|
if (recurring) {
|
|
123
103
|
recurringFetchIntervalRef.current = setInterval(() => {
|
|
@@ -135,9 +115,9 @@ const ProctorApp = _ref => {
|
|
|
135
115
|
const currentStats = {
|
|
136
116
|
userCount,
|
|
137
117
|
isTabSwitched,
|
|
138
|
-
|
|
118
|
+
isFullscreen,
|
|
139
119
|
lookedAwayCount,
|
|
140
|
-
|
|
120
|
+
isWebcamDataReliable: isWebcamProcessingReliable
|
|
141
121
|
};
|
|
142
122
|
const breachData = (0, _breachUtils.getDataOnBreach)(statistics, currentStats, proctorParams);
|
|
143
123
|
(0, _utils.updateStatistics)(statistics, currentStats, proctorParams);
|
|
@@ -147,32 +127,28 @@ const ProctorApp = _ref => {
|
|
|
147
127
|
sendWebcamSnapshot(true, breachData.breachedParam);
|
|
148
128
|
sendScreengrab(true, breachData.breachedParam);
|
|
149
129
|
}
|
|
150
|
-
}, [userCount, isTabSwitched,
|
|
130
|
+
}, [userCount, isTabSwitched, isFullscreen, lookedAwayCount, sendProctoredParamValues, sendWebcamSnapshot, sendScreengrab, proctorParams]);
|
|
151
131
|
return /*#__PURE__*/_react.default.createElement("div", {
|
|
152
|
-
className: "".concat(proctorParams.copyPasteProctoring ? "disable-copy-paste fullwidth" : "fullwidth")
|
|
153
|
-
}, (0, _breachUtils.showProctoredComponent)(proctorParams,
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
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, {
|
|
132
|
+
className: "".concat(proctorParams.copyPasteProctoring ? "disable-copy-paste fullwidth fullheight" : "fullwidth fullheight")
|
|
133
|
+
}, (0, _breachUtils.showProctoredComponent)(proctorParams, {
|
|
134
|
+
isFullscreen,
|
|
135
|
+
audioPermission,
|
|
136
|
+
videoPermission,
|
|
137
|
+
screensharePermission
|
|
138
|
+
}) && children, /*#__PURE__*/_react.default.createElement(_permissions.Permission, {
|
|
165
139
|
proctorParams: proctorParams,
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
140
|
+
isFullscreen: isFullscreen,
|
|
141
|
+
audioPermisison: audioPermission,
|
|
142
|
+
videoPermission: videoPermission,
|
|
143
|
+
setFullscreen: setFullscreen,
|
|
144
|
+
screensharePermission: screensharePermission,
|
|
145
|
+
requestScreenshare: requestScreenshare
|
|
146
|
+
}), /*#__PURE__*/_react.default.createElement(_.ActivityTracker, {
|
|
170
147
|
proctorParams: proctorParams,
|
|
171
|
-
setAudioPermission:
|
|
172
|
-
setVideoPermission:
|
|
173
|
-
webcamReference:
|
|
174
|
-
canvasReference:
|
|
175
|
-
screenshareReference: references.screenshareReference
|
|
148
|
+
setAudioPermission: setAudioPermission,
|
|
149
|
+
setVideoPermission: setVideoPermission,
|
|
150
|
+
webcamReference: webcamReference,
|
|
151
|
+
canvasReference: canvasReference
|
|
176
152
|
}));
|
|
177
153
|
};
|
|
178
154
|
|
package/dist/components/index.js
CHANGED
|
@@ -18,13 +18,13 @@ Object.defineProperty(exports, "FullScreenPermission", {
|
|
|
18
18
|
Object.defineProperty(exports, "ProctorApp", {
|
|
19
19
|
enumerable: true,
|
|
20
20
|
get: function get() {
|
|
21
|
-
return
|
|
21
|
+
return _Loadable.default;
|
|
22
22
|
}
|
|
23
23
|
});
|
|
24
24
|
Object.defineProperty(exports, "ProctoredContextApp", {
|
|
25
25
|
enumerable: true,
|
|
26
26
|
get: function get() {
|
|
27
|
-
return
|
|
27
|
+
return _Loadable2.default;
|
|
28
28
|
}
|
|
29
29
|
});
|
|
30
30
|
Object.defineProperty(exports, "ScreenshareTracker", {
|
|
@@ -40,8 +40,8 @@ var _permissions = require("./permissions");
|
|
|
40
40
|
|
|
41
41
|
var _screenshare = require("./screenshare");
|
|
42
42
|
|
|
43
|
-
var
|
|
43
|
+
var _Loadable = _interopRequireDefault(require("./proctor-app/Loadable"));
|
|
44
44
|
|
|
45
|
-
var
|
|
45
|
+
var _Loadable2 = _interopRequireDefault(require("./proctor-context-app/Loadable"));
|
|
46
46
|
|
|
47
47
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
require("core-js/modules/es.promise.js");
|
|
9
|
+
|
|
10
|
+
require("core-js/modules/web.dom-collections.iterator.js");
|
|
11
|
+
|
|
12
|
+
var _react = _interopRequireDefault(require("react"));
|
|
13
|
+
|
|
14
|
+
var _loadable = _interopRequireDefault(require("../../utils/loadable"));
|
|
15
|
+
|
|
16
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
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
|
+
var _default = (0, _loadable.default)(() => Promise.resolve().then(() => _interopRequireWildcard(require("./index"))), {
|
|
23
|
+
fallback: /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null)
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
exports.default = _default;
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
require("core-js/modules/es.object.assign.js");
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.default = exports.ProctorApp = void 0;
|
|
9
|
+
|
|
10
|
+
require("core-js/modules/web.dom-collections.iterator.js");
|
|
11
|
+
|
|
12
|
+
require("core-js/modules/es.promise.js");
|
|
13
|
+
|
|
14
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
15
|
+
|
|
16
|
+
require("./index.scss");
|
|
17
|
+
|
|
18
|
+
var _utils = require("../../utils");
|
|
19
|
+
|
|
20
|
+
var _hooks = require("../../hooks");
|
|
21
|
+
|
|
22
|
+
var _permissions = require("../permissions");
|
|
23
|
+
|
|
24
|
+
var _useWebcamData = _interopRequireDefault(require("../../hooks/useWebcamData"));
|
|
25
|
+
|
|
26
|
+
var _breachUtils = require("../../utils/breachUtils");
|
|
27
|
+
|
|
28
|
+
var _webcamMicrophoneUtils = require("../../utils/webcamMicrophoneUtils");
|
|
29
|
+
|
|
30
|
+
var _defaults = require("../../constants/defaults");
|
|
31
|
+
|
|
32
|
+
var _activityTracker = _interopRequireDefault(require("../activity-tracker"));
|
|
33
|
+
|
|
34
|
+
var _browserUtils = require("../../utils/browserUtils");
|
|
35
|
+
|
|
36
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
37
|
+
|
|
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); }
|
|
39
|
+
|
|
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; }
|
|
41
|
+
|
|
42
|
+
function _extends() { _extends = Object.assign || 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
|
+
|
|
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; }
|
|
45
|
+
|
|
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; }
|
|
47
|
+
|
|
48
|
+
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; }
|
|
49
|
+
|
|
50
|
+
const isWebcamProcessingReliable = (0, _utils.isGPUAvailable)();
|
|
51
|
+
|
|
52
|
+
const ProctorApp = _ref => {
|
|
53
|
+
let {
|
|
54
|
+
proctoringIdentifier,
|
|
55
|
+
customPermissionView = null,
|
|
56
|
+
shouldRenderChildren = false,
|
|
57
|
+
permissionPassedProps = {},
|
|
58
|
+
children,
|
|
59
|
+
proctoredContext,
|
|
60
|
+
config,
|
|
61
|
+
getProctorParamValues = () => {},
|
|
62
|
+
getWebcamSnapshot = () => {},
|
|
63
|
+
getScreengrab = () => {}
|
|
64
|
+
} = _ref;
|
|
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
|
+
};
|
|
86
|
+
const proctorParams = (0, _react.useMemo)(() => _objectSpread(_objectSpread({}, _defaults.defaultConfig), config.proctorParams), [config.proctorParams]);
|
|
87
|
+
const statistics = (0, _react.useRef)((0, _breachUtils.getInitialStats)(proctorParams));
|
|
88
|
+
const {
|
|
89
|
+
recurring = false,
|
|
90
|
+
recurringFetchInterval = 0
|
|
91
|
+
} = config;
|
|
92
|
+
const recurringFetchIntervalRef = (0, _react.useRef)(null);
|
|
93
|
+
const sendScreengrab = (0, _react.useCallback)(async function () {
|
|
94
|
+
let isBreach = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
|
95
|
+
let breachedParam = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "";
|
|
96
|
+
|
|
97
|
+
if (proctorParams.screenshareSnapshots && permissions.screenshare) {
|
|
98
|
+
const screenshot = await (0, _webcamMicrophoneUtils.captureScreenshot)();
|
|
99
|
+
getScreengrab(proctoringIdentifier, screenshot, isBreach, breachedParam);
|
|
100
|
+
}
|
|
101
|
+
}, [getScreengrab, proctoringIdentifier, proctorParams.screenshareSnapshots]);
|
|
102
|
+
const sendWebcamSnapshot = (0, _react.useCallback)(function () {
|
|
103
|
+
let isBreach = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
|
104
|
+
let breachedParam = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "";
|
|
105
|
+
|
|
106
|
+
if (proctorParams.webcamSnapshots && permissions.video) {
|
|
107
|
+
const webcamSnapshot = (0, _utils.captureWebcamSnapshot)(references.webcamReference);
|
|
108
|
+
|
|
109
|
+
if (references.webcamReference) {
|
|
110
|
+
getWebcamSnapshot(proctoringIdentifier, webcamSnapshot, isBreach, breachedParam);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}, [proctoringIdentifier, getWebcamSnapshot, proctorParams.webcamSnapshots]);
|
|
114
|
+
const sendProctoredParamValues = (0, _react.useCallback)(function () {
|
|
115
|
+
let isBreach = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
|
116
|
+
let breachParam = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "";
|
|
117
|
+
getProctorParamValues(proctoringIdentifier, statistics.current, isBreach, breachParam);
|
|
118
|
+
}, [proctoringIdentifier, getProctorParamValues]);
|
|
119
|
+
const [userCount, lookedAwayCount] = (0, _useWebcamData.default)(references.webcamReference, references.canvasReference, proctorParams);
|
|
120
|
+
const isTabSwitched = !(0, _hooks.usePageVisibility)(proctorParams.tabSwitch);
|
|
121
|
+
(0, _react.useEffect)(() => {
|
|
122
|
+
if (recurring) {
|
|
123
|
+
recurringFetchIntervalRef.current = setInterval(() => {
|
|
124
|
+
sendProctoredParamValues();
|
|
125
|
+
sendWebcamSnapshot();
|
|
126
|
+
sendScreengrab();
|
|
127
|
+
}, recurringFetchInterval);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
return () => {
|
|
131
|
+
clearInterval(recurringFetchIntervalRef.current);
|
|
132
|
+
};
|
|
133
|
+
}, [recurring, recurringFetchInterval, sendProctoredParamValues, sendWebcamSnapshot, sendScreengrab]);
|
|
134
|
+
(0, _react.useEffect)(() => {
|
|
135
|
+
const currentStats = {
|
|
136
|
+
userCount,
|
|
137
|
+
isTabSwitched,
|
|
138
|
+
isFullScreen: permissions.fullscreen,
|
|
139
|
+
lookedAwayCount,
|
|
140
|
+
isWebcamDataNotReliable: !isWebcamProcessingReliable
|
|
141
|
+
};
|
|
142
|
+
const breachData = (0, _breachUtils.getDataOnBreach)(statistics, currentStats, proctorParams);
|
|
143
|
+
(0, _utils.updateStatistics)(statistics, currentStats, proctorParams);
|
|
144
|
+
|
|
145
|
+
if (breachData) {
|
|
146
|
+
sendProctoredParamValues(true, breachData.breachedParam);
|
|
147
|
+
sendWebcamSnapshot(true, breachData.breachedParam);
|
|
148
|
+
sendScreengrab(true, breachData.breachedParam);
|
|
149
|
+
}
|
|
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 fullheight" : "fullwidth fullheight")
|
|
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, {
|
|
165
|
+
proctorParams: proctorParams,
|
|
166
|
+
permissions: permissions,
|
|
167
|
+
askPermission: actions.askPermission,
|
|
168
|
+
hasAllPermission: actions.hasAllPermission
|
|
169
|
+
}), /*#__PURE__*/_react.default.createElement(_activityTracker.default, {
|
|
170
|
+
proctorParams: proctorParams,
|
|
171
|
+
setAudioPermission: permissionSetter.audio,
|
|
172
|
+
setVideoPermission: permissionSetter.video,
|
|
173
|
+
webcamReference: references.webcamReference,
|
|
174
|
+
canvasReference: references.canvasReference,
|
|
175
|
+
screenshareReference: references.screenshareReference
|
|
176
|
+
}));
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
exports.ProctorApp = ProctorApp;
|
|
180
|
+
var _default = ProctorApp;
|
|
181
|
+
exports.default = _default;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
require("core-js/modules/es.promise.js");
|
|
9
|
+
|
|
10
|
+
require("core-js/modules/web.dom-collections.iterator.js");
|
|
11
|
+
|
|
12
|
+
var _react = _interopRequireDefault(require("react"));
|
|
13
|
+
|
|
14
|
+
var _loadable = _interopRequireDefault(require("../../utils/loadable"));
|
|
15
|
+
|
|
16
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
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
|
+
var _default = (0, _loadable.default)(() => Promise.resolve().then(() => _interopRequireWildcard(require("./index"))), {
|
|
23
|
+
fallback: /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null)
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
exports.default = _default;
|
|
@@ -9,11 +9,11 @@ require("core-js/modules/web.dom-collections.iterator.js");
|
|
|
9
9
|
|
|
10
10
|
var _react = _interopRequireWildcard(require("react"));
|
|
11
11
|
|
|
12
|
-
var _hooks = require("
|
|
12
|
+
var _hooks = require("../../hooks");
|
|
13
13
|
|
|
14
|
-
var _webcamMicrophoneUtils = require("
|
|
14
|
+
var _webcamMicrophoneUtils = require("../../utils/webcamMicrophoneUtils");
|
|
15
15
|
|
|
16
|
-
var _defaults = require("
|
|
16
|
+
var _defaults = require("../../constants/defaults");
|
|
17
17
|
|
|
18
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
19
|
|
|
@@ -47,18 +47,18 @@ const ProctoredContextApp = _ref => {
|
|
|
47
47
|
const screenshareReference = (0, _react.useRef)(null);
|
|
48
48
|
const Context = contextProvider;
|
|
49
49
|
const askPermissionAction = {
|
|
50
|
-
|
|
50
|
+
screenshare: () => {
|
|
51
51
|
(0, _webcamMicrophoneUtils.setupScreensharePermission)(setScreensharePermission, screenshareReference);
|
|
52
52
|
},
|
|
53
|
-
|
|
53
|
+
fullscreen: () => {
|
|
54
54
|
setFullscreen();
|
|
55
55
|
}
|
|
56
56
|
};
|
|
57
57
|
const getPermissionObj = {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
58
|
+
video: videoPermission,
|
|
59
|
+
audio: audioPermisison,
|
|
60
|
+
fullscreen: isFullscreen,
|
|
61
|
+
screenshare: screensharePermission
|
|
62
62
|
};
|
|
63
63
|
const askPermission = (0, _react.useCallback)(requiredPermissions => {
|
|
64
64
|
console.log(requiredPermissions);
|
|
@@ -81,25 +81,25 @@ const ProctoredContextApp = _ref => {
|
|
|
81
81
|
value: {
|
|
82
82
|
permissions: getPermissionObj,
|
|
83
83
|
permissionSetter: {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
84
|
+
audio: setAudioPermission,
|
|
85
|
+
video: setVideoPermission,
|
|
86
|
+
screenshare: setScreensharePermission
|
|
87
87
|
},
|
|
88
88
|
customProps: {
|
|
89
|
-
|
|
89
|
+
childrenRenderer: customRenderer
|
|
90
90
|
},
|
|
91
91
|
customSetter: {
|
|
92
|
-
|
|
92
|
+
childrenRenderer: setCustomRenderer
|
|
93
93
|
},
|
|
94
94
|
proctorParams,
|
|
95
95
|
actions: {
|
|
96
|
-
|
|
97
|
-
|
|
96
|
+
askPermission: askPermission,
|
|
97
|
+
hasAllPermission: hasAllPermission
|
|
98
98
|
},
|
|
99
99
|
references: {
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
100
|
+
webcamReference: webcamReference,
|
|
101
|
+
canvasReference: canvasReference,
|
|
102
|
+
screenshareReference: screenshareReference
|
|
103
103
|
}
|
|
104
104
|
}
|
|
105
105
|
}, children);
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
require("core-js/modules/web.dom-collections.iterator.js");
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.default = void 0;
|
|
9
|
+
|
|
10
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
11
|
+
|
|
12
|
+
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); }
|
|
13
|
+
|
|
14
|
+
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; }
|
|
15
|
+
|
|
16
|
+
const loadable = function loadable(importFunc) {
|
|
17
|
+
let {
|
|
18
|
+
fallback = null
|
|
19
|
+
} = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {
|
|
20
|
+
fallback: null
|
|
21
|
+
};
|
|
22
|
+
const LazyComponent = /*#__PURE__*/(0, _react.lazy)(importFunc);
|
|
23
|
+
return props => /*#__PURE__*/_react.default.createElement(_react.Suspense, {
|
|
24
|
+
fallback: fallback
|
|
25
|
+
}, /*#__PURE__*/_react.default.createElement(LazyComponent, props));
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
var _default = loadable;
|
|
29
|
+
exports.default = _default;
|
|
@@ -0,0 +1,33 @@
|
|
|
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;
|
|
@@ -13,8 +13,6 @@ 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
|
-
|
|
18
16
|
require("core-js/modules/es.typed-array.set.js");
|
|
19
17
|
|
|
20
18
|
require("core-js/modules/es.typed-array.sort.js");
|
|
@@ -161,18 +159,18 @@ const setupScreensharePermission = (setScreensharePermission, screenshareReferen
|
|
|
161
159
|
};
|
|
162
160
|
|
|
163
161
|
track.onended = e => {
|
|
162
|
+
console.log(e, "Track On Ended");
|
|
164
163
|
setScreensharePermission(false);
|
|
165
|
-
console.log(e, "Track Onended Error");
|
|
166
164
|
screenshareReference.current.srcObject = null;
|
|
167
165
|
};
|
|
168
166
|
} else {
|
|
169
|
-
console.log("
|
|
167
|
+
console.log(e, "Track get settings not monitor");
|
|
170
168
|
screenshareReference.current = null;
|
|
171
169
|
setScreensharePermission(false);
|
|
172
170
|
}
|
|
173
171
|
}).catch(e => {
|
|
172
|
+
console.log(e, "Try Catch Failed");
|
|
174
173
|
screenshareReference.current = null;
|
|
175
|
-
console.log(e, "Try Catch Error");
|
|
176
174
|
setScreensharePermission(false);
|
|
177
175
|
});
|
|
178
176
|
|
|
@@ -218,7 +216,6 @@ const captureScreenshot = async () => {
|
|
|
218
216
|
try {
|
|
219
217
|
const canvas = await (0, _html2canvas.default)(document.querySelector("#ss-ref"));
|
|
220
218
|
const b64Snapshot = canvas.toDataURL("image/jpeg");
|
|
221
|
-
console.log(b64Snapshot);
|
|
222
219
|
return b64DataURItoBlob(b64Snapshot);
|
|
223
220
|
} catch (e) {// pass
|
|
224
221
|
}
|
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.26",
|
|
4
4
|
"description": "Used to proctor online tests",
|
|
5
5
|
"author": "ayushkagrawal,shreyachandra,weastel",
|
|
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,17 +0,0 @@
|
|
|
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;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";
|