livekit-server-sdk 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +12 -0
  3. data/.github/workflows/test.yml +25 -0
  4. data/.gitignore +12 -0
  5. data/.gitmodules +3 -0
  6. data/.rspec +3 -0
  7. data/.rubocop.yml +16 -0
  8. data/.rubocop_todo.yml +22 -0
  9. data/.ruby-version +1 -0
  10. data/.tool-versions +3 -0
  11. data/CHANGELOG.md +5 -0
  12. data/CODE_OF_CONDUCT.md +84 -0
  13. data/Gemfile +17 -0
  14. data/Gemfile.lock +103 -0
  15. data/LICENSE.txt +21 -0
  16. data/README.md +45 -0
  17. data/Rakefile +19 -0
  18. data/bin/bootstrap.sh +5 -0
  19. data/bin/bundle +114 -0
  20. data/bin/coderay +29 -0
  21. data/bin/console +8 -0
  22. data/bin/htmldiff +29 -0
  23. data/bin/ldiff +29 -0
  24. data/bin/pry +29 -0
  25. data/bin/rake +29 -0
  26. data/bin/rspec +29 -0
  27. data/bin/rubocop +29 -0
  28. data/bin/ruby-parse +29 -0
  29. data/bin/ruby-rewrite +29 -0
  30. data/bin/yard +29 -0
  31. data/bin/yardoc +29 -0
  32. data/bin/yri +29 -0
  33. data/lib/livekit/access_token.rb +66 -0
  34. data/lib/livekit/auth_mixin.rb +12 -0
  35. data/lib/livekit/grants.rb +107 -0
  36. data/lib/livekit/proto/livekit_models_pb.rb +133 -0
  37. data/lib/livekit/proto/livekit_models_twirp.rb +8 -0
  38. data/lib/livekit/proto/livekit_recording_pb.rb +95 -0
  39. data/lib/livekit/proto/livekit_recording_twirp.rb +20 -0
  40. data/lib/livekit/proto/livekit_room_pb.rb +105 -0
  41. data/lib/livekit/proto/livekit_room_twirp.rb +27 -0
  42. data/lib/livekit/proto/livekit_webhook_pb.rb +26 -0
  43. data/lib/livekit/proto/livekit_webhook_twirp.rb +8 -0
  44. data/lib/livekit/room_service_client.rb +128 -0
  45. data/lib/livekit/token_verifier.rb +21 -0
  46. data/lib/livekit/utils.rb +29 -0
  47. data/lib/livekit/version.rb +5 -0
  48. data/lib/livekit.rb +12 -0
  49. data/livekit_server_sdk.gemspec +35 -0
  50. metadata +135 -0
