@ocfl/ocfl
Version:
Oxford Common File Layout (OCFL) JS library
154 lines (135 loc) • 4.4 kB
JavaScript
/**
* @module ocfl
*/
const { OcflConstants, OcflDigest, OcflExtension, OcflStorageLayout, OcflStore,
OcflObject, OcflObjectImpl,
OcflObjectInventory, OcflObjectTransactionImpl,
OcflStorage, OcflStorageImpl,
createObjectProxy, createTransactionProxy,
extensions
} = require('./lib/index.js');
// const { FlatDirectStorageLayout,
// FlatOmitPrefixStorageLayout,
// HashAndIdNTupleStorageLayout,
// HashedNTupleStorageLayout,
// NTupleOmitPrefixStorageLayout } = extensions;
/** @typedef {import('./lib/object.js').OcflObjectConfig} OcflObjectConfig */
/** @typedef {import('./lib/storage.js').OcflStorageConfig} OcflStorageConfig */
/**
* @typedef {Object} StorageLayout
* @property {typeof extensions.FlatDirectStorageLayout} FlatDirectStorageLayout
* @property {typeof extensions.FlatOmitPrefixStorageLayout} FlatOmitPrefixStorageLayout
* @property {typeof extensions.HashAndIdNTupleStorageLayout} HashAndIdNTupleStorageLayout
* @property {typeof extensions.HashedNTupleStorageLayout} HashedNTupleStorageLayout
* @property {typeof extensions.NTupleOmitPrefixStorageLayout} NTupleOmitPrefixStorageLayout
* @property {typeof extensions.PathDirectStorageLayout} PathDirectStorageLayout
*/
/** @typedef {import('./lib/extension.js').OcflExtensionConfig} OcflExtensionConfig */
/**
* Create a storage layout from extension name or config
* @param {string|OcflExtensionConfig} config - Layout name or config
*/
function layout(config) {
let name, c;
if (typeof config === 'string') {
name = config;
} else {
name = config.extensionName;
c = config;
}
return OcflStorageLayout.class(name).create(c);
}
let storageLayout = Object.assign(layout, /** @type {StorageLayout} */(OcflStorageLayout.layout))
/**
* Top level OCFL API interface that provides storage and object creation.
* Any backend store implementation module must return the instance of this class.
* @template SO
*/
class Ocfl {
#store;
#defaultOptions;
/**
* @param {typeof OcflStore} store
* @param {SO} defaultOptions
*/
constructor(store, defaultOptions) {
this.#store = store;
this.#defaultOptions = defaultOptions;
}
get OCFL_VERSIONS() { return OcflConstants.OCFL_VERSIONS; }
/**
* Built-in storage layout classes
* @return {StorageLayout}
*/
get StorageLayout() { return OcflStorageLayout.layout }
/**
* Instantiate a storage layout from extension name or config
* @param {string|OcflExtensionConfig} config - Layout name or config
*/
storageLayout(config) {
let name, c;
if (typeof config === 'string') {
name = config;
} else {
name = config.extensionName;
c = config;
}
let cls = OcflStorageLayout.class(name)
if (!cls) throw new Error(`Layout "${name}" is not supported.`);
return cls.create(c);
}
/**
* Instantiate an OCFL Object object
* @param {OcflObjectConfig} config
* @param {SO} [storeOptions]
* @return {OcflObject}
*/
object(config, storeOptions = this.#defaultOptions) {
return new OcflObjectImpl(config, this.#store.getInstance(storeOptions));
}
/**
* Instantiate an OCFL Storage object
* @param {OcflStorageConfig} config
* @param {SO} [storeOptions]
* @return {OcflStorage}
*/
storage(config, storeOptions = this.#defaultOptions) {
return new OcflStorageImpl(config, this.#store.getInstance(storeOptions));
}
/**
* Create a new OCFL Storage
* @param {OcflStorageConfig} config
* @param {SO} [storeOptions]
* @return {Promise<OcflStorage>}
*/
async createStorage(config, storeOptions = this.#defaultOptions) {
return (new OcflStorageImpl(config, this.#store.getInstance(storeOptions))).create();
}
/**
* Load an existing OCFL Storage
* @param {OcflStorageConfig} config
* @param {SO} [storeOptions]
* @return {Promise<OcflStorage>}
*/
async loadStorage(config, storeOptions = this.#defaultOptions) {
return (new OcflStorageImpl(config, this.#store.getInstance(storeOptions))).load();
}
}
module.exports = {
OcflConstants,
OcflDigest,
OcflExtension, OcflStorageLayout,
OcflStore,
OcflObject,
OcflObjectImpl,
OcflObjectInventory,
OcflObjectTransactionImpl,
createObjectProxy,
createTransactionProxy,
OcflStorage, OcflStorageImpl,
Ocfl,
extensions
};
for (let name in extensions) {
extensions[name].register();
}