# v1.0

## 概要

Diarkis は初回リリースから3年の年月を経て、ついに v1.0 をリリースしました！

## 主な更新内容

* Field が新しくなりました
  * 視界の範囲 (Field of Vision) であれば、Grid を跨いで同期されるように対応しました。
  * サーバー負荷が軽減されるように最適化しました。
  * 各種 バグを修正 しました。
  * IDiarkisField::SyncInit() を廃止し IDiarkisField::Join() を追加されました。
  * DiarkisField::Leave() コマンドを追加されました。
* Session モジュールが新規に追加されました。

### サーバー

v0.9 と比べて内部通信の効率化、内部コードのリファクタリングの実施、テストシナリオの強化による品質向上を実施し、更にパフォーマンスが向上しております。

* コア
  * DiarkisExec パッケージを追加。サーバーのセットアップを簡潔にできるようになった
  * メッシュモジュールに MARS アドレスを一定時間キャッシュする仕組みを追加
  * roomSupport と groupSupport のパッケージ名をそれぞれ roomSupport, groupSupport とキャメルケースに変更
  * エコーハンドラーを追加
  * ロギング関数に与えられた構造体が String() インターフェースを実装している場合、 String() の戻り値を出力するようにした
  * Diarkis サーバーが自己のIPアドレスを取得した場合にデュアルスタックを無効化
  * 致命的な問題を防止するために、メッシュ送信コールバックをロック
  * 致命的な問題を防止するために、vault のマップの同時反復とマップの書き込みを修正
  * OnStop と OnTerminate のタイムアウトを通知するコンテキストを追加
* **Direct Message**

  * DMユーザーの切断が正しいバージョンとコマンドで切断メッセージを送信するように修正

  **Dive**

  * IncrBy と IncrByEx を追加
  * OnReady を追加
  * Dive のデータ型を interface{} から \[]byte に変更。
  * Dive のバイト固定サイズが小さすぎたのを修正
  * Dive モジュールのシャットダウン防止問題を修正

  **Field**

  * Field のアルゴリズムが変更され、パフォーマンスや可用性が向上
  * Field カスタムフィルタがストレージサーバではなくフロントサーバで実行されるように修正
  * Field モジュールのパフォーマンス向上
  * Field の Leave コマンド ID がルームチャットと同じコマンド ID を使用していた問題を修正
  * Join コマンドを追加し、 Join に続いて Sync、Disappear、Leave が機能するようににしたした

  **Group**

  * Join に関する問題の修正

  **MatchMaker**

  * メンバーのチケットタイムアウトを処理するために onMatchedTicketTimeout を追加
  * チケットのプロパティを更新

  **Mesh**

  * キーが一杯の場合の sharedData 更新の問題を修正
  * 終了タスクの後にアナウンサーを停止するようにした

  **Metrics**

  * パケット数のメトリクスを修正しパケットサイズのメトリクスを追加

  **Puffer**

  * プロパティコメントのサポートを追加し、 JSON パースを改善するために大文字と小文字の違いのサポートを追加
  * プロトコル名が各パッケージ名で一意になるようにした
  * プロトコルコードに定数 Ver と Cmd が追加
  * 生成するファイルのパーミッションを 755 から 644 に変更

  **Room**

  * ユーザーが予期せず切断し、同じユーザーIDで再接続した場合、部屋が空にならないことがある問題を修正
  * room ID の重複防止
  * UpdateProperties と IncrProperty は部屋の TTL を更新しないように変更
  * mutex による lock 漏れの問題を修正
  * room message / announce のログレベルを変更
  * SetOnMigrated コールバックのパラメータ名の修正

  **Session**

  * Session の招待がユーザーごとの招待データを保持しないようにした
  * SessionType 指定時のメンバー ID およびメンバー数を取得するセッションコマンドの追加
  * setTypeByUser と removeTypeByUser が競合状態になることを抑止

  **Go Client**

  * Debug コマンドの追加

### クライアント

