@trebired/frontend 6.12.1 → 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.
Files changed (48) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/server/index.d.ts +3 -0
  3. package/dist/server/index.d.ts.map +1 -1
  4. package/dist/server/index.js +3 -0
  5. package/dist/server/index.js.map +1 -1
  6. package/dist/server/live-socket.d.ts +77 -0
  7. package/dist/server/live-socket.d.ts.map +1 -0
  8. package/dist/server/live-socket.js +186 -0
  9. package/dist/server/live-socket.js.map +1 -0
  10. package/dist/server/security/cors.d.ts +22 -0
  11. package/dist/server/security/cors.d.ts.map +1 -0
  12. package/dist/server/security/cors.js +41 -0
  13. package/dist/server/security/cors.js.map +1 -0
  14. package/dist/server/security/helpers.d.ts +6 -0
  15. package/dist/server/security/helpers.d.ts.map +1 -0
  16. package/dist/server/security/helpers.js +17 -0
  17. package/dist/server/security/helpers.js.map +1 -0
  18. package/dist/server/security/policy.d.ts +42 -0
  19. package/dist/server/security/policy.d.ts.map +1 -0
  20. package/dist/server/security/policy.js +159 -0
  21. package/dist/server/security/policy.js.map +1 -0
  22. package/dist/server/security.d.ts.map +1 -1
  23. package/dist/server/security.js +2 -13
  24. package/dist/server/security.js.map +1 -1
  25. package/dist/src/server/index.d.ts +3 -0
  26. package/dist/src/server/index.d.ts.map +1 -1
  27. package/dist/src/server/index.js +3 -0
  28. package/dist/src/server/index.js.map +1 -1
  29. package/dist/src/server/live-socket.d.ts +77 -0
  30. package/dist/src/server/live-socket.d.ts.map +1 -0
  31. package/dist/src/server/live-socket.js +186 -0
  32. package/dist/src/server/live-socket.js.map +1 -0
  33. package/dist/src/server/security/cors.d.ts +22 -0
  34. package/dist/src/server/security/cors.d.ts.map +1 -0
  35. package/dist/src/server/security/cors.js +41 -0
  36. package/dist/src/server/security/cors.js.map +1 -0
  37. package/dist/src/server/security/helpers.d.ts +6 -0
  38. package/dist/src/server/security/helpers.d.ts.map +1 -0
  39. package/dist/src/server/security/helpers.js +17 -0
  40. package/dist/src/server/security/helpers.js.map +1 -0
  41. package/dist/src/server/security/policy.d.ts +42 -0
  42. package/dist/src/server/security/policy.d.ts.map +1 -0
  43. package/dist/src/server/security/policy.js +159 -0
  44. package/dist/src/server/security/policy.js.map +1 -0
  45. package/dist/src/server/security.d.ts.map +1 -1
  46. package/dist/src/server/security.js +2 -13
  47. package/dist/src/server/security.js.map +1 -1
  48. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -2,6 +2,12 @@
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
+
5
11
  ## 6.12.1
6
12
 
7
13
  - Added server fallback helpers for HTML document detection, current render-mode path selection, and document-vs-JSON fallback dispatch.
@@ -10,12 +10,15 @@ export * from "./assets.js";
10
10
  export * from "./language.js";
11
11
  export * from "./locale.js";
12
12
  export * from "./live.js";
13
+ export * from "./live-socket.js";
13
14
  export * from "./navigation.js";
14
15
  export * from "./page-task.js";
15
16
  export * from "./react/render.d.ts";
16
17
  export * from "./render/mode.js";
17
18
  export * from "./render/mode-toolkit.js";
18
19
  export * from "./security.js";
20
+ export * from "./security/cors.js";
21
+ export * from "./security/policy.js";
19
22
  export * from "./seo.js";
20
23
  export * from "./seo/robots.js";
21
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,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,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"}
@@ -10,12 +10,15 @@ export * from "./assets.js";
10
10
  export * from "./language.js";
11
11
  export * from "./locale.js";
12
12
  export * from "./live.js";
