UNPKG

tripledoc

Version:

Library to read, create and update documents on a Solid Pod

63 lines (51 loc) 2.32 kB
import { Reference } from '..'; import { head, createInContainer } from '../pod'; import { Dataset } from '../n3dataset'; import { SubjectCache, DocumentMetadata, LocalTripleDocumentForContainer, instantiateBareTripleDocument, getPendingChanges, extractAclRef, instantiateDocument } from '../document'; /** * @internal */ export function instantiateLocalTripleDocumentForContainer(dataset: Dataset, subjectCache: SubjectCache, metadata: DocumentMetadata & { containerRef: Reference; }): LocalTripleDocumentForContainer { const bareTripleDocument = instantiateBareTripleDocument(subjectCache, metadata); const save = async (subjects = Object.values(subjectCache.getAccessedSubjects())) => { const pendingChanges = getPendingChanges(subjects, localTripleDocumentForContainer, dataset); let updatedMetadata: DocumentMetadata & { existsOnPod: true; documentRef: Reference; }; const containerResponse = await createInContainer(metadata.containerRef, pendingChanges.allAdditions); const locationHeader = containerResponse.headers.get('Location'); if (!containerResponse.ok || locationHeader === null) { const message = await containerResponse.text(); throw new Error(message); } const documentRef = new URL(locationHeader, new URL(metadata.containerRef).origin).href; updatedMetadata = { ...metadata, containerRef: undefined, documentRef: documentRef, existsOnPod: true, }; const documentResponse = await head(documentRef); const aclRef = extractAclRef(documentResponse, documentRef); if (aclRef) { updatedMetadata.aclRef = aclRef; } const webSocketRef = documentResponse.headers.get('Updates-Via'); if (webSocketRef) { updatedMetadata.webSocketRef = webSocketRef; } // Instantiate a new TripleDocument that includes the updated Triples: return instantiateDocument(pendingChanges.newTriples, updatedMetadata); }; const localTripleDocumentForContainer: LocalTripleDocumentForContainer = { ...bareTripleDocument, save: save, }; // Make sure that when TripleSubjects get initialised for this Document, // they're attached to this Document instance: subjectCache.setDocument(localTripleDocumentForContainer); return localTripleDocumentForContainer; }