serverless-simple-middleware 0.0.62 → 0.0.63
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/.idea/workspace.xml +99 -0
- package/.prettierignore +2 -2
- package/README.md +3 -3
- package/dist/middleware/base.d.ts +1 -1
- package/dist/middleware/base.js +14 -4
- package/jest.config.js +7 -7
- package/package.json +69 -69
- 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 +686 -686
- package/src/index.ts +3 -3
- package/src/internal/AwsError.ts +13 -13
- package/src/internal/s3.ts +75 -75
- package/src/middleware/aws.ts +78 -78
- package/src/middleware/base.ts +185 -172
- package/src/middleware/build.ts +173 -173
- package/src/middleware/index.ts +20 -20
- package/src/middleware/logger.ts +28 -28
- package/src/middleware/mysql.ts +214 -214
- package/src/middleware/trace.ts +265 -265
- package/src/utils/index.ts +2 -2
- package/src/utils/logger.ts +94 -94
- package/src/utils/misc.ts +20 -20
- package/tsconfig.json +15 -15
- package/tslint.json +12 -12
package/src/middleware/build.ts
CHANGED
|
@@ -1,173 +1,173 @@
|
|
|
1
|
-
import { getLogger } from '../utils/logger';
|
|
2
|
-
|
|
3
|
-
import { stringifyError } from '../utils';
|
|
4
|
-
import {
|
|
5
|
-
Handler,
|
|
6
|
-
HandlerAuxBase,
|
|
7
|
-
HandlerPluginBase,
|
|
8
|
-
HandlerRequest,
|
|
9
|
-
HandlerResponse,
|
|
10
|
-
} from './base';
|
|
11
|
-
|
|
12
|
-
const logger = getLogger(__filename);
|
|
13
|
-
|
|
14
|
-
type Delegator = (okResponsible: boolean) => Promise<any>;
|
|
15
|
-
|
|
16
|
-
class HandlerMiddleware<A extends HandlerAuxBase> {
|
|
17
|
-
public auxPromise: Promise<A>;
|
|
18
|
-
public plugins: Array<HandlerPluginBase<any>>;
|
|
19
|
-
|
|
20
|
-
constructor(plugins: Array<HandlerPluginBase<any>>) {
|
|
21
|
-
this.plugins = plugins;
|
|
22
|
-
this.auxPromise = this.createAuxPromise();
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
private createAuxPromise = (): Promise<A> => {
|
|
26
|
-
return !this.plugins || this.plugins.length === 0
|
|
27
|
-
? Promise.resolve({} as A) // tslint:disable-line
|
|
28
|
-
: Promise.all(
|
|
29
|
-
this.plugins.map((plugin) => {
|
|
30
|
-
const maybePromise = plugin.create();
|
|
31
|
-
return maybePromise instanceof Promise
|
|
32
|
-
? maybePromise
|
|
33
|
-
: Promise.resolve(maybePromise);
|
|
34
|
-
}),
|
|
35
|
-
).then(
|
|
36
|
-
(auxes) =>
|
|
37
|
-
auxes.reduce((all, each) => ({ ...all, ...each }), {}) as A,
|
|
38
|
-
);
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
class HandlerProxy<A extends HandlerAuxBase> {
|
|
43
|
-
private request: HandlerRequest;
|
|
44
|
-
private response: HandlerResponse;
|
|
45
|
-
private aux: A;
|
|
46
|
-
|
|
47
|
-
public constructor(event: any, context: any, callback: any) {
|
|
48
|
-
logger.stupid(`event`, event);
|
|
49
|
-
this.request = new HandlerRequest(event, context);
|
|
50
|
-
this.response = new HandlerResponse(callback);
|
|
51
|
-
this.aux = {} as A; // tslint:disable-line
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
public call = async (
|
|
55
|
-
middleware: HandlerMiddleware<A>,
|
|
56
|
-
handler: Handler<A>,
|
|
57
|
-
) => {
|
|
58
|
-
try {
|
|
59
|
-
this.aux = await middleware.auxPromise;
|
|
60
|
-
} catch (error) {
|
|
61
|
-
logger.error(
|
|
62
|
-
`Error while initializing plugins' aux: ${stringifyError(error)}`,
|
|
63
|
-
);
|
|
64
|
-
this.response.fail(
|
|
65
|
-
error instanceof Error ? { error: error.message } : error,
|
|
66
|
-
);
|
|
67
|
-
return [error];
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
const actualHandler = [this.generateDelegator(handler)];
|
|
71
|
-
const beginHandlers = middleware.plugins.map((plugin) =>
|
|
72
|
-
this.generateDelegator(plugin.begin),
|
|
73
|
-
);
|
|
74
|
-
const endHandlers = middleware.plugins.map((plugin) =>
|
|
75
|
-
this.generateDelegator(plugin.end),
|
|
76
|
-
);
|
|
77
|
-
const errorHandlers = middleware.plugins.map((plugin) =>
|
|
78
|
-
this.generateDelegator(plugin.error),
|
|
79
|
-
);
|
|
80
|
-
|
|
81
|
-
const iterate = async (
|
|
82
|
-
handlers: Delegator[],
|
|
83
|
-
okResponsible: boolean = false,
|
|
84
|
-
) =>
|
|
85
|
-
Promise.all(
|
|
86
|
-
handlers.map((each) =>
|
|
87
|
-
this.safeCall(each, okResponsible, errorHandlers),
|
|
88
|
-
),
|
|
89
|
-
);
|
|
90
|
-
|
|
91
|
-
const results = [
|
|
92
|
-
...(await iterate(beginHandlers)),
|
|
93
|
-
...(await iterate(actualHandler, true)),
|
|
94
|
-
...(await iterate(endHandlers)),
|
|
95
|
-
].filter((x) => x);
|
|
96
|
-
// In test phase, throws any exception if there was.
|
|
97
|
-
if (process.env.NODE_ENV === 'test') {
|
|
98
|
-
for (const each of results) {
|
|
99
|
-
if (each instanceof Error) {
|
|
100
|
-
logger.error(`Error occurred: ${stringifyError(each)}`);
|
|
101
|
-
throw each;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
results.forEach((result) =>
|
|
106
|
-
logger.silly(`middleware result : ${JSON.stringify(result)}`),
|
|
107
|
-
);
|
|
108
|
-
};
|
|
109
|
-
|
|
110
|
-
private safeCall = async (
|
|
111
|
-
delegator: Delegator,
|
|
112
|
-
okResponsible: boolean,
|
|
113
|
-
errorHandlers: Delegator[],
|
|
114
|
-
) => {
|
|
115
|
-
try {
|
|
116
|
-
const result = await delegator(okResponsible);
|
|
117
|
-
return result;
|
|
118
|
-
} catch (error) {
|
|
119
|
-
const handled = await this.handleError(error, errorHandlers);
|
|
120
|
-
return handled;
|
|
121
|
-
}
|
|
122
|
-
};
|
|
123
|
-
|
|
124
|
-
private generateDelegator =
|
|
125
|
-
(handler: Handler<A>): Delegator =>
|
|
126
|
-
async (okResponsible: boolean) => {
|
|
127
|
-
const maybePromise = handler({
|
|
128
|
-
request: this.request,
|
|
129
|
-
response: this.response,
|
|
130
|
-
aux: this.aux,
|
|
131
|
-
});
|
|
132
|
-
const result =
|
|
133
|
-
maybePromise instanceof Promise ? await maybePromise : maybePromise;
|
|
134
|
-
logger.stupid(`result`, result);
|
|
135
|
-
if (!this.response.completed && okResponsible) {
|
|
136
|
-
this.response.ok(result);
|
|
137
|
-
}
|
|
138
|
-
return result;
|
|
139
|
-
};
|
|
140
|
-
|
|
141
|
-
private handleError = async (error: Error, errorHandlers?: Delegator[]) => {
|
|
142
|
-
logger.error(error);
|
|
143
|
-
this.request.lastError = error;
|
|
144
|
-
|
|
145
|
-
if (errorHandlers) {
|
|
146
|
-
for (const handler of errorHandlers) {
|
|
147
|
-
try {
|
|
148
|
-
await handler(false);
|
|
149
|
-
} catch (ignorable) {
|
|
150
|
-
logger.error(ignorable);
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
if (!this.response.completed) {
|
|
155
|
-
this.response.fail(
|
|
156
|
-
error instanceof Error ? { error: error.message } : error,
|
|
157
|
-
);
|
|
158
|
-
}
|
|
159
|
-
return error;
|
|
160
|
-
};
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
// It will break type safety because there is no relation between Aux and Plugin.
|
|
164
|
-
const build = <Aux extends HandlerAuxBase>(
|
|
165
|
-
plugins: Array<HandlerPluginBase<any>>,
|
|
166
|
-
) => {
|
|
167
|
-
const middleware = new HandlerMiddleware<Aux>(plugins);
|
|
168
|
-
return (handler: Handler<Aux>) =>
|
|
169
|
-
(event: any, context: any, callback: any) => {
|
|
170
|
-
new HandlerProxy<Aux>(event, context, callback).call(middleware, handler);
|
|
171
|
-
};
|
|
172
|
-
};
|
|
173
|
-
export default build;
|
|
1
|
+
import { getLogger } from '../utils/logger';
|
|
2
|
+
|
|
3
|
+
import { stringifyError } from '../utils';
|
|
4
|
+
import {
|
|
5
|
+
Handler,
|
|
6
|
+
HandlerAuxBase,
|
|
7
|
+
HandlerPluginBase,
|
|
8
|
+
HandlerRequest,
|
|
9
|
+
HandlerResponse,
|
|
10
|
+
} from './base';
|
|
11
|
+
|
|
12
|
+
const logger = getLogger(__filename);
|
|
13
|
+
|
|
14
|
+
type Delegator = (okResponsible: boolean) => Promise<any>;
|
|
15
|
+
|
|
16
|
+
class HandlerMiddleware<A extends HandlerAuxBase> {
|
|
17
|
+
public auxPromise: Promise<A>;
|
|
18
|
+
public plugins: Array<HandlerPluginBase<any>>;
|
|
19
|
+
|
|
20
|
+
constructor(plugins: Array<HandlerPluginBase<any>>) {
|
|
21
|
+
this.plugins = plugins;
|
|
22
|
+
this.auxPromise = this.createAuxPromise();
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
private createAuxPromise = (): Promise<A> => {
|
|
26
|
+
return !this.plugins || this.plugins.length === 0
|
|
27
|
+
? Promise.resolve({} as A) // tslint:disable-line
|
|
28
|
+
: Promise.all(
|
|
29
|
+
this.plugins.map((plugin) => {
|
|
30
|
+
const maybePromise = plugin.create();
|
|
31
|
+
return maybePromise instanceof Promise
|
|
32
|
+
? maybePromise
|
|
33
|
+
: Promise.resolve(maybePromise);
|
|
34
|
+
}),
|
|
35
|
+
).then(
|
|
36
|
+
(auxes) =>
|
|
37
|
+
auxes.reduce((all, each) => ({ ...all, ...each }), {}) as A,
|
|
38
|
+
);
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
class HandlerProxy<A extends HandlerAuxBase> {
|
|
43
|
+
private request: HandlerRequest;
|
|
44
|
+
private response: HandlerResponse;
|
|
45
|
+
private aux: A;
|
|
46
|
+
|
|
47
|
+
public constructor(event: any, context: any, callback: any) {
|
|
48
|
+
logger.stupid(`event`, event);
|
|
49
|
+
this.request = new HandlerRequest(event, context);
|
|
50
|
+
this.response = new HandlerResponse(callback);
|
|
51
|
+
this.aux = {} as A; // tslint:disable-line
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
public call = async (
|
|
55
|
+
middleware: HandlerMiddleware<A>,
|
|
56
|
+
handler: Handler<A>,
|
|
57
|
+
) => {
|
|
58
|
+
try {
|
|
59
|
+
this.aux = await middleware.auxPromise;
|
|
60
|
+
} catch (error) {
|
|
61
|
+
logger.error(
|
|
62
|
+
`Error while initializing plugins' aux: ${stringifyError(error)}`,
|
|
63
|
+
);
|
|
64
|
+
this.response.fail(
|
|
65
|
+
error instanceof Error ? { error: error.message } : error,
|
|
66
|
+
);
|
|
67
|
+
return [error];
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const actualHandler = [this.generateDelegator(handler)];
|
|
71
|
+
const beginHandlers = middleware.plugins.map((plugin) =>
|
|
72
|
+
this.generateDelegator(plugin.begin),
|
|
73
|
+
);
|
|
74
|
+
const endHandlers = middleware.plugins.map((plugin) =>
|
|
75
|
+
this.generateDelegator(plugin.end),
|
|
76
|
+
);
|
|
77
|
+
const errorHandlers = middleware.plugins.map((plugin) =>
|
|
78
|
+
this.generateDelegator(plugin.error),
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
const iterate = async (
|
|
82
|
+
handlers: Delegator[],
|
|
83
|
+
okResponsible: boolean = false,
|
|
84
|
+
) =>
|
|
85
|
+
Promise.all(
|
|
86
|
+
handlers.map((each) =>
|
|
87
|
+
this.safeCall(each, okResponsible, errorHandlers),
|
|
88
|
+
),
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
const results = [
|
|
92
|
+
...(await iterate(beginHandlers)),
|
|
93
|
+
...(await iterate(actualHandler, true)),
|
|
94
|
+
...(await iterate(endHandlers)),
|
|
95
|
+
].filter((x) => x);
|
|
96
|
+
// In test phase, throws any exception if there was.
|
|
97
|
+
if (process.env.NODE_ENV === 'test') {
|
|
98
|
+
for (const each of results) {
|
|
99
|
+
if (each instanceof Error) {
|
|
100
|
+
logger.error(`Error occurred: ${stringifyError(each)}`);
|
|
101
|
+
throw each;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
results.forEach((result) =>
|
|
106
|
+
logger.silly(`middleware result : ${JSON.stringify(result)}`),
|
|
107
|
+
);
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
private safeCall = async (
|
|
111
|
+
delegator: Delegator,
|
|
112
|
+
okResponsible: boolean,
|
|
113
|
+
errorHandlers: Delegator[],
|
|
114
|
+
) => {
|
|
115
|
+
try {
|
|
116
|
+
const result = await delegator(okResponsible);
|
|
117
|
+
return result;
|
|
118
|
+
} catch (error) {
|
|
119
|
+
const handled = await this.handleError(error, errorHandlers);
|
|
120
|
+
return handled;
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
private generateDelegator =
|
|
125
|
+
(handler: Handler<A>): Delegator =>
|
|
126
|
+
async (okResponsible: boolean) => {
|
|
127
|
+
const maybePromise = handler({
|
|
128
|
+
request: this.request,
|
|
129
|
+
response: this.response,
|
|
130
|
+
aux: this.aux,
|
|
131
|
+
});
|
|
132
|
+
const result =
|
|
133
|
+
maybePromise instanceof Promise ? await maybePromise : maybePromise;
|
|
134
|
+
logger.stupid(`result`, result);
|
|
135
|
+
if (!this.response.completed && okResponsible) {
|
|
136
|
+
this.response.ok(result);
|
|
137
|
+
}
|
|
138
|
+
return result;
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
private handleError = async (error: Error, errorHandlers?: Delegator[]) => {
|
|
142
|
+
logger.error(error);
|
|
143
|
+
this.request.lastError = error;
|
|
144
|
+
|
|
145
|
+
if (errorHandlers) {
|
|
146
|
+
for (const handler of errorHandlers) {
|
|
147
|
+
try {
|
|
148
|
+
await handler(false);
|
|
149
|
+
} catch (ignorable) {
|
|
150
|
+
logger.error(ignorable);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
if (!this.response.completed) {
|
|
155
|
+
this.response.fail(
|
|
156
|
+
error instanceof Error ? { error: error.message } : error,
|
|
157
|
+
);
|
|
158
|
+
}
|
|
159
|
+
return error;
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// It will break type safety because there is no relation between Aux and Plugin.
|
|
164
|
+
const build = <Aux extends HandlerAuxBase>(
|
|
165
|
+
plugins: Array<HandlerPluginBase<any>>,
|
|
166
|
+
) => {
|
|
167
|
+
const middleware = new HandlerMiddleware<Aux>(plugins);
|
|
168
|
+
return (handler: Handler<Aux>) =>
|
|
169
|
+
(event: any, context: any, callback: any) => {
|
|
170
|
+
new HandlerProxy<Aux>(event, context, callback).call(middleware, handler);
|
|
171
|
+
};
|
|
172
|
+
};
|
|
173
|
+
export default build;
|
package/src/middleware/index.ts
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import build from './build';
|
|
2
|
-
|
|
3
|
-
import aws from './aws';
|
|
4
|
-
import logger from './logger';
|
|
5
|
-
import mysql from './mysql';
|
|
6
|
-
import trace from './trace';
|
|
7
|
-
|
|
8
|
-
export const middleware = {
|
|
9
|
-
build,
|
|
10
|
-
aws,
|
|
11
|
-
trace,
|
|
12
|
-
logger,
|
|
13
|
-
mysql,
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
export * from './base';
|
|
17
|
-
export * from './aws';
|
|
18
|
-
export * from './trace';
|
|
19
|
-
export * from './logger';
|
|
20
|
-
export * from './mysql';
|
|
1
|
+
import build from './build';
|
|
2
|
+
|
|
3
|
+
import aws from './aws';
|
|
4
|
+
import logger from './logger';
|
|
5
|
+
import mysql from './mysql';
|
|
6
|
+
import trace from './trace';
|
|
7
|
+
|
|
8
|
+
export const middleware = {
|
|
9
|
+
build,
|
|
10
|
+
aws,
|
|
11
|
+
trace,
|
|
12
|
+
logger,
|
|
13
|
+
mysql,
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export * from './base';
|
|
17
|
+
export * from './aws';
|
|
18
|
+
export * from './trace';
|
|
19
|
+
export * from './logger';
|
|
20
|
+
export * from './mysql';
|
package/src/middleware/logger.ts
CHANGED
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
import { getLogger, Logger, LogLevel } from '../utils';
|
|
2
|
-
import { HandlerAuxBase, HandlerPluginBase } from './base';
|
|
3
|
-
|
|
4
|
-
export interface LoggerPluginOptions {
|
|
5
|
-
name: string;
|
|
6
|
-
level?: LogLevel;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export interface LoggerPluginAux extends HandlerAuxBase {
|
|
10
|
-
logger: Logger;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export class LoggerPlugin extends HandlerPluginBase<LoggerPluginAux> {
|
|
14
|
-
private options: LoggerPluginOptions;
|
|
15
|
-
|
|
16
|
-
constructor(options: LoggerPluginOptions) {
|
|
17
|
-
super();
|
|
18
|
-
this.options = options;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
public create = async () => {
|
|
22
|
-
const { name, level } = this.options;
|
|
23
|
-
return { logger: getLogger(name, level) };
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
const build = (options: LoggerPluginOptions) => new LoggerPlugin(options);
|
|
28
|
-
export default build;
|
|
1
|
+
import { getLogger, Logger, LogLevel } from '../utils';
|
|
2
|
+
import { HandlerAuxBase, HandlerPluginBase } from './base';
|
|
3
|
+
|
|
4
|
+
export interface LoggerPluginOptions {
|
|
5
|
+
name: string;
|
|
6
|
+
level?: LogLevel;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export interface LoggerPluginAux extends HandlerAuxBase {
|
|
10
|
+
logger: Logger;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export class LoggerPlugin extends HandlerPluginBase<LoggerPluginAux> {
|
|
14
|
+
private options: LoggerPluginOptions;
|
|
15
|
+
|
|
16
|
+
constructor(options: LoggerPluginOptions) {
|
|
17
|
+
super();
|
|
18
|
+
this.options = options;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
public create = async () => {
|
|
22
|
+
const { name, level } = this.options;
|
|
23
|
+
return { logger: getLogger(name, level) };
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const build = (options: LoggerPluginOptions) => new LoggerPlugin(options);
|
|
28
|
+
export default build;
|