beavuck-time 2.3.13 → 2.4.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/README.md CHANGED
@@ -86,12 +86,15 @@ If you want to run this service programmatically in your Node.js project:
86
86
  ```js
87
87
  import { startServer } from 'beavuck-time'
88
88
 
89
- startServer()
89
+ startServer({
90
+ port: 3000,
91
+ hostUrl: 'https://time-api.example.com',
92
+ trustedOrigins: 'https://my.app.com,https://my-other.app.com'
93
+ })
90
94
  ```
91
95
 
92
- You can rely on environment variables (BEAVUCK_TIME_HOST_URL, etc.) stored in a `.env` file at the root of your project.
93
- It is a known limitation -- work is in progress to allow passing those options directly as parameters to `startServer()`.
94
- Refer to the Docker Compose example below to see an exhaustive list of available environment variables and what they do.
96
+ You can rely on environment variables (BEAVUCK_TIME_HOST_URL, etc.) instead of passing an options object. Refer to
97
+ the Docker Compose example below to see an exhaustive list of available environment variables and what they do.
95
98
 
96
99
  #### CLI
97
100
 
@@ -11,7 +11,7 @@ exports.getTrustedOrigins = getTrustedOrigins;
11
11
  exports.initTrustedOrigins = initTrustedOrigins;
12
12
  exports.isAllTrusted = isAllTrusted;
13
13
  exports.isOriginAbsentOrTrusted = isOriginAbsentOrTrusted;
14
- const CorsError_1 = require("../errors/CorsError");
14
+ const corsError_1 = require("../errors/corsError");
15
15
  const urlUtil_1 = require("../utils/urlUtil");
16
16
  const http_status_codes_1 = require("http-status-codes");
17
17
  const dotenvx_1 = __importDefault(require("@dotenvx/dotenvx"));
@@ -27,7 +27,7 @@ exports.corsOptions = {
27
27
  callback(null, true);
28
28
  }
29
29
  else {
30
- callback(new CorsError_1.CorsError(origin), false);
30
+ callback(new corsError_1.CorsError(origin), false);
31
31
  }
32
32
  },