@@ -0,0 +1,105 @@
1
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
2
+ # source: livekit_room.proto
3
+
4
+ require 'google/protobuf'
5
+
6
+ require 'livekit_models_pb'
7
+
8
+ Google::Protobuf::DescriptorPool.generated_pool.build do
9
+ add_file("livekit_room.proto", :syntax => :proto3) do
10
+ add_message "livekit.CreateRoomRequest" do
11
+ optional :name, :string, 1
12
+ optional :empty_timeout, :uint32, 2
13
+ optional :max_participants, :uint32, 3
14
+ optional :node_id, :string, 4
15
+ optional :metadata, :string, 5
16
+ end
17
+ add_message "livekit.ListRoomsRequest" do
18
+ repeated :names, :string, 1
19
+ end
20
+ add_message "livekit.ListRoomsResponse" do
21
+ repeated :rooms, :message, 1, "livekit.Room"
22
+ end
23
+ add_message "livekit.DeleteRoomRequest" do
24
+ optional :room, :string, 1
25
+ end
26
+ add_message "livekit.DeleteRoomResponse" do
27
+ end
28
+ add_message "livekit.ListParticipantsRequest" do
29
+ optional :room, :string, 1
30
+ end
31
+ add_message "livekit.ListParticipantsResponse" do
32
+ repeated :participants, :message, 1, "livekit.ParticipantInfo"
33
+ end
34
+ add_message "livekit.RoomParticipantIdentity" do
35
+ optional :room, :string, 1
36
+ optional :identity, :string, 2
37
+ end
38
+ add_message "livekit.RemoveParticipantResponse" do
39
+ end
40
+ add_message "livekit.MuteRoomTrackRequest" do
41
+ optional :room, :string, 1
42
+ optional :identity, :string, 2
43
+ optional :track_sid, :string, 3
44
+ optional :muted, :bool, 4
45
+ end
46
+ add_message "livekit.MuteRoomTrackResponse" do
47
+ optional :track, :message, 1, "livekit.TrackInfo"
48
+ end
49
+ add_message "livekit.ParticipantPermission" do
50
+ optional :can_subscribe, :bool, 1
51
+ optional :can_publish, :bool, 2
52
+ optional :can_publish_data, :bool, 3
53
+ end
54
+ add_message "livekit.UpdateParticipantRequest" do
55
+ optional :room, :string, 1
56
+ optional :identity, :string, 2
57
+ optional :metadata, :string, 3
58
+ optional :permission, :message, 4, "livekit.ParticipantPermission"
59
+ end
60
+ add_message "livekit.UpdateSubscriptionsRequest" do
61
+ optional :room, :string, 1
62
+ optional :identity, :string, 2
63
+ repeated :track_sids, :string, 3
64
+ optional :subscribe, :bool, 4
65
+ repeated :participant_tracks, :message, 5, "livekit.ParticipantTracks"
66
+ end
67
+ add_message "livekit.UpdateSubscriptionsResponse" do
68
+ end
69
+ add_message "livekit.SendDataRequest" do
70
+ optional :room, :string, 1
71
+ optional :data, :bytes, 2
72
+ optional :kind, :enum, 3, "livekit.DataPacket.Kind"
73
+ repeated :destination_sids, :string, 4
74
+ end
75
+ add_message "livekit.SendDataResponse" do
76
+ end
77
+ add_message "livekit.UpdateRoomMetadataRequest" do
78
+ optional :room, :string, 1
79
+ optional :metadata, :string, 2
80
+ end
81
+ end
82
+ end
83
+
84
+ module LiveKit
85
+ module Proto
86
+ CreateRoomRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("livekit.CreateRoomRequest").msgclass
87
+ ListRoomsRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("livekit.ListRoomsRequest").msgclass
88
+ ListRoomsResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("livekit.ListRoomsResponse").msgclass
89
+ DeleteRoomRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("livekit.DeleteRoomRequest").msgclass
90
+ DeleteRoomResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("livekit.DeleteRoomResponse").msgclass
91
+ ListParticipantsRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("livekit.ListParticipantsRequest").msgclass
92
+ ListParticipantsResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("livekit.ListParticipantsResponse").msgclass
93
+ RoomParticipantIdentity = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("livekit.RoomParticipantIdentity").msgclass
94
+ RemoveParticipantResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("livekit.RemoveParticipantResponse").msgclass
95
+ MuteRoomTrackRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("livekit.MuteRoomTrackRequest").msgclass
96
+ MuteRoomTrackResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("livekit.MuteRoomTrackResponse").msgclass
97
+ ParticipantPermission = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("livekit.ParticipantPermission").msgclass
98
+ UpdateParticipantRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("livekit.UpdateParticipantRequest").msgclass
99
+ UpdateSubscriptionsRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("livekit.UpdateSubscriptionsRequest").msgclass
100
+ UpdateSubscriptionsResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("livekit.UpdateSubscriptionsResponse").msgclass
101
+ SendDataRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("livekit.SendDataRequest").msgclass
102
+ SendDataResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("livekit.SendDataResponse").msgclass
103
+ UpdateRoomMetadataRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("livekit.UpdateRoomMetadataRequest").msgclass
104
+ end
105
+ end
@@ -0,0 +1,27 @@
1
+ # Code generated by protoc-gen-twirp_ruby 1.9.0, DO NOT EDIT.
2
+ require 'twirp'
3
+ require_relative 'livekit_room_pb.rb'
4
+
5
+ module LiveKit
6
+ module Proto
7
+ class RoomServiceService < Twirp::Service
8
+ package 'livekit'
9
+ service 'RoomService'
10
+ rpc :CreateRoom, CreateRoomRequest, Room, :ruby_method => :create_room
11
+ rpc :ListRooms, ListRoomsRequest, ListRoomsResponse, :ruby_method => :list_rooms
12
+ rpc :DeleteRoom, DeleteRoomRequest, DeleteRoomResponse, :ruby_method => :delete_room
13
+ rpc :ListParticipants, ListParticipantsRequest, ListParticipantsResponse, :ruby_method => :list_participants
14
+ rpc :GetParticipant, RoomParticipantIdentity, ParticipantInfo, :ruby_method => :get_participant
15
+ rpc :RemoveParticipant, RoomParticipantIdentity, RemoveParticipantResponse, :ruby_method => :remove_participant
16
+ rpc :MutePublishedTrack, MuteRoomTrackRequest, MuteRoomTrackResponse, :ruby_method => :mute_published_track
17
+ rpc :UpdateParticipant, UpdateParticipantRequest, ParticipantInfo, :ruby_method => :update_participant
18
+ rpc :UpdateSubscriptions, UpdateSubscriptionsRequest, UpdateSubscriptionsResponse, :ruby_method => :update_subscriptions
19
+ rpc :SendData, SendDataRequest, SendDataResponse, :ruby_method => :send_data
20
+ rpc :UpdateRoomMetadata, UpdateRoomMetadataRequest, Room, :ruby_method => :update_room_metadata
21
+ end
22
+
23
+ class RoomServiceClient < Twirp::Client
24
+ client_for RoomServiceService
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,26 @@
1
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
2
+ # source: livekit_webhook.proto
3
+
4
+ require 'google/protobuf'
5
+
6
+ require 'livekit_models_pb'
7
+ require 'livekit_recording_pb'
8
+
9
+ Google::Protobuf::DescriptorPool.generated_pool.build do
10
+ add_file("livekit_webhook.proto", :syntax => :proto3) do
11
+ add_message "livekit.WebhookEvent" do
12
+ optional :event, :string, 1
13
+ optional :room, :message, 2, "livekit.Room"
14
+ optional :participant, :message, 3, "livekit.ParticipantInfo"
15
+ optional :recording_info, :message, 5, "livekit.RecordingInfo"
16
+ optional :id, :string, 6
17
+ optional :created_at, :int64, 7
18
+ end
19
+ end
20
+ end
21
+
22
+ module LiveKit
23
+ module Proto
24
+ WebhookEvent = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("livekit.WebhookEvent").msgclass
25
+ end
26
+ end
@@ -0,0 +1,8 @@
1
+ # Code generated by protoc-gen-twirp_ruby 1.9.0, DO NOT EDIT.
2
+ require 'twirp'
3
+ require_relative 'livekit_webhook_pb.rb'
4
+
5
+ module LiveKit
6
+ module Proto
7
+ end
8
+ end
@@ -0,0 +1,128 @@
1
+ require "livekit/proto/livekit_room_twirp"
2
+ require "livekit/auth_mixin"
3
+
4
+ module LiveKit
5
+ class RoomServiceClient < Twirp::Client
6
+ client_for Proto::RoomServiceService
7
+ include AuthMixin
8
+ attr_accessor :api_key, :api_secret
9
+
10
+ def initialize(base_url, api_key: nil, api_secret: nil)
11
+ super(File.join(base_url, "/twirp"))
12
+ @api_key = api_key
13
+ @api_secret = api_secret
14
+ end
15
+
16
+ # creates a new room with name
17
+ def create_room(name, empty_timeout: nil, max_participants: nil)
18
+ self.rpc(
19
+ :CreateRoom,
20
+ Proto::ListRoomsRequest(name: name, empty_timeout: empty_timeout, max_participants: max_participants),
21
+ headers: auth_header(roomCreate: true),
22
+ )
23
+ end
24
+
25
+ # Lists rooms, when names is set, only list matching rooms
26
+ def list_rooms(names: nil)
27
+ self.rpc(
28
+ :ListRooms,
29
+ Proto::ListRoomsRequest.new(names: names),
30
+ headers: auth_header(roomList: true),
31
+ )
32
+ end
33
+
34
+ def delete_room(room:)
35
+ self.rpc(
36
+ :DeleteRoom,
37
+ Proto::DeleteRoomRequest.new(room: room),
38
+ headers: auth_header(roomCreate: true),
39
+ )
40
+ end
41
+
42
+ def update_room_metadata(room:, metadata:)
43
+ self.rpc(
44
+ :UpdateRoomMetadata,
45
+ Proto::UpdateRoomMetadataRequest.new(room: room, metadata: metadata),
46
+ headers: auth_header(roomAdmin: true, room: room),
47
+ )
48
+ end
49
+
50
+ def list_participants(room:)
51
+ self.rpc(
52
+ :ListParticipants,
53
+ Proto::ListParticipantsRequest.new(room: room),
54
+ headers: auth_header(roomAdmin: true, room: room),
55
+ )
56
+ end
57
+
58
+ def get_participant(room:, identity:)
59
+ self.rpc(
60
+ :GetParticipant,
61
+ Proto::RoomParticipantIdentity.new(room: room, identity: identity),
62
+ headers: auth_header(roomAdmin: true, room: room),
63
+ )
64
+ end
65
+
66
+ def remove_participant(room:, identity:)
67
+ self.rpc(
68
+ :RemoveParticipant,
69
+ Proto::RoomParticipantIdentity.new(room: room, identity: identity),
70
+ headers: auth_header(roomAdmin: true, room: room),
71
+ )
72
+ end
73
+
74
+ def mute_published_track(room:, identity:, track_sid:, muted:)
75
+ self.rpc(
76
+ :MutePublishedTrack,
77
+ Proto::MuteRoomTrackRequest.new(
78
+ room: room,
79
+ identity: identity,
80
+ track_sid: track_sid,
81
+ muted: muted,
82
+ ),
83
+ headers: auth_header(roomAdmin: true, room: room),
84
+ )
85
+ end
86
+
87
+ def update_participant(room:, identity:, metadata: nil, permission: nil)
88
+ req = Proto::UpdateParticipantRequest.new(room: room, identity: identity)
89
+ if metadata
90
+ req.metadata = metadata
91
+ end
92
+ if permission
93
+ req.permission = permission
94
+ end
95
+ self.rpc(
96
+ :UpdateParticipant,
97
+ req,
98
+ headers: auth_header(roomAdmin: true, room: room),
99
+ )
100
+ end
101
+
102
+ def update_subscriptions(room:, identity:, track_sids:, subscribe:)
103
+ self.rpc(
104
+ :UpdateSubscriptions,
105
+ Proto::UpdateSubscriptionsRequest.new(
106
+ room: room,
107
+ identity: identity,
108
+ track_sids: track_sids,
109
+ subscribe: subscribe,
110
+ ),
111
+ headers: auth_header(roomAdmin: true, room: room),
112
+ )
113
+ end
114
+
115
+ def send_data(room:, data:, kind:, destination_sids: [])
116
+ self.rpc(
117
+ :SendData,
118
+ Proto::SendDataRequest.new(
119
+ room: room,
120
+ data: data,
121
+ kind: kind,
122
+ destination_sids: destination_sids,
123
+ ),
124
+ headers: auth_header(roomAdmin: true, room: room),
125
+ )
126
+ end
127
+ end
128
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "jwt"
4
+
5
+ module LiveKit
6
+ class TokenVerifier
7
+ def initialize(api_key: nil, api_secret: nil)
8
+ @api_key = api_key
9
+ @api_secret = api_secret
10
+ end
11
+
12
+ def verify(token)
13
+ decoded_token = JWT.decode(token, @api_secret, true, algorithm: AccessToken::SIGNING_ALGORITHM)
14
+ decoded = decoded_token.first
15
+ if decoded["iss"] != @api_key
16
+ raise "Invalid issuer"
17
+ end
18
+ ClaimGrant.from_hash(decoded)
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,29 @@
1
+ class ::Hash
2
+ # via https://stackoverflow.com/a/25835016/2257038
3
+ def stringify_keys
4
+ h = self.map do |k, v|
5
+ v_str = if v.instance_of? Hash
6
+ v.stringify_keys
7
+ else
8
+ v
9
+ end
10
+
11
+ [k.to_s, v_str]
12
+ end
13
+ Hash[h]
14
+ end
15
+
16
+ # via https://stackoverflow.com/a/25835016/2257038
17
+ def symbol_keys
18
+ h = self.map do |k, v|
19
+ v_sym = if v.instance_of? Hash
20
+ v.symbol_keys
21
+ else
22
+ v
23
+ end
24
+
25
+ [k.to_sym, v_sym]
26
+ end
27
+ Hash[h]
28
+ end
29
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LiveKit
4
+ VERSION = '0.2.0'
5
+ end
data/lib/livekit.rb ADDED
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "livekit/access_token"
4
+ require "livekit/grants"
5
+ require "livekit/token_verifier"
6
+ require "livekit/utils"
7
+ require "livekit/version"
8
+
9
+ # required since generated protobufs does use `require` instead of `require_relative`
10
+ FOLDER = Pathname.new(File.expand_path("lib/livekit/proto"))
11
+ $LOAD_PATH.unshift(FOLDER.to_s)
12
+ require "livekit/room_service_client"
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "lib/livekit/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "livekit-server-sdk"
7
+ spec.version = LiveKit::VERSION
8
+ spec.authors = ["Omri Gabay", "David Zhao"]
9
+ spec.email = ["omri@omrigabay.me", "dz@livekit.io"]
10
+
11
+ spec.summary = "LiveKit Server SDK for Ruby"
12
+ spec.homepage = "https://livekit.io"
13
+ spec.license = "MIT"
14
+ spec.required_ruby_version = ">= 2.6.0"
15
+
16
+ # spec.metadata["homepage_uri"] = spec.homepage
17
+ # spec.metadata["source_code_uri"] = "TODO: Put your gem's public repo URL here."
18
+ # spec.metadata["changelog_uri"] = "TODO: Put your gem's CHANGELOG.md URL here."
19
+
20
+ # Specify which files should be added to the gem when it is released.
21
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
22
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
23
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{\A(?:test|spec|features)/}) }
24
+ end
25
+ spec.bindir = "exe"
26
+ spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
27
+ spec.require_paths = ["lib"]
28
+
29
+ spec.add_dependency "protobuf", "~> 3.10.5"
30
+ spec.add_dependency "jwt", "~> 2.2.3"
31
+ spec.add_dependency "twirp", "~> 1.9.0"
32
+
33
+ # For more information and examples about making a new gem, checkout our
34
+ # guide at: https://bundler.io/guides/creating_gem.html
35
+ end
metadata ADDED
@@ -0,0 +1,135 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: livekit-server-sdk
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ platform: ruby
6
+ authors:
7
+ - Omri Gabay
8
+ - David Zhao
9
+ autorequire:
10
+ bindir: exe
11
+ cert_chain: []
12
+ date: 2022-01-09 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: protobuf
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: 3.10.5
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: 3.10.5
28
+ - !ruby/object:Gem::Dependency
29
+ name: jwt
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: 2.2.3
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: 2.2.3
42
+ - !ruby/object:Gem::Dependency
43
+ name: twirp
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: 1.9.0
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: 1.9.0
56
+ description:
57
+ email:
58
+ - omri@omrigabay.me
59
+ - dz@livekit.io
60
+ executables: []
61
+ extensions: []
62
+ extra_rdoc_files: []
63
+ files:
64
+ - ".editorconfig"
65
+ - ".github/workflows/test.yml"
66
+ - ".gitignore"
67
+ - ".gitmodules"
68
+ - ".rspec"
69
+ - ".rubocop.yml"
70
+ - ".rubocop_todo.yml"
71
+ - ".ruby-version"
72
+ - ".tool-versions"
73
+ - CHANGELOG.md
74
+ - CODE_OF_CONDUCT.md
75
+ - Gemfile
76
+ - Gemfile.lock
77
+ - LICENSE.txt
78
+ - README.md
79
+ - Rakefile
80
+ - bin/bootstrap.sh
81
+ - bin/bundle
82
+ - bin/coderay
83
+ - bin/console
84
+ - bin/htmldiff
85
+ - bin/ldiff
86
+ - bin/pry
87
+ - bin/rake
88
+ - bin/rspec
89
+ - bin/rubocop
90
+ - bin/ruby-parse
91
+ - bin/ruby-rewrite
92
+ - bin/yard
93
+ - bin/yardoc
94
+ - bin/yri
95
+ - lib/livekit.rb
96
+ - lib/livekit/access_token.rb
97
+ - lib/livekit/auth_mixin.rb
98
+ - lib/livekit/grants.rb
99
+ - lib/livekit/proto/livekit_models_pb.rb
100
+ - lib/livekit/proto/livekit_models_twirp.rb
101
+ - lib/livekit/proto/livekit_recording_pb.rb
102
+ - lib/livekit/proto/livekit_recording_twirp.rb
103
+ - lib/livekit/proto/livekit_room_pb.rb
104
+ - lib/livekit/proto/livekit_room_twirp.rb
105
+ - lib/livekit/proto/livekit_webhook_pb.rb
106
+ - lib/livekit/proto/livekit_webhook_twirp.rb
107
+ - lib/livekit/room_service_client.rb
108
+ - lib/livekit/token_verifier.rb
109
+ - lib/livekit/utils.rb
110
+ - lib/livekit/version.rb
111
+ - livekit_server_sdk.gemspec
112
+ homepage: https://livekit.io
113
+ licenses:
114
+ - MIT
115
+ metadata: {}
116
+ post_install_message:
117
+ rdoc_options: []
118
+ require_paths:
119
+ - lib
120
+ required_ruby_version: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: 2.6.0
125
+ required_rubygems_version: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - ">="
128
+ - !ruby/object:Gem::Version
129
+ version: '0'
130
+ requirements: []
131
+ rubygems_version: 3.0.3.1
132
+ signing_key:
133
+ specification_version: 4
134
+ summary: LiveKit Server SDK for Ruby
135
+ test_files: []