@a4anthony/proctorkit-vue 0.1.5 → 0.2.0
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/README.md +176 -8
- package/dist/ProctoredAssessment.vue.d.ts +70 -2
- package/dist/ProctoredAssessment.vue.d.ts.map +1 -1
- package/dist/ProctoringDeviceSettings.vue.d.ts +27 -1
- package/dist/ProctoringDeviceSettings.vue.d.ts.map +1 -1
- package/dist/ProctoringSystemCheck.vue.d.ts +39 -11
- package/dist/ProctoringSystemCheck.vue.d.ts.map +1 -1
- package/dist/browser-face-detector.d.ts +59 -0
- package/dist/browser-face-detector.d.ts.map +1 -0
- package/dist/check-cards/system/DisplayPermissionDialog.vue.d.ts +24 -0
- package/dist/check-cards/system/DisplayPermissionDialog.vue.d.ts.map +1 -0
- package/dist/check-cards/system/DisplayRecovery.vue.d.ts +25 -0
- package/dist/check-cards/system/DisplayRecovery.vue.d.ts.map +1 -0
- package/dist/check-cards/system/SystemCheckCard.vue.d.ts +13 -1
- package/dist/check-cards/system/SystemCheckCard.vue.d.ts.map +1 -1
- package/dist/check-cards/system/display-progress-story.d.ts +468 -0
- package/dist/check-cards/system/display-progress-story.d.ts.map +1 -0
- package/dist/check-cards/system/display-recovery-story.d.ts +290 -0
- package/dist/check-cards/system/display-recovery-story.d.ts.map +1 -0
- package/dist/demo-runner/QuestionCard.vue.d.ts.map +1 -1
- package/dist/detect-face.d.ts +22 -95
- package/dist/detect-face.d.ts.map +1 -1
- package/dist/i18n/merge.d.ts.map +1 -1
- package/dist/index.d.ts +19 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9637 -2485
- package/dist/media-controls/AudioPlayer.vue.d.ts +43 -20
- package/dist/media-controls/AudioPlayer.vue.d.ts.map +1 -1
- package/dist/media-controls/AudioRecorder.vue.d.ts +171 -11
- package/dist/media-controls/AudioRecorder.vue.d.ts.map +1 -1
- package/dist/media-controls/RecorderUploadIndicator.vue.d.ts +17 -0
- package/dist/media-controls/RecorderUploadIndicator.vue.d.ts.map +1 -0
- package/dist/media-controls/VideoPlayer.vue.d.ts +36 -13
- package/dist/media-controls/VideoPlayer.vue.d.ts.map +1 -1
- package/dist/media-controls/VideoRecorder.vue.d.ts +90 -10
- package/dist/media-controls/VideoRecorder.vue.d.ts.map +1 -1
- package/dist/media-controls/audio-recorder-messages.d.ts +15 -0
- package/dist/media-controls/audio-recorder-messages.d.ts.map +1 -0
- package/dist/media-controls/local-media-playback-client.d.ts +2 -6
- package/dist/media-controls/local-media-playback-client.d.ts.map +1 -1
- package/dist/media-controls/local-media-recording-client.d.ts.map +1 -1
- package/dist/media-controls/media-recovery-story.d.ts +9 -0
- package/dist/media-controls/media-recovery-story.d.ts.map +1 -0
- package/dist/media-controls/storybook-mock-client.d.ts +2 -0
- package/dist/media-controls/storybook-mock-client.d.ts.map +1 -1
- package/dist/media-controls/types.d.ts +63 -7
- package/dist/media-controls/types.d.ts.map +1 -1
- package/dist/media-controls/ui-config.d.ts +2 -2
- package/dist/media-controls/ui-config.d.ts.map +1 -1
- package/dist/media-controls/useLiveInputCheck.d.ts +18 -0
- package/dist/media-controls/useLiveInputCheck.d.ts.map +1 -0
- package/dist/media-controls/useMediaClipRecorder.d.ts +90 -12
- package/dist/media-controls/useMediaClipRecorder.d.ts.map +1 -1
- package/dist/media-controls/useMediaFilePlayback.d.ts +8 -1
- package/dist/media-controls/useMediaFilePlayback.d.ts.map +1 -1
- package/dist/media-controls/useMinimumVisibleUpload.d.ts +18 -0
- package/dist/media-controls/useMinimumVisibleUpload.d.ts.map +1 -0
- package/dist/proctored-assessment/PreparationGate.vue.d.ts +16 -0
- package/dist/proctored-assessment/PreparationGate.vue.d.ts.map +1 -0
- package/dist/proctored-assessment/preparation-feedback.d.ts +7 -0
- package/dist/proctored-assessment/preparation-feedback.d.ts.map +1 -0
- package/dist/proctored-assessment/replay-failure-queue.d.ts +18 -0
- package/dist/proctored-assessment/replay-failure-queue.d.ts.map +1 -0
- package/dist/proctored-assessment/replay-failure-queue.test.d.ts +2 -0
- package/dist/proctored-assessment/replay-failure-queue.test.d.ts.map +1 -0
- package/dist/proctored-assessment/request-deadline.d.ts +1 -0
- package/dist/proctored-assessment/request-deadline.d.ts.map +1 -1
- package/dist/proctored-assessment/resume-microphone-route.d.ts +13 -0
- package/dist/proctored-assessment/resume-microphone-route.d.ts.map +1 -0
- package/dist/proctored-assessment/resume-microphone-route.test.d.ts +2 -0
- package/dist/proctored-assessment/resume-microphone-route.test.d.ts.map +1 -0
- package/dist/proctored-assessment/resume-probe.d.ts +13 -0
- package/dist/proctored-assessment/resume-probe.d.ts.map +1 -1
- package/dist/proctored-assessment/resume-speaker-confirmation.d.ts +27 -0
- package/dist/proctored-assessment/resume-speaker-confirmation.d.ts.map +1 -0
- package/dist/proctored-assessment/resume-speaker-route.d.ts +32 -0
- package/dist/proctored-assessment/resume-speaker-route.d.ts.map +1 -0
- package/dist/proctored-assessment/session-start.d.ts +2 -2
- package/dist/proctored-assessment/types.d.ts +14 -4
- package/dist/proctored-assessment/types.d.ts.map +1 -1
- package/dist/proctored-assessment/usePreparationRetryTiming.d.ts +13 -0
- package/dist/proctored-assessment/usePreparationRetryTiming.d.ts.map +1 -0
- package/dist/proctored-assessment/useResumeDisplayGuard.d.ts +20 -0
- package/dist/proctored-assessment/useResumeDisplayGuard.d.ts.map +1 -0
- package/dist/proctoring-client.d.ts +6 -2
- package/dist/proctoring-client.d.ts.map +1 -1
- package/dist/proctoring-system-check-contract.d.ts +2 -0
- package/dist/proctoring-system-check-contract.d.ts.map +1 -1
- package/dist/runtime-devices/DevicePickerItem.vue.d.ts +58 -0
- package/dist/runtime-devices/DevicePickerItem.vue.d.ts.map +1 -0
- package/dist/runtime-devices/PickerMessage.vue.d.ts +17 -0
- package/dist/runtime-devices/PickerMessage.vue.d.ts.map +1 -0
- package/dist/runtime-devices/ProctoringDevicePicker.vue.d.ts +89 -0
- package/dist/runtime-devices/ProctoringDevicePicker.vue.d.ts.map +1 -0
- package/dist/runtime-devices/device-picker-messages.d.ts +42 -0
- package/dist/runtime-devices/device-picker-messages.d.ts.map +1 -0
- package/dist/runtime-devices/microphone-attention.d.ts +48 -0
- package/dist/runtime-devices/microphone-attention.d.ts.map +1 -0
- package/dist/runtime-devices/microphone-check-messages.d.ts +13 -0
- package/dist/runtime-devices/microphone-check-messages.d.ts.map +1 -0
- package/dist/runtime-devices/runtime-device-activity.d.ts +16 -0
- package/dist/runtime-devices/runtime-device-activity.d.ts.map +1 -0
- package/dist/runtime-devices/runtime-device-selection.d.ts +11 -0
- package/dist/runtime-devices/runtime-device-selection.d.ts.map +1 -0
- package/dist/runtime-devices/useRuntimeDevice.d.ts +72 -0
- package/dist/runtime-devices/useRuntimeDevice.d.ts.map +1 -0
- package/dist/runtime-devices/useTrackLoss.d.ts +15 -0
- package/dist/runtime-devices/useTrackLoss.d.ts.map +1 -0
- package/dist/style.css +367 -14
- package/dist/text-answer/ProctoredTextarea.vue.d.ts +8 -1
- package/dist/text-answer/ProctoredTextarea.vue.d.ts.map +1 -1
- package/dist/text-answer/useProctoredText.d.ts +5 -2
- package/dist/text-answer/useProctoredText.d.ts.map +1 -1
- package/dist/ui/ProctoringAlert.vue.d.ts.map +1 -1
- package/dist/ui/ProctoringFileUpload.vue.d.ts +3 -3
- package/dist/ui/ProctoringFileUpload.vue.d.ts.map +1 -1
- package/dist/ui/ProctoringInput.vue.d.ts +3 -3
- package/dist/ui/ProctoringInput.vue.d.ts.map +1 -1
- package/dist/ui/ProctoringSelect.vue.d.ts +2 -2
- package/dist/ui/ProctoringSelect.vue.d.ts.map +1 -1
- package/dist/usePreflightCheck.d.ts +4 -3
- package/dist/usePreflightCheck.d.ts.map +1 -1
- package/dist/vision_bundle-8xEDyfqS.js +4160 -0
- package/dist/wizard/BrowserDisplayPermissionGuide.vue.d.ts +11 -0
- package/dist/wizard/BrowserDisplayPermissionGuide.vue.d.ts.map +1 -0
- package/dist/wizard/BrowserPermissionLocation.vue.d.ts +9 -0
- package/dist/wizard/BrowserPermissionLocation.vue.d.ts.map +1 -0
- package/dist/wizard/CameraStep.vue.d.ts +10 -1
- package/dist/wizard/CameraStep.vue.d.ts.map +1 -1
- package/dist/wizard/CandidateHeadshotField.vue.d.ts.map +1 -1
- package/dist/wizard/CandidateIntakeStep.vue.d.ts +3 -0
- package/dist/wizard/CandidateIntakeStep.vue.d.ts.map +1 -1
- package/dist/wizard/ChecklistShell.vue.d.ts +3 -0
- package/dist/wizard/ChecklistShell.vue.d.ts.map +1 -1
- package/dist/wizard/FinalStep.vue.d.ts +6 -2
- package/dist/wizard/FinalStep.vue.d.ts.map +1 -1
- package/dist/wizard/MediaDeviceSelect.vue.d.ts +11 -1
- package/dist/wizard/MediaDeviceSelect.vue.d.ts.map +1 -1
- package/dist/wizard/MicStep.vue.d.ts +24 -3
- package/dist/wizard/MicStep.vue.d.ts.map +1 -1
- package/dist/wizard/PermissionDeniedPanel.vue.d.ts +9 -4
- package/dist/wizard/PermissionDeniedPanel.vue.d.ts.map +1 -1
- package/dist/wizard/ResumeCheck.vue.d.ts +16 -2
- package/dist/wizard/ResumeCheck.vue.d.ts.map +1 -1
- package/dist/wizard/SpeakerStep.vue.d.ts +17 -4
- package/dist/wizard/SpeakerStep.vue.d.ts.map +1 -1
- package/dist/wizard/SystemStep.vue.d.ts +9 -0
- package/dist/wizard/SystemStep.vue.d.ts.map +1 -1
- package/dist/wizard/WizardShell.vue.d.ts +3 -3
- package/dist/wizard/WizardShell.vue.d.ts.map +1 -1
- package/dist/wizard/candidate-intake-draft.d.ts +9 -0
- package/dist/wizard/candidate-intake-draft.d.ts.map +1 -0
- package/dist/wizard/display-diagnostics.d.ts +21 -0
- package/dist/wizard/display-diagnostics.d.ts.map +1 -0
- package/dist/wizard/event-telemetry.d.ts +24 -0
- package/dist/wizard/event-telemetry.d.ts.map +1 -0
- package/dist/wizard/media-device-list.d.ts +8 -1
- package/dist/wizard/media-device-list.d.ts.map +1 -1
- package/dist/wizard/microphone-preflight-trace.d.ts +10 -0
- package/dist/wizard/microphone-preflight-trace.d.ts.map +1 -0
- package/dist/wizard/microphone-preflight-trace.test.d.ts +2 -0
- package/dist/wizard/microphone-preflight-trace.test.d.ts.map +1 -0
- package/dist/wizard/resume-check-stories/shared.d.ts +35 -11
- package/dist/wizard/resume-check-stories/shared.d.ts.map +1 -1
- package/dist/wizard/speaker-test-tone.d.ts +29 -4
- package/dist/wizard/speaker-test-tone.d.ts.map +1 -1
- package/dist/wizard/useCandidateIssues.d.ts +30 -0
- package/dist/wizard/useCandidateIssues.d.ts.map +1 -0
- package/dist/wizard/useCandidateIssues.test.d.ts +2 -0
- package/dist/wizard/useCandidateIssues.test.d.ts.map +1 -0
- package/dist/wizard/useLiveDisplayCheck.d.ts +8 -0
- package/dist/wizard/useLiveDisplayCheck.d.ts.map +1 -0
- package/dist/wizard/usePreflightTelemetry.d.ts +6 -26
- package/dist/wizard/usePreflightTelemetry.d.ts.map +1 -1
- package/dist/wizard/useWizardSteps.d.ts +10 -1
- package/dist/wizard/useWizardSteps.d.ts.map +1 -1
- package/package.json +4 -3
package/README.md
CHANGED
|
@@ -314,13 +314,15 @@ Slots:
|
|
|
314
314
|
|
|
315
315
|
Use `ProctoringSystemCheck` directly only when you need a custom preflight UI or
|
|
316
316
|
framework wrapper. Normal Vue integrations should not need to import
|
|
317
|
-
`
|
|
317
|
+
`createBrowserDetectFace`, build `engineOptions`, or manually check preflight
|
|
318
318
|
outcomes.
|
|
319
319
|
|
|
320
320
|
When you mount `ProctoringSystemCheck` directly, either serve the VAD assets at
|
|
321
321
|
`/vad/` and `/ort/`, or pass the same `vad-assets` object shown above. Direct
|
|
322
322
|
wizard mounts do not know your API base URL, so they cannot infer the backend
|
|
323
|
-
asset routes automatically.
|
|
323
|
+
asset routes automatically. The in-browser face detector's assets default to
|
|
324
|
+
`/sdk-assets/vision/<version>/` at the ingest URL's origin; pass `vision-assets`
|
|
325
|
+
to serve them elsewhere.
|
|
324
326
|
|
|
325
327
|
## Media question components
|
|
326
328
|
|
|
@@ -372,25 +374,189 @@ import { AudioPlayer, AudioRecorder, VideoRecorder } from "@a4anthony/proctorkit
|
|
|
372
374
|
<AudioRecorder
|
|
373
375
|
:client="client"
|
|
374
376
|
title="Speaking answer"
|
|
377
|
+
:clip-id="question.currentAudioClipId"
|
|
375
378
|
:max-duration-ms="120000"
|
|
376
|
-
@uploaded="
|
|
377
|
-
|
|
379
|
+
@uploaded="
|
|
380
|
+
({ kind, clipId, clipNumber, delivery }) =>
|
|
381
|
+
saveAnswer({ kind, clipId, clipNumber, delivery })
|
|
382
|
+
"
|
|
383
|
+
@dropped="({ clipId, code, reason }) => showUploadError({ clipId, code, reason })"
|
|
378
384
|
/>
|
|
379
385
|
|
|
380
386
|
<VideoRecorder
|
|
381
387
|
:client="client"
|
|
382
388
|
title="Video answer"
|
|
389
|
+
:clip-id="question.currentVideoClipId"
|
|
383
390
|
:max-duration-ms="120000"
|
|
384
391
|
:stream="candidateCameraStream"
|
|
385
392
|
:video-bitrate="1500000"
|
|
386
|
-
@uploaded="
|
|
387
|
-
|
|
393
|
+
@uploaded="
|
|
394
|
+
({ kind, clipId, clipNumber, delivery }) =>
|
|
395
|
+
saveAnswer({ kind, clipId, clipNumber, delivery })
|
|
396
|
+
"
|
|
397
|
+
@dropped="({ clipId, code, reason }) => showUploadError({ clipId, code, reason })"
|
|
388
398
|
/>
|
|
389
399
|
</template>
|
|
390
400
|
</ProctoredAssessment>
|
|
391
401
|
</template>
|
|
392
402
|
```
|
|
393
403
|
|
|
404
|
+
`clip-id` is optional. When omitted, ProctorKit generates a stable opaque ID
|
|
405
|
+
for the current take only. Generated IDs are not persisted across a component
|
|
406
|
+
or client recreation. Persist the accepted `clipId` with the logical answer so
|
|
407
|
+
you can correlate stored results across a reload. A reload cannot resume an
|
|
408
|
+
in-progress recording or its retry bytes: start a new take with a new ID after a
|
|
409
|
+
reload or new component/client instance, even with the same answer mapping.
|
|
410
|
+
Reuse an ID only for the exact retained bytes of a retry. When the host provides
|
|
411
|
+
an ID, use a fresh 1–200-character ASCII token for every
|
|
412
|
+
distinct retake (for example,
|
|
413
|
+
`speaking-q31-<unique-value>.webm`); `.webm` and `.opus` suffixes are allowed.
|
|
414
|
+
Reuse an ID only to retry the same media bytes. A different recording with the
|
|
415
|
+
same ID produces a `dropped` payload with `code: "conflict"` and
|
|
416
|
+
`reason: "clip-id-conflict"`. Update the current ID before the candidate starts
|
|
417
|
+
another distinct take.
|
|
418
|
+
|
|
419
|
+
All recorder lifecycle payloads — `started`, `stopped`, `uploaded`, `dropped`,
|
|
420
|
+
and `clip-mirror-failed` — contain `clipId`. Use a persisted accepted ID to
|
|
421
|
+
correlate a stored answer with its question across a reload; never re-supply it
|
|
422
|
+
for different media. `started` and `stopped` carry a provisional `clipNumber`.
|
|
423
|
+
`uploaded` also carries `delivery`:
|
|
424
|
+
|
|
425
|
+
| `delivery` | `clipNumber` | Persist |
|
|
426
|
+
| -------------- | --------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- |
|
|
427
|
+
| `"client"` | Provisional because the host `sendClip` completes before ProctorKit allocates a number. | Use `clipId` as the stable answer and evidence correlation key. |
|
|
428
|
+
| `"fallback"` | Canonical within the session and media kind. | Store `kind`, `clipId`, `clipNumber`, `answerReference`, `contentSha256`, and `fallbackSelection`; it is emitted only after the server records the exact durable fallback selection. |
|
|
429
|
+
| `"proctorkit"` | Canonical within the session and media kind. | Save `kind`, `clipId`, and `clipNumber` for ProctorKit lookup. |
|
|
430
|
+
| `"local"` | Provisional and non-canonical. No client or `sendClip` received the bytes. | Do not treat it as an uploaded answer; use this mode only for non-proctored local UI. |
|
|
431
|
+
|
|
432
|
+
The clip ID is never used as a storage path or trusted as a media-type
|
|
433
|
+
extension. Deploy the clip-ID-aware server before upgrading clients: an older
|
|
434
|
+
or misrouted server is surfaced as `dropped` with `code: "server-error"` and
|
|
435
|
+
`reason: "invalid-response"`, rather than a false success.
|
|
436
|
+
|
|
437
|
+
### Host-primary recording upload
|
|
438
|
+
|
|
439
|
+
`sendClip` delivers each finalized recording to your backend as the primary
|
|
440
|
+
upload. Its optional second argument lets the component render upload progress
|
|
441
|
+
internally:
|
|
442
|
+
|
|
443
|
+
```ts
|
|
444
|
+
import type { MediaClipDataSink } from "@a4anthony/proctorkit-vue";
|
|
445
|
+
|
|
446
|
+
const sendClip: MediaClipDataSink = (clip, context) =>
|
|
447
|
+
new Promise<void>((resolve, reject) => {
|
|
448
|
+
const request = new XMLHttpRequest();
|
|
449
|
+
const signal = context?.signal;
|
|
450
|
+
const abort = () => request.abort();
|
|
451
|
+
const cleanup = () => signal?.removeEventListener("abort", abort);
|
|
452
|
+
request.upload.onprogress = ({ lengthComputable, loaded, total }) => {
|
|
453
|
+
if (lengthComputable && total > 0) {
|
|
454
|
+
context?.reportProgress?.((loaded / total) * 100);
|
|
455
|
+
}
|
|
456
|
+
};
|
|
457
|
+
request.onload = () => {
|
|
458
|
+
cleanup();
|
|
459
|
+
if (request.status >= 200 && request.status < 300) resolve();
|
|
460
|
+
else reject(new Error(`Upload failed: ${request.status}`));
|
|
461
|
+
};
|
|
462
|
+
request.onerror = () => {
|
|
463
|
+
cleanup();
|
|
464
|
+
reject(new Error("Upload failed"));
|
|
465
|
+
};
|
|
466
|
+
request.onabort = () => {
|
|
467
|
+
cleanup();
|
|
468
|
+
reject(new DOMException("Upload aborted", "AbortError"));
|
|
469
|
+
};
|
|
470
|
+
request.open("POST", "/api/recordings");
|
|
471
|
+
request.setRequestHeader("Content-Type", clip.mimeType);
|
|
472
|
+
request.setRequestHeader("X-Clip-ID", clip.clipId);
|
|
473
|
+
if (signal?.aborted) {
|
|
474
|
+
cleanup();
|
|
475
|
+
reject(new DOMException("Upload aborted", "AbortError"));
|
|
476
|
+
return;
|
|
477
|
+
}
|
|
478
|
+
signal?.addEventListener("abort", abort, { once: true });
|
|
479
|
+
request.send(clip.blob);
|
|
480
|
+
});
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
Existing one-argument callbacks remain valid. With an active ProctorKit client,
|
|
484
|
+
your `sendClip` and the ProctorKit evidence upload start together. The component
|
|
485
|
+
waits for your callback, then emits `uploaded` with `delivery: "client"`; the
|
|
486
|
+
candidate may move to the next question without waiting for the evidence copy.
|
|
487
|
+
The indicator therefore represents `sendClip` and becomes determinate when it
|
|
488
|
+
calls `reportProgress`. Values are rounded and clamped to `0`–`100`.
|
|
489
|
+
|
|
490
|
+
The ProctorKit upload is background evidence while `sendClip` is present. Its
|
|
491
|
+
failure does not emit a candidate-facing drop, error, or retry control and does
|
|
492
|
+
not change a successful client upload. It continues after a recorder unmount
|
|
493
|
+
while the same session client remains alive. A genuine session end gives it a
|
|
494
|
+
bounded drain period; closing or reloading the page does not preserve a pending
|
|
495
|
+
browser upload. Without `sendClip`, ProctorKit stays primary only when an active
|
|
496
|
+
or explicit client is available, and `uploaded` reports `delivery:
|
|
497
|
+
"proctorkit"`. Without a client, local standalone completion reports
|
|
498
|
+
`delivery: "local"`; it has not uploaded bytes anywhere.
|
|
499
|
+
|
|
500
|
+
If `sendClip` rejects, the component emits the historical
|
|
501
|
+
`clip-mirror-failed` event name and holds the exact finalized Blob for **Retry
|
|
502
|
+
upload**. It does not report success just because the background ProctorKit copy
|
|
503
|
+
succeeds. The retried callback receives the same bytes, `clipId`, duration, and
|
|
504
|
+
provisional `clipNumber`; it does not record again. An empty recording has no
|
|
505
|
+
bytes and is not retryable. When ProctorKit is primary because `sendClip` is
|
|
506
|
+
unset, rejected and conflicting ProctorKit requests are also not retryable. The
|
|
507
|
+
`signal` is aborted on component unmount, allowing a host transport to cancel
|
|
508
|
+
its request.
|
|
509
|
+
|
|
510
|
+
### Audio fallback for a failed host upload
|
|
511
|
+
|
|
512
|
+
`AudioRecorder` has an audio-only `proctoringFallback` prop for integrations
|
|
513
|
+
that can recover a missing answer later through the server-to-server
|
|
514
|
+
[`GET /v1/sessions/:id/audio-clips`](../docs-content/customer/api/sessions.md#recover-mapped-speaking-recordings)
|
|
515
|
+
read. Pass the host’s original question and answer filename with the primary
|
|
516
|
+
sink:
|
|
517
|
+
|
|
518
|
+
```vue
|
|
519
|
+
<AudioRecorder
|
|
520
|
+
:client="client"
|
|
521
|
+
:send-clip="sendAnswerToYourBackend"
|
|
522
|
+
:proctoring-fallback="{
|
|
523
|
+
questionId: String(question.id),
|
|
524
|
+
answerFileName: question.upload.file_name,
|
|
525
|
+
}"
|
|
526
|
+
@uploaded="onAudioUploaded"
|
|
527
|
+
/>
|
|
528
|
+
```
|
|
529
|
+
|
|
530
|
+
The client destination remains the priority. Its success emits `delivery:
|
|
531
|
+
"client"` immediately. If it fails, the component waits for the mapped
|
|
532
|
+
ProctorKit request, then for the server to persist an immutable selection of
|
|
533
|
+
that exact ready clip. It emits `delivery: "fallback"` only after that
|
|
534
|
+
acknowledgement, with canonical `clipId`, `clipNumber`, `answerReference`,
|
|
535
|
+
`contentSha256`, and `fallbackSelection: { source: "client_reported",
|
|
536
|
+
selectedAt }`. Use the exported
|
|
537
|
+
`isAudioClipFallbackUploadedPayload(payload)` guard before accepting that path.
|
|
538
|
+
If both destinations fail, **Retry upload** retries the same finalized take and
|
|
539
|
+
its retryable ProctorKit upload or selection acknowledgement. This does not
|
|
540
|
+
create a fake client upload or place the file in the host’s storage. A fallback
|
|
541
|
+
selection does not establish that the host's next-question API accepted the
|
|
542
|
+
answer. `ProctoredAssessment` supplies its per-tab owner token automatically;
|
|
543
|
+
direct SDK integrations pass it as `sessionOwnerToken` for stale-tab
|
|
544
|
+
concurrency checks. See the [AudioRecorder reference](../docs-content/customer/ui/audio-recorder.md#durable-fallback-for-a-failed-client-upload)
|
|
545
|
+
for the complete contract and recovery safety rules.
|
|
546
|
+
|
|
547
|
+
For browser ProctorKit uploads, the deadline is progress-aware: it allows 30
|
|
548
|
+
seconds without upload progress and 30 seconds for the response after upload
|
|
549
|
+
completion. Continued progress avoids a fixed whole-upload timeout. The SDK is
|
|
550
|
+
still uploading the completed Blob, not performing end-to-end request streaming.
|
|
551
|
+
|
|
552
|
+
The circular UI is customizable through `uploadProgressContainer`,
|
|
553
|
+
`uploadProgressLabel`, `uploadProgress`, and `uploadProgressIndicator`. The
|
|
554
|
+
`controls` and `meta` slots receive `mirrorUploading`, `mirrorProgress`,
|
|
555
|
+
`mirrorFailure`, `retrying`, `retryable`, `retryTarget`, and `retryUpload`.
|
|
556
|
+
`retryTarget` is `canonical`, `client`, or `null`; the `mirror*` names are kept
|
|
557
|
+
for slot compatibility and describe the client delivery when `sendClip` exists.
|
|
558
|
+
A custom `controls` slot owns its retry affordance.
|
|
559
|
+
|
|
394
560
|
### Media UI customization
|
|
395
561
|
|
|
396
562
|
Set media design tokens and part classes once when creating the Vue app:
|
|
@@ -456,5 +622,7 @@ to the system default output.
|
|
|
456
622
|
`client.recordVideoClip()`.
|
|
457
623
|
`AudioRecorder` and `VideoRecorder` accept an optional `stream` prop when your
|
|
458
624
|
assessment already owns a microphone/camera stream. The video component previews
|
|
459
|
-
that stream but does not stop its tracks.
|
|
460
|
-
|
|
625
|
+
that stream but does not stop its tracks. Components release their active UI and
|
|
626
|
+
capture resources on unmount. When `sendClip` made ProctorKit an active session
|
|
627
|
+
client's background evidence copy, that session-owned upload continues after the
|
|
628
|
+
recorder unmounts until it settles or the session reaches its bounded end drain.
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type PropType } from "vue";
|
|
2
|
-
import { type CheckpointConfig } from "@a4anthony/proctorkit-sdk";
|
|
2
|
+
import { type AudioKeepAliveOptions, type CheckpointConfig, type WebcamSnapshotJsonObject, type CandidateIssueReporter } from "@a4anthony/proctorkit-sdk";
|
|
3
|
+
import { type VisionAssets } from "./browser-face-detector.js";
|
|
3
4
|
import { type IntegrityClearInfo, type IntegrityHoldInfo } from "./proctored-assessment/integrity-hold.js";
|
|
4
5
|
import { type PreflightMessages } from "./messages.js";
|
|
5
6
|
import { type Candidate, type ProctoredAssessmentPreset, type ProctoringPolicyInput } from "./proctored-assessment/policy.js";
|
|
@@ -21,6 +22,16 @@ type __VLS_Slots = {
|
|
|
21
22
|
ended?: (props: ProctoredAssessmentEndedSlotProps) => unknown;
|
|
22
23
|
};
|
|
23
24
|
declare const __VLS_component: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
|
25
|
+
/** Experimental output preparation; disabled by default. */
|
|
26
|
+
audioKeepAlive: {
|
|
27
|
+
type: PropType<AudioKeepAliveOptions>;
|
|
28
|
+
default: undefined;
|
|
29
|
+
};
|
|
30
|
+
/** Share this reporter with host-owned identity operations. */
|
|
31
|
+
issueReporter: {
|
|
32
|
+
type: PropType<CandidateIssueReporter>;
|
|
33
|
+
default: undefined;
|
|
34
|
+
};
|
|
24
35
|
appId: {
|
|
25
36
|
type: StringConstructor;
|
|
26
37
|
required: true;
|
|
@@ -29,6 +40,10 @@ declare const __VLS_component: import("vue").DefineComponent<import("vue").Extra
|
|
|
29
40
|
type: StringConstructor;
|
|
30
41
|
required: true;
|
|
31
42
|
};
|
|
43
|
+
sessionMetadata: {
|
|
44
|
+
type: PropType<Record<string, string | boolean> | undefined>;
|
|
45
|
+
default: undefined;
|
|
46
|
+
};
|
|
32
47
|
candidate: {
|
|
33
48
|
type: PropType<Candidate | undefined>;
|
|
34
49
|
default: undefined;
|
|
@@ -53,6 +68,15 @@ declare const __VLS_component: import("vue").DefineComponent<import("vue").Extra
|
|
|
53
68
|
type: PropType<ProctoringPolicyInput | undefined>;
|
|
54
69
|
default: undefined;
|
|
55
70
|
};
|
|
71
|
+
/**
|
|
72
|
+
* Read live host context for each random webcam snapshot. The current
|
|
73
|
+
* callback is invoked at frame-capture time, so reactive question, view and
|
|
74
|
+
* section values are frozen with the photo they describe.
|
|
75
|
+
*/
|
|
76
|
+
getSnapshotMetadata: {
|
|
77
|
+
type: PropType<() => WebcamSnapshotJsonObject | null | undefined>;
|
|
78
|
+
default: undefined;
|
|
79
|
+
};
|
|
56
80
|
apiBaseUrl: {
|
|
57
81
|
type: StringConstructor;
|
|
58
82
|
default: string;
|
|
@@ -120,6 +144,14 @@ declare const __VLS_component: import("vue").DefineComponent<import("vue").Extra
|
|
|
120
144
|
type: PropType<(info: IntegrityClearInfo) => void | Promise<void>>;
|
|
121
145
|
default: undefined;
|
|
122
146
|
};
|
|
147
|
+
/**
|
|
148
|
+
* Where the in-browser face detector's runtime and model are served.
|
|
149
|
+
* Defaults to `<apiBaseUrl>/sdk-assets/vision/<version>/`.
|
|
150
|
+
*/
|
|
151
|
+
visionAssets: {
|
|
152
|
+
type: PropType<VisionAssets | undefined>;
|
|
153
|
+
default: undefined;
|
|
154
|
+
};
|
|
123
155
|
vadAssets: {
|
|
124
156
|
type: PropType<{
|
|
125
157
|
baseAssetPath?: string;
|
|
@@ -210,6 +242,16 @@ declare const __VLS_component: import("vue").DefineComponent<import("vue").Extra
|
|
|
210
242
|
"integrity-hold": (info: IntegrityHoldInfo) => any;
|
|
211
243
|
"integrity-cleared": (info: IntegrityClearInfo) => any;
|
|
212
244
|
}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
|
245
|
+
/** Experimental output preparation; disabled by default. */
|
|
246
|
+
audioKeepAlive: {
|
|
247
|
+
type: PropType<AudioKeepAliveOptions>;
|
|
248
|
+
default: undefined;
|
|
249
|
+
};
|
|
250
|
+
/** Share this reporter with host-owned identity operations. */
|
|
251
|
+
issueReporter: {
|
|
252
|
+
type: PropType<CandidateIssueReporter>;
|
|
253
|
+
default: undefined;
|
|
254
|
+
};
|
|
213
255
|
appId: {
|
|
214
256
|
type: StringConstructor;
|
|
215
257
|
required: true;
|
|
@@ -218,6 +260,10 @@ declare const __VLS_component: import("vue").DefineComponent<import("vue").Extra
|
|
|
218
260
|
type: StringConstructor;
|
|
219
261
|
required: true;
|
|
220
262
|
};
|
|
263
|
+
sessionMetadata: {
|
|
264
|
+
type: PropType<Record<string, string | boolean> | undefined>;
|
|
265
|
+
default: undefined;
|
|
266
|
+
};
|
|
221
267
|
candidate: {
|
|
222
268
|
type: PropType<Candidate | undefined>;
|
|
223
269
|
default: undefined;
|
|
@@ -242,6 +288,15 @@ declare const __VLS_component: import("vue").DefineComponent<import("vue").Extra
|
|
|
242
288
|
type: PropType<ProctoringPolicyInput | undefined>;
|
|
243
289
|
default: undefined;
|
|
244
290
|
};
|
|
291
|
+
/**
|
|
292
|
+
* Read live host context for each random webcam snapshot. The current
|
|
293
|
+
* callback is invoked at frame-capture time, so reactive question, view and
|
|
294
|
+
* section values are frozen with the photo they describe.
|
|
295
|
+
*/
|
|
296
|
+
getSnapshotMetadata: {
|
|
297
|
+
type: PropType<() => WebcamSnapshotJsonObject | null | undefined>;
|
|
298
|
+
default: undefined;
|
|
299
|
+
};
|
|
245
300
|
apiBaseUrl: {
|
|
246
301
|
type: StringConstructor;
|
|
247
302
|
default: string;
|
|
@@ -309,6 +364,14 @@ declare const __VLS_component: import("vue").DefineComponent<import("vue").Extra
|
|
|
309
364
|
type: PropType<(info: IntegrityClearInfo) => void | Promise<void>>;
|
|
310
365
|
default: undefined;
|
|
311
366
|
};
|
|
367
|
+
/**
|
|
368
|
+
* Where the in-browser face detector's runtime and model are served.
|
|
369
|
+
* Defaults to `<apiBaseUrl>/sdk-assets/vision/<version>/`.
|
|
370
|
+
*/
|
|
371
|
+
visionAssets: {
|
|
372
|
+
type: PropType<VisionAssets | undefined>;
|
|
373
|
+
default: undefined;
|
|
374
|
+
};
|
|
312
375
|
vadAssets: {
|
|
313
376
|
type: PropType<{
|
|
314
377
|
baseAssetPath?: string;
|
|
@@ -409,16 +472,21 @@ declare const __VLS_component: import("vue").DefineComponent<import("vue").Extra
|
|
|
409
472
|
} | undefined;
|
|
410
473
|
ingestUrl: string;
|
|
411
474
|
preferredLocale: string;
|
|
475
|
+
visionAssets: VisionAssets | undefined;
|
|
412
476
|
submitCandidateIntake: CandidateIntakeSubmitter | undefined;
|
|
477
|
+
checkpoint: CheckpointConfig | undefined;
|
|
413
478
|
preset: ProctoredAssessmentPreset | undefined;
|
|
479
|
+
audioKeepAlive: AudioKeepAliveOptions;
|
|
480
|
+
issueReporter: CandidateIssueReporter;
|
|
481
|
+
sessionMetadata: Record<string, string | boolean> | undefined;
|
|
414
482
|
policyOverrides: ProctoringPolicyInput | undefined;
|
|
483
|
+
getSnapshotMetadata: () => WebcamSnapshotJsonObject | null | undefined;
|
|
415
484
|
apiBaseUrl: string;
|
|
416
485
|
assessmentSlug: string;
|
|
417
486
|
autoStartPreflight: boolean;
|
|
418
487
|
preflightUi: PreflightUi;
|
|
419
488
|
fullscreenExitModal: boolean;
|
|
420
489
|
workerUrl: string | URL | undefined;
|
|
421
|
-
checkpoint: CheckpointConfig | undefined;
|
|
422
490
|
onIntegrityHold: (info: IntegrityHoldInfo) => void | Promise<void>;
|
|
423
491
|
onIntegrityCleared: (info: IntegrityClearInfo) => void | Promise<void>;
|
|
424
492
|
contentClass: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProctoredAssessment.vue.d.ts","sourceRoot":"","sources":["../src/ProctoredAssessment.vue"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ProctoredAssessment.vue.d.ts","sourceRoot":"","sources":["../src/ProctoredAssessment.vue"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,8 @@ import { type DeepCameraCheckOptions, type RuntimeDeviceKind, type RuntimeDevice
|
|
|
2
2
|
import { type ProctoringDeviceSettingsMessages as CentralDeviceSettingsMessages } from "@a4anthony/proctorkit-content";
|
|
3
3
|
import { type PreflightMessages } from "./messages.js";
|
|
4
4
|
import type { MediaHelpTopicId } from "./i18n/media-help.js";
|
|
5
|
+
import { type MicrophoneCheckMessages } from "./runtime-devices/microphone-check-messages.js";
|
|
6
|
+
import { type VisionAssets } from "./browser-face-detector.js";
|
|
5
7
|
export type ProctoringDeviceSettingsKind = RuntimeDeviceKind;
|
|
6
8
|
export interface ProctoringDeviceSettingsOption {
|
|
7
9
|
deviceId: string;
|
|
@@ -29,8 +31,13 @@ type __VLS_Props = {
|
|
|
29
31
|
devices?: Partial<Record<ProctoringDeviceSettingsKind, ProctoringDeviceSettingsOption[]>>;
|
|
30
32
|
/** @deprecated The shared MicStep, SpeakerStep, and CameraStep own verification. */
|
|
31
33
|
testDevice?: ProctoringDeviceSettingsTestFn;
|
|
32
|
-
/**
|
|
34
|
+
/**
|
|
35
|
+
* Face detector used by the shared CameraStep verifier. Defaults to
|
|
36
|
+
* the in-browser detector loaded from `visionAssets`.
|
|
37
|
+
*/
|
|
33
38
|
detectFace?: ProctoringDeviceSettingsDetectFace;
|
|
39
|
+
/** Where the in-browser face detector's runtime and model are served. */
|
|
40
|
+
visionAssets?: VisionAssets;
|
|
34
41
|
/** VAD and ONNX Runtime asset paths used by the shared MicStep verifier. */
|
|
35
42
|
vadAssets?: {
|
|
36
43
|
baseAssetPath?: string;
|
|
@@ -39,6 +46,21 @@ type __VLS_Props = {
|
|
|
39
46
|
messages?: Partial<ProctoringDeviceSettingsMessages>;
|
|
40
47
|
/** Candidate wizard copy used by the shared device steps. */
|
|
41
48
|
wizardMessages?: Partial<PreflightMessages>;
|
|
49
|
+
/**
|
|
50
|
+
* Offer virtual devices (OBS, Zoom, VB-Cable, …) in the pickers. Pass the
|
|
51
|
+
* value the policy resolves through the SDK's `resolveAllowVirtualDevices`
|
|
52
|
+
* so this panel agrees with preflight and the resume check. Default false.
|
|
53
|
+
*/
|
|
54
|
+
allowVirtualDevices?: boolean;
|
|
55
|
+
/**
|
|
56
|
+
* Opened to check a device that may not be working (a recorder's "Check
|
|
57
|
+
* microphone"): the first device's card opens straight away, and the
|
|
58
|
+
* microphone re-runs its speech check on the microphone already in use
|
|
59
|
+
* instead of offering selection only.
|
|
60
|
+
*/
|
|
61
|
+
checkCurrent?: boolean;
|
|
62
|
+
/** Copy for the alert shown at the top of a microphone-only check. */
|
|
63
|
+
microphoneCheckMessages?: Partial<MicrophoneCheckMessages>;
|
|
42
64
|
};
|
|
43
65
|
declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
44
66
|
error: (error: Error) => any;
|
|
@@ -55,15 +77,19 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {
|
|
|
55
77
|
messages: Partial<ProctoringDeviceSettingsMessages>;
|
|
56
78
|
open: boolean;
|
|
57
79
|
dark: boolean;
|
|
80
|
+
allowVirtualDevices: boolean;
|
|
58
81
|
vadAssets: {
|
|
59
82
|
baseAssetPath?: string;
|
|
60
83
|
onnxWASMBasePath?: string;
|
|
61
84
|
};
|
|
62
85
|
detectFace: ProctoringDeviceSettingsDetectFace;
|
|
86
|
+
visionAssets: VisionAssets;
|
|
63
87
|
client: ProctoringDeviceSettingsClient | null;
|
|
64
88
|
kinds: ProctoringDeviceSettingsKind[];
|
|
65
89
|
testDevice: ProctoringDeviceSettingsTestFn;
|
|
66
90
|
wizardMessages: Partial<PreflightMessages>;
|
|
91
|
+
checkCurrent: boolean;
|
|
92
|
+
microphoneCheckMessages: Partial<MicrophoneCheckMessages>;
|
|
67
93
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
68
94
|
export default _default;
|
|
69
95
|
//# sourceMappingURL=ProctoringDeviceSettings.vue.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProctoringDeviceSettings.vue.d.ts","sourceRoot":"","sources":["../src/ProctoringDeviceSettings.vue"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ProctoringDeviceSettings.vue.d.ts","sourceRoot":"","sources":["../src/ProctoringDeviceSettings.vue"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +1,18 @@
|
|
|
1
|
+
import { type PreparationFeedback } from "./proctored-assessment/preparation-feedback.js";
|
|
1
2
|
import { type PropType } from "vue";
|
|
2
3
|
import type { CheckKind, FailCode, SimulatedCheckResult } from "@a4anthony/proctorkit-sdk";
|
|
3
4
|
import { type SystemCheckMode, type SystemCheckOptions } from "./usePreflightCheck.js";
|
|
4
5
|
import { type PreflightMessages } from "./messages.js";
|
|
5
6
|
import { type CandidateIntakeConfig, type CandidateIntakeSubmission, type CandidateIntakeSubmitter } from "./candidate-intake.js";
|
|
7
|
+
import { type VisionAssets } from "./browser-face-detector.js";
|
|
6
8
|
import type { PreflightUi } from "./preflight-ui.js";
|
|
7
|
-
declare var __VLS_5: {}, __VLS_10: {},
|
|
9
|
+
declare var __VLS_5: {}, __VLS_10: {}, __VLS_89: {};
|
|
8
10
|
type __VLS_Slots = {} & {
|
|
9
11
|
'top-left'?: (props: typeof __VLS_5) => any;
|
|
10
12
|
} & {
|
|
11
13
|
'top-right'?: (props: typeof __VLS_10) => any;
|
|
12
14
|
} & {
|
|
13
|
-
'footer-extras'?: (props: typeof
|
|
15
|
+
'footer-extras'?: (props: typeof __VLS_89) => any;
|
|
14
16
|
};
|
|
15
17
|
declare const __VLS_component: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
|
16
18
|
mode: {
|
|
@@ -66,6 +68,10 @@ declare const __VLS_component: import("vue").DefineComponent<import("vue").Extra
|
|
|
66
68
|
* with the button spinning while a session starts, instead of swapping to a
|
|
67
69
|
* separate "starting" screen.
|
|
68
70
|
*/
|
|
71
|
+
preparationError: {
|
|
72
|
+
type: PropType<PreparationFeedback>;
|
|
73
|
+
default: undefined;
|
|
74
|
+
};
|
|
69
75
|
starting: {
|
|
70
76
|
type: BooleanConstructor;
|
|
71
77
|
default: boolean;
|
|
@@ -90,10 +96,9 @@ declare const __VLS_component: import("vue").DefineComponent<import("vue").Extra
|
|
|
90
96
|
};
|
|
91
97
|
/**
|
|
92
98
|
* By default the wizard waits for the final preflight telemetry
|
|
93
|
-
*
|
|
94
|
-
*
|
|
95
|
-
*
|
|
96
|
-
* screen-share prompts. Telemetry still flushes with keepalive.
|
|
99
|
+
* acknowledgement before emitting `pass`. Standalone integrations can
|
|
100
|
+
* opt out when they own confirmation themselves. ProctoredAssessment
|
|
101
|
+
* always requires acknowledgement before preparing runtime delivery.
|
|
97
102
|
*/
|
|
98
103
|
flushBeforePass: {
|
|
99
104
|
type: BooleanConstructor;
|
|
@@ -106,6 +111,15 @@ declare const __VLS_component: import("vue").DefineComponent<import("vue").Extra
|
|
|
106
111
|
}>;
|
|
107
112
|
default: undefined;
|
|
108
113
|
};
|
|
114
|
+
/**
|
|
115
|
+
* Where the in-browser face detector's runtime and model are served.
|
|
116
|
+
* Defaults to the ProctorKit API at the ingest URL's origin
|
|
117
|
+
* (`/sdk-assets/vision/<version>/`).
|
|
118
|
+
*/
|
|
119
|
+
visionAssets: {
|
|
120
|
+
type: PropType<VisionAssets>;
|
|
121
|
+
default: undefined;
|
|
122
|
+
};
|
|
109
123
|
runtimeScreenShareRequired: {
|
|
110
124
|
type: BooleanConstructor;
|
|
111
125
|
default: boolean;
|
|
@@ -240,6 +254,10 @@ declare const __VLS_component: import("vue").DefineComponent<import("vue").Extra
|
|
|
240
254
|
* with the button spinning while a session starts, instead of swapping to a
|
|
241
255
|
* separate "starting" screen.
|
|
242
256
|
*/
|
|
257
|
+
preparationError: {
|
|
258
|
+
type: PropType<PreparationFeedback>;
|
|
259
|
+
default: undefined;
|
|
260
|
+
};
|
|
243
261
|
starting: {
|
|
244
262
|
type: BooleanConstructor;
|
|
245
263
|
default: boolean;
|
|
@@ -264,10 +282,9 @@ declare const __VLS_component: import("vue").DefineComponent<import("vue").Extra
|
|
|
264
282
|
};
|
|
265
283
|
/**
|
|
266
284
|
* By default the wizard waits for the final preflight telemetry
|
|
267
|
-
*
|
|
268
|
-
*
|
|
269
|
-
*
|
|
270
|
-
* screen-share prompts. Telemetry still flushes with keepalive.
|
|
285
|
+
* acknowledgement before emitting `pass`. Standalone integrations can
|
|
286
|
+
* opt out when they own confirmation themselves. ProctoredAssessment
|
|
287
|
+
* always requires acknowledgement before preparing runtime delivery.
|
|
271
288
|
*/
|
|
272
289
|
flushBeforePass: {
|
|
273
290
|
type: BooleanConstructor;
|
|
@@ -280,6 +297,15 @@ declare const __VLS_component: import("vue").DefineComponent<import("vue").Extra
|
|
|
280
297
|
}>;
|
|
281
298
|
default: undefined;
|
|
282
299
|
};
|
|
300
|
+
/**
|
|
301
|
+
* Where the in-browser face detector's runtime and model are served.
|
|
302
|
+
* Defaults to the ProctorKit API at the ingest URL's origin
|
|
303
|
+
* (`/sdk-assets/vision/<version>/`).
|
|
304
|
+
*/
|
|
305
|
+
visionAssets: {
|
|
306
|
+
type: PropType<VisionAssets>;
|
|
307
|
+
default: undefined;
|
|
308
|
+
};
|
|
283
309
|
runtimeScreenShareRequired: {
|
|
284
310
|
type: BooleanConstructor;
|
|
285
311
|
default: boolean;
|
|
@@ -362,6 +388,7 @@ declare const __VLS_component: import("vue").DefineComponent<import("vue").Extra
|
|
|
362
388
|
"onCandidate-intake-submitted"?: ((submission: CandidateIntakeSubmission) => any) | undefined;
|
|
363
389
|
}>, {
|
|
364
390
|
candidateIntake: CandidateIntakeConfig | undefined;
|
|
391
|
+
mode: SystemCheckMode;
|
|
365
392
|
autoStart: boolean;
|
|
366
393
|
candidate: {
|
|
367
394
|
id: string;
|
|
@@ -369,7 +396,6 @@ declare const __VLS_component: import("vue").DefineComponent<import("vue").Extra
|
|
|
369
396
|
email?: string;
|
|
370
397
|
metadata?: Record<string, unknown>;
|
|
371
398
|
};
|
|
372
|
-
mode: SystemCheckMode;
|
|
373
399
|
fullPolicy: Record<string, unknown>;
|
|
374
400
|
messages: Partial<PreflightMessages>;
|
|
375
401
|
dark: boolean;
|
|
@@ -382,12 +408,14 @@ declare const __VLS_component: import("vue").DefineComponent<import("vue").Extra
|
|
|
382
408
|
appId: string;
|
|
383
409
|
autoResumeSeconds: number;
|
|
384
410
|
starting: boolean;
|
|
411
|
+
preparationError: PreparationFeedback;
|
|
385
412
|
engineOptions: Omit<SystemCheckOptions, "mode">;
|
|
386
413
|
preferredLocale: string;
|
|
387
414
|
goodReferencePhoto: string;
|
|
388
415
|
simulateResults: SimulatedCheckResult[];
|
|
389
416
|
allowDevSkip: boolean;
|
|
390
417
|
flushBeforePass: boolean;
|
|
418
|
+
visionAssets: VisionAssets;
|
|
391
419
|
runtimeScreenShareRequired: boolean;
|
|
392
420
|
runtimeScreenShareState: "pending" | "error" | "active" | "idle";
|
|
393
421
|
runtimeScreenShareError: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProctoringSystemCheck.vue.d.ts","sourceRoot":"","sources":["../src/ProctoringSystemCheck.vue"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ProctoringSystemCheck.vue.d.ts","sourceRoot":"","sources":["../src/ProctoringSystemCheck.vue"],"names":[],"mappings":"AA08BA,OAAO,EAAuB,KAAK,mBAAmB,EAAE,MAAM,gDAAgD,CAAC;AAE/G,OAAO,EAA0F,KAAK,QAAQ,EAAE,MAAM,KAAK,CAAC;AAE5H,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAS3F,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACvF,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAiBvD,OAAO,EAIL,KAAK,qBAAqB,EAC1B,KAAK,yBAAyB,EAC9B,KAAK,wBAAwB,EAC9B,MAAM,uBAAuB,CAAC;AAK/B,OAAO,EAIL,KAAK,YAAY,EAClB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAiuCrD,QAAA,IAAI,OAAO,IAAU,EAAE,QAAQ,IAAU,EAAE,QAAQ,IAAY,CAAE;AACjE,KAAK,WAAW,GAAG,EAAE,GACnB;IAAE,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,OAAO,KAAK,GAAG,CAAA;CAAE,GAC/C;IAAE,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,QAAQ,KAAK,GAAG,CAAA;CAAE,GACjD;IAAE,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,QAAQ,KAAK,GAAG,CAAA;CAAE,CAAC;AA+PxD,QAAA,MAAM,eAAe;;cAQD,QAAQ,CAAC,eAAe,CAAC;;;;cAIzB,QAAQ,CAAC,IAAI,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;;;IAG5D;;;;;;;OAOG;;cAEe,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;;;;cAIjC,QAAQ,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;;;IAGtD;;;;;;OAMG;;;;;;;;;;cAWc,QAAQ,CAAC,oBAAoB,EAAE,CAAC;;;;;;;IAOjD;;;;;OAKG;;cACiC,QAAQ,CAAC,mBAAmB,CAAC;;;;;;;;;;;;;;;IAajE;;;;;OAKG;;;;;IAKH;;;;;OAKG;;;;;;cAMe,QAAQ,CAAC;YACvB,aAAa,CAAC,EAAE,MAAM,CAAC;YACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;SAC3B,CAAC;;;IAGJ;;;;OAIG;;cAEe,QAAQ,CAAC,YAAY,CAAC;;;;;;;;cAQtB,QAAQ,CAAC,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;;;;;;;IAOnE;;;;;;;;;;OAUG;;;;;IAKH;;;;OAIG;;;;;IAKH;;;OAGG;;cAEe,QAAQ,CAAC;YACvB,EAAE,EAAE,MAAM,CAAC;YACX,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;SACpC,CAAC;;;;cAIc,QAAQ,CAAC,qBAAqB,GAAG,SAAS,CAAC;;;;cAIzC,QAAQ,CAAC,wBAAwB,GAAG,SAAS,CAAC;;;IAGlE;;;OAGG;;;;;IAKH,qEAAqE;;cAEnD,QAAQ,CAAC,WAAW,CAAC;;;;;;cAp9CR,SAAS;cAAQ,QAAQ;gBAAU,MAAM;;;;;;;cA2yCtD,QAAQ,CAAC,eAAe,CAAC;;;;cAIzB,QAAQ,CAAC,IAAI,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;;;IAG5D;;;;;;;OAOG;;cAEe,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;;;;cAIjC,QAAQ,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;;;IAGtD;;;;;;OAMG;;;;;;;;;;cAWc,QAAQ,CAAC,oBAAoB,EAAE,CAAC;;;;;;;IAOjD;;;;;OAKG;;cACiC,QAAQ,CAAC,mBAAmB,CAAC;;;;;;;;;;;;;;;IAajE;;;;;OAKG;;;;;IAKH;;;;;OAKG;;;;;;cAMe,QAAQ,CAAC;YACvB,aAAa,CAAC,EAAE,MAAM,CAAC;YACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;SAC3B,CAAC;;;IAGJ;;;;OAIG;;cAEe,QAAQ,CAAC,YAAY,CAAC;;;;;;;;cAQtB,QAAQ,CAAC,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;;;;;;;IAOnE;;;;;;;;;;OAUG;;;;;IAKH;;;;OAIG;;;;;IAKH;;;OAGG;;cAEe,QAAQ,CAAC;YACvB,EAAE,EAAE,MAAM,CAAC;YACX,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;SACpC,CAAC;;;;cAIc,QAAQ,CAAC,qBAAqB,GAAG,SAAS,CAAC;;;;cAIzC,QAAQ,CAAC,wBAAwB,GAAG,SAAS,CAAC;;;IAGlE;;;OAGG;;;;;IAKH,qEAAqE;;cAEnD,QAAQ,CAAC,WAAW,CAAC;;;;;;cAp9CR,SAAS;cAAQ,QAAQ;gBAAU,MAAM;;;;;;;;;;YA27ChE,MAAM;eACH,MAAM;gBACL,MAAM;mBACH,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;;wBA3DlB,MAAM;2BACH,MAAM;;;;;;;;;;;;;;;;;;;4EAoF7B,CAAC;wBACkB,eAAe,CAAC,OAAO,eAAe,EAAE,WAAW,CAAC;AAAzE,wBAA0E;AAE1E,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KAEV,CAAA;CACD,CAAC"}
|