@newtonschool/react_proctoring_library 0.0.43 → 0.0.45

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.
@@ -3,12 +3,6 @@
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
- });
12
6
  Object.defineProperty(exports, "FullScreenPermission", {
13
7
  enumerable: true,
14
8
  get: function get() {
@@ -27,7 +21,6 @@ Object.defineProperty(exports, "ProctoredContextApp", {
27
21
  return _Loadable2.default;
28
22
  }
29
23
  });
30
- var _activityTracker = _interopRequireDefault(require("./activity-tracker"));
31
24
  var _permissions = require("./permissions");
32
25
  var _Loadable = _interopRequireDefault(require("./proctor-app/Loadable"));
33
26
  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");
4
3
  require("core-js/modules/es.object.assign.js");
5
4
  require("core-js/modules/es.weak-map.js");
6
5
  Object.defineProperty(exports, "__esModule", {
7
6
  value: true
8
7
  });
9
8
  exports.default = exports.ProctorApp = void 0;
10
- require("core-js/modules/web.dom-collections.iterator.js");
11
9
  require("core-js/modules/es.promise.js");
10
+ require("core-js/modules/web.dom-collections.iterator.js");
11
+ require("core-js/modules/es.symbol.description.js");
12
12
  var _react = _interopRequireWildcard(require("react"));
13
13
  require("./index.scss");
14
14
  var _utils = require("../../utils");
@@ -18,8 +18,10 @@ 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 _activityTracker = _interopRequireDefault(require("../activity-tracker"));
21
+ var _webcamActivityTracker = _interopRequireDefault(require("../webcam-activity-tracker"));
22
22
  var _browserUtils = require("../../utils/browserUtils");
23
+ var _screenshareActivityTracker = require("../screenshare-activity-tracker");
24
+ var _dom = require("../../constants/dom");
23
25
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
24
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); }
25
27
  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; }
