@newtonschool/react_proctoring_library 0.0.14 → 0.0.15

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.
@@ -7,6 +7,8 @@ exports.default = exports.ProctorApp = void 0;
7
7
 
8
8
  require("core-js/modules/web.dom-collections.iterator.js");
9
9
 
10
+ require("core-js/modules/es.promise.js");
11
+
10
12
  var _react = _interopRequireWildcard(require("react"));
11
13
 
12
14
  var _ = require(".");
@@ -23,12 +25,20 @@ var _useWebcamData = _interopRequireDefault(require("../hooks/useWebcamData"));
23
25
 
24
26
  var _breachUtils = require("../utils/breachUtils");
25
27
 
28
+ var _webcamMicrophoneUtils = require("../utils/webcamMicrophoneUtils");
29
+
26
30
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
27
31
 
28
32
  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); }
29
33
 
30
34
  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; }
31
35
 
36
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
37
+
38
+ 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; }
39
+
40
+ 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; }
41
+
32
42
  const isWebcamProcessingReliable = (0, _utils.isGPUAvailable)();
33
43
 
34
44
  const ProctorApp = _ref => {
@@ -42,31 +52,31 @@ const ProctorApp = _ref => {
42
52
  } = _ref;
43
53
  const webcamReference = (0, _react.useRef)(null);
44
54
  const canvasReference = (0, _react.useRef)(null);
55
+ const screenshareReference = (0, _react.useRef)(null);
45
56
  const statistics = (0, _react.useRef)(_defaults.INITIAL_STATISTICS);
57
+
58
+ const proctorParams = _objectSpread(_objectSpread({}, {
59
+ people: true,
60
+ tabSwitch: true,
61
+ fullscreenExit: true,
62
+ lookedAway: true
63
+ }), config.proctorParams);
64
+
46
65
  const {
47
- proctorParams,
48
66
  recurring = false,
49
- recurringFetchInterval = 0,
50
- trackScreenshare = false
51
- } = config; // const {
52
- // userCount = true,
53
- // tabSwitch = true,
54
- // fullscreenExit = true,
55
- // lookedAway = true,
56
- // } = proctorParams;
57
-
58
- const [audioPermission, setAudioPermission] = (0, _react.useState)(false);
59
- const [videoPermission, setVideoPermission] = (0, _react.useState)(false);
60
- const [screensharePermission, setScreensharePermission] = (0, _react.useState)(!trackScreenshare);
67
+ recurringFetchInterval = 0
68
+ } = config;
69
+ const [audioPermission, setAudioPermission] = (0, _react.useState)();
70
+ const [videoPermission, setVideoPermission] = (0, _react.useState)();
71
+ const [screensharePermission, setScreensharePermission] = (0, _react.useState)();
61
72
  const firstFullScreenDone = (0, _react.useRef)(false);
