ไลบรารี InSim สำหรับ Node.js ที่รองรับ TypeScript
Node InSim มี JavaScript API เพื่อสื่อสารกับโปรโตคอล Live for Speed InSim ผ่านการเชื่อมต่อ TCP หลังจากเชื่อมต่อกับโฮสต์ LFS ผ่านชื่อโฮสต์และพอร์ต คุณจะสามารถส่งแพ็กเก็ต InSim ไปยังโฮสต์และรับแพ็กเก็ตขาเข้าจากโฮสต์ได้
โครงสร้างแพ็กเก็ตทั้งหมดใน Node InSim เหมือนกันกับโครงสร้างที่กำหนดไว้ในโปรโตคอล InSim คลาสแพ็กเก็ตทั้งหมดที่มีคุณสมบัติทั้งหมดได้รับการจัดทำเอกสารตามข้อกำหนด
Node InSim เข้ากันได้กับ InSim เวอร์ชัน 9
ติดตั้งแพ็คเกจ NPM node-insim ในแอปพลิเคชัน Node.js ของคุณ:
npm install --save node-insimหรือถ้าคุณใช้เส้นด้าย:
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_MSTIS_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 ได้ในโฟลเดอร์ตัวอย่าง
| ตัวอย่าง | ||
|---|---|---|
| การเชื่อมต่ออินซิม | จาวาสคริปต์ + CJS | ไทป์สคริปต์ + ESM |
| การเชื่อมต่อ InSim (หลายโฮสต์) | จาวาสคริปต์ + CJS | ไทป์สคริปต์ + ESM |
| การเชื่อมต่อ InSim (UDP) | จาวาสคริปต์ + CJS | ไทป์สคริปต์ + ESM |
| อินซิมรีเลย์ | จาวาสคริปต์ + CJS | ไทป์สคริปต์ + ESM |
| เอาท์เกจ | จาวาสคริปต์ + CJS | ไทป์สคริปต์ + ESM |
| OutGauge พร้อมปุ่ม InSim | จาวาสคริปต์ + CJS | ไทป์สคริปต์ + ESM |
| เอาท์ซิม | จาวาสคริปต์ + CJS | ไทป์สคริปต์ + ESM |
| OutSim พร้อมตัวเลือก | จาวาสคริปต์ + CJS | ไทป์สคริปต์ + ESM |
ก่อนที่คุณจะรันตัวอย่าง ให้ทำตามคำแนะนำในไฟล์ README.md ของแต่ละตัวอย่าง
ตัวอย่างเช่น หากต้องการเรียกใช้ตัวอย่าง "การเชื่อมต่อ InSim - TypeScript" ให้เรียกใช้คำสั่งต่อไปนี้:
cd examples/typescript/insim-connection
npm install
npm startyarn 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/ ติดตั้งการขึ้นต่อกัน จากนั้นสร้างแอปพลิเคชัน (เฉพาะ typescript เท่านั้น)
yarn test:examplesyarn lintyarn format ไฟล์ที่คอมไพล์จะถูกสร้างขึ้นใน dist/ .
yarn buildคุณสามารถรันรูปแบบโค้ด, lint + fix, สร้างและทดสอบด้วยคำสั่งต่อไปนี้:
yarn check-all