livekit-server-sdk 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: []