@comunica/actor-query-source-identify-hypermedia 5.0.3 → 5.1.3

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.
@@ -47,7 +47,7 @@ class QuerySourceHypermedia {
47
47
  return new asynciterator_1.TransformIterator(async () => {
48
48
  const source = await this.getSourceCached(this.firstLink, {}, context);
49
49
  return source.source.queryQuads(operation, context);
50
- });
50
+ }, { autoStart: false });
51
51
  }
52
52
  async queryBoolean(operation, context) {
53
53
  const source = await this.getSourceCached(this.firstLink, {}, context);
@@ -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, 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"]}
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 }, { autoStart: false });\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": "5.0.3",
3
+ "version": "5.1.3",
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": "^5.0.3",
45
- "@comunica/bus-query-source-dereference-link": "^5.0.3",
46
- "@comunica/bus-query-source-identify": "^5.0.3",
47
- "@comunica/bus-rdf-metadata-accumulate": "^5.0.3",
48
- "@comunica/bus-rdf-resolve-hypermedia-links": "^5.0.3",
49
- "@comunica/bus-rdf-resolve-hypermedia-links-queue": "^5.0.3",
50
- "@comunica/context-entries": "^5.0.3",
51
- "@comunica/core": "^5.0.3",
52
- "@comunica/types": "^5.0.0",
53
- "@comunica/utils-algebra": "^5.0.0",
54
- "@comunica/utils-bindings-factory": "^5.0.3",
55
- "@comunica/utils-metadata": "^5.0.0",
44
+ "@comunica/bus-merge-bindings-context": "^5.1.3",
45
+ "@comunica/bus-query-source-dereference-link": "^5.1.3",
46
+ "@comunica/bus-query-source-identify": "^5.1.3",
47
+ "@comunica/bus-rdf-metadata-accumulate": "^5.1.3",
48
+ "@comunica/bus-rdf-resolve-hypermedia-links": "^5.1.3",
49
+ "@comunica/bus-rdf-resolve-hypermedia-links-queue": "^5.1.3",
50
+ "@comunica/context-entries": "^5.1.3",
51
+ "@comunica/core": "^5.1.3",
52
+ "@comunica/types": "^5.1.3",
53
+ "@comunica/utils-algebra": "^5.1.3",
54
+ "@comunica/utils-bindings-factory": "^5.1.3",
55
+ "@comunica/utils-metadata": "^5.1.3",
56
56
  "@rdfjs/types": "*",
57
57
  "asynciterator": "^3.10.0",
58
58
  "lru-cache": "^11.2.2"
59
59
  },
60
- "gitHead": "aba77206f60cfc9655640420275fec5c05b8f73d"
60
+ "gitHead": "8740a36019a375fd2ba27e799c52d63eb5cacc24"
61
61
  }