craftar 0.35.0 → 0.37.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/README.md +25 -4
- package/dist/cli.js +31 -19
- package/dist/cli.js.map +1 -1
- package/dist/core/capabilities.js +2 -2
- package/dist/core/capabilities.js.map +1 -1
- package/dist/core/doctor.js +74 -1
- package/dist/core/doctor.js.map +1 -1
- package/dist/core/drift.js +10 -4
- package/dist/core/drift.js.map +1 -1
- package/dist/core/extract.js +2 -2
- package/dist/core/extract.js.map +1 -1
- package/dist/core/report.js +12 -0
- package/dist/core/report.js.map +1 -1
- package/dist/core/resolve.js +29 -0
- package/dist/core/resolve.js.map +1 -1
- package/dist/core/sync.js +154 -3
- package/dist/core/sync.js.map +1 -1
- package/dist/core/template-import.js +16 -3
- package/dist/core/template-import.js.map +1 -1
- package/dist/core/write-actions.js +21 -12
- package/dist/core/write-actions.js.map +1 -1
- package/dist/emitters/agents-md.js +26 -3
- package/dist/emitters/agents-md.js.map +1 -1
- package/dist/emitters/claude-code.js +175 -20
- package/dist/emitters/claude-code.js.map +1 -1
- package/dist/emitters/kiro.js +111 -26
- package/dist/emitters/kiro.js.map +1 -1
- package/dist/emitters/shared.js +135 -57
- package/dist/emitters/shared.js.map +1 -1
- package/dist/importers/claude-code.js +75 -7
- package/dist/importers/claude-code.js.map +1 -1
- package/dist/importers/decide.js +22 -4
- package/dist/importers/decide.js.map +1 -1
- package/dist/importers/drift-promote.js +9 -3
- package/dist/importers/drift-promote.js.map +1 -1
- package/dist/schema/index.js +11 -1
- package/dist/schema/index.js.map +1 -1
- package/dist/ui/page.js +115 -10
- package/dist/ui/page.js.map +1 -1
- package/dist/ui/routes.js +129 -8
- package/dist/ui/routes.js.map +1 -1
- package/dist/ui/server.js +121 -34
- package/dist/ui/server.js.map +1 -1
- package/package.json +1 -1
package/dist/ui/routes.js
CHANGED
|
@@ -3,12 +3,22 @@ import { renderDiff } from "../core/diff.js";
|
|
|
3
3
|
import { oneLine } from "../core/doctor.js";
|
|
4
4
|
import { isMissing, listWorkspaces, readRegistry } from "../core/registry.js";
|
|
5
5
|
import { credentialFault, CREDENTIAL_HIDDEN, refHoldsCredentials } from "../core/remote.js";
|
|
6
|
-
import { EXAMPLE_CONTENT_HIDDEN, diffReport, explainFile, statusReport } from "../core/report.js";
|
|
7
|
-
import {
|
|
6
|
+
import { EXAMPLE_CONTENT_HIDDEN, diffReport, explainFile, orphanDriftBody, statusReport } from "../core/report.js";
|
|
7
|
+
import { statusDigest, syncToolResult, syncWorkspace } from "../core/write-actions.js";
|
|
8
|
+
import { EXAMPLE_SETTINGS } from "../emitters/shared.js";
|
|
9
|
+
import { loadWorkspace, plan, readLock, status, unsetDeclared, unsetSummary } from "../core/sync.js";
|
|
8
10
|
import { hashNormalized } from "../core/text.js";
|
|
9
11
|
export const NOT_FOUND = { error: "not found" };
|
|
10
12
|
export const PATH_REQUIRED = { error: "path is required, once" };
|
|
11
13
|
export const MISSING = "the directory or its craftar.yaml is gone — craftar workspaces prune";
|
|
14
|
+
/** The two write route patterns (spec 40 §6.2). */
|
|
15
|
+
export const WRITE_PATTERNS = ["/api/workspaces/<id>/sync", "/api/workspaces/<id>/discard"];
|
|
16
|
+
/** 409 for a remote Forge (spec 40 §6.4 step 2). */
|
|
17
|
+
export const REMOTE_FORGE = "writes from the page need a path Forge — run craftar sync";
|
|
18
|
+
/** 409 when the digest does not match (spec 40 §6.4 step 4). */
|
|
19
|
+
export const STALE_DIGEST = "the workspace changed since the page showed it — refresh";
|
|
20
|
+
/** 409 when the path is not a drift or orphan-drift file, or is the example settings file (spec 40 §6.4 step 5). */
|
|
21
|
+
export const NOT_HAND_EDITED = "not a hand-edited file";
|
|
12
22
|
/** A workspace's id in a URL: 16 hex characters of the hash of its registered path — the path itself never travels. */
|
|
13
23
|
export const workspaceId = (registeredPath) => hashNormalized(registeredPath).slice("sha256:".length, "sha256:".length + 16);
|
|
14
24
|
/** Why a workspace cannot be shown, in one line — the wording `doctor` uses, so the table and a 409 agree. */
|
|
@@ -19,9 +29,40 @@ export function routeReason(e) {
|
|
|
19
29
|
export function routePattern(path) {
|
|
20
30
|
if (path === "/api/workspaces")
|
|
21
31
|
return path;
|
|
22
|
-
const m = /^\/api\/workspaces\/[0-9a-f]{16}(\/(diff|explain|recipes|ingredients))?$/.exec(path);
|
|
32
|
+
const m = /^\/api\/workspaces\/[0-9a-f]{16}(\/(diff|explain|recipes|ingredients|sync|discard))?$/.exec(path);
|
|
23
33
|
return m ? `/api/workspaces/<id>${m[1] ?? ""}` : null;
|
|
24
34
|
}
|
|
35
|
+
/**
|
|
36
|
+
* A write route's body, checked strictly: `digest` 64 lowercase hex; `path` a string, required for discard and
|
|
37
|
+
* refused for sync; no other key. Null when it does not read.
|
|
38
|
+
*/
|
|
39
|
+
export function parseWriteBody(action, text) {
|
|
40
|
+
let parsed;
|
|
41
|
+
try {
|
|
42
|
+
parsed = JSON.parse(text);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed))
|
|
48
|
+
return null;
|
|
49
|
+
const obj = parsed;
|
|
50
|
+
const allowed = action === "sync" ? ["digest"] : ["digest", "path"];
|
|
51
|
+
if (Object.keys(obj).some((k) => !allowed.includes(k)))
|
|
52
|
+
return null;
|
|
53
|
+
if (typeof obj.digest !== "string" || !/^[0-9a-f]{64}$/.test(obj.digest))
|
|
54
|
+
return null;
|
|
55
|
+
if (action === "sync") {
|
|
56
|
+
if ("path" in obj)
|
|
57
|
+
return null;
|
|
58
|
+
return { digest: obj.digest };
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
if (!("path" in obj) || typeof obj.path !== "string")
|
|
62
|
+
return null;
|
|
63
|
+
return { digest: obj.digest, path: obj.path };
|
|
64
|
+
}
|
|
65
|
+
}
|
|
25
66
|
/** The query's `path`, given exactly once and decoded once (`+` is not a space) — or null. */
|
|
26
67
|
function onePath(query) {
|
|
27
68
|
const given = query.split("&").filter((kv) => kv === "path" || kv.startsWith("path="));
|
|
@@ -52,12 +93,23 @@ export async function route(req, deps) {
|
|
|
52
93
|
const pattern = routePattern(req.path);
|
|
53
94
|
if (pattern === null)
|
|
54
95
|
return { status: 404, body: NOT_FOUND };
|
|
96
|
+
const method = req.method;
|
|
97
|
+
const isWritePattern = WRITE_PATTERNS.includes(pattern);
|
|
98
|
+
// A POST to a reading route, a GET to a write route, or any POST without allowWrites → 404 (the server refuses earlier with 405)
|
|
99
|
+
if (method === "POST" && !isWritePattern)
|
|
100
|
+
return { status: 404, body: NOT_FOUND };
|
|
101
|
+
if (method === "GET" && isWritePattern)
|
|
102
|
+
return { status: 404, body: NOT_FOUND };
|
|
103
|
+
if (method === "POST" && !deps.allowWrites)
|
|
104
|
+
return { status: 404, body: NOT_FOUND };
|
|
105
|
+
if (isWritePattern && !req.body)
|
|
106
|
+
return { status: 400, body: { error: "bad request" } };
|
|
55
107
|
if (pattern === "/api/workspaces") {
|
|
56
108
|
const t = await listWorkspaces(deps.home, { fetch: false, reason: routeReason });
|
|
57
109
|
const rows = t.rows.map(servedRow);
|
|
58
110
|
return {
|
|
59
111
|
status: 200,
|
|
60
|
-
body: { version: deps.version, registry: t.registry, fetch: false, workspaces: rows, warnings: t.warnings },
|
|
112
|
+
body: { version: deps.version, registry: t.registry, fetch: false, writes: deps.allowWrites === true, workspaces: rows, warnings: t.warnings },
|
|
61
113
|
};
|
|
62
114
|
}
|
|
63
115
|
const [, , , id, what] = req.path.split("/");
|
|
@@ -80,8 +132,14 @@ export async function route(req, deps) {
|
|
|
80
132
|
let p;
|
|
81
133
|
let lock;
|
|
82
134
|
let st;
|
|
135
|
+
let digest;
|
|
83
136
|
try {
|
|
84
|
-
|
|
137
|
+
// A write refuses a remote Forge as the configuration names it, before anything is fetched (spec 40 §6.4).
|
|
138
|
+
ws = await loadWorkspace(entry.path, {
|
|
139
|
+
mode: "no-fetch",
|
|
140
|
+
home: deps.home,
|
|
141
|
+
...(isWritePattern ? { refuseRemote: () => REMOTE_FORGE } : {}),
|
|
142
|
+
});
|
|
85
143
|
if (what === "recipes" || what === "ingredients") {
|
|
86
144
|
// The catalogue resolves and never plans; it does not read the lock either.
|
|
87
145
|
const context = catalogueContext(ws.forge, { kind: "workspace", config: ws.config });
|
|
@@ -91,16 +149,61 @@ export async function route(req, deps) {
|
|
|
91
149
|
p = await plan(ws);
|
|
92
150
|
lock = await readLock(ws.root);
|
|
93
151
|
st = await status(ws, p, lock);
|
|
152
|
+
// Read here so that a disk error is the workspace's state (409).
|
|
153
|
+
if (isWritePattern || (what === undefined && deps.allowWrites)) {
|
|
154
|
+
digest = await statusDigest(ws, st);
|
|
155
|
+
}
|
|
94
156
|
}
|
|
95
157
|
catch (e) {
|
|
158
|
+
// refuseRemote's own words, not doctor's.
|
|
159
|
+
if (e instanceof Error && e.message === REMOTE_FORGE) {
|
|
160
|
+
return { status: 409, body: { error: REMOTE_FORGE, warnings: [] } };
|
|
161
|
+
}
|
|
96
162
|
return { status: 409, body: { error: routeReason(e), warnings: ws?.warnings ?? [] } };
|
|
97
163
|
}
|
|
164
|
+
// Write routes: digest → (discard) path → unset → sync → answer (spec 40 §6.4).
|
|
165
|
+
if (isWritePattern) {
|
|
166
|
+
const body = req.body;
|
|
167
|
+
const action = what;
|
|
168
|
+
if (digest !== body.digest) {
|
|
169
|
+
return { status: 409, body: { error: STALE_DIGEST, warnings: [] } };
|
|
170
|
+
}
|
|
171
|
+
let row;
|
|
172
|
+
if (action === "discard") {
|
|
173
|
+
row = st.find((s) => s.path === body.path);
|
|
174
|
+
if (!row || (row.state !== "drift" && row.state !== "orphan-drift") || row.path === EXAMPLE_SETTINGS) {
|
|
175
|
+
return { status: 409, body: { error: NOT_HAND_EDITED, warnings: [] } };
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
const unset = unsetDeclared(p);
|
|
179
|
+
if (unset.length) {
|
|
180
|
+
return { status: 409, body: { error: unsetSummary(unset), warnings: [] } };
|
|
181
|
+
}
|
|
182
|
+
const outcome = await syncWorkspace(ws, p, st, lock, {
|
|
183
|
+
home: deps.home,
|
|
184
|
+
registryOff: false,
|
|
185
|
+
...(action === "discard" && row ? { overwritePaths: new Set([row.path]) } : {}),
|
|
186
|
+
});
|
|
187
|
+
return { status: 200, body: syncToolResult(ws, p, st, outcome, false, action === "discard" && row ? row.path : undefined) };
|
|
188
|
+
}
|
|
98
189
|
if (what === undefined) {
|
|
99
190
|
const report = statusReport(ws, p, lock, st);
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
191
|
+
const base = {
|
|
192
|
+
id,
|
|
193
|
+
path: entry.path,
|
|
194
|
+
profile: ws.config.profile,
|
|
195
|
+
recipes: p.resolution.recipes,
|
|
196
|
+
targets: p.resolution.targets,
|
|
197
|
+
...report,
|
|
198
|
+
refused: report.unsetParams.length ? unsetSummary(report.unsetParams) : null,
|
|
103
199
|
};
|
|
200
|
+
if (deps.allowWrites) {
|
|
201
|
+
return {
|
|
202
|
+
status: 200,
|
|
203
|
+
body: { ...base, digest },
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
return { status: 200, body: base };
|
|
104
207
|
}
|
|
105
208
|
if (what === "explain") {
|
|
106
209
|
// Never `notProduced`'s message: it quotes the path asked.
|
|
@@ -111,6 +214,24 @@ export async function route(req, deps) {
|
|
|
111
214
|
const row = st.find((s) => s.path === wanted);
|
|
112
215
|
if (!row)
|
|
113
216
|
return { status: 404, body: NOT_FOUND };
|
|
217
|
+
// For orphan-drift, under allowWrites, return the file's body as a diff (spec 40 §6.5)
|
|
218
|
+
if (row.state === "orphan-drift" && deps.allowWrites) {
|
|
219
|
+
const { body: fileBody, note } = await orphanDriftBody(ws.root, row);
|
|
220
|
+
const from = `${row.path} (disk, ${row.state})`;
|
|
221
|
+
const to = `${row.path} (forge: no longer produced — discard removes it)`;
|
|
222
|
+
return {
|
|
223
|
+
status: 200,
|
|
224
|
+
body: {
|
|
225
|
+
path: row.path,
|
|
226
|
+
state: row.state,
|
|
227
|
+
from,
|
|
228
|
+
to,
|
|
229
|
+
hidden: note !== null,
|
|
230
|
+
note,
|
|
231
|
+
diff: fileBody === null ? null : renderDiff(fileBody, ""),
|
|
232
|
+
},
|
|
233
|
+
};
|
|
234
|
+
}
|
|
114
235
|
const [d] = await diffReport(ws, [row], { withholdMcp: false });
|
|
115
236
|
if (!d)
|
|
116
237
|
return { status: 200, body: { path: row.path, state: row.state, from: null, to: null, hidden: false, note: null, diff: null } };
|
package/dist/ui/routes.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/ui/routes.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/ui/routes.ts"],"names":[],"mappings":"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"}
|
package/dist/ui/server.js
CHANGED
|
@@ -1,17 +1,20 @@
|
|
|
1
1
|
import { randomBytes, timingSafeEqual } from "node:crypto";
|
|
2
2
|
import http from "node:http";
|
|
3
3
|
import { errorText } from "../core/schema-fault.js";
|
|
4
|
-
import { PAGE_CSS, PAGE_HTML, PAGE_JS } from "./page.js";
|
|
5
|
-
import { route as defaultRoute, routePattern } from "./routes.js";
|
|
4
|
+
import { PAGE_CSS, PAGE_HTML, PAGE_JS, pageCss, pageJs } from "./page.js";
|
|
5
|
+
import { parseWriteBody, route as defaultRoute, routePattern, WRITE_PATTERNS } from "./routes.js";
|
|
6
6
|
/**
|
|
7
|
-
* The loopback server of `craftar ui` (spec 36 §4.5, §7) — the one file under `src/` that imports `node:http`.
|
|
7
|
+
* The loopback server of `craftar ui` (spec 36 §4.5, §7; spec 40 §6.3) — the one file under `src/` that imports `node:http`.
|
|
8
8
|
* It never prints and never exits: what the terminal must see goes through `opts.onError`.
|
|
9
9
|
*
|
|
10
|
-
* Every request passes the same checks, in this order, and the order is the contract (§7.2):
|
|
10
|
+
* Every request passes the same checks, in this order, and the order is the contract (spec 36 §7.2, spec 40 §6.3):
|
|
11
11
|
* method → length of the target → `Host` → `Origin` and `Sec-Fetch-Site` → the route (a static one answers
|
|
12
|
-
* here; an unknown path is 404
|
|
12
|
+
* here; an unknown path is 404; without `allowWrites` a write pattern is 404) → the run token → (for POST)
|
|
13
|
+
* `Content-Type` → the body → the queue of one → `route()`.
|
|
13
14
|
*/
|
|
14
15
|
export const MAX_TARGET_BYTES = 2048;
|
|
16
|
+
export const MAX_BODY_BYTES = 4096;
|
|
17
|
+
export const MAX_DRAIN_BYTES = 1024 * 1024;
|
|
15
18
|
export const CSP = "default-src 'none'; script-src 'self'; style-src 'self'; connect-src 'self'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'";
|
|
16
19
|
/** The names this server answers to. `localhost` is not one: it may resolve elsewhere, and a rebound name could read as it. */
|
|
17
20
|
const names = (port) => (port === 80 ? ["127.0.0.1", "127.0.0.1:80"] : [`127.0.0.1:${port}`]);
|
|
@@ -19,11 +22,14 @@ export const hostAllowed = (header, port) => header !== undefined && names(port)
|
|
|
19
22
|
/** Absent is allowed: a browser sends no `Origin` on a navigation or a same-origin GET. `null` is not. */
|
|
20
23
|
export const originAllowed = (header, port) => header === undefined || names(port).some((n) => header === `http://${n}`);
|
|
21
24
|
export const siteAllowed = (header) => header === undefined || header === "same-origin" || header === "none";
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
/** Builds the static routes: one HTML, one JS, one CSS. */
|
|
26
|
+
function staticRoutes(allowWrites) {
|
|
27
|
+
return {
|
|
28
|
+
"/": ["text/html; charset=utf-8", PAGE_HTML],
|
|
29
|
+
"/app.js": ["text/javascript; charset=utf-8", allowWrites ? pageJs(true) : PAGE_JS],
|
|
30
|
+
"/app.css": ["text/css; charset=utf-8", allowWrites ? pageCss(true) : PAGE_CSS],
|
|
31
|
+
};
|
|
32
|
+
}
|
|
27
33
|
/**
|
|
28
34
|
* A header as sent, once — read from `headersDistinct`, because Node keeps only the first `Host` or `Authorization`
|
|
29
35
|
* of a request that gives two. Given twice, it reads as one value no allowed spelling equals, whichever came first.
|
|
@@ -37,6 +43,10 @@ export function startUi(opts) {
|
|
|
37
43
|
const token = opts.token ?? randomBytes(32).toString("base64url");
|
|
38
44
|
const want = Buffer.from(`Bearer ${token}`, "utf8");
|
|
39
45
|
const run = opts.route ?? defaultRoute;
|
|
46
|
+
const allowWrites = opts.allowWrites === true;
|
|
47
|
+
const deps = { home: opts.home, version: opts.version, allowWrites };
|
|
48
|
+
// Built once: the script and stylesheet the page needs for this run.
|
|
49
|
+
const statics = staticRoutes(allowWrites);
|
|
40
50
|
// One data request at a time: each loads a Forge and plans a workspace.
|
|
41
51
|
let queue = Promise.resolve();
|
|
42
52
|
let port = opts.port;
|
|
@@ -55,47 +65,124 @@ export function startUi(opts) {
|
|
|
55
65
|
const json = (status, body, extra = {}) => send(status, "application/json; charset=utf-8", JSON.stringify(body), extra);
|
|
56
66
|
// Every refusal is the same bytes: which check refused is not said.
|
|
57
67
|
const forbidden = () => json(403, { error: "forbidden" });
|
|
58
|
-
|
|
68
|
+
const enqueue = (request, pattern) => {
|
|
69
|
+
// One request's failure must neither end the process nor stop the queue (see the catch at the end).
|
|
70
|
+
queue = queue.then(async () => {
|
|
71
|
+
// Work still queued when the server closed is dropped: its connection is gone, and nothing should keep loading.
|
|
72
|
+
if (closed)
|
|
73
|
+
return;
|
|
74
|
+
try {
|
|
75
|
+
const answer = await run(request, deps);
|
|
76
|
+
json(answer.status, answer.body);
|
|
77
|
+
}
|
|
78
|
+
catch (e) {
|
|
79
|
+
// The pattern, never the request's text; the browser learns nothing of the message.
|
|
80
|
+
opts.onError(`ui: ${pattern}: ${errorText(e).split("\n")[0]}`);
|
|
81
|
+
json(500, { error: "internal error" });
|
|
82
|
+
}
|
|
83
|
+
}).catch(() => {
|
|
84
|
+
// Only the catch above can throw: a failing `onError`, or an answer that can no longer be written. Nothing
|
|
85
|
+
// more can be said then; the connection is closed rather than left unanswered, and the queue goes on.
|
|
86
|
+
res.destroy();
|
|
87
|
+
});
|
|
88
|
+
};
|
|
89
|
+
const method = req.method;
|
|
90
|
+
if (method !== "GET" && method !== "POST") {
|
|
91
|
+
return json(405, { error: allowWrites ? "GET or POST only" : "GET only" }, { Allow: allowWrites ? "GET, POST" : "GET" });
|
|
92
|
+
}
|
|
93
|
+
if (method === "POST" && !allowWrites) {
|
|
59
94
|
return json(405, { error: "GET only" }, { Allow: "GET" });
|
|
95
|
+
}
|
|
60
96
|
const target = req.url ?? "/";
|
|
61
97
|
if (Buffer.byteLength(target, "utf8") > MAX_TARGET_BYTES)
|
|
62
98
|
return json(414, { error: "request too long" });
|
|
63
99
|
if (!hostAllowed(one(req, "host"), port))
|
|
64
100
|
return forbidden();
|
|
65
|
-
|
|
66
|
-
|
|
101
|
+
// A POST needs Origin present and exact; a GET may omit it (a navigation or a same-origin fetch sends none).
|
|
102
|
+
const origin = one(req, "origin");
|
|
103
|
+
const site = one(req, "sec-fetch-site");
|
|
104
|
+
if (method === "GET") {
|
|
105
|
+
if (!originAllowed(origin, port) || !siteAllowed(site))
|
|
106
|
+
return forbidden();
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
if (origin === undefined || !names(port).some((n) => origin === `http://${n}`))
|
|
110
|
+
return forbidden();
|
|
111
|
+
if (site !== "same-origin")
|
|
112
|
+
return forbidden();
|
|
113
|
+
}
|
|
67
114
|
// The path is split from the query by hand: no URL is built from the request.
|
|
68
115
|
const q = target.indexOf("?");
|
|
69
116
|
const path = q === -1 ? target : target.slice(0, q);
|
|
70
|
-
const page = Object.hasOwn(
|
|
71
|
-
if (page)
|
|
117
|
+
const page = Object.hasOwn(statics, path) ? statics[path] : undefined;
|
|
118
|
+
if (page) {
|
|
119
|
+
if (method === "POST")
|
|
120
|
+
return json(405, { error: "GET only" }, { Allow: "GET" });
|
|
72
121
|
return send(200, page[0], page[1], path === "/" ? { "Content-Security-Policy": CSP } : {});
|
|
122
|
+
}
|
|
73
123
|
const pattern = routePattern(path);
|
|
74
|
-
|
|
124
|
+
const isWritePattern = pattern !== null && WRITE_PATTERNS.includes(pattern);
|
|
125
|
+
if (pattern === null || (!allowWrites && isWritePattern))
|
|
75
126
|
return json(404, { error: "not found" });
|
|
127
|
+
if (method === "POST" && !isWritePattern)
|
|
128
|
+
return json(405, { error: "GET only" }, { Allow: "GET" });
|
|
129
|
+
if (method === "GET" && isWritePattern)
|
|
130
|
+
return json(405, { error: "POST only" }, { Allow: "POST" });
|
|
76
131
|
// The token: in the Authorization header and nowhere else, compared in constant time.
|
|
77
132
|
const got = Buffer.from(one(req, "authorization") ?? "", "utf8");
|
|
78
133
|
if (got.length !== want.length || !timingSafeEqual(got, want))
|
|
79
134
|
return forbidden();
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
return;
|
|
85
|
-
try {
|
|
86
|
-
const answer = await run({ path, query: q === -1 ? "" : target.slice(q + 1) }, { home: opts.home, version: opts.version });
|
|
87
|
-
json(answer.status, answer.body);
|
|
88
|
-
}
|
|
89
|
-
catch (e) {
|
|
90
|
-
// The pattern, never the request's text; the browser learns nothing of the message.
|
|
91
|
-
opts.onError(`ui: ${pattern}: ${errorText(e).split("\n")[0]}`);
|
|
92
|
-
json(500, { error: "internal error" });
|
|
135
|
+
if (method === "POST") {
|
|
136
|
+
const contentType = (one(req, "content-type") ?? "").split(";")[0].trim().toLowerCase();
|
|
137
|
+
if (contentType !== "application/json") {
|
|
138
|
+
return json(415, { error: "Content-Type must be application/json" });
|
|
93
139
|
}
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
140
|
+
// The body is counted as it arrives; nothing is kept past 4096 bytes. It drains to 'end' (up to 1 MiB) so the 413 reaches the client before the connection closes.
|
|
141
|
+
const action = pattern === "/api/workspaces/<id>/sync" ? "sync" : "discard";
|
|
142
|
+
const chunks = [];
|
|
143
|
+
let bytes = 0;
|
|
144
|
+
let drainBytes = 0;
|
|
145
|
+
let bodyRejected = false;
|
|
146
|
+
let drainCapExceeded = false;
|
|
147
|
+
req.on("data", (chunk) => {
|
|
148
|
+
bytes += chunk.length;
|
|
149
|
+
if (!bodyRejected && bytes > MAX_BODY_BYTES) {
|
|
150
|
+
bodyRejected = true;
|
|
151
|
+
drainBytes = bytes - MAX_BODY_BYTES;
|
|
152
|
+
}
|
|
153
|
+
else if (bodyRejected) {
|
|
154
|
+
drainBytes += chunk.length;
|
|
155
|
+
}
|
|
156
|
+
if (bodyRejected) {
|
|
157
|
+
if (drainBytes > MAX_DRAIN_BYTES && !drainCapExceeded) {
|
|
158
|
+
drainCapExceeded = true;
|
|
159
|
+
json(413, { error: "body too large" }, { Connection: "close" });
|
|
160
|
+
res.once("finish", () => req.destroy());
|
|
161
|
+
}
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
chunks.push(chunk);
|
|
165
|
+
});
|
|
166
|
+
req.on("end", () => {
|
|
167
|
+
if (drainCapExceeded || closed)
|
|
168
|
+
return;
|
|
169
|
+
if (bodyRejected) {
|
|
170
|
+
json(413, { error: "body too large" }, { Connection: "close" });
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
const text = Buffer.concat(chunks).toString("utf8");
|
|
174
|
+
const body = parseWriteBody(action, text);
|
|
175
|
+
if (body === null) {
|
|
176
|
+
json(400, { error: "bad request" });
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
enqueue({ path, query: q === -1 ? "" : target.slice(q + 1), method: "POST", body }, pattern);
|
|
180
|
+
});
|
|
181
|
+
// A client that goes away mid-body: nothing to answer, and no unhandled error.
|
|
182
|
+
req.on("error", () => { });
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
enqueue({ path, query: q === -1 ? "" : target.slice(q + 1), method: "GET" }, pattern);
|
|
99
186
|
});
|
|
100
187
|
server.headersTimeout = 10_000;
|
|
101
188
|
server.requestTimeout = 30_000;
|
package/dist/ui/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/ui/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/ui/server.ts"],"names":[],"mappings":"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"}
|