Uma biblioteca InSim para Node.js com suporte TypeScript.
O Node InSim fornece uma API JavaScript para se comunicar com o protocolo Live for Speed InSim por meio de uma conexão TCP. Após conectar-se a um host LFS através de um nome de host e uma porta, você poderá enviar pacotes InSim para o host e receber pacotes recebidos do host.
Todas as estruturas de pacotes no Node InSim são idênticas às estruturas definidas no protocolo InSim. Todas as classes de pacotes com todas as suas propriedades são documentadas de acordo com a especificação.
O Node InSim é compatível com o InSim versão 9.
Instale o pacote NPM node-insim
em seu aplicativo Node.js:
npm install --save node-insim
ou se você usar Yarn:
yarn add node-insim
Para documentação mais detalhada da API pública, consulte https://simbroadcasts.github.io/node-insim/.
Para se conectar a um host LFS, você deve inserir seu nome de host, uma porta e um nome abreviado de seu aplicativo InSim.
A porta InSim deve ser configurada nas configurações do host LFS. Além disso, certifique-se de que o endereço IP público a partir do qual seu aplicativo está se conectando tenha permissão para se conectar à porta InSim do host.
import { InSim } from 'node-insim' ;
const inSim = new InSim ( ) ;
inSim . connect ( {
Host : '127.0.0.1' ,
Port : 29999 ,
IName : 'Node InSim App' ,
} ) ;
Para conectar-se a vários hosts ao mesmo tempo, crie uma nova instância InSim
para cada host.
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' ,
} ) ;
Por padrão, o Node InSim abre uma conexão TCP. Se você quiser usar UDP, defina a opção Protocol
como UDP
na função connect
.
import { InSim } from 'node-insim' ;
const inSim = new InSim ( ) ;
inSim . connect ( {
Host : '127.0.0.1' ,
Port : 29999 ,
IName : 'Node InSim App' ,
Protocol : 'UDP' ,
} ) ;
Os pacotes InSim podem ser enviados usando o método send()
na instância da classe InSim
, que recebe um único argumento - a instância da classe do pacote.
Uma maneira rápida de definir propriedades de pacotes é preenchê-las no construtor da classe:
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 ,
} ) ,
) ;
Outra forma é atribuir cada propriedade após criar a instância:
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 ) ;
A classe InSim
possui métodos auxiliares úteis para enviar mensagens ao 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' ) ;
A classe InSim
expõe um método on()
, que é usado para escutar pacotes recebidos por tipo.
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 } ` ) ;
}
O retorno de chamada do evento contém o pacote recebido e um segundo argumento opcional - a instância InSim
que recebeu esse pacote. Você pode usar essa instância para enviar pacotes adicionais em resposta.
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 ,
} ) ,
) ;
}
Você pode usar o argumento inSim
no retorno de chamada do manipulador de eventos para identificar o host de origem dos pacotes recebidos, por exemplo, pela propriedade options.Host
.
Alternativamente, o construtor da classe InSim
aceita um argumento id
opcional, que também pode ser usado para distinguir as conexões 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 } ` ) ;
}
}
Todas as strings em pacotes recebidos ou enviados são automaticamente convertidas da codificação LFS para Unicode e vice-versa.
Se você precisar acessar a string codificada em LFS bruta em um pacote recebido, use a propriedade _raw
na instância do pacote, que contém todas as propriedades da string não convertidas.
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
} ) ;
Quando você envia um valor de string Unicode em um pacote, cada caractere será codificado na codificação LFS correta, para que o LFS possa exibir o texto em uma mensagem ou botão.
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
} ) ,
) ;
} ) ;
Para se conectar ao serviço InSim Relay, use o método connectRelay()
. Uma vez conectado, você pode enviar e receber pacotes de retransmissão. O exemplo a seguir demonstra como mostrar uma lista de hosts conectados ao InSim Relay:
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 ) ;
} ) ;
} ) ;
Mais informações sobre o protocolo InSim Relay podem ser encontradas no tópico de informações do cliente InSim Relay no fórum LFS.
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 usa o pacote debug
NPM para logs de depuração. Por padrão, o Node InSim não envia nenhum log para a saída padrão.
Para ativar o registro, use a variável de ambiente DEBUG
ao executar seu aplicativo InSim. Todos os logs são prefixados com node-insim
. Você pode usar curingas para filtrar os logs necessários.
DEBUG= * node insim.js # debug all messages
DEBUG=node-insim:tcp node insim.js # debug only TCP protocol messages
Você pode encontrar exemplos de aplicativos usando o Node InSim na pasta de exemplos.
Exemplo | ||
---|---|---|
Conexão InSim | Javascript + CJS | TypeScript + ESM |
Conexão InSim (vários hosts) | Javascript + CJS | TypeScript + ESM |
Conexão InSim (UDP) | Javascript + CJS | TypeScript + ESM |
Relé InSim | Javascript + CJS | TypeScript + ESM |
OutGauge | Javascript + CJS | TypeScript + ESM |
OutGauge com botões InSim | Javascript + CJS | TypeScript + ESM |
ForaSim | Javascript + CJS | TypeScript + ESM |
OutSim com opções | Javascript + CJS | TypeScript + ESM |
Antes de executar um exemplo, siga as instruções no arquivo README.md
de cada exemplo.
Por exemplo, para executar o exemplo "Conexão InSim - TypeScript", execute os seguintes comandos:
cd examples/typescript/insim-connection
npm install
npm start
yarn dev
Ao adicionar novos pacotes InSim à biblioteca, você pode usar geradores de código integrados usando yarn generate
. Ele criará e atualizará todos os arquivos necessários para você.
yarn test
yarn test:watch
Para executar estes testes, o LFS deve estar rodando com uma porta InSim aberta.
Por padrão, os testes se conectam a 127.0.0.1:29999
. O host e a porta do InSim podem ser configurados copiando .env
para .env.local
no diretório lfs-test
.
yarn test:lfs
Este comando percorrerá cada aplicativo na pasta examples/
, instalará suas dependências e, em seguida, criará o aplicativo (somente TypeScript).
yarn test:examples
yarn lint
yarn format
Os arquivos compilados serão criados em dist/
.
yarn build
Você pode executar o formato de código, lint + fix, construir e testar com o seguinte comando:
yarn check-all