33
33
  };
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
- // src/errors/base/BeavuckTimeError.ts
2
+ // src/errors/base/beavuckTimeError.ts
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.BeavuckTimeError = void 0;
5
5
  class BeavuckTimeError extends Error {
@@ -1,10 +1,10 @@
1
1
  "use strict";
2
- // src/errors/BeavuckTimeClientError.ts
2
+ // src/errors/beavuckTimeClientError.ts
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.BeavuckTimeClientError = void 0;
5
- const BeavuckTimeError_1 = require("./base/BeavuckTimeError");
5
+ const beavuckTimeError_1 = require("./base/beavuckTimeError");
6
6
  const http_status_codes_1 = require("http-status-codes");
7
- class BeavuckTimeClientError extends BeavuckTimeError_1.BeavuckTimeError {
7
+ class BeavuckTimeClientError extends beavuckTimeError_1.BeavuckTimeError {
8
8
  static baseMessage = 'Client Error';
9
9
  constructor(message, code = http_status_codes_1.StatusCodes.BAD_REQUEST) {
10
10
  super(`${BeavuckTimeClientError.baseMessage}: ${message}`, code);
@@ -1,10 +1,10 @@
1
1
  "use strict";
2
- // src/errors/BeavuckTimeServerError.ts
2
+ // src/errors/beavuckTimeServerError.ts
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.BeavuckTimeServerError = void 0;
5
- const BeavuckTimeError_1 = require("./base/BeavuckTimeError");
5
+ const beavuckTimeError_1 = require("./base/beavuckTimeError");
6
6
  const http_status_codes_1 = require("http-status-codes");
7
- class BeavuckTimeServerError extends BeavuckTimeError_1.BeavuckTimeError {
7
+ class BeavuckTimeServerError extends beavuckTimeError_1.BeavuckTimeError {
8
8
  static baseMessage = 'Internal Server Error';
9
9
  constructor(message, code = http_status_codes_1.StatusCodes.INTERNAL_SERVER_ERROR) {
10
10
  super(`${BeavuckTimeServerError.baseMessage}: ${message}`, code);
@@ -1,10 +1,10 @@
1
1
  "use strict";
2
- // src/errors/CorsError.ts
2
+ // src/errors/corsError.ts
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.CorsError = void 0;
5
5
  const http_status_codes_1 = require("http-status-codes");
6
- const BeavuckTimeClientError_1 = require("./BeavuckTimeClientError");
7
- class CorsError extends BeavuckTimeClientError_1.BeavuckTimeClientError {
6
+ const beavuckTimeClientError_1 = require("./beavuckTimeClientError");
7
+ class CorsError extends beavuckTimeClientError_1.BeavuckTimeClientError {
8
8
  static baseMessage = 'Origin forbidden by CORS';
9
9
  constructor(origin) {
10
10
  super(`${CorsError.baseMessage}: ${origin}`, http_status_codes_1.StatusCodes.FORBIDDEN);
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ // src/errors/errorResponse.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.ErrorResponse = void 0;
5
+ const beavuckTimeServerError_1 = require("./beavuckTimeServerError");
6
+ class ErrorResponse {
7
+ message;
8
+ details;
9
+ constructor(message = beavuckTimeServerError_1.BeavuckTimeServerError.baseMessage, details) {
10
+ this.message = message;
11
+ this.details = details;
12
+ }
13
+ }
14
+ exports.ErrorResponse = ErrorResponse;
@@ -7,9 +7,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
7
7
  exports.corsMiddleware = void 0;
8
8
  const cors_1 = __importDefault(require("cors"));
9
9
  const urlUtil_1 = require("../utils/urlUtil");
10
- const CorsError_1 = require("../errors/CorsError");
10
+ const corsError_1 = require("../errors/corsError");
11
11
  const logger_1 = require("../config/logger");
12
- const BeavuckTimeServerError_1 = require("../errors/BeavuckTimeServerError");
12
+ const beavuckTimeServerError_1 = require("../errors/beavuckTimeServerError");
13
13
  const corsOptions_1 = require("../config/corsOptions");
14
14
  const corsMiddleware = (req, res, next) => {
15
15
  const HOST_URL = (0, urlUtil_1.tryParseUrl)(process.env.BEAVUCK_TIME_HOST_URL ?? '');
@@ -21,14 +21,14 @@ const corsMiddleware = (req, res, next) => {
21
21
  }
22
22
  else if (!HOST_URL) {
23
23
  const noHostUrl = 'Host URL not set';
24
- next(new BeavuckTimeServerError_1.BeavuckTimeServerError(noHostUrl));
24
+ next(new beavuckTimeServerError_1.BeavuckTimeServerError(noHostUrl));
25
25
  }
26
26
  else if ((0, urlUtil_1.isSameOrigin)(HOST_URL, (0, urlUtil_1.tryParseUrl)(referrerHeader ?? ''))) {
27
27
  next();
28
28
  }
29
29
  else {
30
30
  const badOriginAndOrReferrer = `origin: ${req.headers.origin}, referrer: ${referrerHeader}`;
31
- next(new CorsError_1.CorsError(badOriginAndOrReferrer));
31
+ next(new corsError_1.CorsError(badOriginAndOrReferrer));
32
32
  }
33
33
  };
34
34
  exports.corsMiddleware = corsMiddleware;
@@ -3,10 +3,11 @@
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.errorHandler = void 0;
5
5
  const logger_1 = require("../config/logger");
6
- const BeavuckTimeClientError_1 = require("../errors/BeavuckTimeClientError");
7
- const BeavuckTimeServerError_1 = require("../errors/BeavuckTimeServerError");
6
+ const beavuckTimeClientError_1 = require("../errors/beavuckTimeClientError");
7
+ const beavuckTimeServerError_1 = require("../errors/beavuckTimeServerError");
8
8
  const http_status_codes_1 = require("http-status-codes");
9
9
  const tsoa_1 = require("tsoa");
10
+ const errorResponse_1 = require("../errors/errorResponse");
10
11
  const errorHandler = (err, req, res, next) => {
11
12
  if (err instanceof tsoa_1.ValidateError) {
12
13
  const logMsg = `Validation error on ${req.path}: ${err.fields}`;
@@ -14,11 +15,11 @@ const errorHandler = (err, req, res, next) => {
14
15
  const resMsgObj = { message: 'Validation Error', details: err.fields };
15
16
  handleOtherError(res, logMsg, resStatus, resMsgObj);
16
17
  }
17
- else if (err instanceof BeavuckTimeClientError_1.BeavuckTimeClientError) {
18
+ else if (err instanceof beavuckTimeClientError_1.BeavuckTimeClientError) {
18
19
  handleBeavuckClientError(res, err);
19
20
  }
20
- else if (err instanceof BeavuckTimeServerError_1.BeavuckTimeServerError || err instanceof Error) {
21
- handleBeavuckServerError(res, BeavuckTimeServerError_1.BeavuckTimeServerError.fromError(err));
21
+ else if (err instanceof beavuckTimeServerError_1.BeavuckTimeServerError || err instanceof Error) {
22
+ handleBeavuckServerError(res, beavuckTimeServerError_1.BeavuckTimeServerError.fromError(err));
22
23
  }
23
24
  else if (err) {
24
25
  handleOtherError(res);
@@ -39,9 +40,7 @@ function handleBeavuckServerError(res, err) {
39
40
  logger_1.logger.error(err);
40
41
  sendErrorResponse(res, err);
41
42
  }
42
- function handleOtherError(res, logMsg = `Unknown error`, resStatus = http_status_codes_1.StatusCodes.INTERNAL_SERVER_ERROR, resMsg = {
43
- message: BeavuckTimeServerError_1.BeavuckTimeServerError.baseMessage,
44
- }) {
43
+ function handleOtherError(res, logMsg = `Unknown error`, resStatus = http_status_codes_1.StatusCodes.INTERNAL_SERVER_ERROR, resMsg = new errorResponse_1.ErrorResponse()) {
45
44
  logger_1.logger.error(`${logMsg}: ${JSON.stringify(resMsg)}`);
46
45
  res.status(resStatus).json(resMsg);
47
46
  }
@@ -7,7 +7,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
7
7
  exports.rateLimiter = void 0;
8
8
  const express_rate_limit_1 = __importDefault(require("express-rate-limit"));
9
9
  const NO_RATE_LIMIT = '-1';
10
- const RATE_LIMIT = parseInt(process.env.BEAVUCK_TIME_RATE_LIMIT ?? NO_RATE_LIMIT, 10);
10
+ const RATE_LIMIT = Number.parseInt(process.env.BEAVUCK_TIME_RATE_LIMIT ?? NO_RATE_LIMIT, 10);
11
11
  const SECONDS_IN_ONE_MINUTE = 60;
12
12
  const MILLISECONDS_IN_ONE_SECOND = 1000;
13
13
  const ONE_MINUTE = SECONDS_IN_ONE_MINUTE * MILLISECONDS_IN_ONE_SECOND;
package/build/server.js CHANGED
@@ -23,11 +23,16 @@ function validateEnv({ hostUrl, trustedOrigins, }) {
23
23
  process.exit(1);
24
24
  }
25
25
  }
26
- // FIXME the server options method causes an exception, npm users will have to use a .env file for now
26
+ function propagateOptionsInEnv(HOST_URL, TRUSTED_ORIGINS, API_PORT) {
27
+ process.env.BEAVUCK_TIME_HOST_URL = HOST_URL;
28
+ process.env.BEAVUCK_TIME_TRUSTED_ORIGINS = TRUSTED_ORIGINS;
29
+ process.env.BEAVUCK_TIME_API_PORT = String(API_PORT);
30
+ }
27
31
  function startServer(options = {}) {
28
32
  const API_PORT = options.port ?? process.env.BEAVUCK_TIME_API_PORT ?? 3000;
29
33
  const HOST_URL = options.hostUrl ?? process.env.BEAVUCK_TIME_HOST_URL ?? '';
30
34
  const TRUSTED_ORIGINS = options.trustedOrigins ?? process.env.BEAVUCK_TIME_TRUSTED_ORIGINS ?? '';
35
+ propagateOptionsInEnv(HOST_URL, TRUSTED_ORIGINS, API_PORT);
31
36
  validateEnv({ hostUrl: HOST_URL, trustedOrigins: TRUSTED_ORIGINS });
32
37
  const server = api_1.api.listen(API_PORT, () => {
33
38
  logger_1.logger.info(`
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.isSameOrigin = isSameOrigin;
5
5
  exports.tryParseUrl = tryParseUrl;
6
- const url_1 = require("url");
6
+ const node_url_1 = require("node:url");
7
7
  const logger_1 = require("../config/logger");
8
8
  function isSameOrigin(thisUrl, thatUrl) {
9
9
  logger_1.logger.debug(`Comparing origins: ${thisUrl?.origin} and ${thatUrl?.origin}`);
@@ -22,7 +22,7 @@ function tryParseUrl(urlString) {
22
22
  return undefined;
23
23
  }
24
24
  try {
25
- return new url_1.URL(urlString);
25
+ return new node_url_1.URL(urlString);
26
26
  }
27
27
  catch (error) {
28
28
  logger_1.logger.warn(`Invalid URL string: ${urlString} (${error})`);
@@ -32,7 +32,7 @@
32
32
  },
33
33
  "info": {
34
34
  "title": "beavuck-time",
35
- "version": "2.3.13",
35
+ "version": "2.4.0",
36
36
  "description": "Get time in ISO format, in UTC timezone, from a simple, lightweight node server",
37
37
  "license": {
38
38
  "name": "Unlicense"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "beavuck-time",
3
- "version": "2.3.13",
3
+ "version": "2.4.0",
4
4
  "description": "Get time in ISO format, in UTC timezone, from a simple, lightweight node server",
5
5
  "keywords": [
6
6
  "time",
@@ -46,7 +46,7 @@
46
46
  "test": "DOTENV_CONFIG_PATH=./.env.test jest --coverage",
47
47
  "build": "tsoa spec-and-routes && tsc",
48
48
  "start": "node build/server.js",
49
- "go": "rm -rf build && npm install && npm run build && npm run clean && npm run test && npm start"
49
+ "go": "rm -rf build && npm install && npm run build && npm run clean && npm run test && npm run start"
50
50
  },
51
51
  "dependencies": {
52
52
  "@dotenvx/dotenvx": "^1.51.0",