@undefineds.co/xpod 0.3.18 → 0.3.22
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/config/bun.json +57 -11
- package/config/cloud.json +14 -12
- package/config/local.json +16 -14
- package/config/xpod.json +47 -9
- package/dist/api/matrix/PodMatrixStore.d.ts +4 -7
- package/dist/api/matrix/PodMatrixStore.js +116 -148
- package/dist/api/matrix/PodMatrixStore.js.map +1 -1
- package/dist/api/matrix/types.d.ts +2 -0
- package/dist/api/matrix/types.js.map +1 -1
- package/dist/components/components.jsonld +3 -0
- package/dist/components/context.jsonld +71 -32
- package/dist/http/SubgraphSparqlHttpHandler.d.ts +1 -0
- package/dist/http/SubgraphSparqlHttpHandler.js +27 -4
- package/dist/http/SubgraphSparqlHttpHandler.js.map +1 -1
- package/dist/http/SubgraphSparqlHttpHandler.jsonld +4 -0
- package/dist/http/vector/VectorHttpHandler.d.ts +5 -1
- package/dist/http/vector/VectorHttpHandler.js +5 -5
- package/dist/http/vector/VectorHttpHandler.js.map +1 -1
- package/dist/http/vector/VectorHttpHandler.jsonld +40 -28
- package/dist/index.d.ts +5 -2
- package/dist/index.js +9 -4
- package/dist/index.js.map +1 -1
- package/dist/runtime/Proxy.d.ts +3 -0
- package/dist/runtime/Proxy.js +31 -7
- package/dist/runtime/Proxy.js.map +1 -1
- package/dist/storage/SparqlUpdateResourceStore.js +94 -33
- package/dist/storage/SparqlUpdateResourceStore.js.map +1 -1
- package/dist/storage/accessors/MixDataAccessor.d.ts +22 -5
- package/dist/storage/accessors/MixDataAccessor.js +376 -61
- package/dist/storage/accessors/MixDataAccessor.js.map +1 -1
- package/dist/storage/accessors/MixDataAccessor.jsonld +73 -5
- package/dist/storage/accessors/QuadstoreSparqlDataAccessor.js +32 -10
- package/dist/storage/accessors/QuadstoreSparqlDataAccessor.js.map +1 -1
- package/dist/storage/accessors/QuintStoreSparqlDataAccessor.js +28 -6
- package/dist/storage/accessors/QuintStoreSparqlDataAccessor.js.map +1 -1
- package/dist/storage/accessors/SolidRdfDataAccessor.d.ts +45 -0
- package/dist/storage/accessors/SolidRdfDataAccessor.js +277 -0
- package/dist/storage/accessors/SolidRdfDataAccessor.js.map +1 -0
- package/dist/storage/accessors/SolidRdfDataAccessor.jsonld +161 -0
- package/dist/storage/rdf/Rdf3xIndex.d.ts +122 -0
- package/dist/storage/rdf/Rdf3xIndex.js +2695 -0
- package/dist/storage/rdf/Rdf3xIndex.js.map +1 -0
- package/dist/storage/rdf/Rdf3xIndex.jsonld +528 -0
- package/dist/storage/rdf/Rdf3xSchema.d.ts +20 -0
- package/dist/storage/rdf/Rdf3xSchema.js +65 -0
- package/dist/storage/rdf/Rdf3xSchema.js.map +1 -0
- package/dist/storage/rdf/RdfLocalQueryEngine.d.ts +10 -4
- package/dist/storage/rdf/RdfLocalQueryEngine.js +607 -127
- package/dist/storage/rdf/RdfLocalQueryEngine.js.map +1 -1
- package/dist/storage/rdf/RdfQuadIndex.d.ts +12 -1
- package/dist/storage/rdf/RdfQuadIndex.js +152 -22
- package/dist/storage/rdf/RdfQuadIndex.js.map +1 -1
- package/dist/storage/rdf/RdfQuadIndex.jsonld +36 -4
- package/dist/storage/rdf/RdfSparqlAdapter.d.ts +20 -2
- package/dist/storage/rdf/RdfSparqlAdapter.js +364 -40
- package/dist/storage/rdf/RdfSparqlAdapter.js.map +1 -1
- package/dist/storage/rdf/RdfSparqlAdapter.jsonld +60 -0
- package/dist/storage/rdf/RdfTermDictionary.d.ts +8 -0
- package/dist/storage/rdf/RdfTermDictionary.js +141 -70
- package/dist/storage/rdf/RdfTermDictionary.js.map +1 -1
- package/dist/storage/rdf/RdfTermDictionary.jsonld +24 -0
- package/dist/storage/rdf/RdfTextIndex.js +10 -3
- package/dist/storage/rdf/RdfTextIndex.js.map +1 -1
- package/dist/storage/rdf/SolidRdfEngine.d.ts +15 -6
- package/dist/storage/rdf/SolidRdfEngine.js +218 -25
- package/dist/storage/rdf/SolidRdfEngine.js.map +1 -1
- package/dist/storage/rdf/SolidRdfEngine.jsonld +70 -7
- package/dist/storage/rdf/SolidRdfSparqlEngine.d.ts +11 -7
- package/dist/storage/rdf/SolidRdfSparqlEngine.js +60 -47
- package/dist/storage/rdf/SolidRdfSparqlEngine.js.map +1 -1
- package/dist/storage/rdf/SolidRdfSparqlEngine.jsonld +9 -5
- package/dist/storage/rdf/index.d.ts +2 -2
- package/dist/storage/rdf/index.js +3 -3
- package/dist/storage/rdf/index.js.map +1 -1
- package/dist/storage/rdf/models-benchmark.d.ts +12 -1
- package/dist/storage/rdf/models-benchmark.js +549 -32
- package/dist/storage/rdf/models-benchmark.js.map +1 -1
- package/dist/storage/rdf/types.d.ts +81 -7
- package/dist/storage/rdf/types.js.map +1 -1
- package/dist/storage/sparql/CompatibilitySparqlEngine.d.ts +36 -0
- package/dist/storage/sparql/CompatibilitySparqlEngine.js +96 -0
- package/dist/storage/sparql/CompatibilitySparqlEngine.js.map +1 -0
- package/dist/storage/sparql/CompatibilitySparqlEngine.jsonld +123 -0
- package/dist/storage/sparql/CompatibilitySparqlEngineImpl.d.ts +35 -0
- package/dist/storage/sparql/CompatibilitySparqlEngineImpl.js +112 -0
- package/dist/storage/sparql/CompatibilitySparqlEngineImpl.js.map +1 -0
- package/dist/storage/sparql/SubgraphQueryEngine.d.ts +1 -36
- package/dist/storage/sparql/SubgraphQueryEngine.js +2 -115
- package/dist/storage/sparql/SubgraphQueryEngine.js.map +1 -1
- package/dist/storage/sparql/SubgraphQueryEngine.jsonld +1 -124
- package/dist/terminal/AclPermissionService.d.ts +2 -1
- package/dist/terminal/AclPermissionService.js +26 -3
- package/dist/terminal/AclPermissionService.js.map +1 -1
- package/dist/terminal/TerminalSessionManager.js +25 -3
- package/dist/terminal/TerminalSessionManager.js.map +1 -1
- package/package.json +1 -1
- package/dist/storage/rdf/Rdf3xTripleIndex.d.ts +0 -55
- package/dist/storage/rdf/Rdf3xTripleIndex.js +0 -1235
- package/dist/storage/rdf/Rdf3xTripleIndex.js.map +0 -1
|
@@ -18,24 +18,6 @@
|
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
20
|
},
|
|
21
|
-
"QuadstoreSparqlEngine": {
|
|
22
|
-
"@id": "undefineds:dist/storage/sparql/SubgraphQueryEngine.jsonld#QuadstoreSparqlEngine",
|
|
23
|
-
"@prefix": true,
|
|
24
|
-
"@context": {
|
|
25
|
-
"endpoint": {
|
|
26
|
-
"@id": "undefineds:dist/storage/sparql/SubgraphQueryEngine.jsonld#QuadstoreSparqlEngine_endpoint"
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
},
|
|
30
|
-
"QuintstoreSparqlEngine": {
|
|
31
|
-
"@id": "undefineds:dist/storage/sparql/SubgraphQueryEngine.jsonld#QuintstoreSparqlEngine",
|
|
32
|
-
"@prefix": true,
|
|
33
|
-
"@context": {
|
|
34
|
-
"store": {
|
|
35
|
-
"@id": "undefineds:dist/storage/sparql/SubgraphQueryEngine.jsonld#QuintstoreSparqlEngine_store"
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
},
|
|
39
21
|
"RdfIndexStats": {
|
|
40
22
|
"@id": "undefineds:dist/storage/rdf/types.jsonld#RdfIndexStats",
|
|
41
23
|
"@prefix": true,
|
|
@@ -492,6 +474,18 @@
|
|
|
492
474
|
}
|
|
493
475
|
}
|
|
494
476
|
},
|
|
477
|
+
"SolidRdfDataAccessor": {
|
|
478
|
+
"@id": "undefineds:dist/storage/accessors/SolidRdfDataAccessor.jsonld#SolidRdfDataAccessor",
|
|
479
|
+
"@prefix": true,
|
|
480
|
+
"@context": {
|
|
481
|
+
"rdfEngine": {
|
|
482
|
+
"@id": "undefineds:dist/storage/accessors/SolidRdfDataAccessor.jsonld#SolidRdfDataAccessor_rdfEngine"
|
|
483
|
+
},
|
|
484
|
+
"identifierStrategy": {
|
|
485
|
+
"@id": "undefineds:dist/storage/accessors/SolidRdfDataAccessor.jsonld#SolidRdfDataAccessor_identifierStrategy"
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
},
|
|
495
489
|
"MixDataAccessor": {
|
|
496
490
|
"@id": "undefineds:dist/storage/accessors/MixDataAccessor.jsonld#MixDataAccessor",
|
|
497
491
|
"@prefix": true,
|
|
@@ -600,6 +594,24 @@
|
|
|
600
594
|
}
|
|
601
595
|
}
|
|
602
596
|
},
|
|
597
|
+
"QuadstoreSparqlEngine": {
|
|
598
|
+
"@id": "undefineds:dist/storage/sparql/CompatibilitySparqlEngine.jsonld#QuadstoreSparqlEngine",
|
|
599
|
+
"@prefix": true,
|
|
600
|
+
"@context": {
|
|
601
|
+
"endpoint": {
|
|
602
|
+
"@id": "undefineds:dist/storage/sparql/CompatibilitySparqlEngine.jsonld#QuadstoreSparqlEngine_endpoint"
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
},
|
|
606
|
+
"QuintstoreSparqlEngine": {
|
|
607
|
+
"@id": "undefineds:dist/storage/sparql/CompatibilitySparqlEngine.jsonld#QuintstoreSparqlEngine",
|
|
608
|
+
"@prefix": true,
|
|
609
|
+
"@context": {
|
|
610
|
+
"store": {
|
|
611
|
+
"@id": "undefineds:dist/storage/sparql/CompatibilitySparqlEngine.jsonld#QuintstoreSparqlEngine_store"
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
},
|
|
603
615
|
"SubgraphSparqlHttpHandler": {
|
|
604
616
|
"@id": "undefineds:dist/http/SubgraphSparqlHttpHandler.jsonld#SubgraphSparqlHttpHandler",
|
|
605
617
|
"@prefix": true,
|
|
@@ -1780,6 +1792,24 @@
|
|
|
1780
1792
|
}
|
|
1781
1793
|
}
|
|
1782
1794
|
},
|
|
1795
|
+
"Rdf3xIndex": {
|
|
1796
|
+
"@id": "undefineds:dist/storage/rdf/Rdf3xIndex.jsonld#Rdf3xIndex",
|
|
1797
|
+
"@prefix": true,
|
|
1798
|
+
"@context": {
|
|
1799
|
+
"options_path": {
|
|
1800
|
+
"@id": "undefineds:dist/storage/rdf/Rdf3xIndex.jsonld#Rdf3xIndex_options_path"
|
|
1801
|
+
},
|
|
1802
|
+
"options_debug": {
|
|
1803
|
+
"@id": "undefineds:dist/storage/rdf/Rdf3xIndex.jsonld#Rdf3xIndex_options_debug"
|
|
1804
|
+
},
|
|
1805
|
+
"path": {
|
|
1806
|
+
"@id": "undefineds:dist/storage/rdf/Rdf3xIndex.jsonld#Rdf3xIndex_options_path"
|
|
1807
|
+
},
|
|
1808
|
+
"debug": {
|
|
1809
|
+
"@id": "undefineds:dist/storage/rdf/Rdf3xIndex.jsonld#Rdf3xIndex_options_debug"
|
|
1810
|
+
}
|
|
1811
|
+
}
|
|
1812
|
+
},
|
|
1783
1813
|
"SolidRdfEngine": {
|
|
1784
1814
|
"@id": "undefineds:dist/storage/rdf/SolidRdfEngine.jsonld#SolidRdfEngine",
|
|
1785
1815
|
"@prefix": true,
|
|
@@ -1790,6 +1820,9 @@
|
|
|
1790
1820
|
"options_index_debug": {
|
|
1791
1821
|
"@id": "undefineds:dist/storage/rdf/SolidRdfEngine.jsonld#SolidRdfEngine_options_index_debug"
|
|
1792
1822
|
},
|
|
1823
|
+
"options_derivedIndexProfile": {
|
|
1824
|
+
"@id": "undefineds:dist/storage/rdf/SolidRdfEngine.jsonld#SolidRdfEngine_options_derivedIndexProfile"
|
|
1825
|
+
},
|
|
1793
1826
|
"options_textIndex_path": {
|
|
1794
1827
|
"@id": "undefineds:dist/storage/rdf/SolidRdfEngine.jsonld#SolidRdfEngine_options_textIndex_path"
|
|
1795
1828
|
},
|
|
@@ -1820,6 +1853,9 @@
|
|
|
1820
1853
|
"index_debug": {
|
|
1821
1854
|
"@id": "undefineds:dist/storage/rdf/SolidRdfEngine.jsonld#SolidRdfEngine_options_index_debug"
|
|
1822
1855
|
},
|
|
1856
|
+
"derivedIndexProfile": {
|
|
1857
|
+
"@id": "undefineds:dist/storage/rdf/SolidRdfEngine.jsonld#SolidRdfEngine_options_derivedIndexProfile"
|
|
1858
|
+
},
|
|
1823
1859
|
"textIndex_path": {
|
|
1824
1860
|
"@id": "undefineds:dist/storage/rdf/SolidRdfEngine.jsonld#SolidRdfEngine_options_textIndex_path"
|
|
1825
1861
|
},
|
|
@@ -1873,32 +1909,35 @@
|
|
|
1873
1909
|
"@id": "undefineds:dist/http/vector/VectorHttpHandler.jsonld#VectorHttpHandler",
|
|
1874
1910
|
"@prefix": true,
|
|
1875
1911
|
"@context": {
|
|
1912
|
+
"options_vectorStore": {
|
|
1913
|
+
"@id": "undefineds:dist/http/vector/VectorHttpHandler.jsonld#VectorHttpHandler_options_vectorStore"
|
|
1914
|
+
},
|
|
1915
|
+
"options_credentialsExtractor": {
|
|
1916
|
+
"@id": "undefineds:dist/http/vector/VectorHttpHandler.jsonld#VectorHttpHandler_options_credentialsExtractor"
|
|
1917
|
+
},
|
|
1918
|
+
"options_permissionReader": {
|
|
1919
|
+
"@id": "undefineds:dist/http/vector/VectorHttpHandler.jsonld#VectorHttpHandler_options_permissionReader"
|
|
1920
|
+
},
|
|
1921
|
+
"options_authorizer": {
|
|
1922
|
+
"@id": "undefineds:dist/http/vector/VectorHttpHandler.jsonld#VectorHttpHandler_options_authorizer"
|
|
1923
|
+
},
|
|
1876
1924
|
"options_sidecarPath": {
|
|
1877
1925
|
"@id": "undefineds:dist/http/vector/VectorHttpHandler.jsonld#VectorHttpHandler_options_sidecarPath"
|
|
1878
1926
|
},
|
|
1879
1927
|
"vectorStore": {
|
|
1880
|
-
"@id": "undefineds:dist/http/vector/VectorHttpHandler.jsonld#
|
|
1928
|
+
"@id": "undefineds:dist/http/vector/VectorHttpHandler.jsonld#VectorHttpHandler_options_vectorStore"
|
|
1881
1929
|
},
|
|
1882
1930
|
"credentialsExtractor": {
|
|
1883
|
-
"@id": "undefineds:dist/http/vector/VectorHttpHandler.jsonld#
|
|
1931
|
+
"@id": "undefineds:dist/http/vector/VectorHttpHandler.jsonld#VectorHttpHandler_options_credentialsExtractor"
|
|
1884
1932
|
},
|
|
1885
1933
|
"permissionReader": {
|
|
1886
|
-
"@id": "undefineds:dist/http/vector/VectorHttpHandler.jsonld#
|
|
1934
|
+
"@id": "undefineds:dist/http/vector/VectorHttpHandler.jsonld#VectorHttpHandler_options_permissionReader"
|
|
1887
1935
|
},
|
|
1888
1936
|
"authorizer": {
|
|
1889
|
-
"@id": "undefineds:dist/http/vector/VectorHttpHandler.jsonld#
|
|
1937
|
+
"@id": "undefineds:dist/http/vector/VectorHttpHandler.jsonld#VectorHttpHandler_options_authorizer"
|
|
1890
1938
|
},
|
|
1891
|
-
"
|
|
1939
|
+
"sidecarPath": {
|
|
1892
1940
|
"@id": "undefineds:dist/http/vector/VectorHttpHandler.jsonld#VectorHttpHandler_options_sidecarPath"
|
|
1893
|
-
},
|
|
1894
|
-
"": {
|
|
1895
|
-
"@id": "undefineds:dist/http/vector/VectorHttpHandler.jsonld#VectorHttpHandler_vectorStore"
|
|
1896
|
-
},
|
|
1897
|
-
"Extractor": {
|
|
1898
|
-
"@id": "undefineds:dist/http/vector/VectorHttpHandler.jsonld#VectorHttpHandler_credentialsExtractor"
|
|
1899
|
-
},
|
|
1900
|
-
"eader": {
|
|
1901
|
-
"@id": "undefineds:dist/http/vector/VectorHttpHandler.jsonld#VectorHttpHandler_permissionReader"
|
|
1902
1941
|
}
|
|
1903
1942
|
}
|
|
1904
1943
|
},
|
|
@@ -9,6 +9,7 @@ const community_server_2 = require("@solid/community-server");
|
|
|
9
9
|
const policy_engine_1 = require("@solidlab/policy-engine");
|
|
10
10
|
const n3_1 = require("n3");
|
|
11
11
|
const sparqljs_1 = require("sparqljs");
|
|
12
|
+
const RdfSparqlAdapter_1 = require("../storage/rdf/RdfSparqlAdapter");
|
|
12
13
|
const db_1 = require("../identity/drizzle/db");
|
|
13
14
|
const PodLookupRepository_1 = require("../identity/drizzle/PodLookupRepository");
|
|
14
15
|
const UsageRepository_1 = require("../storage/quota/UsageRepository");
|
|
@@ -64,7 +65,7 @@ class SubgraphSparqlHttpHandler extends community_server_1.HttpHandler {
|
|
|
64
65
|
await this.executeUpdate(queryRequest, parsed, request, response, context);
|
|
65
66
|
return;
|
|
66
67
|
}
|
|
67
|
-
// WORKAROUND:
|
|
68
|
+
// WORKAROUND: the compatibility engine crashes if ASK query has a LIMIT clause ("Expected bindings but got boolean").
|
|
68
69
|
// ASK results are boolean and cannot be sliced, so LIMIT is semantically redundant but syntactically valid.
|
|
69
70
|
// We strip it here to protect the engine.
|
|
70
71
|
// console.log('Parsed Query Type:', parsed.queryType, 'Limit:', (parsed as any).limit);
|
|
@@ -99,6 +100,16 @@ class SubgraphSparqlHttpHandler extends community_server_1.HttpHandler {
|
|
|
99
100
|
this.sendErrorResponse(response, error.statusCode, errorMessage);
|
|
100
101
|
return;
|
|
101
102
|
}
|
|
103
|
+
if (error instanceof RdfSparqlAdapter_1.DisabledSparqlFeatureError) {
|
|
104
|
+
this.logger.warn(`SPARQL sidecar disabled feature (${this.getRequestId(request)}): ${error.message}`);
|
|
105
|
+
this.sendErrorResponse(response, 403, error.message);
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
if (error instanceof RdfSparqlAdapter_1.UnsupportedSparqlQueryError) {
|
|
109
|
+
this.logger.warn(`SPARQL sidecar unsupported query (${this.getRequestId(request)}): ${error.message}`);
|
|
110
|
+
this.sendErrorResponse(response, 400, error.message);
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
102
113
|
// Re-throw unknown errors for CSS error handling
|
|
103
114
|
this.logger.error(`SPARQL sidecar unexpected error (${this.getRequestId(request)}): ${error instanceof Error ? error.message : String(error)}`);
|
|
104
115
|
throw error;
|
|
@@ -437,6 +448,12 @@ class SubgraphSparqlHttpHandler extends community_server_1.HttpHandler {
|
|
|
437
448
|
delete: rewritePatterns(op.delete),
|
|
438
449
|
};
|
|
439
450
|
}
|
|
451
|
+
if (op.updateType === 'deletewhere') {
|
|
452
|
+
return {
|
|
453
|
+
...op,
|
|
454
|
+
delete: rewritePatterns(op.delete),
|
|
455
|
+
};
|
|
456
|
+
}
|
|
440
457
|
return op;
|
|
441
458
|
});
|
|
442
459
|
return this.generator.stringify(parsed);
|
|
@@ -488,9 +505,7 @@ class SubgraphSparqlHttpHandler extends community_server_1.HttpHandler {
|
|
|
488
505
|
throw new community_server_2.NotImplementedHttpError('Request is not targeting a subgraph SPARQL endpoint.');
|
|
489
506
|
}
|
|
490
507
|
let basePath = path.slice(0, sidecarIndex);
|
|
491
|
-
|
|
492
|
-
const hasExtension = /\.[^/]+$/.test(basePath);
|
|
493
|
-
if (!hasExtension && !basePath.endsWith('/')) {
|
|
508
|
+
if (this.isContainerSidecarBase(basePath) && !basePath.endsWith('/')) {
|
|
494
509
|
basePath = `${basePath}/`;
|
|
495
510
|
}
|
|
496
511
|
let query = null;
|
|
@@ -540,6 +555,14 @@ class SubgraphSparqlHttpHandler extends community_server_1.HttpHandler {
|
|
|
540
555
|
const requestUrl = request.url ?? '/';
|
|
541
556
|
return new URL(requestUrl, `${protocol}://${hostHeader}`);
|
|
542
557
|
}
|
|
558
|
+
isContainerSidecarBase(basePath) {
|
|
559
|
+
const lastSegment = basePath.split('/').filter(Boolean).pop() ?? '';
|
|
560
|
+
if (lastSegment.length === 0) {
|
|
561
|
+
return true;
|
|
562
|
+
}
|
|
563
|
+
const extensionStart = lastSegment.lastIndexOf('.');
|
|
564
|
+
return extensionStart <= 0;
|
|
565
|
+
}
|
|
543
566
|
async readBody(request) {
|
|
544
567
|
return await new Promise((resolve, reject) => {
|
|
545
568
|
let data = '';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SubgraphSparqlHttpHandler.js","sourceRoot":"","sources":["../../src/http/SubgraphSparqlHttpHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import { Readable } from 'node:stream';\nimport { getLoggerFor } from 'global-logger-factory';\nimport { pipeline } from 'node:stream/promises';\nimport { HttpHandler } from '@solid/community-server';\nimport type { HttpHandlerInput, HttpRequest, HttpResponse } from '@solid/community-server';\nimport {\n NotImplementedHttpError,\n MethodNotAllowedHttpError,\n BadRequestHttpError,\n UnsupportedMediaTypeHttpError,\n IdentifierSetMultiMap,\n HttpError,\n} from '@solid/community-server';\nimport { PERMISSIONS } from '@solidlab/policy-engine';\nimport type {\n CredentialsExtractor,\n PermissionReader,\n Authorizer,\n ResourceIdentifier,\n} from '@solid/community-server';\nimport type { Term, Literal, Variable, Quad as RdfQuad } from '@rdfjs/types';\nimport { Writer, DataFactory } from 'n3';\nimport { Parser, Generator } from 'sparqljs';\nimport type {\n Update as SparqlUpdate,\n InsertDeleteOperation as SparqlInsertDeleteOperation,\n Quads as SparqlQuads,\n Pattern as SparqlPattern,\n GraphOrDefault as SparqlGraphOrDefault,\n IriTerm as SparqlIriTerm,\n Term as SparqlTerm,\n GraphQuads,\n UpdateOperation,\n} from 'sparqljs';\nimport { SubgraphQueryEngine } from '../storage/sparql/SubgraphQueryEngine';\nimport { getIdentityDatabase } from '../identity/drizzle/db';\nimport { PodLookupRepository } from '../identity/drizzle/PodLookupRepository';\nimport { UsageRepository } from '../storage/quota/UsageRepository';\nimport { createBandwidthThrottleTransform } from '../util/stream/BandwidthThrottleTransform';\n\nconst ALLOWED_METHODS = [ 'GET', 'POST', 'OPTIONS' ];\n\ninterface QueryRequest {\n basePath: string;\n baseUrl: string; // Full URL for authorization (origin + basePath)\n query: string;\n origin: string;\n method: string;\n ingressBytes: number;\n}\n\ninterface SubgraphSparqlHttpHandlerOptions {\n /** @deprecated Use sidecarPath instead */\n resourceSuffix?: string;\n /** @deprecated Use sidecarPath instead */\n containerSuffix?: string;\n /** Sidecar API path segment, default: '/-/sparql' */\n sidecarPath?: string;\n identityDbUrl?: string;\n usageDbUrl?: string;\n defaultAccountBandwidthLimitBps?: number | null;\n}\n\ntype UsageContext = {\n accountId: string;\n podId: string;\n};\n\nexport class SubgraphSparqlHttpHandler extends HttpHandler {\n protected readonly logger = getLoggerFor(this);\n private readonly engine: SubgraphQueryEngine;\n private readonly credentialsExtractor: CredentialsExtractor;\n private readonly permissionReader: PermissionReader;\n private readonly authorizer: Authorizer;\n private readonly sidecarPath: string;\n private readonly podLookup?: PodLookupRepository;\n private readonly usageRepo?: UsageRepository;\n private readonly defaultBandwidthLimit?: number | null;\n private readonly generator = new Generator();\n\n private static readonly XSD_STRING = 'http://www.w3.org/2001/XMLSchema#string';\n\n public constructor(\n queryEngine: SubgraphQueryEngine,\n credentialsExtractor: CredentialsExtractor,\n permissionReader: PermissionReader,\n authorizer: Authorizer,\n options: SubgraphSparqlHttpHandlerOptions = {},\n ) {\n super();\n this.engine = queryEngine;\n this.credentialsExtractor = credentialsExtractor;\n this.permissionReader = permissionReader;\n this.authorizer = authorizer;\n this.sidecarPath = options.sidecarPath ?? '/-/sparql';\n this.defaultBandwidthLimit = this.normalizeLimit(options.defaultAccountBandwidthLimitBps);\n\n // Identity DB is used for pod lookup (to resolve accountId/podId from URL)\n if (options.identityDbUrl) {\n const db = getIdentityDatabase(options.identityDbUrl);\n this.podLookup = new PodLookupRepository(db);\n }\n\n // Usage DB can be separate from identity DB (decoupled usage tracking)\n // NOTE: UsageRepository only supports PostgreSQL. SQLite is skipped.\n const usageDbUrl = options.usageDbUrl ?? options.identityDbUrl;\n if (usageDbUrl && !this.isSqliteUrl(usageDbUrl)) {\n const usageDb = getIdentityDatabase(usageDbUrl);\n this.usageRepo = new UsageRepository(usageDb);\n }\n }\n\n public override async canHandle({ request }: HttpHandlerInput): Promise<void> {\n const path = this.parseUrl(request).pathname;\n // Match /-/sparql pattern: /alice/-/sparql or /alice/photos/-/sparql\n if (!path.includes(this.sidecarPath)) {\n throw new NotImplementedHttpError('Request is not targeting a subgraph SPARQL endpoint.');\n }\n }\n\n public override async handle({ request, response }: HttpHandlerInput): Promise<void> {\n const method = (request.method ?? 'GET').toUpperCase();\n\n if (method === 'OPTIONS') {\n this.writeOptions(response);\n return;\n }\n\n if (!ALLOWED_METHODS.includes(method)) {\n throw new MethodNotAllowedHttpError(ALLOWED_METHODS);\n }\n\n try {\n const queryRequest = await this.extractQuery(request, method);\n const context = await this.resolveUsageContext(queryRequest.basePath);\n await this.recordBandwidth(context, queryRequest.ingressBytes, 0);\n const parser = new Parser({ baseIRI: queryRequest.baseUrl });\n const parsed = parser.parse(queryRequest.query);\n\n if (parsed.type === 'update') {\n await this.executeUpdate(queryRequest, parsed, request, response, context);\n return;\n }\n\n // WORKAROUND: Comunica crashes if ASK query has a LIMIT clause (\"Expected bindings but got boolean\").\n // ASK results are boolean and cannot be sliced, so LIMIT is semantically redundant but syntactically valid.\n // We strip it here to protect the engine.\n // console.log('Parsed Query Type:', parsed.queryType, 'Limit:', (parsed as any).limit); \n if (parsed.queryType === 'ASK' && (parsed as any).limit !== undefined) {\n this.logger.warn(`Stripping LIMIT from ASK query to prevent Comunica crash. Original limit: ${JSON.stringify((parsed as any).limit)}`);\n delete (parsed as any).limit;\n queryRequest.query = this.generator.stringify(parsed);\n this.logger.warn(`Sanitized Query: ${queryRequest.query}`);\n }\n\n const queryType = parsed.queryType ?? 'SELECT';\n\n switch (queryType) {\n case 'SELECT':\n await this.executeSelect(request, queryRequest, response, context);\n break;\n case 'ASK':\n await this.executeAsk(request, queryRequest, response, context);\n break;\n case 'CONSTRUCT':\n case 'DESCRIBE':\n await this.executeConstruct(request, queryRequest, response, context);\n break;\n default:\n throw new BadRequestHttpError(`Unsupported SPARQL query type: ${queryType}`);\n }\n } catch (error: unknown) {\n // Handle HttpErrors with proper status codes\n if (error instanceof HttpError) {\n const errorName = error.name || error.constructor.name || 'HttpError';\n const errorMessage = error.message || 'No message';\n this.logger.error(`SPARQL sidecar error ${error.statusCode} (${this.getRequestId(request)}): ${errorName} - ${errorMessage}`);\n this.sendErrorResponse(response, error.statusCode, errorMessage);\n return;\n }\n // Re-throw unknown errors for CSS error handling\n this.logger.error(`SPARQL sidecar unexpected error (${this.getRequestId(request)}): ${error instanceof Error ? error.message : String(error)}`);\n throw error;\n }\n }\n\n private sendErrorResponse(response: HttpResponse, statusCode: number, message: string): void {\n response.statusCode = statusCode;\n response.setHeader('Content-Type', 'text/plain; charset=utf-8');\n response.end(message);\n }\n\n private async executeSelect(request: HttpRequest, { query, basePath, baseUrl }: QueryRequest, response: HttpResponse, context: UsageContext | undefined): Promise<void> {\n await this.authorizeFor(baseUrl, request, [ PERMISSIONS.Read ]);\n\n let vars: string[] = [];\n const results: Record<string, unknown>[] = [];\n const seenVars = new Set<string>();\n\n try {\n const bindingsStream: any = await this.engine.queryBindings(query, baseUrl);\n const metadata = typeof bindingsStream.metadata === 'function' ? await bindingsStream.metadata() : undefined;\n vars = metadata?.variables?.map((variable: Variable): string => variable.value) ?? [];\n\n for await (const binding of bindingsStream as AsyncIterable<any>) {\n const row: Record<string, unknown> = {};\n for (const [ variable, term ] of binding) {\n // variable is a Variable object; use .value to get the string name\n const name = typeof variable === 'string' ? variable : variable.value;\n row[name] = this.termToJson(term);\n seenVars.add(name);\n }\n results.push(row);\n }\n\n // Fallback: if metadata didn't provide vars, extract from bindings\n if (vars.length === 0 && seenVars.size > 0) {\n vars = Array.from(seenVars);\n }\n } catch (error: unknown) {\n // Comunica throws when projected variables are not assigned (i.e., no results)\n // Return empty results instead of erroring\n const message = error instanceof Error ? error.message : String(error);\n if (message.includes('are used in the projection result, but are not assigned')) {\n this.logger.debug(`Query returned no results: ${message}`);\n // Extract variable names from the error message or query\n const varMatch = message.match(/Variables '([^']+)'/);\n if (varMatch) {\n vars = varMatch[1].split(',').map((v) => v.trim().replace(/^\\?/, ''));\n }\n } else {\n throw error;\n }\n }\n\n const payload = {\n head: { vars },\n results: { bindings: results },\n };\n\n await this.sendPayload(response, JSON.stringify(payload), 'application/sparql-results+json; charset=utf-8', context);\n }\n\n private async executeAsk(request: HttpRequest, { query, basePath, baseUrl }: QueryRequest, response: HttpResponse, context: UsageContext | undefined): Promise<void> {\n await this.authorizeFor(baseUrl, request, [ PERMISSIONS.Read ]);\n const result = await this.engine.queryBoolean(query, baseUrl);\n const payload = {\n head: {},\n boolean: result,\n };\n await this.sendPayload(response, JSON.stringify(payload), 'application/sparql-results+json; charset=utf-8', context);\n }\n\n private async executeConstruct(request: HttpRequest, { query, basePath, baseUrl }: QueryRequest, response: HttpResponse, context: UsageContext | undefined): Promise<void> {\n await this.authorizeFor(baseUrl, request, [ PERMISSIONS.Read ]);\n const quadStream = await this.engine.queryQuads(query, baseUrl);\n const writer = new Writer({ format: 'N-Quads' });\n\n for await (const quad of quadStream) {\n writer.addQuad(quad);\n }\n\n const nquads = await new Promise<string>((resolve, reject) => {\n writer.end((error, result) => {\n if (error) {\n reject(error);\n } else {\n resolve(result);\n }\n });\n });\n\n await this.sendPayload(response, nquads, 'application/n-quads; charset=utf-8', context);\n }\n\n private async executeUpdate(queryRequest: QueryRequest, parsed: SparqlUpdate, request: HttpRequest, response: HttpResponse, context: UsageContext | undefined): Promise<void> {\n if (queryRequest.method !== 'POST') {\n throw new MethodNotAllowedHttpError([ 'POST' ]);\n }\n\n const { hasInsert, hasDelete } = this.inspectUpdateGraphs(parsed, queryRequest.baseUrl);\n const modes: string[] = [];\n if (hasInsert) {\n modes.push(PERMISSIONS.Append);\n }\n if (hasDelete) {\n modes.push(PERMISSIONS.Delete);\n }\n await this.authorizeFor(queryRequest.baseUrl, request, modes);\n\n const rewritten = this.rewriteDefaultGraphUpdates(parsed, queryRequest.baseUrl);\n this.logger.verbose(`[SubgraphSPARQL] Rewritten Query: ${rewritten}`);\n\n await this.engine.queryVoid(rewritten, queryRequest.baseUrl);\n await this.refreshUsage(queryRequest.baseUrl);\n\n response.statusCode = 204;\n response.setHeader('Cache-Control', 'no-store');\n response.end();\n }\n\n private async sendPayload(response: HttpResponse, payload: string | Buffer, contentType: string, context: UsageContext | undefined, statusCode = 200): Promise<void> {\n const buffer = typeof payload === 'string' ? Buffer.from(payload, 'utf8') : payload;\n const limit = context ? await this.resolveBandwidthLimit(context) : undefined;\n return this.streamWithLimit(response, buffer, limit, statusCode, contentType);\n }\n\n private async streamWithLimit(response: HttpResponse, buffer: Buffer, limit?: number | null, statusCode = 200, contentType?: string): Promise<void> {\n if (contentType) {\n response.setHeader('content-type', contentType);\n }\n response.statusCode = statusCode;\n const normalized = this.normalizeLimit(limit);\n let stream: NodeJS.ReadableStream = Readable.from([ buffer ]);\n if (normalized) {\n stream = stream.pipe(createBandwidthThrottleTransform({ bytesPerSecond: normalized }));\n }\n await pipeline(stream, response);\n }\n\n private async resolveUsageContext(basePath: string): Promise<UsageContext | undefined> {\n // Try to look up pod from identity database first\n if (this.podLookup) {\n try {\n const pod = await this.podLookup.findByResourceIdentifier(basePath);\n if (pod) {\n return {\n accountId: pod.accountId,\n podId: pod.podId,\n };\n }\n } catch (error) {\n // Gracefully handle missing tables (e.g., dev mode without identity DB setup)\n this.logger.debug(`Failed to lookup pod for usage context: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n // Fallback: infer pod from URL path (e.g., /alice/foo → podId=alice)\n // This allows usage tracking without identity database\n if (this.usageRepo) {\n const podId = this.inferPodIdFromPath(basePath);\n if (podId) {\n return {\n accountId: podId, // Use podId as accountId when identity DB not available\n podId,\n };\n }\n }\n\n return undefined;\n }\n\n private inferPodIdFromPath(basePath: string): string | undefined {\n // Extract first path segment as pod ID: /alice/foo/bar → alice\n const match = basePath.match(/^\\/([^/]+)\\//);\n if (match && match[1] && !match[1].startsWith('.')) {\n return match[1];\n }\n return undefined;\n }\n\n private async resolveBandwidthLimit(context: UsageContext): Promise<number | null | undefined> {\n if (!this.usageRepo) {\n return this.defaultBandwidthLimit;\n }\n const podRecord = await this.usageRepo.getPodUsage(context.podId);\n if (podRecord && podRecord.bandwidthLimitBps !== undefined) {\n return this.normalizeLimit(podRecord.bandwidthLimitBps);\n }\n const accountRecord = await this.usageRepo.getAccountUsage(context.accountId);\n if (accountRecord && accountRecord.bandwidthLimitBps !== undefined) {\n return this.normalizeLimit(accountRecord.bandwidthLimitBps);\n }\n return this.defaultBandwidthLimit;\n }\n\n private async recordBandwidth(context: UsageContext | undefined, ingress: number, egress: number): Promise<void> {\n if (!context || !this.usageRepo) {\n return;\n }\n const normalizedIngress = this.normalizeBandwidthDelta(ingress);\n const normalizedEgress = this.normalizeBandwidthDelta(egress);\n if (normalizedIngress === 0 && normalizedEgress === 0) {\n return;\n }\n await this.usageRepo.incrementUsage(context.accountId, context.podId, 0, normalizedIngress, normalizedEgress);\n }\n\n private normalizeLimit(limit?: number | null): number | null {\n if (limit == null) {\n return null;\n }\n const numeric = Number(limit);\n if (!Number.isFinite(numeric) || numeric <= 0) {\n return null;\n }\n return Math.max(0, Math.trunc(numeric));\n }\n\n private normalizeBandwidthDelta(value: number): number {\n if (!Number.isFinite(value) || value <= 0) {\n return 0;\n }\n return Math.trunc(value);\n }\n\n private async authorizeFor(basePath: string, request: HttpRequest, modes: string[]): Promise<void> {\n if (modes.length === 0) {\n return;\n }\n const identifier = { path: basePath } satisfies ResourceIdentifier;\n const requestedModes = new IdentifierSetMultiMap<string>();\n for (const mode of modes) {\n requestedModes.add(identifier, mode);\n }\n const credentials = await this.credentialsExtractor.handleSafe(request);\n const availablePermissions = await this.permissionReader.handleSafe({ credentials, requestedModes });\n await this.authorizer.handleSafe({ credentials, requestedModes, availablePermissions });\n }\n\n private inspectUpdateGraphs(update: SparqlUpdate, basePath: string): { hasInsert: boolean; hasDelete: boolean } {\n let hasInsert = false;\n let hasDelete = false;\n for (const operation of update.updates ?? []) {\n if (!this.isInsertDeleteOperation(operation)) {\n throw new BadRequestHttpError('SPARQL update management operations are not supported.');\n }\n\n if (operation.updateType === 'insert' ||\n (operation.updateType === 'insertdelete' && (operation.insert?.length ?? 0) > 0)) {\n hasInsert = true;\n }\n\n if (operation.updateType === 'delete' || operation.updateType === 'deletewhere' ||\n (operation.updateType === 'insertdelete' && (operation.delete?.length ?? 0) > 0)) {\n hasDelete = true;\n }\n\n if (operation.graph) {\n this.assertGraphInScope(operation.graph, basePath);\n }\n\n if (operation.updateType === 'insert' || operation.updateType === 'insertdelete') {\n this.inspectQuads(operation.insert ?? [], basePath);\n }\n\n if (operation.updateType === 'delete' || operation.updateType === 'insertdelete' || operation.updateType === 'deletewhere') {\n this.inspectQuads(operation.delete ?? [], basePath);\n }\n\n if (operation.updateType === 'insertdelete') {\n this.inspectPatterns(operation.where ?? [], basePath);\n if (operation.using) {\n for (const iri of operation.using.default ?? []) {\n this.assertGraphTermInScope(iri, basePath);\n }\n for (const iri of operation.using.named ?? []) {\n this.assertGraphTermInScope(iri, basePath);\n }\n }\n }\n }\n return { hasInsert, hasDelete };\n }\n\n private inspectQuads(quads: SparqlQuads[], basePath: string): void {\n for (const quad of quads) {\n if (quad.type === 'graph') {\n this.assertGraphTermInScope(quad.name, basePath);\n }\n }\n }\n\n private inspectPatterns(patterns: SparqlPattern[], basePath: string): void {\n for (const pattern of patterns) {\n if (pattern.type === 'graph') {\n this.assertGraphTermInScope(pattern.name, basePath);\n }\n const nested = (pattern as any).patterns;\n if (Array.isArray(nested)) {\n this.inspectPatterns(nested as SparqlPattern[], basePath);\n }\n }\n }\n\n private assertGraphInScope(graph: SparqlGraphOrDefault | SparqlIriTerm, basePath: string): void {\n if ('default' in graph && graph.default) {\n return;\n }\n if ('name' in graph) {\n const name = graph.name;\n if (name) {\n this.assertGraphTermInScope(name, basePath);\n }\n } else if ('value' in graph) {\n this.assertGraphTermInScope(graph, basePath);\n }\n }\n\n private assertGraphTermInScope(term: SparqlTerm, basePath: string): void {\n if (!term) {\n return;\n }\n if (term.termType === 'Variable') {\n throw new BadRequestHttpError('Graph IRIs must be explicit when using the /-/sparql update endpoint.');\n }\n if (term.termType === 'NamedNode') {\n // Graph can be either basePath or prefix:basePath (e.g., meta:http://...)\n // Extract the path part after optional prefix (anything before first colon that's not part of http:)\n const graphValue = term.value;\n let pathPart = graphValue;\n \n // Check if it has a prefix like \"meta:\" or \"acl:\" (not \"http:\" or \"https:\")\n const prefixMatch = graphValue.match(/^([a-z]+):(?!\\/\\/)/i);\n if (prefixMatch) {\n pathPart = graphValue.slice(prefixMatch[0].length);\n }\n \n if (!pathPart.startsWith(basePath)) {\n throw new BadRequestHttpError(`Graph ${term.value} is outside of ${basePath}.`);\n }\n return;\n }\n if ((term as any).default === true) {\n return;\n }\n throw new BadRequestHttpError('Unsupported graph target in SPARQL update.');\n }\n\n /**\n * Rewrites INSERT/DELETE/INSERT+DELETE that target the default graph (or BGP without GRAPH)\n * so they write to the resource graph (graphIri).\n */\n private rewriteDefaultGraphUpdates(parsed: SparqlUpdate, graphIri: string): string {\n const graphNode = DataFactory.namedNode(graphIri);\n\n const rewritePatterns = (patterns?: SparqlQuads[]): SparqlQuads[] | undefined => {\n if (!patterns) return patterns;\n return patterns.map((pattern: any): SparqlQuads => {\n if (pattern.type === 'bgp') {\n return { type: 'graph', name: graphNode, triples: pattern.triples } as unknown as SparqlQuads;\n }\n if (pattern.type === 'graph' && pattern.name?.termType === 'DefaultGraph') {\n return { ...pattern, name: graphNode };\n }\n return pattern;\n });\n };\n\n parsed.updates = parsed.updates.map((op: any): UpdateOperation => {\n if (op.updateType === 'insert' || op.updateType === 'delete' || op.updateType === 'insertdelete') {\n return {\n ...op,\n insert: rewritePatterns(op.insert),\n delete: rewritePatterns(op.delete),\n };\n }\n return op;\n });\n\n return this.generator.stringify(parsed);\n }\n\n private async refreshUsage(basePath: string): Promise<void> {\n if (!this.usageRepo || !this.podLookup) {\n return;\n }\n const pod = await this.podLookup.findByResourceIdentifier(basePath);\n if (!pod) {\n this.logger.warn(`Skipping quota update for ${basePath}: unable to resolve owning pod.`);\n return;\n }\n const graphs = await this.engine.listGraphs(basePath);\n let totalBytes = 0;\n for (const graph of graphs) {\n totalBytes += await this.computeGraphSize(graph, basePath);\n }\n await this.usageRepo.setPodStorage(pod.accountId, pod.podId, totalBytes);\n }\n\n private async computeGraphSize(graph: string, basePath: string): Promise<number> {\n const stream = await this.engine.constructGraph(graph, basePath);\n let bytes = 0;\n try {\n for await (const quad of stream as AsyncIterable<RdfQuad>) {\n bytes += SubgraphSparqlHttpHandler.measureQuad(quad);\n }\n } finally {\n const close = (stream as unknown as { close?: () => void }).close;\n if (typeof close === 'function') {\n close();\n }\n }\n return bytes;\n }\n\n private writeOptions(response: HttpResponse): void {\n response.statusCode = 204;\n response.setHeader('Allow', ALLOWED_METHODS.join(','));\n response.end();\n }\n\n private async extractQuery(request: HttpRequest, method: string): Promise<QueryRequest> {\n const url = this.parseUrl(request);\n const path = decodeURIComponent(url.pathname);\n\n // Sidecar pattern: /alice/-/sparql → basePath = /alice/\n // Or: /alice/photos/-/sparql → basePath = /alice/photos/\n const sidecarIndex = path.indexOf(this.sidecarPath);\n if (sidecarIndex === -1) {\n throw new NotImplementedHttpError('Request is not targeting a subgraph SPARQL endpoint.');\n }\n\n let basePath = path.slice(0, sidecarIndex);\n // If the base looks like a container (no file extension), normalize with trailing slash.\n const hasExtension = /\\.[^/]+$/.test(basePath);\n if (!hasExtension && !basePath.endsWith('/')) {\n basePath = `${basePath}/`;\n }\n\n let query: string | null = null;\n let ingressBytes = 0;\n\n if (method === 'GET') {\n query = url.searchParams.get('query');\n if (query) {\n ingressBytes += Buffer.byteLength(query, 'utf8');\n }\n } else {\n const contentTypeHeader = request.headers['content-type'] ?? request.headers['Content-Type'];\n const contentType = Array.isArray(contentTypeHeader) ? contentTypeHeader[0] : contentTypeHeader;\n const normalized = contentType?.split(';')[0].trim().toLowerCase();\n\n if (normalized === 'application/sparql-query' || normalized === 'application/sparql-update') {\n const body = await this.readBody(request);\n ingressBytes += Buffer.byteLength(body, 'utf8');\n query = body.trim();\n } else if (normalized === 'application/x-www-form-urlencoded') {\n const body = await this.readBody(request);\n ingressBytes += Buffer.byteLength(body, 'utf8');\n const params = new URLSearchParams(body);\n query = params.get('query') ?? params.get('update');\n } else {\n throw new UnsupportedMediaTypeHttpError('Supported content types are application/sparql-query, application/sparql-update, or application/x-www-form-urlencoded.');\n }\n }\n\n if (!query || query.trim().length === 0) {\n throw new BadRequestHttpError('A SPARQL query must be supplied through the \"query\" parameter or request body.');\n }\n\n const origin = `${url.protocol}//${url.host}`;\n return {\n basePath,\n baseUrl: `${origin}${basePath}`,\n query: query.trim(),\n origin,\n method,\n ingressBytes,\n };\n }\n\n private parseUrl(request: HttpRequest): URL {\n const hostHeader = request.headers.host ?? request.headers.Host ?? 'localhost';\n const protocolHeader = (request.headers['x-forwarded-proto'] ?? request.headers['X-Forwarded-Proto']) as string | undefined;\n const protocol = protocolHeader?.split(',')[0]?.trim() ?? 'http';\n const requestUrl = request.url ?? '/';\n return new URL(requestUrl, `${protocol}://${hostHeader}`);\n }\n\n private async readBody(request: HttpRequest): Promise<string> {\n return await new Promise<string>((resolve, reject) => {\n let data = '';\n request.setEncoding('utf8');\n request.on('data', (chunk: string) => {\n data += chunk;\n });\n request.on('end', () => resolve(data));\n request.on('error', reject);\n });\n }\n\n private termToJson(term: Term): Record<string, string> {\n switch (term.termType) {\n case 'NamedNode':\n return { type: 'uri', value: term.value };\n case 'BlankNode':\n return { type: 'bnode', value: term.value };\n case 'Literal': {\n const literal = term as Literal;\n if (literal.language) {\n return {\n type: 'literal',\n value: literal.value,\n 'xml:lang': literal.language,\n };\n }\n const datatype = literal.datatype?.value;\n if (datatype && datatype !== SubgraphSparqlHttpHandler.XSD_STRING) {\n return {\n type: 'literal',\n value: literal.value,\n datatype,\n };\n }\n return { type: 'literal', value: literal.value };\n }\n default:\n return { type: 'literal', value: term.value };\n }\n }\n\n private static measureQuad(quad: RdfQuad): number {\n const subject = SubgraphSparqlHttpHandler.termToNQuads(quad.subject);\n const predicate = SubgraphSparqlHttpHandler.termToNQuads(quad.predicate);\n const object = SubgraphSparqlHttpHandler.termToNQuads(quad.object);\n const graph = quad.graph.termType === 'DefaultGraph' ? '' : ` ${SubgraphSparqlHttpHandler.termToNQuads(quad.graph)}`;\n const serialized = `${subject} ${predicate} ${object}${graph} .\\n`;\n return Buffer.byteLength(serialized, 'utf8');\n }\n\n private static termToNQuads(term: Term): string {\n switch (term.termType) {\n case 'NamedNode':\n return `<${term.value}>`;\n case 'BlankNode':\n return `_:${term.value}`;\n case 'Literal':\n return SubgraphSparqlHttpHandler.literalToNQuads(term as Literal);\n case 'DefaultGraph':\n return '';\n default:\n return `<${term.value}>`;\n }\n }\n\n private static literalToNQuads(literal: Literal): string {\n const escaped = SubgraphSparqlHttpHandler.escapeLiteral(literal.value);\n if (literal.language) {\n return `\"${escaped}\"@${literal.language}`;\n }\n const datatype = literal.datatype?.value;\n if (datatype && datatype !== SubgraphSparqlHttpHandler.XSD_STRING) {\n return `\"${escaped}\"^^<${datatype}>`;\n }\n return `\"${escaped}\"`;\n }\n\n private static escapeLiteral(value: string): string {\n return value\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\"/g, '\\\\\"')\n .replace(/\\n/g, '\\\\n')\n .replace(/\\r/g, '\\\\r')\n .replace(/\\t/g, '\\\\t')\n .replace(/\\f/g, '\\\\f')\n .replace(/\\b/g, '\\\\b');\n }\n\n private isInsertDeleteOperation(operation: SparqlUpdate['updates'][number]): operation is SparqlInsertDeleteOperation {\n return typeof (operation as SparqlInsertDeleteOperation).updateType === 'string';\n }\n\n private getRequestId(request: HttpRequest): string {\n const header = (request.headers['x-request-id'] ?? request.headers['X-Request-Id']) as string | undefined;\n return header?.toString() ?? 'no-request-id';\n }\n\n private isSqliteUrl(url: string): boolean {\n const lower = url.toLowerCase();\n return lower.startsWith('sqlite:') || lower.endsWith('.sqlite') || lower.endsWith('.db');\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"SubgraphSparqlHttpHandler.js","sourceRoot":"","sources":["../../src/http/SubgraphSparqlHttpHandler.ts"],"names":[],"mappings":";;;AAAA,6CAAuC;AACvC,iEAAqD;AACrD,mDAAgD;AAChD,8DAAsD;AAEtD,8DAOiC;AACjC,2DAAsD;AAQtD,2BAAyC;AACzC,uCAA6C;AAa7C,sEAA0G;AAC1G,+CAA6D;AAC7D,iFAA8E;AAC9E,sEAAmE;AACnE,0FAA6F;AAE7F,MAAM,eAAe,GAAG,CAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAE,CAAC;AA4BrD,MAAa,yBAA0B,SAAQ,8BAAW;IAcxD,YACE,WAAgC,EAChC,oBAA0C,EAC1C,gBAAkC,EAClC,UAAsB,EACtB,UAA4C,EAAE;QAE9C,KAAK,EAAE,CAAC;QApBS,WAAM,GAAG,IAAA,oCAAY,EAAC,IAAI,CAAC,CAAC;QAS9B,cAAS,GAAG,IAAI,oBAAS,EAAE,CAAC;QAY3C,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC;QAC1B,IAAI,CAAC,oBAAoB,GAAG,oBAAoB,CAAC;QACjD,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;QACzC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,WAAW,CAAC;QACtD,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC;QAE1F,2EAA2E;QAC3E,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YAC1B,MAAM,EAAE,GAAG,IAAA,wBAAmB,EAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YACtD,IAAI,CAAC,SAAS,GAAG,IAAI,yCAAmB,CAAC,EAAE,CAAC,CAAC;QAC/C,CAAC;QAED,uEAAuE;QACvE,qEAAqE;QACrE,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,aAAa,CAAC;QAC/D,IAAI,UAAU,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC;YAChD,MAAM,OAAO,GAAG,IAAA,wBAAmB,EAAC,UAAU,CAAC,CAAC;YAChD,IAAI,CAAC,SAAS,GAAG,IAAI,iCAAe,CAAC,OAAO,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAEe,KAAK,CAAC,SAAS,CAAC,EAAE,OAAO,EAAoB;QAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC;QAC7C,qEAAqE;QACrE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YACrC,MAAM,IAAI,0CAAuB,CAAC,sDAAsD,CAAC,CAAC;QAC5F,CAAC;IACH,CAAC;IAEe,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAoB;QAClE,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;QAEvD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YAC5B,OAAO;QACT,CAAC;QAED,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,4CAAyB,CAAC,eAAe,CAAC,CAAC;QACvD,CAAC;QAED,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC9D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YACtE,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,YAAY,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;YAClE,MAAM,MAAM,GAAG,IAAI,iBAAM,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC;YAC7D,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YAEhD,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC7B,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAC3E,OAAO;YACT,CAAC;YAED,sHAAsH;YACtH,4GAA4G;YAC5G,0CAA0C;YAC1C,yFAAyF;YACzF,IAAI,MAAM,CAAC,SAAS,KAAK,KAAK,IAAK,MAAc,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBACtE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6EAA6E,IAAI,CAAC,SAAS,CAAE,MAAc,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACvI,OAAQ,MAAc,CAAC,KAAK,CAAC;gBAC7B,YAAY,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;gBACtD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC;YAC7D,CAAC;YAED,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,QAAQ,CAAC;YAE/C,QAAQ,SAAS,EAAE,CAAC;gBAClB,KAAK,QAAQ;oBACX,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;oBACnE,MAAM;gBACR,KAAK,KAAK;oBACR,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;oBAChE,MAAM;gBACR,KAAK,WAAW,CAAC;gBACjB,KAAK,UAAU;oBACb,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;oBACtE,MAAM;gBACR;oBACE,MAAM,IAAI,sCAAmB,CAAC,kCAAkC,SAAS,EAAE,CAAC,CAAC;YACjF,CAAC;QACH,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,6CAA6C;YAC7C,IAAI,KAAK,YAAY,4BAAS,EAAE,CAAC;gBAC/B,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,WAAW,CAAC,IAAI,IAAI,WAAW,CAAC;gBACtE,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,IAAI,YAAY,CAAC;gBACnD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAwB,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,SAAS,MAAM,YAAY,EAAE,CAAC,CAAC;gBAC9H,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,KAAK,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;gBACjE,OAAO;YACT,CAAC;YACD,IAAI,KAAK,YAAY,6CAA0B,EAAE,CAAC;gBAChD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oCAAoC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBACtG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;gBACrD,OAAO;YACT,CAAC;YACD,IAAI,KAAK,YAAY,8CAA2B,EAAE,CAAC;gBACjD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qCAAqC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBACvG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;gBACrD,OAAO;YACT,CAAC;YACD,iDAAiD;YACjD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,oCAAoC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAChJ,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAEO,iBAAiB,CAAC,QAAsB,EAAE,UAAkB,EAAE,OAAe;QACnF,QAAQ,CAAC,UAAU,GAAG,UAAU,CAAC;QACjC,QAAQ,CAAC,SAAS,CAAC,cAAc,EAAE,2BAA2B,CAAC,CAAC;QAChE,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACxB,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,OAAoB,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAgB,EAAE,QAAsB,EAAE,OAAiC;QACrJ,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,CAAE,2BAAW,CAAC,IAAI,CAAE,CAAC,CAAC;QAEhE,IAAI,IAAI,GAAa,EAAE,CAAC;QACxB,MAAM,OAAO,GAA8B,EAAE,CAAC;QAC9C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;QAEnC,IAAI,CAAC;YACH,MAAM,cAAc,GAAQ,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC5E,MAAM,QAAQ,GAAG,OAAO,cAAc,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,cAAc,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YAC7G,IAAI,GAAG,QAAQ,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC,QAAkB,EAAU,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAEtF,IAAI,KAAK,EAAE,MAAM,OAAO,IAAI,cAAoC,EAAE,CAAC;gBACjE,MAAM,GAAG,GAA4B,EAAE,CAAC;gBACxC,KAAK,MAAM,CAAE,QAAQ,EAAE,IAAI,CAAE,IAAI,OAAO,EAAE,CAAC;oBACzC,mEAAmE;oBACnE,MAAM,IAAI,GAAG,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;oBACtE,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;oBAClC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACrB,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACpB,CAAC;YAED,mEAAmE;YACnE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gBAC3C,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,+EAA+E;YAC/E,2CAA2C;YAC3C,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,IAAI,OAAO,CAAC,QAAQ,CAAC,yDAAyD,CAAC,EAAE,CAAC;gBAChF,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,OAAO,EAAE,CAAC,CAAC;gBAC3D,yDAAyD;gBACzD,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;gBACtD,IAAI,QAAQ,EAAE,CAAC;oBACb,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;gBACxE,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG;YACd,IAAI,EAAE,EAAE,IAAI,EAAE;YACd,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE;SAC/B,CAAC;QAEF,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,gDAAgD,EAAE,OAAO,CAAC,CAAC;IACvH,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,OAAoB,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAgB,EAAE,QAAsB,EAAE,OAAiC;QAClJ,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,CAAE,2BAAW,CAAC,IAAI,CAAE,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC9D,MAAM,OAAO,GAAG;YACd,IAAI,EAAE,EAAE;YACR,OAAO,EAAE,MAAM;SAChB,CAAC;QACF,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,gDAAgD,EAAE,OAAO,CAAC,CAAC;IACvH,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,OAAoB,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAgB,EAAE,QAAsB,EAAE,OAAiC;QACxJ,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,CAAE,2BAAW,CAAC,IAAI,CAAE,CAAC,CAAC;QAChE,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,IAAI,WAAM,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QAEjD,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YACpC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC3D,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;gBAC3B,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,CAAC,KAAK,CAAC,CAAC;gBAChB,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,MAAM,CAAC,CAAC;gBAClB,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,oCAAoC,EAAE,OAAO,CAAC,CAAC;IAC1F,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,YAA0B,EAAE,MAAoB,EAAE,OAAoB,EAAE,QAAsB,EAAE,OAAiC;QAC3J,IAAI,YAAY,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YACnC,MAAM,IAAI,4CAAyB,CAAC,CAAE,MAAM,CAAE,CAAC,CAAC;QAClD,CAAC;QAED,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;QACxF,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,IAAI,SAAS,EAAE,CAAC;YACd,KAAK,CAAC,IAAI,CAAC,2BAAW,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC;QACD,IAAI,SAAS,EAAE,CAAC;YACd,KAAK,CAAC,IAAI,CAAC,2BAAW,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC;QACD,MAAM,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QAE9D,MAAM,SAAS,GAAG,IAAI,CAAC,0BAA0B,CAAC,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;QAChF,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,qCAAqC,SAAS,EAAE,CAAC,CAAC;QAEtE,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;QAC7D,MAAM,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAE9C,QAAQ,CAAC,UAAU,GAAG,GAAG,CAAC;QAC1B,QAAQ,CAAC,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;QAChD,QAAQ,CAAC,GAAG,EAAE,CAAC;IACjB,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,QAAsB,EAAE,OAAwB,EAAE,WAAmB,EAAE,OAAiC,EAAE,UAAU,GAAG,GAAG;QAClJ,MAAM,MAAM,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QACpF,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9E,OAAO,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;IAChF,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,QAAsB,EAAE,MAAc,EAAE,KAAqB,EAAE,UAAU,GAAG,GAAG,EAAE,WAAoB;QACjI,IAAI,WAAW,EAAE,CAAC;YAChB,QAAQ,CAAC,SAAS,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;QAClD,CAAC;QACD,QAAQ,CAAC,UAAU,GAAG,UAAU,CAAC;QACjC,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAC9C,IAAI,MAAM,GAA0B,sBAAQ,CAAC,IAAI,CAAC,CAAE,MAAM,CAAE,CAAC,CAAC;QAC9D,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAA,6DAAgC,EAAC,EAAE,cAAc,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;QACzF,CAAC;QACD,MAAM,IAAA,mBAAQ,EAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACnC,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAAC,QAAgB;QAChD,kDAAkD;QAClD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC;gBACpE,IAAI,GAAG,EAAE,CAAC;oBACR,OAAO;wBACL,SAAS,EAAE,GAAG,CAAC,SAAS;wBACxB,KAAK,EAAE,GAAG,CAAC,KAAK;qBACjB,CAAC;gBACJ,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,8EAA8E;gBAC9E,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,2CAA2C,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACzH,CAAC;QACH,CAAC;QAED,qEAAqE;QACrE,uDAAuD;QACvD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;YAChD,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO;oBACL,SAAS,EAAE,KAAK,EAAE,wDAAwD;oBAC1E,KAAK;iBACN,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,kBAAkB,CAAC,QAAgB;QACzC,+DAA+D;QAC/D,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAC7C,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACnD,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,KAAK,CAAC,qBAAqB,CAAC,OAAqB;QACvD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC,qBAAqB,CAAC;QACpC,CAAC;QACD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAClE,IAAI,SAAS,IAAI,SAAS,CAAC,iBAAiB,KAAK,SAAS,EAAE,CAAC;YAC3D,OAAO,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAC1D,CAAC;QACD,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC9E,IAAI,aAAa,IAAI,aAAa,CAAC,iBAAiB,KAAK,SAAS,EAAE,CAAC;YACnE,OAAO,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO,IAAI,CAAC,qBAAqB,CAAC;IACpC,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,OAAiC,EAAE,OAAe,EAAE,MAAc;QAC9F,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAChC,OAAO;QACT,CAAC;QACD,MAAM,iBAAiB,GAAG,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC;QAChE,MAAM,gBAAgB,GAAG,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;QAC9D,IAAI,iBAAiB,KAAK,CAAC,IAAI,gBAAgB,KAAK,CAAC,EAAE,CAAC;YACtD,OAAO;QACT,CAAC;QACD,MAAM,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE,iBAAiB,EAAE,gBAAgB,CAAC,CAAC;IAChH,CAAC;IAEO,cAAc,CAAC,KAAqB;QAC1C,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;YAC9C,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1C,CAAC;IAEO,uBAAuB,CAAC,KAAa;QAC3C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YAC1C,OAAO,CAAC,CAAC;QACX,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,QAAgB,EAAE,OAAoB,EAAE,KAAe;QAChF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QACD,MAAM,UAAU,GAAG,EAAE,IAAI,EAAE,QAAQ,EAA+B,CAAC;QACnE,MAAM,cAAc,GAAG,IAAI,wCAAqB,EAAU,CAAC;QAC3D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,cAAc,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACvC,CAAC;QACD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACxE,MAAM,oBAAoB,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC,CAAC;QACrG,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,WAAW,EAAE,cAAc,EAAE,oBAAoB,EAAE,CAAC,CAAC;IAC1F,CAAC;IAEO,mBAAmB,CAAC,MAAoB,EAAE,QAAgB;QAChE,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;YAC7C,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC7C,MAAM,IAAI,sCAAmB,CAAC,wDAAwD,CAAC,CAAC;YAC1F,CAAC;YAED,IAAI,SAAS,CAAC,UAAU,KAAK,QAAQ;gBACnC,CAAC,SAAS,CAAC,UAAU,KAAK,cAAc,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBACnF,SAAS,GAAG,IAAI,CAAC;YACnB,CAAC;YAED,IAAI,SAAS,CAAC,UAAU,KAAK,QAAQ,IAAI,SAAS,CAAC,UAAU,KAAK,aAAa;gBAC7E,CAAC,SAAS,CAAC,UAAU,KAAK,cAAc,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBACnF,SAAS,GAAG,IAAI,CAAC;YACnB,CAAC;YAED,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;gBACpB,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YACrD,CAAC;YAED,IAAI,SAAS,CAAC,UAAU,KAAK,QAAQ,IAAI,SAAS,CAAC,UAAU,KAAK,cAAc,EAAE,CAAC;gBACjF,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,MAAM,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC;YACtD,CAAC;YAED,IAAI,SAAS,CAAC,UAAU,KAAK,QAAQ,IAAI,SAAS,CAAC,UAAU,KAAK,cAAc,IAAI,SAAS,CAAC,UAAU,KAAK,aAAa,EAAE,CAAC;gBAC3H,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,MAAM,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC;YACtD,CAAC;YAED,IAAI,SAAS,CAAC,UAAU,KAAK,cAAc,EAAE,CAAC;gBAC5C,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC;gBACtD,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;oBACpB,KAAK,MAAM,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;wBAChD,IAAI,CAAC,sBAAsB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;oBAC7C,CAAC;oBACD,KAAK,MAAM,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;wBAC9C,IAAI,CAAC,sBAAsB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;oBAC7C,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;IAClC,CAAC;IAEO,YAAY,CAAC,KAAoB,EAAE,QAAgB;QACzD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC1B,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;IACH,CAAC;IAEO,eAAe,CAAC,QAAyB,EAAE,QAAgB;QACjE,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC7B,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YACtD,CAAC;YACD,MAAM,MAAM,GAAI,OAAe,CAAC,QAAQ,CAAC;YACzC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1B,IAAI,CAAC,eAAe,CAAC,MAAyB,EAAE,QAAQ,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;IACH,CAAC;IAEO,kBAAkB,CAAC,KAA2C,EAAE,QAAgB;QACtF,IAAI,SAAS,IAAI,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YACxC,OAAO;QACT,CAAC;QACD,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;YACpB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;YACxB,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;aAAM,IAAI,OAAO,IAAI,KAAK,EAAE,CAAC;YAC5B,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAEO,sBAAsB,CAAC,IAAgB,EAAE,QAAgB;QAC/D,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;YACjC,MAAM,IAAI,sCAAmB,CAAC,uEAAuE,CAAC,CAAC;QACzG,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;YAClC,0EAA0E;YAC1E,qGAAqG;YACrG,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC;YAC9B,IAAI,QAAQ,GAAG,UAAU,CAAC;YAE1B,4EAA4E;YAC5E,MAAM,WAAW,GAAG,UAAU,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;YAC5D,IAAI,WAAW,EAAE,CAAC;gBAChB,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YACrD,CAAC;YAED,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACnC,MAAM,IAAI,sCAAmB,CAAC,SAAS,IAAI,CAAC,KAAK,kBAAkB,QAAQ,GAAG,CAAC,CAAC;YAClF,CAAC;YACD,OAAO;QACT,CAAC;QACD,IAAK,IAAY,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YACnC,OAAO;QACT,CAAC;QACD,MAAM,IAAI,sCAAmB,CAAC,4CAA4C,CAAC,CAAC;IAC9E,CAAC;IAED;;;OAGG;IACK,0BAA0B,CAAC,MAAoB,EAAE,QAAgB;QACvE,MAAM,SAAS,GAAG,gBAAW,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAElD,MAAM,eAAe,GAAG,CAAC,QAAwB,EAA6B,EAAE;YAC9E,IAAI,CAAC,QAAQ;gBAAE,OAAO,QAAQ,CAAC;YAC/B,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAY,EAAe,EAAE;gBAChD,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;oBAC3B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAA4B,CAAC;gBAChG,CAAC;gBACD,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,QAAQ,KAAK,cAAc,EAAE,CAAC;oBAC1E,OAAO,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;gBACzC,CAAC;gBACD,OAAO,OAAO,CAAC;YACjB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAO,EAAmB,EAAE;YAC/D,IAAI,EAAE,CAAC,UAAU,KAAK,QAAQ,IAAI,EAAE,CAAC,UAAU,KAAK,QAAQ,IAAI,EAAE,CAAC,UAAU,KAAK,cAAc,EAAE,CAAC;gBACjG,OAAO;oBACL,GAAG,EAAE;oBACL,MAAM,EAAE,eAAe,CAAC,EAAE,CAAC,MAAM,CAAC;oBAClC,MAAM,EAAE,eAAe,CAAC,EAAE,CAAC,MAAM,CAAC;iBACnC,CAAC;YACJ,CAAC;YACD,IAAI,EAAE,CAAC,UAAU,KAAK,aAAa,EAAE,CAAC;gBACpC,OAAO;oBACL,GAAG,EAAE;oBACL,MAAM,EAAE,eAAe,CAAC,EAAE,CAAC,MAAM,CAAC;iBACnC,CAAC;YACJ,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,QAAgB;QACzC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACvC,OAAO;QACT,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC;QACpE,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,QAAQ,iCAAiC,CAAC,CAAC;YACzF,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QACtD,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,UAAU,IAAI,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC7D,CAAC;QACD,MAAM,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IAC3E,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,KAAa,EAAE,QAAgB;QAC5D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACjE,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,CAAC;YACH,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,MAAgC,EAAE,CAAC;gBAC1D,KAAK,IAAI,yBAAyB,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YACvD,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,MAAM,KAAK,GAAI,MAA4C,CAAC,KAAK,CAAC;YAClE,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;gBAChC,KAAK,EAAE,CAAC;YACV,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,YAAY,CAAC,QAAsB;QACzC,QAAQ,CAAC,UAAU,GAAG,GAAG,CAAC;QAC1B,QAAQ,CAAC,SAAS,CAAC,OAAO,EAAE,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACvD,QAAQ,CAAC,GAAG,EAAE,CAAC;IACjB,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,OAAoB,EAAE,MAAc;QAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,IAAI,GAAG,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE9C,wDAAwD;QACxD,yDAAyD;QACzD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACpD,IAAI,YAAY,KAAK,CAAC,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,0CAAuB,CAAC,sDAAsD,CAAC,CAAC;QAC5F,CAAC;QAED,IAAI,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;QAC3C,IAAI,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACrE,QAAQ,GAAG,GAAG,QAAQ,GAAG,CAAC;QAC5B,CAAC;QAED,IAAI,KAAK,GAAkB,IAAI,CAAC;QAChC,IAAI,YAAY,GAAG,CAAC,CAAC;QAErB,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACrB,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACtC,IAAI,KAAK,EAAE,CAAC;gBACV,YAAY,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;YAC7F,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC;YAChG,MAAM,UAAU,GAAG,WAAW,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAEnE,IAAI,UAAU,KAAK,0BAA0B,IAAI,UAAU,KAAK,2BAA2B,EAAE,CAAC;gBAC5F,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAC1C,YAAY,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBAChD,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YACtB,CAAC;iBAAM,IAAI,UAAU,KAAK,mCAAmC,EAAE,CAAC;gBAC9D,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAC1C,YAAY,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBAChD,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC;gBACzC,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACtD,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,gDAA6B,CAAC,wHAAwH,CAAC,CAAC;YACpK,CAAC;QACH,CAAC;QAED,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxC,MAAM,IAAI,sCAAmB,CAAC,gFAAgF,CAAC,CAAC;QAClH,CAAC;QAED,MAAM,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,KAAK,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9C,OAAO;YACL,QAAQ;YACR,OAAO,EAAE,GAAG,MAAM,GAAG,QAAQ,EAAE;YAC/B,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE;YACnB,MAAM;YACN,MAAM;YACN,YAAY;SACb,CAAC;IACJ,CAAC;IAEO,QAAQ,CAAC,OAAoB;QACnC,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,WAAW,CAAC;QAC/E,MAAM,cAAc,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAuB,CAAC;QAC5H,MAAM,QAAQ,GAAG,cAAc,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,MAAM,CAAC;QACjE,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC;QACtC,OAAO,IAAI,GAAG,CAAC,UAAU,EAAE,GAAG,QAAQ,MAAM,UAAU,EAAE,CAAC,CAAC;IAC5D,CAAC;IAEO,sBAAsB,CAAC,QAAgB;QAC7C,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;QACpE,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,cAAc,GAAG,WAAW,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACpD,OAAO,cAAc,IAAI,CAAC,CAAC;IAC7B,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,OAAoB;QACzC,OAAO,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACnD,IAAI,IAAI,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAC5B,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;gBACnC,IAAI,IAAI,KAAK,CAAC;YAChB,CAAC,CAAC,CAAC;YACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;YACvC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,UAAU,CAAC,IAAU;QAC3B,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;YACtB,KAAK,WAAW;gBACd,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;YAC5C,KAAK,WAAW;gBACd,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9C,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,MAAM,OAAO,GAAG,IAAe,CAAC;gBAChC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;oBACrB,OAAO;wBACL,IAAI,EAAE,SAAS;wBACf,KAAK,EAAE,OAAO,CAAC,KAAK;wBACpB,UAAU,EAAE,OAAO,CAAC,QAAQ;qBAC7B,CAAC;gBACJ,CAAC;gBACD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC;gBACzC,IAAI,QAAQ,IAAI,QAAQ,KAAK,yBAAyB,CAAC,UAAU,EAAE,CAAC;oBAClE,OAAO;wBACL,IAAI,EAAE,SAAS;wBACf,KAAK,EAAE,OAAO,CAAC,KAAK;wBACpB,QAAQ;qBACT,CAAC;gBACJ,CAAC;gBACD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC;YACnD,CAAC;YACD;gBACE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;QAClD,CAAC;IACH,CAAC;IAEO,MAAM,CAAC,WAAW,CAAC,IAAa;QACtC,MAAM,OAAO,GAAG,yBAAyB,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrE,MAAM,SAAS,GAAG,yBAAyB,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACzE,MAAM,MAAM,GAAG,yBAAyB,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,KAAK,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,yBAAyB,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACrH,MAAM,UAAU,GAAG,GAAG,OAAO,IAAI,SAAS,IAAI,MAAM,GAAG,KAAK,MAAM,CAAC;QACnE,OAAO,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC/C,CAAC;IAEO,MAAM,CAAC,YAAY,CAAC,IAAU;QACpC,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;YACtB,KAAK,WAAW;gBACd,OAAO,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC;YAC3B,KAAK,WAAW;gBACd,OAAO,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;YAC3B,KAAK,SAAS;gBACZ,OAAO,yBAAyB,CAAC,eAAe,CAAC,IAAe,CAAC,CAAC;YACpE,KAAK,cAAc;gBACjB,OAAO,EAAE,CAAC;YACZ;gBACE,OAAO,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC;QAC7B,CAAC;IACH,CAAC;IAEO,MAAM,CAAC,eAAe,CAAC,OAAgB;QAC7C,MAAM,OAAO,GAAG,yBAAyB,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACvE,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,OAAO,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC5C,CAAC;QACD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC;QACzC,IAAI,QAAQ,IAAI,QAAQ,KAAK,yBAAyB,CAAC,UAAU,EAAE,CAAC;YAClE,OAAO,IAAI,OAAO,OAAO,QAAQ,GAAG,CAAC;QACvC,CAAC;QACD,OAAO,IAAI,OAAO,GAAG,CAAC;IACxB,CAAC;IAEO,MAAM,CAAC,aAAa,CAAC,KAAa;QACxC,OAAO,KAAK;aACT,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;aACtB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;aACpB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;aACrB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;aACrB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;aACrB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;aACrB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC3B,CAAC;IAEO,uBAAuB,CAAC,SAA0C;QACxE,OAAO,OAAQ,SAAyC,CAAC,UAAU,KAAK,QAAQ,CAAC;IACnF,CAAC;IAEO,YAAY,CAAC,OAAoB;QACvC,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAuB,CAAC;QAC1G,OAAO,MAAM,EAAE,QAAQ,EAAE,IAAI,eAAe,CAAC;IAC/C,CAAC;IAEO,WAAW,CAAC,GAAW;QAC7B,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC3F,CAAC;;AAvtBH,8DAwtBC;AA5sByB,oCAAU,GAAG,yCAAyC,AAA5C,CAA6C","sourcesContent":["import { Readable } from 'node:stream';\nimport { getLoggerFor } from 'global-logger-factory';\nimport { pipeline } from 'node:stream/promises';\nimport { HttpHandler } from '@solid/community-server';\nimport type { HttpHandlerInput, HttpRequest, HttpResponse } from '@solid/community-server';\nimport {\n NotImplementedHttpError,\n MethodNotAllowedHttpError,\n BadRequestHttpError,\n UnsupportedMediaTypeHttpError,\n IdentifierSetMultiMap,\n HttpError,\n} from '@solid/community-server';\nimport { PERMISSIONS } from '@solidlab/policy-engine';\nimport type {\n CredentialsExtractor,\n PermissionReader,\n Authorizer,\n ResourceIdentifier,\n} from '@solid/community-server';\nimport type { Term, Literal, Variable, Quad as RdfQuad } from '@rdfjs/types';\nimport { Writer, DataFactory } from 'n3';\nimport { Parser, Generator } from 'sparqljs';\nimport type {\n Update as SparqlUpdate,\n InsertDeleteOperation as SparqlInsertDeleteOperation,\n Quads as SparqlQuads,\n Pattern as SparqlPattern,\n GraphOrDefault as SparqlGraphOrDefault,\n IriTerm as SparqlIriTerm,\n Term as SparqlTerm,\n GraphQuads,\n UpdateOperation,\n} from 'sparqljs';\nimport { SubgraphQueryEngine } from '../storage/sparql/SubgraphQueryEngine';\nimport { DisabledSparqlFeatureError, UnsupportedSparqlQueryError } from '../storage/rdf/RdfSparqlAdapter';\nimport { getIdentityDatabase } from '../identity/drizzle/db';\nimport { PodLookupRepository } from '../identity/drizzle/PodLookupRepository';\nimport { UsageRepository } from '../storage/quota/UsageRepository';\nimport { createBandwidthThrottleTransform } from '../util/stream/BandwidthThrottleTransform';\n\nconst ALLOWED_METHODS = [ 'GET', 'POST', 'OPTIONS' ];\n\ninterface QueryRequest {\n basePath: string;\n baseUrl: string; // Full URL for authorization (origin + basePath)\n query: string;\n origin: string;\n method: string;\n ingressBytes: number;\n}\n\ninterface SubgraphSparqlHttpHandlerOptions {\n /** @deprecated Use sidecarPath instead */\n resourceSuffix?: string;\n /** @deprecated Use sidecarPath instead */\n containerSuffix?: string;\n /** Sidecar API path segment, default: '/-/sparql' */\n sidecarPath?: string;\n identityDbUrl?: string;\n usageDbUrl?: string;\n defaultAccountBandwidthLimitBps?: number | null;\n}\n\ntype UsageContext = {\n accountId: string;\n podId: string;\n};\n\nexport class SubgraphSparqlHttpHandler extends HttpHandler {\n protected readonly logger = getLoggerFor(this);\n private readonly engine: SubgraphQueryEngine;\n private readonly credentialsExtractor: CredentialsExtractor;\n private readonly permissionReader: PermissionReader;\n private readonly authorizer: Authorizer;\n private readonly sidecarPath: string;\n private readonly podLookup?: PodLookupRepository;\n private readonly usageRepo?: UsageRepository;\n private readonly defaultBandwidthLimit?: number | null;\n private readonly generator = new Generator();\n\n private static readonly XSD_STRING = 'http://www.w3.org/2001/XMLSchema#string';\n\n public constructor(\n queryEngine: SubgraphQueryEngine,\n credentialsExtractor: CredentialsExtractor,\n permissionReader: PermissionReader,\n authorizer: Authorizer,\n options: SubgraphSparqlHttpHandlerOptions = {},\n ) {\n super();\n this.engine = queryEngine;\n this.credentialsExtractor = credentialsExtractor;\n this.permissionReader = permissionReader;\n this.authorizer = authorizer;\n this.sidecarPath = options.sidecarPath ?? '/-/sparql';\n this.defaultBandwidthLimit = this.normalizeLimit(options.defaultAccountBandwidthLimitBps);\n\n // Identity DB is used for pod lookup (to resolve accountId/podId from URL)\n if (options.identityDbUrl) {\n const db = getIdentityDatabase(options.identityDbUrl);\n this.podLookup = new PodLookupRepository(db);\n }\n\n // Usage DB can be separate from identity DB (decoupled usage tracking)\n // NOTE: UsageRepository only supports PostgreSQL. SQLite is skipped.\n const usageDbUrl = options.usageDbUrl ?? options.identityDbUrl;\n if (usageDbUrl && !this.isSqliteUrl(usageDbUrl)) {\n const usageDb = getIdentityDatabase(usageDbUrl);\n this.usageRepo = new UsageRepository(usageDb);\n }\n }\n\n public override async canHandle({ request }: HttpHandlerInput): Promise<void> {\n const path = this.parseUrl(request).pathname;\n // Match /-/sparql pattern: /alice/-/sparql or /alice/photos/-/sparql\n if (!path.includes(this.sidecarPath)) {\n throw new NotImplementedHttpError('Request is not targeting a subgraph SPARQL endpoint.');\n }\n }\n\n public override async handle({ request, response }: HttpHandlerInput): Promise<void> {\n const method = (request.method ?? 'GET').toUpperCase();\n\n if (method === 'OPTIONS') {\n this.writeOptions(response);\n return;\n }\n\n if (!ALLOWED_METHODS.includes(method)) {\n throw new MethodNotAllowedHttpError(ALLOWED_METHODS);\n }\n\n try {\n const queryRequest = await this.extractQuery(request, method);\n const context = await this.resolveUsageContext(queryRequest.basePath);\n await this.recordBandwidth(context, queryRequest.ingressBytes, 0);\n const parser = new Parser({ baseIRI: queryRequest.baseUrl });\n const parsed = parser.parse(queryRequest.query);\n\n if (parsed.type === 'update') {\n await this.executeUpdate(queryRequest, parsed, request, response, context);\n return;\n }\n\n // WORKAROUND: the compatibility engine crashes if ASK query has a LIMIT clause (\"Expected bindings but got boolean\").\n // ASK results are boolean and cannot be sliced, so LIMIT is semantically redundant but syntactically valid.\n // We strip it here to protect the engine.\n // console.log('Parsed Query Type:', parsed.queryType, 'Limit:', (parsed as any).limit); \n if (parsed.queryType === 'ASK' && (parsed as any).limit !== undefined) {\n this.logger.warn(`Stripping LIMIT from ASK query to prevent Comunica crash. Original limit: ${JSON.stringify((parsed as any).limit)}`);\n delete (parsed as any).limit;\n queryRequest.query = this.generator.stringify(parsed);\n this.logger.warn(`Sanitized Query: ${queryRequest.query}`);\n }\n\n const queryType = parsed.queryType ?? 'SELECT';\n\n switch (queryType) {\n case 'SELECT':\n await this.executeSelect(request, queryRequest, response, context);\n break;\n case 'ASK':\n await this.executeAsk(request, queryRequest, response, context);\n break;\n case 'CONSTRUCT':\n case 'DESCRIBE':\n await this.executeConstruct(request, queryRequest, response, context);\n break;\n default:\n throw new BadRequestHttpError(`Unsupported SPARQL query type: ${queryType}`);\n }\n } catch (error: unknown) {\n // Handle HttpErrors with proper status codes\n if (error instanceof HttpError) {\n const errorName = error.name || error.constructor.name || 'HttpError';\n const errorMessage = error.message || 'No message';\n this.logger.error(`SPARQL sidecar error ${error.statusCode} (${this.getRequestId(request)}): ${errorName} - ${errorMessage}`);\n this.sendErrorResponse(response, error.statusCode, errorMessage);\n return;\n }\n if (error instanceof DisabledSparqlFeatureError) {\n this.logger.warn(`SPARQL sidecar disabled feature (${this.getRequestId(request)}): ${error.message}`);\n this.sendErrorResponse(response, 403, error.message);\n return;\n }\n if (error instanceof UnsupportedSparqlQueryError) {\n this.logger.warn(`SPARQL sidecar unsupported query (${this.getRequestId(request)}): ${error.message}`);\n this.sendErrorResponse(response, 400, error.message);\n return;\n }\n // Re-throw unknown errors for CSS error handling\n this.logger.error(`SPARQL sidecar unexpected error (${this.getRequestId(request)}): ${error instanceof Error ? error.message : String(error)}`);\n throw error;\n }\n }\n\n private sendErrorResponse(response: HttpResponse, statusCode: number, message: string): void {\n response.statusCode = statusCode;\n response.setHeader('Content-Type', 'text/plain; charset=utf-8');\n response.end(message);\n }\n\n private async executeSelect(request: HttpRequest, { query, basePath, baseUrl }: QueryRequest, response: HttpResponse, context: UsageContext | undefined): Promise<void> {\n await this.authorizeFor(baseUrl, request, [ PERMISSIONS.Read ]);\n\n let vars: string[] = [];\n const results: Record<string, unknown>[] = [];\n const seenVars = new Set<string>();\n\n try {\n const bindingsStream: any = await this.engine.queryBindings(query, baseUrl);\n const metadata = typeof bindingsStream.metadata === 'function' ? await bindingsStream.metadata() : undefined;\n vars = metadata?.variables?.map((variable: Variable): string => variable.value) ?? [];\n\n for await (const binding of bindingsStream as AsyncIterable<any>) {\n const row: Record<string, unknown> = {};\n for (const [ variable, term ] of binding) {\n // variable is a Variable object; use .value to get the string name\n const name = typeof variable === 'string' ? variable : variable.value;\n row[name] = this.termToJson(term);\n seenVars.add(name);\n }\n results.push(row);\n }\n\n // Fallback: if metadata didn't provide vars, extract from bindings\n if (vars.length === 0 && seenVars.size > 0) {\n vars = Array.from(seenVars);\n }\n } catch (error: unknown) {\n // Comunica throws when projected variables are not assigned (i.e., no results)\n // Return empty results instead of erroring\n const message = error instanceof Error ? error.message : String(error);\n if (message.includes('are used in the projection result, but are not assigned')) {\n this.logger.debug(`Query returned no results: ${message}`);\n // Extract variable names from the error message or query\n const varMatch = message.match(/Variables '([^']+)'/);\n if (varMatch) {\n vars = varMatch[1].split(',').map((v) => v.trim().replace(/^\\?/, ''));\n }\n } else {\n throw error;\n }\n }\n\n const payload = {\n head: { vars },\n results: { bindings: results },\n };\n\n await this.sendPayload(response, JSON.stringify(payload), 'application/sparql-results+json; charset=utf-8', context);\n }\n\n private async executeAsk(request: HttpRequest, { query, basePath, baseUrl }: QueryRequest, response: HttpResponse, context: UsageContext | undefined): Promise<void> {\n await this.authorizeFor(baseUrl, request, [ PERMISSIONS.Read ]);\n const result = await this.engine.queryBoolean(query, baseUrl);\n const payload = {\n head: {},\n boolean: result,\n };\n await this.sendPayload(response, JSON.stringify(payload), 'application/sparql-results+json; charset=utf-8', context);\n }\n\n private async executeConstruct(request: HttpRequest, { query, basePath, baseUrl }: QueryRequest, response: HttpResponse, context: UsageContext | undefined): Promise<void> {\n await this.authorizeFor(baseUrl, request, [ PERMISSIONS.Read ]);\n const quadStream = await this.engine.queryQuads(query, baseUrl);\n const writer = new Writer({ format: 'N-Quads' });\n\n for await (const quad of quadStream) {\n writer.addQuad(quad);\n }\n\n const nquads = await new Promise<string>((resolve, reject) => {\n writer.end((error, result) => {\n if (error) {\n reject(error);\n } else {\n resolve(result);\n }\n });\n });\n\n await this.sendPayload(response, nquads, 'application/n-quads; charset=utf-8', context);\n }\n\n private async executeUpdate(queryRequest: QueryRequest, parsed: SparqlUpdate, request: HttpRequest, response: HttpResponse, context: UsageContext | undefined): Promise<void> {\n if (queryRequest.method !== 'POST') {\n throw new MethodNotAllowedHttpError([ 'POST' ]);\n }\n\n const { hasInsert, hasDelete } = this.inspectUpdateGraphs(parsed, queryRequest.baseUrl);\n const modes: string[] = [];\n if (hasInsert) {\n modes.push(PERMISSIONS.Append);\n }\n if (hasDelete) {\n modes.push(PERMISSIONS.Delete);\n }\n await this.authorizeFor(queryRequest.baseUrl, request, modes);\n\n const rewritten = this.rewriteDefaultGraphUpdates(parsed, queryRequest.baseUrl);\n this.logger.verbose(`[SubgraphSPARQL] Rewritten Query: ${rewritten}`);\n\n await this.engine.queryVoid(rewritten, queryRequest.baseUrl);\n await this.refreshUsage(queryRequest.baseUrl);\n\n response.statusCode = 204;\n response.setHeader('Cache-Control', 'no-store');\n response.end();\n }\n\n private async sendPayload(response: HttpResponse, payload: string | Buffer, contentType: string, context: UsageContext | undefined, statusCode = 200): Promise<void> {\n const buffer = typeof payload === 'string' ? Buffer.from(payload, 'utf8') : payload;\n const limit = context ? await this.resolveBandwidthLimit(context) : undefined;\n return this.streamWithLimit(response, buffer, limit, statusCode, contentType);\n }\n\n private async streamWithLimit(response: HttpResponse, buffer: Buffer, limit?: number | null, statusCode = 200, contentType?: string): Promise<void> {\n if (contentType) {\n response.setHeader('content-type', contentType);\n }\n response.statusCode = statusCode;\n const normalized = this.normalizeLimit(limit);\n let stream: NodeJS.ReadableStream = Readable.from([ buffer ]);\n if (normalized) {\n stream = stream.pipe(createBandwidthThrottleTransform({ bytesPerSecond: normalized }));\n }\n await pipeline(stream, response);\n }\n\n private async resolveUsageContext(basePath: string): Promise<UsageContext | undefined> {\n // Try to look up pod from identity database first\n if (this.podLookup) {\n try {\n const pod = await this.podLookup.findByResourceIdentifier(basePath);\n if (pod) {\n return {\n accountId: pod.accountId,\n podId: pod.podId,\n };\n }\n } catch (error) {\n // Gracefully handle missing tables (e.g., dev mode without identity DB setup)\n this.logger.debug(`Failed to lookup pod for usage context: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n // Fallback: infer pod from URL path (e.g., /alice/foo → podId=alice)\n // This allows usage tracking without identity database\n if (this.usageRepo) {\n const podId = this.inferPodIdFromPath(basePath);\n if (podId) {\n return {\n accountId: podId, // Use podId as accountId when identity DB not available\n podId,\n };\n }\n }\n\n return undefined;\n }\n\n private inferPodIdFromPath(basePath: string): string | undefined {\n // Extract first path segment as pod ID: /alice/foo/bar → alice\n const match = basePath.match(/^\\/([^/]+)\\//);\n if (match && match[1] && !match[1].startsWith('.')) {\n return match[1];\n }\n return undefined;\n }\n\n private async resolveBandwidthLimit(context: UsageContext): Promise<number | null | undefined> {\n if (!this.usageRepo) {\n return this.defaultBandwidthLimit;\n }\n const podRecord = await this.usageRepo.getPodUsage(context.podId);\n if (podRecord && podRecord.bandwidthLimitBps !== undefined) {\n return this.normalizeLimit(podRecord.bandwidthLimitBps);\n }\n const accountRecord = await this.usageRepo.getAccountUsage(context.accountId);\n if (accountRecord && accountRecord.bandwidthLimitBps !== undefined) {\n return this.normalizeLimit(accountRecord.bandwidthLimitBps);\n }\n return this.defaultBandwidthLimit;\n }\n\n private async recordBandwidth(context: UsageContext | undefined, ingress: number, egress: number): Promise<void> {\n if (!context || !this.usageRepo) {\n return;\n }\n const normalizedIngress = this.normalizeBandwidthDelta(ingress);\n const normalizedEgress = this.normalizeBandwidthDelta(egress);\n if (normalizedIngress === 0 && normalizedEgress === 0) {\n return;\n }\n await this.usageRepo.incrementUsage(context.accountId, context.podId, 0, normalizedIngress, normalizedEgress);\n }\n\n private normalizeLimit(limit?: number | null): number | null {\n if (limit == null) {\n return null;\n }\n const numeric = Number(limit);\n if (!Number.isFinite(numeric) || numeric <= 0) {\n return null;\n }\n return Math.max(0, Math.trunc(numeric));\n }\n\n private normalizeBandwidthDelta(value: number): number {\n if (!Number.isFinite(value) || value <= 0) {\n return 0;\n }\n return Math.trunc(value);\n }\n\n private async authorizeFor(basePath: string, request: HttpRequest, modes: string[]): Promise<void> {\n if (modes.length === 0) {\n return;\n }\n const identifier = { path: basePath } satisfies ResourceIdentifier;\n const requestedModes = new IdentifierSetMultiMap<string>();\n for (const mode of modes) {\n requestedModes.add(identifier, mode);\n }\n const credentials = await this.credentialsExtractor.handleSafe(request);\n const availablePermissions = await this.permissionReader.handleSafe({ credentials, requestedModes });\n await this.authorizer.handleSafe({ credentials, requestedModes, availablePermissions });\n }\n\n private inspectUpdateGraphs(update: SparqlUpdate, basePath: string): { hasInsert: boolean; hasDelete: boolean } {\n let hasInsert = false;\n let hasDelete = false;\n for (const operation of update.updates ?? []) {\n if (!this.isInsertDeleteOperation(operation)) {\n throw new BadRequestHttpError('SPARQL update management operations are not supported.');\n }\n\n if (operation.updateType === 'insert' ||\n (operation.updateType === 'insertdelete' && (operation.insert?.length ?? 0) > 0)) {\n hasInsert = true;\n }\n\n if (operation.updateType === 'delete' || operation.updateType === 'deletewhere' ||\n (operation.updateType === 'insertdelete' && (operation.delete?.length ?? 0) > 0)) {\n hasDelete = true;\n }\n\n if (operation.graph) {\n this.assertGraphInScope(operation.graph, basePath);\n }\n\n if (operation.updateType === 'insert' || operation.updateType === 'insertdelete') {\n this.inspectQuads(operation.insert ?? [], basePath);\n }\n\n if (operation.updateType === 'delete' || operation.updateType === 'insertdelete' || operation.updateType === 'deletewhere') {\n this.inspectQuads(operation.delete ?? [], basePath);\n }\n\n if (operation.updateType === 'insertdelete') {\n this.inspectPatterns(operation.where ?? [], basePath);\n if (operation.using) {\n for (const iri of operation.using.default ?? []) {\n this.assertGraphTermInScope(iri, basePath);\n }\n for (const iri of operation.using.named ?? []) {\n this.assertGraphTermInScope(iri, basePath);\n }\n }\n }\n }\n return { hasInsert, hasDelete };\n }\n\n private inspectQuads(quads: SparqlQuads[], basePath: string): void {\n for (const quad of quads) {\n if (quad.type === 'graph') {\n this.assertGraphTermInScope(quad.name, basePath);\n }\n }\n }\n\n private inspectPatterns(patterns: SparqlPattern[], basePath: string): void {\n for (const pattern of patterns) {\n if (pattern.type === 'graph') {\n this.assertGraphTermInScope(pattern.name, basePath);\n }\n const nested = (pattern as any).patterns;\n if (Array.isArray(nested)) {\n this.inspectPatterns(nested as SparqlPattern[], basePath);\n }\n }\n }\n\n private assertGraphInScope(graph: SparqlGraphOrDefault | SparqlIriTerm, basePath: string): void {\n if ('default' in graph && graph.default) {\n return;\n }\n if ('name' in graph) {\n const name = graph.name;\n if (name) {\n this.assertGraphTermInScope(name, basePath);\n }\n } else if ('value' in graph) {\n this.assertGraphTermInScope(graph, basePath);\n }\n }\n\n private assertGraphTermInScope(term: SparqlTerm, basePath: string): void {\n if (!term) {\n return;\n }\n if (term.termType === 'Variable') {\n throw new BadRequestHttpError('Graph IRIs must be explicit when using the /-/sparql update endpoint.');\n }\n if (term.termType === 'NamedNode') {\n // Graph can be either basePath or prefix:basePath (e.g., meta:http://...)\n // Extract the path part after optional prefix (anything before first colon that's not part of http:)\n const graphValue = term.value;\n let pathPart = graphValue;\n \n // Check if it has a prefix like \"meta:\" or \"acl:\" (not \"http:\" or \"https:\")\n const prefixMatch = graphValue.match(/^([a-z]+):(?!\\/\\/)/i);\n if (prefixMatch) {\n pathPart = graphValue.slice(prefixMatch[0].length);\n }\n \n if (!pathPart.startsWith(basePath)) {\n throw new BadRequestHttpError(`Graph ${term.value} is outside of ${basePath}.`);\n }\n return;\n }\n if ((term as any).default === true) {\n return;\n }\n throw new BadRequestHttpError('Unsupported graph target in SPARQL update.');\n }\n\n /**\n * Rewrites INSERT/DELETE/INSERT+DELETE that target the default graph (or BGP without GRAPH)\n * so they write to the resource graph (graphIri).\n */\n private rewriteDefaultGraphUpdates(parsed: SparqlUpdate, graphIri: string): string {\n const graphNode = DataFactory.namedNode(graphIri);\n\n const rewritePatterns = (patterns?: SparqlQuads[]): SparqlQuads[] | undefined => {\n if (!patterns) return patterns;\n return patterns.map((pattern: any): SparqlQuads => {\n if (pattern.type === 'bgp') {\n return { type: 'graph', name: graphNode, triples: pattern.triples } as unknown as SparqlQuads;\n }\n if (pattern.type === 'graph' && pattern.name?.termType === 'DefaultGraph') {\n return { ...pattern, name: graphNode };\n }\n return pattern;\n });\n };\n\n parsed.updates = parsed.updates.map((op: any): UpdateOperation => {\n if (op.updateType === 'insert' || op.updateType === 'delete' || op.updateType === 'insertdelete') {\n return {\n ...op,\n insert: rewritePatterns(op.insert),\n delete: rewritePatterns(op.delete),\n };\n }\n if (op.updateType === 'deletewhere') {\n return {\n ...op,\n delete: rewritePatterns(op.delete),\n };\n }\n return op;\n });\n\n return this.generator.stringify(parsed);\n }\n\n private async refreshUsage(basePath: string): Promise<void> {\n if (!this.usageRepo || !this.podLookup) {\n return;\n }\n const pod = await this.podLookup.findByResourceIdentifier(basePath);\n if (!pod) {\n this.logger.warn(`Skipping quota update for ${basePath}: unable to resolve owning pod.`);\n return;\n }\n const graphs = await this.engine.listGraphs(basePath);\n let totalBytes = 0;\n for (const graph of graphs) {\n totalBytes += await this.computeGraphSize(graph, basePath);\n }\n await this.usageRepo.setPodStorage(pod.accountId, pod.podId, totalBytes);\n }\n\n private async computeGraphSize(graph: string, basePath: string): Promise<number> {\n const stream = await this.engine.constructGraph(graph, basePath);\n let bytes = 0;\n try {\n for await (const quad of stream as AsyncIterable<RdfQuad>) {\n bytes += SubgraphSparqlHttpHandler.measureQuad(quad);\n }\n } finally {\n const close = (stream as unknown as { close?: () => void }).close;\n if (typeof close === 'function') {\n close();\n }\n }\n return bytes;\n }\n\n private writeOptions(response: HttpResponse): void {\n response.statusCode = 204;\n response.setHeader('Allow', ALLOWED_METHODS.join(','));\n response.end();\n }\n\n private async extractQuery(request: HttpRequest, method: string): Promise<QueryRequest> {\n const url = this.parseUrl(request);\n const path = decodeURIComponent(url.pathname);\n\n // Sidecar pattern: /alice/-/sparql → basePath = /alice/\n // Or: /alice/photos/-/sparql → basePath = /alice/photos/\n const sidecarIndex = path.indexOf(this.sidecarPath);\n if (sidecarIndex === -1) {\n throw new NotImplementedHttpError('Request is not targeting a subgraph SPARQL endpoint.');\n }\n\n let basePath = path.slice(0, sidecarIndex);\n if (this.isContainerSidecarBase(basePath) && !basePath.endsWith('/')) {\n basePath = `${basePath}/`;\n }\n\n let query: string | null = null;\n let ingressBytes = 0;\n\n if (method === 'GET') {\n query = url.searchParams.get('query');\n if (query) {\n ingressBytes += Buffer.byteLength(query, 'utf8');\n }\n } else {\n const contentTypeHeader = request.headers['content-type'] ?? request.headers['Content-Type'];\n const contentType = Array.isArray(contentTypeHeader) ? contentTypeHeader[0] : contentTypeHeader;\n const normalized = contentType?.split(';')[0].trim().toLowerCase();\n\n if (normalized === 'application/sparql-query' || normalized === 'application/sparql-update') {\n const body = await this.readBody(request);\n ingressBytes += Buffer.byteLength(body, 'utf8');\n query = body.trim();\n } else if (normalized === 'application/x-www-form-urlencoded') {\n const body = await this.readBody(request);\n ingressBytes += Buffer.byteLength(body, 'utf8');\n const params = new URLSearchParams(body);\n query = params.get('query') ?? params.get('update');\n } else {\n throw new UnsupportedMediaTypeHttpError('Supported content types are application/sparql-query, application/sparql-update, or application/x-www-form-urlencoded.');\n }\n }\n\n if (!query || query.trim().length === 0) {\n throw new BadRequestHttpError('A SPARQL query must be supplied through the \"query\" parameter or request body.');\n }\n\n const origin = `${url.protocol}//${url.host}`;\n return {\n basePath,\n baseUrl: `${origin}${basePath}`,\n query: query.trim(),\n origin,\n method,\n ingressBytes,\n };\n }\n\n private parseUrl(request: HttpRequest): URL {\n const hostHeader = request.headers.host ?? request.headers.Host ?? 'localhost';\n const protocolHeader = (request.headers['x-forwarded-proto'] ?? request.headers['X-Forwarded-Proto']) as string | undefined;\n const protocol = protocolHeader?.split(',')[0]?.trim() ?? 'http';\n const requestUrl = request.url ?? '/';\n return new URL(requestUrl, `${protocol}://${hostHeader}`);\n }\n\n private isContainerSidecarBase(basePath: string): boolean {\n const lastSegment = basePath.split('/').filter(Boolean).pop() ?? '';\n if (lastSegment.length === 0) {\n return true;\n }\n\n const extensionStart = lastSegment.lastIndexOf('.');\n return extensionStart <= 0;\n }\n\n private async readBody(request: HttpRequest): Promise<string> {\n return await new Promise<string>((resolve, reject) => {\n let data = '';\n request.setEncoding('utf8');\n request.on('data', (chunk: string) => {\n data += chunk;\n });\n request.on('end', () => resolve(data));\n request.on('error', reject);\n });\n }\n\n private termToJson(term: Term): Record<string, string> {\n switch (term.termType) {\n case 'NamedNode':\n return { type: 'uri', value: term.value };\n case 'BlankNode':\n return { type: 'bnode', value: term.value };\n case 'Literal': {\n const literal = term as Literal;\n if (literal.language) {\n return {\n type: 'literal',\n value: literal.value,\n 'xml:lang': literal.language,\n };\n }\n const datatype = literal.datatype?.value;\n if (datatype && datatype !== SubgraphSparqlHttpHandler.XSD_STRING) {\n return {\n type: 'literal',\n value: literal.value,\n datatype,\n };\n }\n return { type: 'literal', value: literal.value };\n }\n default:\n return { type: 'literal', value: term.value };\n }\n }\n\n private static measureQuad(quad: RdfQuad): number {\n const subject = SubgraphSparqlHttpHandler.termToNQuads(quad.subject);\n const predicate = SubgraphSparqlHttpHandler.termToNQuads(quad.predicate);\n const object = SubgraphSparqlHttpHandler.termToNQuads(quad.object);\n const graph = quad.graph.termType === 'DefaultGraph' ? '' : ` ${SubgraphSparqlHttpHandler.termToNQuads(quad.graph)}`;\n const serialized = `${subject} ${predicate} ${object}${graph} .\\n`;\n return Buffer.byteLength(serialized, 'utf8');\n }\n\n private static termToNQuads(term: Term): string {\n switch (term.termType) {\n case 'NamedNode':\n return `<${term.value}>`;\n case 'BlankNode':\n return `_:${term.value}`;\n case 'Literal':\n return SubgraphSparqlHttpHandler.literalToNQuads(term as Literal);\n case 'DefaultGraph':\n return '';\n default:\n return `<${term.value}>`;\n }\n }\n\n private static literalToNQuads(literal: Literal): string {\n const escaped = SubgraphSparqlHttpHandler.escapeLiteral(literal.value);\n if (literal.language) {\n return `\"${escaped}\"@${literal.language}`;\n }\n const datatype = literal.datatype?.value;\n if (datatype && datatype !== SubgraphSparqlHttpHandler.XSD_STRING) {\n return `\"${escaped}\"^^<${datatype}>`;\n }\n return `\"${escaped}\"`;\n }\n\n private static escapeLiteral(value: string): string {\n return value\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\"/g, '\\\\\"')\n .replace(/\\n/g, '\\\\n')\n .replace(/\\r/g, '\\\\r')\n .replace(/\\t/g, '\\\\t')\n .replace(/\\f/g, '\\\\f')\n .replace(/\\b/g, '\\\\b');\n }\n\n private isInsertDeleteOperation(operation: SparqlUpdate['updates'][number]): operation is SparqlInsertDeleteOperation {\n return typeof (operation as SparqlInsertDeleteOperation).updateType === 'string';\n }\n\n private getRequestId(request: HttpRequest): string {\n const header = (request.headers['x-request-id'] ?? request.headers['X-Request-Id']) as string | undefined;\n return header?.toString() ?? 'no-request-id';\n }\n\n private isSqliteUrl(url: string): boolean {\n const lower = url.toLowerCase();\n return lower.startsWith('sqlite:') || lower.endsWith('.sqlite') || lower.endsWith('.db');\n }\n}\n"]}
|
|
@@ -266,6 +266,10 @@
|
|
|
266
266
|
"@id": "undefineds:dist/http/SubgraphSparqlHttpHandler.jsonld#SubgraphSparqlHttpHandler__member_parseUrl",
|
|
267
267
|
"memberFieldName": "parseUrl"
|
|
268
268
|
},
|
|
269
|
+
{
|
|
270
|
+
"@id": "undefineds:dist/http/SubgraphSparqlHttpHandler.jsonld#SubgraphSparqlHttpHandler__member_isContainerSidecarBase",
|
|
271
|
+
"memberFieldName": "isContainerSidecarBase"
|
|
272
|
+
},
|
|
269
273
|
{
|
|
270
274
|
"@id": "undefineds:dist/http/SubgraphSparqlHttpHandler.jsonld#SubgraphSparqlHttpHandler__member_readBody",
|
|
271
275
|
"memberFieldName": "readBody"
|
|
@@ -15,6 +15,10 @@ import type { HttpHandlerInput } from '@solid/community-server';
|
|
|
15
15
|
import type { CredentialsExtractor, PermissionReader, Authorizer } from '@solid/community-server';
|
|
16
16
|
import { VectorStore } from '../../storage/vector/VectorStore';
|
|
17
17
|
interface VectorHttpHandlerOptions {
|
|
18
|
+
vectorStore: VectorStore;
|
|
19
|
+
credentialsExtractor: CredentialsExtractor;
|
|
20
|
+
permissionReader: PermissionReader;
|
|
21
|
+
authorizer: Authorizer;
|
|
18
22
|
sidecarPath?: string;
|
|
19
23
|
}
|
|
20
24
|
export declare class VectorHttpHandler extends HttpHandler {
|
|
@@ -24,7 +28,7 @@ export declare class VectorHttpHandler extends HttpHandler {
|
|
|
24
28
|
private readonly permissionReader;
|
|
25
29
|
private readonly authorizer;
|
|
26
30
|
private readonly sidecarPath;
|
|
27
|
-
constructor(
|
|
31
|
+
constructor(options: VectorHttpHandlerOptions);
|
|
28
32
|
canHandle({ request }: HttpHandlerInput): Promise<void>;
|
|
29
33
|
handle({ request, response }: HttpHandlerInput): Promise<void>;
|
|
30
34
|
private handleUpsert;
|
|
@@ -46,13 +46,13 @@ class VectorApiError extends Error {
|
|
|
46
46
|
}
|
|
47
47
|
}
|
|
48
48
|
class VectorHttpHandler extends community_server_1.HttpHandler {
|
|
49
|
-
constructor(
|
|
49
|
+
constructor(options) {
|
|
50
50
|
super();
|
|
51
51
|
this.logger = (0, global_logger_factory_1.getLoggerFor)(this);
|
|
52
|
-
this.vectorStore = vectorStore;
|
|
53
|
-
this.credentialsExtractor = credentialsExtractor;
|
|
54
|
-
this.permissionReader = permissionReader;
|
|
55
|
-
this.authorizer = authorizer;
|
|
52
|
+
this.vectorStore = options.vectorStore;
|
|
53
|
+
this.credentialsExtractor = options.credentialsExtractor;
|
|
54
|
+
this.permissionReader = options.permissionReader;
|
|
55
|
+
this.authorizer = options.authorizer;
|
|
56
56
|
this.sidecarPath = options.sidecarPath ?? '/-/vector';
|
|
57
57
|
}
|
|
58
58
|
async canHandle({ request }) {
|