@carno.js/core 0.2.3
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/LICENSE +674 -0
- package/dist/Carno.d.ts +65 -0
- package/dist/Carno.js +307 -0
- package/dist/Cheetah.d.ts +65 -0
- package/dist/Cheetah.js +307 -0
- package/dist/cache/bento-cache.driver.d.ts +13 -0
- package/dist/cache/bento-cache.driver.js +55 -0
- package/dist/cache/cache.service.d.ts +8 -0
- package/dist/cache/cache.service.js +6 -0
- package/dist/commons/decorators/Injectable.decorator.d.ts +20 -0
- package/dist/commons/decorators/Injectable.decorator.js +33 -0
- package/dist/commons/decorators/controller.decorator.d.ts +8 -0
- package/dist/commons/decorators/controller.decorator.js +22 -0
- package/dist/commons/decorators/http.decorators.d.ts +13 -0
- package/dist/commons/decorators/http.decorators.js +44 -0
- package/dist/commons/decorators/index.d.ts +5 -0
- package/dist/commons/decorators/index.js +21 -0
- package/dist/commons/decorators/inject.decorator.d.ts +1 -0
- package/dist/commons/decorators/inject.decorator.js +5 -0
- package/dist/commons/decorators/middleware.decorator.d.ts +2 -0
- package/dist/commons/decorators/middleware.decorator.js +30 -0
- package/dist/commons/decorators/service.decorator.d.ts +2 -0
- package/dist/commons/decorators/service.decorator.js +7 -0
- package/dist/commons/http-code.enum.d.ts +50 -0
- package/dist/commons/http-code.enum.js +54 -0
- package/dist/commons/index.d.ts +3 -0
- package/dist/commons/index.js +19 -0
- package/dist/commons/registries/ProviderControl.d.ts +77 -0
- package/dist/commons/registries/ProviderControl.js +112 -0
- package/dist/commons/registries/ProviderRegistry.d.ts +7 -0
- package/dist/commons/registries/ProviderRegistry.js +20 -0
- package/dist/constants.d.ts +7 -0
- package/dist/constants.js +10 -0
- package/dist/container/ContainerConfiguration.d.ts +45 -0
- package/dist/container/ContainerConfiguration.js +121 -0
- package/dist/container/DependencyResolver.d.ts +18 -0
- package/dist/container/DependencyResolver.js +81 -0
- package/dist/container/InjectorService.d.ts +34 -0
- package/dist/container/InjectorService.js +157 -0
- package/dist/container/MethodInvoker.d.ts +17 -0
- package/dist/container/MethodInvoker.js +69 -0
- package/dist/container/RouteResolver.d.ts +27 -0
- package/dist/container/RouteResolver.js +173 -0
- package/dist/container/container.d.ts +41 -0
- package/dist/container/container.js +71 -0
- package/dist/container/createContainer.d.ts +3 -0
- package/dist/container/createContainer.js +12 -0
- package/dist/container/createInjector.d.ts +2 -0
- package/dist/container/createInjector.js +7 -0
- package/dist/container/index.d.ts +6 -0
- package/dist/container/index.js +22 -0
- package/dist/container/middleware.resolver.d.ts +9 -0
- package/dist/container/middleware.resolver.js +35 -0
- package/dist/default-routes-carno.d.ts +3 -0
- package/dist/default-routes-carno.js +29 -0
- package/dist/default-routes-cheetah.d.ts +3 -0
- package/dist/default-routes-cheetah.js +29 -0
- package/dist/domain/CarnoClosure.d.ts +1 -0
- package/dist/domain/CarnoClosure.js +2 -0
- package/dist/domain/CarnoMiddleware.d.ts +5 -0
- package/dist/domain/CarnoMiddleware.js +2 -0
- package/dist/domain/CheetahClosure.d.ts +1 -0
- package/dist/domain/CheetahClosure.js +2 -0
- package/dist/domain/CheetahMiddleware.d.ts +5 -0
- package/dist/domain/CheetahMiddleware.js +2 -0
- package/dist/domain/Context.d.ts +26 -0
- package/dist/domain/Context.js +107 -0
- package/dist/domain/LocalsContainer.d.ts +4 -0
- package/dist/domain/LocalsContainer.js +10 -0
- package/dist/domain/Metadata.d.ts +449 -0
- package/dist/domain/Metadata.js +511 -0
- package/dist/domain/cors-config.d.ts +12 -0
- package/dist/domain/cors-config.js +18 -0
- package/dist/domain/http-method.d.ts +7 -0
- package/dist/domain/http-method.js +11 -0
- package/dist/domain/index.d.ts +10 -0
- package/dist/domain/index.js +26 -0
- package/dist/domain/provider-scope.d.ts +5 -0
- package/dist/domain/provider-scope.js +9 -0
- package/dist/domain/provider-type.d.ts +6 -0
- package/dist/domain/provider-type.js +10 -0
- package/dist/domain/provider.d.ts +37 -0
- package/dist/domain/provider.js +70 -0
- package/dist/events/hooks.decorator.d.ts +3 -0
- package/dist/events/hooks.decorator.js +29 -0
- package/dist/events/index.d.ts +2 -0
- package/dist/events/index.js +18 -0
- package/dist/events/on-event.d.ts +13 -0
- package/dist/events/on-event.js +11 -0
- package/dist/exceptions/HttpException.d.ts +9 -0
- package/dist/exceptions/HttpException.js +26 -0
- package/dist/exceptions/index.d.ts +1 -0
- package/dist/exceptions/index.js +17 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.js +32 -0
- package/dist/route/Matcher.d.ts +16 -0
- package/dist/route/Matcher.js +48 -0
- package/dist/route/RouteExecutor.d.ts +13 -0
- package/dist/route/RouteExecutor.js +70 -0
- package/dist/route/memoirist.d.ts +25 -0
- package/dist/route/memoirist.js +250 -0
- package/dist/services/logger.service.d.ts +23 -0
- package/dist/services/logger.service.js +54 -0
- package/dist/services/request-logger.service.d.ts +15 -0
- package/dist/services/request-logger.service.js +50 -0
- package/dist/testing/core-testing.d.ts +24 -0
- package/dist/testing/core-testing.js +98 -0
- package/dist/testing/index.d.ts +1 -0
- package/dist/testing/index.js +17 -0
- package/dist/utils/ancestorOf.d.ts +2 -0
- package/dist/utils/ancestorOf.js +10 -0
- package/dist/utils/ancestorsOf.d.ts +6 -0
- package/dist/utils/ancestorsOf.js +20 -0
- package/dist/utils/classOf.d.ts +13 -0
- package/dist/utils/classOf.js +21 -0
- package/dist/utils/cleanObject.d.ts +6 -0
- package/dist/utils/cleanObject.js +22 -0
- package/dist/utils/constructorOf.d.ts +11 -0
- package/dist/utils/constructorOf.js +18 -0
- package/dist/utils/createInstance.d.ts +1 -0
- package/dist/utils/createInstance.js +7 -0
- package/dist/utils/decoratorTypeOf.d.ts +11 -0
- package/dist/utils/decoratorTypeOf.js +32 -0
- package/dist/utils/deepClone.d.ts +6 -0
- package/dist/utils/deepClone.js +63 -0
- package/dist/utils/deepMerge.d.ts +9 -0
- package/dist/utils/deepMerge.js +62 -0
- package/dist/utils/descriptorOf.d.ts +8 -0
- package/dist/utils/descriptorOf.js +16 -0
- package/dist/utils/getClassOrSymbol.d.ts +1 -0
- package/dist/utils/getClassOrSymbol.js +8 -0
- package/dist/utils/getConstructorArgNames.d.ts +1 -0
- package/dist/utils/getConstructorArgNames.js +12 -0
- package/dist/utils/getMethodArgTypes.d.ts +1 -0
- package/dist/utils/getMethodArgTypes.js +9 -0
- package/dist/utils/getValue.d.ts +32 -0
- package/dist/utils/getValue.js +47 -0
- package/dist/utils/hasJsonMethod.d.ts +1 -0
- package/dist/utils/hasJsonMethod.js +6 -0
- package/dist/utils/index.d.ts +15 -0
- package/dist/utils/index.js +31 -0
- package/dist/utils/isArray.d.ts +13 -0
- package/dist/utils/isArray.js +21 -0
- package/dist/utils/isArrowFn.d.ts +1 -0
- package/dist/utils/isArrowFn.js +7 -0
- package/dist/utils/isBoolean.d.ts +7 -0
- package/dist/utils/isBoolean.js +15 -0
- package/dist/utils/isBuffer.d.ts +7 -0
- package/dist/utils/isBuffer.js +19 -0
- package/dist/utils/isClass.d.ts +1 -0
- package/dist/utils/isClass.js +26 -0
- package/dist/utils/isClassValidator.d.ts +6 -0
- package/dist/utils/isClassValidator.js +13 -0
- package/dist/utils/isCollection.d.ts +6 -0
- package/dist/utils/isCollection.js +20 -0
- package/dist/utils/isDate.d.ts +6 -0
- package/dist/utils/isDate.js +11 -0
- package/dist/utils/isEmpty.d.ts +6 -0
- package/dist/utils/isEmpty.js +12 -0
- package/dist/utils/isFunction.d.ts +1 -0
- package/dist/utils/isFunction.js +6 -0
- package/dist/utils/isInheritedFrom.d.ts +1 -0
- package/dist/utils/isInheritedFrom.js +24 -0
- package/dist/utils/isMomentObject.d.ts +1 -0
- package/dist/utils/isMomentObject.js +6 -0
- package/dist/utils/isMongooseObject.d.ts +2 -0
- package/dist/utils/isMongooseObject.js +11 -0
- package/dist/utils/isNil.d.ts +1 -0
- package/dist/utils/isNil.js +6 -0
- package/dist/utils/isNumber.d.ts +7 -0
- package/dist/utils/isNumber.js +15 -0
- package/dist/utils/isObject.d.ts +1 -0
- package/dist/utils/isObject.js +6 -0
- package/dist/utils/isObservable.d.ts +1 -0
- package/dist/utils/isObservable.js +6 -0
- package/dist/utils/isPlainObject.d.ts +7 -0
- package/dist/utils/isPlainObject.js +16 -0
- package/dist/utils/isPrimitive.d.ts +14 -0
- package/dist/utils/isPrimitive.js +28 -0
- package/dist/utils/isPrimitiveType.d.ts +1 -0
- package/dist/utils/isPrimitiveType.js +11 -0
- package/dist/utils/isPromise.d.ts +7 -0
- package/dist/utils/isPromise.js +14 -0
- package/dist/utils/isProtectedKey.d.ts +5 -0
- package/dist/utils/isProtectedKey.js +10 -0
- package/dist/utils/isRegExp.d.ts +1 -0
- package/dist/utils/isRegExp.js +6 -0
- package/dist/utils/isRequestScope.d.ts +11 -0
- package/dist/utils/isRequestScope.js +23 -0
- package/dist/utils/isSerializable.d.ts +1 -0
- package/dist/utils/isSerializable.js +11 -0
- package/dist/utils/isStream.d.ts +1 -0
- package/dist/utils/isStream.js +6 -0
- package/dist/utils/isString.d.ts +6 -0
- package/dist/utils/isString.js +14 -0
- package/dist/utils/isSymbol.d.ts +6 -0
- package/dist/utils/isSymbol.js +14 -0
- package/dist/utils/methodsOf.d.ts +9 -0
- package/dist/utils/methodsOf.js +24 -0
- package/dist/utils/nameOf.d.ts +14 -0
- package/dist/utils/nameOf.js +31 -0
- package/dist/utils/objectKeys.d.ts +1 -0
- package/dist/utils/objectKeys.js +7 -0
- package/dist/utils/primitiveOf.d.ts +1 -0
- package/dist/utils/primitiveOf.js +18 -0
- package/dist/utils/prototypeOf.d.ts +6 -0
- package/dist/utils/prototypeOf.js +12 -0
- package/dist/utils/setValue.d.ts +1 -0
- package/dist/utils/setValue.js +32 -0
- package/dist/utils/toMap.d.ts +3 -0
- package/dist/utils/toMap.js +34 -0
- package/dist/utils/toStringConstructor.d.ts +1 -0
- package/dist/utils/toStringConstructor.js +10 -0
- package/package.json +55 -0
package/dist/Cheetah.js
ADDED
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.Cheetah = void 0;
|
|
7
|
+
const node_process_1 = __importDefault(require("node:process"));
|
|
8
|
+
const index_1 = require("./commons/index");
|
|
9
|
+
const constants_1 = require("./constants");
|
|
10
|
+
const createContainer_1 = require("./container/createContainer");
|
|
11
|
+
const createInjector_1 = require("./container/createInjector");
|
|
12
|
+
const domain_1 = require("./domain");
|
|
13
|
+
const Context_1 = require("./domain/Context");
|
|
14
|
+
const LocalsContainer_1 = require("./domain/LocalsContainer");
|
|
15
|
+
const cors_config_1 = require("./domain/cors-config");
|
|
16
|
+
const on_event_1 = require("./events/on-event");
|
|
17
|
+
const HttpException_1 = require("./exceptions/HttpException");
|
|
18
|
+
const RouteExecutor_1 = require("./route/RouteExecutor");
|
|
19
|
+
const memoirist_1 = __importDefault(require("./route/memoirist"));
|
|
20
|
+
const logger_service_1 = require("./services/logger.service");
|
|
21
|
+
const parseUrl = require("parseurl-fast");
|
|
22
|
+
// todo: change console.log for LoggerService.
|
|
23
|
+
class Cheetah {
|
|
24
|
+
constructor(config = {}) {
|
|
25
|
+
this.config = config;
|
|
26
|
+
this.router = new memoirist_1.default();
|
|
27
|
+
this.injector = (0, createInjector_1.createInjector)();
|
|
28
|
+
this.fetch = async (request, server) => {
|
|
29
|
+
try {
|
|
30
|
+
return await this.fetcher(request, server);
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
if (error instanceof HttpException_1.HttpException) {
|
|
34
|
+
let response = new Response(JSON.stringify({
|
|
35
|
+
message: error.getResponse(),
|
|
36
|
+
statusCode: error.getStatus(),
|
|
37
|
+
}), {
|
|
38
|
+
status: error.statusCode,
|
|
39
|
+
headers: { "Content-Type": "application/json" },
|
|
40
|
+
});
|
|
41
|
+
if (this.isCorsEnabled()) {
|
|
42
|
+
const origin = request.headers.get("origin");
|
|
43
|
+
if (origin && this.isOriginAllowed(origin)) {
|
|
44
|
+
response = this.applyCorsHeaders(response, origin);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return response;
|
|
48
|
+
}
|
|
49
|
+
throw error;
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
this.catcher = (error) => {
|
|
53
|
+
console.error("Unhandled error:", error);
|
|
54
|
+
return new Response("Internal Server Error", { status: 500 });
|
|
55
|
+
};
|
|
56
|
+
void this.bootstrapApplication();
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Use the Cheetah plugin.
|
|
60
|
+
*
|
|
61
|
+
* @param plugin
|
|
62
|
+
*/
|
|
63
|
+
use(plugin) {
|
|
64
|
+
if (!this.config.providers) {
|
|
65
|
+
this.config.providers = [];
|
|
66
|
+
}
|
|
67
|
+
if (!this.config.globalMiddlewares) {
|
|
68
|
+
this.config.globalMiddlewares = [];
|
|
69
|
+
}
|
|
70
|
+
for (const exportProvider of plugin.config.exports || []) {
|
|
71
|
+
const existingProvider = this.findProviderInConfig(plugin, exportProvider);
|
|
72
|
+
const providerToAdd = this.shouldCloneProvider(existingProvider)
|
|
73
|
+
? this.cloneProvider(existingProvider)
|
|
74
|
+
: exportProvider;
|
|
75
|
+
this.config.providers.push(providerToAdd);
|
|
76
|
+
}
|
|
77
|
+
if (plugin.config.globalMiddlewares) {
|
|
78
|
+
this.config.globalMiddlewares.push(...plugin.config.globalMiddlewares);
|
|
79
|
+
}
|
|
80
|
+
return this;
|
|
81
|
+
}
|
|
82
|
+
findProviderInConfig(plugin, exportProvider) {
|
|
83
|
+
return plugin.config.providers?.find((p) => this.getProviderToken(p) === this.getProviderToken(exportProvider));
|
|
84
|
+
}
|
|
85
|
+
getProviderToken(provider) {
|
|
86
|
+
return provider?.provide || provider;
|
|
87
|
+
}
|
|
88
|
+
shouldCloneProvider(provider) {
|
|
89
|
+
return !!(provider?.useValue !== undefined || provider?.useClass);
|
|
90
|
+
}
|
|
91
|
+
cloneProvider(provider) {
|
|
92
|
+
return { ...provider };
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Set the custom logger provider.
|
|
96
|
+
* The provider must be a class with the @Service() decorator.
|
|
97
|
+
* The provider must extend the LoggerService class.
|
|
98
|
+
*
|
|
99
|
+
* @param provider
|
|
100
|
+
*/
|
|
101
|
+
useLogger(provider) {
|
|
102
|
+
(0, index_1.registerProvider)({ provide: logger_service_1.LoggerService, useClass: provider });
|
|
103
|
+
return this;
|
|
104
|
+
}
|
|
105
|
+
loadProvidersAndControllers() {
|
|
106
|
+
const providers = domain_1.Metadata.get(constants_1.PROVIDER, Reflect) || [];
|
|
107
|
+
const controllers = domain_1.Metadata.get(constants_1.CONTROLLER, Reflect) || [];
|
|
108
|
+
this.registerControllers(controllers);
|
|
109
|
+
this.registerMetadataProviders(providers);
|
|
110
|
+
this.registerConfigProviders();
|
|
111
|
+
}
|
|
112
|
+
registerControllers(controllers) {
|
|
113
|
+
for (const controller of controllers) {
|
|
114
|
+
(0, index_1.registerController)(controller);
|
|
115
|
+
controller.options?.children &&
|
|
116
|
+
controller.options.children.forEach((child) => {
|
|
117
|
+
(0, index_1.registerController)({ provide: child, parent: controller.provide });
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
registerMetadataProviders(providers) {
|
|
122
|
+
for (const provider of providers) {
|
|
123
|
+
(0, index_1.registerProvider)(provider);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
registerConfigProviders() {
|
|
127
|
+
if (!this.config.providers) {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
for (const provider of this.config.providers) {
|
|
131
|
+
const normalized = this.normalizeProvider(provider);
|
|
132
|
+
(0, index_1.registerProvider)(normalized);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
normalizeProvider(provider) {
|
|
136
|
+
if (provider?.provide) {
|
|
137
|
+
return provider;
|
|
138
|
+
}
|
|
139
|
+
return {
|
|
140
|
+
provide: provider,
|
|
141
|
+
useClass: provider,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
async init() {
|
|
145
|
+
this.loadProvidersAndControllers();
|
|
146
|
+
await this.injector.loadModule((0, createContainer_1.createContainer)(), this.config, this.router);
|
|
147
|
+
}
|
|
148
|
+
async listen(port = 3000) {
|
|
149
|
+
this.registerShutdownHandlers();
|
|
150
|
+
await this.init();
|
|
151
|
+
this.createHttpServer(port);
|
|
152
|
+
}
|
|
153
|
+
registerShutdownHandlers() {
|
|
154
|
+
const shutdown = async (signal) => {
|
|
155
|
+
console.log(`\nReceived ${signal}, starting graceful shutdown...`);
|
|
156
|
+
await this.handleShutdownHook();
|
|
157
|
+
};
|
|
158
|
+
node_process_1.default.on("SIGTERM", () => shutdown("SIGTERM"));
|
|
159
|
+
node_process_1.default.on("SIGINT", () => shutdown("SIGINT"));
|
|
160
|
+
}
|
|
161
|
+
getHttpServer() {
|
|
162
|
+
return this.server;
|
|
163
|
+
}
|
|
164
|
+
getInjector() {
|
|
165
|
+
return this.injector;
|
|
166
|
+
}
|
|
167
|
+
createHttpServer(port) {
|
|
168
|
+
this.server = Bun.serve({ port, fetch: this.fetch, error: this.catcher });
|
|
169
|
+
console.log(`Server running on port ${port}`);
|
|
170
|
+
}
|
|
171
|
+
async fetcher(request, server) {
|
|
172
|
+
if (this.isCorsEnabled()) {
|
|
173
|
+
const origin = request.headers.get("origin");
|
|
174
|
+
if (request.method === "OPTIONS" && origin) {
|
|
175
|
+
return this.handlePreflightRequest(request);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
const urlParsed = parseUrl(request);
|
|
179
|
+
const context = await Context_1.Context.createFromRequest(urlParsed, request, server);
|
|
180
|
+
await this.injector.callHook(on_event_1.EventType.OnRequest, { context });
|
|
181
|
+
const local = new LocalsContainer_1.LocalsContainer();
|
|
182
|
+
const routePath = this.discoverRoutePath(urlParsed);
|
|
183
|
+
const route = this.router.find(request.method.toLowerCase(), routePath);
|
|
184
|
+
if (!route) {
|
|
185
|
+
throw new HttpException_1.HttpException("Method not allowed", 404);
|
|
186
|
+
}
|
|
187
|
+
context.param = route.params;
|
|
188
|
+
local.set(Context_1.Context, context);
|
|
189
|
+
let response = await RouteExecutor_1.RouteExecutor.executeRoute(route.store, this.injector, context, local);
|
|
190
|
+
if (this.isCorsEnabled()) {
|
|
191
|
+
const origin = request.headers.get("origin");
|
|
192
|
+
if (origin && this.isOriginAllowed(origin)) {
|
|
193
|
+
response = this.applyCorsHeaders(response, origin);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return response;
|
|
197
|
+
}
|
|
198
|
+
async bootstrapApplication() {
|
|
199
|
+
try {
|
|
200
|
+
await this.injector.callHook(on_event_1.EventType.OnApplicationBoot, {});
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
this.reportHookFailure(on_event_1.EventType.OnApplicationBoot, error);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
async handleShutdownHook() {
|
|
207
|
+
try {
|
|
208
|
+
await this.injector.callHook(on_event_1.EventType.OnApplicationShutdown);
|
|
209
|
+
this.closeHttpServer();
|
|
210
|
+
this.exitProcess();
|
|
211
|
+
}
|
|
212
|
+
catch (error) {
|
|
213
|
+
this.reportHookFailure(on_event_1.EventType.OnApplicationShutdown, error);
|
|
214
|
+
this.exitProcess(1);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
closeHttpServer() {
|
|
218
|
+
if (this.server) {
|
|
219
|
+
console.log("Closing HTTP server...");
|
|
220
|
+
this.server.stop(true);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
exitProcess(code = 0) {
|
|
224
|
+
console.log("Shutdown complete.");
|
|
225
|
+
node_process_1.default.exit(code);
|
|
226
|
+
}
|
|
227
|
+
reportHookFailure(event, error) {
|
|
228
|
+
console.error(`Lifecycle hook ${event} failed`, error);
|
|
229
|
+
}
|
|
230
|
+
isCorsEnabled() {
|
|
231
|
+
return !!this.config.cors;
|
|
232
|
+
}
|
|
233
|
+
isOriginAllowed(origin) {
|
|
234
|
+
if (!origin || !this.config.cors) {
|
|
235
|
+
return false;
|
|
236
|
+
}
|
|
237
|
+
const { origins } = this.config.cors;
|
|
238
|
+
if (typeof origins === "string") {
|
|
239
|
+
return origins === "*" || origins === origin;
|
|
240
|
+
}
|
|
241
|
+
if (Array.isArray(origins)) {
|
|
242
|
+
return origins.includes(origin);
|
|
243
|
+
}
|
|
244
|
+
if (origins instanceof RegExp) {
|
|
245
|
+
return origins.test(origin);
|
|
246
|
+
}
|
|
247
|
+
if (typeof origins === "function") {
|
|
248
|
+
return origins(origin);
|
|
249
|
+
}
|
|
250
|
+
return false;
|
|
251
|
+
}
|
|
252
|
+
buildCorsHeaders(origin) {
|
|
253
|
+
const cors = this.config.cors;
|
|
254
|
+
const headers = {};
|
|
255
|
+
const allowedOrigin = typeof cors.origins === "string" && cors.origins === "*"
|
|
256
|
+
? "*"
|
|
257
|
+
: origin;
|
|
258
|
+
headers["Access-Control-Allow-Origin"] = allowedOrigin;
|
|
259
|
+
if (cors.credentials) {
|
|
260
|
+
headers["Access-Control-Allow-Credentials"] = "true";
|
|
261
|
+
}
|
|
262
|
+
const methods = cors.methods || cors_config_1.DEFAULT_CORS_METHODS;
|
|
263
|
+
headers["Access-Control-Allow-Methods"] = methods.join(", ");
|
|
264
|
+
const allowedHeaders = cors.allowedHeaders || cors_config_1.DEFAULT_CORS_ALLOWED_HEADERS;
|
|
265
|
+
headers["Access-Control-Allow-Headers"] = allowedHeaders.join(", ");
|
|
266
|
+
if (cors.exposedHeaders && cors.exposedHeaders.length > 0) {
|
|
267
|
+
headers["Access-Control-Expose-Headers"] = cors.exposedHeaders.join(", ");
|
|
268
|
+
}
|
|
269
|
+
if (cors.maxAge !== undefined) {
|
|
270
|
+
headers["Access-Control-Max-Age"] = cors.maxAge.toString();
|
|
271
|
+
}
|
|
272
|
+
return headers;
|
|
273
|
+
}
|
|
274
|
+
handlePreflightRequest(request) {
|
|
275
|
+
const origin = request.headers.get("origin");
|
|
276
|
+
if (!this.isOriginAllowed(origin)) {
|
|
277
|
+
return new Response(null, { status: 403 });
|
|
278
|
+
}
|
|
279
|
+
const corsHeaders = this.buildCorsHeaders(origin);
|
|
280
|
+
return new Response(null, {
|
|
281
|
+
status: 204,
|
|
282
|
+
headers: corsHeaders,
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
applyCorsHeaders(response, origin) {
|
|
286
|
+
const corsHeaders = this.buildCorsHeaders(origin);
|
|
287
|
+
const newHeaders = new Headers(response.headers);
|
|
288
|
+
for (const [key, value] of Object.entries(corsHeaders)) {
|
|
289
|
+
newHeaders.set(key, value);
|
|
290
|
+
}
|
|
291
|
+
return new Response(response.body, {
|
|
292
|
+
status: response.status,
|
|
293
|
+
statusText: response.statusText,
|
|
294
|
+
headers: newHeaders,
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
close(closeActiveConnections = false) {
|
|
298
|
+
this.server?.stop(closeActiveConnections);
|
|
299
|
+
}
|
|
300
|
+
discoverRoutePath(url) {
|
|
301
|
+
if (url?.pathname) {
|
|
302
|
+
return url.pathname;
|
|
303
|
+
}
|
|
304
|
+
return url?.path || "/";
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
exports.Cheetah = Cheetah;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { LoggerService } from '../services/logger.service';
|
|
2
|
+
import { CacheService } from './cache.service';
|
|
3
|
+
export declare class BentoCacheDriver extends CacheService {
|
|
4
|
+
private readonly logger;
|
|
5
|
+
private cache;
|
|
6
|
+
constructor(logger: LoggerService);
|
|
7
|
+
set(key: string, value: any, ttl?: number): Promise<boolean>;
|
|
8
|
+
get(key: string): Promise<any>;
|
|
9
|
+
del(key: string): Promise<boolean>;
|
|
10
|
+
has(key: string): Promise<boolean>;
|
|
11
|
+
clear(): Promise<void>;
|
|
12
|
+
getOrSet(key: string, cb: () => Promise<any>, ttl?: number): Promise<any>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.BentoCacheDriver = void 0;
|
|
13
|
+
const service_decorator_1 = require("../commons/decorators/service.decorator");
|
|
14
|
+
const logger_service_1 = require("../services/logger.service");
|
|
15
|
+
const cache_service_1 = require("./cache.service");
|
|
16
|
+
const bentocache_1 = require("bentocache");
|
|
17
|
+
// @ts-ignore
|
|
18
|
+
const memory_1 = require("bentocache/drivers/memory");
|
|
19
|
+
let BentoCacheDriver = class BentoCacheDriver extends cache_service_1.CacheService {
|
|
20
|
+
constructor(logger) {
|
|
21
|
+
super();
|
|
22
|
+
this.logger = logger;
|
|
23
|
+
this.cache = new bentocache_1.BentoCache({
|
|
24
|
+
//@ts-ignore
|
|
25
|
+
logger: this.logger.getLogger(),
|
|
26
|
+
default: 'defaultCache',
|
|
27
|
+
stores: {
|
|
28
|
+
defaultCache: (0, bentocache_1.bentostore)().useL1Layer(((0, memory_1.memoryDriver)({ maxSize: 10_000 }))), // TODO: Not default, custom with properties.
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
set(key, value, ttl) {
|
|
33
|
+
return this.cache.set({ key, value, ttl: ttl ?? '1h' });
|
|
34
|
+
}
|
|
35
|
+
get(key) {
|
|
36
|
+
return this.cache.get({ key });
|
|
37
|
+
}
|
|
38
|
+
del(key) {
|
|
39
|
+
return this.cache.delete({ key });
|
|
40
|
+
}
|
|
41
|
+
has(key) {
|
|
42
|
+
return this.cache.has({ key });
|
|
43
|
+
}
|
|
44
|
+
clear() {
|
|
45
|
+
return this.cache.clear();
|
|
46
|
+
}
|
|
47
|
+
getOrSet(key, cb, ttl) {
|
|
48
|
+
return this.cache.getOrSet({ key, factory: cb, ttl: ttl ?? '1h' });
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
exports.BentoCacheDriver = BentoCacheDriver;
|
|
52
|
+
exports.BentoCacheDriver = BentoCacheDriver = __decorate([
|
|
53
|
+
(0, service_decorator_1.Service)({ provide: cache_service_1.CacheService }),
|
|
54
|
+
__metadata("design:paramtypes", [logger_service_1.LoggerService])
|
|
55
|
+
], BentoCacheDriver);
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare abstract class CacheService {
|
|
2
|
+
abstract set(key: string, value: any, ttl?: number): Promise<boolean>;
|
|
3
|
+
abstract get(key: string): Promise<any>;
|
|
4
|
+
abstract del(key: string): Promise<boolean>;
|
|
5
|
+
abstract has(key: string): Promise<boolean>;
|
|
6
|
+
abstract clear(): Promise<void>;
|
|
7
|
+
abstract getOrSet<T>(key: string, cb: () => Promise<T>, ttl?: number): Promise<T>;
|
|
8
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Provider } from "../../domain/provider";
|
|
2
|
+
/**
|
|
3
|
+
* The decorators `@Injectable()` declare a new service can be injected in other service, controller, interceptor, etc.. on there `constructor`.
|
|
4
|
+
* All classes annotated with `@Injectable()` are built one time, excepted if you change the default provider configuration.
|
|
5
|
+
*
|
|
6
|
+
* ::: tip
|
|
7
|
+
* `@Injectable()` use the `reflect-metadata` to collect and inject the built provided to other services.
|
|
8
|
+
* :::
|
|
9
|
+
*
|
|
10
|
+
* ### Options
|
|
11
|
+
*
|
|
12
|
+
* - type (@@ProviderType@@ or `string`): Kind of provider. (Default: `ProviderType.PROVIDER`)
|
|
13
|
+
* - scope (@@ProviderScope@@): Kind of provider. (Default: `ProviderScope.SINGLETON`)
|
|
14
|
+
* - provide (@@TokenProvider@@): An injection token (Note: This option override default metadata generated by Typescript).
|
|
15
|
+
* - deps (`Type<any>`): List of class or provider which will be injected to the constructor (Note: This options override default metadata generated by Typescript).
|
|
16
|
+
*
|
|
17
|
+
* @returns {Function}
|
|
18
|
+
* @decorator
|
|
19
|
+
*/
|
|
20
|
+
export declare function Injectable(options?: Partial<Provider>): ClassDecorator;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Injectable = Injectable;
|
|
4
|
+
const Metadata_1 = require("../../domain/Metadata");
|
|
5
|
+
const constants_1 = require("../../constants");
|
|
6
|
+
/**
|
|
7
|
+
* The decorators `@Injectable()` declare a new service can be injected in other service, controller, interceptor, etc.. on there `constructor`.
|
|
8
|
+
* All classes annotated with `@Injectable()` are built one time, excepted if you change the default provider configuration.
|
|
9
|
+
*
|
|
10
|
+
* ::: tip
|
|
11
|
+
* `@Injectable()` use the `reflect-metadata` to collect and inject the built provided to other services.
|
|
12
|
+
* :::
|
|
13
|
+
*
|
|
14
|
+
* ### Options
|
|
15
|
+
*
|
|
16
|
+
* - type (@@ProviderType@@ or `string`): Kind of provider. (Default: `ProviderType.PROVIDER`)
|
|
17
|
+
* - scope (@@ProviderScope@@): Kind of provider. (Default: `ProviderScope.SINGLETON`)
|
|
18
|
+
* - provide (@@TokenProvider@@): An injection token (Note: This option override default metadata generated by Typescript).
|
|
19
|
+
* - deps (`Type<any>`): List of class or provider which will be injected to the constructor (Note: This options override default metadata generated by Typescript).
|
|
20
|
+
*
|
|
21
|
+
* @returns {Function}
|
|
22
|
+
* @decorator
|
|
23
|
+
*/
|
|
24
|
+
function Injectable(options = {}) {
|
|
25
|
+
return (target) => {
|
|
26
|
+
const providers = Metadata_1.Metadata.get(constants_1.PROVIDER, Reflect) || [];
|
|
27
|
+
providers.push({
|
|
28
|
+
...options,
|
|
29
|
+
...(options.provide ? { useClass: target } : { provide: target }),
|
|
30
|
+
});
|
|
31
|
+
Metadata_1.Metadata.set(constants_1.PROVIDER, providers, Reflect);
|
|
32
|
+
};
|
|
33
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ProviderScope } from "../../domain/provider-scope";
|
|
2
|
+
type ControllerOptions = {
|
|
3
|
+
path?: string;
|
|
4
|
+
scope?: ProviderScope;
|
|
5
|
+
children?: any[];
|
|
6
|
+
};
|
|
7
|
+
export declare function Controller(pathOrOptions?: string | ControllerOptions): ClassDecorator;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Controller = Controller;
|
|
4
|
+
const constants_1 = require("../../constants");
|
|
5
|
+
const Metadata_1 = require("../../domain/Metadata");
|
|
6
|
+
function normalizeOptions(pathOrOptions) {
|
|
7
|
+
if (!pathOrOptions) {
|
|
8
|
+
return {};
|
|
9
|
+
}
|
|
10
|
+
if (typeof pathOrOptions === 'string') {
|
|
11
|
+
return { path: pathOrOptions };
|
|
12
|
+
}
|
|
13
|
+
return pathOrOptions;
|
|
14
|
+
}
|
|
15
|
+
function Controller(pathOrOptions) {
|
|
16
|
+
return (target) => {
|
|
17
|
+
const options = normalizeOptions(pathOrOptions);
|
|
18
|
+
const controllers = Metadata_1.Metadata.get(constants_1.CONTROLLER, Reflect) || [];
|
|
19
|
+
controllers.push({ provide: target, ...options });
|
|
20
|
+
Metadata_1.Metadata.set(constants_1.CONTROLLER, controllers, Reflect);
|
|
21
|
+
};
|
|
22
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Context } from "../../domain/Context";
|
|
2
|
+
export declare function createParamDecorator(func: (context: Context, data?: any) => any): (data?: any) => ParameterDecorator;
|
|
3
|
+
export declare const Body: (data?: any) => ParameterDecorator;
|
|
4
|
+
export declare const Query: (data?: any) => ParameterDecorator;
|
|
5
|
+
export declare const Param: (data?: any) => ParameterDecorator;
|
|
6
|
+
export declare const Req: (data?: any) => ParameterDecorator;
|
|
7
|
+
export declare const Headers: (data?: any) => ParameterDecorator;
|
|
8
|
+
export declare const Locals: (data?: any) => ParameterDecorator;
|
|
9
|
+
export declare const Get: (path?: string) => MethodDecorator;
|
|
10
|
+
export declare const Post: (path?: string) => MethodDecorator;
|
|
11
|
+
export declare const Put: (path?: string) => MethodDecorator;
|
|
12
|
+
export declare const Delete: (path?: string) => MethodDecorator;
|
|
13
|
+
export declare const Patch: (path?: string) => MethodDecorator;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Patch = exports.Delete = exports.Put = exports.Post = exports.Get = exports.Locals = exports.Headers = exports.Req = exports.Param = exports.Query = exports.Body = void 0;
|
|
4
|
+
exports.createParamDecorator = createParamDecorator;
|
|
5
|
+
const Metadata_1 = require("../../domain/Metadata");
|
|
6
|
+
const constants_1 = require("../../constants");
|
|
7
|
+
const createMethodDecorator = (methodType) => {
|
|
8
|
+
return (path = "") => {
|
|
9
|
+
return (target, propertyKey) => {
|
|
10
|
+
const routes = [];
|
|
11
|
+
if (!path.startsWith("/")) {
|
|
12
|
+
path = `/${path}`;
|
|
13
|
+
}
|
|
14
|
+
if (Metadata_1.Metadata.has(constants_1.CONTROLLER_ROUTES, target)) {
|
|
15
|
+
routes.push(...Metadata_1.Metadata.get(constants_1.CONTROLLER_ROUTES, target));
|
|
16
|
+
}
|
|
17
|
+
routes.push({
|
|
18
|
+
method: methodType,
|
|
19
|
+
path,
|
|
20
|
+
methodName: propertyKey.toString(),
|
|
21
|
+
middlewares: [],
|
|
22
|
+
});
|
|
23
|
+
Metadata_1.Metadata.set(constants_1.CONTROLLER_ROUTES, routes, target);
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
function createParamDecorator(func) {
|
|
28
|
+
return (data) => (target, propertyKey, parameterIndex) => {
|
|
29
|
+
const existingArgs = Metadata_1.Metadata.get(constants_1.ROUTE_PARAM, target.constructor, propertyKey) || {};
|
|
30
|
+
existingArgs[parameterIndex] = { fun: func, param: data };
|
|
31
|
+
Metadata_1.Metadata.set(constants_1.ROUTE_PARAM, existingArgs, target.constructor, propertyKey);
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
exports.Body = createParamDecorator((context, data) => data ? context.body[data] : context.body || {});
|
|
35
|
+
exports.Query = createParamDecorator((context, data) => data ? context.query[data] : context.query || {});
|
|
36
|
+
exports.Param = createParamDecorator((context, data) => data ? context.param[data] : null);
|
|
37
|
+
exports.Req = createParamDecorator((context) => context.req);
|
|
38
|
+
exports.Headers = createParamDecorator((context, data) => data ? (context.headers.has(data) ? context.headers.get(data) : undefined) : context.headers || {});
|
|
39
|
+
exports.Locals = createParamDecorator((context) => context.locals || {});
|
|
40
|
+
exports.Get = createMethodDecorator("GET");
|
|
41
|
+
exports.Post = createMethodDecorator("POST");
|
|
42
|
+
exports.Put = createMethodDecorator("PUT");
|
|
43
|
+
exports.Delete = createMethodDecorator("DELETE");
|
|
44
|
+
exports.Patch = createMethodDecorator("PATCH");
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./controller.decorator"), exports);
|
|
18
|
+
__exportStar(require("./http.decorators"), exports);
|
|
19
|
+
__exportStar(require("./service.decorator"), exports);
|
|
20
|
+
__exportStar(require("./middleware.decorator"), exports);
|
|
21
|
+
__exportStar(require("./Injectable.decorator"), exports);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const Inject: (data?: any) => ParameterDecorator;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Middleware = Middleware;
|
|
4
|
+
const constants_1 = require("../../constants");
|
|
5
|
+
function Middleware(...middlewares) {
|
|
6
|
+
return (target, propertyKey) => {
|
|
7
|
+
let definedMiddlewares;
|
|
8
|
+
if (propertyKey)
|
|
9
|
+
definedMiddlewares = getMethodMiddlewares(target, propertyKey.toString());
|
|
10
|
+
else
|
|
11
|
+
definedMiddlewares = getControllerMiddlewares(target);
|
|
12
|
+
definedMiddlewares.push(...middlewares);
|
|
13
|
+
if (propertyKey)
|
|
14
|
+
setMethodMiddlewares(target, propertyKey.toString(), definedMiddlewares);
|
|
15
|
+
else
|
|
16
|
+
setControllerMiddlewares(target, definedMiddlewares);
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function getControllerMiddlewares(target) {
|
|
20
|
+
return Reflect.getMetadata(constants_1.CONTROLLER_MIDDLEWARES, target) || [];
|
|
21
|
+
}
|
|
22
|
+
function setControllerMiddlewares(target, middlewares) {
|
|
23
|
+
Reflect.defineMetadata(constants_1.CONTROLLER_MIDDLEWARES, middlewares, target);
|
|
24
|
+
}
|
|
25
|
+
function getMethodMiddlewares(target, methodName) {
|
|
26
|
+
return Reflect.getMetadata(constants_1.ROUTE_MIDDLEWARES, target.constructor, methodName) || [];
|
|
27
|
+
}
|
|
28
|
+
function setMethodMiddlewares(target, methodName, middlewares) {
|
|
29
|
+
Reflect.defineMetadata(constants_1.ROUTE_MIDDLEWARES, middlewares, target.constructor, methodName);
|
|
30
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Service = Service;
|
|
4
|
+
const Injectable_decorator_1 = require("./Injectable.decorator");
|
|
5
|
+
function Service(options = {}) {
|
|
6
|
+
return (0, Injectable_decorator_1.Injectable)(options);
|
|
7
|
+
}
|