SDK. Подключение SDK на клиентской стороне
Со стороны Экзамуса заказчик получает serverOrigin
, integrationName
. Использование этих параметров описано ниже.
Необходимо сгенерировать JWT на стороне LMS server, который содержит ссылку на тест и другую информацию об экзамене и настройке прокторинга (описание параметров для генерации JWT читайте ниже).
Демонстрационные страницы с подключенными SDK
Подключение SDK
<script src="https://sdk.examus.net/stable/proctoring.global.js"></script>
Указанная выше ссылка загружает глобальную сборку SDK, где все API верхнего уровня доступны как свойства глобального объекта Proctoring.
Полный пример с использованием глобальной сборки
<script src="https://sdk.examus.net/stable/proctoring.global.js"></script>
<script>
// Создаем инстанс приложения, с собственным API. Подробнее читайте ниже в разделе API
const session = Proctoring({
supportChat: true
});
// Назначаем действие при старте экзамена.
session.onExamStarted(() => {
// Здесь можно скрыть начальные элементы DOM и показать контент экзамена,
// например:
// hideInitialDom();
// showExamContent();
});
// Назначаем действие при завершении экзамена.
session.onExamFinished(() => {
// Здесь можно скрыть контент экзамена после завершения, например:
// hideExamContent();
});
// Запускаем интерфейс прокторинга. Метод возвращает Promise,
// который резолвится после полного монтирования интерфейса на страницу.
session.start({serverOrigin, integrationName, jwt})
.then(() => {
// Здесь можно обработать успешный запуск, например:
// console.log('Proctoring UI mounted successfully');
})
.catch((error) => {
// Здесь можно обработать ошибки, если запуск не удался.
// console.error('Proctoring failed to start:', error);
});
// Позволяет прокторингу запускаться автоматически с последней сессией
// после перезагрузки страницы. Необходим для контроля и приоритизации между
// start() и resume(), например, если запуск новой сессии важнее перезапуска.
// Возвращает Promise.
session.resume();
// Принудительнор завершает текущий сеанс прокторинга и закрывает интерфейс.
// Возвращает Promise. Экспериментальная функция, использовать с осторожностью.
// session.stop();
// Устаревшие методы событий:
// Будут удалены в будущих релизах. Не использовать!
// Возвращают Promise-подобное API.
// Пример использования: examStarted().then(yourHandler).
// Нельзя использовать с await examStarted().
// 'proctoringStarted()': Видеозапись начата, видео отправляется на сервер.
// 'examStarted()': Экзамен начат.
// 'examFinished()': Экзамен завершен.
// 'videoUploaded()': Все видеочасти загружены.
// 'proctoringFinished()': Прокторинг завершен.
</script>
Использование сборки в виде ES-модуля
Большинство современных браузеров поддерживают ES-модули нативно, поэтому можно подключать SDK с сервера как нативный ES-модуль таким образом:
<script type="module">
import Proctoring from 'https://sdk.examus.net/stable/proctoring.js'
const session = Proctoring({
supportChat: true
});
// ...
</script>
Обратите внимание, что используется <script type="module">
, а URL указывает на сборку в виде ES-модуля: 'https://sdk.examus.net/stable/proctoring.js'
Пример кода для генерации данных для прокторина на стороне LMS (backend):
import datetime
import uuid
import jwt
JWT_SECRET = None
USER_ID = None
ACCOUNT_ID = None
ACCOUNT_NAME = None
EXAM_ID = None
SESSION_ID = str(uuid.uuid4())
def get_user_data() -> dict:
return {
"userId": USER_ID,
"lastName": "lastname",
"firstName": "firstname",
"thirdName": "thirdname",
"language": "en",
}
def get_organization_data() -> dict:
return {
"accountId": ACCOUNT_ID,
"accountName": ACCOUNT_NAME,
}
def get_exam_data() -> dict:
start = datetime.datetime.now(tz=datetime.timezone.utc)
end = start + datetime.timedelta(days=1)
return {
"duration": 30,
"startDate": start.isoformat(),
"endDate": end.isoformat(),
"examId": EXAM_ID,
"examName": "test simple integration",
"proctoring": "offline",
"schedule": False,
"allowMultipleDisplays": True,
"identification": "face_and_passport"
}
def get_session_data() -> dict:
return {
"sessionId": SESSION_ID,
"sessionUrl": "https://example.org/",
}
def get_start_payload_data() -> dict:
return {
**get_user_data(),
**get_organization_data(),
**get_exam_data(),
**get_session_data()
}
def build_token(payload: dict, jwt_secret: str) -> str:
return jwt.encode(payload=payload, key=jwt_secret, algorithm="HS256")
def main():
assert JWT_SECRET is None
assert USER_ID is None
assert ACCOUNT_ID is None
assert ACCOUNT_NAME is None
assert EXAM_ID is None
assert SESSION_ID is None
token = build_token(payload=get_start_payload_data(), jwt_secret=JWT_SECRET)
print(token)
if __name__ == '__main__':
main()
Схема использования SDK
API
Proctoring()
Создает инстанс приложения.
Type
export type Proctoring = {
start: (sessionParams: StartParams) => Promise<void>
stop: () => Promise<void>
resume: () => Promise<void>
// События:
onAppStarted: (handler: (session: Session) => void) => void
onProctoringStarted: (handler: () => void) => void
onExamStarted: (handler: (examURL: string) => void) => void
onExamFinished: (handler: () => void) => void
onProctoringFinished: (handler: () => void) => void
onVideoUploaded: (handler: () => void) => void
onAppFinished: (handler: () => void) => void
}
Пример
const session = Proctoring({
supportChat: true
});
start()
Запускает интерфейс прокторинга и возвращает Promise, который резолвится после полного монтирования интерфейса в DOM.
Пример
session.start({serverOrigin, integrationName, jwt})
.then(() => {
// Здесь можно обработать успешный запуск, например:
// console.log('Proctoring UI mounted successfully');
})
.catch((error) => {
// Здесь можно обработать ошибки, если запуск не удался.
// console.error('Proctoring failed to start:', error);
});