Lompat ke konten
dokumentasi.id
Commit bd74801
v2
Star10 rb

Kamu membaca versi lama. Halaman ini hanya bisa dibaca.

5

Pipeline Deteksi Regex dan String Map

Satu UA string masuk ke UAParser dan keluar sebagai objek IData yang propertinya sudah terisi. Di antaranya ada satu rantai tetap: Constants, Helper, rgxMapper yang mencocokkan defaultRegexes, strMapper yang menerjemahkan hasil tangkapan, lalu createIData yang membungkus hasilnya. Halaman ini menyusuri rantai tersebut di src/main/ua-parser.js.

Aliran satu UA string

Konstruktor UAParser menetapkan userAgent dari argumen, dari header user-agent, atau dari navigator.userAgent, lalu menyiapkan httpUACH dan regexMap = defaultRegexes. src/main/ua-parser.js:1463-1470

Semua getter publik didaftarkan lewat setProps: getBrowser, getCPU, getDevice, getEngine, getOS, dan getResult. src/main/ua-parser.js:1493-1499 Untuk tipe selain result, fungsi pabrik dari createItemFunc membuat UAItem dengan rgxMap[itemType], memanggil parseUA(), lalu mengembalikan data. src/main/ua-parser.js:1483-1489 getResult() membuat UAItem bertipe result dan mengisinya dari kelima getter lain. src/main/ua-parser.js:1471-1482

UAItem sendiri adalah wadah: ia menyimpan itemType, ua, uaCH, rgxMap, dan data yang dibuat oleh createIData. src/main/ua-parser.js:1226-1235

graph TD
    IN["UA string / headers / navigator.userAgent"] --> CTOR["UAParser: userAgent, httpUACH, regexMap"]
    CTOR --> FACT["createItemFunc"]
    FACT --> ITEM["UAItem"]
    ITEM --> PARSE["UAItem.parseUA"]
    PARSE --> MAPPER["rgxMapper"]
    MAPPER --> RGX["defaultRegexes"]
    RGX -->|"regex + props"| MAPPER
    MAPPER --> STR["strMapper / strTest"]
    MAPPER --> IDATA["IData dari createIData"]
    CH["httpUACH: UACHData"] --> PCH["UAItem.parseCH"]
    PCH --> MAPPER
    PCH --> STR
    IDATA --> RESULT["getResult()"]
    MAPPER --> NOMATCH["properti tetap undefined"]
    style RGX fill:#336791,color:#fff
    style CH fill:#336791,color:#fff
    style CTOR fill:#f59e0b,color:#000
    style FACT fill:#f59e0b,color:#000
    style MAPPER fill:#f59e0b,color:#000
    style STR fill:#8b5cf6,color:#fff
    style IDATA fill:#2d7d46,color:#fff
    style RESULT fill:#2d7d46,color:#fff
    style NOMATCH fill:#dc2626,color:#fff
%% fig: Pipeline deteksi dari UA string ke IData
%% desc: UA string mengalir melalui UAParser, UAItem, parseUA, rgxMapper, dan strMapper sebelum createIData membungkus hasilnya; parseCH memakai rgxMapper dan strMapper yang sama.
Fig. 1: Pipeline deteksi dari UA string ke IDataUA string mengalir melalui UAParser, UAItem, parseUA, rgxMapper, dan strMapper sebelum createIData membungkus hasilnya; parseCH memakai rgxMapper dan strMapper yang sama.

parseUA hanya bekerja untuk tipe selain result. Ia memanggil rgxMapper.call(this.data, this.ua, this.rgxMap), menambahkan major untuk browser, dan menambal versi iOS yang dibekukan Safari sejak iOS 26. src/main/ua-parser.js:1296-1318

Constants dan Helper

Bagian Constants menyediakan nama properti yang menjadi kunci props (NAME, VERSION, MAJOR, TYPE, ARCHITECTURE, MODEL, VENDOR), konstanta UNKNOWN bernilai '?', dan UA_MAX_LENGTH bernilai 500. src/main/ua-parser.js:18-32

Bagian Helper berisi dua belas fungsi kecil yang dipakai lintas pipeline. src/main/ua-parser.js:126-212