62
- const {
63
- isFullscreen,
64
- setFullscreen,
65
- fullScreenExitCount
66
- } = (0, _hooks.useFullscreenData)(firstFullScreenDone);
67
- const [userCount, lookedAwayCount, isWebcamDataReliable] = (0, _useWebcamData.default)(webcamReference, canvasReference);
68
- const tabSwitchCount = (0, _hooks.useTabSwitchCount)(firstFullScreenDone);
69
- let recurringFetchIntervalRef = (0, _react.useRef)(null);
73
+ const recurringFetchIntervalRef = (0, _react.useRef)(null);
74
+ const sendScreengrab = (0, _react.useCallback)(async function () {
75
+ let isBreach = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
76
+ let breachData = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
77
+ const screenshot = await (0, _webcamMicrophoneUtils.captureScreenshot)();
78
+ getScreengrab(proctoringIdentifier, screenshot, isBreach, breachData.breachedParam);
79
+ }, [getScreengrab, proctoringIdentifier]);
70
80
  (0, _react.useEffect)(() => {
71
81
  if (recurring) {
72
82
  recurringFetchIntervalRef.current = setInterval(() => {
@@ -76,13 +86,22 @@ const ProctorApp = _ref => {
76
86
  if (webcamReference) {
77
87
  getWebcamSnapshot(proctoringIdentifier, webcamSnapshot, false);
78
88
  }
89
+
90
+ sendScreengrab();
79
91
  }, recurringFetchInterval);
80
92
  }
81
93
 
82
94
  return () => {
83
95
  clearInterval(recurringFetchIntervalRef.current);
84
96
  };
85
- }, [proctoringIdentifier, recurring, recurringFetchInterval, getWebcamSnapshot, getProctorParamValues]);
97
+ }, [recurring, recurringFetchInterval, proctoringIdentifier, getWebcamSnapshot, getProctorParamValues, sendScreengrab]);
98
+ const {
99
+ isFullscreen,
100
+ setFullscreen,
101
+ fullScreenExitCount
102
+ } = (0, _hooks.useFullscreenData)(firstFullScreenDone);
103
+ const [userCount, lookedAwayCount] = (0, _useWebcamData.default)(webcamReference, canvasReference);
104
+ const tabSwitchCount = (0, _hooks.useTabSwitchCount)(firstFullScreenDone);
86
105
  (0, _react.useEffect)(() => {
87
106
  const currentStats = {
88
107
  userCount,
@@ -91,7 +110,7 @@ const ProctorApp = _ref => {
91
110
  lookedAwayCount,
92
111
  isWebcamDataReliable: isWebcamProcessingReliable
93
112
  };
94
- const breachData = (0, _breachUtils.getDataOnBreach)(statistics, currentStats, proctoringIdentifier);
113
+ const breachData = (0, _breachUtils.getDataOnBreach)(statistics, currentStats);
95
114
 
96
115
  if (breachData) {
97
116
  getProctorParamValues(breachData.proctoringIdentifier, breachData.data, true, breachData.breachedParam);
@@ -100,35 +119,39 @@ const ProctorApp = _ref => {
100
119
  const webcamSnapshot = (0, _utils.captureWebcamSnapshot)(webcamReference);
101
120
 
102
121
  if (webcamSnapshot) {
103
- getWebcamSnapshot(breachData.proctoringIdentifier, webcamSnapshot, true, breachData.breachedParam);
122
+ getWebcamSnapshot(proctoringIdentifier, webcamSnapshot, true, breachData.breachedParam);
104
123
  }
105
- } else {// getScreengrab();
124
+ } else {
125
+ sendScreengrab(true, breachData);
106
126
  }
107
-
108
- (0, _utils.updateStatistics)(statistics, currentStats);
109
127
  }
110
- }, [userCount, tabSwitchCount, fullScreenExitCount, lookedAwayCount, isWebcamDataReliable, proctoringIdentifier, getProctorParamValues, getWebcamSnapshot]);
128
+
129
+ (0, _utils.updateStatistics)(statistics, currentStats);
130
+ }, [userCount, tabSwitchCount, fullScreenExitCount, lookedAwayCount, getProctorParamValues, getWebcamSnapshot, sendScreengrab, proctoringIdentifier]);
131
+ const updateScreensharePermission = (0, _react.useCallback)(() => {
132
+ (0, _webcamMicrophoneUtils.setupScreensharePermission)(setScreensharePermission, screenshareReference);
133
+ }, []);
111
134
 
112
135
  if (proctoringIdentifier === undefined) {
113
136
  // todo
114
137
  return;
115
138
  }
116
139
 
117
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_permissions.Permission, {
140
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, isFullscreen && audioPermission && videoPermission && screensharePermission && children, /*#__PURE__*/_react.default.createElement(_permissions.Permission, {
118
141
  isFullscreen: isFullscreen,
119
142
  audioPermisison: audioPermission,
120
143
  videoPermission: videoPermission,
144
+ setFullscreen: setFullscreen,
121
145
  screensharePermission: screensharePermission,
122
- trackScreenshare: trackScreenshare,
123
- setFullscreen: setFullscreen
146
+ updateScreensharePermission: updateScreensharePermission
124
147
  }), /*#__PURE__*/_react.default.createElement(_.ActivityTracker, {
125
148
  setAudioPermission: setAudioPermission,
126
149
  setVideoPermission: setVideoPermission,
127
150
  webcamReference: webcamReference,
128
151
  canvasReference: canvasReference,
129
- trackScreenshare: trackScreenshare,
130
- setScreensharePermission: setScreensharePermission
131
- }), isFullscreen && audioPermission && videoPermission && children);
152
+ screenshareReference: screenshareReference,
153
+ updateScreensharePermission: updateScreensharePermission
154
+ }));
132
155
  };
