@ooneex/app 1.7.7 → 1.7.9
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/dist/index.js +15 -15
- package/dist/index.js.map +4 -4
- package/package.json +28 -28
package/dist/index.js
CHANGED
|
@@ -89,20 +89,20 @@ var buildHttpContext = async (ctx) => {
|
|
|
89
89
|
form,
|
|
90
90
|
ip
|
|
91
91
|
});
|
|
92
|
-
const
|
|
92
|
+
const tryGetConstant = (key) => {
|
|
93
93
|
try {
|
|
94
|
-
return container.
|
|
94
|
+
return container.hasConstant(key) ? container.getConstant(key) : undefined;
|
|
95
95
|
} catch {
|
|
96
96
|
return;
|
|
97
97
|
}
|
|
98
98
|
};
|
|
99
99
|
const exceptionLogger = container.hasConstant("exception.logger") ? container.getConstant("exception.logger") : undefined;
|
|
100
|
-
const analytics =
|
|
101
|
-
const cache =
|
|
102
|
-
const storage =
|
|
103
|
-
const mailer =
|
|
104
|
-
const rateLimiter =
|
|
105
|
-
const database = container.
|
|
100
|
+
const analytics = tryGetConstant("analytics");
|
|
101
|
+
const cache = tryGetConstant("cache");
|
|
102
|
+
const storage = tryGetConstant("storage");
|
|
103
|
+
const mailer = tryGetConstant("mailer");
|
|
104
|
+
const rateLimiter = tryGetConstant("rateLimiter");
|
|
105
|
+
const database = container.getConstant("database");
|
|
106
106
|
const context = {
|
|
107
107
|
logger: container.getConstant("logger"),
|
|
108
108
|
...exceptionLogger && { exceptionLogger },
|
|
@@ -574,7 +574,7 @@ class App {
|
|
|
574
574
|
if (!container3.has(database)) {
|
|
575
575
|
container3.add(database);
|
|
576
576
|
}
|
|
577
|
-
container3.
|
|
577
|
+
container3.addConstant("database", container3.get(database));
|
|
578
578
|
if (onException) {
|
|
579
579
|
if (!container3.has(onException)) {
|
|
580
580
|
container3.add(onException);
|
|
@@ -585,31 +585,31 @@ class App {
|
|
|
585
585
|
if (!container3.has(analytics)) {
|
|
586
586
|
container3.add(analytics);
|
|
587
587
|
}
|
|
588
|
-
container3.
|
|
588
|
+
container3.addConstant("analytics", container3.get(analytics));
|
|
589
589
|
}
|
|
590
590
|
if (cache) {
|
|
591
591
|
if (!container3.has(cache)) {
|
|
592
592
|
container3.add(cache);
|
|
593
593
|
}
|
|
594
|
-
container3.
|
|
594
|
+
container3.addConstant("cache", container3.get(cache));
|
|
595
595
|
}
|
|
596
596
|
if (storage) {
|
|
597
597
|
if (!container3.has(storage)) {
|
|
598
598
|
container3.add(storage);
|
|
599
599
|
}
|
|
600
|
-
container3.
|
|
600
|
+
container3.addConstant("storage", container3.get(storage));
|
|
601
601
|
}
|
|
602
602
|
if (mailer) {
|
|
603
603
|
if (!container3.has(mailer)) {
|
|
604
604
|
container3.add(mailer);
|
|
605
605
|
}
|
|
606
|
-
container3.
|
|
606
|
+
container3.addConstant("mailer", container3.get(mailer));
|
|
607
607
|
}
|
|
608
608
|
if (rateLimiter) {
|
|
609
609
|
if (!container3.has(rateLimiter)) {
|
|
610
610
|
container3.add(rateLimiter);
|
|
611
611
|
}
|
|
612
|
-
container3.
|
|
612
|
+
container3.addConstant("rateLimiter", container3.get(rateLimiter));
|
|
613
613
|
}
|
|
614
614
|
cronJobs?.forEach((cronJob) => {
|
|
615
615
|
if (!container3.has(cronJob)) {
|
|
@@ -752,4 +752,4 @@ export {
|
|
|
752
752
|
App
|
|
753
753
|
};
|
|
754
754
|
|
|
755
|
-
//# debugId=
|
|
755
|
+
//# debugId=54EB453A8726E16D64756E2164756E21
|
package/dist/index.js.map
CHANGED
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["src/App.ts", "src/httpRouteUtils.ts", "src/logger.ts", "src/socketRouteUtils.ts", "src/generateRouteDoc.ts", "src/generateRouteType.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import { AppEnv, type IAppEnv } from \"@ooneex/app-env\";\nimport { container } from \"@ooneex/container\";\nimport type { ICron } from \"@ooneex/cron\";\nimport { Exception, type IException } from \"@ooneex/exception\";\nimport { HttpStatus } from \"@ooneex/http-status\";\nimport { type ILogger, type LogsEntity, TerminalLogger } from \"@ooneex/logger\";\nimport type { MiddlewareClassType, SocketMiddlewareClassType } from \"@ooneex/middleware\";\nimport type { IPubSub } from \"@ooneex/pub-sub\";\nimport { router } from \"@ooneex/routing\";\nimport type { ScalarType } from \"@ooneex/types\";\nimport { trim } from \"@ooneex/utils\";\nimport { AssertAppEnv, AssertHostname, AssertPort } from \"@ooneex/validation/constraints\";\nimport type { BunRequest, Server, ServerWebSocket } from \"bun\";\nimport { buildHttpContext, formatHttpRoutes, logRequest, type RouteInfoType, runMiddlewares } from \"./httpRouteUtils\";\nimport { logger as loggerFunc } from \"./logger\";\nimport { formatSocketRoutes, socketRouteHandler } from \"./socketRouteUtils\";\nimport type { AppConfigType } from \"./types\";\n\nexport class App {\n constructor(private readonly config: AppConfigType) {\n const { loggers, cronJobs, events, analytics, cache, database, storage, mailer, rateLimiter, onException } =\n this.config;\n\n if (!container.has(AppEnv)) {\n container.add(AppEnv);\n }\n\n loggers.forEach((log) => {\n if (!container.has(log)) {\n container.add(log);\n }\n const logger = container.get<ILogger<Record<string, ScalarType>> | ILogger<LogsEntity>>(log);\n logger.init();\n });\n container.addConstant(\"logger\", loggerFunc(loggers, container));\n\n if (!container.has(database)) {\n container.add(database);\n }\n container.
|
|
6
|
-
"import type { IAnalytics } from \"@ooneex/analytics\";\nimport { AppEnv, type EnvironmentNameType, type IAppEnv } from \"@ooneex/app-env\";\nimport type { ICache } from \"@ooneex/cache\";\nimport { container } from \"@ooneex/container\";\nimport type { ContextType } from \"@ooneex/controller\";\nimport type { IDatabase } from \"@ooneex/database\";\nimport { Exception } from \"@ooneex/exception\";\nimport { HttpRequest } from \"@ooneex/http-request\";\nimport { HttpResponse, type IResponse } from \"@ooneex/http-response\";\nimport { HttpStatus, type StatusCodeType } from \"@ooneex/http-status\";\nimport type { ILogger } from \"@ooneex/logger\";\nimport { LogsEntity } from \"@ooneex/logger\";\nimport type { IMailer } from \"@ooneex/mailer\";\nimport type { IMiddleware, MiddlewareClassType } from \"@ooneex/middleware\";\nimport type { IRateLimiter } from \"@ooneex/rate-limit\";\nimport { ERole, Role } from \"@ooneex/role\";\nimport type { RouteConfigType } from \"@ooneex/routing\";\nimport type { IStorage } from \"@ooneex/storage\";\nimport type { ScalarType } from \"@ooneex/types\";\nimport { type AssertType, type IAssert, type } from \"@ooneex/validation\";\nimport type { BunRequest, Server } from \"bun\";\n\nexport const checkAllowedUsers = (context: ContextType): RouteValidationError | null => {\n if (!context.user) {\n return null;\n }\n\n const systemUsers = context.env.SYSTEM_USERS;\n if (systemUsers?.includes(context.user.email)) {\n if (!context.user.roles.includes(ERole.SYSTEM)) {\n context.user.roles.push(ERole.SYSTEM);\n }\n }\n\n const superAdminUsers = context.env.SUPER_ADMIN_USERS;\n if (superAdminUsers?.includes(context.user.email)) {\n if (!context.user.roles.includes(ERole.SUPER_ADMIN)) {\n context.user.roles.push(ERole.SUPER_ADMIN);\n }\n }\n\n const adminUsers = context.env.ADMIN_USERS;\n if (adminUsers?.includes(context.user.email)) {\n if (!context.user.roles.includes(ERole.ADMIN)) {\n context.user.roles.push(ERole.ADMIN);\n }\n }\n\n const allowedUsersKey = `${context.env.APP_ENV.toUpperCase()}_ALLOWED_USERS` as keyof typeof context.env;\n const allowedUsers = context.env[allowedUsersKey] as string[] | undefined;\n\n if (allowedUsers && allowedUsers.length > 0 && !allowedUsers.includes(context.user.email)) {\n return {\n message: `User \"${context.user.email}\" is not allowed in \"${context.env.APP_ENV}\" environment`,\n status: HttpStatus.Code.Forbidden,\n key: \"USER_NOT_ALLOWED\",\n };\n }\n\n return null;\n};\n\ntype HttpRouteHandler = (req: BunRequest, server: Server<unknown>) => Promise<Response>;\ntype HttpMethodHandlers = Partial<Record<string, HttpRouteHandler | Response>>;\ntype HttpRoutesMap = Record<string, HttpMethodHandlers>;\n\nexport const validateConstraint = (constraint: AssertType | IAssert, value: unknown): string | null => {\n if (\n constraint !== null &&\n typeof constraint === \"object\" &&\n \"validate\" in constraint &&\n typeof constraint.validate === \"function\"\n ) {\n const result = constraint.validate(value);\n if (!result.isValid) {\n return result.message || \"Validation failed\";\n }\n } else if (typeof constraint === \"function\") {\n const result = constraint(value);\n if (result instanceof type.errors) {\n return result.summary;\n }\n }\n\n return null;\n};\n\nexport type RouteInfoType = Pick<RouteConfigType, \"name\" | \"path\" | \"method\" | \"version\" | \"description\">;\n\nexport const buildHttpContext = async (ctx: {\n req: BunRequest;\n server: Server<unknown>;\n route?: RouteInfoType;\n}): Promise<ContextType> => {\n const { req, server, route } = ctx;\n\n const address = server.requestIP(req);\n const ip = address?.address ?? \"unknown\";\n\n const response = new HttpResponse();\n\n let payload = {};\n let form: FormData | null = null;\n const contentType = req.headers.get(\"content-type\");\n if (contentType?.includes(\"application/json\")) {\n try {\n payload = await req.json();\n } catch (_e) {}\n } else {\n try {\n form = await req.formData();\n } catch (_e) {}\n }\n\n const request = new HttpRequest(req, {\n params: req.params,\n payload,\n form,\n ip,\n });\n\n const tryGet = <T>(key: string): T | undefined => {\n try {\n return container.get<T>(key);\n } catch {\n return undefined;\n }\n };\n\n const exceptionLogger = container.hasConstant(\"exception.logger\")\n ? container.getConstant<ILogger>(\"exception.logger\")\n : undefined;\n const analytics = tryGet<IAnalytics>(\"analytics\");\n const cache = tryGet<ICache>(\"cache\");\n const storage = tryGet<IStorage>(\"storage\");\n const mailer = tryGet<IMailer>(\"mailer\");\n const rateLimiter = tryGet<IRateLimiter>(\"rateLimiter\");\n const database: IDatabase = container.get(\"database\");\n\n const context: ContextType = {\n logger: container.getConstant(\"logger\"),\n ...(exceptionLogger && { exceptionLogger }),\n ...(analytics && { analytics }),\n ...(cache && { cache }),\n ...(storage && { storage }),\n ...(mailer && { mailer }),\n ...(rateLimiter && { rateLimiter }),\n database,\n route: route\n ? {\n name: route.name,\n path: route.path,\n method: route.method,\n version: route.version,\n description: route.description ?? \"\",\n }\n : null,\n env: container.get<IAppEnv>(AppEnv),\n response,\n request,\n params: request.params,\n payload: request.payload,\n queries: request.queries,\n method: request.method,\n header: request.header,\n files: request.files,\n ip: request.ip,\n host: request.host,\n lang: request.lang,\n user: null,\n };\n\n return context;\n};\n\ntype ControllerError = { message: string; status: StatusCodeType; key?: string | null };\ntype RouteValidationError = { message: string; status: StatusCodeType; key?: string | null };\n\nexport const validateRouteAccess = async (\n context: ContextType,\n route: RouteConfigType,\n currentEnv: EnvironmentNameType,\n): Promise<RouteValidationError | null> => {\n // Check params\n if (route.params) {\n for (const [paramName, constraint] of Object.entries(route.params)) {\n const error = validateConstraint(constraint, context.params?.[paramName]);\n if (error) {\n return {\n message: `Invalid parameter \"${paramName}\": ${error}`,\n status: HttpStatus.Code.BadRequest,\n key: \"INVALID_PARAMETER\",\n };\n }\n }\n }\n\n // Check queries\n if (route.queries) {\n const error = validateConstraint(route.queries, context.queries);\n if (error) {\n return {\n message: `Invalid query parameters: ${error}`,\n status: HttpStatus.Code.BadRequest,\n key: \"INVALID_QUERY\",\n };\n }\n }\n\n // Check payload\n if (route.payload) {\n const error = validateConstraint(route.payload, context.payload);\n if (error) {\n return {\n message: `Invalid payload: ${error}`,\n status: HttpStatus.Code.BadRequest,\n key: \"INVALID_PAYLOAD\",\n };\n }\n }\n\n // Check env\n if (route.env && route.env.length > 0 && !route.env.includes(currentEnv)) {\n return {\n message: `Route \"${route.name}\" is not available in \"${currentEnv}\" environment`,\n status: HttpStatus.Code.NotAcceptable,\n key: \"ROUTE_ENV_NOT_ALLOWED\",\n };\n }\n\n // Check ip\n if (route.ip && route.ip.length > 0 && (!context.ip || !route.ip.includes(context.ip))) {\n return {\n message: `Route \"${route.name}\" is not available for IP \"${context.ip}\"`,\n status: HttpStatus.Code.NotAcceptable,\n key: \"ROUTE_IP_NOT_ALLOWED\",\n };\n }\n\n // Check host\n if (route.host && route.host.length > 0 && !route.host.includes(context.host)) {\n return {\n message: `Route \"${route.name}\" is not available for host \"${context.host}\"`,\n status: HttpStatus.Code.NotAcceptable,\n key: \"ROUTE_HOST_NOT_ALLOWED\",\n };\n }\n\n // Check roles\n if (route.roles && route.roles.length > 0) {\n if (!context.user || !context.user.roles || context.user.roles.length === 0) {\n return {\n message: `Route \"${route.name}\" requires authentication`,\n status: HttpStatus.Code.Forbidden,\n key: \"AUTHENTICATION_REQUIRED\",\n };\n }\n\n const role = new Role();\n const hasRequiredRole = route.roles.some((requiredRole) =>\n context.user?.roles.some((userRole) => role.hasRole(userRole, requiredRole)),\n );\n\n if (!hasRequiredRole) {\n return {\n message: `Route \"${route.name}\" is not accessible for user roles`,\n status: HttpStatus.Code.NotAcceptable,\n key: \"ROLE_NOT_ALLOWED\",\n };\n }\n }\n\n return null;\n};\n\nexport const validateResponse = (route: RouteConfigType, data: unknown): RouteValidationError | null => {\n if (route.response) {\n const error = validateConstraint(route.response, data);\n if (error) {\n return {\n message: `Invalid response: ${error}`,\n status: HttpStatus.Code.NotAcceptable,\n key: \"INVALID_RESPONSE\",\n };\n }\n }\n return null;\n};\n\nconst buildExceptionResponse = (\n context: ContextType,\n message: string,\n status: StatusCodeType,\n env: EnvironmentNameType,\n key?: string | null,\n): Response => {\n return context.response.exception(message, { status, ...(key ? { key } : {}) }).get(env);\n};\n\nexport const logRequest = (context: ContextType): void => {\n const path = context.route?.path || \"\";\n const logger = context.logger as {\n success: (message: string, data?: LogsEntity) => void;\n info: (message: string, data?: LogsEntity) => void;\n warn: (message: string, data?: LogsEntity) => void;\n error: (message: string, data?: LogsEntity) => void;\n };\n\n if (!logger) {\n return;\n }\n\n const status = context.response.getStatus();\n const logData = new LogsEntity();\n logData.date = new Date();\n logData.status = status;\n logData.method = context.method;\n logData.path = path;\n if (context.route?.version) logData.version = context.route.version;\n logData.params = context.params as Record<string, ScalarType>;\n logData.payload = context.payload as Record<string, unknown>;\n logData.queries = context.queries as Record<string, ScalarType>;\n\n if (context.ip) logData.ip = context.ip;\n\n const userAgent = context.header.get(\"User-Agent\");\n if (userAgent) logData.userAgent = userAgent;\n\n const referer = context.header.getReferer();\n if (referer) logData.referer = referer;\n\n if (context.user?.id) logData.userId = context.user.id;\n if (context.user?.email) logData.email = context.user.email;\n if (context.user?.lastName) logData.lastName = context.user.lastName;\n if (context.user?.firstName) logData.firstName = context.user.firstName;\n\n const message = `${context.method} ${path}`;\n\n if (status >= 500) {\n logger.error(message, logData);\n } else if (status >= 400) {\n logger.warn(message, logData);\n } else if (status >= 300) {\n logger.info(message, logData);\n } else {\n logger.success(message, logData);\n }\n};\n\nconst executeController = async (\n controller: { index: (context: ContextType) => Promise<IResponse> | IResponse },\n context: ContextType,\n): Promise<[IResponse, null] | [null, ControllerError]> => {\n try {\n const response = await controller.index(context);\n return [response, null];\n } catch (error: unknown) {\n if (error instanceof Exception) {\n return [null, { message: error.message, status: error.status as StatusCodeType, key: error.key }];\n }\n if (error instanceof Error) {\n return [null, { message: error.message, status: HttpStatus.Code.InternalServerError, key: \"INTERNAL_ERROR\" }];\n }\n return [\n null,\n { message: \"An unknown error occurred\", status: HttpStatus.Code.InternalServerError, key: \"UNKNOWN_ERROR\" },\n ];\n }\n};\n\ntype HttpRouteHandlerOptions = {\n context: ContextType;\n route: RouteConfigType;\n};\n\nexport const httpRouteHandler = async ({ context, route }: HttpRouteHandlerOptions): Promise<Response> => {\n const currentEnv = context.env.APP_ENV;\n\n const validationError = await validateRouteAccess(context, route, currentEnv);\n if (validationError) {\n const httpResponse = buildExceptionResponse(\n context,\n validationError.message,\n validationError.status,\n currentEnv,\n validationError.key,\n );\n logRequest(context);\n return httpResponse;\n }\n\n const controller = container.get(route.controller);\n\n const [response, controllerError] = await executeController(controller, context);\n if (controllerError) {\n const httpResponse = buildExceptionResponse(\n context,\n controllerError.message,\n controllerError.status,\n currentEnv,\n controllerError.key,\n );\n logRequest(context);\n return httpResponse;\n }\n\n const responseValidationError = validateResponse(route, response.getData());\n if (responseValidationError) {\n const httpResponse = buildExceptionResponse(\n context,\n responseValidationError.message,\n responseValidationError.status,\n currentEnv,\n responseValidationError.key,\n );\n logRequest(context);\n return httpResponse;\n }\n\n const httpResponse = response.get(currentEnv);\n logRequest(context);\n\n return httpResponse;\n};\n\nexport const runMiddlewares = async (\n context: ContextType,\n middlewares: MiddlewareClassType[],\n): Promise<ContextType> => {\n let currentContext = context;\n\n for (const MiddlewareClass of middlewares) {\n const middleware = container.get<IMiddleware>(MiddlewareClass);\n currentContext = await middleware.handler(currentContext);\n }\n\n return currentContext;\n};\n\nexport const formatHttpRoutes = (\n httpRoutes: Map<string, RouteConfigType[]>,\n middlewares: MiddlewareClassType[] = [],\n prefix?: string,\n): HttpRoutesMap => {\n const routes: HttpRoutesMap = {};\n\n for (const [path, routeConfigs] of httpRoutes) {\n for (const route of routeConfigs) {\n const versionedPath = `/${prefix ? `${prefix}/` : \"\"}v${route.version}${path}`;\n\n routes[versionedPath] ??= {};\n const methodHandlers = routes[versionedPath];\n\n methodHandlers[route.method] = async (req: BunRequest, server: Server<unknown>) => {\n let context = await buildHttpContext({ req, server, route });\n\n try {\n context = await runMiddlewares(context, middlewares);\n } catch (error: unknown) {\n const env: EnvironmentNameType = context.env.APP_ENV;\n const status = (\n error instanceof Exception ? error.status : HttpStatus.Code.InternalServerError\n ) as StatusCodeType;\n const key = error instanceof Exception ? error.key : null;\n const httpResponse = buildExceptionResponse(context, (error as Error).message, status, env, key);\n logRequest(context);\n return httpResponse;\n }\n\n // Check allowed users\n const allowedUsersError = checkAllowedUsers(context);\n if (allowedUsersError) {\n const httpResponse = buildExceptionResponse(\n context,\n allowedUsersError.message,\n allowedUsersError.status,\n context.env.APP_ENV,\n allowedUsersError.key,\n );\n logRequest(context);\n return httpResponse;\n }\n\n if (route.permission) {\n const permission = container.get(route.permission);\n context.permission = permission.allow().setUserPermissions(context.user).build();\n }\n\n return httpRouteHandler({ context, route });\n };\n }\n }\n\n return routes;\n};\n",
|
|
5
|
+
"import { AppEnv, type IAppEnv } from \"@ooneex/app-env\";\nimport { container } from \"@ooneex/container\";\nimport type { ICron } from \"@ooneex/cron\";\nimport { Exception, type IException } from \"@ooneex/exception\";\nimport { HttpStatus } from \"@ooneex/http-status\";\nimport { type ILogger, type LogsEntity, TerminalLogger } from \"@ooneex/logger\";\nimport type { MiddlewareClassType, SocketMiddlewareClassType } from \"@ooneex/middleware\";\nimport type { IPubSub } from \"@ooneex/pub-sub\";\nimport { router } from \"@ooneex/routing\";\nimport type { ScalarType } from \"@ooneex/types\";\nimport { trim } from \"@ooneex/utils\";\nimport { AssertAppEnv, AssertHostname, AssertPort } from \"@ooneex/validation/constraints\";\nimport type { BunRequest, Server, ServerWebSocket } from \"bun\";\nimport { buildHttpContext, formatHttpRoutes, logRequest, type RouteInfoType, runMiddlewares } from \"./httpRouteUtils\";\nimport { logger as loggerFunc } from \"./logger\";\nimport { formatSocketRoutes, socketRouteHandler } from \"./socketRouteUtils\";\nimport type { AppConfigType } from \"./types\";\n\nexport class App {\n constructor(private readonly config: AppConfigType) {\n const { loggers, cronJobs, events, analytics, cache, database, storage, mailer, rateLimiter, onException } =\n this.config;\n\n if (!container.has(AppEnv)) {\n container.add(AppEnv);\n }\n\n loggers.forEach((log) => {\n if (!container.has(log)) {\n container.add(log);\n }\n const logger = container.get<ILogger<Record<string, ScalarType>> | ILogger<LogsEntity>>(log);\n logger.init();\n });\n container.addConstant(\"logger\", loggerFunc(loggers, container));\n\n if (!container.has(database)) {\n container.add(database);\n }\n container.addConstant(\"database\", container.get(database));\n\n if (onException) {\n if (!container.has(onException)) {\n container.add(onException);\n }\n container.addConstant(\"exception.logger\", onException);\n }\n\n if (analytics) {\n if (!container.has(analytics)) {\n container.add(analytics);\n }\n container.addConstant(\"analytics\", container.get(analytics));\n }\n\n if (cache) {\n if (!container.has(cache)) {\n container.add(cache);\n }\n container.addConstant(\"cache\", container.get(cache));\n }\n\n if (storage) {\n if (!container.has(storage)) {\n container.add(storage);\n }\n container.addConstant(\"storage\", container.get(storage));\n }\n\n if (mailer) {\n if (!container.has(mailer)) {\n container.add(mailer);\n }\n container.addConstant(\"mailer\", container.get(mailer));\n }\n\n if (rateLimiter) {\n if (!container.has(rateLimiter)) {\n container.add(rateLimiter);\n }\n container.addConstant(\"rateLimiter\", container.get(rateLimiter));\n }\n\n cronJobs?.forEach((cronJob) => {\n if (!container.has(cronJob)) {\n container.add(cronJob);\n }\n const cron = container.get<ICron>(cronJob);\n cron.start();\n });\n\n events?.forEach((event) => {\n if (!container.has(event)) {\n container.add(event);\n }\n const e = container.get<IPubSub>(event);\n e.subscribe();\n });\n }\n\n public async init(): Promise<App> {\n const env = container.get<IAppEnv>(AppEnv);\n\n const appEnvValidator = new AssertAppEnv();\n const appEnvResult = appEnvValidator.validate(env.APP_ENV);\n if (!appEnvResult.isValid) {\n throw new Exception(`Invalid APP_ENV: ${appEnvResult.message}`, {\n key: \"INVALID_APP_ENV\",\n status: HttpStatus.Code.InternalServerError,\n data: { appEnv: env.APP_ENV },\n });\n }\n\n const portValidator = new AssertPort();\n const portResult = portValidator.validate(env.PORT);\n if (!portResult.isValid) {\n throw new Exception(`Invalid PORT: ${portResult.message}`, {\n key: \"INVALID_PORT\",\n status: HttpStatus.Code.InternalServerError,\n data: { port: env.PORT },\n });\n }\n\n const hostnameValidator = new AssertHostname();\n const hostnameResult = hostnameValidator.validate(env.HOST_NAME);\n if (!hostnameResult.isValid) {\n throw new Exception(`Invalid HOST_NAME: ${hostnameResult.message}`, {\n key: \"INVALID_HOST_NAME\",\n status: HttpStatus.Code.InternalServerError,\n data: { hostname: env.HOST_NAME },\n });\n }\n\n return this;\n }\n\n public async run(): Promise<App> {\n const logger = new TerminalLogger();\n\n try {\n await this.init();\n } catch (error: unknown) {\n logger.error(error as IException);\n process.exit(1);\n }\n\n const env = container.get<IAppEnv>(AppEnv);\n let hostname = env.HOST_NAME;\n\n const { middlewares = [], routing } = this.config;\n const prefix = trim(routing.prefix, \"/\");\n\n const routes = {\n ...formatHttpRoutes(router.getHttpRoutes(), middlewares as MiddlewareClassType[], prefix),\n ...formatSocketRoutes(router.getSocketRoutes(), prefix),\n };\n\n const port = env.PORT;\n\n const server = Bun.serve({\n port,\n hostname,\n development: env.isLocal,\n routes: {\n ...routes,\n \"/*\": async (req: BunRequest, server: Server<unknown>) => {\n const url = new URL(req.url);\n const route = {\n name: \"\",\n path: url.pathname as `/${string}`,\n method: req.method as RouteInfoType[\"method\"],\n version: 0,\n description: \"Not Found\",\n };\n let context = await buildHttpContext({ req, server, route });\n context.response.notFound(\"Not Found\");\n\n if (this.config.cors) {\n context = await runMiddlewares(context, [this.config.cors]);\n }\n\n logRequest(context);\n\n return context.response.get(context.env.APP_ENV);\n },\n },\n websocket: {\n perMessageDeflate: true,\n async message(ws: ServerWebSocket<{ id: string }>, message: string) {\n await socketRouteHandler({\n message,\n ws,\n server,\n middlewares: middlewares as SocketMiddlewareClassType[],\n });\n },\n async close(ws: ServerWebSocket<{ id: string }>) {\n container.removeConstant(ws.data.id);\n },\n },\n });\n\n hostname = server.hostname || \"0.0.0.0\";\n\n if (hostname === \"0.0.0.0\") {\n hostname = \"localhost\";\n }\n\n const baseUrl = `${server.protocol}://${hostname}:${server.port}`;\n logger.info(`Server running at ${baseUrl}`);\n\n return this;\n }\n}\n",
|
|
6
|
+
"import type { IAnalytics } from \"@ooneex/analytics\";\nimport { AppEnv, type EnvironmentNameType, type IAppEnv } from \"@ooneex/app-env\";\nimport type { ICache } from \"@ooneex/cache\";\nimport { container } from \"@ooneex/container\";\nimport type { ContextType } from \"@ooneex/controller\";\nimport type { IDatabase } from \"@ooneex/database\";\nimport { Exception } from \"@ooneex/exception\";\nimport { HttpRequest } from \"@ooneex/http-request\";\nimport { HttpResponse, type IResponse } from \"@ooneex/http-response\";\nimport { HttpStatus, type StatusCodeType } from \"@ooneex/http-status\";\nimport type { ILogger } from \"@ooneex/logger\";\nimport { LogsEntity } from \"@ooneex/logger\";\nimport type { IMailer } from \"@ooneex/mailer\";\nimport type { IMiddleware, MiddlewareClassType } from \"@ooneex/middleware\";\nimport type { IRateLimiter } from \"@ooneex/rate-limit\";\nimport { ERole, Role } from \"@ooneex/role\";\nimport type { RouteConfigType } from \"@ooneex/routing\";\nimport type { IStorage } from \"@ooneex/storage\";\nimport type { ScalarType } from \"@ooneex/types\";\nimport { type AssertType, type IAssert, type } from \"@ooneex/validation\";\nimport type { BunRequest, Server } from \"bun\";\n\nexport const checkAllowedUsers = (context: ContextType): RouteValidationError | null => {\n if (!context.user) {\n return null;\n }\n\n const systemUsers = context.env.SYSTEM_USERS;\n if (systemUsers?.includes(context.user.email)) {\n if (!context.user.roles.includes(ERole.SYSTEM)) {\n context.user.roles.push(ERole.SYSTEM);\n }\n }\n\n const superAdminUsers = context.env.SUPER_ADMIN_USERS;\n if (superAdminUsers?.includes(context.user.email)) {\n if (!context.user.roles.includes(ERole.SUPER_ADMIN)) {\n context.user.roles.push(ERole.SUPER_ADMIN);\n }\n }\n\n const adminUsers = context.env.ADMIN_USERS;\n if (adminUsers?.includes(context.user.email)) {\n if (!context.user.roles.includes(ERole.ADMIN)) {\n context.user.roles.push(ERole.ADMIN);\n }\n }\n\n const allowedUsersKey = `${context.env.APP_ENV.toUpperCase()}_ALLOWED_USERS` as keyof typeof context.env;\n const allowedUsers = context.env[allowedUsersKey] as string[] | undefined;\n\n if (allowedUsers && allowedUsers.length > 0 && !allowedUsers.includes(context.user.email)) {\n return {\n message: `User \"${context.user.email}\" is not allowed in \"${context.env.APP_ENV}\" environment`,\n status: HttpStatus.Code.Forbidden,\n key: \"USER_NOT_ALLOWED\",\n };\n }\n\n return null;\n};\n\ntype HttpRouteHandler = (req: BunRequest, server: Server<unknown>) => Promise<Response>;\ntype HttpMethodHandlers = Partial<Record<string, HttpRouteHandler | Response>>;\ntype HttpRoutesMap = Record<string, HttpMethodHandlers>;\n\nexport const validateConstraint = (constraint: AssertType | IAssert, value: unknown): string | null => {\n if (\n constraint !== null &&\n typeof constraint === \"object\" &&\n \"validate\" in constraint &&\n typeof constraint.validate === \"function\"\n ) {\n const result = constraint.validate(value);\n if (!result.isValid) {\n return result.message || \"Validation failed\";\n }\n } else if (typeof constraint === \"function\") {\n const result = constraint(value);\n if (result instanceof type.errors) {\n return result.summary;\n }\n }\n\n return null;\n};\n\nexport type RouteInfoType = Pick<RouteConfigType, \"name\" | \"path\" | \"method\" | \"version\" | \"description\">;\n\nexport const buildHttpContext = async (ctx: {\n req: BunRequest;\n server: Server<unknown>;\n route?: RouteInfoType;\n}): Promise<ContextType> => {\n const { req, server, route } = ctx;\n\n const address = server.requestIP(req);\n const ip = address?.address ?? \"unknown\";\n\n const response = new HttpResponse();\n\n let payload = {};\n let form: FormData | null = null;\n const contentType = req.headers.get(\"content-type\");\n if (contentType?.includes(\"application/json\")) {\n try {\n payload = await req.json();\n } catch (_e) {}\n } else {\n try {\n form = await req.formData();\n } catch (_e) {}\n }\n\n const request = new HttpRequest(req, {\n params: req.params,\n payload,\n form,\n ip,\n });\n\n const tryGetConstant = <T>(key: string): T | undefined => {\n try {\n return container.hasConstant(key) ? container.getConstant<T>(key) : undefined;\n } catch {\n return undefined;\n }\n };\n\n const exceptionLogger = container.hasConstant(\"exception.logger\")\n ? container.getConstant<ILogger>(\"exception.logger\")\n : undefined;\n const analytics = tryGetConstant<IAnalytics>(\"analytics\");\n const cache = tryGetConstant<ICache>(\"cache\");\n const storage = tryGetConstant<IStorage>(\"storage\");\n const mailer = tryGetConstant<IMailer>(\"mailer\");\n const rateLimiter = tryGetConstant<IRateLimiter>(\"rateLimiter\");\n const database: IDatabase = container.getConstant(\"database\");\n\n const context: ContextType = {\n logger: container.getConstant(\"logger\"),\n ...(exceptionLogger && { exceptionLogger }),\n ...(analytics && { analytics }),\n ...(cache && { cache }),\n ...(storage && { storage }),\n ...(mailer && { mailer }),\n ...(rateLimiter && { rateLimiter }),\n database,\n route: route\n ? {\n name: route.name,\n path: route.path,\n method: route.method,\n version: route.version,\n description: route.description ?? \"\",\n }\n : null,\n env: container.get<IAppEnv>(AppEnv),\n response,\n request,\n params: request.params,\n payload: request.payload,\n queries: request.queries,\n method: request.method,\n header: request.header,\n files: request.files,\n ip: request.ip,\n host: request.host,\n lang: request.lang,\n user: null,\n };\n\n return context;\n};\n\ntype ControllerError = { message: string; status: StatusCodeType; key?: string | null };\ntype RouteValidationError = { message: string; status: StatusCodeType; key?: string | null };\n\nexport const validateRouteAccess = async (\n context: ContextType,\n route: RouteConfigType,\n currentEnv: EnvironmentNameType,\n): Promise<RouteValidationError | null> => {\n // Check params\n if (route.params) {\n for (const [paramName, constraint] of Object.entries(route.params)) {\n const error = validateConstraint(constraint, context.params?.[paramName]);\n if (error) {\n return {\n message: `Invalid parameter \"${paramName}\": ${error}`,\n status: HttpStatus.Code.BadRequest,\n key: \"INVALID_PARAMETER\",\n };\n }\n }\n }\n\n // Check queries\n if (route.queries) {\n const error = validateConstraint(route.queries, context.queries);\n if (error) {\n return {\n message: `Invalid query parameters: ${error}`,\n status: HttpStatus.Code.BadRequest,\n key: \"INVALID_QUERY\",\n };\n }\n }\n\n // Check payload\n if (route.payload) {\n const error = validateConstraint(route.payload, context.payload);\n if (error) {\n return {\n message: `Invalid payload: ${error}`,\n status: HttpStatus.Code.BadRequest,\n key: \"INVALID_PAYLOAD\",\n };\n }\n }\n\n // Check env\n if (route.env && route.env.length > 0 && !route.env.includes(currentEnv)) {\n return {\n message: `Route \"${route.name}\" is not available in \"${currentEnv}\" environment`,\n status: HttpStatus.Code.NotAcceptable,\n key: \"ROUTE_ENV_NOT_ALLOWED\",\n };\n }\n\n // Check ip\n if (route.ip && route.ip.length > 0 && (!context.ip || !route.ip.includes(context.ip))) {\n return {\n message: `Route \"${route.name}\" is not available for IP \"${context.ip}\"`,\n status: HttpStatus.Code.NotAcceptable,\n key: \"ROUTE_IP_NOT_ALLOWED\",\n };\n }\n\n // Check host\n if (route.host && route.host.length > 0 && !route.host.includes(context.host)) {\n return {\n message: `Route \"${route.name}\" is not available for host \"${context.host}\"`,\n status: HttpStatus.Code.NotAcceptable,\n key: \"ROUTE_HOST_NOT_ALLOWED\",\n };\n }\n\n // Check roles\n if (route.roles && route.roles.length > 0) {\n if (!context.user || !context.user.roles || context.user.roles.length === 0) {\n return {\n message: `Route \"${route.name}\" requires authentication`,\n status: HttpStatus.Code.Forbidden,\n key: \"AUTHENTICATION_REQUIRED\",\n };\n }\n\n const role = new Role();\n const hasRequiredRole = route.roles.some((requiredRole) =>\n context.user?.roles.some((userRole) => role.hasRole(userRole, requiredRole)),\n );\n\n if (!hasRequiredRole) {\n return {\n message: `Route \"${route.name}\" is not accessible for user roles`,\n status: HttpStatus.Code.NotAcceptable,\n key: \"ROLE_NOT_ALLOWED\",\n };\n }\n }\n\n return null;\n};\n\nexport const validateResponse = (route: RouteConfigType, data: unknown): RouteValidationError | null => {\n if (route.response) {\n const error = validateConstraint(route.response, data);\n if (error) {\n return {\n message: `Invalid response: ${error}`,\n status: HttpStatus.Code.NotAcceptable,\n key: \"INVALID_RESPONSE\",\n };\n }\n }\n return null;\n};\n\nconst buildExceptionResponse = (\n context: ContextType,\n message: string,\n status: StatusCodeType,\n env: EnvironmentNameType,\n key?: string | null,\n): Response => {\n return context.response.exception(message, { status, ...(key ? { key } : {}) }).get(env);\n};\n\nexport const logRequest = (context: ContextType): void => {\n const path = context.route?.path || \"\";\n const logger = context.logger as {\n success: (message: string, data?: LogsEntity) => void;\n info: (message: string, data?: LogsEntity) => void;\n warn: (message: string, data?: LogsEntity) => void;\n error: (message: string, data?: LogsEntity) => void;\n };\n\n if (!logger) {\n return;\n }\n\n const status = context.response.getStatus();\n const logData = new LogsEntity();\n logData.date = new Date();\n logData.status = status;\n logData.method = context.method;\n logData.path = path;\n if (context.route?.version) logData.version = context.route.version;\n logData.params = context.params as Record<string, ScalarType>;\n logData.payload = context.payload as Record<string, unknown>;\n logData.queries = context.queries as Record<string, ScalarType>;\n\n if (context.ip) logData.ip = context.ip;\n\n const userAgent = context.header.get(\"User-Agent\");\n if (userAgent) logData.userAgent = userAgent;\n\n const referer = context.header.getReferer();\n if (referer) logData.referer = referer;\n\n if (context.user?.id) logData.userId = context.user.id;\n if (context.user?.email) logData.email = context.user.email;\n if (context.user?.lastName) logData.lastName = context.user.lastName;\n if (context.user?.firstName) logData.firstName = context.user.firstName;\n\n const message = `${context.method} ${path}`;\n\n if (status >= 500) {\n logger.error(message, logData);\n } else if (status >= 400) {\n logger.warn(message, logData);\n } else if (status >= 300) {\n logger.info(message, logData);\n } else {\n logger.success(message, logData);\n }\n};\n\nconst executeController = async (\n controller: { index: (context: ContextType) => Promise<IResponse> | IResponse },\n context: ContextType,\n): Promise<[IResponse, null] | [null, ControllerError]> => {\n try {\n const response = await controller.index(context);\n return [response, null];\n } catch (error: unknown) {\n if (error instanceof Exception) {\n return [null, { message: error.message, status: error.status as StatusCodeType, key: error.key }];\n }\n if (error instanceof Error) {\n return [null, { message: error.message, status: HttpStatus.Code.InternalServerError, key: \"INTERNAL_ERROR\" }];\n }\n return [\n null,\n { message: \"An unknown error occurred\", status: HttpStatus.Code.InternalServerError, key: \"UNKNOWN_ERROR\" },\n ];\n }\n};\n\ntype HttpRouteHandlerOptions = {\n context: ContextType;\n route: RouteConfigType;\n};\n\nexport const httpRouteHandler = async ({ context, route }: HttpRouteHandlerOptions): Promise<Response> => {\n const currentEnv = context.env.APP_ENV;\n\n const validationError = await validateRouteAccess(context, route, currentEnv);\n if (validationError) {\n const httpResponse = buildExceptionResponse(\n context,\n validationError.message,\n validationError.status,\n currentEnv,\n validationError.key,\n );\n logRequest(context);\n return httpResponse;\n }\n\n const controller = container.get(route.controller);\n\n const [response, controllerError] = await executeController(controller, context);\n if (controllerError) {\n const httpResponse = buildExceptionResponse(\n context,\n controllerError.message,\n controllerError.status,\n currentEnv,\n controllerError.key,\n );\n logRequest(context);\n return httpResponse;\n }\n\n const responseValidationError = validateResponse(route, response.getData());\n if (responseValidationError) {\n const httpResponse = buildExceptionResponse(\n context,\n responseValidationError.message,\n responseValidationError.status,\n currentEnv,\n responseValidationError.key,\n );\n logRequest(context);\n return httpResponse;\n }\n\n const httpResponse = response.get(currentEnv);\n logRequest(context);\n\n return httpResponse;\n};\n\nexport const runMiddlewares = async (\n context: ContextType,\n middlewares: MiddlewareClassType[],\n): Promise<ContextType> => {\n let currentContext = context;\n\n for (const MiddlewareClass of middlewares) {\n const middleware = container.get<IMiddleware>(MiddlewareClass);\n currentContext = await middleware.handler(currentContext);\n }\n\n return currentContext;\n};\n\nexport const formatHttpRoutes = (\n httpRoutes: Map<string, RouteConfigType[]>,\n middlewares: MiddlewareClassType[] = [],\n prefix?: string,\n): HttpRoutesMap => {\n const routes: HttpRoutesMap = {};\n\n for (const [path, routeConfigs] of httpRoutes) {\n for (const route of routeConfigs) {\n const versionedPath = `/${prefix ? `${prefix}/` : \"\"}v${route.version}${path}`;\n\n routes[versionedPath] ??= {};\n const methodHandlers = routes[versionedPath];\n\n methodHandlers[route.method] = async (req: BunRequest, server: Server<unknown>) => {\n let context = await buildHttpContext({ req, server, route });\n\n try {\n context = await runMiddlewares(context, middlewares);\n } catch (error: unknown) {\n const env: EnvironmentNameType = context.env.APP_ENV;\n const status = (\n error instanceof Exception ? error.status : HttpStatus.Code.InternalServerError\n ) as StatusCodeType;\n const key = error instanceof Exception ? error.key : null;\n const httpResponse = buildExceptionResponse(context, (error as Error).message, status, env, key);\n logRequest(context);\n return httpResponse;\n }\n\n // Check allowed users\n const allowedUsersError = checkAllowedUsers(context);\n if (allowedUsersError) {\n const httpResponse = buildExceptionResponse(\n context,\n allowedUsersError.message,\n allowedUsersError.status,\n context.env.APP_ENV,\n allowedUsersError.key,\n );\n logRequest(context);\n return httpResponse;\n }\n\n if (route.permission) {\n const permission = container.get(route.permission);\n context.permission = permission.allow().setUserPermissions(context.user).build();\n }\n\n return httpRouteHandler({ context, route });\n };\n }\n }\n\n return routes;\n};\n",
|
|
7
7
|
"import type { IContainer } from \"@ooneex/container\";\nimport type { IException } from \"@ooneex/exception\";\nimport type { ILogger, LoggerClassType, LogsEntity } from \"@ooneex/logger\";\nimport type { ScalarType } from \"@ooneex/types\";\n\nexport const logger = (loggers: LoggerClassType[], container: IContainer) => ({\n error: (message: string | IException, data?: Record<string, ScalarType> & LogsEntity) => {\n loggers.forEach((logger) => {\n const log = container.get<ILogger<Record<string, ScalarType>> | ILogger<LogsEntity>>(logger);\n if (log) {\n log.error(message, data);\n }\n });\n },\n warn: (message: string, data?: Record<string, ScalarType> & LogsEntity) => {\n loggers.forEach((logger) => {\n const log = container.get<ILogger<Record<string, ScalarType>> | ILogger<LogsEntity>>(logger);\n if (log) {\n log.warn(message, data);\n }\n });\n },\n info: (message: string, data?: Record<string, ScalarType> & LogsEntity) => {\n loggers.forEach((logger) => {\n const log = container.get<ILogger<Record<string, ScalarType>> | ILogger<LogsEntity>>(logger);\n if (log) {\n log.info(message, data);\n }\n });\n },\n debug: (message: string, data?: Record<string, ScalarType> & LogsEntity) => {\n loggers.forEach((logger) => {\n const log = container.get<ILogger<Record<string, ScalarType>> | ILogger<LogsEntity>>(logger);\n if (log) {\n log.debug(message, data);\n }\n });\n },\n log: (message: string, data?: Record<string, ScalarType> & LogsEntity) => {\n loggers.forEach((logger) => {\n const log = container.get<ILogger<Record<string, ScalarType>> | ILogger<LogsEntity>>(logger);\n if (log) {\n log.log(message, data);\n }\n });\n },\n success: (message: string, data?: Record<string, ScalarType> & LogsEntity) => {\n loggers.forEach((logger) => {\n const log = container.get<ILogger<Record<string, ScalarType>> | ILogger<LogsEntity>>(logger);\n if (log) {\n log.success(message, data);\n }\n });\n },\n});\n",
|
|
8
8
|
"import type { EnvironmentNameType } from \"@ooneex/app-env\";\nimport { container } from \"@ooneex/container\";\nimport { Exception } from \"@ooneex/exception\";\nimport type { IResponse } from \"@ooneex/http-response\";\nimport { HttpStatus, type StatusCodeType } from \"@ooneex/http-status\";\nimport { LogsEntity } from \"@ooneex/logger\";\nimport type { ISocketMiddleware, SocketMiddlewareClassType } from \"@ooneex/middleware\";\nimport type { RouteConfigType } from \"@ooneex/routing\";\nimport type { ContextType } from \"@ooneex/socket\";\nimport type { RequestDataType } from \"@ooneex/socket-client\";\nimport type { LocaleInfoType } from \"@ooneex/translation\";\nimport type { ScalarType } from \"@ooneex/types\";\nimport { random } from \"@ooneex/utils\";\nimport type { BunRequest, Server, ServerWebSocket } from \"bun\";\nimport { buildHttpContext, checkAllowedUsers, validateResponse, validateRouteAccess } from \"./httpRouteUtils\";\n\ntype SocketRouteHandler = (req: BunRequest, server: Server<unknown>) => Promise<undefined>;\ntype SocketRoutesMap = Record<string, SocketRouteHandler>;\n\nexport const formatSocketRoutes = (socketRoutes: Map<string, RouteConfigType>, prefix?: string): SocketRoutesMap => {\n const routes: SocketRoutesMap = {};\n\n for (const [path, route] of socketRoutes) {\n const versionedPath = `/${prefix ? `${prefix}/` : \"\"}v${route.version}${path}`;\n routes[versionedPath] = async (req: BunRequest, server: Server<unknown>) => {\n const context = await buildHttpContext({ req, server, route });\n const id = random.nanoid(30);\n container.addConstant(id, { context, route });\n server.upgrade(req, { data: { id } });\n\n return undefined;\n };\n }\n\n return routes;\n};\n\nconst runMiddlewares = async (context: ContextType, middlewares: SocketMiddlewareClassType[]): Promise<ContextType> => {\n let currentContext = context;\n\n for (const MiddlewareClass of middlewares) {\n const middleware = container.get<ISocketMiddleware>(MiddlewareClass);\n currentContext = await middleware.handler(currentContext);\n }\n\n return currentContext;\n};\n\nconst sendException = (\n context: ContextType,\n message: string,\n status: StatusCodeType,\n key?: string | null,\n): Promise<void> => {\n context.response.exception(message, { status, ...(key ? { key } : {}) });\n return context.channel.send(context.response);\n};\n\nconst logSocketRequest = (context: ContextType, status: number, path: string): void => {\n const logger = context.logger as {\n success: (message: string, data?: LogsEntity) => void;\n info: (message: string, data?: LogsEntity) => void;\n warn: (message: string, data?: LogsEntity) => void;\n error: (message: string, data?: LogsEntity) => void;\n };\n\n if (!logger) {\n return;\n }\n\n const logData = new LogsEntity();\n logData.date = new Date();\n logData.status = status;\n logData.method = \"GET\";\n logData.path = path;\n logData.params = context.params as Record<string, ScalarType>;\n logData.payload = context.payload as Record<string, unknown>;\n logData.queries = context.queries as Record<string, ScalarType>;\n\n if (context.ip) logData.ip = context.ip;\n\n const userAgent = context.header.get(\"User-Agent\");\n if (userAgent) logData.userAgent = userAgent;\n\n const referer = context.header.getReferer();\n if (referer) logData.referer = referer;\n\n if (context.user?.id) logData.userId = context.user.id;\n if (context.user?.email) logData.email = context.user.email;\n if (context.user?.lastName) logData.lastName = context.user.lastName;\n if (context.user?.firstName) logData.firstName = context.user.firstName;\n\n const message = `WS ${path}`;\n\n if (status >= 500) {\n logger.error(message, logData);\n } else if (status >= 400) {\n logger.warn(message, logData);\n } else if (status >= 300) {\n logger.info(message, logData);\n } else {\n logger.success(message, logData);\n }\n};\n\ntype SocketRouteHandlerOptions = {\n message: string;\n ws: ServerWebSocket<{ id: string }>;\n server: Server<{ id: string }>;\n middlewares?: SocketMiddlewareClassType[];\n};\n\nexport const socketRouteHandler = async ({\n message,\n ws,\n server,\n middlewares = [],\n}: SocketRouteHandlerOptions): Promise<void> => {\n let { context, route } = container.getConstant<{ context: ContextType; route: RouteConfigType }>(ws.data.id);\n const currentEnv: EnvironmentNameType = context.env.APP_ENV;\n\n context.channel = {\n send: async (response: IResponse): Promise<void> => {\n const data = await response.get(currentEnv).json();\n ws.send(JSON.stringify(data));\n },\n close: (code?: number, reason?: string): void => {\n ws.close(code, reason);\n },\n subscribe: async (): Promise<void> => {\n ws.subscribe(route.name);\n },\n isSubscribed: (): boolean => {\n return ws.isSubscribed(route.name);\n },\n unsubscribe: async (): Promise<void> => {\n ws.unsubscribe(route.name);\n },\n publish: async (response: IResponse): Promise<void> => {\n const data = await response.get(currentEnv).json();\n\n server.publish(route.name, data);\n },\n };\n\n const requestData = JSON.parse(message) as RequestDataType;\n context.queries = requestData.queries as Record<string, ScalarType>;\n context.payload = requestData.payload as Record<string, ScalarType>;\n context.lang = requestData.lang as LocaleInfoType;\n\n try {\n context = await runMiddlewares(context, middlewares);\n } catch (error: unknown) {\n const status = (error instanceof Exception ? error.status : HttpStatus.Code.InternalServerError) as number;\n const key = error instanceof Exception ? error.key : null;\n logSocketRequest(context, status, route.path);\n return sendException(context, (error as Error).message, status as StatusCodeType, key);\n }\n\n // Check allowed users\n const allowedUsersError = checkAllowedUsers(context);\n if (allowedUsersError) {\n logSocketRequest(context, allowedUsersError.status, route.path);\n return sendException(context, allowedUsersError.message, allowedUsersError.status, allowedUsersError.key);\n }\n\n const validationError = await validateRouteAccess(context, route, currentEnv);\n if (validationError) {\n logSocketRequest(context, validationError.status, route.path);\n return sendException(context, validationError.message, validationError.status, validationError.key);\n }\n\n if (route.permission) {\n const permission = container.get(route.permission);\n context.permission = permission.allow().setUserPermissions(context.user).build();\n }\n\n const controller = container.get(route.controller);\n\n try {\n context.response = await controller.index(context);\n } catch (error: unknown) {\n const status = (error instanceof Exception ? error.status : HttpStatus.Code.InternalServerError) as number;\n const key = error instanceof Exception ? error.key : null;\n const message = error instanceof Error ? error.message : \"An unknown error occurred\";\n logSocketRequest(context, status, route.path);\n return sendException(context, message, status as StatusCodeType, key);\n }\n\n const responseValidationError = validateResponse(route, context.response.getData());\n if (responseValidationError) {\n logSocketRequest(context, responseValidationError.status, route.path);\n return sendException(\n context,\n responseValidationError.message,\n responseValidationError.status,\n responseValidationError.key,\n );\n }\n\n logSocketRequest(context, HttpStatus.Code.OK, route.path);\n return context.channel.send(context.response);\n};\n",
|
|
9
9
|
"import { join } from \"node:path\";\nimport type { RouteConfigType } from \"@ooneex/routing\";\nimport { routeConfigToJsonDoc } from \"@ooneex/routing\";\n\nexport const generateRouteDoc = async (config: RouteConfigType): Promise<void> => {\n const outputDir = \"docs/routes\";\n const jsonDoc = routeConfigToJsonDoc(config);\n const fileName = `${config.name}.json`;\n const filePath = join(process.cwd(), outputDir, fileName);\n\n await Bun.write(filePath, JSON.stringify(jsonDoc, null, 2));\n};\n",
|
|
10
10
|
"import { join } from \"node:path\";\nimport type { RouteConfigType } from \"@ooneex/routing\";\nimport { routeConfigToTypeString } from \"@ooneex/routing\";\nimport { toPascalCase } from \"@ooneex/utils\";\n\nexport const generateRouteType = async (config: RouteConfigType): Promise<void> => {\n const outputDir = \"src/types/routes\";\n const typeString = routeConfigToTypeString(config);\n const fileName = `${config.name}.ts`;\n const filePath = join(process.cwd(), outputDir, fileName);\n\n const typeName = toPascalCase(config.name);\n\n const fileContent = `export type ${typeName}RouteType = ${typeString};\n`;\n\n await Bun.write(filePath, fileContent);\n};\n"
|
|
11
11
|
],
|
|
12
|
-
"mappings": "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",
|
|
13
|
-
"debugId": "
|
|
12
|
+
"mappings": "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",
|
|
13
|
+
"debugId": "54EB453A8726E16D64756E2164756E21",
|
|
14
14
|
"names": []
|
|
15
15
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ooneex/app",
|
|
3
3
|
"description": "Full-featured application framework for Bun — orchestrates routing, middleware pipelines, dependency injection, caching, logging, and WebSocket support in a modular architecture",
|
|
4
|
-
"version": "1.7.
|
|
4
|
+
"version": "1.7.9",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
|
7
7
|
"dist",
|
|
@@ -29,35 +29,35 @@
|
|
|
29
29
|
"dev": "bun run src/dev.ts"
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@ooneex/database": "1.1.
|
|
33
|
-
"@ooneex/analytics": "1.1.
|
|
34
|
-
"@ooneex/app-env": "1.3.
|
|
35
|
-
"@ooneex/cache": "1.3.
|
|
36
|
-
"@ooneex/container": "1.4.
|
|
37
|
-
"@ooneex/exception": "1.2.
|
|
38
|
-
"@ooneex/http-request": "1.2.
|
|
39
|
-
"@ooneex/http-response": "1.3.
|
|
40
|
-
"@ooneex/http-status": "1.1.9",
|
|
41
|
-
"@ooneex/logger": "1.3.
|
|
42
|
-
"@ooneex/mailer": "1.1.
|
|
43
|
-
"@ooneex/rate-limit": "1.3.
|
|
44
|
-
"@ooneex/role": "1.1.9",
|
|
45
|
-
"@ooneex/routing": "1.3.
|
|
46
|
-
"@ooneex/storage": "1.1.
|
|
47
|
-
"@ooneex/utils": "0.4.7",
|
|
48
|
-
"@ooneex/validation": "1.1.
|
|
32
|
+
"@ooneex/database": "^1.1.11",
|
|
33
|
+
"@ooneex/analytics": "^1.1.12",
|
|
34
|
+
"@ooneex/app-env": "^1.3.5",
|
|
35
|
+
"@ooneex/cache": "^1.3.1",
|
|
36
|
+
"@ooneex/container": "^1.4.4",
|
|
37
|
+
"@ooneex/exception": "^1.2.7",
|
|
38
|
+
"@ooneex/http-request": "^1.2.11",
|
|
39
|
+
"@ooneex/http-response": "^1.3.7",
|
|
40
|
+
"@ooneex/http-status": "^1.1.9",
|
|
41
|
+
"@ooneex/logger": "^1.3.2",
|
|
42
|
+
"@ooneex/mailer": "^1.1.12",
|
|
43
|
+
"@ooneex/rate-limit": "^1.3.1",
|
|
44
|
+
"@ooneex/role": "^1.1.9",
|
|
45
|
+
"@ooneex/routing": "^1.3.9",
|
|
46
|
+
"@ooneex/storage": "^1.1.12",
|
|
47
|
+
"@ooneex/utils": "^0.4.7",
|
|
48
|
+
"@ooneex/validation": "^1.1.10"
|
|
49
49
|
},
|
|
50
50
|
"devDependencies": {
|
|
51
|
-
"@ooneex/permission": "1.1.
|
|
52
|
-
"@ooneex/controller": "1.3.
|
|
53
|
-
"@ooneex/cron": "1.1.
|
|
54
|
-
"@ooneex/pub-sub": "1.1.
|
|
55
|
-
"@ooneex/middleware": "1.2.
|
|
56
|
-
"@ooneex/module": "1.2.
|
|
57
|
-
"@ooneex/socket": "1.2.
|
|
58
|
-
"@ooneex/socket-client": "1.2.
|
|
59
|
-
"@ooneex/translation": "1.1.
|
|
60
|
-
"@ooneex/types": "1.3.
|
|
51
|
+
"@ooneex/permission": "^1.1.12",
|
|
52
|
+
"@ooneex/controller": "^1.3.11",
|
|
53
|
+
"@ooneex/cron": "^1.1.12",
|
|
54
|
+
"@ooneex/pub-sub": "^1.1.12",
|
|
55
|
+
"@ooneex/middleware": "^1.2.12",
|
|
56
|
+
"@ooneex/module": "^1.2.10",
|
|
57
|
+
"@ooneex/socket": "^1.2.11",
|
|
58
|
+
"@ooneex/socket-client": "^1.2.11",
|
|
59
|
+
"@ooneex/translation": "^1.1.11",
|
|
60
|
+
"@ooneex/types": "^1.3.5"
|
|
61
61
|
},
|
|
62
62
|
"keywords": [
|
|
63
63
|
"application",
|