@creator.co/wapi 1.2.3 → 1.2.5
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/.github/workflows/npmpublish.yml +2 -5
- package/README.md +1 -3
- package/dist/index.d.ts +11 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/jest.config.d.ts +3 -0
- package/dist/jest.config.js +34 -0
- package/dist/jest.config.js.map +1 -0
- package/dist/package.json +70 -0
- package/dist/src/API/Request.d.ts +140 -0
- package/dist/src/API/Request.js +182 -0
- package/dist/src/API/Request.js.map +1 -0
- package/dist/src/API/Response.d.ts +256 -0
- package/dist/src/API/Response.js +398 -0
- package/dist/src/API/Response.js.map +1 -0
- package/dist/src/API/Utils.d.ts +63 -0
- package/dist/src/API/Utils.js +104 -0
- package/dist/src/API/Utils.js.map +1 -0
- package/dist/src/BaseEvent/EventProcessor.d.ts +81 -0
- package/dist/src/BaseEvent/EventProcessor.js +182 -0
- package/dist/src/BaseEvent/EventProcessor.js.map +1 -0
- package/dist/src/BaseEvent/Process.d.ts +74 -0
- package/dist/src/BaseEvent/Process.js +142 -0
- package/dist/src/BaseEvent/Process.js.map +1 -0
- package/dist/src/BaseEvent/Transaction.d.ts +39 -0
- package/dist/src/BaseEvent/Transaction.js +354 -0
- package/dist/src/BaseEvent/Transaction.js.map +1 -0
- package/dist/src/Config/Configuration.d.ts +131 -0
- package/dist/src/Config/Configuration.js +153 -0
- package/dist/src/Config/Configuration.js.map +1 -0
- package/dist/src/Config/EnvironmentVar.d.ts +101 -0
- package/dist/src/Config/EnvironmentVar.js +213 -0
- package/dist/src/Config/EnvironmentVar.js.map +1 -0
- package/dist/src/Crypto/Crypto.d.ts +57 -0
- package/dist/src/Crypto/Crypto.js +126 -0
- package/dist/src/Crypto/Crypto.js.map +1 -0
- package/dist/src/Crypto/JWT.d.ts +64 -0
- package/dist/src/Crypto/JWT.js +74 -0
- package/dist/src/Crypto/JWT.js.map +1 -0
- package/dist/src/Database/Database.d.ts +18 -0
- package/dist/src/Database/Database.js +18 -0
- package/dist/src/Database/Database.js.map +1 -0
- package/dist/src/Database/DatabaseManager.d.ts +32 -0
- package/dist/src/Database/DatabaseManager.js +50 -0
- package/dist/src/Database/DatabaseManager.js.map +1 -0
- package/dist/src/Database/DatabaseTransaction.d.ts +65 -0
- package/dist/src/Database/DatabaseTransaction.js +183 -0
- package/dist/src/Database/DatabaseTransaction.js.map +1 -0
- package/dist/src/Database/integrations/knex/KnexDatabase.d.ts +22 -0
- package/dist/src/Database/integrations/knex/KnexDatabase.js +108 -0
- package/dist/src/Database/integrations/knex/KnexDatabase.js.map +1 -0
- package/dist/src/Database/integrations/knex/KnexTransaction.d.ts +37 -0
- package/dist/src/Database/integrations/knex/KnexTransaction.js +60 -0
- package/dist/src/Database/integrations/knex/KnexTransaction.js.map +1 -0
- package/dist/src/Database/integrations/pgsql/PostgresDatabase.d.ts +30 -0
- package/dist/src/Database/integrations/pgsql/PostgresDatabase.js +108 -0
- package/dist/src/Database/integrations/pgsql/PostgresDatabase.js.map +1 -0
- package/dist/src/Database/integrations/pgsql/PostgresTransaction.d.ts +37 -0
- package/dist/src/Database/integrations/pgsql/PostgresTransaction.js +60 -0
- package/dist/src/Database/integrations/pgsql/PostgresTransaction.js.map +1 -0
- package/dist/src/Globals.d.ts +161 -0
- package/dist/src/Globals.js +173 -0
- package/dist/src/Globals.js.map +1 -0
- package/dist/src/Logger/Logger.d.ts +180 -0
- package/dist/src/Logger/Logger.js +412 -0
- package/dist/src/Logger/Logger.js.map +1 -0
- package/dist/src/Mailer/Mailer.d.ts +107 -0
- package/dist/src/Mailer/Mailer.js +313 -0
- package/dist/src/Mailer/Mailer.js.map +1 -0
- package/dist/src/Publisher/Publisher.d.ts +47 -0
- package/dist/src/Publisher/Publisher.js +141 -0
- package/dist/src/Publisher/Publisher.js.map +1 -0
- package/dist/src/Server/RouteResolver.d.ts +41 -0
- package/dist/src/Server/RouteResolver.js +135 -0
- package/dist/src/Server/RouteResolver.js.map +1 -0
- package/dist/src/Server/Router.d.ts +104 -0
- package/dist/src/Server/Router.js +45 -0
- package/dist/src/Server/Router.js.map +1 -0
- package/dist/src/Server/lib/ContainerServer.d.ts +58 -0
- package/dist/src/Server/lib/ContainerServer.js +143 -0
- package/dist/src/Server/lib/ContainerServer.js.map +1 -0
- package/dist/src/Server/lib/Server.d.ts +60 -0
- package/dist/src/Server/lib/Server.js +137 -0
- package/dist/src/Server/lib/Server.js.map +1 -0
- package/dist/src/Server/lib/container/GenericHandler.d.ts +4 -0
- package/dist/src/Server/lib/container/GenericHandler.js +138 -0
- package/dist/src/Server/lib/container/GenericHandler.js.map +1 -0
- package/dist/src/Server/lib/container/GenericHandlerEvent.d.ts +67 -0
- package/dist/src/Server/lib/container/GenericHandlerEvent.js +189 -0
- package/dist/src/Server/lib/container/GenericHandlerEvent.js.map +1 -0
- package/dist/src/Server/lib/container/HealthHandler.d.ts +3 -0
- package/dist/src/Server/lib/container/HealthHandler.js +45 -0
- package/dist/src/Server/lib/container/HealthHandler.js.map +1 -0
- package/dist/src/Server/lib/container/Proxy.d.ts +95 -0
- package/dist/src/Server/lib/container/Proxy.js +202 -0
- package/dist/src/Server/lib/container/Proxy.js.map +1 -0
- package/dist/src/Server/lib/container/Utils.d.ts +18 -0
- package/dist/src/Server/lib/container/Utils.js +84 -0
- package/dist/src/Server/lib/container/Utils.js.map +1 -0
- package/dist/src/Validation/Validator.d.ts +21 -0
- package/dist/src/Validation/Validator.js +48 -0
- package/dist/src/Validation/Validator.js.map +1 -0
- package/jest.config.ts +2 -9
- package/package.json +10 -4
- package/src/BaseEvent/Transaction.ts +48 -18
- package/src/Database/Database.ts +19 -0
- package/src/Database/DatabaseManager.ts +51 -0
- package/src/Database/DatabaseTransaction.ts +118 -0
- package/src/Database/integrations/knex/KnexDatabase.ts +47 -0
- package/src/Database/integrations/knex/KnexTransaction.ts +51 -0
- package/src/Database/integrations/pgsql/PostgresDatabase.ts +49 -0
- package/src/Database/integrations/pgsql/PostgresTransaction.ts +54 -0
- package/src/Database/types.d.ts +49 -0
- package/src/Server/lib/container/Proxy.ts +2 -1
- package/tests/BaseEvent/Transaction.test.ts +59 -0
- package/tests/Database/DatabaseManager.test.ts +55 -0
- package/tests/Database/integrations/knex/KnexDatabase.test.ts +53 -0
- package/tests/Database/integrations/knex/KnexTransaction.test.ts +133 -0
- package/tests/Database/integrations/pg/PostgresDatabase.test.ts +50 -0
- package/tests/Database/integrations/pg/PostgresTransaction.test.ts +51 -0
- package/tsconfig.json +5 -0
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import Server from './../Server';
|
|
2
|
+
import { RouterConfig } from '../../Router';
|
|
3
|
+
/**
|
|
4
|
+
* ${1:Description placeholder}
|
|
5
|
+
*
|
|
6
|
+
* @export
|
|
7
|
+
* @class Proxy
|
|
8
|
+
* @typedef {Proxy}
|
|
9
|
+
*/
|
|
10
|
+
export default class Proxy {
|
|
11
|
+
/**
|
|
12
|
+
* ${1:Description placeholder}
|
|
13
|
+
*
|
|
14
|
+
* @private
|
|
15
|
+
* @type {boolean}
|
|
16
|
+
*/
|
|
17
|
+
private stopping;
|
|
18
|
+
/**
|
|
19
|
+
* ${1:Description placeholder}
|
|
20
|
+
*
|
|
21
|
+
* @private
|
|
22
|
+
* @readonly
|
|
23
|
+
* @type {RouterConfig}
|
|
24
|
+
*/
|
|
25
|
+
private readonly config;
|
|
26
|
+
/**
|
|
27
|
+
* ${1:Description placeholder}
|
|
28
|
+
*
|
|
29
|
+
* @private
|
|
30
|
+
* @readonly
|
|
31
|
+
* @type {express.Express}
|
|
32
|
+
*/
|
|
33
|
+
private readonly app;
|
|
34
|
+
/**
|
|
35
|
+
* ${1:Description placeholder}
|
|
36
|
+
*
|
|
37
|
+
* @private
|
|
38
|
+
* @readonly
|
|
39
|
+
* @type {Server["handleServerlessEvent"]}
|
|
40
|
+
*/
|
|
41
|
+
private readonly serverlessHandler;
|
|
42
|
+
/**
|
|
43
|
+
* ${1:Description placeholder}
|
|
44
|
+
*
|
|
45
|
+
* @private
|
|
46
|
+
* @type {HTTPServer}
|
|
47
|
+
*/
|
|
48
|
+
private listener;
|
|
49
|
+
/**
|
|
50
|
+
* Creates an instance of Proxy.
|
|
51
|
+
*
|
|
52
|
+
* @constructor
|
|
53
|
+
* @param {RouterConfig} config
|
|
54
|
+
* @param {Server["handleServerlessEvent"]} serverlessHandler
|
|
55
|
+
*/
|
|
56
|
+
constructor(config: RouterConfig, serverlessHandler: Server['handleServerlessEvent']);
|
|
57
|
+
/**
|
|
58
|
+
* ${1:Description placeholder}
|
|
59
|
+
*
|
|
60
|
+
* @async
|
|
61
|
+
* @returns {*}
|
|
62
|
+
*/
|
|
63
|
+
load(): Promise<void>;
|
|
64
|
+
/**
|
|
65
|
+
* ${1:Description placeholder}
|
|
66
|
+
*
|
|
67
|
+
* @async
|
|
68
|
+
* @param {?*} [err]
|
|
69
|
+
* @returns {*}
|
|
70
|
+
*/
|
|
71
|
+
unload(err?: any): Promise<void>;
|
|
72
|
+
/**
|
|
73
|
+
* ${1:Description placeholder}
|
|
74
|
+
*
|
|
75
|
+
* @private
|
|
76
|
+
* @async
|
|
77
|
+
* @returns {Promise<void>}
|
|
78
|
+
*/
|
|
79
|
+
private startListeners;
|
|
80
|
+
/**
|
|
81
|
+
* ${1:Description placeholder}
|
|
82
|
+
*
|
|
83
|
+
* @private
|
|
84
|
+
* @async
|
|
85
|
+
* @param {?*} [err]
|
|
86
|
+
* @returns {unknown}
|
|
87
|
+
*/
|
|
88
|
+
private stopListeners;
|
|
89
|
+
/**
|
|
90
|
+
* ${1:Description placeholder}
|
|
91
|
+
*
|
|
92
|
+
* @private
|
|
93
|
+
*/
|
|
94
|
+
private installRoutes;
|
|
95
|
+
}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
+
function step(op) {
|
|
16
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
18
|
+
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;
|
|
19
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
+
switch (op[0]) {
|
|
21
|
+
case 0: case 1: t = op; break;
|
|
22
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
+
default:
|
|
26
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
+
if (t[2]) _.ops.pop();
|
|
31
|
+
_.trys.pop(); continue;
|
|
32
|
+
}
|
|
33
|
+
op = body.call(thisArg, _);
|
|
34
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
var http_1 = require("http");
|
|
40
|
+
var cors = require("cors");
|
|
41
|
+
var express = require("express");
|
|
42
|
+
var GenericHandler_1 = require("./GenericHandler");
|
|
43
|
+
var HealthHandler_1 = require("./HealthHandler");
|
|
44
|
+
var package_json_1 = require("../../../../package.json");
|
|
45
|
+
var Utils_1 = require("../../../API/Utils");
|
|
46
|
+
var Globals_1 = require("../../../Globals");
|
|
47
|
+
/**
|
|
48
|
+
* ${1:Description placeholder}
|
|
49
|
+
*
|
|
50
|
+
* @export
|
|
51
|
+
* @class Proxy
|
|
52
|
+
* @typedef {Proxy}
|
|
53
|
+
*/
|
|
54
|
+
var Proxy = /** @class */ (function () {
|
|
55
|
+
/**
|
|
56
|
+
* Creates an instance of Proxy.
|
|
57
|
+
*
|
|
58
|
+
* @constructor
|
|
59
|
+
* @param {RouterConfig} config
|
|
60
|
+
* @param {Server["handleServerlessEvent"]} serverlessHandler
|
|
61
|
+
*/
|
|
62
|
+
function Proxy(config, serverlessHandler) {
|
|
63
|
+
this.stopping = false;
|
|
64
|
+
this.config = config;
|
|
65
|
+
this.serverlessHandler = serverlessHandler;
|
|
66
|
+
this.app = express();
|
|
67
|
+
/* Opinionated Express configs */
|
|
68
|
+
this.app.use(express.json());
|
|
69
|
+
// apply cors config
|
|
70
|
+
var corsConfig = this.config.cors || Utils_1.default.parseObjectNullIfEmpty(process.env.CORS);
|
|
71
|
+
this.app.use(cors(corsConfig
|
|
72
|
+
? {
|
|
73
|
+
origin: corsConfig.origin,
|
|
74
|
+
allowedHeaders: corsConfig.headers,
|
|
75
|
+
credentials: !!corsConfig.allowCredentials,
|
|
76
|
+
}
|
|
77
|
+
: {}));
|
|
78
|
+
// //This supposedly fix some 502 codes where nodejs socket would hang during
|
|
79
|
+
// //a request and if behind ALB, it would cause 502 codes. Had experiencied this
|
|
80
|
+
// //and 502 codes reduced dramastically, but still some appearances. Maybe this
|
|
81
|
+
// //is just a palliative work-around for the real issue; TODO: need to investigate
|
|
82
|
+
// //in the future.
|
|
83
|
+
// this.listener.listener.keepAliveTimeout = 120e3
|
|
84
|
+
// this.listener.listener.headersTimeout = 120e3
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* ${1:Description placeholder}
|
|
88
|
+
*
|
|
89
|
+
* @async
|
|
90
|
+
* @returns {*}
|
|
91
|
+
*/
|
|
92
|
+
Proxy.prototype.load = function () {
|
|
93
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
94
|
+
return __generator(this, function (_a) {
|
|
95
|
+
switch (_a.label) {
|
|
96
|
+
case 0: return [4 /*yield*/, this.startListeners()];
|
|
97
|
+
case 1:
|
|
98
|
+
_a.sent();
|
|
99
|
+
this.installRoutes();
|
|
100
|
+
return [2 /*return*/];
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
};
|
|
105
|
+
/**
|
|
106
|
+
* ${1:Description placeholder}
|
|
107
|
+
*
|
|
108
|
+
* @async
|
|
109
|
+
* @param {?*} [err]
|
|
110
|
+
* @returns {*}
|
|
111
|
+
*/
|
|
112
|
+
Proxy.prototype.unload = function (err) {
|
|
113
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
114
|
+
return __generator(this, function (_a) {
|
|
115
|
+
switch (_a.label) {
|
|
116
|
+
case 0: return [4 /*yield*/, this.stopListeners(err)];
|
|
117
|
+
case 1:
|
|
118
|
+
_a.sent();
|
|
119
|
+
return [2 /*return*/];
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
};
|
|
124
|
+
/* lifecycle */
|
|
125
|
+
/**
|
|
126
|
+
* ${1:Description placeholder}
|
|
127
|
+
*
|
|
128
|
+
* @private
|
|
129
|
+
* @async
|
|
130
|
+
* @returns {Promise<void>}
|
|
131
|
+
*/
|
|
132
|
+
Proxy.prototype.startListeners = function () {
|
|
133
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
134
|
+
var _this = this;
|
|
135
|
+
return __generator(this, function (_a) {
|
|
136
|
+
return [2 /*return*/, new Promise(function (resolve) {
|
|
137
|
+
var port = _this.config.port || Globals_1.default.Listener_HTTP_DefaultPort;
|
|
138
|
+
console.log("[Proxy] - [STARTING] - v.".concat(package_json_1.version, " - :").concat(port));
|
|
139
|
+
// Create Server
|
|
140
|
+
_this.listener = (0, http_1.createServer)(_this.app);
|
|
141
|
+
// Set defaults
|
|
142
|
+
_this.listener.setTimeout(_this.config.timeout || Globals_1.default.Listener_HTTP_DefaultTimeout);
|
|
143
|
+
// Start Server
|
|
144
|
+
_this.listener.listen(port, function () {
|
|
145
|
+
console.log("[Proxy] - [STARTED]");
|
|
146
|
+
resolve();
|
|
147
|
+
});
|
|
148
|
+
})];
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
};
|
|
152
|
+
/**
|
|
153
|
+
* ${1:Description placeholder}
|
|
154
|
+
*
|
|
155
|
+
* @private
|
|
156
|
+
* @async
|
|
157
|
+
* @param {?*} [err]
|
|
158
|
+
* @returns {unknown}
|
|
159
|
+
*/
|
|
160
|
+
Proxy.prototype.stopListeners = function (err) {
|
|
161
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
162
|
+
var _this = this;
|
|
163
|
+
return __generator(this, function (_a) {
|
|
164
|
+
if (this.stopping)
|
|
165
|
+
return [2 /*return*/];
|
|
166
|
+
this.stopping = true;
|
|
167
|
+
console.debug('[Proxy] - [STOPPING]');
|
|
168
|
+
return [2 /*return*/, new Promise(function (resolve) {
|
|
169
|
+
_this.listener.close(function (_err) {
|
|
170
|
+
var err2 = err || _err;
|
|
171
|
+
if (err2)
|
|
172
|
+
console.log('[Proxy] - exit output:', err2);
|
|
173
|
+
console.log('[Proxy] - [STOPPED]');
|
|
174
|
+
process.exit(err || _err ? 1 : 0);
|
|
175
|
+
resolve(null);
|
|
176
|
+
});
|
|
177
|
+
})];
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
};
|
|
181
|
+
/* routing */
|
|
182
|
+
/**
|
|
183
|
+
* ${1:Description placeholder}
|
|
184
|
+
*
|
|
185
|
+
* @private
|
|
186
|
+
*/
|
|
187
|
+
Proxy.prototype.installRoutes = function () {
|
|
188
|
+
//Health check route -- This is a bypass route to only check if
|
|
189
|
+
//runtime proxy is working and responding to calls.
|
|
190
|
+
console.log("[Proxy] - [HEALTH-ROUTE] - ".concat(this.config.healthCheckRoute || Globals_1.default.Listener_HTTP_DefaultHealthCheckRoute));
|
|
191
|
+
this.app
|
|
192
|
+
.route(this.config.healthCheckRoute || Globals_1.default.Listener_HTTP_DefaultHealthCheckRoute)
|
|
193
|
+
.get(HealthHandler_1.default);
|
|
194
|
+
//Main route -- We use a wildcard route because is not the job of the runtime and neither
|
|
195
|
+
//the task to deny/constrain routes that invoked this task; all the job is done by the
|
|
196
|
+
//load balancer and we just foward everything we have to the function.
|
|
197
|
+
this.app.route(Globals_1.default.Listener_HTTP_ProxyRoute).all((0, GenericHandler_1.default)(this.serverlessHandler));
|
|
198
|
+
};
|
|
199
|
+
return Proxy;
|
|
200
|
+
}());
|
|
201
|
+
exports.default = Proxy;
|
|
202
|
+
//# sourceMappingURL=Proxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Proxy.js","sourceRoot":"","sources":["../../../../../src/Server/lib/container/Proxy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ${1:Description placeholder}
|
|
3
|
+
*
|
|
4
|
+
* @export
|
|
5
|
+
* @param {string} url
|
|
6
|
+
* @returns {*}
|
|
7
|
+
*/
|
|
8
|
+
export declare function parseMultiValueQueryStringParameters(url: string): any;
|
|
9
|
+
/**
|
|
10
|
+
* ${1:Description placeholder}
|
|
11
|
+
*
|
|
12
|
+
* @export
|
|
13
|
+
* @param {*} url
|
|
14
|
+
* @returns {*}
|
|
15
|
+
*/
|
|
16
|
+
export declare function parseQueryStringParameters(url: any): {
|
|
17
|
+
[k: string]: string;
|
|
18
|
+
};
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __values = (this && this.__values) || function(o) {
|
|
3
|
+
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
|
4
|
+
if (m) return m.call(o);
|
|
5
|
+
if (o && typeof o.length === "number") return {
|
|
6
|
+
next: function () {
|
|
7
|
+
if (o && i >= o.length) o = void 0;
|
|
8
|
+
return { value: o && o[i++], done: !o };
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
12
|
+
};
|
|
13
|
+
var __read = (this && this.__read) || function (o, n) {
|
|
14
|
+
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
15
|
+
if (!m) return o;
|
|
16
|
+
var i = m.call(o), r, ar = [], e;
|
|
17
|
+
try {
|
|
18
|
+
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
19
|
+
}
|
|
20
|
+
catch (error) { e = { error: error }; }
|
|
21
|
+
finally {
|
|
22
|
+
try {
|
|
23
|
+
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
24
|
+
}
|
|
25
|
+
finally { if (e) throw e.error; }
|
|
26
|
+
}
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
|
+
exports.parseQueryStringParameters = exports.parseMultiValueQueryStringParameters = void 0;
|
|
31
|
+
/**
|
|
32
|
+
* ${1:Description placeholder}
|
|
33
|
+
*
|
|
34
|
+
* @export
|
|
35
|
+
* @param {string} url
|
|
36
|
+
* @returns {*}
|
|
37
|
+
*/
|
|
38
|
+
function parseMultiValueQueryStringParameters(url) {
|
|
39
|
+
var e_1, _a;
|
|
40
|
+
// dummy placeholder url for the WHATWG URL constructor
|
|
41
|
+
// https://github.com/nodejs/node/issues/12682
|
|
42
|
+
var searchParams = new URL(url, 'http://example').searchParams;
|
|
43
|
+
//
|
|
44
|
+
if (Array.from(searchParams).length === 0)
|
|
45
|
+
return {};
|
|
46
|
+
var map = new Map();
|
|
47
|
+
try {
|
|
48
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
49
|
+
for (var searchParams_1 = __values(searchParams), searchParams_1_1 = searchParams_1.next(); !searchParams_1_1.done; searchParams_1_1 = searchParams_1.next()) {
|
|
50
|
+
var _b = __read(searchParams_1_1.value, 2), key = _b[0], value = _b[1];
|
|
51
|
+
var item = map.get(key);
|
|
52
|
+
if (item)
|
|
53
|
+
item.push(value);
|
|
54
|
+
else
|
|
55
|
+
map.set(key, [value]);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
59
|
+
finally {
|
|
60
|
+
try {
|
|
61
|
+
if (searchParams_1_1 && !searchParams_1_1.done && (_a = searchParams_1.return)) _a.call(searchParams_1);
|
|
62
|
+
}
|
|
63
|
+
finally { if (e_1) throw e_1.error; }
|
|
64
|
+
}
|
|
65
|
+
return Object.fromEntries(map);
|
|
66
|
+
}
|
|
67
|
+
exports.parseMultiValueQueryStringParameters = parseMultiValueQueryStringParameters;
|
|
68
|
+
/**
|
|
69
|
+
* ${1:Description placeholder}
|
|
70
|
+
*
|
|
71
|
+
* @export
|
|
72
|
+
* @param {*} url
|
|
73
|
+
* @returns {*}
|
|
74
|
+
*/
|
|
75
|
+
function parseQueryStringParameters(url) {
|
|
76
|
+
// dummy placeholder url for the WHATWG URL constructor
|
|
77
|
+
// https://github.com/nodejs/node/issues/12682
|
|
78
|
+
var searchParams = new URL(url, 'http://example').searchParams;
|
|
79
|
+
if (Array.from(searchParams).length === 0)
|
|
80
|
+
return null;
|
|
81
|
+
return Object.fromEntries(searchParams);
|
|
82
|
+
}
|
|
83
|
+
exports.parseQueryStringParameters = parseQueryStringParameters;
|
|
84
|
+
//# sourceMappingURL=Utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Utils.js","sourceRoot":"","sources":["../../../../../src/Server/lib/container/Utils.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;GAMG;AACH,SAAgB,oCAAoC,CAAC,GAAW;;IAC9D,uDAAuD;IACvD,8CAA8C;IACtC,IAAA,YAAY,GAAK,IAAI,GAAG,CAAC,GAAG,EAAE,gBAAgB,CAAC,aAAnC,CAAmC;IACvD,EAAE;IACF,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IACpD,IAAM,GAAG,GAAG,IAAI,GAAG,EAAE,CAAA;;QACrB,gDAAgD;QAChD,KAA2B,IAAA,iBAAA,SAAA,YAAY,CAAA,0CAAA,oEAAE;YAA9B,IAAA,KAAA,iCAAY,EAAX,GAAG,QAAA,EAAE,KAAK,QAAA;YACpB,IAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YACzB,IAAI,IAAI;gBAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;;gBACrB,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAA;SAC3B;;;;;;;;;IACD,OAAO,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;AAChC,CAAC;AAdD,oFAcC;AACD;;;;;;GAMG;AACH,SAAgB,0BAA0B,CAAC,GAAG;IAC5C,uDAAuD;IACvD,8CAA8C;IACtC,IAAA,YAAY,GAAK,IAAI,GAAG,CAAC,GAAG,EAAE,gBAAgB,CAAC,aAAnC,CAAmC;IACvD,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IACtD,OAAO,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,CAAA;AACzC,CAAC;AAND,gEAMC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import Response, { ResponseErrorType } from '../API/Response';
|
|
3
|
+
/**
|
|
4
|
+
* Description placeholder
|
|
5
|
+
*
|
|
6
|
+
* @export
|
|
7
|
+
* @class Validator
|
|
8
|
+
* @typedef {Validator}
|
|
9
|
+
*/
|
|
10
|
+
export default class Validator {
|
|
11
|
+
/**
|
|
12
|
+
* Description placeholder
|
|
13
|
+
*
|
|
14
|
+
* @public
|
|
15
|
+
* @static
|
|
16
|
+
* @param {*} data
|
|
17
|
+
* @param {z.ZodObject<any>} schema
|
|
18
|
+
* @returns {(boolean | Response<ResponseErrorType>)}
|
|
19
|
+
*/
|
|
20
|
+
static validateSchema(data: any, schema: z.ZodObject<any>): boolean | Response<ResponseErrorType>;
|
|
21
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
var zod_1 = require("zod");
|
|
4
|
+
var Response_1 = require("../API/Response");
|
|
5
|
+
var Globals_1 = require("../Globals");
|
|
6
|
+
/**
|
|
7
|
+
* Description placeholder
|
|
8
|
+
*
|
|
9
|
+
* @export
|
|
10
|
+
* @class Validator
|
|
11
|
+
* @typedef {Validator}
|
|
12
|
+
*/
|
|
13
|
+
var Validator = /** @class */ (function () {
|
|
14
|
+
function Validator() {
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Description placeholder
|
|
18
|
+
*
|
|
19
|
+
* @public
|
|
20
|
+
* @static
|
|
21
|
+
* @param {*} data
|
|
22
|
+
* @param {z.ZodObject<any>} schema
|
|
23
|
+
* @returns {(boolean | Response<ResponseErrorType>)}
|
|
24
|
+
*/
|
|
25
|
+
Validator.validateSchema = function (data, schema) {
|
|
26
|
+
var error, validatedInput;
|
|
27
|
+
// Validate body against known zod schema
|
|
28
|
+
try {
|
|
29
|
+
validatedInput = schema.parse(data);
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
if (err instanceof zod_1.z.ZodError)
|
|
33
|
+
error = JSON.parse(err.message);
|
|
34
|
+
else
|
|
35
|
+
error = 'Unknown validation error!'; //unhandled case, hard to test
|
|
36
|
+
}
|
|
37
|
+
// Error validation
|
|
38
|
+
if (!validatedInput || error) {
|
|
39
|
+
return Response_1.default.BadRequestResponse(Globals_1.default.ErrorResponseValidationFail, Globals_1.default.ErrorCode_InvalidInput, { validationFailure: error });
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
return Validator;
|
|
46
|
+
}());
|
|
47
|
+
exports.default = Validator;
|
|
48
|
+
//# sourceMappingURL=Validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Validator.js","sourceRoot":"","sources":["../../../src/Validation/Validator.ts"],"names":[],"mappings":";;AAAA,2BAAuB;AAEvB,4CAA6D;AAC7D,sCAAgC;AAEhC;;;;;;GAMG;AACH;IAAA;IAiCA,CAAC;IAhCC;;;;;;;;OAQG;IACW,wBAAc,GAA5B,UACE,IAAS,EACT,MAAwB;QAExB,IAAI,KAAK,EAAE,cAAc,CAAA;QACzB,yCAAyC;QACzC,IAAI;YACF,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAkB,CAAA;SACrD;QAAC,OAAO,GAAqB,EAAE;YAC9B,IAAI,GAAG,YAAY,OAAC,CAAC,QAAQ;gBAAE,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;;gBACzD,KAAK,GAAG,2BAA2B,CAAA,CAAC,8BAA8B;SACxE;QACD,mBAAmB;QACnB,IAAI,CAAC,cAAc,IAAI,KAAK,EAAE;YAC5B,OAAO,kBAAQ,CAAC,kBAAkB,CAChC,iBAAO,CAAC,2BAA2B,EACnC,iBAAO,CAAC,sBAAsB,EAC9B,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAC7B,CAAA;SACF;aAAM;YACL,OAAO,IAAI,CAAA;SACZ;IACH,CAAC;IACH,gBAAC;AAAD,CAAC,AAjCD,IAiCC"}
|
package/jest.config.ts
CHANGED
|
@@ -18,15 +18,8 @@ const config: Config.InitialOptions = {
|
|
|
18
18
|
},
|
|
19
19
|
],
|
|
20
20
|
],
|
|
21
|
-
coverageReporters: [
|
|
22
|
-
|
|
23
|
-
'json',
|
|
24
|
-
'lcov',
|
|
25
|
-
'text',
|
|
26
|
-
['text', { file: 'coverage.txt' }],
|
|
27
|
-
'json-summary',
|
|
28
|
-
],
|
|
29
|
-
collectCoverageFrom: ['src/**/*.(t|j)s'],
|
|
21
|
+
coverageReporters: ['clover', 'json', 'lcov', ['text', { file: 'coverage.txt' }], 'json-summary'],
|
|
22
|
+
collectCoverageFrom: ['src/**/*.(t|j)s', '!src/**/*.d.(t|j)s'],
|
|
30
23
|
coverageThreshold: {
|
|
31
24
|
global: {
|
|
32
25
|
branches: 80,
|
package/package.json
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@creator.co/wapi",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.5",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"type": "commonjs",
|
|
8
8
|
"scripts": {
|
|
9
|
-
"build": "
|
|
9
|
+
"build": "tsc --build",
|
|
10
10
|
"clean": "tsc --build --clean",
|
|
11
11
|
"lint-fix": "eslint . --ext .ts --fix",
|
|
12
12
|
"lint": "eslint . --ext .ts",
|
|
13
|
-
"test": "jest --coverage --silent --runInBand",
|
|
14
|
-
"test-dev": "jest --coverage --runInBand"
|
|
13
|
+
"test": "jest --coverage --silent --runInBand && cat coverage/coverage.txt",
|
|
14
|
+
"test-dev": "jest --coverage --runInBand && cat coverage/coverage.txt"
|
|
15
15
|
},
|
|
16
16
|
"author": "",
|
|
17
17
|
"license": "ISC",
|
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
"@aws-sdk/credential-provider-node": "^3.414.0",
|
|
25
25
|
"@types/email-templates": "^10.0.1",
|
|
26
26
|
"@types/nodemailer": "^6.4.10",
|
|
27
|
+
"@types/object-hash": "^3.0.4",
|
|
27
28
|
"abind": "^1.0.5",
|
|
28
29
|
"cors": "^2.8.5",
|
|
29
30
|
"cuid": "^3.0.0",
|
|
@@ -32,18 +33,23 @@
|
|
|
32
33
|
"express": "^4.18.2",
|
|
33
34
|
"json-stringify-safe": "^5.0.1",
|
|
34
35
|
"jsonwebtoken": "^9.0.2",
|
|
36
|
+
"knex": "^3.0.1",
|
|
35
37
|
"node-cache": "^5.1.2",
|
|
38
|
+
"object-hash": "^3.0.0",
|
|
36
39
|
"parse-duration": "^1.1.0",
|
|
40
|
+
"pg": "^8.11.3",
|
|
37
41
|
"sha1": "^1.1.1",
|
|
38
42
|
"stack-trace": "0.0.10",
|
|
39
43
|
"zod": "^3.22.4"
|
|
40
44
|
},
|
|
41
45
|
"devDependencies": {
|
|
42
46
|
"@types/aws-lambda": "^8.10.119",
|
|
47
|
+
"@types/chai": "^4.3.9",
|
|
43
48
|
"@types/express": "^4.17.19",
|
|
44
49
|
"@types/jest": "^29.5.6",
|
|
45
50
|
"@types/jsonwebtoken": "^9.0.3",
|
|
46
51
|
"@types/node": "^20.5.7",
|
|
52
|
+
"@types/pg": "^8.10.5",
|
|
47
53
|
"@typescript-eslint/eslint-plugin": "^6.5.0",
|
|
48
54
|
"@typescript-eslint/parser": "^6.5.0",
|
|
49
55
|
"aws-lambda": "^1.0.7",
|
|
@@ -2,6 +2,9 @@ import type { APIGatewayEvent, Context, SQSEvent } from 'aws-lambda'
|
|
|
2
2
|
|
|
3
3
|
import Request from '../API/Request'
|
|
4
4
|
import Response, { ResponseErrorType } from '../API/Response'
|
|
5
|
+
import { DatabaseManager } from '../Database/DatabaseManager'
|
|
6
|
+
import { DatabaseTransaction } from '../Database/DatabaseTransaction'
|
|
7
|
+
import type { DatabaseTransactionType, DatabaseType, DbConfig } from '../Database/types'
|
|
5
8
|
import Globals from '../Globals'
|
|
6
9
|
import Logger, { LoggerConfig } from '../Logger/Logger'
|
|
7
10
|
import Publisher, { PublisherConfig } from '../Publisher/Publisher'
|
|
@@ -24,6 +27,8 @@ export default class Transaction<
|
|
|
24
27
|
ResponseInnerType = null,
|
|
25
28
|
MiscRespType = null,
|
|
26
29
|
> {
|
|
30
|
+
private databaseManager: DatabaseManager = DatabaseManager.INSTANCE
|
|
31
|
+
private transactions: DatabaseTransaction[] = []
|
|
27
32
|
private event: any
|
|
28
33
|
private context: Context
|
|
29
34
|
private response: Response<ResponseInnerType | ResponseErrorType> | MiscRespType | null
|
|
@@ -34,6 +39,7 @@ export default class Transaction<
|
|
|
34
39
|
public readonly request: Request<InputType>
|
|
35
40
|
public readonly publisher: Publisher
|
|
36
41
|
public responseProxy: (response: Response<ResponseInnerType>) => Promise<void>
|
|
42
|
+
|
|
37
43
|
//
|
|
38
44
|
constructor(event: APIGatewayEvent | SQSEvent, context: Context, config?: TransactionConfig) {
|
|
39
45
|
const transactionId = context.awsRequestId
|
|
@@ -74,6 +80,7 @@ export default class Transaction<
|
|
|
74
80
|
// allow request to async succeed through lambda context
|
|
75
81
|
return null
|
|
76
82
|
}
|
|
83
|
+
|
|
77
84
|
//Executions
|
|
78
85
|
private async iexecute(
|
|
79
86
|
executionFunc: TransactionExecution<
|
|
@@ -119,32 +126,54 @@ export default class Transaction<
|
|
|
119
126
|
}
|
|
120
127
|
return executionFailed
|
|
121
128
|
}
|
|
122
|
-
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Retrieves a database transaction for the specified database configuration.
|
|
132
|
+
* @async
|
|
133
|
+
* @param {DbConfig<S>} config - The configuration object for the database.
|
|
134
|
+
* @returns {Promise<DatabaseTransactionType<S>>} A promise that resolves to the database transaction.
|
|
135
|
+
*/
|
|
136
|
+
public async getDbTransaction<S extends DatabaseType>(
|
|
137
|
+
config: DbConfig<S>
|
|
138
|
+
): Promise<DatabaseTransactionType<S>> {
|
|
139
|
+
const db = this.databaseManager.create(config)
|
|
140
|
+
const dbTrans = await db.transaction()
|
|
141
|
+
this.transactions.push(dbTrans)
|
|
142
|
+
return dbTrans as any
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
private async executeDBTransactions(safeExecution: () => Promise<boolean>): Promise<void> {
|
|
123
146
|
try {
|
|
124
|
-
//
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
// this.logger.log("Rolling back DB transactions. Main code failed!");
|
|
136
|
-
// if (this.db) await this.db.rollback();
|
|
137
|
-
// }
|
|
138
|
-
// //Cleanup DB after execution
|
|
139
|
-
// if (this.db) await this.db.cleanup();
|
|
147
|
+
// Execute
|
|
148
|
+
const execFailed = await safeExecution()
|
|
149
|
+
for (const transaction of [...this.transactions].reverse()) {
|
|
150
|
+
try {
|
|
151
|
+
await transaction[execFailed ? 'closeFailure' : 'closeSuccess']()
|
|
152
|
+
} catch (e) {
|
|
153
|
+
// TODO: should we keep committing transactions even if one fails?
|
|
154
|
+
this.logger.error('Exception when closing DB transactions after success.')
|
|
155
|
+
this.logger.exception(e)
|
|
156
|
+
}
|
|
157
|
+
}
|
|
140
158
|
} catch (e) {
|
|
159
|
+
/* this part of the code handle exceptions at transaction level,
|
|
160
|
+
so probably a bug but we still handle such */
|
|
161
|
+
for (const transaction of [...this.transactions].reverse()) {
|
|
162
|
+
try {
|
|
163
|
+
await transaction.closeFailure()
|
|
164
|
+
} catch (e) {
|
|
165
|
+
this.logger.error('Exception when closing DB transactions after failure.')
|
|
166
|
+
this.logger.exception(e)
|
|
167
|
+
}
|
|
168
|
+
}
|
|
141
169
|
this.logger.error('Exception when executing DB transactions.')
|
|
142
170
|
this.logger.log(e.stack)
|
|
143
171
|
//retrow?
|
|
144
172
|
if (this.retrowErrors) throw e
|
|
145
173
|
}
|
|
146
174
|
}
|
|
147
|
-
|
|
175
|
+
|
|
176
|
+
private async executeLoggerFlush(safeExecution): Promise<void> {
|
|
148
177
|
try {
|
|
149
178
|
await safeExecution()
|
|
150
179
|
} catch (e) {
|
|
@@ -156,6 +185,7 @@ export default class Transaction<
|
|
|
156
185
|
this.logger.debug('Transaction ended')
|
|
157
186
|
}
|
|
158
187
|
}
|
|
188
|
+
|
|
159
189
|
/* Response support */
|
|
160
190
|
private getErrorResponse(error: string, code: string): Response<ResponseErrorType> {
|
|
161
191
|
return Response.BadRequestResponseWithRollback(error, code)
|