133
156
 
134
157
  exports.ProctorApp = ProctorApp;
@@ -35,19 +35,14 @@ const ActivityTracker = _ref => {
35
35
  canvasReference,
36
36
  setAudioPermission,
37
37
  setVideoPermission,
38
- trackScreenshare,
39
- setScreensharePermission
38
+ updateScreensharePermission,
39
+ screenshareReference
40
40
  } = _ref;
41
- const videoReference = (0, _react.useRef)(null);
42
41
  (0, _react.useEffect)(() => {
43
42
  if (isChrome) {
44
43
  (0, _webcamMicrophoneUtils.updateVideoPermissions)(setVideoPermission);
45
44
  (0, _webcamMicrophoneUtils.updateAudioPermissions)(setAudioPermission);
46
-
47
- if (trackScreenshare) {
48
- (0, _webcamMicrophoneUtils.updateScreensharePermission)(setScreensharePermission, videoReference);
49
- }
50
-
45
+ updateScreensharePermission();
51
46
  (0, _webcamMicrophoneUtils.getVideoPermissionQuery)().then(status => {
52
47
  status.onchange = evt => {
53
48
  (0, _webcamMicrophoneUtils.updateVideoPermissions)(setVideoPermission);
@@ -63,7 +58,7 @@ const ActivityTracker = _ref => {
63
58
  (0, _webcamMicrophoneUtils.updateAudioPermissions)("Audio Permission", err);
64
59
  });
65
60
  }
66
- }, [setVideoPermission, setAudioPermission, setScreensharePermission, trackScreenshare]);
61
+ }, [setVideoPermission, setAudioPermission, updateScreensharePermission]);
67
62
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_reactWebcam.default, {
68
63
  audio: true,
69
64
  muted: true,
@@ -145,9 +140,12 @@ const ActivityTracker = _ref => {
145
140
  className: "captured-video-canvas"
146
141
  }), /*#__PURE__*/_react.default.createElement("canvas", {
147
142
  ref: canvasReference,
148
- className: "captured-video-canvas"
143
+ className: "captured-video-canvas",
144
+ id: "wc-ref"
149
145
  }), /*#__PURE__*/_react.default.createElement("video", {
150
- src: videoReference.current
146
+ ref: screenshareReference,
147
+ className: "captured-video-canvas",
148
+ id: "ss-ref"
151
149
  }));
152
150
  };
153
151
 
@@ -30,11 +30,12 @@ const Permission = _ref => {
30
30
  isFullscreen,
31
31
  audioPermisison,
32
32
  videoPermission,
33
+ setFullscreen,
33
34
  screensharePermission,
34
35
  trackScreenshare,
35
- setFullscreen
36
+ updateScreensharePermission
36
37
  } = _ref;
37
- const showPermissionModal = !isFullscreen || !audioPermisison || !videoPermission;
38
+ const showPermissionModal = isFullscreen === false || audioPermisison === false || videoPermission === false || trackScreenshare && screensharePermission === false;
38
39
  return /*#__PURE__*/_react.default.createElement(_reactBootstrap.Modal, {
39
40
  show: showPermissionModal,
40
41
  size: "lg",
@@ -43,7 +44,7 @@ const Permission = _ref => {
43
44
  centered: true
44
45
  }, /*#__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
46
  className: "font-medium"
46
- }, /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
47
+ }, /*#__PURE__*/_react.default.createElement("div", {
47
48
  style: {
48
49
  borderRadius: "20px"
49
50
  }
@@ -62,7 +63,11 @@ const Permission = _ref => {
62
63
  showAudioPermissionText: !audioPermisison,
63
64
  showVideoPermissionText: !videoPermission,
64
65
  showScreensharePermission: !screensharePermission && trackScreenshare
65
- }))), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Modal.Footer, null, !isFullscreen && /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
66
+ })), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Modal.Footer, null, !screensharePermission && /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
67
+ onClick: () => {
68
+ updateScreensharePermission();
69
+ }
70
+ }, text.ALLOW_SCREENSHARE), !isFullscreen && /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
66
71
  variant: "primary",
