serverless-simple-middleware 0.0.74 → 0.0.75

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.
@@ -1,94 +1,94 @@
1
- import { basename } from 'path';
2
- import { envDefault as currentStage, StagingLevel } from 'simple-staging';
3
- import { $enum } from 'ts-enum-util';
4
- import { stringifyError } from './misc';
5
-
6
- export enum LogLevel {
7
- Error = 'error',
8
- Warn = 'warn',
9
- Info = 'info',
10
- Debug = 'debug',
11
- Verbose = 'verbose',
12
- Silly = 'silly',
13
- Stupid = 'stupid',
14
- }
15
-
16
- const severity = (level: LogLevel) => {
17
- switch (level) {
18
- case LogLevel.Error:
19
- return 100;
20
- case LogLevel.Warn:
21
- return 200;
22
- case LogLevel.Info:
23
- return 300;
24
- case LogLevel.Debug:
25
- return 400;
26
- case LogLevel.Verbose:
27
- return 500;
28
- case LogLevel.Silly:
29
- return 600;
30
- case LogLevel.Stupid:
31
- return 700;
32
- default:
33
- return 1000;
34
- }
35
- };
36
-
37
- export const currentLogLevel = $enum(LogLevel).asValueOrDefault(
38
- process.env.LOG_LEVEL,
39
- currentStage.level !== StagingLevel.Release
40
- ? LogLevel.Verbose
41
- : LogLevel.Debug,
42
- );
43
-
44
- type LogMessage = string | Error;
45
-
46
- export class Logger {
47
- private name: string;
48
- private severity: number;
49
-
50
- constructor(name: string, level: LogLevel = currentLogLevel) {
51
- this.name = name;
52
- this.severity = severity(level);
53
- }
54
-
55
- public log = (level: LogLevel, message: LogMessage) => {
56
- if (this.severity >= severity(level)) {
57
- console.log(
58
- `[${new Date().toISOString()}][${level.toUpperCase()}][${this.name}] ${
59
- message instanceof Error ? stringifyError(message) : message
60
- }`,
61
- );
62
- }
63
- return message;
64
- };
65
-
66
- public error = (message: LogMessage) => this.log(LogLevel.Error, message);
67
- public warn = (message: LogMessage) => this.log(LogLevel.Warn, message);
68
- public info = (message: LogMessage) => this.log(LogLevel.Info, message);
69
- public debug = (message: LogMessage) => this.log(LogLevel.Debug, message);
70
- public verbose = (message: LogMessage) => this.log(LogLevel.Verbose, message);
71
- public silly = (message: LogMessage) => this.log(LogLevel.Silly, message);
72
-
73
- public stupid = <T>(
74
- message: string,
75
- object: T,
76
- replacer?: (key: string, value: T) => T,
77
- ) => {
78
- this.log(
79
- LogLevel.Stupid,
80
- `${message}: ${JSON.stringify(object, replacer)}`,
81
- );
82
- return object;
83
- };
84
- }
85
-
86
- const loggers: { [name: string]: Logger } = {};
87
-
88
- export const getLogger = (fileName: string, level?: LogLevel): Logger => {
89
- const name = basename(fileName);
90
- if (loggers[name] === undefined) {
91
- loggers[name] = new Logger(name, level);
92
- }
93
- return loggers[name];
94
- };
1
+ import { basename } from 'path';
2
+ import { envDefault as currentStage, StagingLevel } from 'simple-staging';
3
+ import { $enum } from 'ts-enum-util';
4
+ import { stringifyError } from './misc';
5
+
6
+ export enum LogLevel {
7
+ Error = 'error',
8
+ Warn = 'warn',
9
+ Info = 'info',
10
+ Debug = 'debug',
11
+ Verbose = 'verbose',
12
+ Silly = 'silly',
13
+ Stupid = 'stupid',
14
+ }
15
+
16
+ const severity = (level: LogLevel) => {
17
+ switch (level) {
18
+ case LogLevel.Error:
19
+ return 100;
20
+ case LogLevel.Warn:
21
+ return 200;
22
+ case LogLevel.Info:
23
+ return 300;
24
+ case LogLevel.Debug:
25
+ return 400;
26
+ case LogLevel.Verbose:
27
+ return 500;
28
+ case LogLevel.Silly:
29
+ return 600;
30
+ case LogLevel.Stupid:
31
+ return 700;
32
+ default:
33
+ return 1000;
34
+ }
35
+ };
36
+
37
+ export const currentLogLevel = $enum(LogLevel).asValueOrDefault(
38
+ process.env.LOG_LEVEL,
39
+ currentStage.level !== StagingLevel.Release
40
+ ? LogLevel.Verbose
41
+ : LogLevel.Debug,
42
+ );
43
+
44
+ type LogMessage = string | Error;
45
+
46
+ export class Logger {
47
+ private name: string;
48
+ private severity: number;
49
+
50
+ constructor(name: string, level: LogLevel = currentLogLevel) {
51
+ this.name = name;
52
+ this.severity = severity(level);
53
+ }
54
+
55
+ public log = (level: LogLevel, message: LogMessage) => {
56
+ if (this.severity >= severity(level)) {
57
+ console.log(
58
+ `[${new Date().toISOString()}][${level.toUpperCase()}][${this.name}] ${
59
+ message instanceof Error ? stringifyError(message) : message
60
+ }`,
61
+ );
62
+ }
63
+ return message;
64
+ };
65
+
66
+ public error = (message: LogMessage) => this.log(LogLevel.Error, message);
67
+ public warn = (message: LogMessage) => this.log(LogLevel.Warn, message);
68
+ public info = (message: LogMessage) => this.log(LogLevel.Info, message);
69
+ public debug = (message: LogMessage) => this.log(LogLevel.Debug, message);
70
+ public verbose = (message: LogMessage) => this.log(LogLevel.Verbose, message);
71
+ public silly = (message: LogMessage) => this.log(LogLevel.Silly, message);
72
+
73
+ public stupid = <T>(
74
+ message: string,
75
+ object: T,
76
+ replacer?: (key: string, value: T) => T,
77
+ ) => {
78
+ this.log(
79
+ LogLevel.Stupid,
80
+ `${message}: ${JSON.stringify(object, replacer)}`,
81
+ );
82
+ return object;
83
+ };
84
+ }
85
+
86
+ const loggers: { [name: string]: Logger } = {};
87
+
88
+ export const getLogger = (fileName: string, level?: LogLevel): Logger => {
89
+ const name = basename(fileName);
90
+ if (loggers[name] === undefined) {
91
+ loggers[name] = new Logger(name, level);
92
+ }
93
+ return loggers[name];
94
+ };
package/src/utils/misc.ts CHANGED
@@ -1,20 +1,20 @@
1
- import { AwsError } from '../internal/AwsError';
2
-
3
- export const stringifyError = (
4
- err: any,
5
- replacer?: (key: string, value: any) => any,
6
- space?: string | number,
7
- ) => {
8
- const error = isAWSv3Error(err) ? new AwsError(err) : err;
9
- const plainObject = {} as any;
10
- Object.getOwnPropertyNames(error).forEach((key) => {
11
- plainObject[key] = error[key];
12
- });
13
- return JSON.stringify(plainObject, replacer, space);
14
- };
15
-
16
- const isAWSv3Error = (
17
- error: unknown,
18
- ): error is Error & { $metadata?: object } => {
19
- return error instanceof Error && 'name' in error && '$metadata' in error;
20
- };
1
+ import { AwsError } from '../internal/AwsError';
2
+
3
+ export const stringifyError = (
4
+ err: any,
5
+ replacer?: (key: string, value: any) => any,
6
+ space?: string | number,
7
+ ) => {
8
+ const error = isAWSv3Error(err) ? new AwsError(err) : err;
9
+ const plainObject = {} as any;
10
+ Object.getOwnPropertyNames(error).forEach((key) => {
11
+ plainObject[key] = error[key];
12
+ });
13
+ return JSON.stringify(plainObject, replacer, space);
14
+ };
15
+
16
+ const isAWSv3Error = (
17
+ error: unknown,
18
+ ): error is Error & { $metadata?: object } => {
19
+ return error instanceof Error && 'name' in error && '$metadata' in error;
20
+ };
@@ -1,86 +1,86 @@
1
- import {
2
- GetSecretValueCommand,
3
- SecretsManagerClient,
4
- SecretsManagerClientConfig,
5
- } from '@aws-sdk/client-secrets-manager';
6
- import type { DatabaseCredentials } from '../middleware/mysql';
7
- import { getLogger } from './logger';
8
- import { stringifyError } from './misc';
9
-
10
- const logger = getLogger(__filename);
11
-
12
- export class SecretsManagerCache {
13
- private static instance: SecretsManagerCache;
14
- private client: SecretsManagerClient | undefined;
15
- private clientConfig: SecretsManagerClientConfig | undefined;
16
- private cache = new Map<string, any>();
17
-
18
- private constructor() {}
19
-
20
- public static getInstance(): SecretsManagerCache {
21
- if (!SecretsManagerCache.instance) {
22
- SecretsManagerCache.instance = new SecretsManagerCache();
23
- }
24
- return SecretsManagerCache.instance;
25
- }
26
-
27
- public configure(config: SecretsManagerClientConfig): void {
28
- if (this.client) {
29
- logger.warn(
30
- 'SecretsManager client already initialized. Reconfiguring with new config.',
31
- );
32
- this.client = undefined;
33
- }
34
- this.clientConfig = config;
35
- logger.debug('SecretsManager client config updated');
36
- }
37
-
38
- private getClient(): SecretsManagerClient {
39
- if (!this.client) {
40
- this.client = new SecretsManagerClient(this.clientConfig ?? {});
41
- logger.debug('SecretsManager client initialized');
42
- }
43
- return this.client;
44
- }
45
-
46
- public async getSecret<T = any>(secretId: string): Promise<T> {
47
- if (this.cache.has(secretId)) {
48
- logger.debug(`Secret ${secretId} found in cache`);
49
- return this.cache.get(secretId);
50
- }
51
-
52
- try {
53
- const command = new GetSecretValueCommand({ SecretId: secretId });
54
- const response = await this.getClient().send(command);
55
-
56
- if (!response.SecretString) {
57
- throw new Error(`Secret ${secretId} has no SecretString value`);
58
- }
59
-
60
- const secretValue = JSON.parse(response.SecretString);
61
-
62
- this.cache.set(secretId, secretValue);
63
-
64
- return secretValue;
65
- } catch (error) {
66
- logger.error(
67
- `Failed to fetch secret ${secretId}: ${stringifyError(error)}`,
68
- );
69
- throw error;
70
- }
71
- }
72
-
73
- public async getDatabaseCredentials(
74
- secretId: string,
75
- ): Promise<DatabaseCredentials> {
76
- const secret = await this.getSecret<DatabaseCredentials>(secretId);
77
-
78
- if (!secret.username || !secret.password) {
79
- throw new Error(
80
- `Secret ${secretId} does not contain required database credentials (username, password)`,
81
- );
82
- }
83
-
84
- return secret;
85
- }
86
- }
1
+ import {
2
+ GetSecretValueCommand,
3
+ SecretsManagerClient,
4
+ SecretsManagerClientConfig,
5
+ } from '@aws-sdk/client-secrets-manager';
6
+ import type { DatabaseCredentials } from '../middleware/mysql';
7
+ import { getLogger } from './logger';
8
+ import { stringifyError } from './misc';
9
+
10
+ const logger = getLogger(__filename);
11
+
12
+ export class SecretsManagerCache {
13
+ private static instance: SecretsManagerCache;
14
+ private client: SecretsManagerClient | undefined;
15
+ private clientConfig: SecretsManagerClientConfig | undefined;
16
+ private cache = new Map<string, any>();
17
+
18
+ private constructor() {}
19
+
20
+ public static getInstance(): SecretsManagerCache {
21
+ if (!SecretsManagerCache.instance) {
22
+ SecretsManagerCache.instance = new SecretsManagerCache();
23
+ }
24
+ return SecretsManagerCache.instance;
25
+ }
26
+
27
+ public configure(config: SecretsManagerClientConfig): void {
28
+ if (this.client) {
29
+ logger.warn(
30
+ 'SecretsManager client already initialized. Reconfiguring with new config.',
31
+ );
32
+ this.client = undefined;
33
+ }
34
+ this.clientConfig = config;
35
+ logger.debug('SecretsManager client config updated');
36
+ }
37
+
38
+ private getClient(): SecretsManagerClient {
39
+ if (!this.client) {
40
+ this.client = new SecretsManagerClient(this.clientConfig ?? {});
41
+ logger.debug('SecretsManager client initialized');
42
+ }
43
+ return this.client;
44
+ }
45
+
46
+ public async getSecret<T = any>(secretId: string): Promise<T> {
47
+ if (this.cache.has(secretId)) {
48
+ logger.debug(`Secret ${secretId} found in cache`);
49
+ return this.cache.get(secretId);
50
+ }
51
+
52
+ try {
53
+ const command = new GetSecretValueCommand({ SecretId: secretId });
54
+ const response = await this.getClient().send(command);
55
+
56
+ if (!response.SecretString) {
57
+ throw new Error(`Secret ${secretId} has no SecretString value`);
58
+ }
59
+
60
+ const secretValue = JSON.parse(response.SecretString);
61
+
62
+ this.cache.set(secretId, secretValue);
63
+
64
+ return secretValue;
65
+ } catch (error) {
66
+ logger.error(
67
+ `Failed to fetch secret ${secretId}: ${stringifyError(error)}`,
68
+ );
69
+ throw error;
70
+ }
71
+ }
72
+
73
+ public async getDatabaseCredentials(
74
+ secretId: string,
75
+ ): Promise<DatabaseCredentials> {
76
+ const secret = await this.getSecret<DatabaseCredentials>(secretId);
77
+
78
+ if (!secret.username || !secret.password) {
79
+ throw new Error(
80
+ `Secret ${secretId} does not contain required database credentials (username, password)`,
81
+ );
82
+ }
83
+
84
+ return secret;
85
+ }
86
+ }
package/tsconfig.json CHANGED
@@ -1,16 +1,16 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ES2022",
4
- "module": "commonjs",
5
- "lib": ["ES2022", "es7", "es6", "esnext", "dom"],
6
- "rootDir": "src",
7
- "outDir": "dist",
8
- "declaration": true,
9
- "noImplicitAny": true,
10
- "strictNullChecks": true,
11
- "noUnusedLocals": true,
12
- "noUnusedParameters": true,
13
- "skipLibCheck": true
14
- },
15
- "exclude": ["node_modules", "dist", "__tests__"]
16
- }
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "commonjs",
5
+ "lib": ["ES2022", "es7", "es6", "esnext", "dom"],
6
+ "rootDir": "src",
7
+ "outDir": "dist",
8
+ "declaration": true,
9
+ "noImplicitAny": true,
10
+ "strictNullChecks": true,
11
+ "noUnusedLocals": true,
12
+ "noUnusedParameters": true,
13
+ "skipLibCheck": true
14
+ },
15
+ "exclude": ["node_modules", "dist", "__tests__"]
16
+ }
package/tslint.json CHANGED
@@ -1,12 +1,12 @@
1
- {
2
- "extends": ["tslint:latest", "tslint-config-prettier"],
3
- "linterOptions": {
4
- "exclude": ["node_modules", "dist"]
5
- },
6
- "rules": {
7
- "object-literal-sort-keys": false,
8
- "interface-name": false,
9
- "max-classes-per-file": false,
10
- "no-console": false
11
- }
12
- }
1
+ {
2
+ "extends": ["tslint:latest", "tslint-config-prettier"],
3
+ "linterOptions": {
4
+ "exclude": ["node_modules", "dist"]
5
+ },
6
+ "rules": {
7
+ "object-literal-sort-keys": false,
8
+ "interface-name": false,
9
+ "max-classes-per-file": false,
10
+ "no-console": false
11
+ }
12
+ }