MediaChannelHandlers

public final class MediaChannelHandlers

メディアチャネルのイベントハンドラです。

イベントハンドラのプロパティの get / set は、プロパティごとの HandlerStorage が持つ NSLock で 排他します。 利用する任意の executor からの設定と、配送する executor からの読み取りが並行しても データ競合しません。配送側は lock を解放してから取得済みの closure を呼ぶため、closure の 中から別の handler を設定しても deadlock しません。設定と配送が競合した場合にどちらの closure が 呼ばれるかは、lock の取得順で決まります (設定が次の配送から反映されるという契約は変わりません)。

呼び出し元のスレッドは保証されない。UI 更新や共有状態の変更は main queue / main actor へ 束ねること。

配送のたびにプロパティを読むため、接続の途中で設定を変更しても次の配送から反映される (プロパティごとの storage が排他するのは読み書きだけであり、配送側は lock を解放してから 取得済みの closure を呼ぶ)。

Swift 6 言語モードで @MainActor の文脈からハンドラーを設定する場合は、クロージャに @Sendable を付けるか nonisolated な関数へ処理を分離して隔離を外す。MediaChannel / MediaStream / Signaling は Sendable ではないため、main actor へ渡す場合は nonisolated(unsafe) let で運び、Task { @MainActor in ... } で main actor 上へ移す。

イベントを actor / Task から購読する場合は MediaChannel.subscribeEvents(bufferingPolicy:) を使う。新しい購読 API は、この handler と 同じ配送点から対応するイベントを配送する。

  • 接続成功時に呼ばれるクロージャー

    Declaration

    Swift

    public var onConnect: ((Error?) -> Void)? { get set }
  • 接続解除時に呼ばれるクロージャー

    Declaration

    Swift

    @available(*, deprecated, message: "onDisconnect: ((SoraCloseEvent﹚ -> Void﹚? に移行してください。onDisconnectLegacy: ((Error?﹚ -> Void﹚? は、2027 年中に削除予定です。")
    public var onDisconnectLegacy: ((Error?) -> Void)? { get set }
  • 接続解除時に呼ばれるクロージャー

    Declaration

    Swift

    public var onDisconnect: ((SoraCloseEvent) -> Void)? { get set }
  • ストリームが追加されたときに呼ばれるクロージャー

    Declaration

    Swift

    public var onAddStream: ((MediaStream) -> Void)? { get set }
  • ストリームが除去されたときに呼ばれるクロージャー

    Declaration

    Swift

    public var onRemoveStream: ((MediaStream) -> Void)? { get set }
  • シグナリング受信時に呼ばれるクロージャー。 引数の String には、受信したシグナリングメッセージの JSON 文字列が渡されます。

    Declaration

    Swift

    public var onReceiveSignalingJSON: ((String) -> Void)? { get set }
  • シグナリング受信時に呼ばれるクロージャー

    Declaration

    Swift

    @available(*, deprecated, message: "JSON 文字列を受け取る onReceiveSignalingJSON へ移行してください。")
    public var onReceiveSignaling: ((Signaling) -> Void)? { get set }
  • メッセージング用 DataChannel がすべてクライアント側で OPEN になったタイミングで呼ばれるクロージャー。 メッセージング用ラベル(offer の data_channels の # 始まり)が存在しない場合は発火しない。 この時点ではまだ type: switched を受信していない場合があり、 その場合 sendMessage は “DataChannel is not open yet” エラーを返す。 呼び出し元のスレッドは保証されないため、必要に応じて main キューに束ねること。

    Declaration

    Swift

    public var onDataChannel: ((MediaChannel) -> Void)? { get set }
  • DataChannel がクライアント側で OPEN になったタイミングで、ラベルごとに 1 回呼ばれるクロージャー。 クライアント側で OPEN になったすべての DataChannel(# 始まりのラベルに限定しない)が対象。 呼び出し元のスレッドは保証されないため、必要に応じて main キューに束ねること。

    Declaration

    Swift

    public var onDataChannelOpened: ((MediaChannel, String) -> Void)? { get set }
  • DataChannel のメッセージ受信時に呼ばれるクロージャー

    Declaration

    Swift

    public var onDataChannelMessage: ((MediaChannel, String, Data) -> Void)? { get set }
  • 初期化します。

    Declaration

    Swift

    public init()