fiftyone.devicedetection.onpremise
Version:
Device detection on-premise services for the 51Degrees Pipeline API
180 lines (170 loc) • 7.74 kB
JavaScript
/* *********************************************************************
* This Original Work is copyright of 51 Degrees Mobile Experts Limited.
* Copyright 2026 51 Degrees Mobile Experts Limited, Davidson House,
* Forbury Square, Reading, Berkshire, United Kingdom RG1 3EU.
*
* This Original Work is licensed under the European Union Public Licence
* (EUPL) v.1.2 and is subject to its terms as set out below.
*
* If a copy of the EUPL was not distributed with this file, You can obtain
* one at https://opensource.org/licenses/EUPL-1.2.
*
* The 'Compatible Licences' set out in the Appendix to the EUPL (as may be
* amended by the European Commission) shall be deemed incompatible for
* the purposes of the Work and the provisions of the compatibility
* clause in Article 5 of the EUPL shall not apply.
*
* If using the Work as, or as part of, a network application, by
* including the attribution notice(s) required under Article 5 of the EUPL
* in the end user terms of the application under an appropriate heading,
* such notice(s) shall fulfill the requirements of that article.
* ********************************************************************* */
const os = require('os');
const core = require('fiftyone.pipeline.core');
const DeviceDetectionOnPremise = require('./deviceDetectionOnPremise');
const constants = require('./constants');
const PipelineBuilder = core.PipelineBuilder;
const ShareUsageElement = require('fiftyone.pipeline.engines.fiftyone').ShareUsage;
const errorMessages = require('fiftyone.devicedetection.shared').errorMessages;
/**
* @typedef {import('fiftyone.pipeline.engines').DataFileUpdateService} DataFileUpdateService
*/
class DeviceDetectionOnPremisePipelineBuilder extends PipelineBuilder {
/**
* Extension of pipelineBuilder class that allows for the quick
* generation of a device detection pipeline. Adds share usage,
* caching and toggles between on premise and cloud with
* simple paramater changes
*
* @param {object} options the options for the pipeline builder
* @param {string} [options.licenceKeys] license key(s) used by the
* data file update service. A key can be obtained from the
* 51Degrees website: https://51degrees.com/pricing.
* This parameter MUST be set when using a data file.
* If you do not wish to use a key then you can specify
* an empty string, but this will cause automatic updates
* to be disabled.
* @param {string} options.dataFile dataFile path for the on premise engine
* @param {boolean} [options.dataUpdateVerifyMd5] whether to check MD5 of datafile
* @param {boolean} [options.dataUpdateUseUrlFormatter] whether to append default URL params for Data File download
* @param {boolean} [options.autoUpdate] whether to autoUpdate the dataFile
* @param {string} [options.dataUpdateUrl] base url for the datafile
* @param {number} [options.pollingInterval] How often to poll for
* updates to the datafile (minutes)
* @param {number} [options.updateTimeMaximumRandomisation]
* Maximum randomisation offset in seconds to polling time interval
* @param {boolean} [options.shareUsage] whether to include the share
* usage element
* @param {boolean} [options.fileSystemWatcher] whether to monitor the datafile
* path for changes
* @param {boolean} [options.updateOnStart] whether to download / update a
* dataFile to the path specified in options.dataFile on start
* @param {number} [options.cacheSize] size of the default cache
* (includes cache if set). NOTE: This is not supported for on-premise
* engine.
* @param {Array<string>} [options.restrictedProperties] list of properties the engine
* will be restricted to
* @param {string} [options.performanceProfile] used to control the tradeoff
* between performance and system memory usage (Only applies to on-premise,
* not cloud) options are: LowMemory, MaxPerformance, Balanced,
* BalancedTemp, HighPerformance
* @param {number} [options.concurrency] defaults to the number of cpus
* in the machine
* @param {boolean} [options.updateMatchedUserAgent] True if the detection
* should record the matched characters from the target User-Agent
* @param {number} [options.maxMatchedUserAgentLength] Number of characters to
* consider in the matched User-Agent. Ignored if updateMatchedUserAgent is
* false
* @param {number} [options.drift] Set maximum drift in hash position to allow
* when processing HTTP headers.
* @param {number} [options.difference] Set the maximum difference to allow
* when processing HTTP headers. The difference is the difference in hash
* value between the hash that was found, and the hash that is being searched
* for. By default this is 0.
* @param {string} [options.allowUnmatched] If set to false, a non-matching
* User-Agent will result in properties without set values.
* If set to true, a non-matching User-Agent will cause the 'default profiles'
* to be returned.
* This means that properties will always have values
* (i.e. no need to check .HasValue) but some may be inaccurate.
* By default, this is false.
* @param {boolean} [options.createTempDataCopy] If true, the engine will
* create a copy of the data file in a temporary location
* rather than using the file provided directly. If not
* loading all data into memory, this is required for
* automatic data updates to occur.
* @param {string} [options.tempDataDir] The directory to use for the
* temporary data copy if 'createTempDataCopy' is set to true.
* @param {DataFileUpdateService} [options.dataFileUpdateService] Set
* DataFileUpdateService so the datafiles can receive
* automatic updates
*/
constructor (
{
dataFileUpdateService = null,
licenceKeys = null,
dataFile = null,
dataUpdateVerifyMd5 = true,
dataUpdateUseUrlFormatter = true,
autoUpdate = true,
dataUpdateUrl = null,
pollingInterval = 30,
updateTimeMaximumRandomisation = 10,
shareUsage = true,
fileSystemWatcher = true,
updateOnStart = false,
cacheSize = null,
restrictedProperties,
performanceProfile = 'LowMemory',
concurrency = os.cpus().length,
updateMatchedUserAgent = false,
maxMatchedUserAgentLength,
drift,
difference,
allowUnmatched = false,
createTempDataCopy,
tempDataDir
}) {
super(...arguments);
const deprecatedOptions = ['usePredictiveGraph', 'usePerformanceGraph'];
for (const option of deprecatedOptions) {
if (arguments[0].hasOwnProperty(option)) {
console.warn(`{${option}} option is deprecated and has no effect on the configuration`);
}
}
// Check if share usage enabled and add it to the pipeline if so
if (shareUsage) {
this.flowElements.push(new ShareUsageElement());
}
if (dataUpdateUrl == null) {
dataUpdateUrl = constants.dataUpdateUrl;
}
if (cacheSize) {
throw errorMessages.cacheNotSupport;
}
this.flowElements.push(new DeviceDetectionOnPremise(
{
dataFilePath: dataFile,
autoUpdate,
dataUpdateUrl,
dataUpdateVerifyMd5,
dataUpdateUseUrlFormatter,
fileSystemWatcher,
pollingInterval,
updateTimeMaximumRandomisation,
licenceKeys,
restrictedProperties,
performanceProfile,
concurrency,
updateMatchedUserAgent,
maxMatchedUserAgentLength,
drift,
difference,
allowUnmatched,
updateOnStart,
createTempDataCopy,
tempDataDir
}));
}
}
module.exports = DeviceDetectionOnPremisePipelineBuilder;