@comunica/actor-init-query 2.7.1 → 2.8.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.
@@ -1 +1 @@
1
- {"version":3,"file":"HttpServiceSparqlEndpoint.js","sourceRoot":"","sources":["HttpServiceSparqlEndpoint.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable import/no-nodejs-modules */\nimport * as clusterUntyped from 'cluster';\nimport type { Cluster } from 'cluster';\nimport type { EventEmitter } from 'events';\nimport * as http from 'http';\nimport type { IncomingMessage, ServerResponse } from 'http';\n\nimport * as querystring from 'querystring';\nimport type { Writable } from 'stream';\nimport * as url from 'url';\nimport { KeysQueryOperation } from '@comunica/context-entries';\nimport { ActionContext } from '@comunica/core';\nimport type { ICliArgsHandler, QueryQuads, QueryType } from '@comunica/types';\nimport type * as RDF from '@rdfjs/types';\nimport { ArrayIterator } from 'asynciterator';\nimport yargs from 'yargs';\n// eslint-disable-next-line import/no-useless-path-segments\nimport { QueryEngineBase, QueryEngineFactoryBase } from '..';\n// eslint-disable-next-line import/no-useless-path-segments\nimport type { IDynamicQueryEngineOptions } from '..';\nimport { CliArgsHandlerBase } from './cli/CliArgsHandlerBase';\nimport { CliArgsHandlerHttp } from './cli/CliArgsHandlerHttp';\n\nconst process: NodeJS.Process = require('process/');\n\nconst quad = require('rdf-quad');\n\n// Force type on Cluster, because there are issues with the Node.js typings since v18\nconst cluster: Cluster = <any> clusterUntyped;\n\n/**\n * An HTTP service that exposes a Comunica engine as a SPARQL endpoint.\n */\nexport class HttpServiceSparqlEndpoint {\n public static readonly MIME_PLAIN = 'text/plain';\n public static readonly MIME_JSON = 'application/json';\n\n public readonly engine: Promise<QueryEngineBase>;\n\n public readonly context: any;\n public readonly timeout: number;\n public readonly port: number;\n public readonly workers: number;\n\n public readonly invalidateCacheBeforeQuery: boolean;\n public readonly freshWorkerPerQuery: boolean;\n public readonly contextOverride: boolean;\n\n public lastQueryId = 0;\n\n public constructor(args: IHttpServiceSparqlEndpointArgs) {\n this.context = args.context || {};\n this.timeout = args.timeout ?? 60_000;\n this.port = args.port ?? 3_000;\n this.workers = args.workers ?? 1;\n this.invalidateCacheBeforeQuery = Boolean(args.invalidateCacheBeforeQuery);\n this.freshWorkerPerQuery = Boolean(args.freshWorkerPerQuery);\n this.contextOverride = Boolean(args.contextOverride);\n\n this.engine = new QueryEngineFactoryBase(\n args.moduleRootPath,\n args.defaultConfigPath,\n actorInitQuery => new QueryEngineBase(actorInitQuery),\n ).create(args);\n }\n\n /**\n * Starts the server\n * @param {string[]} argv The commandline arguments that the script was called with\n * @param {module:stream.internal.Writable} stdout The output stream to log to.\n * @param {module:stream.internal.Writable} stderr The error stream to log errors to.\n * @param {string} moduleRootPath The path to the invoking module.\n * @param {NodeJS.ProcessEnv} env The process env to get constants from.\n * @param {string} defaultConfigPath The path to get the config from if none is defined in the environment.\n * @param {(code: number) => void} exit The callback to invoke to stop the script.\n * @param {ICliArgsHandler[]} cliArgsHandlers Enables manipulation of the CLI arguments and their processing.\n * @return {Promise<void>} A promise that resolves when the server has been started.\n */\n public static async runArgsInProcess<Q>(\n argv: string[],\n stdout: Writable,\n stderr: Writable,\n moduleRootPath: string,\n env: NodeJS.ProcessEnv,\n defaultConfigPath: string,\n exit: (code: number) => void,\n cliArgsHandlers: ICliArgsHandler[] = [],\n ): Promise<void> {\n const options = await HttpServiceSparqlEndpoint\n .generateConstructorArguments(argv, moduleRootPath, env, defaultConfigPath, stderr, exit, cliArgsHandlers);\n\n return new Promise<void>(resolve => {\n new HttpServiceSparqlEndpoint(options || {}).run(stdout, stderr)\n .then(resolve)\n .catch(error => {\n stderr.write(error);\n exit(1);\n resolve();\n });\n });\n }\n\n /**\n * Takes parsed commandline arguments and turns them into an object used in the HttpServiceSparqlEndpoint constructor\n * @param {args: minimist.ParsedArgs} args The commandline arguments that the script was called with\n * @param {string} moduleRootPath The path to the invoking module.\n * @param {NodeJS.ProcessEnv} env The process env to get constants from.\n * @param {string} defaultConfigPath The path to get the config from if none is defined in the environment.\n * @param {ICliArgsHandler[]} cliArgsHandlers Enables manipulation of the CLI arguments and their processing.\n */\n public static async generateConstructorArguments(argv: string[], moduleRootPath: string,\n env: NodeJS.ProcessEnv, defaultConfigPath: string, stderr: Writable,\n exit: (code: number) => void, cliArgsHandlers: ICliArgsHandler[]): Promise<IHttpServiceSparqlEndpointArgs> {\n // Populate yargs arguments object\n cliArgsHandlers = [\n new CliArgsHandlerBase(),\n new CliArgsHandlerHttp(),\n ...cliArgsHandlers,\n ];\n let argumentsBuilder = yargs({});\n for (const cliArgsHandler of cliArgsHandlers) {\n argumentsBuilder = cliArgsHandler.populateYargs(argumentsBuilder);\n }\n\n // Extract raw argument values from parsed yargs object, so that we can handle each of them hereafter\n let args: Record<string, any>;\n try {\n args = await argumentsBuilder.parse(argv);\n } catch (error: unknown) {\n stderr.write(`${await argumentsBuilder.getHelp()}\\n\\n${(<Error> error).message}\\n`);\n return exit(1)!;\n }\n\n // Invoke args handlers to process any remaining args\n const context: Record<string, any> = {};\n try {\n for (const cliArgsHandler of cliArgsHandlers) {\n await cliArgsHandler.handleArgs(args, context);\n }\n } catch (error: unknown) {\n stderr.write(`${(<Error>error).message}/n`);\n exit(1);\n }\n\n const invalidateCacheBeforeQuery: boolean = args.invalidateCache;\n const freshWorkerPerQuery: boolean = args.freshWorker;\n const contextOverride: boolean = args.contextOverride;\n const port = args.port;\n const timeout = args.timeout * 1_000;\n const workers = args.workers;\n context[KeysQueryOperation.readOnly.name] = !args.u;\n\n const configPath = env.COMUNICA_CONFIG ? env.COMUNICA_CONFIG : defaultConfigPath;\n\n return {\n defaultConfigPath,\n configPath,\n context,\n invalidateCacheBeforeQuery,\n freshWorkerPerQuery,\n contextOverride,\n moduleRootPath,\n mainModulePath: moduleRootPath,\n port,\n timeout,\n workers,\n };\n }\n\n /**\n * Start the HTTP service.\n * @param {module:stream.internal.Writable} stdout The output stream to log to.\n * @param {module:stream.internal.Writable} stderr The error stream to log errors to.\n */\n public run(stdout: Writable, stderr: Writable): Promise<void> {\n if (cluster.isMaster) {\n return this.runMaster(stdout, stderr);\n }\n return this.runWorker(stdout, stderr);\n }\n\n /**\n * Start the HTTP service as master.\n * @param {module:stream.internal.Writable} stdout The output stream to log to.\n * @param {module:stream.internal.Writable} stderr The error stream to log errors to.\n */\n public async runMaster(stdout: Writable, stderr: Writable): Promise<void> {\n stderr.write(`Server running on http://localhost:${this.port}/sparql\\n`);\n\n // Create workers\n for (let i = 0; i < this.workers; i++) {\n cluster.fork();\n }\n\n // Attach listeners to each new worker\n cluster.on('listening', worker => {\n // Respawn crashed workers\n worker.once('exit', (code, signal) => {\n if (!worker.exitedAfterDisconnect) {\n if (code === 9 || signal === 'SIGKILL') {\n stderr.write(`Worker ${worker.process.pid} forcefully killed with ${code || signal}. Killing main process as well.\\n`);\n cluster.disconnect();\n } else {\n stderr.write(`Worker ${worker.process.pid} died with ${code || signal}. Starting new worker.\\n`);\n cluster.fork();\n }\n }\n });\n\n // Handle worker timeouts\n const workerTimeouts: Record<number, NodeJS.Timeout> = {};\n worker.on('message', ({ type, queryId }) => {\n if (type === 'start') {\n stderr.write(`Worker ${worker.process.pid} got assigned a new query (${queryId}).\\n`);\n workerTimeouts[queryId] = setTimeout(() => {\n try {\n if (worker.isConnected()) {\n stderr.write(`Worker ${worker.process.pid} timed out for query ${queryId}.\\n`);\n worker.send('shutdown');\n }\n } catch (error: unknown) {\n stderr.write(`Unable to timeout worker ${worker.process.pid}: ${(<Error> error).message}.\\n`);\n }\n delete workerTimeouts[queryId];\n }, this.timeout);\n } else if (type === 'end' && workerTimeouts[queryId]) {\n stderr.write(`Worker ${worker.process.pid} has completed query ${queryId}.\\n`);\n clearTimeout(workerTimeouts[queryId]);\n delete workerTimeouts[queryId];\n }\n });\n });\n\n // Disconnect from cluster on SIGINT, so that the process can cleanly terminate\n process.once('SIGINT', () => {\n cluster.disconnect();\n });\n }\n\n /**\n * Start the HTTP service as worker.\n * @param {module:stream.internal.Writable} stdout The output stream to log to.\n * @param {module:stream.internal.Writable} stderr The error stream to log errors to.\n */\n public async runWorker(stdout: Writable, stderr: Writable): Promise<void> {\n const engine: QueryEngineBase = await this.engine;\n\n // Determine the allowed media types for requests\n const mediaTypes: Record<string, number> = await engine.getResultMediaTypes();\n const variants: { type: string; quality: number }[] = [];\n for (const type of Object.keys(mediaTypes)) {\n variants.push({ type, quality: mediaTypes[type] });\n }\n\n // Start the server\n const server = http.createServer(this.handleRequest.bind(this, engine, variants, stdout, stderr));\n server.listen(this.port);\n stderr.write(`Server worker (${process.pid}) running on http://localhost:${this.port}/sparql\\n`);\n\n // Keep track of all open connections\n const openConnections: Set<ServerResponse> = new Set();\n server.on('request', (request: IncomingMessage, response: ServerResponse) => {\n openConnections.add(response);\n response.on('close', () => {\n openConnections.delete(response);\n });\n });\n\n // Subscribe to shutdown messages\n process.on('message', async(message: string): Promise<void> => {\n if (message === 'shutdown') {\n stderr.write(`Shutting down worker ${process.pid} with ${openConnections.size} open connections.\\n`);\n\n // Stop new connections from being accepted\n server.close();\n\n // Close all open connections\n for (const connection of openConnections) {\n await new Promise<void>(resolve => connection.end('!TIMEDOUT!', resolve));\n }\n\n // Kill the worker once the connections have been closed\n process.exit(15);\n }\n });\n\n // Catch global errors, and cleanly close open connections\n process.on('uncaughtException', async error => {\n stderr.write(`Terminating worker ${process.pid} with ${openConnections.size} open connections due to uncaught exception.\\n`);\n stderr.write(error.stack);\n\n // Stop new connections from being accepted\n server.close();\n\n // Close all open connections\n for (const connection of openConnections) {\n await new Promise<void>(resolve => connection.end('!ERROR!', resolve));\n }\n\n // Kill the worker once the connections have been closed\n process.exit(15);\n });\n }\n\n /**\n * Handles an HTTP request.\n * @param {QueryEngineBase} engine A SPARQL engine.\n * @param {{type: string; quality: number}[]} variants Allowed variants.\n * @param {module:stream.internal.Writable} stdout Output stream.\n * @param {module:stream.internal.Writable} stderr Error output stream.\n * @param {module:http.IncomingMessage} request Request object.\n * @param {module:http.ServerResponse} response Response object.\n */\n public async handleRequest(\n engine: QueryEngineBase,\n variants: { type: string; quality: number }[],\n stdout: Writable,\n stderr: Writable,\n request: http.IncomingMessage,\n response: http.ServerResponse,\n ): Promise<void> {\n const negotiated = require('negotiate').choose(variants, request)\n .sort((first: any, second: any) => second.qts - first.qts);\n const variant: any = request.headers.accept ? negotiated[0] : null;\n // Require qts strictly larger than 2, as 1 and 2 respectively allow * and */* matching.\n // For qts 0, 1, and 2, we fallback to our built-in media type defaults, for which we pass null.\n const mediaType: string = variant && variant.qts > 2 ? variant.type : null;\n\n // Verify the path\n const requestUrl = url.parse(request.url ?? '', true);\n if (requestUrl.pathname === '/' || request.url === '/') {\n stdout.write('[301] Permanently moved. Redirected to /sparql.');\n response.writeHead(301,\n { 'content-type': HttpServiceSparqlEndpoint.MIME_JSON,\n 'Access-Control-Allow-Origin': '*',\n Location: `http://localhost:${this.port}/sparql${requestUrl.search || ''}` });\n response.end(JSON.stringify({ message: 'Queries are accepted on /sparql. Redirected.' }));\n return;\n }\n if (requestUrl.pathname !== '/sparql') {\n stdout.write('[404] Resource not found. Queries are accepted on /sparql.\\n');\n response.writeHead(404,\n { 'content-type': HttpServiceSparqlEndpoint.MIME_JSON,\n 'Access-Control-Allow-Origin': '*' });\n response.end(JSON.stringify({ message: 'Resource not found. Queries are accepted on /sparql.' }));\n return;\n }\n\n if (this.invalidateCacheBeforeQuery) {\n // Invalidate cache\n await engine.invalidateHttpCache();\n }\n\n // Parse the query, depending on the HTTP method\n let queryBody: IQueryBody | undefined;\n switch (request.method) {\n case 'POST':\n queryBody = await this.parseBody(request);\n await this.writeQueryResult(\n engine,\n stdout,\n stderr,\n request,\n response,\n queryBody,\n mediaType,\n false,\n false,\n this.lastQueryId++,\n );\n break;\n case 'HEAD':\n case 'GET':\n // eslint-disable-next-line no-case-declarations\n const queryValue = <string> requestUrl.query.query;\n queryBody = queryValue ? { type: 'query', value: queryValue, context: undefined } : undefined;\n // eslint-disable-next-line no-case-declarations\n const headOnly = request.method === 'HEAD';\n await this.writeQueryResult(\n engine,\n stdout,\n stderr,\n request,\n response,\n queryBody,\n mediaType,\n headOnly,\n true,\n this.lastQueryId++,\n );\n break;\n default:\n stdout.write(`[405] ${request.method} to ${request.url}\\n`);\n response.writeHead(405,\n { 'content-type': HttpServiceSparqlEndpoint.MIME_JSON, 'Access-Control-Allow-Origin': '*' });\n response.end(JSON.stringify({ message: 'Incorrect HTTP method' }));\n }\n }\n\n /**\n * Writes the result of the given SPARQL query.\n * @param {QueryEngineBase} engine A SPARQL engine.\n * @param {module:stream.internal.Writable} stdout Output stream.\n * @param {module:stream.internal.Writable} stderr Error output stream.\n * @param {module:http.IncomingMessage} request Request object.\n * @param {module:http.ServerResponse} response Response object.\n * @param {IQueryBody | undefined} queryBody The query body.\n * @param {string} mediaType The requested response media type.\n * @param {boolean} headOnly If only the header should be written.\n * @param {boolean} readOnly If only data can be read, but not updated. (i.e., if we're in a GET request)\n * @param queryId The unique id of this query.\n */\n public async writeQueryResult(\n engine: QueryEngineBase,\n stdout: Writable,\n stderr: Writable,\n request: http.IncomingMessage,\n response: http.ServerResponse,\n queryBody: IQueryBody | undefined,\n mediaType: string,\n headOnly: boolean,\n readOnly: boolean,\n queryId: number,\n ): Promise<void> {\n if (!queryBody || !queryBody.value) {\n return this.writeServiceDescription(engine, stdout, stderr, request, response, mediaType, headOnly);\n }\n\n // Log the start of the query execution\n stdout.write(`[200] ${request.method} to ${request.url}\\n`);\n stdout.write(` Requested media type: ${mediaType}\\n`);\n stdout.write(` Received ${queryBody.type} query: ${queryBody.value}\\n`);\n\n // Send message to master process to indicate the start of an execution\n process.send!({ type: 'start', queryId });\n\n // Determine context\n let context = {\n ...this.context,\n ...this.contextOverride ? queryBody.context : undefined,\n };\n if (readOnly) {\n context = { ...context, [KeysQueryOperation.readOnly.name]: readOnly };\n }\n\n let result: QueryType;\n try {\n result = await engine.query(queryBody.value, context);\n\n // For update queries, also await the result\n if (result.resultType === 'void') {\n await result.execute();\n }\n } catch (error: unknown) {\n stdout.write('[400] Bad request\\n');\n response.writeHead(400,\n { 'content-type': HttpServiceSparqlEndpoint.MIME_PLAIN, 'Access-Control-Allow-Origin': '*' });\n response.end((<Error> error).message);\n return;\n }\n\n // Default to SPARQL JSON for bindings and boolean\n if (!mediaType) {\n switch (result.resultType) {\n case 'quads':\n mediaType = 'application/trig';\n break;\n case 'void':\n mediaType = 'simple';\n break;\n default:\n mediaType = 'application/sparql-results+json';\n break;\n }\n }\n\n // Write header of response\n response.writeHead(200, { 'content-type': mediaType, 'Access-Control-Allow-Origin': '*' });\n stdout.write(` Resolved to result media type: ${mediaType}\\n`);\n\n // Stop further processing for HEAD requests\n if (headOnly) {\n response.end();\n return;\n }\n\n let eventEmitter: EventEmitter | undefined;\n try {\n const { data } = await engine.resultToString(result, mediaType);\n data.on('error', (error: Error) => {\n stdout.write(`[500] Server error in results: ${error.message} \\n`);\n if (!response.writableEnded) {\n response.end('An internal server error occurred.\\n');\n }\n });\n data.pipe(response);\n eventEmitter = data;\n } catch {\n stdout.write('[400] Bad request, invalid media type\\n');\n response.writeHead(400,\n { 'content-type': HttpServiceSparqlEndpoint.MIME_PLAIN, 'Access-Control-Allow-Origin': '*' });\n response.end('The response for the given query could not be serialized for the requested media type\\n');\n }\n\n // Send message to master process to indicate the end of an execution\n response.on('close', () => {\n process.send!({ type: 'end', queryId });\n });\n\n this.stopResponse(response, queryId, eventEmitter);\n }\n\n public async writeServiceDescription(\n engine: QueryEngineBase,\n stdout: Writable,\n stderr: Writable,\n request: http.IncomingMessage,\n response: http.ServerResponse,\n mediaType: string,\n headOnly: boolean,\n ): Promise<void> {\n stdout.write(`[200] ${request.method} to ${request.url}\\n`);\n stdout.write(` Requested media type: ${mediaType}\\n`);\n stdout.write(' Received query for service description.\\n');\n response.writeHead(200, { 'content-type': mediaType, 'Access-Control-Allow-Origin': '*' });\n\n if (headOnly) {\n response.end();\n return;\n }\n\n // eslint-disable-next-line id-length\n const s = request.url;\n const sd = 'http://www.w3.org/ns/sparql-service-description#';\n const quads: RDF.Quad[] = [\n // Basic metadata\n quad(s, 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type', `${sd}Service`),\n quad(s, `${sd}endpoint`, '/sparql'),\n quad(s, `${sd}url`, '/sparql'),\n\n // Features\n quad(s, `${sd}feature`, `${sd}BasicFederatedQuery`),\n quad(s, `${sd}supportedLanguage`, `${sd}SPARQL10Query`),\n quad(s, `${sd}supportedLanguage`, `${sd}SPARQL11Query`),\n ];\n\n let eventEmitter: EventEmitter;\n try {\n // Append result formats\n const formats = await engine.getResultMediaTypeFormats(new ActionContext(this.context));\n for (const format in formats) {\n quads.push(quad(s, `${sd}resultFormat`, formats[format]));\n }\n\n // Flush results\n const { data } = await engine.resultToString(<QueryQuads> {\n resultType: 'quads',\n execute: async() => new ArrayIterator(quads),\n metadata: <any> undefined,\n }, mediaType);\n data.on('error', (error: Error) => {\n stdout.write(`[500] Server error in results: ${error.message} \\n`);\n response.end('An internal server error occurred.\\n');\n });\n data.pipe(response);\n eventEmitter = data;\n } catch {\n stdout.write('[400] Bad request, invalid media type\\n');\n response.writeHead(400,\n { 'content-type': HttpServiceSparqlEndpoint.MIME_PLAIN, 'Access-Control-Allow-Origin': '*' });\n response.end('The response for the given query could not be serialized for the requested media type\\n');\n return;\n }\n this.stopResponse(response, 0, eventEmitter);\n }\n\n /**\n * Stop after timeout or if the connection is terminated\n * @param {module:http.ServerResponse} response Response object.\n * @param queryId The unique query id.\n * @param {NodeJS.ReadableStream} eventEmitter Query result stream.\n */\n public stopResponse(response: http.ServerResponse, queryId: number, eventEmitter?: EventEmitter): void {\n response.on('close', killClient);\n // eslint-disable-next-line @typescript-eslint/no-this-alias,consistent-this\n const self = this;\n function killClient(): void {\n if (eventEmitter) {\n // Remove all listeners so we are sure no more write calls are made\n eventEmitter.removeAllListeners();\n eventEmitter.on('error', () => {\n // Void any errors that may still occur\n });\n eventEmitter.emit('end');\n }\n try {\n response.end();\n } catch {\n // Do nothing\n }\n\n // Kill the worker if we want fresh workers per query\n if (self.freshWorkerPerQuery) {\n process.stderr.write(`Killing fresh worker ${process.pid} after query ${queryId}.\\n`);\n // eslint-disable-next-line unicorn/no-process-exit\n process.exit(15);\n }\n }\n }\n\n /**\n * Parses the body of a SPARQL POST request\n * @param {module:http.IncomingMessage} request Request object.\n * @return {Promise<IQueryBody>} A promise resolving to a query body object.\n */\n public parseBody(request: http.IncomingMessage): Promise<IQueryBody> {\n return new Promise((resolve, reject) => {\n let body = '';\n request.setEncoding('utf8');\n request.on('error', reject);\n request.on('data', chunk => {\n body += chunk;\n });\n request.on('end', () => {\n const contentType: string | undefined = request.headers['content-type'];\n if (contentType) {\n if (contentType.includes('application/sparql-query')) {\n return resolve({ type: 'query', value: body, context: undefined });\n }\n if (contentType.includes('application/sparql-update')) {\n return resolve({ type: 'void', value: body, context: undefined });\n }\n if (contentType.includes('application/x-www-form-urlencoded')) {\n const bodyStructure = querystring.parse(body);\n let context: Record<string, any> | undefined;\n if (bodyStructure.context) {\n try {\n context = JSON.parse(<string>bodyStructure.context);\n } catch (error: unknown) {\n reject(new Error(`Invalid POST body with context received ('${bodyStructure.context}'): ${(<Error> error).message}`));\n }\n }\n if (bodyStructure.query) {\n return resolve({ type: 'query', value: <string> bodyStructure.query, context });\n }\n if (bodyStructure.update) {\n return resolve({ type: 'void', value: <string> bodyStructure.update, context });\n }\n }\n }\n reject(new Error(`Invalid POST body received, query type could not be determined`));\n });\n });\n }\n}\n\nexport interface IQueryBody {\n type: 'query' | 'void';\n value: string;\n context: Record<string, any> | undefined;\n}\n\nexport interface IHttpServiceSparqlEndpointArgs extends IDynamicQueryEngineOptions {\n context?: any;\n timeout?: number;\n port?: number;\n workers?: number;\n invalidateCacheBeforeQuery?: boolean;\n freshWorkerPerQuery?: boolean;\n contextOverride?: boolean;\n moduleRootPath: string;\n defaultConfigPath: string;\n}\n/* eslint-enable import/no-nodejs-modules */\n"]}
1
+ {"version":3,"file":"HttpServiceSparqlEndpoint.js","sourceRoot":"","sources":["HttpServiceSparqlEndpoint.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable import/no-nodejs-modules */\nimport * as clusterUntyped from 'cluster';\nimport type { Cluster } from 'cluster';\nimport type { EventEmitter } from 'events';\nimport * as http from 'http';\nimport type { IncomingMessage, ServerResponse } from 'http';\n\nimport * as querystring from 'querystring';\nimport type { Writable } from 'stream';\nimport * as url from 'url';\nimport { KeysQueryOperation } from '@comunica/context-entries';\nimport { ActionContext } from '@comunica/core';\nimport type { ICliArgsHandler, QueryQuads, QueryType } from '@comunica/types';\nimport type * as RDF from '@rdfjs/types';\nimport { ArrayIterator } from 'asynciterator';\nimport yargs from 'yargs';\n// eslint-disable-next-line import/no-useless-path-segments\nimport { QueryEngineBase, QueryEngineFactoryBase } from '..';\n// eslint-disable-next-line import/no-useless-path-segments\nimport type { IDynamicQueryEngineOptions } from '..';\nimport { CliArgsHandlerBase } from './cli/CliArgsHandlerBase';\nimport { CliArgsHandlerHttp } from './cli/CliArgsHandlerHttp';\n\nconst process: NodeJS.Process = require('process/');\n\nconst quad = require('rdf-quad');\n\n// Force type on Cluster, because there are issues with the Node.js typings since v18\nconst cluster: Cluster = <any> clusterUntyped;\n\n/**\n * An HTTP service that exposes a Comunica engine as a SPARQL endpoint.\n */\nexport class HttpServiceSparqlEndpoint {\n public static readonly MIME_PLAIN = 'text/plain';\n public static readonly MIME_JSON = 'application/json';\n\n public readonly engine: Promise<QueryEngineBase>;\n\n public readonly context: any;\n public readonly timeout: number;\n public readonly port: number;\n public readonly workers: number;\n\n public readonly invalidateCacheBeforeQuery: boolean;\n public readonly freshWorkerPerQuery: boolean;\n public readonly contextOverride: boolean;\n\n public lastQueryId = 0;\n\n public constructor(args: IHttpServiceSparqlEndpointArgs) {\n this.context = args.context || {};\n this.timeout = args.timeout ?? 60_000;\n this.port = args.port ?? 3_000;\n this.workers = args.workers ?? 1;\n this.invalidateCacheBeforeQuery = Boolean(args.invalidateCacheBeforeQuery);\n this.freshWorkerPerQuery = Boolean(args.freshWorkerPerQuery);\n this.contextOverride = Boolean(args.contextOverride);\n\n this.engine = new QueryEngineFactoryBase(\n args.moduleRootPath,\n args.defaultConfigPath,\n actorInitQuery => new QueryEngineBase(actorInitQuery),\n ).create(args);\n }\n\n /**\n * Starts the server\n * @param {string[]} argv The commandline arguments that the script was called with\n * @param {module:stream.internal.Writable} stdout The output stream to log to.\n * @param {module:stream.internal.Writable} stderr The error stream to log errors to.\n * @param {string} moduleRootPath The path to the invoking module.\n * @param {NodeJS.ProcessEnv} env The process env to get constants from.\n * @param {string} defaultConfigPath The path to get the config from if none is defined in the environment.\n * @param {(code: number) => void} exit The callback to invoke to stop the script.\n * @param {ICliArgsHandler[]} cliArgsHandlers Enables manipulation of the CLI arguments and their processing.\n * @return {Promise<void>} A promise that resolves when the server has been started.\n */\n public static async runArgsInProcess<Q>(\n argv: string[],\n stdout: Writable,\n stderr: Writable,\n moduleRootPath: string,\n env: NodeJS.ProcessEnv,\n defaultConfigPath: string,\n exit: (code: number) => void,\n cliArgsHandlers: ICliArgsHandler[] = [],\n ): Promise<void> {\n const options = await HttpServiceSparqlEndpoint\n .generateConstructorArguments(argv, moduleRootPath, env, defaultConfigPath, stderr, exit, cliArgsHandlers);\n\n return new Promise<void>(resolve => {\n new HttpServiceSparqlEndpoint(options || {}).run(stdout, stderr)\n .then(resolve)\n .catch(error => {\n stderr.write(error);\n exit(1);\n resolve();\n });\n });\n }\n\n /**\n * Takes parsed commandline arguments and turns them into an object used in the HttpServiceSparqlEndpoint constructor\n * @param {args: minimist.ParsedArgs} args The commandline arguments that the script was called with\n * @param {string} moduleRootPath The path to the invoking module.\n * @param {NodeJS.ProcessEnv} env The process env to get constants from.\n * @param {string} defaultConfigPath The path to get the config from if none is defined in the environment.\n * @param {ICliArgsHandler[]} cliArgsHandlers Enables manipulation of the CLI arguments and their processing.\n */\n public static async generateConstructorArguments(argv: string[], moduleRootPath: string,\n env: NodeJS.ProcessEnv, defaultConfigPath: string, stderr: Writable,\n exit: (code: number) => void, cliArgsHandlers: ICliArgsHandler[]): Promise<IHttpServiceSparqlEndpointArgs> {\n // Populate yargs arguments object\n cliArgsHandlers = [\n new CliArgsHandlerBase(),\n new CliArgsHandlerHttp(),\n ...cliArgsHandlers,\n ];\n let argumentsBuilder = yargs({});\n for (const cliArgsHandler of cliArgsHandlers) {\n argumentsBuilder = cliArgsHandler.populateYargs(argumentsBuilder);\n }\n\n // Extract raw argument values from parsed yargs object, so that we can handle each of them hereafter\n let args: Record<string, any>;\n try {\n args = await argumentsBuilder.parse(argv);\n } catch (error: unknown) {\n stderr.write(`${await argumentsBuilder.getHelp()}\\n\\n${(<Error> error).message}\\n`);\n return exit(1)!;\n }\n\n // Invoke args handlers to process any remaining args\n const context: Record<string, any> = {};\n try {\n for (const cliArgsHandler of cliArgsHandlers) {\n await cliArgsHandler.handleArgs(args, context);\n }\n } catch (error: unknown) {\n stderr.write(`${(<Error>error).message}/n`);\n exit(1);\n }\n\n const invalidateCacheBeforeQuery: boolean = args.invalidateCache;\n const freshWorkerPerQuery: boolean = args.freshWorker;\n const contextOverride: boolean = args.contextOverride;\n const port = args.port;\n const timeout = args.timeout * 1_000;\n const workers = args.workers;\n context[KeysQueryOperation.readOnly.name] = !args.u;\n\n const configPath = env.COMUNICA_CONFIG ? env.COMUNICA_CONFIG : defaultConfigPath;\n\n return {\n defaultConfigPath,\n configPath,\n context,\n invalidateCacheBeforeQuery,\n freshWorkerPerQuery,\n contextOverride,\n moduleRootPath,\n mainModulePath: moduleRootPath,\n port,\n timeout,\n workers,\n };\n }\n\n /**\n * Start the HTTP service.\n * @param {module:stream.internal.Writable} stdout The output stream to log to.\n * @param {module:stream.internal.Writable} stderr The error stream to log errors to.\n */\n public run(stdout: Writable, stderr: Writable): Promise<void> {\n if (cluster.isMaster) {\n return this.runMaster(stdout, stderr);\n }\n return this.runWorker(stdout, stderr);\n }\n\n /**\n * Start the HTTP service as master.\n * @param {module:stream.internal.Writable} stdout The output stream to log to.\n * @param {module:stream.internal.Writable} stderr The error stream to log errors to.\n */\n public async runMaster(stdout: Writable, stderr: Writable): Promise<void> {\n stderr.write(`Server running on http://localhost:${this.port}/sparql\\n`);\n\n // Create workers\n for (let i = 0; i < this.workers; i++) {\n cluster.fork();\n }\n\n // Attach listeners to each new worker\n cluster.on('listening', worker => {\n // Respawn crashed workers\n worker.once('exit', (code, signal) => {\n if (!worker.exitedAfterDisconnect) {\n if (code === 9 || signal === 'SIGKILL') {\n stderr.write(`Worker ${worker.process.pid} forcefully killed with ${code || signal}. Killing main process as well.\\n`);\n cluster.disconnect();\n } else {\n stderr.write(`Worker ${worker.process.pid} died with ${code || signal}. Starting new worker.\\n`);\n cluster.fork();\n }\n }\n });\n\n // Handle worker timeouts\n const workerTimeouts: Record<number, NodeJS.Timeout> = {};\n worker.on('message', ({ type, queryId }) => {\n if (type === 'start') {\n stderr.write(`Worker ${worker.process.pid} got assigned a new query (${queryId}).\\n`);\n workerTimeouts[queryId] = setTimeout(() => {\n try {\n if (worker.isConnected()) {\n stderr.write(`Worker ${worker.process.pid} timed out for query ${queryId}.\\n`);\n worker.send('shutdown');\n }\n } catch (error: unknown) {\n stderr.write(`Unable to timeout worker ${worker.process.pid}: ${(<Error> error).message}.\\n`);\n }\n delete workerTimeouts[queryId];\n }, this.timeout);\n } else if (type === 'end' && workerTimeouts[queryId]) {\n stderr.write(`Worker ${worker.process.pid} has completed query ${queryId}.\\n`);\n clearTimeout(workerTimeouts[queryId]);\n delete workerTimeouts[queryId];\n }\n });\n });\n\n // Disconnect from cluster on SIGINT, so that the process can cleanly terminate\n process.once('SIGINT', () => {\n cluster.disconnect();\n });\n }\n\n /**\n * Start the HTTP service as worker.\n * @param {module:stream.internal.Writable} stdout The output stream to log to.\n * @param {module:stream.internal.Writable} stderr The error stream to log errors to.\n */\n public async runWorker(stdout: Writable, stderr: Writable): Promise<void> {\n const engine: QueryEngineBase = await this.engine;\n\n // Determine the allowed media types for requests\n const mediaTypes: Record<string, number> = await engine.getResultMediaTypes();\n const variants: { type: string; quality: number }[] = [];\n for (const type of Object.keys(mediaTypes)) {\n variants.push({ type, quality: mediaTypes[type] });\n }\n\n // Start the server\n const server = http.createServer(this.handleRequest.bind(this, engine, variants, stdout, stderr));\n server.listen(this.port);\n stderr.write(`Server worker (${process.pid}) running on http://localhost:${this.port}/sparql\\n`);\n\n // Keep track of all open connections\n const openConnections: Set<ServerResponse> = new Set();\n server.on('request', (request: IncomingMessage, response: ServerResponse) => {\n openConnections.add(response);\n response.on('close', () => {\n openConnections.delete(response);\n });\n });\n\n // Subscribe to shutdown messages\n process.on('message', async(message: string): Promise<void> => {\n if (message === 'shutdown') {\n stderr.write(`Shutting down worker ${process.pid} with ${openConnections.size} open connections.\\n`);\n\n // Stop new connections from being accepted\n server.close();\n\n // Close all open connections\n for (const connection of openConnections) {\n await new Promise<void>(resolve => connection.end('!TIMEDOUT!', resolve));\n }\n\n // Kill the worker once the connections have been closed\n process.exit(15);\n }\n });\n\n // Catch global errors, and cleanly close open connections\n process.on('uncaughtException', async error => {\n stderr.write(`Terminating worker ${process.pid} with ${openConnections.size} open connections due to uncaught exception.\\n`);\n stderr.write(error.stack);\n\n // Stop new connections from being accepted\n server.close();\n\n // Close all open connections\n for (const connection of openConnections) {\n await new Promise<void>(resolve => connection.end('!ERROR!', resolve));\n }\n\n // Kill the worker once the connections have been closed\n process.exit(15);\n });\n }\n\n /**\n * Handles an HTTP request.\n * @param {QueryEngineBase} engine A SPARQL engine.\n * @param {{type: string; quality: number}[]} variants Allowed variants.\n * @param {module:stream.internal.Writable} stdout Output stream.\n * @param {module:stream.internal.Writable} stderr Error output stream.\n * @param {module:http.IncomingMessage} request Request object.\n * @param {module:http.ServerResponse} response Response object.\n */\n public async handleRequest(\n engine: QueryEngineBase,\n variants: { type: string; quality: number }[],\n stdout: Writable,\n stderr: Writable,\n request: http.IncomingMessage,\n response: http.ServerResponse,\n ): Promise<void> {\n const negotiated = require('negotiate').choose(variants, request)\n .sort((first: any, second: any) => second.qts - first.qts);\n const variant: any = request.headers.accept ? negotiated[0] : null;\n // Require qts strictly larger than 2, as 1 and 2 respectively allow * and */* matching.\n // For qts 0, 1, and 2, we fallback to our built-in media type defaults, for which we pass null.\n const mediaType: string = variant && variant.qts > 2 ? variant.type : null;\n\n // Verify the path\n const requestUrl = url.parse(request.url ?? '', true);\n if (requestUrl.pathname === '/' || request.url === '/') {\n stdout.write('[301] Permanently moved. Redirected to /sparql.');\n response.writeHead(301,\n { 'content-type': HttpServiceSparqlEndpoint.MIME_JSON,\n 'Access-Control-Allow-Origin': '*',\n Location: `http://localhost:${this.port}/sparql${requestUrl.search || ''}` });\n response.end(JSON.stringify({ message: 'Queries are accepted on /sparql. Redirected.' }));\n return;\n }\n if (requestUrl.pathname !== '/sparql') {\n stdout.write('[404] Resource not found. Queries are accepted on /sparql.\\n');\n response.writeHead(404,\n { 'content-type': HttpServiceSparqlEndpoint.MIME_JSON,\n 'Access-Control-Allow-Origin': '*' });\n response.end(JSON.stringify({ message: 'Resource not found. Queries are accepted on /sparql.' }));\n return;\n }\n\n if (this.invalidateCacheBeforeQuery) {\n // Invalidate cache\n await engine.invalidateHttpCache();\n }\n\n // Parse the query, depending on the HTTP method\n let queryBody: IQueryBody | undefined;\n switch (request.method) {\n case 'POST':\n queryBody = await this.parseBody(request);\n await this.writeQueryResult(\n engine,\n stdout,\n stderr,\n request,\n response,\n queryBody,\n mediaType,\n false,\n false,\n this.lastQueryId++,\n );\n break;\n case 'HEAD':\n case 'GET':\n // eslint-disable-next-line no-case-declarations\n const queryValue = <string> requestUrl.query.query;\n queryBody = queryValue ? { type: 'query', value: queryValue, context: undefined } : undefined;\n // eslint-disable-next-line no-case-declarations\n const headOnly = request.method === 'HEAD';\n await this.writeQueryResult(\n engine,\n stdout,\n stderr,\n request,\n response,\n queryBody,\n mediaType,\n headOnly,\n true,\n this.lastQueryId++,\n );\n break;\n default:\n stdout.write(`[405] ${request.method} to ${request.url}\\n`);\n response.writeHead(405,\n { 'content-type': HttpServiceSparqlEndpoint.MIME_JSON, 'Access-Control-Allow-Origin': '*' });\n response.end(JSON.stringify({ message: 'Incorrect HTTP method' }));\n }\n }\n\n /**\n * Writes the result of the given SPARQL query.\n * @param {QueryEngineBase} engine A SPARQL engine.\n * @param {module:stream.internal.Writable} stdout Output stream.\n * @param {module:stream.internal.Writable} stderr Error output stream.\n * @param {module:http.IncomingMessage} request Request object.\n * @param {module:http.ServerResponse} response Response object.\n * @param {IQueryBody | undefined} queryBody The query body.\n * @param {string} mediaType The requested response media type.\n * @param {boolean} headOnly If only the header should be written.\n * @param {boolean} readOnly If only data can be read, but not updated. (i.e., if we're in a GET request)\n * @param queryId The unique id of this query.\n */\n public async writeQueryResult(\n engine: QueryEngineBase,\n stdout: Writable,\n stderr: Writable,\n request: http.IncomingMessage,\n response: http.ServerResponse,\n queryBody: IQueryBody | undefined,\n mediaType: string,\n headOnly: boolean,\n readOnly: boolean,\n queryId: number,\n ): Promise<void> {\n if (!queryBody || !queryBody.value) {\n return this.writeServiceDescription(engine, stdout, stderr, request, response, mediaType, headOnly);\n }\n\n // Log the start of the query execution\n stdout.write(`[200] ${request.method} to ${request.url}\\n`);\n stdout.write(` Requested media type: ${mediaType}\\n`);\n stdout.write(` Received ${queryBody.type} query: ${queryBody.value}\\n`);\n\n // Send message to master process to indicate the start of an execution\n process.send!({ type: 'start', queryId });\n\n // Determine context\n let context = {\n ...this.context,\n ...this.contextOverride ? queryBody.context : undefined,\n };\n if (readOnly) {\n context = { ...context, [KeysQueryOperation.readOnly.name]: readOnly };\n }\n\n let result: QueryType;\n try {\n result = await engine.query(queryBody.value, context);\n\n // For update queries, also await the result\n if (result.resultType === 'void') {\n await result.execute();\n }\n } catch (error: unknown) {\n stdout.write('[400] Bad request\\n');\n response.writeHead(400,\n { 'content-type': HttpServiceSparqlEndpoint.MIME_PLAIN, 'Access-Control-Allow-Origin': '*' });\n response.end((<Error> error).message);\n return;\n }\n\n // Default to SPARQL JSON for bindings and boolean\n if (!mediaType) {\n switch (result.resultType) {\n case 'quads':\n mediaType = 'application/trig';\n break;\n case 'void':\n mediaType = 'simple';\n break;\n default:\n mediaType = 'application/sparql-results+json';\n break;\n }\n }\n\n // Write header of response\n response.writeHead(200, { 'content-type': mediaType, 'Access-Control-Allow-Origin': '*' });\n stdout.write(` Resolved to result media type: ${mediaType}\\n`);\n\n // Stop further processing for HEAD requests\n if (headOnly) {\n response.end();\n return;\n }\n\n let eventEmitter: EventEmitter | undefined;\n try {\n const { data } = await engine.resultToString(result, mediaType);\n data.on('error', (error: Error) => {\n stdout.write(`[500] Server error in results: ${error.message} \\n`);\n if (!response.writableEnded) {\n response.end('An internal server error occurred.\\n');\n }\n });\n data.pipe(response);\n eventEmitter = data;\n } catch {\n stdout.write('[400] Bad request, invalid media type\\n');\n response.writeHead(400,\n { 'content-type': HttpServiceSparqlEndpoint.MIME_PLAIN, 'Access-Control-Allow-Origin': '*' });\n response.end('The response for the given query could not be serialized for the requested media type\\n');\n }\n\n // Send message to master process to indicate the end of an execution\n response.on('close', () => {\n process.send!({ type: 'end', queryId });\n });\n\n this.stopResponse(response, queryId, eventEmitter);\n }\n\n public async writeServiceDescription(\n engine: QueryEngineBase,\n stdout: Writable,\n stderr: Writable,\n request: http.IncomingMessage,\n response: http.ServerResponse,\n mediaType: string,\n headOnly: boolean,\n ): Promise<void> {\n stdout.write(`[200] ${request.method} to ${request.url}\\n`);\n stdout.write(` Requested media type: ${mediaType}\\n`);\n stdout.write(' Received query for service description.\\n');\n response.writeHead(200, { 'content-type': mediaType, 'Access-Control-Allow-Origin': '*' });\n\n if (headOnly) {\n response.end();\n return;\n }\n\n // eslint-disable-next-line id-length\n const s = request.url;\n const sd = 'http://www.w3.org/ns/sparql-service-description#';\n const quads: RDF.Quad[] = [\n // Basic metadata\n quad(s, 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type', `${sd}Service`),\n quad(s, `${sd}endpoint`, '/sparql'),\n quad(s, `${sd}url`, '/sparql'),\n\n // Features\n quad(s, `${sd}feature`, `${sd}BasicFederatedQuery`),\n quad(s, `${sd}supportedLanguage`, `${sd}SPARQL10Query`),\n quad(s, `${sd}supportedLanguage`, `${sd}SPARQL11Query`),\n ];\n\n let eventEmitter: EventEmitter;\n try {\n // Append result formats\n const formats = await engine.getResultMediaTypeFormats(new ActionContext(this.context));\n for (const format in formats) {\n quads.push(quad(s, `${sd}resultFormat`, formats[format]));\n }\n\n // Flush results\n const { data } = await engine.resultToString(<QueryQuads> {\n resultType: 'quads',\n execute: async() => new ArrayIterator(quads),\n metadata: <any> undefined,\n }, mediaType);\n data.on('error', (error: Error) => {\n stdout.write(`[500] Server error in results: ${error.message} \\n`);\n response.end('An internal server error occurred.\\n');\n });\n data.pipe(response);\n eventEmitter = data;\n } catch {\n stdout.write('[400] Bad request, invalid media type\\n');\n response.writeHead(400,\n { 'content-type': HttpServiceSparqlEndpoint.MIME_PLAIN, 'Access-Control-Allow-Origin': '*' });\n response.end('The response for the given query could not be serialized for the requested media type\\n');\n return;\n }\n this.stopResponse(response, 0, eventEmitter);\n }\n\n /**\n * Stop after timeout or if the connection is terminated\n * @param {module:http.ServerResponse} response Response object.\n * @param queryId The unique query id.\n * @param {NodeJS.ReadableStream} eventEmitter Query result stream.\n */\n public stopResponse(response: http.ServerResponse, queryId: number, eventEmitter?: EventEmitter): void {\n response.on('close', killClient);\n // eslint-disable-next-line @typescript-eslint/no-this-alias,consistent-this\n const self = this;\n function killClient(): void {\n if (eventEmitter) {\n // Remove all listeners so we are sure no more write calls are made\n eventEmitter.removeAllListeners();\n eventEmitter.on('error', () => {\n // Void any errors that may still occur\n });\n eventEmitter.emit('end');\n }\n try {\n response.end();\n } catch {\n // Do nothing\n }\n\n // Kill the worker if we want fresh workers per query\n if (self.freshWorkerPerQuery) {\n process.stderr.write(`Killing fresh worker ${process.pid} after query ${queryId}.\\n`);\n // eslint-disable-next-line unicorn/no-process-exit\n process.exit(15);\n }\n }\n }\n\n /**\n * Parses the body of a SPARQL POST request\n * @param {module:http.IncomingMessage} request Request object.\n * @return {Promise<IQueryBody>} A promise resolving to a query body object.\n */\n public parseBody(request: http.IncomingMessage): Promise<IQueryBody> {\n return new Promise((resolve, reject) => {\n let body = '';\n request.setEncoding('utf8');\n request.on('error', reject);\n request.on('data', chunk => {\n body += chunk;\n });\n request.on('end', () => {\n const contentType: string | undefined = request.headers['content-type'];\n if (contentType) {\n if (contentType.includes('application/sparql-query')) {\n return resolve({ type: 'query', value: body, context: undefined });\n }\n if (contentType.includes('application/sparql-update')) {\n return resolve({ type: 'void', value: body, context: undefined });\n }\n if (contentType.includes('application/x-www-form-urlencoded')) {\n const bodyStructure = querystring.parse(body);\n let context: Record<string, any> | undefined;\n if (bodyStructure.context) {\n try {\n context = JSON.parse(<string>bodyStructure.context);\n } catch (error: unknown) {\n reject(new Error(`Invalid POST body with context received ('${bodyStructure.context}'): ${(<Error> error).message}`));\n }\n }\n if (bodyStructure.query) {\n return resolve({ type: 'query', value: <string> bodyStructure.query, context });\n }\n if (bodyStructure.update) {\n return resolve({ type: 'void', value: <string> bodyStructure.update, context });\n }\n }\n }\n reject(new Error(`Invalid POST body received, query type could not be determined`));\n });\n });\n }\n}\n\nexport interface IQueryBody {\n type: 'query' | 'void';\n value: string;\n context: Record<string, any> | undefined;\n}\n\nexport interface IHttpServiceSparqlEndpointArgs extends IDynamicQueryEngineOptions {\n context?: any;\n timeout?: number;\n port?: number;\n workers?: number;\n invalidateCacheBeforeQuery?: boolean;\n freshWorkerPerQuery?: boolean;\n contextOverride?: boolean;\n moduleRootPath: string;\n defaultConfigPath: string;\n}\n/* eslint-enable import/no-nodejs-modules */\n"]}
@@ -28,7 +28,7 @@ class QueryEngineBase {
28
28
  async queryOfType(query, context, expectedType) {
29
29
  const result = await this.query(query, context);
30
30
  if (result.resultType === expectedType) {
31
- return result.execute();
31
+ return await result.execute();
32
32
  }
33
33
  throw new Error(`Query result type '${expectedType}' was expected, while '${result.resultType}' was found.`);
34
34
  }
@@ -1 +1 @@
1
- {"version":3,"file":"QueryEngineBase.js","sourceRoot":"","sources":["QueryEngineBase.ts"],"names":[],"mappings":"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","sourcesContent":["import { materializeOperation } from '@comunica/bus-query-operation';\nimport type { IActionSparqlSerialize, IActorQueryResultSerializeOutput } from '@comunica/bus-query-result-serialize';\nimport { KeysCore, KeysInitQuery, KeysRdfResolveQuadPattern } from '@comunica/context-entries';\nimport { ActionContext } from '@comunica/core';\nimport type {\n IActionContext, IPhysicalQueryPlanLogger,\n IQueryOperationResult,\n IQueryEngine, IQueryExplained,\n QueryFormatType,\n QueryType, QueryExplainMode, BindingsStream,\n QueryAlgebraContext, QueryStringContext, IQueryBindingsEnhanced,\n IQueryQuadsEnhanced, QueryEnhanced, IQueryContextCommon, FunctionArgumentsCache,\n} from '@comunica/types';\nimport type * as RDF from '@rdfjs/types';\nimport type { AsyncIterator } from 'asynciterator';\nimport type { Algebra } from 'sparqlalgebrajs';\nimport type { ActorInitQueryBase } from './ActorInitQueryBase';\nimport { MemoryPhysicalQueryPlanLogger } from './MemoryPhysicalQueryPlanLogger';\n\n/**\n * Base implementation of a Comunica query engine.\n */\nexport class QueryEngineBase<\n QueryContext extends IQueryContextCommon = IQueryContextCommon,\n QueryStringContextInner extends RDF.QueryStringContext = QueryStringContext,\n QueryAlgebraContextInner extends RDF.QueryAlgebraContext = QueryAlgebraContext>\nimplements IQueryEngine<QueryContext, QueryStringContextInner, QueryAlgebraContextInner> {\n private readonly actorInitQuery: ActorInitQueryBase;\n private readonly defaultFunctionArgumentsCache: FunctionArgumentsCache;\n\n public constructor(actorInitQuery: ActorInitQueryBase<QueryContext>) {\n this.actorInitQuery = actorInitQuery;\n this.defaultFunctionArgumentsCache = {};\n }\n\n public async queryBindings<QueryFormatTypeInner extends QueryFormatType>(\n query: QueryFormatTypeInner,\n context?: QueryFormatTypeInner extends string ? QueryStringContextInner : QueryAlgebraContextInner,\n ): Promise<BindingsStream> {\n return this.queryOfType<QueryFormatTypeInner, IQueryBindingsEnhanced>(query, context, 'bindings');\n }\n\n public async queryQuads<QueryFormatTypeInner extends QueryFormatType>(\n query: QueryFormatTypeInner,\n context?: QueryFormatTypeInner extends string ? QueryStringContextInner : QueryAlgebraContextInner,\n ): Promise<AsyncIterator<RDF.Quad> & RDF.ResultStream<RDF.Quad>> {\n return this.queryOfType<QueryFormatTypeInner, IQueryQuadsEnhanced>(query, context, 'quads');\n }\n\n public async queryBoolean<QueryFormatTypeInner extends QueryFormatType>(\n query: QueryFormatTypeInner,\n context?: QueryFormatTypeInner extends string ? QueryStringContextInner : QueryAlgebraContextInner,\n ): Promise<boolean> {\n return this.queryOfType<QueryFormatTypeInner, RDF.QueryBoolean>(query, context, 'boolean');\n }\n\n public async queryVoid<QueryFormatTypeInner extends QueryFormatType>(\n query: QueryFormatTypeInner,\n context?: QueryFormatTypeInner extends string ? QueryStringContextInner : QueryAlgebraContextInner,\n ): Promise<void> {\n return this.queryOfType<QueryFormatTypeInner, RDF.QueryVoid>(query, context, 'void');\n }\n\n protected async queryOfType<QueryFormatTypeInner extends QueryFormatType, QueryTypeOut extends QueryEnhanced>(\n query: QueryFormatTypeInner,\n context: undefined | (QueryFormatTypeInner extends string ?\n QueryStringContextInner : QueryAlgebraContextInner),\n expectedType: QueryTypeOut['resultType'],\n ): Promise<ReturnType<QueryTypeOut['execute']>> {\n const result = await this.query<QueryFormatTypeInner>(query, context);\n if (result.resultType === expectedType) {\n return result.execute();\n }\n throw new Error(`Query result type '${expectedType}' was expected, while '${result.resultType}' was found.`);\n }\n\n /**\n * Evaluate the given query\n * @param query A query string or algebra.\n * @param context An optional query context.\n * @return {Promise<QueryType>} A promise that resolves to the query output.\n */\n public async query<QueryFormatTypeInner extends QueryFormatType>(\n query: QueryFormatTypeInner,\n context?: QueryFormatTypeInner extends string ? QueryStringContextInner : QueryAlgebraContextInner,\n ): Promise<QueryType> {\n const output = await this.queryOrExplain(query, context);\n if ('explain' in output) {\n throw new Error(`Tried to explain a query when in query-only mode`);\n }\n return output;\n }\n\n /**\n * Explain the given query\n * @param {string | Algebra.Operation} query A query string or algebra.\n * @param context An optional query context.\n * @param explainMode The explain mode.\n * @return {Promise<QueryType | IQueryExplained>} A promise that resolves to\n * the query output or explanation.\n */\n public async explain<QueryFormatTypeInner extends QueryFormatType>(\n query: QueryFormatTypeInner,\n context: QueryFormatTypeInner extends string ? QueryStringContextInner : QueryAlgebraContextInner,\n explainMode: QueryExplainMode,\n ): Promise<IQueryExplained> {\n context.explain = explainMode;\n const output = await this.queryOrExplain(query, context);\n return <IQueryExplained> output;\n }\n\n /**\n * Evaluate or explain the given query\n * @param {string | Algebra.Operation} query A query string or algebra.\n * @param context An optional query context.\n * @return {Promise<QueryType | IQueryExplained>} A promise that resolves to\n * the query output or explanation.\n */\n public async queryOrExplain<QueryFormatTypeInner extends QueryFormatType>(\n query: QueryFormatTypeInner,\n context?: QueryFormatTypeInner extends string ? QueryStringContextInner : QueryAlgebraContextInner,\n ): Promise<QueryType | IQueryExplained> {\n context = context || <any>{};\n\n // Expand shortcuts\n for (const key in context) {\n if (this.actorInitQuery.contextKeyShortcuts[key]) {\n context[this.actorInitQuery.contextKeyShortcuts[key]] = context[key];\n delete context[key];\n }\n }\n\n // Prepare context\n let actionContext: IActionContext = new ActionContext(context);\n let queryFormat: RDF.QueryFormat = { language: 'sparql', version: '1.1' };\n if (actionContext.has(KeysInitQuery.queryFormat)) {\n queryFormat = actionContext.get(KeysInitQuery.queryFormat)!;\n actionContext = actionContext.delete(KeysInitQuery.queryFormat);\n if (queryFormat.language === 'graphql') {\n actionContext = actionContext.setDefault(KeysInitQuery.graphqlSingularizeVariables, {});\n }\n }\n const baseIRI: string | undefined = actionContext.get(KeysInitQuery.baseIRI);\n\n actionContext = actionContext\n .setDefault(KeysInitQuery.queryTimestamp, new Date())\n .setDefault(KeysRdfResolveQuadPattern.sourceIds, new Map())\n // Set the default logger if none is provided\n .setDefault(KeysCore.log, this.actorInitQuery.logger)\n .setDefault(KeysInitQuery.functionArgumentsCache, this.defaultFunctionArgumentsCache)\n .setDefault(KeysRdfResolveQuadPattern.hypermediaSourcesAggregatedStores, new Map());\n\n // Pre-processing the context\n actionContext = (await this.actorInitQuery.mediatorContextPreprocess.mediate({ context: actionContext })).context;\n\n // Determine explain mode\n const explainMode: QueryExplainMode = actionContext.get(KeysInitQuery.explain)!;\n\n // Parse query\n let operation: Algebra.Operation;\n if (typeof query === 'string') {\n // Save the original query string in the context\n actionContext = actionContext.set(KeysInitQuery.queryString, query);\n\n const queryParseOutput = await this.actorInitQuery.mediatorQueryParse\n .mediate({ context: actionContext, query, queryFormat, baseIRI });\n operation = queryParseOutput.operation;\n // Update the baseIRI in the context if the query modified it.\n if (queryParseOutput.baseIRI) {\n actionContext = actionContext.set(KeysInitQuery.baseIRI, queryParseOutput.baseIRI);\n }\n } else {\n operation = query;\n }\n\n // Print parsed query\n if (explainMode === 'parsed') {\n return {\n explain: true,\n type: explainMode,\n data: operation,\n };\n }\n\n // Apply initial bindings in context\n if (actionContext.has(KeysInitQuery.initialBindings)) {\n operation = materializeOperation(operation, actionContext.get(KeysInitQuery.initialBindings)!);\n\n // Delete the query string from the context, since our initial query might have changed\n actionContext = actionContext.delete(KeysInitQuery.queryString);\n }\n\n // Optimize the query operation\n const mediatorResult = await this.actorInitQuery.mediatorOptimizeQueryOperation\n .mediate({ context: actionContext, operation });\n operation = mediatorResult.operation;\n actionContext = mediatorResult.context || actionContext;\n\n // Print logical query plan\n if (explainMode === 'logical') {\n return {\n explain: true,\n type: explainMode,\n data: operation,\n };\n }\n\n // Save original query in context\n actionContext = actionContext.set(KeysInitQuery.query, operation);\n\n // If we need a physical query plan, store a physical query plan logger in the context, and collect it after exec\n let physicalQueryPlanLogger: IPhysicalQueryPlanLogger | undefined;\n if (explainMode === 'physical') {\n physicalQueryPlanLogger = new MemoryPhysicalQueryPlanLogger();\n actionContext = actionContext.set(KeysInitQuery.physicalQueryPlanLogger, physicalQueryPlanLogger);\n }\n\n // Execute query\n const output = await this.actorInitQuery.mediatorQueryOperation.mediate({\n context: actionContext,\n operation,\n });\n output.context = actionContext;\n\n const finalOutput = QueryEngineBase.internalToFinalResult(output);\n\n // Output physical query plan after query exec if needed\n if (physicalQueryPlanLogger) {\n // Make sure the whole result is produced\n switch (finalOutput.resultType) {\n case 'bindings':\n await (await finalOutput.execute()).toArray();\n break;\n case 'quads':\n await (await finalOutput.execute()).toArray();\n break;\n case 'boolean':\n await finalOutput.execute();\n break;\n case 'void':\n await finalOutput.execute();\n break;\n }\n\n return {\n explain: true,\n type: explainMode,\n data: physicalQueryPlanLogger.toJson(),\n };\n }\n\n return finalOutput;\n }\n\n /**\n * @param context An optional context.\n * @return {Promise<{[p: string]: number}>} All available SPARQL (weighted) result media types.\n */\n public async getResultMediaTypes(context?: any): Promise<Record<string, number>> {\n context = ActionContext.ensureActionContext(context);\n return (await this.actorInitQuery.mediatorQueryResultSerializeMediaTypeCombiner\n .mediate({ context, mediaTypes: true })).mediaTypes;\n }\n\n /**\n * @param context An optional context.\n * @return {Promise<{[p: string]: number}>} All available SPARQL result media type formats.\n */\n public async getResultMediaTypeFormats(context?: any): Promise<Record<string, string>> {\n context = ActionContext.ensureActionContext(context);\n return (await this.actorInitQuery.mediatorQueryResultSerializeMediaTypeFormatCombiner\n .mediate({ context, mediaTypeFormats: true })).mediaTypeFormats;\n }\n\n /**\n * Convert a query result to a string stream based on a certain media type.\n * @param {IQueryOperationResult} queryResult A query result.\n * @param {string} mediaType A media type.\n * @param {ActionContext} context An optional context.\n * @return {Promise<IActorQueryResultSerializeOutput>} A text stream.\n */\n public async resultToString(queryResult: RDF.Query<any>, mediaType?: string, context?: any):\n Promise<IActorQueryResultSerializeOutput> {\n context = ActionContext.ensureActionContext(context);\n if (!mediaType) {\n switch (queryResult.resultType) {\n case 'bindings':\n mediaType = 'application/json';\n break;\n case 'quads':\n mediaType = 'application/trig';\n break;\n default:\n mediaType = 'simple';\n break;\n }\n }\n const handle: IActionSparqlSerialize = { ...await QueryEngineBase.finalToInternalResult(queryResult), context };\n return (await this.actorInitQuery.mediatorQueryResultSerialize\n .mediate({ context, handle, handleMediaType: mediaType })).handle;\n }\n\n /**\n * Invalidate all internal caches related to the given page URL.\n * If no page URL is given, then all pages will be invalidated.\n * @param {string} url The page URL to invalidate.\n * @param context An optional ActionContext to pass to the actors.\n * @return {Promise<any>} A promise resolving when the caches have been invalidated.\n */\n public invalidateHttpCache(url?: string, context?: any): Promise<any> {\n context = ActionContext.ensureActionContext(context);\n return this.actorInitQuery.mediatorHttpInvalidate.mediate({ url, context });\n }\n\n /**\n * Convert an internal query result to a final one.\n * @param internalResult An intermediary query result.\n */\n public static internalToFinalResult(internalResult: IQueryOperationResult): QueryType {\n switch (internalResult.type) {\n case 'bindings':\n return {\n resultType: 'bindings',\n execute: async() => internalResult.bindingsStream,\n metadata: async() => <any> await internalResult.metadata(),\n context: internalResult.context,\n };\n case 'quads':\n return {\n resultType: 'quads',\n execute: async() => internalResult.quadStream,\n metadata: async() => <any> await internalResult.metadata(),\n context: internalResult.context,\n };\n case 'boolean':\n return {\n resultType: 'boolean',\n execute: async() => internalResult.execute(),\n context: internalResult.context,\n };\n case 'void':\n return {\n resultType: 'void',\n execute: async() => internalResult.execute(),\n context: internalResult.context,\n };\n }\n }\n\n /**\n * Convert a final query result to an internal one.\n * @param finalResult A final query result.\n */\n public static async finalToInternalResult(finalResult: RDF.Query<any>): Promise<IQueryOperationResult> {\n switch (finalResult.resultType) {\n case 'bindings':\n return {\n type: 'bindings',\n bindingsStream: <BindingsStream> await finalResult.execute(),\n metadata: async() => <any> await finalResult.metadata(),\n };\n case 'quads':\n return {\n type: 'quads',\n quadStream: <AsyncIterator<RDF.Quad>> await finalResult.execute(),\n metadata: async() => <any> await finalResult.metadata(),\n };\n case 'boolean':\n return {\n type: 'boolean',\n execute: () => finalResult.execute(),\n };\n case 'void':\n return {\n type: 'void',\n execute: () => finalResult.execute(),\n };\n }\n }\n}\n"]}
1
+ {"version":3,"file":"QueryEngineBase.js","sourceRoot":"","sources":["QueryEngineBase.ts"],"names":[],"mappings":"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","sourcesContent":["import { materializeOperation } from '@comunica/bus-query-operation';\nimport type { IActionSparqlSerialize, IActorQueryResultSerializeOutput } from '@comunica/bus-query-result-serialize';\nimport { KeysCore, KeysInitQuery, KeysRdfResolveQuadPattern } from '@comunica/context-entries';\nimport { ActionContext } from '@comunica/core';\nimport type {\n IActionContext, IPhysicalQueryPlanLogger,\n IQueryOperationResult,\n IQueryEngine, IQueryExplained,\n QueryFormatType,\n QueryType, QueryExplainMode, BindingsStream,\n QueryAlgebraContext, QueryStringContext, IQueryBindingsEnhanced,\n IQueryQuadsEnhanced, QueryEnhanced, IQueryContextCommon, FunctionArgumentsCache,\n} from '@comunica/types';\nimport type * as RDF from '@rdfjs/types';\nimport type { AsyncIterator } from 'asynciterator';\nimport type { Algebra } from 'sparqlalgebrajs';\nimport type { ActorInitQueryBase } from './ActorInitQueryBase';\nimport { MemoryPhysicalQueryPlanLogger } from './MemoryPhysicalQueryPlanLogger';\n\n/**\n * Base implementation of a Comunica query engine.\n */\nexport class QueryEngineBase<\n QueryContext extends IQueryContextCommon = IQueryContextCommon,\n QueryStringContextInner extends RDF.QueryStringContext = QueryStringContext,\n QueryAlgebraContextInner extends RDF.QueryAlgebraContext = QueryAlgebraContext>\nimplements IQueryEngine<QueryContext, QueryStringContextInner, QueryAlgebraContextInner> {\n private readonly actorInitQuery: ActorInitQueryBase;\n private readonly defaultFunctionArgumentsCache: FunctionArgumentsCache;\n\n public constructor(actorInitQuery: ActorInitQueryBase<QueryContext>) {\n this.actorInitQuery = actorInitQuery;\n this.defaultFunctionArgumentsCache = {};\n }\n\n public async queryBindings<QueryFormatTypeInner extends QueryFormatType>(\n query: QueryFormatTypeInner,\n context?: QueryFormatTypeInner extends string ? QueryStringContextInner : QueryAlgebraContextInner,\n ): Promise<BindingsStream> {\n return this.queryOfType<QueryFormatTypeInner, IQueryBindingsEnhanced>(query, context, 'bindings');\n }\n\n public async queryQuads<QueryFormatTypeInner extends QueryFormatType>(\n query: QueryFormatTypeInner,\n context?: QueryFormatTypeInner extends string ? QueryStringContextInner : QueryAlgebraContextInner,\n ): Promise<AsyncIterator<RDF.Quad> & RDF.ResultStream<RDF.Quad>> {\n return this.queryOfType<QueryFormatTypeInner, IQueryQuadsEnhanced>(query, context, 'quads');\n }\n\n public async queryBoolean<QueryFormatTypeInner extends QueryFormatType>(\n query: QueryFormatTypeInner,\n context?: QueryFormatTypeInner extends string ? QueryStringContextInner : QueryAlgebraContextInner,\n ): Promise<boolean> {\n return this.queryOfType<QueryFormatTypeInner, RDF.QueryBoolean>(query, context, 'boolean');\n }\n\n public async queryVoid<QueryFormatTypeInner extends QueryFormatType>(\n query: QueryFormatTypeInner,\n context?: QueryFormatTypeInner extends string ? QueryStringContextInner : QueryAlgebraContextInner,\n ): Promise<void> {\n return this.queryOfType<QueryFormatTypeInner, RDF.QueryVoid>(query, context, 'void');\n }\n\n protected async queryOfType<QueryFormatTypeInner extends QueryFormatType, QueryTypeOut extends QueryEnhanced>(\n query: QueryFormatTypeInner,\n context: undefined | (QueryFormatTypeInner extends string ?\n QueryStringContextInner : QueryAlgebraContextInner),\n expectedType: QueryTypeOut['resultType'],\n ): Promise<ReturnType<QueryTypeOut['execute']>> {\n const result = await this.query<QueryFormatTypeInner>(query, context);\n if (result.resultType === expectedType) {\n return <ReturnType<QueryTypeOut['execute']>> await result.execute();\n }\n throw new Error(`Query result type '${expectedType}' was expected, while '${result.resultType}' was found.`);\n }\n\n /**\n * Evaluate the given query\n * @param query A query string or algebra.\n * @param context An optional query context.\n * @return {Promise<QueryType>} A promise that resolves to the query output.\n */\n public async query<QueryFormatTypeInner extends QueryFormatType>(\n query: QueryFormatTypeInner,\n context?: QueryFormatTypeInner extends string ? QueryStringContextInner : QueryAlgebraContextInner,\n ): Promise<QueryType> {\n const output = await this.queryOrExplain(query, context);\n if ('explain' in output) {\n throw new Error(`Tried to explain a query when in query-only mode`);\n }\n return output;\n }\n\n /**\n * Explain the given query\n * @param {string | Algebra.Operation} query A query string or algebra.\n * @param context An optional query context.\n * @param explainMode The explain mode.\n * @return {Promise<QueryType | IQueryExplained>} A promise that resolves to\n * the query output or explanation.\n */\n public async explain<QueryFormatTypeInner extends QueryFormatType>(\n query: QueryFormatTypeInner,\n context: QueryFormatTypeInner extends string ? QueryStringContextInner : QueryAlgebraContextInner,\n explainMode: QueryExplainMode,\n ): Promise<IQueryExplained> {\n context.explain = explainMode;\n const output = await this.queryOrExplain(query, context);\n return <IQueryExplained> output;\n }\n\n /**\n * Evaluate or explain the given query\n * @param {string | Algebra.Operation} query A query string or algebra.\n * @param context An optional query context.\n * @return {Promise<QueryType | IQueryExplained>} A promise that resolves to\n * the query output or explanation.\n */\n public async queryOrExplain<QueryFormatTypeInner extends QueryFormatType>(\n query: QueryFormatTypeInner,\n context?: QueryFormatTypeInner extends string ? QueryStringContextInner : QueryAlgebraContextInner,\n ): Promise<QueryType | IQueryExplained> {\n context = context || <any>{};\n\n // Expand shortcuts\n for (const key in context) {\n if (this.actorInitQuery.contextKeyShortcuts[key]) {\n context[this.actorInitQuery.contextKeyShortcuts[key]] = context[key];\n delete context[key];\n }\n }\n\n // Prepare context\n let actionContext: IActionContext = new ActionContext(context);\n let queryFormat: RDF.QueryFormat = { language: 'sparql', version: '1.1' };\n if (actionContext.has(KeysInitQuery.queryFormat)) {\n queryFormat = actionContext.get(KeysInitQuery.queryFormat)!;\n actionContext = actionContext.delete(KeysInitQuery.queryFormat);\n if (queryFormat.language === 'graphql') {\n actionContext = actionContext.setDefault(KeysInitQuery.graphqlSingularizeVariables, {});\n }\n }\n const baseIRI: string | undefined = actionContext.get(KeysInitQuery.baseIRI);\n\n actionContext = actionContext\n .setDefault(KeysInitQuery.queryTimestamp, new Date())\n .setDefault(KeysRdfResolveQuadPattern.sourceIds, new Map())\n // Set the default logger if none is provided\n .setDefault(KeysCore.log, this.actorInitQuery.logger)\n .setDefault(KeysInitQuery.functionArgumentsCache, this.defaultFunctionArgumentsCache)\n .setDefault(KeysRdfResolveQuadPattern.hypermediaSourcesAggregatedStores, new Map());\n\n // Pre-processing the context\n actionContext = (await this.actorInitQuery.mediatorContextPreprocess.mediate({ context: actionContext })).context;\n\n // Determine explain mode\n const explainMode: QueryExplainMode = actionContext.get(KeysInitQuery.explain)!;\n\n // Parse query\n let operation: Algebra.Operation;\n if (typeof query === 'string') {\n // Save the original query string in the context\n actionContext = actionContext.set(KeysInitQuery.queryString, query);\n\n const queryParseOutput = await this.actorInitQuery.mediatorQueryParse\n .mediate({ context: actionContext, query, queryFormat, baseIRI });\n operation = queryParseOutput.operation;\n // Update the baseIRI in the context if the query modified it.\n if (queryParseOutput.baseIRI) {\n actionContext = actionContext.set(KeysInitQuery.baseIRI, queryParseOutput.baseIRI);\n }\n } else {\n operation = query;\n }\n\n // Print parsed query\n if (explainMode === 'parsed') {\n return {\n explain: true,\n type: explainMode,\n data: operation,\n };\n }\n\n // Apply initial bindings in context\n if (actionContext.has(KeysInitQuery.initialBindings)) {\n operation = materializeOperation(operation, actionContext.get(KeysInitQuery.initialBindings)!);\n\n // Delete the query string from the context, since our initial query might have changed\n actionContext = actionContext.delete(KeysInitQuery.queryString);\n }\n\n // Optimize the query operation\n const mediatorResult = await this.actorInitQuery.mediatorOptimizeQueryOperation\n .mediate({ context: actionContext, operation });\n operation = mediatorResult.operation;\n actionContext = mediatorResult.context || actionContext;\n\n // Print logical query plan\n if (explainMode === 'logical') {\n return {\n explain: true,\n type: explainMode,\n data: operation,\n };\n }\n\n // Save original query in context\n actionContext = actionContext.set(KeysInitQuery.query, operation);\n\n // If we need a physical query plan, store a physical query plan logger in the context, and collect it after exec\n let physicalQueryPlanLogger: IPhysicalQueryPlanLogger | undefined;\n if (explainMode === 'physical') {\n physicalQueryPlanLogger = new MemoryPhysicalQueryPlanLogger();\n actionContext = actionContext.set(KeysInitQuery.physicalQueryPlanLogger, physicalQueryPlanLogger);\n }\n\n // Execute query\n const output = await this.actorInitQuery.mediatorQueryOperation.mediate({\n context: actionContext,\n operation,\n });\n output.context = actionContext;\n\n const finalOutput = QueryEngineBase.internalToFinalResult(output);\n\n // Output physical query plan after query exec if needed\n if (physicalQueryPlanLogger) {\n // Make sure the whole result is produced\n switch (finalOutput.resultType) {\n case 'bindings':\n await (await finalOutput.execute()).toArray();\n break;\n case 'quads':\n await (await finalOutput.execute()).toArray();\n break;\n case 'boolean':\n await finalOutput.execute();\n break;\n case 'void':\n await finalOutput.execute();\n break;\n }\n\n return {\n explain: true,\n type: explainMode,\n data: physicalQueryPlanLogger.toJson(),\n };\n }\n\n return finalOutput;\n }\n\n /**\n * @param context An optional context.\n * @return {Promise<{[p: string]: number}>} All available SPARQL (weighted) result media types.\n */\n public async getResultMediaTypes(context?: any): Promise<Record<string, number>> {\n context = ActionContext.ensureActionContext(context);\n return (await this.actorInitQuery.mediatorQueryResultSerializeMediaTypeCombiner\n .mediate({ context, mediaTypes: true })).mediaTypes;\n }\n\n /**\n * @param context An optional context.\n * @return {Promise<{[p: string]: number}>} All available SPARQL result media type formats.\n */\n public async getResultMediaTypeFormats(context?: any): Promise<Record<string, string>> {\n context = ActionContext.ensureActionContext(context);\n return (await this.actorInitQuery.mediatorQueryResultSerializeMediaTypeFormatCombiner\n .mediate({ context, mediaTypeFormats: true })).mediaTypeFormats;\n }\n\n /**\n * Convert a query result to a string stream based on a certain media type.\n * @param {IQueryOperationResult} queryResult A query result.\n * @param {string} mediaType A media type.\n * @param {ActionContext} context An optional context.\n * @return {Promise<IActorQueryResultSerializeOutput>} A text stream.\n */\n public async resultToString(queryResult: RDF.Query<any>, mediaType?: string, context?: any):\n Promise<IActorQueryResultSerializeOutput> {\n context = ActionContext.ensureActionContext(context);\n if (!mediaType) {\n switch (queryResult.resultType) {\n case 'bindings':\n mediaType = 'application/json';\n break;\n case 'quads':\n mediaType = 'application/trig';\n break;\n default:\n mediaType = 'simple';\n break;\n }\n }\n const handle: IActionSparqlSerialize = { ...await QueryEngineBase.finalToInternalResult(queryResult), context };\n return (await this.actorInitQuery.mediatorQueryResultSerialize\n .mediate({ context, handle, handleMediaType: mediaType })).handle;\n }\n\n /**\n * Invalidate all internal caches related to the given page URL.\n * If no page URL is given, then all pages will be invalidated.\n * @param {string} url The page URL to invalidate.\n * @param context An optional ActionContext to pass to the actors.\n * @return {Promise<any>} A promise resolving when the caches have been invalidated.\n */\n public invalidateHttpCache(url?: string, context?: any): Promise<any> {\n context = ActionContext.ensureActionContext(context);\n return this.actorInitQuery.mediatorHttpInvalidate.mediate({ url, context });\n }\n\n /**\n * Convert an internal query result to a final one.\n * @param internalResult An intermediary query result.\n */\n public static internalToFinalResult(internalResult: IQueryOperationResult): QueryType {\n switch (internalResult.type) {\n case 'bindings':\n return {\n resultType: 'bindings',\n execute: async() => internalResult.bindingsStream,\n metadata: async() => <any> await internalResult.metadata(),\n context: internalResult.context,\n };\n case 'quads':\n return {\n resultType: 'quads',\n execute: async() => internalResult.quadStream,\n metadata: async() => <any> await internalResult.metadata(),\n context: internalResult.context,\n };\n case 'boolean':\n return {\n resultType: 'boolean',\n execute: async() => internalResult.execute(),\n context: internalResult.context,\n };\n case 'void':\n return {\n resultType: 'void',\n execute: async() => internalResult.execute(),\n context: internalResult.context,\n };\n }\n }\n\n /**\n * Convert a final query result to an internal one.\n * @param finalResult A final query result.\n */\n public static async finalToInternalResult(finalResult: RDF.Query<any>): Promise<IQueryOperationResult> {\n switch (finalResult.resultType) {\n case 'bindings':\n return {\n type: 'bindings',\n bindingsStream: <BindingsStream> await finalResult.execute(),\n metadata: async() => <any> await finalResult.metadata(),\n };\n case 'quads':\n return {\n type: 'quads',\n quadStream: <AsyncIterator<RDF.Quad>> await finalResult.execute(),\n metadata: async() => <any> await finalResult.metadata(),\n };\n case 'boolean':\n return {\n type: 'boolean',\n execute: () => finalResult.execute(),\n };\n case 'void':\n return {\n type: 'void',\n execute: () => finalResult.execute(),\n };\n }\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@comunica/actor-init-query",
3
- "version": "2.7.1",
3
+ "version": "2.8.0",
4
4
  "description": "A query init actor",
5
5
  "lsd:module": true,
6
6
  "main": "lib/index.js",
@@ -32,19 +32,19 @@
32
32
  "lib/**/*.js.map"
33
33
  ],
34
34
  "dependencies": {
35
- "@comunica/actor-http-proxy": "^2.7.0",
36
- "@comunica/bus-context-preprocess": "^2.7.0",
37
- "@comunica/bus-http-invalidate": "^2.7.0",
38
- "@comunica/bus-init": "^2.7.0",
39
- "@comunica/bus-optimize-query-operation": "^2.7.0",
40
- "@comunica/bus-query-operation": "^2.7.1",
41
- "@comunica/bus-query-parse": "^2.7.0",
42
- "@comunica/bus-query-result-serialize": "^2.7.0",
43
- "@comunica/context-entries": "^2.7.0",
44
- "@comunica/core": "^2.7.0",
45
- "@comunica/logger-pretty": "^2.7.0",
46
- "@comunica/runner": "^2.7.0",
47
- "@comunica/types": "^2.7.0",
35
+ "@comunica/actor-http-proxy": "^2.8.0",
36
+ "@comunica/bus-context-preprocess": "^2.8.0",
37
+ "@comunica/bus-http-invalidate": "^2.8.0",
38
+ "@comunica/bus-init": "^2.8.0",
39
+ "@comunica/bus-optimize-query-operation": "^2.8.0",
40
+ "@comunica/bus-query-operation": "^2.8.0",
41
+ "@comunica/bus-query-parse": "^2.8.0",
42
+ "@comunica/bus-query-result-serialize": "^2.8.0",
43
+ "@comunica/context-entries": "^2.8.0",
44
+ "@comunica/core": "^2.8.0",
45
+ "@comunica/logger-pretty": "^2.8.0",
46
+ "@comunica/runner": "^2.8.0",
47
+ "@comunica/types": "^2.8.0",
48
48
  "@rdfjs/types": "*",
49
49
  "@types/yargs": "^17.0.13",
50
50
  "asynciterator": "^3.8.0",
@@ -52,7 +52,7 @@
52
52
  "process": "^0.11.10",
53
53
  "rdf-quad": "^1.5.0",
54
54
  "rdf-string": "^1.6.1",
55
- "sparqlalgebrajs": "^4.0.5",
55
+ "sparqlalgebrajs": "^4.2.0",
56
56
  "streamify-string": "^1.0.1",
57
57
  "yargs": "^17.6.2"
58
58
  },
@@ -67,5 +67,5 @@
67
67
  "browser": {
68
68
  "./lib/index.js": "./lib/index-browser.js"
69
69
  },
70
- "gitHead": "1095ec8f2d2ef1522f25f291be27cf98772fd8a0"
70
+ "gitHead": "2459c84cb0ddc959436d8742f1f7b2805ce09825"
71
71
  }