easyproctor 0.0.17 → 0.0.20
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 +155 -51
- package/dtos/StartProctoringResponse.d.ts +2 -0
- package/errors/errors.d.ts +10 -0
- package/esm/index.js +279 -108
- package/index.d.ts +21 -4
- package/index.js +279 -109
- package/interfaces/Devices.d.ts +9 -0
- package/interfaces/ProctoringRecord.d.ts +7 -0
- package/modules/checkPermissions.d.ts +2 -0
- package/modules/database.d.ts +4 -3
- package/modules/enumarateDevices.d.ts +2 -0
- package/modules/http.d.ts +1 -1
- package/modules/startCameraCapture.d.ts +7 -1
- package/modules/startScreenCapture.d.ts +7 -1
- package/package.json +2 -1
- package/unpkg/easyproctor.min.js +8 -8
package/README.md
CHANGED
|
@@ -11,6 +11,7 @@ npm install --save easyproctor
|
|
|
11
11
|
```
|
|
12
12
|
|
|
13
13
|
Via CDN
|
|
14
|
+
|
|
14
15
|
```html
|
|
15
16
|
<script src="https://cdn.jsdelivr.net/npm/easyproctor/unpkg/easyproctor.min.js"></script>
|
|
16
17
|
```
|
|
@@ -18,6 +19,7 @@ Via CDN
|
|
|
18
19
|
## Utilização
|
|
19
20
|
|
|
20
21
|
Para utilizar o componente será necessário utilizar os seguintes parâmetros:
|
|
22
|
+
|
|
21
23
|
- examId: identificador do exame
|
|
22
24
|
- clientId: identificador do parceiro
|
|
23
25
|
- token: token de autenticação biométrica (utilizar SDK biométrico do EasyProctor)
|
|
@@ -28,27 +30,28 @@ Após finalizar a sessão de proctoring através do método finish você poderá
|
|
|
28
30
|
|
|
29
31
|
https://iaris.easyproctor.tech/index.html
|
|
30
32
|
|
|
31
|
-
|
|
32
33
|
Em um bundler
|
|
34
|
+
|
|
33
35
|
```javascript
|
|
34
36
|
import { useProctoring } from "easyproctor";
|
|
35
37
|
|
|
36
|
-
const { start, finish } = useProctoring({
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
38
|
+
const { start, finish, pause, resume, onFocus, onLostFocus, enumarateDevices, checkPermissions, checkIfhasMultipleMonitors, onStopSharingScreen } = useProctoring({
|
|
39
|
+
examId: "00001",
|
|
40
|
+
clientId: "000001",
|
|
41
|
+
token: "...",
|
|
40
42
|
});
|
|
41
43
|
```
|
|
42
44
|
|
|
43
45
|
Via CDN: A função "useProctoring" é injetada para ser utilizada globalmente
|
|
46
|
+
|
|
44
47
|
```html
|
|
45
48
|
<script src="https://cdn.jsdelivr.net/npm/easyproctor/unpkg/easyproctor.min.js"></script>
|
|
46
49
|
<script>
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
50
|
+
const { start, finish, pause, resume, onFocus, onLostFocus, enumarateDevices, checkPermissions, checkIfhasMultipleMonitors, onStopSharingScreen } = useProctoring({
|
|
51
|
+
examId: "00001",
|
|
52
|
+
clientId: "000001",
|
|
53
|
+
token: "...",
|
|
54
|
+
});
|
|
52
55
|
</script>
|
|
53
56
|
```
|
|
54
57
|
|
|
@@ -57,64 +60,165 @@ Via CDN: A função "useProctoring" é injetada para ser utilizada globalmente
|
|
|
57
60
|
```html
|
|
58
61
|
<!DOCTYPE html>
|
|
59
62
|
<html lang="en">
|
|
60
|
-
|
|
61
|
-
<
|
|
62
|
-
<meta
|
|
63
|
-
<meta
|
|
64
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
63
|
+
<head>
|
|
64
|
+
<meta charset="UTF-8" />
|
|
65
|
+
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
|
66
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
65
67
|
<title>Document</title>
|
|
66
68
|
<script src="dist/unpkg/easyproctor.min.js"></script>
|
|
67
69
|
<script>
|
|
70
|
+
const {
|
|
71
|
+
start,
|
|
72
|
+
finish,
|
|
73
|
+
onFocus,
|
|
74
|
+
onLostFocus,
|
|
75
|
+
enumarateDevices,
|
|
76
|
+
checkPermissions,
|
|
77
|
+
} = useProctoring({
|
|
78
|
+
examId: "00001",
|
|
79
|
+
clientId: "000001",
|
|
80
|
+
token: "...",
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
async function startExam() {
|
|
84
|
+
try {
|
|
85
|
+
// Verificar se existem dispositívos disponíveis
|
|
86
|
+
if (devices.cameras.length == 0 || devices.microphones.length == 0) {
|
|
87
|
+
throw "Você precisa possuir ao menos uma câmera e um microfone";
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Verificar se foram setados
|
|
91
|
+
const selectedCamera = cameras.value;
|
|
92
|
+
const selectedMicrophone = microphones.value;
|
|
93
|
+
|
|
94
|
+
if (!selectedCamera || !selectedMicrophone) {
|
|
95
|
+
throw "Você precisa selecionar uma camera e um microfone";
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
startButton.innerHTML = "Carregando";
|
|
99
|
+
|
|
100
|
+
onFocus(() => generateAlert(false));
|
|
101
|
+
onLostFocus(() => generateAlert(true));
|
|
102
|
+
// Adicionar o dispositivo selecionado é opcional
|
|
103
|
+
const { cameraStream } = await start({
|
|
104
|
+
cameraId: selectedCamera,
|
|
105
|
+
microphoneId: selectedMicrophone,
|
|
106
|
+
});
|
|
107
|
+
} catch (error) {
|
|
108
|
+
alert(error);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
async function finishExam() {
|
|
113
|
+
try {
|
|
114
|
+
await finish({ onProgress: (percentage) => console.log(percentage) });
|
|
115
|
+
console.log("EXAME FINALIZADO");
|
|
116
|
+
} catch (error) {
|
|
117
|
+
alert(error);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
68
120
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
121
|
+
// Verificar permissões
|
|
122
|
+
let devices = { cameras: [], microphones: [] };
|
|
123
|
+
async function verifyPermissions() {
|
|
124
|
+
// Checar permissões
|
|
125
|
+
var hasPermissions = await checkPermissions();
|
|
74
126
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
} catch (error) {
|
|
79
|
-
alert(error);
|
|
80
|
-
}
|
|
127
|
+
if (!hasPermissions) {
|
|
128
|
+
window.alert("Para continuar você precisa conceder as permissões");
|
|
129
|
+
return;
|
|
81
130
|
}
|
|
82
131
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
132
|
+
// Listar os dispositivos
|
|
133
|
+
devices = await enumarateDevices();
|
|
134
|
+
|
|
135
|
+
const generateOption = (text, value) => {
|
|
136
|
+
const el = document.createElement("option");
|
|
137
|
+
el.setAttribute("value", value);
|
|
138
|
+
el.innerHTML = text;
|
|
139
|
+
return el;
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
devices.cameras.forEach((camera) => {
|
|
143
|
+
const option = generateOption(camera.label, camera.id);
|
|
144
|
+
cameras.appendChild(option);
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
devices.microphones.forEach((microphone) => {
|
|
148
|
+
const option = generateOption(microphone.label, microphone.id);
|
|
149
|
+
microphones.appendChild(option);
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// Gerar alerta
|
|
154
|
+
function generateAlert(lostFocus) {
|
|
155
|
+
const p = document.createElement("p");
|
|
156
|
+
if (lostFocus) {
|
|
157
|
+
p.classList.add("text-red-500");
|
|
158
|
+
p.innerHTML = `Perdeu o foco em: ${new Date().toLocaleTimeString()}`;
|
|
159
|
+
} else {
|
|
160
|
+
p.classList.add("text-green-500");
|
|
161
|
+
p.innerHTML = `Retomou o foco em: ${new Date().toLocaleTimeString()}`;
|
|
90
162
|
}
|
|
163
|
+
alerts.appendChild(p);
|
|
164
|
+
}
|
|
91
165
|
</script>
|
|
92
|
-
</head>
|
|
93
|
-
|
|
94
|
-
<body>
|
|
95
|
-
<div
|
|
96
|
-
|
|
97
|
-
|
|
166
|
+
</head>
|
|
167
|
+
|
|
168
|
+
<body>
|
|
169
|
+
<div
|
|
170
|
+
style="height: 100vh; display: flex; align-items: center; justify-content: center;"
|
|
171
|
+
>
|
|
172
|
+
<button onclick="startExam()">Iniciar</button>
|
|
173
|
+
<button onclick="finishExam()">Finalizar</button>
|
|
174
|
+
<button onclick="verifyPermissions()">Verificar permissões</button>
|
|
98
175
|
</div>
|
|
99
|
-
</body>
|
|
100
|
-
|
|
176
|
+
</body>
|
|
101
177
|
</html>
|
|
102
178
|
```
|
|
103
179
|
|
|
104
180
|
## API
|
|
181
|
+
|
|
105
182
|
```javascript
|
|
106
|
-
const {
|
|
107
|
-
|
|
108
|
-
|
|
183
|
+
const {
|
|
184
|
+
// Inicia a gravação da prova
|
|
185
|
+
start,
|
|
186
|
+
|
|
187
|
+
// Pausa a gravação
|
|
188
|
+
pause,
|
|
189
|
+
|
|
190
|
+
// Reinicia a gravação
|
|
191
|
+
resume,
|
|
192
|
+
|
|
193
|
+
// Finaliza a gravação da prova retornando os arquivos gerados
|
|
194
|
+
finish,
|
|
109
195
|
|
|
110
|
-
|
|
111
|
-
|
|
196
|
+
// Adiciona uma função callback para ser executada quando o usuário recupera o foco da tela
|
|
197
|
+
onFocus,
|
|
112
198
|
|
|
199
|
+
// Adiciona uma função callback para ser executada quando o usuário perde o foco da tela
|
|
200
|
+
onLostFocus,
|
|
201
|
+
|
|
202
|
+
// Adiciona uma função callback para ser executada quando o usuário cancela o compartilhamento de tela
|
|
203
|
+
onStopSharingScreen
|
|
204
|
+
|
|
205
|
+
// Enumera os dispositivos de camera e microfone
|
|
206
|
+
enumarateDevices,
|
|
207
|
+
|
|
208
|
+
// Checa as permissões de camera e microfone
|
|
209
|
+
checkPermissions,
|
|
210
|
+
|
|
211
|
+
// Checa se existe mais de um monitor
|
|
212
|
+
checkIfhasMultipleMonitors
|
|
213
|
+
|
|
214
|
+
|
|
113
215
|
} = useProctoring({
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
216
|
+
examId: "00001",
|
|
217
|
+
clientId: "000001",
|
|
218
|
+
token: "...",
|
|
219
|
+
});
|
|
118
220
|
```
|
|
221
|
+
|
|
119
222
|
## License
|
|
120
|
-
|
|
223
|
+
|
|
224
|
+
[MIT](https://choosealicense.com/licenses/mit/)
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare const SCRIPT_NOT_CALLED_INSIDE_BODY = "script_not_called_inside_body";
|
|
2
|
+
export declare const INCOMPATIBLE_NAVIGATOR = "incompatible_navigator";
|
|
3
|
+
export declare const REQUIRED_FIELD_NOT_PROVIDED = "required_field_not_provided";
|
|
4
|
+
export declare const NOT_SHARED_FIRST_SCREEN = "not_shared_first_screen";
|
|
5
|
+
export declare const MULTIPLE_MONITORS_DETECTED = "multiple_monitors_detected";
|
|
6
|
+
export declare const PROCTORING_ALREADY_STARTED = "proctoring_already_started";
|
|
7
|
+
export declare const PROCTORING_NOT_STARTED = "proctoring_not_started";
|
|
8
|
+
export declare const PROCTORING_RUNNING = "proctoring_running";
|
|
9
|
+
export declare const NO_VIDEOS_RECORDED = "no_videos_recorded";
|
|
10
|
+
export declare const PERMISSIONS_NOT_GRANTED = "permissions_not_granted";
|