@@ -34,7 +36,6 @@ const ProctorApp = _ref => {
34
36
  let {
35
37
  proctoringIdentifier,
36
38
  customPermissionView = null,
37
- shouldRenderChildren = false,
38
39
  permissionPassedProps = {},
39
40
  children,
40
41
  proctoredContext,
@@ -43,27 +44,15 @@ const ProctorApp = _ref => {
43
44
  getWebcamSnapshot = () => {},
44
45
  getScreengrab = () => {}
45
46
  } = _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
52
  permissionSetter,
53
- customProps,
54
- customSetter
53
+ screenshareStream
55
54
  } = context;
56
- (0, _react.useEffect)(() => {
57
- if (customProps.childrenRenderer === undefined) {
58
- setRenderChildren(!shouldRenderChildren);
59
- } else {
60
- setRenderChildren(customProps.childrenRenderer);
61
- }
62
- }, [customProps]);
63
55
  const CustomPermissionView = customPermissionView;
64
- const browserDetails = {
65
- isChrome: (0, _browserUtils.isChrome)()
66
- };
67
56
  const proctorParams = (0, _react.useMemo)(() => _objectSpread(_objectSpread({}, _defaults.defaultConfig), config.proctorParams), [config.proctorParams]);
68
57
  const statistics = (0, _react.useRef)((0, _breachUtils.getInitialStats)(proctorParams));
69
58
  const {
@@ -75,20 +64,18 @@ const ProctorApp = _ref => {
75
64
  let isBreach = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
76
65
  let breachedParam = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "";
77
66
  if (proctorParams.screenshareSnapshots && permissions.screenshare) {
78
- const screenshot = await (0, _webcamMicrophoneUtils.captureScreenshot)();
67
+ const screenshot = await (0, _webcamMicrophoneUtils.captureScreenshot)("#".concat(_dom.SCREENSHARE_REFERENCE_ID));
79
68
  getScreengrab(proctoringIdentifier, screenshot, isBreach, breachedParam);
80
69
  }
81
70
  }, [getScreengrab, proctoringIdentifier, proctorParams.screenshareSnapshots, permissions.screenshare]);
82
- const sendWebcamSnapshot = (0, _react.useCallback)(function () {
71
+ const sendWebcamSnapshot = (0, _react.useCallback)(async function () {
83
72
  let isBreach = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
84
73
  let breachedParam = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "";
85
74
  if (proctorParams.webcamSnapshots && permissions.video) {
86
- const webcamSnapshot = (0, _utils.captureWebcamSnapshot)(references.webcamReference);
87
- if (references.webcamReference) {
88
- getWebcamSnapshot(proctoringIdentifier, webcamSnapshot, isBreach, breachedParam);
89
- }
75
+ const webcamSnapshot = await (0, _webcamMicrophoneUtils.captureScreenshot)("#".concat(_dom.WEBCAM_REFERENCE_ID));
76
+ getWebcamSnapshot(proctoringIdentifier, webcamSnapshot, isBreach, breachedParam);
90
77
  }
91
- }, [proctoringIdentifier, getWebcamSnapshot, proctorParams.webcamSnapshots, permissions.video, references.webcamReference]);
78
+ }, [proctoringIdentifier, getWebcamSnapshot, proctorParams.webcamSnapshots, permissions.video]);
92
79
  const sendProctoredParamValues = (0, _react.useCallback)(function () {
93
80
  let isBreach = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
94
81
  let breachParam = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "";
@@ -124,31 +111,28 @@ const ProctorApp = _ref => {
124
111
  sendScreengrab(true, breachData.breachedParam);
125
112
  }
126
113
  }, [userCount, isTabSwitched, permissions.fullscreen, lookedAwayCount, sendProctoredParamValues, sendWebcamSnapshot, sendScreengrab, proctorParams]);
114
+ const shouldShowProctoredComponent = (0, _breachUtils.showProctoredComponent)(proctorParams, actions.hasAllPermission);
127
115
  return /*#__PURE__*/_react.default.createElement("div", {
128
116
  className: "".concat(proctorParams.copyPasteProctoring ? "disable-copy-paste fullwidth fullheight" : "fullwidth fullheight")
129
- }, (0, _breachUtils.showProctoredComponent)(proctorParams, actions.hasAllPermission) && renderChildren && children, !((0, _breachUtils.showProctoredComponent)(proctorParams, actions.hasAllPermission) && renderChildren) && customPermissionView && /*#__PURE__*/_react.default.createElement(CustomPermissionView, _extends({
117
+ }, shouldShowProctoredComponent && children, !shouldShowProctoredComponent && customPermissionView && /*#__PURE__*/_react.default.createElement(CustomPermissionView, _extends({
130
118
  permissions: permissions,
131
- hasAllPermission: actions.hasAllPermission,
132
- askPermission: actions.askPermission,
133
119
  references: references,
134
120
  actions: actions,
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, {
121
+ browserDetails: (0, _browserUtils.getBrowserDetails)()
122
+ }, permissionPassedProps)), !shouldShowProctoredComponent && !customPermissionView && /*#__PURE__*/_react.default.createElement(_permissions.Permission, {
141
123
  proctorParams: proctorParams,
142
124
  permissions: permissions,
143
125
  askPermission: actions.askPermission,
144
126
  hasAllPermission: actions.hasAllPermission
145
- }), /*#__PURE__*/_react.default.createElement(_activityTracker.default, {
127
+ }), /*#__PURE__*/_react.default.createElement(_webcamActivityTracker.default, {
146
128
  proctorParams: proctorParams,
147
129
  setAudioPermission: permissionSetter.audio,
148
130
  setVideoPermission: permissionSetter.video,
149
131
  webcamReference: references.webcamReference,
150
- canvasReference: references.canvasReference,
151
- screenshareReference: references.screenshareReference
132
+ canvasReference: references.canvasReference
133
+ }), /*#__PURE__*/_react.default.createElement(_screenshareActivityTracker.ScreenshareActivityTracker, {
134
+ screenshareStream: screenshareStream,
135
+ ref: references.screenshareReference
152
136
  }));
153
137
  };
154
138
  exports.ProctorApp = ProctorApp;
@@ -10,3 +10,10 @@
10
10
  height: 100%;
11
11
  overflow-y: scroll;
12
12
  }
13
+ .captured-video-canvas {
14
+ position: absolute;
15
+ bottom: 0px;
16
+ }
17
+ .hide {
18
+ visibility: hidden;
19
+ }
@@ -35,14 +35,14 @@ 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)();
39
38
  const webcamReference = (0, _react.useRef)(null);
40
39
  const canvasReference = (0, _react.useRef)(null);
41
40
  const screenshareReference = (0, _react.useRef)(null);
41
+ const [screenshareStream, setScreenshareStream] = (0, _react.useState)(null);
42
42
  const Context = contextProvider;
43
43
  const askPermissionAction = (0, _react.useMemo)(() => ({
44
44
  screenshare: () => {
45
- (0, _webcamMicrophoneUtils.setupScreensharePermission)(setScreensharePermission, screenshareReference);
45
+ (0, _webcamMicrophoneUtils.setupScreensharePermission)(setScreensharePermission, screenshareReference, setScreenshareStream);
46
46
  },
47
47
  fullscreen: () => {
48
48
  setFullscreen();
@@ -78,22 +78,17 @@ const ProctoredContextApp = _ref => {
78
78
  video: setVideoPermission,
79
79
  screenshare: setScreensharePermission
80
80
  },
81
- customProps: {
82
- childrenRenderer: customRenderer
83
- },
84
- customSetter: {
85
- childrenRenderer: setCustomRenderer
86
- },
87
81
  proctorParams,
88
82
  actions: {
89
83
  askPermission: askPermission,
90
84
  hasAllPermission: hasAllPermission
91
85
  },
92
86
  references: {
93
- webcamReference: webcamReference,
94
- canvasReference: canvasReference,
95
- screenshareReference: screenshareReference
96
- }
87
+ webcamReference,
88
+ canvasReference,
89
+ screenshareReference
90
+ },
91
+ screenshareStream
97
92
  })
98
93
  }, children);
