@dwk/solid-pod 0.1.0-beta.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/LICENSE +15 -0
- package/README.md +108 -0
- package/dist/auth.d.ts +33 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +160 -0
- package/dist/auth.js.map +1 -0
- package/dist/config.d.ts +181 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +74 -0
- package/dist/config.js.map +1 -0
- package/dist/encoding.d.ts +13 -0
- package/dist/encoding.d.ts.map +1 -0
- package/dist/encoding.js +31 -0
- package/dist/encoding.js.map +1 -0
- package/dist/gc.d.ts +22 -0
- package/dist/gc.d.ts.map +1 -0
- package/dist/gc.js +33 -0
- package/dist/gc.js.map +1 -0
- package/dist/handler.d.ts +20 -0
- package/dist/handler.d.ts.map +1 -0
- package/dist/handler.js +155 -0
- package/dist/handler.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/jwt.d.ts +36 -0
- package/dist/jwt.d.ts.map +1 -0
- package/dist/jwt.js +120 -0
- package/dist/jwt.js.map +1 -0
- package/dist/ldp.d.ts +37 -0
- package/dist/ldp.d.ts.map +1 -0
- package/dist/ldp.js +85 -0
- package/dist/ldp.js.map +1 -0
- package/dist/log.d.ts +55 -0
- package/dist/log.d.ts.map +1 -0
- package/dist/log.js +51 -0
- package/dist/log.js.map +1 -0
- package/dist/negotiation.d.ts +23 -0
- package/dist/negotiation.d.ts.map +1 -0
- package/dist/negotiation.js +80 -0
- package/dist/negotiation.js.map +1 -0
- package/dist/patch.d.ts +80 -0
- package/dist/patch.d.ts.map +1 -0
- package/dist/patch.js +425 -0
- package/dist/patch.js.map +1 -0
- package/dist/pod.d.ts +20 -0
- package/dist/pod.d.ts.map +1 -0
- package/dist/pod.js +860 -0
- package/dist/pod.js.map +1 -0
- package/dist/wac.d.ts +33 -0
- package/dist/wac.d.ts.map +1 -0
- package/dist/wac.js +84 -0
- package/dist/wac.js.map +1 -0
- package/package.json +55 -0
- package/src/auth.ts +203 -0
- package/src/config.ts +254 -0
- package/src/encoding.ts +32 -0
- package/src/gc.ts +47 -0
- package/src/handler.ts +199 -0
- package/src/index.ts +32 -0
- package/src/jwt.ts +166 -0
- package/src/ldp.ts +99 -0
- package/src/log.ts +59 -0
- package/src/negotiation.ts +97 -0
- package/src/patch.ts +539 -0
- package/src/pod.ts +1195 -0
- package/src/wac.ts +119 -0
package/dist/patch.js
ADDED
|
@@ -0,0 +1,425 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* N3 Patch (`text/n3`) and a minimal `application/sparql-update` parser, plus
|
|
3
|
+
* the deliberately-small `solid:where` matcher.
|
|
4
|
+
*
|
|
5
|
+
* This is **not** a SPARQL engine. `solid:where` is a conjunctive basic graph
|
|
6
|
+
* pattern matched against the resource's current triples; the patch applies
|
|
7
|
+
* only when the pattern binds to **exactly one** solution (per the Solid
|
|
8
|
+
* Protocol's N3 Patch rules). Variables in `solid:deletes` / `solid:inserts`
|
|
9
|
+
* are then instantiated from that single binding. Anything richer (`OPTIONAL`,
|
|
10
|
+
* `FILTER`, property paths, multiple solutions) is out of scope and surfaces as
|
|
11
|
+
* a `409`.
|
|
12
|
+
*/
|
|
13
|
+
import { parseTurtle, } from "@dwk/rdf";
|
|
14
|
+
const SOLID = "http://www.w3.org/ns/solid/terms#";
|
|
15
|
+
const RDF_TYPE = "http://www.w3.org/1999/02/22-rdf-syntax-ns#type";
|
|
16
|
+
const INSERT_DELETE_PATCH = `${SOLID}InsertDeletePatch`;
|
|
17
|
+
const XSD_STRING = "http://www.w3.org/2001/XMLSchema#string";
|
|
18
|
+
const DEFAULT_GRAPH = { termType: "DefaultGraph", value: "" };
|
|
19
|
+
export class PatchProblem extends Error {
|
|
20
|
+
code;
|
|
21
|
+
constructor(code) {
|
|
22
|
+
super(`@dwk/solid-pod: patch ${code}`);
|
|
23
|
+
this.code = code;
|
|
24
|
+
this.name = "PatchProblem";
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Thrown when a patch document does not satisfy the N3 Patch document
|
|
29
|
+
* constraints. Kept distinct from {@link PatchProblem} so the handler can map it
|
|
30
|
+
* to `422` while binding/state failures stay `409`.
|
|
31
|
+
*/
|
|
32
|
+
export class PatchConstraintError extends Error {
|
|
33
|
+
code;
|
|
34
|
+
constructor(code) {
|
|
35
|
+
super(`@dwk/solid-pod: patch constraint ${code}`);
|
|
36
|
+
this.code = code;
|
|
37
|
+
this.name = "PatchConstraintError";
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
// Term conversion
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
/** Normalize an N3 term into a {@link PatchTerm}. */
|
|
44
|
+
function fromN3Term(term) {
|
|
45
|
+
switch (term.termType) {
|
|
46
|
+
case "Variable":
|
|
47
|
+
return { kind: "var", name: term.value };
|
|
48
|
+
case "NamedNode":
|
|
49
|
+
return {
|
|
50
|
+
kind: "term",
|
|
51
|
+
term: { termType: "NamedNode", value: term.value },
|
|
52
|
+
};
|
|
53
|
+
case "BlankNode":
|
|
54
|
+
return {
|
|
55
|
+
kind: "term",
|
|
56
|
+
term: { termType: "BlankNode", value: term.value },
|
|
57
|
+
};
|
|
58
|
+
case "Literal": {
|
|
59
|
+
const literal = term;
|
|
60
|
+
if (literal.language) {
|
|
61
|
+
return {
|
|
62
|
+
kind: "term",
|
|
63
|
+
term: {
|
|
64
|
+
termType: "Literal",
|
|
65
|
+
value: literal.value,
|
|
66
|
+
language: literal.language,
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
kind: "term",
|
|
72
|
+
term: {
|
|
73
|
+
termType: "Literal",
|
|
74
|
+
value: literal.value,
|
|
75
|
+
datatype: literal.datatype.value,
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
default:
|
|
80
|
+
throw new PatchProblem("parse_error");
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function tripleFromQuad(quad) {
|
|
84
|
+
return {
|
|
85
|
+
subject: fromN3Term(quad.subject),
|
|
86
|
+
predicate: fromN3Term(quad.predicate),
|
|
87
|
+
object: fromN3Term(quad.object),
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
// ---------------------------------------------------------------------------
|
|
91
|
+
// N3 Patch parsing
|
|
92
|
+
// ---------------------------------------------------------------------------
|
|
93
|
+
/**
|
|
94
|
+
* Collect the inner triples of the formula referenced by `(subject, predicate)`.
|
|
95
|
+
*
|
|
96
|
+
* Each of `solid:where` / `solid:inserts` / `solid:deletes` MUST appear at most
|
|
97
|
+
* once (Solid Protocol §5.3.1); more than one such statement is a document
|
|
98
|
+
* constraint violation (`#server-patch-n3-invalid`), reported as
|
|
99
|
+
* {@link PatchConstraintError} `duplicate_predicate`.
|
|
100
|
+
*/
|
|
101
|
+
function formulaTriples(quads, predicateIri) {
|
|
102
|
+
// The statement `_:patch solid:<predicate> { … }` references the formula as a
|
|
103
|
+
// blank-node graph; N3.js emits the formula's triples with that graph term.
|
|
104
|
+
const graphValues = new Set();
|
|
105
|
+
let statementCount = 0;
|
|
106
|
+
for (const q of quads) {
|
|
107
|
+
if (q.predicate.value === predicateIri &&
|
|
108
|
+
q.graph.termType === "DefaultGraph") {
|
|
109
|
+
statementCount++;
|
|
110
|
+
if (q.object.termType === "BlankNode")
|
|
111
|
+
graphValues.add(q.object.value);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if (statementCount > 1) {
|
|
115
|
+
throw new PatchConstraintError("duplicate_predicate");
|
|
116
|
+
}
|
|
117
|
+
const triples = [];
|
|
118
|
+
for (const q of quads) {
|
|
119
|
+
if (q.graph.termType !== "DefaultGraph" && graphValues.has(q.graph.value)) {
|
|
120
|
+
triples.push(tripleFromQuad(q));
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return triples;
|
|
124
|
+
}
|
|
125
|
+
/** Whether any term of a triple is a blank node. */
|
|
126
|
+
function tripleHasBlankNode(triple) {
|
|
127
|
+
return [triple.subject, triple.predicate, triple.object].some((t) => t.kind === "term" && t.term.termType === "BlankNode");
|
|
128
|
+
}
|
|
129
|
+
/** Collect the variable names a triple references. */
|
|
130
|
+
function collectVars(triple, into) {
|
|
131
|
+
for (const term of [triple.subject, triple.predicate, triple.object]) {
|
|
132
|
+
if (term.kind === "var")
|
|
133
|
+
into.add(term.name);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/** Parse an N3 Patch document (`text/n3`) and enforce its document constraints. */
|
|
137
|
+
function parseN3Patch(body, baseIRI) {
|
|
138
|
+
let quads;
|
|
139
|
+
try {
|
|
140
|
+
quads = parseTurtle(body, { format: "text/n3", baseIRI });
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
throw new PatchConstraintError("parse_error");
|
|
144
|
+
}
|
|
145
|
+
// `#server-patch-n3-simple-type`: the patch document MUST contain exactly one
|
|
146
|
+
// `?patch rdf:type solid:InsertDeletePatch` statement in the default graph.
|
|
147
|
+
const hasType = quads.some((q) => q.graph.termType === "DefaultGraph" &&
|
|
148
|
+
q.predicate.value === RDF_TYPE &&
|
|
149
|
+
q.object.termType === "NamedNode" &&
|
|
150
|
+
q.object.value === INSERT_DELETE_PATCH);
|
|
151
|
+
if (!hasType) {
|
|
152
|
+
throw new PatchConstraintError("missing_type");
|
|
153
|
+
}
|
|
154
|
+
const patch = {
|
|
155
|
+
where: formulaTriples(quads, `${SOLID}where`),
|
|
156
|
+
deletes: formulaTriples(quads, `${SOLID}deletes`),
|
|
157
|
+
inserts: formulaTriples(quads, `${SOLID}inserts`),
|
|
158
|
+
};
|
|
159
|
+
// `#server-patch-n3-blank-nodes`: the inserts/deletes formulae MUST NOT
|
|
160
|
+
// contain blank nodes.
|
|
161
|
+
if (patch.inserts.some(tripleHasBlankNode) ||
|
|
162
|
+
patch.deletes.some(tripleHasBlankNode)) {
|
|
163
|
+
throw new PatchConstraintError("blank_node_in_template");
|
|
164
|
+
}
|
|
165
|
+
// `#server-patch-n3-variables`: every variable used in inserts/deletes MUST
|
|
166
|
+
// occur in `where`. Detect this statically so a template using an unbound
|
|
167
|
+
// variable is a document constraint violation (422), not a runtime miss.
|
|
168
|
+
const whereVars = new Set();
|
|
169
|
+
for (const t of patch.where)
|
|
170
|
+
collectVars(t, whereVars);
|
|
171
|
+
const templateVars = new Set();
|
|
172
|
+
for (const t of patch.inserts)
|
|
173
|
+
collectVars(t, templateVars);
|
|
174
|
+
for (const t of patch.deletes)
|
|
175
|
+
collectVars(t, templateVars);
|
|
176
|
+
for (const name of templateVars) {
|
|
177
|
+
if (!whereVars.has(name)) {
|
|
178
|
+
throw new PatchConstraintError("unbound_template_variable");
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return patch;
|
|
182
|
+
}
|
|
183
|
+
// ---------------------------------------------------------------------------
|
|
184
|
+
// Minimal SPARQL Update parsing
|
|
185
|
+
// ---------------------------------------------------------------------------
|
|
186
|
+
/**
|
|
187
|
+
* Extract `PREFIX`/`BASE` (and `@prefix`/`@base`) declaration lines verbatim.
|
|
188
|
+
*
|
|
189
|
+
* Turtle 1.1 (which N3.js parses) accepts SPARQL-style `PREFIX`/`BASE` without
|
|
190
|
+
* the leading `@` or a trailing `.`, so the lines are passed through as-is and
|
|
191
|
+
* prepended to each pattern block before parsing.
|
|
192
|
+
*/
|
|
193
|
+
function prologue(body) {
|
|
194
|
+
const matches = body.match(/^[ \t]*(?:PREFIX|BASE|@prefix|@base)\b[^\n]*$/gim);
|
|
195
|
+
return matches ? matches.join("\n") : "";
|
|
196
|
+
}
|
|
197
|
+
/** Pull the contents of the first `KEYWORD { … }` block (brace-matched). */
|
|
198
|
+
function block(body, keyword) {
|
|
199
|
+
const m = keyword.exec(body);
|
|
200
|
+
if (!m)
|
|
201
|
+
return null;
|
|
202
|
+
const open = body.indexOf("{", m.index + m[0].length - 1);
|
|
203
|
+
if (open < 0)
|
|
204
|
+
return null;
|
|
205
|
+
let depth = 0;
|
|
206
|
+
for (let i = open; i < body.length; i++) {
|
|
207
|
+
const ch = body[i];
|
|
208
|
+
if (ch === "{")
|
|
209
|
+
depth++;
|
|
210
|
+
else if (ch === "}" && --depth === 0)
|
|
211
|
+
return body.slice(open + 1, i);
|
|
212
|
+
}
|
|
213
|
+
return null;
|
|
214
|
+
}
|
|
215
|
+
function parsePatternBlock(content, prefixes, baseIRI) {
|
|
216
|
+
try {
|
|
217
|
+
const quads = parseTurtle(`${prefixes}\n${content}`, {
|
|
218
|
+
format: "text/n3",
|
|
219
|
+
baseIRI,
|
|
220
|
+
});
|
|
221
|
+
return quads
|
|
222
|
+
.filter((q) => q.graph.termType === "DefaultGraph")
|
|
223
|
+
.map(tripleFromQuad);
|
|
224
|
+
}
|
|
225
|
+
catch {
|
|
226
|
+
throw new PatchProblem("parse_error");
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
/** Parse the supported subset of `application/sparql-update`. */
|
|
230
|
+
function parseSparqlUpdate(body, baseIRI) {
|
|
231
|
+
const prefixes = prologue(body);
|
|
232
|
+
const insertData = block(body, /INSERT\s+DATA\s*/i);
|
|
233
|
+
const deleteData = block(body, /DELETE\s+DATA\s*/i);
|
|
234
|
+
if (insertData !== null || deleteData !== null) {
|
|
235
|
+
return {
|
|
236
|
+
where: [],
|
|
237
|
+
inserts: insertData
|
|
238
|
+
? parsePatternBlock(insertData, prefixes, baseIRI)
|
|
239
|
+
: [],
|
|
240
|
+
deletes: deleteData
|
|
241
|
+
? parsePatternBlock(deleteData, prefixes, baseIRI)
|
|
242
|
+
: [],
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
const where = block(body, /WHERE\s*/i);
|
|
246
|
+
const deletes = block(body, /DELETE\s*/i);
|
|
247
|
+
const inserts = block(body, /INSERT\s*/i);
|
|
248
|
+
if (where === null && deletes === null && inserts === null) {
|
|
249
|
+
throw new PatchProblem("parse_error");
|
|
250
|
+
}
|
|
251
|
+
return {
|
|
252
|
+
where: where ? parsePatternBlock(where, prefixes, baseIRI) : [],
|
|
253
|
+
deletes: deletes ? parsePatternBlock(deletes, prefixes, baseIRI) : [],
|
|
254
|
+
inserts: inserts ? parsePatternBlock(inserts, prefixes, baseIRI) : [],
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
/** Parse a patch body by its `Content-Type`. */
|
|
258
|
+
export function parsePatch(body, contentType, baseIRI) {
|
|
259
|
+
const essence = contentType.split(";")[0]?.trim().toLowerCase();
|
|
260
|
+
if (essence === "text/n3" || essence === "application/n3") {
|
|
261
|
+
return parseN3Patch(body, baseIRI);
|
|
262
|
+
}
|
|
263
|
+
if (essence === "application/sparql-update" ||
|
|
264
|
+
essence === "application/sparql-update; charset=utf-8") {
|
|
265
|
+
return parseSparqlUpdate(body, baseIRI);
|
|
266
|
+
}
|
|
267
|
+
throw new PatchProblem("unsupported_media_type");
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* DoS guards for the `where` solver. This is a minimal conjunctive matcher, not
|
|
271
|
+
* a SPARQL engine, and it runs inside the single-threaded per-pod Durable
|
|
272
|
+
* Object — so a crafted patch with several all-variable `where` triples against
|
|
273
|
+
* a large resource could otherwise build an N^k cartesian product and exhaust
|
|
274
|
+
* the CPU budget, stalling every request that serializes through that pod.
|
|
275
|
+
*
|
|
276
|
+
* `MAX_WHERE_TRIPLES` caps the pattern size, and `MAX_SOLVE_WORK` caps the
|
|
277
|
+
* total candidate-match attempts across all triples — together they bound the
|
|
278
|
+
* solver's cost regardless of resource size. Exceeding either is reported as
|
|
279
|
+
* {@link PatchProblem} `where_too_complex`.
|
|
280
|
+
*/
|
|
281
|
+
const MAX_WHERE_TRIPLES = 25;
|
|
282
|
+
const MAX_SOLVE_WORK = 1_000_000;
|
|
283
|
+
/** Normalize a literal's datatype: an untyped, non-language literal is xsd:string. */
|
|
284
|
+
function effectiveDatatype(term) {
|
|
285
|
+
if (term.termType !== "Literal")
|
|
286
|
+
return undefined;
|
|
287
|
+
if (term.language)
|
|
288
|
+
return undefined;
|
|
289
|
+
return term.datatype ?? XSD_STRING;
|
|
290
|
+
}
|
|
291
|
+
/** Strict term equality, normalizing the implicit xsd:string datatype. */
|
|
292
|
+
function termsEqual(a, b) {
|
|
293
|
+
if (a.termType !== b.termType || a.value !== b.value)
|
|
294
|
+
return false;
|
|
295
|
+
if (a.termType === "Literal") {
|
|
296
|
+
return ((a.language ?? "") === (b.language ?? "") &&
|
|
297
|
+
effectiveDatatype(a) === effectiveDatatype(b));
|
|
298
|
+
}
|
|
299
|
+
return true;
|
|
300
|
+
}
|
|
301
|
+
/** Match one pattern term against a concrete term under `bindings`. */
|
|
302
|
+
function matchTerm(pattern, value, bindings) {
|
|
303
|
+
if (pattern.kind === "var") {
|
|
304
|
+
const bound = bindings.get(pattern.name);
|
|
305
|
+
if (bound)
|
|
306
|
+
return termsEqual(bound, value);
|
|
307
|
+
bindings.set(pattern.name, value);
|
|
308
|
+
return true;
|
|
309
|
+
}
|
|
310
|
+
return termsEqual(pattern.term, value);
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Find solutions of the conjunctive `where` pattern against `current`, via
|
|
314
|
+
* straightforward backtracking. Each solution is a complete variable binding.
|
|
315
|
+
*
|
|
316
|
+
* Bounded against pattern-driven CPU exhaustion (see {@link MAX_WHERE_TRIPLES}
|
|
317
|
+
* and {@link MAX_SOLVE_WORK}): an over-large pattern, or one whose intermediate
|
|
318
|
+
* cartesian product blows the work budget, throws `where_too_complex` rather
|
|
319
|
+
* than enumerating it. Resolution only needs to distinguish "no bind", "exactly
|
|
320
|
+
* one bind", and "more than one bind", so the result is capped at two solutions
|
|
321
|
+
* — that is enough to detect ambiguity without materializing every binding.
|
|
322
|
+
*/
|
|
323
|
+
function solve(where, current) {
|
|
324
|
+
if (where.length === 0)
|
|
325
|
+
return [new Map()];
|
|
326
|
+
if (where.length > MAX_WHERE_TRIPLES) {
|
|
327
|
+
throw new PatchProblem("where_too_complex");
|
|
328
|
+
}
|
|
329
|
+
let work = 0;
|
|
330
|
+
let solutions = [new Map()];
|
|
331
|
+
for (let i = 0; i < where.length; i++) {
|
|
332
|
+
const triple = where[i];
|
|
333
|
+
const last = i === where.length - 1;
|
|
334
|
+
const next = [];
|
|
335
|
+
for (const partial of solutions) {
|
|
336
|
+
// The variables this triple would newly bind in `partial`. `matchTerm`
|
|
337
|
+
// binds into the map it is given, so we match against `partial` directly
|
|
338
|
+
// and roll these back after each quad — cloning a fresh candidate per
|
|
339
|
+
// quad would, on the abort path, allocate up to MAX_SOLVE_WORK maps and
|
|
340
|
+
// thrash GC inside the single-threaded DO. Only successful matches clone.
|
|
341
|
+
const newVars = [];
|
|
342
|
+
for (const term of [triple.subject, triple.predicate, triple.object]) {
|
|
343
|
+
if (term.kind === "var" && !partial.has(term.name)) {
|
|
344
|
+
newVars.push(term.name);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
for (const quad of current) {
|
|
348
|
+
if (++work > MAX_SOLVE_WORK) {
|
|
349
|
+
throw new PatchProblem("where_too_complex");
|
|
350
|
+
}
|
|
351
|
+
if (matchTerm(triple.subject, quad.subject, partial) &&
|
|
352
|
+
matchTerm(triple.predicate, quad.predicate, partial) &&
|
|
353
|
+
matchTerm(triple.object, quad.object, partial)) {
|
|
354
|
+
next.push(new Map(partial));
|
|
355
|
+
// On the final triple, two complete solutions already prove the
|
|
356
|
+
// match is ambiguous; stop before enumerating the rest.
|
|
357
|
+
if (last && next.length > 1)
|
|
358
|
+
return next;
|
|
359
|
+
}
|
|
360
|
+
for (const name of newVars)
|
|
361
|
+
partial.delete(name);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
if (next.length === 0)
|
|
365
|
+
return [];
|
|
366
|
+
solutions = next;
|
|
367
|
+
}
|
|
368
|
+
return solutions;
|
|
369
|
+
}
|
|
370
|
+
/** Instantiate a template term under a binding into a concrete {@link StoredTerm}. */
|
|
371
|
+
function instantiate(term, bindings) {
|
|
372
|
+
if (term.kind === "var") {
|
|
373
|
+
const bound = bindings.get(term.name);
|
|
374
|
+
// N3 patches are checked statically in `parseN3Patch`; this backstops the
|
|
375
|
+
// SPARQL path, where an unbound template variable is also a document
|
|
376
|
+
// constraint violation (422).
|
|
377
|
+
if (!bound)
|
|
378
|
+
throw new PatchConstraintError("unbound_template_variable");
|
|
379
|
+
return bound;
|
|
380
|
+
}
|
|
381
|
+
return term.term;
|
|
382
|
+
}
|
|
383
|
+
function instantiateTriple(triple, bindings) {
|
|
384
|
+
return {
|
|
385
|
+
subject: instantiate(triple.subject, bindings),
|
|
386
|
+
predicate: instantiate(triple.predicate, bindings),
|
|
387
|
+
object: instantiate(triple.object, bindings),
|
|
388
|
+
graph: DEFAULT_GRAPH,
|
|
389
|
+
};
|
|
390
|
+
}
|
|
391
|
+
/** Whether `current` contains a quad equal to `target` (default graph). */
|
|
392
|
+
function contains(current, target) {
|
|
393
|
+
return current.some((q) => termsEqual(q.subject, target.subject) &&
|
|
394
|
+
termsEqual(q.predicate, target.predicate) &&
|
|
395
|
+
termsEqual(q.object, target.object));
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* Resolve a parsed {@link Patch} against the resource's `current` quads into a
|
|
399
|
+
* concrete delete/insert pair.
|
|
400
|
+
*
|
|
401
|
+
* @throws {PatchProblem}
|
|
402
|
+
* - `no_match` when `where` binds to no solution;
|
|
403
|
+
* - `ambiguous_match` when it binds to more than one;
|
|
404
|
+
* - `delete_not_found` when a resolved delete triple is absent;
|
|
405
|
+
* - `where_too_complex` when the `where` pattern exceeds the solver's bounds.
|
|
406
|
+
* @throws {PatchConstraintError}
|
|
407
|
+
* - `unbound_template_variable` when a template uses an unbound variable
|
|
408
|
+
* (backstop for the SPARQL path; N3 patches are checked at parse time).
|
|
409
|
+
*/
|
|
410
|
+
export function resolvePatch(patch, current) {
|
|
411
|
+
const solutions = solve(patch.where, current);
|
|
412
|
+
if (solutions.length === 0)
|
|
413
|
+
throw new PatchProblem("no_match");
|
|
414
|
+
if (solutions.length > 1)
|
|
415
|
+
throw new PatchProblem("ambiguous_match");
|
|
416
|
+
const bindings = solutions[0];
|
|
417
|
+
const deletes = patch.deletes.map((t) => instantiateTriple(t, bindings));
|
|
418
|
+
const inserts = patch.inserts.map((t) => instantiateTriple(t, bindings));
|
|
419
|
+
for (const d of deletes) {
|
|
420
|
+
if (!contains(current, d))
|
|
421
|
+
throw new PatchProblem("delete_not_found");
|
|
422
|
+
}
|
|
423
|
+
return { deletes, inserts, insertOnly: deletes.length === 0 };
|
|
424
|
+
}
|
|
425
|
+
//# sourceMappingURL=patch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patch.js","sourceRoot":"","sources":["../src/patch.ts"],"names":[],"mappings":"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"}
|
package/dist/pod.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The per-pod Durable Object: the single-threaded consistency, authz, and
|
|
3
|
+
* notification authority for one Solid Pod.
|
|
4
|
+
*
|
|
5
|
+
* The stateless front door (`handler.ts`) authenticates at the edge and hands
|
|
6
|
+
* the verified agent facts to this object via internal headers; everything that
|
|
7
|
+
* must be strongly consistent — LDP verbs, WAC, N3 Patch, `If-Match` writes,
|
|
8
|
+
* DPoP `jti` replay, R2 copy-on-write through `@dwk/store`, and WebSocket
|
|
9
|
+
* notifications — happens here, where Cloudflare guarantees a single thread per
|
|
10
|
+
* pod. Consumers bind this class as a Durable Object namespace.
|
|
11
|
+
*/
|
|
12
|
+
import { DurableObject } from "cloudflare:workers";
|
|
13
|
+
import { type SolidPodEnv } from "./config";
|
|
14
|
+
export declare class SolidPodObject extends DurableObject<SolidPodEnv> {
|
|
15
|
+
#private;
|
|
16
|
+
constructor(state: DurableObjectState, env: SolidPodEnv);
|
|
17
|
+
fetch(request: Request): Promise<Response>;
|
|
18
|
+
webSocketMessage(ws: WebSocket, message: string | ArrayBuffer): Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=pod.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pod.d.ts","sourceRoot":"","sources":["../src/pod.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAwBnD,OAAO,EAAoB,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AA0F9D,qBAAa,cAAe,SAAQ,aAAa,CAAC,WAAW,CAAC;;gBAQhD,KAAK,EAAE,kBAAkB,EAAE,GAAG,EAAE,WAAW;IAuBxC,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;IA2wB1C,gBAAgB,CAC7B,EAAE,EAAE,SAAS,EACb,OAAO,EAAE,MAAM,GAAG,WAAW,GAC5B,OAAO,CAAC,IAAI,CAAC;CAyBjB"}
|