UNPKG

@inrupt/solid-client

Version:

Make your web apps work with Solid Pods.

328 lines (327 loc) 17.5 kB
import type { Quad } from "@rdfjs/types"; import type { UrlString, WithResourceInfo, Url, WithServerResourceInfo, SolidDataset, WithChangeLog } from "../interfaces"; /** * Initialise a new [[SolidDataset]] in memory. * * @returns An empty [[SolidDataset]]. */ export declare function createSolidDataset(): SolidDataset; /** * A Parser takes a string and generates {@link https://rdf.js.org/data-model-spec/|RDF/JS Quads}. * * By providing an object conforming to the `Parser` interface, you can handle * RDF serialisations other than `text/turtle`, which `@inrupt/solid-client` * supports by default. This can be useful to retrieve RDF data from sources * other than a Solid Pod. * * A Parser has the following properties: * - `onQuad`: Registers the callback with which parsed * {@link https://rdf.js.org/data-model-spec/|RDF/JS Quads} can be provided to * `@inrupt/solid-client`. * - `onError`: Registers the callback with which `@inrupt/solid-client` can be * notified of errors parsing the input. * - `onComplete`: Registers the callback with which `@inrupt/solid-client` can * be notified that parsing is complete. * - `parse`: Accepts the serialised input string and an object containing the * input Resource's metadata. * The input metadata can be read using functions like [[getSourceUrl]] and * [[getContentType]]. * * For example, the following defines a parser that reads an RDFa serialisation * using the * [rdfa-streaming-parser](https://www.npmjs.com/package/rdfa-streaming-parser) * library: * * ```javascript * import { RdfaParser } from "rdfa-streaming-parser"; * * // ... * * const getRdfaParser = () => { * const onQuadCallbacks = []; * const onCompleteCallbacks = []; * const onErrorCallbacks = []; * * return { * onQuad: (callback) => onQuadCallbacks.push(callback), * onError: (callback) => onErrorCallbacks.push(callback), * onComplete: (callback) => onCompleteCallbacks.push(callback), * parse: async (source, resourceInfo) => { * const parser = new RdfaParser({ * baseIRI: getSourceUrl(resourceInfo), * contentType: getContentType(resourceInfo) ?? "text/html", * }); * parser.on("data", (quad) => { * onQuadCallbacks.forEach((callback) => callback(quad)); * }); * parser.on("error", (error) => { * onErrorCallbacks.forEach((callback) => callback(error)); * }); * parser.write(source); * parser.end(); * onCompleteCallbacks.forEach((callback) => callback()); * }, * }; * }; * ``` */ export type Parser = { onQuad: (onQuadCallback: (quad: Quad) => void) => void; onError: (onErrorCallback: (error: unknown) => void) => void; onComplete: (onCompleteCallback: () => void) => void; parse: (source: string, resourceInfo: WithServerResourceInfo) => void; }; type ContentType = string; /** * Custom parsers to load [[SolidDataset]]s serialised in different RDF formats. * * Provide your own parsers by providing an object on the `parsers` property * with the supported content type as the key, and the parser as a value. * For documentation on how to provide a parser, see [[Parser]]. */ export type ParseOptions = { parsers: Record<ContentType, Parser>; }; /** * @hidden This interface is not exposed yet until we've tried it out in practice. */ export declare function responseToSolidDataset(response: Response, parseOptions?: Partial<ParseOptions>): Promise<SolidDataset & WithServerResourceInfo>; /** * Fetch a SolidDataset from the given URL. Currently requires the SolidDataset to be available as [Turtle](https://www.w3.org/TR/turtle/). * * Note that the URL of a container ends with a [trailing slash "/"](https://solidproject.org/TR/protocol#uri). * If it is missing, some libraries will add it automatically, which may result in additional round-trips, possibly including * authentication errors ([more information](https://github.com/inrupt/solid-client-js/issues/1216#issuecomment-904703695)). * * @param url URL to fetch a [[SolidDataset]] from. * @param options Optional parameter `options.fetch`: An alternative `fetch` function to make the HTTP request, compatible with the browser-native [fetch API](https://developer.mozilla.org/docs/Web/API/WindowOrWorkerGlobalScope/fetch#parameters). * @returns Promise resolving to a [[SolidDataset]] containing the data at the given Resource, or rejecting if fetching it failed. */ export declare function getSolidDataset(url: UrlString | Url, options?: Partial<{ fetch: typeof fetch; } & ParseOptions>): Promise<SolidDataset & WithServerResourceInfo>; /** * Given a SolidDataset, store it in a Solid Pod (overwriting the existing data at the given URL). * * A SolidDataset keeps track of the data changes compared to the data in the Pod; i.e., * the changelog tracks both the old value and new values of the property being modified. This * function applies the changes to the current SolidDataset. If the old value specified in the * changelog does not correspond to the value currently in the Pod, this function will throw an * error (common issues are listed in [the documentation](https://docs.inrupt.com/sdk/javascript-sdkreference/error-codes/)). * * The SolidDataset returned by this function will contain the data sent to the Pod, and a ChangeLog * up-to-date with the saved data. Note that if the data on the server was modified in between the * first fetch and saving it, the updated data will not be reflected in the returned SolidDataset. * To make sure you have the latest data, call [[getSolidDataset]] again after saving the data. * * The Solid server will create any intermediary Containers that do not exist yet, so they do not * need to be created in advance. For example, if the target URL is * https://example.pod/container/resource and https://example.pod/container/ does not exist yet, * it will exist after this function resolves successfully. * * @param url URL to save `solidDataset` to. * @param solidDataset The [[SolidDataset]] to save. * @param options Optional parameter `options.fetch`: An alternative `fetch` function to make the HTTP request, compatible with the browser-native [fetch API](https://developer.mozilla.org/docs/Web/API/WindowOrWorkerGlobalScope/fetch#parameters). * `options.prefixes`: A prefix map to customize the serialization. Only applied on resource creation if the serialization allows it. * @returns A Promise resolving to a [[SolidDataset]] containing the stored data, or rejecting if saving it failed. */ export declare function saveSolidDatasetAt<Dataset extends SolidDataset>(url: UrlString | Url, solidDataset: Dataset, options?: Partial<{ fetch?: typeof fetch; } & { prefixes: Record<string, string>; }>): Promise<Dataset & WithServerResourceInfo & WithChangeLog>; /** * Deletes the SolidDataset at a given URL. * * If operating on a container, the container must be empty otherwise a 409 CONFLICT will be raised. * * @param solidDataset The URL of the SolidDataset to delete or the SolidDataset itself (if it has ResourceInfo). * @since 0.6.0 */ export declare function deleteSolidDataset(solidDataset: Url | UrlString | WithResourceInfo, options?: { fetch?: typeof fetch; }): Promise<void>; /** * Create a Container at the given URL. Some content may optionally be specified, * e.g. to add metadata describing the container. * * Throws an error if creating the Container failed, e.g. because the current user does not have * permissions to, or because the Container already exists. * * Note that a Solid server will automatically create the necessary Containers when storing a * Resource; i.e. there is no need to call this function if it is immediately followed by * [[saveSolidDatasetAt]] or [[overwriteFile]]. * * @param url URL of the empty Container that is to be created. * @param options Optional parameter `options.fetch`: An alternative `fetch` function to make the HTTP request, compatible with the browser-native [fetch API](https://developer.mozilla.org/docs/Web/API/WindowOrWorkerGlobalScope/fetch#parameters). * @param solidDataset Optional parameter - if provided we use this dataset as the body of the HTT request, meaning it's data is included in the Container resource. * @since 0.2.0 */ export declare function createContainerAt(url: UrlString | Url, options?: { fetch?: typeof fetch; initialContent?: SolidDataset; }): Promise<SolidDataset & WithServerResourceInfo>; type SaveInContainerOptions = { fetch?: typeof fetch; slugSuggestion?: string; }; /** * Given a SolidDataset, store it in a Solid Pod in a new Resource inside a Container. * * The Container at the given URL should already exist; if it does not, you can initialise it first * using [[createContainerAt]], or directly save the SolidDataset at the desired location using * [[saveSolidDatasetAt]]. * * This function is primarily useful if the current user does not have access to change existing files in * a Container, but is allowed to add new files; in other words, they have Append, but not Write * access to a Container. This is useful in situations where someone wants to allow others to, * for example, send notifications to their Pod, but not to view or delete existing notifications. * You can pass a suggestion for the new Resource's name, but the server may decide to give it * another name — for example, if a Resource with that name already exists inside the given * Container. * If the user does have access to write directly to a given location, [[saveSolidDatasetAt]] * will do the job just fine, and does not require the parent Container to exist in advance. * * @param containerUrl URL of the Container in which to create a new Resource. * @param solidDataset The [[SolidDataset]] to save to a new Resource in the given Container. * @param options Optional parameter `options.fetch`: An alternative `fetch` function to make the HTTP request, compatible with the browser-native [fetch API](https://developer.mozilla.org/docs/Web/API/WindowOrWorkerGlobalScope/fetch#parameters). * @returns A Promise resolving to a [[SolidDataset]] containing the saved data. The Promise rejects if the save failed. */ export declare function saveSolidDatasetInContainer(containerUrl: UrlString | Url, solidDataset: SolidDataset, options?: SaveInContainerOptions): Promise<SolidDataset & WithResourceInfo>; /** * Create an empty Container inside the Container at the given URL. * * Throws an error if creating the Container failed, e.g. because the current user does not have * permissions to. * * The Container in which to create the new Container should itself already exist. * * This function is primarily useful if the current user does not have access to change existing files in * a Container, but is allowed to add new files; in other words, they have Append, but not Write * access to a Container. This is useful in situations where someone wants to allow others to, * for example, send notifications to their Pod, but not to view or delete existing notifications. * You can pass a suggestion for the new Resource's name, but the server may decide to give it * another name — for example, if a Resource with that name already exists inside the given * Container. * If the user does have access to write directly to a given location, [[createContainerAt]] * will do the job just fine, and does not require the parent Container to exist in advance. * * @param containerUrl URL of the Container in which the empty Container is to * be created. * @param options Optional parameter `options.fetch`: An alternative `fetch` * function to make the HTTP request, compatible with the browser-native [fetch * API](https://developer.mozilla.org/docs/Web/API/WindowOrWorkerGlobalScope/fetch#parameters).`options.slugSuggestion` * accepts a string for your new Container's name. * @returns A promise that resolves to a SolidDataset with ResourceInfo if * successful, and that rejects otherwise. * @since 0.2.0 */ export declare function createContainerInContainer(containerUrl: UrlString | Url, options?: SaveInContainerOptions): Promise<SolidDataset & WithResourceInfo>; /** * Deletes the Container at a given URL. * * @param container The URL of the Container to delete or the Container Dataset itself (if it has ResourceInfo). * @since 0.6.0 */ export declare function deleteContainer(container: Url | UrlString | WithResourceInfo, options?: { fetch?: typeof fetch; }): Promise<void>; /** * Given a [[SolidDataset]] representing a Container (see [[isContainer]]), fetch the URLs of all * contained resources that respect [slash semantics](https://solidproject.org/TR/protocol#uri-slash-semantics) * (see {@link validateContainedResourceAll}). * If the solidDataset given is not a container, or is missing resourceInfo, throw an error. * * @param solidDataset The container from which to fetch all contained Resource URLs. * @returns A list of URLs, each of which points to a contained Resource of the given SolidDataset. * @since 1.3.0 */ export declare function getContainedResourceUrlAll(solidDataset: SolidDataset & WithResourceInfo): UrlString[]; /** * Given a {@link SolidDataset} representing a [Container](https://solidproject.org/TR/protocol#resource-containment) * (see {@link isContainer}), verify that all its containment claims are valid. Containment of a resource is valid if * it respects [slash semantics](https://solidproject.org/TR/protocol#uri-slash-semantics). * * For the example, given a container at https://example.org/container/: * - The following resources are valid: * - https://example.org/container/resource * - https://example.org/container/subcontainer/ * - The following resources are invalid: * - https://example.org/container/resource/invalid (not a direct child resource) * - https://example.org/container2 (not a child resource) * - https://domain2.example.org/container/resource (not a direct child resource) * * If a component claim is invalid, {@link validateContainedResourceAll} returns the invalid component's URL * as part of its return object. * * Note: It is recommended that this function always be used before calling * {@link getContainedResourceUrlAll} since {@link getContainedResourceUrlAll} does not * return Resources for which containment is invalid. Using the function in conjunction * with {@link getContainedResourceUrlAll} allows for the detection of unexpected behaviour from servers, * including malicious containment triples that could appear. Because ESS conforms to the Solid Protocol, * i.e., respects slash semantics for its containment triples, validateContainedResourceAll returns true for * containers fetched from ESS. * * @param solidDataset The container from which containment claims are validated. * @returns A validation report, including the offending contained resources URL if any. * @since 1.30.1 */ export declare function validateContainedResourceAll(solidDataset: SolidDataset & WithResourceInfo): { isValid: boolean; invalidContainedResources: string[]; }; /** * Gets a human-readable representation of the given SolidDataset to aid debugging. * * Note that changes to the exact format of the return value are not considered a breaking change; * it is intended to aid in debugging, not as a serialisation method that can be reliably parsed. * * @param solidDataset The [[SolidDataset]] to get a human-readable representation of. * @since 0.3.0 */ export declare function solidDatasetAsMarkdown(solidDataset: SolidDataset): string; /** * Gets a human-readable representation of the local changes to a Resource to aid debugging. * * Note that changes to the exact format of the return value are not considered a breaking change; * it is intended to aid in debugging, not as a serialisation method that can be reliably parsed. * * @param solidDataset The Resource of which to get a human-readable representation of the changes applied to it locally. * @since 0.3.0 */ export declare function changeLogAsMarkdown(solidDataset: SolidDataset & WithChangeLog): string; /** * @hidden * * Fetch a SolidDataset containing information about the capabilities of the * storage server that hosts the given resource URL. For more information, * please see the [ESS * Documentation](https://docs.inrupt.com/ess/latest/services/discovery-endpoint/#well-known-solid). * * ```typescript * const wellKnown = await getWellKnownSolid(resource); * * // The wellKnown dataset uses a blank node for the subject all of its predicates, * // such that we need to call getThingAll with acceptBlankNodes set to true to * // retrieve back predicates contained within the dataset * const wellKnownSubjects = getThingAll(wellKnown, { * acceptBlankNodes: true, * }); * const wellKnownSubject = wellKnownSubjects[0]; * * // Retrieve a value from the wellKnown dataset: * let notificationGateway = getIri( * wellKnownSubject, * "http://www.w3.org/ns/solid/terms#notificationGateway" * ); * ``` * * * @param url URL of a Resource. * @returns Promise resolving to a [[SolidDataset]] containing the data at * '.well-known/solid' for the given Resource, or rejecting if fetching it * failed. * @since 1.12.0 */ export declare function getWellKnownSolid(url: UrlString | Url): Promise<SolidDataset & WithServerResourceInfo>; export {};