Improved error handling #8

Merged
jsheunis merged 2 commits from error-handling into main 2025-04-29 16:20:14 +00:00
3 changed files with 52 additions and 60 deletions

View file

@ -1,7 +1,6 @@
{ {
"name": "shacl-tulip", "name": "shacl-tulip",
"private": true, "version": "0.0.2",
"version": "0.0.1",
"type": "module", "type": "module",
"main": "./src/index.js", "main": "./src/index.js",
"module": "./src/index.js", "module": "./src/index.js",

View file

@ -49,25 +49,28 @@ export class RdfDataset {
*/ */
async loadRDF(url, headers = {}) { async loadRDF(url, headers = {}) {
this.beforeLoadFn() this.beforeLoadFn()
readRDF(url, headers) const result = await readRDF(url, headers)
.then(quadStream => {
// Load prefixes // Bubble up error
quadStream.on('prefix', (prefix, ns) => { if (!result.success) {
this.onPrefixFn(prefix, ns) return result
}).on('end', () => { }
this.onPrefixEndFn()
}) const quadStream = result.quadStream
// Load data // Load prefixes
quadStream.on('data', quad => { quadStream.on('prefix', (prefix, ns) => {
this.onDataFn(quad) this.onPrefixFn(prefix, ns)
}).on('end', async () => { }).on('end', () => {
await this.onDataEndFn() this.onPrefixEndFn()
}); })
}) // Load data
.catch(error => { quadStream.on('data', quad => {
console.error('Error reading RDF data:', error); this.onDataFn(quad)
throw error }).on('end', async () => {
}); await this.onDataEndFn()
});
return result
} }
/** /**

View file

@ -13,9 +13,11 @@ import formatsPretty from '@rdfjs/formats/pretty.js'
import rdf from 'rdf-ext' import rdf from 'rdf-ext'
export async function readRDF(file_url, headers = { "Content-Type": "text/turtle" }) { export async function readRDF(file_url, headers = { "Content-Type": "text/turtle" }) {
const url = file_url;
try { try {
console.log(url)
var res = null var res = null
res = await fetch(file_url, res = await fetch(url,
{ {
formats, formats,
headers: headers headers: headers
@ -25,48 +27,36 @@ export async function readRDF(file_url, headers = { "Content-Type": "text/turtle
if (['text/plain', 'text/html'].indexOf(res.headers.get('content-type')) >= 0) { if (['text/plain', 'text/html'].indexOf(res.headers.get('content-type')) >= 0) {
// default to turtle // default to turtle
headers['Content-Type'] = 'text/turtle'; headers['Content-Type'] = 'text/turtle';
res = await fetch(file_url, { formats, headers }); res = await fetch(url, { formats, headers });
} }
if (res.ok) {
if (res.headers.get('content-type').indexOf('application/json') >= 0) { if (!res.ok) {
console.log(res.json()) // throw new Error(`readRDF error: ${res.statusText}`)
throw new Error(`readRDF error: cannot read json data`); const code = res.status || 'Unknown';
} const error = new Error(`readRDF error: HTTP ${code} from ${url}`);
const quadStream = await res.quadStream() error.status = code;
// quadStream.on('error', err => console.error(err)) error.url = url;
return quadStream error.response = res;
} else { throw error
throw new Error(`readRDF error:: ${res.statusText}`);
} }
if (res.headers.get('content-type').indexOf('application/json') >= 0) {
throw new Error(`readRDF error: reading json data is not supported`);
}
const quadStream = await res.quadStream()
return {
success: true,
quadStream,
url: url,
message: 'RDF data loaded successfully',
};
} catch (error) { } catch (error) {
console.error('readRDF error:', error); return {
throw error; success: false,
} error,
} url: url,
message: error.message,
};
export async function postRDF(endpoint, dataset, format = 'text/turtle', headers = {}, prefixes) {
try {
const rdfPretty = rdf.clone() // clone the default environment
rdfPretty.formats.import(formatsPretty) // import pretty print serializers
// Ensure we have the correct content-type
headers['Content-Type'] = format;
// Serialize the dataset to the desired format
const body = await rdfPretty.io.dataset.toText('text/turtle', dataset)
const response = await fetch(endpoint, {
method: 'POST',
formats,
headers,
body,
prefixes,
});
if (!response.ok) {
throw new Error(`postRDF error: ${response.statusText}`);
}
return response;
} catch (error) {
console.error('postRDF error:', error);
throw error;
} }
} }