exisjs 0.5.9 → 0.5.11
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/auth/index.d.ts +3 -1
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +4 -1
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/oauth/core.d.ts +96 -0
- package/dist/auth/oauth/core.d.ts.map +1 -0
- package/dist/auth/oauth/core.js +203 -0
- package/dist/auth/oauth/core.js.map +1 -0
- package/dist/auth/oauth/index.d.ts +45 -0
- package/dist/auth/oauth/index.d.ts.map +1 -0
- package/dist/auth/oauth/index.js +64 -0
- package/dist/auth/oauth/index.js.map +1 -0
- package/dist/auth/oauth/middleware.d.ts +63 -0
- package/dist/auth/oauth/middleware.d.ts.map +1 -0
- package/dist/auth/oauth/middleware.js +164 -0
- package/dist/auth/oauth/middleware.js.map +1 -0
- package/dist/auth/oauth/providers/custom.d.ts +41 -0
- package/dist/auth/oauth/providers/custom.d.ts.map +1 -0
- package/dist/auth/oauth/providers/custom.js +204 -0
- package/dist/auth/oauth/providers/custom.js.map +1 -0
- package/dist/auth/oauth/providers/discord.d.ts +23 -0
- package/dist/auth/oauth/providers/discord.d.ts.map +1 -0
- package/dist/auth/oauth/providers/discord.js +130 -0
- package/dist/auth/oauth/providers/discord.js.map +1 -0
- package/dist/auth/oauth/providers/facebook.d.ts +28 -0
- package/dist/auth/oauth/providers/facebook.d.ts.map +1 -0
- package/dist/auth/oauth/providers/facebook.js +124 -0
- package/dist/auth/oauth/providers/facebook.js.map +1 -0
- package/dist/auth/oauth/providers/github.d.ts +25 -0
- package/dist/auth/oauth/providers/github.d.ts.map +1 -0
- package/dist/auth/oauth/providers/github.js +132 -0
- package/dist/auth/oauth/providers/github.js.map +1 -0
- package/dist/auth/oauth/providers/google.d.ts +23 -0
- package/dist/auth/oauth/providers/google.d.ts.map +1 -0
- package/dist/auth/oauth/providers/google.js +134 -0
- package/dist/auth/oauth/providers/google.js.map +1 -0
- package/dist/auth/oauth/providers/microsoft.d.ts +28 -0
- package/dist/auth/oauth/providers/microsoft.d.ts.map +1 -0
- package/dist/auth/oauth/providers/microsoft.js +136 -0
- package/dist/auth/oauth/providers/microsoft.js.map +1 -0
- package/dist/auth/oauth/types.d.ts +158 -0
- package/dist/auth/oauth/types.d.ts.map +1 -0
- package/dist/auth/oauth/types.js +4 -0
- package/dist/auth/oauth/types.js.map +1 -0
- package/dist/auth/session.d.ts +4 -1
- package/dist/auth/session.d.ts.map +1 -1
- package/dist/auth/session.js +33 -5
- package/dist/auth/session.js.map +1 -1
- package/dist/cache/store.d.ts +11 -3
- package/dist/cache/store.d.ts.map +1 -1
- package/dist/cache/store.js +87 -19
- package/dist/cache/store.js.map +1 -1
- package/dist/cli/commands/dev.d.ts.map +1 -1
- package/dist/cli/commands/dev.js +4 -6
- package/dist/cli/commands/dev.js.map +1 -1
- package/dist/database/adapters/mongodb.d.ts +58 -0
- package/dist/database/adapters/mongodb.d.ts.map +1 -0
- package/dist/database/adapters/mongodb.js +264 -0
- package/dist/database/adapters/mongodb.js.map +1 -0
- package/dist/database/adapters/mysql.d.ts +27 -0
- package/dist/database/adapters/mysql.d.ts.map +1 -0
- package/dist/database/adapters/mysql.js +188 -0
- package/dist/database/adapters/mysql.js.map +1 -0
- package/dist/database/adapters/postgres.d.ts +28 -0
- package/dist/database/adapters/postgres.d.ts.map +1 -0
- package/dist/database/adapters/postgres.js +174 -0
- package/dist/database/adapters/postgres.js.map +1 -0
- package/dist/database/adapters/sqlite.d.ts +27 -0
- package/dist/database/adapters/sqlite.d.ts.map +1 -0
- package/dist/database/adapters/sqlite.js +149 -0
- package/dist/database/adapters/sqlite.js.map +1 -0
- package/dist/database/index.d.ts +42 -0
- package/dist/database/index.d.ts.map +1 -0
- package/dist/database/index.js +58 -0
- package/dist/database/index.js.map +1 -0
- package/dist/database/manager.d.ts +114 -0
- package/dist/database/manager.d.ts.map +1 -0
- package/dist/database/manager.js +269 -0
- package/dist/database/manager.js.map +1 -0
- package/dist/database/migration.d.ts +57 -0
- package/dist/database/migration.d.ts.map +1 -0
- package/dist/database/migration.js +329 -0
- package/dist/database/migration.js.map +1 -0
- package/dist/database/query-builder.d.ts +89 -0
- package/dist/database/query-builder.d.ts.map +1 -0
- package/dist/database/query-builder.js +353 -0
- package/dist/database/query-builder.js.map +1 -0
- package/dist/database/types.d.ts +184 -0
- package/dist/database/types.d.ts.map +1 -0
- package/dist/database/types.js +4 -0
- package/dist/database/types.js.map +1 -0
- package/dist/docs/ARCHITECTURE.md +349 -0
- package/dist/docs/BENCHMARKS.md +36 -0
- package/dist/docs/README.md +34 -0
- package/dist/docs/content/README.md +44 -0
- package/dist/docs/content/adapters.mdx +199 -0
- package/dist/docs/content/cache.mdx +239 -0
- package/dist/docs/content/circuit-breaker.mdx +130 -0
- package/dist/docs/content/cli/commands.mdx +214 -0
- package/dist/docs/content/cli/overview.mdx +92 -0
- package/dist/docs/content/cli/usage.mdx +61 -0
- package/dist/docs/content/config.mdx +214 -0
- package/dist/docs/content/controllers.mdx +241 -0
- package/dist/docs/content/cron.mdx +109 -0
- package/dist/docs/content/database.mdx +209 -0
- package/dist/docs/content/dataloader.mdx +170 -0
- package/dist/docs/content/decorators.mdx +204 -0
- package/dist/docs/content/errors.mdx +344 -0
- package/dist/docs/content/gateways.mdx +376 -0
- package/dist/docs/content/installation.mdx +210 -0
- package/dist/docs/content/introduction.mdx +96 -0
- package/dist/docs/content/middleware.mdx +441 -0
- package/dist/docs/content/modules.mdx +144 -0
- package/dist/docs/content/oauth.mdx +179 -0
- package/dist/docs/content/providers.mdx +147 -0
- package/dist/docs/content/queues.mdx +177 -0
- package/dist/docs/content/requests.mdx +293 -0
- package/dist/docs/content/responses.mdx +271 -0
- package/dist/docs/content/routing.mdx +541 -0
- package/dist/docs/content/rpc.mdx +146 -0
- package/dist/docs/content/security.mdx +294 -0
- package/dist/docs/content/sse.mdx +159 -0
- package/dist/docs/content/structure.mdx +116 -0
- package/dist/docs/content/testing.mdx +139 -0
- package/dist/docs/content/validation.mdx +249 -0
- package/dist/docs/content/websockets.mdx +289 -0
- package/dist/docs/integrations/README.md +23 -0
- package/dist/docs/integrations/jwt.mdx +151 -0
- package/dist/docs/integrations/mongo.mdx +183 -0
- package/dist/docs/integrations/observability.mdx +125 -0
- package/dist/docs/integrations/openai.mdx +108 -0
- package/dist/docs/integrations/postgres.mdx +190 -0
- package/dist/docs/integrations/posthog.mdx +122 -0
- package/dist/docs/integrations/redis.mdx +141 -0
- package/dist/docs/integrations/resend.mdx +117 -0
- package/dist/docs/integrations/s3.mdx +122 -0
- package/dist/docs/integrations/swagger.mdx +113 -0
- package/dist/docs/reference/README.md +3 -0
- package/dist/docs/reference/adapters.mdx +130 -0
- package/dist/docs/reference/auth.mdx +183 -0
- package/dist/docs/reference/cache.mdx +132 -0
- package/dist/docs/reference/circuit-breaker.mdx +71 -0
- package/dist/docs/reference/config.mdx +118 -0
- package/dist/docs/reference/context.mdx +168 -0
- package/dist/docs/reference/dataloader.mdx +91 -0
- package/dist/docs/reference/decorators.mdx +293 -0
- package/dist/docs/reference/di.mdx +123 -0
- package/dist/docs/reference/error.mdx +170 -0
- package/dist/docs/reference/exis.mdx +124 -0
- package/dist/docs/reference/middleware.mdx +304 -0
- package/dist/docs/reference/plugin.mdx +113 -0
- package/dist/docs/reference/queue.mdx +155 -0
- package/dist/docs/reference/router.mdx +248 -0
- package/dist/docs/reference/sanitize.mdx +130 -0
- package/dist/docs/reference/storage.mdx +116 -0
- package/dist/docs/reference/swagger.mdx +132 -0
- package/dist/docs/reference/testing.mdx +145 -0
- package/dist/docs/reference/validator.mdx +186 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -1
- package/dist/index.js.map +1 -1
- package/dist/middleware/backpressure.d.ts.map +1 -1
- package/dist/middleware/backpressure.js +21 -12
- package/dist/middleware/backpressure.js.map +1 -1
- package/dist/middleware/cache.d.ts +6 -0
- package/dist/middleware/cache.d.ts.map +1 -1
- package/dist/middleware/cache.js +84 -28
- package/dist/middleware/cache.js.map +1 -1
- package/dist/middleware/idempotency.d.ts +4 -1
- package/dist/middleware/idempotency.d.ts.map +1 -1
- package/dist/middleware/idempotency.js +29 -4
- package/dist/middleware/idempotency.js.map +1 -1
- package/dist/middleware/ip-filter.d.ts.map +1 -1
- package/dist/middleware/ip-filter.js +16 -0
- package/dist/middleware/ip-filter.js.map +1 -1
- package/dist/middleware/rate-limit.d.ts.map +1 -1
- package/dist/middleware/rate-limit.js +29 -12
- package/dist/middleware/rate-limit.js.map +1 -1
- package/dist/queue/drivers/MemoryDriver.d.ts +6 -3
- package/dist/queue/drivers/MemoryDriver.d.ts.map +1 -1
- package/dist/queue/drivers/MemoryDriver.js +76 -23
- package/dist/queue/drivers/MemoryDriver.js.map +1 -1
- package/dist/server/bootstrapper.d.ts +3 -0
- package/dist/server/bootstrapper.d.ts.map +1 -1
- package/dist/server/bootstrapper.js +56 -8
- package/dist/server/bootstrapper.js.map +1 -1
- package/dist/server/bun-adapter.d.ts +2 -0
- package/dist/server/bun-adapter.d.ts.map +1 -1
- package/dist/server/bun-adapter.js +23 -12
- package/dist/server/bun-adapter.js.map +1 -1
- package/dist/server/request-handler.d.ts +0 -2
- package/dist/server/request-handler.d.ts.map +1 -1
- package/dist/server/request-handler.js +2 -24
- package/dist/server/request-handler.js.map +1 -1
- package/dist/server/request.d.ts.map +1 -1
- package/dist/server/request.js +24 -11
- package/dist/server/request.js.map +1 -1
- package/dist/server/uws-adapter.d.ts +80 -0
- package/dist/server/uws-adapter.d.ts.map +1 -0
- package/dist/server/uws-adapter.js +357 -0
- package/dist/server/uws-adapter.js.map +1 -0
- package/dist/server/ws-orchestrator.d.ts +1 -0
- package/dist/server/ws-orchestrator.d.ts.map +1 -1
- package/dist/server/ws-orchestrator.js +83 -0
- package/dist/server/ws-orchestrator.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/config.js.map +1 -1
- package/dist/validator/tex.d.ts +21 -16
- package/dist/validator/tex.d.ts.map +1 -1
- package/dist/validator/tex.js.map +1 -1
- package/package.json +11 -3
|
@@ -12,7 +12,10 @@ export interface IdempotencyStore {
|
|
|
12
12
|
}, ttlMs?: number): Promise<void>;
|
|
13
13
|
}
|
|
14
14
|
export declare class MemoryIdempotencyStore implements IdempotencyStore {
|
|
15
|
-
private
|
|
15
|
+
private nativeCache;
|
|
16
|
+
private fallbackCache;
|
|
17
|
+
private isFallback;
|
|
18
|
+
constructor();
|
|
16
19
|
get(key: string): Promise<any>;
|
|
17
20
|
set(key: string, data: any, ttlMs?: number): Promise<void>;
|
|
18
21
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"idempotency.d.ts","sourceRoot":"","sources":["../../src/middleware/idempotency.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAIvC,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QACxB,UAAU,EAAE,MAAM,CAAA;QAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QAC/B,IAAI,EAAE,GAAG,CAAA;KACV,GAAG,IAAI,CAAC,CAAA;IACT,GAAG,CACD,GAAG,EAAE,MAAM,EACX,IAAI,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,IAAI,EAAE,GAAG,CAAA;KAAE,EACxE,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAAA;CACjB;AAED,qBAAa,sBAAuB,YAAW,gBAAgB;IAC7D,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"idempotency.d.ts","sourceRoot":"","sources":["../../src/middleware/idempotency.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAIvC,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QACxB,UAAU,EAAE,MAAM,CAAA;QAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QAC/B,IAAI,EAAE,GAAG,CAAA;KACV,GAAG,IAAI,CAAC,CAAA;IACT,GAAG,CACD,GAAG,EAAE,MAAM,EACX,IAAI,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,IAAI,EAAE,GAAG,CAAA;KAAE,EACxE,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAAA;CACjB;AAED,qBAAa,sBAAuB,YAAW,gBAAgB;IAC7D,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,aAAa,CAAmD;IACxE,OAAO,CAAC,UAAU,CAAQ;;IAapB,GAAG,CAAC,GAAG,EAAE,MAAM;IAoBf,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,SAAW;CAQnD;AAID,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,gBAAgB,CAAA;IACxB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,4FAA4F;IAC5F,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAwEnE;AAED,uDAAuD;AACvD,eAAO,MAAM,UAAU,mBAAa,CAAA"}
|
|
@@ -4,20 +4,45 @@ exports.Idempotent = exports.MemoryIdempotencyStore = void 0;
|
|
|
4
4
|
exports.idempotent = idempotent;
|
|
5
5
|
class MemoryIdempotencyStore {
|
|
6
6
|
constructor() {
|
|
7
|
-
this.
|
|
7
|
+
this.fallbackCache = new Map();
|
|
8
|
+
this.isFallback = false;
|
|
9
|
+
try {
|
|
10
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
11
|
+
const { NativeMemoryCache } = require('@exisjs/rs');
|
|
12
|
+
// Cap at 10,000 concurrent idempotent requests to prevent memory exhaustion
|
|
13
|
+
this.nativeCache = new NativeMemoryCache(10000);
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
this.isFallback = true;
|
|
17
|
+
}
|
|
8
18
|
}
|
|
9
19
|
async get(key) {
|
|
10
|
-
|
|
20
|
+
if (!this.isFallback) {
|
|
21
|
+
const dataStr = this.nativeCache.get(key);
|
|
22
|
+
if (!dataStr)
|
|
23
|
+
return null;
|
|
24
|
+
try {
|
|
25
|
+
return JSON.parse(dataStr);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
const item = this.fallbackCache.get(key);
|
|
11
32
|
if (!item)
|
|
12
33
|
return null;
|
|
13
34
|
if (Date.now() > item.expiry) {
|
|
14
|
-
this.
|
|
35
|
+
this.fallbackCache.delete(key);
|
|
15
36
|
return null;
|
|
16
37
|
}
|
|
17
38
|
return item.data;
|
|
18
39
|
}
|
|
19
40
|
async set(key, data, ttlMs = 86400000) {
|
|
20
|
-
this.
|
|
41
|
+
if (!this.isFallback) {
|
|
42
|
+
this.nativeCache.set(key, JSON.stringify(data), ttlMs);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
this.fallbackCache.set(key, { data, expiry: Date.now() + ttlMs });
|
|
21
46
|
}
|
|
22
47
|
}
|
|
23
48
|
exports.MemoryIdempotencyStore = MemoryIdempotencyStore;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"idempotency.js","sourceRoot":"","sources":["../../src/middleware/idempotency.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"idempotency.js","sourceRoot":"","sources":["../../src/middleware/idempotency.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ip-filter.d.ts","sourceRoot":"","sources":["../../src/middleware/ip-filter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAmC,MAAM,UAAU,CAAA;AAGxE,MAAM,WAAW,eAAe;IAC9B,gFAAgF;IAChF,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,kEAAkE;IAClE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,qFAAqF;IACrF,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAuDD,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,
|
|
1
|
+
{"version":3,"file":"ip-filter.d.ts","sourceRoot":"","sources":["../../src/middleware/ip-filter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAmC,MAAM,UAAU,CAAA;AAGxE,MAAM,WAAW,eAAe;IAC9B,gFAAgF;IAChF,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,kEAAkE;IAClE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,qFAAqF;IACrF,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAuDD,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CA0CzE"}
|
|
@@ -62,8 +62,24 @@ function ipFilterMiddleware(options = {}) {
|
|
|
62
62
|
const denyRules = options.deny ?? null;
|
|
63
63
|
const message = options.message ?? 'Access Denied';
|
|
64
64
|
const trustProxy = options.trustProxy !== false; // default true
|
|
65
|
+
let nativeFilter = null;
|
|
66
|
+
let isFallback = false;
|
|
67
|
+
try {
|
|
68
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
69
|
+
const { NativeIpFilter } = require('@exisjs/rs');
|
|
70
|
+
nativeFilter = new NativeIpFilter(allowRules, denyRules);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
isFallback = true;
|
|
74
|
+
}
|
|
65
75
|
return (req, res, next) => {
|
|
66
76
|
const ip = resolveIp(req, trustProxy);
|
|
77
|
+
if (!isFallback && nativeFilter) {
|
|
78
|
+
if (!nativeFilter.check(ip)) {
|
|
79
|
+
return next(errors_1.HttpError.forbidden(message));
|
|
80
|
+
}
|
|
81
|
+
return next();
|
|
82
|
+
}
|
|
67
83
|
// If allowlist is defined, IP MUST match at least one rule
|
|
68
84
|
if (allowRules !== null) {
|
|
69
85
|
if (!ipMatchesAny(ip, allowRules)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ip-filter.js","sourceRoot":"","sources":["../../src/middleware/ip-filter.ts"],"names":[],"mappings":";;AAmEA,
|
|
1
|
+
{"version":3,"file":"ip-filter.js","sourceRoot":"","sources":["../../src/middleware/ip-filter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../src/middleware/rate-limit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAA0B,OAAO,EAAE,MAAM,UAAU,CAAA;AAGxE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,CAAA;IACvC,KAAK,CAAC,EAAE,GAAG,CAAA;IACX,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,wBAAgB,SAAS,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,
|
|
1
|
+
{"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../src/middleware/rate-limit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAA0B,OAAO,EAAE,MAAM,UAAU,CAAA;AAGxE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,CAAA;IACvC,KAAK,CAAC,EAAE,GAAG,CAAA;IACX,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,wBAAgB,SAAS,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAwFjE"}
|
|
@@ -15,17 +15,31 @@ function rateLimit(options = {}) {
|
|
|
15
15
|
// If the app is behind a reverse proxy, the user should configure the proxy settings on the app instance.
|
|
16
16
|
return req.ip || 'unknown';
|
|
17
17
|
});
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
18
|
+
// Initialize the native rate limiter. Fallback to a JS Map if the native module fails to load in a strange environment.
|
|
19
|
+
let nativeLimiter = null;
|
|
20
|
+
const fallbackHits = new Map();
|
|
21
|
+
try {
|
|
22
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
23
|
+
const { NativeRateLimiter } = require('@exisjs/rs');
|
|
24
|
+
nativeLimiter = new NativeRateLimiter(windowMs);
|
|
25
|
+
// Sweep native memory periodically via background Rust thread
|
|
26
|
+
const sweepInterval = setInterval(() => {
|
|
27
|
+
nativeLimiter.sweep();
|
|
28
|
+
}, windowMs);
|
|
29
|
+
sweepInterval.unref();
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
// Sweep JS memory fallback
|
|
33
|
+
const sweepInterval = setInterval(() => {
|
|
34
|
+
const now = Date.now();
|
|
35
|
+
for (const [key, data] of fallbackHits.entries()) {
|
|
36
|
+
if (data.resetTime <= now) {
|
|
37
|
+
fallbackHits.delete(key);
|
|
38
|
+
}
|
|
25
39
|
}
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
|
|
40
|
+
}, windowMs);
|
|
41
|
+
sweepInterval.unref();
|
|
42
|
+
}
|
|
29
43
|
return async (req, res, next) => {
|
|
30
44
|
try {
|
|
31
45
|
const key = keyGenerator(req);
|
|
@@ -42,13 +56,16 @@ function rateLimit(options = {}) {
|
|
|
42
56
|
}
|
|
43
57
|
currentHits = results[0][1];
|
|
44
58
|
}
|
|
59
|
+
else if (nativeLimiter) {
|
|
60
|
+
currentHits = nativeLimiter.hit(key);
|
|
61
|
+
}
|
|
45
62
|
else {
|
|
46
|
-
let record =
|
|
63
|
+
let record = fallbackHits.get(key);
|
|
47
64
|
if (!record || record.resetTime <= now) {
|
|
48
65
|
record = { count: 0, resetTime: now + windowMs };
|
|
49
66
|
}
|
|
50
67
|
record.count += 1;
|
|
51
|
-
|
|
68
|
+
fallbackHits.set(key, record);
|
|
52
69
|
currentHits = record.count;
|
|
53
70
|
}
|
|
54
71
|
res.set('X-RateLimit-Limit', max.toString());
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../src/middleware/rate-limit.ts"],"names":[],"mappings":";;AAaA,
|
|
1
|
+
{"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../src/middleware/rate-limit.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import type { QueueDriver, JobPayload, JobDefinition } from '../types';
|
|
2
2
|
export declare class MemoryQueueDriver implements QueueDriver {
|
|
3
|
-
private
|
|
4
|
-
private
|
|
5
|
-
private
|
|
3
|
+
private nativeQueue;
|
|
4
|
+
private fallbackPending;
|
|
5
|
+
private fallbackProcessing;
|
|
6
|
+
private fallbackDeadLetter;
|
|
7
|
+
private isFallback;
|
|
8
|
+
constructor();
|
|
6
9
|
private getList;
|
|
7
10
|
enqueue(name: string, payload: JobPayload, maxQueue?: number): Promise<string>;
|
|
8
11
|
poll(jobs: Map<string, JobDefinition>): Promise<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemoryDriver.d.ts","sourceRoot":"","sources":["../../../src/queue/drivers/MemoryDriver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"MemoryDriver.d.ts","sourceRoot":"","sources":["../../../src/queue/drivers/MemoryDriver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAEtE,qBAAa,iBAAkB,YAAW,WAAW;IACnD,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,eAAe,CAA2B;IAClD,OAAO,CAAC,kBAAkB,CAA2B;IACrD,OAAO,CAAC,kBAAkB,CAA2B;IACrD,OAAO,CAAC,UAAU,CAAQ;;IAgB1B,OAAO,CAAC,OAAO;IAOT,OAAO,CACX,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,UAAU,EACnB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC;IAmCZ,IAAI,CACR,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,GAC/B,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IA6CpE,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa1D,IAAI,CACR,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,UAAU,EACnB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,KAAK,GACX,OAAO,CAAC,IAAI,CAAC;IAwDV,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IA4BtD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAQ7B"}
|
|
@@ -3,9 +3,22 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.MemoryQueueDriver = void 0;
|
|
4
4
|
class MemoryQueueDriver {
|
|
5
5
|
constructor() {
|
|
6
|
-
this.
|
|
7
|
-
this.
|
|
8
|
-
this.
|
|
6
|
+
this.fallbackPending = new Map();
|
|
7
|
+
this.fallbackProcessing = new Map();
|
|
8
|
+
this.fallbackDeadLetter = new Map();
|
|
9
|
+
this.isFallback = false;
|
|
10
|
+
try {
|
|
11
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
12
|
+
const { NativeMemoryQueue } = require('@exisjs/rs');
|
|
13
|
+
this.nativeQueue = new NativeMemoryQueue();
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
// Fallback if native module fails to load
|
|
17
|
+
this.isFallback = true;
|
|
18
|
+
this.fallbackPending = new Map();
|
|
19
|
+
this.fallbackProcessing = new Map();
|
|
20
|
+
this.fallbackDeadLetter = new Map();
|
|
21
|
+
}
|
|
9
22
|
}
|
|
10
23
|
getList(map, key) {
|
|
11
24
|
if (!map.has(key)) {
|
|
@@ -14,31 +27,50 @@ class MemoryQueueDriver {
|
|
|
14
27
|
return map.get(key);
|
|
15
28
|
}
|
|
16
29
|
async enqueue(name, payload, maxQueue) {
|
|
17
|
-
const
|
|
30
|
+
const score = Date.now() + (payload.opts?.delay || 0);
|
|
31
|
+
if (!this.isFallback) {
|
|
32
|
+
try {
|
|
33
|
+
this.nativeQueue.enqueue(name, payload.id, JSON.stringify(payload), score, maxQueue);
|
|
34
|
+
return payload.id;
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
throw new Error(err.message, { cause: err });
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
const pendingList = this.getList(this.fallbackPending, name);
|
|
18
41
|
if (maxQueue !== undefined && pendingList.length >= maxQueue) {
|
|
19
42
|
throw new Error(`Queue backpressure activated: maximum queue size (${maxQueue}) reached for job ${name}.`);
|
|
20
43
|
}
|
|
21
|
-
const score = Date.now() + (payload.opts?.delay || 0);
|
|
22
44
|
pendingList.push({
|
|
23
45
|
id: payload.id,
|
|
24
46
|
payloadStr: JSON.stringify(payload),
|
|
25
47
|
score,
|
|
26
48
|
});
|
|
27
|
-
// Keep it sorted by score
|
|
28
49
|
pendingList.sort((a, b) => a.score - b.score);
|
|
29
50
|
return payload.id;
|
|
30
51
|
}
|
|
31
52
|
async poll(jobs) {
|
|
53
|
+
if (!this.isFallback) {
|
|
54
|
+
const jobNames = Array.from(jobs.keys());
|
|
55
|
+
const visibilityTimeouts = jobNames.map((name) => jobs.get(name)?.defaultOptions?.visibilityTimeout ?? 30000);
|
|
56
|
+
const result = this.nativeQueue.poll(jobNames, visibilityTimeouts);
|
|
57
|
+
if (result && result.length === 3) {
|
|
58
|
+
return {
|
|
59
|
+
queueKey: result[0],
|
|
60
|
+
jobId: result[1],
|
|
61
|
+
payloadStr: result[2],
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
32
66
|
const now = Date.now();
|
|
33
67
|
for (const name of jobs.keys()) {
|
|
34
|
-
const pendingList = this.getList(this.
|
|
68
|
+
const pendingList = this.getList(this.fallbackPending, name);
|
|
35
69
|
if (pendingList.length > 0 && pendingList[0].score <= now) {
|
|
36
|
-
// Pop the job
|
|
37
70
|
const job = pendingList.shift();
|
|
38
71
|
const jobDef = jobs.get(name);
|
|
39
72
|
const visibilityTimeout = jobDef?.defaultOptions?.visibilityTimeout ?? 30000;
|
|
40
|
-
|
|
41
|
-
const processingList = this.getList(this.processing, name);
|
|
73
|
+
const processingList = this.getList(this.fallbackProcessing, name);
|
|
42
74
|
processingList.push({
|
|
43
75
|
id: job.id,
|
|
44
76
|
payloadStr: job.payloadStr,
|
|
@@ -54,14 +86,29 @@ class MemoryQueueDriver {
|
|
|
54
86
|
return null;
|
|
55
87
|
}
|
|
56
88
|
async acknowledge(jobName, jobId) {
|
|
57
|
-
|
|
89
|
+
if (!this.isFallback) {
|
|
90
|
+
this.nativeQueue.acknowledge(jobName, jobId);
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const processingList = this.getList(this.fallbackProcessing, jobName);
|
|
58
94
|
const index = processingList.findIndex((j) => j.id === jobId);
|
|
59
95
|
if (index !== -1) {
|
|
60
96
|
processingList.splice(index, 1);
|
|
61
97
|
}
|
|
62
98
|
}
|
|
63
99
|
async fail(jobDef, jobId, payload, maxAttempts, error) {
|
|
64
|
-
|
|
100
|
+
if (!this.isFallback) {
|
|
101
|
+
const isDeadLetter = payload.attemptsMade >= maxAttempts;
|
|
102
|
+
const delay = isDeadLetter ? 0 : (payload.opts?.backoff?.delay ?? 0);
|
|
103
|
+
this.nativeQueue.fail(jobDef.name, jobId, JSON.stringify(payload), delay, isDeadLetter);
|
|
104
|
+
if (isDeadLetter && jobDef.onJobFailedPermanently) {
|
|
105
|
+
Promise.resolve(jobDef.onJobFailedPermanently(payload, error)).catch(() => {
|
|
106
|
+
/* noop */
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
const processingList = this.getList(this.fallbackProcessing, jobDef.name);
|
|
65
112
|
const index = processingList.findIndex((j) => j.id === jobId);
|
|
66
113
|
if (index !== -1) {
|
|
67
114
|
processingList.splice(index, 1);
|
|
@@ -69,7 +116,7 @@ class MemoryQueueDriver {
|
|
|
69
116
|
if (payload.attemptsMade < maxAttempts) {
|
|
70
117
|
const delay = payload.opts?.backoff?.delay ?? 0;
|
|
71
118
|
const score = Date.now() + delay;
|
|
72
|
-
const pendingList = this.getList(this.
|
|
119
|
+
const pendingList = this.getList(this.fallbackPending, jobDef.name);
|
|
73
120
|
pendingList.push({
|
|
74
121
|
id: jobId,
|
|
75
122
|
payloadStr: JSON.stringify(payload),
|
|
@@ -78,7 +125,7 @@ class MemoryQueueDriver {
|
|
|
78
125
|
pendingList.sort((a, b) => a.score - b.score);
|
|
79
126
|
}
|
|
80
127
|
else {
|
|
81
|
-
const deadLetterList = this.getList(this.
|
|
128
|
+
const deadLetterList = this.getList(this.fallbackDeadLetter, jobDef.name);
|
|
82
129
|
deadLetterList.push({
|
|
83
130
|
id: jobId,
|
|
84
131
|
payloadStr: JSON.stringify(payload),
|
|
@@ -86,23 +133,24 @@ class MemoryQueueDriver {
|
|
|
86
133
|
});
|
|
87
134
|
if (jobDef.onJobFailedPermanently) {
|
|
88
135
|
Promise.resolve(jobDef.onJobFailedPermanently(payload, error)).catch(() => {
|
|
89
|
-
/*
|
|
136
|
+
/* noop */
|
|
90
137
|
});
|
|
91
138
|
}
|
|
92
139
|
}
|
|
93
140
|
}
|
|
94
141
|
async sweep(jobs) {
|
|
142
|
+
if (!this.isFallback) {
|
|
143
|
+
this.nativeQueue.sweep(Array.from(jobs.keys()));
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
95
146
|
const now = Date.now();
|
|
96
147
|
for (const name of jobs.keys()) {
|
|
97
|
-
const processingList = this.getList(this.
|
|
98
|
-
const pendingList = this.getList(this.
|
|
99
|
-
// Find expired
|
|
148
|
+
const processingList = this.getList(this.fallbackProcessing, name);
|
|
149
|
+
const pendingList = this.getList(this.fallbackPending, name);
|
|
100
150
|
const expired = processingList.filter((j) => j.score <= now);
|
|
101
151
|
if (expired.length > 0) {
|
|
102
|
-
// Remove from processing
|
|
103
152
|
const remaining = processingList.filter((j) => j.score > now);
|
|
104
|
-
this.
|
|
105
|
-
// Add back to pending
|
|
153
|
+
this.fallbackProcessing.set(name, remaining);
|
|
106
154
|
for (const job of expired) {
|
|
107
155
|
pendingList.push({
|
|
108
156
|
id: job.id,
|
|
@@ -115,8 +163,13 @@ class MemoryQueueDriver {
|
|
|
115
163
|
}
|
|
116
164
|
}
|
|
117
165
|
async close() {
|
|
118
|
-
this.
|
|
119
|
-
|
|
166
|
+
if (!this.isFallback) {
|
|
167
|
+
this.nativeQueue.close();
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
this.fallbackPending.clear();
|
|
171
|
+
this.fallbackProcessing.clear();
|
|
172
|
+
}
|
|
120
173
|
}
|
|
121
174
|
}
|
|
122
175
|
exports.MemoryQueueDriver = MemoryQueueDriver;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemoryDriver.js","sourceRoot":"","sources":["../../../src/queue/drivers/MemoryDriver.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"MemoryDriver.js","sourceRoot":"","sources":["../../../src/queue/drivers/MemoryDriver.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,6 +12,9 @@ export declare class ServerBootstrapper {
|
|
|
12
12
|
_useBun: boolean;
|
|
13
13
|
_bunApp: ReturnType<typeof createBunApp> | null;
|
|
14
14
|
private bunServerInstance;
|
|
15
|
+
_useUws: boolean;
|
|
16
|
+
_uwsApp: any;
|
|
17
|
+
private uwsListenToken;
|
|
15
18
|
constructor(app: App<any>);
|
|
16
19
|
getServer(): HttpServer | HttpsServer | Http2SecureServer;
|
|
17
20
|
private _initServer;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrapper.d.ts","sourceRoot":"","sources":["../../src/server/bootstrapper.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,WAAW,CAAA;AAErD,OAAO,KAAK,EAAE,MAAM,IAAI,WAAW,EAAE,MAAM,YAAY,CAAA;AAEvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAE7C,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA;AAEhC,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,GAAG,CAAU;IACrB,OAAO,CAAC,MAAM,CAA+C;IAC7D,OAAO,CAAC,cAAc,CAA0B;IAChD,OAAO,CAAC,aAAa,CAAqC;IAEnD,OAAO,UAAQ;IACf,OAAO,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,GAAG,IAAI,CAAO;IAC7D,OAAO,CAAC,iBAAiB,CAAY;
|
|
1
|
+
{"version":3,"file":"bootstrapper.d.ts","sourceRoot":"","sources":["../../src/server/bootstrapper.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,WAAW,CAAA;AAErD,OAAO,KAAK,EAAE,MAAM,IAAI,WAAW,EAAE,MAAM,YAAY,CAAA;AAEvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAE7C,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA;AAEhC,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,GAAG,CAAU;IACrB,OAAO,CAAC,MAAM,CAA+C;IAC7D,OAAO,CAAC,cAAc,CAA0B;IAChD,OAAO,CAAC,aAAa,CAAqC;IAEnD,OAAO,UAAQ;IACf,OAAO,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,GAAG,IAAI,CAAO;IAC7D,OAAO,CAAC,iBAAiB,CAAY;IAE9B,OAAO,UAAQ;IACf,OAAO,EAAE,GAAG,CAAO;IAC1B,OAAO,CAAC,cAAc,CAAY;gBAEtB,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC;IAqClB,SAAS,IAAI,UAAU,GAAG,WAAW,GAAG,iBAAiB;IAIhE,OAAO,CAAC,WAAW;IA+CZ,MAAM,CACX,aAAa,CAAC,EAAE,MAAM,GAAG,aAAa,EACtC,QAAQ,CAAC,EAAE,MAAM,IAAI,GACpB,UAAU,GAAG,WAAW,GAAG,iBAAiB;IAqMlC,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;IAqFzC,UAAU,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI;IAKlD,KAAK,CAAC,OAAO,SAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAuH5C"}
|
|
@@ -46,26 +46,37 @@ class ServerBootstrapper {
|
|
|
46
46
|
this._useBun = false;
|
|
47
47
|
this._bunApp = null;
|
|
48
48
|
this.bunServerInstance = null;
|
|
49
|
+
this._useUws = false;
|
|
50
|
+
this._uwsApp = null;
|
|
51
|
+
this.uwsListenToken = null;
|
|
49
52
|
this.app = app;
|
|
50
|
-
|
|
51
|
-
if (
|
|
52
|
-
|
|
53
|
+
const requestedServer = app.explicitOptions.server;
|
|
54
|
+
if (requestedServer === 'uws') {
|
|
55
|
+
try {
|
|
56
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
57
|
+
require('uWebSockets.js');
|
|
58
|
+
this._useUws = true;
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
app.log.warn("server: 'uws' was requested, but uWebSockets.js is not available. Falling back to the native Node.js HTTP server.");
|
|
62
|
+
this.server = this._initServer();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
else if (requestedServer === 'bun' ||
|
|
66
|
+
(requestedServer !== 'node' &&
|
|
53
67
|
typeof Bun !== 'undefined' &&
|
|
54
68
|
app.options.env !== 'test')) {
|
|
55
69
|
if (typeof Bun !== 'undefined') {
|
|
56
70
|
this._useBun = true;
|
|
57
|
-
// Don't init Node server - we'll create the Bun app at listen() time
|
|
58
71
|
}
|
|
59
72
|
else {
|
|
60
|
-
if (
|
|
73
|
+
if (requestedServer === 'bun') {
|
|
61
74
|
app.log.warn("server: 'bun' was requested, but Bun is not available. Falling back to the native Node.js HTTP server.");
|
|
62
75
|
}
|
|
63
|
-
this._useBun = false;
|
|
64
76
|
this.server = this._initServer();
|
|
65
77
|
}
|
|
66
78
|
}
|
|
67
79
|
else {
|
|
68
|
-
this._useBun = false;
|
|
69
80
|
this.server = this._initServer();
|
|
70
81
|
}
|
|
71
82
|
}
|
|
@@ -131,6 +142,38 @@ class ServerBootstrapper {
|
|
|
131
142
|
port = this.app.options.port;
|
|
132
143
|
host = this.app.options.host;
|
|
133
144
|
}
|
|
145
|
+
// --- uWebSockets.js listen path ---
|
|
146
|
+
if (this._useUws) {
|
|
147
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
148
|
+
const { createUwsApp } = require('./uws-adapter');
|
|
149
|
+
this._uwsApp = createUwsApp(this.app.handle.bind(this.app), this.app.wsOrchestrator.handleUwsUpgrade.bind(this.app.wsOrchestrator), this.app.options.ssl);
|
|
150
|
+
this._uwsApp.listen(port, host, async (tokenInfo) => {
|
|
151
|
+
if (!tokenInfo) {
|
|
152
|
+
console.error(`\n\x1b[31m? Port ${port} is already in use (uWS).\x1b[0m`);
|
|
153
|
+
process.exit(1);
|
|
154
|
+
}
|
|
155
|
+
this.uwsListenToken = tokenInfo.token;
|
|
156
|
+
const address = { port: tokenInfo.port, host };
|
|
157
|
+
if (this.app.hotReloader) {
|
|
158
|
+
this.app.hotReloader.stop();
|
|
159
|
+
}
|
|
160
|
+
if (onListen) {
|
|
161
|
+
onListen(address);
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
if (!process.env.__EXIS_DEV_SERVER && !process.env.__EXIS_CLI) {
|
|
165
|
+
const url = `http://${host === '0.0.0.0' ? 'localhost' : host}:${port}`;
|
|
166
|
+
this.app.log.info({ url, env: this.app.options.env, backend: 'uws' }, `Server running at ${url} (uWS)`);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
for (const hook of this.app.hooks.ready) {
|
|
170
|
+
await hook();
|
|
171
|
+
}
|
|
172
|
+
if (callback)
|
|
173
|
+
callback();
|
|
174
|
+
});
|
|
175
|
+
return this.server;
|
|
176
|
+
}
|
|
134
177
|
// --- Bun listen path ---
|
|
135
178
|
if (this._useBun) {
|
|
136
179
|
this._bunApp = (0, bun_adapter_1.createBunApp)(this.app.handle.bind(this.app), this.app.wsOrchestrator.handleBunUpgrade.bind(this.app.wsOrchestrator), port, host, this.app.options.ssl);
|
|
@@ -265,7 +308,7 @@ class ServerBootstrapper {
|
|
|
265
308
|
const networkHost = host === '0.0.0.0'
|
|
266
309
|
? `http://${localIp}:${port}`
|
|
267
310
|
: 'use --host 0.0.0.0 to expose';
|
|
268
|
-
const readyMs =
|
|
311
|
+
const readyMs = Math.round(process.uptime() * 1000);
|
|
269
312
|
const displayEnv = this.app.options.env || process.env.NODE_ENV || 'development';
|
|
270
313
|
const workerCount = process.env.__EXIS_CLUSTER_WORKERS;
|
|
271
314
|
const cluster = await Promise.resolve().then(() => __importStar(require('node:cluster')));
|
|
@@ -380,6 +423,11 @@ class ServerBootstrapper {
|
|
|
380
423
|
this.bunServerInstance = null;
|
|
381
424
|
cleanupAndFinish();
|
|
382
425
|
}
|
|
426
|
+
else if (this._useUws && this._uwsApp && this.uwsListenToken) {
|
|
427
|
+
this._uwsApp.close(this.uwsListenToken);
|
|
428
|
+
this.uwsListenToken = null;
|
|
429
|
+
cleanupAndFinish();
|
|
430
|
+
}
|
|
383
431
|
else {
|
|
384
432
|
this.server.close((err) => {
|
|
385
433
|
if (err)
|