@naturalcycles/backend-lib 5.7.2 → 5.8.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/dist/admin/adminMiddleware.js +1 -1
- package/dist/db/httpDBRequestHandler.js +2 -2
- package/dist/env/env.shared.service.d.ts +9 -9
- package/dist/env/env.shared.service.js +7 -14
- package/dist/index.d.ts +0 -1
- package/dist/index.js +0 -1
- package/dist/server/appEngineLogMiddleware.js +2 -2
- package/dist/server/asyncLocalStorageMiddleware.js +1 -1
- package/dist/server/bodyParserTimeoutMiddleware.js +1 -1
- package/dist/server/methodOverrideMiddleware.js +1 -1
- package/dist/server/okMiddleware.js +1 -1
- package/dist/server/safeJsonMiddleware.js +1 -1
- package/dist/server/server.util.js +1 -1
- package/dist/server/serverStatusMiddleware.js +1 -1
- package/dist/server/simpleRequestLoggerMiddleware.js +1 -1
- package/dist/server/validation/validateMiddleware.js +1 -1
- package/dist/server/validation/zodValidateMiddleware.js +1 -1
- package/package.json +2 -2
- package/src/admin/adminMiddleware.ts +1 -1
- package/src/admin/base.admin.service.ts +1 -1
- package/src/db/httpDBRequestHandler.ts +2 -2
- package/src/deploy/backend.cfg.util.ts +1 -1
- package/src/env/env.shared.service.ts +19 -22
- package/src/index.ts +0 -1
- package/src/sentry/sentry.shared.service.ts +2 -2
- package/src/server/appEngineLogMiddleware.ts +2 -2
- package/src/server/asyncLocalStorageMiddleware.ts +1 -1
- package/src/server/bodyParserTimeoutMiddleware.ts +1 -1
- package/src/server/methodOverrideMiddleware.ts +1 -1
- package/src/server/okMiddleware.ts +1 -1
- package/src/server/safeJsonMiddleware.ts +1 -1
- package/src/server/server.util.ts +1 -1
- package/src/server/serverStatusMiddleware.ts +1 -1
- package/src/server/simpleRequestLoggerMiddleware.ts +1 -1
- package/src/server/validation/validateMiddleware.ts +1 -1
- package/src/server/validation/zodValidateMiddleware.ts +1 -1
- package/dist/env/env.model.d.ts +0 -3
- package/dist/env/env.model.js +0 -2
- package/src/env/env.model.ts +0 -3
|
@@ -43,7 +43,7 @@ function requireAdminPermissions(adminService, reqPermissions = [], cfg = {}) {
|
|
|
43
43
|
}
|
|
44
44
|
function loginHtml(firebaseServiceCfg) {
|
|
45
45
|
const { apiKey: firebaseApiKey, authDomain: firebaseAuthDomain, adminAuthProvider: firebaseAuthProvider = 'GoogleAuthProvider', } = firebaseServiceCfg;
|
|
46
|
-
return (
|
|
46
|
+
return (_req, res) => {
|
|
47
47
|
res.send(getLoginHtml({
|
|
48
48
|
firebaseApiKey,
|
|
49
49
|
firebaseAuthDomain,
|
|
@@ -32,12 +32,12 @@ function httpDBRequestHandler(db) {
|
|
|
32
32
|
res.end();
|
|
33
33
|
});
|
|
34
34
|
// ping
|
|
35
|
-
router.get('/ping', async (
|
|
35
|
+
router.get('/ping', async (_req, res) => {
|
|
36
36
|
await db.ping();
|
|
37
37
|
res.end();
|
|
38
38
|
});
|
|
39
39
|
// getTables
|
|
40
|
-
router.get('/tables', async (
|
|
40
|
+
router.get('/tables', async (_req, res) => {
|
|
41
41
|
res.json(await db.getTables());
|
|
42
42
|
});
|
|
43
43
|
// getTableSchema
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export interface
|
|
3
|
-
|
|
4
|
-
* Dir with ${envName}.env.ts files
|
|
5
|
-
*/
|
|
6
|
-
envDir: string;
|
|
1
|
+
import { StringMap } from '@naturalcycles/js-lib';
|
|
2
|
+
export interface BaseEnv {
|
|
3
|
+
name: string;
|
|
7
4
|
}
|
|
8
|
-
export
|
|
9
|
-
|
|
10
|
-
|
|
5
|
+
export interface EnvSharedServiceCfg<ENV> {
|
|
6
|
+
environments: ENV[];
|
|
7
|
+
}
|
|
8
|
+
export declare class EnvSharedService<ENV extends BaseEnv> {
|
|
9
|
+
constructor(cfg: EnvSharedServiceCfg<ENV>);
|
|
10
|
+
envMap: StringMap<ENV>;
|
|
11
11
|
private env?;
|
|
12
12
|
init(): void;
|
|
13
13
|
getEnv(): ENV;
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.EnvSharedService = void 0;
|
|
4
|
+
const js_lib_1 = require("@naturalcycles/js-lib");
|
|
4
5
|
const nodejs_lib_1 = require("@naturalcycles/nodejs-lib");
|
|
5
6
|
class EnvSharedService {
|
|
6
7
|
constructor(cfg) {
|
|
7
|
-
this.
|
|
8
|
+
this.envMap = (0, js_lib_1._by)(cfg.environments, e => e.name);
|
|
8
9
|
}
|
|
9
10
|
init() {
|
|
10
11
|
this.getEnv();
|
|
@@ -12,25 +13,17 @@ class EnvSharedService {
|
|
|
12
13
|
getEnv() {
|
|
13
14
|
if (!this.env) {
|
|
14
15
|
const { APP_ENV } = process.env;
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
const envFilePath = `${envDir}/${APP_ENV}.env`;
|
|
20
|
-
try {
|
|
21
|
-
const module = require(envFilePath);
|
|
22
|
-
this.env = module.default;
|
|
23
|
-
}
|
|
24
|
-
catch {
|
|
25
|
-
throw new Error(`Cannot read envFile ${envFilePath}`);
|
|
26
|
-
}
|
|
16
|
+
(0, js_lib_1._assert)(APP_ENV, 'APP_ENV should be defined!');
|
|
17
|
+
const env = this.envMap[APP_ENV];
|
|
18
|
+
(0, js_lib_1._assert)(env, `Environment ${APP_ENV} is not defined`);
|
|
19
|
+
this.env = env;
|
|
27
20
|
console.log(`APP_ENV=${(0, nodejs_lib_1.dimGrey)(APP_ENV)} loaded`);
|
|
28
21
|
}
|
|
29
22
|
return this.env;
|
|
30
23
|
}
|
|
31
24
|
setEnv(env) {
|
|
32
|
-
console.log(`setEnv APP_ENV=${(0, nodejs_lib_1.dimGrey)(env ? env.name : 'undefined')}`);
|
|
33
25
|
this.env = env;
|
|
26
|
+
console.log(`setEnv APP_ENV=${(0, nodejs_lib_1.dimGrey)(env?.name || 'undefined')}`);
|
|
34
27
|
}
|
|
35
28
|
}
|
|
36
29
|
exports.EnvSharedService = EnvSharedService;
|
package/dist/index.d.ts
CHANGED
|
@@ -3,7 +3,6 @@ export * from './admin/adminMiddleware';
|
|
|
3
3
|
export * from './admin/base.admin.service';
|
|
4
4
|
export * from './admin/firebase.shared.service';
|
|
5
5
|
export * from './admin/secureHeaderMiddleware';
|
|
6
|
-
export * from './env/env.model';
|
|
7
6
|
export * from './env/env.shared.service';
|
|
8
7
|
export * from './gae/appEngine.util';
|
|
9
8
|
export * from './sentry/sentry.shared.service';
|
package/dist/index.js
CHANGED
|
@@ -8,7 +8,6 @@ tslib_1.__exportStar(require("./admin/adminMiddleware"), exports);
|
|
|
8
8
|
tslib_1.__exportStar(require("./admin/base.admin.service"), exports);
|
|
9
9
|
tslib_1.__exportStar(require("./admin/firebase.shared.service"), exports);
|
|
10
10
|
tslib_1.__exportStar(require("./admin/secureHeaderMiddleware"), exports);
|
|
11
|
-
tslib_1.__exportStar(require("./env/env.model"), exports);
|
|
12
11
|
tslib_1.__exportStar(require("./env/env.shared.service"), exports);
|
|
13
12
|
tslib_1.__exportStar(require("./gae/appEngine.util"), exports);
|
|
14
13
|
tslib_1.__exportStar(require("./sentry/sentry.shared.service"), exports);
|
|
@@ -58,7 +58,7 @@ function logToCI(args) {
|
|
|
58
58
|
function appEngineLogMiddleware() {
|
|
59
59
|
if (!isGAE || !GOOGLE_CLOUD_PROJECT) {
|
|
60
60
|
// Local machine, return "simple" logToDev middleware with request numbering
|
|
61
|
-
return function gaeLogMiddlewareDev(req,
|
|
61
|
+
return function gaeLogMiddlewareDev(req, _res, next) {
|
|
62
62
|
// Local machine
|
|
63
63
|
req.requestId = String(++reqCounter);
|
|
64
64
|
req.log = req.warn = req.error = (...args) => logToDev(req.requestId, args);
|
|
@@ -66,7 +66,7 @@ function appEngineLogMiddleware() {
|
|
|
66
66
|
};
|
|
67
67
|
}
|
|
68
68
|
// Otherwise, we're in AppEngine
|
|
69
|
-
return function appEngineLogHandler(req,
|
|
69
|
+
return function appEngineLogHandler(req, _res, next) {
|
|
70
70
|
const traceHeader = req.header('x-cloud-trace-context');
|
|
71
71
|
if (traceHeader) {
|
|
72
72
|
const [trace] = traceHeader.split('/');
|
|
@@ -14,7 +14,7 @@ const isCI = !!CI;
|
|
|
14
14
|
// Create it lazily (on demand)
|
|
15
15
|
const storage = (0, js_lib_1._lazyValue)(() => new node_async_hooks_1.AsyncLocalStorage());
|
|
16
16
|
function asyncLocalStorageMiddleware() {
|
|
17
|
-
return (req,
|
|
17
|
+
return (req, _res, next) => {
|
|
18
18
|
const store = {
|
|
19
19
|
req,
|
|
20
20
|
};
|
|
@@ -9,7 +9,7 @@ const js_lib_1 = require("@naturalcycles/js-lib");
|
|
|
9
9
|
* Original: https://github.com/expressjs/express/blob/master/lib/response.js
|
|
10
10
|
*/
|
|
11
11
|
function safeJsonMiddleware() {
|
|
12
|
-
return function safeJsonHandler(
|
|
12
|
+
return function safeJsonHandler(_req, res, next) {
|
|
13
13
|
res.json = (input) => {
|
|
14
14
|
if (!res.get('Content-Type')) {
|
|
15
15
|
res.set('Content-Type', 'application/json');
|
|
@@ -9,7 +9,7 @@ exports.enableDestroy = enableDestroy;
|
|
|
9
9
|
function enableDestroy(server) {
|
|
10
10
|
const connections = {};
|
|
11
11
|
const srv = server;
|
|
12
|
-
srv.on('connection',
|
|
12
|
+
srv.on('connection', conn => {
|
|
13
13
|
const key = conn.remoteAddress + ':' + conn.remotePort;
|
|
14
14
|
connections[key] = conn;
|
|
15
15
|
conn.on('close', () => delete connections[key]);
|
|
@@ -8,7 +8,7 @@ const deployInfo_util_1 = require("./deployInfo.util");
|
|
|
8
8
|
const { versions } = process;
|
|
9
9
|
const { GAE_APPLICATION, GAE_SERVICE, GAE_VERSION, APP_ENV, NODE_OPTIONS } = process.env;
|
|
10
10
|
function serverStatusMiddleware(projectDir, extra) {
|
|
11
|
-
return async (
|
|
11
|
+
return async (_req, res) => {
|
|
12
12
|
res.json(getServerStatusData(projectDir, extra));
|
|
13
13
|
};
|
|
14
14
|
}
|
|
@@ -10,7 +10,7 @@ function simpleRequestLoggerMiddleware(_cfg = {}) {
|
|
|
10
10
|
// Disable logger in AppEngine, as it doesn't make sense there
|
|
11
11
|
// UPD: Only log in dev environment
|
|
12
12
|
if (APP_ENV !== 'dev')
|
|
13
|
-
return (
|
|
13
|
+
return (_req, _res, next) => next();
|
|
14
14
|
const cfg = {
|
|
15
15
|
logStart: false,
|
|
16
16
|
logFinish: true,
|
|
@@ -26,7 +26,7 @@ function validateObject(prop, schema, opt = {}) {
|
|
|
26
26
|
objectName: `request ${prop}`,
|
|
27
27
|
});
|
|
28
28
|
const reportPredicate = typeof opt.report === 'function' ? opt.report : () => opt.report;
|
|
29
|
-
return (req,
|
|
29
|
+
return (req, _res, next) => {
|
|
30
30
|
const error = ajvSchema.getValidationError(req[prop]);
|
|
31
31
|
if (error) {
|
|
32
32
|
const report = reportPredicate(error);
|
|
@@ -11,7 +11,7 @@ const REDACTED = 'REDACTED';
|
|
|
11
11
|
*/
|
|
12
12
|
function zodReqValidate(prop, schema, opt = {}) {
|
|
13
13
|
const reportPredicate = typeof opt.report === 'function' ? opt.report : () => opt.report;
|
|
14
|
-
return (req,
|
|
14
|
+
return (req, _res, next) => {
|
|
15
15
|
const { error } = (0, js_lib_1.zSafeValidate)(req[prop], schema);
|
|
16
16
|
if (!error) {
|
|
17
17
|
return next();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@naturalcycles/backend-lib",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.8.1",
|
|
4
4
|
"scripts": {
|
|
5
5
|
"prepare": "husky",
|
|
6
6
|
"build": "dev-lib build",
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"@naturalcycles/dev-lib": "^15.0.4",
|
|
46
46
|
"@sentry/node": "^7.0.0",
|
|
47
47
|
"@types/ejs": "^3.0.0",
|
|
48
|
-
"@types/node": "^
|
|
48
|
+
"@types/node": "^22.2.0",
|
|
49
49
|
"@types/yargs": "^16.0.0",
|
|
50
50
|
"fastify": "^4.0.0",
|
|
51
51
|
"jest": "^29.0.1"
|
|
@@ -88,7 +88,7 @@ export function loginHtml(firebaseServiceCfg: FirebaseSharedServiceCfg): Backend
|
|
|
88
88
|
adminAuthProvider: firebaseAuthProvider = 'GoogleAuthProvider',
|
|
89
89
|
} = firebaseServiceCfg
|
|
90
90
|
|
|
91
|
-
return (
|
|
91
|
+
return (_req, res) => {
|
|
92
92
|
res.send(
|
|
93
93
|
getLoginHtml({
|
|
94
94
|
firebaseApiKey,
|
|
@@ -171,7 +171,7 @@ export class BaseAdminService {
|
|
|
171
171
|
req: BackendRequest,
|
|
172
172
|
reqPermissions: string[] = [],
|
|
173
173
|
meta: Record<string, any> = {},
|
|
174
|
-
andComparison
|
|
174
|
+
andComparison = true,
|
|
175
175
|
): Promise<AdminInfo> {
|
|
176
176
|
if (!this.cfg.authEnabled) return adminInfoDisabled()
|
|
177
177
|
|
|
@@ -63,13 +63,13 @@ export function httpDBRequestHandler(db: CommonDB): BackendRouter {
|
|
|
63
63
|
})
|
|
64
64
|
|
|
65
65
|
// ping
|
|
66
|
-
router.get('/ping', async (
|
|
66
|
+
router.get('/ping', async (_req, res) => {
|
|
67
67
|
await db.ping()
|
|
68
68
|
res.end()
|
|
69
69
|
})
|
|
70
70
|
|
|
71
71
|
// getTables
|
|
72
|
-
router.get('/tables', async (
|
|
72
|
+
router.get('/tables', async (_req, res) => {
|
|
73
73
|
res.json(await db.getTables())
|
|
74
74
|
})
|
|
75
75
|
|
|
@@ -38,7 +38,7 @@ const backendCfgSchema = AjvSchema.readJsonSync<BackendCfg>(
|
|
|
38
38
|
},
|
|
39
39
|
)
|
|
40
40
|
|
|
41
|
-
export function getBackendCfg(projectDir
|
|
41
|
+
export function getBackendCfg(projectDir = '.'): BackendCfg {
|
|
42
42
|
const backendCfgYamlPath = `${projectDir}/backend.cfg.yaml`
|
|
43
43
|
|
|
44
44
|
requireFileToExist(backendCfgYamlPath)
|
|
@@ -1,15 +1,20 @@
|
|
|
1
|
+
import { _assert, _by, StringMap } from '@naturalcycles/js-lib'
|
|
1
2
|
import { dimGrey } from '@naturalcycles/nodejs-lib'
|
|
2
|
-
import { BaseEnv } from './env.model'
|
|
3
3
|
|
|
4
|
-
export interface
|
|
5
|
-
|
|
6
|
-
* Dir with ${envName}.env.ts files
|
|
7
|
-
*/
|
|
8
|
-
envDir: string
|
|
4
|
+
export interface BaseEnv {
|
|
5
|
+
name: string
|
|
9
6
|
}
|
|
10
7
|
|
|
11
|
-
export
|
|
12
|
-
|
|
8
|
+
export interface EnvSharedServiceCfg<ENV> {
|
|
9
|
+
environments: ENV[]
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export class EnvSharedService<ENV extends BaseEnv> {
|
|
13
|
+
constructor(cfg: EnvSharedServiceCfg<ENV>) {
|
|
14
|
+
this.envMap = _by(cfg.environments, e => e.name)
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
envMap: StringMap<ENV>
|
|
13
18
|
|
|
14
19
|
private env?: ENV
|
|
15
20
|
|
|
@@ -20,28 +25,20 @@ export class EnvSharedService<ENV extends BaseEnv = any> {
|
|
|
20
25
|
getEnv(): ENV {
|
|
21
26
|
if (!this.env) {
|
|
22
27
|
const { APP_ENV } = process.env
|
|
23
|
-
|
|
24
|
-
throw new Error('APP_ENV should be defined!')
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
const { envDir } = this.cfg
|
|
28
|
-
const envFilePath = `${envDir}/${APP_ENV}.env`
|
|
28
|
+
_assert(APP_ENV, 'APP_ENV should be defined!')
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
this.env = module.default
|
|
33
|
-
} catch {
|
|
34
|
-
throw new Error(`Cannot read envFile ${envFilePath}`)
|
|
35
|
-
}
|
|
30
|
+
const env = this.envMap[APP_ENV]
|
|
31
|
+
_assert(env, `Environment ${APP_ENV} is not defined`)
|
|
36
32
|
|
|
33
|
+
this.env = env
|
|
37
34
|
console.log(`APP_ENV=${dimGrey(APP_ENV)} loaded`)
|
|
38
35
|
}
|
|
39
36
|
|
|
40
|
-
return this.env
|
|
37
|
+
return this.env
|
|
41
38
|
}
|
|
42
39
|
|
|
43
40
|
setEnv(env?: ENV): void {
|
|
44
|
-
console.log(`setEnv APP_ENV=${dimGrey(env ? env.name : 'undefined')}`)
|
|
45
41
|
this.env = env
|
|
42
|
+
console.log(`setEnv APP_ENV=${dimGrey(env?.name || 'undefined')}`)
|
|
46
43
|
}
|
|
47
44
|
}
|
package/src/index.ts
CHANGED
|
@@ -3,7 +3,6 @@ export * from './admin/adminMiddleware'
|
|
|
3
3
|
export * from './admin/base.admin.service'
|
|
4
4
|
export * from './admin/firebase.shared.service'
|
|
5
5
|
export * from './admin/secureHeaderMiddleware'
|
|
6
|
-
export * from './env/env.model'
|
|
7
6
|
export * from './env/env.shared.service'
|
|
8
7
|
export * from './gae/appEngine.util'
|
|
9
8
|
export * from './sentry/sentry.shared.service'
|
|
@@ -8,9 +8,9 @@ import {
|
|
|
8
8
|
StringMap,
|
|
9
9
|
} from '@naturalcycles/js-lib'
|
|
10
10
|
import { _inspect, InspectAnyOptions } from '@naturalcycles/nodejs-lib'
|
|
11
|
-
// eslint-disable-next-line import/no-duplicates
|
|
11
|
+
// eslint-disable-next-line import-x/no-duplicates
|
|
12
12
|
import type { Breadcrumb, NodeOptions, SeverityLevel } from '@sentry/node'
|
|
13
|
-
// eslint-disable-next-line import/no-duplicates
|
|
13
|
+
// eslint-disable-next-line import-x/no-duplicates
|
|
14
14
|
import type * as SentryLib from '@sentry/node'
|
|
15
15
|
import { BackendErrorRequestHandler, BackendRequestHandler, getRequestLogger } from '../index'
|
|
16
16
|
|
|
@@ -69,7 +69,7 @@ function logToCI(args: any[]): void {
|
|
|
69
69
|
export function appEngineLogMiddleware(): BackendRequestHandler {
|
|
70
70
|
if (!isGAE || !GOOGLE_CLOUD_PROJECT) {
|
|
71
71
|
// Local machine, return "simple" logToDev middleware with request numbering
|
|
72
|
-
return function gaeLogMiddlewareDev(req,
|
|
72
|
+
return function gaeLogMiddlewareDev(req, _res, next) {
|
|
73
73
|
// Local machine
|
|
74
74
|
req.requestId = String(++reqCounter)
|
|
75
75
|
req.log = req.warn = req.error = (...args: any[]) => logToDev(req.requestId!, args)
|
|
@@ -79,7 +79,7 @@ export function appEngineLogMiddleware(): BackendRequestHandler {
|
|
|
79
79
|
|
|
80
80
|
// Otherwise, we're in AppEngine
|
|
81
81
|
|
|
82
|
-
return function appEngineLogHandler(req,
|
|
82
|
+
return function appEngineLogHandler(req, _res, next) {
|
|
83
83
|
const traceHeader = req.header('x-cloud-trace-context')
|
|
84
84
|
if (traceHeader) {
|
|
85
85
|
const [trace] = traceHeader.split('/')
|
|
@@ -16,7 +16,7 @@ export interface RequestLocalStorage {
|
|
|
16
16
|
const storage = _lazyValue(() => new AsyncLocalStorage<RequestLocalStorage>())
|
|
17
17
|
|
|
18
18
|
export function asyncLocalStorageMiddleware(): BackendRequestHandler {
|
|
19
|
-
return (req,
|
|
19
|
+
return (req, _res, next) => {
|
|
20
20
|
const store: RequestLocalStorage = {
|
|
21
21
|
req,
|
|
22
22
|
}
|
|
@@ -60,7 +60,7 @@ export function bodyParserTimeoutMiddleware(
|
|
|
60
60
|
* Should be called AFTER bodyParser
|
|
61
61
|
*/
|
|
62
62
|
export function clearBodyParserTimeout(): BackendRequestHandler {
|
|
63
|
-
return (req,
|
|
63
|
+
return (req, _res, next) => {
|
|
64
64
|
clearTimeout(req.bodyParserTimeout)
|
|
65
65
|
next()
|
|
66
66
|
}
|
|
@@ -8,7 +8,7 @@ import { BackendRequestHandler, BackendResponse } from './server.model'
|
|
|
8
8
|
* Original: https://github.com/expressjs/express/blob/master/lib/response.js
|
|
9
9
|
*/
|
|
10
10
|
export function safeJsonMiddleware(): BackendRequestHandler {
|
|
11
|
-
return function safeJsonHandler(
|
|
11
|
+
return function safeJsonHandler(_req, res, next) {
|
|
12
12
|
res.json = (input: any): BackendResponse => {
|
|
13
13
|
if (!res.get('Content-Type')) {
|
|
14
14
|
res.set('Content-Type', 'application/json')
|
|
@@ -15,7 +15,7 @@ export function enableDestroy(server: Server): DestroyableServer {
|
|
|
15
15
|
const connections: StringMap<Socket> = {}
|
|
16
16
|
const srv = server as DestroyableServer
|
|
17
17
|
|
|
18
|
-
srv.on('connection',
|
|
18
|
+
srv.on('connection', conn => {
|
|
19
19
|
const key = conn.remoteAddress + ':' + conn.remotePort
|
|
20
20
|
connections[key] = conn
|
|
21
21
|
conn.on('close', () => delete connections[key])
|
|
@@ -7,7 +7,7 @@ const { versions } = process
|
|
|
7
7
|
const { GAE_APPLICATION, GAE_SERVICE, GAE_VERSION, APP_ENV, NODE_OPTIONS } = process.env
|
|
8
8
|
|
|
9
9
|
export function serverStatusMiddleware(projectDir?: string, extra?: any): BackendRequestHandler {
|
|
10
|
-
return async (
|
|
10
|
+
return async (_req, res) => {
|
|
11
11
|
res.json(getServerStatusData(projectDir, extra))
|
|
12
12
|
}
|
|
13
13
|
}
|
|
@@ -22,7 +22,7 @@ export function simpleRequestLoggerMiddleware(
|
|
|
22
22
|
): BackendRequestHandler {
|
|
23
23
|
// Disable logger in AppEngine, as it doesn't make sense there
|
|
24
24
|
// UPD: Only log in dev environment
|
|
25
|
-
if (APP_ENV !== 'dev') return (
|
|
25
|
+
if (APP_ENV !== 'dev') return (_req, _res, next) => next()
|
|
26
26
|
|
|
27
27
|
const cfg: SimpleRequestLoggerMiddlewareCfg = {
|
|
28
28
|
logStart: false,
|
|
@@ -44,7 +44,7 @@ function validateObject(
|
|
|
44
44
|
const reportPredicate =
|
|
45
45
|
typeof opt.report === 'function' ? opt.report : () => opt.report as boolean | undefined
|
|
46
46
|
|
|
47
|
-
return (req,
|
|
47
|
+
return (req, _res, next) => {
|
|
48
48
|
const error = ajvSchema.getValidationError(req[prop])
|
|
49
49
|
if (error) {
|
|
50
50
|
const report = reportPredicate(error)
|
|
@@ -18,7 +18,7 @@ export function zodReqValidate(
|
|
|
18
18
|
const reportPredicate =
|
|
19
19
|
typeof opt.report === 'function' ? opt.report : () => opt.report as boolean | undefined
|
|
20
20
|
|
|
21
|
-
return (req,
|
|
21
|
+
return (req, _res, next) => {
|
|
22
22
|
const { error } = zSafeValidate(req[prop], schema)
|
|
23
23
|
if (!error) {
|
|
24
24
|
return next()
|
package/dist/env/env.model.d.ts
DELETED
package/dist/env/env.model.js
DELETED
package/src/env/env.model.ts
DELETED