99
94
  };
@@ -0,0 +1,29 @@
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)((_ref, screenshareReference) => {
15
+ let {
16
+ screenshareStream
17
+ } = _ref;
18
+ (0, _react.useEffect)(() => {
19
+ if (screenshareStream) {
20
+ (0, _webcamMicrophoneUtils.collectScreenshare)(screenshareReference, screenshareStream);
21
+ }
22
+ }, []);
23
+ return /*#__PURE__*/_react.default.createElement("video", {
24
+ ref: screenshareReference,
25
+ className: "captured-video-canvas hide",
26
+ id: _dom.SCREENSHARE_REFERENCE_ID
27
+ });
28
+ });
29
+ exports.ScreenshareActivityTracker = ScreenshareActivityTracker;
@@ -0,0 +1,55 @@
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;
@@ -0,0 +1,10 @@
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;
@@ -0,0 +1,29 @@
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
+ }
@@ -15,9 +15,9 @@ function usePageVisibility(isProctorParam) {
15
15
  };
16
16
  (0, _react.useEffect)(() => {
17
17
  updateVisibility();
18
- document.addEventListener(visibilityChangeEvent, updateVisibility, false);
18
+ window.addEventListener(visibilityChangeEvent, updateVisibility, false);
19
19
  return () => {
20
- document.removeEventListener(visibilityChangeEvent, updateVisibility);
20
+ window.removeEventListener(visibilityChangeEvent, updateVisibility);
21
21
  };
22
22
  }, []);
23
23
  return isVisible && isProctorParam;
@@ -3,12 +3,14 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.isChrome = exports.getVisibilityChangeEventName = exports.getIsDocumentVisible = exports.getBrowserFullscreenElementProp = void 0;
6
+ exports.isChrome = exports.getVisibilityChangeEventName = exports.getIsDocumentVisible = exports.getFocusEventName = exports.getBrowserFullscreenElementProp = exports.getBrowserDetails = exports.getBlurEventName = 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"
11
+ VISIBILITY_CHANGE: "visibilitychange",
12
+ FOCUS: "focus",
13
+ BLUR: "blur"
12
14
  };
