///
import { Writable, Readable } from 'stream';
import { ReadStream } from 'fs';
import ContentManager from './ContentManager';
import ContentTypeCache from './ContentTypeCache';
import ContentTypeInformationRepository from './ContentTypeInformationRepository';
import LibraryManager from './LibraryManager';
import PackageImporter from './PackageImporter';
import TemporaryFileManager from './TemporaryFileManager';
import { ContentId, ContentParameters, IContentMetadata, IContentStorage, IEditorModel, IH5PConfig, IHubInfo, IKeyValueStorage, ILibraryDetailedDataForClient, ILibraryInstallResult, ILibraryName, ILibraryOverviewForClient, ILibraryStorage, ISemanticsEntry, ITemporaryFileStorage, ITranslationFunction, IUrlGenerator, IUser } from './types';
export default class H5PEditor {
protected cache: IKeyValueStorage;
config: IH5PConfig;
libraryStorage: ILibraryStorage;
contentStorage: IContentStorage;
temporaryStorage: ITemporaryFileStorage;
private urlGenerator;
/**
* @param cache the cache is used to store key - value pairs that must be
* accessed often; values stored in it must be accessible by ALL instances
* of the editor (across machines)
* @param config the configuration values for the editor; note that the
* editor can also change these values and save them!
* @param libraryStorage the storage object for libraries
* @param contentStorage the storage object for content
* @param temporaryStorage the storage object for temporary files
* @param translationCallback a function that is called to retrieve
* translations of keys in a certain language; the keys use the i18next
* format (e.g. namespace:key). See the ITranslationFunction documentation
* for more details.
*/
constructor(cache: IKeyValueStorage, config: IH5PConfig, libraryStorage: ILibraryStorage, contentStorage: IContentStorage, temporaryStorage: ITemporaryFileStorage, translationCallback?: ITranslationFunction, urlGenerator?: IUrlGenerator);
contentManager: ContentManager;
contentTypeCache: ContentTypeCache;
contentTypeRepository: ContentTypeInformationRepository;
libraryManager: LibraryManager;
packageImporter: PackageImporter;
temporaryFileManager: TemporaryFileManager;
private contentMetadataValidator;
private contentStorer;
private copyrightSemantics;
private dependencyGetter;
private metadataSemantics;
private packageExporter;
private renderer;
private semanticsLocalizer;
/**
* Deletes a piece of content and all files dependent on it.
* @param contentId the piece of content to delete
* @param user the user who wants to delete it
*/
deleteContent(contentId: ContentId, user: IUser): Promise;
/**
* Creates a .h5p-package for the specified content file and pipes it to the stream.
* Throws H5pErrors if something goes wrong. The contents of the stream should be disregarded then.
* @param contentId The contentId for which the package should be created.
* @param outputWritable The writable that the package is written to (e.g. the response stream fo Express)
*/
exportContent(contentId: ContentId, outputWritable: Writable, user: IUser): Promise;
/**
* Returns all the data needed to editor or display content
* @param contentId the content id
* @param user (optional) the user who wants to access the content; if undefined, access will be granted
* @returns all relevant information for the content (you can send it back to the GET request for content)
*/
getContent(contentId: ContentId, user?: IUser): Promise<{
h5p: IContentMetadata;
library: string;
params: {
metadata: IContentMetadata;
params: ContentParameters;
};
}>;
/**
* Returns a readable for a file that was uploaded for a content object.
* The requested content file can be a temporary file uploaded for unsaved content or a
* file in permanent content storage.
* @param contentId the content id (undefined if retrieved for unsaved content)
* @param filename the file to get (without 'content/' prefix!)
* @param user the user who wants to retrieve the file
* @param rangeStart (optional) the position in bytes at which the stream should start
* @param rangeEnd (optional) the position in bytes at which the stream should end
* @returns a readable of the content file
*/
getContentFileStream(contentId: ContentId, filename: string, user: IUser, rangeStart?: number, rangeEnd?: number): Promise;
/**
* Returns the content type cache for a specific user. This includes all available content types for the user (some
* might be restricted) and what the user can do with them (update, install from Hub).
*/
getContentTypeCache(user: IUser): Promise;
/**
* Returns detailed information about an installed library.
*/
getLibraryData(machineName: string, majorVersion: string, minorVersion: string, language?: string): Promise;
/**
* Returns a readable stream of a library file's contents.
* Throws an exception if the file does not exist.
* @param library library
* @param filename the relative path inside the library
* @returns a readable stream of the file's contents
*/
getLibraryFileStream(library: ILibraryName, filename: string): Promise;
/**
* Gets a rough overview of information about the requested libraries.
* @param ubernames
*/
getLibraryOverview(ubernames: string[]): Promise;
/**
* Installs a content type from the H5P Hub.
* @param machineName The name of the content type to install (e.g. H5P.Test) Note that this is not a full ubername!
* @returns a list of installed libraries if successful. Will throw errors if something goes wrong.
*/
installLibraryFromHub(machineName: string, user: IUser): Promise;
/**
* Retrieves the installed languages for libraries
* @param libraryUbernames A list of libraries for which the language files should be retrieved.
* In this list the names of the libraries don't use hyphens to separate
* machine name and version.
* @param language the language code to get the files for
* @returns The strings of the language files
*/
listLibraryLanguageFiles(libraryUbernames: string[], language: string): Promise<{
[key: string]: string;
}>;
/**
* Renders the content. This means that a frame in which the editor is displayed is generated and returned. You can
* override the default frame by calling setRenderer(...).
* @param contentId
* @returns the rendered frame that you can include in your website. Normally a string, but can be anything you want it to be if you override the renderer.
*/
render(contentId: ContentId, language?: string): Promise;
/**
* Stores an uploaded file in temporary storage.
* @param contentId the id of the piece of content the file is attached to; Set to null/undefined if
* the content hasn't been saved before.
* @param field the semantic structure of the field the file is attached to.
* @param file information about the uploaded file
* @returns information about the uploaded file
*/
saveContentFile(contentId: ContentId, field: ISemanticsEntry, file: {
data: Buffer;
mimetype: string;
name: string;
size: number;
}, user: IUser): Promise<{
height?: number;
mime: string;
path: string;
width?: number;
}>;
/**
* Stores new content or updates existing content.
* Copies over files from temporary storage if necessary.
* @param contentId the contentId of existing content (undefined or previously unsaved content)
* @param parameters the content parameters (=content.json)
* @param metadata the content metadata (~h5p.json)
* @param mainLibraryUbername the ubername with whitespace as separator (no hyphen!)
* @param user the user who wants to save the piece of content
* @returns the existing contentId or the newly assigned one
*/
saveOrUpdateContent(contentId: ContentId, parameters: ContentParameters, metadata: IContentMetadata, mainLibraryUbername: string, user: IUser): Promise;
/**
* Stores new content or updates existing content.
* Copies over files from temporary storage if necessary.
* @param contentId the contentId of existing content (undefined or previously unsaved content)
* @param parameters the content parameters (=content.json)
* @param metadata the content metadata (~h5p.json)
* @param mainLibraryUbername the ubername with whitespace as separator (no hyphen!)
* @param user the user who wants to save the piece of content
* @returns the existing contentId or the newly assigned one and the metatdata
*/
saveOrUpdateContentReturnMetaData(contentId: ContentId, parameters: ContentParameters, metadata: IContentMetadata, mainLibraryUbername: string, user: IUser): Promise<{
id: string;
metadata: IContentMetadata;
}>;
/**
* By setting custom copyright semantics, you can customize what licenses
* are displayed when editing metadata of files.
*
* NOTE: It is unclear if copyrightSemantics is deprecated in the H5P
* client. Use setMetadataSemantics instead, which certainly works.
*
* NOTE: The semantic structure is localized before delivered to the H5P
* client. If you change it, you must either make sure there is a appropriate
* language file loaded in your translation library (and set one in the
* first place).
* @param copyrightSemantics a semantic structure similar to the one used in
* semantics.json of regular H5P libraries. See https://h5p.org/semantics
* for more documentation. However, you can only add one entry (which can
* be nested). See the file assets/defaultCopyrightSemantics.json for the
* default version which you can build on.
* @returns the H5PEditor object that you can use to chain method calls
*/
setCopyrightSemantics(copyrightSemantics: ISemanticsEntry): H5PEditor;
/**
* By setting custom metadata semantics, you can customize what licenses are
* displayed when editing metadata of content object and files.
*
* NOTE: It is only trivial to change the license offered as a a selection
* to the editors. All other semantic entries CANNOT be changed, as the
* form displayed in the editor is hard-coded in h5peditor-metadata.js in
* the client. You'll have to replace this file with a custom implementation
* if you want to change more metadata.
*
* NOTE: The semantic structure is localized before delivered to the H5P
* client. If you change it, you must either make sure there is a appropriate
* language file loaded in your translation library (and set one in the
* first place).
* @param metadataSemantics a semantic structure similar to the one used in
* semantics.json of regular H5P libraries. See https://h5p.org/semantics
* for more documentation. See the file assets/defaultMetadataSemantics.json
* for the default version which you can build on
* @returns the H5PEditor object that you can use to chain method calls
*/
setMetadataSemantics(metadataSemantics: ISemanticsEntry[]): H5PEditor;
/**
* By setting a custom renderer you can change the way the editor produces
* HTML output
* @param renderer
* @returns the H5PEditor object that you can use to chain method calls
*/
setRenderer(renderer: (model: IEditorModel) => string | any): H5PEditor;
/**
* Adds the contents of a package to the system: Installs required libraries (if
* the user has the permissions for this), adds files to temporary storage and
* returns the actual content information for the editor to process.
* Throws errors if something goes wrong.
* @param data the raw data of the h5p package as a buffer
* @param user the user who is uploading the package; optional if onlyInstallLibraries
* is set to true
* @param options (optional) further options:
* @param onlyInstallLibraries true if content should be disregarded
* @returns the content information extracted from the package. The metadata
* and parameters property will be undefined if onlyInstallLibraries was set
* to true.
*/
uploadPackage(data: Buffer, user?: IUser, options?: {
onlyInstallLibraries?: boolean;
}): Promise<{
installedLibraries: ILibraryInstallResult[];
metadata?: IContentMetadata;
parameters?: any;
}>;
/**
* If a file is a video, an audio file or an image, the filename is suffixed
* with the corresponding directory (videos, audios, images).
* @param filename the filename including the file extension
* @returns the path including the directory; the same if the filename is not a video, audio file or image
*/
private addDirectoryByMimetype;
/**
* Recursively crawls through the parameters and finds usages of libraries.
* @param parameters the parameters to scan
* @param collect a collecting object used by the recursion. Do not use
* @returns a list of libraries that are referenced in the parameters
*/
private findLibrariesInParameters;
private generateContentMetadata;
private generateEditorIntegration;
private generateIntegration;
/**
* Returns a list of addons that should be used for the library
* @param machineName the library identified by its machine name
* @returns a list of addons
*/
private getAddonsForLibrary;
/**
* Returns a functions that replaces the h5p editor language file with the
* one for the language desired. Checks if the H5P editor core supports
* a language and falls back to English if it doesn't. Also removes region
* suffixes like the US in 'en-US' if it can't find a language file with
* the suffix.
* @param language
*/
private getLanguageReplacer;
private listAssets;
private listCoreScripts;
private listCoreStyles;
private resolveDependencies;
private validateLanguageCode;
}