HelperPeran di pipelineRujukan
extendMenggabungkan regex map extension di depan map default, hanya bila lariknya genapsrc/main/ua-parser.js:130-145
enumerizeMengubah daftar nama properti menjadi objek enumsrc/main/ua-parser.js:146-152
hasMembandingkan string tanpa peduli huruf besar/kecil, juga terhadap larik aliassrc/main/ua-parser.js:153-161
isExtensionsMengenali objek berbentuk map extension lewat kunci browser, cpu, device, engine, ossrc/main/ua-parser.js:162-166
itemListToArrayMemecah header daftar ber-;v= menjadi larik {brand, version}src/main/ua-parser.js:170-183
lowerizeMenurunkan huruf bila nilai berupa stringsrc/main/ua-parser.js:184-186
majorizeMengambil segmen mayor dari string versisrc/main/ua-parser.js:187-189
normalizeHeaderValueMembuang tanda kutip dan memangkas nilai header ke UA_MAX_LENGTHsrc/main/ua-parser.js:190-192
setPropsMengisi properti objek dari daftar pasangan nama dan nilaisrc/main/ua-parser.js:193-205
stripMenghapus pola dari stringsrc/main/ua-parser.js:206-208
trimMembuang spasi awal lalu memotong ke panjang tertentusrc/main/ua-parser.js:209-212

isExtensions dipakai extend untuk memilih format masukan extension. src/main/ua-parser.js:162-166 has adalah inti pencocokan string map, karena ia menerima larik alias sebagai sisi pertama. src/main/ua-parser.js:153-161 enumerize menghasilkan objek yang dipasang sebagai UAParser.BROWSER, UAParser.CPU, UAParser.DEVICE, dan UAParser.ENGINE/UAParser.OS; rinciannya ada di Enums dan Konstanta Deteksi. src/main/ua-parser.js:146-152 src/main/ua-parser.js:1516-1520

Dua helper dipakai langsung oleh metode publik parser: setUA memakai trim untuk memotong UA string ke UA_MAX_LENGTH, dan useExtension memakai extend. src/main/ua-parser.js:1501-1504 src/main/ua-parser.js:1505-1508 Pemakaian extension dibahas di Extensions: Bots, Crawlers, dan Lainnya.

Bentuk regex map

defaultRegexes menyimpan lima kunci map, dan setiap kunci berisi pasangan larik RegExp dengan larik props. src/main/ua-parser.js:347-353

KunciBaris awalBentuk props pada pasangan pertama
browsersrc/main/ua-parser.js:347-353[VERSION, [NAME, PREFIX_MOBILE + 'Chrome']] untuk Chrome for Android/iOS
cpusrc/main/ua-parser.js:541-544[[ARCHITECTURE, 'amd64']]
devicesrc/main/ua-parser.js:573-581[MODEL, [VENDOR, SAMSUNG], [TYPE, TABLET]]
enginesrc/main/ua-parser.js:955-958[VERSION, [NAME, EDGE+'HTML']]
ossrc/main/ua-parser.js:981-992[NAME, VERSION] untuk Windows IoT/Mobile/Phone

rgxMapper membaca larik datar itu berpasangan: elemen bernomor genap adalah larik RegExp dan elemen ganjil adalah larik props, sehingga indeksnya melompat dua langkah. src/main/ua-parser.js:225-229 Perulangan berhenti pada pasangan pertama yang menghasilkan matches, jadi urutan pasangan menentukan prioritas. src/main/ua-parser.js:232-235

os adalah kunci terakhir dari defaultRegexes, dan objek map ditutup tepat sebelum bagian Factories. src/main/ua-parser.js:1079

⚠️ Urutan di dalam defaultRegexes adalah logika, bukan sekadar dokumentasi. Karena rgxMapper berhenti pada pasangan pertama yang cocok, regex yang terlalu umum sebelum regex khusus akan menutup cabang khusus itu. src/main/ua-parser.js:232-235

Menerjemahkan satu elemen props

rgxMapper mengiterasi props dengan penghitung k yang naik seiring urutan capture group, sehingga match = matches[++k] mengambil grup sesuai posisi properti. src/main/ua-parser.js:238-273

graph TD
    P["props[p] = q dan match = matches[++k]"] --> T{"typeof q adalah object dan q.length > 0"}
    T -- "tidak" --> S1["this[q] = match"]
    T -- "ya" --> L{"q.length"}
    L -- "2 dan q[1] function" --> S2["this[q[0]] = q[1].call(this, match)"]
    L -- "2 dan q[1] nilai lain" --> S3["this[q[0]] = q[1], match diabaikan"]
    L -- "3 atau lebih dan q[1] function" --> S4["this[q[0]] = q[1].call(this, match, q[2])"]
    L -- "3 dan q[1] regex" --> S5["this[q[0]] = match.replace(q[1], q[2])"]
    L -- "4 dan q[1] regex" --> S6["this[q[0]] = q[3].call(this, match.replace(q[1], q[2]))"]
    P -. "match kosong" .-> U["nilai undefined"]
    style S1 fill:#2d7d46,color:#fff
    style S3 fill:#f59e0b,color:#000
    style S4 fill:#8b5cf6,color:#fff
    style S6 fill:#8b5cf6,color:#fff
    style U fill:#dc2626,color:#fff
