easyproctor-hml 2.5.29 → 2.5.30
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/esm/index.js +241 -68
- package/index.js +241 -68
- package/new-flow/recorders/CameraRecorder.d.ts +7 -2
- package/package.json +1 -1
- package/plugins/recorder.d.ts +1 -0
- package/unpkg/easyproctor.min.js +32 -30
package/esm/index.js
CHANGED
|
@@ -12290,38 +12290,93 @@ function recorder(stream, buffer, videoOptions, onBufferSizeError = false, onBuf
|
|
|
12290
12290
|
};
|
|
12291
12291
|
}
|
|
12292
12292
|
console.log("recorderOptions bitsPerSecond", recorderOptions.videoBitsPerSecond);
|
|
12293
|
-
|
|
12294
|
-
|
|
12295
|
-
if (
|
|
12296
|
-
|
|
12297
|
-
|
|
12298
|
-
|
|
12299
|
-
|
|
12300
|
-
|
|
12301
|
-
|
|
12302
|
-
|
|
12303
|
-
|
|
12304
|
-
|
|
12305
|
-
|
|
12306
|
-
|
|
12307
|
-
|
|
12308
|
-
|
|
12309
|
-
|
|
12310
|
-
|
|
12311
|
-
);
|
|
12312
|
-
|
|
12313
|
-
|
|
12314
|
-
|
|
12315
|
-
|
|
12316
|
-
|
|
12317
|
-
|
|
12293
|
+
function buildMediaRecorder(stream2, recorderOptions2) {
|
|
12294
|
+
const tracks = stream2.getTracks();
|
|
12295
|
+
if (tracks.length == 0) {
|
|
12296
|
+
throw new Error("No tracks found");
|
|
12297
|
+
}
|
|
12298
|
+
const invalidTracks = tracks.find((t2) => t2.readyState != "live");
|
|
12299
|
+
if (invalidTracks) {
|
|
12300
|
+
throw new Error("Track not live: " + invalidTracks.label);
|
|
12301
|
+
}
|
|
12302
|
+
console.log("buildMediaRecorder tracks OK");
|
|
12303
|
+
let mediaRecorder2 = new MediaRecorder(stream2, recorderOptions2);
|
|
12304
|
+
console.log("buildMediaRecorder mediaRecorder OK");
|
|
12305
|
+
mediaRecorder2.ondataavailable = (e2) => {
|
|
12306
|
+
bufferSize = bufferSize + e2.data.size;
|
|
12307
|
+
console.log("video tracks length > 0", stream2.getVideoTracks().length > 0);
|
|
12308
|
+
if (stream2.getVideoTracks().length > 0) {
|
|
12309
|
+
const videoTrack = stream2.getVideoTracks()[0];
|
|
12310
|
+
console.log(videoTrack.readyState);
|
|
12311
|
+
console.log(videoTrack.enabled);
|
|
12312
|
+
}
|
|
12313
|
+
if (e2.data.size > 0) {
|
|
12314
|
+
buffer.push(e2.data);
|
|
12315
|
+
}
|
|
12316
|
+
if (!stopped) {
|
|
12317
|
+
if (lastEvent && e2.data.size === lastEvent.data.size || e2.data.size === 0) {
|
|
12318
|
+
proctoringId && lastEvent && e2.data.size === lastEvent.data.size && trackers.registerOnBufferSizeError(
|
|
12319
|
+
proctoringId,
|
|
12320
|
+
`onBufferSizeError: Recorder size freezed: ${e2.data.size} Mb`
|
|
12321
|
+
);
|
|
12322
|
+
proctoringId && e2.data.size === 0 && trackers.registerOnBufferSizeError(
|
|
12323
|
+
proctoringId,
|
|
12324
|
+
`onBufferSizeError: Recorder size equal 0 Mb`
|
|
12325
|
+
);
|
|
12326
|
+
console.log("onbuffer size error" + e2.data.size);
|
|
12327
|
+
onBufferSizeErrorCallback && onBufferSizeErrorCallback();
|
|
12328
|
+
}
|
|
12329
|
+
lastEvent = e2;
|
|
12330
|
+
} else {
|
|
12331
|
+
resolvePromise && resolvePromise();
|
|
12318
12332
|
}
|
|
12319
|
-
|
|
12320
|
-
|
|
12321
|
-
|
|
12333
|
+
};
|
|
12334
|
+
return mediaRecorder2;
|
|
12335
|
+
}
|
|
12336
|
+
let mediaRecorder = buildMediaRecorder(stream, recorderOptions);
|
|
12337
|
+
async function startRecorder(recorder2) {
|
|
12338
|
+
return new Promise((resolve, reject) => {
|
|
12339
|
+
let started = false;
|
|
12340
|
+
recorder2.onstart = () => {
|
|
12341
|
+
started = true;
|
|
12342
|
+
resolve();
|
|
12343
|
+
};
|
|
12344
|
+
recorder2.onerror = (e2) => {
|
|
12345
|
+
reject(e2);
|
|
12346
|
+
};
|
|
12347
|
+
try {
|
|
12348
|
+
recorder2.start(1e4);
|
|
12349
|
+
} catch (e2) {
|
|
12350
|
+
return reject(e2);
|
|
12351
|
+
}
|
|
12352
|
+
setTimeout(() => {
|
|
12353
|
+
if (!started) {
|
|
12354
|
+
reject(new Error("Timeout ao iniciar o recorder"));
|
|
12355
|
+
}
|
|
12356
|
+
}, 500);
|
|
12357
|
+
});
|
|
12358
|
+
}
|
|
12359
|
+
async function startWithRetry(recorder2) {
|
|
12360
|
+
for (let i2 = 0; i2 < 3; i2++) {
|
|
12361
|
+
try {
|
|
12362
|
+
console.log("startWithRetry try", i2);
|
|
12363
|
+
await startRecorder(recorder2);
|
|
12364
|
+
if (recorder2.state === "recording") {
|
|
12365
|
+
bufferSize = 0;
|
|
12366
|
+
stopped = false;
|
|
12367
|
+
return;
|
|
12368
|
+
}
|
|
12369
|
+
} catch (e2) {
|
|
12370
|
+
console.error("Erro ao iniciar o recorder:", e2);
|
|
12371
|
+
}
|
|
12372
|
+
await new Promise((r2) => setTimeout(r2, 300));
|
|
12373
|
+
recorder2 = buildMediaRecorder(stream, recorderOptions);
|
|
12322
12374
|
}
|
|
12323
|
-
|
|
12324
|
-
|
|
12375
|
+
throw new Error("Falha ao iniciar o recorder");
|
|
12376
|
+
}
|
|
12377
|
+
async function startRecording() {
|
|
12378
|
+
await startWithRetry(mediaRecorder);
|
|
12379
|
+
return;
|
|
12325
12380
|
return new Promise((resolve, reject) => {
|
|
12326
12381
|
var timeSlice = 1e4;
|
|
12327
12382
|
if ((videoOptions == null ? void 0 : videoOptions.timeSlice) != void 0) {
|
|
@@ -12349,9 +12404,9 @@ function recorder(stream, buffer, videoOptions, onBufferSizeError = false, onBuf
|
|
|
12349
12404
|
stopped = false;
|
|
12350
12405
|
setTimeout(async () => {
|
|
12351
12406
|
if (mediaRecorder.state == "recording") return;
|
|
12352
|
-
console.log("onstart Timeout");
|
|
12407
|
+
+console.log("onstart Timeout");
|
|
12353
12408
|
reject(new Error("onstart Timeout"));
|
|
12354
|
-
},
|
|
12409
|
+
}, 2e3);
|
|
12355
12410
|
});
|
|
12356
12411
|
}
|
|
12357
12412
|
function stopRecording() {
|
|
@@ -12394,6 +12449,7 @@ function recorder(stream, buffer, videoOptions, onBufferSizeError = false, onBuf
|
|
|
12394
12449
|
}
|
|
12395
12450
|
return {
|
|
12396
12451
|
startRecording,
|
|
12452
|
+
startWithRetry,
|
|
12397
12453
|
stopRecording,
|
|
12398
12454
|
pauseRecording,
|
|
12399
12455
|
resumeRecording,
|
|
@@ -12758,6 +12814,7 @@ var CameraRecorder = class {
|
|
|
12758
12814
|
this.isCanvasLoopActive = false;
|
|
12759
12815
|
this.hardwareStream = null;
|
|
12760
12816
|
this.internalClonedStream = null;
|
|
12817
|
+
this.videoElement = null;
|
|
12761
12818
|
this.currentRetries = 0;
|
|
12762
12819
|
this.packageCount = 0;
|
|
12763
12820
|
this.noiseWait = 20;
|
|
@@ -12888,8 +12945,131 @@ Setting: ${JSON.stringify(settings, null, 2)}`
|
|
|
12888
12945
|
this.hardwareStream = null;
|
|
12889
12946
|
}
|
|
12890
12947
|
}
|
|
12948
|
+
async waitForVideoFlow() {
|
|
12949
|
+
return new Promise((resolve) => {
|
|
12950
|
+
const check = () => {
|
|
12951
|
+
var _a2;
|
|
12952
|
+
if (this.videoElement && ((_a2 = this.videoElement) == null ? void 0 : _a2.readyState) >= 3) return resolve();
|
|
12953
|
+
else requestAnimationFrame(check);
|
|
12954
|
+
};
|
|
12955
|
+
check();
|
|
12956
|
+
});
|
|
12957
|
+
}
|
|
12958
|
+
async attachAndWarmup(stream) {
|
|
12959
|
+
this.videoElement = document.createElement("video");
|
|
12960
|
+
this.videoElement.srcObject = stream;
|
|
12961
|
+
this.videoElement.muted = true;
|
|
12962
|
+
await this.videoElement.play().catch((e2) => {
|
|
12963
|
+
});
|
|
12964
|
+
console.log("cameraStream.getVideoTracks() length:", this.cameraStream.getVideoTracks().length);
|
|
12965
|
+
await new Promise((resolve) => {
|
|
12966
|
+
var _a2;
|
|
12967
|
+
if (this.videoElement && ((_a2 = this.videoElement) == null ? void 0 : _a2.readyState) >= 1) return resolve();
|
|
12968
|
+
if (this.videoElement)
|
|
12969
|
+
this.videoElement.onloadedmetadata = () => resolve();
|
|
12970
|
+
});
|
|
12971
|
+
console.log("metadata ok");
|
|
12972
|
+
await this.waitForVideoFlow();
|
|
12973
|
+
console.log("waitForVideoFlow ok");
|
|
12974
|
+
await new Promise((r2) => setTimeout(r2, 300));
|
|
12975
|
+
}
|
|
12891
12976
|
async startRecording(options) {
|
|
12892
|
-
var _a2, _b, _c2, _d, _e2, _f, _g
|
|
12977
|
+
var _a2, _b, _c2, _d, _e2, _f, _g;
|
|
12978
|
+
console.log("startRecording Camera Recorder");
|
|
12979
|
+
if ((((_a2 = this.paramsConfig.videoBehaviourParameters) == null ? void 0 : _a2.detectPerson) || ((_b = this.paramsConfig.videoBehaviourParameters) == null ? void 0 : _b.detectCellPhone) || ((_c2 = this.paramsConfig.videoBehaviourParameters) == null ? void 0 : _c2.detectFace)) && !(options == null ? void 0 : options.retry)) {
|
|
12980
|
+
console.log("startRecording Camera Recorder initializeDetectors");
|
|
12981
|
+
await this.initializeDetectors();
|
|
12982
|
+
}
|
|
12983
|
+
const { cameraId, microphoneId } = this.options;
|
|
12984
|
+
const constraints = {
|
|
12985
|
+
audio: { deviceId: microphoneId },
|
|
12986
|
+
video: {
|
|
12987
|
+
deviceId: cameraId,
|
|
12988
|
+
width: this.videoOptions.width,
|
|
12989
|
+
height: this.videoOptions.height,
|
|
12990
|
+
frameRate: 15
|
|
12991
|
+
}
|
|
12992
|
+
};
|
|
12993
|
+
try {
|
|
12994
|
+
this.hardwareStream = await navigator.mediaDevices.getUserMedia(
|
|
12995
|
+
constraints
|
|
12996
|
+
);
|
|
12997
|
+
this.cameraStream = this.hardwareStream;
|
|
12998
|
+
} catch (error) {
|
|
12999
|
+
console.log("startRecording Camera Recorder error", error);
|
|
13000
|
+
if (error.toString() == "NotReadableError: Could not start video source")
|
|
13001
|
+
throw "N\xE3o foi poss\xEDvel conectar a camera, ela pode estar sendo utilizada por outro programa";
|
|
13002
|
+
throw error;
|
|
13003
|
+
}
|
|
13004
|
+
await this.attachAndWarmup(this.cameraStream);
|
|
13005
|
+
const {
|
|
13006
|
+
startRecording,
|
|
13007
|
+
stopRecording,
|
|
13008
|
+
pauseRecording,
|
|
13009
|
+
resumeRecording,
|
|
13010
|
+
recorderOptions,
|
|
13011
|
+
getBufferSize
|
|
13012
|
+
} = recorder(
|
|
13013
|
+
this.cameraStream,
|
|
13014
|
+
// streamToRecord,
|
|
13015
|
+
this.blobs,
|
|
13016
|
+
this.videoOptions,
|
|
13017
|
+
this.options.onBufferSizeError,
|
|
13018
|
+
(e2) => this.bufferError(e2),
|
|
13019
|
+
false
|
|
13020
|
+
);
|
|
13021
|
+
this.recordingStart = startRecording;
|
|
13022
|
+
this.recordingStop = stopRecording;
|
|
13023
|
+
this.recordingPause = pauseRecording;
|
|
13024
|
+
this.recordingResume = resumeRecording;
|
|
13025
|
+
this.recorderOptions = recorderOptions;
|
|
13026
|
+
this.getBufferSize = getBufferSize;
|
|
13027
|
+
try {
|
|
13028
|
+
await new Promise((r2) => setTimeout(r2, 500));
|
|
13029
|
+
await this.recordingStart();
|
|
13030
|
+
} catch (error) {
|
|
13031
|
+
console.log("startRecording Camera Recorder error", error);
|
|
13032
|
+
throw error;
|
|
13033
|
+
}
|
|
13034
|
+
const track = this.cameraStream.getVideoTracks()[0];
|
|
13035
|
+
const settings = track.getSettings();
|
|
13036
|
+
let { width = 0, height = 0 } = settings;
|
|
13037
|
+
const isPortrait = (_d = screen.orientation) == null ? void 0 : _d.type.includes("portrait");
|
|
13038
|
+
if (isPortrait && isMobileDevice()) {
|
|
13039
|
+
if (this.videoOptions.width == height && this.videoOptions.height == width) {
|
|
13040
|
+
[width, height] = [height, width];
|
|
13041
|
+
}
|
|
13042
|
+
}
|
|
13043
|
+
if (this.videoOptions.minWidth > width || this.videoOptions.minHeight > height) {
|
|
13044
|
+
throw STREAM_UNDER_MINIMUM_PERMITTED;
|
|
13045
|
+
} else if (this.videoOptions.width !== width || this.videoOptions.height !== height) {
|
|
13046
|
+
trackers.registerAnotherStream(
|
|
13047
|
+
this.proctoringId,
|
|
13048
|
+
`Maybe have another stream active
|
|
13049
|
+
Video Options: ${JSON.stringify(
|
|
13050
|
+
this.videoOptions,
|
|
13051
|
+
null,
|
|
13052
|
+
2
|
|
13053
|
+
)}
|
|
13054
|
+
Setting: ${JSON.stringify(settings, null, 2)}`
|
|
13055
|
+
);
|
|
13056
|
+
throw ANOTHER_STREAM_ACTIVE;
|
|
13057
|
+
}
|
|
13058
|
+
if ((_e2 = this.paramsConfig.videoBehaviourParameters) == null ? void 0 : _e2.detectFace) {
|
|
13059
|
+
await this.faceDetection.enableCam(this.cameraStream);
|
|
13060
|
+
}
|
|
13061
|
+
if (((_f = this.paramsConfig.videoBehaviourParameters) == null ? void 0 : _f.detectPerson) || ((_g = this.paramsConfig.videoBehaviourParameters) == null ? void 0 : _g.detectCellPhone)) {
|
|
13062
|
+
await this.objectDetection.enableCam(this.cameraStream);
|
|
13063
|
+
}
|
|
13064
|
+
this.filesToUpload = [];
|
|
13065
|
+
if (this.options.proctoringType == "REALTIME") {
|
|
13066
|
+
this.captureFrame();
|
|
13067
|
+
}
|
|
13068
|
+
this.packageCount = 0;
|
|
13069
|
+
console.log("startRecording Camera Recorder OK");
|
|
13070
|
+
}
|
|
13071
|
+
async startRecordingOld(options) {
|
|
13072
|
+
var _a2, _b, _c2, _d, _e2, _f, _g;
|
|
12893
13073
|
console.log("startRecording Camera Recorder");
|
|
12894
13074
|
if ((((_a2 = this.paramsConfig.videoBehaviourParameters) == null ? void 0 : _a2.detectPerson) || ((_b = this.paramsConfig.videoBehaviourParameters) == null ? void 0 : _b.detectCellPhone) || ((_c2 = this.paramsConfig.videoBehaviourParameters) == null ? void 0 : _c2.detectFace)) && !(options == null ? void 0 : options.retry)) {
|
|
12895
13075
|
console.log("startRecording Camera Recorder initializeDetectors");
|
|
@@ -12919,6 +13099,17 @@ Setting: ${JSON.stringify(settings, null, 2)}`
|
|
|
12919
13099
|
const track = this.cameraStream.getVideoTracks()[0];
|
|
12920
13100
|
const settings = track.getSettings();
|
|
12921
13101
|
let { width = 0, height = 0 } = settings;
|
|
13102
|
+
console.log("cameraStream.getVideoTracks() length:", this.cameraStream.getVideoTracks().length);
|
|
13103
|
+
await new Promise((resolve) => {
|
|
13104
|
+
const interval = setInterval(() => {
|
|
13105
|
+
console.log("cameraStream.getVideoTracks()[0].readyState", this.cameraStream.getVideoTracks()[0].readyState);
|
|
13106
|
+
if (this.cameraStream.getVideoTracks()[0].readyState == "live") {
|
|
13107
|
+
clearInterval(interval);
|
|
13108
|
+
resolve();
|
|
13109
|
+
}
|
|
13110
|
+
}, 100);
|
|
13111
|
+
});
|
|
13112
|
+
await new Promise((r2) => setTimeout(r2, 300));
|
|
12922
13113
|
const {
|
|
12923
13114
|
startRecording,
|
|
12924
13115
|
stopRecording,
|
|
@@ -12943,6 +13134,7 @@ Setting: ${JSON.stringify(settings, null, 2)}`
|
|
|
12943
13134
|
this.getBufferSize = getBufferSize;
|
|
12944
13135
|
console.log("startRecording Camera Recorder recordingStart");
|
|
12945
13136
|
try {
|
|
13137
|
+
await new Promise((r2) => setTimeout(r2, 500));
|
|
12946
13138
|
await this.recordingStart();
|
|
12947
13139
|
} catch (error) {
|
|
12948
13140
|
console.log("startRecording Camera Recorder error", error);
|
|
@@ -12969,11 +13161,10 @@ Setting: ${JSON.stringify(settings, null, 2)}`
|
|
|
12969
13161
|
);
|
|
12970
13162
|
throw ANOTHER_STREAM_ACTIVE;
|
|
12971
13163
|
}
|
|
12972
|
-
((_e2 = this.paramsConfig.
|
|
12973
|
-
if ((_f = this.paramsConfig.videoBehaviourParameters) == null ? void 0 : _f.detectFace) {
|
|
13164
|
+
if ((_e2 = this.paramsConfig.videoBehaviourParameters) == null ? void 0 : _e2.detectFace) {
|
|
12974
13165
|
await this.faceDetection.enableCam(this.cameraStream);
|
|
12975
13166
|
}
|
|
12976
|
-
if (((
|
|
13167
|
+
if (((_f = this.paramsConfig.videoBehaviourParameters) == null ? void 0 : _f.detectPerson) || ((_g = this.paramsConfig.videoBehaviourParameters) == null ? void 0 : _g.detectCellPhone)) {
|
|
12977
13168
|
await this.objectDetection.enableCam(this.cameraStream);
|
|
12978
13169
|
}
|
|
12979
13170
|
this.filesToUpload = [];
|
|
@@ -12984,6 +13175,7 @@ Setting: ${JSON.stringify(settings, null, 2)}`
|
|
|
12984
13175
|
console.log("startRecording Camera Recorder finished");
|
|
12985
13176
|
}
|
|
12986
13177
|
async stopRecording() {
|
|
13178
|
+
var _a2, _b, _c2;
|
|
12987
13179
|
console.log("Stopping Camera Recorder...");
|
|
12988
13180
|
this.isCanvasLoopActive = false;
|
|
12989
13181
|
this.recordingStop && await this.recordingStop();
|
|
@@ -13003,8 +13195,18 @@ Setting: ${JSON.stringify(settings, null, 2)}`
|
|
|
13003
13195
|
this.hardwareStream.getTracks().forEach((track) => track.stop());
|
|
13004
13196
|
this.hardwareStream = null;
|
|
13005
13197
|
}
|
|
13006
|
-
|
|
13007
|
-
|
|
13198
|
+
if (this.videoElement) {
|
|
13199
|
+
(_a2 = this.videoElement) == null ? void 0 : _a2.remove();
|
|
13200
|
+
this.videoElement = null;
|
|
13201
|
+
}
|
|
13202
|
+
if (this.video) {
|
|
13203
|
+
(_b = this.video) == null ? void 0 : _b.remove();
|
|
13204
|
+
}
|
|
13205
|
+
if (this.canvas) {
|
|
13206
|
+
(_c2 = this.canvas) == null ? void 0 : _c2.remove();
|
|
13207
|
+
}
|
|
13208
|
+
} catch (error) {
|
|
13209
|
+
console.error("Erro ao parar os streams de m\xEDdia.", error);
|
|
13008
13210
|
}
|
|
13009
13211
|
this.faceDetection && this.faceDetection.detecting && this.faceDetection.stopDetection();
|
|
13010
13212
|
this.objectDetection && this.objectDetection.detecting && this.objectDetection.stopDetection();
|
|
@@ -13023,35 +13225,6 @@ Setting: ${JSON.stringify(settings, null, 2)}`
|
|
|
13023
13225
|
async resumeRecording() {
|
|
13024
13226
|
await this.recordingResume();
|
|
13025
13227
|
}
|
|
13026
|
-
photoShotsCycle() {
|
|
13027
|
-
let imageFile;
|
|
13028
|
-
this.configImageCapture();
|
|
13029
|
-
this.imageInterval = setInterval(async () => {
|
|
13030
|
-
this.canvas.getContext("2d").drawImage(
|
|
13031
|
-
this.video,
|
|
13032
|
-
0,
|
|
13033
|
-
0,
|
|
13034
|
-
this.videoOptions.width,
|
|
13035
|
-
this.videoOptions.height
|
|
13036
|
-
);
|
|
13037
|
-
const image_data_url = this.canvas.toDataURL("image/jpeg");
|
|
13038
|
-
imageFile = await this.getFile(
|
|
13039
|
-
image_data_url,
|
|
13040
|
-
`${this.proctoringId}_${this.imageCount + 1}.jpg`,
|
|
13041
|
-
"image/jpeg"
|
|
13042
|
-
);
|
|
13043
|
-
if (imageFile && this.upload && this.backendToken) {
|
|
13044
|
-
this.upload.upload(
|
|
13045
|
-
{
|
|
13046
|
-
file: imageFile
|
|
13047
|
-
},
|
|
13048
|
-
this.backendToken,
|
|
13049
|
-
true
|
|
13050
|
-
);
|
|
13051
|
-
this.imageCount++;
|
|
13052
|
-
}
|
|
13053
|
-
}, this.paramsConfig.imageBehaviourParameters.uploadInterval * 1e3);
|
|
13054
|
-
}
|
|
13055
13228
|
async getCurrentImageBase64() {
|
|
13056
13229
|
if (!this.video || !this.canvas) {
|
|
13057
13230
|
this.configImageCapture();
|
|
@@ -18605,7 +18778,6 @@ var _ExternalCameraChecker = class _ExternalCameraChecker {
|
|
|
18605
18778
|
this.connection = null;
|
|
18606
18779
|
this.context = context;
|
|
18607
18780
|
this.onRealtimeAlertsCallback = onRealtimeAlertsCallback;
|
|
18608
|
-
console.log("context -> ", context);
|
|
18609
18781
|
this.backend = new BackendService({
|
|
18610
18782
|
type: (context == null ? void 0 : context.type) || "prod",
|
|
18611
18783
|
token: context.token
|
|
@@ -19659,6 +19831,7 @@ var Proctoring = class {
|
|
|
19659
19831
|
try {
|
|
19660
19832
|
console.log("start Proctoring recorder.startAll");
|
|
19661
19833
|
await this.recorder.startAll();
|
|
19834
|
+
console.log("start Proctoring recorder.startAll ok");
|
|
19662
19835
|
} catch (error) {
|
|
19663
19836
|
console.log("start Proctoring error", error);
|
|
19664
19837
|
alert(error);
|