livekit-server-sdk 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.editorconfig +12 -0
- data/.github/workflows/test.yml +25 -0
- data/.gitignore +12 -0
- data/.gitmodules +3 -0
- data/.rspec +3 -0
- data/.rubocop.yml +16 -0
- data/.rubocop_todo.yml +22 -0
- data/.ruby-version +1 -0
- data/.tool-versions +3 -0
- data/CHANGELOG.md +5 -0
- data/CODE_OF_CONDUCT.md +84 -0
- data/Gemfile +17 -0
- data/Gemfile.lock +103 -0
- data/LICENSE.txt +21 -0
- data/README.md +45 -0
- data/Rakefile +19 -0
- data/bin/bootstrap.sh +5 -0
- data/bin/bundle +114 -0
- data/bin/coderay +29 -0
- data/bin/console +8 -0
- data/bin/htmldiff +29 -0
- data/bin/ldiff +29 -0
- data/bin/pry +29 -0
- data/bin/rake +29 -0
- data/bin/rspec +29 -0
- data/bin/rubocop +29 -0
- data/bin/ruby-parse +29 -0
- data/bin/ruby-rewrite +29 -0
- data/bin/yard +29 -0
- data/bin/yardoc +29 -0
- data/bin/yri +29 -0
- data/lib/livekit/access_token.rb +66 -0
- data/lib/livekit/auth_mixin.rb +12 -0
- data/lib/livekit/grants.rb +107 -0
- data/lib/livekit/proto/livekit_models_pb.rb +133 -0
- data/lib/livekit/proto/livekit_models_twirp.rb +8 -0
- data/lib/livekit/proto/livekit_recording_pb.rb +95 -0
- data/lib/livekit/proto/livekit_recording_twirp.rb +20 -0
- data/lib/livekit/proto/livekit_room_pb.rb +105 -0
- data/lib/livekit/proto/livekit_room_twirp.rb +27 -0
- data/lib/livekit/proto/livekit_webhook_pb.rb +26 -0
- data/lib/livekit/proto/livekit_webhook_twirp.rb +8 -0
- data/lib/livekit/room_service_client.rb +128 -0
- data/lib/livekit/token_verifier.rb +21 -0
- data/lib/livekit/utils.rb +29 -0
- data/lib/livekit/version.rb +5 -0
- data/lib/livekit.rb +12 -0
- data/livekit_server_sdk.gemspec +35 -0
- metadata +135 -0
data/bin/rake
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
#
|
5
|
+
# This file was generated by Bundler.
|
6
|
+
#
|
7
|
+
# The application 'rake' is installed as part of a gem, and
|
8
|
+
# this file is here to facilitate running it.
|
9
|
+
#
|
10
|
+
|
11
|
+
require "pathname"
|
12
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
13
|
+
Pathname.new(__FILE__).realpath)
|
14
|
+
|
15
|
+
bundle_binstub = File.expand_path("../bundle", __FILE__)
|
16
|
+
|
17
|
+
if File.file?(bundle_binstub)
|
18
|
+
if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
|
19
|
+
load(bundle_binstub)
|
20
|
+
else
|
21
|
+
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
22
|
+
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
require "rubygems"
|
27
|
+
require "bundler/setup"
|
28
|
+
|
29
|
+
load Gem.bin_path("rake", "rake")
|
data/bin/rspec
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
#
|
5
|
+
# This file was generated by Bundler.
|
6
|
+
#
|
7
|
+
# The application 'rspec' is installed as part of a gem, and
|
8
|
+
# this file is here to facilitate running it.
|
9
|
+
#
|
10
|
+
|
11
|
+
require "pathname"
|
12
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
13
|
+
Pathname.new(__FILE__).realpath)
|
14
|
+
|
15
|
+
bundle_binstub = File.expand_path("../bundle", __FILE__)
|
16
|
+
|
17
|
+
if File.file?(bundle_binstub)
|
18
|
+
if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
|
19
|
+
load(bundle_binstub)
|
20
|
+
else
|
21
|
+
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
22
|
+
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
require "rubygems"
|
27
|
+
require "bundler/setup"
|
28
|
+
|
29
|
+
load Gem.bin_path("rspec-core", "rspec")
|
data/bin/rubocop
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
#
|
5
|
+
# This file was generated by Bundler.
|
6
|
+
#
|
7
|
+
# The application 'rubocop' is installed as part of a gem, and
|
8
|
+
# this file is here to facilitate running it.
|
9
|
+
#
|
10
|
+
|
11
|
+
require "pathname"
|
12
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
13
|
+
Pathname.new(__FILE__).realpath)
|
14
|
+
|
15
|
+
bundle_binstub = File.expand_path("../bundle", __FILE__)
|
16
|
+
|
17
|
+
if File.file?(bundle_binstub)
|
18
|
+
if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
|
19
|
+
load(bundle_binstub)
|
20
|
+
else
|
21
|
+
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
22
|
+
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
require "rubygems"
|
27
|
+
require "bundler/setup"
|
28
|
+
|
29
|
+
load Gem.bin_path("rubocop", "rubocop")
|
data/bin/ruby-parse
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
#
|
5
|
+
# This file was generated by Bundler.
|
6
|
+
#
|
7
|
+
# The application 'ruby-parse' is installed as part of a gem, and
|
8
|
+
# this file is here to facilitate running it.
|
9
|
+
#
|
10
|
+
|
11
|
+
require "pathname"
|
12
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
13
|
+
Pathname.new(__FILE__).realpath)
|
14
|
+
|
15
|
+
bundle_binstub = File.expand_path("../bundle", __FILE__)
|
16
|
+
|
17
|
+
if File.file?(bundle_binstub)
|
18
|
+
if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
|
19
|
+
load(bundle_binstub)
|
20
|
+
else
|
21
|
+
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
22
|
+
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
require "rubygems"
|
27
|
+
require "bundler/setup"
|
28
|
+
|
29
|
+
load Gem.bin_path("parser", "ruby-parse")
|
data/bin/ruby-rewrite
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
#
|
5
|
+
# This file was generated by Bundler.
|
6
|
+
#
|
7
|
+
# The application 'ruby-rewrite' is installed as part of a gem, and
|
8
|
+
# this file is here to facilitate running it.
|
9
|
+
#
|
10
|
+
|
11
|
+
require "pathname"
|
12
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
13
|
+
Pathname.new(__FILE__).realpath)
|
14
|
+
|
15
|
+
bundle_binstub = File.expand_path("../bundle", __FILE__)
|
16
|
+
|
17
|
+
if File.file?(bundle_binstub)
|
18
|
+
if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
|
19
|
+
load(bundle_binstub)
|
20
|
+
else
|
21
|
+
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
22
|
+
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
require "rubygems"
|
27
|
+
require "bundler/setup"
|
28
|
+
|
29
|
+
load Gem.bin_path("parser", "ruby-rewrite")
|
data/bin/yard
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
#
|
5
|
+
# This file was generated by Bundler.
|
6
|
+
#
|
7
|
+
# The application 'yard' is installed as part of a gem, and
|
8
|
+
# this file is here to facilitate running it.
|
9
|
+
#
|
10
|
+
|
11
|
+
require "pathname"
|
12
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
13
|
+
Pathname.new(__FILE__).realpath)
|
14
|
+
|
15
|
+
bundle_binstub = File.expand_path("../bundle", __FILE__)
|
16
|
+
|
17
|
+
if File.file?(bundle_binstub)
|
18
|
+
if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
|
19
|
+
load(bundle_binstub)
|
20
|
+
else
|
21
|
+
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
22
|
+
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
require "rubygems"
|
27
|
+
require "bundler/setup"
|
28
|
+
|
29
|
+
load Gem.bin_path("yard", "yard")
|
data/bin/yardoc
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
#
|
5
|
+
# This file was generated by Bundler.
|
6
|
+
#
|
7
|
+
# The application 'yardoc' is installed as part of a gem, and
|
8
|
+
# this file is here to facilitate running it.
|
9
|
+
#
|
10
|
+
|
11
|
+
require "pathname"
|
12
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
13
|
+
Pathname.new(__FILE__).realpath)
|
14
|
+
|
15
|
+
bundle_binstub = File.expand_path("../bundle", __FILE__)
|
16
|
+
|
17
|
+
if File.file?(bundle_binstub)
|
18
|
+
if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
|
19
|
+
load(bundle_binstub)
|
20
|
+
else
|
21
|
+
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
22
|
+
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
require "rubygems"
|
27
|
+
require "bundler/setup"
|
28
|
+
|
29
|
+
load Gem.bin_path("yard", "yardoc")
|
data/bin/yri
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
#
|
5
|
+
# This file was generated by Bundler.
|
6
|
+
#
|
7
|
+
# The application 'yri' is installed as part of a gem, and
|
8
|
+
# this file is here to facilitate running it.
|
9
|
+
#
|
10
|
+
|
11
|
+
require "pathname"
|
12
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
13
|
+
Pathname.new(__FILE__).realpath)
|
14
|
+
|
15
|
+
bundle_binstub = File.expand_path("../bundle", __FILE__)
|
16
|
+
|
17
|
+
if File.file?(bundle_binstub)
|
18
|
+
if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
|
19
|
+
load(bundle_binstub)
|
20
|
+
else
|
21
|
+
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
22
|
+
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
require "rubygems"
|
27
|
+
require "bundler/setup"
|
28
|
+
|
29
|
+
load Gem.bin_path("yard", "yri")
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "jwt"
|
4
|
+
|
5
|
+
module LiveKit
|
6
|
+
class AccessToken
|
7
|
+
# 6 hours in seconds; how long the access token to the server is good for
|
8
|
+
DEFAULT_TTL = 14_400
|
9
|
+
|
10
|
+
# The signing algorithm used by the {jwt} gem internals
|
11
|
+
SIGNING_ALGORITHM = "HS256"
|
12
|
+
|
13
|
+
attr_accessor :grants, :identity
|
14
|
+
|
15
|
+
def initialize(api_key: nil, api_secret: nil, identity: nil, ttl: DEFAULT_TTL, name: nil, metadata: nil)
|
16
|
+
@api_key = api_key || ENV["LIVEKIT_API_KEY"]
|
17
|
+
@api_secret = api_secret || ENV["LIVEKIT_API_SECRET"]
|
18
|
+
@grants = ClaimGrant.new
|
19
|
+
@grants.name = name
|
20
|
+
@grants.metadata = metadata
|
21
|
+
@identity = identity
|
22
|
+
@ttl = ttl
|
23
|
+
end
|
24
|
+
|
25
|
+
def add_grant(video_grant)
|
26
|
+
if video_grant.is_a?(Hash)
|
27
|
+
video_grant = VideoGrant.from_hash(video_grant)
|
28
|
+
end
|
29
|
+
@grants.video = video_grant
|
30
|
+
end
|
31
|
+
|
32
|
+
def metadata=(participant_md)
|
33
|
+
@grants.metadata = participant_md
|
34
|
+
end
|
35
|
+
|
36
|
+
def name=(participant_name)
|
37
|
+
@grants.name = participant_name
|
38
|
+
end
|
39
|
+
|
40
|
+
def sha256
|
41
|
+
@grants.sha256
|
42
|
+
end
|
43
|
+
|
44
|
+
def sha256=(sha_string)
|
45
|
+
@grants.sha256 = sha_string
|
46
|
+
end
|
47
|
+
|
48
|
+
def to_jwt
|
49
|
+
if @grants.video.nil?
|
50
|
+
raise ArgumentError, "VideoGrant is required"
|
51
|
+
end
|
52
|
+
|
53
|
+
jwt_timestamp = Time.now.to_i
|
54
|
+
payload = {}
|
55
|
+
payload.merge!(@grants.to_hash)
|
56
|
+
payload.merge!({
|
57
|
+
exp: jwt_timestamp + @ttl,
|
58
|
+
nbf: jwt_timestamp - 5,
|
59
|
+
iss: @api_key,
|
60
|
+
sub: @identity,
|
61
|
+
})
|
62
|
+
|
63
|
+
return JWT.encode(payload, @api_secret, SIGNING_ALGORITHM)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module LiveKit
|
2
|
+
# Create authenticated headers when keys are provided
|
3
|
+
module AuthMixin
|
4
|
+
def auth_header(video_grant)
|
5
|
+
headers = {}
|
6
|
+
t = ::LiveKit::AccessToken.new(api_key: @api_key, api_secret: @api_secret)
|
7
|
+
t.add_grant(video_grant)
|
8
|
+
headers["Authorization"] = "Bearer #{t.to_jwt}"
|
9
|
+
headers
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
module LiveKit
|
2
|
+
class ClaimGrant
|
3
|
+
attr_accessor :identity, :name, :metadata, :sha256, :video
|
4
|
+
|
5
|
+
def self.from_hash(hash)
|
6
|
+
return nil if hash.nil?
|
7
|
+
|
8
|
+
claim_grant = ClaimGrant.new
|
9
|
+
claim_grant.identity = hash["sub"]
|
10
|
+
claim_grant.name = hash["name"]
|
11
|
+
claim_grant.metadata = hash["metadata"]
|
12
|
+
claim_grant.sha256 = hash["sha256"]
|
13
|
+
claim_grant.video = VideoGrant.from_hash(hash["video"])
|
14
|
+
return claim_grant
|
15
|
+
end
|
16
|
+
|
17
|
+
def initialize
|
18
|
+
@identity = nil
|
19
|
+
@name = nil
|
20
|
+
@metadata = nil
|
21
|
+
@sha256 = nil
|
22
|
+
@video = nil
|
23
|
+
end
|
24
|
+
|
25
|
+
def to_hash
|
26
|
+
{
|
27
|
+
name: @name,
|
28
|
+
metadata: @metadata,
|
29
|
+
sha256: @sha256,
|
30
|
+
video: @video.to_hash,
|
31
|
+
}
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
class VideoGrant
|
36
|
+
attr_accessor :roomCreate, :roomJoin, :roomList, :roomRecord, :roomAdmin,
|
37
|
+
:room, :canPublish, :canSubscribe, :canPublishData, :hidden, :recorder
|
38
|
+
|
39
|
+
def initialize(
|
40
|
+
# true if can create or delete rooms
|
41
|
+
roomCreate: nil,
|
42
|
+
# true if can join room
|
43
|
+
roomJoin: nil,
|
44
|
+
# true if can list rooms
|
45
|
+
roomList: nil,
|
46
|
+
# true if can record
|
47
|
+
roomRecord: nil,
|
48
|
+
# true if can manage the room
|
49
|
+
roomAdmin: nil,
|
50
|
+
# name of the room for join or admin permissions
|
51
|
+
room: nil,
|
52
|
+
# for join tokens, can participant publish, true by default
|
53
|
+
canPublish: nil,
|
54
|
+
# for join tokens, can participant subscribe, true by default
|
55
|
+
canSubscribe: nil,
|
56
|
+
# for join tokens, can participant publish data messages, true by default
|
57
|
+
canPublishData: nil,
|
58
|
+
# if participant should remain invisible to others
|
59
|
+
hidden: nil,
|
60
|
+
# if participant is recording the room
|
61
|
+
recorder: nil
|
62
|
+
)
|
63
|
+
@roomCreate = roomCreate
|
64
|
+
@roomJoin = roomJoin
|
65
|
+
@roomList = roomList
|
66
|
+
@roomRecord = roomRecord
|
67
|
+
@roomAdmin = roomAdmin
|
68
|
+
@room = room
|
69
|
+
@canPublish = canPublish
|
70
|
+
@canSubscribe = canSubscribe
|
71
|
+
@canPublishData = canPublishData
|
72
|
+
@hidden = hidden
|
73
|
+
@recorder = recorder
|
74
|
+
end
|
75
|
+
|
76
|
+
def self.from_hash(hash)
|
77
|
+
return nil if hash.nil?
|
78
|
+
|
79
|
+
hash = hash.stringify_keys
|
80
|
+
|
81
|
+
VideoGrant.new(
|
82
|
+
roomCreate: hash["roomCreate"],
|
83
|
+
roomJoin: hash["roomJoin"],
|
84
|
+
roomList: hash["roomList"],
|
85
|
+
roomRecord: hash["roomRecord"],
|
86
|
+
roomAdmin: hash["roomAdmin"],
|
87
|
+
room: hash["room"],
|
88
|
+
canPublish: hash["canPublish"],
|
89
|
+
canSubscribe: hash["canSubscribe"],
|
90
|
+
canPublishData: hash["canPublishData"],
|
91
|
+
hidden: hash["hidden"],
|
92
|
+
recorder: hash["recorder"],
|
93
|
+
)
|
94
|
+
end
|
95
|
+
|
96
|
+
def to_hash
|
97
|
+
hash = {}
|
98
|
+
instance_variables.each { |var|
|
99
|
+
val = instance_variable_get(var)
|
100
|
+
if val != nil
|
101
|
+
hash[var.to_s.delete("@")] = val
|
102
|
+
end
|
103
|
+
}
|
104
|
+
hash
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
@@ -0,0 +1,133 @@
|
|
1
|
+
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
2
|
+
# source: livekit_models.proto
|
3
|
+
|
4
|
+
require 'google/protobuf'
|
5
|
+
|
6
|
+
Google::Protobuf::DescriptorPool.generated_pool.build do
|
7
|
+
add_file("livekit_models.proto", :syntax => :proto3) do
|
8
|
+
add_message "livekit.Room" do
|
9
|
+
optional :sid, :string, 1
|
10
|
+
optional :name, :string, 2
|
11
|
+
optional :empty_timeout, :uint32, 3
|
12
|
+
optional :max_participants, :uint32, 4
|
13
|
+
optional :creation_time, :int64, 5
|
14
|
+
optional :turn_password, :string, 6
|
15
|
+
repeated :enabled_codecs, :message, 7, "livekit.Codec"
|
16
|
+
optional :metadata, :string, 8
|
17
|
+
optional :num_participants, :uint32, 9
|
18
|
+
optional :active_recording, :bool, 10
|
19
|
+
end
|
20
|
+
add_message "livekit.Codec" do
|
21
|
+
optional :mime, :string, 1
|
22
|
+
optional :fmtp_line, :string, 2
|
23
|
+
end
|
24
|
+
add_message "livekit.ParticipantInfo" do
|
25
|
+
optional :sid, :string, 1
|
26
|
+
optional :identity, :string, 2
|
27
|
+
optional :state, :enum, 3, "livekit.ParticipantInfo.State"
|
28
|
+
repeated :tracks, :message, 4, "livekit.TrackInfo"
|
29
|
+
optional :metadata, :string, 5
|
30
|
+
optional :joined_at, :int64, 6
|
31
|
+
optional :hidden, :bool, 7
|
32
|
+
optional :recorder, :bool, 8
|
33
|
+
optional :name, :string, 9
|
34
|
+
end
|
35
|
+
add_enum "livekit.ParticipantInfo.State" do
|
36
|
+
value :JOINING, 0
|
37
|
+
value :JOINED, 1
|
38
|
+
value :ACTIVE, 2
|
39
|
+
value :DISCONNECTED, 3
|
40
|
+
end
|
41
|
+
add_message "livekit.TrackInfo" do
|
42
|
+
optional :sid, :string, 1
|
43
|
+
optional :type, :enum, 2, "livekit.TrackType"
|
44
|
+
optional :name, :string, 3
|
45
|
+
optional :muted, :bool, 4
|
46
|
+
optional :width, :uint32, 5
|
47
|
+
optional :height, :uint32, 6
|
48
|
+
optional :simulcast, :bool, 7
|
49
|
+
optional :disable_dtx, :bool, 8
|
50
|
+
optional :source, :enum, 9, "livekit.TrackSource"
|
51
|
+
repeated :layers, :message, 10, "livekit.VideoLayer"
|
52
|
+
optional :mime_type, :string, 11
|
53
|
+
end
|
54
|
+
add_message "livekit.VideoLayer" do
|
55
|
+
optional :quality, :enum, 1, "livekit.VideoQuality"
|
56
|
+
optional :width, :uint32, 2
|
57
|
+
optional :height, :uint32, 3
|
58
|
+
optional :bitrate, :uint32, 4
|
59
|
+
end
|
60
|
+
add_message "livekit.DataPacket" do
|
61
|
+
optional :kind, :enum, 1, "livekit.DataPacket.Kind"
|
62
|
+
oneof :value do
|
63
|
+
optional :user, :message, 2, "livekit.UserPacket"
|
64
|
+
optional :speaker, :message, 3, "livekit.ActiveSpeakerUpdate"
|
65
|
+
end
|
66
|
+
end
|
67
|
+
add_enum "livekit.DataPacket.Kind" do
|
68
|
+
value :RELIABLE, 0
|
69
|
+
value :LOSSY, 1
|
70
|
+
end
|
71
|
+
add_message "livekit.ActiveSpeakerUpdate" do
|
72
|
+
repeated :speakers, :message, 1, "livekit.SpeakerInfo"
|
73
|
+
end
|
74
|
+
add_message "livekit.SpeakerInfo" do
|
75
|
+
optional :sid, :string, 1
|
76
|
+
optional :level, :float, 2
|
77
|
+
optional :active, :bool, 3
|
78
|
+
end
|
79
|
+
add_message "livekit.UserPacket" do
|
80
|
+
optional :participant_sid, :string, 1
|
81
|
+
optional :payload, :bytes, 2
|
82
|
+
repeated :destination_sids, :string, 3
|
83
|
+
end
|
84
|
+
add_message "livekit.ParticipantTracks" do
|
85
|
+
optional :participant_sid, :string, 1
|
86
|
+
repeated :track_sids, :string, 2
|
87
|
+
end
|
88
|
+
add_enum "livekit.TrackType" do
|
89
|
+
value :AUDIO, 0
|
90
|
+
value :VIDEO, 1
|
91
|
+
value :DATA, 2
|
92
|
+
end
|
93
|
+
add_enum "livekit.TrackSource" do
|
94
|
+
value :UNKNOWN, 0
|
95
|
+
value :CAMERA, 1
|
96
|
+
value :MICROPHONE, 2
|
97
|
+
value :SCREEN_SHARE, 3
|
98
|
+
value :SCREEN_SHARE_AUDIO, 4
|
99
|
+
end
|
100
|
+
add_enum "livekit.VideoQuality" do
|
101
|
+
value :LOW, 0
|
102
|
+
value :MEDIUM, 1
|
103
|
+
value :HIGH, 2
|
104
|
+
value :OFF, 3
|
105
|
+
end
|
106
|
+
add_enum "livekit.ConnectionQuality" do
|
107
|
+
value :POOR, 0
|
108
|
+
value :GOOD, 1
|
109
|
+
value :EXCELLENT, 2
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
module LiveKit
|
115
|
+
module Proto
|
116
|
+
Room = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("livekit.Room").msgclass
|
117
|
+
Codec = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("livekit.Codec").msgclass
|
118
|
+
ParticipantInfo = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("livekit.ParticipantInfo").msgclass
|
119
|
+
ParticipantInfo::State = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("livekit.ParticipantInfo.State").enummodule
|
120
|
+
TrackInfo = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("livekit.TrackInfo").msgclass
|
121
|
+
VideoLayer = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("livekit.VideoLayer").msgclass
|
122
|
+
DataPacket = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("livekit.DataPacket").msgclass
|
123
|
+
DataPacket::Kind = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("livekit.DataPacket.Kind").enummodule
|
124
|
+
ActiveSpeakerUpdate = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("livekit.ActiveSpeakerUpdate").msgclass
|
125
|
+
SpeakerInfo = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("livekit.SpeakerInfo").msgclass
|
126
|
+
UserPacket = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("livekit.UserPacket").msgclass
|
127
|
+
ParticipantTracks = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("livekit.ParticipantTracks").msgclass
|
128
|
+
TrackType = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("livekit.TrackType").enummodule
|
129
|
+
TrackSource = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("livekit.TrackSource").enummodule
|
130
|
+
VideoQuality = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("livekit.VideoQuality").enummodule
|
131
|
+
ConnectionQuality = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("livekit.ConnectionQuality").enummodule
|
132
|
+
end
|
133
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
2
|
+
# source: livekit_recording.proto
|
3
|
+
|
4
|
+
require 'google/protobuf'
|
5
|
+
|
6
|
+
require 'google/protobuf/empty_pb'
|
7
|
+
|
8
|
+
Google::Protobuf::DescriptorPool.generated_pool.build do
|
9
|
+
add_file("livekit_recording.proto", :syntax => :proto3) do
|
10
|
+
add_message "livekit.StartRecordingRequest" do
|
11
|
+
optional :options, :message, 5, "livekit.RecordingOptions"
|
12
|
+
oneof :input do
|
13
|
+
optional :url, :string, 1
|
14
|
+
optional :template, :message, 2, "livekit.RecordingTemplate"
|
15
|
+
end
|
16
|
+
oneof :output do
|
17
|
+
optional :rtmp, :message, 3, "livekit.RtmpOutput"
|
18
|
+
optional :filepath, :string, 4
|
19
|
+
end
|
20
|
+
end
|
21
|
+
add_message "livekit.RecordingTemplate" do
|
22
|
+
optional :layout, :string, 1
|
23
|
+
optional :room_name, :string, 2
|
24
|
+
optional :base_url, :string, 3
|
25
|
+
end
|
26
|
+
add_message "livekit.RtmpOutput" do
|
27
|
+
repeated :urls, :string, 1
|
28
|
+
end
|
29
|
+
add_message "livekit.RecordingOptions" do
|
30
|
+
optional :preset, :enum, 1, "livekit.RecordingPreset"
|
31
|
+
optional :width, :int32, 2
|
32
|
+
optional :height, :int32, 3
|
33
|
+
optional :depth, :int32, 4
|
34
|
+
optional :framerate, :int32, 5
|
35
|
+
optional :audio_bitrate, :int32, 6
|
36
|
+
optional :audio_frequency, :int32, 7
|
37
|
+
optional :video_bitrate, :int32, 8
|
38
|
+
optional :profile, :string, 9
|
39
|
+
end
|
40
|
+
add_message "livekit.StartRecordingResponse" do
|
41
|
+
optional :recording_id, :string, 1
|
42
|
+
end
|
43
|
+
add_message "livekit.AddOutputRequest" do
|
44
|
+
optional :recording_id, :string, 1
|
45
|
+
optional :rtmp_url, :string, 2
|
46
|
+
end
|
47
|
+
add_message "livekit.RemoveOutputRequest" do
|
48
|
+
optional :recording_id, :string, 1
|
49
|
+
optional :rtmp_url, :string, 2
|
50
|
+
end
|
51
|
+
add_message "livekit.EndRecordingRequest" do
|
52
|
+
optional :recording_id, :string, 1
|
53
|
+
end
|
54
|
+
add_message "livekit.RecordingInfo" do
|
55
|
+
optional :id, :string, 1
|
56
|
+
optional :room_name, :string, 2
|
57
|
+
optional :active, :bool, 3
|
58
|
+
optional :error, :string, 4
|
59
|
+
optional :file, :message, 5, "livekit.FileResult"
|
60
|
+
repeated :rtmp, :message, 6, "livekit.RtmpResult"
|
61
|
+
end
|
62
|
+
add_message "livekit.FileResult" do
|
63
|
+
optional :download_url, :string, 1
|
64
|
+
optional :duration, :int64, 2
|
65
|
+
end
|
66
|
+
add_message "livekit.RtmpResult" do
|
67
|
+
optional :stream_url, :string, 1
|
68
|
+
optional :duration, :int64, 2
|
69
|
+
end
|
70
|
+
add_enum "livekit.RecordingPreset" do
|
71
|
+
value :NONE, 0
|
72
|
+
value :HD_30, 1
|
73
|
+
value :HD_60, 2
|
74
|
+
value :FULL_HD_30, 3
|
75
|
+
value :FULL_HD_60, 4
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
module LiveKit
|
81
|
+
module Proto
|
82
|
+
StartRecordingRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("livekit.StartRecordingRequest").msgclass
|
83
|
+
RecordingTemplate = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("livekit.RecordingTemplate").msgclass
|
84
|
+
RtmpOutput = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("livekit.RtmpOutput").msgclass
|
85
|
+
RecordingOptions = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("livekit.RecordingOptions").msgclass
|
86
|
+
StartRecordingResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("livekit.StartRecordingResponse").msgclass
|
87
|
+
AddOutputRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("livekit.AddOutputRequest").msgclass
|
88
|
+
RemoveOutputRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("livekit.RemoveOutputRequest").msgclass
|
89
|
+
EndRecordingRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("livekit.EndRecordingRequest").msgclass
|
90
|
+
RecordingInfo = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("livekit.RecordingInfo").msgclass
|
91
|
+
FileResult = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("livekit.FileResult").msgclass
|
92
|
+
RtmpResult = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("livekit.RtmpResult").msgclass
|
93
|
+
RecordingPreset = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("livekit.RecordingPreset").enummodule
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# Code generated by protoc-gen-twirp_ruby 1.9.0, DO NOT EDIT.
|
2
|
+
require 'twirp'
|
3
|
+
require_relative 'livekit_recording_pb.rb'
|
4
|
+
|
5
|
+
module LiveKit
|
6
|
+
module Proto
|
7
|
+
class RecordingServiceService < Twirp::Service
|
8
|
+
package 'livekit'
|
9
|
+
service 'RecordingService'
|
10
|
+
rpc :StartRecording, StartRecordingRequest, StartRecordingResponse, :ruby_method => :start_recording
|
11
|
+
rpc :AddOutput, AddOutputRequest, Google::Protobuf::Empty, :ruby_method => :add_output
|
12
|
+
rpc :RemoveOutput, RemoveOutputRequest, Google::Protobuf::Empty, :ruby_method => :remove_output
|
13
|
+
rpc :EndRecording, EndRecordingRequest, Google::Protobuf::Empty, :ruby_method => :end_recording
|
14
|
+
end
|
15
|
+
|
16
|
+
class RecordingServiceClient < Twirp::Client
|
17
|
+
client_for RecordingServiceService
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|