開発/設計/議論

議論の目的

  • 制御モジュール
  • コントローラ部
    • 制御モジュールコントロール
    • スクリプト(Router)
      に、どのような機能を持たせるべきかを決定するための場所です。

制御モジュール・コントローラ部の位置付け

制御モジュールの本質

B2BUAにおいて、重要なコアとなる部分です。
B2BUAとして考えるのであれば、これ以外の部分は不要であります!!!

理由

  • 制御モジュール≒UA

であるため、これがあれば、B2BUAとして動作させることが出来るからです。
ただし、この場合は、柔軟性がほとんどなくなる点が、「SIProp」との相違点と なり、他の部分が必要となる理由となります。

コントローラ部の存在理由

下記のような役割を持たせたいために存在しています。

  • 制御モジュールを動的に呼び出す
    • DIのような使い方を想定しています
  • 制御モジュールの処理結果の評価を行う
    • 制御モジュールの制御(コントロール)を行うことを想定しています
      制御モジュールを複数制御するような場合に使用します

「制御モジュールを動的に呼び出す」の概要

例えば、A-UA制御モジュールというものがあり、これに、

A-UA.Call()

という通話用のメソッドがあった場合と仮定します。

そして、A-UAが、Ver.2.0になって、通話機能が変化してしまった場合

A-UA.CallForV2()
A-UA.CallForV1()

というものを用意するようなことを想定します。(別モジュールとして、用意し てもよい。)

このような場合に、スクリプト部で、条件分けをして、メソッドをインジェクシ ョンをさせるために使用します。

例:
if(userAgent == "v1") {
	injection A-UA.CallForV1() in A-UA.Call();
} else if(userAgent == "v2"){
	injection A-UA.CallForV2() in A-UA.Call();
} else {
	injectionList A-UA.CallForV1() in A-UA.Call();
	injectionList A-UA.CallForV2() in A-UA.Call();
}
※最後の「else句」は、1つにインジェクションが絞れない場合を表現しています。

「制御モジュールの処理結果の評価を行う」の概要

上記の「else句」部分のように、制御モジュールが並列起動となった場合、制御 モジュールのコントロールをしなければなりませんので、その機能を提供するた めのものとなります。
そして、この部分は、非常に複雑となるため、スクリプトでは表現しにくい部分 となります。(スレッド動作も必要となるため、JavaScript?では制御しきれませ ん。)

例:
var result = A-UAv1.Call();// A-UAv2.Call()も同様にして扱う。

// B2BUAモード
if(result == "B2BUA") {
	A-UA.Send();

// パケットをスルーするだけモード
} else if(result == "THROW"){
	A-UA.Sleep();

// それ以外。終了させる
} else {
	A-UA.Stop();
}

具体的には、

A-UAコントロール部

というコントロール部があり、その内部で、

A-UAv1制御モジュール
A-UAv2制御モジュール

をコントロールするような構成となります。

制御モジュール・コントローラ部のまとめ

簡単に言うと、一番べた〜と実装した場合が、最初に書いた

制御モジュールのみ

という構成となります。ただし、これでは、柔軟性がほとんど無くなります。
そして、制御モジュールから、設定可能部分をすべてスクリプト化し、柔軟性をMaxにしたものが

スクリプト+制御モジュール

という構成となります。
しかし、すべての制御をスクリプトで書くのは、現実的ではないため、SIPropで は、

制御モジュールコントロール+スクリプト+制御モジュール

という構成を取っています。
すなわち、スクリプトと制御モジュールが対極に位置しているイメージで、制御モジュールコントロールを踏まえて、柔軟性の落し所をどこに持ってくるのか?が、SIPropのポイントになると思っています。

議論の論点

  • 制御モジュール
  • コントローラ部
    • 制御モジュールコントロール
    • スクリプト(Router)

上記の3機能に対して、どのように機能を割り振るかを決定します。

上記3機能が持つ具体的な機能

  • ダイアログの管理
    • トランザクション管理
  • シーケンスの管理
    • ルーティング情報
    • ステート状態
  • メッセージの変換
    • ヘッダーの追加、削除
    • ヘッダーの変更
  • 各ダイアログの連携
  • 制御モジュール並列化制御

結論

FirstVersion?では、

制御モジュール+制御モジュールコントロール

という、単純な構成として、実装し、具体的な機能要件が見えてきたところでスクリプト化することとする。

制御モジュールで持つべき機能

  • UAとして、必要な動作の管理
    • ダイアログの管理
    • トランザクション管理
    • シーケンスの管理
    • ステート状態

制御モジュールコントロール

  • 制御モジュール並列化制御
  • B2BUAとして、UAをコントロールする機能
    • ルーティング情報
    • ヘッダーの追加、削除
    • 各ダイアログの連携
    • 制御モジュール並列化制御

スクリプトで持つべき機能

  • ヘッダーによる機能の振り分け(メソッドの振り分け?)
    • FirstVersion?では、分離可能な状態としておいて、次期バージョンにて分離する

参考資料