Библиотека InSim для Node.js с поддержкой TypeScript.
Node InSim предоставляет API JavaScript для связи с протоколом Live for Speed InSim через TCP-соединение. После подключения к хосту LFS через имя хоста и порт вы можете отправлять пакеты InSim на хост и получать входящие пакеты от хоста.
Все структуры пакетов в Node InSim идентичны структурам, определенным в протоколе InSim. Все классы пакетов со всеми их свойствами документированы согласно спецификации.
Node InSim совместим с InSim версии 9.
Установите пакет node-insim
NPM в свое приложение Node.js:
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, установите для параметра Protocol
значение UDP
в функции 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' ,
} ) ;
Пакеты InSim можно отправлять с помощью метода send()
экземпляра класса InSim
, который принимает один аргумент — экземпляр класса пакета.
Быстрый способ установить свойства пакета — заполнить их в конструкторе класса:
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 ,
} ) ,
) ;
Другой способ — назначить каждое свойство после создания экземпляра:
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 } ` ) ;
}
Обратный вызов события содержит полученный пакет и необязательный второй аргумент — экземпляр 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 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 ) ;
} ) ;
} ) ;
Дополнительную информацию о протоколе InSim Relay можно найти в информационной теме клиента InSim Relay на форуме 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 использует пакет debug
NPM для журналов отладки. По умолчанию Node InSim не выводит журналы на стандартный вывод.
Чтобы включить ведение журнала, используйте переменную среды DEBUG
при запуске приложения InSim. Все журналы имеют префикс 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 | Тайпскрипт + ЕСМ |
Соединение InSim (несколько хостов) | JavaScript + CJS | Тайпскрипт + ЕСМ |
InSim-соединение (UDP) | JavaScript + CJS | Тайпскрипт + ЕСМ |
Реле InSim | JavaScript + CJS | Тайпскрипт + ЕСМ |
OutGauge | JavaScript + CJS | Тайпскрипт + ЕСМ |
OutGauge с кнопками InSim | JavaScript + CJS | Тайпскрипт + ЕСМ |
OutSim | JavaScript + CJS | Тайпскрипт + ЕСМ |
OutSim с опциями | JavaScript + CJS | Тайпскрипт + ЕСМ |
Прежде чем запускать пример, следуйте инструкциям в файле README.md
каждого примера.
Например, чтобы запустить пример «Соединение InSim — TypeScript», выполните следующие команды:
cd examples/typescript/insim-connection
npm install
npm start
yarn dev
При добавлении в библиотеку новых пакетов InSim вы можете использовать встроенные генераторы кода с помощью yarn generate
. Он создаст и обновит для вас все необходимые файлы.
yarn test
yarn test:watch
Для запуска этих тестов LFS должен работать с открытым портом InSim.
По умолчанию тесты подключаются к адресу 127.0.0.1:29999
. Хост и порт InSim можно настроить, скопировав .env
в .env.local
в каталоге lfs-test
.
yarn test:lfs
Эта команда просмотрит каждое приложение в папке examples/
, установит его зависимости, а затем соберет приложение (только машинописный текст).
yarn test:examples
yarn lint
yarn format
Скомпилированные файлы будут созданы в dist/
.
yarn build
Вы можете запустить формат кода, lint + fix, сборку и тестирование с помощью следующей команды:
yarn check-all