Rev
This commit is contained in:
		
							parent
							
								
									2c4c450fe8
								
							
						
					
					
						commit
						385d40fe87
					
				
							
								
								
									
										260
									
								
								memory.js
								
								
								
								
							
							
						
						
									
										260
									
								
								memory.js
								
								
								
								
							| 
						 | 
				
			
			@ -131,6 +131,7 @@ class ConstructedData extends ProcessableData {
 | 
			
		|||
     */
 | 
			
		||||
    readString(size){
 | 
			
		||||
        let minibuffer = this.data.buffer.slice(this.cursor, this.cursor + size);
 | 
			
		||||
        this.cursor += size;
 | 
			
		||||
        return new TextDecoder().decode(minibuffer);
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
| 
						 | 
				
			
			@ -145,21 +146,21 @@ class ConstructedData extends ProcessableData {
 | 
			
		|||
     */
 | 
			
		||||
    writeFlags(flag1, flag2, flag3, flag4, flag5, flag6, flag7, flag8){
 | 
			
		||||
        let value = (
 | 
			
		||||
            (flag1 << 1) |
 | 
			
		||||
            (flag2 << 2) |
 | 
			
		||||
            (flag3 << 3) |
 | 
			
		||||
            (flag4 << 4) |
 | 
			
		||||
            (flag5 << 5) |
 | 
			
		||||
            (flag6 << 6) |
 | 
			
		||||
            (flag7 << 7) |
 | 
			
		||||
            (flag8 << 8)
 | 
			
		||||
            (flag1 << 0) |
 | 
			
		||||
            (flag2 << 1) |
 | 
			
		||||
            (flag3 << 2) |
 | 
			
		||||
            (flag4 << 3) |
 | 
			
		||||
            (flag5 << 4) |
 | 
			
		||||
            (flag6 << 5) |
 | 
			
		||||
            (flag7 << 6) |
 | 
			
		||||
            (flag8 << 7)
 | 
			
		||||
        );
 | 
			
		||||
        this.writeUInt8(value);
 | 
			
		||||
    }
 | 
			
		||||
    /** @returns {number[]} */
 | 
			
		||||
    readFlags(){
 | 
			
		||||
        let value = this.readUInt8();
 | 
			
		||||
        let result = (
 | 
			
		||||
        let result = [
 | 
			
		||||
            (value >> 0 & 0x1),
 | 
			
		||||
            (value >> 1 & 0x1),
 | 
			
		||||
            (value >> 2 & 0x1),
 | 
			
		||||
| 
						 | 
				
			
			@ -168,7 +169,7 @@ class ConstructedData extends ProcessableData {
 | 
			
		|||
            (value >> 5 & 0x1),
 | 
			
		||||
            (value >> 6 & 0x1),
 | 
			
		||||
            (value >> 7 & 0x1)
 | 
			
		||||
        );
 | 
			
		||||
        ];
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
| 
						 | 
				
			
			@ -353,12 +354,245 @@ class ConstructedData extends ProcessableData {
 | 
			
		|||
        }
 | 
			
		||||
    }
 | 
			
		||||
    /** @param {Date|string} dateorString  */
 | 
			
		||||
    writeDate(dateorString){
 | 
			
		||||
    writeTime(dateorString){
 | 
			
		||||
        let date = new Date(dateorString);
 | 
			
		||||
        this.writeUInt32(+date);
 | 
			
		||||
    }
 | 
			
		||||
    /** @returns {Date}  */
 | 
			
		||||
    readDate(){
 | 
			
		||||
    readTime(){
 | 
			
		||||
        return new Date(this.readUInt32());
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class DataAnchor extends ConstructedData {
 | 
			
		||||
    /**
 | 
			
		||||
     * @param {string|number} name 
 | 
			
		||||
     * @returns {{read:Function,write:Function,sign:number,name:string,primitive:boolean}}
 | 
			
		||||
     */
 | 
			
		||||
    getProcessor(name)
 | 
			
		||||
    {
 | 
			
		||||
        switch(name)
 | 
			
		||||
        {
 | 
			
		||||
            case "uint8":
 | 
			
		||||
            case "byte": 
 | 
			
		||||
            case 1: return {
 | 
			
		||||
                read : () => this.readUInt8(),
 | 
			
		||||
                write : value => this.writeUInt8(value),
 | 
			
		||||
                sign: 1,
 | 
			
		||||
                name: "uint8",
 | 
			
		||||
                primitive: true
 | 
			
		||||
            }
 | 
			
		||||
            case "uint16":
 | 
			
		||||
            case 2: return {
 | 
			
		||||
                read : () => this.readUInt16(),
 | 
			
		||||
                write : value => this.writeUInt16(value),
 | 
			
		||||
                sign: 2,
 | 
			
		||||
                name: "uint16",
 | 
			
		||||
                primitive: true
 | 
			
		||||
            }
 | 
			
		||||
            case "uint32":
 | 
			
		||||
            case 3: return {
 | 
			
		||||
                read : () => this.readUInt32(),
 | 
			
		||||
                write : value => this.writeUInt32(value),
 | 
			
		||||
                sign: 3,
 | 
			
		||||
                name: "uint32",
 | 
			
		||||
                primitive: true
 | 
			
		||||
            }
 | 
			
		||||
            case "int8":
 | 
			
		||||
            case 4: return {
 | 
			
		||||
                read : () => this.readInt8(),
 | 
			
		||||
                write : value => this.writeInt8(value),
 | 
			
		||||
                sign: 4,
 | 
			
		||||
                name: "int8",
 | 
			
		||||
                primitive: true
 | 
			
		||||
            }
 | 
			
		||||
            case "int16":
 | 
			
		||||
            case 5: return {
 | 
			
		||||
                read : () => this.readInt16(),
 | 
			
		||||
                write : value => this.writeInt16(value),
 | 
			
		||||
                sign: 5,
 | 
			
		||||
                name: "int16",
 | 
			
		||||
                primitive: true
 | 
			
		||||
            }
 | 
			
		||||
            case "int32":
 | 
			
		||||
            case 6: return {
 | 
			
		||||
                read : () => this.readInt32(),
 | 
			
		||||
                write : value => this.writeInt32(value),
 | 
			
		||||
                sign: 6,
 | 
			
		||||
                name: "int32",
 | 
			
		||||
                primitive: true
 | 
			
		||||
            }
 | 
			
		||||
            case "float32":
 | 
			
		||||
            case 7: return {
 | 
			
		||||
                read : () => this.readFloat32(),
 | 
			
		||||
                write : value => this.writeFloat32(value),
 | 
			
		||||
                sign: 7,
 | 
			
		||||
                name: "float32",
 | 
			
		||||
                primitive: true
 | 
			
		||||
            }
 | 
			
		||||
            case "float64":
 | 
			
		||||
            case 8: return {
 | 
			
		||||
                read : () => this.readFloat64(),
 | 
			
		||||
                write : value => this.writeFloat64(value),
 | 
			
		||||
                sign: 8,
 | 
			
		||||
                name: "float64",
 | 
			
		||||
                primitive: true
 | 
			
		||||
            }
 | 
			
		||||
            case "string":
 | 
			
		||||
            case 9: return {
 | 
			
		||||
                read : size => this.readString(size),
 | 
			
		||||
                write : value => this.writeString(value),
 | 
			
		||||
                sign: 9,
 | 
			
		||||
                name: "string",
 | 
			
		||||
                primitive: false
 | 
			
		||||
            }
 | 
			
		||||
            case "rgb":
 | 
			
		||||
            case 10: return {
 | 
			
		||||
                read : () => this.readRGB(),
 | 
			
		||||
                write : value => this.writeRGB(value),
 | 
			
		||||
                sign: 10,
 | 
			
		||||
                name: "rgb",
 | 
			
		||||
                primitive: true
 | 
			
		||||
            }
 | 
			
		||||
            case "rgba":
 | 
			
		||||
            case 11: return {
 | 
			
		||||
                read : () => this.readRGBA(),
 | 
			
		||||
                write : value => this.writeRGBA(value),
 | 
			
		||||
                sign: 11,
 | 
			
		||||
                name: "rgba",
 | 
			
		||||
                primitive: true
 | 
			
		||||
            }
 | 
			
		||||
            case "varnumber":
 | 
			
		||||
            case 12: return {
 | 
			
		||||
                read : () => this.readVarNumber(),
 | 
			
		||||
                write : value => this.writeVarNumber(value),
 | 
			
		||||
                sign: 12,
 | 
			
		||||
                name: "varnumber",
 | 
			
		||||
                primitive: true
 | 
			
		||||
            }
 | 
			
		||||
            case "time":
 | 
			
		||||
            case 13: return {
 | 
			
		||||
                read : () => this.readTime(),
 | 
			
		||||
                write : value => this.writeTime(value),
 | 
			
		||||
                sign: 13,
 | 
			
		||||
                name: "time",
 | 
			
		||||
                primitive: true
 | 
			
		||||
            }
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class DataStructure {
 | 
			
		||||
    /** @type {boolean} */
 | 
			
		||||
    sign = true;
 | 
			
		||||
    /** @type {string} */
 | 
			
		||||
    type = "uint8";
 | 
			
		||||
    /** @type {boolean} */
 | 
			
		||||
    list = true;
 | 
			
		||||
    /** @type {boolean} */
 | 
			
		||||
    fixedLength = true;
 | 
			
		||||
    /** @type {any} */
 | 
			
		||||
    value = null;
 | 
			
		||||
    size = 1;
 | 
			
		||||
    /** @param {DataAnchor} da  */
 | 
			
		||||
    setData(da){
 | 
			
		||||
        let dataCost = da.getProcessor(this.type);
 | 
			
		||||
        if(this.sign == true)
 | 
			
		||||
        {
 | 
			
		||||
            // Verinin içine veri türüni işliyor
 | 
			
		||||
            da.writeUInt8(dataCost.sign);
 | 
			
		||||
        }
 | 
			
		||||
        if(this.fixedLength == false && this.list == true)
 | 
			
		||||
        {
 | 
			
		||||
            // Eğer sabit uzunlukta değilse ne kadar uzun olduğunu bildirmeli
 | 
			
		||||
            da.writeVarNumber(this.size)
 | 
			
		||||
        }
 | 
			
		||||
        if(dataCost.primitive)
 | 
			
		||||
        {
 | 
			
		||||
            if(this.list == true)
 | 
			
		||||
            {
 | 
			
		||||
                for (const data of this.value)
 | 
			
		||||
                {
 | 
			
		||||
                    dataCost.write(data);
 | 
			
		||||
                }
 | 
			
		||||
            }else{
 | 
			
		||||
                dataCost.write(this.value);
 | 
			
		||||
            }
 | 
			
		||||
        }else{
 | 
			
		||||
            if(this.list == true)
 | 
			
		||||
            {
 | 
			
		||||
                for (const data of this.value)
 | 
			
		||||
                {
 | 
			
		||||
                    da.writeVarNumber(data.length);
 | 
			
		||||
                    dataCost.write(data);
 | 
			
		||||
                }
 | 
			
		||||
            }else{
 | 
			
		||||
                da.writeVarNumber(this.value.length);
 | 
			
		||||
                dataCost.write(this.value);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    /** @param {DataAnchor} da  */
 | 
			
		||||
    getData(da){
 | 
			
		||||
        let result = null, sign;
 | 
			
		||||
        if(this.sign == true)
 | 
			
		||||
        {
 | 
			
		||||
            // Verinin içine veri türüni işliyor
 | 
			
		||||
            sign = da.readUInt8();
 | 
			
		||||
        }
 | 
			
		||||
        let dataCost = da.getProcessor(this.type);
 | 
			
		||||
        if(this.fixedLength == false && this.list == true)
 | 
			
		||||
        {
 | 
			
		||||
            // Eğer sabit uzunlukta değilse ne kadar uzun olduğunu bildirmeli
 | 
			
		||||
            this.size = da.readVarNumber();
 | 
			
		||||
        }
 | 
			
		||||
        if(dataCost.primitive)
 | 
			
		||||
        {
 | 
			
		||||
            if(this.list == true)
 | 
			
		||||
            {
 | 
			
		||||
                result = [];
 | 
			
		||||
                for (const data of this.value)
 | 
			
		||||
                {
 | 
			
		||||
                    result.push(dataCost.read());
 | 
			
		||||
                }
 | 
			
		||||
            }else{
 | 
			
		||||
                result = dataCost.read();
 | 
			
		||||
            }
 | 
			
		||||
        }else{
 | 
			
		||||
            if(this.list == true)
 | 
			
		||||
            {
 | 
			
		||||
                result = [];
 | 
			
		||||
                for (const data of this.value)
 | 
			
		||||
                {
 | 
			
		||||
                    let length = da.readVarNumber(data.length);
 | 
			
		||||
                    result.push(dataCost.read(length));
 | 
			
		||||
                }
 | 
			
		||||
            }else{
 | 
			
		||||
                let length = da.readVarNumber(data.length);
 | 
			
		||||
                result = dataCost.read(length);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
    /** @param {string} dataSigner  */
 | 
			
		||||
    setHeadSigner(dataSigner){
 | 
			
		||||
        let regex = /^(\w+)(\[\d*\])?$/.exec(dataSigner);
 | 
			
		||||
 | 
			
		||||
        if(regex[1] == 'any')
 | 
			
		||||
        {
 | 
			
		||||
            this.sign = true;
 | 
			
		||||
        }else{
 | 
			
		||||
            this.sign = false;
 | 
			
		||||
            this.type = regex[1];
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if(regex[2])
 | 
			
		||||
        {
 | 
			
		||||
            this.list = true;
 | 
			
		||||
            this.fixedLength = regex[2] != '[]'
 | 
			
		||||
            this.size = regex[2].slice(1,-1) | 0;
 | 
			
		||||
        }else{
 | 
			
		||||
            this.list = false;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue