@atria/server 0.0.9 → 0.0.12
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 +26 -10
- package/dist/auth/cookies.d.ts +11 -0
- package/dist/auth/cookies.js +38 -0
- package/dist/auth/cookies.js.map +1 -0
- package/dist/auth/hash.d.ts +2 -0
- package/dist/auth/hash.js +36 -0
- package/dist/auth/hash.js.map +1 -0
- package/dist/auth/oauth.d.ts +5 -0
- package/dist/auth/oauth.js +215 -0
- package/dist/auth/oauth.js.map +1 -0
- package/dist/auth/runtime.d.ts +28 -0
- package/dist/auth/runtime.js +528 -0
- package/dist/auth/runtime.js.map +1 -0
- package/dist/auth/store.d.ts +33 -0
- package/dist/auth/store.js +49 -0
- package/dist/auth/store.js.map +1 -0
- package/dist/auth/types.d.ts +40 -0
- package/dist/auth/types.js +2 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/auth/validation.d.ts +21 -0
- package/dist/auth/validation.js +97 -0
- package/dist/auth/validation.js.map +1 -0
- package/dist/dev/admin/assets.d.ts +2 -0
- package/dist/dev/admin/assets.js +30 -0
- package/dist/dev/admin/assets.js.map +1 -0
- package/dist/dev/admin/i18n.d.ts +2 -0
- package/dist/dev/admin/i18n.js +63 -0
- package/dist/dev/admin/i18n.js.map +1 -0
- package/dist/dev/admin/index.d.ts +3 -0
- package/dist/dev/admin/index.js +4 -0
- package/dist/dev/admin/index.js.map +1 -0
- package/dist/dev/admin/request.d.ts +14 -0
- package/dist/dev/admin/request.js +77 -0
- package/dist/dev/admin/request.js.map +1 -0
- package/dist/dev/admin/routing.d.ts +5 -0
- package/dist/dev/admin/routing.js +31 -0
- package/dist/dev/admin/routing.js.map +1 -0
- package/dist/dev/admin-assets.d.ts +2 -0
- package/dist/dev/admin-assets.js +30 -0
- package/dist/dev/admin-assets.js.map +1 -0
- package/dist/dev/admin.d.ts +2 -0
- package/dist/dev/admin.js +30 -0
- package/dist/dev/admin.js.map +1 -0
- package/dist/dev/constants.d.ts +11 -0
- package/dist/dev/constants.js +22 -0
- package/dist/dev/constants.js.map +1 -0
- package/dist/dev/health/index.d.ts +2 -0
- package/dist/dev/health/index.js +3 -0
- package/dist/dev/health/index.js.map +1 -0
- package/dist/dev/health/request.d.ts +14 -0
- package/dist/dev/health/request.js +22 -0
- package/dist/dev/health/request.js.map +1 -0
- package/dist/dev/health/state.d.ts +9 -0
- package/dist/dev/health/state.js +52 -0
- package/dist/dev/health/state.js.map +1 -0
- package/dist/dev/health.d.ts +9 -0
- package/dist/dev/health.js +52 -0
- package/dist/dev/health.js.map +1 -0
- package/dist/dev/http/errors.d.ts +2 -0
- package/dist/dev/http/errors.js +6 -0
- package/dist/dev/http/errors.js.map +1 -0
- package/dist/dev/http/routing.d.ts +3 -0
- package/dist/dev/http/routing.js +26 -0
- package/dist/dev/http/routing.js.map +1 -0
- package/dist/dev/i18n.d.ts +2 -0
- package/dist/dev/i18n.js +63 -0
- package/dist/dev/i18n.js.map +1 -0
- package/dist/dev/lifecycle.d.ts +2 -0
- package/dist/dev/lifecycle.js +10 -0
- package/dist/dev/lifecycle.js.map +1 -0
- package/dist/dev/public/index.d.ts +1 -0
- package/dist/dev/public/index.js +2 -0
- package/dist/dev/public/index.js.map +1 -0
- package/dist/dev/public/request.d.ts +9 -0
- package/dist/dev/public/request.js +29 -0
- package/dist/dev/public/request.js.map +1 -0
- package/dist/dev/public/responses.d.ts +3 -0
- package/dist/dev/public/responses.js +25 -0
- package/dist/dev/public/responses.js.map +1 -0
- package/dist/dev/public/routing.d.ts +1 -0
- package/dist/dev/public/routing.js +5 -0
- package/dist/dev/public/routing.js.map +1 -0
- package/dist/dev/responses.d.ts +2 -0
- package/dist/dev/responses.js +3 -0
- package/dist/dev/responses.js.map +1 -0
- package/dist/dev/routing.d.ts +3 -0
- package/dist/dev/routing.js +4 -0
- package/dist/dev/routing.js.map +1 -0
- package/dist/dev/setup/index.d.ts +2 -0
- package/dist/dev/setup/index.js +2 -0
- package/dist/dev/setup/index.js.map +1 -0
- package/dist/dev/setup/request.d.ts +5 -0
- package/dist/dev/setup/request.js +20 -0
- package/dist/dev/setup/request.js.map +1 -0
- package/dist/dev/setup/types.d.ts +5 -0
- package/dist/dev/setup/types.js +2 -0
- package/dist/dev/setup/types.js.map +1 -0
- package/dist/dev/static/files.d.ts +6 -0
- package/dist/dev/static/files.js +74 -0
- package/dist/dev/static/files.js.map +1 -0
- package/dist/dev/static/index.d.ts +4 -0
- package/dist/dev/static/index.js +5 -0
- package/dist/dev/static/index.js.map +1 -0
- package/dist/dev/static/paths.d.ts +1 -0
- package/dist/dev/static/paths.js +6 -0
- package/dist/dev/static/paths.js.map +1 -0
- package/dist/dev/static/publish.d.ts +1 -0
- package/dist/dev/static/publish.js +13 -0
- package/dist/dev/static/publish.js.map +1 -0
- package/dist/dev/static/resolver.d.ts +2 -0
- package/dist/dev/static/resolver.js +53 -0
- package/dist/dev/static/resolver.js.map +1 -0
- package/dist/dev/static/sender.d.ts +2 -0
- package/dist/dev/static/sender.js +11 -0
- package/dist/dev/static/sender.js.map +1 -0
- package/dist/dev/static-files.d.ts +6 -0
- package/dist/dev/static-files.js +74 -0
- package/dist/dev/static-files.js.map +1 -0
- package/dist/dev/types.d.ts +10 -0
- package/dist/dev/types.js +2 -0
- package/dist/dev/types.js.map +1 -0
- package/dist/server.js +65 -190
- package/dist/server.js.map +1 -1
- package/package.json +4 -2
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { isInsideDirectory } from "./paths.js";
|
|
4
|
+
const resolveRootIndexFile = async (rootDir) => {
|
|
5
|
+
const rootIndexPath = path.join(rootDir, "index.html");
|
|
6
|
+
try {
|
|
7
|
+
const rootIndexStats = await fs.stat(rootIndexPath);
|
|
8
|
+
if (rootIndexStats.isFile()) {
|
|
9
|
+
return { type: "file", filePath: rootIndexPath };
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
// fall through to not found
|
|
14
|
+
}
|
|
15
|
+
return { type: "not-found" };
|
|
16
|
+
};
|
|
17
|
+
export const resolveRequestFile = async (rootDir, requestPath, mode) => {
|
|
18
|
+
const normalizedPath = requestPath === "/" ? "index.html" : requestPath.replace(/^\/+/, "");
|
|
19
|
+
const filePath = path.join(rootDir, normalizedPath);
|
|
20
|
+
if (!isInsideDirectory(rootDir, filePath)) {
|
|
21
|
+
return { type: "forbidden" };
|
|
22
|
+
}
|
|
23
|
+
try {
|
|
24
|
+
const fileStats = await fs.stat(filePath);
|
|
25
|
+
if (fileStats.isDirectory()) {
|
|
26
|
+
const directoryIndexPath = path.join(filePath, "index.html");
|
|
27
|
+
if (!isInsideDirectory(rootDir, directoryIndexPath)) {
|
|
28
|
+
return { type: "forbidden" };
|
|
29
|
+
}
|
|
30
|
+
try {
|
|
31
|
+
const directoryIndexStats = await fs.stat(directoryIndexPath);
|
|
32
|
+
if (directoryIndexStats.isFile()) {
|
|
33
|
+
return { type: "file", filePath: directoryIndexPath };
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
// fall through to not found/fallback response
|
|
38
|
+
}
|
|
39
|
+
return mode === "spa-fallback" ? resolveRootIndexFile(rootDir) : { type: "not-found" };
|
|
40
|
+
}
|
|
41
|
+
if (fileStats.isFile()) {
|
|
42
|
+
return { type: "file", filePath };
|
|
43
|
+
}
|
|
44
|
+
return { type: "not-found" };
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
if (mode === "spa-fallback" && !path.extname(normalizedPath)) {
|
|
48
|
+
return resolveRootIndexFile(rootDir);
|
|
49
|
+
}
|
|
50
|
+
return { type: "not-found" };
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
//# sourceMappingURL=resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../../src/dev/static/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,oBAAoB,GAAG,KAAK,EAAE,OAAe,EAAiC,EAAE;IACpF,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACvD,IAAI,CAAC;QACH,MAAM,cAAc,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACpD,IAAI,cAAc,CAAC,MAAM,EAAE,EAAE,CAAC;YAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC;QACnD,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,4BAA4B;IAC9B,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;AAC/B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,EACrC,OAAe,EACf,WAAmB,EACnB,IAAwB,EACO,EAAE;IACjC,MAAM,cAAc,GAAG,WAAW,KAAK,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC5F,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IAEpD,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC;QAC1C,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IAC/B,CAAC;IAED,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC;YAC5B,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YAC7D,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,CAAC,EAAE,CAAC;gBACpD,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;YAC/B,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,mBAAmB,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;gBAC9D,IAAI,mBAAmB,CAAC,MAAM,EAAE,EAAE,CAAC;oBACjC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,kBAAkB,EAAE,CAAC;gBACxD,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,8CAA8C;YAChD,CAAC;YAED,OAAO,IAAI,KAAK,cAAc,CAAC,CAAC,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;QACzF,CAAC;QAED,IAAI,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC;YACvB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QACpC,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,IAAI,KAAK,cAAc,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;YAC7D,OAAO,oBAAoB,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IAC/B,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { MIME_TYPES } from "../constants.js";
|
|
4
|
+
export const sendFileResponse = async (response, filePath) => {
|
|
5
|
+
const fileBuffer = await fs.readFile(filePath);
|
|
6
|
+
const extension = path.extname(filePath);
|
|
7
|
+
const contentType = MIME_TYPES[extension] ?? "application/octet-stream";
|
|
8
|
+
response.writeHead(200, { "content-type": contentType });
|
|
9
|
+
response.end(fileBuffer);
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=sender.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sender.js","sourceRoot":"","sources":["../../../src/dev/static/sender.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EAAE,QAAwB,EAAE,QAAgB,EAAiB,EAAE;IAClG,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,WAAW,GAAG,UAAU,CAAC,SAAS,CAAC,IAAI,0BAA0B,CAAC;IAExE,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;IACzD,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AAC3B,CAAC,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ServerResponse } from "node:http";
|
|
2
|
+
import type { ResolveRequestMode, ResolveRequestResult } from "./types.js";
|
|
3
|
+
export declare const isInsideDirectory: (basePath: string, targetPath: string) => boolean;
|
|
4
|
+
export declare const isPublicOutputPublished: (publicDir: string) => Promise<boolean>;
|
|
5
|
+
export declare const resolveRequestFile: (rootDir: string, requestPath: string, mode: ResolveRequestMode) => Promise<ResolveRequestResult>;
|
|
6
|
+
export declare const sendFileResponse: (response: ServerResponse, filePath: string) => Promise<void>;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { MIME_TYPES } from "./constants.js";
|
|
4
|
+
export const isInsideDirectory = (basePath, targetPath) => {
|
|
5
|
+
const relativePath = path.relative(basePath, targetPath);
|
|
6
|
+
return relativePath !== "" && !relativePath.startsWith("..") && !path.isAbsolute(relativePath);
|
|
7
|
+
};
|
|
8
|
+
export const isPublicOutputPublished = async (publicDir) => {
|
|
9
|
+
const publicIndexPath = path.join(publicDir, "index.html");
|
|
10
|
+
try {
|
|
11
|
+
const indexStats = await fs.stat(publicIndexPath);
|
|
12
|
+
return indexStats.isFile() || indexStats.isSymbolicLink();
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
const resolveRootIndexFile = async (rootDir) => {
|
|
19
|
+
const rootIndexPath = path.join(rootDir, "index.html");
|
|
20
|
+
try {
|
|
21
|
+
const rootIndexStats = await fs.stat(rootIndexPath);
|
|
22
|
+
if (rootIndexStats.isFile()) {
|
|
23
|
+
return { type: "file", filePath: rootIndexPath };
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
// fall through to not found
|
|
28
|
+
}
|
|
29
|
+
return { type: "not-found" };
|
|
30
|
+
};
|
|
31
|
+
export const resolveRequestFile = async (rootDir, requestPath, mode) => {
|
|
32
|
+
const normalizedPath = requestPath === "/" ? "index.html" : requestPath.replace(/^\/+/, "");
|
|
33
|
+
const filePath = path.join(rootDir, normalizedPath);
|
|
34
|
+
if (!isInsideDirectory(rootDir, filePath)) {
|
|
35
|
+
return { type: "forbidden" };
|
|
36
|
+
}
|
|
37
|
+
try {
|
|
38
|
+
const fileStats = await fs.stat(filePath);
|
|
39
|
+
if (fileStats.isDirectory()) {
|
|
40
|
+
const directoryIndexPath = path.join(filePath, "index.html");
|
|
41
|
+
if (!isInsideDirectory(rootDir, directoryIndexPath)) {
|
|
42
|
+
return { type: "forbidden" };
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
const directoryIndexStats = await fs.stat(directoryIndexPath);
|
|
46
|
+
if (directoryIndexStats.isFile()) {
|
|
47
|
+
return { type: "file", filePath: directoryIndexPath };
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// fall through to not found/fallback response
|
|
52
|
+
}
|
|
53
|
+
return mode === "spa-fallback" ? resolveRootIndexFile(rootDir) : { type: "not-found" };
|
|
54
|
+
}
|
|
55
|
+
if (fileStats.isFile()) {
|
|
56
|
+
return { type: "file", filePath };
|
|
57
|
+
}
|
|
58
|
+
return { type: "not-found" };
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
if (mode === "spa-fallback" && !path.extname(normalizedPath)) {
|
|
62
|
+
return resolveRootIndexFile(rootDir);
|
|
63
|
+
}
|
|
64
|
+
return { type: "not-found" };
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
export const sendFileResponse = async (response, filePath) => {
|
|
68
|
+
const fileBuffer = await fs.readFile(filePath);
|
|
69
|
+
const extension = path.extname(filePath);
|
|
70
|
+
const contentType = MIME_TYPES[extension] ?? "application/octet-stream";
|
|
71
|
+
response.writeHead(200, { "content-type": contentType });
|
|
72
|
+
response.end(fileBuffer);
|
|
73
|
+
};
|
|
74
|
+
//# sourceMappingURL=static-files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static-files.js","sourceRoot":"","sources":["../../src/dev/static-files.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/dev/types.ts"],"names":[],"mappings":""}
|
package/dist/server.js
CHANGED
|
@@ -2,157 +2,39 @@ import { createServer } from "node:http";
|
|
|
2
2
|
import { promises as fs } from "node:fs";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { ATRIA_RUNTIME_DIR, PUBLIC_OUTPUT_DIR } from "@atria/shared";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
};
|
|
16
|
-
const DEFAULT_NOT_FOUND_TEXT = "404: The requested page was not found.";
|
|
17
|
-
const DEFAULT_PUBLIC_UNAVAILABLE_TEXT = "503: Public site output is not published yet.";
|
|
18
|
-
// Keep this switch isolated so LIVE unpublished<->published behavior is easy to remove later.
|
|
19
|
-
const ENABLE_LIVE_PUBLISH_TRANSITION = true;
|
|
20
|
-
const PUBLIC_HOST_ALIASES = new Set(["localhost", "127.0.0.1", "[::1]", "::1"]);
|
|
21
|
-
const ADMIN_HOST_ALIASES = new Set(["admin.localhost"]);
|
|
22
|
-
const isInsideDirectory = (basePath, targetPath) => {
|
|
23
|
-
const relativePath = path.relative(basePath, targetPath);
|
|
24
|
-
return relativePath !== "" && !relativePath.startsWith("..") && !path.isAbsolute(relativePath);
|
|
25
|
-
};
|
|
26
|
-
const isPublicOutputPublished = async (publicDir) => {
|
|
27
|
-
const publicIndexPath = path.join(publicDir, "index.html");
|
|
28
|
-
try {
|
|
29
|
-
const indexStats = await fs.stat(publicIndexPath);
|
|
30
|
-
return indexStats.isFile() || indexStats.isSymbolicLink();
|
|
31
|
-
}
|
|
32
|
-
catch {
|
|
33
|
-
return false;
|
|
34
|
-
}
|
|
35
|
-
};
|
|
36
|
-
const parseRequestHostname = (hostHeader) => {
|
|
37
|
-
if (!hostHeader) {
|
|
38
|
-
return null;
|
|
39
|
-
}
|
|
40
|
-
const firstHost = hostHeader.split(",")[0]?.trim();
|
|
41
|
-
if (!firstHost) {
|
|
42
|
-
return null;
|
|
43
|
-
}
|
|
44
|
-
try {
|
|
45
|
-
return new URL(`http://${firstHost}`).hostname.toLowerCase();
|
|
46
|
-
}
|
|
47
|
-
catch {
|
|
48
|
-
return firstHost.replace(/:\d+$/, "").toLowerCase();
|
|
49
|
-
}
|
|
50
|
-
};
|
|
51
|
-
const resolveSiteTarget = (hostname) => {
|
|
52
|
-
if (hostname === null || PUBLIC_HOST_ALIASES.has(hostname)) {
|
|
53
|
-
return "public";
|
|
54
|
-
}
|
|
55
|
-
if (ADMIN_HOST_ALIASES.has(hostname)) {
|
|
56
|
-
return "admin";
|
|
57
|
-
}
|
|
58
|
-
return null;
|
|
59
|
-
};
|
|
60
|
-
const resolveRootIndexFile = async (rootDir) => {
|
|
61
|
-
const rootIndexPath = path.join(rootDir, "index.html");
|
|
62
|
-
try {
|
|
63
|
-
const rootIndexStats = await fs.stat(rootIndexPath);
|
|
64
|
-
if (rootIndexStats.isFile()) {
|
|
65
|
-
return { type: "file", filePath: rootIndexPath };
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
catch {
|
|
69
|
-
// fall through to not found
|
|
70
|
-
}
|
|
71
|
-
return { type: "not-found" };
|
|
72
|
-
};
|
|
73
|
-
const resolveRequestFile = async (rootDir, requestPath, mode) => {
|
|
74
|
-
const normalizedPath = requestPath === "/" ? "index.html" : requestPath.replace(/^\/+/, "");
|
|
75
|
-
const filePath = path.join(rootDir, normalizedPath);
|
|
76
|
-
if (!isInsideDirectory(rootDir, filePath)) {
|
|
77
|
-
return { type: "forbidden" };
|
|
78
|
-
}
|
|
79
|
-
try {
|
|
80
|
-
const fileStats = await fs.stat(filePath);
|
|
81
|
-
if (fileStats.isDirectory()) {
|
|
82
|
-
const directoryIndexPath = path.join(filePath, "index.html");
|
|
83
|
-
if (!isInsideDirectory(rootDir, directoryIndexPath)) {
|
|
84
|
-
return { type: "forbidden" };
|
|
85
|
-
}
|
|
86
|
-
try {
|
|
87
|
-
const directoryIndexStats = await fs.stat(directoryIndexPath);
|
|
88
|
-
if (directoryIndexStats.isFile()) {
|
|
89
|
-
return { type: "file", filePath: directoryIndexPath };
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
catch {
|
|
93
|
-
// fall through to not found/fallback response
|
|
94
|
-
}
|
|
95
|
-
return mode === "spa-fallback" ? resolveRootIndexFile(rootDir) : { type: "not-found" };
|
|
96
|
-
}
|
|
97
|
-
if (fileStats.isFile()) {
|
|
98
|
-
return { type: "file", filePath };
|
|
99
|
-
}
|
|
100
|
-
return { type: "not-found" };
|
|
101
|
-
}
|
|
102
|
-
catch {
|
|
103
|
-
if (mode === "spa-fallback" && !path.extname(normalizedPath)) {
|
|
104
|
-
return resolveRootIndexFile(rootDir);
|
|
105
|
-
}
|
|
106
|
-
return { type: "not-found" };
|
|
107
|
-
}
|
|
108
|
-
};
|
|
109
|
-
const respondWithPublicNotFound = async (response, publicDir) => {
|
|
110
|
-
const notFoundPagePath = path.join(publicDir, "404.html");
|
|
111
|
-
try {
|
|
112
|
-
const notFoundPage = await fs.readFile(notFoundPagePath);
|
|
113
|
-
response.writeHead(404, { "content-type": MIME_TYPES[".html"] });
|
|
114
|
-
response.end(notFoundPage);
|
|
115
|
-
return;
|
|
116
|
-
}
|
|
117
|
-
catch {
|
|
118
|
-
// Fall back to plain text when public/404.html is unavailable.
|
|
119
|
-
}
|
|
120
|
-
response.writeHead(404, { "content-type": MIME_TYPES[".txt"] });
|
|
121
|
-
response.end(DEFAULT_NOT_FOUND_TEXT);
|
|
122
|
-
};
|
|
123
|
-
const respondWithDefaultNotFound = (response) => {
|
|
124
|
-
response.writeHead(404, { "content-type": MIME_TYPES[".txt"] });
|
|
125
|
-
response.end(DEFAULT_NOT_FOUND_TEXT);
|
|
126
|
-
};
|
|
127
|
-
const respondWithPublicUnavailable = (response) => {
|
|
128
|
-
response.writeHead(503, {
|
|
129
|
-
"content-type": MIME_TYPES[".txt"],
|
|
130
|
-
"retry-after": "60"
|
|
131
|
-
});
|
|
132
|
-
response.end(DEFAULT_PUBLIC_UNAVAILABLE_TEXT);
|
|
133
|
-
};
|
|
134
|
-
const isRootPublicPath = (requestPath) => {
|
|
135
|
-
const normalizedPath = requestPath.replace(/\/+$/, "");
|
|
136
|
-
return normalizedPath.length === 0 || normalizedPath === "/index.html";
|
|
137
|
-
};
|
|
138
|
-
const closeServer = async (server) => new Promise((resolve, reject) => {
|
|
139
|
-
server.close((error) => {
|
|
140
|
-
if (error) {
|
|
141
|
-
reject(error);
|
|
142
|
-
return;
|
|
143
|
-
}
|
|
144
|
-
resolve();
|
|
145
|
-
});
|
|
146
|
-
});
|
|
5
|
+
import { createAuthRuntime } from "./auth/runtime.js";
|
|
6
|
+
import { DEV_PUBLIC_HOST, DEV_STUDIO_HOST, ENABLE_LIVE_PUBLISH_TRANSITION } from "./dev/constants.js";
|
|
7
|
+
import { closeServer } from "./dev/lifecycle.js";
|
|
8
|
+
import { respondWithDefaultNotFound } from "./dev/http/errors.js";
|
|
9
|
+
import { parseRequestHostname, resolveSiteTarget } from "./dev/http/routing.js";
|
|
10
|
+
import { isPublicOutputPublished } from "./dev/static/index.js";
|
|
11
|
+
import { handleAdminRequest, resolveAdminDistDir } from "./dev/admin/index.js";
|
|
12
|
+
import { handlePublicRequest } from "./dev/public/index.js";
|
|
13
|
+
import { handleSetupStatusRequest, isSetupStatusRequest } from "./dev/setup/index.js";
|
|
14
|
+
import { handleHealthRequest, isHealthRequest, readDatabaseHealthState } from "./dev/health/index.js";
|
|
147
15
|
export const startDevServer = async (options) => {
|
|
148
|
-
const host = options.host ??
|
|
16
|
+
const host = options.host ?? DEV_PUBLIC_HOST;
|
|
149
17
|
const runtimeDir = path.join(options.projectRoot, ATRIA_RUNTIME_DIR);
|
|
150
18
|
const publicDir = path.join(options.projectRoot, PUBLIC_OUTPUT_DIR);
|
|
19
|
+
const adminDistDir = resolveAdminDistDir();
|
|
20
|
+
const authRuntime = createAuthRuntime({
|
|
21
|
+
projectRoot: options.projectRoot,
|
|
22
|
+
port: options.port
|
|
23
|
+
});
|
|
151
24
|
await fs.access(runtimeDir);
|
|
25
|
+
await fs.access(path.join(adminDistDir, "app.js"));
|
|
152
26
|
let publicOutputPublished = await isPublicOutputPublished(publicDir);
|
|
27
|
+
let ownerSetupState = await authRuntime.getOwnerSetupState();
|
|
28
|
+
let databaseHealthState = await readDatabaseHealthState(options.projectRoot);
|
|
153
29
|
const refreshPublicPublishState = async () => {
|
|
154
30
|
publicOutputPublished = await isPublicOutputPublished(publicDir);
|
|
155
31
|
};
|
|
32
|
+
const refreshOwnerSetupState = async () => {
|
|
33
|
+
ownerSetupState = await authRuntime.getOwnerSetupState();
|
|
34
|
+
};
|
|
35
|
+
const refreshDatabaseHealthState = async () => {
|
|
36
|
+
databaseHealthState = await readDatabaseHealthState(options.projectRoot);
|
|
37
|
+
};
|
|
156
38
|
const server = createServer(async (request, response) => {
|
|
157
39
|
try {
|
|
158
40
|
const hostname = parseRequestHostname(request.headers.host);
|
|
@@ -163,76 +45,69 @@ export const startDevServer = async (options) => {
|
|
|
163
45
|
}
|
|
164
46
|
const requestHost = hostname ?? DEV_PUBLIC_HOST;
|
|
165
47
|
const requestUrl = new URL(request.url ?? "/", `http://${requestHost}:${options.port}`);
|
|
166
|
-
if (ENABLE_LIVE_PUBLISH_TRANSITION &&
|
|
167
|
-
(siteTarget === "public" || requestUrl.pathname === "/api/health")) {
|
|
48
|
+
if (ENABLE_LIVE_PUBLISH_TRANSITION && (siteTarget === "public" || isHealthRequest(requestUrl))) {
|
|
168
49
|
await refreshPublicPublishState();
|
|
169
50
|
}
|
|
170
|
-
if (
|
|
171
|
-
|
|
172
|
-
response.end(JSON.stringify({
|
|
173
|
-
ok: true,
|
|
174
|
-
site: siteTarget,
|
|
175
|
-
publicOutputPublished
|
|
176
|
-
}));
|
|
177
|
-
return;
|
|
51
|
+
if (siteTarget === "admin" || isSetupStatusRequest(requestUrl)) {
|
|
52
|
+
await refreshOwnerSetupState();
|
|
178
53
|
}
|
|
179
|
-
if (
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
54
|
+
if (isHealthRequest(requestUrl)) {
|
|
55
|
+
await refreshDatabaseHealthState();
|
|
56
|
+
handleHealthRequest({
|
|
57
|
+
response,
|
|
58
|
+
siteTarget,
|
|
59
|
+
publicOutputPublished,
|
|
60
|
+
ownerSetupState,
|
|
61
|
+
databaseHealthState
|
|
62
|
+
});
|
|
186
63
|
return;
|
|
187
64
|
}
|
|
188
|
-
|
|
189
|
-
const mode = siteTarget === "admin" ? "spa-fallback" : "strict";
|
|
190
|
-
const targetFile = await resolveRequestFile(rootDir, decodeURIComponent(requestUrl.pathname), mode);
|
|
191
|
-
if (targetFile.type === "forbidden") {
|
|
192
|
-
response.writeHead(403, { "content-type": MIME_TYPES[".txt"] });
|
|
193
|
-
response.end("Forbidden");
|
|
65
|
+
if (handleSetupStatusRequest(requestUrl, response, siteTarget, ownerSetupState)) {
|
|
194
66
|
return;
|
|
195
67
|
}
|
|
196
|
-
if (
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
68
|
+
if (siteTarget === "admin") {
|
|
69
|
+
await handleAdminRequest({
|
|
70
|
+
request,
|
|
71
|
+
response,
|
|
72
|
+
requestUrl,
|
|
73
|
+
runtimeDir,
|
|
74
|
+
adminDistDir,
|
|
75
|
+
ownerSetupState,
|
|
76
|
+
authRuntime
|
|
77
|
+
});
|
|
202
78
|
return;
|
|
203
79
|
}
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
80
|
+
await handlePublicRequest({
|
|
81
|
+
requestUrl,
|
|
82
|
+
response,
|
|
83
|
+
publicDir,
|
|
84
|
+
publicOutputPublished
|
|
85
|
+
});
|
|
209
86
|
}
|
|
210
87
|
catch {
|
|
211
88
|
respondWithDefaultNotFound(response);
|
|
212
89
|
}
|
|
213
90
|
});
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
server.
|
|
218
|
-
|
|
219
|
-
resolve();
|
|
220
|
-
});
|
|
91
|
+
await new Promise((resolve, reject) => {
|
|
92
|
+
server.once("error", reject);
|
|
93
|
+
server.listen(options.port, host, () => {
|
|
94
|
+
server.off("error", reject);
|
|
95
|
+
resolve();
|
|
221
96
|
});
|
|
222
|
-
}
|
|
223
|
-
catch (error) {
|
|
224
|
-
throw error;
|
|
225
|
-
}
|
|
97
|
+
});
|
|
226
98
|
return {
|
|
227
99
|
url: `http://${DEV_PUBLIC_HOST}:${options.port}`,
|
|
228
100
|
publicUrl: `http://${DEV_PUBLIC_HOST}:${options.port}`,
|
|
229
|
-
adminUrl: `http://${
|
|
101
|
+
adminUrl: `http://${DEV_STUDIO_HOST}:${options.port}`,
|
|
230
102
|
servingPublicDir: publicDir,
|
|
231
103
|
servingAdminDir: runtimeDir,
|
|
232
104
|
get publicOutputPublished() {
|
|
233
105
|
return publicOutputPublished;
|
|
234
106
|
},
|
|
235
|
-
close: async () =>
|
|
107
|
+
close: async () => {
|
|
108
|
+
await closeServer(server);
|
|
109
|
+
await authRuntime.close();
|
|
110
|
+
}
|
|
236
111
|
};
|
|
237
112
|
};
|
|
238
113
|
//# sourceMappingURL=server.js.map
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atria/server",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.12",
|
|
4
4
|
"description": "HTTP server and runtime delivery for atria",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"atria",
|
|
@@ -24,7 +24,9 @@
|
|
|
24
24
|
"dist"
|
|
25
25
|
],
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@atria/
|
|
27
|
+
"@atria/admin": "0.1.1",
|
|
28
|
+
"@atria/db": "0.0.6",
|
|
29
|
+
"@atria/shared": "0.0.10"
|
|
28
30
|
},
|
|
29
31
|
"publishConfig": {
|
|
30
32
|
"access": "public"
|