@comunica/actor-query-source-identify-hypermedia 4.4.2-alpha.49.0 → 5.0.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/components/ActorQuerySourceIdentifyHypermedia.jsonld +16 -24
- package/components/QuerySourceHypermedia.jsonld +2 -2
- package/components/components.jsonld +1 -1
- package/components/context.jsonld +1 -1
- package/lib/ActorQuerySourceIdentifyHypermedia.d.ts +1 -1
- package/lib/ActorQuerySourceIdentifyHypermedia.js +14 -0
- package/lib/ActorQuerySourceIdentifyHypermedia.js.map +1 -1
- package/lib/LinkedRdfSourcesAsyncRdfIterator.d.ts +6 -1
- package/lib/LinkedRdfSourcesAsyncRdfIterator.js +14 -10
- package/lib/LinkedRdfSourcesAsyncRdfIterator.js.map +1 -1
- package/lib/MediatedLinkedRdfSourcesAsyncRdfIterator.js +5 -0
- package/lib/MediatedLinkedRdfSourcesAsyncRdfIterator.js.map +1 -1
- package/lib/QuerySourceHypermedia.d.ts +1 -1
- package/lib/QuerySourceHypermedia.js +27 -3
- package/lib/QuerySourceHypermedia.js.map +1 -1
- package/package.json +15 -15
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"@context": [
|
|
3
|
-
"https://linkedsoftwaredependencies.org/bundles/npm/@comunica/actor-query-source-identify-hypermedia/^
|
|
4
|
-
"https://linkedsoftwaredependencies.org/bundles/npm/@comunica/core/^
|
|
5
|
-
"https://linkedsoftwaredependencies.org/bundles/npm/@comunica/bus-query-source-identify/^
|
|
3
|
+
"https://linkedsoftwaredependencies.org/bundles/npm/@comunica/actor-query-source-identify-hypermedia/^5.0.0/components/context.jsonld",
|
|
4
|
+
"https://linkedsoftwaredependencies.org/bundles/npm/@comunica/core/^5.0.0/components/context.jsonld",
|
|
5
|
+
"https://linkedsoftwaredependencies.org/bundles/npm/@comunica/bus-query-source-identify/^5.0.0/components/context.jsonld"
|
|
6
6
|
],
|
|
7
7
|
"@id": "npmd:@comunica/actor-query-source-identify-hypermedia",
|
|
8
8
|
"components": [
|
|
@@ -29,15 +29,7 @@
|
|
|
29
29
|
},
|
|
30
30
|
{
|
|
31
31
|
"@id": "caqsih:components/ActorQuerySourceIdentifyHypermedia.jsonld#ActorQuerySourceIdentifyHypermedia_args_mediatorMetadataAccumulate",
|
|
32
|
-
"range":
|
|
33
|
-
"@type": "ParameterRangeUnion",
|
|
34
|
-
"parameterRangeElements": [
|
|
35
|
-
"cc:components/Mediator.jsonld#Mediator",
|
|
36
|
-
{
|
|
37
|
-
"@type": "ParameterRangeUndefined"
|
|
38
|
-
}
|
|
39
|
-
]
|
|
40
|
-
},
|
|
32
|
+
"range": "cc:components/Mediator.jsonld#Mediator",
|
|
41
33
|
"comment": "The metadata accumulate mediator"
|
|
42
34
|
},
|
|
43
35
|
{
|
|
@@ -80,37 +72,37 @@
|
|
|
80
72
|
"genericTypeInstances": [
|
|
81
73
|
{
|
|
82
74
|
"@type": "ParameterRangeGenericTypeReference",
|
|
83
|
-
"parameterRangeGenericType": "npmd:@comunica/actor-abstract-mediatyped/^
|
|
75
|
+
"parameterRangeGenericType": "npmd:@comunica/actor-abstract-mediatyped/^5.0.0/components/ActorAbstractMediaTyped.jsonld#ActorAbstractMediaTyped__generic_I"
|
|
84
76
|
},
|
|
85
77
|
{
|
|
86
78
|
"@type": "ParameterRangeGenericTypeReference",
|
|
87
|
-
"parameterRangeGenericType": "npmd:@comunica/actor-abstract-mediatyped/^
|
|
79
|
+
"parameterRangeGenericType": "npmd:@comunica/actor-abstract-mediatyped/^5.0.0/components/ActorAbstractMediaTyped.jsonld#ActorAbstractMediaTyped__generic_T"
|
|
88
80
|
},
|
|
89
81
|
{
|
|
90
82
|
"@type": "ParameterRangeGenericTypeReference",
|
|
91
|
-
"parameterRangeGenericType": "npmd:@comunica/actor-abstract-mediatyped/^
|
|
83
|
+
"parameterRangeGenericType": "npmd:@comunica/actor-abstract-mediatyped/^5.0.0/components/ActorAbstractMediaTyped.jsonld#ActorAbstractMediaTyped__generic_O"
|
|
92
84
|
},
|
|
93
85
|
{
|
|
94
86
|
"@type": "ParameterRangeGenericTypeReference",
|
|
95
|
-
"parameterRangeGenericType": "npmd:@comunica/actor-abstract-mediatyped/^
|
|
87
|
+
"parameterRangeGenericType": "npmd:@comunica/actor-abstract-mediatyped/^5.0.0/components/ActorAbstractMediaTyped.jsonld#ActorAbstractMediaTyped__generic_TS"
|
|
96
88
|
}
|
|
97
89
|
]
|
|
98
90
|
},
|
|
99
91
|
{
|
|
100
92
|
"@type": "ParameterRangeGenericTypeReference",
|
|
101
|
-
"parameterRangeGenericType": "npmd:@comunica/actor-abstract-mediatyped/^
|
|
93
|
+
"parameterRangeGenericType": "npmd:@comunica/actor-abstract-mediatyped/^5.0.0/components/ActorAbstractMediaTyped.jsonld#ActorAbstractMediaTyped__generic_I"
|
|
102
94
|
},
|
|
103
95
|
{
|
|
104
96
|
"@type": "ParameterRangeGenericTypeReference",
|
|
105
|
-
"parameterRangeGenericType": "npmd:@comunica/actor-abstract-mediatyped/^
|
|
97
|
+
"parameterRangeGenericType": "npmd:@comunica/actor-abstract-mediatyped/^5.0.0/components/ActorAbstractMediaTyped.jsonld#ActorAbstractMediaTyped__generic_T"
|
|
106
98
|
},
|
|
107
99
|
{
|
|
108
100
|
"@type": "ParameterRangeGenericTypeReference",
|
|
109
|
-
"parameterRangeGenericType": "npmd:@comunica/actor-abstract-mediatyped/^
|
|
101
|
+
"parameterRangeGenericType": "npmd:@comunica/actor-abstract-mediatyped/^5.0.0/components/ActorAbstractMediaTyped.jsonld#ActorAbstractMediaTyped__generic_O"
|
|
110
102
|
},
|
|
111
103
|
{
|
|
112
104
|
"@type": "ParameterRangeGenericTypeReference",
|
|
113
|
-
"parameterRangeGenericType": "npmd:@comunica/actor-abstract-mediatyped/^
|
|
105
|
+
"parameterRangeGenericType": "npmd:@comunica/actor-abstract-mediatyped/^5.0.0/components/ActorAbstractMediaTyped.jsonld#ActorAbstractMediaTyped__generic_TS"
|
|
114
106
|
}
|
|
115
107
|
]
|
|
116
108
|
},
|
|
@@ -147,19 +139,19 @@
|
|
|
147
139
|
"genericTypeInstances": [
|
|
148
140
|
{
|
|
149
141
|
"@type": "ParameterRangeGenericTypeReference",
|
|
150
|
-
"parameterRangeGenericType": "npmd:@comunica/actor-abstract-mediatyped/^
|
|
142
|
+
"parameterRangeGenericType": "npmd:@comunica/actor-abstract-mediatyped/^5.0.0/components/ActorAbstractMediaTyped.jsonld#ActorAbstractMediaTyped__generic_I"
|
|
151
143
|
},
|
|
152
144
|
{
|
|
153
145
|
"@type": "ParameterRangeGenericTypeReference",
|
|
154
|
-
"parameterRangeGenericType": "npmd:@comunica/actor-abstract-mediatyped/^
|
|
146
|
+
"parameterRangeGenericType": "npmd:@comunica/actor-abstract-mediatyped/^5.0.0/components/ActorAbstractMediaTyped.jsonld#ActorAbstractMediaTyped__generic_T"
|
|
155
147
|
},
|
|
156
148
|
{
|
|
157
149
|
"@type": "ParameterRangeGenericTypeReference",
|
|
158
|
-
"parameterRangeGenericType": "npmd:@comunica/actor-abstract-mediatyped/^
|
|
150
|
+
"parameterRangeGenericType": "npmd:@comunica/actor-abstract-mediatyped/^5.0.0/components/ActorAbstractMediaTyped.jsonld#ActorAbstractMediaTyped__generic_O"
|
|
159
151
|
},
|
|
160
152
|
{
|
|
161
153
|
"@type": "ParameterRangeGenericTypeReference",
|
|
162
|
-
"parameterRangeGenericType": "npmd:@comunica/actor-abstract-mediatyped/^
|
|
154
|
+
"parameterRangeGenericType": "npmd:@comunica/actor-abstract-mediatyped/^5.0.0/components/ActorAbstractMediaTyped.jsonld#ActorAbstractMediaTyped__generic_TS"
|
|
163
155
|
}
|
|
164
156
|
]
|
|
165
157
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"@context": [
|
|
3
|
-
"https://linkedsoftwaredependencies.org/bundles/npm/@comunica/actor-query-source-identify-hypermedia/^
|
|
4
|
-
"https://linkedsoftwaredependencies.org/bundles/npm/@comunica/core/^
|
|
3
|
+
"https://linkedsoftwaredependencies.org/bundles/npm/@comunica/actor-query-source-identify-hypermedia/^5.0.0/components/context.jsonld",
|
|
4
|
+
"https://linkedsoftwaredependencies.org/bundles/npm/@comunica/core/^5.0.0/components/context.jsonld"
|
|
5
5
|
],
|
|
6
6
|
"@id": "npmd:@comunica/actor-query-source-identify-hypermedia",
|
|
7
7
|
"components": [
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"@context": [
|
|
3
|
-
"https://linkedsoftwaredependencies.org/bundles/npm/@comunica/actor-query-source-identify-hypermedia/^
|
|
3
|
+
"https://linkedsoftwaredependencies.org/bundles/npm/@comunica/actor-query-source-identify-hypermedia/^5.0.0/components/context.jsonld"
|
|
4
4
|
],
|
|
5
5
|
"@id": "npmd:@comunica/actor-query-source-identify-hypermedia",
|
|
6
6
|
"@type": "Module",
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"https://linkedsoftwaredependencies.org/bundles/npm/componentsjs/^6.0.0/components/context.jsonld",
|
|
4
4
|
{
|
|
5
5
|
"npmd": "https://linkedsoftwaredependencies.org/bundles/npm/",
|
|
6
|
-
"caqsih": "npmd:@comunica/actor-query-source-identify-hypermedia/^
|
|
6
|
+
"caqsih": "npmd:@comunica/actor-query-source-identify-hypermedia/^5.0.0/",
|
|
7
7
|
"ActorQuerySourceIdentifyHypermedia": {
|
|
8
8
|
"@id": "caqsih:components/ActorQuerySourceIdentifyHypermedia.jsonld#ActorQuerySourceIdentifyHypermedia",
|
|
9
9
|
"@prefix": true,
|
|
@@ -36,7 +36,7 @@ export interface IActorQuerySourceIdentifyHypermediaArgs extends IActorQuerySour
|
|
|
36
36
|
/**
|
|
37
37
|
* The metadata accumulate mediator
|
|
38
38
|
*/
|
|
39
|
-
mediatorMetadataAccumulate
|
|
39
|
+
mediatorMetadataAccumulate: MediatorRdfMetadataAccumulate;
|
|
40
40
|
/**
|
|
41
41
|
* The mediator for resolving hypermedia sources
|
|
42
42
|
*/
|
|
@@ -10,8 +10,22 @@ const QuerySourceHypermedia_1 = require("./QuerySourceHypermedia");
|
|
|
10
10
|
* A comunica Hypermedia Query Source Identify Actor.
|
|
11
11
|
*/
|
|
12
12
|
class ActorQuerySourceIdentifyHypermedia extends bus_query_source_identify_1.ActorQuerySourceIdentify {
|
|
13
|
+
mediatorMetadataAccumulate;
|
|
14
|
+
mediatorQuerySourceDereferenceLink;
|
|
15
|
+
mediatorRdfResolveHypermediaLinks;
|
|
16
|
+
mediatorRdfResolveHypermediaLinksQueue;
|
|
17
|
+
mediatorMergeBindingsContext;
|
|
18
|
+
cacheSize;
|
|
19
|
+
maxIterators;
|
|
13
20
|
constructor(args) {
|
|
14
21
|
super(args);
|
|
22
|
+
this.mediatorMetadataAccumulate = args.mediatorMetadataAccumulate;
|
|
23
|
+
this.mediatorQuerySourceDereferenceLink = args.mediatorQuerySourceDereferenceLink;
|
|
24
|
+
this.mediatorRdfResolveHypermediaLinks = args.mediatorRdfResolveHypermediaLinks;
|
|
25
|
+
this.mediatorRdfResolveHypermediaLinksQueue = args.mediatorRdfResolveHypermediaLinksQueue;
|
|
26
|
+
this.mediatorMergeBindingsContext = args.mediatorMergeBindingsContext;
|
|
27
|
+
this.cacheSize = args.cacheSize;
|
|
28
|
+
this.maxIterators = args.maxIterators;
|
|
15
29
|
}
|
|
16
30
|
async test(action) {
|
|
17
31
|
if (typeof action.querySourceUnidentified.value !== 'string') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActorQuerySourceIdentifyHypermedia.js","sourceRoot":"","sources":["ActorQuerySourceIdentifyHypermedia.ts"],"names":[],"mappings":";;;AAEA,mFAA+E;AAS/E,+DAA0D;AAC1D,yCAAuE;AAGvE,6EAAmE;AACnE,mEAAgE;AAEhE;;GAEG;AACH,MAAa,kCAAmC,SAAQ,oDAAwB;
|
|
1
|
+
{"version":3,"file":"ActorQuerySourceIdentifyHypermedia.js","sourceRoot":"","sources":["ActorQuerySourceIdentifyHypermedia.ts"],"names":[],"mappings":";;;AAEA,mFAA+E;AAS/E,+DAA0D;AAC1D,yCAAuE;AAGvE,6EAAmE;AACnE,mEAAgE;AAEhE;;GAEG;AACH,MAAa,kCAAmC,SAAQ,oDAAwB;IAC9D,0BAA0B,CAAgC;IAC1D,kCAAkC,CAAqC;IACvE,iCAAiC,CAAoC;IACrE,sCAAsC,CAAyC;IAC/E,4BAA4B,CAA+B;IAC3D,SAAS,CAAS;IAClB,YAAY,CAAS;IAErC,YAAmB,IAA6C;QAC9D,KAAK,CAAC,IAAI,CAAC,CAAC;QACZ,IAAI,CAAC,0BAA0B,GAAG,IAAI,CAAC,0BAA0B,CAAC;QAClE,IAAI,CAAC,kCAAkC,GAAG,IAAI,CAAC,kCAAkC,CAAC;QAClF,IAAI,CAAC,iCAAiC,GAAG,IAAI,CAAC,iCAAiC,CAAC;QAChF,IAAI,CAAC,sCAAsC,GAAG,IAAI,CAAC,sCAAsC,CAAC;QAC1F,IAAI,CAAC,4BAA4B,GAAG,IAAI,CAAC,4BAA4B,CAAC;QACtE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;IACxC,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,MAAkC;QAClD,IAAI,OAAO,MAAM,CAAC,uBAAuB,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC7D,OAAO,IAAA,eAAQ,EAAC,GAAG,IAAI,CAAC,IAAI,gFAAgF,CAAC,CAAC;QAChH,CAAC;QACD,OAAO,IAAA,mBAAY,GAAE,CAAC;IACxB,CAAC;IAEM,KAAK,CAAC,GAAG,CAAC,MAAkC;QACjD,MAAM,kBAAkB,GAAG,MAAM,CAAC,uBAAuB,CAAC,OAAO,IAAI,IAAI,oBAAa,EAAE,CAAC;QACzF,MAAM,WAAW,GAAwB,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,+BAAa,CAAC,WAAW,CAAC,CAAC;QAC3F,OAAO;YACL,WAAW,EAAE;gBACX,MAAM,EAAE,IAAI,6CAAqB,CAC/B,IAAI,CAAC,SAAS,EACd,EAAE,GAAG,EAAW,MAAM,CAAC,uBAAuB,CAAC,KAAK,EAAE,eAAe,EAAE,MAAM,CAAC,uBAAuB,CAAC,IAAI,EAAE,EAC5G,IAAI,CAAC,YAAY,EACjB;oBACE,0BAA0B,EAAE,IAAI,CAAC,0BAA0B;oBAC3D,kCAAkC,EAAE,IAAI,CAAC,kCAAkC;oBAC3E,iCAAiC,EAAE,IAAI,CAAC,iCAAiC;oBACzE,sCAAsC,EAAE,IAAI,CAAC,sCAAsC;iBACpF,EACD,WAAW,EACX,MAAM,wCAAe,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,CAC7F;gBACD,OAAO,EAAE,kBAAkB;aAC5B;SACF,CAAC;IACJ,CAAC;CACF;AAjDD,gFAiDC","sourcesContent":["import type { MediatorMergeBindingsContext } from '@comunica/bus-merge-bindings-context';\nimport type { MediatorQuerySourceDereferenceLink } from '@comunica/bus-query-source-dereference-link';\nimport { ActorQuerySourceIdentify } from '@comunica/bus-query-source-identify';\nimport type {\n IActionQuerySourceIdentify,\n IActorQuerySourceIdentifyOutput,\n IActorQuerySourceIdentifyArgs,\n} from '@comunica/bus-query-source-identify';\nimport type { MediatorRdfMetadataAccumulate } from '@comunica/bus-rdf-metadata-accumulate';\nimport type { MediatorRdfResolveHypermediaLinks } from '@comunica/bus-rdf-resolve-hypermedia-links';\nimport type { MediatorRdfResolveHypermediaLinksQueue } from '@comunica/bus-rdf-resolve-hypermedia-links-queue';\nimport { KeysInitQuery } from '@comunica/context-entries';\nimport { ActionContext, failTest, passTestVoid } from '@comunica/core';\nimport type { IActorTest, TestResult } from '@comunica/core';\nimport type { ComunicaDataFactory } from '@comunica/types';\nimport { BindingsFactory } from '@comunica/utils-bindings-factory';\nimport { QuerySourceHypermedia } from './QuerySourceHypermedia';\n\n/**\n * A comunica Hypermedia Query Source Identify Actor.\n */\nexport class ActorQuerySourceIdentifyHypermedia extends ActorQuerySourceIdentify {\n public readonly mediatorMetadataAccumulate: MediatorRdfMetadataAccumulate;\n public readonly mediatorQuerySourceDereferenceLink: MediatorQuerySourceDereferenceLink;\n public readonly mediatorRdfResolveHypermediaLinks: MediatorRdfResolveHypermediaLinks;\n public readonly mediatorRdfResolveHypermediaLinksQueue: MediatorRdfResolveHypermediaLinksQueue;\n public readonly mediatorMergeBindingsContext: MediatorMergeBindingsContext;\n public readonly cacheSize: number;\n public readonly maxIterators: number;\n\n public constructor(args: IActorQuerySourceIdentifyHypermediaArgs) {\n super(args);\n this.mediatorMetadataAccumulate = args.mediatorMetadataAccumulate;\n this.mediatorQuerySourceDereferenceLink = args.mediatorQuerySourceDereferenceLink;\n this.mediatorRdfResolveHypermediaLinks = args.mediatorRdfResolveHypermediaLinks;\n this.mediatorRdfResolveHypermediaLinksQueue = args.mediatorRdfResolveHypermediaLinksQueue;\n this.mediatorMergeBindingsContext = args.mediatorMergeBindingsContext;\n this.cacheSize = args.cacheSize;\n this.maxIterators = args.maxIterators;\n }\n\n public async test(action: IActionQuerySourceIdentify): Promise<TestResult<IActorTest>> {\n if (typeof action.querySourceUnidentified.value !== 'string') {\n return failTest(`${this.name} requires a single query source with a URL value to be present in the context.`);\n }\n return passTestVoid();\n }\n\n public async run(action: IActionQuerySourceIdentify): Promise<IActorQuerySourceIdentifyOutput> {\n const querySourceContext = action.querySourceUnidentified.context ?? new ActionContext();\n const dataFactory: ComunicaDataFactory = action.context.getSafe(KeysInitQuery.dataFactory);\n return {\n querySource: {\n source: new QuerySourceHypermedia(\n this.cacheSize,\n { url: <string> action.querySourceUnidentified.value, forceSourceType: action.querySourceUnidentified.type },\n this.maxIterators,\n {\n mediatorMetadataAccumulate: this.mediatorMetadataAccumulate,\n mediatorQuerySourceDereferenceLink: this.mediatorQuerySourceDereferenceLink,\n mediatorRdfResolveHypermediaLinks: this.mediatorRdfResolveHypermediaLinks,\n mediatorRdfResolveHypermediaLinksQueue: this.mediatorRdfResolveHypermediaLinksQueue,\n },\n dataFactory,\n await BindingsFactory.create(this.mediatorMergeBindingsContext, action.context, dataFactory),\n ),\n context: querySourceContext,\n },\n };\n }\n}\n\nexport interface IActorQuerySourceIdentifyHypermediaArgs extends IActorQuerySourceIdentifyArgs {\n /**\n * The maximum number of entries in the LRU cache, set to 0 to disable.\n * @range {integer}\n * @default {100}\n */\n cacheSize: number;\n /**\n * The maximum number of links that can be followed in parallel.\n * @default {64}\n */\n maxIterators: number;\n /**\n * The metadata accumulate mediator\n */\n mediatorMetadataAccumulate: MediatorRdfMetadataAccumulate;\n /**\n * The mediator for resolving hypermedia sources\n */\n mediatorQuerySourceDereferenceLink: MediatorQuerySourceDereferenceLink;\n /**\n * The hypermedia links resolve mediator\n */\n mediatorRdfResolveHypermediaLinks: MediatorRdfResolveHypermediaLinks;\n /**\n * The hypermedia links queue resolve mediator\n */\n mediatorRdfResolveHypermediaLinksQueue: MediatorRdfResolveHypermediaLinksQueue;\n /**\n * A mediator for creating binding context merge handlers\n */\n mediatorMergeBindingsContext: MediatorMergeBindingsContext;\n}\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { IActionQuerySourceDereferenceLink } from '@comunica/bus-query-source-dereference-link';
|
|
2
|
+
import type { ILink, IQuerySource, IActionContext, MetadataBindings, IQueryBindingsOptions, ILinkQueue, ICachePolicy } from '@comunica/types';
|
|
2
3
|
import type { Algebra } from '@comunica/utils-algebra';
|
|
3
4
|
import type * as RDF from '@rdfjs/types';
|
|
4
5
|
import type { BufferedIteratorOptions } from 'asynciterator';
|
|
@@ -83,5 +84,9 @@ export interface ISourceState {
|
|
|
83
84
|
* All dataset identifiers that have been passed for this source.
|
|
84
85
|
*/
|
|
85
86
|
handledDatasets: Record<string, boolean>;
|
|
87
|
+
/**
|
|
88
|
+
* The cache policy of the request's response.
|
|
89
|
+
*/
|
|
90
|
+
cachePolicy?: ICachePolicy<IActionQuerySourceDereferenceLink>;
|
|
86
91
|
}
|
|
87
92
|
export type SourceStateGetter = (link: ILink, handledDatasets: Record<string, boolean>) => Promise<ISourceState>;
|
|
@@ -5,14 +5,21 @@ const context_entries_1 = require("@comunica/context-entries");
|
|
|
5
5
|
const utils_metadata_1 = require("@comunica/utils-metadata");
|
|
6
6
|
const asynciterator_1 = require("asynciterator");
|
|
7
7
|
class LinkedRdfSourcesAsyncRdfIterator extends asynciterator_1.BufferedIterator {
|
|
8
|
+
operation;
|
|
9
|
+
queryBindingsOptions;
|
|
10
|
+
context;
|
|
11
|
+
firstLink;
|
|
12
|
+
maxIterators;
|
|
13
|
+
sourceStateGetter;
|
|
14
|
+
started = false;
|
|
15
|
+
currentIterators = [];
|
|
16
|
+
iteratorsPendingCreation = 0;
|
|
17
|
+
iteratorsPendingTermination = 0;
|
|
18
|
+
// eslint-disable-next-line unicorn/no-useless-undefined
|
|
19
|
+
accumulatedMetadata = Promise.resolve(undefined);
|
|
20
|
+
preflightMetadata;
|
|
8
21
|
constructor(operation, queryBindingsOptions, context, firstLink, maxIterators, sourceStateGetter, options) {
|
|
9
22
|
super({ autoStart: false, ...options });
|
|
10
|
-
this.started = false;
|
|
11
|
-
this.currentIterators = [];
|
|
12
|
-
this.iteratorsPendingCreation = 0;
|
|
13
|
-
this.iteratorsPendingTermination = 0;
|
|
14
|
-
// eslint-disable-next-line unicorn/no-useless-undefined
|
|
15
|
-
this.accumulatedMetadata = Promise.resolve(undefined);
|
|
16
23
|
this._reading = false;
|
|
17
24
|
this.operation = operation;
|
|
18
25
|
this.queryBindingsOptions = queryBindingsOptions;
|
|
@@ -101,12 +108,9 @@ class LinkedRdfSourcesAsyncRdfIterator extends asynciterator_1.BufferedIterator
|
|
|
101
108
|
this.sourceStateGetter(this.firstLink, {})
|
|
102
109
|
.then((sourceState) => {
|
|
103
110
|
this.startIteratorsForNextUrls(sourceState.handledDatasets, false);
|
|
104
|
-
done();
|
|
105
111
|
});
|
|
106
112
|
}
|
|
107
|
-
|
|
108
|
-
done();
|
|
109
|
-
}
|
|
113
|
+
done();
|
|
110
114
|
}
|
|
111
115
|
else {
|
|
112
116
|
// The first time this is called, prepare the first source
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LinkedRdfSourcesAsyncRdfIterator.js","sourceRoot":"","sources":["LinkedRdfSourcesAsyncRdfIterator.ts"],"names":[],"mappings":"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","sourcesContent":["import { KeysStatistics } from '@comunica/context-entries';\nimport type {\n ILink,\n IQuerySource,\n IActionContext,\n MetadataBindings,\n IQueryBindingsOptions,\n IStatisticBase,\n ILinkQueue,\n} from '@comunica/types';\nimport type { Algebra } from '@comunica/utils-algebra';\nimport { MetadataValidationState } from '@comunica/utils-metadata';\nimport type * as RDF from '@rdfjs/types';\nimport type { AsyncIterator, BufferedIteratorOptions } from 'asynciterator';\nimport { BufferedIterator } from 'asynciterator';\n\nexport abstract class LinkedRdfSourcesAsyncRdfIterator extends BufferedIterator<RDF.Bindings> {\n protected readonly operation: Algebra.Operation;\n protected readonly queryBindingsOptions: IQueryBindingsOptions | undefined;\n protected readonly context: IActionContext;\n\n protected readonly firstLink: ILink;\n private readonly maxIterators: number;\n private readonly sourceStateGetter: SourceStateGetter;\n\n protected started = false;\n private readonly currentIterators: AsyncIterator<RDF.Bindings>[] = [];\n private iteratorsPendingCreation = 0;\n private iteratorsPendingTermination = 0;\n // eslint-disable-next-line unicorn/no-useless-undefined\n private accumulatedMetadata: Promise<MetadataBindings | undefined> = Promise.resolve(undefined);\n private preflightMetadata: Promise<MetadataBindings> | undefined;\n\n public constructor(\n operation: Algebra.Operation,\n queryBindingsOptions: IQueryBindingsOptions | undefined,\n context: IActionContext,\n firstLink: ILink,\n maxIterators: number,\n sourceStateGetter: SourceStateGetter,\n options?: BufferedIteratorOptions,\n ) {\n super({ autoStart: false, ...options });\n this._reading = false;\n this.operation = operation;\n this.queryBindingsOptions = queryBindingsOptions;\n this.context = context;\n this.firstLink = firstLink;\n this.maxIterators = maxIterators;\n this.sourceStateGetter = sourceStateGetter;\n\n if (this.maxIterators <= 0) {\n throw new Error(`LinkedRdfSourcesAsyncRdfIterator.maxIterators must be larger than zero, but got ${this.maxIterators}`);\n }\n }\n\n /**\n * Start filling the buffer of this iterator.\n */\n public kickstart(): void {\n if (!this.started) {\n this._fillBufferAsync();\n }\n }\n\n public override getProperty<P>(propertyName: string, callback?: (value: P) => void): P | undefined {\n if (propertyName === 'metadata' && !this.started) {\n // If the iterator has not started yet, forcefully fetch the metadata from the source without starting the\n // iterator. This way, we keep the iterator lazy.\n if (!this.preflightMetadata) {\n this.preflightMetadata = new Promise((resolve, reject) => {\n this.sourceStateGetter(this.firstLink, {})\n .then((sourceState) => {\n // Don't pass query options, as we don't want to consume any passed iterators\n const bindingsStream = sourceState.source.queryBindings(this.operation, this.context);\n bindingsStream.getProperty('metadata', (metadata: MetadataBindings) => {\n metadata.state = new MetadataValidationState();\n bindingsStream.destroy();\n this.accumulateMetadata(sourceState.metadata, metadata)\n .then((accumulatedMetadata) => {\n // Also merge fields that were not explicitly accumulated\n const returnMetadata = { ...sourceState.metadata, ...metadata, ...accumulatedMetadata };\n resolve(returnMetadata);\n })\n .catch(() => {\n resolve({\n ...sourceState.metadata,\n state: new MetadataValidationState(),\n });\n });\n });\n })\n .catch(reject);\n });\n }\n this.preflightMetadata\n .then(metadata => this.setProperty('metadata', metadata))\n .catch(e => this.emit('error', e));\n }\n return super.getProperty(propertyName, callback);\n }\n\n protected override _end(destroy?: boolean): void {\n // Close all running iterators\n for (const it of this.currentIterators) {\n it.destroy();\n }\n\n super._end(destroy);\n }\n\n /**\n * Get the internal link queue.\n * The returned instance must always be the same.\n */\n public abstract getLinkQueue(): Promise<ILinkQueue>;\n\n /**\n * Determine the links to be followed from the current source given its metadata.\n * @param metadata The metadata of a source.\n */\n protected abstract getSourceLinks(metadata: Record<string, any>, startSource: ISourceState): Promise<ILink[]>;\n\n public override _read(count: number, done: () => void): void {\n if (this.started) {\n // Read from all current iterators\n for (const iterator of this.currentIterators) {\n while (count > 0) {\n const read = iterator.read();\n if (read === null) {\n break;\n } else {\n count--;\n this._push(read);\n }\n }\n if (count <= 0) {\n break;\n }\n }\n\n // Schedule new iterators if needed\n if (count >= 0 && this.canStartNewIterator()) {\n // We can safely ignore skip catching the error, since we are guaranteed to have\n // successfully got the source for this.firstUrl before.\n // eslint-disable-next-line ts/no-floating-promises\n this.sourceStateGetter(this.firstLink, {})\n .then((sourceState) => {\n this.startIteratorsForNextUrls(sourceState.handledDatasets, false);\n done();\n });\n } else {\n done();\n }\n } else {\n // The first time this is called, prepare the first source\n this.started = true;\n\n // Await the source to be set, and start the source iterator\n this.sourceStateGetter(this.firstLink, {})\n .then((sourceState) => {\n this.startIterator(sourceState);\n done();\n })\n // Destroy should be async because it can be called before it is listened to\n .catch(error => setTimeout(() => this.destroy(error)));\n }\n }\n\n protected canStartNewIterator(): boolean {\n return (this.currentIterators.length + this.iteratorsPendingCreation + this.iteratorsPendingTermination) <\n this.maxIterators && (!this.canStartNewIteratorConsiderReadable() || !this.readable);\n }\n\n protected canStartNewIteratorConsiderReadable(): boolean {\n return true;\n }\n\n protected areIteratorsRunning(): boolean {\n return (this.currentIterators.length + this.iteratorsPendingCreation + this.iteratorsPendingTermination) > 0;\n }\n\n /**\n * Append the fields from appendingMetadata into accumulatedMetadata.\n * @param accumulatedMetadata The fields to append to.\n * @param appendingMetadata The fields to append.\n * @protected\n */\n protected abstract accumulateMetadata(\n accumulatedMetadata: MetadataBindings,\n appendingMetadata: MetadataBindings,\n ): Promise<MetadataBindings>;\n\n /**\n * Start a new iterator for the given source.\n * Once the iterator is done, it will either determine a new source, or it will close the linked iterator.\n * @param {ISourceState} startSource The start source state.\n */\n protected startIterator(startSource: ISourceState): void {\n // Delegate the quad pattern query to the given source\n try {\n const iterator = startSource.source.queryBindings(this.operation, this.context, this.queryBindingsOptions);\n this.currentIterators.push(iterator);\n let receivedEndEvent = false;\n let receivedMetadata = false;\n\n // Attach readers to the newly created iterator\n (<any>iterator)._destination = this;\n iterator.on('error', (error: Error) => this.destroy(error));\n iterator.on('readable', () => this._fillBuffer());\n iterator.on('end', () => {\n this.currentIterators.splice(this.currentIterators.indexOf(iterator), 1);\n\n // Indicate that this iterator still needs to flush its next-links.\n // Without this, the linked iterator could sometimes be closed before next-links are obtained.\n receivedEndEvent = true;\n if (!receivedMetadata) {\n this.iteratorsPendingTermination++;\n }\n\n // If the metadata was already received, handle the next URL in the queue\n if (receivedMetadata) {\n this.startIteratorsForNextUrls(startSource.handledDatasets, true);\n }\n });\n\n // Listen for the metadata of the source\n // The metadata property is guaranteed to be set\n iterator.getProperty('metadata', (metadata: MetadataBindings) => {\n // Accumulate the metadata object\n this.accumulatedMetadata = this.accumulatedMetadata\n .then(previousMetadata => (async() => {\n if (!previousMetadata) {\n previousMetadata = startSource.metadata;\n }\n return this.accumulateMetadata(previousMetadata, metadata);\n })()\n .then((accumulatedMetadata) => {\n // Also merge fields that were not explicitly accumulated\n const returnMetadata = { ...startSource.metadata, ...metadata, ...accumulatedMetadata };\n\n // Create new metadata state\n returnMetadata.state = new MetadataValidationState();\n\n // Emit metadata, and invalidate any metadata that was set before\n this.updateMetadata(returnMetadata);\n\n // Invalidate any preflight metadata\n if (this.preflightMetadata) {\n this.preflightMetadata\n .then(metadataIn => metadataIn.state.invalidate())\n .catch(() => {\n // Ignore errors\n });\n }\n\n // Determine next urls, which will eventually become a next-next source.\n this.getSourceLinks(returnMetadata, startSource)\n .then((nextUrls: ILink[]) => Promise.all(nextUrls))\n .then(async(nextUrls: ILink[]) => {\n // Append all next URLs to our queue\n const linkQueue = await this.getLinkQueue();\n for (const nextUrl of nextUrls) {\n linkQueue.push(nextUrl, startSource.link);\n }\n\n receivedMetadata = true;\n if (receivedEndEvent) {\n this.iteratorsPendingTermination--;\n }\n\n this.startIteratorsForNextUrls(startSource.handledDatasets, true);\n }).catch(error => this.destroy(error));\n\n return returnMetadata;\n })).catch((error) => {\n this.destroy(error);\n return <MetadataBindings>{};\n });\n });\n } catch (syncError: unknown) {\n this.destroy(<Error> syncError);\n }\n }\n\n protected updateMetadata(metadataNew: MetadataBindings): void {\n const metadataToInvalidate = this.getProperty<MetadataBindings>('metadata');\n this.setProperty('metadata', metadataNew);\n metadataToInvalidate?.state.invalidate();\n }\n\n protected isRunning(): boolean {\n return !this.done;\n }\n\n /**\n * Check if a next URL is in the queue.\n * If yes, start a new iterator.\n * If no, close this iterator.\n * @param handledDatasets\n * @param canClose\n */\n protected startIteratorsForNextUrls(handledDatasets: Record<string, boolean>, canClose: boolean): void {\n this.getLinkQueue()\n .then((linkQueue) => {\n // Create as many new iterators as possible\n while (this.canStartNewIterator() && this.isRunning()) {\n const nextLink = linkQueue.pop();\n if (nextLink) {\n this.iteratorsPendingCreation++;\n this.sourceStateGetter(nextLink, handledDatasets)\n .then((nextSourceState) => {\n // If we find a statistic tracking dereference events we emit the relevant data\n const statisticDereferenceLinks: IStatisticBase<ILink> | undefined = this.context.get(\n KeysStatistics.dereferencedLinks,\n );\n if (statisticDereferenceLinks) {\n statisticDereferenceLinks.updateStatistic(\n {\n url: nextSourceState.link.url,\n metadata: { ...nextSourceState.metadata, ...nextSourceState.link.metadata },\n },\n nextSourceState.source,\n );\n }\n\n this.iteratorsPendingCreation--;\n this.startIterator(nextSourceState);\n })\n .catch(error => this.emit('error', error));\n } else {\n break;\n }\n }\n\n // Close, only if no other iterators are still running\n if (canClose && this.isCloseable(linkQueue, true)) {\n this.close();\n }\n })\n .catch(error => this.destroy(error));\n }\n\n protected isCloseable(linkQueue: ILinkQueue, _requireQueueEmpty: boolean): boolean {\n return linkQueue.isEmpty() && !this.areIteratorsRunning();\n }\n}\n\n/**\n * The current state of a source.\n * This is needed for following links within a source.\n */\nexport interface ISourceState {\n /**\n * The link to this source.\n */\n link: ILink;\n /**\n * A source.\n */\n source: IQuerySource;\n /**\n * The source's initial metadata.\n */\n metadata: MetadataBindings;\n /**\n * All dataset identifiers that have been passed for this source.\n */\n handledDatasets: Record<string, boolean>;\n}\n\nexport type SourceStateGetter = (link: ILink, handledDatasets: Record<string, boolean>) => Promise<ISourceState>;\n"]}
|
|
1
|
+
{"version":3,"file":"LinkedRdfSourcesAsyncRdfIterator.js","sourceRoot":"","sources":["LinkedRdfSourcesAsyncRdfIterator.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IActionQuerySourceDereferenceLink } from '@comunica/bus-query-source-dereference-link';\nimport { KeysStatistics } from '@comunica/context-entries';\nimport type {\n ILink,\n IQuerySource,\n IActionContext,\n MetadataBindings,\n IQueryBindingsOptions,\n IStatisticBase,\n ILinkQueue,\n ICachePolicy,\n} from '@comunica/types';\nimport type { Algebra } from '@comunica/utils-algebra';\nimport { MetadataValidationState } from '@comunica/utils-metadata';\nimport type * as RDF from '@rdfjs/types';\nimport type { AsyncIterator, BufferedIteratorOptions } from 'asynciterator';\nimport { BufferedIterator } from 'asynciterator';\n\nexport abstract class LinkedRdfSourcesAsyncRdfIterator extends BufferedIterator<RDF.Bindings> {\n protected readonly operation: Algebra.Operation;\n protected readonly queryBindingsOptions: IQueryBindingsOptions | undefined;\n protected readonly context: IActionContext;\n\n protected readonly firstLink: ILink;\n private readonly maxIterators: number;\n private readonly sourceStateGetter: SourceStateGetter;\n\n protected started = false;\n private readonly currentIterators: AsyncIterator<RDF.Bindings>[] = [];\n private iteratorsPendingCreation = 0;\n private iteratorsPendingTermination = 0;\n // eslint-disable-next-line unicorn/no-useless-undefined\n private accumulatedMetadata: Promise<MetadataBindings | undefined> = Promise.resolve(undefined);\n private preflightMetadata: Promise<MetadataBindings> | undefined;\n\n public constructor(\n operation: Algebra.Operation,\n queryBindingsOptions: IQueryBindingsOptions | undefined,\n context: IActionContext,\n firstLink: ILink,\n maxIterators: number,\n sourceStateGetter: SourceStateGetter,\n options?: BufferedIteratorOptions,\n ) {\n super({ autoStart: false, ...options });\n this._reading = false;\n this.operation = operation;\n this.queryBindingsOptions = queryBindingsOptions;\n this.context = context;\n this.firstLink = firstLink;\n this.maxIterators = maxIterators;\n this.sourceStateGetter = sourceStateGetter;\n\n if (this.maxIterators <= 0) {\n throw new Error(`LinkedRdfSourcesAsyncRdfIterator.maxIterators must be larger than zero, but got ${this.maxIterators}`);\n }\n }\n\n /**\n * Start filling the buffer of this iterator.\n */\n public kickstart(): void {\n if (!this.started) {\n this._fillBufferAsync();\n }\n }\n\n public override getProperty<P>(propertyName: string, callback?: (value: P) => void): P | undefined {\n if (propertyName === 'metadata' && !this.started) {\n // If the iterator has not started yet, forcefully fetch the metadata from the source without starting the\n // iterator. This way, we keep the iterator lazy.\n if (!this.preflightMetadata) {\n this.preflightMetadata = new Promise((resolve, reject) => {\n this.sourceStateGetter(this.firstLink, {})\n .then((sourceState) => {\n // Don't pass query options, as we don't want to consume any passed iterators\n const bindingsStream = sourceState.source.queryBindings(this.operation, this.context);\n bindingsStream.getProperty('metadata', (metadata: MetadataBindings) => {\n metadata.state = new MetadataValidationState();\n bindingsStream.destroy();\n this.accumulateMetadata(sourceState.metadata, metadata)\n .then((accumulatedMetadata) => {\n // Also merge fields that were not explicitly accumulated\n const returnMetadata = { ...sourceState.metadata, ...metadata, ...accumulatedMetadata };\n resolve(returnMetadata);\n })\n .catch(() => {\n resolve({\n ...sourceState.metadata,\n state: new MetadataValidationState(),\n });\n });\n });\n })\n .catch(reject);\n });\n }\n this.preflightMetadata\n .then(metadata => this.setProperty('metadata', metadata))\n .catch(e => this.emit('error', e));\n }\n return super.getProperty(propertyName, callback);\n }\n\n protected override _end(destroy?: boolean): void {\n // Close all running iterators\n for (const it of this.currentIterators) {\n it.destroy();\n }\n\n super._end(destroy);\n }\n\n /**\n * Get the internal link queue.\n * The returned instance must always be the same.\n */\n public abstract getLinkQueue(): Promise<ILinkQueue>;\n\n /**\n * Determine the links to be followed from the current source given its metadata.\n * @param metadata The metadata of a source.\n */\n protected abstract getSourceLinks(metadata: Record<string, any>, startSource: ISourceState): Promise<ILink[]>;\n\n public override _read(count: number, done: () => void): void {\n if (this.started) {\n // Read from all current iterators\n for (const iterator of this.currentIterators) {\n while (count > 0) {\n const read = iterator.read();\n if (read === null) {\n break;\n } else {\n count--;\n this._push(read);\n }\n }\n if (count <= 0) {\n break;\n }\n }\n\n // Schedule new iterators if needed\n if (count >= 0 && this.canStartNewIterator()) {\n // We can safely ignore skip catching the error, since we are guaranteed to have\n // successfully got the source for this.firstUrl before.\n // eslint-disable-next-line ts/no-floating-promises\n this.sourceStateGetter(this.firstLink, {})\n .then((sourceState) => {\n this.startIteratorsForNextUrls(sourceState.handledDatasets, false);\n });\n }\n done();\n } else {\n // The first time this is called, prepare the first source\n this.started = true;\n\n // Await the source to be set, and start the source iterator\n this.sourceStateGetter(this.firstLink, {})\n .then((sourceState) => {\n this.startIterator(sourceState);\n done();\n })\n // Destroy should be async because it can be called before it is listened to\n .catch(error => setTimeout(() => this.destroy(error)));\n }\n }\n\n protected canStartNewIterator(): boolean {\n return (this.currentIterators.length + this.iteratorsPendingCreation + this.iteratorsPendingTermination) <\n this.maxIterators && (!this.canStartNewIteratorConsiderReadable() || !this.readable);\n }\n\n protected canStartNewIteratorConsiderReadable(): boolean {\n return true;\n }\n\n protected areIteratorsRunning(): boolean {\n return (this.currentIterators.length + this.iteratorsPendingCreation + this.iteratorsPendingTermination) > 0;\n }\n\n /**\n * Append the fields from appendingMetadata into accumulatedMetadata.\n * @param accumulatedMetadata The fields to append to.\n * @param appendingMetadata The fields to append.\n * @protected\n */\n protected abstract accumulateMetadata(\n accumulatedMetadata: MetadataBindings,\n appendingMetadata: MetadataBindings,\n ): Promise<MetadataBindings>;\n\n /**\n * Start a new iterator for the given source.\n * Once the iterator is done, it will either determine a new source, or it will close the linked iterator.\n * @param {ISourceState} startSource The start source state.\n */\n protected startIterator(startSource: ISourceState): void {\n // Delegate the quad pattern query to the given source\n try {\n const iterator = startSource.source.queryBindings(this.operation, this.context, this.queryBindingsOptions);\n this.currentIterators.push(iterator);\n let receivedEndEvent = false;\n let receivedMetadata = false;\n\n // Attach readers to the newly created iterator\n (<any>iterator)._destination = this;\n iterator.on('error', (error: Error) => this.destroy(error));\n iterator.on('readable', () => this._fillBuffer());\n iterator.on('end', () => {\n this.currentIterators.splice(this.currentIterators.indexOf(iterator), 1);\n\n // Indicate that this iterator still needs to flush its next-links.\n // Without this, the linked iterator could sometimes be closed before next-links are obtained.\n receivedEndEvent = true;\n if (!receivedMetadata) {\n this.iteratorsPendingTermination++;\n }\n\n // If the metadata was already received, handle the next URL in the queue\n if (receivedMetadata) {\n this.startIteratorsForNextUrls(startSource.handledDatasets, true);\n }\n });\n\n // Listen for the metadata of the source\n // The metadata property is guaranteed to be set\n iterator.getProperty('metadata', (metadata: MetadataBindings) => {\n // Accumulate the metadata object\n this.accumulatedMetadata = this.accumulatedMetadata\n .then(previousMetadata => (async() => {\n if (!previousMetadata) {\n previousMetadata = startSource.metadata;\n }\n return this.accumulateMetadata(previousMetadata, metadata);\n })()\n .then((accumulatedMetadata) => {\n // Also merge fields that were not explicitly accumulated\n const returnMetadata = { ...startSource.metadata, ...metadata, ...accumulatedMetadata };\n\n // Create new metadata state\n returnMetadata.state = new MetadataValidationState();\n\n // Emit metadata, and invalidate any metadata that was set before\n this.updateMetadata(returnMetadata);\n\n // Invalidate any preflight metadata\n if (this.preflightMetadata) {\n this.preflightMetadata\n .then(metadataIn => metadataIn.state.invalidate())\n .catch(() => {\n // Ignore errors\n });\n }\n\n // Determine next urls, which will eventually become a next-next source.\n this.getSourceLinks(returnMetadata, startSource)\n .then((nextUrls: ILink[]) => Promise.all(nextUrls))\n .then(async(nextUrls: ILink[]) => {\n // Append all next URLs to our queue\n const linkQueue = await this.getLinkQueue();\n for (const nextUrl of nextUrls) {\n linkQueue.push(nextUrl, startSource.link);\n }\n\n receivedMetadata = true;\n if (receivedEndEvent) {\n this.iteratorsPendingTermination--;\n }\n\n this.startIteratorsForNextUrls(startSource.handledDatasets, true);\n }).catch(error => this.destroy(error));\n\n return returnMetadata;\n })).catch((error) => {\n this.destroy(error);\n return <MetadataBindings>{};\n });\n });\n } catch (syncError: unknown) {\n this.destroy(<Error> syncError);\n }\n }\n\n protected updateMetadata(metadataNew: MetadataBindings): void {\n const metadataToInvalidate = this.getProperty<MetadataBindings>('metadata');\n this.setProperty('metadata', metadataNew);\n metadataToInvalidate?.state.invalidate();\n }\n\n protected isRunning(): boolean {\n return !this.done;\n }\n\n /**\n * Check if a next URL is in the queue.\n * If yes, start a new iterator.\n * If no, close this iterator.\n * @param handledDatasets\n * @param canClose\n */\n protected startIteratorsForNextUrls(handledDatasets: Record<string, boolean>, canClose: boolean): void {\n this.getLinkQueue()\n .then((linkQueue) => {\n // Create as many new iterators as possible\n while (this.canStartNewIterator() && this.isRunning()) {\n const nextLink = linkQueue.pop();\n if (nextLink) {\n this.iteratorsPendingCreation++;\n this.sourceStateGetter(nextLink, handledDatasets)\n .then((nextSourceState) => {\n // If we find a statistic tracking dereference events we emit the relevant data\n const statisticDereferenceLinks: IStatisticBase<ILink> | undefined = this.context.get(\n KeysStatistics.dereferencedLinks,\n );\n if (statisticDereferenceLinks) {\n statisticDereferenceLinks.updateStatistic(\n {\n url: nextSourceState.link.url,\n metadata: { ...nextSourceState.metadata, ...nextSourceState.link.metadata },\n },\n nextSourceState.source,\n );\n }\n\n this.iteratorsPendingCreation--;\n this.startIterator(nextSourceState);\n })\n .catch(error => this.emit('error', error));\n } else {\n break;\n }\n }\n\n // Close, only if no other iterators are still running\n if (canClose && this.isCloseable(linkQueue, true)) {\n this.close();\n }\n })\n .catch(error => this.destroy(error));\n }\n\n protected isCloseable(linkQueue: ILinkQueue, _requireQueueEmpty: boolean): boolean {\n return linkQueue.isEmpty() && !this.areIteratorsRunning();\n }\n}\n\n/**\n * The current state of a source.\n * This is needed for following links within a source.\n */\nexport interface ISourceState {\n /**\n * The link to this source.\n */\n link: ILink;\n /**\n * A source.\n */\n source: IQuerySource;\n /**\n * The source's initial metadata.\n */\n metadata: MetadataBindings;\n /**\n * All dataset identifiers that have been passed for this source.\n */\n handledDatasets: Record<string, boolean>;\n /**\n * The cache policy of the request's response.\n */\n cachePolicy?: ICachePolicy<IActionQuerySourceDereferenceLink>;\n}\n\nexport type SourceStateGetter = (link: ILink, handledDatasets: Record<string, boolean>) => Promise<ISourceState>;\n"]}
|
|
@@ -10,6 +10,11 @@ const LinkedRdfSourcesAsyncRdfIterator_1 = require("./LinkedRdfSourcesAsyncRdfIt
|
|
|
10
10
|
* @see LinkedRdfSourcesAsyncRdfIterator
|
|
11
11
|
*/
|
|
12
12
|
class MediatedLinkedRdfSourcesAsyncRdfIterator extends LinkedRdfSourcesAsyncRdfIterator_1.LinkedRdfSourcesAsyncRdfIterator {
|
|
13
|
+
mediatorMetadataAccumulate;
|
|
14
|
+
mediatorRdfResolveHypermediaLinks;
|
|
15
|
+
mediatorRdfResolveHypermediaLinksQueue;
|
|
16
|
+
handledUrls;
|
|
17
|
+
linkQueue;
|
|
13
18
|
constructor(operation, queryBindingsOptions, context, firstLink, maxIterators, sourceStateGetter, mediatorMetadataAccumulate, mediatorRdfResolveHypermediaLinks, mediatorRdfResolveHypermediaLinksQueue) {
|
|
14
19
|
super(operation, queryBindingsOptions, context, firstLink, maxIterators, sourceStateGetter);
|
|
15
20
|
this.mediatorMetadataAccumulate = mediatorMetadataAccumulate;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MediatedLinkedRdfSourcesAsyncRdfIterator.js","sourceRoot":"","sources":["MediatedLinkedRdfSourcesAsyncRdfIterator.ts"],"names":[],"mappings":";;;AAGA,+DAA2D;AAY3D,yFAAsF;AAEtF;;;;;GAKG;AACH,MAAa,wCAAyC,SAAQ,mEAAgC;
|
|
1
|
+
{"version":3,"file":"MediatedLinkedRdfSourcesAsyncRdfIterator.js","sourceRoot":"","sources":["MediatedLinkedRdfSourcesAsyncRdfIterator.ts"],"names":[],"mappings":"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","sourcesContent":["import type { MediatorRdfMetadataAccumulate } from '@comunica/bus-rdf-metadata-accumulate';\nimport type { MediatorRdfResolveHypermediaLinks } from '@comunica/bus-rdf-resolve-hypermedia-links';\nimport type { MediatorRdfResolveHypermediaLinksQueue } from '@comunica/bus-rdf-resolve-hypermedia-links-queue';\nimport { KeysStatistics } from '@comunica/context-entries';\nimport type {\n IActionContext,\n IQueryBindingsOptions,\n MetadataBindings,\n ILink,\n IStatisticBase,\n IDiscoverEventData,\n ILinkQueue,\n} from '@comunica/types';\nimport type { Algebra } from '@comunica/utils-algebra';\nimport type { SourceStateGetter, ISourceState } from './LinkedRdfSourcesAsyncRdfIterator';\nimport { LinkedRdfSourcesAsyncRdfIterator } from './LinkedRdfSourcesAsyncRdfIterator';\n\n/**\n * A quad iterator that can iterate over consecutive RDF sources\n * that are determined using the rdf-resolve-hypermedia-links bus.\n *\n * @see LinkedRdfSourcesAsyncRdfIterator\n */\nexport class MediatedLinkedRdfSourcesAsyncRdfIterator extends LinkedRdfSourcesAsyncRdfIterator {\n private readonly mediatorMetadataAccumulate: MediatorRdfMetadataAccumulate;\n private readonly mediatorRdfResolveHypermediaLinks: MediatorRdfResolveHypermediaLinks;\n private readonly mediatorRdfResolveHypermediaLinksQueue: MediatorRdfResolveHypermediaLinksQueue;\n private readonly handledUrls: Record<string, boolean>;\n private linkQueue: Promise<ILinkQueue> | undefined;\n\n public constructor(\n operation: Algebra.Operation,\n queryBindingsOptions: IQueryBindingsOptions | undefined,\n context: IActionContext,\n firstLink: ILink,\n maxIterators: number,\n sourceStateGetter: SourceStateGetter,\n mediatorMetadataAccumulate: MediatorRdfMetadataAccumulate,\n mediatorRdfResolveHypermediaLinks: MediatorRdfResolveHypermediaLinks,\n mediatorRdfResolveHypermediaLinksQueue: MediatorRdfResolveHypermediaLinksQueue,\n ) {\n super(\n operation,\n queryBindingsOptions,\n context,\n firstLink,\n maxIterators,\n sourceStateGetter,\n );\n this.mediatorMetadataAccumulate = mediatorMetadataAccumulate;\n this.mediatorRdfResolveHypermediaLinks = mediatorRdfResolveHypermediaLinks;\n this.mediatorRdfResolveHypermediaLinksQueue = mediatorRdfResolveHypermediaLinksQueue;\n this.handledUrls = { [firstLink.url]: true };\n }\n\n protected override isCloseable(linkQueue: ILinkQueue, requireQueueEmpty: boolean): boolean {\n return (requireQueueEmpty ? linkQueue.isEmpty() : linkQueue.isEmpty()) && !this.areIteratorsRunning();\n }\n\n public getLinkQueue(): Promise<ILinkQueue> {\n if (!this.linkQueue) {\n this.linkQueue = this.mediatorRdfResolveHypermediaLinksQueue\n .mediate({ context: this.context })\n .then(result => result.linkQueue);\n }\n return this.linkQueue;\n }\n\n protected async getSourceLinks(metadata: Record<string, any>, startSource: ISourceState): Promise<ILink[]> {\n try {\n const { links } = await this.mediatorRdfResolveHypermediaLinks.mediate({ context: this.context, metadata });\n // Update discovery event statistic if available\n const traversalTracker: IStatisticBase<IDiscoverEventData> | undefined =\n this.context.get(KeysStatistics.discoveredLinks);\n if (traversalTracker) {\n for (const link of links) {\n traversalTracker.updateStatistic({ url: link.url, metadata: { ...link.metadata }}, startSource.link);\n }\n }\n\n // Filter URLs to avoid cyclic next-page loops\n return links.filter((link) => {\n if (this.handledUrls[link.url]) {\n return false;\n }\n this.handledUrls[link.url] = true;\n return true;\n });\n } catch {\n // No next URLs may be available, for example when we've reached the end of a Hydra next-page sequence.\n return [];\n }\n }\n\n public async accumulateMetadata(\n accumulatedMetadata: MetadataBindings,\n appendingMetadata: MetadataBindings,\n ): Promise<MetadataBindings> {\n return <MetadataBindings> (await this.mediatorMetadataAccumulate.mediate({\n mode: 'append',\n accumulatedMetadata,\n appendingMetadata,\n context: this.context,\n })).metadata;\n }\n}\n"]}
|
|
@@ -42,7 +42,7 @@ export declare class QuerySourceHypermedia implements IQuerySource {
|
|
|
42
42
|
* @param handledDatasets A hash of dataset identifiers that have already been handled.
|
|
43
43
|
* @param context The action context.
|
|
44
44
|
*/
|
|
45
|
-
|
|
45
|
+
getSourceCached(link: ILink, handledDatasets: Record<string, boolean>, context: IActionContext): Promise<ISourceState>;
|
|
46
46
|
toString(): string;
|
|
47
47
|
}
|
|
48
48
|
export interface IMediatorArgs {
|
|
@@ -5,6 +5,17 @@ const asynciterator_1 = require("asynciterator");
|
|
|
5
5
|
const lru_cache_1 = require("lru-cache");
|
|
6
6
|
const MediatedLinkedRdfSourcesAsyncRdfIterator_1 = require("./MediatedLinkedRdfSourcesAsyncRdfIterator");
|
|
7
7
|
class QuerySourceHypermedia {
|
|
8
|
+
referenceValue;
|
|
9
|
+
firstLink;
|
|
10
|
+
mediators;
|
|
11
|
+
dataFactory;
|
|
12
|
+
bindingsFactory;
|
|
13
|
+
/**
|
|
14
|
+
* A cache for source URLs to source states.
|
|
15
|
+
*/
|
|
16
|
+
sourcesState;
|
|
17
|
+
cacheSize;
|
|
18
|
+
maxIterators;
|
|
8
19
|
constructor(cacheSize, firstUrl, maxIterators, mediators, dataFactory, bindingsFactory) {
|
|
9
20
|
this.referenceValue = firstUrl.url;
|
|
10
21
|
this.cacheSize = cacheSize;
|
|
@@ -53,12 +64,12 @@ class QuerySourceHypermedia {
|
|
|
53
64
|
* @param context The action context.
|
|
54
65
|
*/
|
|
55
66
|
async getSource(link, handledDatasets, context) {
|
|
56
|
-
const { source, metadata } = await this.mediators.mediatorQuerySourceDereferenceLink.mediate({
|
|
67
|
+
const { source, metadata, cachePolicy } = await this.mediators.mediatorQuerySourceDereferenceLink.mediate({
|
|
57
68
|
link,
|
|
58
69
|
handledDatasets,
|
|
59
70
|
context,
|
|
60
71
|
});
|
|
61
|
-
return { link, source, metadata, handledDatasets };
|
|
72
|
+
return { link, source, metadata, handledDatasets, cachePolicy };
|
|
62
73
|
}
|
|
63
74
|
/**
|
|
64
75
|
* Resolve a source for the given URL.
|
|
@@ -70,7 +81,20 @@ class QuerySourceHypermedia {
|
|
|
70
81
|
getSourceCached(link, handledDatasets, context) {
|
|
71
82
|
let source = this.sourcesState.get(link.url);
|
|
72
83
|
if (source) {
|
|
73
|
-
return
|
|
84
|
+
return (async () => {
|
|
85
|
+
// Check if cache policy is still valid
|
|
86
|
+
const sourceMaterialized = await source;
|
|
87
|
+
if (sourceMaterialized.cachePolicy &&
|
|
88
|
+
!await sourceMaterialized.cachePolicy?.satisfiesWithoutRevalidation({ link, context })) {
|
|
89
|
+
// If it's not valid, delete cache entry, and re-fetch immediately
|
|
90
|
+
// LIMITATION: we're not sending re-validation requests. So if the server sends a 304, we will perform a new
|
|
91
|
+
// request and re-index the source. If an HTTP-level cache is active, the actual HTTP request will not be
|
|
92
|
+
// sent, so only local re-indexing will happen, which is negligible in most cases.
|
|
93
|
+
this.sourcesState.delete(link.url);
|
|
94
|
+
return this.getSourceCached(link, handledDatasets, context);
|
|
95
|
+
}
|
|
96
|
+
return sourceMaterialized;
|
|
97
|
+
})();
|
|
74
98
|
}
|
|
75
99
|
source = this.getSource(link, handledDatasets, context);
|
|
76
100
|
this.sourcesState.set(link.url, source);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QuerySourceHypermedia.js","sourceRoot":"","sources":["QuerySourceHypermedia.ts"],"names":[],"mappings":"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","sourcesContent":["import type { MediatorQuerySourceDereferenceLink } from '@comunica/bus-query-source-dereference-link';\nimport type { MediatorRdfMetadataAccumulate } from '@comunica/bus-rdf-metadata-accumulate';\nimport type { MediatorRdfResolveHypermediaLinks } from '@comunica/bus-rdf-resolve-hypermedia-links';\nimport type { MediatorRdfResolveHypermediaLinksQueue } from '@comunica/bus-rdf-resolve-hypermedia-links-queue';\nimport type {\n BindingsStream,\n ComunicaDataFactory,\n FragmentSelectorShape,\n IActionContext,\n IQueryBindingsOptions,\n IQuerySource,\n ILink,\n} from '@comunica/types';\nimport type { Algebra } from '@comunica/utils-algebra';\nimport type { BindingsFactory } from '@comunica/utils-bindings-factory';\nimport type * as RDF from '@rdfjs/types';\nimport type { AsyncIterator } from 'asynciterator';\nimport { TransformIterator } from 'asynciterator';\nimport { LRUCache } from 'lru-cache';\nimport type { ISourceState } from './LinkedRdfSourcesAsyncRdfIterator';\nimport { MediatedLinkedRdfSourcesAsyncRdfIterator } from './MediatedLinkedRdfSourcesAsyncRdfIterator';\n\nexport class QuerySourceHypermedia implements IQuerySource {\n public readonly referenceValue: string;\n public readonly firstLink: ILink;\n public readonly mediators: IMediatorArgs;\n public readonly dataFactory: ComunicaDataFactory;\n public readonly bindingsFactory: BindingsFactory;\n\n /**\n * A cache for source URLs to source states.\n */\n public sourcesState: LRUCache<string, Promise<ISourceState>>;\n\n private readonly cacheSize: number;\n private readonly maxIterators: number;\n\n public constructor(\n cacheSize: number,\n firstUrl: ILink,\n maxIterators: number,\n mediators: IMediatorArgs,\n dataFactory: ComunicaDataFactory,\n bindingsFactory: BindingsFactory,\n ) {\n this.referenceValue = firstUrl.url;\n this.cacheSize = cacheSize;\n this.firstLink = firstUrl;\n this.maxIterators = maxIterators;\n this.mediators = mediators;\n this.dataFactory = dataFactory;\n this.bindingsFactory = bindingsFactory;\n this.sourcesState = new LRUCache<string, Promise<ISourceState>>({ max: this.cacheSize });\n }\n\n public async getSelectorShape(context: IActionContext): Promise<FragmentSelectorShape> {\n const source = await this.getSourceCached(this.firstLink, {}, context);\n return source.source.getSelectorShape(context);\n }\n\n public async getFilterFactor(context: IActionContext): Promise<number> {\n const source = await this.getSourceCached(this.firstLink, {}, context);\n return source.source.getFilterFactor(context);\n }\n\n public queryBindings(\n operation: Algebra.Operation,\n context: IActionContext,\n options?: IQueryBindingsOptions,\n ): BindingsStream {\n // Initialize the sources state on first call\n if (this.sourcesState.size === 0) {\n this.getSourceCached(this.firstLink, {}, context)\n .catch(error => it.destroy(error));\n }\n\n const it: MediatedLinkedRdfSourcesAsyncRdfIterator = new MediatedLinkedRdfSourcesAsyncRdfIterator(\n operation,\n options,\n context,\n this.firstLink,\n this.maxIterators,\n (link, handledDatasets) => this.getSourceCached(link, handledDatasets, context),\n this.mediators.mediatorMetadataAccumulate,\n this.mediators.mediatorRdfResolveHypermediaLinks,\n this.mediators.mediatorRdfResolveHypermediaLinksQueue,\n );\n\n return it;\n }\n\n public queryQuads(operation: Algebra.Operation, context: IActionContext): AsyncIterator<RDF.Quad> {\n return new TransformIterator(async() => {\n const source = await this.getSourceCached(this.firstLink, {}, context);\n return source.source.queryQuads(operation, context);\n });\n }\n\n public async queryBoolean(operation: Algebra.Ask, context: IActionContext): Promise<boolean> {\n const source = await this.getSourceCached(this.firstLink, {}, context);\n return await source.source.queryBoolean(operation, context);\n }\n\n public async queryVoid(operation: Algebra.Operation, context: IActionContext): Promise<void> {\n const source = await this.getSourceCached(this.firstLink, {}, context);\n return await source.source.queryVoid(operation, context);\n }\n\n /**\n * Resolve a source for the given URL.\n * @param link A source link.\n * @param handledDatasets A hash of dataset identifiers that have already been handled.\n * @param context The action context.\n */\n public async getSource(\n link: ILink,\n handledDatasets: Record<string, boolean>,\n context: IActionContext,\n ): Promise<ISourceState> {\n const { source, metadata } = await this.mediators.mediatorQuerySourceDereferenceLink.mediate({\n link,\n handledDatasets,\n context,\n });\n\n return { link, source, metadata, handledDatasets };\n }\n\n /**\n * Resolve a source for the given URL.\n * This will first try to retrieve the source from cache.\n * @param link A source ILink.\n * @param handledDatasets A hash of dataset identifiers that have already been handled.\n * @param context The action context.\n */\n protected getSourceCached(\n link: ILink,\n handledDatasets: Record<string, boolean>,\n context: IActionContext,\n ): Promise<ISourceState> {\n let source = this.sourcesState.get(link.url);\n if (source) {\n return source;\n }\n source = this.getSource(link, handledDatasets, context);\n this.sourcesState.set(link.url, source);\n return source;\n }\n\n public toString(): string {\n return `QuerySourceHypermedia(${this.firstLink.url})`;\n }\n}\n\nexport interface IMediatorArgs {\n mediatorMetadataAccumulate: MediatorRdfMetadataAccumulate;\n mediatorQuerySourceDereferenceLink: MediatorQuerySourceDereferenceLink;\n mediatorRdfResolveHypermediaLinks: MediatorRdfResolveHypermediaLinks;\n mediatorRdfResolveHypermediaLinksQueue: MediatorRdfResolveHypermediaLinksQueue;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"QuerySourceHypermedia.js","sourceRoot":"","sources":["QuerySourceHypermedia.ts"],"names":[],"mappings":"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","sourcesContent":["import type { MediatorQuerySourceDereferenceLink } from '@comunica/bus-query-source-dereference-link';\nimport type { MediatorRdfMetadataAccumulate } from '@comunica/bus-rdf-metadata-accumulate';\nimport type { MediatorRdfResolveHypermediaLinks } from '@comunica/bus-rdf-resolve-hypermedia-links';\nimport type { MediatorRdfResolveHypermediaLinksQueue } from '@comunica/bus-rdf-resolve-hypermedia-links-queue';\nimport type {\n BindingsStream,\n ComunicaDataFactory,\n FragmentSelectorShape,\n IActionContext,\n IQueryBindingsOptions,\n IQuerySource,\n ILink,\n} from '@comunica/types';\nimport type { Algebra } from '@comunica/utils-algebra';\nimport type { BindingsFactory } from '@comunica/utils-bindings-factory';\nimport type * as RDF from '@rdfjs/types';\nimport type { AsyncIterator } from 'asynciterator';\nimport { TransformIterator } from 'asynciterator';\nimport { LRUCache } from 'lru-cache';\nimport type { ISourceState } from './LinkedRdfSourcesAsyncRdfIterator';\nimport { MediatedLinkedRdfSourcesAsyncRdfIterator } from './MediatedLinkedRdfSourcesAsyncRdfIterator';\n\nexport class QuerySourceHypermedia implements IQuerySource {\n public readonly referenceValue: string;\n public readonly firstLink: ILink;\n public readonly mediators: IMediatorArgs;\n public readonly dataFactory: ComunicaDataFactory;\n public readonly bindingsFactory: BindingsFactory;\n\n /**\n * A cache for source URLs to source states.\n */\n public sourcesState: LRUCache<string, Promise<ISourceState>>;\n\n private readonly cacheSize: number;\n private readonly maxIterators: number;\n\n public constructor(\n cacheSize: number,\n firstUrl: ILink,\n maxIterators: number,\n mediators: IMediatorArgs,\n dataFactory: ComunicaDataFactory,\n bindingsFactory: BindingsFactory,\n ) {\n this.referenceValue = firstUrl.url;\n this.cacheSize = cacheSize;\n this.firstLink = firstUrl;\n this.maxIterators = maxIterators;\n this.mediators = mediators;\n this.dataFactory = dataFactory;\n this.bindingsFactory = bindingsFactory;\n this.sourcesState = new LRUCache<string, Promise<ISourceState>>({ max: this.cacheSize });\n }\n\n public async getSelectorShape(context: IActionContext): Promise<FragmentSelectorShape> {\n const source = await this.getSourceCached(this.firstLink, {}, context);\n return source.source.getSelectorShape(context);\n }\n\n public async getFilterFactor(context: IActionContext): Promise<number> {\n const source = await this.getSourceCached(this.firstLink, {}, context);\n return source.source.getFilterFactor(context);\n }\n\n public queryBindings(\n operation: Algebra.Operation,\n context: IActionContext,\n options?: IQueryBindingsOptions,\n ): BindingsStream {\n // Initialize the sources state on first call\n if (this.sourcesState.size === 0) {\n this.getSourceCached(this.firstLink, {}, context)\n .catch(error => it.destroy(error));\n }\n\n const it: MediatedLinkedRdfSourcesAsyncRdfIterator = new MediatedLinkedRdfSourcesAsyncRdfIterator(\n operation,\n options,\n context,\n this.firstLink,\n this.maxIterators,\n (link, handledDatasets) => this.getSourceCached(link, handledDatasets, context),\n this.mediators.mediatorMetadataAccumulate,\n this.mediators.mediatorRdfResolveHypermediaLinks,\n this.mediators.mediatorRdfResolveHypermediaLinksQueue,\n );\n\n return it;\n }\n\n public queryQuads(operation: Algebra.Operation, context: IActionContext): AsyncIterator<RDF.Quad> {\n return new TransformIterator(async() => {\n const source = await this.getSourceCached(this.firstLink, {}, context);\n return source.source.queryQuads(operation, context);\n });\n }\n\n public async queryBoolean(operation: Algebra.Ask, context: IActionContext): Promise<boolean> {\n const source = await this.getSourceCached(this.firstLink, {}, context);\n return await source.source.queryBoolean(operation, context);\n }\n\n public async queryVoid(operation: Algebra.Operation, context: IActionContext): Promise<void> {\n const source = await this.getSourceCached(this.firstLink, {}, context);\n return await source.source.queryVoid(operation, context);\n }\n\n /**\n * Resolve a source for the given URL.\n * @param link A source link.\n * @param handledDatasets A hash of dataset identifiers that have already been handled.\n * @param context The action context.\n */\n public async getSource(\n link: ILink,\n handledDatasets: Record<string, boolean>,\n context: IActionContext,\n ): Promise<ISourceState> {\n const { source, metadata, cachePolicy } = await this.mediators.mediatorQuerySourceDereferenceLink.mediate({\n link,\n handledDatasets,\n context,\n });\n\n return { link, source, metadata, handledDatasets, cachePolicy };\n }\n\n /**\n * Resolve a source for the given URL.\n * This will first try to retrieve the source from cache.\n * @param link A source ILink.\n * @param handledDatasets A hash of dataset identifiers that have already been handled.\n * @param context The action context.\n */\n public getSourceCached(\n link: ILink,\n handledDatasets: Record<string, boolean>,\n context: IActionContext,\n ): Promise<ISourceState> {\n let source = this.sourcesState.get(link.url);\n if (source) {\n return (async() => {\n // Check if cache policy is still valid\n const sourceMaterialized = await source;\n if (sourceMaterialized.cachePolicy &&\n !await sourceMaterialized.cachePolicy?.satisfiesWithoutRevalidation({ link, context })) {\n // If it's not valid, delete cache entry, and re-fetch immediately\n // LIMITATION: we're not sending re-validation requests. So if the server sends a 304, we will perform a new\n // request and re-index the source. If an HTTP-level cache is active, the actual HTTP request will not be\n // sent, so only local re-indexing will happen, which is negligible in most cases.\n this.sourcesState.delete(link.url);\n return this.getSourceCached(link, handledDatasets, context);\n }\n return sourceMaterialized;\n })();\n }\n source = this.getSource(link, handledDatasets, context);\n this.sourcesState.set(link.url, source);\n return source;\n }\n\n public toString(): string {\n return `QuerySourceHypermedia(${this.firstLink.url})`;\n }\n}\n\nexport interface IMediatorArgs {\n mediatorMetadataAccumulate: MediatorRdfMetadataAccumulate;\n mediatorQuerySourceDereferenceLink: MediatorQuerySourceDereferenceLink;\n mediatorRdfResolveHypermediaLinks: MediatorRdfResolveHypermediaLinks;\n mediatorRdfResolveHypermediaLinksQueue: MediatorRdfResolveHypermediaLinksQueue;\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@comunica/actor-query-source-identify-hypermedia",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "5.0.0",
|
|
4
4
|
"description": "A hypermedia query-source-identify actor",
|
|
5
5
|
"lsd:module": true,
|
|
6
6
|
"license": "MIT",
|
|
@@ -41,21 +41,21 @@
|
|
|
41
41
|
"build:components": "componentsjs-generator"
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
|
-
"@comunica/bus-merge-bindings-context": "
|
|
45
|
-
"@comunica/bus-query-source-dereference-link": "
|
|
46
|
-
"@comunica/bus-query-source-identify": "
|
|
47
|
-
"@comunica/bus-rdf-metadata-accumulate": "
|
|
48
|
-
"@comunica/bus-rdf-resolve-hypermedia-links": "
|
|
49
|
-
"@comunica/bus-rdf-resolve-hypermedia-links-queue": "
|
|
50
|
-
"@comunica/context-entries": "
|
|
51
|
-
"@comunica/core": "
|
|
52
|
-
"@comunica/types": "
|
|
53
|
-
"@comunica/utils-algebra": "
|
|
54
|
-
"@comunica/utils-bindings-factory": "
|
|
55
|
-
"@comunica/utils-metadata": "
|
|
44
|
+
"@comunica/bus-merge-bindings-context": "^5.0.0",
|
|
45
|
+
"@comunica/bus-query-source-dereference-link": "^5.0.0",
|
|
46
|
+
"@comunica/bus-query-source-identify": "^5.0.0",
|
|
47
|
+
"@comunica/bus-rdf-metadata-accumulate": "^5.0.0",
|
|
48
|
+
"@comunica/bus-rdf-resolve-hypermedia-links": "^5.0.0",
|
|
49
|
+
"@comunica/bus-rdf-resolve-hypermedia-links-queue": "^5.0.0",
|
|
50
|
+
"@comunica/context-entries": "^5.0.0",
|
|
51
|
+
"@comunica/core": "^5.0.0",
|
|
52
|
+
"@comunica/types": "^5.0.0",
|
|
53
|
+
"@comunica/utils-algebra": "^5.0.0",
|
|
54
|
+
"@comunica/utils-bindings-factory": "^5.0.0",
|
|
55
|
+
"@comunica/utils-metadata": "^5.0.0",
|
|
56
56
|
"@rdfjs/types": "*",
|
|
57
57
|
"asynciterator": "^3.10.0",
|
|
58
|
-
"lru-cache": "^
|
|
58
|
+
"lru-cache": "^11.2.2"
|
|
59
59
|
},
|
|
60
|
-
"gitHead": "
|
|
60
|
+
"gitHead": "0b1756fdb9bef014133432489627c1bd71779bd0"
|
|
61
61
|
}
|