Skip to content

Commit 31bdfef

Browse files
committed
Error
Some Errors were not triggered while saving a data Errors are now correctly throwed while siving your Dara
1 parent ec5714d commit 31bdfef

File tree

4 files changed

+79
-41
lines changed

4 files changed

+79
-41
lines changed

con-database.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ namespace Serializer {
4343
function registrySerializer<K extends string>(kind: K, serializer: (object: any)=>Generator<string>, deserializer: (source: Deserializer<string>)=>void): K;
4444
function getSerializer(kind: string): null | ((object: any)=>Generator<string>)
4545
function getDeserializer(kind: string): ((source: Deserializer<string>)=>void) | null
46-
function setSerializableClass(construct: new (...any: any[])=>any, kind: string, serializer: (object: any)=>Generator<string>, deserializer: (source: Deserializer<string>)=>void): void
46+
function setSerializableClass<T>(construct: new (...any: any[])=>T, kind: string, serializer: (object: T)=>Generator<string>, deserializer: (source: Deserializer<string>)=>T): void
4747
function getKindFromClass(construct: new (...any: any[])=>any): string | null;
4848
function getSerializerKinds(): IterableIterator<string>
4949
function getSerializers(kind: string): {serializer: (object: any)=>Generator<string>, deserializer: (source: Deserializer<string>)=>void}

con-database.js

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ const DYNAMIC_DB_PREFIX = "\u1221\u2112";
77
const ROOT_CONTENT_TABLE_UUID = "c0211201-0001-4001-8001-4f90af596647";
88
const STRING_LIMIT = 32e3;
99
const TABLE_STRING_LENGTH = 31e3;
10+
const GENERATOR_DESERIALIZER_SYMBOL = Symbol("DESERIALIZER");
1011
const eP = {
1112
gDP: eGDP,
1213
sDP: eSDP,
@@ -209,7 +210,6 @@ class DynamicProxy extends JsonDatabase{
209210
return false;
210211
},
211212
deleteProperty(t,p){
212-
console.warn("DELETE: ",p);
213213
if(typeof p === "string") return t.delete(p);
214214
return false;
215215
},
@@ -308,7 +308,14 @@ const Serializer = {
308308
return {...data};
309309
},
310310
setSerializableClass(construct, kind, serializer, deserializer){
311-
Serializer.registrySerializer(kind, serializer, deserializer);
311+
if(typeof serializer !== "function" || typeof deserializer !== "function") throw new TypeError("Serializer or deserializer is not a function");
312+
Serializer.registrySerializer(kind, function(obj){
313+
if(obj == null) throw new TypeError("Null or Undefined is not possible to serialize.");
314+
return serializer(obj);
315+
}, function(obj){
316+
if(obj[GENERATOR_DESERIALIZER_SYMBOL] !== true) throw new TypeError("Null or Undefined is not possible to serialize.");
317+
return deserializer(obj);
318+
});
312319
Serializer.setSerializableKind(construct.prototype,kind);
313320
},
314321
getKindFromClass(construct){
@@ -365,10 +372,17 @@ const DATABASE_MANAGER = {
365372
}
366373
source.set(rootRef, JSONWritable({length:newLength.toString(36),kind},headerData));
367374
}
368-
} finally {
369-
for (let i = newLength; i < oldLength; i++) source.delete(prefix + i);
370375
return newLength;
371376
}
377+
catch(er){
378+
Object.setPrototypeOf(er, DataCoruptionError.prototype);
379+
er.source = source;
380+
er.rootKey = rootRef;
381+
throw er;
382+
}
383+
finally {
384+
for (let i = newLength; i < oldLength; i++) source.delete(prefix + i);
385+
}
372386
},
373387
deserialize(rootRef, source, header = undefined){
374388
try {
@@ -418,7 +432,9 @@ const DATABASE_MANAGER = {
418432
return true;
419433
}
420434
}
435+
421436
Object.defineProperties(DATABASE_MANAGER.deserializer.prototype,Object.getOwnPropertyDescriptors({
437+
[GENERATOR_DESERIALIZER_SYMBOL]: true,
422438
return(){
423439
return {done:true};
424440
},
@@ -442,8 +458,6 @@ Object.defineProperties(DATABASE_MANAGER.deserializer.prototype,Object.getOwnPro
442458
return DESERIALIZER_INFO.get(this).kind;
443459
}
444460
}));
445-
446-
447461
class DynamicTable extends Map{
448462
/**@readonly */
449463
static get KIND(){return "c0211201-0001-4002-8101-4f90af596647";}
@@ -709,7 +723,6 @@ export const registryAPISerializers = ()=>{
709723
for (const key in ItemStackSupportLevel) {
710724
if (Object.hasOwnProperty.call(ItemStackSupportLevel, key)) {
711725
const element = ItemStackSupportLevel[key];
712-
console.warn(key, !!element);
713726
}
714727
}
715728
const ItemStackComponentManager = {

packs/BP/manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
}
1717
],
1818
"dependencies": [
19-
{"module_name": "@minecraft/server","version": "1.7.0"}
19+
{"module_name": "@minecraft/server","version": "1.9.0-beta"}
2020
],
2121
"capabilities": ["script_eval"]
2222
}

packs/BP/scripts/index.js

Lines changed: 57 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,69 @@
1-
import { system, world } from "@minecraft/server";
2-
import { SerializableKinds, JsonDatabase } from "./con-database";
1+
import { system, world, Container } from "@minecraft/server";
2+
import { SerializableKinds } from "./con-database";
33
import { DynamicTable, Serializer } from "./con-database";
4+
import { APISerializableKinds, registryAPISerializers } from "./con-database";
45

56

6-
class MyClassWithMethods {
7-
constructor(id, message){
8-
this.id = id;
9-
this.message = message;
7+
registryAPISerializers();
8+
class ContainerMetadata{
9+
/**@param {Container} container */
10+
static FromContainer(container){
11+
const meta = new ContainerMetadata();
12+
for (let i = 0; i < container.size; i++) {
13+
const item = container.getItem(i);
14+
if(item){
15+
meta.items.push(item);
16+
meta.slots.push(i);
17+
}
18+
}
19+
return meta;
1020
}
11-
warn(){
12-
console.warn(this.id,this.message);
21+
static SaveToContainer(container, meta){
22+
for (const slot of meta.slots) {
23+
container.setItem(slot, meta.items.shift());
24+
}
25+
}
26+
constructor(){
27+
this.items = [];
28+
this.slots = [];
1329
}
1430
}
1531
Serializer.setSerializableClass(
16-
MyClassWithMethods,
17-
"custom-kind-id",
18-
function({id,message}){ // serialization function, called when DynamicTable.set()
32+
ContainerMetadata,
33+
"container-metedata-serialization-id", //do not change this id its unique ti your serializer
34+
function* ({items, slots}){
1935
const objectSerializer = Serializer.getSerializer(SerializableKinds.Object);
20-
return objectSerializer({id,message}); //basic serialization as poor object
36+
yield * objectSerializer(slots); //saving manifest info
37+
const itemSerialzer = Serializer.getSerializer(APISerializableKinds.ItemStack);
38+
for (const item of items) {
39+
throw new Error("Throw test");
40+
yield * itemSerialzer(item);
41+
}
2142
},
22-
function(n){ //deserialization function, called when DynamicTable.get();
23-
const object = Serializer.getDeserializer(SerializableKinds.Object)(n); //loaded poor object
24-
return Object.setPrototypeOf(object, MyClassWithMethods.prototype); //add a MyClassWithMethods prototype
43+
function(n){
44+
const slots = Serializer.getDeserializer(SerializableKinds.Object)(n); //loading info
45+
const itemDeserializer = Serializer.getDeserializer(APISerializableKinds.ItemStack);
46+
const obj = new ContainerMetadata();
47+
obj.slots = slots;
48+
for (const s of slots) {
49+
obj.items.push(itemDeserializer(n));
50+
}
51+
return obj;
2552
}
26-
)
27-
28-
29-
53+
);
3054

31-
const table = DynamicTable.OpenCreate("id-of-the-table");
32-
table.set("key-the-test", new MyClassWithMethods("warn-id", "My custom message"));
3355

34-
35-
table.get("key-the-test").warn(); //warn method from MyClasswithMethods
36-
const jsDB = new JsonDatabase("the id");
37-
jsDB.set("Lmao","adfasdfsa".repeat(600));
38-
jsDB.set("Some test", {asd:"asdfasdf",asds:{asdfasdfa:"asdfasdf"}});
39-
for (const [k,v] of jsDB) {
40-
console.warn(k,v);
41-
}
42-
jsDB.clear();
43-
DynamicTable.ClearAll();
44-
system.runTimeout(()=>console.warn(world.getDynamicPropertyTotalByteCount()), 3);
56+
world.clearDynamicProperties();
57+
const table = DynamicTable.OpenCreate("Testing so far");
58+
let saved = false;
59+
world.afterEvents.chatSend.subscribe(({sender, message})=>{
60+
if(message === "m"){
61+
}else{
62+
if(!saved){
63+
table.set("inv", ContainerMetadata.FromContainer(sender.getComponent("inventory").container));
64+
}else{
65+
ContainerMetadata.SaveToContainer(sender.getComponent("inventory").container, table.get("inv"));
66+
}
67+
saved = !saved;
68+
}
69+
});

0 commit comments

Comments
 (0)