支持 TypeScript 的 Node.js InSim 库。
Node InSim 提供了一个 JavaScript API,可通过 TCP 连接与 Live for Speed InSim 协议进行通信。通过主机名和端口连接到 LFS 主机后,您可以将 InSim 数据包发送到主机并接收来自主机的传入数据包。
Node InSim 中的所有数据包结构与 InSim 协议中定义的结构相同。所有数据包类别及其所有属性均根据规范进行记录。
Node InSim 与 InSim 版本 9 兼容。
在 Node.js 应用程序中安装node-insim
NPM 包:
npm install --save node-insim
或者如果您使用纱线:
yarn add node-insim
有关公共 API 的更详细文档,请参阅 https://simbroadcasts.github.io/node-insim/。
要连接到 LFS 主机,您必须输入其主机名、端口和 InSim 应用程序的短名称。
必须在 LFS 主机设置中配置 InSim 端口。另外,请确保允许应用程序连接的公共 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()
方法发送,该方法采用单个参数 - 数据包类实例。
设置数据包属性的一种快速方法是在类构造函数中填充它们:
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 中继的主机列表:
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 |
InSim 中继 | JavaScript + CJS | TypeScript + ESM |
外规 | JavaScript + CJS | TypeScript + ESM |
OutGauge 与 InSim 按钮 | 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
要运行这些测试,LFS 必须在 InSim 端口打开的情况下运行。
默认情况下,测试连接到127.0.0.1:29999
。可以通过将.env
复制到lfs-test
目录中的.env.local
来配置 InSim 主机和端口。
yarn test:lfs
此命令将遍历examples/
文件夹中的每个应用程序,安装其依赖项,然后构建应用程序(仅限打字稿)。
yarn test:examples
yarn lint
yarn format
编译后的文件将在dist/
中创建。
yarn build
您可以使用以下命令运行代码格式、lint + 修复、构建和测试:
yarn check-all