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.
Files changed (70) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +245 -0
  4. data/Rakefile +32 -0
  5. data/app/assets/config/100ms_manifest.js +1 -0
  6. data/app/assets/config/knights_watch_manifest.js +4 -0
  7. data/app/assets/config/kurento_manifest.js +1 -0
  8. data/app/assets/config/proctoring_manifest.js +3 -0
  9. data/app/assets/config/videojs_manifest.js +2 -0
  10. data/app/assets/images/proctoring/poster.png +0 -0
  11. data/app/assets/javascripts/100ms/examine.js +27 -0
  12. data/app/assets/javascripts/100ms/hundred_ms.js +143 -0
  13. data/app/assets/javascripts/100ms/join_proctor_room.js +17 -0
  14. data/app/assets/javascripts/100ms/proctor.js +152 -0
  15. data/app/assets/javascripts/kurento/LiveVideoUsingSignalingServer.js +344 -0
  16. data/app/assets/javascripts/kurento/VideoPlayer.js +63 -0
  17. data/app/assets/javascripts/kurento/VideoRecording.js +286 -0
  18. data/app/assets/javascripts/kurento/VideoRecordingUsingSignalingServer.js +224 -0
  19. data/app/assets/javascripts/kurento/co.js +299 -0
  20. data/app/assets/javascripts/kurento/kurento-utils.js +4418 -0
  21. data/app/assets/javascripts/proctoring/stream_channel.js +66 -0
  22. data/app/assets/javascripts/proctoring/stream_room.js +131 -0
  23. data/app/assets/javascripts/proctoring/video_recorder.js +172 -0
  24. data/app/assets/javascripts/videojs/videojs-playlist-ui.js +516 -0
  25. data/app/assets/javascripts/videojs/videojs-playlist.js +909 -0
  26. data/app/assets/stylesheets/proctoring/application.css +15 -0
  27. data/app/assets/stylesheets/proctoring/video_player_100ms.css +34 -0
  28. data/app/assets/stylesheets/proctoring/video_streamings.css +49 -0
  29. data/app/assets/stylesheets/scaffold.css +80 -0
  30. data/app/assets/stylesheets/videojs/videojs-playlist-ui.css +1 -0
  31. data/app/controllers/proctoring/api/v1/authentication_controller.rb +31 -0
  32. data/app/controllers/proctoring/api/v1/hundred_ms/services_controller.rb +24 -0
  33. data/app/controllers/proctoring/application_controller.rb +23 -0
  34. data/app/controllers/proctoring/video_streamings_controller.rb +108 -0
  35. data/app/helpers/proctoring/application_helper.rb +4 -0
  36. data/app/helpers/proctoring/hundred_ms_service_helper.rb +90 -0
  37. data/app/helpers/proctoring/tokens_helper.rb +55 -0
  38. data/app/helpers/proctoring/video_streamings_helper.rb +4 -0
  39. data/app/jobs/proctoring/application_job.rb +4 -0
  40. data/app/mailers/proctoring/application_mailer.rb +6 -0
  41. data/app/models/proctoring/application_record.rb +5 -0
  42. data/app/models/proctoring/video_streaming.rb +54 -0
  43. data/app/models/proctoring/video_streaming_room.rb +29 -0
  44. data/app/views/layouts/proctoring/application.html.erb +15 -0
  45. data/app/views/proctoring/video_player/live_video_proctoring.html.erb +84 -0
  46. data/app/views/proctoring/video_player/live_video_proctoring_100ms.html.erb +48 -0
  47. data/app/views/proctoring/video_player/video_player.html.erb +40 -0
  48. data/app/views/proctoring/video_streamings/_form.html.erb +27 -0
  49. data/app/views/proctoring/video_streamings/_list.html.erb +27 -0
  50. data/app/views/proctoring/video_streamings/_record_video_from_client.html.erb +8 -0
  51. data/app/views/proctoring/video_streamings/_socket_rtc_scripts.html.erb +5 -0
  52. data/app/views/proctoring/video_streamings/_stream_video.html.erb +8 -0
  53. data/app/views/proctoring/video_streamings/_video_recording.html.erb +3 -0
  54. data/app/views/proctoring/video_streamings/_video_recording100ms.html.erb +4 -0
  55. data/app/views/proctoring/video_streamings/distribute_channel_to_rooms.html.erb +39 -0
  56. data/app/views/proctoring/video_streamings/edit.html.erb +6 -0
  57. data/app/views/proctoring/video_streamings/event.html.erb +9 -0
  58. data/app/views/proctoring/video_streamings/index.html.erb +1 -0
  59. data/app/views/proctoring/video_streamings/new.html.erb +5 -0
  60. data/app/views/proctoring/video_streamings/show.html.erb +19 -0
  61. data/app/views/proctoring/video_streamings/stream_channel.html.erb +1 -0
  62. data/app/views/proctoring/video_streamings/stream_room.html.erb +1 -0
  63. data/config/routes.rb +24 -0
  64. data/db/migrate/20200526061313_create_proctoring_video_streamings.rb +15 -0
  65. data/db/migrate/20200527045158_create_proctoring_video_streaming_rooms.rb +13 -0
  66. data/lib/proctoring/engine.rb +41 -0
  67. data/lib/proctoring/version.rb +3 -0
  68. data/lib/proctoring.rb +5 -0
  69. data/lib/tasks/proctoring_tasks.rake +4 -0
  70. 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,3 @@
1
+ <%= javascript_include_tag 'kurento/kurento-utils' %>
2
+ <%= javascript_include_tag 'kurento/VideoRecordingUsingSignalingServer' %>
3
+ <%= content_tag :div, '', id: 'proctoring-data', data: { media_server_url: Proctoring.media_server_url, app_name: Proctoring.app_name } %>
@@ -0,0 +1,4 @@
1
+ <%= javascript_include_tag '100ms/examine', type: 'module' %>
2
+ <%= content_tag :div, '', id: 'proctoring-data', data: {} %>
3
+ <%= content_tag :div, '', id: 'application-token', data: { token: Proctoring::TokensHelper::encode_authentication_token } %>
4
+
@@ -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,6 @@
1
+ <h1>Editing Video Streaming</h1>
2
+
3
+ <%= render 'form', video_streaming: @video_streaming %>
4
+
5
+ <%= link_to 'Show', @video_streaming %> |
6
+ <%= link_to 'Back', video_streamings_path %>
@@ -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,5 @@
1
+ <h1>New Video Streaming</h1>
2
+
3
+ <%= render 'form', video_streaming: @video_streaming %>
4
+
5
+ <%= link_to 'Back', video_streamings_path %>
@@ -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
@@ -0,0 +1,3 @@
1
+ module Proctoring
2
+ VERSION = '2.0.2'.freeze
3
+ end
data/lib/proctoring.rb ADDED
@@ -0,0 +1,5 @@
1
+ require "proctoring/engine"
2
+
3
+ module Proctoring
4
+ # Your code goes here...
5
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :proctoring do
3
+ # # Task goes here
4
+ # end
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: []