@creator.co/wapi 1.1.8 → 1.2.0-alpha2

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 (79) hide show
  1. package/.eslintrc.cjs +22 -22
  2. package/README.md +1 -0
  3. package/dist/index.d.ts +3 -2
  4. package/dist/index.js +5 -3
  5. package/dist/index.js.map +1 -1
  6. package/dist/package.json +50 -0
  7. package/dist/src/API/Request.d.ts +4 -5
  8. package/dist/src/API/Request.js +3 -4
  9. package/dist/src/API/Request.js.map +1 -1
  10. package/dist/src/API/Response.d.ts +1 -1
  11. package/dist/src/API/Response.js.map +1 -1
  12. package/dist/src/BaseEvent/EventProcessor.js +0 -1
  13. package/dist/src/BaseEvent/EventProcessor.js.map +1 -1
  14. package/dist/src/BaseEvent/Process.d.ts +4 -7
  15. package/dist/src/BaseEvent/Process.js +1 -2
  16. package/dist/src/BaseEvent/Process.js.map +1 -1
  17. package/dist/src/BaseEvent/Transaction.d.ts +6 -6
  18. package/dist/src/BaseEvent/Transaction.js +2 -4
  19. package/dist/src/BaseEvent/Transaction.js.map +1 -1
  20. package/dist/src/Config/Configuration.d.ts +28 -0
  21. package/dist/src/Config/Configuration.js +93 -0
  22. package/dist/src/Config/Configuration.js.map +1 -0
  23. package/dist/src/Config/EnvironmentVar.d.ts +17 -0
  24. package/dist/src/Config/EnvironmentVar.js +155 -0
  25. package/dist/src/Config/EnvironmentVar.js.map +1 -0
  26. package/dist/src/Globals.d.ts +11 -0
  27. package/dist/src/Globals.js +12 -0
  28. package/dist/src/Globals.js.map +1 -1
  29. package/dist/src/Logger/Logger.js +42 -11
  30. package/dist/src/Logger/Logger.js.map +1 -1
  31. package/dist/src/Mailer/Mailer.js +50 -24
  32. package/dist/src/Mailer/Mailer.js.map +1 -1
  33. package/dist/src/Server/Router.d.ts +30 -0
  34. package/dist/src/Server/Router.js +21 -0
  35. package/dist/src/Server/Router.js.map +1 -0
  36. package/dist/src/Server/lib/ContainerServer.d.ts +11 -0
  37. package/dist/src/Server/lib/ContainerServer.js +100 -0
  38. package/dist/src/Server/lib/ContainerServer.js.map +1 -0
  39. package/dist/src/Server/lib/Server.d.ts +9 -0
  40. package/dist/src/Server/lib/Server.js +137 -0
  41. package/dist/src/Server/lib/Server.js.map +1 -0
  42. package/dist/src/Server/lib/container/GenericHandler.d.ts +4 -0
  43. package/dist/src/Server/lib/container/GenericHandler.js +138 -0
  44. package/dist/src/Server/lib/container/GenericHandler.js.map +1 -0
  45. package/dist/src/Server/lib/container/GenericHandlerEvent.d.ts +14 -0
  46. package/dist/src/Server/lib/container/GenericHandlerEvent.js +164 -0
  47. package/dist/src/Server/lib/container/GenericHandlerEvent.js.map +1 -0
  48. package/dist/src/Server/lib/container/HealthHandler.d.ts +3 -0
  49. package/dist/src/Server/lib/container/HealthHandler.js +44 -0
  50. package/dist/src/Server/lib/container/HealthHandler.js.map +1 -0
  51. package/dist/src/Server/lib/container/Proxy.d.ts +15 -0
  52. package/dist/src/Server/lib/container/Proxy.js +153 -0
  53. package/dist/src/Server/lib/container/Proxy.js.map +1 -0
  54. package/dist/src/Server/lib/container/Utils.d.ts +6 -0
  55. package/dist/src/Server/lib/container/Utils.js +109 -0
  56. package/dist/src/Server/lib/container/Utils.js.map +1 -0
  57. package/dist/src/Validation/Validator.d.ts +5 -0
  58. package/dist/src/Validation/Validator.js +39 -0
  59. package/dist/src/Validation/Validator.js.map +1 -0
  60. package/index.ts +8 -6
  61. package/package.json +14 -3
  62. package/src/API/Request.ts +6 -12
  63. package/src/API/Response.ts +1 -1
  64. package/src/BaseEvent/EventProcessor.ts +3 -2
  65. package/src/BaseEvent/Process.ts +11 -10
  66. package/src/BaseEvent/Transaction.ts +24 -16
  67. package/src/Config/Configuration.ts +83 -0
  68. package/src/Config/EnvironmentVar.ts +94 -0
  69. package/src/Globals.ts +15 -0
  70. package/src/Server/Router.ts +51 -0
  71. package/src/Server/lib/ContainerServer.ts +27 -0
  72. package/src/Server/lib/Server.ts +66 -0
  73. package/src/Server/lib/container/GenericHandler.ts +63 -0
  74. package/src/Server/lib/container/GenericHandlerEvent.ts +133 -0
  75. package/src/Server/lib/container/HealthHandler.ts +5 -0
  76. package/src/Server/lib/container/Proxy.ts +107 -0
  77. package/src/Server/lib/container/Utils.ts +45 -0
  78. package/src/Validation/Validator.ts +35 -0
  79. package/tsconfig.json +2 -0
