easyproctor-hml 2.6.0 → 2.7.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.
@@ -22,7 +22,7 @@ export declare class BaseDetection {
22
22
  }, paramsConfig?: IParamsConfig, classVideo?: string, classDiv?: string);
23
23
  initializeDetector(): Promise<void>;
24
24
  stopDetection(): void;
25
- enableCam(cameraStream?: MediaProvider | null | undefined): void;
25
+ enableCam(cameraStream?: MediaProvider | null | undefined, delay?: number): void;
26
26
  lastVideoTime: number;
27
27
  lastExecutionDate: number;
28
28
  predictWebcam(): Promise<void>;
@@ -5,13 +5,16 @@ import IParamsConfig from "../../interfaces/ParamsConfig";
5
5
  import { ProctoringSessionOptions } from "../../proctoring/options/ProctoringOptions";
6
6
  export declare class BackendService {
7
7
  private readonly options;
8
- private readonly baseUrl;
8
+ private baseUrl;
9
9
  token: string;
10
10
  constructor(options: {
11
11
  type: string;
12
12
  token?: string;
13
+ isRealtime?: boolean;
13
14
  });
14
- selectBaseUrl(type: string): "https://proctoring-api-dev.easyproctor.tech/api" | "https://proctoring-api-hml.easyproctor.tech/api" | "https://proctoring-api.easyproctor.tech/api";
15
+ getBaseUrl(): string;
16
+ selectBaseUrl(type: string, isRealtime?: boolean): "https://easyproctor-realtime-api-dev.easyproctor.tech/api" | "https://easyproctor-realtime-api-hml.easyproctor.tech/api" | "https://easyproctor-realtime-api.easyproctor.tech/api" | "https://proctoring-api-dev.easyproctor.tech/api" | "https://proctoring-api-hml.easyproctor.tech/api" | "https://proctoring-api.easyproctor.tech/api";
17
+ setRealtime(isRealtime: boolean): void;
15
18
  getSocketUrl(): string;
16
19
  loginAuth(cpf: string, base64: string): Promise<any>;
17
20
  externalCameraRegister(body: any): Promise<any>;
@@ -28,6 +31,7 @@ export declare class BackendService {
28
31
  getParamsConfig(proctoringOptions: ProctoringContext): Promise<IParamsConfig>;
29
32
  getSignedUrlImage(token: string, body: any): Promise<string[]>;
30
33
  getSignedUrl(token: string, file: File, proctoringId?: string): Promise<string>;
34
+ initiateUpload(token: string, objectName: string, contentType: string): Promise<string>;
31
35
  saveAlerts(proctoringOptions: ProctoringContext, proctoringSession: ProctoringSession): Promise<void>;
32
36
  finishAndSendUrls(proctoringOptions: ProctoringContext): Promise<any>;
33
37
  log(eventName: string, properties?: {
@@ -40,6 +44,7 @@ export declare class BackendService {
40
44
  startRealtimeAlert(body: any): Promise<any>;
41
45
  stopRealtimeAlert(body: any): Promise<any>;
42
46
  verifyFace(proctoringId: any, faceImage: any, retry: boolean): Promise<any>;
47
+ checkUpload(token: string, objectName: string, contentType: string): Promise<boolean>;
43
48
  getServerHour(token: string): Promise<string>;
44
49
  private makeRequest;
45
50
  makeRequestAxios<R>(data: {
@@ -0,0 +1,38 @@
1
+ import { BackendService } from "../backend/BackendService";
2
+ import { ChunkStorageService } from "./ChunkStorageService";
3
+ export interface BackgroundUploadConfig {
4
+ pollInterval?: number;
5
+ maxRetries?: number;
6
+ baseRetryDelay?: number;
7
+ cleanAfterUpload?: boolean;
8
+ }
9
+ export declare class BackgroundUploadService {
10
+ private readonly config;
11
+ private readonly chunkStorage;
12
+ private readonly backend;
13
+ private readonly proctoringId;
14
+ private readonly token;
15
+ private pollTimer;
16
+ private isProcessing;
17
+ private isRunning;
18
+ private retryCount;
19
+ private sessionUrl;
20
+ private currentOffset;
21
+ private totalBytesPurged;
22
+ private readonly STORAGE_KEY_PREFIX;
23
+ private readonly GCS_CHUNK_SIZE;
24
+ onChunkUploaded?: (chunkId: number, chunkIndex: number) => void;
25
+ onUploadError?: (chunkId: number, error: any) => void;
26
+ constructor(proctoringId: string, token: string, backend: BackendService, chunkStorage: ChunkStorageService, config?: BackgroundUploadConfig);
27
+ private loadSessionState;
28
+ private saveSessionState;
29
+ private clearSessionState;
30
+ start(): void;
31
+ stop(): void;
32
+ flush(): Promise<void>;
33
+ private syncOffset;
34
+ private processQueue;
35
+ private uploadData;
36
+ static recoverPendingUploads(backend: BackendService, token: string): Promise<string[]>;
37
+ private sleep;
38
+ }
@@ -0,0 +1,25 @@
1
+ export interface VideoChunk {
2
+ id?: number;
3
+ proctoringId: string;
4
+ chunkIndex: number;
5
+ blob: Blob;
6
+ timestamp: number;
7
+ uploaded: number;
8
+ mimeType: string;
9
+ }
10
+ export declare class ChunkStorageService {
11
+ private static readonly DB_NAME;
12
+ private static readonly DB_VERSION;
13
+ private static readonly STORE_NAME;
14
+ private db;
15
+ connect(): Promise<IDBDatabase>;
16
+ saveChunk(chunk: Omit<VideoChunk, "id">): Promise<number>;
17
+ getPendingChunks(proctoringId: string): Promise<VideoChunk[]>;
18
+ getAllChunks(proctoringId: string): Promise<VideoChunk[]>;
19
+ markAsUploaded(chunkId: number): Promise<void>;
20
+ clearUploadedChunks(proctoringId: string): Promise<void>;
21
+ clearAllChunks(proctoringId: string): Promise<void>;
22
+ hasAnyPendingChunks(): Promise<boolean>;
23
+ getPendingProctoringIds(): Promise<string[]>;
24
+ close(): void;
25
+ }
@@ -27,6 +27,7 @@ export declare enum AlertCategory {
27
27
  ChangeDevices = 39,
28
28
  ClipBoardUse = 42,
29
29
  SplitScreen = 43,
30
+ RealtimeOffline = 44,
30
31
  System = 200
31
32
  }
32
33
  export declare enum FinishRealtimeWarningCategory {
@@ -30,6 +30,7 @@ export declare class CameraRecorder implements IRecorder {
30
30
  faceDetection: FaceDetection;
31
31
  objectDetection: ObjectDetection;
32
32
  filesToUpload: File[];
33
+ pendingPackages: File[][];
33
34
  private intervalNoiseDetection;
34
35
  private volumeMeter;
35
36
  private animationFrameId;
@@ -39,6 +40,17 @@ export declare class CameraRecorder implements IRecorder {
39
40
  private videoElement;
40
41
  private duration;
41
42
  stopped: boolean;
43
+ private static readonly CHUNK_TIMESLICE_MS;
44
+ private static readonly LS_SESSION_KEY;
45
+ private chunkStorage;
46
+ private backgroundUpload;
47
+ private chunkIndex;
48
+ private pendingChunkSaves;
49
+ onSessionInterrupted?: () => void;
50
+ onVisibilityRestored?: () => void;
51
+ private boundVisibilityHandler;
52
+ private boundPageHideHandler;
53
+ private get isChunkEnabled();
42
54
  constructor(options: {
43
55
  cameraId?: string;
44
56
  microphoneId?: string;
@@ -57,6 +69,17 @@ export declare class CameraRecorder implements IRecorder {
57
69
  getStartTime: () => any;
58
70
  getDuration: () => any;
59
71
  setProctoringId(proctoringId: string): void;
72
+ private persistSessionState;
73
+ private clearSessionState;
74
+ static checkForActiveSession(): {
75
+ proctoringId: string;
76
+ status: string;
77
+ timestamp: number;
78
+ } | null;
79
+ private setupLifecycleListeners;
80
+ private removeLifecycleListeners;
81
+ private handleVisibilityChange;
82
+ private handlePageHide;
60
83
  initializeDetectors(): Promise<void>;
61
84
  configImageCapture(): void;
62
85
  currentRetries: number;
@@ -67,16 +90,19 @@ export declare class CameraRecorder implements IRecorder {
67
90
  attachAndWarmup(stream: MediaStream): Promise<void>;
68
91
  startRecording(): Promise<void>;
69
92
  stopRecording(): Promise<void>;
93
+ private handleNewChunk;
70
94
  pauseRecording(): Promise<void>;
71
95
  resumeRecording(): Promise<void>;
72
96
  getCurrentImageBase64(): Promise<string>;
73
97
  packageCount: number;
74
98
  captureFrame(): Promise<void>;
75
99
  startRealtimeCapture(): Promise<void>;
76
- sendPackage(framesToSend: File[]): Promise<void>;
100
+ private failedUploads;
101
+ sendPackage(): Promise<void>;
77
102
  download(file: File): void;
78
103
  saveOnSession(session: ProctoringSession): Promise<void>;
79
104
  getFile(file: string, name: string, type: string): Promise<File>;
105
+ private checkInternetStability;
80
106
  noiseWait: number;
81
107
  private onNoiseDetected;
82
108
  }
@@ -34,6 +34,7 @@ export declare class NoiseRecorder implements IRecorder {
34
34
  private readonly MAX_PRE_ROLL_CHUNKS;
35
35
  private lastNoiseTime;
36
36
  private readonly SILENCE_THRESHOLD;
37
+ private filesToUpload;
37
38
  constructor(optionsProctoring: ProctoringSessionOptions, proctoringSession: ProctoringSession, paramsConfig: IParamsConfig, cameraRecorder: CameraRecorder, onRealtimeAlertsCallback: (response: any) => void, backend?: BackendService, backendToken?: string);
38
39
  setProctoringId(proctoringId: string): void;
39
40
  startRecording(): Promise<void>;
@@ -44,7 +45,6 @@ export declare class NoiseRecorder implements IRecorder {
44
45
  private onNoiseDetectedRecord;
45
46
  private stopSoundRecord;
46
47
  private download;
47
- private uploadRecord;
48
48
  private hasDesiredResult;
49
49
  private createAudioClassifier;
50
50
  private streamingAudioClassification;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "easyproctor-hml",
3
- "version": "2.6.0",
3
+ "version": "2.7.0",
4
4
  "description": "Modulo web de gravação do EasyProctor",
5
5
  "main": "./index.js",
6
6
  "module": "./esm/index.js",
@@ -17,6 +17,7 @@
17
17
  "scripts": {
18
18
  "build": "node scripts/build.js && tsc",
19
19
  "dev": "node scripts/serve.js -w",
20
+ "dev:https": "node scripts/build.js && node scripts/serve-https.js",
20
21
  "publish": "npm publish ./dist"
21
22
  },
22
23
  "author": "IARIS",
@@ -1,5 +1,9 @@
1
1
  export declare function setRecorderProctoringId(id: string): void;
2
- export default function recorder(stream: MediaStream, buffer: Blob[], onBufferSizeError?: boolean, onBufferSizeErrorCallback?: (e?: any) => void, audio?: boolean): {
2
+ export interface RecorderOptions {
3
+ timeslice?: number;
4
+ onChunkAvailable?: (blob: Blob, chunkIndex: number) => void;
5
+ }
6
+ export default function recorder(stream: MediaStream, buffer: Blob[], onBufferSizeError?: boolean, onBufferSizeErrorCallback?: (e?: any) => void, audio?: boolean, recorderOpts?: RecorderOptions): {
3
7
  startRecording: () => Promise<void>;
4
8
  stopRecording: () => Promise<void>;
5
9
  pauseRecording: () => Promise<void>;
@@ -59,6 +59,10 @@ export declare class Proctoring {
59
59
  appChecker: ExternalCameraChecker;
60
60
  private verifyFirstFaceInterval;
61
61
  private onStopSharingScreenCallback;
62
+ private onVisibilityLostCallback;
63
+ private onVisibilityRestoredCallback;
64
+ setOnVisibilityLostCallback(cb: () => void): void;
65
+ setOnVisibilityRestoredCallback(cb: () => void): void;
62
66
  setOnStopSharingScreenCallback(cb: () => void): void;
63
67
  private setOnLostFocusAlertRecorderCallback;
64
68
  private setOnFocusAlertRecorderCallback;
@@ -74,6 +78,8 @@ export declare class Proctoring {
74
78
  private convertRealtimeTypeToWarningType;
75
79
  private stopRealtimeAlert;
76
80
  private onRealtimeAlertsCallback;
81
+ private sendPendingRealtimeAlerts;
82
+ private realtimeAlertsToSend;
77
83
  private internalOnRealtimeAlerts;
78
84
  onRealtimeAlerts(options?: ProctoringRealtimeAlertsOptions): Promise<void>;
79
85
  private onBufferSizeErrorCallback;
@@ -28,4 +28,6 @@ export declare function useProctoring(proctoringOptions: ProctoringContext, envi
28
28
  takeExternalCameraPicture: (waitingPositionValidation: boolean, onTakePictureCallback: (response: any) => void) => Promise<void>;
29
29
  goToExternalCameraPositionStep: () => Promise<void>;
30
30
  startExternalCameraTransmission: (proctoringId: string) => Promise<void>;
31
+ onVisibilityLost: (cb: () => void) => void;
32
+ onVisibilityRestored: (cb: () => void) => void;
31
33
  };