Pustaka InSim untuk Node.js dengan dukungan TypeScript.
Node InSim menyediakan API JavaScript untuk berkomunikasi dengan protokol Live for Speed InSim melalui koneksi TCP. Setelah terhubung ke host LFS melalui nama host dan port, Anda dapat mengirim paket InSim ke host dan menerima paket masuk dari host.
Semua struktur paket di Node InSim identik dengan struct yang ditentukan dalam protokol InSim. Semua kelas paket dengan semua propertinya didokumentasikan sesuai dengan spesifikasinya.
Node InSim kompatibel dengan InSim versi 9.
Instal paket NPM node-insim
di aplikasi Node.js Anda:
npm install --save node-insim
atau jika Anda menggunakan Benang:
yarn add node-insim
Untuk dokumentasi API publik yang lebih detail, lihat https://simbroadcasts.github.io/node-insim/.
Untuk menyambung ke host LFS, Anda harus memasukkan nama host, port, dan nama pendek aplikasi InSim Anda.
Port InSim harus dikonfigurasi dalam pengaturan host LFS. Selain itu, pastikan alamat IP publik tempat aplikasi Anda terhubung diizinkan untuk terhubung ke port InSim host.
import { InSim } from 'node-insim' ;
const inSim = new InSim ( ) ;
inSim . connect ( {
Host : '127.0.0.1' ,
Port : 29999 ,
IName : 'Node InSim App' ,
} ) ;
Untuk terhubung ke beberapa host sekaligus, buat instans InSim
baru untuk setiap host.
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' ,
} ) ;
Secara default, Node InSim membuka koneksi TCP. Jika Anda ingin menggunakan UDP, atur opsi Protocol
ke UDP
di fungsi 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' ,
} ) ;
Paket InSim dapat dikirim menggunakan metode send()
pada instance kelas InSim
, yang menggunakan satu argumen - instance kelas paket.
Cara cepat untuk menyetel properti paket adalah dengan mengisinya di konstruktor kelas:
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 ,
} ) ,
) ;
Cara lain adalah dengan menetapkan setiap properti setelah membuat instance:
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 ) ;
Kelas InSim
memiliki metode pembantu yang berguna untuk mengirim pesan ke 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' ) ;
Kelas InSim
menampilkan metode on()
, yang digunakan untuk mendengarkan paket masuk berdasarkan tipenya.
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 } ` ) ;
}
Callback kejadian berisi paket yang diterima, dan argumen opsional kedua - instance InSim
yang menerima paket tersebut. Anda dapat menggunakan instance tersebut untuk mengirim paket tambahan sebagai respons.
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 ,
} ) ,
) ;
}
Anda dapat menggunakan argumen inSim
dalam callback event handler untuk mengidentifikasi host sumber dari paket yang diterima, misalnya dengan properti options.Host
.
Alternatifnya, konstruktor kelas InSim
menerima argumen id
opsional, yang juga dapat digunakan untuk membedakan koneksi 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 } ` ) ;
}
}
Semua string dalam paket yang diterima atau dikirim secara otomatis dikonversi dari pengkodean LFS ke Unicode dan sebaliknya.
Jika Anda perlu mengakses string mentah yang dikodekan LFS dalam paket yang diterima, gunakan properti _raw
dalam instance paket, yang berisi semua properti string yang belum dikonversi.
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
} ) ;
Saat Anda mengirim nilai string Unicode dalam sebuah paket, setiap karakter akan dikodekan ke dalam pengkodean LFS yang benar, sehingga LFS dapat menampilkan teks dalam pesan atau tombol.
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
} ) ,
) ;
} ) ;
Untuk terhubung ke layanan InSim Relay, gunakan metode connectRelay()
. Setelah terhubung, Anda dapat mengirim dan menerima paket relai. Contoh berikut menunjukkan cara menampilkan daftar host yang terhubung ke Relay 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 ) ;
} ) ;
} ) ;
Informasi lebih lanjut tentang protokol InSim Relay dapat ditemukan di thread informasi klien InSim Relay di forum 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 menggunakan paket debug
NPM untuk log debug. Secara default, Node InSim tidak mengeluarkan log apa pun ke output standar.
Untuk mengaktifkan pembuatan log, gunakan variabel lingkungan DEBUG
saat menjalankan aplikasi InSim Anda. Semua log diawali dengan node-insim
. Anda dapat menggunakan karakter pengganti untuk memfilter log yang Anda perlukan.
DEBUG= * node insim.js # debug all messages
DEBUG=node-insim:tcp node insim.js # debug only TCP protocol messages
Anda dapat menemukan contoh aplikasi menggunakan Node InSim di folder contoh.
Contoh | ||
---|---|---|
Koneksi InSim | JavaScript + CJS | Skrip Ketik + ESM |
Koneksi InSim (beberapa host) | JavaScript + CJS | Skrip Ketik + ESM |
Koneksi InSim (UDP) | JavaScript + CJS | Skrip Ketik + ESM |
Relai InSim | JavaScript + CJS | Skrip Ketik + ESM |
Pengukur Keluar | JavaScript + CJS | Skrip Ketik + ESM |
OutGauge dengan tombol InSim | JavaScript + CJS | Skrip Ketik + ESM |
KeluarSim | JavaScript + CJS | Skrip Ketik + ESM |
OutSim dengan Opsi | JavaScript + CJS | Skrip Ketik + ESM |
Sebelum Anda menjalankan sebuah contoh, ikuti instruksi di setiap file README.md
contoh.
Misalnya, untuk menjalankan contoh "Koneksi InSim - TypeScript", jalankan perintah berikut:
cd examples/typescript/insim-connection
npm install
npm start
yarn dev
Saat menambahkan paket InSim baru ke perpustakaan, Anda dapat menggunakan generator kode bawaan menggunakan yarn generate
. Ini akan membuat dan memperbarui semua file yang diperlukan untuk Anda.
yarn test
yarn test:watch
Untuk menjalankan pengujian ini, LFS harus dijalankan dengan port InSim terbuka.
Secara default, pengujian terhubung ke 127.0.0.1:29999
. Host dan port InSim dapat dikonfigurasi dengan menyalin .env
ke .env.local
di direktori lfs-test
.
yarn test:lfs
Perintah ini akan menelusuri setiap aplikasi di folder examples/
, menginstal dependensinya, lalu membangun aplikasi (hanya skrip ketikan).
yarn test:examples
yarn lint
yarn format
File yang dikompilasi akan dibuat di dist/
.
yarn build
Anda dapat menjalankan format kode, lint + fix, build dan test dengan perintah berikut:
yarn check-all