@naturalcycles/backend-lib 2.73.2 → 2.73.3

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/dist/index.d.ts CHANGED
@@ -30,5 +30,6 @@ import { createAsyncLocalStorage, getRequest, getRequestLogger, requestLogger }
30
30
  import type { RequestWithLog } from './server/handlers/createGaeLogMiddleware';
31
31
  export * from './server/handlers/createGaeLogMiddleware';
32
32
  import { safeJsonMiddleware } from './server/handlers/safeJsonMiddleware';
33
+ export * from './server/request.util';
33
34
  export type { MethodOverrideCfg, SentrySharedServiceCfg, RequestHandlerWithPath, RequestHandlerCfg, DefaultAppCfg, StartServerCfg, StartServerData, EnvSharedServiceCfg, BaseEnv, AdminMiddleware, AdminServiceCfg, AdminInfo, RequireAdminCfg, SecureHeaderMiddlewareCfg, BodyParserTimeoutCfg, RequestTimeoutCfg, SimpleRequestLoggerCfg, ReqValidationOptions, RequestWithLog, };
34
35
  export { BackendServer, SentrySharedService, EnvSharedService, reqValidation, notFoundHandler, genericErrorHandler, methodOverride, createDefaultApp, startServer, catchWrapper, getDefaultRouter, isGAE, statusHandler, statusHandlerData, okHandler, getDeployInfo, onFinished, respondWithError, logRequest, FirebaseSharedService, createAdminMiddleware, BaseAdminService, loginHtml, createSecureHeaderMiddleware, bodyParserTimeout, clearBodyParserTimeout, requestTimeout, simpleRequestLogger, coloredHttpCode, validateBody, validateParams, validateQuery, createAsyncLocalStorage, getRequest, getRequestLogger, requestLogger, serverStatsHTMLHandler, serverStatsMiddleware, safeJsonMiddleware, };
