@devmoods/express-extras 0.13.8 → 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 ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env -S node --loader ts-node/esm
2
+
3
+ import 'dotenv/config';
4
+
5
+ async function run() {
6
+ const { cli } = await import('../dist/migrate.js');
7
+ cli();
8
+ }
9
+
10
+ run();
@@ -1,10 +1,8 @@
1
- "use strict";
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 = (0, auth_1.createAuthToken)({});
4
+ const first = createAuthToken({});
7
5
  await new Promise((resolve) => setTimeout(resolve, 1000));
8
- const second = (0, auth_1.createAuthToken)({});
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
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.hashPassword = exports.checkIfPasswordsMatch = exports.setAccessTokenCookie = exports.parseAuthorizationHeader = exports.createAuth = exports.createAuthToken = void 0;
7
- const bcrypt_1 = __importDefault(require("bcrypt"));
8
- const express_1 = require("express");
9
- const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
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 jsonwebtoken_1.default.sign(payload, secret, { expiresIn: TOKEN_EXPIRES_IN });
11
+ export function createAuthToken(payload, secret = process.env.APP_JWT_SECRET) {
12
+ return jwt.sign(payload, secret, { expiresIn: TOKEN_EXPIRES_IN });
19
13
  }
20
- exports.createAuthToken = createAuthToken;
21
- function createAuth({ getUserByToken, methods: { emailAndPassword }, filterUser = (x) => x, redis, tokenExpiry = TOKEN_EXPIRES_IN, }) {
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 = (0, express_1.Router)();
25
- router.get('/me', middleware(), (0, middleware_1.route)(() => {
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', (0, validate_1.validateBody)({
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
- }), (0, middleware_1.route)(async ({ body: { email, password } }, res) => {
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
- (0, logger_1.getLogger)('core').error(error);
47
- throw (0, errors_1.Unauthorized)(error.message);
39
+ getLogger('core').error(error);
40
+ throw Unauthorized(error.message);
48
41
  }
49
42
  }));
50
43
  }
51
- router.get('/logout', (0, middleware_1.route)(async (req, res) => {
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), (0, middleware_1.route)(async (req, res) => {
52
+ router.get('/token/refresh', middleware(false), route(async (req, res) => {
60
53
  const user = useCurrentUser();
61
54
  if (!user) {
62
- throw (0, errors_1.Unauthorized)();
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 = jsonwebtoken_1.default.verify(token.trim(), process.env.APP_JWT_SECRET);
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
- (0, context_1.setContext)('currentUser', user);
87
+ setContext('currentUser', user);
95
88
  next();
96
89
  }
97
90
  catch (error) {
98
- (0, logger_1.getLogger)('core').error(error);
99
- next((0, errors_1.Unauthorized)('Invalid token'));
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', (0, uuid_1.v4)(), {
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 bcrypt_1.default.compare(attemptedPassword, realPassword);
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
- exports.checkIfPasswordsMatch = checkIfPasswordsMatch;
176
- function hashPassword(password) {
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
@@ -1,4 +1,4 @@
1
- import { Request, RequestHandler } from 'express';
1
+ import { type Request, type RequestHandler } from 'express';
2
2
  interface RequestContextOptions {
3
3
  getRequestId?: (req: Request) => string | undefined;
4
4
  }
package/dist/context.js CHANGED
@@ -1,49 +1,42 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getRequestId = exports.useRequestId = exports.setContext = exports.getContext = exports.useContext = exports.withRequestContext = void 0;
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) || (0, uuid_1.v4)();
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
- exports.getContext = useContext;
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
- exports.setContext = setContext;
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
- exports.getRequestId = useRequestId;
42
+ export const getRequestId = useRequestId;
package/dist/email.js CHANGED
@@ -1,32 +1,6 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
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
- (0, logger_1.getLogger)('core').info('email-sent', { email: result });
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
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
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.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
- exports.ApiError = ApiError;
33
- const BadRequest = (reason) => makeError(400, 'Invalid Params', { reason });
34
- exports.BadRequest = BadRequest;
35
- const Forbidden = (detail = '') => makeError(403, detail);
36
- exports.Forbidden = Forbidden;
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 || http_1.STATUS_CODES[status]);
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
- exports.makeError = makeError;
53
- function mapToProblem(error) {
20
+ export function mapToProblem(error) {
54
21
  if (error instanceof ApiError) {
55
- const statusMessage = http_1.STATUS_CODES[error.status || '500'];
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 === null || onError === void 0 ? void 0 : onError(err);
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 (0, compose_middleware_1.errors)([
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
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
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 { createLogger } from './logger';
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: ReturnType<typeof createLogger>;
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
- "use strict";
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
- (0, terminus_1.createTerminus)(server, {
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,20 +20,24 @@ 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 ((_a = options === null || options === void 0 ? void 0 : options.onShutdown) === null || _a === void 0 ? void 0 : _a.call(options));
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
- await ((_a = options === null || options === void 0 ? void 0 : options.healthCheck) === null || _a === void 0 ? void 0 : _a.call(options));
34
+ try {
35
+ await options?.healthCheck?.();
36
+ }
37
+ catch (error) {
38
+ options.logger.error(error, 'health check failed');
39
+ throw error;
40
+ }
40
41
  },
41
42
  },
42
43
  });
@@ -45,4 +46,3 @@ function listen(server, options) {
45
46
  options.logger.info('app listening', { port });
46
47
  });
47
48
  }
48
- exports.listen = listen;
package/dist/logger.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import type { CreateSentry } from './sentry.js';
1
2
  export interface LoggerOptions {
2
3
  /**
3
4
  * Name of the logger
@@ -14,7 +15,8 @@ export interface LoggerOptions {
14
15
  */
15
16
  silent?: () => boolean;
16
17
  }
17
- declare type Logger = ReturnType<typeof createLogger>;
18
+ export declare function attachSentryClientToLoggers(sentryClient: CreateSentry['client']): void;
19
+ export declare type Logger = ReturnType<typeof createLogger>;
18
20
  export declare function createLogger({ name, getContext, silent, }: LoggerOptions): {
19
21
  debug(message: string, context?: {
20
22
  [key: string]: any;
@@ -42,4 +44,3 @@ export declare function getLoggers(): Map<string, {
42
44
  error(error: Error | null, message?: string | undefined): void;
43
45
  fatal(error: Error | null, message?: string | undefined): void;
44
46
  }>;
45
- export {};