@nexus_js/server 0.7.1 → 0.7.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/actions.d.ts +2 -0
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +138 -2
- package/dist/actions.js.map +1 -1
- package/dist/constants.d.ts +6 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +6 -0
- package/dist/constants.js.map +1 -0
- package/dist/context.d.ts +13 -2
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +7 -3
- package/dist/context.js.map +1 -1
- package/dist/dev-assets.d.ts +1 -1
- package/dist/dev-assets.d.ts.map +1 -1
- package/dist/dev-assets.js +15 -3
- package/dist/dev-assets.js.map +1 -1
- package/dist/dev-error-html.d.ts +19 -0
- package/dist/dev-error-html.d.ts.map +1 -0
- package/dist/dev-error-html.js +101 -0
- package/dist/dev-error-html.js.map +1 -0
- package/dist/dev-hot.d.ts +8 -0
- package/dist/dev-hot.d.ts.map +1 -0
- package/dist/dev-hot.js +30 -0
- package/dist/dev-hot.js.map +1 -0
- package/dist/dev-vault.d.ts +7 -0
- package/dist/dev-vault.d.ts.map +1 -0
- package/dist/dev-vault.js +66 -0
- package/dist/dev-vault.js.map +1 -0
- package/dist/devradar.d.ts +96 -0
- package/dist/devradar.d.ts.map +1 -0
- package/dist/devradar.js +69 -0
- package/dist/devradar.js.map +1 -0
- package/dist/handler.d.ts +7 -0
- package/dist/handler.d.ts.map +1 -0
- package/dist/handler.js +7 -0
- package/dist/handler.js.map +1 -0
- package/dist/index.d.ts +21 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +142 -27
- package/dist/index.js.map +1 -1
- package/dist/inspector.d.ts +9 -0
- package/dist/inspector.d.ts.map +1 -0
- package/dist/inspector.js +8 -0
- package/dist/inspector.js.map +1 -0
- package/dist/load-module.d.ts +4 -3
- package/dist/load-module.d.ts.map +1 -1
- package/dist/load-module.js +64 -22
- package/dist/load-module.js.map +1 -1
- package/dist/logger.d.ts +0 -11
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +2 -1
- package/dist/logger.js.map +1 -1
- package/dist/navigate.d.ts.map +1 -1
- package/dist/navigate.js +73 -12
- package/dist/navigate.js.map +1 -1
- package/dist/renderer.d.ts +32 -1
- package/dist/renderer.d.ts.map +1 -1
- package/dist/renderer.js +259 -46
- package/dist/renderer.js.map +1 -1
- package/dist/shield-runtime.d.ts +7 -0
- package/dist/shield-runtime.d.ts.map +1 -0
- package/dist/shield-runtime.js +34 -0
- package/dist/shield-runtime.js.map +1 -0
- package/dist/streaming.d.ts +14 -3
- package/dist/streaming.d.ts.map +1 -1
- package/dist/streaming.js +26 -9
- package/dist/streaming.js.map +1 -1
- package/dist/streaming.test.d.ts +2 -0
- package/dist/streaming.test.d.ts.map +1 -0
- package/dist/streaming.test.js +63 -0
- package/dist/streaming.test.js.map +1 -0
- package/package.json +28 -7
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rich HTML error pages for `dev` mode (stack, Error.cause chain, non-Error serialization).
|
|
3
|
+
*/
|
|
4
|
+
const DOCTYPE = '<!DOCTYPE html>';
|
|
5
|
+
function escapeHtml(s) {
|
|
6
|
+
return s
|
|
7
|
+
.replace(/&/g, '&')
|
|
8
|
+
.replace(/</g, '<')
|
|
9
|
+
.replace(/>/g, '>')
|
|
10
|
+
.replace(/"/g, '"');
|
|
11
|
+
}
|
|
12
|
+
/** Message, stack, optional cause chain, and JSON for plain objects. */
|
|
13
|
+
export function collectErrorDetails(err) {
|
|
14
|
+
const causes = [];
|
|
15
|
+
let stack = '';
|
|
16
|
+
let message = '';
|
|
17
|
+
if (err instanceof Error) {
|
|
18
|
+
message = err.message;
|
|
19
|
+
stack = err.stack ?? '';
|
|
20
|
+
let cur = err.cause;
|
|
21
|
+
let depth = 0;
|
|
22
|
+
while (cur != null && depth < 10) {
|
|
23
|
+
if (cur instanceof Error) {
|
|
24
|
+
causes.push(`${cur.name}: ${cur.message}`);
|
|
25
|
+
cur = cur.cause;
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
causes.push(String(cur));
|
|
29
|
+
break;
|
|
30
|
+
}
|
|
31
|
+
depth++;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
else if (err !== null && typeof err === 'object') {
|
|
35
|
+
try {
|
|
36
|
+
message = JSON.stringify(err);
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
message = String(err);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
message = String(err);
|
|
44
|
+
}
|
|
45
|
+
let plain = '';
|
|
46
|
+
if (err !== null && typeof err === 'object' && !(err instanceof Error)) {
|
|
47
|
+
try {
|
|
48
|
+
plain = JSON.stringify(err, null, 2);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
plain = String(err);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return { message, stack, causes, plain };
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Full diagnostic page in dev; minimal safe page when `dev` is false.
|
|
58
|
+
*/
|
|
59
|
+
export function devErrorHtmlPage(opts) {
|
|
60
|
+
if (!opts.dev) {
|
|
61
|
+
const msg = opts.err instanceof Error ? opts.err.message : String(opts.err);
|
|
62
|
+
return (`${DOCTYPE}<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"></head>` +
|
|
63
|
+
`<body style="font-family:system-ui,sans-serif;padding:2rem;background:#fafafa;color:#111">` +
|
|
64
|
+
`<h1 style="font-size:1.25rem">Something went wrong</h1>` +
|
|
65
|
+
`<p>${escapeHtml(msg)}</p>` +
|
|
66
|
+
`</body></html>`);
|
|
67
|
+
}
|
|
68
|
+
const d = collectErrorDetails(opts.err);
|
|
69
|
+
const causeBlock = d.causes.length > 0
|
|
70
|
+
? `<section style="margin:0 0 1rem">
|
|
71
|
+
<h2 style="font-size:0.75rem;font-weight:600;color:#94a3b8;text-transform:uppercase;letter-spacing:0.06em;margin:0 0 0.5rem">Cause chain</h2>
|
|
72
|
+
<ol style="margin:0;padding-left:1.2rem;color:#cbd5e1;font-size:0.85rem">${d.causes.map((c) => `<li style="margin:0.25rem 0">${escapeHtml(c)}</li>`).join('')}</ol>
|
|
73
|
+
</section>`
|
|
74
|
+
: '';
|
|
75
|
+
const stackBlock = d.stack
|
|
76
|
+
? `<details open style="margin:0 0 1rem">
|
|
77
|
+
<summary style="cursor:pointer;color:#64748b;font-size:0.85rem;font-weight:600">Stack trace</summary>
|
|
78
|
+
<pre style="font-size:0.72rem;color:#94a3b8;overflow:auto;max-height:min(52vh,28rem);white-space:pre-wrap;line-height:1.4;margin:0.5rem 0 0;padding:0.75rem;background:#0d0d1a;border-radius:8px;border:1px solid #1e293b">${escapeHtml(d.stack)}</pre>
|
|
79
|
+
</details>`
|
|
80
|
+
: '';
|
|
81
|
+
const plainBlock = d.plain
|
|
82
|
+
? `<details style="margin:0 0 1rem">
|
|
83
|
+
<summary style="cursor:pointer;color:#64748b;font-size:0.85rem;font-weight:600">Serialized value</summary>
|
|
84
|
+
<pre style="font-size:0.72rem;color:#94a3b8;overflow:auto;max-height:min(28vh,16rem);white-space:pre-wrap;margin:0.5rem 0 0;padding:0.75rem;background:#0d0d1a;border-radius:8px;border:1px solid #1e293b">${escapeHtml(d.plain)}</pre>
|
|
85
|
+
</details>`
|
|
86
|
+
: '';
|
|
87
|
+
return `${DOCTYPE}<html lang="en"><head>
|
|
88
|
+
<meta charset="utf-8">
|
|
89
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
90
|
+
<title>Nexus — ${escapeHtml(opts.context)}</title>
|
|
91
|
+
</head>
|
|
92
|
+
<body style="font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,monospace;padding:1.25rem 1.5rem;max-width:56rem;margin:0 auto;background:#0a0a0f;color:#e8e8f0;line-height:1.45">
|
|
93
|
+
<h1 style="margin:0 0 0.5rem;font-size:1.05rem;font-weight:600;color:#f87171">◆ Nexus — ${escapeHtml(opts.context)}</h1>
|
|
94
|
+
<p style="color:#fca5a5;font-size:0.92rem;margin:0 0 1rem;white-space:pre-wrap;border-left:3px solid #f43f5e;padding-left:0.75rem">${escapeHtml(d.message)}</p>
|
|
95
|
+
${causeBlock}
|
|
96
|
+
${stackBlock}
|
|
97
|
+
${plainBlock}
|
|
98
|
+
<p style="margin-top:1rem;font-size:0.72rem;color:#475569">Development mode: full diagnostics. Production responses omit stack traces.</p>
|
|
99
|
+
</body></html>`;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=dev-error-html.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-error-html.js","sourceRoot":"","sources":["../src/dev-error-html.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dev hot-reload — Server-Sent Events so the browser refreshes after `server.reload()`.
|
|
3
|
+
*/
|
|
4
|
+
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
5
|
+
export declare function subscribeDevHotClient(req: IncomingMessage, res: ServerResponse): void;
|
|
6
|
+
/** Notify every open tab to reload (after route manifest / caches refresh). */
|
|
7
|
+
export declare function broadcastDevHotReload(): void;
|
|
8
|
+
//# sourceMappingURL=dev-hot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-hot.d.ts","sourceRoot":"","sources":["../src/dev-hot.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAIjE,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,GAAG,IAAI,CAerF;AAED,+EAA+E;AAC/E,wBAAgB,qBAAqB,IAAI,IAAI,CAS5C"}
|
package/dist/dev-hot.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
const clients = new Set();
|
|
2
|
+
export function subscribeDevHotClient(req, res) {
|
|
3
|
+
req.socket.setTimeout(0);
|
|
4
|
+
res.writeHead(200, {
|
|
5
|
+
'content-type': 'text/event-stream; charset=utf-8',
|
|
6
|
+
'cache-control': 'no-cache, no-transform',
|
|
7
|
+
connection: 'keep-alive',
|
|
8
|
+
'x-accel-buffering': 'no',
|
|
9
|
+
});
|
|
10
|
+
res.write(': nexus dev hot\n\n');
|
|
11
|
+
clients.add(res);
|
|
12
|
+
const done = () => {
|
|
13
|
+
clients.delete(res);
|
|
14
|
+
};
|
|
15
|
+
res.on('close', done);
|
|
16
|
+
req.on('close', done);
|
|
17
|
+
}
|
|
18
|
+
/** Notify every open tab to reload (after route manifest / caches refresh). */
|
|
19
|
+
export function broadcastDevHotReload() {
|
|
20
|
+
const chunk = 'event: reload\ndata: {}\n\n';
|
|
21
|
+
for (const res of [...clients]) {
|
|
22
|
+
try {
|
|
23
|
+
res.write(chunk);
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
clients.delete(res);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=dev-hot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-hot.js","sourceRoot":"","sources":["../src/dev-hot.ts"],"names":[],"mappings":"AAKA,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;AAE1C,MAAM,UAAU,qBAAqB,CAAC,GAAoB,EAAE,GAAmB;IAC7E,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACzB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;QACjB,cAAc,EAAS,kCAAkC;QACzD,eAAe,EAAQ,wBAAwB;QAC/C,UAAU,EAAa,YAAY;QACnC,mBAAmB,EAAI,IAAI;KAC5B,CAAC,CAAC;IACH,GAAG,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjB,MAAM,IAAI,GAAG,GAAG,EAAE;QAChB,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACtB,CAAC,CAAC;IACF,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACtB,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AACxB,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,qBAAqB;IACnC,MAAM,KAAK,GAAG,6BAA6B,CAAC;IAC5C,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dev-only HTTP API to patch Vault-lite without restarting the server.
|
|
3
|
+
* POST /_nexus/dev/vault — body: `{ patch: Record<string,string>, replace?: boolean }`
|
|
4
|
+
* Optional auth: `NEXUS_DEV_VAULT_TOKEN` → require `Authorization: Bearer …` or `x-nexus-dev-vault-token`.
|
|
5
|
+
*/
|
|
6
|
+
export declare function handleDevVaultPost(request: Request): Promise<Response>;
|
|
7
|
+
//# sourceMappingURL=dev-vault.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-vault.d.ts","sourceRoot":"","sources":["../src/dev-vault.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAgE5E"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dev-only HTTP API to patch Vault-lite without restarting the server.
|
|
3
|
+
* POST /_nexus/dev/vault — body: `{ patch: Record<string,string>, replace?: boolean }`
|
|
4
|
+
* Optional auth: `NEXUS_DEV_VAULT_TOKEN` → require `Authorization: Bearer …` or `x-nexus-dev-vault-token`.
|
|
5
|
+
*/
|
|
6
|
+
import { nexusVault } from '@nexus_js/security';
|
|
7
|
+
import { emitDevRadar } from './devradar.js';
|
|
8
|
+
export async function handleDevVaultPost(request) {
|
|
9
|
+
const token = process.env['NEXUS_DEV_VAULT_TOKEN'];
|
|
10
|
+
if (token !== undefined && token !== '') {
|
|
11
|
+
const auth = request.headers.get('authorization');
|
|
12
|
+
const hdr = request.headers.get('x-nexus-dev-vault-token');
|
|
13
|
+
const ok = auth === `Bearer ${token}` || hdr === token;
|
|
14
|
+
if (!ok) {
|
|
15
|
+
return new Response(JSON.stringify({ error: 'Unauthorized', status: 401 }), {
|
|
16
|
+
status: 401,
|
|
17
|
+
headers: { 'content-type': 'application/json' },
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
let body;
|
|
22
|
+
try {
|
|
23
|
+
body = await request.json();
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return new Response(JSON.stringify({ error: 'Invalid JSON', status: 400 }), {
|
|
27
|
+
status: 400,
|
|
28
|
+
headers: { 'content-type': 'application/json' },
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
if (typeof body !== 'object' || body === null || !('patch' in body)) {
|
|
32
|
+
return new Response(JSON.stringify({ error: 'Expected { patch: Record<string,string>, replace?: boolean }', status: 400 }), { status: 400, headers: { 'content-type': 'application/json' } });
|
|
33
|
+
}
|
|
34
|
+
const rawPatch = body.patch;
|
|
35
|
+
if (typeof rawPatch !== 'object' || rawPatch === null) {
|
|
36
|
+
return new Response(JSON.stringify({ error: 'patch must be an object', status: 400 }), {
|
|
37
|
+
status: 400,
|
|
38
|
+
headers: { 'content-type': 'application/json' },
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
const replace = body.replace === true;
|
|
42
|
+
const entries = {};
|
|
43
|
+
for (const [k, v] of Object.entries(rawPatch)) {
|
|
44
|
+
if (typeof v === 'string')
|
|
45
|
+
entries[k] = v;
|
|
46
|
+
else if (v === null || v === undefined)
|
|
47
|
+
entries[k] = '';
|
|
48
|
+
else
|
|
49
|
+
entries[k] = String(v);
|
|
50
|
+
}
|
|
51
|
+
if (replace)
|
|
52
|
+
nexusVault.replaceAll(entries);
|
|
53
|
+
else
|
|
54
|
+
nexusVault.patch(entries);
|
|
55
|
+
emitDevRadar({
|
|
56
|
+
type: 'security:audit',
|
|
57
|
+
payload: {
|
|
58
|
+
kind: 'vault_updated',
|
|
59
|
+
message: replace
|
|
60
|
+
? `Vault replaced (${Object.keys(entries).length} keys)`
|
|
61
|
+
: `Vault patched (${Object.keys(entries).length} keys)`,
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
return new Response(JSON.stringify({ ok: true, keys: Object.keys(entries).length, replace }), { status: 200, headers: { 'content-type': 'application/json' } });
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=dev-vault.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-vault.js","sourceRoot":"","sources":["../src/dev-vault.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nexus DevRadar — introspection sink for the Studio WebSocket (dev only).
|
|
3
|
+
*
|
|
4
|
+
* The CLI registers a sink (`registerDevRadarSink`) that forwards to `broadcast()`.
|
|
5
|
+
* When no sink is registered, all emits are no-ops (production / `nexus start`).
|
|
6
|
+
*/
|
|
7
|
+
/** v1 wire protocol — keep in sync with `packages/cli/src/studio.ts` `StudioEvent` (incl. security:report). */
|
|
8
|
+
export type DevRadarEvent = {
|
|
9
|
+
type: 'action:call';
|
|
10
|
+
payload: ActionCallPayload;
|
|
11
|
+
} | {
|
|
12
|
+
type: 'action:result';
|
|
13
|
+
payload: ActionResultPayload;
|
|
14
|
+
} | {
|
|
15
|
+
type: 'action:redirect';
|
|
16
|
+
payload: ActionRedirectPayload;
|
|
17
|
+
} | {
|
|
18
|
+
type: 'action:error';
|
|
19
|
+
payload: ActionErrorPayload;
|
|
20
|
+
} | {
|
|
21
|
+
type: 'devtools:pretext';
|
|
22
|
+
payload: PretextProfilePayload;
|
|
23
|
+
} | {
|
|
24
|
+
type: 'security:audit';
|
|
25
|
+
payload: SecurityAuditPayload;
|
|
26
|
+
} | {
|
|
27
|
+
type: 'security:report';
|
|
28
|
+
payload: SecurityReportPayload;
|
|
29
|
+
} | {
|
|
30
|
+
type: 'rune:telemetry';
|
|
31
|
+
payload: RuneTelemetryPayload;
|
|
32
|
+
};
|
|
33
|
+
export interface ActionCallPayload {
|
|
34
|
+
id: string;
|
|
35
|
+
name: string;
|
|
36
|
+
islandId?: string;
|
|
37
|
+
input: unknown;
|
|
38
|
+
timestamp: number;
|
|
39
|
+
idempotencyKey?: string;
|
|
40
|
+
}
|
|
41
|
+
export interface ActionResultPayload {
|
|
42
|
+
id: string;
|
|
43
|
+
name: string;
|
|
44
|
+
output: unknown;
|
|
45
|
+
duration: number;
|
|
46
|
+
cached: boolean;
|
|
47
|
+
}
|
|
48
|
+
export interface ActionRedirectPayload {
|
|
49
|
+
id: string;
|
|
50
|
+
name: string;
|
|
51
|
+
location: string;
|
|
52
|
+
status: number;
|
|
53
|
+
duration: number;
|
|
54
|
+
}
|
|
55
|
+
export interface ActionErrorPayload {
|
|
56
|
+
id: string;
|
|
57
|
+
name: string;
|
|
58
|
+
error: string;
|
|
59
|
+
code?: string;
|
|
60
|
+
duration: number;
|
|
61
|
+
}
|
|
62
|
+
export interface PretextProfilePayload {
|
|
63
|
+
/** Route pattern, e.g. `/news/[slug]` */
|
|
64
|
+
pattern: string;
|
|
65
|
+
durationMs: number;
|
|
66
|
+
/** Layout + page modules that ran nxPretext in parallel */
|
|
67
|
+
parallelCount: number;
|
|
68
|
+
}
|
|
69
|
+
export interface SecurityAuditPayload {
|
|
70
|
+
kind: 'csrf_blocked' | 'rate_limited' | 'replay' | 'ghost_wall' | 'shield_action' | 'vault_updated' | 'custom';
|
|
71
|
+
message: string;
|
|
72
|
+
action?: string;
|
|
73
|
+
}
|
|
74
|
+
/** Studio "Security Report" checklist (snapshot when `nexus dev` connects DevRadar). */
|
|
75
|
+
export interface SecurityReportCheck {
|
|
76
|
+
id: string;
|
|
77
|
+
label: string;
|
|
78
|
+
status: 'pass' | 'warn' | 'info';
|
|
79
|
+
}
|
|
80
|
+
export interface SecurityReportPayload {
|
|
81
|
+
hardened: boolean;
|
|
82
|
+
checks: SecurityReportCheck[];
|
|
83
|
+
}
|
|
84
|
+
/** Placeholder for client-originated rune stats (future: bridge from runtime). */
|
|
85
|
+
export interface RuneTelemetryPayload {
|
|
86
|
+
runeId: string;
|
|
87
|
+
updatesPerSecond: number;
|
|
88
|
+
label?: string;
|
|
89
|
+
}
|
|
90
|
+
/** Register the Studio broadcast function (called once from `nexus dev`). */
|
|
91
|
+
export declare function registerDevRadarSink(fn: (event: DevRadarEvent) => void): () => void;
|
|
92
|
+
export declare function emitDevRadar(event: DevRadarEvent): void;
|
|
93
|
+
/** Deep-clone-ish sanitizer for telemetry (arguments / results). */
|
|
94
|
+
export declare function sanitizeTelemetryValue(value: unknown, depth?: number): unknown;
|
|
95
|
+
export declare function newTraceId(): string;
|
|
96
|
+
//# sourceMappingURL=devradar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"devradar.d.ts","sourceRoot":"","sources":["../src/devradar.ts"],"names":[],"mappings":"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"}
|
package/dist/devradar.js
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nexus DevRadar — introspection sink for the Studio WebSocket (dev only).
|
|
3
|
+
*
|
|
4
|
+
* The CLI registers a sink (`registerDevRadarSink`) that forwards to `broadcast()`.
|
|
5
|
+
* When no sink is registered, all emits are no-ops (production / `nexus start`).
|
|
6
|
+
*/
|
|
7
|
+
import { randomUUID } from 'node:crypto';
|
|
8
|
+
let sink = null;
|
|
9
|
+
/** Register the Studio broadcast function (called once from `nexus dev`). */
|
|
10
|
+
export function registerDevRadarSink(fn) {
|
|
11
|
+
sink = fn;
|
|
12
|
+
return () => {
|
|
13
|
+
sink = null;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export function emitDevRadar(event) {
|
|
17
|
+
if (!sink)
|
|
18
|
+
return;
|
|
19
|
+
try {
|
|
20
|
+
sink(event);
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
/* ignore dashboard errors */
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
const SECRET_KEY = /secret|password|token|authorization|cookie|apikey|api_key|bearer|private_key/i;
|
|
27
|
+
/** Deep-clone-ish sanitizer for telemetry (arguments / results). */
|
|
28
|
+
export function sanitizeTelemetryValue(value, depth = 0) {
|
|
29
|
+
if (depth > 8)
|
|
30
|
+
return '[max depth]';
|
|
31
|
+
if (value === null || value === undefined)
|
|
32
|
+
return value;
|
|
33
|
+
const t = typeof value;
|
|
34
|
+
if (t === 'string') {
|
|
35
|
+
const s = value;
|
|
36
|
+
return s.length > 512 ? `${s.slice(0, 512)}…` : s;
|
|
37
|
+
}
|
|
38
|
+
if (t === 'number' || t === 'boolean')
|
|
39
|
+
return value;
|
|
40
|
+
if (t === 'bigint')
|
|
41
|
+
return `${value}n`;
|
|
42
|
+
if (value instanceof Date)
|
|
43
|
+
return value.toISOString();
|
|
44
|
+
if (Array.isArray(value)) {
|
|
45
|
+
const cap = value.slice(0, 64);
|
|
46
|
+
return cap.map((v) => sanitizeTelemetryValue(v, depth + 1));
|
|
47
|
+
}
|
|
48
|
+
if (t === 'object') {
|
|
49
|
+
const o = value;
|
|
50
|
+
const out = {};
|
|
51
|
+
let n = 0;
|
|
52
|
+
for (const [k, v] of Object.entries(o)) {
|
|
53
|
+
if (n++ > 64) {
|
|
54
|
+
out['…'] = `${Object.keys(o).length - 64} more keys`;
|
|
55
|
+
break;
|
|
56
|
+
}
|
|
57
|
+
if (SECRET_KEY.test(k))
|
|
58
|
+
out[k] = '[redacted]';
|
|
59
|
+
else
|
|
60
|
+
out[k] = sanitizeTelemetryValue(v, depth + 1);
|
|
61
|
+
}
|
|
62
|
+
return out;
|
|
63
|
+
}
|
|
64
|
+
return String(value);
|
|
65
|
+
}
|
|
66
|
+
export function newTraceId() {
|
|
67
|
+
return randomUUID();
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=devradar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"devradar.js","sourceRoot":"","sources":["../src/devradar.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAsFzC,IAAI,IAAI,GAA4C,IAAI,CAAC;AAEzD,6EAA6E;AAC7E,MAAM,UAAU,oBAAoB,CAAC,EAAkC;IACrE,IAAI,GAAG,EAAE,CAAC;IACV,OAAO,GAAG,EAAE;QACV,IAAI,GAAG,IAAI,CAAC;IACd,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAoB;IAC/C,IAAI,CAAC,IAAI;QAAE,OAAO;IAClB,IAAI,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,6BAA6B;IAC/B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,GAAG,+EAA+E,CAAC;AAEnG,oEAAoE;AACpE,MAAM,UAAU,sBAAsB,CAAC,KAAc,EAAE,KAAK,GAAG,CAAC;IAC9D,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,aAAa,CAAC;IACpC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACxD,MAAM,CAAC,GAAG,OAAO,KAAK,CAAC;IACvB,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC;QACnB,MAAM,CAAC,GAAG,KAAe,CAAC;QAC1B,OAAO,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC;IACD,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACpD,IAAI,CAAC,KAAK,QAAQ;QAAE,OAAO,GAAG,KAAK,GAAG,CAAC;IACvC,IAAI,KAAK,YAAY,IAAI;QAAE,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;IACtD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/B,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,sBAAsB,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;IAC9D,CAAC;IACD,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC;QACnB,MAAM,CAAC,GAAG,KAAgC,CAAC;QAC3C,MAAM,GAAG,GAA4B,EAAE,CAAC;QACxC,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YACvC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC;gBACb,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,EAAE,YAAY,CAAC;gBACrD,MAAM;YACR,CAAC;YACD,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;gBAAE,GAAG,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC;;gBACzC,GAAG,CAAC,CAAC,CAAC,GAAG,sBAAsB,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,UAAU,EAAE,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../src/handler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,cAAc,gBAAgB,CAAC"}
|
package/dist/handler.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../src/handler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,cAAc,gBAAgB,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,10 +2,15 @@
|
|
|
2
2
|
* Nexus Server — Node.js HTTP server adapter.
|
|
3
3
|
* Handles SSR, static assets, Server Actions and dev HMR.
|
|
4
4
|
*/
|
|
5
|
-
export {
|
|
5
|
+
export { STUDIO_DEFAULT_PORT } from './constants.js';
|
|
6
|
+
export { createAction, registerAction, ActionError, getRegisteredActionNames } from './actions.js';
|
|
6
7
|
export { createContext } from './context.js';
|
|
8
|
+
export { nexusVault } from '@nexus_js/security';
|
|
7
9
|
export type { NexusContext, CookieOptions } from './context.js';
|
|
8
10
|
export type { RenderResult, RenderOptions } from './renderer.js';
|
|
11
|
+
export { mergeRoutePretext } from './renderer.js';
|
|
12
|
+
export { registerDevRadarSink, emitDevRadar, sanitizeTelemetryValue, newTraceId } from './devradar.js';
|
|
13
|
+
export type { DevRadarEvent, ActionCallPayload, ActionResultPayload, ActionErrorPayload, PretextProfilePayload, SecurityAuditPayload, SecurityReportPayload, SecurityReportCheck, RuneTelemetryPayload, } from './devradar.js';
|
|
9
14
|
export interface RequestLogInfo {
|
|
10
15
|
method: string;
|
|
11
16
|
path: string;
|
|
@@ -32,6 +37,21 @@ export interface NexusServerOptions {
|
|
|
32
37
|
* The server itself does NOT print request logs — the host controls formatting.
|
|
33
38
|
*/
|
|
34
39
|
onRequest?: (info: RequestLogInfo) => void;
|
|
40
|
+
/**
|
|
41
|
+
* From `nexus.config.ts` `security` — when `hardened: true`, HTML and API responses get baseline security headers.
|
|
42
|
+
* `shieldLite`: unknown server action names return 403 (manifest + registry allowlist) instead of 404.
|
|
43
|
+
*/
|
|
44
|
+
security?: {
|
|
45
|
+
hardened?: boolean;
|
|
46
|
+
shieldLite?: boolean;
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Flush the HTML shell (head + skeleton) before `nxPretext` resolves — improves TTFB when Pretext is slow.
|
|
50
|
+
* Fragment layouts only (route output must not be a full `<html>` document).
|
|
51
|
+
*/
|
|
52
|
+
streamingPretext?: boolean;
|
|
53
|
+
/** Merged into document import map for island `import()` resolution (from `nexus.config` `browser.importMap`). */
|
|
54
|
+
browserImportMap?: Record<string, string>;
|
|
35
55
|
}
|
|
36
56
|
export declare function createNexusServer(opts: NexusServerOptions): Promise<{
|
|
37
57
|
/** Starts listening. Resolves when the server is bound to the port. */
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAiCH,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AACnG,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAChE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,sBAAsB,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACvG,YAAY,EACV,aAAa,EACb,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,eAAe,CAAC;AAqBvB,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,uFAAuF;IACvF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,8BAA8B;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IAC3C;;;OAGG;IACH,QAAQ,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACxD;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,kHAAkH;IAClH,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC3C;AAyCD,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,kBAAkB;IA+O5D,uEAAuE;cAC7D,OAAO,CAAC,IAAI,CAAC;IAevB,gEAAgE;cAChD,OAAO,CAAC,IAAI,CAAC;aAWpB,IAAI;;GAMhB"}
|