zsyp 1.2.3 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.js CHANGED
@@ -2,9 +2,7 @@ require('dotenv').config({ path: '/etc/default/zsyp' });
2
2
 
3
3
  const makeApp = require('./lib/app');
4
4
 
5
- const {
6
- ZSYP_PORT: PORT = 3090,
7
- } = process.env;
5
+ const { ZSYP_PORT: PORT = 3090 } = process.env;
8
6
 
9
7
  const app = makeApp();
10
8
 
package/lib/app.js CHANGED
@@ -6,10 +6,7 @@ const event = require('./event');
6
6
 
7
7
  module.exports = makeApp;
8
8
 
9
- const {
10
- ZSYP_DOMAINS: domains,
11
- ZSYP_DB: database = 'mongodb://localhost/zsyp'
12
- } = process.env;
9
+ const { ZSYP_DOMAINS: domains, ZSYP_DB: database = 'mongodb://localhost/zsyp' } = process.env;
13
10
 
14
11
  function makeApp(opts = {}) {
15
12
  const app = connect();
@@ -23,4 +20,3 @@ function makeApp(opts = {}) {
23
20
 
24
21
  return app;
25
22
  }
26
-
package/lib/converter.js CHANGED
@@ -1,14 +1,13 @@
1
1
  module.exports = makeConverter;
2
2
 
3
3
  function makeConverter({ converter }) {
4
-
5
- async function convert(req, res, next) {
4
+ async function convert(req, _res, next) {
6
5
  try {
7
6
  const { item, meta } = await converter(req.body);
8
7
  req.item = item;
9
8
  req.meta = meta;
10
9
  return next();
11
- } catch(e) {
10
+ } catch (e) {
12
11
  return next(e);
13
12
  }
14
13
  }
@@ -16,8 +15,7 @@ function makeConverter({ converter }) {
16
15
  return converter ? convert : keep;
17
16
  }
18
17
 
19
- function keep(req, res, next) {
18
+ function keep(req, _res, next) {
20
19
  req.item = req.body;
21
20
  return next();
22
21
  }
23
-
package/lib/filter.js CHANGED
@@ -3,7 +3,6 @@ module.exports = makeFilter;
3
3
  /* global URL */
4
4
 
5
5
  function makeFilter({ domains }) {
6
-
7
6
  if (!domains) {
8
7
  return;
9
8
  }
@@ -11,7 +10,7 @@ function makeFilter({ domains }) {
11
10
  const domainRe = domains && new RegExp(domains);
12
11
  return filter;
13
12
 
14
- function filter({ body: csp }, res, next) {
13
+ function filter({ body: csp }, _res, next) {
15
14
  const uri = csp['csp-report']['document-uri'];
16
15
  const { hostname } = new URL(uri);
17
16
  if (domainRe.test(hostname)) {
@@ -19,4 +18,3 @@ function makeFilter({ domains }) {
19
18
  }
20
19
  }
21
20
  }
22
-
package/lib/from.js CHANGED
@@ -2,15 +2,10 @@ const { parse } = require('useragent');
2
2
 
3
3
  module.exports = from;
4
4
 
5
- function from(req, res, next) {
5
+ function from(req, _res, next) {
6
6
  const { headers, body } = req;
7
- const ua = body?.from?.ua ?? headers['user-agent'];
8
- const {
9
- family,
10
- major,
11
- os,
12
- device
13
- } = parse(ua);
7
+ const ua = body?.from?.ua ?? headers['user-agent'];
8
+ const { family, major, os, device } = parse(ua);
14
9
  const data = {
15
10
  ua,
16
11
  browser: {
package/lib/logger.js CHANGED
@@ -5,18 +5,19 @@ module.exports = makeLogger;
5
5
  function makeLogger({ db, name }) {
6
6
  const cache = Object.create(null);
7
7
 
8
- const getCollection = name ?
9
- () => collectionFromCache(name) :
10
- ({ name }) => collectionFromCache(name);
8
+ const getCollection = name ? () => collectionFromCache(name) : ({ name }) => collectionFromCache(name);
11
9
 
12
10
  return log;
13
11
 
14
- function log({ from, item, meta }, res, next) {
12
+ function log({ from, item, meta }, _res, next) {
15
13
  debug('saving %j', item);
16
14
  getCollection(meta)
17
15
  .insertOne({ ...item, from })
18
16
  .then(() => next())
19
- .catch(err => { console.error(err); next(); });
17
+ .catch(err => {
18
+ console.error(err);
19
+ next();
20
+ });
20
21
  }
21
22
 
22
23
  function collectionFromCache(name) {
package/lib/router.js CHANGED
@@ -1,31 +1,43 @@
1
- const Router = require('router');
2
-
3
1
  const from = require('./from');
4
2
  const makeFilter = require('./filter');
5
3
  const makeConverter = require('./converter');
6
4
  const makeLogger = require('./logger');
7
5
 
8
- module.exports = function (opts) {
9
- const router = new Router({
10
- strict: true,
11
- caseSensitive: true
12
- });
6
+ module.exports = router;
7
+
8
+ function router(opts) {
9
+ const stack = [respond, from, makeFilter(opts), makeConverter(opts), makeLogger(opts), opts.finalMiddleware].filter(
10
+ Boolean
11
+ );
13
12
 
14
- const stack = [
15
- respond,
16
- from,
17
- makeFilter(opts),
18
- makeConverter(opts),
19
- makeLogger(opts),
20
- opts.finalMiddleware
21
- ].filter(Boolean);
13
+ return loop(stack);
14
+ }
22
15
 
23
- router.post('/', stack);
16
+ function loop(stack) {
17
+ return (req, res, next) => {
18
+ let i = 0;
19
+ fn();
24
20
 
25
- return router;
26
- };
21
+ function fn() {
22
+ const layer = stack[i++];
23
+ if (!layer) {
24
+ return next();
25
+ }
26
+ try {
27
+ layer(req, res, fn);
28
+ } catch (err) {
29
+ next(err);
30
+ }
31
+ }
32
+ };
33
+ }
27
34
 
28
35
  function respond(req, res, next) {
36
+ if (req.method !== 'POST' && req.path !== '/') {
37
+ res.statusCode = 404;
38
+ res.end();
39
+ return;
40
+ }
29
41
  res.statusCode = 204; // empty
30
42
  res.end();
31
43
  next();
package/lib/source-map.js CHANGED
@@ -1,5 +1,5 @@
1
- const { readFile } = require('fs').promises;
2
- const path = require('path');
1
+ const { readFile } = require('node:fs').promises;
2
+ const path = require('node:path');
3
3
  const { SourceMapConsumer } = require('source-map');
4
4
  const { LRUCache: LRU } = require('lru-cache');
5
5
 
@@ -8,20 +8,16 @@ module.exports = {
8
8
  clear
9
9
  };
10
10
 
11
- const {
12
- ZSYP_SOURCE_MAP_DIR = '/var/lib/zsyp',
13
- ZSYP_SOURCE_MAP_CACHE_SIZE = 30
14
- } = process.env;
15
-
11
+ const { ZSYP_SOURCE_MAP_DIR = '/var/lib/zsyp', ZSYP_SOURCE_MAP_CACHE_SIZE = 30 } = process.env;
16
12
 
17
13
  const cache = new LRU({
18
14
  max: ZSYP_SOURCE_MAP_CACHE_SIZE,
19
15
  fetchMethod: fetchSourceMap,
20
- dispose: smc => smc && smc.destroy()
16
+ dispose: smc => smc?.destroy()
21
17
  });
22
18
 
23
19
  async function resolve({ an, av }, frame) {
24
- const [source, line, column ] = frame;
20
+ const [source, line, column] = frame;
25
21
  const smc = await loadSourceMap(an, av, source);
26
22
  if (!smc) {
27
23
  return frame;
@@ -48,7 +44,7 @@ function loadSourceMap(app, version, source) {
48
44
 
49
45
  async function fetchSourceMap(filename) {
50
46
  try {
51
- const txt = await readFile(filename + '.map');
47
+ const txt = await readFile(`${filename}.map`);
52
48
  const map = JSON.parse(txt);
53
49
  return new SourceMapConsumer(map);
54
50
  } catch {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zsyp",
3
- "version": "1.2.3",
3
+ "version": "1.3.1",
4
4
  "description": "CSP violation reports logger.",
5
5
  "author": {
6
6
  "name": "Damian Krzeminski",
@@ -21,15 +21,14 @@
21
21
  "debug": "~2 || ~3 || ~4",
22
22
  "dotenv": "~16",
23
23
  "error-stack-parser": "^2.1.4",
24
- "lru-cache": "~10",
24
+ "lru-cache": "~11",
25
25
  "mniam": "~4",
26
- "router": "~1",
27
26
  "source-map": "^0.7.4",
28
27
  "useragent": "^2.3.0"
29
28
  },
30
29
  "devDependencies": {
31
- "@pirxpilot/jshint": "~3",
32
- "supertest": "~6"
30
+ "@biomejs/biome": "^1.9.4",
31
+ "supertest-fetch": "~2"
33
32
  },
34
33
  "scripts": {
35
34
  "test": "make check"