TypeScript를 지원하는 Node.js용 InSim 라이브러리입니다.
Node InSim은 TCP 연결을 통해 Live for Speed InSim 프로토콜과 통신하기 위한 JavaScript API를 제공합니다. 호스트 이름과 포트를 통해 LFS 호스트에 접속한 후, InSim 패킷을 호스트로 보내고 호스트로부터 들어오는 패킷을 받을 수 있습니다.
Node InSim의 모든 패킷 구조는 InSim 프로토콜에 정의된 구조와 동일합니다. 모든 속성을 포함한 모든 패킷 클래스는 사양에 따라 문서화됩니다.
Node 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()
메서드를 사용하여 보낼 수 있습니다.
패킷 속성을 설정하는 가장 빠른 방법은 클래스 생성자에 해당 속성을 채우는 것입니다.
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
클래스 생성자는 InSim 연결을 구분하는 데 사용할 수도 있는 선택적 id
인수를 허용합니다.
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 인코딩에서 유니코드로 또는 그 반대로 변환됩니다.
수신된 패킷의 원시 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
} ) ;
유니코드 문자열 값을 패킷으로 보내면 각 문자가 올바른 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 프로토콜에 대한 자세한 내용은 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을 사용하는 예제 애플리케이션을 찾을 수 있습니다.
예 | ||
---|---|---|
인심 연결 | 자바스크립트 + CJS | 타입스크립트 + ESM |
InSim 연결(다중 호스트) | 자바스크립트 + CJS | 타입스크립트 + ESM |
InSim 연결(UDP) | 자바스크립트 + CJS | 타입스크립트 + ESM |
인심릴레이 | 자바스크립트 + CJS | 타입스크립트 + ESM |
아웃게이지 | 자바스크립트 + CJS | 타입스크립트 + ESM |
InSim 버튼이 있는 OutGauge | 자바스크립트 + CJS | 타입스크립트 + ESM |
아웃심 | 자바스크립트 + CJS | 타입스크립트 + ESM |
옵션이 포함된 OutSim | 자바스크립트 + CJS | 타입스크립트 + 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
에 연결됩니다. InSim 호스트 및 포트는 lfs-test
디렉터리의 .env
.env.local
에 복사하여 구성할 수 있습니다.
yarn test:lfs
이 명령은 examples/
폴더의 각 애플리케이션을 살펴보고 해당 종속성을 설치한 다음 애플리케이션을 빌드합니다(typescript만 해당).
yarn test:examples
yarn lint
yarn format
컴파일된 파일은 dist/
에 생성됩니다.
yarn build
다음 명령을 사용하여 코드 형식, Lint + 수정, 빌드 및 테스트를 실행할 수 있습니다.
yarn check-all