@tendrock/database
Version:
A database lib under the Tendrock ecosystem for Minecraft Bedrock Edition Script API
116 lines (115 loc) • 3.92 kB
JavaScript
import { NamespacedDynamicProperty } from "./NamespacedDynamicProperty";
import { UniqueIdUtils } from "./helper/UniqueIdUtils";
import { Utils } from "./helper/Utils";
export class GameObjectDatabase {
constructor(namespace, parentManager) {
this.namespace = namespace;
this.parentManager = parentManager;
this._dataMap = new Map();
this._dirtyDataIdList = [];
this._dirtyDataIdBuffer = [];
this._isFlushing = false;
this._uid = '';
this._dynamicProperty = NamespacedDynamicProperty.create(namespace);
}
_markDirty(identifier) {
const dirtyIdList = this.isFlushing() ? this._dirtyDataIdBuffer : this._dirtyDataIdList;
if (!dirtyIdList.includes(identifier)) {
dirtyIdList.push(identifier);
}
this.parentManager._markDirty(UniqueIdUtils.RuntimeId, this);
}
getUid() {
return this._uid;
}
set(identifier, value) {
this._dataMap.set(identifier, value);
this._markDirty(identifier);
}
get(identifier) {
return this._dataMap.get(identifier);
}
_canSetAsInstance(obj) {
return obj.toJSON !== undefined;
}
getInstanceImpl(identifier, objectConstructor, createIfAbsent, options) {
const retObj = this.get(identifier);
if (!createIfAbsent && !retObj)
return undefined;
if (retObj instanceof objectConstructor) {
return retObj;
}
const ret = new objectConstructor(retObj, options);
if (!this._canSetAsInstance(ret)) {
throw new Error(`Cannot set instance of ${objectConstructor.name} into ${this.constructor.name} because it doesnt have "toJSON" method.`);
}
this.set(identifier, ret);
return ret;
}
getInstanceOrCreate(identifier, objectConstructor, options) {
return this.getInstanceImpl(identifier, objectConstructor, true, options);
}
getInstance(identifier, objectConstructor, options) {
return this.getInstanceImpl(identifier, objectConstructor, false, options);
}
getInstanceIfPresent(identifier) {
const retObj = this.get(identifier);
if (!retObj || typeof retObj !== 'object')
return undefined;
if (retObj.constructor.name === 'Object') {
return undefined;
}
return retObj;
}
delete(identifier) {
this._dataMap.delete(identifier);
this._markDirty(identifier);
}
forEach(callback) {
this._dataMap.forEach((value, key) => callback(key, value));
}
size() {
return this._dataMap.size;
}
entries() {
return this._dataMap.entries();
}
keys() {
return this._dataMap.keys();
}
values() {
return this._dataMap.values();
}
isFlushing() {
return this._isFlushing;
}
clear() {
const dataIdList = Array.from(this._dataMap.keys());
this._dataMap.clear();
this._dirtyDataIdList = [];
this._dirtyDataIdBuffer = [];
this.clearDynamicProperties(dataIdList);
}
clearDynamicProperties(dataIdList) {
(dataIdList !== null && dataIdList !== void 0 ? dataIdList : Array.from(this._dataMap.keys())).forEach((identifier) => {
this._saveData(UniqueIdUtils.RuntimeId, identifier, undefined);
});
}
_onFlushFinished() {
}
_beginFlush(runtimeId) {
Utils.assertInvokedByTendrock(runtimeId);
this._isFlushing = true;
}
_endFlush(runtimeId) {
Utils.assertInvokedByTendrock(runtimeId);
this._dirtyDataIdList = this._dirtyDataIdBuffer;
this._isFlushing = false;
this._dirtyDataIdBuffer = [];
this._onFlushFinished();
}
_getDirtyDataIdList(runtimeId) {
Utils.assertInvokedByTendrock(runtimeId);
return this._dirtyDataIdList;
}
}