13
+ export * from "./live-socket.js";
13
14
  export * from "./navigation.js";
14
15
  export * from "./page-task.js";
15
16
  export * from "./react/render.js";
16
17
  export * from "./render/mode.js";
17
18
  export * from "./render/mode-toolkit.js";
18
19
  export * from "./security.js";
20
+ export * from "./security/cors.js";
21
+ export * from "./security/policy.js";
19
22
  export * from "./seo.js";
20
23
  export * from "./seo/robots.js";
21
24
  export * from "./seo/routes.js";
@@ -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,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,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"}
@@ -0,0 +1,42 @@
1
+ import { type ServerRequestLike, type ServerResponseLike } from "../http.d.ts";
2
+ type NonceMiddlewareOptions = {
3
+ bytes?: number;
4
+ localsKey?: string;
5
+ };
6
+ type SecurityHeadersOptions = {
7
+ acceptClientHints?: readonly string[];
8
+ crossOriginOpenerPolicy?: string | false;
9
+ crossOriginResourcePolicy?: string | false;
10
+ dnsPrefetchControl?: string | false;
11
+ frameOptions?: string | false;
12
+ hsts?: false | string | {
13
+ header?: string;
14
+ shouldSend?: (req: ServerRequestLike) => boolean;
15
+ };
16
+ originAgentCluster?: string | false;
17
+ permittedCrossDomainPolicies?: string | false;
18
+ permissionsPolicy?: false | readonly string[] | string;
19
+ referrerPolicy?: string | false;
20
+ };
21
+ type ContentSecurityPolicyOptions = {
22
+ directives?: readonly string[] | ((context: ContentSecurityPolicyContext) => readonly string[]);
23
+ nonceLocalKey?: string;
24
+ shouldUpgradeInsecureRequests?: (req: ServerRequestLike) => boolean;
25
+ };
26
+ type ContentSecurityPolicyContext = {
27
+ nonce: string;
28
+ req: ServerRequestLike;
29
+ };
30
+ declare function createNonceMiddleware(options?: NonceMiddlewareOptions): (_req: unknown, res: ServerResponseLike, next: () => unknown) => unknown;
31
+ declare function attachNonceMiddleware(app: unknown, options?: NonceMiddlewareOptions): void;
32
+ declare function applySecurityHeaders(req: ServerRequestLike, res: ServerResponseLike, options?: SecurityHeadersOptions): void;
33
+ declare function createSecurityHeadersMiddleware(options?: SecurityHeadersOptions): (req: ServerRequestLike, res: ServerResponseLike, next: () => unknown) => unknown;
34
+ declare function attachSecurityHeadersMiddleware(app: unknown, options?: SecurityHeadersOptions): void;
35
+ declare function defaultContentSecurityPolicyDirectives(context: ContentSecurityPolicyContext): string[];
36
+ declare function contentSecurityPolicyHeader(context: ContentSecurityPolicyContext, options?: ContentSecurityPolicyOptions): string;
37
+ declare function applyContentSecurityPolicy(req: ServerRequestLike, res: ServerResponseLike, options?: ContentSecurityPolicyOptions): void;
38
+ declare function createContentSecurityPolicyMiddleware(options?: ContentSecurityPolicyOptions): (req: ServerRequestLike, res: ServerResponseLike, next: (error?: unknown) => unknown) => unknown;
39
+ declare function attachContentSecurityPolicyMiddleware(app: unknown, options?: ContentSecurityPolicyOptions): void;
40
+ export { applyContentSecurityPolicy, applySecurityHeaders, attachContentSecurityPolicyMiddleware, attachNonceMiddleware, attachSecurityHeadersMiddleware, contentSecurityPolicyHeader, createContentSecurityPolicyMiddleware, createNonceMiddleware, createSecurityHeadersMiddleware, defaultContentSecurityPolicyDirectives, };
41
+ export type { ContentSecurityPolicyContext, ContentSecurityPolicyOptions, NonceMiddlewareOptions, SecurityHeadersOptions, };
42
+ //# sourceMappingURL=policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../../../src/server/security/policy.ts"],"names":[],"mappings":"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"}