* Diarkis ランタイム
  * 全般
    * UDP サーバから切断する際に、タイミングによって Fin パケットを送信せずに切断することがあったため、切断時に必ず Fin パケットを送信するように修正
    * 各モジュールの OnReset() 関数を削除し Distroy() 関数に変更。Distroy()は、各モジュールのデストラクタ時に内部的に呼び出すように修正
      * 上記に伴い UDP / TCP の Reset イベントを削除
    * エラーハンドリングのために、各モジュールのコールバックの引数にエラーコードとエラーメッセージを追加 引数で渡されるインスタンスの GetErrorCode と GetErrorMessage でエラー情報を取得可能です。
    * Trace ログレベルを追加
    * develop ビルドのライブラリを追加
      * debug
        * debug ビルド
      * develop
        * release ビルドかつログ出力有効
      * release
        * release ビルドかつログ出力無効
        * エラーメッセージなどのテキストデータをなるべく削減したビルド
      * ライブラリファイルの配置パスが変わっているためご注意ください
    * ランタイム内で `std::cout` を使用しないように変更
    * Visual Studio の Address Sanitaizer で Container overflow exception が指摘されるコードが存在したため修正
    * IOS 環境の Privacy Manifests ファイルをパッケージに追加
      * `platforms/ios/PrivacyInfo.xcprivacy` に配置
    * コールバックイベントの中でイベントを削除する時の不具合を修正
  * UDP
    * 一部の Reliable 送信メソッドで 10,000 byte を超えるデータを送信可能な状態となっていたためエラーとして処理するように修正
    * RUDP の再送間隔が試行回数に応じて段階的に長くすることができるように変更
    * RUDP の再送信処理が IDiarkisUdp::SetSendRetryInterval で設定した値よりも遅れることがある不具合を修正
    * DiarkisConnectionEventArgs::GetRecconect の typo を修正
    * ソケット再作成機能が有効な状態で send retry がタイムアウトしたときに、切断処理を実行する前にソケットの再作成処理を実行するように変更
  * MatchMaker
    * DiarkisMMHostEventArgs::GetPayload を廃止
  * P2P
    * 切断の判定に関連する不具合を修正
    * ホールパンチ処理を改善
    * ホールパンチ処理のための通信間隔が試行回数に応じて段階的に長くなるように変更
    * P2P 接続のデフォルトのタイムアウト時間を 10 秒から 5 秒に変更
    * P2P モジュールへ明示的な切断処理機能を追加
      * IDiarkisP2P::Disconnect で切断処理を実行し、IDiarkisP2P::GetDisconnectEvent で切断時のイベント通知を受け取ることができます
    * P2P 接続成功時、接続失敗時に接続相手の UID を取得できるように機能追加
    * P2P で bBuffering=false x 暗号化無し でConnect時に、Sendした Payload より大きいサイズのパケットで送られてしまうバグを修正
    * P2P 接続時にロガーを指定しないとクラッシュする問題を修正
  * Group
    * DiarkisGroupEventArgs::GetPayload を廃止
  * Field
    * `DiarkisField::SyncInit` を廃止し `DiarkisField::Join` を追加
    * `Field::Leave()` コマンドを追加
  * DirectMessage
    * OnConnect イベントが廃止されました
    * DirectMessage の Disconnect が正しくないコマンドを送信していたため修正
  * Session
    * Session から Kick されたときのイベントを追加
      * DiarkisSession::GetKickEvent を使用してイベントを設定することが可能です。
    * sessionType を指定して、現在参加中 の Session の情報を取得。 Session::SendGetSessionInfoBySessionType() でリクエストをサーバーへ送信し、Session:: GetSessionInfoEvent で設定するコールバックで結果を取得することができます。
    * sessionID を指定して、参加していない Session の情報を取得。 Session::SendGetSessionInfoBySessionID() でリクエストをサーバーへ送信し、Session:: GetSessionInfoEvent で設定するコールバックで結果を取得することができます。
    * Session::SendGetMemberIDs() / Session::SendGetNumberOfMembers() の 廃止
    * Invite/Accept 周りの仕様を変更 他のユーザーから Invite が送信されると、イベントコールバックで session ID を取得できるように変更しました。 また、これまで Invite に対して Accept で Session に参加するフローとなっていましたが、Session::SendJoin で session ID を指定して Session に参加する方法が推奨となりました。 この変更のため、Invite イベントのコールバック引数が変更されており、また Session::SendAcceptInvite は廃止予定となります。
    * Session::SendInvite へ招待と同時に任意のメッセージを送信する機能を追加
    * 参加しているセッションの参加メンバーを取得する機能を追加 Session::SendGetMemberIDs でリクエストをサーバーへ送信し、Session::GetMemberIDSEvent で設定するコールバックで結果を取得することができます。
    * 参加しているセッションの参加メンバー数を取得する機能を追加 Session::SendGetNumberOfMembers でリクエストをサーバーへ送信し、Session::GetNumberOfMembersEvent で設定するコールバックで結果を取得することができます。
    * Session 関連のコマンドのサーバーでの実行結果を取得するための API を追加 On...Response 系のコールバックで実行結果を受け取ることができ、例えばセッションの参加上限に達していて参加できなかった時などのエラーを検知することができます。
    * OnJoin イベント発生後、Session::GetSessionIDByType() で session ID ではなく UID が返ることがあったため修正
