Skip to content

Commit 31769e0

Browse files
committed
コメントを拡充する
1 parent 6c49ff1 commit 31769e0

File tree

3 files changed

+141
-15
lines changed

3 files changed

+141
-15
lines changed

Sora/MediaChannel.swift

Lines changed: 56 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,16 +155,36 @@ public final class MediaChannel {
155155
public private(set) var subscriberCount: Int?
156156

157157
/// RPC を扱うチャネル
158+
/// - Note: RPC が利用不可の場合は nil を返します
158159
public var rpcChannel: RPCChannel? {
159160
peerChannel.rpcChannel
160161
}
161162

162163
/// RPC で利用可能なメソッド一覧
164+
///
165+
/// Sora サーバーから通知された RPC メソッドが列挙型として取得できます。
166+
/// rpc メソッドを呼び出す前に、必要なメソッドがこの一覧に含まれているかを確認することを推奨します。
167+
///
168+
/// - Returns: 利用可能な RPC メソッドの一覧。RPC が初期化されていない場合は空配列を返します
169+
///
170+
/// # 使用例
171+
/// ```swift
172+
/// if mediaChannel.rpcMethods.contains(.requestSimulcastRid) {
173+
/// let result = try await mediaChannel.rpc(
174+
/// method: RequestSimulcastRid.self,
175+
/// params: RequestSimulcastRidParams(rid: "r0")
176+
/// )
177+
/// }
178+
/// ```
163179
public var rpcMethods: [RPCMethod] {
164180
peerChannel.rpcChannel?.allowedMethods.compactMap { RPCMethod(name: $0) } ?? []
165181
}
166182

167-
/// RPC で利用可能なサイマルキャスト rid
183+
/// RPC で利用可能なサイマルキャスト rid の一覧
184+
///
185+
/// Sora サーバーから通知された、RPC で操作可能なサイマルキャスト rid が取得できます。
186+
///
187+
/// - Returns: 利用可能なサイマルキャスト rid の一覧。RPC が初期化されていない場合は空配列を返します
168188
public var rpcSimulcastRids: [String] {
169189
peerChannel.rpcChannel?.simulcastRpcRids ?? []
170190
}
@@ -244,7 +264,41 @@ public final class MediaChannel {
244264

245265
// MARK: - RPC
246266

247-
/// RPC をジェネリクスで送信する。
267+
/// RPC メソッドを型安全に呼び出します
268+
///
269+
/// このメソッドを使用して、Sora サーバーで定義された RPC メソッドを非同期で実行できます。
270+
/// 呼び出す前に rpcMethods プロパティで該当メソッドが利用可能であることを確認してください。
271+
///
272+
/// - Parameters:
273+
/// - method: 呼び出す RPC メソッドの型 (例: `RequestSimulcastRid.self`)
274+
/// - params: メソッドに渡すパラメータ。型安全に検証されます
275+
/// - isNotificationRequest: `true` の場合、レスポンスを待たずに送信します。デフォルトは `false`
276+
/// - timeout: レスポンスを待つ最大時間(秒)。デフォルトは 5.0 秒
277+
///
278+
/// - Returns: メソッドの実行結果。isNotificationRequest が true の場合は nil を返します
279+
///
280+
/// - Throws: 以下のエラーが発生することがあります
281+
/// - `SoraError.rpcUnavailable`: RPC チャネルが利用不可
282+
/// - `SoraError.rpcMethodNotAllowed`: 指定されたメソッドが利用不可
283+
/// - `SoraError.rpcTimeout`: レスポンスがタイムアウト時間内に返されなかった
284+
/// - `SoraError.rpcEncodingError`: パラメータのエンコーディングに失敗した
285+
/// - `SoraError.rpcDecodingError`: レスポンスのデコーディングに失敗した
286+
///
287+
/// # 使用例
288+
/// ```swift
289+
/// do {
290+
/// let response = try await mediaChannel.rpc(
291+
/// method: RequestSimulcastRid.self,
292+
/// params: RequestSimulcastRidParams(rid: "r0")
293+
/// )
294+
///
295+
/// if let result = response?.result {
296+
/// print("Channel ID: \(result.channelId)")
297+
/// }
298+
/// } catch {
299+
/// print("RPC call failed: \(error)")
300+
/// }
301+
/// ```
248302
public func rpc<M: RPCMethodProtocol>(
249303
method: M.Type,
250304
params: M.Params,

Sora/RPC.swift

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,15 @@ public struct RPCErrorDetail {
4141

4242
/// RPC 成功応答。
4343
public struct RPCResponse<Result> {
44-
public let jsonrpc: String = "2.0"
44+
public let jsonrpc: String
4545
public let id: RPCID
4646
public let result: Result
47+
48+
public init(id: RPCID, result: Result) {
49+
self.jsonrpc = "2.0"
50+
self.id = id
51+
self.result = result
52+
}
4753
}
4854

4955
/// DataChannel 経由の RPC を扱うクラス。
@@ -60,7 +66,8 @@ public final class RPCChannel {
6066
private var nextId: Int = 1
6167
private var pendings: [RPCID: Pending] = [:]
6268

63-
/// Sora から払い出されたメソッド一覧
69+
/// Sora から払い出されたメソッド一覧 (メソッド名の文字列リスト)
70+
/// MediaChannel.rpcMethods で RPCMethod Enum に変換されます
6471
let allowedMethods: [String]
6572
private let allowedMethodNames: Set<String>
6673

Sora/RPCTypes.swift

Lines changed: 76 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,16 @@
11
import Foundation
22

3+
/// RPC メソッドを定義するためのプロトコル
4+
///
5+
/// 新しい RPC メソッドを SDK に追加する場合は、このプロトコルに準拠した型を定義してください。
6+
///
7+
/// - Note: 通常のユーザーは、このプロトコルを直接実装する必要はありません
38
public protocol RPCMethodProtocol {
9+
/// RPC メソッドのパラメータ型
410
associatedtype Params: Encodable
11+
/// RPC メソッドの戻り値型
512
associatedtype Result: Decodable
13+
/// RPC メソッド名 (例: "2025.2.0/RequestSimulcastRid")
614
static var name: String { get }
715
}
816

@@ -143,35 +151,72 @@ public struct ResetSpotlightRidResult: Decodable {
143151
}
144152
}
145153

146-
// NOTE: Sora の RPC メソッドを表す以下の型の命名について
147-
//
148-
// `2025.2.0/RequestSpotlightRid` と `2027.2.0/RequestSpotlightRid` のようにバージョン部分だけ
149-
// 違うメソッド名が増えた場合には、`RequestSimulcastRid_2025_2_0` のようにバージョン名を含む
150-
// 命名規則に移行する予定 (どういう命名規則にするかはそのとき決定する)。
151-
//
152-
// 移行方法
153-
// - 既存で提供している型のエイリアスを新しい命名規則で作成する
154-
// - 既存の型は deprecated にして、バージョン名を含む命名規則を適用した型への移行を促す
155-
// - 新規追加されたメソッドはバージョン名を含む命名規則で追加する
154+
// MARK: - RPC メソッド型の命名規則について
156155

156+
/// # RPC メソッド型の命名規則
157+
///
158+
/// ## 現在の命名規則
159+
/// 現在、RPC メソッド型は `RequestSimulcastRid`、`RequestSpotlightRid` のようにメソッド名のみで命名しています。
160+
/// メソッド名のバージョン情報(例:`2025.2.0`)は、型の `name` プロパティに格納されています。
161+
///
162+
/// ```swift
163+
/// public enum RequestSimulcastRid: RPCMethodProtocol {
164+
/// public static let name = "2025.2.0/RequestSimulcastRid"
165+
/// }
166+
/// ```
167+
///
168+
/// ## 将来の命名規則への移行計画
169+
/// 同じメソッド名でバージョンが異なる場合(例:`2025.2.0/RequestSpotlightRid` と `2027.2.0/RequestSpotlightRid`)が増えた際には、
170+
/// バージョン情報を型名に含める新しい命名規則に移行する予定です。
171+
///
172+
/// ### 新しい命名規則の例
173+
/// ```swift
174+
/// // 新しい命名規則の例(将来のバージョン)
175+
/// public enum RequestSpotlightRid_2025_2_0: RPCMethodProtocol { ... }
176+
/// public enum RequestSpotlightRid_2027_2_0: RPCMethodProtocol { ... }
177+
/// ```
178+
///
179+
/// ## 移行時のアプローチ
180+
/// 1. **既存の型はエイリアスを作成**
181+
/// - 既存の型は新しい命名規則の型のエイリアスとして提供します
182+
/// 2. **deprecated マーク**
183+
/// - 既存の型を `@deprecated` マークし、ユーザーに移行を促します
184+
/// 3. **新規メソッドは新しい命名規則で追加**
185+
/// - 将来追加されるメソッドは新しい命名規則で定義します
186+
///
187+
/// このアプローチにより、既存コードとの互換性を保ちながら、スムーズに移行できるようにしています。
188+
189+
/// サイマルキャスト の rid をリクエストする RPC メソッド
190+
///
191+
/// 視聴するサイマルキャスト映像の解像度を指定する RPC メソッドです。
157192
public enum RequestSimulcastRid: RPCMethodProtocol {
158193
public typealias Params = RequestSimulcastRidParams
159194
public typealias Result = RequestSimulcastRidResult
160195
public static let name = "2025.2.0/RequestSimulcastRid"
161196
}
162197

198+
/// スポットライト rid をリクエストする RPC メソッド
199+
///
200+
/// スポットライト機能で注目する接続を指定する RPC メソッドです。
163201
public enum RequestSpotlightRid: RPCMethodProtocol {
164202
public typealias Params = RequestSpotlightRidParams
165203
public typealias Result = RequestSpotlightRidResult
166204
public static let name = "2025.2.0/RequestSpotlightRid"
167205
}
168206

207+
/// スポットライト rid をリセットする RPC メソッド
208+
///
209+
/// スポットライト機能の設定をリセットする RPC メソッドです。
169210
public enum ResetSpotlightRid: RPCMethodProtocol {
170211
public typealias Params = ResetSpotlightRidParams
171212
public typealias Result = ResetSpotlightRidResult
172213
public static let name = "2025.2.0/ResetSpotlightRid"
173214
}
174215

216+
/// シグナリング通知メタデータを設定する RPC メソッド
217+
///
218+
/// シグナリング通知全体にメタデータを設定する RPC メソッドです。
219+
/// ジェネリック型パラメータで任意の型のメタデータを指定できます。
175220
public enum PutSignalingNotifyMetadata<Metadata: Codable>: RPCMethodProtocol {
176221
public typealias Params = PutSignalingNotifyMetadataParams<Metadata>
177222
public typealias Result = Metadata
@@ -180,6 +225,10 @@ public enum PutSignalingNotifyMetadata<Metadata: Codable>: RPCMethodProtocol {
180225
}
181226
}
182227

228+
/// シグナリング通知メタデータのアイテムを設定する RPC メソッド
229+
///
230+
/// シグナリング通知メタデータの特定キーに値を設定する RPC メソッドです。
231+
/// ジェネリック型パラメータで値の型とレスポンスの型を指定できます。
183232
public enum PutSignalingNotifyMetadataItem<Metadata: Decodable, Value: Encodable>:
184233
RPCMethodProtocol
185234
{
@@ -190,7 +239,21 @@ public enum PutSignalingNotifyMetadataItem<Metadata: Decodable, Value: Encodable
190239
}
191240
}
192241

193-
/// RPC メソッドを表す Enum
242+
/// RPC メソッドを型安全に表現する Enum
243+
///
244+
/// MediaChannel.rpcMethods で利用可能なメソッドをこの型として取得できます。
245+
/// このEnum を使用することで、コンパイル時にメソッド名の妥当性が検証されます。
246+
///
247+
/// # 使用例
248+
/// ```swift
249+
/// if mediaChannel.rpcMethods.contains(.requestSimulcastRid) {
250+
/// let params = RequestSimulcastRidParams(rid: "r0")
251+
/// let response = try await mediaChannel.rpc(
252+
/// method: RequestSimulcastRid.self,
253+
/// params: params
254+
/// )
255+
/// }
256+
/// ```
194257
public enum RPCMethod {
195258
case requestSimulcastRid
196259
case requestSpotlightRid
@@ -207,8 +270,10 @@ public enum RPCMethod {
207270
case .resetSpotlightRid:
208271
return ResetSpotlightRid.name
209272
case .putSignalingNotifyMetadata:
273+
// NOTE: ジェネリック型のメソッド名取得のため、ダミー型引数 <String> を使用
210274
return PutSignalingNotifyMetadata<String>.name
211275
case .putSignalingNotifyMetadataItem:
276+
// NOTE: ジェネリック型のメソッド名取得のため、ダミー型引数 <String, String> を使用
212277
return PutSignalingNotifyMetadataItem<String, String>.name
213278
}
214279
}

0 commit comments

Comments
 (0)