@@ -0,0 +1,153 @@
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_1 = 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 Globals_1 = require("../../../Globals");
46
+ var Proxy = /** @class */ (function () {
47
+ function Proxy(config, serverlessHandler) {
48
+ var _a, _b, _c, _d, _e, _f;
49
+ this.stopping = false;
50
+ this.config = config;
51
+ this.serverlessHandler = serverlessHandler;
52
+ this.app = express();
53
+ this.app.use((0, cors_1.default)(this.config.cors
54
+ ? {
55
+ options: {
56
+ origin: (_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.cors) === null || _b === void 0 ? void 0 : _b.origin,
57
+ allowedHeaders: (_d = (_c = this.config) === null || _c === void 0 ? void 0 : _c.cors) === null || _d === void 0 ? void 0 : _d.headers,
58
+ credentials: !!((_f = (_e = this.config) === null || _e === void 0 ? void 0 : _e.cors) === null || _f === void 0 ? void 0 : _f.allowCredentials),
59
+ },
60
+ }
61
+ : {}));
62
+ // //This supposedly fix some 502 codes where nodejs socket would hang during
63
+ // //a request and if behind ALB, it would cause 502 codes. Had experiencied this
64
+ // //and 502 codes reduced dramastically, but still some appearances. Maybe this
65
+ // //is just a palliative work-around for the real issue; TODO: need to investigate
66
+ // //in the future.
67
+ // this.listener.listener.keepAliveTimeout = 120e3
68
+ // this.listener.listener.headersTimeout = 120e3
69
+ }
70
+ Proxy.prototype.load = function () {
71
+ return __awaiter(this, void 0, void 0, function () {
72
+ return __generator(this, function (_a) {
73
+ switch (_a.label) {
74
+ case 0: return [4 /*yield*/, this.startListeners()];
75
+ case 1:
76
+ _a.sent();
77
+ this.installRoutes();
78
+ return [2 /*return*/];
79
+ }
80
+ });
81
+ });
82
+ };
83
+ Proxy.prototype.unload = function (err) {
84
+ return __awaiter(this, void 0, void 0, function () {
85
+ return __generator(this, function (_a) {
86
+ switch (_a.label) {
87
+ case 0: return [4 /*yield*/, this.stopListeners(err)];
88
+ case 1:
89
+ _a.sent();
90
+ return [2 /*return*/];
91
+ }
92
+ });
93
+ });
94
+ };
95
+ /* lifecycle */
96
+ Proxy.prototype.startListeners = function () {
97
+ return __awaiter(this, void 0, void 0, function () {
98
+ var _this = this;
99
+ return __generator(this, function (_a) {
100
+ return [2 /*return*/, new Promise(function (resolve) {
101
+ var port = _this.config.port || Globals_1.default.Listener_HTTP_DefaultPort;
102
+ console.log("[Proxy] - [STARTING] - v.".concat(package_json_1.version, " - :").concat(port));
103
+ // Create Server
104
+ _this.listener = (0, http_1.createServer)(_this.app);
105
+ // Set defaults
106
+ _this.listener.setTimeout(_this.config.timeout || Globals_1.default.Listener_HTTP_DefaultTimeout);
107
+ // Start Server
108
+ _this.listener.listen(port, function () {
109
+ console.log("[Proxy] - [STARTED]");
110
+ resolve();
111
+ });
112
+ })];
113
+ });
114
+ });
115
+ };
116
+ Proxy.prototype.stopListeners = function (err) {
117
+ return __awaiter(this, void 0, void 0, function () {
118
+ return __generator(this, function (_a) {
119
+ if (this.stopping)
120
+ return [2 /*return*/];
121
+ this.stopping = true;
122
+ console.debug("[Proxy] - [STOPPING]");
123
+ this.listener.close(function (_err) {
124
+ if (err || _err)
125
+ console.log("[Proxy] - exit output:", err || _err);
126
+ console.log("[Proxy] - [STOPPED]");
127
+ process.exit(err || _err ? 1 : 0);
128
+ });
129
+ return [2 /*return*/];
130
+ });
131
+ });
132
+ };
133
+ /* routing */
134
+ Proxy.prototype.installRoutes = function () {
135
+ //Health check route -- This is a bypass route to only check if
136
+ //runtime proxy is working and responding to calls.
137
+ console.log("[Proxy] - [HEALTH-ROUTE] - ".concat(this.config.healthCheckRoute ||
138
+ Globals_1.default.Listener_HTTP_DefaultHealthCheckRoute));
139
+ this.app
140
+ .route(this.config.healthCheckRoute ||
141
+ Globals_1.default.Listener_HTTP_DefaultHealthCheckRoute)
142
+ .get(HealthHandler_1.default);
143
+ //Main route -- We use a wildcard route because is not the job of the runtime and neither
144
+ //the task to deny/constrain routes that invoked this task; all the job is done by the
145
+ //load balancer and we just foward everything we have to the function.
146
+ this.app
147
+ .route(Globals_1.default.Listener_HTTP_ProxyRoute)
148
+ .all((0, GenericHandler_1.default)(this.serverlessHandler));
149
+ };
150
+ return Proxy;
151
+ }());
152
+ exports.default = Proxy;
153
+ //# 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,6 @@
1
+ export declare function parseMultiValueHeaders(rawHeaders: any): any;
2
+ export declare function parseMultiValueQueryStringParameters(url: any): any;
3
+ export declare function parseQueryStringParameters(url: any): {
4
+ [k: string]: string;
5
+ };
6
+ export declare function nullIfEmpty(obj: any): any;
@@ -0,0 +1,109 @@
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.nullIfEmpty = exports.parseQueryStringParameters = exports.parseMultiValueQueryStringParameters = exports.parseMultiValueHeaders = void 0;
31
+ var unflatten_1 = require("unflatten");
32
+ // https://aws.amazon.com/blogs/compute/support-for-multi-value-parameters-in-amazon-api-gateway/
33
+ // (rawHeaders: Array<string>): { [string]: Array<string> }
34
+ function parseMultiValueHeaders(rawHeaders) {
35
+ var e_1, _a;
36
+ if (rawHeaders.length === 0)
37
+ return null;
38
+ //
39
+ var map = new Map();
40
+ var unflattened = (0, unflatten_1.default)(rawHeaders, 2);
41
+ try {
42
+ // eslint-disable-next-line no-restricted-syntax
43
+ for (var _b = __values(Object.keys(unflattened)), _c = _b.next(); !_c.done; _c = _b.next()) {
44
+ var key = _c.value;
45
+ var item = map.get(key);
46
+ if (item)
47
+ item.push(unflattened[key]);
48
+ else
49
+ map.set(key, [unflattened[key]]);
50
+ }
51
+ }
52
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
53
+ finally {
54
+ try {
55
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
56
+ }
57
+ finally { if (e_1) throw e_1.error; }
58
+ }
59
+ return Object.fromEntries(map);
60
+ }
61
+ exports.parseMultiValueHeaders = parseMultiValueHeaders;
62
+ // https://aws.amazon.com/blogs/compute/support-for-multi-value-parameters-in-amazon-api-gateway/
63
+ // [ [ 'petType', 'dog' ], [ 'petType', 'fish' ] ]
64
+ // => { petType: [ 'dog', 'fish' ] },
65
+ function parseMultiValueQueryStringParameters(url) {
66
+ var e_2, _a;
67
+ // dummy placeholder url for the WHATWG URL constructor
68
+ // https://github.com/nodejs/node/issues/12682
69
+ var searchParams = new URL(url, "http://example").searchParams;
70
+ //
71
+ if (Array.from(searchParams).length === 0)
72
+ return null;
73
+ var map = new Map();
74
+ try {
75
+ // eslint-disable-next-line no-restricted-syntax
76
+ for (var searchParams_1 = __values(searchParams), searchParams_1_1 = searchParams_1.next(); !searchParams_1_1.done; searchParams_1_1 = searchParams_1.next()) {
77
+ var _b = __read(searchParams_1_1.value, 2), key = _b[0], value = _b[1];
78
+ var item = map.get(key);
79
+ if (item)
80
+ item.push(value);
81
+ else
82
+ map.set(key, [value]);
83
+ }
84
+ }
85
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
86
+ finally {
87
+ try {
88
+ if (searchParams_1_1 && !searchParams_1_1.done && (_a = searchParams_1.return)) _a.call(searchParams_1);
89
+ }
90
+ finally { if (e_2) throw e_2.error; }
91
+ }
92
+ return Object.fromEntries(map);
93
+ }
94
+ exports.parseMultiValueQueryStringParameters = parseMultiValueQueryStringParameters;
95
+ function parseQueryStringParameters(url) {
96
+ // dummy placeholder url for the WHATWG URL constructor
97
+ // https://github.com/nodejs/node/issues/12682
98
+ var searchParams = new URL(url, "http://example").searchParams;
99
+ if (Array.from(searchParams).length === 0)
100
+ return null;
101
+ return Object.fromEntries(searchParams);
102
+ }
103
+ exports.parseQueryStringParameters = parseQueryStringParameters;
104
+ //
105
+ function nullIfEmpty(obj) {
106
+ return obj && (Object.keys(obj).length > 0 ? obj : null);
107
+ }
108
+ exports.nullIfEmpty = nullIfEmpty;
109
+ //# sourceMappingURL=Utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Utils.js","sourceRoot":"","sources":["../../../../../src/Server/lib/container/Utils.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAiC;AACjC,iGAAiG;AACjG,2DAA2D;AAC3D,SAAgB,sBAAsB,CAAC,UAAU;;IAC/C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IACxC,EAAE;IACF,IAAM,GAAG,GAAG,IAAI,GAAG,EAAE,CAAA;IACrB,IAAM,WAAW,GAAG,IAAA,mBAAS,EAAC,UAAU,EAAE,CAAC,CAAC,CAAA;;QAC5C,gDAAgD;QAChD,KAAkB,IAAA,KAAA,SAAA,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA,gBAAA,4BAAE;YAAvC,IAAM,GAAG,WAAA;YACZ,IAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YACzB,IAAI,IAAI;gBAAE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAA;;gBAChC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;SACtC;;;;;;;;;IACD,OAAO,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;AAChC,CAAC;AAZD,wDAYC;AACD,iGAAiG;AACjG,kDAAkD;AAClD,qCAAqC;AACrC,SAAgB,oCAAoC,CAAC,GAAG;;IACtD,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,IAAI,CAAA;IACtD,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,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;AACD,EAAE;AACF,SAAgB,WAAW,CAAC,GAAG;IAC7B,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;AAC1D,CAAC;AAFD,kCAEC"}
@@ -0,0 +1,5 @@
1
+ import { z } from "zod";
2
+ import Response from "../API/Response";
3
+ export default class Validator {
4
+ static validateSchema(data: any, schema: z.ZodObject<any>): boolean | Response;
5
+ }
@@ -0,0 +1,39 @@
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
+ var Validator = /** @class */ (function () {
7
+ function Validator() {
8
+ }
9
+ Validator.validateSchema = function (data, schema) {
10
+ var error, validatedInput;
11
+ // Validate body against known zod schema
12
+ try {
13
+ validatedInput = schema.parse(data);
14
+ }
15
+ catch (err) {
16
+ if (err instanceof zod_1.z.ZodError) {
17
+ error = err.issues
18
+ .map(function (v) {
19
+ return "".concat(v.code, " - ").concat(v.message, " ").concat(v.path);
20
+ })
21
+ .join(", ");
22
+ }
23
+ else if (err.message)
24
+ error = err.message;
25
+ else
26
+ error = "Unknown validation error!";
27
+ }
28
+ // Error validation
29
+ if (!validatedInput || error) {
30
+ return Response_1.default.BadRequestResponse(Globals_1.default.ErrorResponseValidationFail, Globals_1.default.ErrorCode_InvalidInput);
31
+ }
32
+ else {
33
+ return true;
34
+ }
35
+ };
36
+ return Validator;
37
+ }());
38
+ exports.default = Validator;
39
+ //# sourceMappingURL=Validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Validator.js","sourceRoot":"","sources":["../../../src/Validation/Validator.ts"],"names":[],"mappings":";;AAAA,2BAAuB;AAEvB,4CAAsC;AACtC,sCAAgC;AAEhC;IAAA;IA6BA,CAAC;IA5Be,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,EAAE;gBAC7B,KAAK,GAAG,GAAG,CAAC,MAAM;qBACf,GAAG,CAAC,UAAC,CAAC;oBACL,OAAO,UAAG,CAAC,CAAC,IAAI,gBAAM,CAAC,CAAC,OAAO,cAAI,CAAC,CAAC,IAAI,CAAE,CAAA;gBAC7C,CAAC,CAAC;qBACD,IAAI,CAAC,IAAI,CAAC,CAAA;aACd;iBAAM,IAAI,GAAG,CAAC,OAAO;gBAAE,KAAK,GAAG,GAAG,CAAC,OAAO,CAAA;;gBACtC,KAAK,GAAG,2BAA2B,CAAA;SACzC;QACD,mBAAmB;QACnB,IAAI,CAAC,cAAc,IAAI,KAAK,EAAE;YAC5B,OAAO,kBAAQ,CAAC,kBAAkB,CAChC,iBAAO,CAAC,2BAA2B,EACnC,iBAAO,CAAC,sBAAsB,CAC/B,CAAA;SACF;aAAM;YACL,OAAO,IAAI,CAAA;SACZ;IACH,CAAC;IACH,gBAAC;AAAD,CAAC,AA7BD,IA6BC"}
package/index.ts CHANGED
@@ -3,21 +3,23 @@ import Utils from "./src/API/Utils"
3
3
  import EventProcessor from "./src/BaseEvent/EventProcessor"
