@ooneex/app 1.3.4 → 1.3.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,5 +1,730 @@
1
1
  // @bun
2
- import{AppEnv as j}from"@ooneex/app-env";import{container as p}from"@ooneex/container";import{Exception as x}from"@ooneex/exception";import{HttpStatus as H}from"@ooneex/http-status";import{TerminalLogger as oe}from"@ooneex/logger";import{router as W}from"@ooneex/routing";import{AssertAppEnv as ae,AssertHostname as ne,AssertPort as ie}from"@ooneex/validation/constraints";import{AppEnv as Y}from"@ooneex/app-env";import{container as f}from"@ooneex/container";import{Exception as D}from"@ooneex/exception";import{HttpRequest as G}from"@ooneex/http-request";import{HttpResponse as K}from"@ooneex/http-response";import{HttpStatus as y}from"@ooneex/http-status";import{LogsEntity as z}from"@ooneex/logger";import{ERole as T,Role as Q}from"@ooneex/role";import{type as X}from"@ooneex/validation";var k=(e)=>{if(!e.user)return null;if(e.env.SYSTEM_USERS?.includes(e.user.email)){if(!e.user.roles.includes(T.SYSTEM))e.user.roles.push(T.SYSTEM)}if(e.env.SUPER_ADMIN_USERS?.includes(e.user.email)){if(!e.user.roles.includes(T.SUPER_ADMIN))e.user.roles.push(T.SUPER_ADMIN)}if(e.env.ADMIN_USERS?.includes(e.user.email)){if(!e.user.roles.includes(T.ADMIN))e.user.roles.push(T.ADMIN)}let t=`${e.env.APP_ENV.toUpperCase()}_ALLOWED_USERS`,a=e.env[t];if(a&&a.length>0&&!a.includes(e.user.email))return{message:`User "${e.user.email}" is not allowed in "${e.env.APP_ENV}" environment`,status:y.Code.Forbidden};return null},A=(e,s)=>{if(e!==null&&typeof e==="object"&&"validate"in e&&typeof e.validate==="function"){let r=e.validate(s);if(!r.isValid)return r.message||"Validation failed"}else if(typeof e==="function"){let r=e(s);if(r instanceof X.errors)return r.summary}return null},E=async(e)=>{let{req:s,server:r,route:o}=e,a=r.requestIP(s)?.address??"unknown",i=new K,l={},m=null;if(s.headers.get("content-type")?.includes("application/json"))try{l=await s.json()}catch(L){}else try{m=await s.formData()}catch(L){}let u=new G(s,{params:s.params,payload:l,form:m,ip:a}),n=(L)=>{try{return f.get(L)}catch{return}},c=n("exception.logger"),g=n("analytics"),R=n("cache"),I=n("storage"),b=n("mailer"),q=n("rateLimiter"),J=f.get("database");return{logger:f.get("logger"),...c&&{exceptionLogger:c},...g&&{analytics:g},...R&&{cache:R},...I&&{storage:I},...b&&{mailer:b},...q&&{rateLimiter:q},database:J,route:o?{name:o.name,path:o.path,method:o.method,version:o.version,description:o.description??""}:null,env:f.get(Y),response:i,request:u,params:u.params,payload:u.payload,queries:u.queries,method:u.method,header:u.header,files:u.files,ip:u.ip,host:u.host,language:u.language,user:null}},P=async(e,s,r)=>{if(s.params)for(let[o,t]of Object.entries(s.params)){let a=A(t,e.params?.[o]);if(a)return{message:`Invalid parameter "${o}": ${a}`,status:y.Code.BadRequest}}if(s.queries){let o=A(s.queries,e.queries);if(o)return{message:`Invalid query parameters: ${o}`,status:y.Code.BadRequest}}if(s.payload){let o=A(s.payload,e.payload);if(o)return{message:`Invalid payload: ${o}`,status:y.Code.BadRequest}}if(s.env&&s.env.length>0&&!s.env.includes(r))return{message:`Route "${s.name}" is not available in "${r}" environment`,status:y.Code.NotAcceptable};if(s.ip&&s.ip.length>0&&(!e.ip||!s.ip.includes(e.ip)))return{message:`Route "${s.name}" is not available for IP "${e.ip}"`,status:y.Code.NotAcceptable};if(s.host&&s.host.length>0&&!s.host.includes(e.host))return{message:`Route "${s.name}" is not available for host "${e.host}"`,status:y.Code.NotAcceptable};if(s.roles&&s.roles.length>0){if(!e.user||!e.user.roles||e.user.roles.length===0)return{message:`Route "${s.name}" requires authentication`,status:y.Code.Forbidden};let o=new Q;if(!s.roles.some((a)=>e.user?.roles.some((i)=>o.hasRole(i,a))))return{message:`Route "${s.name}" is not accessible for user roles`,status:y.Code.NotAcceptable}}return null},M=(e,s)=>{if(e.response){let r=A(e.response,s);if(r)return{message:`Invalid response: ${r}`,status:y.Code.NotAcceptable}}return null},v=(e,s,r,o)=>{return e.response.exception(s,{status:r}).get(o)},h=(e)=>{let s=e.route?.path||"",r=e.logger;if(!r)return;let o=e.response.getStatus(),t=new z;if(t.date=new Date,t.status=o,t.method=e.method,t.path=s,t.params=e.params,t.payload=e.payload,t.queries=e.queries,e.ip)t.ip=e.ip;let a=e.header.get("User-Agent");if(a)t.userAgent=a;let i=e.header.getReferer();if(i)t.referer=i;if(e.user?.id)t.userId=e.user.id;if(e.user?.email)t.email=e.user.email;if(e.user?.lastName)t.lastName=e.user.lastName;if(e.user?.firstName)t.firstName=e.user.firstName;let l=`${e.method} ${s}`;if(o>=500)r.error(l,t);else if(o>=400)r.warn(l,t);else if(o>=300)r.info(l,t);else r.success(l,t)},Z=async(e,s)=>{try{return[await e.index(s),null]}catch(r){if(r instanceof D)return[null,{message:r.message,status:r.status}];if(r instanceof Error)return[null,{message:r.message,status:y.Code.InternalServerError}];return[null,{message:"An unknown error occurred",status:y.Code.InternalServerError}]}},ee=async({context:e,route:s})=>{let r=e.env.APP_ENV,o=await P(e,s,r);if(o){let d=v(e,o.message,o.status,r);return h(e),d}let t=f.get(s.controller),[a,i]=await Z(t,e);if(i){let d=v(e,i.message,i.status,r);return h(e),d}let l=M(s,a.getData());if(l){let d=v(e,l.message,l.status,r);return h(e),d}let m=a.get(r);return h(e),m},N=async(e,s)=>{let r=e;for(let o of s)r=await f.get(o).handler(r);return r},U=(e,s=[],r)=>{let o={};for(let[t,a]of e)for(let i of a){let l=`/${r?`${r}/`:""}v${i.version}${t}`;o[l]??={};let m=o[l];m[i.method]=async(d,u)=>{let n=await E({req:d,server:u,route:i});try{n=await N(n,s)}catch(g){let R=n.env.APP_ENV,I=g instanceof D?g.status:y.Code.InternalServerError,b=v(n,g.message,I,R);return h(n),b}let c=k(n);if(c){let g=v(n,c.message,c.status,n.env.APP_ENV);return h(n),g}if(i.permission){let g=f.get(i.permission);n.permission=g.allow().setUserPermissions(n.user).build()}return ee({context:n,route:i})}}return o};var V=(e,s)=>({error:(r,o)=>{e.forEach((t)=>{let a=s.get(t);if(a)a.error(r,o)})},warn:(r,o)=>{e.forEach((t)=>{let a=s.get(t);if(a)a.warn(r,o)})},info:(r,o)=>{e.forEach((t)=>{let a=s.get(t);if(a)a.info(r,o)})},debug:(r,o)=>{e.forEach((t)=>{let a=s.get(t);if(a)a.debug(r,o)})},log:(r,o)=>{e.forEach((t)=>{let a=s.get(t);if(a)a.log(r,o)})},success:(r,o)=>{e.forEach((t)=>{let a=s.get(t);if(a)a.success(r,o)})}});import{container as S}from"@ooneex/container";import{Exception as _}from"@ooneex/exception";import{HttpStatus as $}from"@ooneex/http-status";import{LogsEntity as te}from"@ooneex/logger";import{random as se}from"@ooneex/utils";var O=(e,s)=>{let r={};for(let[o,t]of e){let a=`/${s?`${s}/`:""}v${t.version}${o}`;r[a]=async(i,l)=>{let m=await E({req:i,server:l,route:t}),d=se.nanoid(30);S.addConstant(d,{context:m,route:t}),l.upgrade(i,{data:{id:d}});return}}return r},re=async(e,s)=>{let r=e;for(let o of s)r=await S.get(o).handler(r);return r},w=(e,s,r)=>{return e.response.exception(s,{status:r}),e.channel.send(e.response)},C=(e,s,r)=>{let o=e.logger;if(!o)return;let t=new te;if(t.date=new Date,t.status=s,t.method="GET",t.path=r,t.params=e.params,t.payload=e.payload,t.queries=e.queries,e.ip)t.ip=e.ip;let a=e.header.get("User-Agent");if(a)t.userAgent=a;let i=e.header.getReferer();if(i)t.referer=i;if(e.user?.id)t.userId=e.user.id;if(e.user?.email)t.email=e.user.email;if(e.user?.lastName)t.lastName=e.user.lastName;if(e.user?.firstName)t.firstName=e.user.firstName;let l=`WS ${r}`;if(s>=500)o.error(l,t);else if(s>=400)o.warn(l,t);else if(s>=300)o.info(l,t);else o.success(l,t)},B=async({message:e,ws:s,server:r,middlewares:o=[]})=>{let{context:t,route:a}=S.getConstant(s.data.id),i=t.env.APP_ENV;t.channel={send:async(c)=>{let g=await c.get(i).json();s.send(JSON.stringify(g))},close:(c,g)=>{s.close(c,g)},subscribe:async()=>{s.subscribe(a.name)},isSubscribed:()=>{return s.isSubscribed(a.name)},unsubscribe:async()=>{s.unsubscribe(a.name)},publish:async(c)=>{let g=await c.get(i).json();r.publish(a.name,g)}};let l=JSON.parse(e);t.queries=l.queries,t.payload=l.payload,t.language=l.language;try{t=await re(t,o)}catch(c){let g=c instanceof _?c.status:$.Code.InternalServerError;return C(t,g,a.path),w(t,c.message,g)}let m=k(t);if(m)return C(t,m.status,a.path),w(t,m.message,m.status);let d=await P(t,a,i);if(d)return C(t,d.status,a.path),w(t,d.message,d.status);if(a.permission){let c=S.get(a.permission);t.permission=c.allow().setUserPermissions(t.user).build()}let u=S.get(a.controller);try{t.response=await u.index(t)}catch(c){let g=c instanceof _?c.status:$.Code.InternalServerError,R=c instanceof Error?c.message:"An unknown error occurred";return C(t,g,a.path),w(t,R,g)}let n=M(a,t.response.getData());if(n)return C(t,n.status,a.path),w(t,n.message,n.status);return C(t,$.Code.OK,a.path),t.channel.send(t.response)};class F{config;constructor(e){this.config=e;let{loggers:s,cronJobs:r,events:o,analytics:t,cache:a,database:i,storage:l,mailer:m,rateLimiter:d,onException:u}=this.config;if(s.forEach((n)=>{if(!p.has(n))p.add(n);p.get(n).init()}),p.addConstant("logger",V(s,p)),!p.has(i))p.add(i);if(p.addAlias("database",i),u){if(!p.has(u))p.add(u);p.addConstant("exception.logger",u)}if(t){if(!p.has(t))p.add(t);p.addAlias("analytics",t)}if(a){if(!p.has(a))p.add(a);p.addAlias("cache",a)}if(l){if(!p.has(l))p.add(l);p.addAlias("storage",l)}if(m){if(!p.has(m))p.add(m);p.addAlias("mailer",m)}if(d){if(!p.has(d))p.add(d);p.addAlias("rateLimiter",d)}r?.forEach((n)=>{if(!p.has(n))p.add(n);p.get(n).start()}),o?.forEach((n)=>{if(!p.has(n))p.add(n);p.get(n).subscribe()})}async init(){let e=p.get(j),r=new ae().validate(e.APP_ENV);if(!r.isValid)throw new x(`Invalid APP_ENV: ${r.message}`,{status:H.Code.InternalServerError,data:{appEnv:e.APP_ENV}});let t=new ie().validate(e.PORT);if(!t.isValid)throw new x(`Invalid PORT: ${t.message}`,{status:H.Code.InternalServerError,data:{port:e.PORT}});let i=new ne().validate(e.HOST_NAME);if(!i.isValid)throw new x(`Invalid HOST_NAME: ${i.message}`,{status:H.Code.InternalServerError,data:{hostname:e.HOST_NAME}});return this}async run(){let e=new oe;try{await this.init()}catch(d){e.error(d),process.exit(1)}let s=p.get(j),r=s.HOST_NAME,{middlewares:o=[],routing:t}=this.config,a=t?.prefix,i={...U(W.getHttpRoutes(),o,a),...O(W.getSocketRoutes(),a)},l=s.PORT,m=Bun.serve({port:l,hostname:r,development:s.isLocal,routes:{...i,"/*":async(d,u)=>{let n=await E({req:d,server:u});if(n.response.notFound("Not Found"),this.config.cors)n=await N(n,[this.config.cors]);return h(n),n.response.get()}},websocket:{perMessageDeflate:!0,async message(d,u){await B({message:u,ws:d,server:m,middlewares:o})},async close(d){p.removeConstant(d.data.id)}}});if(r=m.hostname||"0.0.0.0",r==="0.0.0.0")r="localhost";if(e.info(`Server running at ${m.protocol}://${r}:${m.port}`),this.config.check?.health){let d=`${m.protocol}://${r}:${m.port}${a??""}${this.config.check.health}`,u=await fetch(d);if(u.ok)e.info(`Health check passed at ${this.config.check.health}`);else e.warn(`Health check failed at ${this.config.check.health} with status ${u.status}`)}return this}}import{join as pe}from"path";import{routeConfigToJsonDoc as le}from"@ooneex/routing";var de=async(e)=>{let r=le(e),o=`${e.name}.json`,t=pe(process.cwd(),"docs/routes",o);await Bun.write(t,JSON.stringify(r,null,2))};import{join as ue}from"path";import{routeConfigToTypeString as ce}from"@ooneex/routing";import{toPascalCase as me}from"@ooneex/utils";var ge=async(e)=>{let r=ce(e),o=`${e.name}.ts`,t=ue(process.cwd(),"src/types/routes",o),i=`export type ${me(e.name)}RouteType = ${r};
3
- `;await Bun.write(t,i)};export{ge as generateRouteType,de as generateRouteDoc,F as App};
2
+ // src/App.ts
3
+ import { AppEnv as AppEnv2 } from "@ooneex/app-env";
4
+ import { container as container3 } from "@ooneex/container";
5
+ import { Exception as Exception3 } from "@ooneex/exception";
6
+ import { HttpStatus as HttpStatus3 } from "@ooneex/http-status";
7
+ import { TerminalLogger } from "@ooneex/logger";
8
+ import { router } from "@ooneex/routing";
9
+ import { AssertAppEnv, AssertHostname, AssertPort } from "@ooneex/validation/constraints";
4
10
 
