@newtonschool/react_proctoring_library 0.0.33 → 0.0.35
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/assets/images/newton-school-logo.png +0 -0
- package/dist/assets/images/url-video-permission-highlight.png +0 -0
- package/dist/assets/videos/ask-permission.mp4 +0 -0
- package/dist/components/activity-tracker/index.js +164 -0
- package/dist/components/activity-tracker/index.scss +7 -0
- package/dist/components/index.js +39 -0
- package/dist/components/permissions/index.js +77 -0
- package/dist/components/permissions/index.scss +6 -0
- package/dist/components/permissions/permission-body.js +60 -0
- package/dist/components/proctor-app/Loadable.js +26 -0
- package/dist/components/proctor-app/index.js +181 -0
- package/dist/components/proctor-app/index.scss +12 -0
- package/dist/components/proctor-context-app/Loadable.js +26 -0
- package/dist/components/proctor-context-app/index.js +108 -0
- package/dist/constants/defaults.js +54 -0
- package/dist/constants/text.js +60 -0
- package/dist/hooks/index.js +23 -0
- package/dist/hooks/useFullScreenData.js +43 -0
- package/dist/hooks/usePageVisibility.js +31 -0
- package/dist/hooks/useWebcamData.js +82 -0
- package/dist/index.js +19 -0
- package/dist/utils/arrayUtils.js +16 -0
- package/dist/utils/breachUtils.js +135 -0
- package/dist/utils/browserUtils.js +72 -0
- package/dist/utils/gpuUtils.js +29 -0
- package/dist/utils/index.js +79 -0
- package/dist/utils/loadable.js +29 -0
- package/dist/utils/webcamMicrophoneUtils.js +216 -0
- package/package.json +1 -1
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,164 @@
|
|
|
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
|
+
var _reactWebcam = _interopRequireDefault(require("react-webcam"));
|
|
13
|
+
|
|
14
|
+
var _utils = require("../../utils");
|
|
15
|
+
|
|
16
|
+
var _breachUtils = require("../../utils/breachUtils");
|
|
17
|
+
|
|
18
|
+
var _browserUtils = require("../../utils/browserUtils");
|
|
19
|
+
|
|
20
|
+
var _webcamMicrophoneUtils = require("../../utils/webcamMicrophoneUtils");
|
|
21
|
+
|
|
22
|
+
require("./index.scss");
|
|
23
|
+
|
|
24
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
25
|
+
|
|
26
|
+
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
|
+
|
|
28
|
+
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; }
|
|
29
|
+
|
|
30
|
+
const ActivityTracker = _ref => {
|
|
31
|
+
let {
|
|
32
|
+
proctorParams,
|
|
33
|
+
webcamReference,
|
|
34
|
+
canvasReference,
|
|
35
|
+
screenshareReference,
|
|
36
|
+
setAudioPermission,
|
|
37
|
+
setVideoPermission
|
|
38
|
+
} = _ref;
|
|
39
|
+
const screenshareVideoReference = (0, _react.useRef)(null);
|
|
40
|
+
(0, _react.useEffect)(() => {
|
|
41
|
+
if (screenshareReference.current) {
|
|
42
|
+
screenshareVideoReference.current.srcObject = screenshareReference.current;
|
|
43
|
+
|
|
44
|
+
screenshareVideoReference.current.onloadedmetadata = e => {
|
|
45
|
+
screenshareVideoReference.current.play();
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return () => {
|
|
50
|
+
screenshareVideoReference.current.srcObject = null;
|
|
51
|
+
};
|
|
52
|
+
}, [screenshareReference.current]);
|
|
53
|
+
(0, _react.useEffect)(() => {
|
|
54
|
+
if ((0, _browserUtils.isChrome)()) {
|
|
55
|
+
if ((0, _breachUtils.isWebcamRequired)(proctorParams)) {
|
|
56
|
+
(0, _webcamMicrophoneUtils.updateVideoPermissions)(setVideoPermission);
|
|
57
|
+
(0, _webcamMicrophoneUtils.updateAudioPermissions)(setAudioPermission);
|
|
58
|
+
(0, _webcamMicrophoneUtils.getVideoPermissionQuery)().then(status => {
|
|
59
|
+
status.onchange = evt => {
|
|
60
|
+
(0, _webcamMicrophoneUtils.updateVideoPermissions)(setVideoPermission);
|
|
61
|
+
};
|
|
62
|
+
}).catch(err => {});
|
|
63
|
+
(0, _webcamMicrophoneUtils.getAudioPermissionQuery)().then(status => {
|
|
64
|
+
status.onchange = evt => {
|
|
65
|
+
(0, _webcamMicrophoneUtils.updateAudioPermissions)(setAudioPermission);
|
|
66
|
+
};
|
|
67
|
+
}).catch(err => {
|
|
68
|
+
(0, _webcamMicrophoneUtils.updateAudioPermissions)("Audio Permission", err);
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}, [setVideoPermission, setAudioPermission, proctorParams]);
|
|
73
|
+
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, {
|
|
74
|
+
audio: true,
|
|
75
|
+
muted: true,
|
|
76
|
+
screenshotFormat: "image/jpeg",
|
|
77
|
+
ref: webcamReference,
|
|
78
|
+
onUserMedia: stream => {
|
|
79
|
+
if (!(0, _browserUtils.isChrome)()) {
|
|
80
|
+
const {
|
|
81
|
+
audio,
|
|
82
|
+
video
|
|
83
|
+
} = (0, _utils.getAudioVideoPermission)(stream);
|
|
84
|
+
setAudioPermission(audio);
|
|
85
|
+
setVideoPermission(video);
|
|
86
|
+
|
|
87
|
+
stream.onaddtrack = p => {
|
|
88
|
+
const {
|
|
89
|
+
audio,
|
|
90
|
+
video
|
|
91
|
+
} = (0, _utils.getAudioVideoPermission)(stream);
|
|
92
|
+
setAudioPermission(audio);
|
|
93
|
+
setVideoPermission(video);
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
stream.onremovetrack = p => {
|
|
97
|
+
const {
|
|
98
|
+
audio,
|
|
99
|
+
video
|
|
100
|
+
} = (0, _utils.getAudioVideoPermission)(stream);
|
|
101
|
+
setAudioPermission(audio);
|
|
102
|
+
setVideoPermission(video);
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
stream.onactive = p => {
|
|
106
|
+
const {
|
|
107
|
+
audio,
|
|
108
|
+
video
|
|
109
|
+
} = (0, _utils.getAudioVideoPermission)(stream);
|
|
110
|
+
setAudioPermission(audio);
|
|
111
|
+
setVideoPermission(video);
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
stream.oninactive = e => {
|
|
115
|
+
setAudioPermission(false);
|
|
116
|
+
setVideoPermission(false);
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
const audioTracks = stream.getAudioTracks().filter(track => track.enabled && track.label);
|
|
120
|
+
audioTracks.forEach(track => {
|
|
121
|
+
track.onended = e => {
|
|
122
|
+
const audio = (0, _utils.getAudioPermission)(stream);
|
|
123
|
+
setAudioPermission(audio, e.currentTarget.id);
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
track.onmute = e => {
|
|
127
|
+
const audio = (0, _utils.getAudioPermission)(stream);
|
|
128
|
+
setAudioPermission(audio, e.currentTarget.id);
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
track.onunmute = e => {
|
|
132
|
+
const audio = (0, _utils.getAudioPermission)(stream);
|
|
133
|
+
setAudioPermission(audio);
|
|
134
|
+
};
|
|
135
|
+
});
|
|
136
|
+
const videoTracks = stream.getVideoTracks().filter(track => track.enabled && track.label);
|
|
137
|
+
videoTracks.forEach(track => {
|
|
138
|
+
track.onended = e => {
|
|
139
|
+
const video = (0, _utils.getVideoPermission)(stream, e.currentTarget.id);
|
|
140
|
+
setVideoPermission(video);
|
|
141
|
+
};
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
},
|
|
145
|
+
onUserMediaError: error => {
|
|
146
|
+
if (!(0, _browserUtils.isChrome)()) {
|
|
147
|
+
setVideoPermission(false);
|
|
148
|
+
setAudioPermission(false);
|
|
149
|
+
}
|
|
150
|
+
},
|
|
151
|
+
className: "hide"
|
|
152
|
+
}), /*#__PURE__*/_react.default.createElement("canvas", {
|
|
153
|
+
ref: canvasReference,
|
|
154
|
+
className: "captured-video-canvas hide",
|
|
155
|
+
id: "wc-ref"
|
|
156
|
+
})), /*#__PURE__*/_react.default.createElement("video", {
|
|
157
|
+
ref: screenshareVideoReference,
|
|
158
|
+
className: "captured-video-canvas hide",
|
|
159
|
+
id: "ss-ref"
|
|
160
|
+
}));
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
var _default = ActivityTracker;
|
|
164
|
+
exports.default = _default;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
Object.defineProperty(exports, "ActivityTracker", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function get() {
|
|
9
|
+
return _activityTracker.default;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
Object.defineProperty(exports, "FullScreenPermission", {
|
|
13
|
+
enumerable: true,
|
|
14
|
+
get: function get() {
|
|
15
|
+
return _permissions.FullScreenPermission;
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
Object.defineProperty(exports, "ProctorApp", {
|
|
19
|
+
enumerable: true,
|
|
20
|
+
get: function get() {
|
|
21
|
+
return _Loadable.default;
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
Object.defineProperty(exports, "ProctoredContextApp", {
|
|
25
|
+
enumerable: true,
|
|
26
|
+
get: function get() {
|
|
27
|
+
return _Loadable2.default;
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
var _activityTracker = _interopRequireDefault(require("./activity-tracker"));
|
|
32
|
+
|
|
33
|
+
var _permissions = require("./permissions");
|
|
34
|
+
|
|
35
|
+
var _Loadable = _interopRequireDefault(require("./proctor-app/Loadable"));
|
|
36
|
+
|
|
37
|
+
var _Loadable2 = _interopRequireDefault(require("./proctor-context-app/Loadable"));
|
|
38
|
+
|
|
39
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
@@ -0,0 +1,77 @@
|
|
|
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.Permission = void 0;
|
|
9
|
+
|
|
10
|
+
var _react = _interopRequireDefault(require("react"));
|
|
11
|
+
|
|
12
|
+
var _reactBootstrap = require("react-bootstrap");
|
|
13
|
+
|
|
14
|
+
var _askPermission = _interopRequireDefault(require("../../assets/videos/ask-permission.mp4"));
|
|
15
|
+
|
|
16
|
+
require("./index.scss");
|
|
17
|
+
|
|
18
|
+
var text = _interopRequireWildcard(require("../../constants/text"));
|
|
19
|
+
|
|
20
|
+
var _permissionBody = require("./permission-body");
|
|
21
|
+
|
|
22
|
+
var _breachUtils = require("../../utils/breachUtils");
|
|
23
|
+
|
|
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); }
|
|
25
|
+
|
|
26
|
+
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; }
|
|
27
|
+
|
|
28
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
29
|
+
|
|
30
|
+
const Permission = _ref => {
|
|
31
|
+
let {
|
|
32
|
+
proctorParams,
|
|
33
|
+
permissions,
|
|
34
|
+
askPermission,
|
|
35
|
+
hasAllPermission
|
|
36
|
+
} = _ref;
|
|
37
|
+
const showPermissionModal = !hasAllPermission((0, _breachUtils.getRequiredPermissionsFromProctorParams)(proctorParams));
|
|
38
|
+
return /*#__PURE__*/_react.default.createElement(_reactBootstrap.Modal, {
|
|
39
|
+
show: showPermissionModal,
|
|
40
|
+
size: "lg",
|
|
41
|
+
backdrop: "static",
|
|
42
|
+
"aria-labelledby": "contained-modal-title-vcenter",
|
|
43
|
+
centered: true
|
|
44
|
+
}, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Modal.Header, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Modal.Title, null, text.PERMISSION_TITLE)), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Modal.Body, {
|
|
45
|
+
className: "font-medium"
|
|
46
|
+
}, /*#__PURE__*/_react.default.createElement("div", {
|
|
47
|
+
style: {
|
|
48
|
+
borderRadius: "20px"
|
|
49
|
+
}
|
|
50
|
+
}, /*#__PURE__*/_react.default.createElement("video", {
|
|
51
|
+
className: "videoStyles",
|
|
52
|
+
width: "100%",
|
|
53
|
+
height: "240",
|
|
54
|
+
autoPlay: true,
|
|
55
|
+
muted: true,
|
|
56
|
+
loop: true,
|
|
57
|
+
playsInline: true
|
|
58
|
+
}, /*#__PURE__*/_react.default.createElement("source", {
|
|
59
|
+
src: _askPermission.default
|
|
60
|
+
}), text.VIDEO_UNSUPPORTED_IN_BROWSER)), /*#__PURE__*/_react.default.createElement(_permissionBody.PermissionBody, {
|
|
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, {
|
|
66
|
+
onClick: () => {
|
|
67
|
+
askPermission(['screenshare']);
|
|
68
|
+
}
|
|
69
|
+
}, text.ALLOW_SCREENSHARE), !permissions.fullscreen && proctorParams.fullscreenExit && /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
|
|
70
|
+
variant: "primary",
|
|
71
|
+
onClick: () => {
|
|
72
|
+
askPermission(['fullscreen']);
|
|
73
|
+
}
|
|
74
|
+
}, text.ALLOW_FULLSCREEN)));
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
exports.Permission = Permission;
|
|
@@ -0,0 +1,60 @@
|
|
|
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.PermissionBody = void 0;
|
|
9
|
+
|
|
10
|
+
var _react = _interopRequireDefault(require("react"));
|
|
11
|
+
|
|
12
|
+
var _urlVideoPermissionHighlight = _interopRequireDefault(require("../../assets/images/url-video-permission-highlight.png"));
|
|
13
|
+
|
|
14
|
+
require("./index.scss");
|
|
15
|
+
|
|
16
|
+
var text = _interopRequireWildcard(require("../../constants/text"));
|
|
17
|
+
|
|
18
|
+
var _browserUtils = require("../../utils/browserUtils");
|
|
19
|
+
|
|
20
|
+
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); }
|
|
21
|
+
|
|
22
|
+
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; }
|
|
23
|
+
|
|
24
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
25
|
+
|
|
26
|
+
const PermissionBody = _ref => {
|
|
27
|
+
let {
|
|
28
|
+
showFullscreenText,
|
|
29
|
+
showAudioPermissionText,
|
|
30
|
+
showVideoPermissionText,
|
|
31
|
+
showScreensharePermission
|
|
32
|
+
} = _ref;
|
|
33
|
+
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
|
|
34
|
+
className: "mb-2"
|
|
35
|
+
}, text.PERMISSION_GENERIC), showScreensharePermission && /*#__PURE__*/_react.default.createElement("div", {
|
|
36
|
+
className: "mb-2"
|
|
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
|
+
className: "pr-2 font-weight-bold"
|
|
39
|
+
}, "Screenshare:"), text.PERMISSION_SCREENSHARE), showAudioPermissionText && showVideoPermissionText ? /*#__PURE__*/_react.default.createElement("div", {
|
|
40
|
+
className: "mb-2"
|
|
41
|
+
}, /*#__PURE__*/_react.default.createElement("span", {
|
|
42
|
+
className: "pr-2 font-weight-bold"
|
|
43
|
+
}, "Camera/Microphone:"), text.PERMISSION_AUDIO_VIDEO) : /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, showVideoPermissionText && /*#__PURE__*/_react.default.createElement("div", {
|
|
44
|
+
className: "mb-2"
|
|
45
|
+
}, /*#__PURE__*/_react.default.createElement("span", {
|
|
46
|
+
className: "pr-2 font-weight-bold"
|
|
47
|
+
}, "Camera:"), text.PERMISSION_VIDEO), showAudioPermissionText && /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("span", {
|
|
48
|
+
className: "pr-2 font-weight-bold"
|
|
49
|
+
}, "Microphone:"), text.PERMISSION_AUDIO)), (showAudioPermissionText || showVideoPermissionText) && /*#__PURE__*/_react.default.createElement("div", {
|
|
50
|
+
className: "d-flex justify-content-center"
|
|
51
|
+
}, /*#__PURE__*/_react.default.createElement("img", {
|
|
52
|
+
className: "video-permission-img",
|
|
53
|
+
alt: "url_video_permission_highlight",
|
|
54
|
+
src: _urlVideoPermissionHighlight.default
|
|
55
|
+
})), showFullscreenText && /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("span", {
|
|
56
|
+
className: "pr-2 font-weight-bold"
|
|
57
|
+
}, "Fullscreen:"), text.PERMISSION_FULLSCREEN));
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
exports.PermissionBody = PermissionBody;
|
|
@@ -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 ? 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
|
+
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, permissions.screenshare]);
|
|
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, permissions.video, references.webcamReference]);
|
|
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;
|