@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 +728 -3
- package/dist/index.js.map +2 -2
- package/package.json +1 -1
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
|
-
|
|
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
|
-
|
|
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": "
|
|
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
|
+
"version": "1.3.5",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
|
7
7
|
"dist",
|