@devmoods/express-extras 0.13.9 → 0.14.0
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/bin/migrate.js +10 -0
- package/dist/__tests__/auth.spec.jsx +3 -5
- package/dist/auth.d.ts +2 -2
- package/dist/auth.js +33 -45
- package/dist/context.d.ts +1 -1
- package/dist/context.js +10 -17
- package/dist/email.js +4 -31
- package/dist/errors.js +16 -51
- package/dist/index.d.ts +13 -13
- package/dist/index.js +14 -32
- package/dist/listen.d.ts +4 -4
- package/dist/listen.js +5 -11
- package/dist/logger.d.ts +1 -1
- package/dist/logger.js +12 -22
- package/dist/middleware.d.ts +5 -3
- package/dist/middleware.js +20 -54
- package/dist/migrate.d.ts +1 -1
- package/dist/migrate.js +25 -31
- package/dist/postgres.d.ts +109 -109
- package/dist/postgres.js +7 -16
- package/dist/redis.d.ts +262 -262
- package/dist/redis.js +3 -7
- package/dist/routes.d.ts +1 -1
- package/dist/routes.js +3 -7
- package/dist/sentry.d.ts +3 -3
- package/dist/sentry.js +4 -32
- package/dist/slack.js +5 -9
- package/dist/validate.d.ts +2 -2
- package/dist/validate.js +13 -23
- package/package.json +24 -7
- package/bin/migrate +0 -9
package/bin/migrate.js
ADDED
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const auth_1 = require("../auth");
|
|
1
|
+
import { createAuthToken } from '../auth.js';
|
|
4
2
|
test('createAuthToken', async () => {
|
|
5
3
|
process.env.APP_JWT_SECRET = 'test';
|
|
6
|
-
const first =
|
|
4
|
+
const first = createAuthToken({});
|
|
7
5
|
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
8
|
-
const second =
|
|
6
|
+
const second = createAuthToken({});
|
|
9
7
|
expect(first).not.toEqual(second);
|
|
10
8
|
});
|
package/dist/auth.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Request, RequestHandler, Response } from 'express';
|
|
2
|
-
import { RedisClient } from './redis';
|
|
1
|
+
import { type Request, type RequestHandler, type Response } from 'express';
|
|
2
|
+
import type { RedisClient } from './redis.js';
|
|
3
3
|
export declare function createAuthToken(payload: any, secret?: string): string;
|
|
4
4
|
interface LoginMethods<User = any> {
|
|
5
5
|
emailAndPassword?: (email: string, verifyPassword: (realPassword: string) => Promise<boolean>) => Promise<User>;
|
package/dist/auth.js
CHANGED
|
@@ -1,40 +1,33 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const uuid_1 = require("uuid");
|
|
11
|
-
const context_1 = require("./context");
|
|
12
|
-
const errors_1 = require("./errors");
|
|
13
|
-
const logger_1 = require("./logger");
|
|
14
|
-
const middleware_1 = require("./middleware");
|
|
15
|
-
const validate_1 = require("./validate");
|
|
1
|
+
import * as bcrypt from 'bcrypt';
|
|
2
|
+
import { Router, } from 'express';
|
|
3
|
+
import jwt from 'jsonwebtoken';
|
|
4
|
+
import { v4 } from 'uuid';
|
|
5
|
+
import { setContext, useContext } from './context.js';
|
|
6
|
+
import { Unauthorized } from './errors.js';
|
|
7
|
+
import { getLogger } from './logger.js';
|
|
8
|
+
import { route } from './middleware.js';
|
|
9
|
+
import { validateBody } from './validate.js';
|
|
16
10
|
const TOKEN_EXPIRES_IN = 3600 * 48;
|
|
17
|
-
function createAuthToken(payload, secret = process.env.APP_JWT_SECRET) {
|
|
18
|
-
return
|
|
11
|
+
export function createAuthToken(payload, secret = process.env.APP_JWT_SECRET) {
|
|
12
|
+
return jwt.sign(payload, secret, { expiresIn: TOKEN_EXPIRES_IN });
|
|
19
13
|
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
const useCurrentUser = () => (0, context_1.useContext)('currentUser');
|
|
14
|
+
export function createAuth({ getUserByToken, methods: { emailAndPassword }, filterUser = (x) => x, redis, tokenExpiry = TOKEN_EXPIRES_IN, }) {
|
|
15
|
+
const useCurrentUser = () => useContext('currentUser');
|
|
23
16
|
const createRouter = () => {
|
|
24
|
-
const router =
|
|
25
|
-
router.get('/me', middleware(),
|
|
17
|
+
const router = Router();
|
|
18
|
+
router.get('/me', middleware(), route(() => {
|
|
26
19
|
const user = useCurrentUser();
|
|
27
20
|
return filterUser(user);
|
|
28
21
|
}));
|
|
29
22
|
if (emailAndPassword) {
|
|
30
|
-
router.post('/login',
|
|
23
|
+
router.post('/login', validateBody({
|
|
31
24
|
type: 'object',
|
|
32
25
|
properties: {
|
|
33
26
|
email: { type: 'string' },
|
|
34
27
|
password: { type: 'string' },
|
|
35
28
|
},
|
|
36
29
|
required: ['email', 'password'],
|
|
37
|
-
}),
|
|
30
|
+
}), route(async ({ body: { email, password } }, res) => {
|
|
38
31
|
try {
|
|
39
32
|
const user = await emailAndPassword(email, (realPassword) => checkIfPasswordsMatch(realPassword, password));
|
|
40
33
|
const token = createAuthToken(filterUser(user));
|
|
@@ -43,12 +36,12 @@ function createAuth({ getUserByToken, methods: { emailAndPassword }, filterUser
|
|
|
43
36
|
return [201, { token }];
|
|
44
37
|
}
|
|
45
38
|
catch (error) {
|
|
46
|
-
|
|
47
|
-
throw
|
|
39
|
+
getLogger('core').error(error);
|
|
40
|
+
throw Unauthorized(error.message);
|
|
48
41
|
}
|
|
49
42
|
}));
|
|
50
43
|
}
|
|
51
|
-
router.get('/logout',
|
|
44
|
+
router.get('/logout', route(async (req, res) => {
|
|
52
45
|
const token = extractAccessTokenFromRequest(req);
|
|
53
46
|
if (token) {
|
|
54
47
|
await redis.del(token);
|
|
@@ -56,10 +49,10 @@ function createAuth({ getUserByToken, methods: { emailAndPassword }, filterUser
|
|
|
56
49
|
setAccessTokenCookie(res, null);
|
|
57
50
|
res.redirect('/');
|
|
58
51
|
}));
|
|
59
|
-
router.get('/token/refresh', middleware(false),
|
|
52
|
+
router.get('/token/refresh', middleware(false), route(async (req, res) => {
|
|
60
53
|
const user = useCurrentUser();
|
|
61
54
|
if (!user) {
|
|
62
|
-
throw
|
|
55
|
+
throw Unauthorized();
|
|
63
56
|
}
|
|
64
57
|
const { exp, iat, ...rest } = user;
|
|
65
58
|
const token = createAuthToken(rest);
|
|
@@ -86,17 +79,17 @@ function createAuth({ getUserByToken, methods: { emailAndPassword }, filterUser
|
|
|
86
79
|
}
|
|
87
80
|
throw new InvalidToken('token expired');
|
|
88
81
|
}
|
|
89
|
-
const decoded =
|
|
82
|
+
const decoded = jwt.verify(token.trim(), process.env.APP_JWT_SECRET);
|
|
90
83
|
if (typeof decoded === 'string') {
|
|
91
84
|
throw new Error('Failed to decode token');
|
|
92
85
|
}
|
|
93
86
|
const user = await getUserByToken({ ...decoded });
|
|
94
|
-
|
|
87
|
+
setContext('currentUser', user);
|
|
95
88
|
next();
|
|
96
89
|
}
|
|
97
90
|
catch (error) {
|
|
98
|
-
|
|
99
|
-
next(
|
|
91
|
+
getLogger('core').error(error);
|
|
92
|
+
next(Unauthorized('Invalid token'));
|
|
100
93
|
return;
|
|
101
94
|
}
|
|
102
95
|
};
|
|
@@ -107,12 +100,11 @@ function createAuth({ getUserByToken, methods: { emailAndPassword }, filterUser
|
|
|
107
100
|
middleware,
|
|
108
101
|
};
|
|
109
102
|
}
|
|
110
|
-
exports.createAuth = createAuth;
|
|
111
103
|
/**
|
|
112
104
|
* Extract a Bearer token from the HTTP Authorization header
|
|
113
105
|
* of `req`.
|
|
114
106
|
*/
|
|
115
|
-
function parseAuthorizationHeader(req) {
|
|
107
|
+
export function parseAuthorizationHeader(req) {
|
|
116
108
|
if (!req.headers.authorization) {
|
|
117
109
|
return null;
|
|
118
110
|
}
|
|
@@ -131,7 +123,6 @@ function parseAuthorizationHeader(req) {
|
|
|
131
123
|
}
|
|
132
124
|
return token;
|
|
133
125
|
}
|
|
134
|
-
exports.parseAuthorizationHeader = parseAuthorizationHeader;
|
|
135
126
|
function extractAccessTokenFromRequest(req) {
|
|
136
127
|
const authorizationHeader = parseAuthorizationHeader(req);
|
|
137
128
|
if (authorizationHeader) {
|
|
@@ -142,9 +133,9 @@ function extractAccessTokenFromRequest(req) {
|
|
|
142
133
|
}
|
|
143
134
|
return null;
|
|
144
135
|
}
|
|
145
|
-
function setAccessTokenCookie(res, token) {
|
|
136
|
+
export function setAccessTokenCookie(res, token) {
|
|
146
137
|
if (token == null) {
|
|
147
|
-
res.cookie('access_token',
|
|
138
|
+
res.cookie('access_token', v4(), {
|
|
148
139
|
expires: new Date(1970, 0, 1),
|
|
149
140
|
});
|
|
150
141
|
}
|
|
@@ -155,25 +146,22 @@ function setAccessTokenCookie(res, token) {
|
|
|
155
146
|
});
|
|
156
147
|
}
|
|
157
148
|
}
|
|
158
|
-
exports.setAccessTokenCookie = setAccessTokenCookie;
|
|
159
149
|
class InvalidToken extends Error {
|
|
160
150
|
constructor(message) {
|
|
161
151
|
super(message);
|
|
162
152
|
this.name = 'Invalid Token';
|
|
163
153
|
}
|
|
164
154
|
}
|
|
165
|
-
async function checkIfPasswordsMatch(realPassword, attemptedPassword) {
|
|
155
|
+
export async function checkIfPasswordsMatch(realPassword, attemptedPassword) {
|
|
166
156
|
if (!realPassword) {
|
|
167
157
|
throw new Error('User has no defined password');
|
|
168
158
|
}
|
|
169
|
-
const validPassword = await
|
|
159
|
+
const validPassword = await bcrypt.compare(attemptedPassword, realPassword);
|
|
170
160
|
if (!validPassword) {
|
|
171
161
|
throw new Error(`Passwords does not match`);
|
|
172
162
|
}
|
|
173
163
|
return true;
|
|
174
164
|
}
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
return bcrypt_1.default.hash(password, 10);
|
|
165
|
+
export function hashPassword(password) {
|
|
166
|
+
return bcrypt.hash(password, 10);
|
|
178
167
|
}
|
|
179
|
-
exports.hashPassword = hashPassword;
|
package/dist/context.d.ts
CHANGED
package/dist/context.js
CHANGED
|
@@ -1,49 +1,42 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const cls_hooked_1 = require("cls-hooked");
|
|
5
|
-
const uuid_1 = require("uuid");
|
|
6
|
-
const requestContext = (0, cls_hooked_1.createNamespace)('@requestContext');
|
|
1
|
+
import { createNamespace } from 'cls-hooked';
|
|
2
|
+
import { v4 as uuid } from 'uuid';
|
|
3
|
+
const requestContext = createNamespace('@requestContext');
|
|
7
4
|
/**
|
|
8
5
|
* Middleware for setting a `requestId` on the request context.
|
|
9
6
|
*/
|
|
10
|
-
function withRequestContext({ getRequestId = (req) => req.headers['X-Request-ID'], } = {}) {
|
|
7
|
+
export function withRequestContext({ getRequestId = (req) => req.headers['X-Request-ID'], } = {}) {
|
|
11
8
|
return (req, res, next) => {
|
|
12
|
-
const requestId = getRequestId(req) || (
|
|
9
|
+
const requestId = getRequestId(req) || uuid();
|
|
13
10
|
requestContext.run(() => {
|
|
14
11
|
requestContext.set('requestId', requestId);
|
|
15
12
|
next();
|
|
16
13
|
});
|
|
17
14
|
};
|
|
18
15
|
}
|
|
19
|
-
exports.withRequestContext = withRequestContext;
|
|
20
16
|
/**
|
|
21
17
|
* Return a value from the request context
|
|
22
18
|
*/
|
|
23
|
-
function useContext(key) {
|
|
19
|
+
export function useContext(key) {
|
|
24
20
|
if (requestContext && requestContext.active) {
|
|
25
21
|
return requestContext.get(key);
|
|
26
22
|
}
|
|
27
23
|
}
|
|
28
|
-
exports.useContext = useContext;
|
|
29
24
|
/**
|
|
30
25
|
* @deprecated
|
|
31
26
|
*/
|
|
32
|
-
|
|
27
|
+
export const getContext = useContext;
|
|
33
28
|
/**
|
|
34
29
|
* Set a value on the request context
|
|
35
30
|
*/
|
|
36
|
-
function setContext(key, value) {
|
|
31
|
+
export function setContext(key, value) {
|
|
37
32
|
if (requestContext && requestContext.active) {
|
|
38
33
|
return requestContext.set(key, value);
|
|
39
34
|
}
|
|
40
35
|
}
|
|
41
|
-
|
|
42
|
-
function useRequestId() {
|
|
36
|
+
export function useRequestId() {
|
|
43
37
|
return useContext('requestId');
|
|
44
38
|
}
|
|
45
|
-
exports.useRequestId = useRequestId;
|
|
46
39
|
/**
|
|
47
40
|
* @deprecated
|
|
48
41
|
*/
|
|
49
|
-
|
|
42
|
+
export const getRequestId = useRequestId;
|
package/dist/email.js
CHANGED
|
@@ -1,32 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.createEmail = void 0;
|
|
27
|
-
const nodemailer = __importStar(require("nodemailer"));
|
|
28
|
-
const logger_1 = require("./logger");
|
|
29
|
-
function createEmail({ host, port, user, pass, senderName, senderAddress, }) {
|
|
1
|
+
import * as nodemailer from 'nodemailer';
|
|
2
|
+
import { getLogger } from './logger.js';
|
|
3
|
+
export function createEmail({ host, port, user, pass, senderName, senderAddress, }) {
|
|
30
4
|
const transporter = nodemailer.createTransport({
|
|
31
5
|
host,
|
|
32
6
|
port: parseInt(port || '587', 10),
|
|
@@ -41,8 +15,7 @@ function createEmail({ host, port, user, pass, senderName, senderAddress, }) {
|
|
|
41
15
|
text: message,
|
|
42
16
|
...rest,
|
|
43
17
|
});
|
|
44
|
-
|
|
18
|
+
getLogger('core').info('email-sent', { email: result });
|
|
45
19
|
};
|
|
46
20
|
return { send };
|
|
47
21
|
}
|
|
48
|
-
exports.createEmail = createEmail;
|
package/dist/errors.js
CHANGED
|
@@ -1,58 +1,25 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.errorHandler = exports.mapToProblem = exports.makeError = exports.Conflict = exports.Unauthorized = exports.NotFound = exports.Forbidden = exports.BadRequest = exports.ApiError = void 0;
|
|
27
|
-
const http_1 = require("http");
|
|
28
|
-
const Sentry = __importStar(require("@sentry/node"));
|
|
29
|
-
const compose_middleware_1 = require("compose-middleware");
|
|
30
|
-
class ApiError extends Error {
|
|
1
|
+
import * as Sentry from '@sentry/node';
|
|
2
|
+
import { errors } from 'compose-middleware';
|
|
3
|
+
import { STATUS_CODES } from 'node:http';
|
|
4
|
+
export class ApiError extends Error {
|
|
31
5
|
}
|
|
32
|
-
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
const NotFound = (detail = 'Could not find resource') => makeError(404, detail);
|
|
38
|
-
exports.NotFound = NotFound;
|
|
39
|
-
const Unauthorized = (detail = 'Unauthorized') => makeError(401, detail);
|
|
40
|
-
exports.Unauthorized = Unauthorized;
|
|
41
|
-
const Conflict = (detail = '') => makeError(409, detail);
|
|
42
|
-
exports.Conflict = Conflict;
|
|
6
|
+
export const BadRequest = (reason) => makeError(400, 'Invalid Params', { reason });
|
|
7
|
+
export const Forbidden = (detail = '') => makeError(403, detail);
|
|
8
|
+
export const NotFound = (detail = 'Could not find resource') => makeError(404, detail);
|
|
9
|
+
export const Unauthorized = (detail = 'Unauthorized') => makeError(401, detail);
|
|
10
|
+
export const Conflict = (detail = '') => makeError(409, detail);
|
|
43
11
|
/**
|
|
44
12
|
* Create a new ApiError instance
|
|
45
13
|
*/
|
|
46
|
-
function makeError(status, detail, payload) {
|
|
47
|
-
const error = new ApiError(detail ||
|
|
14
|
+
export function makeError(status, detail, payload) {
|
|
15
|
+
const error = new ApiError(detail || STATUS_CODES[status]);
|
|
48
16
|
error.status = status;
|
|
49
17
|
error.payload = payload;
|
|
50
18
|
return error;
|
|
51
19
|
}
|
|
52
|
-
|
|
53
|
-
function mapToProblem(error) {
|
|
20
|
+
export function mapToProblem(error) {
|
|
54
21
|
if (error instanceof ApiError) {
|
|
55
|
-
const statusMessage =
|
|
22
|
+
const statusMessage = STATUS_CODES[error.status || '500'];
|
|
56
23
|
return {
|
|
57
24
|
type: `/api/problems/${statusMessage
|
|
58
25
|
.toLocaleLowerCase()
|
|
@@ -69,14 +36,13 @@ function mapToProblem(error) {
|
|
|
69
36
|
status: 500,
|
|
70
37
|
};
|
|
71
38
|
}
|
|
72
|
-
exports.mapToProblem = mapToProblem;
|
|
73
39
|
function _errorHandler({ onError }) {
|
|
74
40
|
return (err, req, res, next // eslint-disable-line
|
|
75
41
|
) => {
|
|
76
42
|
if (!err) {
|
|
77
43
|
err = makeError(500);
|
|
78
44
|
}
|
|
79
|
-
onError
|
|
45
|
+
onError?.(err);
|
|
80
46
|
const problem = mapToProblem(err);
|
|
81
47
|
res.status(problem.status).json(problem);
|
|
82
48
|
};
|
|
@@ -86,8 +52,8 @@ function _errorHandler({ onError }) {
|
|
|
86
52
|
*
|
|
87
53
|
* Composed together with the Sentry error handler.
|
|
88
54
|
*/
|
|
89
|
-
function errorHandler({ onError }) {
|
|
90
|
-
return
|
|
55
|
+
export function errorHandler({ onError }) {
|
|
56
|
+
return errors([
|
|
91
57
|
Sentry.Handlers.errorHandler({
|
|
92
58
|
shouldHandleError(error) {
|
|
93
59
|
if (error instanceof ApiError && error.status < 500) {
|
|
@@ -99,4 +65,3 @@ function errorHandler({ onError }) {
|
|
|
99
65
|
_errorHandler({ onError }),
|
|
100
66
|
]);
|
|
101
67
|
}
|
|
102
|
-
exports.errorHandler = errorHandler;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
export * from './auth';
|
|
2
|
-
export * from './context';
|
|
3
|
-
export * from './email';
|
|
4
|
-
export * from './errors';
|
|
5
|
-
export * from './listen';
|
|
6
|
-
export * from './logger';
|
|
7
|
-
export * from './middleware';
|
|
8
|
-
export * from './postgres';
|
|
9
|
-
export * from './redis';
|
|
10
|
-
export * from './routes';
|
|
11
|
-
export * from './sentry';
|
|
12
|
-
export * from './slack';
|
|
13
|
-
export * from './validate';
|
|
1
|
+
export * from './auth.js';
|
|
2
|
+
export * from './context.js';
|
|
3
|
+
export * from './email.js';
|
|
4
|
+
export * from './errors.js';
|
|
5
|
+
export * from './listen.js';
|
|
6
|
+
export * from './logger.js';
|
|
7
|
+
export * from './middleware.js';
|
|
8
|
+
export * from './postgres.js';
|
|
9
|
+
export * from './redis.js';
|
|
10
|
+
export * from './routes.js';
|
|
11
|
+
export * from './sentry.js';
|
|
12
|
+
export * from './slack.js';
|
|
13
|
+
export * from './validate.js';
|
|
14
14
|
export declare const envPort: (defaultPort?: number) => number;
|
package/dist/index.js
CHANGED
|
@@ -1,32 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
};
|
|
16
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.envPort = void 0;
|
|
18
|
-
__exportStar(require("./auth"), exports);
|
|
19
|
-
__exportStar(require("./context"), exports);
|
|
20
|
-
__exportStar(require("./email"), exports);
|
|
21
|
-
__exportStar(require("./errors"), exports);
|
|
22
|
-
__exportStar(require("./listen"), exports);
|
|
23
|
-
__exportStar(require("./logger"), exports);
|
|
24
|
-
__exportStar(require("./middleware"), exports);
|
|
25
|
-
__exportStar(require("./postgres"), exports);
|
|
26
|
-
__exportStar(require("./redis"), exports);
|
|
27
|
-
__exportStar(require("./routes"), exports);
|
|
28
|
-
__exportStar(require("./sentry"), exports);
|
|
29
|
-
__exportStar(require("./slack"), exports);
|
|
30
|
-
__exportStar(require("./validate"), exports);
|
|
31
|
-
const envPort = (defaultPort = 3000) => parseInt(process.env.PORT, 10) || defaultPort;
|
|
32
|
-
exports.envPort = envPort;
|
|
1
|
+
export * from './auth.js';
|
|
2
|
+
export * from './context.js';
|
|
3
|
+
export * from './email.js';
|
|
4
|
+
export * from './errors.js';
|
|
5
|
+
export * from './listen.js';
|
|
6
|
+
export * from './logger.js';
|
|
7
|
+
export * from './middleware.js';
|
|
8
|
+
export * from './postgres.js';
|
|
9
|
+
export * from './redis.js';
|
|
10
|
+
export * from './routes.js';
|
|
11
|
+
export * from './sentry.js';
|
|
12
|
+
export * from './slack.js';
|
|
13
|
+
export * from './validate.js';
|
|
14
|
+
export const envPort = (defaultPort = 3000) => parseInt(process.env.PORT, 10) || defaultPort;
|
package/dist/listen.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
import http from 'http';
|
|
3
|
-
import {
|
|
1
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
+
import type * as http from 'node:http';
|
|
3
|
+
import { type Logger } from './logger.js';
|
|
4
4
|
/**
|
|
5
5
|
* Listen on the given port and setup proper signal
|
|
6
6
|
* handlers for terminating the process properly.
|
|
@@ -9,7 +9,7 @@ import { createLogger } from './logger';
|
|
|
9
9
|
*/
|
|
10
10
|
export declare function listen(server: http.Server, options: {
|
|
11
11
|
port: number;
|
|
12
|
-
logger:
|
|
12
|
+
logger: Logger;
|
|
13
13
|
onShutdown?: () => void | Promise<void>;
|
|
14
14
|
healthCheck?: () => Promise<void>;
|
|
15
15
|
}): void;
|
package/dist/listen.js
CHANGED
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.listen = void 0;
|
|
4
|
-
const terminus_1 = require("@godaddy/terminus");
|
|
1
|
+
import { createTerminus } from '@godaddy/terminus';
|
|
5
2
|
const READINESS_PERIOD_MS = parseInt(process.env.DM_READINESS_PERIOD_MS || '', 10) || 0;
|
|
6
3
|
const FORCE_EXIT_TIMEOUT = parseInt(process.env.DM_FORCE_EXIT_TIMEOUT || '', 10) || 1000;
|
|
7
4
|
/**
|
|
@@ -10,8 +7,8 @@ const FORCE_EXIT_TIMEOUT = parseInt(process.env.DM_FORCE_EXIT_TIMEOUT || '', 10)
|
|
|
10
7
|
*
|
|
11
8
|
* Kubernetes friendly.
|
|
12
9
|
*/
|
|
13
|
-
function listen(server, options) {
|
|
14
|
-
|
|
10
|
+
export function listen(server, options) {
|
|
11
|
+
createTerminus(server, {
|
|
15
12
|
timeout: FORCE_EXIT_TIMEOUT,
|
|
16
13
|
signals: ['SIGTERM', 'SIGINT'],
|
|
17
14
|
async onShutdown() {
|
|
@@ -23,21 +20,19 @@ function listen(server, options) {
|
|
|
23
20
|
});
|
|
24
21
|
},
|
|
25
22
|
async onSignal() {
|
|
26
|
-
var _a;
|
|
27
23
|
options.logger.info('app received shutdown signal');
|
|
28
|
-
await
|
|
24
|
+
await options?.onShutdown?.();
|
|
29
25
|
},
|
|
30
26
|
async onSendFailureDuringShutdown() {
|
|
31
27
|
options.logger.info('app sent service not available message to client');
|
|
32
28
|
},
|
|
33
29
|
healthChecks: {
|
|
34
30
|
'/health': async ({ state }) => {
|
|
35
|
-
var _a;
|
|
36
31
|
if (state.isShuttingDown) {
|
|
37
32
|
return false;
|
|
38
33
|
}
|
|
39
34
|
try {
|
|
40
|
-
await
|
|
35
|
+
await options?.healthCheck?.();
|
|
41
36
|
}
|
|
42
37
|
catch (error) {
|
|
43
38
|
options.logger.error(error, 'health check failed');
|
|
@@ -51,4 +46,3 @@ function listen(server, options) {
|
|
|
51
46
|
options.logger.info('app listening', { port });
|
|
52
47
|
});
|
|
53
48
|
}
|
|
54
|
-
exports.listen = listen;
|
package/dist/logger.d.ts
CHANGED
package/dist/logger.js
CHANGED
|
@@ -1,38 +1,31 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.getLoggers = exports.getLogger = exports.createLogger = exports.attachSentryClientToLoggers = void 0;
|
|
7
|
-
const bunyan_1 = __importDefault(require("bunyan"));
|
|
8
|
-
const context_1 = require("./context");
|
|
1
|
+
import bunyan from 'bunyan';
|
|
2
|
+
import { useRequestId } from './context.js';
|
|
9
3
|
function defaultGetContext() {
|
|
10
4
|
return {
|
|
11
|
-
requestId:
|
|
5
|
+
requestId: useRequestId(),
|
|
12
6
|
};
|
|
13
7
|
}
|
|
14
8
|
const _loggers = new Map();
|
|
15
9
|
let _sentryClient;
|
|
16
|
-
function attachSentryClientToLoggers(sentryClient) {
|
|
10
|
+
export function attachSentryClientToLoggers(sentryClient) {
|
|
17
11
|
_sentryClient = sentryClient;
|
|
18
12
|
}
|
|
19
|
-
|
|
20
|
-
function createLogger({ name, getContext, silent = () => process.env.NODE_ENV === 'test', }) {
|
|
13
|
+
export function createLogger({ name, getContext, silent = () => process.env.NODE_ENV === 'test', }) {
|
|
21
14
|
if (_loggers.has(name)) {
|
|
22
15
|
throw new Error(`A logger named ${name} already exists`);
|
|
23
16
|
}
|
|
24
|
-
const logger =
|
|
17
|
+
const logger = bunyan.createLogger({
|
|
25
18
|
name,
|
|
26
|
-
serializers:
|
|
19
|
+
serializers: bunyan.stdSerializers,
|
|
27
20
|
});
|
|
28
21
|
_loggers.set(name, logger);
|
|
29
22
|
if (silent()) {
|
|
30
|
-
logger.level(
|
|
23
|
+
logger.level(bunyan.FATAL + 1);
|
|
31
24
|
}
|
|
32
25
|
function getFinalContext() {
|
|
33
26
|
return {
|
|
34
27
|
...defaultGetContext(),
|
|
35
|
-
...getContext
|
|
28
|
+
...getContext?.(),
|
|
36
29
|
};
|
|
37
30
|
}
|
|
38
31
|
return {
|
|
@@ -54,7 +47,7 @@ function createLogger({ name, getContext, silent = () => process.env.NODE_ENV ==
|
|
|
54
47
|
}
|
|
55
48
|
return logger
|
|
56
49
|
.child(context, true)
|
|
57
|
-
.error(error, message ||
|
|
50
|
+
.error(error, message || error?.message);
|
|
58
51
|
},
|
|
59
52
|
fatal(error, message) {
|
|
60
53
|
const context = getFinalContext();
|
|
@@ -67,16 +60,13 @@ function createLogger({ name, getContext, silent = () => process.env.NODE_ENV ==
|
|
|
67
60
|
},
|
|
68
61
|
};
|
|
69
62
|
}
|
|
70
|
-
|
|
71
|
-
function getLogger(name) {
|
|
63
|
+
export function getLogger(name) {
|
|
72
64
|
const logger = _loggers.get(name);
|
|
73
65
|
if (!logger) {
|
|
74
66
|
return createLogger({ name });
|
|
75
67
|
}
|
|
76
68
|
return logger;
|
|
77
69
|
}
|
|
78
|
-
|
|
79
|
-
function getLoggers() {
|
|
70
|
+
export function getLoggers() {
|
|
80
71
|
return _loggers;
|
|
81
72
|
}
|
|
82
|
-
exports.getLoggers = getLoggers;
|