4
4
  import Process from "./src/BaseEvent/Process"
5
5
  import Transaction from "./src/BaseEvent/Transaction"
6
+ import Configuration from "./src/Config/Configuration"
6
7
  import Crypto from "./src/Crypto/Crypto"
7
8
  import Mailer from "./src/Mailer/Mailer"
8
- import Publisher from "./src/Publisher/Publisher"
9
+ import Router from "./src/Server/Router"
9
10
 
10
11
  export {
11
- //Base Events
12
+ // Base Events
12
13
  Transaction,
13
14
  Process,
14
15
  EventProcessor,
15
- //Client
16
- Publisher,
16
+ Router,
17
+ // Externally initialized clients
17
18
  Mailer,
18
19
  Crypto,
19
- //Responses
20
+ Configuration,
21
+ // Responses
20
22
  Response,
21
- //Helpers
23
+ // Helpers
22
24
  Utils,
23
25
  }
package/package.json CHANGED
@@ -1,12 +1,11 @@
1
1
  {
2
2
  "name": "@creator.co/wapi",
3
- "version": "1.1.8",
3
+ "version": "1.2.0-alpha2",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "type": "commonjs",
8
8
  "scripts": {
9
- "prepare": "npm run build",
10
9
  "build": "npm run lint && tsc --build",
11
10
  "clean": "tsc --build --clean",
12
11
  "lint": "eslint . --ext .ts --fix"
@@ -14,22 +13,34 @@
14
13
  "author": "",
15
14
  "license": "ISC",
16
15
  "dependencies": {
16
+ "@aws-sdk/client-secrets-manager": "^3.427.0",
17
17
  "@aws-sdk/client-ses": "^3.414.0",
18
18
  "@aws-sdk/client-sns": "^3.398.0",
19
+ "@aws-sdk/client-ssm": "^3.427.0",
19
20
  "@aws-sdk/credential-provider-node": "^3.414.0",
20
21
  "@types/email-templates": "^10.0.1",
21
22
  "@types/nodemailer": "^6.4.10",
22
23
  "abind": "^1.0.5",
24
+ "cors": "^2.8.5",
25
+ "cuid": "^3.0.0",
26
+ "dotenv": "^16.3.1",
23
27
  "email-templates": "^11.1.1",
28
+ "express": "^4.18.2",
24
29
  "json-stringify-safe": "^5.0.1",
30
+ "node-cache": "^5.1.2",
31
+ "parse-duration": "^1.1.0",
25
32
  "sha1": "^1.1.1",
26
- "stack-trace": "0.0.10"
33
+ "stack-trace": "0.0.10",
34
+ "unflatten": "^1.0.4",
35
+ "zod": "^3.22.4"
27
36
  },
28
37
  "devDependencies": {
29
38
  "@types/aws-lambda": "^8.10.119",
39
+ "@types/express": "^4.17.19",
30
40
  "@types/node": "^20.5.7",
31
41
  "@typescript-eslint/eslint-plugin": "^6.5.0",
32
42
  "@typescript-eslint/parser": "^6.5.0",
43
+ "aws-lambda": "^1.0.7",
33
44
  "eslint": "^8.48.0",
34
45
  "eslint-config-prettier": "^9.0.0",
35
46
  "eslint-plugin-import": "^2.28.1",
@@ -1,22 +1,16 @@
1
1
  import type { Context, APIGatewayEvent } from "aws-lambda"
2
2
 
3
3
  import Utils from "./Utils"
4
- import Transaction from "../BaseEvent/Transaction"
4
+ import Logger from "../Logger/Logger"
5
5
  //
6
- export default class Request {
6
+ export default class Request<T> {
7
7
  private requestEvent: APIGatewayEvent
8
8
  private context: Context
9
- private transaction: Transaction
10
- constructor(
11
- requestEvent: APIGatewayEvent,
12
- context: Context,
13
- transaction: Transaction,
14
- ) {
9
+ constructor(requestEvent: APIGatewayEvent, context: Context, logger: Logger) {
15
10
  this.requestEvent = requestEvent
16
- this.transaction = transaction
17
11
  this.context = context
18
- this.transaction.logger.debug("Request info:", JSON.stringify(requestEvent))
19
- this.transaction.logger.debug("Request context:", JSON.stringify(context))
12
+ logger.debug("Request info:", JSON.stringify(requestEvent))
13
+ logger.debug("Request context:", JSON.stringify(context))
20
14
  }
21
15
  //query
22
16
  public containsQueryParam(paramName: string): boolean {
@@ -55,7 +49,7 @@ export default class Request {
55
49
  )
56
50
  }
57
51
  //body
58
- public getBody(): object | null {
52
+ public getBody(): T | null {
59
53
  let b: any = null
60
54
  try {
61
55
  b = this.requestEvent.body
@@ -63,7 +63,7 @@ export default class Response {
63
63
  }
64
64
  public async build(
65
65
  context: Context,
66
- transaction: Transaction,
66
+ transaction: Transaction<any>,
67
67
  _optDoNotCallContext: boolean,
68
68
  ): Promise<void> {
69
69
  //Stream support
@@ -3,12 +3,13 @@ import type { Context, SQSBatchResponse, SQSEvent } from "aws-lambda"
3
3
  import Transaction, { TransactionConfig } from "./Transaction"
4
4
  import Response from "../API/Response"
5
5
  import Globals from "../Globals"
6
- //
6
+
7
+ // Handler
7
8
  export type EventProcessorExecution = (
8
9
  transaction: Transaction,
9
10
  recordContent: string | object,
10
11
  ) => Promise<Response | SQSBatchResponse>
11
- //
12
+
12
13
  export default class EventProcessor {
13
14
  private readonly _allowFailure: boolean
14
15
  private readonly _apiConfig: TransactionConfig
@@ -1,16 +1,17 @@
1
- import Logger, { LoggerConfig } from "../Logger/Logger"
2
- import Publisher, { PublisherConfig } from "../Publisher/Publisher"
3
- //
4
- export type ProcessConfig = {
5
- logger?: LoggerConfig
6
- publisher?: PublisherConfig
7
- }
8
- //
1
+ import { TransactionConfig } from "./Transaction"
2
+ import Logger from "../Logger/Logger"
3
+ import Publisher from "../Publisher/Publisher"
4
+
5
+ // Config
6
+ export type ProcessConfig = Omit<
7
+ TransactionConfig,
8
+ "throwOnErrors" | "syncReturn"
9
+ >
10
+
9
11
  export default class Process {
10
12
  private _interval: number
11
13
  //
12
14
  public readonly logger: Logger
13
- public readonly request: Request
14
15
  public readonly publisher: Publisher
15
16
  constructor(config: ProcessConfig, interval: number) {
16
17
  this._interval = interval
@@ -44,7 +45,7 @@ export default class Process {
44
45
  } catch (e) {
45
46
  /*EXECUTION FAIL*/
46
47
  this.logger.error(
47
- "Exception when executing main request code. Rolling back DB!",
48
+ "Exception when executing main process code. Rolling back DB!",
48
49
  )
49
50
  this.logger.exception(e)
50
51
  //Rollback DB
@@ -1,26 +1,30 @@
1
- //
2
- import type { Context, SQSBatchResponse } from "aws-lambda"
1
+ import type {
2
+ APIGatewayEvent,
3
+ Context,
4
+ SQSBatchResponse,
5
+ SQSEvent,
6
+ } from "aws-lambda"
3
7
 
4
8
  import Request from "../API/Request"
5
9
  import Response from "../API/Response"
6
10
  import Globals from "../Globals"
7
- //Comps
8
11
  import Logger, { LoggerConfig } from "../Logger/Logger"
9
12
  import Publisher, { PublisherConfig } from "../Publisher/Publisher"
10
- //Request
11
- //
13
+
14
+ // Request
12
15
  export type TransactionExecution<T> = (
13
16
  transaction: T,
14
17
  ) => Promise<Response | SQSBatchResponse>
15
- //
18
+ // Config
16
19
  export type TransactionConfig = {
17
20
  throwOnErrors?: boolean
18
21
  syncReturn?: boolean
22
+ //
19
23
  logger?: LoggerConfig
20
24
  publisher?: PublisherConfig
21
25
  }
22
- //
23
- export default class Transaction {
26
+
27
+ export default class Transaction<T = object> {
24
28
  private _event: any
25
29
  private _context: Context
26
30
  private _response: Response | null | SQSBatchResponse
@@ -28,34 +32,38 @@ export default class Transaction {
28
32
  private _retrowErrors: boolean
29
33
  //
30
34
  public readonly logger: Logger
31
- public readonly request: Request
35
+ public readonly request: Request<T>
32
36
  public readonly publisher: Publisher
33
37
  public responseProxy: (response: Response) => Promise<void>
34
38
  //
35
- constructor(event, context: Context, config?: TransactionConfig) {
39
+ constructor(
40
+ event: APIGatewayEvent | SQSEvent,
41
+ context: Context,
42
+ config?: TransactionConfig,
43
+ ) {
36
44
  const transactionId = context.awsRequestId
37
45
  ? context.awsRequestId
38
- : event.requestContext
39
- ? event.requestContext.requestId
46
+ : (<APIGatewayEvent>event).requestContext
47
+ ? (<APIGatewayEvent>event).requestContext.requestId
40
48
  : "unknown"
41
49
  // transaction ctx
42
50
  this._event = event
43
51
  this._context = context
44
52
  this._response = null
45
- //When set, this will be called with the response context right before calling the context suceed/fail - useful for writing the resp for example.
53
+ // when set, this will be called with the response context right before calling the context suceed/fail - useful for writing the resp for example.
46
54
  this.responseProxy = null
47
55
  // transaction flags
48
56
  this._syncReturn = !!config?.syncReturn
49
57
  this._retrowErrors = !!config?.throwOnErrors /* retrow internal errors */
50
58
  // components
51
59
  this.logger = new Logger(config?.logger, transactionId)
52
- this.request = new Request(this._event, this._context, this)
60
+ this.request = new Request<T>(this._event, this._context, this.logger)
53
61
  this.publisher = new Publisher(config?.publisher)
54
62
  }
55
63
 
56
64
  //Main interface
57
65
  async execute(
58
- executionFunc: TransactionExecution<Transaction>,
66
+ executionFunc: TransactionExecution<Transaction<T>>,
59
67
  ): Promise<Response | null | SQSBatchResponse> {
60
68
  await this._executeLoggerFlush(async () => {
61
69
  await this._executeDBTransactions(async () => {
@@ -69,7 +77,7 @@ export default class Transaction {
69
77
  }
70
78
  //Executions
71
79
  async _execute(
72
- executionFunc: TransactionExecution<Transaction>,
80
+ executionFunc: TransactionExecution<Transaction<T>>,
73
81
  ): Promise<boolean> {
74
82
  let executionFailed = true //failed til we say no!
75
83
  //safe execution handler