%% fig: Cabang penanganan satu elemen props di rgxMapper
%% desc: Bentuk q menentukan apakah match dipakai langsung, diganti konstanta, atau dilewatkan ke strMapper dan fungsi sanitasi.
Fig. 2: Cabang penanganan satu elemen props di rgxMapperBentuk q menentukan apakah match dipakai langsung, diganti konstanta, atau dilewatkan ke strMapper dan fungsi sanitasi.

Setiap cabang bermuara pada satu penugasan ke this, yaitu objek data milik UAItem, karena rgxMapper selalu dipanggil dengan call. src/main/ua-parser.js:218-279

strMapper dan string map

strMapper mengembalikan kunci map yang cocok, mengembalikan undefined bila kunci yang cocok adalah '?', dan jatuh ke map['*'] atau ke string aslinya bila tidak ada yang cocok. src/main/ua-parser.js:285-300 src/main/ua-parser.js:299

MapContoh kunci dan nilaiRujukan
windowsVersionMap'XP' menjadi ['5.1', '5.2'], '10' menjadi ['6.4', '10.0'], 'NT' menjadi ''src/main/ua-parser.js:306-318
formFactorsMap'tablet' menjadi ['Tablet', 'EInk'], 'xr' menjadi ['VR', 'XR'], '*' menjadi undefinedsrc/main/ua-parser.js:320-329
browserHintsMap'Edge' menjadi 'Microsoft Edge', 'Chrome WebView' menjadi 'Android WebView'src/main/ua-parser.js:331-341

windowsVersionMap dipakai di dalam props dengan bentuk [[VERSION, /(;|\))/g, '', strMapper, windowsVersionMap], [NAME, WINDOWS]], artinya hasil tangkapan dibersihkan regex lebih dulu lalu dipetakan. src/main/ua-parser.js:981-992 Bentuk pendek tanpa sanitasi juga dipakai pada cabang Windows RT. src/main/ua-parser.js:981-992

formFactorsMap dan browserHintsMap hanya dipakai jalur Client Hints. src/main/ua-parser.js:320-329 src/main/ua-parser.js:331-341

strTest adalah varian ringkas: ia mengembalikan ifTrue atau ifFalse berdasarkan satu regex saja. src/main/ua-parser.js:281-283 Contohnya [TYPE, strTest, { 'test': /ta?b/i, 'ifTrue': TABLET, 'ifFalse': MOBILE }] pada perangkat T-Mobile. src/main/ua-parser.js:790 Sebaliknya strMapper bisa langsung dipakai di props, misalnya [TYPE, strMapper, { 'mobile' : 'Mobile', 'xr' : 'VR', '*' : TABLET }]. src/main/ua-parser.js:946

Jalur kedua: parseCH

parseCH memakai mekanisme yang sama dengan masukan berbeda. Untuk cpu, nama arsitektur dari Client Hints ditambahi '64' bila bitness bernilai 64, lalu diumpankan ke rgxMapper sebagai archName + ';'. src/main/ua-parser.js:1353-1358 Untuk device, model dari Client Hints di-parse ulang lewat rgxMapper.call(reParse, 'droid 9; ' + uaCH[MODEL] + ')', rgxMap) agar type dan vendor ikut terisi. src/main/ua-parser.js:1360-1388 Rincian nilai Client Hints ada di Deteksi Client Hints.

Dari hasil map ke IData

defaultProps menetapkan properti awal tiap tipe: browser [NAME, VERSION, MAJOR, TYPE], cpu [ARCHITECTURE], device [TYPE, MODEL, VENDOR], engine [NAME, VERSION], os [NAME, VERSION]. src/main/ua-parser.js:1085-1111

createIData memakai daftar itu untuk membangun konstruktor IData, yang mengisi setiap properti lewat setProps dan menyimpan referensi item pemiliknya. src/main/ua-parser.js:1113-1198 src/main/ua-parser.js:1120-1126 Prototipe IData menambahkan withClientHints dan withFeatureCheck yang memanggil balik item. src/main/ua-parser.js:1128-1150

Bentuk objek hasil serta perilaku is, toString, dan then dibahas di API Utama dan Bentuk Hasil; withFeatureCheck dibahas di Feature Check dan Perbandingan Hasil.