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()
View on GitHub
Install in Dash