proctoring 2.0.2
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.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +245 -0
- data/Rakefile +32 -0
- data/app/assets/config/100ms_manifest.js +1 -0
- data/app/assets/config/knights_watch_manifest.js +4 -0
- data/app/assets/config/kurento_manifest.js +1 -0
- data/app/assets/config/proctoring_manifest.js +3 -0
- data/app/assets/config/videojs_manifest.js +2 -0
- data/app/assets/images/proctoring/poster.png +0 -0
- data/app/assets/javascripts/100ms/examine.js +27 -0
- data/app/assets/javascripts/100ms/hundred_ms.js +143 -0
- data/app/assets/javascripts/100ms/join_proctor_room.js +17 -0
- data/app/assets/javascripts/100ms/proctor.js +152 -0
- data/app/assets/javascripts/kurento/LiveVideoUsingSignalingServer.js +344 -0
- data/app/assets/javascripts/kurento/VideoPlayer.js +63 -0
- data/app/assets/javascripts/kurento/VideoRecording.js +286 -0
- data/app/assets/javascripts/kurento/VideoRecordingUsingSignalingServer.js +224 -0
- data/app/assets/javascripts/kurento/co.js +299 -0
- data/app/assets/javascripts/kurento/kurento-utils.js +4418 -0
- data/app/assets/javascripts/proctoring/stream_channel.js +66 -0
- data/app/assets/javascripts/proctoring/stream_room.js +131 -0
- data/app/assets/javascripts/proctoring/video_recorder.js +172 -0
- data/app/assets/javascripts/videojs/videojs-playlist-ui.js +516 -0
- data/app/assets/javascripts/videojs/videojs-playlist.js +909 -0
- data/app/assets/stylesheets/proctoring/application.css +15 -0
- data/app/assets/stylesheets/proctoring/video_player_100ms.css +34 -0
- data/app/assets/stylesheets/proctoring/video_streamings.css +49 -0
- data/app/assets/stylesheets/scaffold.css +80 -0
- data/app/assets/stylesheets/videojs/videojs-playlist-ui.css +1 -0
- data/app/controllers/proctoring/api/v1/authentication_controller.rb +31 -0
- data/app/controllers/proctoring/api/v1/hundred_ms/services_controller.rb +24 -0
- data/app/controllers/proctoring/application_controller.rb +23 -0
- data/app/controllers/proctoring/video_streamings_controller.rb +108 -0
- data/app/helpers/proctoring/application_helper.rb +4 -0
- data/app/helpers/proctoring/hundred_ms_service_helper.rb +90 -0
- data/app/helpers/proctoring/tokens_helper.rb +55 -0
- data/app/helpers/proctoring/video_streamings_helper.rb +4 -0
- data/app/jobs/proctoring/application_job.rb +4 -0
- data/app/mailers/proctoring/application_mailer.rb +6 -0
- data/app/models/proctoring/application_record.rb +5 -0
- data/app/models/proctoring/video_streaming.rb +54 -0
- data/app/models/proctoring/video_streaming_room.rb +29 -0
- data/app/views/layouts/proctoring/application.html.erb +15 -0
- data/app/views/proctoring/video_player/live_video_proctoring.html.erb +84 -0
- data/app/views/proctoring/video_player/live_video_proctoring_100ms.html.erb +48 -0
- data/app/views/proctoring/video_player/video_player.html.erb +40 -0
- data/app/views/proctoring/video_streamings/_form.html.erb +27 -0
- data/app/views/proctoring/video_streamings/_list.html.erb +27 -0
- data/app/views/proctoring/video_streamings/_record_video_from_client.html.erb +8 -0
- data/app/views/proctoring/video_streamings/_socket_rtc_scripts.html.erb +5 -0
- data/app/views/proctoring/video_streamings/_stream_video.html.erb +8 -0
- data/app/views/proctoring/video_streamings/_video_recording.html.erb +3 -0
- data/app/views/proctoring/video_streamings/_video_recording100ms.html.erb +4 -0
- data/app/views/proctoring/video_streamings/distribute_channel_to_rooms.html.erb +39 -0
- data/app/views/proctoring/video_streamings/edit.html.erb +6 -0
- data/app/views/proctoring/video_streamings/event.html.erb +9 -0
- data/app/views/proctoring/video_streamings/index.html.erb +1 -0
- data/app/views/proctoring/video_streamings/new.html.erb +5 -0
- data/app/views/proctoring/video_streamings/show.html.erb +19 -0
- data/app/views/proctoring/video_streamings/stream_channel.html.erb +1 -0
- data/app/views/proctoring/video_streamings/stream_room.html.erb +1 -0
- data/config/routes.rb +24 -0
- data/db/migrate/20200526061313_create_proctoring_video_streamings.rb +15 -0
- data/db/migrate/20200527045158_create_proctoring_video_streaming_rooms.rb +13 -0
- data/lib/proctoring/engine.rb +41 -0
- data/lib/proctoring/version.rb +3 -0
- data/lib/proctoring.rb +5 -0
- data/lib/tasks/proctoring_tasks.rake +4 -0
- metadata +158 -0
@@ -0,0 +1,84 @@
|
|
1
|
+
<style>
|
2
|
+
#proctoringVideos {
|
3
|
+
display: flex;
|
4
|
+
flex-wrap: wrap;
|
5
|
+
}
|
6
|
+
#proctoringVideos .videoContainer{
|
7
|
+
border-width: 5px;
|
8
|
+
}
|
9
|
+
#proctoringVideos .videoContainer video {
|
10
|
+
width: 320px;
|
11
|
+
height: 240px;
|
12
|
+
}
|
13
|
+
.border-danger .status-online {
|
14
|
+
display: none;
|
15
|
+
}
|
16
|
+
.border-success .status-offline {
|
17
|
+
display: none;
|
18
|
+
}
|
19
|
+
</style>
|
20
|
+
<%= content_tag :div, '', id: 'proctoring-data', data: { media_server_url: Proctoring.media_server_url, app_name: Proctoring.app_name } %>
|
21
|
+
|
22
|
+
<div class="container-fluid">
|
23
|
+
<div class="row text-white">
|
24
|
+
<div class="col-3">
|
25
|
+
<div class="card bg-danger shadow">
|
26
|
+
<div class="card-body">
|
27
|
+
<span class="data-title h6">Event Id</span>
|
28
|
+
<h1 class="text-white display-4 text-uppercase" id="connected-event">eg</h1>
|
29
|
+
</div>
|
30
|
+
</div>
|
31
|
+
</div>
|
32
|
+
<div class="col-3">
|
33
|
+
<div class="card bg-success shadow">
|
34
|
+
<div class="card-body">
|
35
|
+
<span class="data-title h6">Assigned Candidates Online</span>
|
36
|
+
<h1 class="text-white display-4 text-uppercase" id="assigned-candidates">0</h1>
|
37
|
+
</div>
|
38
|
+
</div>
|
39
|
+
</div>
|
40
|
+
<div class="col-3">
|
41
|
+
<div class="card bg-primary shadow">
|
42
|
+
<div class="card-body">
|
43
|
+
<span class="data-title h6">Total Candidates Online</span>
|
44
|
+
<h1 class="text-white display-4 text-uppercase" id="connected-candidates">0</h1>
|
45
|
+
</div>
|
46
|
+
</div>
|
47
|
+
</div>
|
48
|
+
<div class="col-3">
|
49
|
+
<div class="card bg-warning shadow">
|
50
|
+
<div class="card-body">
|
51
|
+
<span class="data-title h6">Proctors Online</span>
|
52
|
+
<!-- <h1 class="display-4 text-uppercase">23</h1> -->
|
53
|
+
<h1 class="text-white display-4 text-uppercase" id="connected-recruiters">0</h1>
|
54
|
+
</div>
|
55
|
+
</div>
|
56
|
+
</div>
|
57
|
+
</div>
|
58
|
+
<div class="row border no-gutters mt-4 h-100">
|
59
|
+
<div class="col-3 border-right bg-gray" style="height: 100vh; overflow: scroll;">
|
60
|
+
<div class="card-header">
|
61
|
+
<h5 class="text-dark">List of connected candidates</h5>
|
62
|
+
</div>
|
63
|
+
<div class="bg-light" id="connected-candidates-list"></div>
|
64
|
+
</div>
|
65
|
+
<div class="col-9" style="overflow: scroll;height: 100vh;">
|
66
|
+
<div id="proctoringVideos"></div>
|
67
|
+
</div>
|
68
|
+
</div>
|
69
|
+
</div>
|
70
|
+
|
71
|
+
<div id="sample-video-div" class="d-none">
|
72
|
+
<div class="videoContainer rounded-0 card" id="participant-video-">
|
73
|
+
<video id="video-elm-" autoplay="" controls=""></video>
|
74
|
+
<div class="card-body p-2">
|
75
|
+
<span class="text-dark m-0 h6"><strong>UserId: </strong><strong class="video-user-id">134112</strong></span>
|
76
|
+
<span class="status-online text-success">Online</span>
|
77
|
+
<span class="status-offline text-danger">Offline</span>
|
78
|
+
</div>
|
79
|
+
<!-- <button type="button" class="btn btn-danger rounded-0 btn-block stop-connection">Stop</button> -->
|
80
|
+
</div>
|
81
|
+
</div>
|
82
|
+
|
83
|
+
<%= javascript_include_tag 'kurento/kurento-utils' %>
|
84
|
+
<%= javascript_include_tag "kurento/LiveVideoUsingSignalingServer" %>
|
@@ -0,0 +1,48 @@
|
|
1
|
+
<%= stylesheet_link_tag "proctoring/video_player_100ms" %>
|
2
|
+
<%= content_tag :div, '', id: 'proctoring-data', data: { app_name: Proctoring.app_name } %>
|
3
|
+
<%= content_tag :div, '', id: 'application-token', data: { token: Proctoring::TokensHelper::encode_authentication_token } %>
|
4
|
+
|
5
|
+
<div class="container-fluid">
|
6
|
+
<div class="row">
|
7
|
+
<div class="col-12 item-align-center d-flex justify-content-center align-items-center">
|
8
|
+
<button class="btn btn-primary mt-5" id="join-proctoring-room-btn">Join Proctoring Room</button>
|
9
|
+
</div>
|
10
|
+
</div>
|
11
|
+
<div class="loader d-none" id="loader"></div>
|
12
|
+
<div id="proctoring-data-component" class="d-none">
|
13
|
+
<div class="row text-white">
|
14
|
+
<div class="col-3">
|
15
|
+
<div class="card bg-danger shadow">
|
16
|
+
<div class="card-body p-2">
|
17
|
+
<span class="data-title h6">Event Code</span>
|
18
|
+
<h1 class="text-white display-4 text-uppercase" id="connected-event">eg</h1>
|
19
|
+
</div>
|
20
|
+
</div>
|
21
|
+
</div>
|
22
|
+
<div class="col-3">
|
23
|
+
<div class="card bg-success shadow">
|
24
|
+
<div class="card-body p-2">
|
25
|
+
<span class="data-title h6">Candidates In Room</span>
|
26
|
+
<h1 class="text-white display-4 text-uppercase" id="assigned-candidates">0</h1>
|
27
|
+
</div>
|
28
|
+
</div>
|
29
|
+
</div>
|
30
|
+
<div class="col-3">
|
31
|
+
<div class="card bg-primary shadow">
|
32
|
+
<div class="card-body p-2">
|
33
|
+
<span class="data-title h6">Proctors In Room</span>
|
34
|
+
<!-- <h1 class="display-4 text-uppercase">23</h1> -->
|
35
|
+
<h1 class="text-white display-4 text-uppercase" id="connected-recruiters">0</h1>
|
36
|
+
</div>
|
37
|
+
</div>
|
38
|
+
</div>
|
39
|
+
</div>
|
40
|
+
<div class="row border no-gutters mt-4 h-100">
|
41
|
+
<div class="col-12" style="overflow: scroll;height: 100vh;">
|
42
|
+
<div id="proctoring-videos"></div>
|
43
|
+
</div>
|
44
|
+
</div>
|
45
|
+
</div>
|
46
|
+
</div>
|
47
|
+
|
48
|
+
<%= javascript_include_tag '100ms/proctor', type: 'module' %>
|
@@ -0,0 +1,40 @@
|
|
1
|
+
<%= stylesheet_link_tag "videojs/videojs-playlist-ui" %>
|
2
|
+
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/video.js/7.8.3/video-js.min.css" />
|
3
|
+
<div class="container-fluid" style="max-height: 60vh;overflow: scroll;">
|
4
|
+
<div class="row"
|
5
|
+
id="video-player-proctoring"
|
6
|
+
data-default-thumbnail="<%= asset_url('proctoring/poster.png')%>"
|
7
|
+
style="background: #202020"
|
8
|
+
>
|
9
|
+
<div class="col-xs-12 col-md-8" style="padding-left: 0;scale: ;max-height: 60vh;">
|
10
|
+
<video
|
11
|
+
id="<%= defined?(video_js_id) != nil ? video_js_id : 'preview-player'%>"
|
12
|
+
class="video-js vjs-16-9"
|
13
|
+
controls
|
14
|
+
preload="auto"
|
15
|
+
poster="<%= asset_url('proctoring/poster.png')%>"
|
16
|
+
data-setup='{"playbackRates": [0.25, 0.5, 1, 1.5, 2, 2.5, 3, 4, 5] }'
|
17
|
+
height="200"
|
18
|
+
>
|
19
|
+
<p class="vjs-no-js">
|
20
|
+
To view this video please enable JavaScript, and consider upgrading to a
|
21
|
+
web browser that
|
22
|
+
<a href="https://videojs.com/html5-video-support/" target="_blank">
|
23
|
+
supports HTML5 video
|
24
|
+
</a>
|
25
|
+
</p>
|
26
|
+
</video>
|
27
|
+
</div>
|
28
|
+
<div class="col-xs-12 col-md-4" style="max-height: 60vh;">
|
29
|
+
<div class="row">
|
30
|
+
<div class="col-xs-8" style="overflow: scroll;">
|
31
|
+
<div class="vjs-playlist" style="height: 60vh;">
|
32
|
+
</div>
|
33
|
+
</div>
|
34
|
+
</div>
|
35
|
+
</div>
|
36
|
+
</div>
|
37
|
+
<script src="https://cdnjs.cloudflare.com/ajax/libs/video.js/7.8.3/video.min.js"></script>
|
38
|
+
<%= javascript_include_tag "videojs/videojs-playlist" %>
|
39
|
+
<%= javascript_include_tag "videojs/videojs-playlist-ui" %>
|
40
|
+
<%= javascript_include_tag "kurento/VideoPlayer" %>
|
@@ -0,0 +1,27 @@
|
|
1
|
+
<%= form_with(model: video_streaming, local: true) do |form| %>
|
2
|
+
<% if video_streaming.errors.any? %>
|
3
|
+
<div id="error_explanation">
|
4
|
+
<h2><%= pluralize(video_streaming.errors.count, "error") %> prohibited this video_streaming from being saved:</h2>
|
5
|
+
|
6
|
+
<ul>
|
7
|
+
<% video_streaming.errors.full_messages.each do |message| %>
|
8
|
+
<li><%= message %></li>
|
9
|
+
<% end %>
|
10
|
+
</ul>
|
11
|
+
</div>
|
12
|
+
<% end %>
|
13
|
+
|
14
|
+
<div class="field">
|
15
|
+
<%= form.label :event_id %>
|
16
|
+
<%= form.text_field :event_id %>
|
17
|
+
</div>
|
18
|
+
|
19
|
+
<div class="field">
|
20
|
+
<%= form.label :user_id %>
|
21
|
+
<%= form.number_field :user_id %>
|
22
|
+
</div>
|
23
|
+
|
24
|
+
<div class="actions">
|
25
|
+
<%= form.submit %>
|
26
|
+
</div>
|
27
|
+
<% end %>
|
@@ -0,0 +1,27 @@
|
|
1
|
+
<p id="notice"><%= notice %></p>
|
2
|
+
|
3
|
+
<h1>Video Streamings</h1>
|
4
|
+
|
5
|
+
<table>
|
6
|
+
<thead>
|
7
|
+
<tr>
|
8
|
+
<th>Channel</th>
|
9
|
+
<th>Event</th>
|
10
|
+
<th>User</th>
|
11
|
+
<th colspan="1"></th>
|
12
|
+
</tr>
|
13
|
+
</thead>
|
14
|
+
|
15
|
+
<tbody>
|
16
|
+
<% @video_streamings.each do |video_streaming| %>
|
17
|
+
<tr>
|
18
|
+
<td><%= video_streaming.channel %></td>
|
19
|
+
<td><%= link_to video_streaming.event_id, event_video_streaming_path(video_streaming.event_id) %></td>
|
20
|
+
<td><%= video_streaming.user_id %></td>
|
21
|
+
<td><%= link_to 'Live', stream_channel_video_streaming_path(video_streaming.channel) %></td>
|
22
|
+
</tr>
|
23
|
+
<% end %>
|
24
|
+
</tbody>
|
25
|
+
</table>
|
26
|
+
|
27
|
+
<br>
|
@@ -0,0 +1,8 @@
|
|
1
|
+
<%= content_tag :div, '', id: "video-recording-info", data: {
|
2
|
+
app_name: Proctoring.app_name,
|
3
|
+
record_endpoint: '/proctoring/video_streamings',
|
4
|
+
upload_url: rails_direct_uploads_url,
|
5
|
+
|
6
|
+
} %>
|
7
|
+
<%= javascript_include_tag "activestorage" %>
|
8
|
+
<%= javascript_include_tag "proctoring/video_recorder" %>
|
@@ -0,0 +1,5 @@
|
|
1
|
+
<script src="https://cdn.jsdelivr.net/npm/rtcmulticonnection@3.7.0/dist/RTCMultiConnection.min.js"></script>
|
2
|
+
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.3.0/socket.io.js"></script>
|
3
|
+
<% if defined? recording %>
|
4
|
+
<script src="https://cdnjs.cloudflare.com/ajax/libs/RecordRTC/5.6.1/RecordRTC.min.js"></script>
|
5
|
+
<%end%>
|
@@ -0,0 +1,8 @@
|
|
1
|
+
<%= render partial: 'socket_rtc_scripts', locals: { recording: true } %>
|
2
|
+
<p id="notice"><%= notice %></p>
|
3
|
+
<div class="container">
|
4
|
+
<h1>Video Streamings</h1>
|
5
|
+
<div id="channel-data" data-stream-video-url="<%= media_server_url %>" data-stream-channels="<%= channels %>"></div>
|
6
|
+
<div id="video-container"></div>
|
7
|
+
</div>
|
8
|
+
<%= javascript_include_tag "proctoring/stream_room" %>
|
@@ -0,0 +1,39 @@
|
|
1
|
+
<p id="notice" class="alert alert-success"><%= notice %></p>
|
2
|
+
<h1>Video Streamings</h1>
|
3
|
+
|
4
|
+
<div class="container-fluid">
|
5
|
+
<div class="row">
|
6
|
+
<div class="col-12">
|
7
|
+
<table class="table">
|
8
|
+
<thead>
|
9
|
+
<tr>
|
10
|
+
<th>Total Rooms</th>
|
11
|
+
</tr>
|
12
|
+
</thead>
|
13
|
+
<tbody>
|
14
|
+
<tr>
|
15
|
+
<td><%= @all_rooms.length%></td>
|
16
|
+
</tr>
|
17
|
+
</tbody>
|
18
|
+
</table>
|
19
|
+
</div>
|
20
|
+
</div>
|
21
|
+
</div>
|
22
|
+
<div class="panel panel-default" style="margin-top: 15px;">
|
23
|
+
<table class="table table-bordered">
|
24
|
+
<thead>
|
25
|
+
<tr>
|
26
|
+
<th>Channel Id</th>
|
27
|
+
<th>View Live</th>
|
28
|
+
</tr>
|
29
|
+
</thead>
|
30
|
+
<tbody>
|
31
|
+
<% @all_rooms.each do |room| %>
|
32
|
+
<tr>
|
33
|
+
<td> <%= room.room %></td>
|
34
|
+
<td> <%= link_to 'Live', stream_room_video_streaming_path(id: room.room) %></td>
|
35
|
+
</tr>
|
36
|
+
<% end %>
|
37
|
+
</tbody>
|
38
|
+
</table>
|
39
|
+
</div>
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<%= render partial: "list" %>
|
2
|
+
|
3
|
+
<div>
|
4
|
+
<%= form_for :video_streaming, url: distribute_channel_to_rooms_video_streamings_path, method: :get do |f| %>
|
5
|
+
<%= f.text_field :no_of_users_in_channel, placeholder: 'Enter the amount of candidate you want in a room.', size: '50' %>
|
6
|
+
<%= f.hidden_field :event_id, { value: params[:id] } %>
|
7
|
+
<%= f.submit "Distribute channels to rooms" %>
|
8
|
+
<% end %>
|
9
|
+
</div>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= render partial: "list" %>
|
@@ -0,0 +1,19 @@
|
|
1
|
+
<p id="notice"><%= notice %></p>
|
2
|
+
|
3
|
+
<p>
|
4
|
+
<strong>Channel:</strong>
|
5
|
+
<%= @video_streaming.channel %>
|
6
|
+
</p>
|
7
|
+
|
8
|
+
<p>
|
9
|
+
<strong>Event:</strong>
|
10
|
+
<%= @video_streaming.event_id %>
|
11
|
+
</p>
|
12
|
+
|
13
|
+
<p>
|
14
|
+
<strong>User:</strong>
|
15
|
+
<%= @video_streaming.user_id %>
|
16
|
+
</p>
|
17
|
+
|
18
|
+
<%= link_to 'Edit', edit_video_streaming_path(@video_streaming) %> |
|
19
|
+
<%= link_to 'Back', video_streamings_path %>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= render partial: "stream_video", locals: { media_server_url: @media_server_url, channels: [@video_streaming.channel]} %>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= render partial: "stream_video", locals: { media_server_url: @media_server_url, channels: @video_streaming_room.channels} %>
|
data/config/routes.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
Proctoring::Engine.routes.draw do
|
2
|
+
resources :video_streamings do
|
3
|
+
collection do
|
4
|
+
get 'distribute_channel_to_rooms'
|
5
|
+
get 'user_channel'
|
6
|
+
end
|
7
|
+
member do
|
8
|
+
get 'event'
|
9
|
+
get 'stream_channel'
|
10
|
+
get 'stream_room'
|
11
|
+
post 'upload_video'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
namespace :api do
|
16
|
+
namespace :v1 do
|
17
|
+
resources :authentication, only: :create
|
18
|
+
|
19
|
+
namespace :hundred_ms do
|
20
|
+
resources :services, only: :create
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class CreateProctoringVideoStreamings < ActiveRecord::Migration[6.0]
|
2
|
+
def change
|
3
|
+
create_table :proctoring_video_streamings do |t|
|
4
|
+
t.string :channel, limit: 38, null: false
|
5
|
+
t.integer :user_id
|
6
|
+
t.integer :event_id
|
7
|
+
t.integer :status
|
8
|
+
|
9
|
+
t.timestamps
|
10
|
+
end
|
11
|
+
|
12
|
+
add_index :proctoring_video_streamings, :channel, unique: true
|
13
|
+
add_index :proctoring_video_streamings, [:user_id, :event_id]
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class CreateProctoringVideoStreamingRooms < ActiveRecord::Migration[6.0]
|
2
|
+
def change
|
3
|
+
create_table :proctoring_video_streaming_rooms do |t|
|
4
|
+
t.string :room, limit: 38, null: false
|
5
|
+
t.integer :event_id
|
6
|
+
t.integer :status
|
7
|
+
t.json :channels
|
8
|
+
t.integer :total_users
|
9
|
+
|
10
|
+
t.timestamps
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Proctoring
|
2
|
+
mattr_accessor :media_server_url
|
3
|
+
mattr_accessor :app_name
|
4
|
+
mattr_accessor :turn_secret
|
5
|
+
mattr_accessor :hundred_ms_app_access_key
|
6
|
+
mattr_accessor :hundred_ms_app_secret
|
7
|
+
mattr_accessor :hundred_ms_template_id
|
8
|
+
mattr_accessor :hundred_ms_s3_bucket
|
9
|
+
mattr_accessor :hundred_ms_s3_access_key
|
10
|
+
mattr_accessor :hundred_ms_s3_access_secret
|
11
|
+
mattr_accessor :hundred_ms_s3_region
|
12
|
+
mattr_accessor :hundred_ms_auth_secret
|
13
|
+
mattr_accessor :hundred_ms_webhook_secret
|
14
|
+
|
15
|
+
self.media_server_url = 'localhost:8000'
|
16
|
+
self.app_name = 'default'
|
17
|
+
self.turn_secret = 'secret'
|
18
|
+
self.hundred_ms_auth_secret = 'random-key' if Rails.env.test?
|
19
|
+
self.hundred_ms_webhook_secret = 'webhook-secret' if Rails.env.test?
|
20
|
+
|
21
|
+
def self.setup(&block)
|
22
|
+
yield self
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.turnserver_session_credentials
|
26
|
+
time = Time.zone.now.strftime("%s")
|
27
|
+
timeout = 15000
|
28
|
+
username = time.to_i + timeout
|
29
|
+
password = Base64.encode64 (OpenSSL::HMAC.digest("sha1", turn_secret, username.to_s))
|
30
|
+
turn_servers = [{
|
31
|
+
"urls" => "turn:#{media_server_url}:3478",
|
32
|
+
"username" => username,
|
33
|
+
"credential" => password.chomp
|
34
|
+
}]
|
35
|
+
turn_servers
|
36
|
+
end
|
37
|
+
|
38
|
+
class Engine < ::Rails::Engine
|
39
|
+
isolate_namespace Proctoring
|
40
|
+
end
|
41
|
+
end
|
data/lib/proctoring.rb
ADDED
metadata
ADDED
@@ -0,0 +1,158 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: proctoring
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 2.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Shireesh Jayashetty
|
8
|
+
- Manish Sharma
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2025-02-27 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rails
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - "~>"
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '7.2'
|
21
|
+
type: :runtime
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - "~>"
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '7.2'
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: sqlite3
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '0'
|
35
|
+
type: :development
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
42
|
+
- !ruby/object:Gem::Dependency
|
43
|
+
name: jwt
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - ">="
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '0'
|
49
|
+
type: :runtime
|
50
|
+
prerelease: false
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
description: A proctoring rails engine to provide proctoring features to varuious
|
57
|
+
apps in a decentralised way.
|
58
|
+
email:
|
59
|
+
- shireesh@elitmus.com
|
60
|
+
- manish.sharma@elitmus.com
|
61
|
+
executables: []
|
62
|
+
extensions: []
|
63
|
+
extra_rdoc_files: []
|
64
|
+
files:
|
65
|
+
- MIT-LICENSE
|
66
|
+
- README.md
|
67
|
+
- Rakefile
|
68
|
+
- app/assets/config/100ms_manifest.js
|
69
|
+
- app/assets/config/knights_watch_manifest.js
|
70
|
+
- app/assets/config/kurento_manifest.js
|
71
|
+
- app/assets/config/proctoring_manifest.js
|
72
|
+
- app/assets/config/videojs_manifest.js
|
73
|
+
- app/assets/images/proctoring/poster.png
|
74
|
+
- app/assets/javascripts/100ms/examine.js
|
75
|
+
- app/assets/javascripts/100ms/hundred_ms.js
|
76
|
+
- app/assets/javascripts/100ms/join_proctor_room.js
|
77
|
+
- app/assets/javascripts/100ms/proctor.js
|
78
|
+
- app/assets/javascripts/kurento/LiveVideoUsingSignalingServer.js
|
79
|
+
- app/assets/javascripts/kurento/VideoPlayer.js
|
80
|
+
- app/assets/javascripts/kurento/VideoRecording.js
|
81
|
+
- app/assets/javascripts/kurento/VideoRecordingUsingSignalingServer.js
|
82
|
+
- app/assets/javascripts/kurento/co.js
|
83
|
+
- app/assets/javascripts/kurento/kurento-utils.js
|
84
|
+
- app/assets/javascripts/proctoring/stream_channel.js
|
85
|
+
- app/assets/javascripts/proctoring/stream_room.js
|
86
|
+
- app/assets/javascripts/proctoring/video_recorder.js
|
87
|
+
- app/assets/javascripts/videojs/videojs-playlist-ui.js
|
88
|
+
- app/assets/javascripts/videojs/videojs-playlist.js
|
89
|
+
- app/assets/stylesheets/proctoring/application.css
|
90
|
+
- app/assets/stylesheets/proctoring/video_player_100ms.css
|
91
|
+
- app/assets/stylesheets/proctoring/video_streamings.css
|
92
|
+
- app/assets/stylesheets/scaffold.css
|
93
|
+
- app/assets/stylesheets/videojs/videojs-playlist-ui.css
|
94
|
+
- app/controllers/proctoring/api/v1/authentication_controller.rb
|
95
|
+
- app/controllers/proctoring/api/v1/hundred_ms/services_controller.rb
|
96
|
+
- app/controllers/proctoring/application_controller.rb
|
97
|
+
- app/controllers/proctoring/video_streamings_controller.rb
|
98
|
+
- app/helpers/proctoring/application_helper.rb
|
99
|
+
- app/helpers/proctoring/hundred_ms_service_helper.rb
|
100
|
+
- app/helpers/proctoring/tokens_helper.rb
|
101
|
+
- app/helpers/proctoring/video_streamings_helper.rb
|
102
|
+
- app/jobs/proctoring/application_job.rb
|
103
|
+
- app/mailers/proctoring/application_mailer.rb
|
104
|
+
- app/models/proctoring/application_record.rb
|
105
|
+
- app/models/proctoring/video_streaming.rb
|
106
|
+
- app/models/proctoring/video_streaming_room.rb
|
107
|
+
- app/views/layouts/proctoring/application.html.erb
|
108
|
+
- app/views/proctoring/video_player/live_video_proctoring.html.erb
|
109
|
+
- app/views/proctoring/video_player/live_video_proctoring_100ms.html.erb
|
110
|
+
- app/views/proctoring/video_player/video_player.html.erb
|
111
|
+
- app/views/proctoring/video_streamings/_form.html.erb
|
112
|
+
- app/views/proctoring/video_streamings/_list.html.erb
|
113
|
+
- app/views/proctoring/video_streamings/_record_video_from_client.html.erb
|
114
|
+
- app/views/proctoring/video_streamings/_socket_rtc_scripts.html.erb
|
115
|
+
- app/views/proctoring/video_streamings/_stream_video.html.erb
|
116
|
+
- app/views/proctoring/video_streamings/_video_recording.html.erb
|
117
|
+
- app/views/proctoring/video_streamings/_video_recording100ms.html.erb
|
118
|
+
- app/views/proctoring/video_streamings/distribute_channel_to_rooms.html.erb
|
119
|
+
- app/views/proctoring/video_streamings/edit.html.erb
|
120
|
+
- app/views/proctoring/video_streamings/event.html.erb
|
121
|
+
- app/views/proctoring/video_streamings/index.html.erb
|
122
|
+
- app/views/proctoring/video_streamings/new.html.erb
|
123
|
+
- app/views/proctoring/video_streamings/show.html.erb
|
124
|
+
- app/views/proctoring/video_streamings/stream_channel.html.erb
|
125
|
+
- app/views/proctoring/video_streamings/stream_room.html.erb
|
126
|
+
- config/routes.rb
|
127
|
+
- db/migrate/20200526061313_create_proctoring_video_streamings.rb
|
128
|
+
- db/migrate/20200527045158_create_proctoring_video_streaming_rooms.rb
|
129
|
+
- lib/proctoring.rb
|
130
|
+
- lib/proctoring/engine.rb
|
131
|
+
- lib/proctoring/version.rb
|
132
|
+
- lib/tasks/proctoring_tasks.rake
|
133
|
+
homepage: https://www.elitmus.com
|
134
|
+
licenses:
|
135
|
+
- MIT
|
136
|
+
metadata:
|
137
|
+
allowed_push_host: https://rubygems.org
|
138
|
+
post_install_message:
|
139
|
+
rdoc_options: []
|
140
|
+
require_paths:
|
141
|
+
- lib
|
142
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
143
|
+
requirements:
|
144
|
+
- - ">="
|
145
|
+
- !ruby/object:Gem::Version
|
146
|
+
version: '0'
|
147
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
148
|
+
requirements:
|
149
|
+
- - ">="
|
150
|
+
- !ruby/object:Gem::Version
|
151
|
+
version: '0'
|
152
|
+
requirements: []
|
153
|
+
rubygems_version: 3.4.19
|
154
|
+
signing_key:
|
155
|
+
specification_version: 4
|
156
|
+
summary: A proctoring rails engine to provide proctoring features to varuious apps
|
157
|
+
in a decentralised way.
|
158
|
+
test_files: []
|