@newtonschool/react_proctoring_library 0.0.43 → 0.0.44
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/index.js +0 -7
- package/dist/components/proctor-app/index.js +19 -35
- package/dist/components/proctor-app/index.scss +7 -0
- package/dist/components/proctor-context-app/index.js +3 -10
- package/dist/components/screenshare-activity-tracker/index.js +26 -0
- package/dist/components/webcam-activity-tracker/index.js +55 -0
- package/dist/constants/dom.js +10 -0
- package/dist/hooks/useIsPageFocussed.js +29 -0
- package/dist/hooks/usePageVisibility.js +2 -2
- package/dist/utils/browserUtils.js +17 -3
- package/dist/utils/index.js +12 -0
- package/dist/utils/webcamMicrophoneUtils.js +22 -6
- package/package.json +1 -1
- package/dist/components/activity-tracker/index.js +0 -143
- package/dist/components/activity-tracker/index.scss +0 -7
package/dist/components/index.js
CHANGED
|
@@ -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
|
|
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,14 @@ 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
|
-
permissionSetter
|
|
53
|
-
customProps,
|
|
54
|
-
customSetter
|
|
52
|
+
permissionSetter
|
|
55
53
|
} = context;
|
|
56
|
-
(0, _react.useEffect)(() => {
|
|
57
|
-
if (customProps.childrenRenderer === undefined) {
|
|
58
|
-
setRenderChildren(!shouldRenderChildren);
|
|
59
|
-
} else {
|
|
60
|
-
setRenderChildren(customProps.childrenRenderer);
|
|
61
|
-
}
|
|
62
|
-
}, [customProps]);
|
|
63
54
|
const CustomPermissionView = customPermissionView;
|
|
64
|
-
const browserDetails = {
|
|
65
|
-
isChrome: (0, _browserUtils.isChrome)()
|
|
66
|
-
};
|
|
67
55
|
const proctorParams = (0, _react.useMemo)(() => _objectSpread(_objectSpread({}, _defaults.defaultConfig), config.proctorParams), [config.proctorParams]);
|
|
68
56
|
const statistics = (0, _react.useRef)((0, _breachUtils.getInitialStats)(proctorParams));
|
|
69
57
|
const {
|
|
@@ -75,20 +63,18 @@ const ProctorApp = _ref => {
|
|
|
75
63
|
let isBreach = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
|
76
64
|
let breachedParam = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "";
|
|
77
65
|
if (proctorParams.screenshareSnapshots && permissions.screenshare) {
|
|
78
|
-
const screenshot = await (0, _webcamMicrophoneUtils.captureScreenshot)();
|
|
66
|
+
const screenshot = await (0, _webcamMicrophoneUtils.captureScreenshot)("#".concat(_dom.SCREENSHARE_REFERENCE_ID));
|
|
79
67
|
getScreengrab(proctoringIdentifier, screenshot, isBreach, breachedParam);
|
|
80
68
|
}
|
|
81
69
|
}, [getScreengrab, proctoringIdentifier, proctorParams.screenshareSnapshots, permissions.screenshare]);
|
|
82
|
-
const sendWebcamSnapshot = (0, _react.useCallback)(function () {
|
|
70
|
+
const sendWebcamSnapshot = (0, _react.useCallback)(async function () {
|
|
83
71
|
let isBreach = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
|
84
72
|
let breachedParam = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "";
|
|
85
73
|
if (proctorParams.webcamSnapshots && permissions.video) {
|
|
86
|
-
const webcamSnapshot = (0,
|
|
87
|
-
|
|
88
|
-
getWebcamSnapshot(proctoringIdentifier, webcamSnapshot, isBreach, breachedParam);
|
|
89
|
-
}
|
|
74
|
+
const webcamSnapshot = await (0, _webcamMicrophoneUtils.captureScreenshot)("#".concat(_dom.WEBCAM_REFERENCE_ID));
|
|
75
|
+
getWebcamSnapshot(proctoringIdentifier, webcamSnapshot, isBreach, breachedParam);
|
|
90
76
|
}
|
|
91
|
-
}, [proctoringIdentifier, getWebcamSnapshot, proctorParams.webcamSnapshots, permissions.video
|
|
77
|
+
}, [proctoringIdentifier, getWebcamSnapshot, proctorParams.webcamSnapshots, permissions.video]);
|
|
92
78
|
const sendProctoredParamValues = (0, _react.useCallback)(function () {
|
|
93
79
|
let isBreach = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
|
94
80
|
let breachParam = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "";
|
|
@@ -124,31 +110,29 @@ const ProctorApp = _ref => {
|
|
|
124
110
|
sendScreengrab(true, breachData.breachedParam);
|
|
125
111
|
}
|
|
126
112
|
}, [userCount, isTabSwitched, permissions.fullscreen, lookedAwayCount, sendProctoredParamValues, sendWebcamSnapshot, sendScreengrab, proctorParams]);
|
|
113
|
+
const shouldShowProctoredComponent = (0, _breachUtils.showProctoredComponent)(proctorParams, actions.hasAllPermission);
|
|
127
114
|
return /*#__PURE__*/_react.default.createElement("div", {
|
|
128
115
|
className: "".concat(proctorParams.copyPasteProctoring ? "disable-copy-paste fullwidth fullheight" : "fullwidth fullheight")
|
|
129
|
-
},
|
|
116
|
+
}, shouldShowProctoredComponent && children, !shouldShowProctoredComponent && customPermissionView && /*#__PURE__*/_react.default.createElement(CustomPermissionView, _extends({
|
|
130
117
|
permissions: permissions,
|
|
131
118
|
hasAllPermission: actions.hasAllPermission,
|
|
132
119
|
askPermission: actions.askPermission,
|
|
133
120
|
references: references,
|
|
134
121
|
actions: actions,
|
|
135
|
-
browserDetails:
|
|
136
|
-
|
|
137
|
-
setRenderChildren(true);
|
|
138
|
-
customSetter.childrenRenderer(true);
|
|
139
|
-
}
|
|
140
|
-
}, permissionPassedProps)), !((0, _breachUtils.showProctoredComponent)(proctorParams, actions.hasAllPermission) && renderChildren) && !customPermissionView && /*#__PURE__*/_react.default.createElement(_permissions.Permission, {
|
|
122
|
+
browserDetails: (0, _browserUtils.getBrowserDetails)()
|
|
123
|
+
}, permissionPassedProps)), !shouldShowProctoredComponent && !customPermissionView && /*#__PURE__*/_react.default.createElement(_permissions.Permission, {
|
|
141
124
|
proctorParams: proctorParams,
|
|
142
125
|
permissions: permissions,
|
|
143
126
|
askPermission: actions.askPermission,
|
|
144
127
|
hasAllPermission: actions.hasAllPermission
|
|
145
|
-
}), /*#__PURE__*/_react.default.createElement(
|
|
128
|
+
}), /*#__PURE__*/_react.default.createElement(_webcamActivityTracker.default, {
|
|
146
129
|
proctorParams: proctorParams,
|
|
147
130
|
setAudioPermission: permissionSetter.audio,
|
|
148
131
|
setVideoPermission: permissionSetter.video,
|
|
149
132
|
webcamReference: references.webcamReference,
|
|
150
|
-
canvasReference: references.canvasReference
|
|
151
|
-
|
|
133
|
+
canvasReference: references.canvasReference
|
|
134
|
+
}), /*#__PURE__*/_react.default.createElement(_screenshareActivityTracker.ScreenshareActivityTracker, {
|
|
135
|
+
ref: references.screenshareReference
|
|
152
136
|
}));
|
|
153
137
|
};
|
|
154
138
|
exports.ProctorApp = ProctorApp;
|
|
@@ -35,7 +35,6 @@ 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);
|
|
@@ -78,21 +77,15 @@ const ProctoredContextApp = _ref => {
|
|
|
78
77
|
video: setVideoPermission,
|
|
79
78
|
screenshare: setScreensharePermission
|
|
80
79
|
},
|
|
81
|
-
customProps: {
|
|
82
|
-
childrenRenderer: customRenderer
|
|
83
|
-
},
|
|
84
|
-
customSetter: {
|
|
85
|
-
childrenRenderer: setCustomRenderer
|
|
86
|
-
},
|
|
87
80
|
proctorParams,
|
|
88
81
|
actions: {
|
|
89
82
|
askPermission: askPermission,
|
|
90
83
|
hasAllPermission: hasAllPermission
|
|
91
84
|
},
|
|
92
85
|
references: {
|
|
93
|
-
webcamReference
|
|
94
|
-
canvasReference
|
|
95
|
-
screenshareReference
|
|
86
|
+
webcamReference,
|
|
87
|
+
canvasReference,
|
|
88
|
+
screenshareReference
|
|
96
89
|
}
|
|
97
90
|
})
|
|
98
91
|
}, children);
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
require("core-js/modules/es.weak-map.js");
|
|
4
|
+
require("core-js/modules/web.dom-collections.iterator.js");
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.ScreenshareActivityTracker = void 0;
|
|
9
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
10
|
+
var _dom = require("../../constants/dom");
|
|
11
|
+
var _webcamMicrophoneUtils = require("../../utils/webcamMicrophoneUtils");
|
|
12
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
13
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
14
|
+
const ScreenshareActivityTracker = /*#__PURE__*/(0, _react.forwardRef)((props, screenshareReference) => {
|
|
15
|
+
(0, _react.useEffect)(() => {
|
|
16
|
+
if (screenshareReference.stream) {
|
|
17
|
+
(0, _webcamMicrophoneUtils.collectScreenshare)(screenshareReference);
|
|
18
|
+
}
|
|
19
|
+
}, []);
|
|
20
|
+
return /*#__PURE__*/_react.default.createElement("video", {
|
|
21
|
+
ref: screenshareReference,
|
|
22
|
+
className: "captured-video-canvas hide",
|
|
23
|
+
id: _dom.SCREENSHARE_REFERENCE_ID
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
exports.ScreenshareActivityTracker = ScreenshareActivityTracker;
|
|
@@ -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
|
-
|
|
18
|
+
window.addEventListener(visibilityChangeEvent, updateVisibility, false);
|
|
19
19
|
return () => {
|
|
20
|
-
|
|
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;
|
package/dist/utils/index.js
CHANGED
|
@@ -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");
|
|
@@ -115,10 +115,11 @@ const setupScreensharePermission = (setScreensharePermission, screenshareReferen
|
|
|
115
115
|
const track = stream.getTracks()[0];
|
|
116
116
|
if (track.getSettings().displaySurface === "monitor") {
|
|
117
117
|
setScreensharePermission(true);
|
|
118
|
-
screenshareReference.
|
|
118
|
+
screenshareReference.stream = stream;
|
|
119
|
+
collectScreenshare(screenshareReference);
|
|
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();
|
|
@@ -126,10 +127,25 @@ const setupScreensharePermission = (setScreensharePermission, screenshareReferen
|
|
|
126
127
|
setScreensharePermission(false);
|
|
127
128
|
}
|
|
128
129
|
}).catch(e => {
|
|
129
|
-
screenshareReference
|
|
130
|
+
resetScreenshotReference(screenshareReference);
|
|
130
131
|
setScreensharePermission(false);
|
|
131
132
|
});
|
|
132
133
|
exports.setupScreensharePermission = setupScreensharePermission;
|
|
134
|
+
const collectScreenshare = screenshareReference => {
|
|
135
|
+
screenshareReference.current.srcObject = screenshareReference.stream;
|
|
136
|
+
screenshareReference.current.onloadedmetadata = e => {
|
|
137
|
+
screenshareReference.current.play();
|
|
138
|
+
};
|
|
139
|
+
};
|
|
140
|
+
exports.collectScreenshare = collectScreenshare;
|
|
141
|
+
const resetScreenshotReference = screenshareReference => {
|
|
142
|
+
screenshareReference.current = null;
|
|
143
|
+
};
|
|
144
|
+
exports.resetScreenshotReference = resetScreenshotReference;
|
|
145
|
+
const resetWebcamReference = webcamReference => {
|
|
146
|
+
webcamReference.current = null;
|
|
147
|
+
};
|
|
148
|
+
exports.resetWebcamReference = resetWebcamReference;
|
|
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(
|
|
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,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;
|