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.
- package/.prettierignore +2 -2
- package/README.md +3 -3
- package/dist/middleware/buildWebSocket.d.ts +5 -0
- package/dist/middleware/buildWebSocket.js +127 -0
- package/dist/middleware/index.d.ts +2 -0
- package/dist/middleware/index.js +3 -0
- package/dist/middleware/websocketBase.d.ts +32 -0
- package/dist/middleware/websocketBase.js +65 -0
- package/jest.config.js +7 -7
- package/package.json +70 -70
- package/src/aws/config.ts +46 -46
- package/src/aws/define.ts +10 -10
- package/src/aws/index.ts +3 -3
- package/src/aws/simple.ts +705 -705
- package/src/index.ts +3 -3
- package/src/internal/AwsError.ts +13 -13
- package/src/internal/oncePromise.ts +29 -29
- package/src/internal/s3.ts +75 -75
- package/src/middleware/aws.ts +78 -78
- package/src/middleware/base.ts +206 -206
- package/src/middleware/build.ts +273 -273
- package/src/middleware/buildWebSocket.ts +199 -0
- package/src/middleware/database/connectionProxy.ts +294 -294
- package/src/middleware/database/sqlClient.ts +208 -208
- package/src/middleware/index.ts +24 -21
- package/src/middleware/logger.ts +28 -28
- package/src/middleware/mysql.ts +62 -62
- package/src/middleware/trace.ts +265 -265
- package/src/middleware/websocketBase.ts +92 -0
- package/src/utils/index.ts +2 -2
- package/src/utils/logger.ts +94 -94
- package/src/utils/misc.ts +20 -20
- package/src/utils/secretsManager.ts +86 -86
- package/tsconfig.json +16 -16
- package/tslint.json +12 -12
package/src/index.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export * from './aws';
|
|
2
|
-
export * from './middleware';
|
|
3
|
-
export * from './utils';
|
|
1
|
+
export * from './aws';
|
|
2
|
+
export * from './middleware';
|
|
3
|
+
export * from './utils';
|
package/src/internal/AwsError.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
export class AwsError extends Error {
|
|
2
|
-
public readonly name: string;
|
|
3
|
-
public readonly service: string;
|
|
4
|
-
|
|
5
|
-
constructor(awsError: unknown) {
|
|
6
|
-
const errorObj = awsError as Record<string, any>;
|
|
7
|
-
const message = errorObj?.message ?? 'Unknown AWS Error';
|
|
8
|
-
super(message);
|
|
9
|
-
|
|
10
|
-
this.name = errorObj?.name ?? 'UnclassifiedError';
|
|
11
|
-
this.service = errorObj?.$service ?? 'UnknownService';
|
|
12
|
-
}
|
|
13
|
-
}
|
|
1
|
+
export class AwsError extends Error {
|
|
2
|
+
public readonly name: string;
|
|
3
|
+
public readonly service: string;
|
|
4
|
+
|
|
5
|
+
constructor(awsError: unknown) {
|
|
6
|
+
const errorObj = awsError as Record<string, any>;
|
|
7
|
+
const message = errorObj?.message ?? 'Unknown AWS Error';
|
|
8
|
+
super(message);
|
|
9
|
+
|
|
10
|
+
this.name = errorObj?.name ?? 'UnclassifiedError';
|
|
11
|
+
this.service = errorObj?.$service ?? 'UnknownService';
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
export class OncePromise<T> {
|
|
2
|
-
private promise?: Promise<T>;
|
|
3
|
-
private factory?: () => Promise<T>;
|
|
4
|
-
|
|
5
|
-
constructor(factory?: () => Promise<T>) {
|
|
6
|
-
this.factory = factory;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
public async run(factory?: () => Promise<T>): Promise<T> {
|
|
10
|
-
if (!this.promise) {
|
|
11
|
-
const f = factory || this.factory;
|
|
12
|
-
if (!f) {
|
|
13
|
-
throw new Error('OncePromise requires a factory');
|
|
14
|
-
}
|
|
15
|
-
this.promise = f();
|
|
16
|
-
try {
|
|
17
|
-
return await this.promise;
|
|
18
|
-
} catch (err) {
|
|
19
|
-
this.promise = undefined;
|
|
20
|
-
throw err;
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
return this.promise;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
public reset(): void {
|
|
27
|
-
this.promise = undefined;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
1
|
+
export class OncePromise<T> {
|
|
2
|
+
private promise?: Promise<T>;
|
|
3
|
+
private factory?: () => Promise<T>;
|
|
4
|
+
|
|
5
|
+
constructor(factory?: () => Promise<T>) {
|
|
6
|
+
this.factory = factory;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
public async run(factory?: () => Promise<T>): Promise<T> {
|
|
10
|
+
if (!this.promise) {
|
|
11
|
+
const f = factory || this.factory;
|
|
12
|
+
if (!f) {
|
|
13
|
+
throw new Error('OncePromise requires a factory');
|
|
14
|
+
}
|
|
15
|
+
this.promise = f();
|
|
16
|
+
try {
|
|
17
|
+
return await this.promise;
|
|
18
|
+
} catch (err) {
|
|
19
|
+
this.promise = undefined;
|
|
20
|
+
throw err;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return this.promise;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
public reset(): void {
|
|
27
|
+
this.promise = undefined;
|
|
28
|
+
}
|
|
29
|
+
}
|
package/src/internal/s3.ts
CHANGED
|
@@ -1,75 +1,75 @@
|
|
|
1
|
-
import {
|
|
2
|
-
DeleteObjectCommandInput,
|
|
3
|
-
GetObjectCommandInput,
|
|
4
|
-
PutObjectCommandInput,
|
|
5
|
-
HeadObjectCommandInput,
|
|
6
|
-
CopyObjectCommandInput,
|
|
7
|
-
UploadPartCommandInput,
|
|
8
|
-
UploadPartCopyCommandInput,
|
|
9
|
-
AbortMultipartUploadCommandInput,
|
|
10
|
-
CompleteMultipartUploadCommandInput,
|
|
11
|
-
CreateMultipartUploadCommandInput,
|
|
12
|
-
ListObjectsV2CommandInput,
|
|
13
|
-
ListPartsCommandInput,
|
|
14
|
-
} from '@aws-sdk/client-s3/dist-types/commands';
|
|
15
|
-
|
|
16
|
-
export type S3Operation =
|
|
17
|
-
| 'putObject'
|
|
18
|
-
| 'getObject'
|
|
19
|
-
| 'deleteObject'
|
|
20
|
-
| 'headObject'
|
|
21
|
-
| 'copyObject'
|
|
22
|
-
| 'uploadPart'
|
|
23
|
-
| 'uploadPartCopy'
|
|
24
|
-
| 'listObjectsV2'
|
|
25
|
-
| 'createMultipartUpload'
|
|
26
|
-
| 'completeMultipartUpload'
|
|
27
|
-
| 'abortMultipartUpload'
|
|
28
|
-
| 'listParts';
|
|
29
|
-
|
|
30
|
-
export type CommandInputMap = {
|
|
31
|
-
putObject: PutObjectCommandInput;
|
|
32
|
-
getObject: GetObjectCommandInput;
|
|
33
|
-
deleteObject: DeleteObjectCommandInput;
|
|
34
|
-
headObject: HeadObjectCommandInput;
|
|
35
|
-
copyObject: CopyObjectCommandInput;
|
|
36
|
-
uploadPart: UploadPartCommandInput;
|
|
37
|
-
uploadPartCopy: UploadPartCopyCommandInput;
|
|
38
|
-
listObjectsV2: ListObjectsV2CommandInput;
|
|
39
|
-
createMultipartUpload: CreateMultipartUploadCommandInput;
|
|
40
|
-
completeMultipartUpload: CompleteMultipartUploadCommandInput;
|
|
41
|
-
abortMultipartUpload: AbortMultipartUploadCommandInput;
|
|
42
|
-
listParts: ListPartsCommandInput;
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
type OpsWithRequiredParams =
|
|
46
|
-
| 'copyObject'
|
|
47
|
-
| 'uploadPart'
|
|
48
|
-
| 'uploadPartCopy'
|
|
49
|
-
| 'createMultipartUpload'
|
|
50
|
-
| 'completeMultipartUpload'
|
|
51
|
-
| 'abortMultipartUpload'
|
|
52
|
-
| 'listParts';
|
|
53
|
-
type OpsWithOptionalParams = Exclude<S3Operation, OpsWithRequiredParams>;
|
|
54
|
-
|
|
55
|
-
export type PresignerOptions =
|
|
56
|
-
| {
|
|
57
|
-
[K in OpsWithOptionalParams]: {
|
|
58
|
-
operation: K;
|
|
59
|
-
bucket: string;
|
|
60
|
-
key: string;
|
|
61
|
-
params?: Omit<CommandInputMap[K], 'Bucket' | 'Key'>;
|
|
62
|
-
expiresIn?: number;
|
|
63
|
-
unhoistableHeaders?: Set<string>;
|
|
64
|
-
};
|
|
65
|
-
}[OpsWithOptionalParams]
|
|
66
|
-
| {
|
|
67
|
-
[K in OpsWithRequiredParams]: {
|
|
68
|
-
operation: K;
|
|
69
|
-
bucket: string;
|
|
70
|
-
key: string;
|
|
71
|
-
params: Omit<CommandInputMap[K], 'Bucket' | 'Key'>;
|
|
72
|
-
expiresIn?: number;
|
|
73
|
-
unhoistableHeaders?: Set<string>;
|
|
74
|
-
};
|
|
75
|
-
}[OpsWithRequiredParams];
|
|
1
|
+
import {
|
|
2
|
+
DeleteObjectCommandInput,
|
|
3
|
+
GetObjectCommandInput,
|
|
4
|
+
PutObjectCommandInput,
|
|
5
|
+
HeadObjectCommandInput,
|
|
6
|
+
CopyObjectCommandInput,
|
|
7
|
+
UploadPartCommandInput,
|
|
8
|
+
UploadPartCopyCommandInput,
|
|
9
|
+
AbortMultipartUploadCommandInput,
|
|
10
|
+
CompleteMultipartUploadCommandInput,
|
|
11
|
+
CreateMultipartUploadCommandInput,
|
|
12
|
+
ListObjectsV2CommandInput,
|
|
13
|
+
ListPartsCommandInput,
|
|
14
|
+
} from '@aws-sdk/client-s3/dist-types/commands';
|
|
15
|
+
|
|
16
|
+
export type S3Operation =
|
|
17
|
+
| 'putObject'
|
|
18
|
+
| 'getObject'
|
|
19
|
+
| 'deleteObject'
|
|
20
|
+
| 'headObject'
|
|
21
|
+
| 'copyObject'
|
|
22
|
+
| 'uploadPart'
|
|
23
|
+
| 'uploadPartCopy'
|
|
24
|
+
| 'listObjectsV2'
|
|
25
|
+
| 'createMultipartUpload'
|
|
26
|
+
| 'completeMultipartUpload'
|
|
27
|
+
| 'abortMultipartUpload'
|
|
28
|
+
| 'listParts';
|
|
29
|
+
|
|
30
|
+
export type CommandInputMap = {
|
|
31
|
+
putObject: PutObjectCommandInput;
|
|
32
|
+
getObject: GetObjectCommandInput;
|
|
33
|
+
deleteObject: DeleteObjectCommandInput;
|
|
34
|
+
headObject: HeadObjectCommandInput;
|
|
35
|
+
copyObject: CopyObjectCommandInput;
|
|
36
|
+
uploadPart: UploadPartCommandInput;
|
|
37
|
+
uploadPartCopy: UploadPartCopyCommandInput;
|
|
38
|
+
listObjectsV2: ListObjectsV2CommandInput;
|
|
39
|
+
createMultipartUpload: CreateMultipartUploadCommandInput;
|
|
40
|
+
completeMultipartUpload: CompleteMultipartUploadCommandInput;
|
|
41
|
+
abortMultipartUpload: AbortMultipartUploadCommandInput;
|
|
42
|
+
listParts: ListPartsCommandInput;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
type OpsWithRequiredParams =
|
|
46
|
+
| 'copyObject'
|
|
47
|
+
| 'uploadPart'
|
|
48
|
+
| 'uploadPartCopy'
|
|
49
|
+
| 'createMultipartUpload'
|
|
50
|
+
| 'completeMultipartUpload'
|
|
51
|
+
| 'abortMultipartUpload'
|
|
52
|
+
| 'listParts';
|
|
53
|
+
type OpsWithOptionalParams = Exclude<S3Operation, OpsWithRequiredParams>;
|
|
54
|
+
|
|
55
|
+
export type PresignerOptions =
|
|
56
|
+
| {
|
|
57
|
+
[K in OpsWithOptionalParams]: {
|
|
58
|
+
operation: K;
|
|
59
|
+
bucket: string;
|
|
60
|
+
key: string;
|
|
61
|
+
params?: Omit<CommandInputMap[K], 'Bucket' | 'Key'>;
|
|
62
|
+
expiresIn?: number;
|
|
63
|
+
unhoistableHeaders?: Set<string>;
|
|
64
|
+
};
|
|
65
|
+
}[OpsWithOptionalParams]
|
|
66
|
+
| {
|
|
67
|
+
[K in OpsWithRequiredParams]: {
|
|
68
|
+
operation: K;
|
|
69
|
+
bucket: string;
|
|
70
|
+
key: string;
|
|
71
|
+
params: Omit<CommandInputMap[K], 'Bucket' | 'Key'>;
|
|
72
|
+
expiresIn?: number;
|
|
73
|
+
unhoistableHeaders?: Set<string>;
|
|
74
|
+
};
|
|
75
|
+
}[OpsWithRequiredParams];
|
package/src/middleware/aws.ts
CHANGED
|
@@ -1,78 +1,78 @@
|
|
|
1
|
-
import {
|
|
2
|
-
loadAWSConfig,
|
|
3
|
-
SimpleAWS,
|
|
4
|
-
SimpleAWSConfig,
|
|
5
|
-
SimpleAWSConfigLoadParam,
|
|
6
|
-
} from '../aws';
|
|
7
|
-
import { getLogger } from '../utils';
|
|
8
|
-
import { HandlerAuxBase, HandlerPluginBase } from './base';
|
|
9
|
-
|
|
10
|
-
const logger = getLogger(__filename);
|
|
11
|
-
|
|
12
|
-
type InitializerMapper = (
|
|
13
|
-
aws: SimpleAWS,
|
|
14
|
-
env: {},
|
|
15
|
-
) => { [name: string]: () => Promise<boolean> };
|
|
16
|
-
|
|
17
|
-
const initialize = async (aws: SimpleAWS, mapper: InitializerMapper) => {
|
|
18
|
-
const env = process.env;
|
|
19
|
-
const mapping = mapper(aws, env);
|
|
20
|
-
const successes = await Promise.all(
|
|
21
|
-
Object.keys(mapping).map((name) => mapping[name]()),
|
|
22
|
-
);
|
|
23
|
-
return Object.keys(mapping).reduce(
|
|
24
|
-
(result, name, index) => ({ ...result, [name]: successes[index] }),
|
|
25
|
-
{},
|
|
26
|
-
);
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
export interface AWSPluginOptions {
|
|
30
|
-
config?: SimpleAWSConfigLoadParam;
|
|
31
|
-
mapper?: InitializerMapper;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export interface AWSPluginAux extends HandlerAuxBase {
|
|
35
|
-
aws: SimpleAWS;
|
|
36
|
-
awsConfig: SimpleAWSConfig;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export class AWSPlugin extends HandlerPluginBase<AWSPluginAux> {
|
|
40
|
-
private options?: AWSPluginOptions;
|
|
41
|
-
private aws?: SimpleAWS;
|
|
42
|
-
private config: SimpleAWSConfig;
|
|
43
|
-
|
|
44
|
-
constructor(options?: AWSPluginOptions) {
|
|
45
|
-
super();
|
|
46
|
-
this.options = options;
|
|
47
|
-
this.config = new SimpleAWSConfig();
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
public create = async () => {
|
|
51
|
-
// Setup only once.
|
|
52
|
-
if (!this.aws) {
|
|
53
|
-
const { config, mapper } = this.options || {
|
|
54
|
-
config: undefined,
|
|
55
|
-
mapper: undefined,
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
if (config) {
|
|
59
|
-
logger.debug(`Load aws config from ${config}`);
|
|
60
|
-
this.config = await loadAWSConfig(config);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
this.aws = new SimpleAWS(this.config);
|
|
64
|
-
|
|
65
|
-
if (mapper) {
|
|
66
|
-
logger.debug(`Initialize aws components with mapper.`);
|
|
67
|
-
await initialize(this.aws, mapper);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
return {
|
|
71
|
-
aws: this.aws,
|
|
72
|
-
awsConfig: this.config,
|
|
73
|
-
};
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
const build = (options?: AWSPluginOptions) => new AWSPlugin(options);
|
|
78
|
-
export default build;
|
|
1
|
+
import {
|
|
2
|
+
loadAWSConfig,
|
|
3
|
+
SimpleAWS,
|
|
4
|
+
SimpleAWSConfig,
|
|
5
|
+
SimpleAWSConfigLoadParam,
|
|
6
|
+
} from '../aws';
|
|
7
|
+
import { getLogger } from '../utils';
|
|
8
|
+
import { HandlerAuxBase, HandlerPluginBase } from './base';
|
|
9
|
+
|
|
10
|
+
const logger = getLogger(__filename);
|
|
11
|
+
|
|
12
|
+
type InitializerMapper = (
|
|
13
|
+
aws: SimpleAWS,
|
|
14
|
+
env: {},
|
|
15
|
+
) => { [name: string]: () => Promise<boolean> };
|
|
16
|
+
|
|
17
|
+
const initialize = async (aws: SimpleAWS, mapper: InitializerMapper) => {
|
|
18
|
+
const env = process.env;
|
|
19
|
+
const mapping = mapper(aws, env);
|
|
20
|
+
const successes = await Promise.all(
|
|
21
|
+
Object.keys(mapping).map((name) => mapping[name]()),
|
|
22
|
+
);
|
|
23
|
+
return Object.keys(mapping).reduce(
|
|
24
|
+
(result, name, index) => ({ ...result, [name]: successes[index] }),
|
|
25
|
+
{},
|
|
26
|
+
);
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export interface AWSPluginOptions {
|
|
30
|
+
config?: SimpleAWSConfigLoadParam;
|
|
31
|
+
mapper?: InitializerMapper;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface AWSPluginAux extends HandlerAuxBase {
|
|
35
|
+
aws: SimpleAWS;
|
|
36
|
+
awsConfig: SimpleAWSConfig;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export class AWSPlugin extends HandlerPluginBase<AWSPluginAux> {
|
|
40
|
+
private options?: AWSPluginOptions;
|
|
41
|
+
private aws?: SimpleAWS;
|
|
42
|
+
private config: SimpleAWSConfig;
|
|
43
|
+
|
|
44
|
+
constructor(options?: AWSPluginOptions) {
|
|
45
|
+
super();
|
|
46
|
+
this.options = options;
|
|
47
|
+
this.config = new SimpleAWSConfig();
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
public create = async () => {
|
|
51
|
+
// Setup only once.
|
|
52
|
+
if (!this.aws) {
|
|
53
|
+
const { config, mapper } = this.options || {
|
|
54
|
+
config: undefined,
|
|
55
|
+
mapper: undefined,
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
if (config) {
|
|
59
|
+
logger.debug(`Load aws config from ${config}`);
|
|
60
|
+
this.config = await loadAWSConfig(config);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
this.aws = new SimpleAWS(this.config);
|
|
64
|
+
|
|
65
|
+
if (mapper) {
|
|
66
|
+
logger.debug(`Initialize aws components with mapper.`);
|
|
67
|
+
await initialize(this.aws, mapper);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
aws: this.aws,
|
|
72
|
+
awsConfig: this.config,
|
|
73
|
+
};
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const build = (options?: AWSPluginOptions) => new AWSPlugin(options);
|
|
78
|
+
export default build;
|