* Diarkis Module
  * 全般
    * Base クラスに DiarkisInit/DiarkisDestroy 関数を追加し、DiarkisInit でロガーを初期化するように修正
    * ロガーと DiarkisInterfaceBase を分離して、DiarkisInterfaceBase の複数インスタンスを管理できるように修正
    * ログに Diarkis クライアントのバージョンを表示するように対応
    * DiarkisInterfaceBase にログファイルを任意の場所に出力するモードを追加
    * DiarkisInterfaceBase でインスタンス毎に作成していたイベント処理スレッドをランタイム全体を通して１つになるように変更
    * カスタムアロケーターを使用した std ライブラリのための型を追加
      * Diarkis::StdString や Diarkis::StdVector 等があり、Diarkis 内部ではこの型を使用して std コンテナを使用しています
      * 基本的にこれらの型はライブラリ内部のみで使用される想定で、アプリ側からは必要な部分でのみ見える形としています
    * Diarkis ランタイム内でのメモリ確保処理を置き換えるカスタムアロケーターを設定する機能を追加
      * ICustomAllocator を継承してカスタムアロケーターを実装して Diarkis::SetCustomAllocator() でアロケーターを入れ替えます
      * room\_broadcast サンプルの main.cpp にサンプル実装を追加
    * DiarkisInterfaceBase のインスタンスが複数存在する状態だと、DiarkisTcp/Udp/P2P で発生したイベントがすぐにイベント処理スレッドに通知されないことがある不具合を修正
      * この不具合修正にあたり、IDiarkisTcp/Udp/P2P でイベントが発生したときに condition\_variable を使用して自動的にスレッドを起床させる実装および WaitCondition を使用してイベント追加待ちを行う仕様が変更されました
      * 新しい実装では IDiarkisTcp/Udp/P2P の GetSchedulerAddNotifyEvent を使用してイベントの追加を検知して、アプリ側がスレッドの挙動をコントロールするしようとなっています
      * 詳細は DiarkisInterfaceBase::RuntimeLoop 周辺の実装をご参照ください
    * Endpoint 取得関数を GetEndpoint に統一して serverType を渡してサーバの Endpoint を取得できるように修正
    * 外部サーバ経由で取得した UDP サーバ接続情報 を使用して UDPサーバに接続できるように対応
    * サーバ側で暗号化を無効に設定した際も、暗号化有効で通信しようとする不具合を修正
    * 暗号化や復号化のためのインスタンスをコンストラクタで作成して使いまわすように変更
    * イベント処理スレッドでまれにイベント処理が追加されたタイミングよりも遅延することがあったため修正
    * diarkis-module/Extension\`のコードを新しい場所に移動。
      * サンプルで使用している `diarkis-module/Extension` のコードをサンプルの下の `diarkis-module-extension` に移動し、サンプルの実装であることを明確にした。
    * ビルド時にDiarkis Moduleが提供するデバッグ機能の有効/無効を切り替えるために、`DIARKIS_DEBUG_FEATURES`マクロを使用するように変更した。
      * Diarkis Moduleはアプリケーションと一緒にビルドされるため、デバッグ機能を利用したい場合はアプリケーションのビルド時に`DIARKIS_DEBUG_FEATURES`を定義する。
    * NATタイプ判定機能を追加する。
      * DiarkisUdpBase::SendCheckNATType`が実行されると、その結果を`DiarkisUdpBase::OnCheckNATType\`で取得できるようにした。
    * Diarkisモジュールのコーディングスタイルの整理
      * これに伴い、Diarkis Moduleでprotectedとして公開されている変数名を一部変更した。
      * 基本的に、変数名の末尾に「\_」を追加するスタイルに変更しましたので、アプリケーションでビルドエラーが発生した場合は、コーディングスタイルに従って変数名を変更して修正してください。
    * DiarkisInterfaceBaseで、`LogOutType::FILE_OUT_TO_SPECIFIC_PATH`が指定された場合に、意図しないパスにログフォルダを作成しようとするバグを修正しました。
    * ソースコードテキストフォーマットを UTF-8 with BOM(LF) に統一
    * Diarkisモジュールで `std::cout` を使用しないように修正した。
    * いくつか new が呼び出されていたコードを修正
      * サンプル実装で HTTP アクセスに使用している httplib 内では new が呼び出されていますが、こちらはアロケーター置き換え非対応となっております
    * MacOS の deployment target を 10.13 に変更
    * iOS と Android の HTTP アクセスに関する実装を整理した。
      * 重複していたコードを整理し、実装を統一した。
  * Room
    * SendRelay() で Room::Relay に渡す引数が間違っていて、Replay が正しく動作していなかったため修正。
    * SyncProperties / ObjectSyncが削除されました。
  * P2P
    * ホールパンチに失敗させるデバック機能を追加
    * `DiarkisP2PBase::ConnectClient` で、すでに接続処理を開始した `uid` に対する呼び出しは何もしないように修正
    * `DiarkisP2PBase::ConnectClient` へ P2P のタイムアウトとバッファリング設定を指定する引数を追加
  * Session
    * DiarkisSessionBase::OnSessionCreate`が削除され、`DiarkisSessionBase::OnSessionCreateResponse\`が追加されました。
      * DiarkisSessionBase::OnSessionCreateResponse\` の引数をチェックすることで、セッションが正常に作成されたかどうかを確認できるようになりました。
    * Session から Kick されたときのイベントの追加に対応
      * DiarkisSessionBase::OnSessionKick でイベントを処理することが可能です。
    * TCP プロトコルに対応
  * Group
    * 入室中のすべての Group から退出する関数を追加
    * GroupID を指定して Broadcast を送信する関数を追加
  * Field
    * 初期時に SendFieldSync() を呼び出した時に、重複して sync() を呼び出していた不具合を修正
    * `Field::SyncInit` の呼び出しが不要になったため `DiarkisFieldBase` 内でも呼び出さないように変更
  * MatchMaker
    * OnIssueTicketResponse() 関数で、IssueTicket の応答を取得できるように対応
    * SendKick() 関数を追加
    * TicketBroadcast レスポンスを処理するイベントを追加しました。
      * DiarkisMatchMakerBase::SendTicketBroadcast`を実行した後、`DiarkisMatchMakerBase::OnTicketBroadcastResponse\`を受信することで、送信コマンドが正しく処理されたかどうかを確認できます。
    * DiarkisMatchMakerbase::OnTicketCancelResponse\`は、IssueTicket上でマッチングが行われ、サーバーのスケールインによりチケットが破棄された場合に呼び出されます。
    * DiarkisMatchMaker::OnCustomCommandTicketMemberLeave\`は、IssueTicketを使ってサーバ上でマッチングしたユーザが、サーバのスケールインによってチケットから離脱した場合に呼び出されます。
      * これは Diarkis Module Extension 側の実装なので、利用する場合はアプリ側にも同じ実装を追加する必要があります。
    * Host/Searchの後ろでルームに参加する場合、サーバー再接続時の参加タイミングが変更されたため、CatchOnReconnect関数を削除しました。
  * RPC
    * RPCAll() / RPCMany() / RPCOne() を virtual 関数に変更
* サンプル
  * session\_simple サンプルを追加
    * session\_simple サンプルで、3333 クライアントが 4444 クライアントがセッションに入室する前に Broadcast して失敗していたので、4444 クライアントが入室するのを待つように修正
  * directmessage\_simple サンプルを追加
    * directmessage\_simple サンプルに、外部サーバ経由で UDPサーバ接続情報 を取得して情報をセットするサンプルコードを用意
  * Android 版サンプルを追加
  * iOS 版サンプルを追加
