// Platform subtype (device family) derivation for the trusted platform signal. The // server records the wrapper kind (vk / telegram / direct) itself, from the validated // establish path; the client supplies only this device subtype. For VK it is ignored // server-side (the gateway derives a trusted subtype from the signed vk_platform); for // Telegram and a direct (web/native) session it is client-reported and best-effort. import { insideTelegram, telegramPlatform } from './telegram'; import { clientChannel } from './channel'; export type Subtype = 'ios' | 'android' | 'web'; // normalizeSubtype coerces a raw device string (Telegram's WebApp.platform, a // Capacitor platform, VK's vk_platform, …) to the ios/android/web wire subtype, // mapping any iPhone/iPad variant to ios and defaulting anything unrecognised — // desktop, tdesktop, an empty value — to web. export function normalizeSubtype(raw: string): Subtype { const s = raw.toLowerCase(); if (s.includes('android')) return 'android'; if (s.includes('iphone') || s.includes('ipad') || s === 'ios') return 'ios'; return 'web'; } // platformSubtype reports this client's best-effort device family for the current // launch: Telegram's reported platform inside a Mini App, otherwise the Capacitor / // web channel for a direct session. VK does not use it (server-derived from the signed // launch params). export function platformSubtype(): Subtype { if (insideTelegram()) return normalizeSubtype(telegramPlatform()); return normalizeSubtype(clientChannel()); }