@undefineds.co/xpod 0.3.33 → 0.3.35

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.
@@ -15,6 +15,7 @@ export declare class SparqlUpdateResourceStore extends DataAccessorBasedStore {
15
15
  private readonly generator;
16
16
  private readonly parser;
17
17
  private readonly localFirstRdfRepresentationResolver;
18
+ private readonly metadataAuxiliaryStrategy;
18
19
  protected readonly logger: import("global-logger-factory").Logger<unknown>;
19
20
  constructor(options: SparqlUpdateResourceStoreOptions);
20
21
  getRepresentation(identifier: ResourceIdentifier): Promise<Representation>;
@@ -18,6 +18,7 @@ class SparqlUpdateResourceStore extends community_server_1.DataAccessorBasedStor
18
18
  this.generator = new sparqljs_1.Generator();
19
19
  this.parser = new sparqljs_1.Parser();
20
20
  this.logger = (0, global_logger_factory_1.getLoggerFor)(this);
21
+ this.metadataAuxiliaryStrategy = options.metadataStrategy;
21
22
  this.localFirstRdfRepresentationResolver = options.localFirstRdfRepresentationResolver ??
22
23
  new LocalFirstRdfRepresentationResolver_1.LocalFirstRdfRepresentationResolver({
23
24
  accessor: options.accessor,
@@ -56,6 +57,10 @@ class SparqlUpdateResourceStore extends community_server_1.DataAccessorBasedStor
56
57
  }
57
58
  this.validateConditions(conditions, metadata);
58
59
  }
60
+ if (this.metadataAuxiliaryStrategy.isAuxiliaryIdentifier(identifier)) {
61
+ this.logger.debug(`Metadata PATCH for ${identifier.path} falls back to CSS metadata patcher`);
62
+ throw new community_server_1.NotImplementedHttpError('Metadata resources must be patched by the CSS metadata patcher');
63
+ }
59
64
  const sparqlUpdate = await this.toSparqlUpdate(patch, identifier);
60
65
  if (!sparqlUpdate) {
61
66
  this.logger.debug(`toSparqlUpdate returned undefined for ${identifier.path}, falling back to CSS handler`);
@@ -1 +1 @@
1
- {"version":3,"file":"SparqlUpdateResourceStore.js","sourceRoot":"","sources":["../../src/storage/SparqlUpdateResourceStore.ts"],"names":[],"mappings":"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","sourcesContent":["import { DataFactory } from 'n3';\nimport { Generator as SparqlGenerator, Parser as SparqlParser, type GraphQuads, type UpdateOperation, type Update as SparqlUpdate } from 'sparqljs';\nimport {\n DataAccessorBasedStore,\n type ChangeMap,\n type ResourceIdentifier,\n type Patch,\n NotImplementedHttpError,\n type Conditions,\n NotFoundHttpError,\n RepresentationMetadata,\n AS,\n SOLID_AS,\n BadRequestHttpError,\n ForbiddenHttpError,\n HttpError,\n type DataAccessor,\n type IdentifierStrategy,\n type AuxiliaryStrategy,\n type Representation,\n} from '@solid/community-server';\nimport type { SparqlUpdatePatch } from '@solid/community-server';\nimport { readableToString } from '@solid/community-server/dist/util/StreamUtil';\nimport { getLoggerFor } from 'global-logger-factory';\nimport {\n LocalFirstRdfRepresentationResolver,\n type LocalFirstRdfRepresentationResolverLike,\n} from '../solidfs/LocalFirstRdfRepresentationResolver';\nimport { DisabledSparqlFeatureError, UnsupportedSparqlQueryError } from './rdf/RdfSparqlAdapter';\n\nexport interface SparqlUpdateResourceStoreOptions {\n accessor: DataAccessor;\n identifierStrategy: IdentifierStrategy;\n auxiliaryStrategy: AuxiliaryStrategy;\n metadataStrategy: AuxiliaryStrategy;\n localFirstRdfRepresentationResolver?: LocalFirstRdfRepresentationResolverLike;\n}\n\n/**\n * ResourceStore that short-circuits PATCH into direct SPARQL UPDATE\n * when the underlying DataAccessor supports it.\n */\nexport class SparqlUpdateResourceStore extends DataAccessorBasedStore {\n private readonly generator = new SparqlGenerator();\n private readonly parser = new SparqlParser();\n private readonly localFirstRdfRepresentationResolver: LocalFirstRdfRepresentationResolverLike;\n protected override readonly logger = getLoggerFor(this);\n\n public constructor(options: SparqlUpdateResourceStoreOptions) {\n super(options.accessor, options.identifierStrategy, options.auxiliaryStrategy, options.metadataStrategy);\n this.localFirstRdfRepresentationResolver = options.localFirstRdfRepresentationResolver ??\n new LocalFirstRdfRepresentationResolver({\n accessor: options.accessor,\n metadataStrategy: options.metadataStrategy,\n });\n // Check if identifierStrategy has baseUrl property (SingleRootIdentifierStrategy)\n const strategy = options.identifierStrategy as unknown as { baseUrl?: string };\n this.logger.info(`SparqlUpdateResourceStore initialized with identifierStrategy: ${options.identifierStrategy.constructor.name}, baseUrl: ${strategy.baseUrl ?? 'N/A'}`);\n }\n\n public override async getRepresentation(identifier: ResourceIdentifier): Promise<Representation> {\n const localRepresentation = await this.localFirstRdfRepresentationResolver.resolve(identifier);\n if (localRepresentation) {\n return localRepresentation;\n }\n\n return super.getRepresentation(identifier);\n }\n\n // @ts-expect-error Upstream signature returns never; we return ChangeMap for successful PATCH.\n public override async modifyResource(identifier: ResourceIdentifier, patch: Patch, conditions?: Conditions): Promise<ChangeMap> {\n this.logger.debug(`SparqlUpdateResourceStore.modifyResource called for ${identifier.path}`);\n this.logger.debug(`Patch has algebra: ${typeof (patch as SparqlUpdatePatch).algebra === 'object'}, metadata.contentType: ${patch.metadata?.contentType}`);\n\n const accessor = (this as unknown as { accessor: unknown }).accessor as unknown;\n if (!this.isSparqlCapable(accessor)) {\n this.logger.debug('Accessor is not SPARQL capable');\n throw new NotImplementedHttpError('SPARQL UPDATE not supported by this accessor');\n }\n\n // Keep the default condition validation semantics\n if (conditions) {\n let metadata: RepresentationMetadata | undefined;\n try {\n metadata = await accessor.getMetadata(identifier);\n } catch (error: unknown) {\n if (!NotFoundHttpError.isInstance(error)) {\n throw error;\n }\n }\n this.validateConditions(conditions, metadata);\n }\n\n const sparqlUpdate = await this.toSparqlUpdate(patch, identifier);\n if (!sparqlUpdate) {\n this.logger.debug(`toSparqlUpdate returned undefined for ${identifier.path}, falling back to CSS handler`);\n throw new NotImplementedHttpError('Unsupported PATCH payload for SPARQL conversion');\n }\n\n this.logger.debug(`Applying SPARQL PATCH to ${identifier.path}: ${sparqlUpdate}`);\n try {\n await accessor.executeSparqlUpdate(sparqlUpdate, identifier.path);\n } catch (error: unknown) {\n if (error instanceof DisabledSparqlFeatureError) {\n throw new ForbiddenHttpError(error.message, { cause: error });\n }\n if (error instanceof UnsupportedSparqlQueryError) {\n throw new BadRequestHttpError(error.message, { cause: error });\n }\n throw error;\n }\n\n // PATCH does not affect containment; mark the target resource as updated.\n const changes = new Map() as ChangeMap;\n changes.set(identifier, new RepresentationMetadata(identifier, { [SOLID_AS.activity]: AS.terms.Update }));\n return changes;\n }\n\n /**\n * 只处理 SPARQL UPDATE (application/sparql-update)。\n * N3 Patch 和其他类型返回 undefined,让 CSS PatchingStore 回退到 get-patch-set 逻辑。\n */\n private async toSparqlUpdate(patch: Patch, identifier: ResourceIdentifier): Promise<string | undefined> {\n // 只处理 SPARQL UPDATE,其他类型(包括 N3 Patch)回退到 CSS 默认处理\n if (!this.isSparqlUpdatePatch(patch)) {\n return undefined;\n }\n\n const updateText = await readableToString(patch.data);\n return this.normalizeGraphs(updateText, identifier);\n }\n\n /**\n * Ensure SPARQL UPDATE targets the resource graph (CSS stores documents in named graphs).\n */\n private normalizeGraphs(updateText: string, identifier: ResourceIdentifier): string | undefined {\n const graph = DataFactory.namedNode(identifier.path);\n const identifierStrategy = (this as unknown as { identifierStrategy: { supportsIdentifier: (id: ResourceIdentifier) => boolean }}).identifierStrategy;\n\n const assertGraphAllowed = (value: unknown): void => {\n if (!value || typeof value !== 'object') {\n return;\n }\n const term = value as { termType?: string; value?: string };\n if (term.termType === 'NamedNode' && term.value && !identifierStrategy.supportsIdentifier({ path: term.value })) {\n throw new BadRequestHttpError(`GRAPH ${term.value} is outside the configured identifier space.`);\n }\n };\n const wrapDefaultGraph = (text: string): string => {\n const insert = /INSERT\\s+DATA\\s*{\\s*([^}]*)}/is;\n const del = /DELETE\\s+DATA\\s*{\\s*([^}]*)}/is;\n const rewrite = (regex: RegExp, label: string, input: string): string =>\n input.replace(regex, (_match, body) => `${label} { GRAPH <${graph.value}> { ${body} } }`);\n let out = text;\n if (insert.test(out)) {\n out = rewrite(insert, 'INSERT DATA', out);\n }\n if (del.test(out)) {\n out = rewrite(del, 'DELETE DATA', out);\n }\n return out;\n };\n\n const rewriteTriples = (triples?: any[], targetGraph = graph): any[] => {\n if (!triples) return [];\n return triples.map((triple: any): any => ({\n ...triple,\n graph: (!triple.graph || triple.graph.termType === 'DefaultGraph') ? targetGraph : triple.graph,\n }));\n };\n\n const triplesFromTemplateBlock = (item: any): any[] => {\n if (Array.isArray(item?.triples)) {\n return item.triples;\n }\n if (!Array.isArray(item?.patterns)) {\n return [];\n }\n return item.patterns.flatMap((pattern: any): any[] =>\n pattern?.type === 'bgp' && Array.isArray(pattern.triples) ? pattern.triples : []);\n };\n\n const rewriteQuadBlocks = (items?: any[]): any[] | undefined => {\n if (!items) return items;\n return items.flatMap((item: any): any[] => {\n if (item?.type === 'graph') {\n assertGraphAllowed(item.name);\n const targetGraph = item.name ?? graph;\n return [{\n ...item,\n name: targetGraph,\n triples: rewriteTriples(triplesFromTemplateBlock(item), targetGraph),\n patterns: undefined,\n }];\n }\n if (item?.type === 'bgp') {\n return [{\n type: 'graph',\n name: graph,\n triples: rewriteTriples(item.triples, graph),\n }];\n }\n return [{\n type: 'graph',\n name: graph,\n triples: rewriteTriples([ item ], graph),\n }];\n });\n };\n\n const rewritePattern = (pattern: any): any => {\n if (pattern.type === 'bgp') {\n return { ...pattern, triples: rewriteTriples(pattern.triples, graph) };\n }\n if (pattern.type === 'graph') {\n assertGraphAllowed(pattern.name);\n return {\n ...pattern,\n name: pattern.name ?? graph,\n patterns: pattern.patterns?.map(rewritePattern) ?? [],\n };\n }\n if (pattern.type === 'group') {\n return { ...pattern, patterns: pattern.patterns?.map(rewritePattern) ?? [] };\n }\n if (pattern.type === 'optional') {\n return { ...pattern, patterns: pattern.patterns?.map(rewritePattern) ?? [] };\n }\n if (pattern.type === 'union') {\n return { ...pattern, patterns: pattern.patterns?.map(rewritePattern) ?? [] };\n }\n if (pattern.type === 'minus') {\n return { ...pattern, patterns: pattern.patterns?.map(rewritePattern) ?? [] };\n }\n if (pattern.type === 'filter') {\n return pattern; // FILTER doesn't contain triples, pass through\n }\n if (pattern.type === 'bind') {\n return pattern; // BIND doesn't contain triples, pass through\n }\n if (pattern.type === 'values') {\n return pattern; // VALUES doesn't contain triples, pass through\n }\n if (pattern.type === 'service') {\n return { ...pattern, patterns: pattern.patterns?.map(rewritePattern) ?? [] };\n }\n return pattern;\n };\n\n const rewriteWherePatterns = (patterns?: any[]): any[] =>\n (patterns ?? []).map((pattern: any): any => {\n if (pattern?.type === 'bgp') {\n return {\n type: 'graph',\n name: graph,\n patterns: [{\n ...pattern,\n triples: rewriteTriples(pattern.triples, graph),\n }],\n };\n }\n return rewritePattern(pattern);\n });\n\n const toGraphQuads = (items?: any[]): GraphQuads[] | undefined =>\n rewriteQuadBlocks(items) as GraphQuads[] | undefined;\n\n try {\n const parsed = this.parser.parse(updateText) as unknown as SparqlUpdate;\n\n // Explicitly reject SPARQL Queries (SELECT, ASK, CONSTRUCT) in PATCH\n if ((parsed as any).type === 'query') {\n this.logger.warn(`Received SPARQL Query in PATCH request for ${identifier.path}. SPARQL PATCH only supports UPDATE operations.`);\n return undefined;\n }\n\n const collect = (ops: any[], key: 'delete' | 'insert'): any[] =>\n ops.flatMap((op): any[] => {\n const entries = op[key];\n if (!entries) return [];\n if (Array.isArray(entries)) {\n return entries.flatMap((entry: any): any[] => {\n if (entry?.type === 'graph') {\n assertGraphAllowed(entry.name);\n return (entry.triples ?? []).map((triple: any): any => ({\n ...triple,\n graph: entry.name ?? graph,\n }));\n }\n return entry.triples ? entry.triples : (entry.quads ?? []);\n });\n }\n return [];\n });\n const deleteTriples = collect(parsed.updates as any[], 'delete');\n const insertTriples = collect(parsed.updates as any[], 'insert');\n const hasVariables = [...deleteTriples, ...insertTriples].some((t: any): boolean =>\n t.subject?.termType === 'Variable' || t.predicate?.termType === 'Variable' || t.object?.termType === 'Variable');\n\n const simpleOps = parsed.updates.every((op: any): boolean =>\n [ 'delete', 'insert', 'insertdelete', 'deleteinsert' ].includes(op.updateType) &&\n (!op.where || op.where.length === 0) &&\n !hasVariables);\n\n this.logger.debug(`[normalizeGraphs] simpleOps=${simpleOps}, hasVariables=${hasVariables}, deleteTriples=${deleteTriples.length}, insertTriples=${insertTriples.length}`);\n this.logger.debug(`[normalizeGraphs] updateTypes: ${parsed.updates.map((op: any) => op.updateType).join(', ')}`);\n\n if (simpleOps && deleteTriples.length + insertTriples.length > 0) {\n const termToString = (term: any): string => {\n if (term.termType === 'NamedNode') {\n return `<${term.value}>`;\n }\n if (term.termType === 'Literal') {\n // Escape special characters in literal values\n const hasQuotes = term.value.includes('\"');\n const hasNewlines = term.value.includes('\\n') || term.value.includes('\\r');\n\n let escaped: string;\n let useTripleQuotes = false;\n\n if (hasQuotes || hasNewlines) {\n // Use triple-quoted strings for values with quotes or newlines\n useTripleQuotes = true;\n escaped = term.value;\n // Escape triple-quote sequences\n escaped = escaped.replace(/\"\"\"/g, '\"\\\\\"\\\\\"\"');\n // Escape trailing quotes to avoid \"\"\"content\"\"\"\" sequences\n if (escaped.endsWith('\"')) {\n const match = escaped.match(/\"*$/);\n const trailingQuotes = match ? match[0].length : 0;\n if (trailingQuotes > 0) {\n escaped = escaped.slice(0, -trailingQuotes) + '\\\\\"'.repeat(trailingQuotes);\n }\n }\n } else {\n // Regular escaping for simple strings\n escaped = term.value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n }\n\n const quote = useTripleQuotes ? '\"\"\"' : '\"';\n\n // Handle language tags and datatypes\n if (term.language) {\n return `${quote}${escaped}${quote}@${term.language}`;\n }\n if (term.datatype && term.datatype.value !== 'http://www.w3.org/2001/XMLSchema#string') {\n return `${quote}${escaped}${quote}^^<${term.datatype.value}>`;\n }\n return `${quote}${escaped}${quote}`;\n }\n if (term.termType === 'BlankNode') {\n return `_:${term.value}`;\n }\n // Fallback for unknown term types\n return `<${term.value}>`;\n };\n const toTripleStr = (triples: any[]): string =>\n triples.map((t): string => `${termToString(t.subject)} ${termToString(t.predicate)} ${termToString(t.object)} .`).join(' ');\n let parts: string[] = [];\n if (deleteTriples.length > 0) {\n parts.push(`DELETE DATA { GRAPH <${graph.value}> { ${toTripleStr(deleteTriples)} } }`);\n }\n if (insertTriples.length > 0) {\n parts.push(`INSERT DATA { GRAPH <${graph.value}> { ${toTripleStr(insertTriples)} } }`);\n }\n const normalizedSimple = parts.join(';\\n');\n this.logger.verbose(`Normalized SPARQL UPDATE for ${identifier.path}: ${normalizedSimple}`);\n return normalizedSimple;\n }\n\n parsed.updates = parsed.updates.map((op: any): UpdateOperation => {\n switch (op.updateType) {\n case 'deletewhere':\n return {\n ...op,\n delete: toGraphQuads(op.delete),\n };\n case 'deleteinsert':\n case 'insertdelete':\n return {\n ...op,\n delete: toGraphQuads(op.delete),\n insert: toGraphQuads(op.insert),\n where: rewriteWherePatterns(op.where),\n };\n case 'delete':\n return {\n ...op,\n delete: toGraphQuads(op.delete),\n };\n case 'insert':\n return {\n ...op,\n insert: toGraphQuads(op.insert),\n };\n default:\n return op;\n }\n });\n const normalized = this.generator.stringify(parsed);\n this.logger.verbose(`Normalized SPARQL UPDATE for ${identifier.path}: ${normalized}`);\n return normalized;\n } catch (error: unknown) {\n if (HttpError.isInstance(error)) {\n throw error;\n }\n this.logger.debug(`Could not parse SPARQL UPDATE for ${identifier.path}; applying default graph text fallback: ${error}`);\n const fallbackResult = wrapDefaultGraph(updateText);\n return fallbackResult;\n }\n }\n\n private isSparqlUpdatePatch(patch: Patch): patch is SparqlUpdatePatch {\n return typeof (patch as SparqlUpdatePatch).algebra === 'object';\n }\n\n private isSparqlCapable(accessor: unknown): accessor is {\n executeSparqlUpdate: (query: string, baseIri?: string) => Promise<void>;\n getMetadata: (identifier: ResourceIdentifier) => Promise<RepresentationMetadata>;\n } {\n return typeof accessor === 'object' &&\n accessor !== null &&\n typeof (accessor as { executeSparqlUpdate?: unknown }).executeSparqlUpdate === 'function' &&\n typeof (accessor as { getMetadata?: unknown }).getMetadata === 'function';\n }\n\n public override async setRepresentation(identifier: ResourceIdentifier, representation: Representation, conditions?: Conditions): Promise<ChangeMap> {\n return super.setRepresentation(identifier, representation, conditions);\n }\n}\n"]}
1
+ {"version":3,"file":"SparqlUpdateResourceStore.js","sourceRoot":"","sources":["../../src/storage/SparqlUpdateResourceStore.ts"],"names":[],"mappings":";;;AAAA,2BAAiC;AACjC,uCAAoJ;AACpJ,8DAkBiC;AAEjC,6EAAgF;AAChF,iEAAqD;AACrD,wGAGwD;AACxD,6DAAiG;AAUjG;;;GAGG;AACH,MAAa,yBAA0B,SAAQ,yCAAsB;IAOnE,YAAmB,OAAyC;QAC1D,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,kBAAkB,EAAE,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAP1F,cAAS,GAAG,IAAI,oBAAe,EAAE,CAAC;QAClC,WAAM,GAAG,IAAI,iBAAY,EAAE,CAAC;QAGjB,WAAM,GAAG,IAAA,oCAAY,EAAC,IAAI,CAAC,CAAC;QAItD,IAAI,CAAC,yBAAyB,GAAG,OAAO,CAAC,gBAAgB,CAAC;QAC1D,IAAI,CAAC,mCAAmC,GAAG,OAAO,CAAC,mCAAmC;YACpF,IAAI,yEAAmC,CAAC;gBACtC,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;aAC3C,CAAC,CAAC;QACL,kFAAkF;QAClF,MAAM,QAAQ,GAAG,OAAO,CAAC,kBAAqD,CAAC;QAC/E,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kEAAkE,OAAO,CAAC,kBAAkB,CAAC,WAAW,CAAC,IAAI,cAAc,QAAQ,CAAC,OAAO,IAAI,KAAK,EAAE,CAAC,CAAC;IAC3K,CAAC;IAEe,KAAK,CAAC,iBAAiB,CAAC,UAA8B;QACpE,MAAM,mBAAmB,GAAG,MAAM,IAAI,CAAC,mCAAmC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC/F,IAAI,mBAAmB,EAAE,CAAC;YACxB,OAAO,mBAAmB,CAAC;QAC7B,CAAC;QAED,OAAO,KAAK,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAC7C,CAAC;IAED,+FAA+F;IAC/E,KAAK,CAAC,cAAc,CAAC,UAA8B,EAAE,KAAY,EAAE,UAAuB;QACxG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,uDAAuD,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5F,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,OAAQ,KAA2B,CAAC,OAAO,KAAK,QAAQ,2BAA2B,KAAK,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;QAE1J,MAAM,QAAQ,GAAI,IAAyC,CAAC,QAAmB,CAAC;QAChF,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;YACpD,MAAM,IAAI,0CAAuB,CAAC,8CAA8C,CAAC,CAAC;QACpF,CAAC;QAED,kDAAkD;QAClD,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,QAA4C,CAAC;YACjD,IAAI,CAAC;gBACH,QAAQ,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;YACpD,CAAC;YAAC,OAAO,KAAc,EAAE,CAAC;gBACxB,IAAI,CAAC,oCAAiB,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;oBACzC,MAAM,KAAK,CAAC;gBACd,CAAC;YACH,CAAC;YACD,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAChD,CAAC;QAED,IAAI,IAAI,CAAC,yBAAyB,CAAC,qBAAqB,CAAC,UAAU,CAAC,EAAE,CAAC;YACrE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,UAAU,CAAC,IAAI,qCAAqC,CAAC,CAAC;YAC9F,MAAM,IAAI,0CAAuB,CAAC,gEAAgE,CAAC,CAAC;QACtG,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QAClE,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,yCAAyC,UAAU,CAAC,IAAI,+BAA+B,CAAC,CAAC;YAC3G,MAAM,IAAI,0CAAuB,CAAC,iDAAiD,CAAC,CAAC;QACvF,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,UAAU,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC,CAAC;QAClF,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,mBAAmB,CAAC,YAAY,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;QACpE,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,IAAI,KAAK,YAAY,6CAA0B,EAAE,CAAC;gBAChD,MAAM,IAAI,qCAAkB,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;YAChE,CAAC;YACD,IAAI,KAAK,YAAY,8CAA2B,EAAE,CAAC;gBACjD,MAAM,IAAI,sCAAmB,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;YACjE,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QAED,0EAA0E;QAC1E,MAAM,OAAO,GAAG,IAAI,GAAG,EAAe,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,yCAAsB,CAAC,UAAU,EAAE,EAAE,CAAC,2BAAQ,CAAC,QAAQ,CAAC,EAAE,qBAAE,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC1G,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,cAAc,CAAC,KAAY,EAAE,UAA8B;QACvE,kDAAkD;QAClD,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;YACrC,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,IAAA,6BAAgB,EAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IACtD,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,UAAkB,EAAE,UAA8B;QACxE,MAAM,KAAK,GAAG,gBAAW,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,kBAAkB,GAAI,IAAsG,CAAC,kBAAkB,CAAC;QAEtJ,MAAM,kBAAkB,GAAG,CAAC,KAAc,EAAQ,EAAE;YAClD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACxC,OAAO;YACT,CAAC;YACD,MAAM,IAAI,GAAG,KAA8C,CAAC;YAC5D,IAAI,IAAI,CAAC,QAAQ,KAAK,WAAW,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;gBAChH,MAAM,IAAI,sCAAmB,CAAC,SAAS,IAAI,CAAC,KAAK,8CAA8C,CAAC,CAAC;YACnG,CAAC;QACH,CAAC,CAAC;QACF,MAAM,gBAAgB,GAAG,CAAC,IAAY,EAAU,EAAE;YAChD,MAAM,MAAM,GAAG,gCAAgC,CAAC;YAChD,MAAM,GAAG,GAAG,gCAAgC,CAAC;YAC7C,MAAM,OAAO,GAAG,CAAC,KAAa,EAAE,KAAa,EAAE,KAAa,EAAU,EAAE,CACtE,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,KAAK,aAAa,KAAK,CAAC,KAAK,OAAO,IAAI,MAAM,CAAC,CAAC;YAC5F,IAAI,GAAG,GAAG,IAAI,CAAC;YACf,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrB,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC;YAC5C,CAAC;YACD,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBAClB,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC;YACzC,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC,CAAC;QAEF,MAAM,cAAc,GAAG,CAAC,OAAe,EAAE,WAAW,GAAG,KAAK,EAAS,EAAE;YACrE,IAAI,CAAC,OAAO;gBAAE,OAAO,EAAE,CAAC;YACxB,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAW,EAAO,EAAE,CAAC,CAAC;gBACxC,GAAG,MAAM;gBACT,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,KAAK,cAAc,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK;aAChG,CAAC,CAAC,CAAC;QACN,CAAC,CAAC;QAEF,MAAM,wBAAwB,GAAG,CAAC,IAAS,EAAS,EAAE;YACpD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;gBACjC,OAAO,IAAI,CAAC,OAAO,CAAC;YACtB,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC;gBACnC,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAY,EAAS,EAAE,CACnD,OAAO,EAAE,IAAI,KAAK,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACtF,CAAC,CAAC;QAEF,MAAM,iBAAiB,GAAG,CAAC,KAAa,EAAqB,EAAE;YAC7D,IAAI,CAAC,KAAK;gBAAE,OAAO,KAAK,CAAC;YACzB,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,IAAS,EAAS,EAAE;gBACxC,IAAI,IAAI,EAAE,IAAI,KAAK,OAAO,EAAE,CAAC;oBAC3B,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC9B,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC;oBACvC,OAAO,CAAC;4BACN,GAAG,IAAI;4BACP,IAAI,EAAE,WAAW;4BACjB,OAAO,EAAE,cAAc,CAAC,wBAAwB,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC;4BACpE,QAAQ,EAAE,SAAS;yBACpB,CAAC,CAAC;gBACL,CAAC;gBACD,IAAI,IAAI,EAAE,IAAI,KAAK,KAAK,EAAE,CAAC;oBACzB,OAAO,CAAC;4BACN,IAAI,EAAE,OAAO;4BACb,IAAI,EAAE,KAAK;4BACX,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC;yBAC7C,CAAC,CAAC;gBACL,CAAC;gBACD,OAAO,CAAC;wBACN,IAAI,EAAE,OAAO;wBACb,IAAI,EAAE,KAAK;wBACX,OAAO,EAAE,cAAc,CAAC,CAAE,IAAI,CAAE,EAAE,KAAK,CAAC;qBACzC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,MAAM,cAAc,GAAG,CAAC,OAAY,EAAO,EAAE;YAC3C,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;gBAC3B,OAAO,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,cAAc,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC;YACzE,CAAC;YACD,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC7B,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACjC,OAAO;oBACL,GAAG,OAAO;oBACV,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,KAAK;oBAC3B,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE;iBACtD,CAAC;YACJ,CAAC;YACD,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC7B,OAAO,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,EAAE,CAAC;YAC/E,CAAC;YACD,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBAChC,OAAO,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,EAAE,CAAC;YAC/E,CAAC;YACD,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC7B,OAAO,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,EAAE,CAAC;YAC/E,CAAC;YACD,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC7B,OAAO,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,EAAE,CAAC;YAC/E,CAAC;YACD,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC9B,OAAO,OAAO,CAAC,CAAC,+CAA+C;YACjE,CAAC;YACD,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC5B,OAAO,OAAO,CAAC,CAAC,6CAA6C;YAC/D,CAAC;YACD,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC9B,OAAO,OAAO,CAAC,CAAC,+CAA+C;YACjE,CAAC;YACD,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC/B,OAAO,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,EAAE,CAAC;YAC/E,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC;QAEF,MAAM,oBAAoB,GAAG,CAAC,QAAgB,EAAS,EAAE,CACvD,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,OAAY,EAAO,EAAE;YACzC,IAAI,OAAO,EAAE,IAAI,KAAK,KAAK,EAAE,CAAC;gBAC5B,OAAO;oBACL,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,KAAK;oBACX,QAAQ,EAAE,CAAC;4BACT,GAAG,OAAO;4BACV,OAAO,EAAE,cAAc,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC;yBAChD,CAAC;iBACH,CAAC;YACJ,CAAC;YACD,OAAO,cAAc,CAAC,OAAO,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QAEL,MAAM,YAAY,GAAG,CAAC,KAAa,EAA4B,EAAE,CAC/D,iBAAiB,CAAC,KAAK,CAA6B,CAAC;QAEvD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAA4B,CAAC;YAExE,qEAAqE;YACrE,IAAK,MAAc,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACrC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,8CAA8C,UAAU,CAAC,IAAI,iDAAiD,CAAC,CAAC;gBACjI,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,MAAM,OAAO,GAAG,CAAC,GAAU,EAAE,GAAwB,EAAS,EAAE,CAC9D,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,EAAS,EAAE;gBACxB,MAAM,OAAO,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;gBACxB,IAAI,CAAC,OAAO;oBAAE,OAAO,EAAE,CAAC;gBACxB,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC3B,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC,KAAU,EAAS,EAAE;wBAC3C,IAAI,KAAK,EAAE,IAAI,KAAK,OAAO,EAAE,CAAC;4BAC5B,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;4BAC/B,OAAO,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAW,EAAO,EAAE,CAAC,CAAC;gCACtD,GAAG,MAAM;gCACT,KAAK,EAAE,KAAK,CAAC,IAAI,IAAI,KAAK;6BAC3B,CAAC,CAAC,CAAC;wBACN,CAAC;wBACD,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;oBAC7D,CAAC,CAAC,CAAC;gBACL,CAAC;gBACD,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;YACP,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,OAAgB,EAAE,QAAQ,CAAC,CAAC;YACjE,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,OAAgB,EAAE,QAAQ,CAAC,CAAC;YACjE,MAAM,YAAY,GAAG,CAAC,GAAG,aAAa,EAAE,GAAG,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAM,EAAW,EAAE,CACjF,CAAC,CAAC,OAAO,EAAE,QAAQ,KAAK,UAAU,IAAI,CAAC,CAAC,SAAS,EAAE,QAAQ,KAAK,UAAU,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,KAAK,UAAU,CAAC,CAAC;YAEjH,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAO,EAAW,EAAE,CAC1D,CAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,cAAc,CAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,UAAU,CAAC;gBAC9E,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC;gBACpC,CAAC,YAAY,CAAC,CAAC;YAEjB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,SAAS,kBAAkB,YAAY,mBAAmB,aAAa,CAAC,MAAM,mBAAmB,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC;YAC1K,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kCAAkC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAO,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAEjH,IAAI,SAAS,IAAI,aAAa,CAAC,MAAM,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACjE,MAAM,YAAY,GAAG,CAAC,IAAS,EAAU,EAAE;oBACzC,IAAI,IAAI,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;wBAClC,OAAO,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC;oBAC3B,CAAC;oBACD,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;wBAChC,8CAA8C;wBAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;wBAC3C,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;wBAE3E,IAAI,OAAe,CAAC;wBACpB,IAAI,eAAe,GAAG,KAAK,CAAC;wBAE5B,IAAI,SAAS,IAAI,WAAW,EAAE,CAAC;4BAC7B,+DAA+D;4BAC/D,eAAe,GAAG,IAAI,CAAC;4BACvB,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC;4BACrB,gCAAgC;4BAChC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;4BAC9C,2DAA2D;4BAC3D,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gCAC1B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gCACnC,MAAM,cAAc,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;gCACnD,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;oCACvB,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;gCAC7E,CAAC;4BACH,CAAC;wBACH,CAAC;6BAAM,CAAC;4BACN,sCAAsC;4BACtC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;wBACnE,CAAC;wBAED,MAAM,KAAK,GAAG,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;wBAE5C,qCAAqC;wBACrC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;4BAClB,OAAO,GAAG,KAAK,GAAG,OAAO,GAAG,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;wBACvD,CAAC;wBACD,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,KAAK,yCAAyC,EAAE,CAAC;4BACvF,OAAO,GAAG,KAAK,GAAG,OAAO,GAAG,KAAK,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC;wBAChE,CAAC;wBACD,OAAO,GAAG,KAAK,GAAG,OAAO,GAAG,KAAK,EAAE,CAAC;oBACtC,CAAC;oBACD,IAAI,IAAI,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;wBAClC,OAAO,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;oBAC3B,CAAC;oBACD,kCAAkC;oBAClC,OAAO,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC;gBAC3B,CAAC,CAAC;gBACF,MAAM,WAAW,GAAG,CAAC,OAAc,EAAU,EAAE,CAC7C,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAU,EAAE,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC9H,IAAI,KAAK,GAAa,EAAE,CAAC;gBACzB,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC7B,KAAK,CAAC,IAAI,CAAC,wBAAwB,KAAK,CAAC,KAAK,OAAO,WAAW,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;gBACzF,CAAC;gBACD,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC7B,KAAK,CAAC,IAAI,CAAC,wBAAwB,KAAK,CAAC,KAAK,OAAO,WAAW,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;gBACzF,CAAC;gBACD,MAAM,gBAAgB,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC3C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,gCAAgC,UAAU,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC,CAAC;gBAC5F,OAAO,gBAAgB,CAAC;YAC1B,CAAC;YAED,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAO,EAAmB,EAAE;gBAC/D,QAAQ,EAAE,CAAC,UAAU,EAAE,CAAC;oBACtB,KAAK,aAAa;wBAChB,OAAO;4BACL,GAAG,EAAE;4BACL,MAAM,EAAE,YAAY,CAAC,EAAE,CAAC,MAAM,CAAC;yBAChC,CAAC;oBACJ,KAAK,cAAc,CAAC;oBACpB,KAAK,cAAc;wBACjB,OAAO;4BACL,GAAG,EAAE;4BACL,MAAM,EAAE,YAAY,CAAC,EAAE,CAAC,MAAM,CAAC;4BAC/B,MAAM,EAAE,YAAY,CAAC,EAAE,CAAC,MAAM,CAAC;4BAC/B,KAAK,EAAE,oBAAoB,CAAC,EAAE,CAAC,KAAK,CAAC;yBACtC,CAAC;oBACJ,KAAK,QAAQ;wBACX,OAAO;4BACL,GAAG,EAAE;4BACL,MAAM,EAAE,YAAY,CAAC,EAAE,CAAC,MAAM,CAAC;yBAChC,CAAC;oBACJ,KAAK,QAAQ;wBACX,OAAO;4BACL,GAAG,EAAE;4BACL,MAAM,EAAE,YAAY,CAAC,EAAE,CAAC,MAAM,CAAC;yBAChC,CAAC;oBACJ;wBACE,OAAO,EAAE,CAAC;gBACd,CAAC;YACH,CAAC,CAAC,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACpD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,gCAAgC,UAAU,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC,CAAC;YACtF,OAAO,UAAU,CAAC;QACpB,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,IAAI,4BAAS,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChC,MAAM,KAAK,CAAC;YACd,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,qCAAqC,UAAU,CAAC,IAAI,2CAA2C,KAAK,EAAE,CAAC,CAAC;YAC1H,MAAM,cAAc,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;YACpD,OAAO,cAAc,CAAC;QACxB,CAAC;IACH,CAAC;IAEO,mBAAmB,CAAC,KAAY;QACtC,OAAO,OAAQ,KAA2B,CAAC,OAAO,KAAK,QAAQ,CAAC;IAClE,CAAC;IAEO,eAAe,CAAC,QAAiB;QAIvC,OAAO,OAAO,QAAQ,KAAK,QAAQ;YACjC,QAAQ,KAAK,IAAI;YACjB,OAAQ,QAA8C,CAAC,mBAAmB,KAAK,UAAU;YACzF,OAAQ,QAAsC,CAAC,WAAW,KAAK,UAAU,CAAC;IAC9E,CAAC;IAEe,KAAK,CAAC,iBAAiB,CAAC,UAA8B,EAAE,cAA8B,EAAE,UAAuB;QAC7H,OAAO,KAAK,CAAC,iBAAiB,CAAC,UAAU,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;IACzE,CAAC;CACF;AA1YD,8DA0YC","sourcesContent":["import { DataFactory } from 'n3';\nimport { Generator as SparqlGenerator, Parser as SparqlParser, type GraphQuads, type UpdateOperation, type Update as SparqlUpdate } from 'sparqljs';\nimport {\n DataAccessorBasedStore,\n type ChangeMap,\n type ResourceIdentifier,\n type Patch,\n NotImplementedHttpError,\n type Conditions,\n NotFoundHttpError,\n RepresentationMetadata,\n AS,\n SOLID_AS,\n BadRequestHttpError,\n ForbiddenHttpError,\n HttpError,\n type DataAccessor,\n type IdentifierStrategy,\n type AuxiliaryStrategy,\n type Representation,\n} from '@solid/community-server';\nimport type { SparqlUpdatePatch } from '@solid/community-server';\nimport { readableToString } from '@solid/community-server/dist/util/StreamUtil';\nimport { getLoggerFor } from 'global-logger-factory';\nimport {\n LocalFirstRdfRepresentationResolver,\n type LocalFirstRdfRepresentationResolverLike,\n} from '../solidfs/LocalFirstRdfRepresentationResolver';\nimport { DisabledSparqlFeatureError, UnsupportedSparqlQueryError } from './rdf/RdfSparqlAdapter';\n\nexport interface SparqlUpdateResourceStoreOptions {\n accessor: DataAccessor;\n identifierStrategy: IdentifierStrategy;\n auxiliaryStrategy: AuxiliaryStrategy;\n metadataStrategy: AuxiliaryStrategy;\n localFirstRdfRepresentationResolver?: LocalFirstRdfRepresentationResolverLike;\n}\n\n/**\n * ResourceStore that short-circuits PATCH into direct SPARQL UPDATE\n * when the underlying DataAccessor supports it.\n */\nexport class SparqlUpdateResourceStore extends DataAccessorBasedStore {\n private readonly generator = new SparqlGenerator();\n private readonly parser = new SparqlParser();\n private readonly localFirstRdfRepresentationResolver: LocalFirstRdfRepresentationResolverLike;\n private readonly metadataAuxiliaryStrategy: AuxiliaryStrategy;\n protected override readonly logger = getLoggerFor(this);\n\n public constructor(options: SparqlUpdateResourceStoreOptions) {\n super(options.accessor, options.identifierStrategy, options.auxiliaryStrategy, options.metadataStrategy);\n this.metadataAuxiliaryStrategy = options.metadataStrategy;\n this.localFirstRdfRepresentationResolver = options.localFirstRdfRepresentationResolver ??\n new LocalFirstRdfRepresentationResolver({\n accessor: options.accessor,\n metadataStrategy: options.metadataStrategy,\n });\n // Check if identifierStrategy has baseUrl property (SingleRootIdentifierStrategy)\n const strategy = options.identifierStrategy as unknown as { baseUrl?: string };\n this.logger.info(`SparqlUpdateResourceStore initialized with identifierStrategy: ${options.identifierStrategy.constructor.name}, baseUrl: ${strategy.baseUrl ?? 'N/A'}`);\n }\n\n public override async getRepresentation(identifier: ResourceIdentifier): Promise<Representation> {\n const localRepresentation = await this.localFirstRdfRepresentationResolver.resolve(identifier);\n if (localRepresentation) {\n return localRepresentation;\n }\n\n return super.getRepresentation(identifier);\n }\n\n // @ts-expect-error Upstream signature returns never; we return ChangeMap for successful PATCH.\n public override async modifyResource(identifier: ResourceIdentifier, patch: Patch, conditions?: Conditions): Promise<ChangeMap> {\n this.logger.debug(`SparqlUpdateResourceStore.modifyResource called for ${identifier.path}`);\n this.logger.debug(`Patch has algebra: ${typeof (patch as SparqlUpdatePatch).algebra === 'object'}, metadata.contentType: ${patch.metadata?.contentType}`);\n\n const accessor = (this as unknown as { accessor: unknown }).accessor as unknown;\n if (!this.isSparqlCapable(accessor)) {\n this.logger.debug('Accessor is not SPARQL capable');\n throw new NotImplementedHttpError('SPARQL UPDATE not supported by this accessor');\n }\n\n // Keep the default condition validation semantics\n if (conditions) {\n let metadata: RepresentationMetadata | undefined;\n try {\n metadata = await accessor.getMetadata(identifier);\n } catch (error: unknown) {\n if (!NotFoundHttpError.isInstance(error)) {\n throw error;\n }\n }\n this.validateConditions(conditions, metadata);\n }\n\n if (this.metadataAuxiliaryStrategy.isAuxiliaryIdentifier(identifier)) {\n this.logger.debug(`Metadata PATCH for ${identifier.path} falls back to CSS metadata patcher`);\n throw new NotImplementedHttpError('Metadata resources must be patched by the CSS metadata patcher');\n }\n\n const sparqlUpdate = await this.toSparqlUpdate(patch, identifier);\n if (!sparqlUpdate) {\n this.logger.debug(`toSparqlUpdate returned undefined for ${identifier.path}, falling back to CSS handler`);\n throw new NotImplementedHttpError('Unsupported PATCH payload for SPARQL conversion');\n }\n\n this.logger.debug(`Applying SPARQL PATCH to ${identifier.path}: ${sparqlUpdate}`);\n try {\n await accessor.executeSparqlUpdate(sparqlUpdate, identifier.path);\n } catch (error: unknown) {\n if (error instanceof DisabledSparqlFeatureError) {\n throw new ForbiddenHttpError(error.message, { cause: error });\n }\n if (error instanceof UnsupportedSparqlQueryError) {\n throw new BadRequestHttpError(error.message, { cause: error });\n }\n throw error;\n }\n\n // PATCH does not affect containment; mark the target resource as updated.\n const changes = new Map() as ChangeMap;\n changes.set(identifier, new RepresentationMetadata(identifier, { [SOLID_AS.activity]: AS.terms.Update }));\n return changes;\n }\n\n /**\n * 只处理 SPARQL UPDATE (application/sparql-update)。\n * N3 Patch 和其他类型返回 undefined,让 CSS PatchingStore 回退到 get-patch-set 逻辑。\n */\n private async toSparqlUpdate(patch: Patch, identifier: ResourceIdentifier): Promise<string | undefined> {\n // 只处理 SPARQL UPDATE,其他类型(包括 N3 Patch)回退到 CSS 默认处理\n if (!this.isSparqlUpdatePatch(patch)) {\n return undefined;\n }\n\n const updateText = await readableToString(patch.data);\n return this.normalizeGraphs(updateText, identifier);\n }\n\n /**\n * Ensure SPARQL UPDATE targets the resource graph (CSS stores documents in named graphs).\n */\n private normalizeGraphs(updateText: string, identifier: ResourceIdentifier): string | undefined {\n const graph = DataFactory.namedNode(identifier.path);\n const identifierStrategy = (this as unknown as { identifierStrategy: { supportsIdentifier: (id: ResourceIdentifier) => boolean }}).identifierStrategy;\n\n const assertGraphAllowed = (value: unknown): void => {\n if (!value || typeof value !== 'object') {\n return;\n }\n const term = value as { termType?: string; value?: string };\n if (term.termType === 'NamedNode' && term.value && !identifierStrategy.supportsIdentifier({ path: term.value })) {\n throw new BadRequestHttpError(`GRAPH ${term.value} is outside the configured identifier space.`);\n }\n };\n const wrapDefaultGraph = (text: string): string => {\n const insert = /INSERT\\s+DATA\\s*{\\s*([^}]*)}/is;\n const del = /DELETE\\s+DATA\\s*{\\s*([^}]*)}/is;\n const rewrite = (regex: RegExp, label: string, input: string): string =>\n input.replace(regex, (_match, body) => `${label} { GRAPH <${graph.value}> { ${body} } }`);\n let out = text;\n if (insert.test(out)) {\n out = rewrite(insert, 'INSERT DATA', out);\n }\n if (del.test(out)) {\n out = rewrite(del, 'DELETE DATA', out);\n }\n return out;\n };\n\n const rewriteTriples = (triples?: any[], targetGraph = graph): any[] => {\n if (!triples) return [];\n return triples.map((triple: any): any => ({\n ...triple,\n graph: (!triple.graph || triple.graph.termType === 'DefaultGraph') ? targetGraph : triple.graph,\n }));\n };\n\n const triplesFromTemplateBlock = (item: any): any[] => {\n if (Array.isArray(item?.triples)) {\n return item.triples;\n }\n if (!Array.isArray(item?.patterns)) {\n return [];\n }\n return item.patterns.flatMap((pattern: any): any[] =>\n pattern?.type === 'bgp' && Array.isArray(pattern.triples) ? pattern.triples : []);\n };\n\n const rewriteQuadBlocks = (items?: any[]): any[] | undefined => {\n if (!items) return items;\n return items.flatMap((item: any): any[] => {\n if (item?.type === 'graph') {\n assertGraphAllowed(item.name);\n const targetGraph = item.name ?? graph;\n return [{\n ...item,\n name: targetGraph,\n triples: rewriteTriples(triplesFromTemplateBlock(item), targetGraph),\n patterns: undefined,\n }];\n }\n if (item?.type === 'bgp') {\n return [{\n type: 'graph',\n name: graph,\n triples: rewriteTriples(item.triples, graph),\n }];\n }\n return [{\n type: 'graph',\n name: graph,\n triples: rewriteTriples([ item ], graph),\n }];\n });\n };\n\n const rewritePattern = (pattern: any): any => {\n if (pattern.type === 'bgp') {\n return { ...pattern, triples: rewriteTriples(pattern.triples, graph) };\n }\n if (pattern.type === 'graph') {\n assertGraphAllowed(pattern.name);\n return {\n ...pattern,\n name: pattern.name ?? graph,\n patterns: pattern.patterns?.map(rewritePattern) ?? [],\n };\n }\n if (pattern.type === 'group') {\n return { ...pattern, patterns: pattern.patterns?.map(rewritePattern) ?? [] };\n }\n if (pattern.type === 'optional') {\n return { ...pattern, patterns: pattern.patterns?.map(rewritePattern) ?? [] };\n }\n if (pattern.type === 'union') {\n return { ...pattern, patterns: pattern.patterns?.map(rewritePattern) ?? [] };\n }\n if (pattern.type === 'minus') {\n return { ...pattern, patterns: pattern.patterns?.map(rewritePattern) ?? [] };\n }\n if (pattern.type === 'filter') {\n return pattern; // FILTER doesn't contain triples, pass through\n }\n if (pattern.type === 'bind') {\n return pattern; // BIND doesn't contain triples, pass through\n }\n if (pattern.type === 'values') {\n return pattern; // VALUES doesn't contain triples, pass through\n }\n if (pattern.type === 'service') {\n return { ...pattern, patterns: pattern.patterns?.map(rewritePattern) ?? [] };\n }\n return pattern;\n };\n\n const rewriteWherePatterns = (patterns?: any[]): any[] =>\n (patterns ?? []).map((pattern: any): any => {\n if (pattern?.type === 'bgp') {\n return {\n type: 'graph',\n name: graph,\n patterns: [{\n ...pattern,\n triples: rewriteTriples(pattern.triples, graph),\n }],\n };\n }\n return rewritePattern(pattern);\n });\n\n const toGraphQuads = (items?: any[]): GraphQuads[] | undefined =>\n rewriteQuadBlocks(items) as GraphQuads[] | undefined;\n\n try {\n const parsed = this.parser.parse(updateText) as unknown as SparqlUpdate;\n\n // Explicitly reject SPARQL Queries (SELECT, ASK, CONSTRUCT) in PATCH\n if ((parsed as any).type === 'query') {\n this.logger.warn(`Received SPARQL Query in PATCH request for ${identifier.path}. SPARQL PATCH only supports UPDATE operations.`);\n return undefined;\n }\n\n const collect = (ops: any[], key: 'delete' | 'insert'): any[] =>\n ops.flatMap((op): any[] => {\n const entries = op[key];\n if (!entries) return [];\n if (Array.isArray(entries)) {\n return entries.flatMap((entry: any): any[] => {\n if (entry?.type === 'graph') {\n assertGraphAllowed(entry.name);\n return (entry.triples ?? []).map((triple: any): any => ({\n ...triple,\n graph: entry.name ?? graph,\n }));\n }\n return entry.triples ? entry.triples : (entry.quads ?? []);\n });\n }\n return [];\n });\n const deleteTriples = collect(parsed.updates as any[], 'delete');\n const insertTriples = collect(parsed.updates as any[], 'insert');\n const hasVariables = [...deleteTriples, ...insertTriples].some((t: any): boolean =>\n t.subject?.termType === 'Variable' || t.predicate?.termType === 'Variable' || t.object?.termType === 'Variable');\n\n const simpleOps = parsed.updates.every((op: any): boolean =>\n [ 'delete', 'insert', 'insertdelete', 'deleteinsert' ].includes(op.updateType) &&\n (!op.where || op.where.length === 0) &&\n !hasVariables);\n\n this.logger.debug(`[normalizeGraphs] simpleOps=${simpleOps}, hasVariables=${hasVariables}, deleteTriples=${deleteTriples.length}, insertTriples=${insertTriples.length}`);\n this.logger.debug(`[normalizeGraphs] updateTypes: ${parsed.updates.map((op: any) => op.updateType).join(', ')}`);\n\n if (simpleOps && deleteTriples.length + insertTriples.length > 0) {\n const termToString = (term: any): string => {\n if (term.termType === 'NamedNode') {\n return `<${term.value}>`;\n }\n if (term.termType === 'Literal') {\n // Escape special characters in literal values\n const hasQuotes = term.value.includes('\"');\n const hasNewlines = term.value.includes('\\n') || term.value.includes('\\r');\n\n let escaped: string;\n let useTripleQuotes = false;\n\n if (hasQuotes || hasNewlines) {\n // Use triple-quoted strings for values with quotes or newlines\n useTripleQuotes = true;\n escaped = term.value;\n // Escape triple-quote sequences\n escaped = escaped.replace(/\"\"\"/g, '\"\\\\\"\\\\\"\"');\n // Escape trailing quotes to avoid \"\"\"content\"\"\"\" sequences\n if (escaped.endsWith('\"')) {\n const match = escaped.match(/\"*$/);\n const trailingQuotes = match ? match[0].length : 0;\n if (trailingQuotes > 0) {\n escaped = escaped.slice(0, -trailingQuotes) + '\\\\\"'.repeat(trailingQuotes);\n }\n }\n } else {\n // Regular escaping for simple strings\n escaped = term.value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n }\n\n const quote = useTripleQuotes ? '\"\"\"' : '\"';\n\n // Handle language tags and datatypes\n if (term.language) {\n return `${quote}${escaped}${quote}@${term.language}`;\n }\n if (term.datatype && term.datatype.value !== 'http://www.w3.org/2001/XMLSchema#string') {\n return `${quote}${escaped}${quote}^^<${term.datatype.value}>`;\n }\n return `${quote}${escaped}${quote}`;\n }\n if (term.termType === 'BlankNode') {\n return `_:${term.value}`;\n }\n // Fallback for unknown term types\n return `<${term.value}>`;\n };\n const toTripleStr = (triples: any[]): string =>\n triples.map((t): string => `${termToString(t.subject)} ${termToString(t.predicate)} ${termToString(t.object)} .`).join(' ');\n let parts: string[] = [];\n if (deleteTriples.length > 0) {\n parts.push(`DELETE DATA { GRAPH <${graph.value}> { ${toTripleStr(deleteTriples)} } }`);\n }\n if (insertTriples.length > 0) {\n parts.push(`INSERT DATA { GRAPH <${graph.value}> { ${toTripleStr(insertTriples)} } }`);\n }\n const normalizedSimple = parts.join(';\\n');\n this.logger.verbose(`Normalized SPARQL UPDATE for ${identifier.path}: ${normalizedSimple}`);\n return normalizedSimple;\n }\n\n parsed.updates = parsed.updates.map((op: any): UpdateOperation => {\n switch (op.updateType) {\n case 'deletewhere':\n return {\n ...op,\n delete: toGraphQuads(op.delete),\n };\n case 'deleteinsert':\n case 'insertdelete':\n return {\n ...op,\n delete: toGraphQuads(op.delete),\n insert: toGraphQuads(op.insert),\n where: rewriteWherePatterns(op.where),\n };\n case 'delete':\n return {\n ...op,\n delete: toGraphQuads(op.delete),\n };\n case 'insert':\n return {\n ...op,\n insert: toGraphQuads(op.insert),\n };\n default:\n return op;\n }\n });\n const normalized = this.generator.stringify(parsed);\n this.logger.verbose(`Normalized SPARQL UPDATE for ${identifier.path}: ${normalized}`);\n return normalized;\n } catch (error: unknown) {\n if (HttpError.isInstance(error)) {\n throw error;\n }\n this.logger.debug(`Could not parse SPARQL UPDATE for ${identifier.path}; applying default graph text fallback: ${error}`);\n const fallbackResult = wrapDefaultGraph(updateText);\n return fallbackResult;\n }\n }\n\n private isSparqlUpdatePatch(patch: Patch): patch is SparqlUpdatePatch {\n return typeof (patch as SparqlUpdatePatch).algebra === 'object';\n }\n\n private isSparqlCapable(accessor: unknown): accessor is {\n executeSparqlUpdate: (query: string, baseIri?: string) => Promise<void>;\n getMetadata: (identifier: ResourceIdentifier) => Promise<RepresentationMetadata>;\n } {\n return typeof accessor === 'object' &&\n accessor !== null &&\n typeof (accessor as { executeSparqlUpdate?: unknown }).executeSparqlUpdate === 'function' &&\n typeof (accessor as { getMetadata?: unknown }).getMetadata === 'function';\n }\n\n public override async setRepresentation(identifier: ResourceIdentifier, representation: Representation, conditions?: Conditions): Promise<ChangeMap> {\n return super.setRepresentation(identifier, representation, conditions);\n }\n}\n"]}
@@ -56,6 +56,10 @@
56
56
  "@id": "undefineds:dist/storage/SparqlUpdateResourceStore.jsonld#SparqlUpdateResourceStore__member_localFirstRdfRepresentationResolver",
57
57
  "memberFieldName": "localFirstRdfRepresentationResolver"
58
58
  },
59
+ {
60
+ "@id": "undefineds:dist/storage/SparqlUpdateResourceStore.jsonld#SparqlUpdateResourceStore__member_metadataAuxiliaryStrategy",
61
+ "memberFieldName": "metadataAuxiliaryStrategy"
62
+ },
59
63
  {
60
64
  "@id": "undefineds:dist/storage/SparqlUpdateResourceStore.jsonld#SparqlUpdateResourceStore__member_logger",
61
65
  "memberFieldName": "logger",
@@ -74,6 +74,7 @@ export declare class MixDataAccessor implements DataAccessor {
74
74
  * unsupported shapes have an explicitly configured compatibility path.
75
75
  */
76
76
  executeSparqlUpdate(query: string, baseIri?: string): Promise<void>;
77
+ private shouldApplyLocalRdfSparqlUpdate;
77
78
  private executeLocalRdfSparqlUpdate;
78
79
  private applyLocalRdfDelta;
79
80
  private loadLocalRdfDeltaGraphs;
@@ -92,6 +93,7 @@ export declare class MixDataAccessor implements DataAccessor {
92
93
  private addGraphFilterValueIri;
93
94
  private addNamedGraphIris;
94
95
  private addWritableNamedGraphIri;
96
+ private isLocalRdfAuthorityIdentifier;
95
97
  private isQueryVariable;
96
98
  private isRdfTerm;
97
99
  private readLocalRdfState;
@@ -186,9 +186,9 @@ class MixDataAccessor {
186
186
  async executeSparqlUpdate(query, baseIri) {
187
187
  if (baseIri) {
188
188
  const identifier = { path: baseIri };
189
- if (this.isByLineRdfIdentifier(identifier)) {
189
+ if (await this.shouldApplyLocalRdfSparqlUpdate(identifier)) {
190
190
  try {
191
- const writtenIdentifiers = await this.executeLocalRdfSparqlUpdate(query, identifier);
191
+ const writtenIdentifiers = await this.executeLocalRdfSparqlUpdate(query, identifier, new Set([identifier.path]));
192
192
  for (const writtenIdentifier of writtenIdentifiers) {
193
193
  this.invalidateMetadataCache(writtenIdentifier);
194
194
  }
@@ -212,13 +212,27 @@ class MixDataAccessor {
212
212
  this.invalidateMetadataCache(identifier);
213
213
  }
214
214
  }
215
- async executeLocalRdfSparqlUpdate(query, identifier) {
215
+ async shouldApplyLocalRdfSparqlUpdate(identifier) {
216
+ if (this.isByLineRdfIdentifier(identifier)) {
217
+ return true;
218
+ }
219
+ try {
220
+ return this.isLocalMirroredRdf(identifier, await this.getMetadata(identifier));
221
+ }
222
+ catch (error) {
223
+ if (community_server_1.NotFoundHttpError.isInstance(error)) {
224
+ return true;
225
+ }
226
+ throw error;
227
+ }
228
+ }
229
+ async executeLocalRdfSparqlUpdate(query, identifier, localRdfAuthorityIris) {
216
230
  const parsed = new sparqljs_1.Parser({ baseIRI: identifier.path }).parse(query);
217
231
  const delta = this.rdfSparqlAdapter.compileUpdateDelta(parsed, this.parentContainer(identifier).path, {
218
232
  defaultGraph: identifier.path,
219
233
  });
220
- const writableGraphIris = this.localRdfDeltaWriteGraphIris(delta.operations);
221
- const graphStates = await this.loadLocalRdfDeltaGraphs(delta.operations, writableGraphIris);
234
+ const writableGraphIris = this.localRdfDeltaWriteGraphIris(delta.operations, localRdfAuthorityIris);
235
+ const graphStates = await this.loadLocalRdfDeltaGraphs(delta.operations, writableGraphIris, localRdfAuthorityIris);
222
236
  const graphQuads = new Map([...graphStates].map(([graphIri, state]) => [graphIri, state.quads]));
223
237
  const nextQuadsByGraph = this.applyLocalRdfDelta(graphQuads, delta.operations, writableGraphIris);
224
238
  const patches = writableGraphIris.map((graphIri) => {
@@ -285,12 +299,12 @@ class MixDataAccessor {
285
299
  }
286
300
  return new Map(writableGraphIris.map((graphIri) => [graphIri, [...(byGraph.get(graphIri)?.values() ?? [])]]));
287
301
  }
288
- async loadLocalRdfDeltaGraphs(operations, writableGraphIris) {
302
+ async loadLocalRdfDeltaGraphs(operations, writableGraphIris, localRdfAuthorityIris) {
289
303
  const graphIris = this.localRdfDeltaGraphIris(operations, writableGraphIris);
290
304
  const graphStates = new Map();
291
305
  for (const graphIri of graphIris) {
292
306
  const graphIdentifier = { path: graphIri };
293
- if (!this.isByLineRdfIdentifier(graphIdentifier)) {
307
+ if (!this.isLocalRdfAuthorityIdentifier(graphIdentifier, localRdfAuthorityIris)) {
294
308
  throw new RdfSparqlAdapter_1.UnsupportedSparqlQueryError('Embedded local RDF update only supports by-line local RDF graph documents');
295
309
  }
296
310
  const existing = await this.readLocalRdfState(graphIdentifier);
@@ -329,27 +343,27 @@ class MixDataAccessor {
329
343
  }
330
344
  return [...graphIris];
331
345
  }
332
- localRdfDeltaWriteGraphIris(operations) {
346
+ localRdfDeltaWriteGraphIris(operations, localRdfAuthorityIris) {
333
347
  const graphIris = new Set();
334
348
  for (const operation of operations) {
335
349
  if (operation.type === 'deleteWhere') {
336
- this.addWritableTemplateGraphIris(operation.template.map((item) => item.graph), operation.query, graphIris);
350
+ this.addWritableTemplateGraphIris(operation.template.map((item) => item.graph), operation.query, graphIris, localRdfAuthorityIris);
337
351
  continue;
338
352
  }
339
353
  if (operation.type === 'insertDeleteWhere') {
340
354
  this.addWritableTemplateGraphIris([
341
355
  ...operation.deletes.map((item) => item.graph),
342
356
  ...operation.inserts.map((item) => item.graph),
343
- ], operation.query, graphIris);
357
+ ], operation.query, graphIris, localRdfAuthorityIris);
344
358
  continue;
345
359
  }
346
360
  if (operation.type === 'insertWhere') {
347
- this.addWritableTemplateGraphIris(operation.inserts.map((item) => item.graph), operation.query, graphIris);
361
+ this.addWritableTemplateGraphIris(operation.inserts.map((item) => item.graph), operation.query, graphIris, localRdfAuthorityIris);
348
362
  continue;
349
363
  }
350
364
  const graphTerms = operation.quads.map((quad) => quad.graph);
351
365
  for (const graph of graphTerms) {
352
- this.addWritableNamedGraphIri(graph, graphIris);
366
+ this.addWritableNamedGraphIri(graph, graphIris, localRdfAuthorityIris);
353
367
  }
354
368
  }
355
369
  if (graphIris.size === 0) {
@@ -357,23 +371,23 @@ class MixDataAccessor {
357
371
  }
358
372
  return [...graphIris];
359
373
  }
360
- addWritableTemplateGraphIris(graphs, query, graphIris) {
374
+ addWritableTemplateGraphIris(graphs, query, graphIris, localRdfAuthorityIris) {
361
375
  for (const graph of graphs) {
362
376
  if (this.isQueryVariable(graph)) {
363
- this.addWritableGraphVariableIris(query, graph.variable, graphIris);
377
+ this.addWritableGraphVariableIris(query, graph.variable, graphIris, localRdfAuthorityIris);
364
378
  continue;
365
379
  }
366
- this.addWritableNamedGraphIri(graph, graphIris);
380
+ this.addWritableNamedGraphIri(graph, graphIris, localRdfAuthorityIris);
367
381
  }
368
382
  }
369
- addWritableGraphVariableIris(query, variable, graphIris) {
383
+ addWritableGraphVariableIris(query, variable, graphIris, localRdfAuthorityIris) {
370
384
  const values = new Set();
371
385
  this.collectGraphVariableFilterIris(query, variable, values);
372
386
  if (values.size === 0) {
373
387
  throw new RdfSparqlAdapter_1.UnsupportedSparqlQueryError('Embedded local RDF update only supports finite GRAPH variable write targets');
374
388
  }
375
389
  for (const value of values) {
376
- this.addWritableNamedGraphIri(n3_1.DataFactory.namedNode(value), graphIris);
390
+ this.addWritableNamedGraphIri(n3_1.DataFactory.namedNode(value), graphIris, localRdfAuthorityIris);
377
391
  }
378
392
  }
379
393
  localRdfWriteGraphIri(graph, writableGraphs) {
@@ -549,15 +563,18 @@ class MixDataAccessor {
549
563
  }
550
564
  throw new RdfSparqlAdapter_1.UnsupportedSparqlQueryError('Embedded local RDF update only supports explicit local RDF graph documents');
551
565
  }
552
- addWritableNamedGraphIri(graph, graphIris) {
566
+ addWritableNamedGraphIri(graph, graphIris, localRdfAuthorityIris) {
553
567
  if (!this.isRdfTerm(graph) || graph.termType !== 'NamedNode') {
554
568
  throw new RdfSparqlAdapter_1.UnsupportedSparqlQueryError('Embedded local RDF update only supports explicit local RDF graph write targets');
555
569
  }
556
- if (!this.isByLineRdfIdentifier({ path: graph.value })) {
570
+ if (!this.isLocalRdfAuthorityIdentifier({ path: graph.value }, localRdfAuthorityIris)) {
557
571
  throw new RdfSparqlAdapter_1.UnsupportedSparqlQueryError('Embedded local RDF update only supports by-line local RDF graph write targets');
558
572
  }
559
573
  graphIris.add(graph.value);
560
574
  }
575
+ isLocalRdfAuthorityIdentifier(identifier, localRdfAuthorityIris) {
576
+ return this.isByLineRdfIdentifier(identifier) || localRdfAuthorityIris.has(identifier.path);
577
+ }
561
578
  isQueryVariable(value) {
562
579
  return Boolean(value && typeof value === 'object' && 'variable' in value);
563
580
  }
@@ -869,6 +886,7 @@ class MixDataAccessor {
869
886
  * then save metadata in structured accessor.
870
887
  */
871
888
  async writeUnstructuredDocument(identifier, data, metadata) {
889
+ await this.ensureUnstructuredParentContainers(identifier);
872
890
  // Write the actual data to unstructured storage
873
891
  await this.unstructuredDataAccessor.writeDocument(identifier, data, metadata);
874
892
  let updatedMetadata;
@@ -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';\nimport { Parser as SparqlParser } from 'sparqljs';\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 RdfQuery,\n RdfQueryPattern,\n RdfQueryTermPattern,\n RdfSourceInput,\n RdfValuesBindingSource,\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\ninterface LocalRdfGraphState {\n quads: Quad[];\n existed: boolean;\n}\n\ninterface LocalRdfAuthorityPatch {\n identifier: ResourceIdentifier;\n previousQuads: Quad[];\n previousExists: boolean;\n nextQuads: Quad[];\n}\n\n/**\n * MixDataAccessor - Routes data to appropriate storage based on content type\n * \n * - RDF data (internal/quads) -> structuredDataAccessor (Solid RDF engine by default)\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. The structured accessor decides whether\n * unsupported shapes have an explicitly configured compatibility path.\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 const writtenIdentifiers = await this.executeLocalRdfSparqlUpdate(query, identifier);\n for (const writtenIdentifier of writtenIdentifiers) {\n this.invalidateMetadataCache(writtenIdentifier);\n }\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<ResourceIdentifier[]> {\n const parsed = new SparqlParser({ baseIRI: identifier.path }).parse(query);\n const delta = this.rdfSparqlAdapter.compileUpdateDelta(parsed, this.parentContainer(identifier).path, {\n defaultGraph: identifier.path,\n });\n const writableGraphIris = this.localRdfDeltaWriteGraphIris(delta.operations);\n const graphStates = await this.loadLocalRdfDeltaGraphs(delta.operations, writableGraphIris);\n const graphQuads = new Map([...graphStates].map(([ graphIri, state ]) => [graphIri, state.quads]));\n const nextQuadsByGraph = this.applyLocalRdfDelta(graphQuads, delta.operations, writableGraphIris);\n const patches = writableGraphIris.map((graphIri): LocalRdfAuthorityPatch => {\n const previous = graphStates.get(graphIri);\n return {\n identifier: { path: graphIri },\n previousQuads: previous?.quads ?? [],\n previousExists: previous?.existed ?? false,\n nextQuads: nextQuadsByGraph.get(graphIri) ?? [],\n };\n });\n await this.writeLocalRdfAuthorityPatches(patches);\n return patches.map((patch) => patch.identifier);\n }\n\n private applyLocalRdfDelta(\n graphQuads: Map<string, Quad[]>,\n operations: RdfSparqlUpdateDeltaOperation[],\n writableGraphIris: string[],\n ): Map<string, Quad[]> {\n const writableGraphs = new Set(writableGraphIris);\n const byGraph = new Map<string, Map<string, Quad>>();\n for (const [ graphIri, quads ] of graphQuads) {\n byGraph.set(graphIri, new Map(quads.map((quad) => [this.quadKey(quad), quad])));\n }\n const currentQuads = (): Quad[] => [...byGraph.values()].flatMap((quads) => [...quads.values()]);\n const writableQuads = (graphIri: string): Map<string, Quad> => {\n let quads = byGraph.get(graphIri);\n if (!quads) {\n quads = new Map();\n byGraph.set(graphIri, quads);\n }\n return quads;\n };\n const deleteQuads = (quads: Quad[]): void => {\n for (const quad of quads) {\n const target = writableQuads(this.localRdfWriteGraphIri(quad.graph, writableGraphs));\n target.delete(this.quadKey(quad));\n }\n };\n const insertQuads = (quads: Quad[]): void => {\n for (const quad of quads) {\n const target = writableQuads(this.localRdfWriteGraphIri(quad.graph, writableGraphs));\n target.set(this.quadKey(quad), quad);\n }\n };\n\n for (const operation of operations) {\n if (operation.type === 'insert') {\n insertQuads(operation.quads);\n continue;\n }\n\n if (operation.type === 'delete') {\n deleteQuads(operation.quads);\n continue;\n }\n\n if (operation.type === 'insertDeleteWhere') {\n const rows = this.queryLocalUpdateBindings(currentQuads(), operation.query);\n deleteQuads(this.rdfSparqlAdapter.materializeDeleteWhere(operation.deletes, rows));\n insertQuads(this.rdfSparqlAdapter.materializeDeleteWhere(operation.inserts, rows));\n continue;\n }\n\n if (operation.type === 'insertWhere') {\n const rows = this.queryLocalUpdateBindings(currentQuads(), operation.query);\n insertQuads(this.rdfSparqlAdapter.materializeDeleteWhere(operation.inserts, rows));\n continue;\n }\n\n const rows = this.queryLocalUpdateBindings(currentQuads(), operation.query);\n deleteQuads(this.rdfSparqlAdapter.materializeDeleteWhere(operation.template, rows));\n }\n\n return new Map(writableGraphIris.map((graphIri) => [graphIri, [...(byGraph.get(graphIri)?.values() ?? [])]]));\n }\n\n private async loadLocalRdfDeltaGraphs(\n operations: RdfSparqlUpdateDeltaOperation[],\n writableGraphIris: readonly string[],\n ): Promise<Map<string, LocalRdfGraphState>> {\n const graphIris = this.localRdfDeltaGraphIris(operations, writableGraphIris);\n const graphStates = new Map<string, LocalRdfGraphState>();\n for (const graphIri of graphIris) {\n const graphIdentifier = { path: graphIri };\n if (!this.isByLineRdfIdentifier(graphIdentifier)) {\n throw new UnsupportedSparqlQueryError('Embedded local RDF update only supports by-line local RDF graph documents');\n }\n const existing = await this.readLocalRdfState(graphIdentifier);\n const graph = DataFactory.namedNode(graphIri);\n const quads = existing.text.length > 0\n ? await this.parseLocalRdf(graphIdentifier, existing.text, this.localRdfContentType(graphIdentifier))\n .then((items) => items.map((quad) => this.toGraphQuad(quad, graph)))\n : [];\n graphStates.set(graphIri, { quads, existed: existing.existed });\n }\n return graphStates;\n }\n\n private localRdfDeltaGraphIris(\n operations: RdfSparqlUpdateDeltaOperation[],\n writableGraphIris: readonly string[],\n ): string[] {\n const graphIris = new Set<string>(writableGraphIris);\n for (const operation of operations) {\n const graphTerms = operation.type === 'deleteWhere'\n ? [\n ...operation.template.map((item) => item.graph),\n ...this.queryGraphTerms(operation.query),\n ]\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 this.addNamedGraphIris(graph, graphIris);\n }\n }\n return [...graphIris];\n }\n\n private localRdfDeltaWriteGraphIris(\n operations: RdfSparqlUpdateDeltaOperation[],\n ): string[] {\n const graphIris = new Set<string>();\n for (const operation of operations) {\n if (operation.type === 'deleteWhere') {\n this.addWritableTemplateGraphIris(operation.template.map((item) => item.graph), operation.query, graphIris);\n continue;\n }\n if (operation.type === 'insertDeleteWhere') {\n this.addWritableTemplateGraphIris([\n ...operation.deletes.map((item) => item.graph),\n ...operation.inserts.map((item) => item.graph),\n ], operation.query, graphIris);\n continue;\n }\n if (operation.type === 'insertWhere') {\n this.addWritableTemplateGraphIris(operation.inserts.map((item) => item.graph), operation.query, graphIris);\n continue;\n }\n const graphTerms = operation.quads.map((quad) => quad.graph);\n for (const graph of graphTerms) {\n this.addWritableNamedGraphIri(graph, graphIris);\n }\n }\n if (graphIris.size === 0) {\n throw new UnsupportedSparqlQueryError('Embedded local RDF update requires explicit local RDF graph write targets');\n }\n return [...graphIris];\n }\n\n private addWritableTemplateGraphIris(\n graphs: RdfQueryTermPattern[],\n query: RdfQuery,\n graphIris: Set<string>,\n ): void {\n for (const graph of graphs) {\n if (this.isQueryVariable(graph)) {\n this.addWritableGraphVariableIris(query, graph.variable, graphIris);\n continue;\n }\n this.addWritableNamedGraphIri(graph, graphIris);\n }\n }\n\n private addWritableGraphVariableIris(\n query: RdfQuery,\n variable: string,\n graphIris: Set<string>,\n ): void {\n const values = new Set<string>();\n this.collectGraphVariableFilterIris(query, variable, values);\n if (values.size === 0) {\n throw new UnsupportedSparqlQueryError('Embedded local RDF update only supports finite GRAPH variable write targets');\n }\n for (const value of values) {\n this.addWritableNamedGraphIri(DataFactory.namedNode(value) as unknown as Term, graphIris);\n }\n }\n\n private localRdfWriteGraphIri(graph: Term, writableGraphs: Set<string>): string {\n if (graph.termType !== 'NamedNode' || !writableGraphs.has(graph.value)) {\n throw new UnsupportedSparqlQueryError('Embedded local RDF update can only write declared local RDF graph documents');\n }\n return graph.value;\n }\n\n private queryLocalUpdateBindings(\n quads: Quad[],\n query: RdfQuery,\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: RdfQuery): RdfQueryTermPattern[] {\n const graphTerms: RdfQueryTermPattern[] = [];\n const graphVariables = new Set<string>();\n this.collectQueryGraphTerms(query, graphTerms, graphVariables);\n this.collectGraphVariableFilterTerms(query, graphVariables, graphTerms);\n return graphTerms;\n }\n\n private collectQueryGraphTerms(\n query: RdfQuery | {\n patterns: RdfQueryPattern[];\n values?: RdfValuesBindingSource[];\n optional?: RdfQuery['optional'];\n unions?: RdfQuery['unions'];\n minus?: RdfQuery['minus'];\n exists?: RdfQuery['exists'];\n },\n graphTerms: RdfQueryTermPattern[],\n graphVariables: Set<string>,\n ): void {\n for (const pattern of query.patterns) {\n if (!pattern.graph) {\n continue;\n }\n graphTerms.push(pattern.graph);\n if (this.isQueryVariable(pattern.graph)) {\n graphVariables.add(pattern.graph.variable);\n }\n }\n for (const optional of query.optional ?? []) {\n this.collectQueryGraphTerms(Array.isArray(optional) ? { patterns: optional } : optional, graphTerms, graphVariables);\n }\n for (const union of query.unions ?? []) {\n for (const branch of union.branches) {\n this.collectQueryGraphTerms(branch, graphTerms, graphVariables);\n }\n }\n for (const minus of query.minus ?? []) {\n this.collectQueryGraphTerms(minus, graphTerms, graphVariables);\n }\n for (const exists of query.exists ?? []) {\n this.collectQueryGraphTerms(exists, graphTerms, graphVariables);\n }\n }\n\n private collectGraphVariableFilterTerms(\n query: RdfQuery | {\n values?: RdfValuesBindingSource[];\n filters?: RdfQuery['filters'];\n optional?: RdfQuery['optional'];\n unions?: RdfQuery['unions'];\n minus?: RdfQuery['minus'];\n exists?: RdfQuery['exists'];\n },\n graphVariables: Set<string>,\n graphTerms: RdfQueryTermPattern[],\n ): void {\n for (const filter of query.filters ?? []) {\n if (!graphVariables.has(filter.variable)) {\n continue;\n }\n if (filter.value && this.isRdfTerm(filter.value)) {\n graphTerms.push(filter.value);\n }\n for (const value of filter.values ?? []) {\n if (this.isRdfTerm(value)) {\n graphTerms.push(value);\n }\n }\n }\n this.collectGraphVariableValueTerms(query.values ?? [], graphVariables, graphTerms);\n for (const optional of query.optional ?? []) {\n if (!Array.isArray(optional)) {\n this.collectGraphVariableFilterTerms(optional, graphVariables, graphTerms);\n }\n }\n for (const union of query.unions ?? []) {\n for (const branch of union.branches) {\n this.collectGraphVariableFilterTerms(branch, graphVariables, graphTerms);\n }\n }\n for (const minus of query.minus ?? []) {\n this.collectGraphVariableFilterTerms(minus, graphVariables, graphTerms);\n }\n for (const exists of query.exists ?? []) {\n this.collectGraphVariableFilterTerms(exists, graphVariables, graphTerms);\n }\n }\n\n private collectGraphVariableFilterIris(\n query: RdfQuery | {\n values?: RdfValuesBindingSource[];\n filters?: RdfQuery['filters'];\n optional?: RdfQuery['optional'];\n unions?: RdfQuery['unions'];\n minus?: RdfQuery['minus'];\n exists?: RdfQuery['exists'];\n },\n variable: string,\n values: Set<string>,\n ): void {\n for (const filter of query.filters ?? []) {\n if (filter.variable !== variable) {\n continue;\n }\n if ((filter.operator === '$eq' || filter.operator === '$sameTerm') && filter.value && this.isRdfTerm(filter.value)) {\n this.addGraphFilterValueIri(filter.value, values);\n }\n if (filter.operator === '$in') {\n for (const value of filter.values ?? []) {\n if (this.isRdfTerm(value)) {\n this.addGraphFilterValueIri(value, values);\n }\n }\n }\n }\n this.collectGraphVariableValueIris(query.values ?? [], variable, values);\n for (const optional of query.optional ?? []) {\n if (!Array.isArray(optional)) {\n this.collectGraphVariableFilterIris(optional, variable, values);\n }\n }\n for (const union of query.unions ?? []) {\n for (const branch of union.branches) {\n this.collectGraphVariableFilterIris(branch, variable, values);\n }\n }\n for (const minus of query.minus ?? []) {\n this.collectGraphVariableFilterIris(minus, variable, values);\n }\n for (const exists of query.exists ?? []) {\n this.collectGraphVariableFilterIris(exists, variable, values);\n }\n }\n\n private collectGraphVariableValueTerms(\n sources: readonly RdfValuesBindingSource[],\n graphVariables: Set<string>,\n graphTerms: RdfQueryTermPattern[],\n ): void {\n for (const source of sources) {\n for (const variable of source.variables) {\n if (!graphVariables.has(variable)) {\n continue;\n }\n for (const row of source.rows) {\n const value = row[variable];\n if (value) {\n graphTerms.push(value);\n }\n }\n }\n }\n }\n\n private collectGraphVariableValueIris(\n sources: readonly RdfValuesBindingSource[],\n variable: string,\n values: Set<string>,\n ): void {\n for (const source of sources) {\n if (!source.variables.includes(variable)) {\n continue;\n }\n for (const row of source.rows) {\n const value = row[variable];\n if (value) {\n this.addGraphFilterValueIri(value, values);\n }\n }\n }\n }\n\n private addGraphFilterValueIri(value: Term, values: Set<string>): void {\n if (value.termType !== 'NamedNode') {\n throw new UnsupportedSparqlQueryError('Embedded local RDF update GRAPH variable write targets must be named graph documents');\n }\n values.add(value.value);\n }\n\n private addNamedGraphIris(graph: RdfQueryTermPattern | Term, graphIris: Set<string>): void {\n if (this.isRdfTerm(graph)) {\n if (graph.termType !== 'NamedNode') {\n throw new UnsupportedSparqlQueryError('Embedded local RDF update only supports named graph documents');\n }\n graphIris.add(graph.value);\n return;\n }\n const values = (graph as { $in?: unknown }).$in;\n if (Array.isArray(values) && values.every((value) => this.isRdfTerm(value))) {\n for (const value of values) {\n if (value.termType !== 'NamedNode') {\n throw new UnsupportedSparqlQueryError('Embedded local RDF update only supports named graph documents');\n }\n graphIris.add(value.value);\n }\n return;\n }\n if (this.isQueryVariable(graph)) {\n return;\n }\n throw new UnsupportedSparqlQueryError('Embedded local RDF update only supports explicit local RDF graph documents');\n }\n\n private addWritableNamedGraphIri(graph: RdfQueryTermPattern | Term, graphIris: Set<string>): void {\n if (!this.isRdfTerm(graph) || graph.termType !== 'NamedNode') {\n throw new UnsupportedSparqlQueryError('Embedded local RDF update only supports explicit local RDF graph write targets');\n }\n if (!this.isByLineRdfIdentifier({ path: graph.value })) {\n throw new UnsupportedSparqlQueryError('Embedded local RDF update only supports by-line local RDF graph write targets');\n }\n graphIris.add(graph.value);\n }\n\n private isQueryVariable(value: unknown): value is { variable: string } {\n return Boolean(value && typeof value === 'object' && 'variable' in value);\n }\n\n private isRdfTerm(value: unknown): value is Term {\n return Boolean(value && typeof value === 'object' && 'termType' in value);\n }\n\n private async readLocalRdfState(identifier: ResourceIdentifier): Promise<{ text: string; existed: boolean }> {\n try {\n return {\n text: await this.readStreamText(await this.rdfFileDataAccessor.getData(identifier)),\n existed: true,\n };\n } catch (error) {\n if (NotFoundHttpError.isInstance(error)) {\n await this.refreshLocalRdfMirror(identifier);\n try {\n return {\n text: await this.readStreamText(await this.rdfFileDataAccessor.getData(identifier)),\n existed: true,\n };\n } catch (retryError) {\n if (NotFoundHttpError.isInstance(retryError)) {\n return { text: '', existed: false };\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 async writeLocalRdfAuthorityPatches(patches: LocalRdfAuthorityPatch[]): Promise<void> {\n const applied: LocalRdfAuthorityPatch[] = [];\n try {\n for (const patch of patches) {\n let localAuthorityWritten = false;\n try {\n const authorityQuads = patch.nextQuads.map((quad) => this.toDefaultGraphQuad(quad));\n await this.writeLocalRdfAuthority(patch.identifier, authorityQuads);\n localAuthorityWritten = true;\n await this.writeStructuredRdfIndex(patch.identifier, authorityQuads, new RepresentationMetadata(patch.identifier));\n applied.push(patch);\n } catch (error) {\n if (localAuthorityWritten) {\n applied.push(patch);\n }\n throw error;\n }\n }\n } catch (error) {\n await this.rollbackLocalRdfAuthorityPatches(applied);\n throw error;\n }\n }\n\n private async rollbackLocalRdfAuthorityPatches(patches: LocalRdfAuthorityPatch[]): Promise<void> {\n const failures: string[] = [];\n for (const patch of patches.slice().reverse()) {\n try {\n if (patch.previousExists) {\n const authorityQuads = patch.previousQuads.map((quad) => this.toDefaultGraphQuad(quad));\n await this.writeLocalRdfAuthority(patch.identifier, authorityQuads);\n await this.writeStructuredRdfIndex(patch.identifier, authorityQuads, new RepresentationMetadata(patch.identifier));\n } else {\n await this.deleteRdfFileResourceIfPresent(patch.identifier);\n await this.deleteLocalRdfIndex(patch.identifier);\n }\n this.invalidateMetadataCache(patch.identifier);\n } catch (rollbackError) {\n failures.push(`${patch.identifier.path}: ${rollbackError instanceof Error ? rollbackError.message : String(rollbackError)}`);\n }\n }\n if (failures.length > 0) {\n this.logger.warn(`Failed to fully roll back local RDF authority patch: ${failures.join('; ')}`);\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 try {\n const metadata = await this.rdfFileDataAccessor.getMetadata(identifier);\n metadata.contentType = this.localRdfContentType(identifier);\n return metadata;\n } catch (error) {\n if (NotFoundHttpError.isInstance(error)) {\n throw error;\n }\n this.logger.warn(`Ignoring unreadable local RDF metadata for ${identifier.path}: ${error instanceof Error ? error.message : String(error)}`);\n return this.createLocalRdfMetadata(identifier, new RepresentationMetadata(identifier));\n }\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"]}
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';\nimport { Parser as SparqlParser } from 'sparqljs';\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 RdfQuery,\n RdfQueryPattern,\n RdfQueryTermPattern,\n RdfSourceInput,\n RdfValuesBindingSource,\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\ninterface LocalRdfGraphState {\n quads: Quad[];\n existed: boolean;\n}\n\ninterface LocalRdfAuthorityPatch {\n identifier: ResourceIdentifier;\n previousQuads: Quad[];\n previousExists: boolean;\n nextQuads: Quad[];\n}\n\n/**\n * MixDataAccessor - Routes data to appropriate storage based on content type\n * \n * - RDF data (internal/quads) -> structuredDataAccessor (Solid RDF engine by default)\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. The structured accessor decides whether\n * unsupported shapes have an explicitly configured compatibility path.\n */\n public async executeSparqlUpdate(query: string, baseIri?: string): Promise<void> {\n if (baseIri) {\n const identifier = { path: baseIri };\n if (await this.shouldApplyLocalRdfSparqlUpdate(identifier)) {\n try {\n const writtenIdentifiers = await this.executeLocalRdfSparqlUpdate(query, identifier, new Set([identifier.path]));\n for (const writtenIdentifier of writtenIdentifiers) {\n this.invalidateMetadataCache(writtenIdentifier);\n }\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 shouldApplyLocalRdfSparqlUpdate(identifier: ResourceIdentifier): Promise<boolean> {\n if (this.isByLineRdfIdentifier(identifier)) {\n return true;\n }\n\n try {\n return this.isLocalMirroredRdf(identifier, await this.getMetadata(identifier));\n } catch (error) {\n if (NotFoundHttpError.isInstance(error)) {\n return true;\n }\n throw error;\n }\n }\n\n private async executeLocalRdfSparqlUpdate(\n query: string,\n identifier: ResourceIdentifier,\n localRdfAuthorityIris: ReadonlySet<string>,\n ): Promise<ResourceIdentifier[]> {\n const parsed = new SparqlParser({ baseIRI: identifier.path }).parse(query);\n const delta = this.rdfSparqlAdapter.compileUpdateDelta(parsed, this.parentContainer(identifier).path, {\n defaultGraph: identifier.path,\n });\n const writableGraphIris = this.localRdfDeltaWriteGraphIris(delta.operations, localRdfAuthorityIris);\n const graphStates = await this.loadLocalRdfDeltaGraphs(delta.operations, writableGraphIris, localRdfAuthorityIris);\n const graphQuads = new Map([...graphStates].map(([ graphIri, state ]) => [graphIri, state.quads]));\n const nextQuadsByGraph = this.applyLocalRdfDelta(graphQuads, delta.operations, writableGraphIris);\n const patches = writableGraphIris.map((graphIri): LocalRdfAuthorityPatch => {\n const previous = graphStates.get(graphIri);\n return {\n identifier: { path: graphIri },\n previousQuads: previous?.quads ?? [],\n previousExists: previous?.existed ?? false,\n nextQuads: nextQuadsByGraph.get(graphIri) ?? [],\n };\n });\n await this.writeLocalRdfAuthorityPatches(patches);\n return patches.map((patch) => patch.identifier);\n }\n\n private applyLocalRdfDelta(\n graphQuads: Map<string, Quad[]>,\n operations: RdfSparqlUpdateDeltaOperation[],\n writableGraphIris: string[],\n ): Map<string, Quad[]> {\n const writableGraphs = new Set(writableGraphIris);\n const byGraph = new Map<string, Map<string, Quad>>();\n for (const [ graphIri, quads ] of graphQuads) {\n byGraph.set(graphIri, new Map(quads.map((quad) => [this.quadKey(quad), quad])));\n }\n const currentQuads = (): Quad[] => [...byGraph.values()].flatMap((quads) => [...quads.values()]);\n const writableQuads = (graphIri: string): Map<string, Quad> => {\n let quads = byGraph.get(graphIri);\n if (!quads) {\n quads = new Map();\n byGraph.set(graphIri, quads);\n }\n return quads;\n };\n const deleteQuads = (quads: Quad[]): void => {\n for (const quad of quads) {\n const target = writableQuads(this.localRdfWriteGraphIri(quad.graph, writableGraphs));\n target.delete(this.quadKey(quad));\n }\n };\n const insertQuads = (quads: Quad[]): void => {\n for (const quad of quads) {\n const target = writableQuads(this.localRdfWriteGraphIri(quad.graph, writableGraphs));\n target.set(this.quadKey(quad), quad);\n }\n };\n\n for (const operation of operations) {\n if (operation.type === 'insert') {\n insertQuads(operation.quads);\n continue;\n }\n\n if (operation.type === 'delete') {\n deleteQuads(operation.quads);\n continue;\n }\n\n if (operation.type === 'insertDeleteWhere') {\n const rows = this.queryLocalUpdateBindings(currentQuads(), operation.query);\n deleteQuads(this.rdfSparqlAdapter.materializeDeleteWhere(operation.deletes, rows));\n insertQuads(this.rdfSparqlAdapter.materializeDeleteWhere(operation.inserts, rows));\n continue;\n }\n\n if (operation.type === 'insertWhere') {\n const rows = this.queryLocalUpdateBindings(currentQuads(), operation.query);\n insertQuads(this.rdfSparqlAdapter.materializeDeleteWhere(operation.inserts, rows));\n continue;\n }\n\n const rows = this.queryLocalUpdateBindings(currentQuads(), operation.query);\n deleteQuads(this.rdfSparqlAdapter.materializeDeleteWhere(operation.template, rows));\n }\n\n return new Map(writableGraphIris.map((graphIri) => [graphIri, [...(byGraph.get(graphIri)?.values() ?? [])]]));\n }\n\n private async loadLocalRdfDeltaGraphs(\n operations: RdfSparqlUpdateDeltaOperation[],\n writableGraphIris: readonly string[],\n localRdfAuthorityIris: ReadonlySet<string>,\n ): Promise<Map<string, LocalRdfGraphState>> {\n const graphIris = this.localRdfDeltaGraphIris(operations, writableGraphIris);\n const graphStates = new Map<string, LocalRdfGraphState>();\n for (const graphIri of graphIris) {\n const graphIdentifier = { path: graphIri };\n if (!this.isLocalRdfAuthorityIdentifier(graphIdentifier, localRdfAuthorityIris)) {\n throw new UnsupportedSparqlQueryError('Embedded local RDF update only supports by-line local RDF graph documents');\n }\n const existing = await this.readLocalRdfState(graphIdentifier);\n const graph = DataFactory.namedNode(graphIri);\n const quads = existing.text.length > 0\n ? await this.parseLocalRdf(graphIdentifier, existing.text, this.localRdfContentType(graphIdentifier))\n .then((items) => items.map((quad) => this.toGraphQuad(quad, graph)))\n : [];\n graphStates.set(graphIri, { quads, existed: existing.existed });\n }\n return graphStates;\n }\n\n private localRdfDeltaGraphIris(\n operations: RdfSparqlUpdateDeltaOperation[],\n writableGraphIris: readonly string[],\n ): string[] {\n const graphIris = new Set<string>(writableGraphIris);\n for (const operation of operations) {\n const graphTerms = operation.type === 'deleteWhere'\n ? [\n ...operation.template.map((item) => item.graph),\n ...this.queryGraphTerms(operation.query),\n ]\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 this.addNamedGraphIris(graph, graphIris);\n }\n }\n return [...graphIris];\n }\n\n private localRdfDeltaWriteGraphIris(\n operations: RdfSparqlUpdateDeltaOperation[],\n localRdfAuthorityIris: ReadonlySet<string>,\n ): string[] {\n const graphIris = new Set<string>();\n for (const operation of operations) {\n if (operation.type === 'deleteWhere') {\n this.addWritableTemplateGraphIris(operation.template.map((item) => item.graph), operation.query, graphIris, localRdfAuthorityIris);\n continue;\n }\n if (operation.type === 'insertDeleteWhere') {\n this.addWritableTemplateGraphIris([\n ...operation.deletes.map((item) => item.graph),\n ...operation.inserts.map((item) => item.graph),\n ], operation.query, graphIris, localRdfAuthorityIris);\n continue;\n }\n if (operation.type === 'insertWhere') {\n this.addWritableTemplateGraphIris(operation.inserts.map((item) => item.graph), operation.query, graphIris, localRdfAuthorityIris);\n continue;\n }\n const graphTerms = operation.quads.map((quad) => quad.graph);\n for (const graph of graphTerms) {\n this.addWritableNamedGraphIri(graph, graphIris, localRdfAuthorityIris);\n }\n }\n if (graphIris.size === 0) {\n throw new UnsupportedSparqlQueryError('Embedded local RDF update requires explicit local RDF graph write targets');\n }\n return [...graphIris];\n }\n\n private addWritableTemplateGraphIris(\n graphs: RdfQueryTermPattern[],\n query: RdfQuery,\n graphIris: Set<string>,\n localRdfAuthorityIris: ReadonlySet<string>,\n ): void {\n for (const graph of graphs) {\n if (this.isQueryVariable(graph)) {\n this.addWritableGraphVariableIris(query, graph.variable, graphIris, localRdfAuthorityIris);\n continue;\n }\n this.addWritableNamedGraphIri(graph, graphIris, localRdfAuthorityIris);\n }\n }\n\n private addWritableGraphVariableIris(\n query: RdfQuery,\n variable: string,\n graphIris: Set<string>,\n localRdfAuthorityIris: ReadonlySet<string>,\n ): void {\n const values = new Set<string>();\n this.collectGraphVariableFilterIris(query, variable, values);\n if (values.size === 0) {\n throw new UnsupportedSparqlQueryError('Embedded local RDF update only supports finite GRAPH variable write targets');\n }\n for (const value of values) {\n this.addWritableNamedGraphIri(DataFactory.namedNode(value) as unknown as Term, graphIris, localRdfAuthorityIris);\n }\n }\n\n private localRdfWriteGraphIri(graph: Term, writableGraphs: Set<string>): string {\n if (graph.termType !== 'NamedNode' || !writableGraphs.has(graph.value)) {\n throw new UnsupportedSparqlQueryError('Embedded local RDF update can only write declared local RDF graph documents');\n }\n return graph.value;\n }\n\n private queryLocalUpdateBindings(\n quads: Quad[],\n query: RdfQuery,\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: RdfQuery): RdfQueryTermPattern[] {\n const graphTerms: RdfQueryTermPattern[] = [];\n const graphVariables = new Set<string>();\n this.collectQueryGraphTerms(query, graphTerms, graphVariables);\n this.collectGraphVariableFilterTerms(query, graphVariables, graphTerms);\n return graphTerms;\n }\n\n private collectQueryGraphTerms(\n query: RdfQuery | {\n patterns: RdfQueryPattern[];\n values?: RdfValuesBindingSource[];\n optional?: RdfQuery['optional'];\n unions?: RdfQuery['unions'];\n minus?: RdfQuery['minus'];\n exists?: RdfQuery['exists'];\n },\n graphTerms: RdfQueryTermPattern[],\n graphVariables: Set<string>,\n ): void {\n for (const pattern of query.patterns) {\n if (!pattern.graph) {\n continue;\n }\n graphTerms.push(pattern.graph);\n if (this.isQueryVariable(pattern.graph)) {\n graphVariables.add(pattern.graph.variable);\n }\n }\n for (const optional of query.optional ?? []) {\n this.collectQueryGraphTerms(Array.isArray(optional) ? { patterns: optional } : optional, graphTerms, graphVariables);\n }\n for (const union of query.unions ?? []) {\n for (const branch of union.branches) {\n this.collectQueryGraphTerms(branch, graphTerms, graphVariables);\n }\n }\n for (const minus of query.minus ?? []) {\n this.collectQueryGraphTerms(minus, graphTerms, graphVariables);\n }\n for (const exists of query.exists ?? []) {\n this.collectQueryGraphTerms(exists, graphTerms, graphVariables);\n }\n }\n\n private collectGraphVariableFilterTerms(\n query: RdfQuery | {\n values?: RdfValuesBindingSource[];\n filters?: RdfQuery['filters'];\n optional?: RdfQuery['optional'];\n unions?: RdfQuery['unions'];\n minus?: RdfQuery['minus'];\n exists?: RdfQuery['exists'];\n },\n graphVariables: Set<string>,\n graphTerms: RdfQueryTermPattern[],\n ): void {\n for (const filter of query.filters ?? []) {\n if (!graphVariables.has(filter.variable)) {\n continue;\n }\n if (filter.value && this.isRdfTerm(filter.value)) {\n graphTerms.push(filter.value);\n }\n for (const value of filter.values ?? []) {\n if (this.isRdfTerm(value)) {\n graphTerms.push(value);\n }\n }\n }\n this.collectGraphVariableValueTerms(query.values ?? [], graphVariables, graphTerms);\n for (const optional of query.optional ?? []) {\n if (!Array.isArray(optional)) {\n this.collectGraphVariableFilterTerms(optional, graphVariables, graphTerms);\n }\n }\n for (const union of query.unions ?? []) {\n for (const branch of union.branches) {\n this.collectGraphVariableFilterTerms(branch, graphVariables, graphTerms);\n }\n }\n for (const minus of query.minus ?? []) {\n this.collectGraphVariableFilterTerms(minus, graphVariables, graphTerms);\n }\n for (const exists of query.exists ?? []) {\n this.collectGraphVariableFilterTerms(exists, graphVariables, graphTerms);\n }\n }\n\n private collectGraphVariableFilterIris(\n query: RdfQuery | {\n values?: RdfValuesBindingSource[];\n filters?: RdfQuery['filters'];\n optional?: RdfQuery['optional'];\n unions?: RdfQuery['unions'];\n minus?: RdfQuery['minus'];\n exists?: RdfQuery['exists'];\n },\n variable: string,\n values: Set<string>,\n ): void {\n for (const filter of query.filters ?? []) {\n if (filter.variable !== variable) {\n continue;\n }\n if ((filter.operator === '$eq' || filter.operator === '$sameTerm') && filter.value && this.isRdfTerm(filter.value)) {\n this.addGraphFilterValueIri(filter.value, values);\n }\n if (filter.operator === '$in') {\n for (const value of filter.values ?? []) {\n if (this.isRdfTerm(value)) {\n this.addGraphFilterValueIri(value, values);\n }\n }\n }\n }\n this.collectGraphVariableValueIris(query.values ?? [], variable, values);\n for (const optional of query.optional ?? []) {\n if (!Array.isArray(optional)) {\n this.collectGraphVariableFilterIris(optional, variable, values);\n }\n }\n for (const union of query.unions ?? []) {\n for (const branch of union.branches) {\n this.collectGraphVariableFilterIris(branch, variable, values);\n }\n }\n for (const minus of query.minus ?? []) {\n this.collectGraphVariableFilterIris(minus, variable, values);\n }\n for (const exists of query.exists ?? []) {\n this.collectGraphVariableFilterIris(exists, variable, values);\n }\n }\n\n private collectGraphVariableValueTerms(\n sources: readonly RdfValuesBindingSource[],\n graphVariables: Set<string>,\n graphTerms: RdfQueryTermPattern[],\n ): void {\n for (const source of sources) {\n for (const variable of source.variables) {\n if (!graphVariables.has(variable)) {\n continue;\n }\n for (const row of source.rows) {\n const value = row[variable];\n if (value) {\n graphTerms.push(value);\n }\n }\n }\n }\n }\n\n private collectGraphVariableValueIris(\n sources: readonly RdfValuesBindingSource[],\n variable: string,\n values: Set<string>,\n ): void {\n for (const source of sources) {\n if (!source.variables.includes(variable)) {\n continue;\n }\n for (const row of source.rows) {\n const value = row[variable];\n if (value) {\n this.addGraphFilterValueIri(value, values);\n }\n }\n }\n }\n\n private addGraphFilterValueIri(value: Term, values: Set<string>): void {\n if (value.termType !== 'NamedNode') {\n throw new UnsupportedSparqlQueryError('Embedded local RDF update GRAPH variable write targets must be named graph documents');\n }\n values.add(value.value);\n }\n\n private addNamedGraphIris(graph: RdfQueryTermPattern | Term, graphIris: Set<string>): void {\n if (this.isRdfTerm(graph)) {\n if (graph.termType !== 'NamedNode') {\n throw new UnsupportedSparqlQueryError('Embedded local RDF update only supports named graph documents');\n }\n graphIris.add(graph.value);\n return;\n }\n const values = (graph as { $in?: unknown }).$in;\n if (Array.isArray(values) && values.every((value) => this.isRdfTerm(value))) {\n for (const value of values) {\n if (value.termType !== 'NamedNode') {\n throw new UnsupportedSparqlQueryError('Embedded local RDF update only supports named graph documents');\n }\n graphIris.add(value.value);\n }\n return;\n }\n if (this.isQueryVariable(graph)) {\n return;\n }\n throw new UnsupportedSparqlQueryError('Embedded local RDF update only supports explicit local RDF graph documents');\n }\n\n private addWritableNamedGraphIri(\n graph: RdfQueryTermPattern | Term,\n graphIris: Set<string>,\n localRdfAuthorityIris: ReadonlySet<string>,\n ): void {\n if (!this.isRdfTerm(graph) || graph.termType !== 'NamedNode') {\n throw new UnsupportedSparqlQueryError('Embedded local RDF update only supports explicit local RDF graph write targets');\n }\n if (!this.isLocalRdfAuthorityIdentifier({ path: graph.value }, localRdfAuthorityIris)) {\n throw new UnsupportedSparqlQueryError('Embedded local RDF update only supports by-line local RDF graph write targets');\n }\n graphIris.add(graph.value);\n }\n\n private isLocalRdfAuthorityIdentifier(\n identifier: ResourceIdentifier,\n localRdfAuthorityIris: ReadonlySet<string>,\n ): boolean {\n return this.isByLineRdfIdentifier(identifier) || localRdfAuthorityIris.has(identifier.path);\n }\n\n private isQueryVariable(value: unknown): value is { variable: string } {\n return Boolean(value && typeof value === 'object' && 'variable' in value);\n }\n\n private isRdfTerm(value: unknown): value is Term {\n return Boolean(value && typeof value === 'object' && 'termType' in value);\n }\n\n private async readLocalRdfState(identifier: ResourceIdentifier): Promise<{ text: string; existed: boolean }> {\n try {\n return {\n text: await this.readStreamText(await this.rdfFileDataAccessor.getData(identifier)),\n existed: true,\n };\n } catch (error) {\n if (NotFoundHttpError.isInstance(error)) {\n await this.refreshLocalRdfMirror(identifier);\n try {\n return {\n text: await this.readStreamText(await this.rdfFileDataAccessor.getData(identifier)),\n existed: true,\n };\n } catch (retryError) {\n if (NotFoundHttpError.isInstance(retryError)) {\n return { text: '', existed: false };\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 async writeLocalRdfAuthorityPatches(patches: LocalRdfAuthorityPatch[]): Promise<void> {\n const applied: LocalRdfAuthorityPatch[] = [];\n try {\n for (const patch of patches) {\n let localAuthorityWritten = false;\n try {\n const authorityQuads = patch.nextQuads.map((quad) => this.toDefaultGraphQuad(quad));\n await this.writeLocalRdfAuthority(patch.identifier, authorityQuads);\n localAuthorityWritten = true;\n await this.writeStructuredRdfIndex(patch.identifier, authorityQuads, new RepresentationMetadata(patch.identifier));\n applied.push(patch);\n } catch (error) {\n if (localAuthorityWritten) {\n applied.push(patch);\n }\n throw error;\n }\n }\n } catch (error) {\n await this.rollbackLocalRdfAuthorityPatches(applied);\n throw error;\n }\n }\n\n private async rollbackLocalRdfAuthorityPatches(patches: LocalRdfAuthorityPatch[]): Promise<void> {\n const failures: string[] = [];\n for (const patch of patches.slice().reverse()) {\n try {\n if (patch.previousExists) {\n const authorityQuads = patch.previousQuads.map((quad) => this.toDefaultGraphQuad(quad));\n await this.writeLocalRdfAuthority(patch.identifier, authorityQuads);\n await this.writeStructuredRdfIndex(patch.identifier, authorityQuads, new RepresentationMetadata(patch.identifier));\n } else {\n await this.deleteRdfFileResourceIfPresent(patch.identifier);\n await this.deleteLocalRdfIndex(patch.identifier);\n }\n this.invalidateMetadataCache(patch.identifier);\n } catch (rollbackError) {\n failures.push(`${patch.identifier.path}: ${rollbackError instanceof Error ? rollbackError.message : String(rollbackError)}`);\n }\n }\n if (failures.length > 0) {\n this.logger.warn(`Failed to fully roll back local RDF authority patch: ${failures.join('; ')}`);\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 try {\n const metadata = await this.rdfFileDataAccessor.getMetadata(identifier);\n metadata.contentType = this.localRdfContentType(identifier);\n return metadata;\n } catch (error) {\n if (NotFoundHttpError.isInstance(error)) {\n throw error;\n }\n this.logger.warn(`Ignoring unreadable local RDF metadata for ${identifier.path}: ${error instanceof Error ? error.message : String(error)}`);\n return this.createLocalRdfMetadata(identifier, new RepresentationMetadata(identifier));\n }\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 await this.ensureUnstructuredParentContainers(identifier);\n\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"]}
@@ -139,6 +139,10 @@
139
139
  "@id": "undefineds:dist/storage/accessors/MixDataAccessor.jsonld#MixDataAccessor__member_executeSparqlUpdate",
140
140
  "memberFieldName": "executeSparqlUpdate"
141
141
  },
142
+ {
143
+ "@id": "undefineds:dist/storage/accessors/MixDataAccessor.jsonld#MixDataAccessor__member_shouldApplyLocalRdfSparqlUpdate",
144
+ "memberFieldName": "shouldApplyLocalRdfSparqlUpdate"
145
+ },
142
146
  {
143
147
  "@id": "undefineds:dist/storage/accessors/MixDataAccessor.jsonld#MixDataAccessor__member_executeLocalRdfSparqlUpdate",
144
148
  "memberFieldName": "executeLocalRdfSparqlUpdate"
@@ -211,6 +215,10 @@
211
215
  "@id": "undefineds:dist/storage/accessors/MixDataAccessor.jsonld#MixDataAccessor__member_addWritableNamedGraphIri",
212
216
  "memberFieldName": "addWritableNamedGraphIri"
213
217
  },
218
+ {
219
+ "@id": "undefineds:dist/storage/accessors/MixDataAccessor.jsonld#MixDataAccessor__member_isLocalRdfAuthorityIdentifier",
220
+ "memberFieldName": "isLocalRdfAuthorityIdentifier"
221
+ },
214
222
  {
215
223
  "@id": "undefineds:dist/storage/accessors/MixDataAccessor.jsonld#MixDataAccessor__member_isQueryVariable",
216
224
  "memberFieldName": "isQueryVariable"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@undefineds.co/xpod",
3
- "version": "0.3.33",
3
+ "version": "0.3.35",
4
4
  "description": "Xpod is an extended Community Solid Server, offering rich-feature, production-level Solid Pod and identity management.",
5
5
  "repository": "https://github.com/undefinedsco/xpod",
6
6
  "author": "developer@undefineds.co",