@newtonschool/react_proctoring_library 0.0.32 → 0.0.34

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.
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.isGPUAvailable = void 0;
7
+
8
+ require("core-js/modules/web.dom-collections.iterator.js");
9
+
10
+ require("core-js/modules/es.array.includes.js");
11
+
12
+ require("core-js/modules/es.string.includes.js");
13
+
14
+ var _defaults = require("../constants/defaults");
15
+
16
+ const isGPUAvailable = () => {
17
+ const canvas = document.createElement("canvas");
18
+ const webgl = canvas.getContext("webgl") || canvas.getContext("experimental-webgl");
19
+ const debugInfo = webgl.getExtension("webgl_debug_renderer_info");
20
+ const gpu = webgl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL).toLowerCase();
21
+
22
+ for (const gpuType of _defaults.gpuTypes) {
23
+ if (gpu.includes(gpuType)) return true;
24
+ }
25
+
26
+ return false;
27
+ };
28
+
29
+ exports.isGPUAvailable = isGPUAvailable;
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "captureWebcamSnapshot", {
7
+ enumerable: true,
8
+ get: function get() {
9
+ return _webcamMicrophoneUtils.captureWebcamSnapshot;
10
+ }
11
+ });
12
+ Object.defineProperty(exports, "getAudioPermission", {
13
+ enumerable: true,
14
+ get: function get() {
15
+ return _webcamMicrophoneUtils.getAudioPermission;
16
+ }
17
+ });
18
+ Object.defineProperty(exports, "getAudioVideoPermission", {
19
+ enumerable: true,
20
+ get: function get() {
21
+ return _webcamMicrophoneUtils.getAudioVideoPermission;
22
+ }
23
+ });
24
+ Object.defineProperty(exports, "getBrowserFullscreenElementProp", {
25
+ enumerable: true,
26
+ get: function get() {
27
+ return _browserUtils.getBrowserFullscreenElementProp;
28
+ }
29
+ });
30
+ Object.defineProperty(exports, "getIsDocumentVisible", {
31
+ enumerable: true,
32
+ get: function get() {
33
+ return _browserUtils.getIsDocumentVisible;
34
+ }
35
+ });
36
+ Object.defineProperty(exports, "getVideoPermission", {
37
+ enumerable: true,
38
+ get: function get() {
39
+ return _webcamMicrophoneUtils.getVideoPermission;
40
+ }
41
+ });
42
+ Object.defineProperty(exports, "getVisibilityChangeEventName", {
43
+ enumerable: true,
44
+ get: function get() {
45
+ return _browserUtils.getVisibilityChangeEventName;
46
+ }
47
+ });
48
+ Object.defineProperty(exports, "isArrayValid", {
49
+ enumerable: true,
50
+ get: function get() {
51
+ return _arrayUtils.isArrayValid;
52
+ }
53
+ });
54
+ Object.defineProperty(exports, "isGPUAvailable", {
55
+ enumerable: true,
56
+ get: function get() {
57
+ return _gpuUtils.isGPUAvailable;
58
+ }
59
+ });
60
+ Object.defineProperty(exports, "isWebcamVideoValid", {
61
+ enumerable: true,
62
+ get: function get() {
63
+ return _webcamMicrophoneUtils.isWebcamVideoValid;
64
+ }
65
+ });
66
+ Object.defineProperty(exports, "updateStatistics", {
67
+ enumerable: true,
68
+ get: function get() {
69
+ return _webcamMicrophoneUtils.updateStatistics;
70
+ }
71
+ });
72
+
73
+ var _webcamMicrophoneUtils = require("./webcamMicrophoneUtils");
74
+
75
+ var _browserUtils = require("./browserUtils");
76
+
77
+ var _arrayUtils = require("./arrayUtils");
78
+
79
+ var _gpuUtils = require("./gpuUtils");
@@ -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,216 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
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
+
8
+ require("core-js/modules/es.array-buffer.slice.js");
9
+
10
+ require("core-js/modules/es.typed-array.uint8-array.js");
11
+
12
+ require("core-js/modules/es.typed-array.fill.js");
13
+
14
+ require("core-js/modules/es.typed-array.set.js");
15
+
16
+ require("core-js/modules/es.typed-array.sort.js");
17
+
18
+ require("core-js/modules/es.typed-array.to-locale-string.js");
19
+
20
+ require("core-js/modules/es.promise.js");
21
+
22
+ var _ = require(".");
23
+
24
+ var _html2canvas = _interopRequireDefault(require("html2canvas"));
25
+
26
+ var _defaults = require("../constants/defaults");
27
+
28
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
29
+
30
+ const isWebcamVideoValid = webcamReference => webcamReference !== null && webcamReference !== undefined && typeof webcamReference.current !== "undefined" && webcamReference.current !== null && webcamReference.current.video.readyState === 4;
31
+
32
+ exports.isWebcamVideoValid = isWebcamVideoValid;
33
+
34
+ const updateStatistics = (statistics, currentStats, proctorParams) => {
35
+ const {
36
+ isTabSwitched,
37
+ isFullscreen,
38
+ lookedAwayCount,
39
+ userCount,
40
+ isWebcamDataReliable
41
+ } = currentStats;
42
+
43
+ if (proctorParams.tabSwitch) {
44
+ statistics.current[_defaults.STATS_PARAMS.isTabSwitched] = isTabSwitched;
45
+ }
46
+
47
+ if (proctorParams.fullscreenExit) {
48
+ statistics.current[_defaults.STATS_PARAMS.isFullscreen] = isFullscreen;
49
+ }
50
+
51
+ if (proctorParams.lookedAway) {
52
+ statistics.current[_defaults.STATS_PARAMS.lookedAwayCount] = lookedAwayCount;
53
+ }
54
+
55
+ if (proctorParams.people) {
56
+ statistics.current[_defaults.STATS_PARAMS.userCountMax] = Math.max(userCount, statistics.current[_defaults.STATS_PARAMS.userCountMax]);
57
+ }
58
+
59
+ statistics.current.IS_WEBCAM_DATA_RELIABLE = isWebcamDataReliable;
60
+ };
61
+
62
+ exports.updateStatistics = updateStatistics;
63
+
64
+ const getGlancePercentage = partSegmentation => {
65
+ if (!partSegmentation || !(partSegmentation instanceof Object) || !(0, _.isArrayValid)(partSegmentation.allPoses)) {
66
+ return 0.0;
67
+ }
68
+
69
+ const allPoses = partSegmentation.allPoses;
70
+ let totalScoreLeftEye = 0.0,
71
+ totalScoreRightEye = 0.0,
72
+ totalScoreNose = 0.0,
73
+ totalScoreLeftEar = 0.0,
74
+ totalScoreRightEar = 0.0;
75
+ let noseIndex = 0,
76
+ leftEyeIndex = 1,
77
+ rightEyeIndex = 2,
78
+ leftEarIndex = 3,
79
+ rightEarIndex = 4;
80
+ allPoses.forEach(poseArray => {
81
+ let keypointsArray = poseArray.keypoints;
82
+ totalScoreNose += keypointsArray[noseIndex].score;
83
+ totalScoreLeftEye += keypointsArray[leftEyeIndex].score;
84
+ totalScoreRightEye += keypointsArray[rightEyeIndex].score;
85
+ totalScoreLeftEar += keypointsArray[leftEarIndex].score;
86
+ totalScoreRightEar += keypointsArray[rightEarIndex].score;
87
+ });
88
+ const avgScoreLeftEye = totalScoreLeftEye / allPoses.length,
89
+ avgScoreRightEye = totalScoreRightEye / allPoses.length,
90
+ avgScoreNose = totalScoreNose / allPoses.length,
91
+ avgScoreLeftEar = totalScoreLeftEar / allPoses.length,
92
+ avgScoreRightEar = totalScoreRightEar / allPoses.length;
93
+ const avgPercentage = 100 * (avgScoreLeftEye + avgScoreRightEye + avgScoreNose + avgScoreLeftEar + avgScoreRightEar) / 5;
94
+ return Math.ceil(avgPercentage);
95
+ };
96
+
97
+ exports.getGlancePercentage = getGlancePercentage;
98
+
99
+ const getVideoPermission = function getVideoPermission(stream) {
100
+ let exludeTrackId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "";
101
+ return stream.getVideoTracks().filter(track => track.enabled && track.label && track.id !== exludeTrackId).length > 0;
102
+ };
103
+
104
+ exports.getVideoPermission = getVideoPermission;
105
+
106
+ const getAudioPermission = function getAudioPermission(stream) {
107
+ let exludeTrackId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "";
108
+ return stream.getAudioTracks().filter(track => track.enabled && track.label && !track.muted && track.id !== exludeTrackId).length > 0;
109
+ };
110
+
111
+ exports.getAudioPermission = getAudioPermission;
112
+
113
+ const getAudioVideoPermission = stream => {
114
+ return {
115
+ audio: getAudioPermission(stream),
116
+ video: getVideoPermission(stream)
117
+ };
118
+ };
119
+
120
+ exports.getAudioVideoPermission = getAudioVideoPermission;
121
+
122
+ const updateAudioPermissions = setAudioPermission => {
123
+ navigator.mediaDevices.getUserMedia({
124
+ audio: true
125
+ }).then(() => {
126
+ setAudioPermission(true);
127
+ }).catch(err => {
128
+ setAudioPermission(false);
129
+ });
130
+ };
131
+
132
+ exports.updateAudioPermissions = updateAudioPermissions;
133
+
134
+ const updateVideoPermissions = setVideoPermission => {
135
+ navigator.mediaDevices.getUserMedia({
136
+ video: true
137
+ }).then(() => {
138
+ setVideoPermission(true);
139
+ }).catch(err => {
140
+ setVideoPermission(false);
141
+ });
142
+ };
143
+
144
+ exports.updateVideoPermissions = updateVideoPermissions;
145
+
146
+ const setupScreensharePermission = (setScreensharePermission, screenshareReference) => navigator.mediaDevices.getDisplayMedia({
147
+ video: true
148
+ }).then(stream => {
149
+ const track = stream.getTracks()[0];
150
+
151
+ if (track.getSettings().displaySurface === "monitor") {
152
+ setScreensharePermission(true);
153
+ screenshareReference.current = stream;
154
+
155
+ track.onended = e => {
156
+ setScreensharePermission(false);
157
+ screenshareReference.current = null;
158
+ };
159
+ } else {
160
+ track.stop();
161
+ screenshareReference.current = null;
162
+ setScreensharePermission(false);
163
+ }
164
+ }).catch(e => {
165
+ screenshareReference.current = null;
166
+ setScreensharePermission(false);
167
+ });
168
+
169
+ exports.setupScreensharePermission = setupScreensharePermission;
170
+
171
+ const getVideoPermissionQuery = () => navigator.permissions.query({
172
+ name: "camera"
173
+ });
174
+
175
+ exports.getVideoPermissionQuery = getVideoPermissionQuery;
176
+
177
+ const getAudioPermissionQuery = () => navigator.permissions.query({
178
+ name: "microphone"
179
+ });
180
+
181
+ exports.getAudioPermissionQuery = getAudioPermissionQuery;
182
+
183
+ const b64DataURItoBlob = dataURI => {
184
+ const byteString = window.atob(dataURI.split(",")[1]);
185
+ const mimeString = dataURI.split(",")[0].split(":")[1].split(";")[0];
186
+ const u8arr = new Uint8Array(byteString.length);
187
+
188
+ for (let i = 0; i < byteString.length; i += 1) {
189
+ u8arr[i] = byteString.charCodeAt(i);
190
+ }
191
+
192
+ return new Blob([u8arr], {
193
+ type: mimeString
194
+ });
195
+ };
196
+
197
+ const captureWebcamSnapshot = webcamReference => {
198
+ try {
199
+ const b64Snapshot = webcamReference.current.getScreenshot();
200
+ return b64DataURItoBlob(b64Snapshot);
201
+ } catch (e) {// pass
202
+ }
203
+ };
204
+
205
+ exports.captureWebcamSnapshot = captureWebcamSnapshot;
206
+
207
+ const captureScreenshot = async () => {
208
+ try {
209
+ const canvas = await (0, _html2canvas.default)(document.querySelector("#ss-ref"));
210
+ const b64Snapshot = canvas.toDataURL("image/jpeg");
211
+ return b64DataURItoBlob(b64Snapshot);
212
+ } catch (e) {// pass
213
+ }
214
+ };
215
+
216
+ exports.captureScreenshot = captureScreenshot;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@newtonschool/react_proctoring_library",
3
- "version": "0.0.32",
3
+ "version": "0.0.34",
4
4
  "description": "Used to proctor online tests",
5
5
  "author": "ayushkagrawal,shreyachandra,weastel",
6
6
  "main": "dist/index.js",