alepha 0.14.4 → 0.15.1
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/README.md +44 -102
- package/dist/api/audits/index.d.ts +331 -443
- package/dist/api/audits/index.d.ts.map +1 -1
- package/dist/api/audits/index.js +2 -2
- package/dist/api/audits/index.js.map +1 -1
- package/dist/api/files/index.d.ts +0 -113
- package/dist/api/files/index.d.ts.map +1 -1
- package/dist/api/files/index.js +2 -3
- package/dist/api/files/index.js.map +1 -1
- package/dist/api/jobs/index.d.ts +151 -262
- package/dist/api/jobs/index.d.ts.map +1 -1
- package/dist/api/notifications/index.browser.js +4 -4
- package/dist/api/notifications/index.browser.js.map +1 -1
- package/dist/api/notifications/index.d.ts +164 -276
- package/dist/api/notifications/index.d.ts.map +1 -1
- package/dist/api/notifications/index.js +4 -4
- package/dist/api/notifications/index.js.map +1 -1
- package/dist/api/parameters/index.d.ts +265 -377
- package/dist/api/parameters/index.d.ts.map +1 -1
- package/dist/api/users/index.browser.js +1 -2
- package/dist/api/users/index.browser.js.map +1 -1
- package/dist/api/users/index.d.ts +195 -301
- package/dist/api/users/index.d.ts.map +1 -1
- package/dist/api/users/index.js +203 -184
- package/dist/api/users/index.js.map +1 -1
- package/dist/api/verifications/index.d.ts.map +1 -1
- package/dist/batch/index.d.ts.map +1 -1
- package/dist/batch/index.js +1 -2
- package/dist/batch/index.js.map +1 -1
- package/dist/bucket/index.d.ts.map +1 -1
- package/dist/cache/core/index.d.ts.map +1 -1
- package/dist/cache/redis/index.d.ts.map +1 -1
- package/dist/cache/redis/index.js +2 -2
- package/dist/cache/redis/index.js.map +1 -1
- package/dist/cli/index.d.ts +5900 -165
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +1481 -639
- package/dist/cli/index.js.map +1 -1
- package/dist/command/index.d.ts +8 -4
- package/dist/command/index.d.ts.map +1 -1
- package/dist/command/index.js +29 -25
- package/dist/command/index.js.map +1 -1
- package/dist/core/index.browser.js +563 -54
- package/dist/core/index.browser.js.map +1 -1
- package/dist/core/index.d.ts +175 -8
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +564 -54
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.native.js +563 -54
- package/dist/core/index.native.js.map +1 -1
- package/dist/datetime/index.d.ts.map +1 -1
- package/dist/datetime/index.js +4 -4
- package/dist/datetime/index.js.map +1 -1
- package/dist/email/index.d.ts +89 -42
- package/dist/email/index.d.ts.map +1 -1
- package/dist/email/index.js +129 -33
- package/dist/email/index.js.map +1 -1
- package/dist/fake/index.d.ts +7969 -2
- package/dist/fake/index.d.ts.map +1 -1
- package/dist/fake/index.js +22 -22
- package/dist/fake/index.js.map +1 -1
- package/dist/file/index.d.ts +134 -1
- package/dist/file/index.d.ts.map +1 -1
- package/dist/file/index.js +253 -1
- package/dist/file/index.js.map +1 -1
- package/dist/lock/core/index.d.ts.map +1 -1
- package/dist/lock/redis/index.d.ts.map +1 -1
- package/dist/logger/index.d.ts +1 -2
- package/dist/logger/index.d.ts.map +1 -1
- package/dist/logger/index.js +1 -5
- package/dist/logger/index.js.map +1 -1
- package/dist/mcp/index.d.ts +19 -1
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +28 -4
- package/dist/mcp/index.js.map +1 -1
- package/dist/orm/chunk-DH6iiROE.js +38 -0
- package/dist/orm/index.browser.js +9 -9
- package/dist/orm/index.browser.js.map +1 -1
- package/dist/orm/index.bun.js +2821 -0
- package/dist/orm/index.bun.js.map +1 -0
- package/dist/orm/index.d.ts +318 -169
- package/dist/orm/index.d.ts.map +1 -1
- package/dist/orm/index.js +2086 -1776
- package/dist/orm/index.js.map +1 -1
- package/dist/queue/core/index.d.ts +4 -4
- package/dist/queue/core/index.d.ts.map +1 -1
- package/dist/queue/redis/index.d.ts.map +1 -1
- package/dist/redis/index.bun.js +285 -0
- package/dist/redis/index.bun.js.map +1 -0
- package/dist/redis/index.d.ts +13 -31
- package/dist/redis/index.d.ts.map +1 -1
- package/dist/redis/index.js +18 -38
- package/dist/redis/index.js.map +1 -1
- package/dist/retry/index.d.ts.map +1 -1
- package/dist/router/index.d.ts.map +1 -1
- package/dist/scheduler/index.d.ts +83 -1
- package/dist/scheduler/index.d.ts.map +1 -1
- package/dist/scheduler/index.js +393 -1
- package/dist/scheduler/index.js.map +1 -1
- package/dist/security/index.browser.js +5 -1
- package/dist/security/index.browser.js.map +1 -1
- package/dist/security/index.d.ts +598 -112
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/index.js +1808 -97
- package/dist/security/index.js.map +1 -1
- package/dist/server/auth/index.d.ts +1200 -175
- package/dist/server/auth/index.d.ts.map +1 -1
- package/dist/server/auth/index.js +1268 -37
- package/dist/server/auth/index.js.map +1 -1
- package/dist/server/cache/index.d.ts +6 -3
- package/dist/server/cache/index.d.ts.map +1 -1
- package/dist/server/cache/index.js +1 -1
- package/dist/server/cache/index.js.map +1 -1
- package/dist/server/compress/index.d.ts.map +1 -1
- package/dist/server/cookies/index.d.ts.map +1 -1
- package/dist/server/cookies/index.js +3 -3
- package/dist/server/cookies/index.js.map +1 -1
- package/dist/server/core/index.d.ts +115 -13
- package/dist/server/core/index.d.ts.map +1 -1
- package/dist/server/core/index.js +321 -139
- package/dist/server/core/index.js.map +1 -1
- package/dist/server/cors/index.d.ts +0 -1
- package/dist/server/cors/index.d.ts.map +1 -1
- package/dist/server/health/index.d.ts +0 -1
- package/dist/server/health/index.d.ts.map +1 -1
- package/dist/server/helmet/index.d.ts.map +1 -1
- package/dist/server/links/index.browser.js +9 -1
- package/dist/server/links/index.browser.js.map +1 -1
- package/dist/server/links/index.d.ts +1 -2
- package/dist/server/links/index.d.ts.map +1 -1
- package/dist/server/links/index.js +14 -7
- package/dist/server/links/index.js.map +1 -1
- package/dist/server/metrics/index.d.ts +514 -1
- package/dist/server/metrics/index.d.ts.map +1 -1
- package/dist/server/metrics/index.js +4462 -4
- package/dist/server/metrics/index.js.map +1 -1
- package/dist/server/multipart/index.d.ts.map +1 -1
- package/dist/server/proxy/index.d.ts +0 -1
- package/dist/server/proxy/index.d.ts.map +1 -1
- package/dist/server/rate-limit/index.d.ts.map +1 -1
- package/dist/server/static/index.d.ts.map +1 -1
- package/dist/server/swagger/index.d.ts +1 -2
- package/dist/server/swagger/index.d.ts.map +1 -1
- package/dist/server/swagger/index.js +1 -2
- package/dist/server/swagger/index.js.map +1 -1
- package/dist/sms/index.d.ts +3 -1
- package/dist/sms/index.d.ts.map +1 -1
- package/dist/sms/index.js +10 -10
- package/dist/sms/index.js.map +1 -1
- package/dist/thread/index.d.ts +0 -1
- package/dist/thread/index.d.ts.map +1 -1
- package/dist/thread/index.js +2 -2
- package/dist/thread/index.js.map +1 -1
- package/dist/topic/core/index.d.ts.map +1 -1
- package/dist/topic/redis/index.d.ts.map +1 -1
- package/dist/vite/index.d.ts +6315 -149
- package/dist/vite/index.d.ts.map +1 -1
- package/dist/vite/index.js +140 -469
- package/dist/vite/index.js.map +1 -1
- package/dist/websocket/index.browser.js +9 -9
- package/dist/websocket/index.browser.js.map +1 -1
- package/dist/websocket/index.d.ts +28 -28
- package/dist/websocket/index.d.ts.map +1 -1
- package/dist/websocket/index.js +9 -9
- package/dist/websocket/index.js.map +1 -1
- package/package.json +13 -18
- package/src/api/files/controllers/AdminFileStatsController.ts +0 -1
- package/src/api/users/atoms/realmAuthSettingsAtom.ts +5 -0
- package/src/api/users/controllers/{UserRealmController.ts → RealmController.ts} +11 -11
- package/src/api/users/entities/users.ts +1 -1
- package/src/api/users/index.ts +8 -8
- package/src/api/users/primitives/{$userRealm.ts → $realm.ts} +17 -19
- package/src/api/users/providers/{UserRealmProvider.ts → RealmProvider.ts} +26 -30
- package/src/api/users/schemas/{userRealmConfigSchema.ts → realmConfigSchema.ts} +2 -2
- package/src/api/users/services/CredentialService.ts +7 -7
- package/src/api/users/services/IdentityService.ts +4 -4
- package/src/api/users/services/RegistrationService.spec.ts +25 -27
- package/src/api/users/services/RegistrationService.ts +38 -27
- package/src/api/users/services/SessionCrudService.ts +3 -3
- package/src/api/users/services/SessionService.spec.ts +3 -3
- package/src/api/users/services/SessionService.ts +27 -18
- package/src/api/users/services/UserService.ts +7 -7
- package/src/batch/providers/BatchProvider.ts +1 -2
- package/src/cli/apps/AlephaCli.ts +2 -2
- package/src/cli/apps/AlephaPackageBuilderCli.ts +47 -20
- package/src/cli/assets/apiHelloControllerTs.ts +19 -0
- package/src/cli/assets/apiIndexTs.ts +16 -0
- package/src/cli/assets/biomeJson.ts +2 -1
- package/src/cli/assets/claudeMd.ts +308 -0
- package/src/cli/assets/dummySpecTs.ts +2 -1
- package/src/cli/assets/editorconfig.ts +2 -1
- package/src/cli/assets/mainBrowserTs.ts +4 -3
- package/src/cli/assets/mainCss.ts +24 -0
- package/src/cli/assets/mainServerTs.ts +24 -0
- package/src/cli/assets/tsconfigJson.ts +2 -1
- package/src/cli/assets/webAppRouterTs.ts +16 -0
- package/src/cli/assets/webHelloComponentTsx.ts +20 -0
- package/src/cli/assets/webIndexTs.ts +16 -0
- package/src/cli/atoms/appEntryOptions.ts +13 -0
- package/src/cli/atoms/buildOptions.ts +1 -1
- package/src/cli/atoms/changelogOptions.ts +1 -1
- package/src/cli/commands/build.ts +97 -61
- package/src/cli/commands/db.ts +21 -18
- package/src/cli/commands/deploy.ts +17 -5
- package/src/cli/commands/dev.ts +26 -47
- package/src/cli/commands/gen/env.ts +1 -1
- package/src/cli/commands/init.ts +79 -25
- package/src/cli/commands/lint.ts +9 -3
- package/src/cli/commands/test.ts +8 -2
- package/src/cli/commands/typecheck.ts +5 -1
- package/src/cli/commands/verify.ts +4 -2
- package/src/cli/defineConfig.ts +9 -0
- package/src/cli/index.ts +2 -1
- package/src/cli/providers/AppEntryProvider.ts +131 -0
- package/src/cli/providers/ViteBuildProvider.ts +82 -0
- package/src/cli/providers/ViteDevServerProvider.ts +350 -0
- package/src/cli/providers/ViteTemplateProvider.ts +27 -0
- package/src/cli/services/AlephaCliUtils.ts +72 -602
- package/src/cli/services/PackageManagerUtils.ts +308 -0
- package/src/cli/services/ProjectScaffolder.ts +329 -0
- package/src/command/helpers/Runner.ts +15 -3
- package/src/core/Alepha.ts +2 -8
- package/src/core/__tests__/Alepha-graph.spec.ts +4 -0
- package/src/core/index.shared.ts +1 -0
- package/src/core/index.ts +2 -0
- package/src/core/primitives/$hook.ts +6 -2
- package/src/core/primitives/$module.spec.ts +4 -0
- package/src/core/primitives/$module.ts +12 -0
- package/src/core/providers/AlsProvider.ts +1 -1
- package/src/core/providers/CodecManager.spec.ts +12 -6
- package/src/core/providers/CodecManager.ts +26 -6
- package/src/core/providers/EventManager.ts +169 -13
- package/src/core/providers/KeylessJsonSchemaCodec.spec.ts +878 -0
- package/src/core/providers/KeylessJsonSchemaCodec.ts +789 -0
- package/src/core/providers/SchemaValidator.spec.ts +236 -0
- package/src/core/providers/StateManager.spec.ts +27 -16
- package/src/email/providers/LocalEmailProvider.spec.ts +111 -87
- package/src/email/providers/LocalEmailProvider.ts +52 -15
- package/src/email/providers/NodemailerEmailProvider.ts +167 -56
- package/src/file/errors/FileError.ts +7 -0
- package/src/file/index.ts +9 -1
- package/src/file/providers/MemoryFileSystemProvider.ts +393 -0
- package/src/logger/providers/PrettyFormatterProvider.ts +0 -9
- package/src/mcp/errors/McpError.ts +30 -0
- package/src/mcp/index.ts +3 -0
- package/src/mcp/transports/SseMcpTransport.ts +16 -6
- package/src/orm/index.browser.ts +1 -19
- package/src/orm/index.bun.ts +77 -0
- package/src/orm/index.shared-server.ts +22 -0
- package/src/orm/index.shared.ts +15 -0
- package/src/orm/index.ts +19 -39
- package/src/orm/providers/DrizzleKitProvider.ts +3 -5
- package/src/orm/providers/drivers/BunPostgresProvider.ts +3 -5
- package/src/orm/providers/drivers/BunSqliteProvider.ts +1 -1
- package/src/orm/providers/drivers/CloudflareD1Provider.ts +4 -0
- package/src/orm/providers/drivers/DatabaseProvider.ts +4 -0
- package/src/orm/providers/drivers/PglitePostgresProvider.ts +4 -0
- package/src/orm/services/Repository.ts +19 -0
- package/src/redis/index.bun.ts +35 -0
- package/src/redis/providers/BunRedisProvider.ts +12 -43
- package/src/redis/providers/BunRedisSubscriberProvider.ts +2 -3
- package/src/redis/providers/NodeRedisProvider.ts +16 -34
- package/src/{server/security → security}/__tests__/BasicAuth.spec.ts +11 -11
- package/src/{server/security → security}/__tests__/ServerSecurityProvider-realm.spec.ts +21 -16
- package/src/{server/security/providers → security/__tests__}/ServerSecurityProvider.spec.ts +5 -5
- package/src/security/index.browser.ts +5 -0
- package/src/security/index.ts +90 -7
- package/src/security/primitives/{$realm.spec.ts → $issuer.spec.ts} +11 -11
- package/src/security/primitives/{$realm.ts → $issuer.ts} +20 -17
- package/src/security/primitives/$role.ts +5 -5
- package/src/security/primitives/$serviceAccount.spec.ts +5 -5
- package/src/security/primitives/$serviceAccount.ts +3 -3
- package/src/{server/security → security}/providers/ServerSecurityProvider.ts +5 -7
- package/src/server/auth/primitives/$auth.ts +10 -10
- package/src/server/auth/primitives/$authCredentials.ts +3 -3
- package/src/server/auth/primitives/$authGithub.ts +3 -3
- package/src/server/auth/primitives/$authGoogle.ts +3 -3
- package/src/server/auth/providers/ServerAuthProvider.ts +13 -13
- package/src/server/cache/providers/ServerCacheProvider.ts +1 -1
- package/src/server/cookies/providers/ServerCookiesProvider.ts +3 -3
- package/src/server/core/index.ts +1 -1
- package/src/server/core/providers/BunHttpServerProvider.ts +1 -1
- package/src/server/core/providers/NodeHttpServerProvider.spec.ts +125 -0
- package/src/server/core/providers/NodeHttpServerProvider.ts +92 -24
- package/src/server/core/providers/ServerBodyParserProvider.ts +19 -23
- package/src/server/core/providers/ServerLoggerProvider.ts +23 -19
- package/src/server/core/providers/ServerProvider.ts +144 -24
- package/src/server/core/providers/ServerRouterProvider.ts +259 -115
- package/src/server/core/providers/ServerTimingProvider.ts +2 -2
- package/src/server/links/atoms/apiLinksAtom.ts +7 -0
- package/src/server/links/index.browser.ts +2 -0
- package/src/server/links/index.ts +3 -1
- package/src/server/links/providers/LinkProvider.ts +1 -1
- package/src/server/swagger/index.ts +1 -1
- package/src/sms/providers/LocalSmsProvider.spec.ts +153 -111
- package/src/sms/providers/LocalSmsProvider.ts +8 -7
- package/src/vite/index.ts +3 -2
- package/src/vite/tasks/buildClient.ts +0 -1
- package/src/vite/tasks/buildServer.ts +80 -22
- package/src/vite/tasks/copyAssets.ts +5 -4
- package/src/vite/tasks/generateCloudflare.ts +7 -0
- package/src/vite/tasks/generateSitemap.ts +64 -23
- package/src/vite/tasks/index.ts +0 -2
- package/src/vite/tasks/prerenderPages.ts +49 -24
- package/dist/server/security/index.browser.js +0 -13
- package/dist/server/security/index.browser.js.map +0 -1
- package/dist/server/security/index.d.ts +0 -173
- package/dist/server/security/index.d.ts.map +0 -1
- package/dist/server/security/index.js +0 -311
- package/dist/server/security/index.js.map +0 -1
- package/src/cli/assets/appRouterTs.ts +0 -9
- package/src/cli/assets/indexHtml.ts +0 -15
- package/src/cli/assets/mainTs.ts +0 -13
- package/src/cli/commands/format.ts +0 -17
- package/src/server/security/index.browser.ts +0 -10
- package/src/server/security/index.ts +0 -94
- package/src/vite/helpers/boot.ts +0 -106
- package/src/vite/plugins/viteAlephaDev.ts +0 -177
- package/src/vite/tasks/devServer.ts +0 -69
- package/src/vite/tasks/runAlepha.ts +0 -270
- /package/src/{server/security → security}/primitives/$basicAuth.ts +0 -0
- /package/src/{server/security → security}/providers/ServerBasicAuthProvider.ts +0 -0
|
@@ -11,6 +11,21 @@ import type {
|
|
|
11
11
|
} from "../interfaces/ServerRequest.ts";
|
|
12
12
|
import { ServerRouterProvider } from "./ServerRouterProvider.ts";
|
|
13
13
|
|
|
14
|
+
// ============================================================================
|
|
15
|
+
// Performance Constants
|
|
16
|
+
// ============================================================================
|
|
17
|
+
|
|
18
|
+
// Note: We cannot use frozen/shared empty objects here because downstream code
|
|
19
|
+
// may mutate params/query (e.g., validation, React page rendering)
|
|
20
|
+
|
|
21
|
+
// Header constants for fast property access
|
|
22
|
+
const HEADER_X_FORWARDED_PROTO = "x-forwarded-proto";
|
|
23
|
+
const HEADER_HOST = "host";
|
|
24
|
+
|
|
25
|
+
// Protocol prefixes
|
|
26
|
+
const PROTO_HTTPS = "https://";
|
|
27
|
+
const PROTO_HTTP = "http://";
|
|
28
|
+
|
|
14
29
|
/**
|
|
15
30
|
* Base server provider to handle incoming requests and route them.
|
|
16
31
|
*
|
|
@@ -26,6 +41,105 @@ export class ServerProvider {
|
|
|
26
41
|
|
|
27
42
|
protected readonly internalServerErrorMessage = "Internal Server Error";
|
|
28
43
|
|
|
44
|
+
// Pre-allocated error response to avoid object creation per failed request
|
|
45
|
+
protected readonly internalErrorResponse = Object.freeze({
|
|
46
|
+
status: 500,
|
|
47
|
+
headers: Object.freeze({ "content-type": "text/plain" }),
|
|
48
|
+
body: this.internalServerErrorMessage,
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
// Pre-bound error handler to avoid function allocation per request
|
|
52
|
+
protected readonly handleInternalError = () => this.internalErrorResponse;
|
|
53
|
+
|
|
54
|
+
// ============================================================================
|
|
55
|
+
// P1: URL Base Cache - cache protocol+host per unique host header
|
|
56
|
+
// Avoids string concatenation on every request
|
|
57
|
+
// ============================================================================
|
|
58
|
+
protected readonly urlBaseCache = new Map<string, string>();
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Get cached URL base (protocol + host) for a given host header.
|
|
62
|
+
* Caches the result to avoid repeated string concatenation.
|
|
63
|
+
*/
|
|
64
|
+
protected getUrlBase(headers: Record<string, string>): string {
|
|
65
|
+
const host = headers[HEADER_HOST];
|
|
66
|
+
let base = this.urlBaseCache.get(host);
|
|
67
|
+
if (!base) {
|
|
68
|
+
const proto =
|
|
69
|
+
headers[HEADER_X_FORWARDED_PROTO] === "https"
|
|
70
|
+
? PROTO_HTTPS
|
|
71
|
+
: PROTO_HTTP;
|
|
72
|
+
base = proto + host;
|
|
73
|
+
// Limit cache size to prevent memory leaks from many unique hosts
|
|
74
|
+
if (this.urlBaseCache.size < 100) {
|
|
75
|
+
this.urlBaseCache.set(host, base);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return base;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// ============================================================================
|
|
82
|
+
// P0: Manual Query String Parser - faster than URLSearchParams
|
|
83
|
+
// Parses query string without creating URL object
|
|
84
|
+
// ============================================================================
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Parse query string manually - faster than new URL() + URLSearchParams.
|
|
88
|
+
* Returns empty object if no query string.
|
|
89
|
+
*/
|
|
90
|
+
protected parseQueryString(rawUrl: string): Record<string, string> {
|
|
91
|
+
const qIndex = rawUrl.indexOf("?");
|
|
92
|
+
if (qIndex === -1) {
|
|
93
|
+
return {};
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const qs = rawUrl.slice(qIndex + 1);
|
|
97
|
+
if (!qs) {
|
|
98
|
+
return {};
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const query: Record<string, string> = {};
|
|
102
|
+
let start = 0;
|
|
103
|
+
let eqIdx = -1;
|
|
104
|
+
|
|
105
|
+
for (let i = 0; i <= qs.length; i++) {
|
|
106
|
+
const char = i < qs.length ? qs.charCodeAt(i) : 38; // '&' at end
|
|
107
|
+
|
|
108
|
+
if (char === 61) {
|
|
109
|
+
// '='
|
|
110
|
+
eqIdx = i;
|
|
111
|
+
} else if (char === 38) {
|
|
112
|
+
// '&'
|
|
113
|
+
if (eqIdx !== -1 && eqIdx > start) {
|
|
114
|
+
const key = qs.slice(start, eqIdx);
|
|
115
|
+
const value = qs.slice(eqIdx + 1, i);
|
|
116
|
+
// Only decode if necessary (contains % or +)
|
|
117
|
+
query[this.fastDecode(key)] = this.fastDecode(value);
|
|
118
|
+
}
|
|
119
|
+
start = i + 1;
|
|
120
|
+
eqIdx = -1;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
return query;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Fast decode - only calls decodeURIComponent if needed.
|
|
129
|
+
*/
|
|
130
|
+
protected fastDecode(str: string): string {
|
|
131
|
+
// Fast path: no encoding needed
|
|
132
|
+
if (str.indexOf("%") === -1 && str.indexOf("+") === -1) {
|
|
133
|
+
return str;
|
|
134
|
+
}
|
|
135
|
+
// Replace + with space before decoding
|
|
136
|
+
try {
|
|
137
|
+
return decodeURIComponent(str.replace(/\+/g, " "));
|
|
138
|
+
} catch {
|
|
139
|
+
return str;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
29
143
|
public get hostname(): string {
|
|
30
144
|
if (this.alepha.isViteDev()) {
|
|
31
145
|
return `http://localhost:${this.alepha.env.SERVER_PORT}`;
|
|
@@ -54,19 +168,20 @@ export class ServerProvider {
|
|
|
54
168
|
/**
|
|
55
169
|
* Handle Node.js HTTP request event.
|
|
56
170
|
*
|
|
57
|
-
*
|
|
171
|
+
* Optimized to avoid expensive URL parsing when possible.
|
|
58
172
|
*/
|
|
59
173
|
public async handleNodeRequest(
|
|
60
174
|
nodeRequestEvent: NodeRequestEvent,
|
|
61
175
|
): Promise<void> {
|
|
62
176
|
const { req, res } = nodeRequestEvent;
|
|
63
|
-
const
|
|
64
|
-
|
|
65
|
-
if (this.isViteNotFound(req.url, route, params)) {
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
177
|
+
const rawUrl = req.url!;
|
|
178
|
+
const { route, params } = this.router.match(`/${req.method}${rawUrl}`);
|
|
68
179
|
|
|
69
180
|
if (!route) {
|
|
181
|
+
// Skip if response was already sent (e.g., by Vite middleware)
|
|
182
|
+
if (res.headersSent) {
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
70
185
|
// if no route is found, return basic 404
|
|
71
186
|
// note: you should not use this in production, use a custom 404 page instead by adding a route /*
|
|
72
187
|
res.writeHead(404, { "content-type": "text/plain" });
|
|
@@ -75,11 +190,16 @@ export class ServerProvider {
|
|
|
75
190
|
}
|
|
76
191
|
|
|
77
192
|
const headers = (req.headers ?? {}) as Record<string, string>;
|
|
78
|
-
const proto = headers["x-forwarded-proto"] === "https" ? "https" : "http";
|
|
79
|
-
const url = new URL(`${proto}://${headers.host}${req.url}`);
|
|
80
|
-
const query = Object.fromEntries(url.searchParams.entries());
|
|
81
193
|
const method = (req.method?.toUpperCase() ?? "GET") as RouteMethod;
|
|
82
194
|
|
|
195
|
+
// P0: Use manual query parsing - much faster than new URL() + URLSearchParams
|
|
196
|
+
const query = this.parseQueryString(rawUrl);
|
|
197
|
+
|
|
198
|
+
// P1: Use cached URL base - avoids string concat on every request
|
|
199
|
+
// Create URL object (still needed for downstream code that uses url.pathname, etc.)
|
|
200
|
+
const urlBase = this.getUrlBase(headers);
|
|
201
|
+
const url = new URL(rawUrl, urlBase);
|
|
202
|
+
|
|
83
203
|
const request: ServerRequestData = {
|
|
84
204
|
method,
|
|
85
205
|
url,
|
|
@@ -89,13 +209,14 @@ export class ServerProvider {
|
|
|
89
209
|
raw: { node: nodeRequestEvent },
|
|
90
210
|
};
|
|
91
211
|
|
|
92
|
-
const response = await route
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
212
|
+
const response = await route
|
|
213
|
+
.handler(request)
|
|
214
|
+
.catch(this.handleInternalError);
|
|
215
|
+
|
|
216
|
+
// Skip if response was already sent (e.g., by Vite middleware)
|
|
217
|
+
if (res.headersSent) {
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
99
220
|
|
|
100
221
|
// empty body - just send status & headers
|
|
101
222
|
if (!response.body) {
|
|
@@ -175,7 +296,10 @@ export class ServerProvider {
|
|
|
175
296
|
headers[key] = value;
|
|
176
297
|
});
|
|
177
298
|
|
|
178
|
-
|
|
299
|
+
// Optimize: only parse query params if there are any
|
|
300
|
+
const query = url.search
|
|
301
|
+
? Object.fromEntries(url.searchParams.entries())
|
|
302
|
+
: {};
|
|
179
303
|
const method = (req.method.toUpperCase() ?? "GET") as RouteMethod;
|
|
180
304
|
const request: ServerRequestData = {
|
|
181
305
|
method,
|
|
@@ -186,13 +310,9 @@ export class ServerProvider {
|
|
|
186
310
|
raw: { web: ev },
|
|
187
311
|
};
|
|
188
312
|
|
|
189
|
-
const response = await route
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
headers: { "content-type": "text/plain" },
|
|
193
|
-
body: this.internalServerErrorMessage,
|
|
194
|
-
};
|
|
195
|
-
});
|
|
313
|
+
const response = await route
|
|
314
|
+
.handler(request)
|
|
315
|
+
.catch(this.handleInternalError);
|
|
196
316
|
|
|
197
317
|
// empty body - just send status & headers
|
|
198
318
|
if (!response.body) {
|