TypeScript をサポートする Node.js 用の InSim ライブラリ。
Node InSim は、TCP 接続経由で Live for Speed InSim プロトコルと通信するための JavaScript API を提供します。ホスト名とポートを介して LFS ホストに接続すると、InSim パケットをホストに送信し、ホストから受信パケットを受信できるようになります。
Node InSim のすべてのパケット構造は、InSim プロトコルで定義されている構造と同一です。すべてのパケット クラスとそのすべてのプロパティは、仕様に従って文書化されています。
ノード InSim は InSim バージョン 9 と互換性があります。
Node.js アプリケーションにnode-insim
NPM パッケージをインストールします。
npm install --save node-insim
または、Yarn を使用する場合:
yarn add node-insim
パブリック API の詳細なドキュメントについては、https://simbroadcasts.github.io/node-insim/ を参照してください。
LFS ホストに接続するには、そのホスト名、ポート、および InSim アプリケーションの短縮名を入力する必要があります。
InSim ポートは LFS ホスト設定で構成する必要があります。また、アプリケーションの接続元のパブリック IP アドレスがホストの InSim ポートへの接続を許可されていることを確認してください。
import { InSim } from 'node-insim' ;
const inSim = new InSim ( ) ;
inSim . connect ( {
Host : '127.0.0.1' ,
Port : 29999 ,
IName : 'Node InSim App' ,
} ) ;
一度に複数のホストに接続するには、ホストごとに新しいInSim
インスタンスを作成します。
import { InSim } from 'node-insim' ;
const inSim1 = new InSim ( ) ;
inSim1 . connect ( {
Host : '127.0.0.1' ,
Port : 29999 ,
IName : 'Node InSim App' ,
} ) ;
const inSim2 = new InSim ( ) ;
inSim2 . connect ( {
Host : '127.0.0.2' ,
Port : 30000 ,
IName : 'Node InSim App' ,
} ) ;
デフォルトでは、Node InSim は TCP 接続を開きます。 UDP を使用する場合は、 connect
関数でProtocol
オプションをUDP
に設定します。
import { InSim } from 'node-insim' ;
const inSim = new InSim ( ) ;
inSim . connect ( {
Host : '127.0.0.1' ,
Port : 29999 ,
IName : 'Node InSim App' ,
Protocol : 'UDP' ,
} ) ;
InSim パケットは、 InSim
クラス インスタンスのsend()
メソッドを使用して送信できます。このメソッドは、パケット クラス インスタンスという 1 つの引数を取ります。
パケットのプロパティを設定する簡単な方法は、クラス コンストラクターにプロパティを設定することです。
import { InSim } from 'node-insim' ;
import { IS_TINY , TinyType } from 'node-insim/packets' ;
const inSim = new InSim ( ) ;
inSim . connect ( {
Host : '127.0.0.1' ,
Port : 29999 ,
IName : 'Node InSim App' ,
} ) ;
inSim . send (
new IS_TINY ( {
ReqI : 1 ,
SubT : TinyType . TINY_PING ,
} ) ,
) ;
もう 1 つの方法は、インスタンスの作成後に各プロパティを割り当てることです。
import { InSim } from 'node-insim' ;
import { IS_TINY , TinyType } from 'node-insim/packets' ;
const inSim = new InSim ( ) ;
inSim . connect ( {
Host : '127.0.0.1' ,
Port : 29999 ,
IName : 'Node InSim App' ,
} ) ;
const pingPacket = new IS_TINY ( ) ;
pingPacket . ReqI = 1 ;
pingPacket . SubT = TinyType . TINY_PING ;
inSim . send ( pingPacket ) ;
InSim
クラスには、LFS にメッセージを送信するのに役立つヘルパー メソッドがあります。
inSim . sendLocalMessage ( 'Local message' ) ;
inSim . sendMessage ( '/end' ) ;
IS_MST
パケットを送信しますIS_MSX
パケットを送信する inSim . sendMessage ( 'This is a message' ) ;
inSim . sendMessageToConnection ( 4 , 'This is a message targeting UCID 4' ) ;
inSim . sendMessageToPlayer ( 4 , 'This is a message targeting PLID 4' ) ;
InSim
クラスは、受信パケットをタイプ別にリッスンするために使用されるon()
メソッドを公開します。
import { InSim } from 'node-insim' ;
import type { IS_VER } from 'node-insim/packets' ;
import { PacketType } from 'node-insim/packets' ;
const inSim = new InSim ( ) ;
inSim . on ( PacketType . ISP_VER , onVersion ) ;
function onVersion ( packet : IS_VER ) {
console . log ( `Connected to LFS ${ packet . product } ${ packet . Version } ` ) ;
}
イベント コールバックには、受信したパケットと、オプションの 2 番目の引数 (そのパケットを受信したInSim
インスタンス) が含まれます。そのインスタンスを使用して、応答として追加のパケットを送信できます。
import { InSim } from 'node-insim' ;
import { PacketType } from 'node-insim/packets' ;
import type { IS_VER } from 'node-insim/packets' ;
const inSim = new InSim ( ) ;
inSim . on ( PacketType . ISP_VER , onVersion ) ;
function onVersion ( packet : IS_VER , inSim : InSim ) {
inSim . send (
new IS_TINY ( {
ReqI : 1 ,
SubT : TinyType . TINY_PING ,
} ) ,
) ;
}
イベント ハンドラー コールバックでinSim
引数を使用すると、たとえばoptions.Host
プロパティによって、受信パケットの送信元ホストを識別できます。
あるいは、 InSim
クラス コンストラクターはオプションのid
引数を受け入れます。これは、InSim 接続を区別するために使用することもできます。
import { InSim } from 'node-insim' ;
const inSim1 = new InSim ( 'Host One' ) ;
inSim1 . connect ( {
Host : '127.0.0.1' ,
Port : 29999 ,
IName : 'Node InSim App' ,
} ) ;
const inSim2 = new InSim ( 'Host Two' ) ;
inSim2 . connect ( {
Host : '127.0.0.2' ,
Port : 30000 ,
IName : 'Node InSim App' ,
} ) ;
inSim . on ( PacketType . ISP_VER , onVersion ) ;
function onVersion ( packet : IS_VER , inSim : InSim ) {
console . log ( `Connected to ${ inSim . options . Host } : ${ inSim . options . Port } ` ) ;
if ( inSim . id ) {
console . log ( `InSim connection ID: ${ inSim . id } ` ) ;
}
}
受信または送信されたパケット内のすべての文字列は、LFS エンコードから Unicode へ、またはその逆に自動的に変換されます。
受信したパケット内の生の LFS エンコード文字列にアクセスする必要がある場合は、未変換の文字列プロパティがすべて含まれるパケット インスタンスの_raw
プロパティを使用します。
import { InSim } from 'node-insim' ;
import { PacketType } from 'node-insim/packets' ;
import type { IS_ISM } from 'node-insim/packets' ;
const inSim = new InSim ( ) ;
inSim . on ( PacketType . ISP_ISM , ( packet : IS_ISM ) => {
console . log ( packet . HName ) ; // UTF-8 string - ^1Drifter Team ^7★ Server
console . log ( packet . _raw . HName ) ; // raw string - ^1Drifter Team ^7^J�� Serveru0000u0000u0000u0000
} ) ;
Unicode 文字列値をパケットで送信すると、各文字が正しい LFS エンコードにエンコードされるため、LFS はメッセージまたはボタンにテキストを表示できます。
import { InSim } from 'node-insim' ;
import { PacketType } from 'node-insim/packets' ;
import type { IS_MSL } from 'node-insim/packets' ;
const inSim = new InSim ( ) ;
inSim . on ( PacketType . ISP_VER , ( packet : IS_VER ) => {
inSim . send (
new IS_MSL ( {
Msg : 'čau světe' , // LFS will receive: ^Eèau svìte
} ) ,
) ;
} ) ;
InSim Relay サービスに接続するには、 connectRelay()
メソッドを使用します。接続すると、中継パケットを送受信できるようになります。次の例は、InSim リレーに接続されているホストのリストを表示する方法を示しています。
import { InSim } from 'node-insim' ;
import { IR_HLR , IR_HOS , PacketType , HInfo } from 'node-insim/packets' ;
inSim . connectRelay ( ) ;
inSim . on ( 'connect' , ( ) => {
// Request a list of hosts
inSim . send ( new IR_HLR ( ) ) ;
} ) ;
inSim . on ( PacketType . IRP_HOS , ( packet : IR_HOS ) => {
// Log the name of each received host
packet . Info . forEach ( ( host : HInfo ) => {
console . log ( host . HName ) ;
} ) ;
} ) ;
InSim Relay プロトコルの詳細については、LFS フォーラムの InSim Relay クライアント情報スレッドを参照してください。
import { OutGauge , OutGaugePack } from 'node-insim' ;
const outGauge = new OutGauge ( ) ;
outGauge . connect ( {
Host : '127.0.0.1' ,
Port : 29999 ,
} ) ;
outGauge . on ( 'packet' , ( data : OutGaugePack ) => {
console . clear ( ) ;
console . log ( data . RPM ) ;
} ) ;
import { OutSim , OutSimPack } from 'node-insim' ;
const outSim = new OutSim ( ) ;
outSim . connect ( {
Host : '127.0.0.1' ,
Port : 29999 ,
} ) ;
outSim . on ( 'packet' , ( data ) => {
// Make sure the simple OutSimPack packet is really received, as opposed to OutSimPack2
if ( ! ( data instanceof OutSimPack ) ) {
return ;
}
console . clear ( ) ;
console . log ( data . PosX ) ;
} ) ;
Node InSim は、デバッグ ログにdebug
NPM パッケージを使用します。デフォルトでは、Node InSim は標準出力にログを出力しません。
ログ記録を有効にするには、InSim アプリケーションの実行時にDEBUG
環境変数を使用します。すべてのログにはnode-insim
という接頭辞が付けられます。ワイルドカードを使用して、必要なログをフィルタリングして除外できます。
DEBUG= * node insim.js # debug all messages
DEBUG=node-insim:tcp node insim.js # debug only TCP protocol messages
Node InSim を使用したサンプル アプリケーションはサンプル フォルダーにあります。
例 | ||
---|---|---|
InSim接続 | JavaScript + CJS | TypeScript + ESM |
InSim接続(複数ホスト) | JavaScript + CJS | TypeScript + ESM |
InSim接続(UDP) | JavaScript + CJS | TypeScript + ESM |
インシムリレー | JavaScript + CJS | TypeScript + ESM |
アウトゲージ | JavaScript + CJS | TypeScript + ESM |
InSim ボタン付き OutGauge | JavaScript + CJS | TypeScript + ESM |
アウトシム | JavaScript + CJS | TypeScript + ESM |
OutSim オプションあり | JavaScript + CJS | TypeScript + ESM |
サンプルを実行する前に、各サンプルのREADME.md
ファイルの指示に従ってください。
たとえば、「InSim 接続 - TypeScript」の例を実行するには、次のコマンドを実行します。
cd examples/typescript/insim-connection
npm install
npm start
yarn dev
新しい InSim パケットをライブラリに追加するときは、 yarn generate
使用して組み込みのコード ジェネレーターを使用できます。必要なファイルがすべて作成および更新されます。
yarn test
yarn test:watch
これらのテストを実行するには、InSim ポートを開いた状態で LFS を実行する必要があります。
デフォルトでは、テストは127.0.0.1:29999
に接続します。 InSim のホストとポートは、 .env
lfs-test
ディレクトリの.env.local
にコピーすることで設定できます。
yarn test:lfs
このコマンドは、 examples/
フォルダー内の各アプリケーションを調べ、その依存関係をインストールしてから、アプリケーションをビルドします (typescript のみ)。
yarn test:examples
yarn lint
yarn format
コンパイルされたファイルはdist/
に作成されます。
yarn build
次のコマンドを使用して、コードのフォーマット、lint + fix、ビルド、テストを実行できます。
yarn check-all