Eine InSim-Bibliothek für Node.js mit TypeScript-Unterstützung.
Node InSim bietet eine JavaScript-API für die Kommunikation mit dem Live for Speed InSim-Protokoll über eine TCP-Verbindung. Nachdem Sie über einen Hostnamen und einen Port eine Verbindung zu einem LFS-Host hergestellt haben, können Sie InSim-Pakete an den Host senden und eingehende Pakete vom Host empfangen.
Alle Paketstrukturen in Node InSim sind identisch mit den im InSim-Protokoll definierten Strukturen. Alle Paketklassen werden mit all ihren Eigenschaften entsprechend der Spezifikation dokumentiert.
Node InSim ist mit InSim Version 9 kompatibel.
Installieren Sie das node-insim NPM-Paket in Ihrer Node.js-Anwendung:
npm install --save node-insimoder wenn Sie Garn verwenden:
yarn add node-insimEine ausführlichere Dokumentation der öffentlichen API finden Sie unter https://simbroadcasts.github.io/node-insim/.
Um eine Verbindung zu einem LFS-Host herzustellen, müssen Sie dessen Hostnamen, einen Port und einen Kurznamen Ihrer InSim-Anwendung eingeben.
Der InSim-Port muss in den LFS-Hosteinstellungen konfiguriert werden. Stellen Sie außerdem sicher, dass die öffentliche IP-Adresse, von der aus Ihre Anwendung eine Verbindung herstellt, eine Verbindung zum InSim-Port des Hosts herstellen darf.
import { InSim } from 'node-insim' ;
const inSim = new InSim ( ) ;
inSim . connect ( {
Host : '127.0.0.1' ,
Port : 29999 ,
IName : 'Node InSim App' ,
} ) ; Um eine Verbindung zu mehreren Hosts gleichzeitig herzustellen, erstellen Sie für jeden Host eine neue InSim Instanz.
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' ,
} ) ; Standardmäßig öffnet Node InSim eine TCP-Verbindung. Wenn Sie UDP verwenden möchten, stellen Sie in der connect die Protocol auf UDP ein.
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-Pakete können mit der send() Methode der InSim -Klasseninstanz gesendet werden, die ein einziges Argument benötigt – die Paketklasseninstanz.
Eine schnelle Möglichkeit, Paketeigenschaften festzulegen, besteht darin, sie im Klassenkonstruktor zu füllen:
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 ,
} ) ,
) ;Eine andere Möglichkeit besteht darin, jede Eigenschaft nach dem Erstellen der Instanz zuzuweisen:
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 ) ; Die InSim -Klasse verfügt über Hilfsmethoden, die zum Senden von Nachrichten an LFS nützlich sind.
inSim . sendLocalMessage ( 'Local message' ) ; inSim . sendMessage ( '/end' ) ; IS_MST PaketIS_MSX Paket 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' ) ; Die InSim Klasse stellt eine on() Methode bereit, mit der eingehende Pakete anhand ihres Typs überwacht werden.
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 } ` ) ;
} Der Ereignisrückruf enthält das empfangene Paket und ein optionales zweites Argument – die InSim -Instanz, die dieses Paket empfangen hat. Sie können diese Instanz verwenden, um als Antwort zusätzliche Pakete zu senden.
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 ,
} ) ,
) ;
} Sie können das Argument inSim im Event-Handler-Callback verwenden, um den Quellhost der empfangenen Pakete zu identifizieren, beispielsweise anhand der Eigenschaft „ options.Host .
Alternativ akzeptiert der InSim Klassenkonstruktor ein optionales id -Argument, das auch zur Unterscheidung der InSim-Verbindungen verwendet werden kann.
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 } ` ) ;
}
}Alle Zeichenfolgen in empfangenen oder gesendeten Paketen werden automatisch von der LFS-Codierung in Unicode und umgekehrt konvertiert.
Wenn Sie auf die rohe LFS-codierte Zeichenfolge in einem empfangenen Paket zugreifen müssen, verwenden Sie die Eigenschaft _raw in der Paketinstanz, die alle nicht konvertierten Zeichenfolgeneigenschaften enthält.
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
} ) ;Wenn Sie einen Unicode-Zeichenfolgenwert in einem Paket senden, wird jedes Zeichen in der richtigen LFS-Kodierung kodiert, sodass LFS den Text in einer Nachricht oder einer Schaltfläche anzeigen kann.
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
} ) ,
) ;
} ) ; Um eine Verbindung zum InSim Relay-Dienst herzustellen, verwenden Sie die Methode connectRelay() . Sobald die Verbindung hergestellt ist, können Sie Relay-Pakete senden und empfangen. Das folgende Beispiel zeigt, wie eine Liste der mit dem InSim Relay verbundenen Hosts angezeigt wird:
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 ) ;
} ) ;
} ) ;Weitere Informationen zum InSim Relay-Protokoll finden Sie im InSim Relay-Client-Informationsthread im LFS-Forum.
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 verwendet das debug NPM-Paket für Debug-Protokolle. Standardmäßig gibt Node InSim keine Protokolle an die Standardausgabe aus.
Um die Protokollierung zu aktivieren, verwenden Sie beim Ausführen Ihrer InSim-Anwendung die Umgebungsvariable DEBUG . Allen Protokollen wird node-insim vorangestellt. Sie können Platzhalter verwenden, um die benötigten Protokolle herauszufiltern.
DEBUG= * node insim.js # debug all messages
DEBUG=node-insim:tcp node insim.js # debug only TCP protocol messages Beispielanwendungen mit Node InSim finden Sie im Beispielordner.
| Beispiel | ||
|---|---|---|
| InSim-Verbindung | JavaScript + CJS | TypeScript + ESM |
| InSim-Verbindung (mehrere Hosts) | JavaScript + CJS | TypeScript + ESM |
| InSim-Verbindung (UDP) | JavaScript + CJS | TypeScript + ESM |
| InSim-Relais | JavaScript + CJS | TypeScript + ESM |
| OutGauge | JavaScript + CJS | TypeScript + ESM |
| OutGauge mit InSim-Tasten | JavaScript + CJS | TypeScript + ESM |
| OutSim | JavaScript + CJS | TypeScript + ESM |
| OutSim mit Optionen | JavaScript + CJS | TypeScript + ESM |
Bevor Sie ein Beispiel ausführen, befolgen Sie die Anweisungen in der README.md Datei jedes Beispiels.
Um beispielsweise das Beispiel „InSim-Verbindung – TypeScript“ auszuführen, führen Sie die folgenden Befehle aus:
cd examples/typescript/insim-connection
npm install
npm startyarn dev Wenn Sie der Bibliothek neue InSim-Pakete hinzufügen, können Sie mithilfe von yarn generate integrierte Codegeneratoren verwenden. Es erstellt und aktualisiert alle erforderlichen Dateien für Sie.
yarn test
yarn test:watchUm diese Tests auszuführen, muss LFS mit geöffnetem InSim-Port ausgeführt werden.
Standardmäßig stellen die Tests eine Verbindung zu 127.0.0.1:29999 her. Der InSim-Host und -Port kann durch Kopieren von .env nach .env.local im lfs-test -Verzeichnis konfiguriert werden.
yarn test:lfs Dieser Befehl durchläuft jede Anwendung im Ordner examples/ , installiert ihre Abhängigkeiten und erstellt dann die Anwendung (nur TypeScript).
yarn test:examplesyarn lintyarn format Kompilierte Dateien werden in dist/ erstellt.
yarn buildMit dem folgenden Befehl können Sie Codeformat, Lint + Fix, Build und Test ausführen:
yarn check-all