@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.
Files changed (121) hide show
  1. package/.github/workflows/npmpublish.yml +2 -5
  2. package/README.md +1 -3
  3. package/dist/index.d.ts +11 -0
  4. package/dist/index.js +24 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/jest.config.d.ts +3 -0
  7. package/dist/jest.config.js +34 -0
  8. package/dist/jest.config.js.map +1 -0
  9. package/dist/package.json +70 -0
  10. package/dist/src/API/Request.d.ts +140 -0
  11. package/dist/src/API/Request.js +182 -0
  12. package/dist/src/API/Request.js.map +1 -0
  13. package/dist/src/API/Response.d.ts +256 -0
  14. package/dist/src/API/Response.js +398 -0
  15. package/dist/src/API/Response.js.map +1 -0
  16. package/dist/src/API/Utils.d.ts +63 -0
  17. package/dist/src/API/Utils.js +104 -0
  18. package/dist/src/API/Utils.js.map +1 -0
  19. package/dist/src/BaseEvent/EventProcessor.d.ts +81 -0
  20. package/dist/src/BaseEvent/EventProcessor.js +182 -0
  21. package/dist/src/BaseEvent/EventProcessor.js.map +1 -0
  22. package/dist/src/BaseEvent/Process.d.ts +74 -0
  23. package/dist/src/BaseEvent/Process.js +142 -0
  24. package/dist/src/BaseEvent/Process.js.map +1 -0
  25. package/dist/src/BaseEvent/Transaction.d.ts +39 -0
  26. package/dist/src/BaseEvent/Transaction.js +354 -0
  27. package/dist/src/BaseEvent/Transaction.js.map +1 -0
  28. package/dist/src/Config/Configuration.d.ts +131 -0
  29. package/dist/src/Config/Configuration.js +153 -0
  30. package/dist/src/Config/Configuration.js.map +1 -0
  31. package/dist/src/Config/EnvironmentVar.d.ts +101 -0
  32. package/dist/src/Config/EnvironmentVar.js +213 -0
  33. package/dist/src/Config/EnvironmentVar.js.map +1 -0
  34. package/dist/src/Crypto/Crypto.d.ts +57 -0
  35. package/dist/src/Crypto/Crypto.js +126 -0
  36. package/dist/src/Crypto/Crypto.js.map +1 -0
  37. package/dist/src/Crypto/JWT.d.ts +64 -0
  38. package/dist/src/Crypto/JWT.js +74 -0
  39. package/dist/src/Crypto/JWT.js.map +1 -0
  40. package/dist/src/Database/Database.d.ts +18 -0
  41. package/dist/src/Database/Database.js +18 -0
  42. package/dist/src/Database/Database.js.map +1 -0
  43. package/dist/src/Database/DatabaseManager.d.ts +32 -0
  44. package/dist/src/Database/DatabaseManager.js +50 -0
  45. package/dist/src/Database/DatabaseManager.js.map +1 -0
  46. package/dist/src/Database/DatabaseTransaction.d.ts +65 -0
  47. package/dist/src/Database/DatabaseTransaction.js +183 -0
  48. package/dist/src/Database/DatabaseTransaction.js.map +1 -0
  49. package/dist/src/Database/integrations/knex/KnexDatabase.d.ts +22 -0
  50. package/dist/src/Database/integrations/knex/KnexDatabase.js +108 -0
  51. package/dist/src/Database/integrations/knex/KnexDatabase.js.map +1 -0
  52. package/dist/src/Database/integrations/knex/KnexTransaction.d.ts +37 -0
  53. package/dist/src/Database/integrations/knex/KnexTransaction.js +60 -0
  54. package/dist/src/Database/integrations/knex/KnexTransaction.js.map +1 -0
  55. package/dist/src/Database/integrations/pgsql/PostgresDatabase.d.ts +30 -0
  56. package/dist/src/Database/integrations/pgsql/PostgresDatabase.js +108 -0
  57. package/dist/src/Database/integrations/pgsql/PostgresDatabase.js.map +1 -0
  58. package/dist/src/Database/integrations/pgsql/PostgresTransaction.d.ts +37 -0
  59. package/dist/src/Database/integrations/pgsql/PostgresTransaction.js +60 -0
  60. package/dist/src/Database/integrations/pgsql/PostgresTransaction.js.map +1 -0
  61. package/dist/src/Globals.d.ts +161 -0
  62. package/dist/src/Globals.js +173 -0
  63. package/dist/src/Globals.js.map +1 -0
  64. package/dist/src/Logger/Logger.d.ts +180 -0
  65. package/dist/src/Logger/Logger.js +412 -0
  66. package/dist/src/Logger/Logger.js.map +1 -0
  67. package/dist/src/Mailer/Mailer.d.ts +107 -0
  68. package/dist/src/Mailer/Mailer.js +313 -0
  69. package/dist/src/Mailer/Mailer.js.map +1 -0
  70. package/dist/src/Publisher/Publisher.d.ts +47 -0
  71. package/dist/src/Publisher/Publisher.js +141 -0
  72. package/dist/src/Publisher/Publisher.js.map +1 -0
  73. package/dist/src/Server/RouteResolver.d.ts +41 -0
  74. package/dist/src/Server/RouteResolver.js +135 -0
  75. package/dist/src/Server/RouteResolver.js.map +1 -0
  76. package/dist/src/Server/Router.d.ts +104 -0
  77. package/dist/src/Server/Router.js +45 -0
  78. package/dist/src/Server/Router.js.map +1 -0
  79. package/dist/src/Server/lib/ContainerServer.d.ts +58 -0
  80. package/dist/src/Server/lib/ContainerServer.js +143 -0
  81. package/dist/src/Server/lib/ContainerServer.js.map +1 -0
  82. package/dist/src/Server/lib/Server.d.ts +60 -0
  83. package/dist/src/Server/lib/Server.js +137 -0
  84. package/dist/src/Server/lib/Server.js.map +1 -0
  85. package/dist/src/Server/lib/container/GenericHandler.d.ts +4 -0
  86. package/dist/src/Server/lib/container/GenericHandler.js +138 -0
  87. package/dist/src/Server/lib/container/GenericHandler.js.map +1 -0
  88. package/dist/src/Server/lib/container/GenericHandlerEvent.d.ts +67 -0
  89. package/dist/src/Server/lib/container/GenericHandlerEvent.js +189 -0
  90. package/dist/src/Server/lib/container/GenericHandlerEvent.js.map +1 -0
  91. package/dist/src/Server/lib/container/HealthHandler.d.ts +3 -0
  92. package/dist/src/Server/lib/container/HealthHandler.js +45 -0
  93. package/dist/src/Server/lib/container/HealthHandler.js.map +1 -0
  94. package/dist/src/Server/lib/container/Proxy.d.ts +95 -0
  95. package/dist/src/Server/lib/container/Proxy.js +202 -0
  96. package/dist/src/Server/lib/container/Proxy.js.map +1 -0
  97. package/dist/src/Server/lib/container/Utils.d.ts +18 -0
  98. package/dist/src/Server/lib/container/Utils.js +84 -0
  99. package/dist/src/Server/lib/container/Utils.js.map +1 -0
  100. package/dist/src/Validation/Validator.d.ts +21 -0
  101. package/dist/src/Validation/Validator.js +48 -0
  102. package/dist/src/Validation/Validator.js.map +1 -0
  103. package/jest.config.ts +2 -9
  104. package/package.json +10 -4
  105. package/src/BaseEvent/Transaction.ts +48 -18
  106. package/src/Database/Database.ts +19 -0
  107. package/src/Database/DatabaseManager.ts +51 -0
  108. package/src/Database/DatabaseTransaction.ts +118 -0
  109. package/src/Database/integrations/knex/KnexDatabase.ts +47 -0
  110. package/src/Database/integrations/knex/KnexTransaction.ts +51 -0
  111. package/src/Database/integrations/pgsql/PostgresDatabase.ts +49 -0
  112. package/src/Database/integrations/pgsql/PostgresTransaction.ts +54 -0
  113. package/src/Database/types.d.ts +49 -0
  114. package/src/Server/lib/container/Proxy.ts +2 -1
  115. package/tests/BaseEvent/Transaction.test.ts +59 -0
  116. package/tests/Database/DatabaseManager.test.ts +55 -0
  117. package/tests/Database/integrations/knex/KnexDatabase.test.ts +53 -0
  118. package/tests/Database/integrations/knex/KnexTransaction.test.ts +133 -0
  119. package/tests/Database/integrations/pg/PostgresDatabase.test.ts +50 -0
  120. package/tests/Database/integrations/pg/PostgresTransaction.test.ts +51 -0
  121. 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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6BAAyD;AAEzD,2BAA4B;AAC5B,iCAAkC;AAGlC,mDAA6C;AAC7C,iDAA2C;AAC3C,yDAAgE;AAChE,4CAAsC;AACtC,4CAAsC;AAGtC;;;;;;GAMG;AACH;IAuCE;;;;;;OAMG;IACH,eAAY,MAAoB,EAAE,iBAAkD;QAClF,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAA;QACrB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAA;QAC1C,IAAI,CAAC,GAAG,GAAG,OAAO,EAAE,CAAA;QACpB,iCAAiC;QACjC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;QAC5B,oBAAoB;QACpB,IAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,eAAK,CAAC,sBAAsB,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACrF,IAAI,CAAC,GAAG,CAAC,GAAG,CACV,IAAI,CACF,UAAU;YACR,CAAC,CAAC;gBACE,MAAM,EAAE,UAAU,CAAC,MAAM;gBACzB,cAAc,EAAE,UAAU,CAAC,OAAO;gBAClC,WAAW,EAAE,CAAC,CAAC,UAAU,CAAC,gBAAgB;aAC3C;YACH,CAAC,CAAC,EAAE,CACP,CACF,CAAA;QAED,6EAA6E;QAC7E,iFAAiF;QACjF,gFAAgF;QAChF,mFAAmF;QACnF,mBAAmB;QACnB,kDAAkD;QAClD,gDAAgD;IAClD,CAAC;IACD;;;;;OAKG;IACG,oBAAI,GAAV;;;;4BACE,qBAAM,IAAI,CAAC,cAAc,EAAE,EAAA;;wBAA3B,SAA2B,CAAA;wBAC3B,IAAI,CAAC,aAAa,EAAE,CAAA;;;;;KACrB;IACD;;;;;;OAMG;IACG,sBAAM,GAAZ,UAAa,GAAS;;;;4BACpB,qBAAM,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAA;;wBAA7B,SAA6B,CAAA;;;;;KAC9B;IACD,eAAe;IACf;;;;;;OAMG;IACW,8BAAc,GAA5B;;;;gBACE,sBAAO,IAAI,OAAO,CAAC,UAAA,OAAO;wBACxB,IAAM,IAAI,GAAG,KAAI,CAAC,MAAM,CAAC,IAAI,IAAI,iBAAO,CAAC,yBAAyB,CAAA;wBAClE,OAAO,CAAC,GAAG,CAAC,mCAA4B,sBAAU,iBAAO,IAAI,CAAE,CAAC,CAAA;wBAChE,gBAAgB;wBAChB,KAAI,CAAC,QAAQ,GAAG,IAAA,mBAAY,EAAC,KAAI,CAAC,GAAG,CAAC,CAAA;wBACtC,eAAe;wBACf,KAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAI,CAAC,MAAM,CAAC,OAAO,IAAI,iBAAO,CAAC,4BAA4B,CAAC,CAAA;wBACrF,eAAe;wBACf,KAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE;4BACzB,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAA;4BAClC,OAAO,EAAE,CAAA;wBACX,CAAC,CAAC,CAAA;oBACJ,CAAC,CAAC,EAAA;;;KACH;IACD;;;;;;;OAOG;IACW,6BAAa,GAA3B,UAA4B,GAAS;;;;gBACnC,IAAI,IAAI,CAAC,QAAQ;oBAAE,sBAAM;gBACzB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAA;gBACpB,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAA;gBACrC,sBAAO,IAAI,OAAO,CAAC,UAAA,OAAO;wBACxB,KAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAA,IAAI;4BACtB,IAAM,IAAI,GAAG,GAAG,IAAI,IAAI,CAAA;4BACxB,IAAI,IAAI;gCAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,IAAI,CAAC,CAAA;4BACrD,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAA;4BAClC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;4BACjC,OAAO,CAAC,IAAI,CAAC,CAAA;wBACf,CAAC,CAAC,CAAA;oBACJ,CAAC,CAAC,EAAA;;;KACH;IACD,aAAa;IACb;;;;OAIG;IACK,6BAAa,GAArB;QACE,+DAA+D;QAC/D,mDAAmD;QACnD,OAAO,CAAC,GAAG,CACT,qCACE,IAAI,CAAC,MAAM,CAAC,gBAAgB,IAAI,iBAAO,CAAC,qCAAqC,CAC7E,CACH,CAAA;QACD,IAAI,CAAC,GAAG;aACL,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,IAAI,iBAAO,CAAC,qCAAqC,CAAC;aACpF,GAAG,CAAC,uBAAa,CAAC,CAAA;QACrB,yFAAyF;QACzF,sFAAsF;QACtF,sEAAsE;QACtE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,iBAAO,CAAC,wBAAwB,CAAC,CAAC,GAAG,CAAC,IAAA,wBAAc,EAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAA;IAC9F,CAAC;IACH,YAAC;AAAD,CAAC,AAlKD,IAkKC"}
@@ -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
- 'clover',
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",
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": "npm run lint && tsc --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
- private async executeDBTransactions(safeExecution) {
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
- // //start DB
125
- // if (this.db) await this.db.connect();
126
- // //start transaction
127
- // if (this.db) await this.db.beginTransaction();
128
- // //
129
- // let executionFailed =
130
- await safeExecution()
131
- // //Commit if not failed, rollback if failed
132
- // if (!executionFailed) {
133
- // if (this.db) await this.db.commit();
134
- // } else {
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
- private async executeLoggerFlush(safeExecution) {
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)