@undefineds.co/xpod 0.3.15 → 0.3.16
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/local.json +5 -5
- package/config/xpod.json +24 -10
- package/dist/cli/commands/auth.d.ts +1 -0
- package/dist/cli/commands/auth.js +117 -37
- package/dist/cli/commands/auth.js.map +1 -1
- package/dist/cli/commands/login.js +16 -23
- package/dist/cli/commands/login.js.map +1 -1
- package/dist/cli/commands/logs.d.ts +2 -0
- package/dist/cli/commands/logs.js +20 -5
- package/dist/cli/commands/logs.js.map +1 -1
- package/dist/cli/commands/obj.d.ts +44 -0
- package/dist/cli/commands/obj.js +1059 -0
- package/dist/cli/commands/obj.js.map +1 -0
- package/dist/cli/commands/rdf.d.ts +14 -0
- package/dist/cli/commands/rdf.js +235 -0
- package/dist/cli/commands/rdf.js.map +1 -0
- package/dist/cli/commands/resource.d.ts +31 -0
- package/dist/cli/commands/resource.js +191 -0
- package/dist/cli/commands/resource.js.map +1 -0
- package/dist/cli/commands/secret.d.ts +36 -0
- package/dist/cli/commands/secret.js +285 -0
- package/dist/cli/commands/secret.js.map +1 -0
- package/dist/cli/commands/server.d.ts +11 -0
- package/dist/cli/commands/server.js +168 -0
- package/dist/cli/commands/server.js.map +1 -0
- package/dist/cli/commands/start.d.ts +1 -0
- package/dist/cli/commands/start.js +5 -0
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/commands/status.d.ts +1 -0
- package/dist/cli/commands/status.js +21 -6
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/stop.d.ts +3 -0
- package/dist/cli/commands/stop.js +40 -6
- package/dist/cli/commands/stop.js.map +1 -1
- package/dist/cli/index.js +23 -8
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/lib/auth-context.d.ts +24 -0
- package/dist/cli/lib/auth-context.js +70 -0
- package/dist/cli/lib/auth-context.js.map +1 -0
- package/dist/cli/lib/output.d.ts +23 -0
- package/dist/cli/lib/output.js +63 -0
- package/dist/cli/lib/output.js.map +1 -0
- package/dist/cli/lib/resource.d.ts +29 -0
- package/dist/cli/lib/resource.js +114 -0
- package/dist/cli/lib/resource.js.map +1 -0
- package/dist/identity/oidc/AutoDetectIdentityProviderHandler.d.ts +11 -10
- package/dist/identity/oidc/AutoDetectIdentityProviderHandler.js +13 -24
- package/dist/identity/oidc/AutoDetectIdentityProviderHandler.js.map +1 -1
- package/dist/identity/oidc/AutoDetectIdentityProviderHandler.jsonld +4 -4
- package/dist/identity/oidc/AutoDetectOidcHandler.d.ts +8 -4
- package/dist/identity/oidc/AutoDetectOidcHandler.js +10 -6
- package/dist/identity/oidc/AutoDetectOidcHandler.js.map +1 -1
- package/dist/identity/oidc/AutoDetectOidcHandler.jsonld +3 -3
- package/dist/storage/accessors/MixDataAccessor.js +3 -0
- package/dist/storage/accessors/MixDataAccessor.js.map +1 -1
- package/dist/storage/quint/SqliteQuintStore.d.ts +26 -1
- package/dist/storage/quint/SqliteQuintStore.js +551 -318
- package/dist/storage/quint/SqliteQuintStore.js.map +1 -1
- package/dist/storage/quint/SqliteQuintStore.jsonld +102 -2
- package/dist/storage/quint/schema.d.ts +76 -0
- package/dist/storage/quint/schema.js +13 -7
- package/dist/storage/quint/schema.js.map +1 -1
- package/dist/storage/sparql/ComunicaQuintEngine.js +16 -3
- package/dist/storage/sparql/ComunicaQuintEngine.js.map +1 -1
- package/package.json +1 -1
- package/dist/cli/commands/config.d.ts +0 -42
- package/dist/cli/commands/config.js +0 -289
- package/dist/cli/commands/config.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AutoDetectOidcHandler.js","sourceRoot":"","sources":["../../../src/identity/oidc/AutoDetectOidcHandler.ts"],"names":[],"mappings":";;;AAAA,uCAA+B;AAC/B,iEAAqD;AACrD,8DAKiC;AAgBjC
|
|
1
|
+
{"version":3,"file":"AutoDetectOidcHandler.js","sourceRoot":"","sources":["../../../src/identity/oidc/AutoDetectOidcHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import { URL } from 'node:url';\nimport { getLoggerFor } from 'global-logger-factory';\nimport {\n HttpHandler,\n type HttpHandlerInput,\n NotImplementedHttpError,\n InternalServerError,\n} from '@solid/community-server';\n\nexport interface AutoDetectOidcHandlerOptions {\n /** External OIDC issuer base URL used as the trust source for Local SP mode. */\n oidcIssuer?: string;\n /** Explanation used when this handler declines non-JWKS OIDC routes. */\n message?: string;\n /** JWKS 缓存时间 (ms) */\n cacheMs?: number;\n}\n\ninterface JwksCache {\n keys: unknown[];\n expiresAt: number;\n}\n\n/**\n * Auto-detect OIDC Handler\n *\n * 自动检测运行模式:\n * - 如果配置了 oidcIssuer -> Local SP 模式:只代理外部 issuer 的 JWKS\n * - 如果没有配置 oidcIssuer -> 标准模式:所有 OIDC 请求透传(由 CSS 默认 Handler 处理)\n *\n * 注意:Local SP 模式不能禁用本地 account/consent。OIDC 交互页面和\n * scoped WebID picker 必须继续由本地 CSS 提供,否则 Local 登录会退回\n * Cloud consent 并暴露 Cloud Pod。\n *\n * 使用方式:在 HTTP pipeline 中替换默认的 OidcHandler\n */\nexport class AutoDetectOidcHandler extends HttpHandler {\n private readonly logger = getLoggerFor(this);\n private readonly oidcIssuer?: string;\n private readonly jwksUrl?: string;\n private readonly message: string;\n private readonly cacheMs: number;\n private jwksCache?: JwksCache;\n\n constructor(options: AutoDetectOidcHandlerOptions = {}) {\n super();\n this.oidcIssuer = options.oidcIssuer;\n this.jwksUrl = this.oidcIssuer ? `${this.oidcIssuer.replace(/\\/$/, '')}/.oidc/jwks` : undefined;\n this.message = options.message ?? 'OIDC route handled by local CSS OIDC handler';\n this.cacheMs = options.cacheMs ?? 300000; // 默认 5 分钟\n\n if (this.oidcIssuer) {\n this.logger.info(`Local SP mode enabled, external issuer: ${this.oidcIssuer}, JWKS: ${this.jwksUrl}`);\n } else {\n this.logger.info('Standard mode enabled, OIDC requests will pass through');\n }\n }\n\n /**\n * 判断是否处理请求\n * - Local SP 模式:只处理 JWKS 请求,其他 OIDC 请求透传给 CSS 本地 OIDC handler\n * - 标准模式:不处理任何请求(透传给 CSS 默认 Handler)\n */\n public override async canHandle({ request }: HttpHandlerInput): Promise<void> {\n const url = request.url ?? '';\n\n // 检查是否是 OIDC 路径\n if (!this.isOidcPath(url)) {\n throw new NotImplementedHttpError('Not an OIDC request');\n }\n\n // 标准模式:不处理,透传给 CSS 默认 Handler\n if (!this.jwksUrl) {\n throw new NotImplementedHttpError('Pass through to default OIDC handler');\n }\n\n // Local SP 模式:只有 JWKS 请求由这里处理,其它 OIDC 路由交给 CSS 本地 handler\n if (!this.isJwksPath(url)) {\n throw new NotImplementedHttpError(\n `Local SP mode: ${this.message}.`\n );\n }\n }\n\n /**\n * 处理请求\n * - SP 模式:代理 JWKS\n * - 标准模式:不应该到达这里\n */\n public override async handle({ response }: HttpHandlerInput): Promise<void> {\n // 标准模式:不应该到达这里\n if (!this.jwksUrl) {\n throw new InternalServerError('AutoDetectOidcHandler should not handle requests in standard mode');\n }\n\n try {\n const jwks = await this.fetchJwks();\n\n response.statusCode = 200;\n response.setHeader('Content-Type', 'application/json');\n response.setHeader('Cache-Control', `public, max-age=${Math.floor(this.cacheMs / 1000)}`);\n response.end(JSON.stringify(jwks));\n\n this.logger.debug('JWKS proxy successful');\n } catch (error) {\n this.logger.error(`JWKS proxy failed: ${(error as Error).message}`);\n throw new InternalServerError('Failed to proxy JWKS request', { cause: error });\n }\n }\n\n /**\n * 获取并缓存 JWKS\n */\n private async fetchJwks(): Promise<{ keys: unknown[] }> {\n // 检查缓存\n if (this.jwksCache && this.jwksCache.expiresAt > Date.now()) {\n this.logger.debug('Returning cached JWKS');\n return { keys: this.jwksCache.keys };\n }\n\n if (!this.jwksUrl) {\n throw new Error('External JWKS URL not configured');\n }\n\n this.logger.debug(`Fetching JWKS from ${this.jwksUrl}`);\n\n const res = await fetch(this.jwksUrl, {\n headers: { Accept: 'application/json' },\n });\n\n if (!res.ok) {\n throw new Error(`Failed to fetch JWKS: ${res.status} ${res.statusText}`);\n }\n\n const jwks = await res.json() as { keys: unknown[] };\n\n // 验证 JWKS 格式\n if (!Array.isArray(jwks.keys)) {\n throw new Error('Invalid JWKS format: missing keys array');\n }\n\n // 更新缓存\n this.jwksCache = {\n keys: jwks.keys,\n expiresAt: Date.now() + this.cacheMs,\n };\n\n this.logger.debug(`JWKS cached with ${jwks.keys.length} keys`);\n return jwks;\n }\n\n /**\n * 检查是否是 OIDC 路径\n */\n private isOidcPath(url: string): boolean {\n const pathname = this.getPathname(url);\n return (\n pathname.startsWith('/.oidc/') ||\n pathname === '/.well-known/openid-configuration' ||\n pathname === '/.well-known/oauth-authorization-server' ||\n pathname.startsWith('/idp/')\n );\n }\n\n /**\n * 检查是否是 JWKS 路径\n */\n private isJwksPath(url: string): boolean {\n const pathname = this.getPathname(url);\n return pathname === '/.oidc/jwks' || pathname === '/.oidc/jwks.json';\n }\n\n /**\n * 从 URL 提取 pathname\n */\n private getPathname(url: string): string {\n try {\n return new URL(url, 'http://localhost').pathname;\n } catch {\n // 如果解析失败,直接返回 url(可能是相对路径)\n return url.split('?')[0];\n }\n }\n}\n"]}
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"extends": [
|
|
13
13
|
"css:dist/server/HttpHandler.jsonld#HttpHandler"
|
|
14
14
|
],
|
|
15
|
-
"comment": "Auto-detect OIDC Handler 自动检测运行模式: - 如果配置了 oidcIssuer -> SP
|
|
15
|
+
"comment": "Auto-detect OIDC Handler 自动检测运行模式: - 如果配置了 oidcIssuer -> Local SP 模式:只代理外部 issuer 的 JWKS - 如果没有配置 oidcIssuer -> 标准模式:所有 OIDC 请求透传(由 CSS 默认 Handler 处理) 注意:Local SP 模式不能禁用本地 account/consent。OIDC 交互页面和 scoped WebID picker 必须继续由本地 CSS 提供,否则 Local 登录会退回 Cloud consent 并暴露 Cloud Pod。 使用方式:在 HTTP pipeline 中替换默认的 OidcHandler",
|
|
16
16
|
"parameters": [
|
|
17
17
|
{
|
|
18
18
|
"@id": "undefineds:dist/identity/oidc/AutoDetectOidcHandler.jsonld#AutoDetectOidcHandler_options_oidcIssuer",
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
}
|
|
26
26
|
]
|
|
27
27
|
},
|
|
28
|
-
"comment": "
|
|
28
|
+
"comment": "External OIDC issuer base URL used as the trust source for Local SP mode."
|
|
29
29
|
},
|
|
30
30
|
{
|
|
31
31
|
"@id": "undefineds:dist/identity/oidc/AutoDetectOidcHandler.jsonld#AutoDetectOidcHandler_options_message",
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
}
|
|
39
39
|
]
|
|
40
40
|
},
|
|
41
|
-
"comment": "
|
|
41
|
+
"comment": "Explanation used when this handler declines non-JWKS OIDC routes."
|
|
42
42
|
},
|
|
43
43
|
{
|
|
44
44
|
"@id": "undefineds:dist/identity/oidc/AutoDetectOidcHandler.jsonld#AutoDetectOidcHandler_options_cacheMs",
|
|
@@ -453,6 +453,9 @@ class MixDataAccessor {
|
|
|
453
453
|
}
|
|
454
454
|
createLocalRdfMetadata(identifier, metadata) {
|
|
455
455
|
const localMetadata = new community_server_1.RepresentationMetadata(metadata);
|
|
456
|
+
const graphScopedQuads = localMetadata.quads()
|
|
457
|
+
.filter((quad) => quad.graph.termType !== 'DefaultGraph');
|
|
458
|
+
localMetadata.removeQuads(graphScopedQuads);
|
|
456
459
|
localMetadata.contentType = this.localRdfContentType(identifier);
|
|
457
460
|
return localMetadata;
|
|
458
461
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MixDataAccessor.js","sourceRoot":"","sources":["../../../src/storage/accessors/MixDataAccessor.ts"],"names":[],"mappings":"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","sourcesContent":["import { Readable } from 'stream';\nimport { getLoggerFor } from 'global-logger-factory';\nimport arrayifyStream from 'arrayify-stream';\nimport { DataFactory, Parser, Writer, termToId } from 'n3';\nimport jsonld from 'jsonld';\nimport { rdfParser } from 'rdf-parse';\n\nimport type { Quad, Term } from '@rdfjs/types';\nimport {\n isContainerIdentifier,\n RepresentationMetadata,\n INTERNAL_QUADS,\n FoundHttpError,\n NotFoundHttpError,\n POSIX,\n SOLID_META,\n XSD,\n toLiteral,\n guardStream,\n addResourceMetadata,\n updateModifiedDate,\n} from '@solid/community-server';\nimport type {\n Representation,\n ResourceIdentifier,\n Guarded,\n DataAccessor,\n} from '@solid/community-server';\nimport {\n RdfSparqlAdapter,\n UnsupportedSparqlQueryError,\n type RdfSparqlUpdateDeltaOperation,\n} from '../rdf/RdfSparqlAdapter';\nimport {\n isLineAddressableRdfPath,\n isRdfDocumentPath,\n rdfContentTypeForPath,\n} from '../rdf/RdfContentTypes';\nimport { RdfQuadIndex } from '../rdf/RdfQuadIndex';\nimport { serializeRdfXml } from '../rdf/RdfXmlSerializer';\nimport { SolidRdfEngine } from '../rdf/SolidRdfEngine';\nimport type {\n RdfBindingRow,\n RdfLocalQuery,\n RdfQueryPattern,\n RdfQueryTermPattern,\n RdfSourceInput,\n} from '../rdf/types';\nimport { metadataRequestContext } from '../MetadataRequestContext';\n\nexport interface LocalRdfDocument {\n data: Guarded<Readable>;\n metadata: RepresentationMetadata;\n}\n\nexport interface LocalRdfReadableAccessor {\n getLocalRdfDocument(identifier: ResourceIdentifier): Promise<LocalRdfDocument>;\n}\n\nexport interface LocalRdfIndexAccessor {\n syncLocalRdfDocument(\n identifier: ResourceIdentifier,\n data?: Guarded<Readable>,\n contentType?: string,\n options?: LocalRdfSyncOptions,\n ): Promise<void>;\n deleteLocalRdfIndex(identifier: ResourceIdentifier): Promise<void>;\n}\n\nexport interface LocalRdfSyncOptions {\n source?: string;\n workspace?: string;\n localPath?: string;\n sourceVersion?: string;\n}\n\nexport interface SourceScopedStructuredRdfAccessor {\n writeRdfSourceDocument(\n identifier: ResourceIdentifier,\n quads: Quad[],\n metadata: RepresentationMetadata,\n source: RdfSourceInput,\n ): Promise<void>;\n deleteRdfSourceDocument(identifier: ResourceIdentifier): Promise<void>;\n}\n\n/**\n * MixDataAccessor - Routes data to appropriate storage based on content type\n * \n * - RDF data (internal/quads) -> structuredDataAccessor (Quadstore or QuintStore)\n * - RDF file mirrors (.ttl/.jsonld) -> rdfFileDataAccessor (local FileSystem)\n * - Other data (binary, text, etc.) -> unstructuredDataAccessor (FileSystem, Minio, etc.)\n * \n * This uses composition instead of inheritance, allowing any DataAccessor\n * to be used as the RDF storage backend.\n */\nexport class MixDataAccessor implements DataAccessor {\n protected readonly logger = getLoggerFor(this);\n private readonly rdfSparqlAdapter = new RdfSparqlAdapter();\n \n private readonly structuredDataAccessor: DataAccessor;\n private readonly unstructuredDataAccessor: DataAccessor;\n private readonly rdfFileDataAccessor: DataAccessor;\n private readonly presignedRedirectEnabled: boolean;\n private readonly mirrorContainersToUnstructured: boolean;\n\n constructor(\n structuredDataAccessor: DataAccessor,\n unstructuredDataAccessor: DataAccessor,\n presignedRedirectEnabled = false,\n mirrorContainersToUnstructured = true,\n rdfFileDataAccessor: DataAccessor = unstructuredDataAccessor,\n ) {\n this.structuredDataAccessor = structuredDataAccessor;\n this.unstructuredDataAccessor = unstructuredDataAccessor;\n this.rdfFileDataAccessor = rdfFileDataAccessor;\n this.presignedRedirectEnabled = presignedRedirectEnabled;\n this.mirrorContainersToUnstructured = mirrorContainersToUnstructured;\n }\n\n /**\n * This accessor supports all types of data.\n */\n public async canHandle(representation: Representation): Promise<void> {\n return void 0;\n }\n\n /**\n * Checks if the given representation is unstructured (non-RDF).\n */\n private isUnstructured(metadata: RepresentationMetadata): boolean {\n return metadata.contentType !== INTERNAL_QUADS;\n }\n\n public async getData(identifier: ResourceIdentifier): Promise<Guarded<Readable>> {\n const metadata = await this.getMetadata(identifier);\n if (this.isUnstructured(metadata)) {\n // When presigned redirect is enabled and the unstructured accessor supports it,\n // generate a presigned URL and throw FoundHttpError to trigger a 302 redirect.\n if (this.presignedRedirectEnabled) {\n const accessor = this.unstructuredDataAccessor as { getPresignedUrl?: (id: ResourceIdentifier, expires?: number) => Promise<string> };\n if (typeof accessor.getPresignedUrl === 'function') {\n const presignedUrl = await accessor.getPresignedUrl(identifier);\n this.logger.debug(`Presigned redirect: ${identifier.path}`);\n throw new FoundHttpError(presignedUrl);\n }\n }\n return await this.unstructuredDataAccessor.getData(identifier);\n }\n return await this.structuredDataAccessor.getData(identifier);\n }\n\n /**\n * Read the local RDF file mirror used by SolidFS/local-first HTTP reads.\n *\n * `getData()` intentionally keeps returning the structured quad stream for\n * CSS internals. This method is the explicit file-content path for callers\n * that need a real Turtle/JSON-LD byte stream.\n */\n public async getLocalRdfDocument(identifier: ResourceIdentifier): Promise<LocalRdfDocument> {\n if (isContainerIdentifier(identifier)) {\n throw new NotFoundHttpError();\n }\n\n if (this.isByLineRdfIdentifier(identifier)) {\n try {\n return {\n data: await this.rdfFileDataAccessor.getData(identifier),\n metadata: await this.getExistingLocalRdfMetadata(identifier),\n };\n } catch (error) {\n if (!NotFoundHttpError.isInstance(error)) {\n throw error;\n }\n }\n }\n\n const metadata = await this.getMetadata(identifier);\n if (!this.isLocalMirroredRdf(identifier, metadata)) {\n throw new NotFoundHttpError();\n }\n\n try {\n return {\n data: await this.rdfFileDataAccessor.getData(identifier),\n metadata: await this.getLocalRdfMetadata(identifier, metadata),\n };\n } catch (error) {\n if (!NotFoundHttpError.isInstance(error)) {\n throw error;\n }\n }\n\n await this.refreshLocalRdfMirror(identifier);\n\n return {\n data: await this.rdfFileDataAccessor.getData(identifier),\n metadata: await this.getLocalRdfMetadata(identifier, metadata),\n };\n }\n\n public async getMetadata(identifier: ResourceIdentifier): Promise<RepresentationMetadata> {\n const cache = metadataRequestContext.getStore()?.metadataCache;\n const cacheKey = identifier.path;\n const cached = cache?.get(cacheKey);\n if (cached) {\n if (cached.kind === 'miss') {\n throw new NotFoundHttpError();\n }\n return new RepresentationMetadata(cached.metadata);\n }\n\n try {\n const metadata = await this.structuredDataAccessor.getMetadata(identifier);\n\n if (!metadata.contentType) {\n metadata.contentType = INTERNAL_QUADS;\n }\n\n cache?.set(cacheKey, { kind: 'hit', metadata: new RepresentationMetadata(metadata) });\n return metadata;\n } catch (error) {\n if (NotFoundHttpError.isInstance(error)) {\n cache?.set(cacheKey, { kind: 'miss' });\n }\n throw error;\n }\n }\n\n public async* getChildren(identifier: ResourceIdentifier): AsyncIterableIterator<RepresentationMetadata> {\n // Children metadata is stored in the structured accessor\n yield* this.structuredDataAccessor.getChildren(identifier);\n }\n\n public async writeContainer(\n identifier: ResourceIdentifier,\n metadata: RepresentationMetadata,\n ): Promise<void> {\n if (this.mirrorContainersToUnstructured && this.isUnstructured(metadata)) {\n await this.unstructuredDataAccessor.writeContainer(identifier, metadata);\n }\n await this.structuredDataAccessor.writeContainer(identifier, metadata);\n this.invalidateMetadataCache(identifier);\n }\n\n public async writeDocument(\n identifier: ResourceIdentifier,\n data: Guarded<Readable>,\n metadata: RepresentationMetadata,\n ): Promise<void> {\n if (this.isUnstructured(metadata)) {\n await this.writeUnstructuredDocument(identifier, data, metadata);\n this.invalidateMetadataCache(identifier);\n return;\n }\n await this.writeRdfDocument(identifier, data, metadata);\n this.invalidateMetadataCache(identifier);\n }\n\n public async writeMetadata(identifier: ResourceIdentifier, metadata: RepresentationMetadata): Promise<void> {\n // Metadata always goes to structured storage\n await this.structuredDataAccessor.writeMetadata(identifier, metadata);\n this.invalidateMetadataCache(identifier);\n }\n\n public async deleteResource(identifier: ResourceIdentifier): Promise<void> {\n const metadata = await this.getMetadata(identifier);\n \n // RDF by-line resources are mirrored to local file storage so shell tools\n // can operate on real files; remove that mirror together with the index.\n if (this.isLocalMirroredRdf(identifier, metadata)) {\n await this.deleteRdfFileResourceIfPresent(identifier);\n } else if (this.isUnstructured(metadata)) {\n await this.deleteUnstructuredResourceIfPresent(identifier);\n }\n \n // Always delete from structured storage (contains metadata)\n await this.structuredDataAccessor.deleteResource(identifier);\n this.invalidateMetadataCache(identifier);\n }\n\n /**\n * Execute SPARQL UPDATE.\n *\n * Supported embedded deltas patch the local RDF authority file first and then\n * rebuild the structured RDF index. Unsupported shapes keep using the\n * compatibility accessor until the embedded engine covers them.\n */\n public async executeSparqlUpdate(query: string, baseIri?: string): Promise<void> {\n if (baseIri) {\n const identifier = { path: baseIri };\n if (this.isByLineRdfIdentifier(identifier)) {\n try {\n await this.executeLocalRdfSparqlUpdate(query, identifier);\n this.invalidateMetadataCache(identifier);\n return;\n } catch (error) {\n if (!(error instanceof UnsupportedSparqlQueryError)) {\n throw error;\n }\n }\n }\n }\n\n const accessor = this.structuredDataAccessor as { executeSparqlUpdate?: (query: string, baseIri?: string) => Promise<void> };\n if (typeof accessor.executeSparqlUpdate !== 'function') {\n throw new Error('Structured data accessor does not support SPARQL UPDATE');\n }\n await accessor.executeSparqlUpdate(query, baseIri);\n if (baseIri) {\n const identifier = { path: baseIri };\n await this.refreshLocalRdfMirror(identifier);\n this.invalidateMetadataCache(identifier);\n }\n }\n\n private async executeLocalRdfSparqlUpdate(\n query: string,\n identifier: ResourceIdentifier,\n ): Promise<void> {\n const delta = this.rdfSparqlAdapter.compileUpdateDelta(query, identifier.path);\n this.assertLocalRdfDeltaTargetsGraph(delta.operations, identifier.path);\n const existingText = await this.readLocalRdfTextOrEmpty(identifier);\n const graph = DataFactory.namedNode(identifier.path);\n const existingQuads = existingText.length > 0\n ? await this.parseLocalRdf(identifier, existingText, this.localRdfContentType(identifier))\n .then((quads) => quads.map((quad) => this.toGraphQuad(quad, graph)))\n : [];\n const nextQuads = this.applyLocalRdfDelta(existingQuads, delta.operations);\n const authorityQuads = nextQuads.map((quad) => this.toDefaultGraphQuad(quad));\n await this.writeLocalRdfAuthority(identifier, authorityQuads);\n await this.writeStructuredRdfIndex(identifier, authorityQuads, new RepresentationMetadata(identifier));\n }\n\n private applyLocalRdfDelta(\n quads: Quad[],\n operations: RdfSparqlUpdateDeltaOperation[],\n ): Quad[] {\n const byKey = new Map(quads.map((quad) => [this.quadKey(quad), quad]));\n\n for (const operation of operations) {\n if (operation.type === 'insert') {\n for (const quad of operation.quads) {\n byKey.set(this.quadKey(quad), quad);\n }\n continue;\n }\n\n if (operation.type === 'delete') {\n for (const quad of operation.quads) {\n byKey.delete(this.quadKey(quad));\n }\n continue;\n }\n\n if (operation.type === 'insertDeleteWhere') {\n const rows = this.queryLocalUpdateBindings([...byKey.values()], operation.query);\n for (const quad of this.rdfSparqlAdapter.materializeDeleteWhere(operation.deletes, rows)) {\n byKey.delete(this.quadKey(quad));\n }\n for (const quad of this.rdfSparqlAdapter.materializeDeleteWhere(operation.inserts, rows)) {\n byKey.set(this.quadKey(quad), quad);\n }\n continue;\n }\n\n if (operation.type === 'insertWhere') {\n const rows = this.queryLocalUpdateBindings([...byKey.values()], operation.query);\n for (const quad of this.rdfSparqlAdapter.materializeDeleteWhere(operation.inserts, rows)) {\n byKey.set(this.quadKey(quad), quad);\n }\n continue;\n }\n\n const rows = this.queryLocalUpdateBindings([...byKey.values()], operation.query);\n for (const quad of this.rdfSparqlAdapter.materializeDeleteWhere(operation.template, rows)) {\n byKey.delete(this.quadKey(quad));\n }\n }\n\n return [...byKey.values()];\n }\n\n private assertLocalRdfDeltaTargetsGraph(\n operations: RdfSparqlUpdateDeltaOperation[],\n graphIri: string,\n ): void {\n for (const operation of operations) {\n const graphTerms = operation.type === 'deleteWhere'\n ? operation.template.map((item) => item.graph)\n : operation.type === 'insertDeleteWhere'\n ? [\n ...operation.deletes.map((item) => item.graph),\n ...operation.inserts.map((item) => item.graph),\n ...this.queryGraphTerms(operation.query),\n ]\n : operation.type === 'insertWhere'\n ? [\n ...operation.inserts.map((item) => item.graph),\n ...this.queryGraphTerms(operation.query),\n ]\n : operation.quads.map((quad) => quad.graph);\n for (const graph of graphTerms) {\n if (!('termType' in graph) || graph.termType !== 'NamedNode' || graph.value !== graphIri) {\n throw new UnsupportedSparqlQueryError('Embedded local RDF update only supports the target document graph');\n }\n }\n }\n }\n\n private queryLocalUpdateBindings(\n quads: Quad[],\n query: RdfLocalQuery,\n ): RdfBindingRow[] {\n const index = new RdfQuadIndex({ path: ':memory:' });\n index.open();\n try {\n const engine = new SolidRdfEngine({ index });\n engine.put(quads);\n return engine.query(query).bindings;\n } finally {\n index.close();\n }\n }\n\n private queryGraphTerms(query: RdfLocalQuery): RdfQueryTermPattern[] {\n const patterns: RdfQueryPattern[] = [...query.patterns];\n for (const optional of query.optional ?? []) {\n patterns.push(...(Array.isArray(optional) ? optional : optional.patterns));\n }\n for (const union of query.unions ?? []) {\n for (const branch of union.branches) {\n patterns.push(...branch.patterns);\n for (const optional of branch.optional ?? []) {\n patterns.push(...(Array.isArray(optional) ? optional : optional.patterns));\n }\n }\n }\n return patterns.flatMap((pattern) => pattern.graph ? [pattern.graph] : []);\n }\n\n private async readLocalRdfTextOrEmpty(identifier: ResourceIdentifier): Promise<string> {\n try {\n return await this.readStreamText(await this.rdfFileDataAccessor.getData(identifier));\n } catch (error) {\n if (NotFoundHttpError.isInstance(error)) {\n await this.refreshLocalRdfMirror(identifier);\n try {\n return await this.readStreamText(await this.rdfFileDataAccessor.getData(identifier));\n } catch (retryError) {\n if (NotFoundHttpError.isInstance(retryError)) {\n return '';\n }\n throw retryError;\n }\n }\n throw error;\n }\n }\n\n private async writeLocalRdfAuthority(identifier: ResourceIdentifier, quads: Quad[]): Promise<void> {\n await this.ensureRdfFileParentContainers(identifier);\n await this.rdfFileDataAccessor.writeDocument(\n identifier,\n guardStream(Readable.from([ await this.serializeQuadsForLocalFile(identifier, quads) ])),\n this.createLocalRdfMetadata(identifier, new RepresentationMetadata(identifier)),\n );\n }\n\n private toDefaultGraphQuad(quad: Quad): Quad {\n return DataFactory.quad(quad.subject, quad.predicate, quad.object);\n }\n\n private toGraphQuad(quad: Quad, graph: Term): Quad {\n return DataFactory.quad(quad.subject, quad.predicate, quad.object, graph as any) as Quad;\n }\n\n private quadKey(quad: Quad): string {\n return [quad.graph, quad.subject, quad.predicate, quad.object]\n .map((term) => termToId(term as any))\n .join('\\u001f');\n }\n\n /**\n * Rebuild the structured RDF index from an already-written local RDF file.\n *\n * SolidFS uses this after tools edit `.ttl`/`.jsonld` files directly. The\n * local file remains the content authority; the structured accessor is only\n * refreshed as query/index state.\n */\n public async syncLocalRdfDocument(\n identifier: ResourceIdentifier,\n data?: Guarded<Readable>,\n contentType?: string,\n options?: LocalRdfSyncOptions,\n ): Promise<void> {\n if (!this.isRdfDocumentIdentifier(identifier)) {\n throw new Error(`Cannot sync non RDF document into RDF index: ${identifier.path}`);\n }\n\n const source = data ?? await this.rdfFileDataAccessor.getData(identifier);\n const localContentType = contentType ?? this.localRdfContentType(identifier);\n const text = await this.readStreamText(source);\n if (data) {\n await this.ensureRdfFileParentContainers(identifier);\n await this.rdfFileDataAccessor.writeDocument(\n identifier,\n guardStream(Readable.from([ text ])),\n this.createLocalRdfMetadata(identifier, new RepresentationMetadata(identifier)),\n );\n }\n const quads = await this.parseLocalRdf(identifier, text, localContentType);\n await this.writeStructuredRdfIndex(identifier, quads, new RepresentationMetadata(identifier), {\n ...options,\n contentType: localContentType,\n });\n this.invalidateMetadataCache(identifier);\n }\n\n public async deleteLocalRdfIndex(identifier: ResourceIdentifier): Promise<void> {\n try {\n const sourceScopedAccessor = this.sourceScopedStructuredAccessor();\n if (sourceScopedAccessor) {\n await sourceScopedAccessor.deleteRdfSourceDocument(identifier);\n } else {\n await this.structuredDataAccessor.deleteResource(identifier);\n }\n this.invalidateMetadataCache(identifier);\n } catch (error) {\n if (!NotFoundHttpError.isInstance(error)) {\n throw error;\n }\n }\n }\n\n private async writeRdfDocument(\n identifier: ResourceIdentifier,\n data: Guarded<Readable>,\n metadata: RepresentationMetadata,\n ): Promise<void> {\n const quads = await arrayifyStream<Quad>(data);\n const structuredMetadata = new RepresentationMetadata(metadata);\n addResourceMetadata(structuredMetadata, false);\n updateModifiedDate(structuredMetadata);\n await this.ensureRdfFileParentContainers(identifier);\n\n await this.rdfFileDataAccessor.writeDocument(\n identifier,\n guardStream(Readable.from([ await this.serializeQuadsForLocalFile(identifier, quads) ])),\n this.createLocalRdfMetadata(identifier, metadata),\n );\n\n try {\n await this.writeStructuredRdfIndex(identifier, quads, structuredMetadata);\n } catch (error) {\n await this.deleteRdfFileResourceIfPresent(identifier);\n throw error;\n }\n }\n\n private async writeStructuredRdfIndex(\n identifier: ResourceIdentifier,\n quads: Quad[],\n metadata: RepresentationMetadata,\n options: LocalRdfSyncOptions & { contentType?: string } = {},\n ): Promise<void> {\n const structuredMetadata = new RepresentationMetadata(metadata);\n addResourceMetadata(structuredMetadata, false);\n updateModifiedDate(structuredMetadata);\n const sourceScopedAccessor = this.sourceScopedStructuredAccessor();\n if (sourceScopedAccessor) {\n await sourceScopedAccessor.writeRdfSourceDocument(\n identifier,\n quads,\n structuredMetadata,\n this.rdfSourceInput(identifier, options),\n );\n return;\n }\n\n await this.structuredDataAccessor.writeDocument(identifier, guardStream(Readable.from(quads)), structuredMetadata);\n }\n\n private async refreshLocalRdfMirror(identifier: ResourceIdentifier): Promise<void> {\n let metadata: RepresentationMetadata;\n let quads: Quad[];\n try {\n metadata = await this.structuredDataAccessor.getMetadata(identifier);\n if (!this.isLocalMirroredRdf(identifier, metadata)) {\n return;\n }\n quads = await arrayifyStream<Quad>(await this.structuredDataAccessor.getData(identifier));\n } catch (error) {\n if (NotFoundHttpError.isInstance(error)) {\n await this.deleteRdfFileResourceIfPresent(identifier);\n return;\n }\n throw error;\n }\n\n await this.ensureRdfFileParentContainers(identifier);\n await this.rdfFileDataAccessor.writeDocument(\n identifier,\n guardStream(Readable.from([ await this.serializeQuadsForLocalFile(identifier, quads) ])),\n this.createLocalRdfMetadata(identifier, metadata),\n );\n }\n\n private async getLocalRdfMetadata(\n identifier: ResourceIdentifier,\n sourceMetadata: RepresentationMetadata,\n ): Promise<RepresentationMetadata> {\n try {\n return await this.getExistingLocalRdfMetadata(identifier);\n } catch (error) {\n if (!NotFoundHttpError.isInstance(error)) {\n throw error;\n }\n return this.createLocalRdfMetadata(identifier, sourceMetadata);\n }\n }\n\n private async getExistingLocalRdfMetadata(identifier: ResourceIdentifier): Promise<RepresentationMetadata> {\n const metadata = await this.rdfFileDataAccessor.getMetadata(identifier);\n metadata.contentType = this.localRdfContentType(identifier);\n return metadata;\n }\n\n private createLocalRdfMetadata(\n identifier: ResourceIdentifier,\n metadata: RepresentationMetadata,\n ): RepresentationMetadata {\n const localMetadata = new RepresentationMetadata(metadata);\n localMetadata.contentType = this.localRdfContentType(identifier);\n return localMetadata;\n }\n\n private localRdfContentType(identifier: ResourceIdentifier): string {\n return rdfContentTypeForPath(identifier.path) ?? 'text/turtle';\n }\n\n private sourceScopedStructuredAccessor(): SourceScopedStructuredRdfAccessor | undefined {\n const accessor = this.structuredDataAccessor as Partial<SourceScopedStructuredRdfAccessor>;\n if (\n typeof accessor.writeRdfSourceDocument === 'function'\n && typeof accessor.deleteRdfSourceDocument === 'function'\n ) {\n return accessor as SourceScopedStructuredRdfAccessor;\n }\n return undefined;\n }\n\n private rdfSourceInput(\n identifier: ResourceIdentifier,\n options: LocalRdfSyncOptions & { contentType?: string },\n ): RdfSourceInput {\n const workspace = options.workspace ?? this.parentContainer(identifier).path;\n return {\n source: options.source ?? identifier.path,\n workspace,\n localPath: options.localPath ?? this.relativePathFromWorkspace(identifier.path, workspace),\n contentType: options.contentType ?? this.localRdfContentType(identifier),\n sourceVersion: options.sourceVersion,\n };\n }\n\n private relativePathFromWorkspace(identifierPath: string, workspaceValue: string): string | undefined {\n try {\n const resource = new URL(identifierPath);\n const workspace = new URL(workspaceValue.endsWith('/') ? workspaceValue : `${workspaceValue}/`);\n if (resource.origin !== workspace.origin || !resource.pathname.startsWith(workspace.pathname)) {\n return undefined;\n }\n return decodeURIComponent(resource.pathname.slice(workspace.pathname.length));\n } catch {\n return undefined;\n }\n }\n\n private isByLineRdfIdentifier(identifier: ResourceIdentifier): boolean {\n return isLineAddressableRdfPath(identifier.path);\n }\n\n private isRdfDocumentIdentifier(identifier: ResourceIdentifier): boolean {\n return isRdfDocumentPath(identifier.path);\n }\n\n private isLocalMirroredRdf(\n identifier: ResourceIdentifier,\n metadata: RepresentationMetadata,\n ): boolean {\n return metadata.contentType === INTERNAL_QUADS || this.isRdfDocumentIdentifier(identifier);\n }\n\n private async serializeQuadsForLocalFile(identifier: ResourceIdentifier, quads: Quad[]): Promise<string> {\n if (this.localRdfContentType(identifier) === 'application/ld+json') {\n const nquads = await this.serializeNQuads(quads);\n const document = await jsonld.fromRDF(nquads, { format: 'application/n-quads' });\n return `${JSON.stringify(document, null, 2)}\\n`;\n }\n\n if (this.localRdfContentType(identifier) === 'application/rdf+xml') {\n return serializeRdfXml(quads);\n }\n\n const writer = new Writer({ format: this.localRdfContentType(identifier) });\n return writer.quadsToString(quads);\n }\n\n private async serializeNQuads(quads: Quad[]): Promise<string> {\n return new Promise((resolve, reject) => {\n const writer = new Writer({ format: 'application/n-quads' });\n writer.addQuads(quads);\n writer.end((error, result) => {\n if (error) {\n reject(error);\n return;\n }\n resolve(result);\n });\n });\n }\n\n private async parseLocalRdf(\n identifier: ResourceIdentifier,\n text: string,\n contentType: string,\n ): Promise<Quad[]> {\n if (contentType === 'application/ld+json') {\n const nquads = await jsonld.toRDF(JSON.parse(text), {\n base: identifier.path,\n format: 'application/n-quads',\n }) as string;\n return new Parser({ format: 'application/n-quads', baseIRI: identifier.path }).parse(nquads);\n }\n\n if (contentType === 'application/rdf+xml') {\n return arrayifyStream<Quad>(rdfParser.parse(Readable.from([ text ]), {\n contentType,\n baseIRI: identifier.path,\n }) as any);\n }\n\n return new Parser({ format: contentType, baseIRI: identifier.path }).parse(text);\n }\n\n private async readStreamText(data: Guarded<Readable>): Promise<string> {\n const chunks = await arrayifyStream(data as any);\n return chunks\n .map((chunk: Buffer | Uint8Array | string) => typeof chunk === 'string' ? chunk : Buffer.from(chunk).toString('utf8'))\n .join('');\n }\n\n /**\n * Write unstructured document: store data in unstructured accessor,\n * then save metadata in structured accessor.\n */\n private async writeUnstructuredDocument(\n identifier: ResourceIdentifier,\n data: Guarded<Readable>,\n metadata: RepresentationMetadata,\n ): Promise<void> {\n // Write the actual data to unstructured storage\n await this.unstructuredDataAccessor.writeDocument(identifier, data, metadata);\n \n let updatedMetadata: RepresentationMetadata;\n if (typeof metadata.contentLength === 'number') {\n updatedMetadata = new RepresentationMetadata(metadata);\n updatedMetadata.add(\n POSIX.terms.size,\n toLiteral(metadata.contentLength, XSD.terms.integer),\n SOLID_META.terms.ResponseMetadata,\n );\n } else {\n updatedMetadata = await this.unstructuredDataAccessor.getMetadata(identifier);\n\n const removing: Quad[] = [];\n for (const quad of updatedMetadata.quads()) {\n if (!/^http/.test(quad.predicate.value)) {\n removing.push(quad);\n }\n }\n updatedMetadata.removeQuads(removing);\n }\n \n // Save metadata to structured storage\n try {\n await this.structuredDataAccessor.writeMetadata(identifier, updatedMetadata);\n } catch (error) {\n this.logger.error(`Error writing metadata for ${identifier.path}: ${error}`);\n // Rollback: delete the unstructured data\n await this.unstructuredDataAccessor.deleteResource(identifier);\n throw error;\n }\n }\n\n private async deleteUnstructuredResourceIfPresent(identifier: ResourceIdentifier): Promise<void> {\n try {\n await this.unstructuredDataAccessor.deleteResource(identifier);\n } catch (error: any) {\n if (error?.code !== 'ENOENT' && error?.code !== 'ENOTDIR' && !NotFoundHttpError.isInstance(error)) {\n throw error;\n }\n }\n }\n\n private async deleteRdfFileResourceIfPresent(identifier: ResourceIdentifier): Promise<void> {\n try {\n await this.rdfFileDataAccessor.deleteResource(identifier);\n } catch (error: any) {\n if (error?.code !== 'ENOENT' && error?.code !== 'ENOTDIR' && !NotFoundHttpError.isInstance(error)) {\n throw error;\n }\n }\n }\n\n private async ensureUnstructuredParentContainers(identifier: ResourceIdentifier): Promise<void> {\n await this.ensureParentContainers(identifier, this.unstructuredDataAccessor);\n }\n\n private async ensureRdfFileParentContainers(identifier: ResourceIdentifier): Promise<void> {\n await this.ensureParentContainers(identifier, this.rdfFileDataAccessor);\n }\n\n private async ensureParentContainers(identifier: ResourceIdentifier, accessor: DataAccessor): Promise<void> {\n const containers: ResourceIdentifier[] = [];\n let current = this.parentContainer(identifier);\n\n while (!this.sameIdentifier(current, identifier)) {\n containers.push(current);\n const next = this.parentContainer(current);\n if (this.sameIdentifier(next, current)) {\n break;\n }\n current = next;\n }\n\n for (const container of containers.reverse()) {\n await this.writeContainerIfMissing(accessor, container);\n }\n }\n\n private async writeContainerIfMissing(accessor: DataAccessor, identifier: ResourceIdentifier): Promise<void> {\n try {\n await accessor.getMetadata(identifier);\n return;\n } catch (error) {\n if (!NotFoundHttpError.isInstance(error)) {\n throw error;\n }\n }\n\n await accessor.writeContainer(identifier, new RepresentationMetadata(identifier));\n }\n\n private sameIdentifier(left: ResourceIdentifier, right: ResourceIdentifier): boolean {\n return left.path === right.path;\n }\n\n private parentContainer(identifier: ResourceIdentifier): ResourceIdentifier {\n try {\n const url = new URL(identifier.path);\n if (url.pathname === '/' || url.pathname === '') {\n return { path: url.href.endsWith('/') ? url.href : `${url.href}/` };\n }\n const segments = url.pathname.replace(/\\/+$/u, '').split('/');\n segments.pop();\n url.pathname = `${segments.join('/') || '/'}`.replace(/\\/?$/u, '/');\n url.search = '';\n url.hash = '';\n return { path: url.href };\n } catch {\n const trimmed = identifier.path.replace(/\\/+$/u, '');\n const slashIndex = trimmed.lastIndexOf('/');\n if (slashIndex < 0) {\n return identifier;\n }\n return { path: `${trimmed.slice(0, slashIndex + 1)}` };\n }\n }\n\n private invalidateMetadataCache(identifier: ResourceIdentifier): void {\n const cache = metadataRequestContext.getStore()?.metadataCache;\n if (!cache) {\n return;\n }\n\n const exact = identifier.path;\n const trimmed = exact.endsWith('/') ? exact.replace(/\\/+$/u, '') : exact;\n const withSlash = exact.endsWith('/') ? exact : `${exact}/`;\n cache.delete(exact);\n cache.delete(trimmed);\n cache.delete(withSlash);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"MixDataAccessor.js","sourceRoot":"","sources":["../../../src/storage/accessors/MixDataAccessor.ts"],"names":[],"mappings":"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","sourcesContent":["import { Readable } from 'stream';\nimport { getLoggerFor } from 'global-logger-factory';\nimport arrayifyStream from 'arrayify-stream';\nimport { DataFactory, Parser, Writer, termToId } from 'n3';\nimport jsonld from 'jsonld';\nimport { rdfParser } from 'rdf-parse';\n\nimport type { Quad, Term } from '@rdfjs/types';\nimport {\n isContainerIdentifier,\n RepresentationMetadata,\n INTERNAL_QUADS,\n FoundHttpError,\n NotFoundHttpError,\n POSIX,\n SOLID_META,\n XSD,\n toLiteral,\n guardStream,\n addResourceMetadata,\n updateModifiedDate,\n} from '@solid/community-server';\nimport type {\n Representation,\n ResourceIdentifier,\n Guarded,\n DataAccessor,\n} from '@solid/community-server';\nimport {\n RdfSparqlAdapter,\n UnsupportedSparqlQueryError,\n type RdfSparqlUpdateDeltaOperation,\n} from '../rdf/RdfSparqlAdapter';\nimport {\n isLineAddressableRdfPath,\n isRdfDocumentPath,\n rdfContentTypeForPath,\n} from '../rdf/RdfContentTypes';\nimport { RdfQuadIndex } from '../rdf/RdfQuadIndex';\nimport { serializeRdfXml } from '../rdf/RdfXmlSerializer';\nimport { SolidRdfEngine } from '../rdf/SolidRdfEngine';\nimport type {\n RdfBindingRow,\n RdfLocalQuery,\n RdfQueryPattern,\n RdfQueryTermPattern,\n RdfSourceInput,\n} from '../rdf/types';\nimport { metadataRequestContext } from '../MetadataRequestContext';\n\nexport interface LocalRdfDocument {\n data: Guarded<Readable>;\n metadata: RepresentationMetadata;\n}\n\nexport interface LocalRdfReadableAccessor {\n getLocalRdfDocument(identifier: ResourceIdentifier): Promise<LocalRdfDocument>;\n}\n\nexport interface LocalRdfIndexAccessor {\n syncLocalRdfDocument(\n identifier: ResourceIdentifier,\n data?: Guarded<Readable>,\n contentType?: string,\n options?: LocalRdfSyncOptions,\n ): Promise<void>;\n deleteLocalRdfIndex(identifier: ResourceIdentifier): Promise<void>;\n}\n\nexport interface LocalRdfSyncOptions {\n source?: string;\n workspace?: string;\n localPath?: string;\n sourceVersion?: string;\n}\n\nexport interface SourceScopedStructuredRdfAccessor {\n writeRdfSourceDocument(\n identifier: ResourceIdentifier,\n quads: Quad[],\n metadata: RepresentationMetadata,\n source: RdfSourceInput,\n ): Promise<void>;\n deleteRdfSourceDocument(identifier: ResourceIdentifier): Promise<void>;\n}\n\n/**\n * MixDataAccessor - Routes data to appropriate storage based on content type\n * \n * - RDF data (internal/quads) -> structuredDataAccessor (Quadstore or QuintStore)\n * - RDF file mirrors (.ttl/.jsonld) -> rdfFileDataAccessor (local FileSystem)\n * - Other data (binary, text, etc.) -> unstructuredDataAccessor (FileSystem, Minio, etc.)\n * \n * This uses composition instead of inheritance, allowing any DataAccessor\n * to be used as the RDF storage backend.\n */\nexport class MixDataAccessor implements DataAccessor {\n protected readonly logger = getLoggerFor(this);\n private readonly rdfSparqlAdapter = new RdfSparqlAdapter();\n \n private readonly structuredDataAccessor: DataAccessor;\n private readonly unstructuredDataAccessor: DataAccessor;\n private readonly rdfFileDataAccessor: DataAccessor;\n private readonly presignedRedirectEnabled: boolean;\n private readonly mirrorContainersToUnstructured: boolean;\n\n constructor(\n structuredDataAccessor: DataAccessor,\n unstructuredDataAccessor: DataAccessor,\n presignedRedirectEnabled = false,\n mirrorContainersToUnstructured = true,\n rdfFileDataAccessor: DataAccessor = unstructuredDataAccessor,\n ) {\n this.structuredDataAccessor = structuredDataAccessor;\n this.unstructuredDataAccessor = unstructuredDataAccessor;\n this.rdfFileDataAccessor = rdfFileDataAccessor;\n this.presignedRedirectEnabled = presignedRedirectEnabled;\n this.mirrorContainersToUnstructured = mirrorContainersToUnstructured;\n }\n\n /**\n * This accessor supports all types of data.\n */\n public async canHandle(representation: Representation): Promise<void> {\n return void 0;\n }\n\n /**\n * Checks if the given representation is unstructured (non-RDF).\n */\n private isUnstructured(metadata: RepresentationMetadata): boolean {\n return metadata.contentType !== INTERNAL_QUADS;\n }\n\n public async getData(identifier: ResourceIdentifier): Promise<Guarded<Readable>> {\n const metadata = await this.getMetadata(identifier);\n if (this.isUnstructured(metadata)) {\n // When presigned redirect is enabled and the unstructured accessor supports it,\n // generate a presigned URL and throw FoundHttpError to trigger a 302 redirect.\n if (this.presignedRedirectEnabled) {\n const accessor = this.unstructuredDataAccessor as { getPresignedUrl?: (id: ResourceIdentifier, expires?: number) => Promise<string> };\n if (typeof accessor.getPresignedUrl === 'function') {\n const presignedUrl = await accessor.getPresignedUrl(identifier);\n this.logger.debug(`Presigned redirect: ${identifier.path}`);\n throw new FoundHttpError(presignedUrl);\n }\n }\n return await this.unstructuredDataAccessor.getData(identifier);\n }\n return await this.structuredDataAccessor.getData(identifier);\n }\n\n /**\n * Read the local RDF file mirror used by SolidFS/local-first HTTP reads.\n *\n * `getData()` intentionally keeps returning the structured quad stream for\n * CSS internals. This method is the explicit file-content path for callers\n * that need a real Turtle/JSON-LD byte stream.\n */\n public async getLocalRdfDocument(identifier: ResourceIdentifier): Promise<LocalRdfDocument> {\n if (isContainerIdentifier(identifier)) {\n throw new NotFoundHttpError();\n }\n\n if (this.isByLineRdfIdentifier(identifier)) {\n try {\n return {\n data: await this.rdfFileDataAccessor.getData(identifier),\n metadata: await this.getExistingLocalRdfMetadata(identifier),\n };\n } catch (error) {\n if (!NotFoundHttpError.isInstance(error)) {\n throw error;\n }\n }\n }\n\n const metadata = await this.getMetadata(identifier);\n if (!this.isLocalMirroredRdf(identifier, metadata)) {\n throw new NotFoundHttpError();\n }\n\n try {\n return {\n data: await this.rdfFileDataAccessor.getData(identifier),\n metadata: await this.getLocalRdfMetadata(identifier, metadata),\n };\n } catch (error) {\n if (!NotFoundHttpError.isInstance(error)) {\n throw error;\n }\n }\n\n await this.refreshLocalRdfMirror(identifier);\n\n return {\n data: await this.rdfFileDataAccessor.getData(identifier),\n metadata: await this.getLocalRdfMetadata(identifier, metadata),\n };\n }\n\n public async getMetadata(identifier: ResourceIdentifier): Promise<RepresentationMetadata> {\n const cache = metadataRequestContext.getStore()?.metadataCache;\n const cacheKey = identifier.path;\n const cached = cache?.get(cacheKey);\n if (cached) {\n if (cached.kind === 'miss') {\n throw new NotFoundHttpError();\n }\n return new RepresentationMetadata(cached.metadata);\n }\n\n try {\n const metadata = await this.structuredDataAccessor.getMetadata(identifier);\n\n if (!metadata.contentType) {\n metadata.contentType = INTERNAL_QUADS;\n }\n\n cache?.set(cacheKey, { kind: 'hit', metadata: new RepresentationMetadata(metadata) });\n return metadata;\n } catch (error) {\n if (NotFoundHttpError.isInstance(error)) {\n cache?.set(cacheKey, { kind: 'miss' });\n }\n throw error;\n }\n }\n\n public async* getChildren(identifier: ResourceIdentifier): AsyncIterableIterator<RepresentationMetadata> {\n // Children metadata is stored in the structured accessor\n yield* this.structuredDataAccessor.getChildren(identifier);\n }\n\n public async writeContainer(\n identifier: ResourceIdentifier,\n metadata: RepresentationMetadata,\n ): Promise<void> {\n if (this.mirrorContainersToUnstructured && this.isUnstructured(metadata)) {\n await this.unstructuredDataAccessor.writeContainer(identifier, metadata);\n }\n await this.structuredDataAccessor.writeContainer(identifier, metadata);\n this.invalidateMetadataCache(identifier);\n }\n\n public async writeDocument(\n identifier: ResourceIdentifier,\n data: Guarded<Readable>,\n metadata: RepresentationMetadata,\n ): Promise<void> {\n if (this.isUnstructured(metadata)) {\n await this.writeUnstructuredDocument(identifier, data, metadata);\n this.invalidateMetadataCache(identifier);\n return;\n }\n await this.writeRdfDocument(identifier, data, metadata);\n this.invalidateMetadataCache(identifier);\n }\n\n public async writeMetadata(identifier: ResourceIdentifier, metadata: RepresentationMetadata): Promise<void> {\n // Metadata always goes to structured storage\n await this.structuredDataAccessor.writeMetadata(identifier, metadata);\n this.invalidateMetadataCache(identifier);\n }\n\n public async deleteResource(identifier: ResourceIdentifier): Promise<void> {\n const metadata = await this.getMetadata(identifier);\n \n // RDF by-line resources are mirrored to local file storage so shell tools\n // can operate on real files; remove that mirror together with the index.\n if (this.isLocalMirroredRdf(identifier, metadata)) {\n await this.deleteRdfFileResourceIfPresent(identifier);\n } else if (this.isUnstructured(metadata)) {\n await this.deleteUnstructuredResourceIfPresent(identifier);\n }\n \n // Always delete from structured storage (contains metadata)\n await this.structuredDataAccessor.deleteResource(identifier);\n this.invalidateMetadataCache(identifier);\n }\n\n /**\n * Execute SPARQL UPDATE.\n *\n * Supported embedded deltas patch the local RDF authority file first and then\n * rebuild the structured RDF index. Unsupported shapes keep using the\n * compatibility accessor until the embedded engine covers them.\n */\n public async executeSparqlUpdate(query: string, baseIri?: string): Promise<void> {\n if (baseIri) {\n const identifier = { path: baseIri };\n if (this.isByLineRdfIdentifier(identifier)) {\n try {\n await this.executeLocalRdfSparqlUpdate(query, identifier);\n this.invalidateMetadataCache(identifier);\n return;\n } catch (error) {\n if (!(error instanceof UnsupportedSparqlQueryError)) {\n throw error;\n }\n }\n }\n }\n\n const accessor = this.structuredDataAccessor as { executeSparqlUpdate?: (query: string, baseIri?: string) => Promise<void> };\n if (typeof accessor.executeSparqlUpdate !== 'function') {\n throw new Error('Structured data accessor does not support SPARQL UPDATE');\n }\n await accessor.executeSparqlUpdate(query, baseIri);\n if (baseIri) {\n const identifier = { path: baseIri };\n await this.refreshLocalRdfMirror(identifier);\n this.invalidateMetadataCache(identifier);\n }\n }\n\n private async executeLocalRdfSparqlUpdate(\n query: string,\n identifier: ResourceIdentifier,\n ): Promise<void> {\n const delta = this.rdfSparqlAdapter.compileUpdateDelta(query, identifier.path);\n this.assertLocalRdfDeltaTargetsGraph(delta.operations, identifier.path);\n const existingText = await this.readLocalRdfTextOrEmpty(identifier);\n const graph = DataFactory.namedNode(identifier.path);\n const existingQuads = existingText.length > 0\n ? await this.parseLocalRdf(identifier, existingText, this.localRdfContentType(identifier))\n .then((quads) => quads.map((quad) => this.toGraphQuad(quad, graph)))\n : [];\n const nextQuads = this.applyLocalRdfDelta(existingQuads, delta.operations);\n const authorityQuads = nextQuads.map((quad) => this.toDefaultGraphQuad(quad));\n await this.writeLocalRdfAuthority(identifier, authorityQuads);\n await this.writeStructuredRdfIndex(identifier, authorityQuads, new RepresentationMetadata(identifier));\n }\n\n private applyLocalRdfDelta(\n quads: Quad[],\n operations: RdfSparqlUpdateDeltaOperation[],\n ): Quad[] {\n const byKey = new Map(quads.map((quad) => [this.quadKey(quad), quad]));\n\n for (const operation of operations) {\n if (operation.type === 'insert') {\n for (const quad of operation.quads) {\n byKey.set(this.quadKey(quad), quad);\n }\n continue;\n }\n\n if (operation.type === 'delete') {\n for (const quad of operation.quads) {\n byKey.delete(this.quadKey(quad));\n }\n continue;\n }\n\n if (operation.type === 'insertDeleteWhere') {\n const rows = this.queryLocalUpdateBindings([...byKey.values()], operation.query);\n for (const quad of this.rdfSparqlAdapter.materializeDeleteWhere(operation.deletes, rows)) {\n byKey.delete(this.quadKey(quad));\n }\n for (const quad of this.rdfSparqlAdapter.materializeDeleteWhere(operation.inserts, rows)) {\n byKey.set(this.quadKey(quad), quad);\n }\n continue;\n }\n\n if (operation.type === 'insertWhere') {\n const rows = this.queryLocalUpdateBindings([...byKey.values()], operation.query);\n for (const quad of this.rdfSparqlAdapter.materializeDeleteWhere(operation.inserts, rows)) {\n byKey.set(this.quadKey(quad), quad);\n }\n continue;\n }\n\n const rows = this.queryLocalUpdateBindings([...byKey.values()], operation.query);\n for (const quad of this.rdfSparqlAdapter.materializeDeleteWhere(operation.template, rows)) {\n byKey.delete(this.quadKey(quad));\n }\n }\n\n return [...byKey.values()];\n }\n\n private assertLocalRdfDeltaTargetsGraph(\n operations: RdfSparqlUpdateDeltaOperation[],\n graphIri: string,\n ): void {\n for (const operation of operations) {\n const graphTerms = operation.type === 'deleteWhere'\n ? operation.template.map((item) => item.graph)\n : operation.type === 'insertDeleteWhere'\n ? [\n ...operation.deletes.map((item) => item.graph),\n ...operation.inserts.map((item) => item.graph),\n ...this.queryGraphTerms(operation.query),\n ]\n : operation.type === 'insertWhere'\n ? [\n ...operation.inserts.map((item) => item.graph),\n ...this.queryGraphTerms(operation.query),\n ]\n : operation.quads.map((quad) => quad.graph);\n for (const graph of graphTerms) {\n if (!('termType' in graph) || graph.termType !== 'NamedNode' || graph.value !== graphIri) {\n throw new UnsupportedSparqlQueryError('Embedded local RDF update only supports the target document graph');\n }\n }\n }\n }\n\n private queryLocalUpdateBindings(\n quads: Quad[],\n query: RdfLocalQuery,\n ): RdfBindingRow[] {\n const index = new RdfQuadIndex({ path: ':memory:' });\n index.open();\n try {\n const engine = new SolidRdfEngine({ index });\n engine.put(quads);\n return engine.query(query).bindings;\n } finally {\n index.close();\n }\n }\n\n private queryGraphTerms(query: RdfLocalQuery): RdfQueryTermPattern[] {\n const patterns: RdfQueryPattern[] = [...query.patterns];\n for (const optional of query.optional ?? []) {\n patterns.push(...(Array.isArray(optional) ? optional : optional.patterns));\n }\n for (const union of query.unions ?? []) {\n for (const branch of union.branches) {\n patterns.push(...branch.patterns);\n for (const optional of branch.optional ?? []) {\n patterns.push(...(Array.isArray(optional) ? optional : optional.patterns));\n }\n }\n }\n return patterns.flatMap((pattern) => pattern.graph ? [pattern.graph] : []);\n }\n\n private async readLocalRdfTextOrEmpty(identifier: ResourceIdentifier): Promise<string> {\n try {\n return await this.readStreamText(await this.rdfFileDataAccessor.getData(identifier));\n } catch (error) {\n if (NotFoundHttpError.isInstance(error)) {\n await this.refreshLocalRdfMirror(identifier);\n try {\n return await this.readStreamText(await this.rdfFileDataAccessor.getData(identifier));\n } catch (retryError) {\n if (NotFoundHttpError.isInstance(retryError)) {\n return '';\n }\n throw retryError;\n }\n }\n throw error;\n }\n }\n\n private async writeLocalRdfAuthority(identifier: ResourceIdentifier, quads: Quad[]): Promise<void> {\n await this.ensureRdfFileParentContainers(identifier);\n await this.rdfFileDataAccessor.writeDocument(\n identifier,\n guardStream(Readable.from([ await this.serializeQuadsForLocalFile(identifier, quads) ])),\n this.createLocalRdfMetadata(identifier, new RepresentationMetadata(identifier)),\n );\n }\n\n private toDefaultGraphQuad(quad: Quad): Quad {\n return DataFactory.quad(quad.subject, quad.predicate, quad.object);\n }\n\n private toGraphQuad(quad: Quad, graph: Term): Quad {\n return DataFactory.quad(quad.subject, quad.predicate, quad.object, graph as any) as Quad;\n }\n\n private quadKey(quad: Quad): string {\n return [quad.graph, quad.subject, quad.predicate, quad.object]\n .map((term) => termToId(term as any))\n .join('\\u001f');\n }\n\n /**\n * Rebuild the structured RDF index from an already-written local RDF file.\n *\n * SolidFS uses this after tools edit `.ttl`/`.jsonld` files directly. The\n * local file remains the content authority; the structured accessor is only\n * refreshed as query/index state.\n */\n public async syncLocalRdfDocument(\n identifier: ResourceIdentifier,\n data?: Guarded<Readable>,\n contentType?: string,\n options?: LocalRdfSyncOptions,\n ): Promise<void> {\n if (!this.isRdfDocumentIdentifier(identifier)) {\n throw new Error(`Cannot sync non RDF document into RDF index: ${identifier.path}`);\n }\n\n const source = data ?? await this.rdfFileDataAccessor.getData(identifier);\n const localContentType = contentType ?? this.localRdfContentType(identifier);\n const text = await this.readStreamText(source);\n if (data) {\n await this.ensureRdfFileParentContainers(identifier);\n await this.rdfFileDataAccessor.writeDocument(\n identifier,\n guardStream(Readable.from([ text ])),\n this.createLocalRdfMetadata(identifier, new RepresentationMetadata(identifier)),\n );\n }\n const quads = await this.parseLocalRdf(identifier, text, localContentType);\n await this.writeStructuredRdfIndex(identifier, quads, new RepresentationMetadata(identifier), {\n ...options,\n contentType: localContentType,\n });\n this.invalidateMetadataCache(identifier);\n }\n\n public async deleteLocalRdfIndex(identifier: ResourceIdentifier): Promise<void> {\n try {\n const sourceScopedAccessor = this.sourceScopedStructuredAccessor();\n if (sourceScopedAccessor) {\n await sourceScopedAccessor.deleteRdfSourceDocument(identifier);\n } else {\n await this.structuredDataAccessor.deleteResource(identifier);\n }\n this.invalidateMetadataCache(identifier);\n } catch (error) {\n if (!NotFoundHttpError.isInstance(error)) {\n throw error;\n }\n }\n }\n\n private async writeRdfDocument(\n identifier: ResourceIdentifier,\n data: Guarded<Readable>,\n metadata: RepresentationMetadata,\n ): Promise<void> {\n const quads = await arrayifyStream<Quad>(data);\n const structuredMetadata = new RepresentationMetadata(metadata);\n addResourceMetadata(structuredMetadata, false);\n updateModifiedDate(structuredMetadata);\n await this.ensureRdfFileParentContainers(identifier);\n\n await this.rdfFileDataAccessor.writeDocument(\n identifier,\n guardStream(Readable.from([ await this.serializeQuadsForLocalFile(identifier, quads) ])),\n this.createLocalRdfMetadata(identifier, metadata),\n );\n\n try {\n await this.writeStructuredRdfIndex(identifier, quads, structuredMetadata);\n } catch (error) {\n await this.deleteRdfFileResourceIfPresent(identifier);\n throw error;\n }\n }\n\n private async writeStructuredRdfIndex(\n identifier: ResourceIdentifier,\n quads: Quad[],\n metadata: RepresentationMetadata,\n options: LocalRdfSyncOptions & { contentType?: string } = {},\n ): Promise<void> {\n const structuredMetadata = new RepresentationMetadata(metadata);\n addResourceMetadata(structuredMetadata, false);\n updateModifiedDate(structuredMetadata);\n const sourceScopedAccessor = this.sourceScopedStructuredAccessor();\n if (sourceScopedAccessor) {\n await sourceScopedAccessor.writeRdfSourceDocument(\n identifier,\n quads,\n structuredMetadata,\n this.rdfSourceInput(identifier, options),\n );\n return;\n }\n\n await this.structuredDataAccessor.writeDocument(identifier, guardStream(Readable.from(quads)), structuredMetadata);\n }\n\n private async refreshLocalRdfMirror(identifier: ResourceIdentifier): Promise<void> {\n let metadata: RepresentationMetadata;\n let quads: Quad[];\n try {\n metadata = await this.structuredDataAccessor.getMetadata(identifier);\n if (!this.isLocalMirroredRdf(identifier, metadata)) {\n return;\n }\n quads = await arrayifyStream<Quad>(await this.structuredDataAccessor.getData(identifier));\n } catch (error) {\n if (NotFoundHttpError.isInstance(error)) {\n await this.deleteRdfFileResourceIfPresent(identifier);\n return;\n }\n throw error;\n }\n\n await this.ensureRdfFileParentContainers(identifier);\n await this.rdfFileDataAccessor.writeDocument(\n identifier,\n guardStream(Readable.from([ await this.serializeQuadsForLocalFile(identifier, quads) ])),\n this.createLocalRdfMetadata(identifier, metadata),\n );\n }\n\n private async getLocalRdfMetadata(\n identifier: ResourceIdentifier,\n sourceMetadata: RepresentationMetadata,\n ): Promise<RepresentationMetadata> {\n try {\n return await this.getExistingLocalRdfMetadata(identifier);\n } catch (error) {\n if (!NotFoundHttpError.isInstance(error)) {\n throw error;\n }\n return this.createLocalRdfMetadata(identifier, sourceMetadata);\n }\n }\n\n private async getExistingLocalRdfMetadata(identifier: ResourceIdentifier): Promise<RepresentationMetadata> {\n const metadata = await this.rdfFileDataAccessor.getMetadata(identifier);\n metadata.contentType = this.localRdfContentType(identifier);\n return metadata;\n }\n\n private createLocalRdfMetadata(\n identifier: ResourceIdentifier,\n metadata: RepresentationMetadata,\n ): RepresentationMetadata {\n const localMetadata = new RepresentationMetadata(metadata);\n const graphScopedQuads = localMetadata.quads()\n .filter((quad) => quad.graph.termType !== 'DefaultGraph');\n localMetadata.removeQuads(graphScopedQuads);\n localMetadata.contentType = this.localRdfContentType(identifier);\n return localMetadata;\n }\n\n private localRdfContentType(identifier: ResourceIdentifier): string {\n return rdfContentTypeForPath(identifier.path) ?? 'text/turtle';\n }\n\n private sourceScopedStructuredAccessor(): SourceScopedStructuredRdfAccessor | undefined {\n const accessor = this.structuredDataAccessor as Partial<SourceScopedStructuredRdfAccessor>;\n if (\n typeof accessor.writeRdfSourceDocument === 'function'\n && typeof accessor.deleteRdfSourceDocument === 'function'\n ) {\n return accessor as SourceScopedStructuredRdfAccessor;\n }\n return undefined;\n }\n\n private rdfSourceInput(\n identifier: ResourceIdentifier,\n options: LocalRdfSyncOptions & { contentType?: string },\n ): RdfSourceInput {\n const workspace = options.workspace ?? this.parentContainer(identifier).path;\n return {\n source: options.source ?? identifier.path,\n workspace,\n localPath: options.localPath ?? this.relativePathFromWorkspace(identifier.path, workspace),\n contentType: options.contentType ?? this.localRdfContentType(identifier),\n sourceVersion: options.sourceVersion,\n };\n }\n\n private relativePathFromWorkspace(identifierPath: string, workspaceValue: string): string | undefined {\n try {\n const resource = new URL(identifierPath);\n const workspace = new URL(workspaceValue.endsWith('/') ? workspaceValue : `${workspaceValue}/`);\n if (resource.origin !== workspace.origin || !resource.pathname.startsWith(workspace.pathname)) {\n return undefined;\n }\n return decodeURIComponent(resource.pathname.slice(workspace.pathname.length));\n } catch {\n return undefined;\n }\n }\n\n private isByLineRdfIdentifier(identifier: ResourceIdentifier): boolean {\n return isLineAddressableRdfPath(identifier.path);\n }\n\n private isRdfDocumentIdentifier(identifier: ResourceIdentifier): boolean {\n return isRdfDocumentPath(identifier.path);\n }\n\n private isLocalMirroredRdf(\n identifier: ResourceIdentifier,\n metadata: RepresentationMetadata,\n ): boolean {\n return metadata.contentType === INTERNAL_QUADS || this.isRdfDocumentIdentifier(identifier);\n }\n\n private async serializeQuadsForLocalFile(identifier: ResourceIdentifier, quads: Quad[]): Promise<string> {\n if (this.localRdfContentType(identifier) === 'application/ld+json') {\n const nquads = await this.serializeNQuads(quads);\n const document = await jsonld.fromRDF(nquads, { format: 'application/n-quads' });\n return `${JSON.stringify(document, null, 2)}\\n`;\n }\n\n if (this.localRdfContentType(identifier) === 'application/rdf+xml') {\n return serializeRdfXml(quads);\n }\n\n const writer = new Writer({ format: this.localRdfContentType(identifier) });\n return writer.quadsToString(quads);\n }\n\n private async serializeNQuads(quads: Quad[]): Promise<string> {\n return new Promise((resolve, reject) => {\n const writer = new Writer({ format: 'application/n-quads' });\n writer.addQuads(quads);\n writer.end((error, result) => {\n if (error) {\n reject(error);\n return;\n }\n resolve(result);\n });\n });\n }\n\n private async parseLocalRdf(\n identifier: ResourceIdentifier,\n text: string,\n contentType: string,\n ): Promise<Quad[]> {\n if (contentType === 'application/ld+json') {\n const nquads = await jsonld.toRDF(JSON.parse(text), {\n base: identifier.path,\n format: 'application/n-quads',\n }) as string;\n return new Parser({ format: 'application/n-quads', baseIRI: identifier.path }).parse(nquads);\n }\n\n if (contentType === 'application/rdf+xml') {\n return arrayifyStream<Quad>(rdfParser.parse(Readable.from([ text ]), {\n contentType,\n baseIRI: identifier.path,\n }) as any);\n }\n\n return new Parser({ format: contentType, baseIRI: identifier.path }).parse(text);\n }\n\n private async readStreamText(data: Guarded<Readable>): Promise<string> {\n const chunks = await arrayifyStream(data as any);\n return chunks\n .map((chunk: Buffer | Uint8Array | string) => typeof chunk === 'string' ? chunk : Buffer.from(chunk).toString('utf8'))\n .join('');\n }\n\n /**\n * Write unstructured document: store data in unstructured accessor,\n * then save metadata in structured accessor.\n */\n private async writeUnstructuredDocument(\n identifier: ResourceIdentifier,\n data: Guarded<Readable>,\n metadata: RepresentationMetadata,\n ): Promise<void> {\n // Write the actual data to unstructured storage\n await this.unstructuredDataAccessor.writeDocument(identifier, data, metadata);\n \n let updatedMetadata: RepresentationMetadata;\n if (typeof metadata.contentLength === 'number') {\n updatedMetadata = new RepresentationMetadata(metadata);\n updatedMetadata.add(\n POSIX.terms.size,\n toLiteral(metadata.contentLength, XSD.terms.integer),\n SOLID_META.terms.ResponseMetadata,\n );\n } else {\n updatedMetadata = await this.unstructuredDataAccessor.getMetadata(identifier);\n\n const removing: Quad[] = [];\n for (const quad of updatedMetadata.quads()) {\n if (!/^http/.test(quad.predicate.value)) {\n removing.push(quad);\n }\n }\n updatedMetadata.removeQuads(removing);\n }\n \n // Save metadata to structured storage\n try {\n await this.structuredDataAccessor.writeMetadata(identifier, updatedMetadata);\n } catch (error) {\n this.logger.error(`Error writing metadata for ${identifier.path}: ${error}`);\n // Rollback: delete the unstructured data\n await this.unstructuredDataAccessor.deleteResource(identifier);\n throw error;\n }\n }\n\n private async deleteUnstructuredResourceIfPresent(identifier: ResourceIdentifier): Promise<void> {\n try {\n await this.unstructuredDataAccessor.deleteResource(identifier);\n } catch (error: any) {\n if (error?.code !== 'ENOENT' && error?.code !== 'ENOTDIR' && !NotFoundHttpError.isInstance(error)) {\n throw error;\n }\n }\n }\n\n private async deleteRdfFileResourceIfPresent(identifier: ResourceIdentifier): Promise<void> {\n try {\n await this.rdfFileDataAccessor.deleteResource(identifier);\n } catch (error: any) {\n if (error?.code !== 'ENOENT' && error?.code !== 'ENOTDIR' && !NotFoundHttpError.isInstance(error)) {\n throw error;\n }\n }\n }\n\n private async ensureUnstructuredParentContainers(identifier: ResourceIdentifier): Promise<void> {\n await this.ensureParentContainers(identifier, this.unstructuredDataAccessor);\n }\n\n private async ensureRdfFileParentContainers(identifier: ResourceIdentifier): Promise<void> {\n await this.ensureParentContainers(identifier, this.rdfFileDataAccessor);\n }\n\n private async ensureParentContainers(identifier: ResourceIdentifier, accessor: DataAccessor): Promise<void> {\n const containers: ResourceIdentifier[] = [];\n let current = this.parentContainer(identifier);\n\n while (!this.sameIdentifier(current, identifier)) {\n containers.push(current);\n const next = this.parentContainer(current);\n if (this.sameIdentifier(next, current)) {\n break;\n }\n current = next;\n }\n\n for (const container of containers.reverse()) {\n await this.writeContainerIfMissing(accessor, container);\n }\n }\n\n private async writeContainerIfMissing(accessor: DataAccessor, identifier: ResourceIdentifier): Promise<void> {\n try {\n await accessor.getMetadata(identifier);\n return;\n } catch (error) {\n if (!NotFoundHttpError.isInstance(error)) {\n throw error;\n }\n }\n\n await accessor.writeContainer(identifier, new RepresentationMetadata(identifier));\n }\n\n private sameIdentifier(left: ResourceIdentifier, right: ResourceIdentifier): boolean {\n return left.path === right.path;\n }\n\n private parentContainer(identifier: ResourceIdentifier): ResourceIdentifier {\n try {\n const url = new URL(identifier.path);\n if (url.pathname === '/' || url.pathname === '') {\n return { path: url.href.endsWith('/') ? url.href : `${url.href}/` };\n }\n const segments = url.pathname.replace(/\\/+$/u, '').split('/');\n segments.pop();\n url.pathname = `${segments.join('/') || '/'}`.replace(/\\/?$/u, '/');\n url.search = '';\n url.hash = '';\n return { path: url.href };\n } catch {\n const trimmed = identifier.path.replace(/\\/+$/u, '');\n const slashIndex = trimmed.lastIndexOf('/');\n if (slashIndex < 0) {\n return identifier;\n }\n return { path: `${trimmed.slice(0, slashIndex + 1)}` };\n }\n }\n\n private invalidateMetadataCache(identifier: ResourceIdentifier): void {\n const cache = metadataRequestContext.getStore()?.metadataCache;\n if (!cache) {\n return;\n }\n\n const exact = identifier.path;\n const trimmed = exact.endsWith('/') ? exact.replace(/\\/+$/u, '') : exact;\n const withSlash = exact.endsWith('/') ? exact : `${exact}/`;\n cache.delete(exact);\n cache.delete(trimmed);\n cache.delete(withSlash);\n }\n}\n"]}
|
|
@@ -55,8 +55,33 @@ export declare class SqliteQuintStore {
|
|
|
55
55
|
private estimatePageSize;
|
|
56
56
|
clear(): Promise<void>;
|
|
57
57
|
private ensureOpen;
|
|
58
|
-
private
|
|
58
|
+
private ensureTypedObjectSchema;
|
|
59
|
+
private addColumnIfMissing;
|
|
60
|
+
private backfillMissingObjectIndexFields;
|
|
61
|
+
private buildSelectQuery;
|
|
62
|
+
private buildWhereClause;
|
|
63
|
+
private addTermConditions;
|
|
64
|
+
private serializeOpValue;
|
|
65
|
+
private addObjectConditions;
|
|
66
|
+
private addObjectExactCondition;
|
|
67
|
+
private addObjectExactValueCondition;
|
|
68
|
+
private addObjectExactSerializedCondition;
|
|
69
|
+
private addObjectComparableCondition;
|
|
70
|
+
private addObjectTextCondition;
|
|
71
|
+
private addObjectLexicalStringCondition;
|
|
72
|
+
private addObjectLanguageCondition;
|
|
59
73
|
private objectLexicalSql;
|
|
74
|
+
private objectPredicateForOperatorValue;
|
|
75
|
+
private objectFieldsForOperatorValue;
|
|
76
|
+
private objectIndexForTerm;
|
|
77
|
+
private objectIndexForSerialized;
|
|
78
|
+
private objectFieldsForPrefix;
|
|
79
|
+
private objectDigestForIndex;
|
|
80
|
+
private assertComparableObject;
|
|
81
|
+
private extractExactPredicate;
|
|
82
|
+
private resolveObjectDataTypeForPattern;
|
|
83
|
+
private predicateForIndex;
|
|
84
|
+
private writeStatementForRow;
|
|
60
85
|
private quintToRow;
|
|
61
86
|
private rowToQuint;
|
|
62
87
|
}
|