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-14701
Semua getter publik didaftarkan lewat setProps: getBrowser, getCPU, getDevice, getEngine, getOS, dan getResult. src/main/ua-parser.js:1493-14992 Untuk tipe selain result, fungsi pabrik dari createItemFunc membuat UAItem dengan rgxMap[itemType], memanggil parseUA(), lalu mengembalikan data. src/main/ua-parser.js:1483-14893 getResult() membuat UAItem bertipe result dan mengisinya dari kelima getter lain. src/main/ua-parser.js:1471-14824
UAItem sendiri adalah wadah: ia menyimpan itemType, ua, uaCH, rgxMap, dan data yang dibuat oleh createIData. src/main/ua-parser.js:1226-12355
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.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-13186
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-327
Bagian Helper berisi dua belas fungsi kecil yang dipakai lintas pipeline. src/main/ua-parser.js:126-2128
| Helper | Peran di pipeline | Rujukan |
|---|---|---|
extend | Menggabungkan regex map extension di depan map default, hanya bila lariknya genap | src/main/ua-parser.js:130-1459 |
enumerize | Mengubah daftar nama properti menjadi objek enum | src/main/ua-parser.js:146-15210 |
has | Membandingkan string tanpa peduli huruf besar/kecil, juga terhadap larik alias | src/main/ua-parser.js:153-16111 |
isExtensions | Mengenali objek berbentuk map extension lewat kunci browser, cpu, device, engine, os | src/main/ua-parser.js:162-16612 |
itemListToArray | Memecah header daftar ber-;v= menjadi larik {brand, version} | src/main/ua-parser.js:170-18313 |
lowerize | Menurunkan huruf bila nilai berupa string | src/main/ua-parser.js:184-18614 |
majorize | Mengambil segmen mayor dari string versi | src/main/ua-parser.js:187-18915 |
normalizeHeaderValue | Membuang tanda kutip dan memangkas nilai header ke UA_MAX_LENGTH | src/main/ua-parser.js:190-19216 |
setProps | Mengisi properti objek dari daftar pasangan nama dan nilai | src/main/ua-parser.js:193-20517 |
strip | Menghapus pola dari string | src/main/ua-parser.js:206-20818 |
trim | Membuang spasi awal lalu memotong ke panjang tertentu | src/main/ua-parser.js:209-21219 |
isExtensions dipakai extend untuk memilih format masukan extension. src/main/ua-parser.js:162-16612 has adalah inti pencocokan string map, karena ia menerima larik alias sebagai sisi pertama. src/main/ua-parser.js:153-16111 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-15210 src/main/ua-parser.js:1516-152020
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-150421 src/main/ua-parser.js:1505-150822 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-35323
| Kunci | Baris awal | Bentuk props pada pasangan pertama |
|---|---|---|
browser | src/main/ua-parser.js:347-35323 | [VERSION, [NAME, PREFIX_MOBILE + 'Chrome']] untuk Chrome for Android/iOS |
cpu | src/main/ua-parser.js:541-54424 | [[ARCHITECTURE, 'amd64']] |
device | src/main/ua-parser.js:573-58125 | [MODEL, [VENDOR, SAMSUNG], [TYPE, TABLET]] |
engine | src/main/ua-parser.js:955-95826 | [VERSION, [NAME, EDGE+'HTML']] |
os | src/main/ua-parser.js:981-99227 | [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-22928 Perulangan berhenti pada pasangan pertama yang menghasilkan matches, jadi urutan pasangan menentukan prioritas. src/main/ua-parser.js:232-23529
os adalah kunci terakhir dari defaultRegexes, dan objek map ditutup tepat sebelum bagian Factories. src/main/ua-parser.js:107930
⚠️ Urutan di dalam
defaultRegexesadalah logika, bukan sekadar dokumentasi. KarenargxMapperberhenti pada pasangan pertama yang cocok, regex yang terlalu umum sebelum regex khusus akan menutup cabang khusus itu. src/main/ua-parser.js:232-23529
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-27331
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.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-27932
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-30033 src/main/ua-parser.js:29934
| Map | Contoh kunci dan nilai | Rujukan |
|---|---|---|
windowsVersionMap | 'XP' menjadi ['5.1', '5.2'], '10' menjadi ['6.4', '10.0'], 'NT' menjadi '' | src/main/ua-parser.js:306-31835 |
formFactorsMap | 'tablet' menjadi ['Tablet', 'EInk'], 'xr' menjadi ['VR', 'XR'], '*' menjadi undefined | src/main/ua-parser.js:320-32936 |
browserHintsMap | 'Edge' menjadi 'Microsoft Edge', 'Chrome WebView' menjadi 'Android WebView' | src/main/ua-parser.js:331-34137 |
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-99227 Bentuk pendek tanpa sanitasi juga dipakai pada cabang Windows RT. src/main/ua-parser.js:981-99227
formFactorsMap dan browserHintsMap hanya dipakai jalur Client Hints. src/main/ua-parser.js:320-32936 src/main/ua-parser.js:331-34137
strTest adalah varian ringkas: ia mengembalikan ifTrue atau ifFalse berdasarkan satu regex saja. src/main/ua-parser.js:281-28338 Contohnya [TYPE, strTest, { 'test': /ta?b/i, 'ifTrue': TABLET, 'ifFalse': MOBILE }] pada perangkat T-Mobile. src/main/ua-parser.js:79039 Sebaliknya strMapper bisa langsung dipakai di props, misalnya [TYPE, strMapper, { 'mobile' : 'Mobile', 'xr' : 'VR', '*' : TABLET }]. src/main/ua-parser.js:94640
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-135841 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-138842 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-111143
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-119844 src/main/ua-parser.js:1120-112645 Prototipe IData menambahkan withClientHints dan withFeatureCheck yang memanggil balik item. src/main/ua-parser.js:1128-115046
Bentuk objek hasil serta perilaku is, toString, dan then dibahas di API Utama dan Bentuk Hasil; withFeatureCheck dibahas di Feature Check dan Perbandingan Hasil.