class DeviceInfo { constructor(deviceInfo = null) { this.ipAddress = null // From User Agent (see: https://www.npmjs.com/package/ua-parser-js) this.browserName = null this.browserVersion = null this.osName = null this.osVersion = null this.deviceType = null // From client this.clientVersion = null this.manufacturer = null this.model = null this.sdkVersion = null // Android Only this.serverVersion = null if (deviceInfo) { this.construct(deviceInfo) } } construct(deviceInfo) { for (const key in deviceInfo) { if (deviceInfo[key] !== undefined && this[key] !== undefined) { this[key] = deviceInfo[key] } } } toJSON() { const obj = { ipAddress: this.ipAddress, browserName: this.browserName, browserVersion: this.browserVersion, osName: this.osName, osVersion: this.osVersion, deviceType: this.deviceType, clientVersion: this.clientVersion, manufacturer: this.manufacturer, model: this.model, sdkVersion: this.sdkVersion, serverVersion: this.serverVersion } for (const key in obj) { if (obj[key] === null || obj[key] === undefined) { delete obj[key] } } return obj } get deviceDescription() { if (this.model) { // Set from mobile apps if (this.sdkVersion) return `${this.model} SDK ${this.sdkVersion} / v${this.clientVersion}` return `${this.model} / v${this.clientVersion}` } return `${this.osName} ${this.osVersion} / ${this.browserName}` } setData(ip, ua, clientDeviceInfo, serverVersion) { this.ipAddress = ip || null const uaObj = ua || {} this.browserName = uaObj.browser.name || null this.browserVersion = uaObj.browser.version || null this.osName = uaObj.os.name || null this.osVersion = uaObj.os.version || null this.deviceType = uaObj.device.type || null const cdi = clientDeviceInfo || {} this.clientVersion = cdi.clientVersion || null this.manufacturer = cdi.manufacturer || null this.model = cdi.model || null this.sdkVersion = cdi.sdkVersion || null this.serverVersion = serverVersion || null } } module.exports = DeviceInfo