5
- //# debugId=39FD32C1DDBBC7E564756E2164756E21
11
+ // src/httpRouteUtils.ts
12
+ import { AppEnv } from "@ooneex/app-env";
13
+ import { container } from "@ooneex/container";
14
+ import { Exception } from "@ooneex/exception";
15
+ import { HttpRequest } from "@ooneex/http-request";
16
+ import { HttpResponse } from "@ooneex/http-response";
17
+ import { HttpStatus } from "@ooneex/http-status";
18
+ import { LogsEntity } from "@ooneex/logger";
19
+ import { ERole, Role } from "@ooneex/role";
20
+ import { type } from "@ooneex/validation";
21
+ var checkAllowedUsers = (context) => {
22
+ if (!context.user) {
23
+ return null;
24
+ }
25
+ const systemUsers = context.env.SYSTEM_USERS;
26
+ if (systemUsers?.includes(context.user.email)) {
27
+ if (!context.user.roles.includes(ERole.SYSTEM)) {
28
+ context.user.roles.push(ERole.SYSTEM);
29
+ }
30
+ }
31
+ const superAdminUsers = context.env.SUPER_ADMIN_USERS;
32
+ if (superAdminUsers?.includes(context.user.email)) {
33
+ if (!context.user.roles.includes(ERole.SUPER_ADMIN)) {
34
+ context.user.roles.push(ERole.SUPER_ADMIN);
35
+ }
36
+ }
37
+ const adminUsers = context.env.ADMIN_USERS;
38
+ if (adminUsers?.includes(context.user.email)) {
39
+ if (!context.user.roles.includes(ERole.ADMIN)) {
40
+ context.user.roles.push(ERole.ADMIN);
41
+ }
42
+ }
43
+ const allowedUsersKey = `${context.env.APP_ENV.toUpperCase()}_ALLOWED_USERS`;
44
+ const allowedUsers = context.env[allowedUsersKey];
45
+ if (allowedUsers && allowedUsers.length > 0 && !allowedUsers.includes(context.user.email)) {
46
+ return {
47
+ message: `User "${context.user.email}" is not allowed in "${context.env.APP_ENV}" environment`,
48
+ status: HttpStatus.Code.Forbidden
49
+ };
50
+ }
51
+ return null;
52
+ };
53
+ var validateConstraint = (constraint, value) => {
54
+ if (constraint !== null && typeof constraint === "object" && "validate" in constraint && typeof constraint.validate === "function") {
55
+ const result = constraint.validate(value);
56
+ if (!result.isValid) {
57
+ return result.message || "Validation failed";
58
+ }
59
+ } else if (typeof constraint === "function") {
60
+ const result = constraint(value);
61
+ if (result instanceof type.errors) {
62
+ return result.summary;
63
+ }
64
+ }
65
+ return null;
66
+ };
67
+ var buildHttpContext = async (ctx) => {
68
+ const { req, server, route } = ctx;
69
+ const address = server.requestIP(req);
70
+ const ip = address?.address ?? "unknown";
71
+ const response = new HttpResponse;
72
+ let payload = {};
73
+ let form = null;
74
+ const contentType = req.headers.get("content-type");
75
+ if (contentType?.includes("application/json")) {
76
+ try {
77
+ payload = await req.json();
78
+ } catch (_e) {}
79
+ } else {
80
+ try {
81
+ form = await req.formData();
82
+ } catch (_e) {}
83
+ }
84
+ const request = new HttpRequest(req, {
85
+ params: req.params,
86
+ payload,
87
+ form,
88
+ ip
89
+ });
90
+ const tryGet = (key) => {
91
+ try {
92
+ return container.get(key);
93
+ } catch {
94
+ return;
95
+ }
96
+ };
97
+ const exceptionLogger = tryGet("exception.logger");
98
+ const analytics = tryGet("analytics");
99
+ const cache = tryGet("cache");
100
+ const storage = tryGet("storage");
101
+ const mailer = tryGet("mailer");
102
+ const rateLimiter = tryGet("rateLimiter");
103
+ const database = container.get("database");
104
+ const context = {
105
+ logger: container.get("logger"),
106
+ ...exceptionLogger && { exceptionLogger },
107
+ ...analytics && { analytics },
108
+ ...cache && { cache },
109
+ ...storage && { storage },
110
+ ...mailer && { mailer },
111
+ ...rateLimiter && { rateLimiter },
112
+ database,
113
+ route: route ? {
114
+ name: route.name,
115
+ path: route.path,
116
+ method: route.method,
117
+ version: route.version,
118
+ description: route.description ?? ""
119
+ } : null,
120
+ env: container.get(AppEnv),
121
+ response,
122
+ request,
123
+ params: request.params,
124
+ payload: request.payload,
125
+ queries: request.queries,
126
+ method: request.method,
127
+ header: request.header,
128
+ files: request.files,
129
+ ip: request.ip,
130
+ host: request.host,
131
+ language: request.language,
132
+ user: null
133
+ };
134
+ return context;
135
+ };
136
+ var validateRouteAccess = async (context, route, currentEnv) => {
137
+ if (route.params) {
138
+ for (const [paramName, constraint] of Object.entries(route.params)) {
139
+ const error = validateConstraint(constraint, context.params?.[paramName]);
140
+ if (error) {
141
+ return {
142
+ message: `Invalid parameter "${paramName}": ${error}`,
143
+ status: HttpStatus.Code.BadRequest
144
+ };
145
+ }
146
+ }
147
+ }
148
+ if (route.queries) {
149
+ const error = validateConstraint(route.queries, context.queries);
150
+ if (error) {
151
+ return {
152
+ message: `Invalid query parameters: ${error}`,
153
+ status: HttpStatus.Code.BadRequest
154
+ };
155
+ }
156
+ }
157
+ if (route.payload) {
158
+ const error = validateConstraint(route.payload, context.payload);
159
+ if (error) {
160
+ return {
161
+ message: `Invalid payload: ${error}`,
162
+ status: HttpStatus.Code.BadRequest
163
+ };
164
+ }
165
+ }
166
+ if (route.env && route.env.length > 0 && !route.env.includes(currentEnv)) {
167
+ return {
168
+ message: `Route "${route.name}" is not available in "${currentEnv}" environment`,
169
+ status: HttpStatus.Code.NotAcceptable
170
+ };
171
+ }
172
+ if (route.ip && route.ip.length > 0 && (!context.ip || !route.ip.includes(context.ip))) {
173
+ return {
174
+ message: `Route "${route.name}" is not available for IP "${context.ip}"`,
175
+ status: HttpStatus.Code.NotAcceptable
176
+ };
177
+ }
178
+ if (route.host && route.host.length > 0 && !route.host.includes(context.host)) {
179
+ return {
180
+ message: `Route "${route.name}" is not available for host "${context.host}"`,
181
+ status: HttpStatus.Code.NotAcceptable
182
+ };
183
+ }
184
+ if (route.roles && route.roles.length > 0) {
185
+ if (!context.user || !context.user.roles || context.user.roles.length === 0) {
186
+ return {
187
+ message: `Route "${route.name}" requires authentication`,
188
+ status: HttpStatus.Code.Forbidden
189
+ };
190
+ }
191
+ const role = new Role;
192
+ const hasRequiredRole = route.roles.some((requiredRole) => context.user?.roles.some((userRole) => role.hasRole(userRole, requiredRole)));
193
+ if (!hasRequiredRole) {
194
+ return {
195
+ message: `Route "${route.name}" is not accessible for user roles`,
196
+ status: HttpStatus.Code.NotAcceptable
197
+ };
198
+ }
199
+ }
200
+ return null;
201
+ };
202
+ var validateResponse = (route, data) => {
203
+ if (route.response) {
204
+ const error = validateConstraint(route.response, data);
205
+ if (error) {
206
+ return {
207
+ message: `Invalid response: ${error}`,
208
+ status: HttpStatus.Code.NotAcceptable
209
+ };
210
+ }
211
+ }
212
+ return null;
213
+ };
214
+ var buildExceptionResponse = (context, message, status, env) => {
215
+ return context.response.exception(message, { status }).get(env);
216
+ };
217
+ var logRequest = (context) => {
218
+ const path = context.route?.path || "";
219
+ const logger = context.logger;
220
+ if (!logger) {
221
+ return;
222
+ }
223
+ const status = context.response.getStatus();
224
+ const logData = new LogsEntity;
225
+ logData.date = new Date;
226
+ logData.status = status;
227
+ logData.method = context.method;
228
+ logData.path = path;
229
+ logData.params = context.params;
230
+ logData.payload = context.payload;
231
+ logData.queries = context.queries;
232
+ if (context.ip)
233
+ logData.ip = context.ip;
234
+ const userAgent = context.header.get("User-Agent");
235
+ if (userAgent)
236
+ logData.userAgent = userAgent;
237
+ const referer = context.header.getReferer();
238
+ if (referer)
239
+ logData.referer = referer;
240
+ if (context.user?.id)
241
+ logData.userId = context.user.id;
242
+ if (context.user?.email)
243
+ logData.email = context.user.email;
244
+ if (context.user?.lastName)
245
+ logData.lastName = context.user.lastName;
246
+ if (context.user?.firstName)
247
+ logData.firstName = context.user.firstName;
248
+ const message = `${context.method} ${path}`;
249
+ if (status >= 500) {
250
+ logger.error(message, logData);
251
+ } else if (status >= 400) {
252
+ logger.warn(message, logData);
253
+ } else if (status >= 300) {
254
+ logger.info(message, logData);
255
+ } else {
256
+ logger.success(message, logData);
257
+ }
258
+ };
259
+ var executeController = async (controller, context) => {
260
+ try {
261
+ const response = await controller.index(context);
262
+ return [response, null];
263
+ } catch (error) {
264
+ if (error instanceof Exception) {
265
+ return [null, { message: error.message, status: error.status }];
266
+ }
267
+ if (error instanceof Error) {
268
+ return [null, { message: error.message, status: HttpStatus.Code.InternalServerError }];
269
+ }
270
+ return [null, { message: "An unknown error occurred", status: HttpStatus.Code.InternalServerError }];
271
+ }
272
+ };
273
+ var httpRouteHandler = async ({ context, route }) => {
274
+ const currentEnv = context.env.APP_ENV;
275
+ const validationError = await validateRouteAccess(context, route, currentEnv);
276
+ if (validationError) {
277
+ const httpResponse2 = buildExceptionResponse(context, validationError.message, validationError.status, currentEnv);
278
+ logRequest(context);
279
+ return httpResponse2;
280
+ }
281
+ const controller = container.get(route.controller);
282
+ const [response, controllerError] = await executeController(controller, context);
283
+ if (controllerError) {
284
+ const httpResponse2 = buildExceptionResponse(context, controllerError.message, controllerError.status, currentEnv);
285
+ logRequest(context);
286
+ return httpResponse2;
287
+ }
288
+ const responseValidationError = validateResponse(route, response.getData());
289
+ if (responseValidationError) {
290
+ const httpResponse2 = buildExceptionResponse(context, responseValidationError.message, responseValidationError.status, currentEnv);
291
+ logRequest(context);
292
+ return httpResponse2;
293
+ }
294
+ const httpResponse = response.get(currentEnv);
295
+ logRequest(context);
296
+ return httpResponse;
297
+ };
298
+ var runMiddlewares = async (context, middlewares) => {
299
+ let currentContext = context;
300
+ for (const MiddlewareClass of middlewares) {
301
+ const middleware = container.get(MiddlewareClass);
302
+ currentContext = await middleware.handler(currentContext);
303
+ }
304
+ return currentContext;
305
+ };
306
+ var formatHttpRoutes = (httpRoutes, middlewares = [], prefix) => {
307
+ const routes = {};
308
+ for (const [path, routeConfigs] of httpRoutes) {
309
+ for (const route of routeConfigs) {
310
+ const versionedPath = `/${prefix ? `${prefix}/` : ""}v${route.version}${path}`;
311
+ routes[versionedPath] ??= {};
312
+ const methodHandlers = routes[versionedPath];
313
+ methodHandlers[route.method] = async (req, server) => {
314
+ let context = await buildHttpContext({ req, server, route });
315
+ try {
316
+ context = await runMiddlewares(context, middlewares);
317
+ } catch (error) {
318
+ const env = context.env.APP_ENV;
319
+ const status = error instanceof Exception ? error.status : HttpStatus.Code.InternalServerError;
320
+ const httpResponse = buildExceptionResponse(context, error.message, status, env);
321
+ logRequest(context);
322
+ return httpResponse;
323
+ }
324
+ const allowedUsersError = checkAllowedUsers(context);
325
+ if (allowedUsersError) {
326
+ const httpResponse = buildExceptionResponse(context, allowedUsersError.message, allowedUsersError.status, context.env.APP_ENV);
327
+ logRequest(context);
328
+ return httpResponse;
329
+ }
330
+ if (route.permission) {
331
+ const permission = container.get(route.permission);
332
+ context.permission = permission.allow().setUserPermissions(context.user).build();
333
+ }
334
+ return httpRouteHandler({ context, route });
335
+ };
336
+ }
337
+ }
338
+ return routes;
339
+ };
340
+
341
+ // src/logger.ts
342
+ var logger = (loggers, container2) => ({
343
+ error: (message, data) => {
344
+ loggers.forEach((logger2) => {
345
+ const log = container2.get(logger2);
346
+ if (log) {
347
+ log.error(message, data);
348
+ }
349
+ });
350
+ },
351
+ warn: (message, data) => {
352
+ loggers.forEach((logger2) => {
353
+ const log = container2.get(logger2);
354
+ if (log) {
355
+ log.warn(message, data);
356
+ }
357
+ });
358
+ },
359
+ info: (message, data) => {
360
+ loggers.forEach((logger2) => {
361
+ const log = container2.get(logger2);
362
+ if (log) {
363
+ log.info(message, data);
364
+ }
365
+ });
366
+ },
367
+ debug: (message, data) => {
368
+ loggers.forEach((logger2) => {
369
+ const log = container2.get(logger2);
370
+ if (log) {
371
+ log.debug(message, data);
372
+ }
373
+ });
374
+ },
375
+ log: (message, data) => {
376
+ loggers.forEach((logger2) => {
377
+ const log = container2.get(logger2);
378
+ if (log) {
379
+ log.log(message, data);
380
+ }
381
+ });
382
+ },
383
+ success: (message, data) => {
384
+ loggers.forEach((logger2) => {
385
+ const log = container2.get(logger2);
386
+ if (log) {
387
+ log.success(message, data);
388
+ }
389
+ });
390
+ }
391
+ });
392
+
393
+ // src/socketRouteUtils.ts
394
+ import { container as container2 } from "@ooneex/container";
395
+ import { Exception as Exception2 } from "@ooneex/exception";
396
+ import { HttpStatus as HttpStatus2 } from "@ooneex/http-status";
397
+ import { LogsEntity as LogsEntity2 } from "@ooneex/logger";
398
+ import { random } from "@ooneex/utils";
399
+ var formatSocketRoutes = (socketRoutes, prefix) => {
400
+ const routes = {};
401
+ for (const [path, route] of socketRoutes) {
402
+ const versionedPath = `/${prefix ? `${prefix}/` : ""}v${route.version}${path}`;
403
+ routes[versionedPath] = async (req, server) => {
404
+ const context = await buildHttpContext({ req, server, route });
405
+ const id = random.nanoid(30);
406
+ container2.addConstant(id, { context, route });
407
+ server.upgrade(req, { data: { id } });
408
+ return;
409
+ };
410
+ }
411
+ return routes;
412
+ };
413
+ var runMiddlewares2 = async (context, middlewares) => {
414
+ let currentContext = context;
415
+ for (const MiddlewareClass of middlewares) {
416
+ const middleware = container2.get(MiddlewareClass);
417
+ currentContext = await middleware.handler(currentContext);
418
+ }
419
+ return currentContext;
420
+ };
421
+ var sendException = (context, message, status) => {
422
+ context.response.exception(message, { status });
423
+ return context.channel.send(context.response);
424
+ };
425
+ var logSocketRequest = (context, status, path) => {
426
+ const logger2 = context.logger;
427
+ if (!logger2) {
428
+ return;
429
+ }
430
+ const logData = new LogsEntity2;
431
+ logData.date = new Date;
432
+ logData.status = status;
433
+ logData.method = "GET";
434
+ logData.path = path;
435
+ logData.params = context.params;
436
+ logData.payload = context.payload;
437
+ logData.queries = context.queries;
438
+ if (context.ip)
439
+ logData.ip = context.ip;
440
+ const userAgent = context.header.get("User-Agent");
441
+ if (userAgent)
442
+ logData.userAgent = userAgent;
443
+ const referer = context.header.getReferer();
444
+ if (referer)
445
+ logData.referer = referer;
446
+ if (context.user?.id)
447
+ logData.userId = context.user.id;
448
+ if (context.user?.email)
449
+ logData.email = context.user.email;
450
+ if (context.user?.lastName)
451
+ logData.lastName = context.user.lastName;
452
+ if (context.user?.firstName)
453
+ logData.firstName = context.user.firstName;
454
+ const message = `WS ${path}`;
455
+ if (status >= 500) {
456
+ logger2.error(message, logData);
457
+ } else if (status >= 400) {
458
+ logger2.warn(message, logData);
459
+ } else if (status >= 300) {
460
+ logger2.info(message, logData);
461
+ } else {
462
+ logger2.success(message, logData);
463
+ }
464
+ };
465
+ var socketRouteHandler = async ({
466
+ message,
467
+ ws,
468
+ server,
469
+ middlewares = []
470
+ }) => {
471
+ let { context, route } = container2.getConstant(ws.data.id);
472
+ const currentEnv = context.env.APP_ENV;
473
+ context.channel = {
474
+ send: async (response) => {
475
+ const data = await response.get(currentEnv).json();
476
+ ws.send(JSON.stringify(data));
477
+ },
478
+ close: (code, reason) => {
479
+ ws.close(code, reason);
480
+ },
481
+ subscribe: async () => {
482
+ ws.subscribe(route.name);
483
+ },
484
+ isSubscribed: () => {
485
+ return ws.isSubscribed(route.name);
486
+ },
487
+ unsubscribe: async () => {
488
+ ws.unsubscribe(route.name);
489
+ },
490
+ publish: async (response) => {
491
+ const data = await response.get(currentEnv).json();
492
+ server.publish(route.name, data);
493
+ }
494
+ };
495
+ const requestData = JSON.parse(message);
496
+ context.queries = requestData.queries;
497
+ context.payload = requestData.payload;
498
+ context.language = requestData.language;
499
+ try {
500
+ context = await runMiddlewares2(context, middlewares);
501
+ } catch (error) {
502
+ const status = error instanceof Exception2 ? error.status : HttpStatus2.Code.InternalServerError;
503
+ logSocketRequest(context, status, route.path);
504
+ return sendException(context, error.message, status);
505
+ }
506
+ const allowedUsersError = checkAllowedUsers(context);
507
+ if (allowedUsersError) {
508
+ logSocketRequest(context, allowedUsersError.status, route.path);
509
+ return sendException(context, allowedUsersError.message, allowedUsersError.status);
510
+ }
511
+ const validationError = await validateRouteAccess(context, route, currentEnv);
512
+ if (validationError) {
513
+ logSocketRequest(context, validationError.status, route.path);
514
+ return sendException(context, validationError.message, validationError.status);
515
+ }
516
+ if (route.permission) {
517
+ const permission = container2.get(route.permission);
518
+ context.permission = permission.allow().setUserPermissions(context.user).build();
519
+ }
520
+ const controller = container2.get(route.controller);
521
+ try {
522
+ context.response = await controller.index(context);
523
+ } catch (error) {
524
+ const status = error instanceof Exception2 ? error.status : HttpStatus2.Code.InternalServerError;
525
+ const message2 = error instanceof Error ? error.message : "An unknown error occurred";
526
+ logSocketRequest(context, status, route.path);
527
+ return sendException(context, message2, status);
528
+ }
529
+ const responseValidationError = validateResponse(route, context.response.getData());
530
+ if (responseValidationError) {
531
+ logSocketRequest(context, responseValidationError.status, route.path);
532
+ return sendException(context, responseValidationError.message, responseValidationError.status);
533
+ }
534
+ logSocketRequest(context, HttpStatus2.Code.OK, route.path);
535
+ return context.channel.send(context.response);
536
+ };
537
+
538
+ // src/App.ts
539
+ class App {
540
+ config;
541
+ constructor(config) {
542
+ this.config = config;
543
+ const { loggers, cronJobs, events, analytics, cache, database, storage, mailer, rateLimiter, onException } = this.config;
544
+ loggers.forEach((log) => {
545
+ if (!container3.has(log)) {
546
+ container3.add(log);
547
+ }
548
+ const logger2 = container3.get(log);
549
+ logger2.init();
550
+ });
551
+ container3.addConstant("logger", logger(loggers, container3));
552
+ if (!container3.has(database)) {
553
+ container3.add(database);
554
+ }
555
+ container3.addAlias("database", database);
556
+ if (onException) {
557
+ if (!container3.has(onException)) {
558
+ container3.add(onException);
559
+ }
560
+ container3.addConstant("exception.logger", onException);
561
+ }
562
+ if (analytics) {
563
+ if (!container3.has(analytics)) {
564
+ container3.add(analytics);
565
+ }
566
+ container3.addAlias("analytics", analytics);
567
+ }
568
+ if (cache) {
569
+ if (!container3.has(cache)) {
570
+ container3.add(cache);
571
+ }
572
+ container3.addAlias("cache", cache);
573
+ }
574
+ if (storage) {
575
+ if (!container3.has(storage)) {
576
+ container3.add(storage);
577
+ }
578
+ container3.addAlias("storage", storage);
579
+ }
580
+ if (mailer) {
581
+ if (!container3.has(mailer)) {
582
+ container3.add(mailer);
583
+ }
584
+ container3.addAlias("mailer", mailer);
585
+ }
586
+ if (rateLimiter) {
587
+ if (!container3.has(rateLimiter)) {
588
+ container3.add(rateLimiter);
589
+ }
590
+ container3.addAlias("rateLimiter", rateLimiter);
591
+ }
592
+ cronJobs?.forEach((cronJob) => {
593
+ if (!container3.has(cronJob)) {
594
+ container3.add(cronJob);
595
+ }
596
+ const cron = container3.get(cronJob);
597
+ cron.start();
598
+ });
599
+ events?.forEach((event) => {
600
+ if (!container3.has(event)) {
601
+ container3.add(event);
602
+ }
603
+ const e = container3.get(event);
604
+ e.subscribe();
605
+ });
606
+ }
607
+ async init() {
608
+ const env = container3.get(AppEnv2);
609
+ const appEnvValidator = new AssertAppEnv;
610
+ const appEnvResult = appEnvValidator.validate(env.APP_ENV);
611
+ if (!appEnvResult.isValid) {
612
+ throw new Exception3(`Invalid APP_ENV: ${appEnvResult.message}`, {
613
+ status: HttpStatus3.Code.InternalServerError,
614
+ data: { appEnv: env.APP_ENV }
615
+ });
616
+ }
617
+ const portValidator = new AssertPort;
618
+ const portResult = portValidator.validate(env.PORT);
619
+ if (!portResult.isValid) {
620
+ throw new Exception3(`Invalid PORT: ${portResult.message}`, {
621
+ status: HttpStatus3.Code.InternalServerError,
622
+ data: { port: env.PORT }
623
+ });
624
+ }
625
+ const hostnameValidator = new AssertHostname;
626
+ const hostnameResult = hostnameValidator.validate(env.HOST_NAME);
627
+ if (!hostnameResult.isValid) {
628
+ throw new Exception3(`Invalid HOST_NAME: ${hostnameResult.message}`, {
629
+ status: HttpStatus3.Code.InternalServerError,
630
+ data: { hostname: env.HOST_NAME }
631
+ });
632
+ }
633
+ return this;
634
+ }
635
+ async run() {
636
+ const logger2 = new TerminalLogger;
637
+ try {
638
+ await this.init();
639
+ } catch (error) {
640
+ logger2.error(error);
641
+ process.exit(1);
642
+ }
643
+ const env = container3.get(AppEnv2);
644
+ let hostname = env.HOST_NAME;
645
+ const { middlewares = [], routing } = this.config;
646
+ const prefix = routing?.prefix;
647
+ const routes = {
648
+ ...formatHttpRoutes(router.getHttpRoutes(), middlewares, prefix),
649
+ ...formatSocketRoutes(router.getSocketRoutes(), prefix)
650
+ };
651
+ const port = env.PORT;
652
+ const server = Bun.serve({
653
+ port,
654
+ hostname,
655
+ development: env.isLocal,
656
+ routes: {
657
+ ...routes,
658
+ "/*": async (req, server2) => {
659
+ let context = await buildHttpContext({ req, server: server2 });
660
+ context.response.notFound("Not Found");
661
+ if (this.config.cors) {
662
+ context = await runMiddlewares(context, [this.config.cors]);
663
+ }
664
+ logRequest(context);
665
+ return context.response.get();
666
+ }
667
+ },
668
+ websocket: {
669
+ perMessageDeflate: true,
670
+ async message(ws, message) {
671
+ await socketRouteHandler({
672
+ message,
673
+ ws,
674
+ server,
675
+ middlewares
676
+ });
677
+ },
678
+ async close(ws) {
679
+ container3.removeConstant(ws.data.id);
680
+ }
681
+ }
682
+ });
683
+ hostname = server.hostname || "0.0.0.0";
684
+ if (hostname === "0.0.0.0") {
685
+ hostname = "localhost";
686
+ }
687
+ logger2.info(`Server running at ${server.protocol}://${hostname}:${server.port}`);
688
+ if (this.config.check?.health) {
689
+ const healthCheckUrl = `${server.protocol}://${hostname}:${server.port}${prefix ?? ""}${this.config.check.health}`;
690
+ const response = await fetch(healthCheckUrl);
691
+ if (response.ok) {
692
+ logger2.info(`Health check passed at ${this.config.check.health}`);
693
+ } else {
694
+ logger2.warn(`Health check failed at ${this.config.check.health} with status ${response.status}`);
695
+ }
696
+ }
697
+ return this;
698
+ }
699
+ }
700
+ // src/generateRouteDoc.ts
701
+ import { join } from "path";
702
+ import { routeConfigToJsonDoc } from "@ooneex/routing";
703
+ var generateRouteDoc = async (config) => {
704
+ const outputDir = "docs/routes";
705
+ const jsonDoc = routeConfigToJsonDoc(config);
706
+ const fileName = `${config.name}.json`;
707
+ const filePath = join(process.cwd(), outputDir, fileName);
708
+ await Bun.write(filePath, JSON.stringify(jsonDoc, null, 2));
709
+ };
710
+ // src/generateRouteType.ts
711
+ import { join as join2 } from "path";
712
+ import { routeConfigToTypeString } from "@ooneex/routing";
713
+ import { toPascalCase } from "@ooneex/utils";
714
+ var generateRouteType = async (config) => {
715
+ const outputDir = "src/types/routes";
716
+ const typeString = routeConfigToTypeString(config);
717
+ const fileName = `${config.name}.ts`;
718
+ const filePath = join2(process.cwd(), outputDir, fileName);
719
+ const typeName = toPascalCase(config.name);
720
+ const fileContent = `export type ${typeName}RouteType = ${typeString};
721
+ `;
722
+ await Bun.write(filePath, fileContent);
723
+ };
724
+ export {
725
+ generateRouteType,
726
+ generateRouteDoc,
727
+ App
728
+ };
729
+
730
+ //# debugId=7ED7D7B3739F8AC964756E2164756E21
package/dist/index.js.map CHANGED
@@ -9,7 +9,7 @@
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": "39FD32C1DDBBC7E564756E2164756E21",
12
+ "mappings": "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",
13
+ "debugId": "7ED7D7B3739F8AC964756E2164756E21",
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.3.4",
4
+ "version": "1.3.5",
5
5
  "type": "module",
6
6
  "files": [
7
7
  "dist",