67
72
  onClick: () => {
68
73
  setFullscreen();
@@ -34,7 +34,7 @@ const PermissionBody = _ref => {
34
34
  className: "mb-2"
35
35
  }, /*#__PURE__*/_react.default.createElement("span", {
36
36
  className: "pr-2 font-weight-bold"
37
- }, "Screen Share:"), text.PERMISSION_SCREENSHARE), showAudioPermissionText && showVideoPermissionText ? /*#__PURE__*/_react.default.createElement("div", {
37
+ }, "Screenshare:"), text.PERMISSION_SCREENSHARE), showAudioPermissionText && showVideoPermissionText ? /*#__PURE__*/_react.default.createElement("div", {
38
38
  className: "mb-2"
39
39
  }, /*#__PURE__*/_react.default.createElement("span", {
40
40
  className: "pr-2 font-weight-bold"
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.WATCHING_SCREEN = exports.VIDEO_UNSUPPORTED_IN_BROWSER = exports.USER_COUNT_LABEL = exports.REQUEST_VIDEO_AUDIO_PERMISSIONS_HEADING = exports.REQUEST_VIDEO_AUDIO_PERMISSIONS_DESC = exports.REQUEST_PERMISSION = exports.PERMISSION_VIDEO = exports.PERMISSION_TITLE = exports.PERMISSION_SCREENSHARE = exports.PERMISSION_GENERIC = exports.PERMISSION_FULLSCREEN = exports.PERMISSION_AUDIO_VIDEO = exports.PERMISSION_AUDIO = exports.NO_CAMERA_AVAILABLE = exports.NO_AUDIO_DEVICE_AVAILABLE = exports.NOT_WATCHING_SCREEN = exports.MESSAGE = exports.FULLSCREEN_ERROR_MESSAGE = exports.DENY_FULLSCREEN = exports.CAMERA_UNAVAILABLE_INSECURE_CONN = exports.BROWSER_BLOCKED_PERMISSION_RESOLVED_RECHECK = exports.BROWSER_BLOCKED_PERMISSION_NEXT_STEP = exports.BROWSER_BLOCKED_PERMISSION_DIRECTION = exports.BROWSER_BLOCKED_PERMISSION_DIALOG = exports.BROWSER_BLOCKED_PERMISSION = exports.ALLOW_FULLSCREEN = void 0;
6
+ exports.WATCHING_SCREEN = exports.VIDEO_UNSUPPORTED_IN_BROWSER = exports.USER_COUNT_LABEL = exports.REQUEST_VIDEO_AUDIO_PERMISSIONS_HEADING = exports.REQUEST_VIDEO_AUDIO_PERMISSIONS_DESC = exports.REQUEST_PERMISSION = exports.PERMISSION_VIDEO = exports.PERMISSION_TITLE = exports.PERMISSION_SCREENSHARE = exports.PERMISSION_GENERIC = exports.PERMISSION_FULLSCREEN = exports.PERMISSION_AUDIO_VIDEO = exports.PERMISSION_AUDIO = exports.NO_CAMERA_AVAILABLE = exports.NO_AUDIO_DEVICE_AVAILABLE = exports.NOT_WATCHING_SCREEN = exports.MESSAGE = exports.FULLSCREEN_ERROR_MESSAGE = exports.DENY_FULLSCREEN = exports.CAMERA_UNAVAILABLE_INSECURE_CONN = exports.BROWSER_BLOCKED_PERMISSION_RESOLVED_RECHECK = exports.BROWSER_BLOCKED_PERMISSION_NEXT_STEP = exports.BROWSER_BLOCKED_PERMISSION_DIRECTION = exports.BROWSER_BLOCKED_PERMISSION_DIALOG = exports.BROWSER_BLOCKED_PERMISSION = exports.ALLOW_SCREENSHARE = exports.ALLOW_FULLSCREEN = void 0;
7
7
  const WATCHING_SCREEN = "You are watching the screen";
8
8
  exports.WATCHING_SCREEN = WATCHING_SCREEN;
9
9
  const NOT_WATCHING_SCREEN = "You are not watching the screen";
@@ -20,6 +20,8 @@ const DENY_FULLSCREEN = "Deny";
20
20
  exports.DENY_FULLSCREEN = DENY_FULLSCREEN;
21
21
  const ALLOW_FULLSCREEN = "Switch to Fullscreen";
22
22
  exports.ALLOW_FULLSCREEN = ALLOW_FULLSCREEN;
23
+ const ALLOW_SCREENSHARE = "Share Screen";
24
+ exports.ALLOW_SCREENSHARE = ALLOW_SCREENSHARE;
23
25
  const NO_CAMERA_AVAILABLE = "No Camera available for use.";
24
26
  exports.NO_CAMERA_AVAILABLE = NO_CAMERA_AVAILABLE;
25
27
  const NO_AUDIO_DEVICE_AVAILABLE = "No audio device available for use";
@@ -48,11 +50,11 @@ const PERMISSION_GENERIC = "This screen requires following permissions for conti
48
50
  exports.PERMISSION_GENERIC = PERMISSION_GENERIC;
49
51
  const PERMISSION_FULLSCREEN = "Please allow us to switch your screen to fullscreen mode.";
50
52
  exports.PERMISSION_FULLSCREEN = PERMISSION_FULLSCREEN;
51
- const PERMISSION_SCREENSHARE = "Please choose to share the entire screen out of all the screen share options.";
52
- exports.PERMISSION_SCREENSHARE = PERMISSION_SCREENSHARE;
53
53
  const PERMISSION_AUDIO_VIDEO = "Your browser or system settings have disallowed Microphone and Camera permissions. Please permit this website to access microphone and camera. Refresh after you've given the permission to access the screen";
54
54
  exports.PERMISSION_AUDIO_VIDEO = PERMISSION_AUDIO_VIDEO;
55
55
  const PERMISSION_VIDEO = "Your browser or system settings have disallowed Camera permissions. Please permit this website to access the camera. Refresh after you've given the permission to access the screen";
56
56
  exports.PERMISSION_VIDEO = PERMISSION_VIDEO;
57
57
  const PERMISSION_AUDIO = "Your browser or system settings have disallowed Microphone permissions. Please permit this website to access the microphone. Refresh after you've given the permission to access the screen";
58
- exports.PERMISSION_AUDIO = PERMISSION_AUDIO;
58
+ exports.PERMISSION_AUDIO = PERMISSION_AUDIO;
59
+ const PERMISSION_SCREENSHARE = "Please share your entire screen";
60
+ exports.PERMISSION_SCREENSHARE = PERMISSION_SCREENSHARE;
@@ -11,7 +11,7 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
11
11
 
12
12
  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; }
13
13
 
14
- const getDataOnBreach = (statistics, currentData, proctoringIdentifier) => {
14
+ const getDataOnBreach = (statistics, currentData) => {
15
15
  const {
16
16
  userCount,
17
17
  tabSwitchCount,
@@ -24,7 +24,6 @@ const getDataOnBreach = (statistics, currentData, proctoringIdentifier) => {
24
24
 
25
25
  if (data.IS_WEBCAM_DATA_RELIABLE !== isWebcamDataReliable) {
26
26
  return {
27
- proctoringIdentifier,
28
27
  breachedParam: "IS_WEBCAM_DATA_RELIABLE",
29
28
  timestamp,
30
29
  data: _objectSpread(_objectSpread({}, data), {}, {
@@ -35,7 +34,6 @@ const getDataOnBreach = (statistics, currentData, proctoringIdentifier) => {
35
34
 
36
35
  if (data.USER_COUNT_MAX < userCount) {
37
36
  return {
38
- proctoringIdentifier,
39
37
  breachedParam: "USER_COUNT_MAX",
40
38
  timestamp,
41
39
  data: _objectSpread(_objectSpread({}, data), {}, {
@@ -46,7 +44,6 @@ const getDataOnBreach = (statistics, currentData, proctoringIdentifier) => {
46
44
 
47
45
  if (data.TAB_SWITCH_COUNT !== tabSwitchCount) {
48
46
  return {
49
- proctoringIdentifier,
50
47
  breachedParam: "TAB_SWITCH_COUNT",
51
48
  timestamp,
52
49
  data: _objectSpread(_objectSpread({}, data), {}, {
@@ -57,7 +54,6 @@ const getDataOnBreach = (statistics, currentData, proctoringIdentifier) => {
57
54
 
58
55
  if (data.FULLSCREEN_EXIT_COUNT !== fullScreenExitCount) {
59
56
  return {
60
- proctoringIdentifier,
61
57
  breachedParam: "FULLSCREEN_EXIT_COUNT",
62
58
  timestamp,
63
59
  data: _objectSpread(_objectSpread({}, data), {}, {
@@ -68,7 +64,6 @@ const getDataOnBreach = (statistics, currentData, proctoringIdentifier) => {
68
64
 
69
65
  if (data.LOOKED_AWAY_COUNT !== lookedAwayCount) {
70
66
  return {
71
- proctoringIdentifier,
72
67
  breachedParam: "LOOKED_AWAY_COUNT",
73
68
  timestamp,
74
69
  data: _objectSpread(_objectSpread({}, data), {}, {
@@ -3,6 +3,12 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ Object.defineProperty(exports, "addOrUpdateStatsToLocalStorage", {
7
+ enumerable: true,
8
+ get: function get() {
9
+ return _localStorageUtils.addOrUpdateStatsToLocalStorage;
10
+ }
11
+ });
6
12
  Object.defineProperty(exports, "captureWebcamSnapshot", {
7
13
  enumerable: true,
8
14
  get: function get() {
@@ -39,6 +45,12 @@ Object.defineProperty(exports, "getIsDocumentVisible", {
39
45
  return _browserUtils.getIsDocumentVisible;
40
46
  }
41
47
  });
48
+ Object.defineProperty(exports, "getStatistics", {
49
+ enumerable: true,
50
+ get: function get() {
51
+ return _localStorageUtils.getStatistics;
52
+ }
53
+ });
42
54
  Object.defineProperty(exports, "getVideoPermission", {
43
55
  enumerable: true,
44
56
  get: function get() {
@@ -69,6 +81,18 @@ Object.defineProperty(exports, "isWebcamVideoValid", {
69
81
  return _webcamMicrophoneUtils.isWebcamVideoValid;
70
82
  }
71
83
  });
84
+ Object.defineProperty(exports, "removeStatsFromLocalStorage", {
85
+ enumerable: true,
86
+ get: function get() {
87
+ return _localStorageUtils.removeStatsFromLocalStorage;
88
+ }
89
+ });
90
+ Object.defineProperty(exports, "retrieveStatsFromLocalStorage", {
91
+ enumerable: true,
92
+ get: function get() {
93
+ return _localStorageUtils.retrieveStatsFromLocalStorage;
94
+ }
95
+ });
72
96
  Object.defineProperty(exports, "sendDataOnBreach", {
73
97
  enumerable: true,
74
98
  get: function get() {
@@ -82,6 +106,8 @@ Object.defineProperty(exports, "updateStatistics", {
82
106
  }
83
107
  });
84
108
 
109
+ var _localStorageUtils = require("./localStorageUtils");
110
+
85
111
  var _webcamMicrophoneUtils = require("./webcamMicrophoneUtils");
86
112
 
87
113
  var _browserUtils = require("./browserUtils");
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.updateVideoPermissions = exports.updateStatistics = exports.updateScreensharePermission = exports.updateAudioPermissions = exports.isWebcamVideoValid = exports.getVideoPermissionQuery = exports.getVideoPermission = exports.getGlancePercentage = exports.getAudioVideoPermission = exports.getAudioPermissionQuery = exports.getAudioPermission = exports.captureWebcamSnapshot = void 0;
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
 
8
8
  require("core-js/modules/es.regexp.exec.js");
9
9
 
@@ -19,8 +19,14 @@ require("core-js/modules/es.typed-array.sort.js");
19
19
 
20
20
  require("core-js/modules/es.typed-array.to-locale-string.js");
21
21
 
22
+ require("core-js/modules/es.promise.js");
23
+
22
24
  var _ = require(".");
23
25
 
26
+ var _html2canvas = _interopRequireDefault(require("html2canvas"));
27
+
28
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
29
+
24
30
  const isWebcamVideoValid = webcamReference => webcamReference !== null && webcamReference !== undefined && typeof webcamReference.current !== "undefined" && webcamReference.current !== null && webcamReference.current.video.readyState === 4;
25
31
 
26
32
  exports.isWebcamVideoValid = isWebcamVideoValid;
@@ -124,21 +130,33 @@ const updateVideoPermissions = setVideoPermission => {
124
130
 
125
131
  exports.updateVideoPermissions = updateVideoPermissions;
126
132
 
127
- const updateScreensharePermission = (setScreensharePermission, videoReference) => navigator.mediaDevices.getDisplayMedia({
128
- video: true,
129
- audio: true
133
+ const setupScreensharePermission = (setScreensharePermission, screenshareReference) => navigator.mediaDevices.getDisplayMedia({
134
+ video: true
130
135
  }).then(stream => {
131
- if (stream.getTracks()[0].getSettings().displaySurface === "monitor") {
132
- videoReference.current = stream;
136
+ const track = stream.getTracks()[0];
137
+
138
+ if (track.getSettings().displaySurface === "monitor") {
139
+ screenshareReference.current.srcObject = stream;
140
+
141
+ screenshareReference.current.onloadedmetadata = e => {
142
+ screenshareReference.current.play();
143
+ };
144
+
145
+ track.onended = e => {
146
+ setScreensharePermission(false);
147
+ };
148
+
133
149
  setScreensharePermission(true);
134
150
  } else {
151
+ screenshareReference.current = null;
135
152
  setScreensharePermission(false);
136
153
  }
137
- }).catch(() => {
154
+ }).catch(e => {
155
+ screenshareReference.current = null;
138
156
  setScreensharePermission(false);
139
157
  });
140
158
 
141
- exports.updateScreensharePermission = updateScreensharePermission;
159
+ exports.setupScreensharePermission = setupScreensharePermission;
142
160
 
143
161
  const getVideoPermissionQuery = () => navigator.permissions.query({
144
162
  name: "camera"
@@ -170,8 +188,19 @@ const captureWebcamSnapshot = webcamReference => {
170
188
  try {
171
189
  const b64Snapshot = webcamReference.current.getScreenshot();
172
190
  return b64DataURItoBlob(b64Snapshot);
173
- } catch (_unused) {// pass
191
+ } catch (e) {// pass
192
+ }
193
+ };
194
+
195
+ exports.captureWebcamSnapshot = captureWebcamSnapshot;
196
+
197
+ const captureScreenshot = async () => {
198
+ try {
199
+ const canvas = await (0, _html2canvas.default)(document.querySelector("#ss-ref"));
200
+ const b64Snapshot = canvas.toDataURL("image/jpeg");
201
+ return b64DataURItoBlob(b64Snapshot);
202
+ } catch (e) {// pass
174
203
  }
175
204
  };
176
205
 
177
- exports.captureWebcamSnapshot = captureWebcamSnapshot;
206
+ exports.captureScreenshot = captureScreenshot;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@newtonschool/react_proctoring_library",
3
- "version": "0.0.14",
3
+ "version": "0.0.15",
4
4
  "description": "Used to proctor online tests",
5
5
  "author": "ayushkagrawal,shreyachandra",
6
6
  "main": "dist/index.js",
@@ -17,6 +17,7 @@
17
17
  "@tensorflow/tfjs": "^3.9.0",
18
18
  "bootstrap": "^5.1.3",
19
19
  "core-js": "^3.22.7",
20
+ "html2canvas": "^1.4.1",
20
21
  "react-bootstrap": "^2.0.4",
21
22
  "react-webcam": "^6.0.0"
22
23
  },