@lde/distribution-probe 0.1.11 → 0.1.13
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 +3 -3
- package/dist/probe.d.ts.map +1 -1
- package/dist/probe.js +25 -7
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -17,10 +17,10 @@ const result = await probe(distribution);
|
|
|
17
17
|
|
|
18
18
|
### SPARQL endpoints
|
|
19
19
|
|
|
20
|
-
Sends `POST` with `SELECT * { ?s ?p ?o } LIMIT 1` and `Accept
|
|
20
|
+
Sends `POST` with the configured query (default `SELECT * { ?s ?p ?o } LIMIT 1`). The query type is detected (`ASK` / `SELECT` / `CONSTRUCT` / `DESCRIBE`) and drives both the `Accept` header and how the response is validated:
|
|
21
21
|
|
|
22
|
-
-
|
|
23
|
-
-
|
|
22
|
+
- **`ASK` / `SELECT`** request `application/sparql-results+json`, with `application/sparql-results+xml` as a lower-priority fallback. The response Content-Type must be one of those — anything else fails the probe (`isSuccess() === false`), which rules out HTML error pages served with `200 OK`. The body must parse and contain a results document (a `results` object for `SELECT`, a `boolean` for `ASK`); empty bodies, invalid JSON/XML, and missing results all fail with a `failureReason`.
|
|
23
|
+
- **`CONSTRUCT` / `DESCRIBE`** request the common RDF serializations (`text/turtle`, `application/n-triples`, `application/rdf+xml`, `application/ld+json`, `application/n-quads`, `application/trig`) and accept any of them. A `2xx` RDF response confirms availability, and **an empty graph is a valid answer** — so an empty body does not fail the probe (unlike a data dump, which must be non-empty). The body is not parse-validated.
|
|
24
24
|
|
|
25
25
|
### Data dumps
|
|
26
26
|
|
package/dist/probe.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"probe.d.ts","sourceRoot":"","sources":["../src/probe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,YAAY,EAAE,MAAM,cAAc,CAAC;AAInE;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,0DAA0D;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;;;;;OASG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AASD;;GAEG;AACH,qBAAa,YAAY;aAEL,GAAG,EAAE,MAAM;aACX,OAAO,EAAE,MAAM;aACf,cAAc,EAAE,MAAM;gBAFtB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM;CAEzC;AAED;;GAEG;AACH,uBAAe,WAAW;aAUN,GAAG,EAAE,MAAM;IAT7B,SAAgB,UAAU,EAAE,MAAM,CAAC;IACnC,SAAgB,UAAU,EAAE,MAAM,CAAC;IACnC,SAAgB,YAAY,EAAE,IAAI,GAAG,IAAI,CAAQ;IACjD,SAAgB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3C,SAAgB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7C,SAAgB,QAAQ,EAAE,MAAM,EAAE,CAAM;IACxC,SAAgB,cAAc,EAAE,MAAM,CAAC;gBAGrB,GAAG,EAAE,MAAM,EAC3B,QAAQ,EAAE,QAAQ,EAClB,cAAc,EAAE,MAAM,EACtB,aAAa,GAAE,MAAM,GAAG,IAAW;IAa9B,SAAS,IAAI,OAAO;CAO5B;
|
|
1
|
+
{"version":3,"file":"probe.d.ts","sourceRoot":"","sources":["../src/probe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,YAAY,EAAE,MAAM,cAAc,CAAC;AAInE;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,0DAA0D;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;;;;;OASG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AASD;;GAEG;AACH,qBAAa,YAAY;aAEL,GAAG,EAAE,MAAM;aACX,OAAO,EAAE,MAAM;aACf,cAAc,EAAE,MAAM;gBAFtB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM;CAEzC;AAED;;GAEG;AACH,uBAAe,WAAW;aAUN,GAAG,EAAE,MAAM;IAT7B,SAAgB,UAAU,EAAE,MAAM,CAAC;IACnC,SAAgB,UAAU,EAAE,MAAM,CAAC;IACnC,SAAgB,YAAY,EAAE,IAAI,GAAG,IAAI,CAAQ;IACjD,SAAgB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3C,SAAgB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7C,SAAgB,QAAQ,EAAE,MAAM,EAAE,CAAM;IACxC,SAAgB,cAAc,EAAE,MAAM,CAAC;gBAGrB,GAAG,EAAE,MAAM,EAC3B,QAAQ,EAAE,QAAQ,EAClB,cAAc,EAAE,MAAM,EACtB,aAAa,GAAE,MAAM,GAAG,IAAW;IAa9B,SAAS,IAAI,OAAO;CAO5B;AAqBD;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,WAAW;IAChD;;;;;OAKG;IACH,SAAgB,oBAAoB,EAAE,SAAS,MAAM,EAAE,CAAC;gBAGtD,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,QAAQ,EAClB,cAAc,EAAE,MAAM,EACtB,oBAAoB,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,EAChD,aAAa,GAAE,MAAM,GAAG,IAAW;IAS5B,SAAS,IAAI,OAAO;CAQ9B;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,WAAW;IAClD,SAAgB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAQ;gBAGhD,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,QAAQ,EAClB,cAAc,EAAE,MAAM,EACtB,aAAa,GAAE,MAAM,GAAG,IAAW;CAQtC;AAED,MAAM,MAAM,eAAe,GACvB,iBAAiB,GACjB,mBAAmB,GACnB,YAAY,CAAC;AAIjB;;;;;;;;GAQG;AACH,wBAAsB,KAAK,CACzB,YAAY,EAAE,YAAY,EAC1B,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,eAAe,CAAC,CAqD1B"}
|
package/dist/probe.js
CHANGED
|
@@ -51,7 +51,21 @@ class ProbeResult {
|
|
|
51
51
|
}
|
|
52
52
|
const SPARQL_RESULTS_JSON = 'application/sparql-results+json';
|
|
53
53
|
const SPARQL_RESULTS_XML = 'application/sparql-results+xml';
|
|
54
|
-
|
|
54
|
+
/**
|
|
55
|
+
* RDF serializations a CONSTRUCT or DESCRIBE query may be answered with, in
|
|
56
|
+
* preference order. The endpoint chooses the serialization, so availability must
|
|
57
|
+
* not hinge on a single one: accepting only n-triples flagged healthy endpoints
|
|
58
|
+
* that answer in Turtle (a common default) as unavailable, and made endpoints
|
|
59
|
+
* that cannot emit n-triples reject the probe with HTTP 406.
|
|
60
|
+
*/
|
|
61
|
+
const SPARQL_RDF_RESULTS = [
|
|
62
|
+
'text/turtle',
|
|
63
|
+
'application/n-triples',
|
|
64
|
+
'application/rdf+xml',
|
|
65
|
+
'application/ld+json',
|
|
66
|
+
'application/n-quads',
|
|
67
|
+
'application/trig',
|
|
68
|
+
];
|
|
55
69
|
/**
|
|
56
70
|
* Result of probing a SPARQL endpoint.
|
|
57
71
|
*/
|
|
@@ -212,7 +226,7 @@ function acceptableContentTypes(queryType) {
|
|
|
212
226
|
if (queryType === 'ASK' || queryType === 'SELECT') {
|
|
213
227
|
return [SPARQL_RESULTS_JSON, SPARQL_RESULTS_XML];
|
|
214
228
|
}
|
|
215
|
-
return [SPARQL_RDF_RESULTS];
|
|
229
|
+
return [...SPARQL_RDF_RESULTS];
|
|
216
230
|
}
|
|
217
231
|
/**
|
|
218
232
|
* Build an `Accept` header that prefers the first content type but still accepts
|
|
@@ -254,15 +268,19 @@ async function probeSparqlEndpoint(url, _distribution, options, authHeaders, sta
|
|
|
254
268
|
return new SparqlProbeResult(url, response, responseTimeMs, acceptedContentTypes, failureReason);
|
|
255
269
|
}
|
|
256
270
|
async function validateSparqlResponse(response, queryType, contentType) {
|
|
271
|
+
if (queryType === 'CONSTRUCT' || queryType === 'DESCRIBE') {
|
|
272
|
+
// A CONSTRUCT/DESCRIBE answer is RDF, and an empty graph is a valid answer –
|
|
273
|
+
// e.g. an availability probe whose query happens to match nothing – so the
|
|
274
|
+
// 200 response alone confirms the endpoint is up. Deep parse validation is
|
|
275
|
+
// the data-dump path’s job. Only data dumps must be non-empty (see
|
|
276
|
+
// validateBody); a SPARQL result may be empty.
|
|
277
|
+
await response.body?.cancel();
|
|
278
|
+
return null;
|
|
279
|
+
}
|
|
257
280
|
const body = await response.text();
|
|
258
281
|
if (body.length === 0) {
|
|
259
282
|
return 'SPARQL endpoint returned an empty response';
|
|
260
283
|
}
|
|
261
|
-
if (queryType === 'CONSTRUCT' || queryType === 'DESCRIBE') {
|
|
262
|
-
// Body should be RDF; a non-empty response is sufficient to confirm the
|
|
263
|
-
// endpoint answered. Deep parse validation is the data-dump path’s job.
|
|
264
|
-
return null;
|
|
265
|
-
}
|
|
266
284
|
return contentType.startsWith(SPARQL_RESULTS_XML)
|
|
267
285
|
? validateSparqlXmlResults(body, queryType)
|
|
268
286
|
: validateSparqlJsonResults(body, queryType);
|