package/dist/index.js CHANGED
@@ -69,3 +69,4 @@ Object.defineProperty(exports, "requestLogger", { enumerable: true, get: functio
69
69
  (0, tslib_1.__exportStar)(require("./server/handlers/createGaeLogMiddleware"), exports);
70
70
  const safeJsonMiddleware_1 = require("./server/handlers/safeJsonMiddleware");
71
71
  Object.defineProperty(exports, "safeJsonMiddleware", { enumerable: true, get: function () { return safeJsonMiddleware_1.safeJsonMiddleware; } });
72
+ (0, tslib_1.__exportStar)(require("./server/request.util"), exports);
@@ -52,14 +52,13 @@ function createGAELogMiddleware() {
52
52
  }
53
53
  // Otherwise, we're in AppEngine
54
54
  return function gaeLogMiddleware(req, res, next) {
55
- const meta = {};
56
55
  const traceHeader = req.header('x-cloud-trace-context');
57
56
  if (traceHeader) {
58
57
  const [trace] = traceHeader.split('/');
59
- Object.assign(meta, {
58
+ const meta = {
60
59
  'logging.googleapis.com/trace': `projects/${GOOGLE_CLOUD_PROJECT}/traces/${trace}`,
61
60
  'appengine.googleapis.com/request_id': req.header('x-appengine-request-log-id'),
62
- });
61
+ };
63
62
  Object.assign(req, {
64
63
  log: (...args) => logToAppEngine({ ...meta, severity: 'INFO' }, args),
65
64
  warn: (...args) => logToAppEngine({ ...meta, severity: 'WARNING' }, args),
@@ -23,8 +23,7 @@ const serverStatsHTMLHandler = (req, res) => {
23
23
  // calc things
24
24
  (0, js_lib_1._stringMapValues)(serverStatsMap).forEach(s => {
25
25
  s.total = s['2xx'] + s['4xx'] + s['5xx'];
26
- s.pc = {};
27
- percentiles.forEach(pc => (s.pc[pc] = Math.round((0, js_lib_1._percentile)(s.stack.items, pc))));
26
+ s.pc = (0, js_lib_1._mapValues)(s.stack.percentiles(percentiles), (_k, v) => Math.round(v), true);
28
27
  });
29
28
  const allLatencies = (0, js_lib_1._stringMapValues)(serverStatsMap).flatMap(s => s.stack.items);
30
29
  const all2xx = (0, js_lib_1._sum)((0, js_lib_1._stringMapValues)(serverStatsMap).flatMap(s => s['2xx']));
@@ -80,7 +79,7 @@ function serverStatsMiddleware() {
80
79
  const latency = now - started;
81
80
  const endpoint = (0, request_util_1.getRequestEndpoint)(req);
82
81
  serverStatsMap[endpoint] || (serverStatsMap[endpoint] = {
83
- stack: new SizeLimitedStack(SIZE),
82
+ stack: new js_lib_1.NumberStack(SIZE),
84
83
  '2xx': 0,
85
84
  '4xx': 0,
86
85
  '5xx': 0,
@@ -112,14 +111,3 @@ function getStatusFamily(statusCode) {
112
111
  return '4xx';
113
112
  return '5xx';
114
113
  }
115
- class SizeLimitedStack {
116
- constructor(size) {
117
- this.size = size;
118
- this.index = 0;
119
- this.items = [];
120
- }
121
- push(item) {
122
- this.items[this.index] = item;
123
- this.index = this.index === this.size ? 0 : this.index + 1;
124
- }
125
- }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@naturalcycles/backend-lib",
3
- "version": "2.73.2",
3
+ "version": "2.73.3",
4
4
  "scripts": {
5
5
  "prepare": "husky install && patch-package",
6
6
  "serve": "APP_ENV=dev nodemon",
package/src/index.ts CHANGED
@@ -54,6 +54,7 @@ import {
54
54
  import type { RequestWithLog } from './server/handlers/createGaeLogMiddleware'
55
55
  export * from './server/handlers/createGaeLogMiddleware'
56
56
  import { safeJsonMiddleware } from './server/handlers/safeJsonMiddleware'
57
+ export * from './server/request.util'
57
58
 
58
59
  export type {
59
60
  MethodOverrideCfg,
@@ -85,15 +85,13 @@ export function createGAELogMiddleware(): RequestHandler {
85
85
  // Otherwise, we're in AppEngine
86
86
 
87
87
  return function gaeLogMiddleware(req, res, next) {
88
- const meta: AnyObject = {}
89
-
90
88
  const traceHeader = req.header('x-cloud-trace-context')
91
89
  if (traceHeader) {
92
90
  const [trace] = traceHeader.split('/')
93
- Object.assign(meta, {
91
+ const meta = {
94
92
  'logging.googleapis.com/trace': `projects/${GOOGLE_CLOUD_PROJECT}/traces/${trace}`,
95
93
  'appengine.googleapis.com/request_id': req.header('x-appengine-request-log-id'),
96
- })
94
+ }
97
95
  Object.assign(req, {
98
96
  log: (...args: any[]) => logToAppEngine({ ...meta, severity: 'INFO' }, args),
99
97
  warn: (...args: any[]) => logToAppEngine({ ...meta, severity: 'WARNING' }, args),
@@ -1,5 +1,6 @@
1
1
  import {
2
2
  _get,
3
+ _mapValues,
3
4
  _mb,
4
5
  _ms,
5
6
  _percentile,
@@ -7,6 +8,7 @@ import {
7
8
  _stringMapEntries,
8
9
  _stringMapValues,
9
10
  _sum,
11
+ NumberStack,
10
12
  StringMap,
11
13
  } from '@naturalcycles/js-lib'
12
14
  import { RequestHandler } from 'express'
@@ -17,14 +19,14 @@ const { GAE_INSTANCE } = process.env
17
19
 
18
20
  // Map from "endpoint" to latency
19
21
  interface Stat {
20
- stack: SizeLimitedStack<number>
22
+ stack: NumberStack
21
23
  '2xx': number
22
24
  '4xx': number
23
25
  '5xx': number
24
26
 
25
27
  // calculated on the fly
26
28
  total?: number
27
- pc?: StringMap<number> // e.g 50 => 123
29
+ pc?: Record<number, number> // e.g 50 => 123
28
30
  }
29
31
 
30
32
  const serverStatsMap: StringMap<Stat> = {}
@@ -49,8 +51,7 @@ export const serverStatsHTMLHandler: RequestHandler = (req, res) => {
49
51
  // calc things
50
52
  _stringMapValues(serverStatsMap).forEach(s => {
51
53
  s.total = s['2xx'] + s['4xx'] + s['5xx']
52
- s.pc = {}
53
- percentiles.forEach(pc => (s.pc![pc] = Math.round(_percentile(s.stack.items, pc))))
54
+ s.pc = _mapValues(s.stack.percentiles(percentiles), (_k, v) => Math.round(v), true)
54
55
  })
55
56
  const allLatencies = _stringMapValues(serverStatsMap).flatMap(s => s.stack.items)
56
57
  const all2xx = _sum(_stringMapValues(serverStatsMap).flatMap(s => s['2xx']))
@@ -121,7 +122,7 @@ export function serverStatsMiddleware(): RequestHandler {
121
122
  const endpoint = getRequestEndpoint(req)
122
123
 
123
124
  serverStatsMap[endpoint] ||= {
124
- stack: new SizeLimitedStack<number>(SIZE),
125
+ stack: new NumberStack(SIZE),
125
126
  '2xx': 0,
126
127
  '4xx': 0,
127
128
  '5xx': 0,
@@ -155,15 +156,3 @@ function getStatusFamily(statusCode: number): '2xx' | '4xx' | '5xx' {
155
156
  if (statusCode < 500) return '4xx'
156
157
  return '5xx'
157
158
  }
158
-
159
- class SizeLimitedStack<T> {
160
- constructor(public size: number) {}
161
-
162
- index = 0
163
- items: T[] = []
164
-
165
- push(item: T): void {
166
- this.items[this.index] = item
167
- this.index = this.index === this.size ? 0 : this.index + 1
168
- }
169
- }