@comunica/actor-init-query 4.2.0 → 4.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/HttpServiceSparqlEndpoint.jsonld +4 -0
- package/components/QueryEngineBase.jsonld +0 -44
- package/lib/HttpServiceSparqlEndpoint.d.ts +4 -0
- package/lib/HttpServiceSparqlEndpoint.js +29 -2
- package/lib/HttpServiceSparqlEndpoint.js.map +1 -1
- package/lib/VoidMetadataEmitter.d.ts +32 -0
- package/lib/VoidMetadataEmitter.js +174 -0
- package/lib/VoidMetadataEmitter.js.map +1 -0
- package/lib/cli/CliArgsHandlerBase.js +8 -0
- package/lib/cli/CliArgsHandlerBase.js.map +1 -1
- package/lib/cli/CliArgsHandlerHttp.js +8 -1
- package/lib/cli/CliArgsHandlerHttp.js.map +1 -1
- package/package.json +13 -12
|
@@ -55,6 +55,10 @@
|
|
|
55
55
|
"@id": "caiq:components/HttpServiceSparqlEndpoint.jsonld#IHttpServiceSparqlEndpointArgs__member_contextOverride",
|
|
56
56
|
"memberFieldName": "contextOverride"
|
|
57
57
|
},
|
|
58
|
+
{
|
|
59
|
+
"@id": "caiq:components/HttpServiceSparqlEndpoint.jsonld#IHttpServiceSparqlEndpointArgs__member_emitVoid",
|
|
60
|
+
"memberFieldName": "emitVoid"
|
|
61
|
+
},
|
|
58
62
|
{
|
|
59
63
|
"@id": "caiq:components/HttpServiceSparqlEndpoint.jsonld#IHttpServiceSparqlEndpointArgs__member_moduleRootPath",
|
|
60
64
|
"memberFieldName": "moduleRootPath"
|
|
@@ -23,28 +23,6 @@
|
|
|
23
23
|
"@type": "ParameterRangeIntersection",
|
|
24
24
|
"parameterRangeElements": [
|
|
25
25
|
"urn:npm:@rdfjs/types:QueryStringContext",
|
|
26
|
-
{
|
|
27
|
-
"@type": "ParameterRangeGenericComponent",
|
|
28
|
-
"component": "urn:npm:@rdfjs/types:QuerySourceContext",
|
|
29
|
-
"genericTypeInstances": [
|
|
30
|
-
{
|
|
31
|
-
"@type": "ParameterRangeUnion",
|
|
32
|
-
"parameterRangeElements": [
|
|
33
|
-
"xsd:string",
|
|
34
|
-
"urn:npm:@rdfjs/types:Source",
|
|
35
|
-
"urn:npm:@rdfjs/types:Store",
|
|
36
|
-
{
|
|
37
|
-
"@type": "ParameterRangeUnion",
|
|
38
|
-
"parameterRangeElements": [
|
|
39
|
-
"ct:components/IQuerySource.jsonld#IQuerySourceUnidentifiedExpanded",
|
|
40
|
-
"ct:components/IQuerySource.jsonld#IQuerySourceSerialized"
|
|
41
|
-
]
|
|
42
|
-
},
|
|
43
|
-
"ct:components/IQuerySource.jsonld#IQuerySourceUnidentifiedExpandedRawContext"
|
|
44
|
-
]
|
|
45
|
-
}
|
|
46
|
-
]
|
|
47
|
-
},
|
|
48
26
|
"ct:components/IQueryContext.jsonld#IQueryContextCommon"
|
|
49
27
|
]
|
|
50
28
|
}
|
|
@@ -56,28 +34,6 @@
|
|
|
56
34
|
"@type": "ParameterRangeIntersection",
|
|
57
35
|
"parameterRangeElements": [
|
|
58
36
|
"urn:npm:@rdfjs/types:QueryContext",
|
|
59
|
-
{
|
|
60
|
-
"@type": "ParameterRangeGenericComponent",
|
|
61
|
-
"component": "urn:npm:@rdfjs/types:QuerySourceContext",
|
|
62
|
-
"genericTypeInstances": [
|
|
63
|
-
{
|
|
64
|
-
"@type": "ParameterRangeUnion",
|
|
65
|
-
"parameterRangeElements": [
|
|
66
|
-
"xsd:string",
|
|
67
|
-
"urn:npm:@rdfjs/types:Source",
|
|
68
|
-
"urn:npm:@rdfjs/types:Store",
|
|
69
|
-
{
|
|
70
|
-
"@type": "ParameterRangeUnion",
|
|
71
|
-
"parameterRangeElements": [
|
|
72
|
-
"ct:components/IQuerySource.jsonld#IQuerySourceUnidentifiedExpanded",
|
|
73
|
-
"ct:components/IQuerySource.jsonld#IQuerySourceSerialized"
|
|
74
|
-
]
|
|
75
|
-
},
|
|
76
|
-
"ct:components/IQuerySource.jsonld#IQuerySourceUnidentifiedExpandedRawContext"
|
|
77
|
-
]
|
|
78
|
-
}
|
|
79
|
-
]
|
|
80
|
-
},
|
|
81
37
|
"ct:components/IQueryContext.jsonld#IQueryContextCommon"
|
|
82
38
|
]
|
|
83
39
|
}
|
|
@@ -8,6 +8,7 @@ import type { Writable } from 'node:stream';
|
|
|
8
8
|
import type { ICliArgsHandler } from '@comunica/types';
|
|
9
9
|
import type { IDynamicQueryEngineOptions } from '..';
|
|
10
10
|
import { QueryEngineBase } from '..';
|
|
11
|
+
import { VoidMetadataEmitter } from './VoidMetadataEmitter';
|
|
11
12
|
/**
|
|
12
13
|
* An HTTP service that exposes a Comunica engine as a SPARQL endpoint.
|
|
13
14
|
*/
|
|
@@ -21,6 +22,8 @@ export declare class HttpServiceSparqlEndpoint {
|
|
|
21
22
|
readonly workers: number;
|
|
22
23
|
readonly freshWorkerPerQuery: boolean;
|
|
23
24
|
readonly contextOverride: boolean;
|
|
25
|
+
readonly emitVoid: boolean;
|
|
26
|
+
readonly voidMetadataEmitter: VoidMetadataEmitter;
|
|
24
27
|
lastQueryId: number;
|
|
25
28
|
constructor(args: IHttpServiceSparqlEndpointArgs);
|
|
26
29
|
/**
|
|
@@ -120,6 +123,7 @@ export interface IHttpServiceSparqlEndpointArgs extends IDynamicQueryEngineOptio
|
|
|
120
123
|
workers?: number;
|
|
121
124
|
freshWorkerPerQuery?: boolean;
|
|
122
125
|
contextOverride?: boolean;
|
|
126
|
+
emitVoid?: boolean;
|
|
123
127
|
moduleRootPath: string;
|
|
124
128
|
defaultConfigPath: string;
|
|
125
129
|
}
|
|
@@ -7,10 +7,12 @@ const url = require("node:url");
|
|
|
7
7
|
const context_entries_1 = require("@comunica/context-entries");
|
|
8
8
|
const core_1 = require("@comunica/core");
|
|
9
9
|
const asynciterator_1 = require("asynciterator");
|
|
10
|
+
const sparqlalgebrajs_1 = require("sparqlalgebrajs");
|
|
10
11
|
const yargs_1 = require("yargs");
|
|
11
12
|
const __1 = require("..");
|
|
12
13
|
const CliArgsHandlerBase_1 = require("./cli/CliArgsHandlerBase");
|
|
13
14
|
const CliArgsHandlerHttp_1 = require("./cli/CliArgsHandlerHttp");
|
|
15
|
+
const VoidMetadataEmitter_1 = require("./VoidMetadataEmitter");
|
|
14
16
|
// Use require instead of import for default exports, to be compatible with variants of esModuleInterop in tsconfig.
|
|
15
17
|
const clusterUntyped = require('node:cluster');
|
|
16
18
|
const process = require('process/');
|
|
@@ -29,6 +31,8 @@ class HttpServiceSparqlEndpoint {
|
|
|
29
31
|
this.workers = args.workers ?? 1;
|
|
30
32
|
this.freshWorkerPerQuery = Boolean(args.freshWorkerPerQuery);
|
|
31
33
|
this.contextOverride = Boolean(args.contextOverride);
|
|
34
|
+
this.emitVoid = Boolean(args.emitVoid);
|
|
35
|
+
this.voidMetadataEmitter = new VoidMetadataEmitter_1.VoidMetadataEmitter(this.context);
|
|
32
36
|
this.engine = new __1.QueryEngineFactoryBase(args.moduleRootPath, args.defaultConfigPath, actorInitQuery => new __1.QueryEngineBase(actorInitQuery)).create(args);
|
|
33
37
|
}
|
|
34
38
|
/**
|
|
@@ -99,6 +103,7 @@ class HttpServiceSparqlEndpoint {
|
|
|
99
103
|
}
|
|
100
104
|
const freshWorkerPerQuery = args.freshWorker;
|
|
101
105
|
const contextOverride = args.contextOverride;
|
|
106
|
+
const emitVoid = args.emitVoid;
|
|
102
107
|
const port = args.port;
|
|
103
108
|
const timeout = args.timeout * 1_000;
|
|
104
109
|
const workers = args.workers;
|
|
@@ -110,6 +115,7 @@ class HttpServiceSparqlEndpoint {
|
|
|
110
115
|
context,
|
|
111
116
|
freshWorkerPerQuery,
|
|
112
117
|
contextOverride,
|
|
118
|
+
emitVoid,
|
|
113
119
|
moduleRootPath,
|
|
114
120
|
mainModulePath: moduleRootPath,
|
|
115
121
|
port,
|
|
@@ -260,7 +266,7 @@ class HttpServiceSparqlEndpoint {
|
|
|
260
266
|
// eslint-disable-next-line node/no-deprecated-api
|
|
261
267
|
const requestUrl = url.parse(request.url ?? '', true);
|
|
262
268
|
if (requestUrl.pathname === '/' || request.url === '/') {
|
|
263
|
-
stdout.write('[301] Permanently moved. Redirected to /sparql
|
|
269
|
+
stdout.write('[301] Permanently moved. Redirected to /sparql.\n');
|
|
264
270
|
response.writeHead(301, { 'content-type': HttpServiceSparqlEndpoint.MIME_JSON, 'Access-Control-Allow-Origin': '*', Location: `http://localhost:${this.port}/sparql${requestUrl.search ?? ''}` });
|
|
265
271
|
response.end(JSON.stringify({ message: 'Queries are accepted on /sparql. Redirected.' }));
|
|
266
272
|
return;
|
|
@@ -338,6 +344,16 @@ class HttpServiceSparqlEndpoint {
|
|
|
338
344
|
response.end(error.message);
|
|
339
345
|
return;
|
|
340
346
|
}
|
|
347
|
+
// If the query was an update query, invalidate the void metadata emitter cache
|
|
348
|
+
if (this.emitVoid &&
|
|
349
|
+
// Try to check parsed operation
|
|
350
|
+
((result.context && result.context.has(context_entries_1.KeysQueryOperation.operation) &&
|
|
351
|
+
// eslint-disable-next-line ts/prefer-nullish-coalescing
|
|
352
|
+
result.context.getSafe(context_entries_1.KeysQueryOperation.operation).type === sparqlalgebrajs_1.Algebra.types.DELETE_INSERT) ||
|
|
353
|
+
// Fallback to query string
|
|
354
|
+
/(INSERT|DELETE)/iu.test(queryBody.value))) {
|
|
355
|
+
this.voidMetadataEmitter.invalidateCache();
|
|
356
|
+
}
|
|
341
357
|
// Default to SPARQL JSON for bindings and boolean
|
|
342
358
|
if (!mediaType) {
|
|
343
359
|
switch (result.resultType) {
|
|
@@ -406,11 +422,22 @@ class HttpServiceSparqlEndpoint {
|
|
|
406
422
|
];
|
|
407
423
|
let eventEmitter;
|
|
408
424
|
try {
|
|
425
|
+
const actionContext = core_1.ActionContext.ensureActionContext(this.context);
|
|
409
426
|
// Append result formats
|
|
410
|
-
const formats = await engine.getResultMediaTypeFormats(
|
|
427
|
+
const formats = await engine.getResultMediaTypeFormats(actionContext);
|
|
411
428
|
for (const format in formats) {
|
|
412
429
|
quads.push(quad(s, `${sd}resultFormat`, formats[format]));
|
|
413
430
|
}
|
|
431
|
+
// Append extension functions
|
|
432
|
+
const functions = actionContext.get(context_entries_1.KeysInitQuery.extensionFunctions);
|
|
433
|
+
for (const value in functions) {
|
|
434
|
+
quads.push(quad(s, `${sd}extensionFunction`, value));
|
|
435
|
+
}
|
|
436
|
+
if (this.emitVoid) {
|
|
437
|
+
for (const quad of await this.voidMetadataEmitter.getVoIDQuads(engine, stdout, request, response)) {
|
|
438
|
+
quads.push(quad);
|
|
439
|
+
}
|
|
440
|
+
}
|
|
414
441
|
// Flush results
|
|
415
442
|
const { data } = await engine.resultToString({
|
|
416
443
|
resultType: 'quads',
|
|
@@ -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,ts/no-require-imports,ts/no-var-requires */\nimport type { Cluster } from 'node:cluster';\nimport type { EventEmitter } from 'node:events';\nimport * as http from 'node:http';\nimport type { IncomingMessage, ServerResponse } from 'node:http';\nimport * as querystring from 'node:querystring';\nimport type { Writable } from 'node:stream';\nimport * as url from 'node: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';\n\nimport yargs from 'yargs';\n\nimport type { IDynamicQueryEngineOptions } from '..';\n\nimport { QueryEngineBase, QueryEngineFactoryBase } from '..';\n\nimport { CliArgsHandlerBase } from './cli/CliArgsHandlerBase';\nimport { CliArgsHandlerHttp } from './cli/CliArgsHandlerHttp';\n\n// Use require instead of import for default exports, to be compatible with variants of esModuleInterop in tsconfig.\nconst clusterUntyped = require('node:cluster');\nconst process: NodeJS.Process = require('process/');\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 = 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 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.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(\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: string[]} argv 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 stderr The error stream.\n * @param exit An exit process callback.\n * @param {ICliArgsHandler[]} cliArgsHandlers Enables manipulation of the CLI arguments and their processing.\n */\n public static async generateConstructorArguments(\n argv: string[],\n moduleRootPath: string,\n env: NodeJS.ProcessEnv,\n defaultConfigPath: string,\n stderr: Writable,\n exit: (code: number) => void,\n cliArgsHandlers: ICliArgsHandler[],\n ): 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 <any> 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 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 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 // eslint-disable-next-line ts/no-misused-promises\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 // eslint-disable-next-line ts/no-misused-promises\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 // eslint-disable-next-line ts/no-misused-promises\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 // eslint-disable-next-line node/no-deprecated-api\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, { 'content-type': HttpServiceSparqlEndpoint.MIME_JSON, 'Access-Control-Allow-Origin': '*', 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(\n 404,\n { 'content-type': HttpServiceSparqlEndpoint.MIME_JSON, 'Access-Control-Allow-Origin': '*' },\n );\n response.end(JSON.stringify({ message: 'Resource not found. Queries are accepted on /sparql.' }));\n return;\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(\n 405,\n { 'content-type': HttpServiceSparqlEndpoint.MIME_JSON, 'Access-Control-Allow-Origin': '*' },\n );\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(\n 400,\n { 'content-type': HttpServiceSparqlEndpoint.MIME_PLAIN, 'Access-Control-Allow-Origin': '*' },\n );\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(\n 400,\n { 'content-type': HttpServiceSparqlEndpoint.MIME_PLAIN, 'Access-Control-Allow-Origin': '*' },\n );\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, process.stderr, 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 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(\n 400,\n { 'content-type': HttpServiceSparqlEndpoint.MIME_PLAIN, 'Access-Control-Allow-Origin': '*' },\n );\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, process.stderr, 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 stderr Error stream to write to.\n * @param {NodeJS.ReadableStream} eventEmitter Query result stream.\n */\n public stopResponse(\n response: http.ServerResponse,\n queryId: number,\n stderr: Writable,\n eventEmitter?: EventEmitter,\n ): void {\n response.on('close', killClient);\n // eslint-disable-next-line ts/no-this-alias\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 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 ('${(<any> 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 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,ts/no-require-imports,ts/no-var-requires */\nimport type { Cluster } from 'node:cluster';\nimport type { EventEmitter } from 'node:events';\nimport * as http from 'node:http';\nimport type { IncomingMessage, ServerResponse } from 'node:http';\nimport * as querystring from 'node:querystring';\nimport type { Writable } from 'node:stream';\nimport * as url from 'node:url';\nimport { KeysInitQuery, 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 { Algebra } from 'sparqlalgebrajs';\n\nimport yargs from 'yargs';\n\nimport type { IDynamicQueryEngineOptions } from '..';\n\nimport { QueryEngineBase, QueryEngineFactoryBase } from '..';\n\nimport { CliArgsHandlerBase } from './cli/CliArgsHandlerBase';\nimport { CliArgsHandlerHttp } from './cli/CliArgsHandlerHttp';\nimport { VoidMetadataEmitter } from './VoidMetadataEmitter';\n\n// Use require instead of import for default exports, to be compatible with variants of esModuleInterop in tsconfig.\nconst clusterUntyped = require('node:cluster');\nconst process: NodeJS.Process = require('process/');\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 = 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 freshWorkerPerQuery: boolean;\n public readonly contextOverride: boolean;\n public readonly emitVoid: boolean;\n\n public readonly voidMetadataEmitter: VoidMetadataEmitter;\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.freshWorkerPerQuery = Boolean(args.freshWorkerPerQuery);\n this.contextOverride = Boolean(args.contextOverride);\n this.emitVoid = Boolean(args.emitVoid);\n this.voidMetadataEmitter = new VoidMetadataEmitter(this.context);\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(\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: string[]} argv 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 stderr The error stream.\n * @param exit An exit process callback.\n * @param {ICliArgsHandler[]} cliArgsHandlers Enables manipulation of the CLI arguments and their processing.\n */\n public static async generateConstructorArguments(\n argv: string[],\n moduleRootPath: string,\n env: NodeJS.ProcessEnv,\n defaultConfigPath: string,\n stderr: Writable,\n exit: (code: number) => void,\n cliArgsHandlers: ICliArgsHandler[],\n ): 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 <any> 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 freshWorkerPerQuery: boolean = args.freshWorker;\n const contextOverride: boolean = args.contextOverride;\n const emitVoid: boolean = args.emitVoid;\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 freshWorkerPerQuery,\n contextOverride,\n emitVoid,\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 // eslint-disable-next-line ts/no-misused-promises\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 // eslint-disable-next-line ts/no-misused-promises\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 // eslint-disable-next-line ts/no-misused-promises\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 // eslint-disable-next-line node/no-deprecated-api\n const requestUrl = url.parse(request.url ?? '', true);\n if (requestUrl.pathname === '/' || request.url === '/') {\n stdout.write('[301] Permanently moved. Redirected to /sparql.\\n');\n response.writeHead(301, { 'content-type': HttpServiceSparqlEndpoint.MIME_JSON, 'Access-Control-Allow-Origin': '*', 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(\n 404,\n { 'content-type': HttpServiceSparqlEndpoint.MIME_JSON, 'Access-Control-Allow-Origin': '*' },\n );\n response.end(JSON.stringify({ message: 'Resource not found. Queries are accepted on /sparql.' }));\n return;\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(\n 405,\n { 'content-type': HttpServiceSparqlEndpoint.MIME_JSON, 'Access-Control-Allow-Origin': '*' },\n );\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(\n 400,\n { 'content-type': HttpServiceSparqlEndpoint.MIME_PLAIN, 'Access-Control-Allow-Origin': '*' },\n );\n response.end((<Error> error).message);\n return;\n }\n\n // If the query was an update query, invalidate the void metadata emitter cache\n if (this.emitVoid &&\n // Try to check parsed operation\n ((result.context && result.context.has(KeysQueryOperation.operation) &&\n // eslint-disable-next-line ts/prefer-nullish-coalescing\n result.context.getSafe(KeysQueryOperation.operation).type === Algebra.types.DELETE_INSERT) ||\n // Fallback to query string\n /(INSERT|DELETE)/iu.test(queryBody.value))) {\n this.voidMetadataEmitter.invalidateCache();\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(\n 400,\n { 'content-type': HttpServiceSparqlEndpoint.MIME_PLAIN, 'Access-Control-Allow-Origin': '*' },\n );\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, process.stderr, 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 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 const actionContext = ActionContext.ensureActionContext(this.context);\n\n // Append result formats\n const formats = await engine.getResultMediaTypeFormats(actionContext);\n for (const format in formats) {\n quads.push(quad(s, `${sd}resultFormat`, formats[format]));\n }\n\n // Append extension functions\n const functions = actionContext.get(KeysInitQuery.extensionFunctions);\n for (const value in functions) {\n quads.push(quad(s, `${sd}extensionFunction`, value));\n }\n\n if (this.emitVoid) {\n for (const quad of await this.voidMetadataEmitter.getVoIDQuads(engine, stdout, request, response)) {\n quads.push(quad);\n }\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(\n 400,\n { 'content-type': HttpServiceSparqlEndpoint.MIME_PLAIN, 'Access-Control-Allow-Origin': '*' },\n );\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, process.stderr, 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 stderr Error stream to write to.\n * @param {NodeJS.ReadableStream} eventEmitter Query result stream.\n */\n public stopResponse(\n response: http.ServerResponse,\n queryId: number,\n stderr: Writable,\n eventEmitter?: EventEmitter,\n ): void {\n response.on('close', killClient);\n // eslint-disable-next-line ts/no-this-alias\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 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 ('${(<any> 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 freshWorkerPerQuery?: boolean;\n contextOverride?: boolean;\n emitVoid?: boolean;\n moduleRootPath: string;\n defaultConfigPath: string;\n}\n/* eslint-enable import/no-nodejs-modules */\n"]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
/// <reference types="node" />
|
|
3
|
+
import type * as http from 'node:http';
|
|
4
|
+
import type { Writable } from 'node:stream';
|
|
5
|
+
import type * as RDF from '@rdfjs/types';
|
|
6
|
+
import type { QueryEngineBase } from '..';
|
|
7
|
+
/**
|
|
8
|
+
* A VoID metadata emitter that emits metadata used in VoID description of the HTTP service sparql endpoint.
|
|
9
|
+
*/
|
|
10
|
+
export declare class VoidMetadataEmitter {
|
|
11
|
+
private static readonly STRING_LITERALS;
|
|
12
|
+
private static readonly DATE_LITERALS;
|
|
13
|
+
readonly context: any;
|
|
14
|
+
cachedStatistics: RDF.Quad[];
|
|
15
|
+
constructor(context: any);
|
|
16
|
+
invalidateCache(): void;
|
|
17
|
+
/**
|
|
18
|
+
* Returns a list of all necessary VoID quads.
|
|
19
|
+
* @param {QueryEngineBase} engine A SPARQL engine.
|
|
20
|
+
* @param {module:stream.internal.Writable} stdout
|
|
21
|
+
* @param {module:http.IncomingMessage} request
|
|
22
|
+
* @param {module:http.ServerResponse} response
|
|
23
|
+
*/
|
|
24
|
+
getVoIDQuads(engine: QueryEngineBase, stdout: Writable, request: http.IncomingMessage, response: http.ServerResponse): Promise<RDF.Quad[]>;
|
|
25
|
+
private convertValue;
|
|
26
|
+
/**
|
|
27
|
+
* Fetches the necessary VoID statistics quads and assigns them to this.cachedStatistics
|
|
28
|
+
* @param {QueryEngineBase} engine A SPARQL engine.
|
|
29
|
+
* @private
|
|
30
|
+
*/
|
|
31
|
+
private fetchVoIDStatistics;
|
|
32
|
+
}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.VoidMetadataEmitter = void 0;
|
|
4
|
+
const quad = require('rdf-quad');
|
|
5
|
+
/**
|
|
6
|
+
* A VoID metadata emitter that emits metadata used in VoID description of the HTTP service sparql endpoint.
|
|
7
|
+
*/
|
|
8
|
+
class VoidMetadataEmitter {
|
|
9
|
+
constructor(context) {
|
|
10
|
+
this.cachedStatistics = [];
|
|
11
|
+
this.context = context;
|
|
12
|
+
}
|
|
13
|
+
invalidateCache() {
|
|
14
|
+
this.cachedStatistics = [];
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Returns a list of all necessary VoID quads.
|
|
18
|
+
* @param {QueryEngineBase} engine A SPARQL engine.
|
|
19
|
+
* @param {module:stream.internal.Writable} stdout
|
|
20
|
+
* @param {module:http.IncomingMessage} request
|
|
21
|
+
* @param {module:http.ServerResponse} response
|
|
22
|
+
*/
|
|
23
|
+
async getVoIDQuads(engine, stdout, request, response) {
|
|
24
|
+
const s = request.url;
|
|
25
|
+
const sd = 'http://www.w3.org/ns/sparql-service-description#';
|
|
26
|
+
const vd = 'http://rdfs.org/ns/void#';
|
|
27
|
+
const rdf = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#';
|
|
28
|
+
const rdfType = `${rdf}type`;
|
|
29
|
+
const dataset = '_:defaultDataset';
|
|
30
|
+
const graph = '_:defaultGraph';
|
|
31
|
+
const vocabulary = `${vd}vocabulary`;
|
|
32
|
+
const dcterms = 'http://purl.org/dc/terms/';
|
|
33
|
+
const quads = [
|
|
34
|
+
quad(s, `${sd}defaultDataset`, dataset),
|
|
35
|
+
quad(dataset, rdfType, `${sd}Dataset`),
|
|
36
|
+
// Basic VoID metadata
|
|
37
|
+
quad(dataset, rdfType, `${vd}Dataset`),
|
|
38
|
+
quad(dataset, `${vd}sparqlEndpoint`, '/sparql'),
|
|
39
|
+
];
|
|
40
|
+
// Dublin Core Metadata Terms
|
|
41
|
+
if (this.context.dcterms) {
|
|
42
|
+
quads.push(quad(dataset, vocabulary, dcterms));
|
|
43
|
+
for (const key in this.context.dcterms) {
|
|
44
|
+
quads.push(quad(dataset, `${dcterms}${key}`, this.convertValue(key, this.context.dcterms[key])));
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// Statistics
|
|
48
|
+
// Default graph for statistics
|
|
49
|
+
quads.push(quad(dataset, `${sd}defaultGraph`, graph));
|
|
50
|
+
quads.push(quad(graph, rdfType, `${sd}Graph`));
|
|
51
|
+
if (this.cachedStatistics.length === 0) {
|
|
52
|
+
try {
|
|
53
|
+
await this.fetchVoIDStatistics(engine);
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
stdout.write(`[500] Server error in results: ${error.message} \n`);
|
|
57
|
+
response.end('An internal server error occurred.\n');
|
|
58
|
+
return [];
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
for (const q of this.cachedStatistics) {
|
|
62
|
+
quads.push(q);
|
|
63
|
+
}
|
|
64
|
+
return quads;
|
|
65
|
+
}
|
|
66
|
+
convertValue(key, value) {
|
|
67
|
+
if (VoidMetadataEmitter.STRING_LITERALS.has(key)) {
|
|
68
|
+
return `"${value}"`;
|
|
69
|
+
}
|
|
70
|
+
if (VoidMetadataEmitter.DATE_LITERALS.has(key)) {
|
|
71
|
+
return `"${value}"^^http://www.w3.org/2001/XMLSchema#date`;
|
|
72
|
+
}
|
|
73
|
+
return value;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Fetches the necessary VoID statistics quads and assigns them to this.cachedStatistics
|
|
77
|
+
* @param {QueryEngineBase} engine A SPARQL engine.
|
|
78
|
+
* @private
|
|
79
|
+
*/
|
|
80
|
+
async fetchVoIDStatistics(engine) {
|
|
81
|
+
const vd = 'http://rdfs.org/ns/void#';
|
|
82
|
+
const rdf = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#';
|
|
83
|
+
const rdfType = `${rdf}type`;
|
|
84
|
+
const dataset = '_:defaultDataset';
|
|
85
|
+
const graph = '_:defaultGraph';
|
|
86
|
+
const [globalStatistics, classesStatistic, classPartitions, propertyPartitions] = await Promise.all([
|
|
87
|
+
engine.queryBindings(`
|
|
88
|
+
SELECT
|
|
89
|
+
(COUNT(*) AS ?triples)
|
|
90
|
+
(SUM(IF(isIRI(?s), 1, 0)) AS ?entities)
|
|
91
|
+
(COUNT(DISTINCT ?s) AS ?distinctSubjects)
|
|
92
|
+
(COUNT(DISTINCT ?p) AS ?properties)
|
|
93
|
+
(COUNT(DISTINCT ?o) AS ?distinctObjects)
|
|
94
|
+
WHERE {
|
|
95
|
+
?s ?p ?o
|
|
96
|
+
}
|
|
97
|
+
`, this.context),
|
|
98
|
+
engine.queryBindings(`
|
|
99
|
+
SELECT
|
|
100
|
+
(COUNT(DISTINCT ?c) AS ?classes)
|
|
101
|
+
WHERE {
|
|
102
|
+
?s a ?c
|
|
103
|
+
}
|
|
104
|
+
`, this.context),
|
|
105
|
+
engine.queryBindings(`
|
|
106
|
+
SELECT ?class (COUNT(*) AS ?count)
|
|
107
|
+
WHERE { ?s a ?class }
|
|
108
|
+
GROUP BY ?class
|
|
109
|
+
`, this.context),
|
|
110
|
+
engine.queryBindings(`
|
|
111
|
+
SELECT ?property (COUNT(*) AS ?count)
|
|
112
|
+
WHERE { ?s ?property ?o }
|
|
113
|
+
GROUP BY ?property
|
|
114
|
+
`, this.context),
|
|
115
|
+
]);
|
|
116
|
+
const xsdInteger = (n) => `"${n}"^^http://www.w3.org/2001/XMLSchema#integer`;
|
|
117
|
+
await Promise.all([
|
|
118
|
+
(async () => {
|
|
119
|
+
for await (const bindings of globalStatistics) {
|
|
120
|
+
this.cachedStatistics.push(quad(graph, `${vd}triples`, xsdInteger(bindings.get('triples').value)));
|
|
121
|
+
this.cachedStatistics.push(quad(graph, `${vd}entities`, xsdInteger(bindings.get('entities').value)));
|
|
122
|
+
this.cachedStatistics.push(quad(graph, `${vd}distinctSubjects`, xsdInteger(bindings.get('distinctSubjects').value)));
|
|
123
|
+
this.cachedStatistics.push(quad(graph, `${vd}properties`, xsdInteger(bindings.get('properties').value)));
|
|
124
|
+
this.cachedStatistics.push(quad(graph, `${vd}distinctObjects`, xsdInteger(bindings.get('distinctObjects').value)));
|
|
125
|
+
}
|
|
126
|
+
})(),
|
|
127
|
+
(async () => {
|
|
128
|
+
for await (const bindings of classesStatistic) {
|
|
129
|
+
this.cachedStatistics.push(quad(graph, `${vd}classes`, xsdInteger(bindings.get('classes').value)));
|
|
130
|
+
}
|
|
131
|
+
})(),
|
|
132
|
+
(async () => {
|
|
133
|
+
let i = 0;
|
|
134
|
+
for await (const bindings of classPartitions) {
|
|
135
|
+
const classPartition = `_:classPartition${i}`;
|
|
136
|
+
this.cachedStatistics.push(quad(dataset, `${vd}classPartition`, classPartition));
|
|
137
|
+
this.cachedStatistics.push(quad(classPartition, rdfType, `${vd}ClassPartition`));
|
|
138
|
+
this.cachedStatistics.push(quad(classPartition, `${vd}class`, bindings.get('class').value));
|
|
139
|
+
this.cachedStatistics.push(quad(classPartition, `${vd}entities`, xsdInteger(bindings.get('count').value)));
|
|
140
|
+
i++;
|
|
141
|
+
}
|
|
142
|
+
})(),
|
|
143
|
+
(async () => {
|
|
144
|
+
let i = 0;
|
|
145
|
+
for await (const bindings of propertyPartitions) {
|
|
146
|
+
const propertyPartition = `_:propertyPartition${i}`;
|
|
147
|
+
this.cachedStatistics.push(quad(dataset, `${vd}propertyPartition`, propertyPartition));
|
|
148
|
+
this.cachedStatistics.push(quad(propertyPartition, rdfType, `${vd}PropertyPartition`));
|
|
149
|
+
this.cachedStatistics.push(quad(propertyPartition, `${vd}property`, bindings.get('property').value));
|
|
150
|
+
this.cachedStatistics.push(quad(propertyPartition, `${vd}triples`, xsdInteger(bindings.get('count').value)));
|
|
151
|
+
i++;
|
|
152
|
+
}
|
|
153
|
+
})(),
|
|
154
|
+
]);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
exports.VoidMetadataEmitter = VoidMetadataEmitter;
|
|
158
|
+
VoidMetadataEmitter.STRING_LITERALS = new Set([
|
|
159
|
+
'alternative',
|
|
160
|
+
'description',
|
|
161
|
+
'title',
|
|
162
|
+
]);
|
|
163
|
+
VoidMetadataEmitter.DATE_LITERALS = new Set([
|
|
164
|
+
'available',
|
|
165
|
+
'created',
|
|
166
|
+
'date',
|
|
167
|
+
'dateAccepted',
|
|
168
|
+
'dateCopyrighted',
|
|
169
|
+
'dateSubmitted',
|
|
170
|
+
'issued',
|
|
171
|
+
'modified',
|
|
172
|
+
'valid',
|
|
173
|
+
]);
|
|
174
|
+
//# sourceMappingURL=VoidMetadataEmitter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VoidMetadataEmitter.js","sourceRoot":"","sources":["VoidMetadataEmitter.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable import/no-nodejs-modules,ts/no-require-imports,ts/no-var-requires */\nimport type * as http from 'node:http';\nimport type { Writable } from 'node:stream';\nimport type * as RDF from '@rdfjs/types';\n\nimport type { QueryEngineBase } from '..';\n\nconst quad = require('rdf-quad');\n\n/**\n * A VoID metadata emitter that emits metadata used in VoID description of the HTTP service sparql endpoint.\n */\nexport class VoidMetadataEmitter {\n private static readonly STRING_LITERALS = new Set([\n 'alternative',\n 'description',\n 'title',\n ]);\n\n private static readonly DATE_LITERALS = new Set([\n 'available',\n 'created',\n 'date',\n 'dateAccepted',\n 'dateCopyrighted',\n 'dateSubmitted',\n 'issued',\n 'modified',\n 'valid',\n ]);\n\n public readonly context: any;\n public cachedStatistics: RDF.Quad[] = [];\n\n public constructor(\n context: any,\n ) {\n this.context = context;\n }\n\n public invalidateCache(): void {\n this.cachedStatistics = [];\n }\n\n /**\n * Returns a list of all necessary VoID quads.\n * @param {QueryEngineBase} engine A SPARQL engine.\n * @param {module:stream.internal.Writable} stdout\n * @param {module:http.IncomingMessage} request\n * @param {module:http.ServerResponse} response\n */\n public async getVoIDQuads(\n engine: QueryEngineBase,\n stdout: Writable,\n request: http.IncomingMessage,\n response: http.ServerResponse,\n ): Promise<RDF.Quad[]> {\n const s = request.url;\n const sd = 'http://www.w3.org/ns/sparql-service-description#';\n const vd = 'http://rdfs.org/ns/void#';\n const rdf = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#';\n const rdfType = `${rdf}type`;\n const dataset = '_:defaultDataset';\n const graph = '_:defaultGraph';\n const vocabulary = `${vd}vocabulary`;\n const dcterms = 'http://purl.org/dc/terms/';\n const quads: RDF.Quad[] = [\n quad(s, `${sd}defaultDataset`, dataset),\n quad(dataset, rdfType, `${sd}Dataset`),\n\n // Basic VoID metadata\n quad(dataset, rdfType, `${vd}Dataset`),\n quad(dataset, `${vd}sparqlEndpoint`, '/sparql'),\n ];\n\n // Dublin Core Metadata Terms\n if (this.context.dcterms) {\n quads.push(quad(dataset, vocabulary, dcterms));\n for (const key in this.context.dcterms) {\n quads.push(quad(dataset, `${dcterms}${key}`, this.convertValue(key, this.context.dcterms[key])));\n }\n }\n\n // Statistics\n\n // Default graph for statistics\n quads.push(quad(dataset, `${sd}defaultGraph`, graph));\n quads.push(quad(graph, rdfType, `${sd}Graph`));\n\n if (this.cachedStatistics.length === 0) {\n try {\n await this.fetchVoIDStatistics(engine);\n } catch (error: any) {\n stdout.write(`[500] Server error in results: ${error.message} \\n`);\n response.end('An internal server error occurred.\\n');\n return [];\n }\n }\n\n for (const q of this.cachedStatistics) {\n quads.push(q);\n }\n\n return quads;\n }\n\n private convertValue(\n key: string,\n value: string,\n ): string {\n if (VoidMetadataEmitter.STRING_LITERALS.has(key)) {\n return `\"${value}\"`;\n }\n if (VoidMetadataEmitter.DATE_LITERALS.has(key)) {\n return `\"${value}\"^^http://www.w3.org/2001/XMLSchema#date`;\n }\n return value;\n }\n\n /**\n * Fetches the necessary VoID statistics quads and assigns them to this.cachedStatistics\n * @param {QueryEngineBase} engine A SPARQL engine.\n * @private\n */\n private async fetchVoIDStatistics(\n engine: QueryEngineBase,\n ): Promise<void> {\n const vd = 'http://rdfs.org/ns/void#';\n const rdf = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#';\n const rdfType = `${rdf}type`;\n const dataset = '_:defaultDataset';\n const graph = '_:defaultGraph';\n\n const [ globalStatistics, classesStatistic, classPartitions, propertyPartitions ] = await Promise.all([\n engine.queryBindings(\n `\nSELECT\n (COUNT(*) AS ?triples)\n (SUM(IF(isIRI(?s), 1, 0)) AS ?entities)\n (COUNT(DISTINCT ?s) AS ?distinctSubjects)\n (COUNT(DISTINCT ?p) AS ?properties)\n (COUNT(DISTINCT ?o) AS ?distinctObjects)\nWHERE {\n ?s ?p ?o\n}\n `,\n this.context,\n ),\n engine.queryBindings(\n `\nSELECT\n (COUNT(DISTINCT ?c) AS ?classes)\nWHERE {\n ?s a ?c\n}\n `,\n this.context,\n ),\n engine.queryBindings(\n `\nSELECT ?class (COUNT(*) AS ?count)\nWHERE { ?s a ?class }\nGROUP BY ?class\n `,\n this.context,\n ),\n engine.queryBindings(\n `\nSELECT ?property (COUNT(*) AS ?count)\nWHERE { ?s ?property ?o }\nGROUP BY ?property\n `,\n this.context,\n ),\n ]);\n\n const xsdInteger = (n: string): string =>\n `\"${n}\"^^http://www.w3.org/2001/XMLSchema#integer`;\n\n await Promise.all([\n (async(): Promise<void> => {\n for await (const bindings of globalStatistics) {\n this.cachedStatistics.push(quad(graph, `${vd}triples`, xsdInteger(bindings.get('triples')!.value)));\n this.cachedStatistics.push(quad(graph, `${vd}entities`, xsdInteger(bindings.get('entities')!.value)));\n this.cachedStatistics.push(quad(graph, `${vd}distinctSubjects`, xsdInteger(bindings.get('distinctSubjects')!.value)));\n this.cachedStatistics.push(quad(graph, `${vd}properties`, xsdInteger(bindings.get('properties')!.value)));\n this.cachedStatistics.push(quad(graph, `${vd}distinctObjects`, xsdInteger(bindings.get('distinctObjects')!.value)));\n }\n })(),\n (async(): Promise<void> => {\n for await (const bindings of classesStatistic) {\n this.cachedStatistics.push(quad(graph, `${vd}classes`, xsdInteger(bindings.get('classes')!.value)));\n }\n })(),\n (async(): Promise<void> => {\n let i = 0;\n for await (const bindings of classPartitions) {\n const classPartition = `_:classPartition${i}`;\n this.cachedStatistics.push(quad(dataset, `${vd}classPartition`, classPartition));\n this.cachedStatistics.push(quad(classPartition, rdfType, `${vd}ClassPartition`));\n this.cachedStatistics.push(quad(classPartition, `${vd}class`, bindings.get('class')!.value));\n this.cachedStatistics.push(quad(classPartition, `${vd}entities`, xsdInteger(bindings.get('count')!.value)));\n i++;\n }\n })(),\n (async(): Promise<void> => {\n let i = 0;\n for await (const bindings of propertyPartitions) {\n const propertyPartition = `_:propertyPartition${i}`;\n this.cachedStatistics.push(quad(dataset, `${vd}propertyPartition`, propertyPartition));\n this.cachedStatistics.push(quad(propertyPartition, rdfType, `${vd}PropertyPartition`));\n this.cachedStatistics.push(quad(propertyPartition, `${vd}property`, bindings.get('property')!.value));\n this.cachedStatistics.push(quad(propertyPartition, `${vd}triples`, xsdInteger(bindings.get('count')!.value)));\n i++;\n }\n })(),\n ]);\n }\n}\n"]}
|
|
@@ -82,6 +82,10 @@ class CliArgsHandlerBase {
|
|
|
82
82
|
type: 'string',
|
|
83
83
|
describe: 'base IRI for the query (e.g., http://example.org/)',
|
|
84
84
|
},
|
|
85
|
+
fileBaseIRI: {
|
|
86
|
+
type: 'string',
|
|
87
|
+
describe: 'base IRI for the file (e.g., http://example.org/), useful when using comunica-sparql-file',
|
|
88
|
+
},
|
|
85
89
|
dateTime: {
|
|
86
90
|
alias: 'd',
|
|
87
91
|
type: 'string',
|
|
@@ -197,6 +201,10 @@ class CliArgsHandlerBase {
|
|
|
197
201
|
if (args.baseIRI) {
|
|
198
202
|
context[context_entries_1.KeysInitQuery.baseIRI.name] = args.baseIRI;
|
|
199
203
|
}
|
|
204
|
+
// Define the file base IRI
|
|
205
|
+
if (args.fileBaseIRI) {
|
|
206
|
+
context[context_entries_1.KeysInitQuery.fileBaseIRI.name] = args.fileBaseIRI;
|
|
207
|
+
}
|
|
200
208
|
// Define lenient-mode
|
|
201
209
|
if (args.lenient) {
|
|
202
210
|
context[context_entries_1.KeysInitQuery.lenient.name] = true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CliArgsHandlerBase.js","sourceRoot":"","sources":["CliArgsHandlerBase.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable import/no-nodejs-modules */\nimport { exec } from 'node:child_process';\nimport { existsSync, readFileSync } from 'node:fs';\nimport * as OS from 'node:os';\nimport * as Path from 'node:path';\nimport { KeysHttp, KeysInitQuery, KeysQueryOperation, KeysRdfUpdateQuads } from '@comunica/context-entries';\nimport { ActionContext } from '@comunica/core';\nimport { LoggerPretty } from '@comunica/logger-pretty';\nimport type { IActionContext, ICliArgsHandler } from '@comunica/types';\nimport type { Argv } from 'yargs';\n\nconst process: NodeJS.Process = require('process/');\n\n/**\n * Basic CLI arguments handler that handles common options.\n */\nexport class CliArgsHandlerBase implements ICliArgsHandler {\n private readonly initialContext?: IActionContext;\n\n public constructor(initialContext?: IActionContext) {\n this.initialContext = initialContext;\n }\n\n public static getScriptOutput(command: string, fallback: string): Promise<string> {\n return new Promise((resolve) => {\n exec(command, (error, stdout, stderr) => {\n if (error) {\n resolve(fallback);\n }\n resolve((stdout || stderr).trimEnd());\n });\n });\n }\n\n public static isDevelopmentEnvironment(): boolean {\n return existsSync(Path.join(__dirname, `../../test`));\n }\n\n /**\n * Converts an URL like 'hypermedia@http://user:passwd@example.com to an IDataSource\n * @param {string} sourceString An url with possibly a type and authorization.\n * @return {[id: string]: any} An IDataSource which represents the sourceString.\n */\n public static getSourceObjectFromString(sourceString: string): Record<string, any> {\n const source: Record<string, any> = {};\n const mediaTypeRegex = /^([^:]*)@/u;\n const mediaTypeMatches = mediaTypeRegex.exec(sourceString);\n if (mediaTypeMatches) {\n source.type = mediaTypeMatches[1];\n sourceString = sourceString.slice((<number> source.type.length) + 1);\n }\n const authRegex = /\\/\\/(.*:.*)@/u;\n const authMatches = authRegex.exec(sourceString);\n if (authMatches) {\n const credentials = authMatches[1];\n source.context = new ActionContext({\n [KeysHttp.auth.name]: decodeURIComponent(credentials),\n });\n sourceString = sourceString.slice(0, authMatches.index + 2) +\n sourceString.slice(authMatches.index + credentials.length + 3);\n }\n source.value = sourceString;\n return source;\n }\n\n public populateYargs(argumentsBuilder: Argv<any>): Argv<any> {\n return argumentsBuilder\n .command(\n '$0 [sources...]',\n 'evaluates SPARQL queries',\n () => {\n // Do nothing\n },\n () => {\n // Do nothing\n },\n )\n .default('sources', [])\n .hide('sources')\n .wrap(160)\n .version(false)\n .options({\n context: {\n alias: 'c',\n type: 'string',\n describe: 'Use the given JSON context string or file (e.g., config.json)',\n },\n to: {\n type: 'string',\n describe: 'Destination for update queries',\n },\n baseIRI: {\n alias: 'b',\n type: 'string',\n describe: 'base IRI for the query (e.g., http://example.org/)',\n },\n dateTime: {\n alias: 'd',\n type: 'string',\n describe: 'Sets a datetime for querying Memento-enabled archives',\n },\n logLevel: {\n alias: 'l',\n type: 'string',\n describe: 'Sets the log level (e.g., debug, info, warn, ...)',\n default: 'warn',\n },\n lenient: {\n type: 'boolean',\n describe: 'If failing requests and parsing errors should be logged instead of causing a hard crash',\n },\n version: {\n alias: 'v',\n type: 'boolean',\n describe: 'Prints version information',\n },\n showStackTrace: {\n type: 'boolean',\n describe: 'Prints the full stacktrace when errors are thrown',\n },\n httpTimeout: {\n type: 'number',\n describe: 'HTTP requests timeout in milliseconds',\n },\n httpBodyTimeout: {\n type: 'boolean',\n describe: 'Makes the HTTP timeout take into account the response body stream read',\n },\n httpRetryCount: {\n type: 'number',\n describe: 'The number of retries to perform on failed fetch requests',\n },\n httpRetryDelayFallback: {\n type: 'number',\n describe: 'The fallback delay in milliseconds between fetch retries',\n },\n httpRetryDelayLimit: {\n type: 'number',\n describe: 'The upper limit in milliseconds for the delay between fetch retries',\n },\n unionDefaultGraph: {\n type: 'boolean',\n describe: 'If the default graph should also contain the union of all named graphs',\n },\n invalidateCache: {\n type: 'boolean',\n describe: 'Enable cache invalidation before each query execution',\n },\n distinctConstruct: {\n type: 'boolean',\n describe: 'If the query engine should deduplicate resulting triples',\n },\n })\n .exitProcess(false)\n .fail(false)\n .help(false);\n }\n\n public async handleArgs(args: Record<string, any>, context: Record<string, any>): Promise<void> {\n // Print version information\n if (args.version) {\n // eslint-disable-next-line ts/no-require-imports,ts/no-var-requires,import/extensions\n const comunicaVersion: string = require('../../package.json').version;\n const dev: string = CliArgsHandlerBase.isDevelopmentEnvironment() ? '(dev)' : '';\n const nodeVersion: string = process.version;\n const npmVersion: string = await CliArgsHandlerBase.getScriptOutput('npm -v', '_NPM is unavailable_');\n const yarnVersion: string = await CliArgsHandlerBase.getScriptOutput('yarn -v', '_Yarn is unavailable_');\n const os = `${OS.platform()} (${OS.type()} ${OS.release()})`;\n\n const message = `| software | version\n| ---------------- | -------\n| Comunica Engine | ${comunicaVersion} ${dev}\n| node | ${nodeVersion}\n| npm | ${npmVersion}\n| yarn | ${yarnVersion}\n| Operating System | ${os}\n`;\n\n throw new Error(message);\n }\n\n // Inherit default context options\n if (this.initialContext) {\n Object.assign(context, this.initialContext.toJS());\n }\n\n // Define context\n if (args.context) {\n Object.assign(context, JSON.parse(existsSync(args.context) ? readFileSync(args.c, 'utf8') : args.context));\n } else if (args.sources[0]?.startsWith('{')) {\n // For backwards compatibility inline JSON\n Object.assign(context, JSON.parse(args.sources[0]));\n args.sources.shift();\n }\n\n // Add sources to context\n if (args.sources.length > 0) {\n context.sources = context.sources || [];\n // eslint-disable-next-line unicorn/no-array-for-each\n args.sources.forEach((sourceValue: string) => {\n const source = CliArgsHandlerBase.getSourceObjectFromString(sourceValue);\n context.sources.push(source);\n });\n }\n\n // Add destination to context\n if (args.to) {\n context[KeysRdfUpdateQuads.destination.name] = args.to;\n }\n\n // Set the logger\n if (!context.log) {\n context.log = new LoggerPretty({ level: args.logLevel });\n }\n\n // Define the base IRI\n if (args.baseIRI) {\n context[KeysInitQuery.baseIRI.name] = args.baseIRI;\n }\n\n // Define lenient-mode\n if (args.lenient) {\n context[KeysInitQuery.lenient.name] = true;\n }\n\n // Define HTTP timeout\n if (args.httpTimeout) {\n context[KeysHttp.httpTimeout.name] = args.httpTimeout;\n }\n\n // Define HTTP body timeout\n if (args.httpBodyTimeout) {\n if (!args.httpTimeout) {\n throw new Error('The --httpBodyTimeout option requires the --httpTimeout option to be set');\n }\n context[KeysHttp.httpBodyTimeout.name] = args.httpBodyTimeout;\n }\n\n // Define HTTP retry count\n if (args.httpRetryCount) {\n context[KeysHttp.httpRetryCount.name] = args.httpRetryCount;\n }\n\n // Define fallback HTTP delay between retries\n if (args.httpRetryDelayFallback) {\n if (!args.httpRetryCount) {\n throw new Error('The --httpRetryDelayFallback option requires the --httpRetryCount option to be set');\n }\n context[KeysHttp.httpRetryDelayFallback.name] = args.httpRetryDelayFallback;\n }\n\n // Define limit to the delay between HTTP retries\n if (args.httpRetryDelayLimit) {\n if (!args.httpRetryCount) {\n throw new Error('The --httpRetryDelayLimit option requires the --httpRetryCount option to be set');\n }\n context[KeysHttp.httpRetryDelayLimit.name] = args.httpRetryDelayLimit;\n }\n\n // Define union default graph\n if (args.unionDefaultGraph) {\n context[KeysQueryOperation.unionDefaultGraph.name] = true;\n }\n\n // Define if cache should be disabled\n if (args.invalidateCache) {\n context[KeysInitQuery.invalidateCache.name] = true;\n }\n\n // Define if results should be deduplicated\n if (args.distinctConstruct) {\n context[KeysInitQuery.distinctConstruct.name] = true;\n }\n }\n}\n/* eslint-enable import/no-nodejs-modules */\n"]}
|
|
1
|
+
{"version":3,"file":"CliArgsHandlerBase.js","sourceRoot":"","sources":["CliArgsHandlerBase.ts"],"names":[],"mappings":";;;AAAA,6CAA6C;AAC7C,2DAA0C;AAC1C,qCAAmD;AACnD,8BAA8B;AAC9B,kCAAkC;AAClC,+DAA4G;AAC5G,yCAA+C;AAC/C,2DAAuD;AAIvD,MAAM,OAAO,GAAmB,OAAO,CAAC,UAAU,CAAC,CAAC;AAEpD;;GAEG;AACH,MAAa,kBAAkB;IAG7B,YAAmB,cAA+B;QAChD,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;IACvC,CAAC;IAEM,MAAM,CAAC,eAAe,CAAC,OAAe,EAAE,QAAgB;QAC7D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,IAAA,yBAAI,EAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;gBACtC,IAAI,KAAK,EAAE,CAAC;oBACV,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACpB,CAAC;gBACD,OAAO,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YACxC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,MAAM,CAAC,wBAAwB;QACpC,OAAO,IAAA,oBAAU,EAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;IACxD,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,yBAAyB,CAAC,YAAoB;QAC1D,MAAM,MAAM,GAAwB,EAAE,CAAC;QACvC,MAAM,cAAc,GAAG,YAAY,CAAC;QACpC,MAAM,gBAAgB,GAAG,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC3D,IAAI,gBAAgB,EAAE,CAAC;YACrB,MAAM,CAAC,IAAI,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;YAClC,YAAY,GAAG,YAAY,CAAC,KAAK,CAAW,MAAM,CAAC,IAAI,CAAC,MAAO,GAAG,CAAC,CAAC,CAAC;QACvE,CAAC;QACD,MAAM,SAAS,GAAG,eAAe,CAAC;QAClC,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACjD,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,CAAC,OAAO,GAAG,IAAI,oBAAa,CAAC;gBACjC,CAAC,0BAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,kBAAkB,CAAC,WAAW,CAAC;aACtD,CAAC,CAAC;YACH,YAAY,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC;gBACzD,YAAY,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACnE,CAAC;QACD,MAAM,CAAC,KAAK,GAAG,YAAY,CAAC;QAC5B,OAAO,MAAM,CAAC;IAChB,CAAC;IAEM,aAAa,CAAC,gBAA2B;QAC9C,OAAO,gBAAgB;aACpB,OAAO,CACN,iBAAiB,EACjB,0BAA0B,EAC1B,GAAG,EAAE;YACH,aAAa;QACf,CAAC,EACD,GAAG,EAAE;YACH,aAAa;QACf,CAAC,CACF;aACA,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;aACtB,IAAI,CAAC,SAAS,CAAC;aACf,IAAI,CAAC,GAAG,CAAC;aACT,OAAO,CAAC,KAAK,CAAC;aACd,OAAO,CAAC;YACP,OAAO,EAAE;gBACP,KAAK,EAAE,GAAG;gBACV,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,+DAA+D;aAC1E;YACD,EAAE,EAAE;gBACF,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,gCAAgC;aAC3C;YACD,OAAO,EAAE;gBACP,KAAK,EAAE,GAAG;gBACV,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,oDAAoD;aAC/D;YACD,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,2FAA2F;aACtG;YACD,QAAQ,EAAE;gBACR,KAAK,EAAE,GAAG;gBACV,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,uDAAuD;aAClE;YACD,QAAQ,EAAE;gBACR,KAAK,EAAE,GAAG;gBACV,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,mDAAmD;gBAC7D,OAAO,EAAE,MAAM;aAChB;YACD,OAAO,EAAE;gBACP,IAAI,EAAE,SAAS;gBACf,QAAQ,EAAE,yFAAyF;aACpG;YACD,OAAO,EAAE;gBACP,KAAK,EAAE,GAAG;gBACV,IAAI,EAAE,SAAS;gBACf,QAAQ,EAAE,4BAA4B;aACvC;YACD,cAAc,EAAE;gBACd,IAAI,EAAE,SAAS;gBACf,QAAQ,EAAE,mDAAmD;aAC9D;YACD,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,uCAAuC;aAClD;YACD,eAAe,EAAE;gBACf,IAAI,EAAE,SAAS;gBACf,QAAQ,EAAE,wEAAwE;aACnF;YACD,cAAc,EAAE;gBACd,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,2DAA2D;aACtE;YACD,sBAAsB,EAAE;gBACtB,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,0DAA0D;aACrE;YACD,mBAAmB,EAAE;gBACnB,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,qEAAqE;aAChF;YACD,iBAAiB,EAAE;gBACjB,IAAI,EAAE,SAAS;gBACf,QAAQ,EAAE,wEAAwE;aACnF;YACD,eAAe,EAAE;gBACf,IAAI,EAAE,SAAS;gBACf,QAAQ,EAAE,uDAAuD;aAClE;YACD,iBAAiB,EAAE;gBACjB,IAAI,EAAE,SAAS;gBACf,QAAQ,EAAE,0DAA0D;aACrE;SACF,CAAC;aACD,WAAW,CAAC,KAAK,CAAC;aAClB,IAAI,CAAC,KAAK,CAAC;aACX,IAAI,CAAC,KAAK,CAAC,CAAC;IACjB,CAAC;IAEM,KAAK,CAAC,UAAU,CAAC,IAAyB,EAAE,OAA4B;QAC7E,4BAA4B;QAC5B,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,sFAAsF;YACtF,MAAM,eAAe,GAAW,OAAO,CAAC,oBAAoB,CAAC,CAAC,OAAO,CAAC;YACtE,MAAM,GAAG,GAAW,kBAAkB,CAAC,wBAAwB,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YACjF,MAAM,WAAW,GAAW,OAAO,CAAC,OAAO,CAAC;YAC5C,MAAM,UAAU,GAAW,MAAM,kBAAkB,CAAC,eAAe,CAAC,QAAQ,EAAE,sBAAsB,CAAC,CAAC;YACtG,MAAM,WAAW,GAAW,MAAM,kBAAkB,CAAC,eAAe,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC;YACzG,MAAM,EAAE,GAAG,GAAG,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC;YAE7D,MAAM,OAAO,GAAG;;uBAEC,eAAe,IAAI,GAAG;uBACtB,WAAW;uBACX,UAAU;uBACV,WAAW;uBACX,EAAE;CACxB,CAAC;YAEI,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC;QAED,kCAAkC;QAClC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC;QACrD,CAAC;QAED,iBAAiB;QACjB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,IAAA,oBAAU,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAA,sBAAY,EAAC,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QAC7G,CAAC;aAAM,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5C,0CAA0C;YAC1C,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACpD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;QAED,yBAAyB;QACzB,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;YACxC,qDAAqD;YACrD,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,WAAmB,EAAE,EAAE;gBAC3C,MAAM,MAAM,GAAG,kBAAkB,CAAC,yBAAyB,CAAC,WAAW,CAAC,CAAC;gBACzE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC/B,CAAC,CAAC,CAAC;QACL,CAAC;QAED,6BAA6B;QAC7B,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,OAAO,CAAC,oCAAkB,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;QACzD,CAAC;QAED,iBAAiB;QACjB,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,GAAG,IAAI,4BAAY,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC3D,CAAC;QAED,sBAAsB;QACtB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,CAAC,+BAAa,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;QACrD,CAAC;QAED,2BAA2B;QAC3B,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,OAAO,CAAC,+BAAa,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC;QAC7D,CAAC;QAED,sBAAsB;QACtB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,CAAC,+BAAa,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QAC7C,CAAC;QAED,sBAAsB;QACtB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,OAAO,CAAC,0BAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC;QACxD,CAAC;QAED,2BAA2B;QAC3B,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;gBACtB,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAC;YAC9F,CAAC;YACD,OAAO,CAAC,0BAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC;QAChE,CAAC;QAED,0BAA0B;QAC1B,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,OAAO,CAAC,0BAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC;QAC9D,CAAC;QAED,6CAA6C;QAC7C,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAChC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;gBACzB,MAAM,IAAI,KAAK,CAAC,oFAAoF,CAAC,CAAC;YACxG,CAAC;YACD,OAAO,CAAC,0BAAQ,CAAC,sBAAsB,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,sBAAsB,CAAC;QAC9E,CAAC;QAED,iDAAiD;QACjD,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC7B,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;gBACzB,MAAM,IAAI,KAAK,CAAC,iFAAiF,CAAC,CAAC;YACrG,CAAC;YACD,OAAO,CAAC,0BAAQ,CAAC,mBAAmB,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,mBAAmB,CAAC;QACxE,CAAC;QAED,6BAA6B;QAC7B,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3B,OAAO,CAAC,oCAAkB,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QAC5D,CAAC;QAED,qCAAqC;QACrC,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,OAAO,CAAC,+BAAa,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QACrD,CAAC;QAED,2CAA2C;QAC3C,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3B,OAAO,CAAC,+BAAa,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QACvD,CAAC;IACH,CAAC;CACF;AA3QD,gDA2QC;AACD,4CAA4C","sourcesContent":["/* eslint-disable import/no-nodejs-modules */\nimport { exec } from 'node:child_process';\nimport { existsSync, readFileSync } from 'node:fs';\nimport * as OS from 'node:os';\nimport * as Path from 'node:path';\nimport { KeysHttp, KeysInitQuery, KeysQueryOperation, KeysRdfUpdateQuads } from '@comunica/context-entries';\nimport { ActionContext } from '@comunica/core';\nimport { LoggerPretty } from '@comunica/logger-pretty';\nimport type { IActionContext, ICliArgsHandler } from '@comunica/types';\nimport type { Argv } from 'yargs';\n\nconst process: NodeJS.Process = require('process/');\n\n/**\n * Basic CLI arguments handler that handles common options.\n */\nexport class CliArgsHandlerBase implements ICliArgsHandler {\n private readonly initialContext?: IActionContext;\n\n public constructor(initialContext?: IActionContext) {\n this.initialContext = initialContext;\n }\n\n public static getScriptOutput(command: string, fallback: string): Promise<string> {\n return new Promise((resolve) => {\n exec(command, (error, stdout, stderr) => {\n if (error) {\n resolve(fallback);\n }\n resolve((stdout || stderr).trimEnd());\n });\n });\n }\n\n public static isDevelopmentEnvironment(): boolean {\n return existsSync(Path.join(__dirname, `../../test`));\n }\n\n /**\n * Converts an URL like 'hypermedia@http://user:passwd@example.com to an IDataSource\n * @param {string} sourceString An url with possibly a type and authorization.\n * @return {[id: string]: any} An IDataSource which represents the sourceString.\n */\n public static getSourceObjectFromString(sourceString: string): Record<string, any> {\n const source: Record<string, any> = {};\n const mediaTypeRegex = /^([^:]*)@/u;\n const mediaTypeMatches = mediaTypeRegex.exec(sourceString);\n if (mediaTypeMatches) {\n source.type = mediaTypeMatches[1];\n sourceString = sourceString.slice((<number> source.type.length) + 1);\n }\n const authRegex = /\\/\\/(.*:.*)@/u;\n const authMatches = authRegex.exec(sourceString);\n if (authMatches) {\n const credentials = authMatches[1];\n source.context = new ActionContext({\n [KeysHttp.auth.name]: decodeURIComponent(credentials),\n });\n sourceString = sourceString.slice(0, authMatches.index + 2) +\n sourceString.slice(authMatches.index + credentials.length + 3);\n }\n source.value = sourceString;\n return source;\n }\n\n public populateYargs(argumentsBuilder: Argv<any>): Argv<any> {\n return argumentsBuilder\n .command(\n '$0 [sources...]',\n 'evaluates SPARQL queries',\n () => {\n // Do nothing\n },\n () => {\n // Do nothing\n },\n )\n .default('sources', [])\n .hide('sources')\n .wrap(160)\n .version(false)\n .options({\n context: {\n alias: 'c',\n type: 'string',\n describe: 'Use the given JSON context string or file (e.g., config.json)',\n },\n to: {\n type: 'string',\n describe: 'Destination for update queries',\n },\n baseIRI: {\n alias: 'b',\n type: 'string',\n describe: 'base IRI for the query (e.g., http://example.org/)',\n },\n fileBaseIRI: {\n type: 'string',\n describe: 'base IRI for the file (e.g., http://example.org/), useful when using comunica-sparql-file',\n },\n dateTime: {\n alias: 'd',\n type: 'string',\n describe: 'Sets a datetime for querying Memento-enabled archives',\n },\n logLevel: {\n alias: 'l',\n type: 'string',\n describe: 'Sets the log level (e.g., debug, info, warn, ...)',\n default: 'warn',\n },\n lenient: {\n type: 'boolean',\n describe: 'If failing requests and parsing errors should be logged instead of causing a hard crash',\n },\n version: {\n alias: 'v',\n type: 'boolean',\n describe: 'Prints version information',\n },\n showStackTrace: {\n type: 'boolean',\n describe: 'Prints the full stacktrace when errors are thrown',\n },\n httpTimeout: {\n type: 'number',\n describe: 'HTTP requests timeout in milliseconds',\n },\n httpBodyTimeout: {\n type: 'boolean',\n describe: 'Makes the HTTP timeout take into account the response body stream read',\n },\n httpRetryCount: {\n type: 'number',\n describe: 'The number of retries to perform on failed fetch requests',\n },\n httpRetryDelayFallback: {\n type: 'number',\n describe: 'The fallback delay in milliseconds between fetch retries',\n },\n httpRetryDelayLimit: {\n type: 'number',\n describe: 'The upper limit in milliseconds for the delay between fetch retries',\n },\n unionDefaultGraph: {\n type: 'boolean',\n describe: 'If the default graph should also contain the union of all named graphs',\n },\n invalidateCache: {\n type: 'boolean',\n describe: 'Enable cache invalidation before each query execution',\n },\n distinctConstruct: {\n type: 'boolean',\n describe: 'If the query engine should deduplicate resulting triples',\n },\n })\n .exitProcess(false)\n .fail(false)\n .help(false);\n }\n\n public async handleArgs(args: Record<string, any>, context: Record<string, any>): Promise<void> {\n // Print version information\n if (args.version) {\n // eslint-disable-next-line ts/no-require-imports,ts/no-var-requires,import/extensions\n const comunicaVersion: string = require('../../package.json').version;\n const dev: string = CliArgsHandlerBase.isDevelopmentEnvironment() ? '(dev)' : '';\n const nodeVersion: string = process.version;\n const npmVersion: string = await CliArgsHandlerBase.getScriptOutput('npm -v', '_NPM is unavailable_');\n const yarnVersion: string = await CliArgsHandlerBase.getScriptOutput('yarn -v', '_Yarn is unavailable_');\n const os = `${OS.platform()} (${OS.type()} ${OS.release()})`;\n\n const message = `| software | version\n| ---------------- | -------\n| Comunica Engine | ${comunicaVersion} ${dev}\n| node | ${nodeVersion}\n| npm | ${npmVersion}\n| yarn | ${yarnVersion}\n| Operating System | ${os}\n`;\n\n throw new Error(message);\n }\n\n // Inherit default context options\n if (this.initialContext) {\n Object.assign(context, this.initialContext.toJS());\n }\n\n // Define context\n if (args.context) {\n Object.assign(context, JSON.parse(existsSync(args.context) ? readFileSync(args.c, 'utf8') : args.context));\n } else if (args.sources[0]?.startsWith('{')) {\n // For backwards compatibility inline JSON\n Object.assign(context, JSON.parse(args.sources[0]));\n args.sources.shift();\n }\n\n // Add sources to context\n if (args.sources.length > 0) {\n context.sources = context.sources || [];\n // eslint-disable-next-line unicorn/no-array-for-each\n args.sources.forEach((sourceValue: string) => {\n const source = CliArgsHandlerBase.getSourceObjectFromString(sourceValue);\n context.sources.push(source);\n });\n }\n\n // Add destination to context\n if (args.to) {\n context[KeysRdfUpdateQuads.destination.name] = args.to;\n }\n\n // Set the logger\n if (!context.log) {\n context.log = new LoggerPretty({ level: args.logLevel });\n }\n\n // Define the base IRI\n if (args.baseIRI) {\n context[KeysInitQuery.baseIRI.name] = args.baseIRI;\n }\n\n // Define the file base IRI\n if (args.fileBaseIRI) {\n context[KeysInitQuery.fileBaseIRI.name] = args.fileBaseIRI;\n }\n\n // Define lenient-mode\n if (args.lenient) {\n context[KeysInitQuery.lenient.name] = true;\n }\n\n // Define HTTP timeout\n if (args.httpTimeout) {\n context[KeysHttp.httpTimeout.name] = args.httpTimeout;\n }\n\n // Define HTTP body timeout\n if (args.httpBodyTimeout) {\n if (!args.httpTimeout) {\n throw new Error('The --httpBodyTimeout option requires the --httpTimeout option to be set');\n }\n context[KeysHttp.httpBodyTimeout.name] = args.httpBodyTimeout;\n }\n\n // Define HTTP retry count\n if (args.httpRetryCount) {\n context[KeysHttp.httpRetryCount.name] = args.httpRetryCount;\n }\n\n // Define fallback HTTP delay between retries\n if (args.httpRetryDelayFallback) {\n if (!args.httpRetryCount) {\n throw new Error('The --httpRetryDelayFallback option requires the --httpRetryCount option to be set');\n }\n context[KeysHttp.httpRetryDelayFallback.name] = args.httpRetryDelayFallback;\n }\n\n // Define limit to the delay between HTTP retries\n if (args.httpRetryDelayLimit) {\n if (!args.httpRetryCount) {\n throw new Error('The --httpRetryDelayLimit option requires the --httpRetryCount option to be set');\n }\n context[KeysHttp.httpRetryDelayLimit.name] = args.httpRetryDelayLimit;\n }\n\n // Define union default graph\n if (args.unionDefaultGraph) {\n context[KeysQueryOperation.unionDefaultGraph.name] = true;\n }\n\n // Define if cache should be disabled\n if (args.invalidateCache) {\n context[KeysInitQuery.invalidateCache.name] = true;\n }\n\n // Define if results should be deduplicated\n if (args.distinctConstruct) {\n context[KeysInitQuery.distinctConstruct.name] = true;\n }\n }\n}\n/* eslint-enable import/no-nodejs-modules */\n"]}
|
|
@@ -54,12 +54,19 @@ class CliArgsHandlerHttp {
|
|
|
54
54
|
type: 'boolean',
|
|
55
55
|
describe: 'If the query context can be overridden through POST requests',
|
|
56
56
|
},
|
|
57
|
+
emitVoid: {
|
|
58
|
+
type: 'boolean',
|
|
59
|
+
describe: 'Generate VoID descriptions and include them in the service description',
|
|
60
|
+
},
|
|
57
61
|
})
|
|
58
62
|
.check((args) => {
|
|
59
63
|
if (args.version) {
|
|
60
64
|
return true;
|
|
61
65
|
}
|
|
62
|
-
if (args.context
|
|
66
|
+
if (args.context && args.sources.length > 0) {
|
|
67
|
+
throw new Error('When a context is provided, the sources should be contained within said context');
|
|
68
|
+
}
|
|
69
|
+
if (!args.context && args.sources.length === 0) {
|
|
63
70
|
throw new Error('At least one source must be provided');
|
|
64
71
|
}
|
|
65
72
|
return true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CliArgsHandlerHttp.js","sourceRoot":"","sources":["CliArgsHandlerHttp.ts"],"names":[],"mappings":";;;AAGA;;GAEG;AACH,MAAa,kBAAkB;IACtB,aAAa,CAAC,gBAA2B;QAC9C,OAAO,gBAAgB;aACpB,KAAK,CAAC,8BAA8B,CAAC;aACrC,OAAO,CAAC;YACP,CAAE,6CAA6C,EAAE,EAAE,CAAE;YACrD,CAAE,+EAA+E,EAAE,EAAE,CAAE;YACvF,CAAE,iGAAiG,EAAE,EAAE,CAAE;SAC1G,CAAC;aACD,OAAO,CAAC;YACP,IAAI,EAAE;gBACJ,KAAK,EAAE,GAAG;gBACV,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,qBAAqB;gBAC/B,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,sBAAsB;aAC9B;YACD,OAAO,EAAE;gBACP,KAAK,EAAE,GAAG;gBACV,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,0BAA0B;gBACpC,OAAO,EAAE,CAAC;gBACV,KAAK,EAAE,sBAAsB;aAC9B;YACD,OAAO,EAAE;gBACP,KAAK,EAAE,GAAG;gBACV,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,oCAAoC;gBAC9C,OAAO,EAAE,EAAE;gBACX,KAAK,EAAE,sBAAsB;aAC9B;YACD,MAAM,EAAE;gBACN,KAAK,EAAE,GAAG;gBACV,IAAI,EAAE,SAAS;gBACf,QAAQ,EAAE,kEAAkE;gBAC5E,KAAK,EAAE,sBAAsB;aAC9B;YACD,eAAe,EAAE;gBACf,KAAK,EAAE,GAAG;gBACV,IAAI,EAAE,SAAS;gBACf,QAAQ,EAAE,uDAAuD;aAClE;YACD,WAAW,EAAE;gBACX,IAAI,EAAE,SAAS;gBACf,QAAQ,EAAE,6CAA6C;aACxD;YACD,eAAe,EAAE;gBACf,IAAI,EAAE,SAAS;gBACf,QAAQ,EAAE,8DAA8D;aACzE;SACF,CAAC;aACD,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE;YACd,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjB,OAAO,IAAI,CAAC;YACd,CAAC;YACD,IAAI,IAAI,CAAC,OAAO,
|
|
1
|
+
{"version":3,"file":"CliArgsHandlerHttp.js","sourceRoot":"","sources":["CliArgsHandlerHttp.ts"],"names":[],"mappings":";;;AAGA;;GAEG;AACH,MAAa,kBAAkB;IACtB,aAAa,CAAC,gBAA2B;QAC9C,OAAO,gBAAgB;aACpB,KAAK,CAAC,8BAA8B,CAAC;aACrC,OAAO,CAAC;YACP,CAAE,6CAA6C,EAAE,EAAE,CAAE;YACrD,CAAE,+EAA+E,EAAE,EAAE,CAAE;YACvF,CAAE,iGAAiG,EAAE,EAAE,CAAE;SAC1G,CAAC;aACD,OAAO,CAAC;YACP,IAAI,EAAE;gBACJ,KAAK,EAAE,GAAG;gBACV,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,qBAAqB;gBAC/B,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,sBAAsB;aAC9B;YACD,OAAO,EAAE;gBACP,KAAK,EAAE,GAAG;gBACV,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,0BAA0B;gBACpC,OAAO,EAAE,CAAC;gBACV,KAAK,EAAE,sBAAsB;aAC9B;YACD,OAAO,EAAE;gBACP,KAAK,EAAE,GAAG;gBACV,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,oCAAoC;gBAC9C,OAAO,EAAE,EAAE;gBACX,KAAK,EAAE,sBAAsB;aAC9B;YACD,MAAM,EAAE;gBACN,KAAK,EAAE,GAAG;gBACV,IAAI,EAAE,SAAS;gBACf,QAAQ,EAAE,kEAAkE;gBAC5E,KAAK,EAAE,sBAAsB;aAC9B;YACD,eAAe,EAAE;gBACf,KAAK,EAAE,GAAG;gBACV,IAAI,EAAE,SAAS;gBACf,QAAQ,EAAE,uDAAuD;aAClE;YACD,WAAW,EAAE;gBACX,IAAI,EAAE,SAAS;gBACf,QAAQ,EAAE,6CAA6C;aACxD;YACD,eAAe,EAAE;gBACf,IAAI,EAAE,SAAS;gBACf,QAAQ,EAAE,8DAA8D;aACzE;YACD,QAAQ,EAAE;gBACR,IAAI,EAAE,SAAS;gBACf,QAAQ,EAAE,wEAAwE;aACnF;SACF,CAAC;aACD,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE;YACd,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjB,OAAO,IAAI,CAAC;YACd,CAAC;YACD,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5C,MAAM,IAAI,KAAK,CAAC,iFAAiF,CAAC,CAAC;YACrG,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC/C,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;YAC1D,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACP,CAAC;IAEM,KAAK,CAAC,UAAU,CAAC,KAA0B,EAAE,QAA6B;QAC/E,aAAa;IACf,CAAC;CACF;AAxED,gDAwEC","sourcesContent":["import type { ICliArgsHandler } from '@comunica/types';\nimport type { Argv } from 'yargs';\n\n/**\n * CLI arguments handler that handles options for HTTP servers.\n */\nexport class CliArgsHandlerHttp implements ICliArgsHandler {\n public populateYargs(argumentsBuilder: Argv<any>): Argv<any> {\n return argumentsBuilder\n .usage('$0 exposes a SPARQL endpoint')\n .example([\n [ `$0 https://fragments.dbpedia.org/2016-04/en`, '' ],\n [ `$0 https://fragments.dbpedia.org/2016-04/en https://query.wikidata.org/sparql`, '' ],\n [ `$0 hypermedia@https://fragments.dbpedia.org/2016-04/en sparql@https://query.wikidata.org/sparql`, '' ],\n ])\n .options({\n port: {\n alias: 'p',\n type: 'number',\n describe: 'HTTP port to run on',\n default: 3_000,\n group: 'Recommended options:',\n },\n workers: {\n alias: 'w',\n type: 'number',\n describe: 'Number of worker threads',\n default: 1,\n group: 'Recommended options:',\n },\n timeout: {\n alias: 't',\n type: 'number',\n describe: 'Query execution timeout in seconds',\n default: 60,\n group: 'Recommended options:',\n },\n update: {\n alias: 'u',\n type: 'boolean',\n describe: 'Enable update queries (otherwise, only read queries are enabled)',\n group: 'Recommended options:',\n },\n invalidateCache: {\n alias: 'i',\n type: 'boolean',\n describe: 'Enable cache invalidation before each query execution',\n },\n freshWorker: {\n type: 'boolean',\n describe: 'Kills the worker after each query execution',\n },\n contextOverride: {\n type: 'boolean',\n describe: 'If the query context can be overridden through POST requests',\n },\n emitVoid: {\n type: 'boolean',\n describe: 'Generate VoID descriptions and include them in the service description',\n },\n })\n .check((args) => {\n if (args.version) {\n return true;\n }\n if (args.context && args.sources.length > 0) {\n throw new Error('When a context is provided, the sources should be contained within said context');\n }\n if (!args.context && args.sources.length === 0) {\n throw new Error('At least one source must be provided');\n }\n return true;\n });\n }\n\n public async handleArgs(_args: Record<string, any>, _context: Record<string, any>): Promise<void> {\n // Do nothing\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@comunica/actor-init-query",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.4.0",
|
|
4
4
|
"description": "A query init actor",
|
|
5
5
|
"lsd:module": true,
|
|
6
6
|
"license": "MIT",
|
|
@@ -41,16 +41,16 @@
|
|
|
41
41
|
"build:components": "componentsjs-generator"
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
|
-
"@comunica/actor-http-proxy": "^4.
|
|
45
|
-
"@comunica/bus-http-invalidate": "^4.
|
|
46
|
-
"@comunica/bus-init": "^4.
|
|
47
|
-
"@comunica/bus-query-process": "^4.
|
|
48
|
-
"@comunica/bus-query-result-serialize": "^4.
|
|
49
|
-
"@comunica/context-entries": "^4.
|
|
50
|
-
"@comunica/core": "^4.
|
|
51
|
-
"@comunica/logger-pretty": "^4.
|
|
52
|
-
"@comunica/runner": "^4.
|
|
53
|
-
"@comunica/types": "^4.
|
|
44
|
+
"@comunica/actor-http-proxy": "^4.4.0",
|
|
45
|
+
"@comunica/bus-http-invalidate": "^4.4.0",
|
|
46
|
+
"@comunica/bus-init": "^4.4.0",
|
|
47
|
+
"@comunica/bus-query-process": "^4.4.0",
|
|
48
|
+
"@comunica/bus-query-result-serialize": "^4.4.0",
|
|
49
|
+
"@comunica/context-entries": "^4.4.0",
|
|
50
|
+
"@comunica/core": "^4.4.0",
|
|
51
|
+
"@comunica/logger-pretty": "^4.4.0",
|
|
52
|
+
"@comunica/runner": "^4.4.0",
|
|
53
|
+
"@comunica/types": "^4.4.0",
|
|
54
54
|
"@rdfjs/types": "*",
|
|
55
55
|
"@types/yargs": "^17.0.24",
|
|
56
56
|
"asynciterator": "^3.9.0",
|
|
@@ -58,6 +58,7 @@
|
|
|
58
58
|
"process": "^0.11.10",
|
|
59
59
|
"rdf-quad": "^1.5.0",
|
|
60
60
|
"readable-stream": "^4.5.2",
|
|
61
|
+
"sparqlalgebrajs": "^4.3.8",
|
|
61
62
|
"yargs": "^17.7.2"
|
|
62
63
|
},
|
|
63
64
|
"optionalDependencies": {
|
|
@@ -66,5 +67,5 @@
|
|
|
66
67
|
"browser": {
|
|
67
68
|
"./lib/index.js": "./lib/index-browser.js"
|
|
68
69
|
},
|
|
69
|
-
"gitHead": "
|
|
70
|
+
"gitHead": "27acde56dfe0c1ff1162c1f46818ad752296ca88"
|
|
70
71
|
}
|