serverless-simple-middleware 0.0.63 → 0.0.65
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/aws/config.js +11 -12
- package/dist/aws/index.d.ts +1 -1
- package/dist/aws/index.js +1 -1
- package/dist/aws/simple.d.ts +1 -1
- package/dist/aws/simple.js +534 -786
- package/dist/internal/AwsError.js +10 -28
- package/dist/middleware/aws.js +42 -125
- package/dist/middleware/base.d.ts +3 -3
- package/dist/middleware/base.js +84 -104
- package/dist/middleware/build.js +101 -244
- package/dist/middleware/database/connectionProxy.d.ts +19 -0
- package/dist/middleware/database/connectionProxy.js +136 -0
- package/dist/middleware/database/index.d.ts +2 -0
- package/dist/middleware/database/index.js +7 -0
- package/dist/middleware/database/sqlClient.d.ts +8 -0
- package/dist/middleware/database/sqlClient.js +65 -0
- package/dist/middleware/index.d.ts +4 -3
- package/dist/middleware/index.js +8 -7
- package/dist/middleware/logger.js +13 -69
- package/dist/middleware/mysql.d.ts +11 -23
- package/dist/middleware/mysql.js +25 -288
- package/dist/middleware/trace.d.ts +1 -1
- package/dist/middleware/trace.js +144 -216
- package/dist/utils/logger.js +29 -30
- package/dist/utils/misc.js +6 -6
- package/jest.config.js +7 -7
- package/package.json +71 -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 +189 -185
- package/src/middleware/build.ts +173 -173
- package/src/middleware/database/connectionProxy.ts +174 -0
- package/src/middleware/database/index.ts +14 -0
- package/src/middleware/database/sqlClient.ts +95 -0
- package/src/middleware/index.ts +21 -20
- package/src/middleware/logger.ts +28 -28
- package/src/middleware/mysql.ts +52 -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/.idea/workspace.xml +0 -99
package/dist/middleware/build.js
CHANGED
|
@@ -1,257 +1,114 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __assign = (this && this.__assign) || function () {
|
|
3
|
-
__assign = Object.assign || function(t) {
|
|
4
|
-
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
-
s = arguments[i];
|
|
6
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
-
t[p] = s[p];
|
|
8
|
-
}
|
|
9
|
-
return t;
|
|
10
|
-
};
|
|
11
|
-
return __assign.apply(this, arguments);
|
|
12
|
-
};
|
|
13
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
14
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
15
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
16
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
17
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
18
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
19
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
20
|
-
});
|
|
21
|
-
};
|
|
22
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
23
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
24
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
25
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
26
|
-
function step(op) {
|
|
27
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
28
|
-
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
29
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
30
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
31
|
-
switch (op[0]) {
|
|
32
|
-
case 0: case 1: t = op; break;
|
|
33
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
34
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
35
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
36
|
-
default:
|
|
37
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
38
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
39
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
40
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
41
|
-
if (t[2]) _.ops.pop();
|
|
42
|
-
_.trys.pop(); continue;
|
|
43
|
-
}
|
|
44
|
-
op = body.call(thisArg, _);
|
|
45
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
46
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
47
|
-
}
|
|
48
|
-
};
|
|
49
|
-
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
50
|
-
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
51
|
-
if (ar || !(i in from)) {
|
|
52
|
-
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
53
|
-
ar[i] = from[i];
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
return to.concat(ar || Array.prototype.slice.call(from));
|
|
57
|
-
};
|
|
58
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
return !_this.plugins || _this.plugins.length === 0
|
|
68
|
-
? Promise.resolve({}) // tslint:disable-line
|
|
69
|
-
: Promise.all(_this.plugins.map(function (plugin) {
|
|
70
|
-
var maybePromise = plugin.create();
|
|
71
|
-
return maybePromise instanceof Promise
|
|
72
|
-
? maybePromise
|
|
73
|
-
: Promise.resolve(maybePromise);
|
|
74
|
-
})).then(function (auxes) {
|
|
75
|
-
return auxes.reduce(function (all, each) { return (__assign(__assign({}, all), each)); }, {});
|
|
76
|
-
});
|
|
77
|
-
};
|
|
3
|
+
const logger_1 = require("../utils/logger");
|
|
4
|
+
const utils_1 = require("../utils");
|
|
5
|
+
const base_1 = require("./base");
|
|
6
|
+
const logger = (0, logger_1.getLogger)(__filename);
|
|
7
|
+
class HandlerMiddleware {
|
|
8
|
+
auxPromise;
|
|
9
|
+
plugins;
|
|
10
|
+
constructor(plugins) {
|
|
78
11
|
this.plugins = plugins;
|
|
79
12
|
this.auxPromise = this.createAuxPromise();
|
|
80
13
|
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
case 2:
|
|
99
|
-
error_1 = _e.sent();
|
|
100
|
-
logger.error("Error while initializing plugins' aux: ".concat((0, utils_1.stringifyError)(error_1)));
|
|
101
|
-
this.response.fail(error_1 instanceof Error ? { error: error_1.message } : error_1);
|
|
102
|
-
return [2 /*return*/, [error_1]];
|
|
103
|
-
case 3:
|
|
104
|
-
actualHandler = [this.generateDelegator(handler)];
|
|
105
|
-
beginHandlers = middleware.plugins.map(function (plugin) {
|
|
106
|
-
return _this.generateDelegator(plugin.begin);
|
|
107
|
-
});
|
|
108
|
-
endHandlers = middleware.plugins.map(function (plugin) {
|
|
109
|
-
return _this.generateDelegator(plugin.end);
|
|
110
|
-
});
|
|
111
|
-
errorHandlers = middleware.plugins.map(function (plugin) {
|
|
112
|
-
return _this.generateDelegator(plugin.error);
|
|
113
|
-
});
|
|
114
|
-
iterate = function (handlers_1) {
|
|
115
|
-
var args_1 = [];
|
|
116
|
-
for (var _i = 1; _i < arguments.length; _i++) {
|
|
117
|
-
args_1[_i - 1] = arguments[_i];
|
|
118
|
-
}
|
|
119
|
-
return __awaiter(_this, __spreadArray([handlers_1], args_1, true), void 0, function (handlers, okResponsible) {
|
|
120
|
-
var _this = this;
|
|
121
|
-
if (okResponsible === void 0) { okResponsible = false; }
|
|
122
|
-
return __generator(this, function (_a) {
|
|
123
|
-
return [2 /*return*/, Promise.all(handlers.map(function (each) {
|
|
124
|
-
return _this.safeCall(each, okResponsible, errorHandlers);
|
|
125
|
-
}))];
|
|
126
|
-
});
|
|
127
|
-
});
|
|
128
|
-
};
|
|
129
|
-
_b = [[]];
|
|
130
|
-
return [4 /*yield*/, iterate(beginHandlers)];
|
|
131
|
-
case 4:
|
|
132
|
-
_c = [__spreadArray.apply(void 0, _b.concat([(_e.sent()), true]))];
|
|
133
|
-
return [4 /*yield*/, iterate(actualHandler, true)];
|
|
134
|
-
case 5:
|
|
135
|
-
_d = [__spreadArray.apply(void 0, _c.concat([(_e.sent()), true]))];
|
|
136
|
-
return [4 /*yield*/, iterate(endHandlers)];
|
|
137
|
-
case 6:
|
|
138
|
-
results = __spreadArray.apply(void 0, _d.concat([(_e.sent()), true])).filter(function (x) { return x; });
|
|
139
|
-
// In test phase, throws any exception if there was.
|
|
140
|
-
if (process.env.NODE_ENV === 'test') {
|
|
141
|
-
for (_i = 0, results_1 = results; _i < results_1.length; _i++) {
|
|
142
|
-
each = results_1[_i];
|
|
143
|
-
if (each instanceof Error) {
|
|
144
|
-
logger.error("Error occurred: ".concat((0, utils_1.stringifyError)(each)));
|
|
145
|
-
throw each;
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
results.forEach(function (result) {
|
|
150
|
-
return logger.silly("middleware result : ".concat(JSON.stringify(result)));
|
|
151
|
-
});
|
|
152
|
-
return [2 /*return*/];
|
|
153
|
-
}
|
|
154
|
-
});
|
|
155
|
-
}); };
|
|
156
|
-
this.safeCall = function (delegator, okResponsible, errorHandlers) { return __awaiter(_this, void 0, void 0, function () {
|
|
157
|
-
var result, error_2, handled;
|
|
158
|
-
return __generator(this, function (_a) {
|
|
159
|
-
switch (_a.label) {
|
|
160
|
-
case 0:
|
|
161
|
-
_a.trys.push([0, 2, , 4]);
|
|
162
|
-
return [4 /*yield*/, delegator(okResponsible)];
|
|
163
|
-
case 1:
|
|
164
|
-
result = _a.sent();
|
|
165
|
-
return [2 /*return*/, result];
|
|
166
|
-
case 2:
|
|
167
|
-
error_2 = _a.sent();
|
|
168
|
-
return [4 /*yield*/, this.handleError(error_2, errorHandlers)];
|
|
169
|
-
case 3:
|
|
170
|
-
handled = _a.sent();
|
|
171
|
-
return [2 /*return*/, handled];
|
|
172
|
-
case 4: return [2 /*return*/];
|
|
173
|
-
}
|
|
174
|
-
});
|
|
175
|
-
}); };
|
|
176
|
-
this.generateDelegator = function (handler) {
|
|
177
|
-
return function (okResponsible) { return __awaiter(_this, void 0, void 0, function () {
|
|
178
|
-
var maybePromise, result, _a;
|
|
179
|
-
return __generator(this, function (_b) {
|
|
180
|
-
switch (_b.label) {
|
|
181
|
-
case 0:
|
|
182
|
-
maybePromise = handler({
|
|
183
|
-
request: this.request,
|
|
184
|
-
response: this.response,
|
|
185
|
-
aux: this.aux,
|
|
186
|
-
});
|
|
187
|
-
if (!(maybePromise instanceof Promise)) return [3 /*break*/, 2];
|
|
188
|
-
return [4 /*yield*/, maybePromise];
|
|
189
|
-
case 1:
|
|
190
|
-
_a = _b.sent();
|
|
191
|
-
return [3 /*break*/, 3];
|
|
192
|
-
case 2:
|
|
193
|
-
_a = maybePromise;
|
|
194
|
-
_b.label = 3;
|
|
195
|
-
case 3:
|
|
196
|
-
result = _a;
|
|
197
|
-
logger.stupid("result", result);
|
|
198
|
-
if (!this.response.completed && okResponsible) {
|
|
199
|
-
this.response.ok(result);
|
|
200
|
-
}
|
|
201
|
-
return [2 /*return*/, result];
|
|
202
|
-
}
|
|
203
|
-
});
|
|
204
|
-
}); };
|
|
205
|
-
};
|
|
206
|
-
this.handleError = function (error, errorHandlers) { return __awaiter(_this, void 0, void 0, function () {
|
|
207
|
-
var _i, errorHandlers_1, handler, ignorable_1;
|
|
208
|
-
return __generator(this, function (_a) {
|
|
209
|
-
switch (_a.label) {
|
|
210
|
-
case 0:
|
|
211
|
-
logger.error(error);
|
|
212
|
-
this.request.lastError = error;
|
|
213
|
-
if (!errorHandlers) return [3 /*break*/, 6];
|
|
214
|
-
_i = 0, errorHandlers_1 = errorHandlers;
|
|
215
|
-
_a.label = 1;
|
|
216
|
-
case 1:
|
|
217
|
-
if (!(_i < errorHandlers_1.length)) return [3 /*break*/, 6];
|
|
218
|
-
handler = errorHandlers_1[_i];
|
|
219
|
-
_a.label = 2;
|
|
220
|
-
case 2:
|
|
221
|
-
_a.trys.push([2, 4, , 5]);
|
|
222
|
-
return [4 /*yield*/, handler(false)];
|
|
223
|
-
case 3:
|
|
224
|
-
_a.sent();
|
|
225
|
-
return [3 /*break*/, 5];
|
|
226
|
-
case 4:
|
|
227
|
-
ignorable_1 = _a.sent();
|
|
228
|
-
logger.error(ignorable_1);
|
|
229
|
-
return [3 /*break*/, 5];
|
|
230
|
-
case 5:
|
|
231
|
-
_i++;
|
|
232
|
-
return [3 /*break*/, 1];
|
|
233
|
-
case 6:
|
|
234
|
-
if (!this.response.completed) {
|
|
235
|
-
this.response.fail(error instanceof Error ? { error: error.message } : error);
|
|
236
|
-
}
|
|
237
|
-
return [2 /*return*/, error];
|
|
238
|
-
}
|
|
239
|
-
});
|
|
240
|
-
}); };
|
|
241
|
-
logger.stupid("event", event);
|
|
14
|
+
createAuxPromise = () => {
|
|
15
|
+
return !this.plugins || this.plugins.length === 0
|
|
16
|
+
? Promise.resolve({}) // tslint:disable-line
|
|
17
|
+
: Promise.all(this.plugins.map((plugin) => {
|
|
18
|
+
const maybePromise = plugin.create();
|
|
19
|
+
return maybePromise instanceof Promise
|
|
20
|
+
? maybePromise
|
|
21
|
+
: Promise.resolve(maybePromise);
|
|
22
|
+
})).then((auxes) => auxes.reduce((all, each) => ({ ...all, ...each }), {}));
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
class HandlerProxy {
|
|
26
|
+
request;
|
|
27
|
+
response;
|
|
28
|
+
aux;
|
|
29
|
+
constructor(event, context, callback) {
|
|
30
|
+
logger.stupid(`event`, event);
|
|
242
31
|
this.request = new base_1.HandlerRequest(event, context);
|
|
243
32
|
this.response = new base_1.HandlerResponse(callback);
|
|
244
33
|
this.aux = {}; // tslint:disable-line
|
|
245
34
|
}
|
|
246
|
-
|
|
247
|
-
|
|
35
|
+
call = async (middleware, handler) => {
|
|
36
|
+
try {
|
|
37
|
+
this.aux = await middleware.auxPromise;
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
logger.error(`Error while initializing plugins' aux: ${(0, utils_1.stringifyError)(error)}`);
|
|
41
|
+
this.response.fail(error instanceof Error ? { error: error.message } : error);
|
|
42
|
+
return [error];
|
|
43
|
+
}
|
|
44
|
+
const actualHandler = [this.generateDelegator(handler)];
|
|
45
|
+
const beginHandlers = middleware.plugins.map((plugin) => this.generateDelegator(plugin.begin));
|
|
46
|
+
const endHandlers = middleware.plugins.map((plugin) => this.generateDelegator(plugin.end));
|
|
47
|
+
const errorHandlers = middleware.plugins.map((plugin) => this.generateDelegator(plugin.error));
|
|
48
|
+
const iterate = async (handlers, okResponsible = false) => Promise.all(handlers.map((each) => this.safeCall(each, okResponsible, errorHandlers)));
|
|
49
|
+
const results = [
|
|
50
|
+
...(await iterate(beginHandlers)),
|
|
51
|
+
...(await iterate(actualHandler, true)),
|
|
52
|
+
...(await iterate(endHandlers)),
|
|
53
|
+
].filter((x) => x);
|
|
54
|
+
// In test phase, throws any exception if there was.
|
|
55
|
+
if (process.env.NODE_ENV === 'test') {
|
|
56
|
+
for (const each of results) {
|
|
57
|
+
if (each instanceof Error) {
|
|
58
|
+
logger.error(`Error occurred: ${(0, utils_1.stringifyError)(each)}`);
|
|
59
|
+
throw each;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
results.forEach((result) => logger.silly(`middleware result : ${JSON.stringify(result)}`));
|
|
64
|
+
};
|
|
65
|
+
safeCall = async (delegator, okResponsible, errorHandlers) => {
|
|
66
|
+
try {
|
|
67
|
+
const result = await delegator(okResponsible);
|
|
68
|
+
return result;
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
const handled = await this.handleError(error, errorHandlers);
|
|
72
|
+
return handled;
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
generateDelegator = (handler) => async (okResponsible) => {
|
|
76
|
+
const maybePromise = handler({
|
|
77
|
+
request: this.request,
|
|
78
|
+
response: this.response,
|
|
79
|
+
aux: this.aux,
|
|
80
|
+
});
|
|
81
|
+
const result = maybePromise instanceof Promise ? await maybePromise : maybePromise;
|
|
82
|
+
logger.stupid(`result`, result);
|
|
83
|
+
if (!this.response.completed && okResponsible) {
|
|
84
|
+
this.response.ok(result);
|
|
85
|
+
}
|
|
86
|
+
return result;
|
|
87
|
+
};
|
|
88
|
+
handleError = async (error, errorHandlers) => {
|
|
89
|
+
logger.error(error);
|
|
90
|
+
this.request.lastError = error;
|
|
91
|
+
if (errorHandlers) {
|
|
92
|
+
for (const handler of errorHandlers) {
|
|
93
|
+
try {
|
|
94
|
+
await handler(false);
|
|
95
|
+
}
|
|
96
|
+
catch (ignorable) {
|
|
97
|
+
logger.error(ignorable);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (!this.response.completed) {
|
|
102
|
+
this.response.fail(error instanceof Error ? { error: error.message } : error);
|
|
103
|
+
}
|
|
104
|
+
return error;
|
|
105
|
+
};
|
|
106
|
+
}
|
|
248
107
|
// It will break type safety because there is no relation between Aux and Plugin.
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
return
|
|
252
|
-
|
|
253
|
-
new HandlerProxy(event, context, callback).call(middleware, handler);
|
|
254
|
-
};
|
|
108
|
+
const build = (plugins) => {
|
|
109
|
+
const middleware = new HandlerMiddleware(plugins);
|
|
110
|
+
return (handler) => (event, context, callback) => {
|
|
111
|
+
new HandlerProxy(event, context, callback).call(middleware, handler);
|
|
255
112
|
};
|
|
256
113
|
};
|
|
257
114
|
exports.default = build;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { MySQLPluginOptions } from '../mysql';
|
|
2
|
+
export declare class ConnectionProxy {
|
|
3
|
+
private pluginConfig;
|
|
4
|
+
private connection?;
|
|
5
|
+
private initialized;
|
|
6
|
+
private dbName?;
|
|
7
|
+
constructor(config: MySQLPluginOptions);
|
|
8
|
+
query: <T>(sql: string, params?: any[]) => Promise<T | undefined>;
|
|
9
|
+
fetch: <T>(sql: string, params?: any[]) => Promise<T[]>;
|
|
10
|
+
fetchOne: <T>(sql: string, params?: any[], defaultValue?: T) => Promise<T>;
|
|
11
|
+
beginTransaction: () => Promise<void>;
|
|
12
|
+
commit: () => Promise<void>;
|
|
13
|
+
rollback: () => Promise<void>;
|
|
14
|
+
clearConnection: () => void;
|
|
15
|
+
onPluginCreated: () => Promise<void>;
|
|
16
|
+
private prepareConnection;
|
|
17
|
+
private changeDatabase;
|
|
18
|
+
private tryToInitializeSchema;
|
|
19
|
+
}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ConnectionProxy = void 0;
|
|
4
|
+
const mysql_1 = require("mysql");
|
|
5
|
+
const utils_1 = require("../../utils");
|
|
6
|
+
const logger = (0, utils_1.getLogger)(__filename);
|
|
7
|
+
class ConnectionProxy {
|
|
8
|
+
pluginConfig;
|
|
9
|
+
connection;
|
|
10
|
+
initialized;
|
|
11
|
+
dbName;
|
|
12
|
+
constructor(config) {
|
|
13
|
+
this.pluginConfig = config;
|
|
14
|
+
if (config.schema && config.schema.database) {
|
|
15
|
+
this.dbName = config.config.database;
|
|
16
|
+
config.config.database = undefined;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
query = (sql, params) => new Promise(async (resolve, reject) => {
|
|
20
|
+
const connection = this.prepareConnection();
|
|
21
|
+
await this.tryToInitializeSchema(false);
|
|
22
|
+
if (process.env.NODE_ENV !== 'test') {
|
|
23
|
+
logger.silly(`Execute query[${sql}] with params[${params}]`);
|
|
24
|
+
}
|
|
25
|
+
connection.query(sql, params, (err, result) => {
|
|
26
|
+
if (err) {
|
|
27
|
+
logger.error(`error occurred in database query=${sql}, error=${err}`);
|
|
28
|
+
reject(err);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
resolve(result);
|
|
32
|
+
if (process.env.NODE_ENV !== 'test') {
|
|
33
|
+
logger.silly(`DB result is ${JSON.stringify(result)}`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
fetch = (sql, params) => this.query(sql, params).then((res) => res || []);
|
|
39
|
+
fetchOne = (sql, params, defaultValue) => this.fetch(sql, params).then((res) => {
|
|
40
|
+
if (res === undefined || res[0] === undefined) {
|
|
41
|
+
// Makes it as non-null result.
|
|
42
|
+
return defaultValue || {};
|
|
43
|
+
}
|
|
44
|
+
return res[0];
|
|
45
|
+
});
|
|
46
|
+
beginTransaction = () => new Promise(async (resolve, reject) => {
|
|
47
|
+
const connection = this.prepareConnection();
|
|
48
|
+
await this.tryToInitializeSchema(false);
|
|
49
|
+
connection.beginTransaction((err) => {
|
|
50
|
+
if (err) {
|
|
51
|
+
reject(err);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
resolve();
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
commit = () => new Promise(async (resolve, reject) => {
|
|
58
|
+
const connection = this.prepareConnection();
|
|
59
|
+
await this.tryToInitializeSchema(false);
|
|
60
|
+
connection.commit((err) => {
|
|
61
|
+
if (err) {
|
|
62
|
+
reject(err);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
resolve();
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
rollback = () => new Promise(async (resolve, reject) => {
|
|
69
|
+
const connection = this.prepareConnection();
|
|
70
|
+
await this.tryToInitializeSchema(false);
|
|
71
|
+
connection.rollback((err) => {
|
|
72
|
+
if (err) {
|
|
73
|
+
reject(err);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
resolve();
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
clearConnection = () => {
|
|
80
|
+
if (this.connection) {
|
|
81
|
+
this.connection.end();
|
|
82
|
+
this.connection = undefined;
|
|
83
|
+
logger.verbose('Connection is end');
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
onPluginCreated = async () => this.tryToInitializeSchema(true);
|
|
87
|
+
prepareConnection = () => {
|
|
88
|
+
if (this.connection) {
|
|
89
|
+
return this.connection;
|
|
90
|
+
}
|
|
91
|
+
this.connection = (0, mysql_1.createConnection)(this.pluginConfig.config);
|
|
92
|
+
this.connection.connect();
|
|
93
|
+
return this.connection;
|
|
94
|
+
};
|
|
95
|
+
changeDatabase = (dbName) => new Promise((resolve, reject) => this.prepareConnection().changeUser({
|
|
96
|
+
database: dbName,
|
|
97
|
+
}, (err) => (err ? reject(err) : resolve(undefined))));
|
|
98
|
+
tryToInitializeSchema = async (initial) => {
|
|
99
|
+
const { eager = false, ignoreError = false, database = '', tables = {}, } = this.pluginConfig.schema || {};
|
|
100
|
+
if (initial && !eager) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
// This method can be called twice when eager option is on,
|
|
104
|
+
// so this flag should be set and checked at first.
|
|
105
|
+
if (this.initialized) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
this.initialized = true;
|
|
109
|
+
try {
|
|
110
|
+
if (database) {
|
|
111
|
+
logger.debug(`Prepare a database[${this.dbName}]`);
|
|
112
|
+
logger.stupid(this.dbName, database);
|
|
113
|
+
const result = await this.query(database);
|
|
114
|
+
logger.debug(`Database[${this.dbName}] is initialized: ${JSON.stringify(result)}`);
|
|
115
|
+
}
|
|
116
|
+
if (this.dbName) {
|
|
117
|
+
await this.changeDatabase(this.dbName);
|
|
118
|
+
logger.verbose(`Database[${this.dbName}] is connected.`);
|
|
119
|
+
}
|
|
120
|
+
for (const [name, query] of Object.entries(tables)) {
|
|
121
|
+
logger.debug(`Prepare a table[${name}]`);
|
|
122
|
+
logger.stupid(name, query);
|
|
123
|
+
const result = await this.query(query);
|
|
124
|
+
logger.debug(`Table[${name}] is initialized: ${JSON.stringify(result)}`);
|
|
125
|
+
}
|
|
126
|
+
logger.verbose(`Database schema is initialized.`);
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
logger.warn(error);
|
|
130
|
+
if (!ignoreError) {
|
|
131
|
+
throw error;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
exports.ConnectionProxy = ConnectionProxy;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { ConnectionProxy } from './connectionProxy';
|
|
2
|
+
export { sql, type DeleteQueryBuilder, type Expression, type ExpressionBuilder, type InsertQueryBuilder, type NotNull, type RawBuilder, type SelectQueryBuilder, type SqlBool, type SQLClient, type UpdateQueryBuilder, } from './sqlClient';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.sql = exports.ConnectionProxy = void 0;
|
|
4
|
+
var connectionProxy_1 = require("./connectionProxy");
|
|
5
|
+
Object.defineProperty(exports, "ConnectionProxy", { enumerable: true, get: function () { return connectionProxy_1.ConnectionProxy; } });
|
|
6
|
+
var sqlClient_1 = require("./sqlClient");
|
|
7
|
+
Object.defineProperty(exports, "sql", { enumerable: true, get: function () { return sqlClient_1.sql; } });
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Kysely } from 'kysely';
|
|
2
|
+
import { type ConnectionOptions } from 'mysql2';
|
|
3
|
+
export declare class SQLClient<T = unknown> extends Kysely<T> {
|
|
4
|
+
private pool;
|
|
5
|
+
constructor(config: ConnectionOptions);
|
|
6
|
+
clearConnection: () => Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
export { expressionBuilder, sql, type DeleteQueryBuilder, type Expression, type ExpressionBuilder, type InsertQueryBuilder, type NotNull, type RawBuilder, type SelectQueryBuilder, type SqlBool, type UpdateQueryBuilder, } from 'kysely';
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.sql = exports.expressionBuilder = exports.SQLClient = void 0;
|
|
4
|
+
const kysely_1 = require("kysely");
|
|
5
|
+
const mysql2_1 = require("mysql2");
|
|
6
|
+
class LazyConnectionPool {
|
|
7
|
+
config;
|
|
8
|
+
connection = null;
|
|
9
|
+
constructor(config) {
|
|
10
|
+
this.config = config;
|
|
11
|
+
}
|
|
12
|
+
getConnection = (callback) => {
|
|
13
|
+
if (this.connection) {
|
|
14
|
+
callback(null, this.connection);
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const conn = (0, mysql2_1.createConnection)(this.config);
|
|
18
|
+
conn.connect((err) => {
|
|
19
|
+
if (err) {
|
|
20
|
+
callback(err, {});
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
this.connection = this._addRelease(conn);
|
|
24
|
+
callback(null, this.connection);
|
|
25
|
+
});
|
|
26
|
+
};
|
|
27
|
+
end = (callback) => {
|
|
28
|
+
if (this.connection) {
|
|
29
|
+
this.connection.end((err) => {
|
|
30
|
+
this.connection = null;
|
|
31
|
+
callback(err);
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
callback(null);
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
_addRelease = (connection) => Object.assign(connection, {
|
|
39
|
+
release: () => { },
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
class SQLClient extends kysely_1.Kysely {
|
|
43
|
+
pool;
|
|
44
|
+
constructor(config) {
|
|
45
|
+
const pool = new LazyConnectionPool(config);
|
|
46
|
+
super({
|
|
47
|
+
dialect: new kysely_1.MysqlDialect({
|
|
48
|
+
pool,
|
|
49
|
+
}),
|
|
50
|
+
plugins: [
|
|
51
|
+
new kysely_1.HandleEmptyInListsPlugin({
|
|
52
|
+
strategy: kysely_1.replaceWithNoncontingentExpression,
|
|
53
|
+
}),
|
|
54
|
+
],
|
|
55
|
+
});
|
|
56
|
+
this.pool = pool;
|
|
57
|
+
}
|
|
58
|
+
clearConnection = () => new Promise((resolve) => {
|
|
59
|
+
this.pool.end(() => resolve());
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
exports.SQLClient = SQLClient;
|
|
63
|
+
var kysely_2 = require("kysely");
|
|
64
|
+
Object.defineProperty(exports, "expressionBuilder", { enumerable: true, get: function () { return kysely_2.expressionBuilder; } });
|
|
65
|
+
Object.defineProperty(exports, "sql", { enumerable: true, get: function () { return kysely_2.sql; } });
|
|
@@ -3,10 +3,11 @@ export declare const middleware: {
|
|
|
3
3
|
aws: (options?: import("./aws").AWSPluginOptions) => import("./aws").AWSPlugin;
|
|
4
4
|
trace: (options: import("./trace").TracerPluginOptions) => import("./trace").TracerPlugin;
|
|
5
5
|
logger: (options: import("./logger").LoggerPluginOptions) => import("./logger").LoggerPlugin;
|
|
6
|
-
mysql: (options: import("./mysql").MySQLPluginOptions) => import("./mysql").MySQLPlugin
|
|
6
|
+
mysql: (options: import("./mysql").MySQLPluginOptions) => import("./mysql").MySQLPlugin<unknown>;
|
|
7
7
|
};
|
|
8
|
-
export * from './base';
|
|
9
8
|
export * from './aws';
|
|
10
|
-
export * from './
|
|
9
|
+
export * from './base';
|
|
10
|
+
export * from './database/index';
|
|
11
11
|
export * from './logger';
|
|
12
12
|
export * from './mysql';
|
|
13
|
+
export * from './trace';
|
package/dist/middleware/index.js
CHANGED
|
@@ -15,11 +15,11 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
exports.middleware = void 0;
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
18
|
+
const build_1 = require("./build");
|
|
19
|
+
const aws_1 = require("./aws");
|
|
20
|
+
const logger_1 = require("./logger");
|
|
21
|
+
const mysql_1 = require("./mysql");
|
|
22
|
+
const trace_1 = require("./trace");
|
|
23
23
|
exports.middleware = {
|
|
24
24
|
build: build_1.default,
|
|
25
25
|
aws: aws_1.default,
|
|
@@ -27,8 +27,9 @@ exports.middleware = {
|
|
|
27
27
|
logger: logger_1.default,
|
|
28
28
|
mysql: mysql_1.default,
|
|
29
29
|
};
|
|
30
|
-
__exportStar(require("./base"), exports);
|
|
31
30
|
__exportStar(require("./aws"), exports);
|
|
32
|
-
__exportStar(require("./
|
|
31
|
+
__exportStar(require("./base"), exports);
|
|
32
|
+
__exportStar(require("./database/index"), exports);
|
|
33
33
|
__exportStar(require("./logger"), exports);
|
|
34
34
|
__exportStar(require("./mysql"), exports);
|
|
35
|
+
__exportStar(require("./trace"), exports);
|