Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 39 additions & 3 deletions API.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@

Scooter uses the [useragent] package to provide user-agent information. For
more details of what information scooter provides, please see the [useragent](https://www.npmjs.org/package/useragent).
Scooter uses the [my-ua-parser](https://www.npmjs.com/package/my-ua-parser) package to provide user-agent information. For
more details of what information scooter provides, please see the [my-ua-parser](https://www.npmjs.com/package/my-ua-parser) documentation.

# Usage

Expand All @@ -17,7 +17,7 @@ const start = async () => {
path: '/user-agent',
handler: (request, h) => {

return request.plugins.scooter;
return request.userAgent();
}
});

Expand All @@ -28,3 +28,39 @@ const start = async () => {

start();
```

## `request.userAgent()`

A convenience decoration added to every request. Returns the same parsed user-agent object as `request.plugins.scooter`.

```javascript
// Both are equivalent
request.userAgent()
request.plugins.scooter
```

The returned object has the following shape:

```
{
family: string, // browser name, e.g. 'Chrome'
major: string, // major version, e.g. '91'
minor: string, // minor version, e.g. '0'
patch: string, // patch version, e.g. '4472'
source: string, // original user-agent header value
os: {
family: string, // OS name, e.g. 'Windows'
major: string,
minor: string,
patch: string
},
device: {
family: string, // device model or type, e.g. 'iPhone'
brand: string, // device vendor, e.g. 'Apple'
model: string // device model, e.g. 'iPhone'
}
}
```

Unknown values default to `'Other'` for family fields and `'0'` for version fields.

37 changes: 37 additions & 0 deletions lib/index.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import { Plugin } from '@hapi/hapi';

export interface ScooterVersionInfo {
family: string;
major: string;
minor: string;
patch: string;
}

export interface DeviceInfo {
family: string;
brand: string | undefined;
model: string | undefined;
}

export interface ScooterResult {
family: string;
major: string;
minor: string;
patch: string;
source: string | undefined;
os: ScooterVersionInfo;
device: DeviceInfo;
}

declare module '@hapi/hapi' {

interface PluginsStates {
scooter: ScooterResult;
}

interface Request {
userAgent(): ScooterResult;
}
}

export const plugin: Plugin<void>;
47 changes: 42 additions & 5 deletions lib/index.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,44 @@
'use strict';

const Useragent = require('useragent');
const Useragent = require('my-ua-parser');

// Requires semver be installed
require('useragent/features'); // Enhances Useragent
const internals = {};


const internals = {};
internals.parseVersion = function (version, index) {

if (!version) {
return '0';
}

const parts = version.split('.');
return parts[index] || '0';
};


internals.parseUserAgent = function (userAgentString) {

const result = Useragent(userAgentString || '');

return {
family: result.browser.name || 'Other',
major: internals.parseVersion(result.browser.version, 0),
minor: internals.parseVersion(result.browser.version, 1),
patch: internals.parseVersion(result.browser.version, 2),
source: userAgentString,
os: {
family: result.os.name || 'Other',
major: internals.parseVersion(result.os.version, 0),
minor: internals.parseVersion(result.os.version, 1),
patch: internals.parseVersion(result.os.version, 2)
},
device: {
family: result.device.model || result.device.type || 'Other',
brand: result.device.vendor,
model: result.device.model
}
};
};


exports.plugin = {
Expand All @@ -18,12 +50,17 @@ exports.plugin = {
register: function (server, options) {

server.ext('onRequest', internals.onRequest);

server.decorate('request', 'userAgent', function () {

return this.plugins.scooter;
});
}
};


internals.onRequest = function (request, h) {

request.plugins.scooter = Useragent.lookup(request.headers['user-agent']);
request.plugins.scooter = internals.parseUserAgent(request.headers['user-agent']);
return h.continue;
};
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
"version": "7.0.0",
"repository": "git://github.com/hapijs/scooter",
"main": "lib/index.js",
"types": "lib/index.d.ts",
"files": [
"lib"
],
Expand All @@ -18,8 +19,7 @@
]
},
"dependencies": {
"semver": "^7.3.8",
"useragent": "^2.3.0"
"my-ua-parser": "^2.0.4"
},
"devDependencies": {
"@hapi/code": "^9.0.0",
Expand Down
2 changes: 1 addition & 1 deletion test/esm.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ describe('import()', () => {

it('exposes all methods and classes as named imports', () => {

expect(Object.keys(Scooter)).to.equal([
expect(Object.keys(Scooter)).to.contain([
'default',
'plugin'
]);
Expand Down
Loading