ไลบรารี 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_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 ได้ในโฟลเดอร์ตัวอย่าง
ตัวอย่าง | ||
---|---|---|
การเชื่อมต่ออินซิม | จาวาสคริปต์ + 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 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/
ติดตั้งการขึ้นต่อกัน จากนั้นสร้างแอปพลิเคชัน (เฉพาะ typescript เท่านั้น)
yarn test:examples
yarn lint
yarn format
ไฟล์ที่คอมไพล์จะถูกสร้างขึ้นใน dist/
.
yarn build
คุณสามารถรันรูปแบบโค้ด, lint + fix, สร้างและทดสอบด้วยคำสั่งต่อไปนี้:
yarn check-all