Skip to content

Commit 29419ac

Browse files
authored
Support custom fetch function (#46)
1 parent 2accbad commit 29419ac

File tree

4 files changed

+107
-4
lines changed

4 files changed

+107
-4
lines changed

lib/RdfDereferencerBase.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import {IActorDereferenceRdfOutput} from "@comunica/bus-dereference-rdf";
22
import { ActionContext, Actor } from "@comunica/core";
33
import * as RDF from "@rdfjs/types";
44
import { MediatorDereferenceRdf } from '@comunica/bus-dereference-rdf';
5+
import { KeysHttp } from '@comunica/context-entries';
56

67
/**
78
* An RdfDerefencer can dereference URLs to RDF streams, using any RDF serialization.
@@ -21,9 +22,10 @@ export class RdfDereferencerBase<Q extends RDF.BaseQuad = RDF.Quad> {
2122
* @return {IActorRdfDereferenceOutput} The dereference output.
2223
*/
2324
public dereference(url: string, options: IDereferenceOptions = {}): Promise<IActorDereferenceRdfOutput> {
25+
const context = new ActionContext(options);
2426
// Delegate dereferencing to the mediator
2527
return this.mediatorDereferenceRdf.mediate({
26-
context: new ActionContext(options),
28+
context: typeof options.fetch === 'function' ? context.setDefault(KeysHttp.fetch, options.fetch) : context,
2729
headers: new Headers(options.headers),
2830
method: options.method,
2931
url,
@@ -47,6 +49,10 @@ export interface IDereferenceOptions {
4749
* This is not possible in browser environments.
4850
*/
4951
localFiles?: boolean;
52+
/**
53+
* The fetch function to use.
54+
*/
55+
fetch?: typeof fetch;
5056
}
5157

5258
export interface IRdfDerefencerArgs {

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
],
4444
"devDependencies": {
4545
"@comunica/runner": "^2.0.3",
46+
"@comunica/types": "^2.8.1",
4647
"@types/jest": "^27.0.0",
4748
"@types/n3": "^1.10.3",
4849
"arrayify-stream": "^1.0.0",
@@ -116,6 +117,7 @@
116117
"@comunica/bus-rdf-parse": "^2.0.1",
117118
"@comunica/bus-rdf-parse-html": "^2.0.1",
118119
"@comunica/config-query-sparql": "^2.0.1",
120+
"@comunica/context-entries": "^2.8.1",
119121
"@comunica/core": "^2.0.1",
120122
"@comunica/mediator-combine-pipeline": "^2.0.1",
121123
"@comunica/mediator-combine-union": "^2.0.1",

test/RdfDereferencer-test.ts

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,23 @@ let fetchOut: any;
1515
return fetchOut;
1616
});
1717

18-
const mockSetup = (options: { statusCode?: number, error?: boolean, body?: Readable, headers?: any, url?: string }) => {
18+
const getMock = (options: { statusCode?: number, error?: boolean, body?: Readable, headers?: any, url?: string }) => {
1919
if (options.error) {
20-
fetchOut = Promise.reject(new Error('fetch error'));
20+
return Promise.reject(new Error('fetch error'));
2121
} else {
22-
fetchOut = Promise.resolve({
22+
return Promise.resolve({
2323
url: options.url || 'http://example.org/',
2424
status: options.statusCode || 200,
2525
body: options.body,
2626
headers: new Headers(options.headers || {}),
2727
});
2828
}
2929
};
30+
31+
const mockSetup = (...args: Parameters<typeof getMock>) => {
32+
fetchOut = getMock(...args);
33+
};
34+
3035
mockSetup({ statusCode: 200 });
3136

3237
describe('dereferencer', () => {
@@ -66,6 +71,24 @@ describe('dereferencer', () => {
6671
]);
6772
});
6873

74+
it('should use custom fetch function when provided', async () => {
75+
const body = new Readable();
76+
body.push(`
77+
<http://ex.org/s> <http://ex.org/p> <http://ex.org/o1>, <http://ex.org/o2>.
78+
`);
79+
body.push(null);
80+
81+
const myFetch: typeof fetch = async (url) => getMock({ statusCode: 200, body, headers: { 'content-type': 'text/turtle' } }) as any;
82+
83+
const out = await dereferencer.dereference('http://example.org/', { fetch: myFetch });
84+
expect(out.metadata.triples).toBeTruthy();
85+
expect(out.url).toEqual('http://example.org/');
86+
return expect(arrayifyStream(out.data)).resolves.toBeRdfIsomorphic([
87+
quad('http://ex.org/s', 'http://ex.org/p', 'http://ex.org/o1'),
88+
quad('http://ex.org/s', 'http://ex.org/p', 'http://ex.org/o2'),
89+
]);
90+
});
91+
6992
it('should handle text/turtle responses by extension', async () => {
7093
const body = new Readable();
7194
body.push(`

yarn.lock

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -595,6 +595,17 @@
595595
jsonld-context-parser "^2.2.2"
596596
sparqlalgebrajs "^4.0.5"
597597

598+
"@comunica/context-entries@^2.8.1":
599+
version "2.8.1"
600+
resolved "https://registry.yarnpkg.com/@comunica/context-entries/-/context-entries-2.8.1.tgz#7f5af0e7079d93a2bc609e82bc2daec480b96338"
601+
integrity sha512-RjRgAehp9Ujaaqvm/5PJd11l4VHUNqrApV/6ZpjdPbWsJKdMo2mpjyjelEn48n2kid+TXK4a1iKF3lwH+mjRvw==
602+
dependencies:
603+
"@comunica/core" "^2.8.1"
604+
"@comunica/types" "^2.8.1"
605+
"@rdfjs/types" "*"
606+
jsonld-context-parser "^2.2.2"
607+
sparqlalgebrajs "^4.2.0"
608+
598609
"@comunica/core@^2.0.1":
599610
version "2.0.1"
600611
resolved "https://registry.yarnpkg.com/@comunica/core/-/core-2.0.1.tgz#69307bddb182f3402a948d605919c79d2bdbd641"
@@ -611,6 +622,14 @@
611622
"@comunica/types" "^2.6.0"
612623
immutable "^4.1.0"
613624

625+
"@comunica/core@^2.8.1":
626+
version "2.8.1"
627+
resolved "https://registry.yarnpkg.com/@comunica/core/-/core-2.8.1.tgz#80207da1bf03a49ed088522160f6d11d13663954"
628+
integrity sha512-/rcRdtM0chk6L1ZaZgz84HUbGkFGehR1uAM8Mj0UDfcSZjpV1qUedfF5ktmOA2Er3lz9DZ05Xotgxw6zivILWw==
629+
dependencies:
630+
"@comunica/types" "^2.8.1"
631+
immutable "^4.1.0"
632+
614633
"@comunica/mediator-combine-pipeline@^2.0.1":
615634
version "2.0.1"
616635
resolved "https://registry.yarnpkg.com/@comunica/mediator-combine-pipeline/-/mediator-combine-pipeline-2.0.1.tgz#afbd88b31405b39193807264ff1bf3b341e688ac"
@@ -675,6 +694,16 @@
675694
asynciterator "^3.8.0"
676695
sparqlalgebrajs "^4.0.5"
677696

697+
"@comunica/types@^2.8.1":
698+
version "2.8.1"
699+
resolved "https://registry.yarnpkg.com/@comunica/types/-/types-2.8.1.tgz#f0e81b78ac8767eddc9f03b2342389ff21ec959b"
700+
integrity sha512-uRBKBYpG1RVuQw8hfHHE1jdiCt6FTDeM2r4YqFY2OSOfxjrIDBYkcqsgod1m5sFs3l/P6CVVZG9w6uZ7876Y8w==
701+
dependencies:
702+
"@rdfjs/types" "*"
703+
"@types/yargs" "^17.0.13"
704+
asynciterator "^3.8.1"
705+
sparqlalgebrajs "^4.2.0"
706+
678707
"@dabh/diagnostics@^2.0.2":
679708
version "2.0.3"
680709
resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.3.tgz#7f7e97ee9a725dffc7808d93668cc984e1dc477a"
@@ -1458,6 +1487,11 @@ asynciterator@^3.8.0:
14581487
resolved "https://registry.yarnpkg.com/asynciterator/-/asynciterator-3.8.0.tgz#d9246a3d39ce2a9e4b020834d7f352adf35b49d8"
14591488
integrity sha512-bD34LqKHJnkB77MHjL3hOAUOcy9dbB+3lHvL+EiJpD3k2Nyq3i1dCk5adMisB2rwlrHVu/+XRhOdPZL9hzpsfw==
14601489

1490+
asynciterator@^3.8.1:
1491+
version "3.8.1"
1492+
resolved "https://registry.yarnpkg.com/asynciterator/-/asynciterator-3.8.1.tgz#80be735b252332494e186ee733544e5b21dd2123"
1493+
integrity sha512-SmdG0FUY3pYGOZZGdYq8Qb/DCRDXBFZUk08V1/4lbBXdAQvcC3Kxzz9FUDPBTik7VAVltt4cZirAPtJv3gOpEw==
1494+
14611495
asynckit@^0.4.0:
14621496
version "0.4.0"
14631497
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
@@ -3851,6 +3885,13 @@ rdf-data-factory@^1.1.1:
38513885
dependencies:
38523886
"@rdfjs/types" "*"
38533887

3888+
rdf-data-factory@^1.1.2:
3889+
version "1.1.2"
3890+
resolved "https://registry.yarnpkg.com/rdf-data-factory/-/rdf-data-factory-1.1.2.tgz#d47550d2649d0d64f8cae3fcc9efae7a8a895d9a"
3891+
integrity sha512-TfQD63Lokabd09ES1jAtKK8AA6rkr9rwyUBGo6olOt1CE0Um36CUQIqytyf0am2ouBPR0l7SaHxCiMcPGHkt1A==
3892+
dependencies:
3893+
"@rdfjs/types" "*"
3894+
38543895
rdf-isomorphic@^1.3.0:
38553896
version "1.3.0"
38563897
resolved "https://registry.yarnpkg.com/rdf-isomorphic/-/rdf-isomorphic-1.3.0.tgz#6a1ad38b27c5ebed8a5f752b15f81988f48f8e22"
@@ -3932,6 +3973,15 @@ rdf-string@^1.5.0, rdf-string@^1.6.0:
39323973
"@rdfjs/types" "*"
39333974
rdf-data-factory "^1.1.0"
39343975

3976+
rdf-terms@^1.10.0:
3977+
version "1.11.0"
3978+
resolved "https://registry.yarnpkg.com/rdf-terms/-/rdf-terms-1.11.0.tgz#0c2e3a2b43f1042959c9263af27dab08dc4b084d"
3979+
integrity sha512-iKlVgnMopRKl9pHVNrQrax7PtZKRCT/uJIgYqvuw1VVQb88zDvurtDr1xp0rt7N9JtKtFwUXoIQoEsjyRo20qQ==
3980+
dependencies:
3981+
"@rdfjs/types" "*"
3982+
rdf-data-factory "^1.1.0"
3983+
rdf-string "^1.6.0"
3984+
39353985
rdf-terms@^1.7.0:
39363986
version "1.7.1"
39373987
resolved "https://registry.yarnpkg.com/rdf-terms/-/rdf-terms-1.7.1.tgz#d53891b208b357ed4b7738134decd537130098e6"
@@ -4301,6 +4351,21 @@ sparqlalgebrajs@^4.0.5:
43014351
rdf-string "^1.6.0"
43024352
sparqljs "^3.6.1"
43034353

4354+
sparqlalgebrajs@^4.2.0:
4355+
version "4.2.0"
4356+
resolved "https://registry.yarnpkg.com/sparqlalgebrajs/-/sparqlalgebrajs-4.2.0.tgz#b70945bdd2ab2897a0bc22adb804dd1a2b0ec98c"
4357+
integrity sha512-tdlJdrvgQqgx9zubcl9iiyCxMOp4qRT2fs1Sne8X35QTm1Pj2ulB+gGEHunJJnw5FW7Uhtmw7J3px0sCmgJSbw==
4358+
dependencies:
4359+
"@rdfjs/types" "*"
4360+
"@types/sparqljs" "^3.1.3"
4361+
fast-deep-equal "^3.1.3"
4362+
minimist "^1.2.6"
4363+
rdf-data-factory "^1.1.0"
4364+
rdf-isomorphic "^1.3.0"
4365+
rdf-string "^1.6.0"
4366+
rdf-terms "^1.10.0"
4367+
sparqljs "^3.7.1"
4368+
43044369
sparqljs@^3.5.1:
43054370
version "3.5.1"
43064371
resolved "https://registry.yarnpkg.com/sparqljs/-/sparqljs-3.5.1.tgz#631cd4b5bcc3d9ce23c5313b3a158eccf858e28b"
@@ -4315,6 +4380,13 @@ sparqljs@^3.6.1:
43154380
dependencies:
43164381
rdf-data-factory "^1.1.1"
43174382

4383+
sparqljs@^3.7.1:
4384+
version "3.7.1"
4385+
resolved "https://registry.yarnpkg.com/sparqljs/-/sparqljs-3.7.1.tgz#5d121895d491d50214f2e38f2885a3a935b6c093"
4386+
integrity sha512-I1jYMtcwDkgCEqQ4eQuQIhB8hFAlRAJ6YDXDcV54XztaJaYRFqJlidHt77S3j8Mfh6kY6GK04dXPEIopxbEeuQ==
4387+
dependencies:
4388+
rdf-data-factory "^1.1.2"
4389+
43184390
spawn-sync@^1.0.15:
43194391
version "1.0.15"
43204392
resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.15.tgz#b00799557eb7fb0c8376c29d44e8a1ea67e57476"

0 commit comments

Comments
 (0)