feat(registry) managing objects and auto assign ids
This commit is contained in:
67
lib/core/Registry.js
Normal file
67
lib/core/Registry.js
Normal file
@@ -0,0 +1,67 @@
|
||||
import Logger from './Logger';
|
||||
export default class Registry {
|
||||
static #registry = new Map();
|
||||
|
||||
constructor() {
|
||||
throw new Error(
|
||||
'Registry is a static class and cannot be instantiated.'
|
||||
);
|
||||
}
|
||||
|
||||
static getParent(uid) {
|
||||
const parent = this.#registry.get(uid)?.parent ?? undefined;
|
||||
if (!parent) return undefined;
|
||||
|
||||
return this.#registry.get(parent)?.obj ?? undefined;
|
||||
}
|
||||
|
||||
static register(data) {
|
||||
const { key, parent, obj, type } = data;
|
||||
if (!key || !obj || !parent)
|
||||
throw new Error('missing required parameters (key, obj, parent)');
|
||||
if (typeof key !== 'string')
|
||||
throw new TypeError('key must be a string');
|
||||
|
||||
const uid = this.#uid();
|
||||
this.#registry.set(uid, { key, parent, obj, type });
|
||||
return uid;
|
||||
}
|
||||
|
||||
static update(uid, data) {
|
||||
if (!this.#registry.has(uid)) throw new Error('uid not found');
|
||||
|
||||
this.#registry.set(uid, { ...this.#registry.get(uid), ...data });
|
||||
}
|
||||
|
||||
static get(uid) {
|
||||
return this.#registry.get(uid)?.obj ?? undefined;
|
||||
}
|
||||
|
||||
static unregister(identifier, key) {
|
||||
if (this.#registry.get(identifier)?.key !== key) {
|
||||
Logger.warn('only the owner can unregister');
|
||||
return false;
|
||||
}
|
||||
return this.#registry.delete(identifier);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates a unique identifier.
|
||||
*
|
||||
* @param {number} [numGroups=1] - The number of groups in the identifier.
|
||||
* @param {number} [groupLength=6] - The length of each group in the identifier.
|
||||
* @returns {string} The unique identifier.
|
||||
*/
|
||||
static #uid(numGroups = 1, groupLength = 6) {
|
||||
let uid = undefined;
|
||||
while (!uid || Registry.#registry.has(uid)) {
|
||||
uid = Array.from(Array(numGroups), () =>
|
||||
Math.random()
|
||||
.toString(36)
|
||||
.substring(2, groupLength + 2)
|
||||
).join('');
|
||||
}
|
||||
|
||||
return uid;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user