@newtonschool/react_proctoring_library 0.0.42 → 0.0.43
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/activity-tracker/index.js +143 -0
- package/dist/components/activity-tracker/index.scss +7 -0
- package/dist/components/index.js +7 -0
- package/dist/components/proctor-app/index.js +35 -19
- package/dist/components/proctor-app/index.scss +0 -7
- package/dist/components/proctor-context-app/index.js +10 -3
- package/dist/hooks/usePageVisibility.js +2 -2
- package/dist/hooks/useWebcamData.js +1 -1
- package/dist/utils/browserUtils.js +3 -17
- package/dist/utils/gpuUtils.js +6 -3
- package/dist/utils/index.js +0 -12
- package/dist/utils/webcamMicrophoneUtils.js +6 -22
- package/package.json +1 -1
- package/dist/components/screenshare-activity-tracker/index.js +0 -26
- package/dist/components/webcam-activity-tracker/index.js +0 -55
- package/dist/constants/dom.js +0 -10
- package/dist/hooks/useIsPageFocussed.js +0 -29
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
require("core-js/modules/es.weak-map.js");
|
|
4
|
+
require("core-js/modules/web.dom-collections.iterator.js");
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.default = void 0;
|
|
9
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
10
|
+
var _reactWebcam = _interopRequireDefault(require("react-webcam"));
|
|
11
|
+
var _utils = require("../../utils");
|
|
12
|
+
var _breachUtils = require("../../utils/breachUtils");
|
|
13
|
+
var _browserUtils = require("../../utils/browserUtils");
|
|
14
|
+
var _webcamMicrophoneUtils = require("../../utils/webcamMicrophoneUtils");
|
|
15
|
+
require("./index.scss");
|
|
16
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
17
|
+
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); }
|
|
18
|
+
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; }
|
|
19
|
+
const ActivityTracker = _ref => {
|
|
20
|
+
let {
|
|
21
|
+
proctorParams,
|
|
22
|
+
webcamReference,
|
|
23
|
+
canvasReference,
|
|
24
|
+
screenshareReference,
|
|
25
|
+
setAudioPermission,
|
|
26
|
+
setVideoPermission
|
|
27
|
+
} = _ref;
|
|
28
|
+
const screenshareVideoReference = (0, _react.useRef)(null);
|
|
29
|
+
(0, _react.useEffect)(() => {
|
|
30
|
+
if (screenshareReference.current) {
|
|
31
|
+
screenshareVideoReference.current.srcObject = screenshareReference.current;
|
|
32
|
+
screenshareVideoReference.current.onloadedmetadata = e => {
|
|
33
|
+
screenshareVideoReference.current.play();
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
return () => {
|
|
37
|
+
screenshareVideoReference.current.srcObject = null;
|
|
38
|
+
};
|
|
39
|
+
}, [screenshareReference.current]);
|
|
40
|
+
(0, _react.useEffect)(() => {
|
|
41
|
+
if ((0, _browserUtils.isChrome)()) {
|
|
42
|
+
if ((0, _breachUtils.isWebcamRequired)(proctorParams)) {
|
|
43
|
+
(0, _webcamMicrophoneUtils.updateVideoPermissions)(setVideoPermission);
|
|
44
|
+
(0, _webcamMicrophoneUtils.updateAudioPermissions)(setAudioPermission);
|
|
45
|
+
(0, _webcamMicrophoneUtils.getVideoPermissionQuery)().then(status => {
|
|
46
|
+
status.onchange = evt => {
|
|
47
|
+
(0, _webcamMicrophoneUtils.updateVideoPermissions)(setVideoPermission);
|
|
48
|
+
};
|
|
49
|
+
}).catch(err => {});
|
|
50
|
+
(0, _webcamMicrophoneUtils.getAudioPermissionQuery)().then(status => {
|
|
51
|
+
status.onchange = evt => {
|
|
52
|
+
(0, _webcamMicrophoneUtils.updateAudioPermissions)(setAudioPermission);
|
|
53
|
+
};
|
|
54
|
+
}).catch(err => {
|
|
55
|
+
(0, _webcamMicrophoneUtils.updateAudioPermissions)("Audio Permission", err);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}, [setVideoPermission, setAudioPermission, proctorParams]);
|
|
60
|
+
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, (0, _breachUtils.isWebcamRequired)(proctorParams) && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_reactWebcam.default, {
|
|
61
|
+
audio: true,
|
|
62
|
+
muted: true,
|
|
63
|
+
screenshotFormat: "image/jpeg",
|
|
64
|
+
ref: webcamReference,
|
|
65
|
+
onUserMedia: stream => {
|
|
66
|
+
if (!(0, _browserUtils.isChrome)()) {
|
|
67
|
+
const {
|
|
68
|
+
audio,
|
|
69
|
+
video
|
|
70
|
+
} = (0, _utils.getAudioVideoPermission)(stream);
|
|
71
|
+
setAudioPermission(audio);
|
|
72
|
+
setVideoPermission(video);
|
|
73
|
+
stream.onaddtrack = p => {
|
|
74
|
+
const {
|
|
75
|
+
audio,
|
|
76
|
+
video
|
|
77
|
+
} = (0, _utils.getAudioVideoPermission)(stream);
|
|
78
|
+
setAudioPermission(audio);
|
|
79
|
+
setVideoPermission(video);
|
|
80
|
+
};
|
|
81
|
+
stream.onremovetrack = p => {
|
|
82
|
+
const {
|
|
83
|
+
audio,
|
|
84
|
+
video
|
|
85
|
+
} = (0, _utils.getAudioVideoPermission)(stream);
|
|
86
|
+
setAudioPermission(audio);
|
|
87
|
+
setVideoPermission(video);
|
|
88
|
+
};
|
|
89
|
+
stream.onactive = p => {
|
|
90
|
+
const {
|
|
91
|
+
audio,
|
|
92
|
+
video
|
|
93
|
+
} = (0, _utils.getAudioVideoPermission)(stream);
|
|
94
|
+
setAudioPermission(audio);
|
|
95
|
+
setVideoPermission(video);
|
|
96
|
+
};
|
|
97
|
+
stream.oninactive = e => {
|
|
98
|
+
setAudioPermission(false);
|
|
99
|
+
setVideoPermission(false);
|
|
100
|
+
};
|
|
101
|
+
const audioTracks = stream.getAudioTracks().filter(track => track.enabled && track.label);
|
|
102
|
+
audioTracks.forEach(track => {
|
|
103
|
+
track.onended = e => {
|
|
104
|
+
const audio = (0, _utils.getAudioPermission)(stream);
|
|
105
|
+
setAudioPermission(audio, e.currentTarget.id);
|
|
106
|
+
};
|
|
107
|
+
track.onmute = e => {
|
|
108
|
+
const audio = (0, _utils.getAudioPermission)(stream);
|
|
109
|
+
setAudioPermission(audio, e.currentTarget.id);
|
|
110
|
+
};
|
|
111
|
+
track.onunmute = e => {
|
|
112
|
+
const audio = (0, _utils.getAudioPermission)(stream);
|
|
113
|
+
setAudioPermission(audio);
|
|
114
|
+
};
|
|
115
|
+
});
|
|
116
|
+
const videoTracks = stream.getVideoTracks().filter(track => track.enabled && track.label);
|
|
117
|
+
videoTracks.forEach(track => {
|
|
118
|
+
track.onended = e => {
|
|
119
|
+
const video = (0, _utils.getVideoPermission)(stream, e.currentTarget.id);
|
|
120
|
+
setVideoPermission(video);
|
|
121
|
+
};
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
},
|
|
125
|
+
onUserMediaError: error => {
|
|
126
|
+
if (!(0, _browserUtils.isChrome)()) {
|
|
127
|
+
setVideoPermission(false);
|
|
128
|
+
setAudioPermission(false);
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
className: "hide"
|
|
132
|
+
}), /*#__PURE__*/_react.default.createElement("canvas", {
|
|
133
|
+
ref: canvasReference,
|
|
134
|
+
className: "captured-video-canvas hide",
|
|
135
|
+
id: "wc-ref"
|
|
136
|
+
})), /*#__PURE__*/_react.default.createElement("video", {
|
|
137
|
+
ref: screenshareVideoReference,
|
|
138
|
+
className: "captured-video-canvas hide",
|
|
139
|
+
id: "ss-ref"
|
|
140
|
+
}));
|
|
141
|
+
};
|
|
142
|
+
var _default = ActivityTracker;
|
|
143
|
+
exports.default = _default;
|
package/dist/components/index.js
CHANGED
|
@@ -3,6 +3,12 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
+
Object.defineProperty(exports, "ActivityTracker", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function get() {
|
|
9
|
+
return _activityTracker.default;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
6
12
|
Object.defineProperty(exports, "FullScreenPermission", {
|
|
7
13
|
enumerable: true,
|
|
8
14
|
get: function get() {
|
|
@@ -21,6 +27,7 @@ Object.defineProperty(exports, "ProctoredContextApp", {
|
|
|
21
27
|
return _Loadable2.default;
|
|
22
28
|
}
|
|
23
29
|
});
|
|
30
|
+
var _activityTracker = _interopRequireDefault(require("./activity-tracker"));
|
|
24
31
|
var _permissions = require("./permissions");
|
|
25
32
|
var _Loadable = _interopRequireDefault(require("./proctor-app/Loadable"));
|
|
26
33
|
var _Loadable2 = _interopRequireDefault(require("./proctor-context-app/Loadable"));
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
require("core-js/modules/es.symbol.description.js");
|
|
3
4
|
require("core-js/modules/es.object.assign.js");
|
|
4
5
|
require("core-js/modules/es.weak-map.js");
|
|
5
6
|
Object.defineProperty(exports, "__esModule", {
|
|
6
7
|
value: true
|
|
7
8
|
});
|
|
8
9
|
exports.default = exports.ProctorApp = void 0;
|
|
9
|
-
require("core-js/modules/es.promise.js");
|
|
10
10
|
require("core-js/modules/web.dom-collections.iterator.js");
|
|
11
|
-
require("core-js/modules/es.
|
|
11
|
+
require("core-js/modules/es.promise.js");
|
|
12
12
|
var _react = _interopRequireWildcard(require("react"));
|
|
13
13
|
require("./index.scss");
|
|
14
14
|
var _utils = require("../../utils");
|
|
@@ -18,10 +18,8 @@ var _useWebcamData = _interopRequireDefault(require("../../hooks/useWebcamData")
|
|
|
18
18
|
var _breachUtils = require("../../utils/breachUtils");
|
|
19
19
|
var _webcamMicrophoneUtils = require("../../utils/webcamMicrophoneUtils");
|
|
20
20
|
var _defaults = require("../../constants/defaults");
|
|
21
|
-
var
|
|
21
|
+
var _activityTracker = _interopRequireDefault(require("../activity-tracker"));
|
|
22
22
|
var _browserUtils = require("../../utils/browserUtils");
|
|
23
|
-
var _screenshareActivityTracker = require("../screenshare-activity-tracker");
|
|
24
|
-
var _dom = require("../../constants/dom");
|
|
25
23
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
26
24
|
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); }
|
|
27
25
|
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; }
|
|
@@ -36,6 +34,7 @@ const ProctorApp = _ref => {
|
|
|
36
34
|
let {
|
|
37
35
|
proctoringIdentifier,
|
|
38
36
|
customPermissionView = null,
|
|
37
|
+
shouldRenderChildren = false,
|
|
39
38
|
permissionPassedProps = {},
|
|
40
39
|
children,
|
|
41
40
|
proctoredContext,
|
|
@@ -44,14 +43,27 @@ const ProctorApp = _ref => {
|
|
|
44
43
|
getWebcamSnapshot = () => {},
|
|
45
44
|
getScreengrab = () => {}
|
|
46
45
|
} = _ref;
|
|
46
|
+
const [renderChildren, setRenderChildren] = (0, _react.useState)();
|
|
47
47
|
const context = (0, _react.useContext)(proctoredContext);
|
|
48
48
|
const {
|
|
49
49
|
actions,
|
|
50
50
|
permissions,
|
|
51
51
|
references,
|
|
52
|
-
permissionSetter
|
|
52
|
+
permissionSetter,
|
|
53
|
+
customProps,
|
|
54
|
+
customSetter
|
|
53
55
|
} = context;
|
|
56
|
+
(0, _react.useEffect)(() => {
|
|
57
|
+
if (customProps.childrenRenderer === undefined) {
|
|
58
|
+
setRenderChildren(!shouldRenderChildren);
|
|
59
|
+
} else {
|
|
60
|
+
setRenderChildren(customProps.childrenRenderer);
|
|
61
|
+
}
|
|
62
|
+
}, [customProps]);
|
|
54
63
|
const CustomPermissionView = customPermissionView;
|
|
64
|
+
const browserDetails = {
|
|
65
|
+
isChrome: (0, _browserUtils.isChrome)()
|
|
66
|
+
};
|
|
55
67
|
const proctorParams = (0, _react.useMemo)(() => _objectSpread(_objectSpread({}, _defaults.defaultConfig), config.proctorParams), [config.proctorParams]);
|
|
56
68
|
const statistics = (0, _react.useRef)((0, _breachUtils.getInitialStats)(proctorParams));
|
|
57
69
|
const {
|
|
@@ -63,18 +75,20 @@ const ProctorApp = _ref => {
|
|
|
63
75
|
let isBreach = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
|
64
76
|
let breachedParam = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "";
|
|
65
77
|
if (proctorParams.screenshareSnapshots && permissions.screenshare) {
|
|
66
|
-
const screenshot = await (0, _webcamMicrophoneUtils.captureScreenshot)(
|
|
78
|
+
const screenshot = await (0, _webcamMicrophoneUtils.captureScreenshot)();
|
|
67
79
|
getScreengrab(proctoringIdentifier, screenshot, isBreach, breachedParam);
|
|
68
80
|
}
|
|
69
81
|
}, [getScreengrab, proctoringIdentifier, proctorParams.screenshareSnapshots, permissions.screenshare]);
|
|
70
|
-
const sendWebcamSnapshot = (0, _react.useCallback)(
|
|
82
|
+
const sendWebcamSnapshot = (0, _react.useCallback)(function () {
|
|
71
83
|
let isBreach = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
|
72
84
|
let breachedParam = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "";
|
|
73
85
|
if (proctorParams.webcamSnapshots && permissions.video) {
|
|
74
|
-
const webcamSnapshot =
|
|
75
|
-
|
|
86
|
+
const webcamSnapshot = (0, _utils.captureWebcamSnapshot)(references.webcamReference);
|
|
87
|
+
if (references.webcamReference) {
|
|
88
|
+
getWebcamSnapshot(proctoringIdentifier, webcamSnapshot, isBreach, breachedParam);
|
|
89
|
+
}
|
|
76
90
|
}
|
|
77
|
-
}, [proctoringIdentifier, getWebcamSnapshot, proctorParams.webcamSnapshots, permissions.video]);
|
|
91
|
+
}, [proctoringIdentifier, getWebcamSnapshot, proctorParams.webcamSnapshots, permissions.video, references.webcamReference]);
|
|
78
92
|
const sendProctoredParamValues = (0, _react.useCallback)(function () {
|
|
79
93
|
let isBreach = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
|
80
94
|
let breachParam = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "";
|
|
@@ -110,29 +124,31 @@ const ProctorApp = _ref => {
|
|
|
110
124
|
sendScreengrab(true, breachData.breachedParam);
|
|
111
125
|
}
|
|
112
126
|
}, [userCount, isTabSwitched, permissions.fullscreen, lookedAwayCount, sendProctoredParamValues, sendWebcamSnapshot, sendScreengrab, proctorParams]);
|
|
113
|
-
const shouldShowProctoredComponent = (0, _breachUtils.showProctoredComponent)(proctorParams, actions.hasAllPermission);
|
|
114
127
|
return /*#__PURE__*/_react.default.createElement("div", {
|
|
115
128
|
className: "".concat(proctorParams.copyPasteProctoring ? "disable-copy-paste fullwidth fullheight" : "fullwidth fullheight")
|
|
116
|
-
},
|
|
129
|
+
}, (0, _breachUtils.showProctoredComponent)(proctorParams, actions.hasAllPermission) && renderChildren && children, !((0, _breachUtils.showProctoredComponent)(proctorParams, actions.hasAllPermission) && renderChildren) && customPermissionView && /*#__PURE__*/_react.default.createElement(CustomPermissionView, _extends({
|
|
117
130
|
permissions: permissions,
|
|
118
131
|
hasAllPermission: actions.hasAllPermission,
|
|
119
132
|
askPermission: actions.askPermission,
|
|
120
133
|
references: references,
|
|
121
134
|
actions: actions,
|
|
122
|
-
browserDetails:
|
|
123
|
-
|
|
135
|
+
browserDetails: browserDetails,
|
|
136
|
+
renderChildren: () => {
|
|
137
|
+
setRenderChildren(true);
|
|
138
|
+
customSetter.childrenRenderer(true);
|
|
139
|
+
}
|
|
140
|
+
}, permissionPassedProps)), !((0, _breachUtils.showProctoredComponent)(proctorParams, actions.hasAllPermission) && renderChildren) && !customPermissionView && /*#__PURE__*/_react.default.createElement(_permissions.Permission, {
|
|
124
141
|
proctorParams: proctorParams,
|
|
125
142
|
permissions: permissions,
|
|
126
143
|
askPermission: actions.askPermission,
|
|
127
144
|
hasAllPermission: actions.hasAllPermission
|
|
128
|
-
}), /*#__PURE__*/_react.default.createElement(
|
|
145
|
+
}), /*#__PURE__*/_react.default.createElement(_activityTracker.default, {
|
|
129
146
|
proctorParams: proctorParams,
|
|
130
147
|
setAudioPermission: permissionSetter.audio,
|
|
131
148
|
setVideoPermission: permissionSetter.video,
|
|
132
149
|
webcamReference: references.webcamReference,
|
|
133
|
-
canvasReference: references.canvasReference
|
|
134
|
-
|
|
135
|
-
ref: references.screenshareReference
|
|
150
|
+
canvasReference: references.canvasReference,
|
|
151
|
+
screenshareReference: references.screenshareReference
|
|
136
152
|
}));
|
|
137
153
|
};
|
|
138
154
|
exports.ProctorApp = ProctorApp;
|
|
@@ -35,6 +35,7 @@ const ProctoredContextApp = _ref => {
|
|
|
35
35
|
const [audioPermisison, setAudioPermission] = (0, _react.useState)();
|
|
36
36
|
const [videoPermission, setVideoPermission] = (0, _react.useState)();
|
|
37
37
|
const [screensharePermission, setScreensharePermission] = (0, _react.useState)();
|
|
38
|
+
const [customRenderer, setCustomRenderer] = (0, _react.useState)();
|
|
38
39
|
const webcamReference = (0, _react.useRef)(null);
|
|
39
40
|
const canvasReference = (0, _react.useRef)(null);
|
|
40
41
|
const screenshareReference = (0, _react.useRef)(null);
|
|
@@ -77,15 +78,21 @@ const ProctoredContextApp = _ref => {
|
|
|
77
78
|
video: setVideoPermission,
|
|
78
79
|
screenshare: setScreensharePermission
|
|
79
80
|
},
|
|
81
|
+
customProps: {
|
|
82
|
+
childrenRenderer: customRenderer
|
|
83
|
+
},
|
|
84
|
+
customSetter: {
|
|
85
|
+
childrenRenderer: setCustomRenderer
|
|
86
|
+
},
|
|
80
87
|
proctorParams,
|
|
81
88
|
actions: {
|
|
82
89
|
askPermission: askPermission,
|
|
83
90
|
hasAllPermission: hasAllPermission
|
|
84
91
|
},
|
|
85
92
|
references: {
|
|
86
|
-
webcamReference,
|
|
87
|
-
canvasReference,
|
|
88
|
-
screenshareReference
|
|
93
|
+
webcamReference: webcamReference,
|
|
94
|
+
canvasReference: canvasReference,
|
|
95
|
+
screenshareReference: screenshareReference
|
|
89
96
|
}
|
|
90
97
|
})
|
|
91
98
|
}, children);
|
|
@@ -15,9 +15,9 @@ function usePageVisibility(isProctorParam) {
|
|
|
15
15
|
};
|
|
16
16
|
(0, _react.useEffect)(() => {
|
|
17
17
|
updateVisibility();
|
|
18
|
-
|
|
18
|
+
document.addEventListener(visibilityChangeEvent, updateVisibility, false);
|
|
19
19
|
return () => {
|
|
20
|
-
|
|
20
|
+
document.removeEventListener(visibilityChangeEvent, updateVisibility);
|
|
21
21
|
};
|
|
22
22
|
}, []);
|
|
23
23
|
return isVisible && isProctorParam;
|
|
@@ -31,7 +31,7 @@ function useWebcamData(webcamReference, canvasReference, proctorParams) {
|
|
|
31
31
|
const isWatching = (0, _react.useState)(_defaults.initialValues.isWatching);
|
|
32
32
|
const [lookedAwayCount, setLookedAwayCount] = (0, _react.useState)(_defaults.initialValues.lookedAwayCount);
|
|
33
33
|
(0, _react.useEffect)(() => {
|
|
34
|
-
if (
|
|
34
|
+
if (proctorParams.people && proctorParams.lookedAwayCount && (0, _utils.isGPUAvailable)()) {
|
|
35
35
|
const loadCocoSSDModel = async () => {
|
|
36
36
|
try {
|
|
37
37
|
const model = await cocoSsd.load();
|
|
@@ -3,14 +3,12 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.isChrome = exports.getVisibilityChangeEventName = exports.getIsDocumentVisible = exports.
|
|
6
|
+
exports.isChrome = exports.getVisibilityChangeEventName = exports.getIsDocumentVisible = exports.getBrowserFullscreenElementProp = void 0;
|
|
7
7
|
require("core-js/modules/es.regexp.exec.js");
|
|
8
8
|
require("core-js/modules/es.string.match.js");
|
|
9
9
|
const PROPERTY_TYPES = {
|
|
10
10
|
HIDDEN: "hidden",
|
|
11
|
-
VISIBILITY_CHANGE: "visibilitychange"
|
|
12
|
-
FOCUS: "focus",
|
|
13
|
-
BLUR: "blur"
|
|
11
|
+
VISIBILITY_CHANGE: "visibilitychange"
|
|
14
12
|
};
|
|
15
13
|
const getBrowserPropPrefix = () => {
|
|
16
14
|
if (typeof document.msHidden !== "undefined") {
|
|
@@ -32,10 +30,6 @@ const getBrowserDocumentProp = type => {
|
|
|
32
30
|
return getBrowserPropForHidden();
|
|
33
31
|
case PROPERTY_TYPES.VISIBILITY_CHANGE:
|
|
34
32
|
return "".concat(getBrowserPropPrefix(), "visibilitychange");
|
|
35
|
-
case PROPERTY_TYPES.FOCUS:
|
|
36
|
-
return "focus";
|
|
37
|
-
case PROPERTY_TYPES.BLUR:
|
|
38
|
-
return "blur";
|
|
39
33
|
default:
|
|
40
34
|
return "";
|
|
41
35
|
}
|
|
@@ -44,10 +38,6 @@ const getIsDocumentVisible = () => !document[getBrowserDocumentProp(PROPERTY_TYP
|
|
|
44
38
|
exports.getIsDocumentVisible = getIsDocumentVisible;
|
|
45
39
|
const getVisibilityChangeEventName = () => getBrowserDocumentProp(PROPERTY_TYPES.VISIBILITY_CHANGE);
|
|
46
40
|
exports.getVisibilityChangeEventName = getVisibilityChangeEventName;
|
|
47
|
-
const getFocusEventName = () => getBrowserDocumentProp(PROPERTY_TYPES.FOCUS);
|
|
48
|
-
exports.getFocusEventName = getFocusEventName;
|
|
49
|
-
const getBlurEventName = () => getBrowserDocumentProp(PROPERTY_TYPES.BLUR);
|
|
50
|
-
exports.getBlurEventName = getBlurEventName;
|
|
51
41
|
const getBrowserFullscreenElementProp = () => {
|
|
52
42
|
if (typeof document.fullscreenElement !== "undefined") {
|
|
53
43
|
return "fullscreenElement";
|
|
@@ -61,8 +51,4 @@ const getBrowserFullscreenElementProp = () => {
|
|
|
61
51
|
};
|
|
62
52
|
exports.getBrowserFullscreenElementProp = getBrowserFullscreenElementProp;
|
|
63
53
|
const isChrome = () => !!navigator.userAgent.match(/chrome|chromium/i);
|
|
64
|
-
exports.isChrome = isChrome;
|
|
65
|
-
const getBrowserDetails = () => ({
|
|
66
|
-
isChrome: isChrome()
|
|
67
|
-
});
|
|
68
|
-
exports.getBrowserDetails = getBrowserDetails;
|
|
54
|
+
exports.isChrome = isChrome;
|
package/dist/utils/gpuUtils.js
CHANGED
|
@@ -11,10 +11,13 @@ var _defaults = require("../constants/defaults");
|
|
|
11
11
|
const isGPUAvailable = () => {
|
|
12
12
|
const canvas = document.createElement("canvas");
|
|
13
13
|
const webgl = canvas.getContext("webgl") || canvas.getContext("experimental-webgl");
|
|
14
|
-
const debugInfo = webgl.getExtension("webgl_debug_renderer_info");
|
|
15
|
-
|
|
14
|
+
const debugInfo = webgl === null || webgl === void 0 ? void 0 : webgl.getExtension("webgl_debug_renderer_info");
|
|
15
|
+
if (!debugInfo) {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
const gpu = webgl.getParameter(debugInfo === null || debugInfo === void 0 ? void 0 : debugInfo.UNMASKED_RENDERER_WEBGL).toLowerCase();
|
|
16
19
|
for (const gpuType of _defaults.gpuTypes) {
|
|
17
|
-
if (gpu.includes(gpuType)) return true;
|
|
20
|
+
if (gpu !== null && gpu !== void 0 && gpu.includes(gpuType)) return true;
|
|
18
21
|
}
|
|
19
22
|
return false;
|
|
20
23
|
};
|
package/dist/utils/index.js
CHANGED
|
@@ -21,24 +21,12 @@ Object.defineProperty(exports, "getAudioVideoPermission", {
|
|
|
21
21
|
return _webcamMicrophoneUtils.getAudioVideoPermission;
|
|
22
22
|
}
|
|
23
23
|
});
|
|
24
|
-
Object.defineProperty(exports, "getBlurEventName", {
|
|
25
|
-
enumerable: true,
|
|
26
|
-
get: function get() {
|
|
27
|
-
return _browserUtils.getBlurEventName;
|
|
28
|
-
}
|
|
29
|
-
});
|
|
30
24
|
Object.defineProperty(exports, "getBrowserFullscreenElementProp", {
|
|
31
25
|
enumerable: true,
|
|
32
26
|
get: function get() {
|
|
33
27
|
return _browserUtils.getBrowserFullscreenElementProp;
|
|
34
28
|
}
|
|
35
29
|
});
|
|
36
|
-
Object.defineProperty(exports, "getFocusEventName", {
|
|
37
|
-
enumerable: true,
|
|
38
|
-
get: function get() {
|
|
39
|
-
return _browserUtils.getFocusEventName;
|
|
40
|
-
}
|
|
41
|
-
});
|
|
42
30
|
Object.defineProperty(exports, "getIsDocumentVisible", {
|
|
43
31
|
enumerable: true,
|
|
44
32
|
get: function get() {
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.updateVideoPermissions = exports.updateStatistics = exports.updateAudioPermissions = exports.setupScreensharePermission = 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
|
require("core-js/modules/es.array-buffer.slice.js");
|
|
8
8
|
require("core-js/modules/es.typed-array.uint8-array.js");
|
|
9
9
|
require("core-js/modules/es.typed-array.fill.js");
|
|
@@ -115,11 +115,10 @@ const setupScreensharePermission = (setScreensharePermission, screenshareReferen
|
|
|
115
115
|
const track = stream.getTracks()[0];
|
|
116
116
|
if (track.getSettings().displaySurface === "monitor") {
|
|
117
117
|
setScreensharePermission(true);
|
|
118
|
-
screenshareReference.
|
|
119
|
-
collectScreenshare(screenshareReference);
|
|
118
|
+
screenshareReference.current = stream;
|
|
120
119
|
track.onended = e => {
|
|
121
120
|
setScreensharePermission(false);
|
|
122
|
-
screenshareReference.current
|
|
121
|
+
screenshareReference.current = null;
|
|
123
122
|
};
|
|
124
123
|
} else {
|
|
125
124
|
track.stop();
|
|
@@ -127,25 +126,10 @@ const setupScreensharePermission = (setScreensharePermission, screenshareReferen
|
|
|
127
126
|
setScreensharePermission(false);
|
|
128
127
|
}
|
|
129
128
|
}).catch(e => {
|
|
130
|
-
|
|
129
|
+
screenshareReference.current = null;
|
|
131
130
|
setScreensharePermission(false);
|
|
132
131
|
});
|
|
133
132
|
exports.setupScreensharePermission = setupScreensharePermission;
|
|
134
|
-
const collectScreenshare = screenshareReference => {
|
|
135
|
-
screenshareReference.current.srcObject = screenshareReference.stream;
|
|
136
|
-
screenshareReference.current.onloadedmetadata = e => {
|
|
137
|
-
screenshareReference.current.play();
|
|
138
|
-
};
|
|
139
|
-
};
|
|
140
|
-
exports.collectScreenshare = collectScreenshare;
|
|
141
|
-
const resetScreenshotReference = screenshareReference => {
|
|
142
|
-
screenshareReference.current = null;
|
|
143
|
-
};
|
|
144
|
-
exports.resetScreenshotReference = resetScreenshotReference;
|
|
145
|
-
const resetWebcamReference = webcamReference => {
|
|
146
|
-
webcamReference.current = null;
|
|
147
|
-
};
|
|
148
|
-
exports.resetWebcamReference = resetWebcamReference;
|
|
149
133
|
const getVideoPermissionQuery = () => navigator.permissions.query({
|
|
150
134
|
name: "camera"
|
|
151
135
|
});
|
|
@@ -174,9 +158,9 @@ const captureWebcamSnapshot = webcamReference => {
|
|
|
174
158
|
}
|
|
175
159
|
};
|
|
176
160
|
exports.captureWebcamSnapshot = captureWebcamSnapshot;
|
|
177
|
-
const captureScreenshot = async
|
|
161
|
+
const captureScreenshot = async () => {
|
|
178
162
|
try {
|
|
179
|
-
const canvas = await (0, _html2canvas.default)(document.querySelector(
|
|
163
|
+
const canvas = await (0, _html2canvas.default)(document.querySelector("#ss-ref"));
|
|
180
164
|
const b64Snapshot = canvas.toDataURL("image/jpeg");
|
|
181
165
|
return b64DataURItoBlob(b64Snapshot);
|
|
182
166
|
} catch (e) {
|
package/package.json
CHANGED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
require("core-js/modules/es.weak-map.js");
|
|
4
|
-
require("core-js/modules/web.dom-collections.iterator.js");
|
|
5
|
-
Object.defineProperty(exports, "__esModule", {
|
|
6
|
-
value: true
|
|
7
|
-
});
|
|
8
|
-
exports.ScreenshareActivityTracker = void 0;
|
|
9
|
-
var _react = _interopRequireWildcard(require("react"));
|
|
10
|
-
var _dom = require("../../constants/dom");
|
|
11
|
-
var _webcamMicrophoneUtils = require("../../utils/webcamMicrophoneUtils");
|
|
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
|
-
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; }
|
|
14
|
-
const ScreenshareActivityTracker = /*#__PURE__*/(0, _react.forwardRef)((props, screenshareReference) => {
|
|
15
|
-
(0, _react.useEffect)(() => {
|
|
16
|
-
if (screenshareReference.stream) {
|
|
17
|
-
(0, _webcamMicrophoneUtils.collectScreenshare)(screenshareReference);
|
|
18
|
-
}
|
|
19
|
-
}, []);
|
|
20
|
-
return /*#__PURE__*/_react.default.createElement("video", {
|
|
21
|
-
ref: screenshareReference,
|
|
22
|
-
className: "captured-video-canvas hide",
|
|
23
|
-
id: _dom.SCREENSHARE_REFERENCE_ID
|
|
24
|
-
});
|
|
25
|
-
});
|
|
26
|
-
exports.ScreenshareActivityTracker = ScreenshareActivityTracker;
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
require("core-js/modules/es.weak-map.js");
|
|
4
|
-
require("core-js/modules/web.dom-collections.iterator.js");
|
|
5
|
-
Object.defineProperty(exports, "__esModule", {
|
|
6
|
-
value: true
|
|
7
|
-
});
|
|
8
|
-
exports.default = void 0;
|
|
9
|
-
var _react = _interopRequireWildcard(require("react"));
|
|
10
|
-
var _reactWebcam = _interopRequireDefault(require("react-webcam"));
|
|
11
|
-
var _dom = require("../../constants/dom");
|
|
12
|
-
var _breachUtils = require("../../utils/breachUtils");
|
|
13
|
-
var _browserUtils = require("../../utils/browserUtils");
|
|
14
|
-
var _webcamMicrophoneUtils = require("../../utils/webcamMicrophoneUtils");
|
|
15
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
16
|
-
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); }
|
|
17
|
-
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; }
|
|
18
|
-
const WebcamActivityTracker = _ref => {
|
|
19
|
-
let {
|
|
20
|
-
proctorParams,
|
|
21
|
-
setAudioPermission,
|
|
22
|
-
setVideoPermission,
|
|
23
|
-
webcamReference
|
|
24
|
-
} = _ref;
|
|
25
|
-
(0, _react.useEffect)(() => {
|
|
26
|
-
if ((0, _browserUtils.isChrome)()) {
|
|
27
|
-
if ((0, _breachUtils.isWebcamRequired)(proctorParams)) {
|
|
28
|
-
(0, _webcamMicrophoneUtils.updateAudioPermissions)(setAudioPermission);
|
|
29
|
-
(0, _webcamMicrophoneUtils.getAudioPermissionQuery)().then(status => {
|
|
30
|
-
status.onchange = evt => {
|
|
31
|
-
(0, _webcamMicrophoneUtils.updateAudioPermissions)(setAudioPermission);
|
|
32
|
-
};
|
|
33
|
-
}).catch(err => {
|
|
34
|
-
(0, _webcamMicrophoneUtils.updateAudioPermissions)("Audio Permission", err);
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
}, [setVideoPermission, setAudioPermission, proctorParams]);
|
|
39
|
-
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, (0, _breachUtils.isWebcamRequired)(proctorParams) && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_reactWebcam.default, {
|
|
40
|
-
audio: true,
|
|
41
|
-
muted: true,
|
|
42
|
-
screenshotFormat: "image/jpeg",
|
|
43
|
-
ref: webcamReference,
|
|
44
|
-
onUserMedia: () => {
|
|
45
|
-
setVideoPermission(true);
|
|
46
|
-
},
|
|
47
|
-
onUserMediaError: () => {
|
|
48
|
-
setVideoPermission(false);
|
|
49
|
-
},
|
|
50
|
-
className: "captured-video-canvas hide",
|
|
51
|
-
id: _dom.WEBCAM_REFERENCE_ID
|
|
52
|
-
})));
|
|
53
|
-
};
|
|
54
|
-
var _default = WebcamActivityTracker;
|
|
55
|
-
exports.default = _default;
|
package/dist/constants/dom.js
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.WEBCAM_REFERENCE_ID = exports.SCREENSHARE_REFERENCE_ID = void 0;
|
|
7
|
-
const WEBCAM_REFERENCE_ID = "wc-ref";
|
|
8
|
-
exports.WEBCAM_REFERENCE_ID = WEBCAM_REFERENCE_ID;
|
|
9
|
-
const SCREENSHARE_REFERENCE_ID = "ss-ref";
|
|
10
|
-
exports.SCREENSHARE_REFERENCE_ID = SCREENSHARE_REFERENCE_ID;
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = useIsPageFocussed;
|
|
7
|
-
require("core-js/modules/web.dom-collections.iterator.js");
|
|
8
|
-
var _react = require("react");
|
|
9
|
-
var _utils = require("../utils");
|
|
10
|
-
const focusEvent = (0, _utils.getFocusEventName)();
|
|
11
|
-
const blurEvent = (0, _utils.getBlurEventName)();
|
|
12
|
-
function useIsPageFocussed(isProctorParam) {
|
|
13
|
-
const [isFocussed, setIsFocussed] = (0, _react.useState)(true);
|
|
14
|
-
const updateVisibilityOnFocus = () => {
|
|
15
|
-
setIsFocussed(true);
|
|
16
|
-
};
|
|
17
|
-
const updateVisibilityOnBlur = () => {
|
|
18
|
-
setIsFocussed(false);
|
|
19
|
-
};
|
|
20
|
-
(0, _react.useEffect)(() => {
|
|
21
|
-
window.addEventListener(focusEvent, updateVisibilityOnFocus, false);
|
|
22
|
-
window.addEventListener(blurEvent, updateVisibilityOnBlur, false);
|
|
23
|
-
return () => {
|
|
24
|
-
window.removeEventListener(focusEvent, updateVisibilityOnFocus);
|
|
25
|
-
window.removeEventListener(blurEvent, updateVisibilityOnBlur);
|
|
26
|
-
};
|
|
27
|
-
}, []);
|
|
28
|
-
return isFocussed && isProctorParam;
|
|
29
|
-
}
|