Search / static /reader /formats /reader-format-adapters.js
vomebook
refactor: organize project layout and Reader responsibilities
2c1d035
Raw History Blame Contribute Delete
1.37 kB
(function (root) {
"use strict";
const METHODS = Object.freeze(["open", "render", "restore", "dispose"]);
function createAdapterRegistry() {
const adapters = new Map();
let active = null;
function register(mode, adapter) {
if (!mode || adapters.has(mode)) throw new Error(`READER_ADAPTER_DUPLICATE:${mode}`);
for (const method of METHODS)
if (typeof adapter?.[method] !== "function")
throw new TypeError(`READER_ADAPTER_METHOD:${mode}:${method}`);
const value = Object.freeze({ mode, ...adapter });
adapters.set(mode, value);
return value;
}
function activate(mode) {
const adapter = adapters.get(mode);
if (!adapter) throw new Error(`READER_ADAPTER_MISSING:${mode}`);
active = adapter;
return adapter;
}
function get(mode) {
return adapters.get(mode) || null;
}
function dispose() {
const adapter = active;
active = null;
return adapter ? adapter.dispose() : undefined;
}
return Object.freeze({
register,
activate,
get,
dispose,
get active() {
return active;
},
get modes() {
return [...adapters.keys()];
}
});
}
root.VoiceOfMLReaderAdapters = Object.freeze({ METHODS, createAdapterRegistry });
})(typeof self !== "undefined" ? self : globalThis);