@sberid/js-sdk
Version:
Javascript SDK для партнеров Сбер ID, упрощающая подключение SberbankID на сайте.
184 lines (143 loc) • 4.5 kB
text/typescript
import {
AbstractParser,
AppDetail,
BrowserDetail,
OSDetail,
ParsedResult,
ParserConfig,
PlatformDetail,
} from './interfaces';
import {
appParsersList,
browserParsersList,
osParsersList,
platformParsersList,
textToLowerCase,
} from './utils';
export class Parser implements AbstractParser {
private ua: string;
parsedResult: ParsedResult;
constructor(UA: string | undefined) {
if (!UA) {
throw new Error("UserAgent parameter can't be empty ");
}
this.ua = UA;
this.parsedResult = {} as ParsedResult;
this.parse();
}
getUA(): string {
return this.ua;
}
test(regex: RegExp): boolean {
return regex.test(this.ua);
}
getDetailInfo<T>(parsersList: ParserConfig<T>[]): ParserConfig<T> | undefined {
return parsersList.find((item) => {
if (typeof item.test === 'function') {
return item.test(this);
}
if (item.test instanceof Array) {
return item.test.some((condition) => this.test(condition));
}
throw new Error("Browser's test function is not valid");
});
}
parseBrowser(): BrowserDetail {
this.parsedResult.browser = {};
const browserDetail = this.getDetailInfo(browserParsersList);
if (browserDetail) {
this.parsedResult.browser = browserDetail.describe(this.getUA());
}
return this.parsedResult.browser;
}
getBrowser(): BrowserDetail {
if (this.parsedResult.browser) {
return this.parsedResult.browser;
}
return this.parseBrowser();
}
getBrowserName(toLowerCase?: boolean): string {
if (toLowerCase) {
return textToLowerCase(this.getBrowser().name);
}
return this.getBrowser().name || '';
}
getBrowserVersion(): string | undefined {
return this.getBrowser().version;
}
parseOS(): OSDetail {
this.parsedResult.os = {};
const osDetail = this.getDetailInfo(osParsersList);
if (osDetail) {
this.parsedResult.os = osDetail.describe(this.getUA());
}
return this.parsedResult.os;
}
getOS(): OSDetail {
if (this.parsedResult.os) {
return this.parsedResult.os;
}
return this.parseOS();
}
getOSName(toLowerCase?: boolean): string {
const name = this.getOS().name;
if (toLowerCase) {
return textToLowerCase(name);
}
return name || '';
}
getOSVersion(): string | undefined {
return this.getOS().version;
}
parseApp(): AppDetail {
this.parsedResult.app = {};
const appDetail = this.getDetailInfo(appParsersList);
if (appDetail) {
this.parsedResult.app = appDetail.describe(this.getUA());
}
return this.parsedResult.app;
}
getApp(): AppDetail {
if (this.parsedResult.app) {
return this.parsedResult.app;
}
return this.parseApp();
}
getAppName(toLowerCase?: boolean): string {
if (toLowerCase) {
return textToLowerCase(this.getApp().name);
}
return this.getApp().name || '';
}
parsePlatform(): PlatformDetail {
this.parsedResult.platform = {};
const platformDetail = this.getDetailInfo<PlatformDetail>(platformParsersList);
if (platformDetail) {
this.parsedResult.platform = platformDetail.describe(this.getUA());
}
return this.parsedResult.platform;
}
getPlatform(): PlatformDetail {
if (this.parsedResult.platform) {
return this.parsedResult.platform;
}
return this.parsePlatform();
}
getPlatformType(toLowerCase?: boolean): string {
const type = this.getPlatform().type;
if (toLowerCase) {
return textToLowerCase(type);
}
return type || '';
}
parse(): AbstractParser {
this.parseBrowser();
this.parseOS();
this.parsePlatform();
this.parseApp();
return this;
}
getResult(): ParsedResult {
return {...this.parsedResult};
}
}