@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.
- package/dist/components/index.js +0 -7
- package/dist/components/proctor-app/index.js +20 -36
- package/dist/components/proctor-app/index.scss +7 -0
- package/dist/components/proctor-context-app/index.js +7 -12
- package/dist/components/screenshare-activity-tracker/index.js +29 -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 +24 -8
- 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,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
|
-
|
|
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,
|
|
87
|
-
|
|
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
|
|
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
|
-
},
|
|
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:
|
|
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, {
|
|
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(
|
|
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
|
-
|
|
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;
|
|
@@ -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
|
|
94
|
-
canvasReference
|
|
95
|
-
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
|
-
|
|
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");
|
|
@@ -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
|
-
|
|
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
|
|
126
|
+
resetScreenshotReference(screenshareReference);
|
|
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, 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(
|
|
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;
|