@trebired/frontend 6.12.0 → 6.13.0
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/CHANGELOG.md +11 -0
- package/dist/server/fallback.d.ts +36 -0
- package/dist/server/fallback.d.ts.map +1 -0
- package/dist/server/fallback.js +70 -0
- package/dist/server/fallback.js.map +1 -0
- package/dist/server/index.d.ts +4 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +4 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/live-socket.d.ts +77 -0
- package/dist/server/live-socket.d.ts.map +1 -0
- package/dist/server/live-socket.js +186 -0
- package/dist/server/live-socket.js.map +1 -0
- package/dist/server/security/cors.d.ts +22 -0
- package/dist/server/security/cors.d.ts.map +1 -0
- package/dist/server/security/cors.js +41 -0
- package/dist/server/security/cors.js.map +1 -0
- package/dist/server/security/helpers.d.ts +6 -0
- package/dist/server/security/helpers.d.ts.map +1 -0
- package/dist/server/security/helpers.js +17 -0
- package/dist/server/security/helpers.js.map +1 -0
- package/dist/server/security/policy.d.ts +42 -0
- package/dist/server/security/policy.d.ts.map +1 -0
- package/dist/server/security/policy.js +159 -0
- package/dist/server/security/policy.js.map +1 -0
- package/dist/server/security.d.ts.map +1 -1
- package/dist/server/security.js +2 -13
- package/dist/server/security.js.map +1 -1
- package/dist/src/server/fallback.d.ts +36 -0
- package/dist/src/server/fallback.d.ts.map +1 -0
- package/dist/src/server/fallback.js +70 -0
- package/dist/src/server/fallback.js.map +1 -0
- package/dist/src/server/index.d.ts +4 -0
- package/dist/src/server/index.d.ts.map +1 -1
- package/dist/src/server/index.js +4 -0
- package/dist/src/server/index.js.map +1 -1
- package/dist/src/server/live-socket.d.ts +77 -0
- package/dist/src/server/live-socket.d.ts.map +1 -0
- package/dist/src/server/live-socket.js +186 -0
- package/dist/src/server/live-socket.js.map +1 -0
- package/dist/src/server/security/cors.d.ts +22 -0
- package/dist/src/server/security/cors.d.ts.map +1 -0
- package/dist/src/server/security/cors.js +41 -0
- package/dist/src/server/security/cors.js.map +1 -0
- package/dist/src/server/security/helpers.d.ts +6 -0
- package/dist/src/server/security/helpers.d.ts.map +1 -0
- package/dist/src/server/security/helpers.js +17 -0
- package/dist/src/server/security/helpers.js.map +1 -0
- package/dist/src/server/security/policy.d.ts +42 -0
- package/dist/src/server/security/policy.d.ts.map +1 -0
- package/dist/src/server/security/policy.js +159 -0
- package/dist/src/server/security/policy.js.map +1 -0
- package/dist/src/server/security.d.ts.map +1 -1
- package/dist/src/server/security.js +2 -13
- package/dist/src/server/security.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
All notable package changes are documented here.
|
|
4
4
|
|
|
5
|
+
## 6.13.0
|
|
6
|
+
|
|
7
|
+
- Added package-owned live Socket.IO server helpers for resource rooms, room authorization, broadcasting, and sidebar live sync.
|
|
8
|
+
- Added reusable server security policy helpers for nonce middleware, security headers, content security policy, and CORS option delegation.
|
|
9
|
+
- Added verification coverage for the new live socket and security policy server APIs.
|
|
10
|
+
|
|
11
|
+
## 6.12.1
|
|
12
|
+
|
|
13
|
+
- Added server fallback helpers for HTML document detection, current render-mode path selection, and document-vs-JSON fallback dispatch.
|
|
14
|
+
- Reused package-owned sidebar-live route and protocol helpers so apps keep only their live room mapping and data resolvers.
|
|
15
|
+
|
|
5
16
|
## 6.12.0
|
|
6
17
|
|
|
7
18
|
- Added adjustable SEO defaults for indexability, robots directives, canonical URLs, social preview tags, verification tags, alternates, and JSON-LD structured data.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { type ServerRequestLike, type ServerResponseLike } from "./http.js";
|
|
2
|
+
type AcceptedMediaRange = {
|
|
3
|
+
media: string;
|
|
4
|
+
q: number;
|
|
5
|
+
};
|
|
6
|
+
type DocumentFallbackOptions = {
|
|
7
|
+
mediaTypes?: readonly string[];
|
|
8
|
+
methods?: readonly string[];
|
|
9
|
+
};
|
|
10
|
+
type CurrentRenderModePathOptions = {
|
|
11
|
+
exclude?: readonly string[];
|
|
12
|
+
};
|
|
13
|
+
type FrontendFallbackMode = "document" | "json";
|
|
14
|
+
type FrontendFallbackModeContext = {
|
|
15
|
+
mode: FrontendFallbackMode;
|
|
16
|
+
next?: (error?: unknown) => unknown;
|
|
17
|
+
req: ServerRequestLike;
|
|
18
|
+
res: ServerResponseLike;
|
|
19
|
+
};
|
|
20
|
+
type FrontendFallbackModeOptions = DocumentFallbackOptions & {
|
|
21
|
+
applyRenderMode?: (mode: string) => (req: ServerRequestLike, res: ServerResponseLike, next: (error?: unknown) => unknown) => unknown;
|
|
22
|
+
documentRenderMode?: string;
|
|
23
|
+
respond: (context: FrontendFallbackModeContext) => unknown;
|
|
24
|
+
};
|
|
25
|
+
declare const DOCUMENT_FALLBACK_METHODS: readonly string[];
|
|
26
|
+
declare const HTML_DOCUMENT_MEDIA_TYPES: readonly string[];
|
|
27
|
+
declare const RENDER_MODE_PATH_EXCLUDES: readonly string[];
|
|
28
|
+
declare function parseAcceptedMediaRange(input: unknown): AcceptedMediaRange | null;
|
|
29
|
+
declare function acceptedMediaRanges(req: ServerRequestLike | null | undefined): AcceptedMediaRange[];
|
|
30
|
+
declare function acceptsHtmlDocument(req: ServerRequestLike | null | undefined, options?: DocumentFallbackOptions): boolean;
|
|
31
|
+
declare function shouldRenderDocumentFallback(req: ServerRequestLike | null | undefined, options?: DocumentFallbackOptions): boolean;
|
|
32
|
+
declare function currentRenderModePath(res: ServerResponseLike | null | undefined, options?: CurrentRenderModePathOptions): string;
|
|
33
|
+
declare function respondWithFrontendFallbackMode(req: ServerRequestLike, res: ServerResponseLike, next: ((error?: unknown) => unknown) | undefined, options: FrontendFallbackModeOptions): unknown;
|
|
34
|
+
export { acceptedMediaRanges, acceptsHtmlDocument, currentRenderModePath, DOCUMENT_FALLBACK_METHODS, HTML_DOCUMENT_MEDIA_TYPES, parseAcceptedMediaRange, RENDER_MODE_PATH_EXCLUDES, respondWithFrontendFallbackMode, shouldRenderDocumentFallback, };
|
|
35
|
+
export type { AcceptedMediaRange, CurrentRenderModePathOptions, DocumentFallbackOptions, FrontendFallbackMode, FrontendFallbackModeContext, FrontendFallbackModeOptions, };
|
|
36
|
+
//# sourceMappingURL=fallback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fallback.d.ts","sourceRoot":"","sources":["../../../src/server/fallback.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACxB,MAAM,WAAW,CAAC;AAEnB,KAAK,kBAAkB,GAAG;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,CAAC,EAAE,MAAM,CAAC;CACX,CAAC;AAEF,KAAK,uBAAuB,GAAG;IAC7B,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7B,CAAC;AAEF,KAAK,4BAA4B,GAAG;IAClC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7B,CAAC;AAEF,KAAK,oBAAoB,GAAG,UAAU,GAAG,MAAM,CAAC;AAEhD,KAAK,2BAA2B,GAAG;IACjC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC;IACpC,GAAG,EAAE,iBAAiB,CAAC;IACvB,GAAG,EAAE,kBAAkB,CAAC;CACzB,CAAC;AAEF,KAAK,2BAA2B,GAAG,uBAAuB,GAAE;IAC1D,eAAe,CAAC,EAAE,CAChB,IAAI,EAAE,MAAM,KACT,CAAC,GAAG,EAAE,iBAAiB,EAAE,GAAG,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,OAAO,KAAK,OAAO,CAAC;IACtG,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,OAAO,EAAE,CAAC,OAAO,EAAE,2BAA2B,KAAK,OAAO,CAAC;CAC5D,CAAC;AAEF,QAAA,MAAM,yBAAyB,mBAAiC,CAAC;AACjE,QAAA,MAAM,yBAAyB,mBAAwD,CAAC;AACxF,QAAA,MAAM,yBAAyB,mBAK7B,CAAC;AAEH,iBAAS,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,kBAAkB,GAAG,IAAI,CAa1E;AAED,iBAAS,mBAAmB,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,GAAG,SAAS,wBAKrE;AAED,iBAAS,mBAAmB,CAC1B,GAAG,EAAE,iBAAiB,GAAG,IAAI,GAAG,SAAS,EACzC,OAAO,GAAE,uBAA4B,WAItC;AAED,iBAAS,4BAA4B,CACnC,GAAG,EAAE,iBAAiB,GAAG,IAAI,GAAG,SAAS,EACzC,OAAO,GAAE,uBAA4B,WAOtC;AAED,iBAAS,qBAAqB,CAC5B,GAAG,EAAE,kBAAkB,GAAG,IAAI,GAAG,SAAS,EAC1C,OAAO,GAAE,4BAAiC,UAW3C;AAED,iBAAS,+BAA+B,CACtC,GAAG,EAAE,iBAAiB,EACtB,GAAG,EAAE,kBAAkB,EACvB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,GAAG,SAAS,EAChD,OAAO,EAAE,2BAA2B,WAarC;AAED,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,yBAAyB,EACzB,yBAAyB,EACzB,uBAAuB,EACvB,yBAAyB,EACzB,+BAA+B,EAC/B,4BAA4B,GAC7B,CAAC;AACF,YAAY,EACV,kBAAkB,EAClB,4BAA4B,EAC5B,uBAAuB,EACvB,oBAAoB,EACpB,2BAA2B,EAC3B,2BAA2B,GAC5B,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { requestHeader, serverObject, serverString, } from "./http.js";
|
|
2
|
+
const DOCUMENT_FALLBACK_METHODS = Object.freeze(["GET", "HEAD"]);
|
|
3
|
+
const HTML_DOCUMENT_MEDIA_TYPES = Object.freeze(["application/xhtml+xml", "text/html"]);
|
|
4
|
+
const RENDER_MODE_PATH_EXCLUDES = Object.freeze([
|
|
5
|
+
"default",
|
|
6
|
+
"partial",
|
|
7
|
+
"success",
|
|
8
|
+
"noop",
|
|
9
|
+
]);
|
|
10
|
+
function parseAcceptedMediaRange(input) {
|
|
11
|
+
const parts = serverString(input).split(";").map((part) => part.trim());
|
|
12
|
+
const media = serverString(parts.shift()).toLowerCase();
|
|
13
|
+
if (!media)
|
|
14
|
+
return null;
|
|
15
|
+
let q = 1;
|
|
16
|
+
for (const part of parts) {
|
|
17
|
+
const separator = part.indexOf("=");
|
|
18
|
+
const key = separator >= 0 ? part.slice(0, separator).trim().toLowerCase() : "";
|
|
19
|
+
if (key !== "q")
|
|
20
|
+
continue;
|
|
21
|
+
const parsed = Number(part.slice(separator + 1).trim());
|
|
22
|
+
if (Number.isFinite(parsed))
|
|
23
|
+
q = Math.max(0, Math.min(1, parsed));
|
|
24
|
+
}
|
|
25
|
+
return { media, q };
|
|
26
|
+
}
|
|
27
|
+
function acceptedMediaRanges(req) {
|
|
28
|
+
return requestHeader(req, "accept")
|
|
29
|
+
.split(",")
|
|
30
|
+
.map((entry) => parseAcceptedMediaRange(entry))
|
|
31
|
+
.filter((entry) => Boolean(entry && entry.q > 0));
|
|
32
|
+
}
|
|
33
|
+
function acceptsHtmlDocument(req, options = {}) {
|
|
34
|
+
const mediaTypes = new Set(options.mediaTypes || HTML_DOCUMENT_MEDIA_TYPES);
|
|
35
|
+
return acceptedMediaRanges(req).some((range) => mediaTypes.has(range.media));
|
|
36
|
+
}
|
|
37
|
+
function shouldRenderDocumentFallback(req, options = {}) {
|
|
38
|
+
const method = serverString(req?.method)
|
|
39
|
+
.trim()
|
|
40
|
+
.toUpperCase();
|
|
41
|
+
const methods = new Set(options.methods || DOCUMENT_FALLBACK_METHODS);
|
|
42
|
+
return methods.has(method) && acceptsHtmlDocument(req, options);
|
|
43
|
+
}
|
|
44
|
+
function currentRenderModePath(res, options = {}) {
|
|
45
|
+
const flags = serverObject(res?.locals?.renderMode);
|
|
46
|
+
const exclude = new Set(options.exclude || RENDER_MODE_PATH_EXCLUDES);
|
|
47
|
+
const names = Object.keys(flags)
|
|
48
|
+
.filter((name) => flags[name] === true && !exclude.has(name))
|
|
49
|
+
.sort((left, right) => {
|
|
50
|
+
const depth = right.split(".").length - left.split(".").length;
|
|
51
|
+
return depth !== 0 ? depth : right.length - left.length;
|
|
52
|
+
});
|
|
53
|
+
return names[0] || "";
|
|
54
|
+
}
|
|
55
|
+
function respondWithFrontendFallbackMode(req, res, next, options) {
|
|
56
|
+
if (!shouldRenderDocumentFallback(req, options)) {
|
|
57
|
+
return options.respond({ mode: "json", next, req, res });
|
|
58
|
+
}
|
|
59
|
+
if (!options.applyRenderMode) {
|
|
60
|
+
return options.respond({ mode: "document", next, req, res });
|
|
61
|
+
}
|
|
62
|
+
const middleware = options.applyRenderMode(options.documentRenderMode || "error");
|
|
63
|
+
return middleware(req, res, (error) => {
|
|
64
|
+
if (error)
|
|
65
|
+
return typeof next === "function" ? next(error) : undefined;
|
|
66
|
+
return options.respond({ mode: "document", next, req, res });
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
export { acceptedMediaRanges, acceptsHtmlDocument, currentRenderModePath, DOCUMENT_FALLBACK_METHODS, HTML_DOCUMENT_MEDIA_TYPES, parseAcceptedMediaRange, RENDER_MODE_PATH_EXCLUDES, respondWithFrontendFallbackMode, shouldRenderDocumentFallback, };
|
|
70
|
+
//# sourceMappingURL=fallback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fallback.js","sourceRoot":"","sources":["../../../src/server/fallback.ts"],"names":[],"mappings":"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"}
|
package/dist/server/index.d.ts
CHANGED
|
@@ -3,18 +3,22 @@ export * from "../icons/server/index.d.ts";
|
|
|
3
3
|
export * from "../icons/server-context.d.ts";
|
|
4
4
|
export * from "../icons/shared.d.ts";
|
|
5
5
|
export * from "./favicon.js";
|
|
6
|
+
export * from "./fallback.js";
|
|
6
7
|
export * from "./framework.js";
|
|
7
8
|
export * from "./http.js";
|
|
8
9
|
export * from "./assets.js";
|
|
9
10
|
export * from "./language.js";
|
|
10
11
|
export * from "./locale.js";
|
|
11
12
|
export * from "./live.js";
|
|
13
|
+
export * from "./live-socket.js";
|
|
12
14
|
export * from "./navigation.js";
|
|
13
15
|
export * from "./page-task.js";
|
|
14
16
|
export * from "./react/render.d.ts";
|
|
15
17
|
export * from "./render/mode.js";
|
|
16
18
|
export * from "./render/mode-toolkit.js";
|
|
17
19
|
export * from "./security.js";
|
|
20
|
+
export * from "./security/cors.js";
|
|
21
|
+
export * from "./security/policy.js";
|
|
18
22
|
export * from "./seo.js";
|
|
19
23
|
export * from "./seo/robots.js";
|
|
20
24
|
export * from "./seo/routes.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,0BAA0B,CAAC;AACzC,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,0BAA0B,CAAC;AACzC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
|
package/dist/server/index.js
CHANGED
|
@@ -3,18 +3,22 @@ export * from "../icons/server/index.js";
|
|
|
3
3
|
export * from "../icons/server-context.js";
|
|
4
4
|
export * from "../icons/shared.js";
|
|
5
5
|
export * from "./favicon.js";
|
|
6
|
+
export * from "./fallback.js";
|
|
6
7
|
export * from "./framework.js";
|
|
7
8
|
export * from "./http.js";
|
|
8
9
|
export * from "./assets.js";
|
|
9
10
|
export * from "./language.js";
|
|
10
11
|
export * from "./locale.js";
|
|
11
12
|
export * from "./live.js";
|
|
13
|
+
export * from "./live-socket.js";
|
|
12
14
|
export * from "./navigation.js";
|
|
13
15
|
export * from "./page-task.js";
|
|
14
16
|
export * from "./react/render.js";
|
|
15
17
|
export * from "./render/mode.js";
|
|
16
18
|
export * from "./render/mode-toolkit.js";
|
|
17
19
|
export * from "./security.js";
|
|
20
|
+
export * from "./security/cors.js";
|
|
21
|
+
export * from "./security/policy.js";
|
|
18
22
|
export * from "./seo.js";
|
|
19
23
|
export * from "./seo/robots.js";
|
|
20
24
|
export * from "./seo/routes.js";
|
package/dist/server/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,0BAA0B,CAAC;AACzC,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,0BAA0B,CAAC;AACzC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { type ServerRequestLike, type ServerResponseLike } from "./http.js";
|
|
2
|
+
import { type SidebarLiveDescriptor } from "./sidebar-live.js";
|
|
3
|
+
type LiveSocketLike = {
|
|
4
|
+
emit?: (event: string, payload?: unknown) => unknown;
|
|
5
|
+
handshake?: Record<string, unknown>;
|
|
6
|
+
join?: (room: string) => unknown;
|
|
7
|
+
leave?: (room: string) => unknown;
|
|
8
|
+
login_session?: unknown;
|
|
9
|
+
on?: (event: string, handler: (...args: any[]) => unknown) => unknown;
|
|
10
|
+
viewer?: unknown;
|
|
11
|
+
};
|
|
12
|
+
type LiveSocketNamespaceLike = {
|
|
13
|
+
on?: (event: string, handler: (socket: LiveSocketLike) => unknown) => unknown;
|
|
14
|
+
to?: (room: string) => {
|
|
15
|
+
emit?: (event: string, payload?: unknown) => unknown;
|
|
16
|
+
};
|
|
17
|
+
use?: (middleware: unknown) => unknown;
|
|
18
|
+
};
|
|
19
|
+
type LiveSocketServerLike = LiveSocketNamespaceLike & {
|
|
20
|
+
of?: (namespace: string) => LiveSocketNamespaceLike;
|
|
21
|
+
};
|
|
22
|
+
type LiveRoom = {
|
|
23
|
+
id: string;
|
|
24
|
+
kind: string;
|
|
25
|
+
room: string;
|
|
26
|
+
};
|
|
27
|
+
type LiveSocketLogger = {
|
|
28
|
+
info?: (scope: string, message: string, metadata?: Record<string, unknown>) => unknown;
|
|
29
|
+
warn?: (scope: string, message: string, metadata?: Record<string, unknown>) => unknown;
|
|
30
|
+
};
|
|
31
|
+
type LiveSocketSidebarSyncContext = {
|
|
32
|
+
items: SidebarLiveDescriptor[];
|
|
33
|
+
payload: unknown;
|
|
34
|
+
req: ServerRequestLike;
|
|
35
|
+
res: ServerResponseLike;
|
|
36
|
+
socket: LiveSocketLike;
|
|
37
|
+
};
|
|
38
|
+
type LiveSocketSidebarSyncOptions = {
|
|
39
|
+
event?: string;
|
|
40
|
+
readItems?: (payload: unknown) => SidebarLiveDescriptor[];
|
|
41
|
+
resolve: (context: LiveSocketSidebarSyncContext) => unknown | Promise<unknown>;
|
|
42
|
+
responseEvent?: string;
|
|
43
|
+
withContext?: (context: LiveSocketSidebarSyncContext, run: () => Promise<unknown>) => Promise<unknown>;
|
|
44
|
+
};
|
|
45
|
+
type LiveSocketServerOptions = {
|
|
46
|
+
authenticate?: unknown | readonly unknown[];
|
|
47
|
+
changeEvent?: string;
|
|
48
|
+
deniedEvent?: string;
|
|
49
|
+
logger?: LiveSocketLogger;
|
|
50
|
+
namespace?: string;
|
|
51
|
+
sidebarSync?: false | LiveSocketSidebarSyncOptions;
|
|
52
|
+
subscribedEvent?: string;
|
|
53
|
+
subscribeEvent?: string;
|
|
54
|
+
unsubscribeEvent?: string;
|
|
55
|
+
};
|
|
56
|
+
type LiveSocketServer = {
|
|
57
|
+
attach: (server: LiveSocketServerLike) => boolean;
|
|
58
|
+
broadcast: (room: unknown, event: unknown, data: unknown) => boolean;
|
|
59
|
+
namespace: () => LiveSocketNamespaceLike | null;
|
|
60
|
+
registerRoomAuthorizer: (kind: unknown, authorize: (socket: LiveSocketLike, id: string) => unknown) => boolean;
|
|
61
|
+
};
|
|
62
|
+
declare const DEFAULT_LIVE_NAMESPACE = "/live";
|
|
63
|
+
declare const DEFAULT_LIVE_CHANGE_EVENT = "resource:change";
|
|
64
|
+
declare const DEFAULT_LIVE_SUBSCRIBE_EVENT = "subscribe";
|
|
65
|
+
declare const DEFAULT_LIVE_UNSUBSCRIBE_EVENT = "unsubscribe";
|
|
66
|
+
declare const DEFAULT_LIVE_SUBSCRIBED_EVENT = "live:subscribed";
|
|
67
|
+
declare const DEFAULT_LIVE_DENIED_EVENT = "live:denied";
|
|
68
|
+
declare const DEFAULT_LIVE_SIDEBAR_SYNC_EVENT = "sidebar:sync";
|
|
69
|
+
declare function liveRoomFor(kind: unknown, id: unknown): string;
|
|
70
|
+
declare function parseLiveRoom(room: unknown): LiveRoom | null;
|
|
71
|
+
declare function liveSocketRequest(socket: LiveSocketLike): ServerRequestLike;
|
|
72
|
+
declare function liveSocketResponse(socket: LiveSocketLike): ServerResponseLike;
|
|
73
|
+
declare function createLiveSocketServer(options?: LiveSocketServerOptions): LiveSocketServer;
|
|
74
|
+
declare function attachLiveSocketServer(server: LiveSocketServerLike, options?: LiveSocketServerOptions): LiveSocketServer;
|
|
75
|
+
export { attachLiveSocketServer, createLiveSocketServer, DEFAULT_LIVE_CHANGE_EVENT, DEFAULT_LIVE_DENIED_EVENT, DEFAULT_LIVE_NAMESPACE, DEFAULT_LIVE_SIDEBAR_SYNC_EVENT, DEFAULT_LIVE_SUBSCRIBED_EVENT, DEFAULT_LIVE_SUBSCRIBE_EVENT, DEFAULT_LIVE_UNSUBSCRIBE_EVENT, liveRoomFor, liveSocketRequest, liveSocketResponse, parseLiveRoom, };
|
|
76
|
+
export type { LiveRoom, LiveSocketLike, LiveSocketLogger, LiveSocketNamespaceLike, LiveSocketServer, LiveSocketServerLike, LiveSocketServerOptions, LiveSocketSidebarSyncContext, LiveSocketSidebarSyncOptions, };
|
|
77
|
+
//# sourceMappingURL=live-socket.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-socket.d.ts","sourceRoot":"","sources":["../../../src/server/live-socket.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { serverObject, serverString, } from "./http.js";
|
|
2
|
+
import { readSidebarLiveItems, } from "./sidebar-live.js";
|
|
3
|
+
const DEFAULT_LIVE_NAMESPACE = "/live";
|
|
4
|
+
const DEFAULT_LIVE_CHANGE_EVENT = "resource:change";
|
|
5
|
+
const DEFAULT_LIVE_SUBSCRIBE_EVENT = "subscribe";
|
|
6
|
+
const DEFAULT_LIVE_UNSUBSCRIBE_EVENT = "unsubscribe";
|
|
7
|
+
const DEFAULT_LIVE_SUBSCRIBED_EVENT = "live:subscribed";
|
|
8
|
+
const DEFAULT_LIVE_DENIED_EVENT = "live:denied";
|
|
9
|
+
const DEFAULT_LIVE_SIDEBAR_SYNC_EVENT = "sidebar:sync";
|
|
10
|
+
function liveRoomFor(kind, id) {
|
|
11
|
+
const safeKind = serverString(kind).trim();
|
|
12
|
+
const safeId = serverString(id).trim();
|
|
13
|
+
return safeKind && safeId ? `${safeKind}:${safeId}` : "";
|
|
14
|
+
}
|
|
15
|
+
function parseLiveRoom(room) {
|
|
16
|
+
const text = serverString(room).trim();
|
|
17
|
+
const separator = text.indexOf(":");
|
|
18
|
+
if (separator <= 0 || separator >= text.length - 1)
|
|
19
|
+
return null;
|
|
20
|
+
return {
|
|
21
|
+
kind: text.slice(0, separator),
|
|
22
|
+
id: text.slice(separator + 1),
|
|
23
|
+
room: text,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function liveSocketRequest(socket) {
|
|
27
|
+
const handshake = serverObject(socket && socket.handshake);
|
|
28
|
+
const request = serverObject(handshake.request);
|
|
29
|
+
return Object.assign(Object.create(request ? Object.getPrototypeOf(request) : Object.prototype), request, {
|
|
30
|
+
address: handshake.address || "",
|
|
31
|
+
cookies: serverObject(request.cookies),
|
|
32
|
+
headers: serverObject(handshake.headers || request.headers),
|
|
33
|
+
ip: handshake.address || "",
|
|
34
|
+
login_session: socket && socket.login_session ? socket.login_session : null,
|
|
35
|
+
viewer: socket && socket.viewer ? socket.viewer : null,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
function liveSocketResponse(socket) {
|
|
39
|
+
return {
|
|
40
|
+
locals: {
|
|
41
|
+
isAuthenticated: Boolean(socket && socket.viewer),
|
|
42
|
+
login_session: socket && socket.login_session ? socket.login_session : null,
|
|
43
|
+
viewer: socket && socket.viewer ? socket.viewer : null,
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
function normalizeLiveSocketOptions(options = {}) {
|
|
48
|
+
return {
|
|
49
|
+
changeEvent: serverString(options.changeEvent || DEFAULT_LIVE_CHANGE_EVENT),
|
|
50
|
+
deniedEvent: serverString(options.deniedEvent || DEFAULT_LIVE_DENIED_EVENT),
|
|
51
|
+
namespace: serverString(options.namespace || DEFAULT_LIVE_NAMESPACE),
|
|
52
|
+
sidebarSync: options.sidebarSync,
|
|
53
|
+
subscribedEvent: serverString(options.subscribedEvent || DEFAULT_LIVE_SUBSCRIBED_EVENT),
|
|
54
|
+
subscribeEvent: serverString(options.subscribeEvent || DEFAULT_LIVE_SUBSCRIBE_EVENT),
|
|
55
|
+
unsubscribeEvent: serverString(options.unsubscribeEvent || DEFAULT_LIVE_UNSUBSCRIBE_EVENT),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
function liveSocketMiddlewareList(options) {
|
|
59
|
+
if (Array.isArray(options.authenticate))
|
|
60
|
+
return [...options.authenticate];
|
|
61
|
+
return options.authenticate ? [options.authenticate] : [];
|
|
62
|
+
}
|
|
63
|
+
function resolveLiveSocketNamespace(server, namespace) {
|
|
64
|
+
return typeof server?.of === "function" ? server.of(namespace) : server;
|
|
65
|
+
}
|
|
66
|
+
function createLiveSocketServer(options = {}) {
|
|
67
|
+
const normalized = normalizeLiveSocketOptions(options);
|
|
68
|
+
const authorizers = new Map();
|
|
69
|
+
let activeNamespace = null;
|
|
70
|
+
async function isRoomAllowed(socket, room) {
|
|
71
|
+
const authorize = authorizers.get(room.kind);
|
|
72
|
+
if (!authorize)
|
|
73
|
+
return true;
|
|
74
|
+
try {
|
|
75
|
+
return Boolean(await Promise.resolve(authorize(socket, room.id)));
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
async function handleSubscribe(socket, payload) {
|
|
82
|
+
const room = parseLiveRoom(serverObject(payload).room);
|
|
83
|
+
if (!room)
|
|
84
|
+
return;
|
|
85
|
+
const allowed = await isRoomAllowed(socket, room);
|
|
86
|
+
if (!allowed) {
|
|
87
|
+
socket.emit?.(normalized.deniedEvent, { room: room.room });
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
socket.join?.(room.room);
|
|
91
|
+
socket.emit?.(normalized.subscribedEvent, { room: room.room });
|
|
92
|
+
}
|
|
93
|
+
function handleUnsubscribe(socket, payload) {
|
|
94
|
+
const room = parseLiveRoom(serverObject(payload).room);
|
|
95
|
+
if (room)
|
|
96
|
+
socket.leave?.(room.room);
|
|
97
|
+
}
|
|
98
|
+
async function runSidebarSync(sync, context) {
|
|
99
|
+
const run = () => Promise.resolve(sync.resolve(context));
|
|
100
|
+
return sync.withContext ? sync.withContext(context, run) : run();
|
|
101
|
+
}
|
|
102
|
+
async function handleSidebarSync(socket, payload, done) {
|
|
103
|
+
const sync = options.sidebarSync;
|
|
104
|
+
if (!sync)
|
|
105
|
+
return;
|
|
106
|
+
const reply = typeof done === "function"
|
|
107
|
+
? done
|
|
108
|
+
: (response) => socket.emit?.(sync.responseEvent || DEFAULT_LIVE_SIDEBAR_SYNC_EVENT, response);
|
|
109
|
+
const context = {
|
|
110
|
+
items: (sync.readItems || readSidebarLiveItems)(payload),
|
|
111
|
+
payload,
|
|
112
|
+
req: liveSocketRequest(socket),
|
|
113
|
+
res: liveSocketResponse(socket),
|
|
114
|
+
socket,
|
|
115
|
+
};
|
|
116
|
+
try {
|
|
117
|
+
const result = await runSidebarSync(sync, context);
|
|
118
|
+
reply({ data: { sidebars: result }, ok: true });
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
reply({
|
|
122
|
+
data: { sidebars: [] },
|
|
123
|
+
error: error && error.message ? error.message : String(error),
|
|
124
|
+
ok: false,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
function bindConnection(socket) {
|
|
129
|
+
socket.on?.(normalized.subscribeEvent, (payload) => {
|
|
130
|
+
return handleSubscribe(socket, payload);
|
|
131
|
+
});
|
|
132
|
+
if (options.sidebarSync !== false && options.sidebarSync) {
|
|
133
|
+
socket.on?.(options.sidebarSync.event || DEFAULT_LIVE_SIDEBAR_SYNC_EVENT, (payload, done) => {
|
|
134
|
+
return handleSidebarSync(socket, payload, done);
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
socket.on?.(normalized.unsubscribeEvent, (payload) => {
|
|
138
|
+
handleUnsubscribe(socket, payload);
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
function attach(server) {
|
|
142
|
+
const namespace = resolveLiveSocketNamespace(server, normalized.namespace);
|
|
143
|
+
if (!namespace || typeof namespace.on !== "function")
|
|
144
|
+
return false;
|
|
145
|
+
activeNamespace = namespace;
|
|
146
|
+
for (const middleware of liveSocketMiddlewareList(options)) {
|
|
147
|
+
namespace.use?.(middleware);
|
|
148
|
+
}
|
|
149
|
+
namespace.on("connection", bindConnection);
|
|
150
|
+
options.logger?.info?.("live.socket", "live namespace attached", {
|
|
151
|
+
namespace: normalized.namespace,
|
|
152
|
+
});
|
|
153
|
+
return true;
|
|
154
|
+
}
|
|
155
|
+
function broadcast(room, event, data) {
|
|
156
|
+
const text = serverString(room).trim();
|
|
157
|
+
if (!text || !activeNamespace)
|
|
158
|
+
return false;
|
|
159
|
+
activeNamespace.to?.(text).emit?.(normalized.changeEvent, {
|
|
160
|
+
room: text,
|
|
161
|
+
event: serverString(event),
|
|
162
|
+
data: data == null ? null : data,
|
|
163
|
+
});
|
|
164
|
+
return true;
|
|
165
|
+
}
|
|
166
|
+
function registerRoomAuthorizer(kind, authorize) {
|
|
167
|
+
const safeKind = serverString(kind).trim();
|
|
168
|
+
if (!safeKind || typeof authorize !== "function")
|
|
169
|
+
return false;
|
|
170
|
+
authorizers.set(safeKind, authorize);
|
|
171
|
+
return true;
|
|
172
|
+
}
|
|
173
|
+
return {
|
|
174
|
+
attach,
|
|
175
|
+
broadcast,
|
|
176
|
+
namespace: () => activeNamespace,
|
|
177
|
+
registerRoomAuthorizer,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
function attachLiveSocketServer(server, options = {}) {
|
|
181
|
+
const liveServer = createLiveSocketServer(options);
|
|
182
|
+
liveServer.attach(server);
|
|
183
|
+
return liveServer;
|
|
184
|
+
}
|
|
185
|
+
export { attachLiveSocketServer, createLiveSocketServer, DEFAULT_LIVE_CHANGE_EVENT, DEFAULT_LIVE_DENIED_EVENT, DEFAULT_LIVE_NAMESPACE, DEFAULT_LIVE_SIDEBAR_SYNC_EVENT, DEFAULT_LIVE_SUBSCRIBED_EVENT, DEFAULT_LIVE_SUBSCRIBE_EVENT, DEFAULT_LIVE_UNSUBSCRIBE_EVENT, liveRoomFor, liveSocketRequest, liveSocketResponse, parseLiveRoom, };
|
|
186
|
+
//# sourceMappingURL=live-socket.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-socket.js","sourceRoot":"","sources":["../../../src/server/live-socket.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type ServerRequestLike } from "../http.d.ts";
|
|
2
|
+
type CorsOptions = {
|
|
3
|
+
allowedHeaders?: readonly string[];
|
|
4
|
+
credentials?: boolean;
|
|
5
|
+
exposedHeaders?: readonly string[];
|
|
6
|
+
isAllowedOrigin?: (req: ServerRequestLike, origin: string) => boolean | Promise<boolean>;
|
|
7
|
+
methods?: readonly string[];
|
|
8
|
+
optionsSuccessStatus?: number;
|
|
9
|
+
};
|
|
10
|
+
type CorsDelegateCallback = (error: Error | null, options: Record<string, unknown>) => void;
|
|
11
|
+
declare function defaultCorsOptions(options?: CorsOptions): {
|
|
12
|
+
origin: boolean;
|
|
13
|
+
credentials: boolean;
|
|
14
|
+
exposedHeaders: readonly string[];
|
|
15
|
+
allowedHeaders: readonly string[];
|
|
16
|
+
methods: readonly string[];
|
|
17
|
+
optionsSuccessStatus: number;
|
|
18
|
+
};
|
|
19
|
+
declare function createCorsOptionsDelegate(options?: CorsOptions): (req: ServerRequestLike, callback: CorsDelegateCallback) => void;
|
|
20
|
+
export { createCorsOptionsDelegate, defaultCorsOptions };
|
|
21
|
+
export type { CorsDelegateCallback, CorsOptions };
|
|
22
|
+
//# sourceMappingURL=cors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cors.d.ts","sourceRoot":"","sources":["../../../../src/server/security/cors.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,eAAe,CAAC;AAEvB,KAAK,WAAW,GAAG;IACjB,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,eAAe,CAAC,EAAE,CAChB,GAAG,EAAE,iBAAiB,EACtB,MAAM,EAAE,MAAM,KACX,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B,CAAC;AAEF,KAAK,oBAAoB,GAAG,CAC1B,KAAK,EAAE,KAAK,GAAG,IAAI,EACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC7B,IAAI,CAAC;AAEV,iBAAS,kBAAkB,CAAC,OAAO,GAAE,WAAgB;;;;;;;EAsBpD;AAED,iBAAS,yBAAyB,CAAC,OAAO,GAAE,WAAgB,IAExD,KAAK,iBAAiB,EACtB,UAAU,oBAAoB,UAiBjC;AAED,OAAO,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,CAAC;AACzD,YAAY,EAAE,oBAAoB,EAAE,WAAW,EAAE,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { requestHeader, } from "../http.js";
|
|
2
|
+
function defaultCorsOptions(options = {}) {
|
|
3
|
+
return {
|
|
4
|
+
origin: true,
|
|
5
|
+
credentials: options.credentials !== false,
|
|
6
|
+
exposedHeaders: options.exposedHeaders || ["X-CSRF-Token"],
|
|
7
|
+
allowedHeaders: options.allowedHeaders || [
|
|
8
|
+
"Content-Type",
|
|
9
|
+
"Authorization",
|
|
10
|
+
"X-Requested-With",
|
|
11
|
+
"X-CSRF-Token",
|
|
12
|
+
],
|
|
13
|
+
methods: options.methods || [
|
|
14
|
+
"GET",
|
|
15
|
+
"HEAD",
|
|
16
|
+
"OPTIONS",
|
|
17
|
+
"POST",
|
|
18
|
+
"PUT",
|
|
19
|
+
"PATCH",
|
|
20
|
+
"DELETE",
|
|
21
|
+
],
|
|
22
|
+
optionsSuccessStatus: options.optionsSuccessStatus || 200,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function createCorsOptionsDelegate(options = {}) {
|
|
26
|
+
return function corsOptionsDelegate(req, callback) {
|
|
27
|
+
Promise.resolve()
|
|
28
|
+
.then(async () => {
|
|
29
|
+
const origin = requestHeader(req, "origin");
|
|
30
|
+
if (!origin || !options.isAllowedOrigin) {
|
|
31
|
+
callback(null, defaultCorsOptions(options));
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const allowed = await options.isAllowedOrigin(req, origin);
|
|
35
|
+
callback(allowed ? null : new Error("Not allowed by CORS"), allowed ? defaultCorsOptions(options) : { origin: false });
|
|
36
|
+
})
|
|
37
|
+
.catch((error) => callback(error, { origin: false }));
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
export { createCorsOptionsDelegate, defaultCorsOptions };
|
|
41
|
+
//# sourceMappingURL=cors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cors.js","sourceRoot":"","sources":["../../../../src/server/security/cors.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,GAEd,MAAM,eAAe,CAAC;AAmBvB,SAAS,kBAAkB,CAAC,UAAuB,EAAE;IACnD,OAAO;QACL,MAAM,EAAE,IAAI;QACZ,WAAW,EAAE,OAAO,CAAC,WAAW,KAAK,KAAK;QAC1C,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,CAAC,cAAc,CAAC;QAC1D,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI;YACxC,cAAc;YACd,eAAe;YACf,kBAAkB;YAClB,cAAc;SACf;QACD,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI;YAC1B,KAAK;YACL,MAAM;YACN,SAAS;YACT,MAAM;YACN,KAAK;YACL,OAAO;YACP,QAAQ;SACT;QACD,oBAAoB,EAAE,OAAO,CAAC,oBAAoB,IAAI,GAAG;KAC1D,CAAC;AACJ,CAAC;AAED,SAAS,yBAAyB,CAAC,UAAuB,EAAE;IAC1D,OAAO,SAAS,mBAAmB,CACjC,GAAsB,EACtB,QAA8B;QAE9B,OAAO,CAAC,OAAO,EAAE;aAChB,IAAI,CAAC,KAAK,IAAI,EAAE;YACb,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YAC5C,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;gBACxC,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC5C,OAAO;YACT,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAC3D,QAAQ,CACN,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,qBAAqB,CAAC,EACjD,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAC1D,CAAC;QACN,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ServerResponseLike } from "../http.d.ts";
|
|
2
|
+
declare function securityText(value: unknown): string;
|
|
3
|
+
declare function responseLocals(res: ServerResponseLike | null | undefined): Record<string, unknown>;
|
|
4
|
+
declare function attachUseMiddleware(app: unknown, middleware: unknown): void;
|
|
5
|
+
export { attachUseMiddleware, responseLocals, securityText };
|
|
6
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../../src/server/security/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAExD,iBAAS,YAAY,CAAC,KAAK,EAAE,OAAO,UAEnC;AAED,iBAAS,cAAc,CAAC,GAAG,EAAE,kBAAkB,GAAG,IAAI,GAAG,SAAS,2BAIjE;AAED,iBAAS,mBAAmB,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,QAI7D;AAED,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
function securityText(value) {
|
|
2
|
+
return value == null ? null : String(value);
|
|
3
|
+
}
|
|
4
|
+
function responseLocals(res) {
|
|
5
|
+
if (!res)
|
|
6
|
+
return null;
|
|
7
|
+
if (!res.locals || typeof res.locals !== "object")
|
|
8
|
+
res.locals = {};
|
|
9
|
+
return res.locals;
|
|
10
|
+
}
|
|
11
|
+
function attachUseMiddleware(app, middleware) {
|
|
12
|
+
if (app && typeof app.use === "function") {
|
|
13
|
+
app.use(middleware);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export { attachUseMiddleware, responseLocals, securityText };
|
|
17
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../../src/server/security/helpers.ts"],"names":[],"mappings":"AAEA,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,cAAc,CAAC,GAA0C;IAChE,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ;QAAE,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC;IACnE,OAAO,GAAG,CAAC,MAAM,CAAC;AACpB,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAY,EAAE,UAAmB;IAC5D,IAAI,GAAG,IAAI,OAAQ,GAAyB,CAAC,GAAG,KAAK,UAAU,EAAE,CAAC;QAC/D,GAA8C,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAClE,CAAC;AACH,CAAC;AAED,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC"}
|