13
15
  const getBrowserPropPrefix = () => {
14
16
  if (typeof document.msHidden !== "undefined") {
@@ -30,6 +32,10 @@ const getBrowserDocumentProp = type => {
30
32
  return getBrowserPropForHidden();
31
33
  case PROPERTY_TYPES.VISIBILITY_CHANGE:
32
34
  return "".concat(getBrowserPropPrefix(), "visibilitychange");
35
+ case PROPERTY_TYPES.FOCUS:
36
+ return "focus";
37
+ case PROPERTY_TYPES.BLUR:
38
+ return "blur";
33
39
  default:
34
40
  return "";
35
41
  }
@@ -38,6 +44,10 @@ const getIsDocumentVisible = () => !document[getBrowserDocumentProp(PROPERTY_TYP
38
44
  exports.getIsDocumentVisible = getIsDocumentVisible;
39
45
  const getVisibilityChangeEventName = () => getBrowserDocumentProp(PROPERTY_TYPES.VISIBILITY_CHANGE);
40
46
  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;
41
51
  const getBrowserFullscreenElementProp = () => {
42
52
  if (typeof document.fullscreenElement !== "undefined") {
43
53
  return "fullscreenElement";
@@ -51,4 +61,8 @@ const getBrowserFullscreenElementProp = () => {
51
61
  };
52
62
  exports.getBrowserFullscreenElementProp = getBrowserFullscreenElementProp;
53
63
  const isChrome = () => !!navigator.userAgent.match(/chrome|chromium/i);
54
- exports.isChrome = isChrome;
64
+ exports.isChrome = isChrome;
65
+ const getBrowserDetails = () => ({
66
+ isChrome: isChrome()
67
+ });
68
+ exports.getBrowserDetails = getBrowserDetails;
@@ -21,12 +21,24 @@ 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
+ });
24
30
  Object.defineProperty(exports, "getBrowserFullscreenElementProp", {
25
31
  enumerable: true,
26
32
  get: function get() {
27
33
  return _browserUtils.getBrowserFullscreenElementProp;
28
34
  }
29
35
  });
36
+ Object.defineProperty(exports, "getFocusEventName", {
37
+ enumerable: true,
38
+ get: function get() {
39
+ return _browserUtils.getFocusEventName;
40
+ }
41
+ });
30
42
  Object.defineProperty(exports, "getIsDocumentVisible", {
31
43
  enumerable: true,
32
44
  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.isWebcamVideoValid = exports.getVideoPermissionQuery = exports.getVideoPermission = exports.getGlancePercentage = exports.getAudioVideoPermission = exports.getAudioPermissionQuery = exports.getAudioPermission = exports.captureWebcamSnapshot = exports.captureScreenshot = void 0;
6
+ exports.updateVideoPermissions = exports.updateStatistics = exports.updateAudioPermissions = exports.setupScreensharePermission = exports.resetWebcamReference = exports.resetScreenshotReference = exports.isWebcamVideoValid = exports.getVideoPermissionQuery = exports.getVideoPermission = exports.getGlancePercentage = exports.getAudioVideoPermission = exports.getAudioPermissionQuery = exports.getAudioPermission = exports.collectScreenshare = 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");
@@ -109,27 +109,43 @@ const updateVideoPermissions = setVideoPermission => {
109
109
  });
110
110
  };
111
111
  exports.updateVideoPermissions = updateVideoPermissions;
112
- const setupScreensharePermission = (setScreensharePermission, screenshareReference) => navigator.mediaDevices.getDisplayMedia({
112
+ const setupScreensharePermission = (setScreensharePermission, screenshareReference, setScreenshareStream) => navigator.mediaDevices.getDisplayMedia({
113
113
  video: true
114
114
  }).then(stream => {
115
115
  const track = stream.getTracks()[0];
116
116
  if (track.getSettings().displaySurface === "monitor") {
117
117
  setScreensharePermission(true);
118
- screenshareReference.current = stream;
118
+ setScreenshareStream(stream);
119
+ collectScreenshare(screenshareReference, stream);
119
120
  track.onended = e => {
120
121
  setScreensharePermission(false);
121
- screenshareReference.current = null;
122
+ screenshareReference.current.srcObject = null;
122
123
  };
123
124
  } else {
124
125
  track.stop();
125
- screenshareReference.current = null;
126
+ resetScreenshotReference(screenshareReference);
126
127
  setScreensharePermission(false);
127
128
  }
128
129
  }).catch(e => {
129
- screenshareReference.current = null;
130
+ resetScreenshotReference(screenshareReference);
130
131
  setScreensharePermission(false);
131
132
  });
132
133
  exports.setupScreensharePermission = setupScreensharePermission;
134
+ const collectScreenshare = (screenshareReference, stream) => {
135
+ screenshareReference.current.srcObject = 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;
133
149
  const getVideoPermissionQuery = () => navigator.permissions.query({
134
150
  name: "camera"
135
151
  });
@@ -158,9 +174,9 @@ const captureWebcamSnapshot = webcamReference => {
158
174
  }
159
175
  };
160
176
  exports.captureWebcamSnapshot = captureWebcamSnapshot;
161
- const captureScreenshot = async () => {
177
+ const captureScreenshot = async elementIdSelector => {
162
178
  try {
163
- const canvas = await (0, _html2canvas.default)(document.querySelector("#ss-ref"));
179
+ const canvas = await (0, _html2canvas.default)(document.querySelector(elementIdSelector));
164
180
  const b64Snapshot = canvas.toDataURL("image/jpeg");
165
181
  return b64DataURItoBlob(b64Snapshot);
166
182
  } catch (e) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@newtonschool/react_proctoring_library",
3
- "version": "0.0.43",
3
+ "version": "0.0.45",
4
4
  "description": "Used to proctor online tests",
5
5
  "author": "ayushkagrawal,shreyachandra,weastel",
6
6
  "main": "dist/index.js",
@@ -1,143 +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 _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;
@@ -1,7 +0,0 @@
1
- .captured-video-canvas {
2
- position: absolute;
3
- bottom: 0px;
4
- }
5
- .hide {
6
- visibility: hidden;
7
- }