2
0
mirror of https://github.com/esiur/esiur-js.git synced 2025-06-27 07:13:12 +00:00

static arrays

This commit is contained in:
2021-07-14 05:14:59 +03:00
parent 6d2e4156cf
commit ba4d841aa5
9 changed files with 595 additions and 303 deletions

View File

@ -710,7 +710,9 @@ export default class Codec {
static parseRecordArray(data, offset, length, connection)
{
var reply = new AsyncBag();
if (length == 0)
{
reply.seal();
@ -719,30 +721,61 @@ export default class Codec {
var end = offset + length;
var result = data.getUint8(offset++);
var isTyped = (data.getUint8(offset) & 0x10) == 0x10;
var previous = null;
var classId = null;
var result = data.getUint8(offset++) & 0xF;
if (result == RecordComparisonResult.Null)
previous = new AsyncReply(null);
else if (result == RecordComparisonResult.Record)
if (isTyped)
{
var cs = data.getUint32(offset);
var recordLength = cs - 16;
offset += 4;
classId = data.getGuid(offset);
var classId = data.getGuid(offset);
offset += 16;
previous = Codec.parseRecord(data, offset, recordLength, connection, classId);
offset += recordLength;
var template = Warehouse.getTemplateByClassId(classId, TemplateType.Record);
reply.arrayType = template.definedType;
var previous = null;
if (result == RecordComparisonResult.Null)
previous = new AsyncReply(null);
else if (result == RecordComparisonResult.Record
|| result == RecordComparisonResult.RecordSameType)
{
var cs = data.getUint32(offset);
var recordLength = cs;
offset += 4;
previous = Codec.parseRecord(data, offset, recordLength, connection, classId);
offset += recordLength;
}
reply.add(previous);
while (offset < end)
{
result = data.getUint8(offset++);
if (result == RecordComparisonResult.Null)
previous = new AsyncReply(null);
else if (result == RecordComparisonResult.Record
|| result == RecordComparisonResult.RecordSameType)
{
var cs = data.getUint32(offset);
offset += 4;
previous = Codec.parseRecord(data, offset, cs, connection, classId);
offset += cs;
}
else if (result == RecordComparisonResult.Same)
{
// do nothing
}
reply.add(previous);
}
}
reply.Add(previous);
while (offset < end)
else
{
result = data.getUint8(offset++);
var previous = null;
var classId = null;
if (result == RecordComparisonResult.Null)
previous = new AsyncReply(null);
@ -753,26 +786,113 @@ export default class Codec {
offset += 4;
classId = data.getGuid(offset);
offset += 16;
previous = Codec.parseRecord(data, offset, recordLength, connection, classId);
previous = Codec.parseRecord(data, offset, recordLength, connection, classId);
offset += recordLength;
}
else if (result == RecordComparisonResult.RecordSameType)
{
var cs = data.getUint32(offset);
offset += 4;
previous = Codec.parseRecord(data, offset, cs, connection, classId);
offset += cs;
}
else if (result == RecordComparisonResult.Same)
{
// do nothing
}
reply.Add(previous);
while (offset < end)
{
result = data.getUint8(offset++);
if (result == RecordComparisonResult.Null)
previous = new AsyncReply(null);
else if (result == RecordComparisonResult.Record)
{
var cs = data.getUint32(offset);
var recordLength = cs - 16;
offset += 4;
classId = data.getGuid(offset);
offset += 16;
previous = Codec.parseRecord(data, offset, recordLength, connection, classId);
offset += recordLength;
}
else if (result == RecordComparisonResult.RecordSameType)
{
var cs = data.getUint32(offset);
offset += 4;
previous = ParseRecord(data, offset, cs, connection, classId);
offset += cs;
}
else if (result == RecordComparisonResult.Same)
{
// do nothing
}
reply.add(previous);
}
reply.add(previous);
}
reply.seal();
reply.Seal();
return reply;
// var reply = new AsyncBag();
// if (length == 0)
// {
// reply.seal();
// return reply;
// }
// var end = offset + length;
// var result = data.getUint8(offset++);
// var previous = null;
// var classId = null;
// if (result == RecordComparisonResult.Null)
// previous = new AsyncReply(null);
// else if (result == RecordComparisonResult.Record)
// {
// var cs = data.getUint32(offset);
// var recordLength = cs - 16;
// offset += 4;
// classId = data.getGuid(offset);
// offset += 16;
// previous = Codec.parseRecord(data, offset, recordLength, connection, classId);
// offset += recordLength;
// }
// reply.Add(previous);
// while (offset < end)
// {
// result = data.getUint8(offset++);
// if (result == RecordComparisonResult.Null)
// previous = new AsyncReply(null);
// else if (result == RecordComparisonResult.Record)
// {
// var cs = data.getUint32(offset);
// var recordLength = cs - 16;
// offset += 4;
// classId = data.getGuid(offset);
// offset += 16;
// previous = Codec.parseRecord(data, offset, recordLength, connection, classId);
// offset += recordLength;
// }
// else if (result == RecordComparisonResult.RecordSameType)
// {
// var cs = data.getUint32(offset);
// offset += 4;
// previous = Codec.parseRecord(data, offset, cs, connection, classId);
// offset += cs;
// }
// else if (result == RecordComparisonResult.Same)
// {
// // do nothing
// }
// reply.add(previous);
// }
// reply.seal();
// return reply;
}
static parseRecord(data, offset, length, connection, classId = null)
@ -787,15 +907,15 @@ export default class Codec {
length -= 16;
}
var template = Warehouse.getTemplateByClassId(classId);
var template = Warehouse.getTemplateByClassId(classId, TemplateType.Record);
if (template != null)
{
Codec.parseVarArray(data, offset, length, connection).then(ar =>
{
if (template.resourceType != null)
if (template.definedType != null)
{
var record = new template.resourceType();
var record = new template.definedType();
for (var i = 0; i < template.properties.length; i++)
record[template.properties[i].name] = ar[i];

View File

@ -0,0 +1,6 @@
export default
{
Dynamic = 0x0,
Static = 0x10,
Wrapper = 0x20
};

View File

@ -58,7 +58,7 @@ import ProgressType from "../../Core/ProgressType.js";
import ExceptionCode from "../../Core/ExceptionCode.js";
import DistributedResource from './DistributedResource.js';
import ResourceTemplate from '../../Resource/Template/ResourceTemplate.js';
import TypeTemplate from '../../Resource/Template/TypeTemplate.js';
import DistributedResourceQueueItem from './DistributedResourceQueueItem.js';
import DistributedResourceQueueItemType from './DistributedResourceQueueItemType.js';
@ -74,6 +74,7 @@ import WSSocket from '../Sockets/WSSocket.js';
import ClientAuthentication from "../../Security/Authority/ClientAuthentication.js";
import HostAuthentication from "../../Security/Authority/HostAuthentication.js";
import SocketState from "../Sockets/SocketState.js";
import TemplateType from '../../Resource/Template/TemplateType.js';
export default class DistributedConnection extends IStore {
@ -315,7 +316,7 @@ export default class DistributedConnection extends IStore {
case IIPPacketAction.TemplateFromClassName:
case IIPPacketAction.TemplateFromClassId:
case IIPPacketAction.TemplateFromResourceId:
this.IIPReply(packet.callbackId, ResourceTemplate.parse(packet.content));
this.IIPReply(packet.callbackId, TypeTemplate.parse(packet.content));
break;
case IIPPacketAction.QueryLink:
@ -1761,7 +1762,7 @@ export default class DistributedConnection extends IStore {
var templates = [];
for (var i = 0; i < list.length; i++)
templates = templates
.concat(ResourceTemplate.getDependencies(list[i].instance.template)
.concat(TypeTemplate.getDependencies(list[i].instance.template)
.filter(x => !templates.includes(x)));
for(var i = 0; i < templates.length; i++) {
@ -1788,17 +1789,16 @@ export default class DistributedConnection extends IStore {
var self = this;
Warehouse.getTemplateByClassName(className).then(function (t) {
if (t != null)
self.sendReply(IIPPacketAction.TemplateFromClassName, callback)
.addUint32(t.content.length)
.addUint8Array(t.content)
.done();
else {
// reply failed
self.sendError(ErrorType.Management, callback, ExceptionCode.TemplateNotFound);
}
});
var t = Warehouse.getTemplateByClassName(className);
if (t != null) {
self.sendReply(IIPPacketAction.TemplateFromClassName, callback)
.addUint32(t.content.length)
.addUint8Array(t.content)
.done();
} else {
// reply failed
self.sendError(ErrorType.Management, callback, ExceptionCode.TemplateNotFound);
}
}
IIPRequestTemplateFromClassId(callback, classId) {
@ -1972,7 +1972,7 @@ export default class DistributedConnection extends IStore {
if (fi instanceof Function) {
var pi = ResourceTemplate.getFunctionParameters(fi);
var pi = TypeTemplate.getFunctionParameters(fi);
var args = new Array(pi.length);
for (var i = 0; i < pi.length; i++) {
@ -2465,7 +2465,7 @@ export default class DistributedConnection extends IStore {
{
var cs = data.getUint32(offset);
offset += 4;
templates.push(ResourceTemplate.parse(data, offset, cs));
templates.push(TypeTemplate.parse(data, offset, cs));
offset += cs;
}
@ -2512,8 +2512,8 @@ export default class DistributedConnection extends IStore {
if (resource == null)
{
var template = Warehouse.getTemplateByClassId(rt[0]);
if (template?.resourceType != null)
var template = Warehouse.getTemplateByClassId(rt[0], TemplateType.Wrapper);
if (template?.definedType != null)
dr = new template.getDependencies(self, id, rt[1], rt[2]);
else
dr = new DistributedResource(self, id, rt[1], rt[2]);

View File

@ -26,7 +26,7 @@ import {DC, BL} from '../../Data/DataConverter.js';
import DataType from "../../Data/DataType.js";
import Structure from '../../Data/Structure.js';
import IResource from '../IResource.js';
import ResourceTemplate from './ResourceTemplate.js';
import TypeTemplate from './TypeTemplate.js';
import IRecord from '../../Data/IRecord.js';
export default class TemplateDataType
@ -82,12 +82,12 @@ export default class TemplateDataType
else if (type?.prototype instanceof IResource)
{
dataType = DataType.Resource;
typeGuid = ResourceTemplate.getTypeGuid(type);
typeGuid = TypeTemplate.getTypeGuid(type);
}
else if (type?.prototype instanceof IRecord)
{
dataType = DataType.Record;
typeGuid = ResourceTemplate.getTypeGuid(type);
typeGuid = TypeTemplate.getTypeGuid(type);
}
if (isArray)

View File

@ -1,5 +1,7 @@
export default
{
Resource: 0,
Record: 1
Unspecified: 0,
Resource: 1,
Record: 2,
Wrapper: 3,
}

View File

@ -33,7 +33,7 @@ import IResource from '../IResource.js';
import IRecord from '../../Data/IRecord.js';
import TemplateType from './TemplateType.js'
export default class ResourceTemplate {
export default class TypeTemplate {
getEventTemplateByName(eventName) {
for (var i = 0; i < this.events.length; i++)
@ -115,7 +115,7 @@ export default class ResourceTemplate {
getDependenciesFunc = (tmp, bag) =>
{
if (template.resourceType == null)
if (template.definedType == null)
return;
// functions
@ -204,7 +204,7 @@ export default class ResourceTemplate {
return list;
}
constructor(type) {
constructor(type, addToWarehouse) {
this.properties = [];
@ -222,7 +222,7 @@ export default class ResourceTemplate {
else
throw new Error("Type is neither a resource nor a record.");
this.resourceType = type;
this.definedType = type;
var template = type.template;
@ -231,6 +231,10 @@ export default class ResourceTemplate {
this.classId = SHA256.compute(DC.stringToBytes(this.className)).getGuid(0);
if (addToWarehouse)
addToWarehouse.putTemplate(this);
//byte currentIndex = 0;
if (template.properties != null)
@ -356,7 +360,7 @@ export default class ResourceTemplate {
// start parsing...
var od = new ResourceTemplate();
var od = new TypeTemplate();
od.content = data.clip(offset, contentLength);
od.templateType = data.getUint8(offset++);

View File

@ -27,7 +27,7 @@
"use strict";
import AsyncReply from '../Core/AsyncReply.js';
import ResourceTemplate from '../Resource/Template/ResourceTemplate.js';
import TypeTemplate from '../Resource/Template/TypeTemplate.js';
import IEventHandler from '../Core/IEventHandler.js';
import AutoList from '../Data/AutoList.js';
import KeyList from '../Data/KeyList.js';
@ -40,7 +40,7 @@ import IndexedDBStore from '../Stores/IndexedDBStore.js';
import ResourceProxy from '../Proxy/ResourceProxy.js';
import AsyncBag from '../Core/AsyncBag.js';
import IRecord from '../Data/IRecord.js';
import TemplateType from './Template/TemplateType.js';
export class WH extends IEventHandler
{
@ -52,7 +52,12 @@ export class WH extends IEventHandler
this.resources = new KeyList();
this.resourceCounter = 0;
this.templates = new KeyList();
this.wrapperTemplates = new KeyList();
this.templates.add(TemplateType.Unspecified, new KeyList());
this.templates.add(TemplateType.Resource, new KeyList());
this.templates.add(TemplateType.Record, new KeyList());
this.templates.add(TemplateType.Wrapper, new KeyList());
this.protocols = new KeyList();
this._register("connected");
this._register("disconnected");
@ -291,19 +296,24 @@ export class WH extends IEventHandler
value.instance.parents.add(value);
}
putTemplate(template, wrapper = false)
putTemplate(template)
{
if (wrapper) {
this.wrapperTemplates.add(template.classId.valueOf(), template);
}
else {
this.templates.add(template.classId.valueOf(), template);
}
this.templates.get(template.type).add(template.classId, template);
}
getTemplateByType(type)
{
var templateType = TemplateType.Unspecified;
if (type.prototype instanceof DistributedResource)
templateType = TemplateType.Wrapper;
if (type.prototype instanceof IResource)
templateType = TemplateType.Resource;
else if (type.prototype instanceof IRecord)
templateType = TemplateType.Record;
else
return null;
if (type == IResource
|| type == IRecord)
return null;
@ -319,34 +329,63 @@ export class WH extends IEventHandler
className = type.template.namespace + "." + className;
// loaded ?
for (var i = 0; i < this.templates.length; i++)
if (this.templates.at(i).className == className)
return this.templates.at(i);
var templates = this.templates.get(templateType);
var template = new ResourceTemplate(type);
this.templates.add(template.classId.valueOf(), template);
// loaded ?
for(var i = 0; i < templates.length; i++)
if (templates.at(i).className == className)
return templates.at(i);
var template = new TypeTemplate(type, this);
return template;
}
getTemplateByClassId(classId, wrapper = false)
getTemplateByClassId(classId, templateType = TemplateType.Unspecified)
{
if (wrapper) {
return this.wrapperTemplates.item(classId);
}
else {
return this.templates.item(classId);
if (templateType == TemplateType.Unspecified)
{
// look in resources
var template = templates.get(TemplateType.Resource).get(classId);
if (template != null)
return template;
// look in records
template = templates.get(TemplateType.Record).get(classId);
if (template != null)
return template;
// look in wrappers
template = templates.get(TemplateType.Wrapper).get(classId);
return template;
}
else
return templates.get(templateType).get(classId);
}
getTemplateByClassName(className)
getTemplateByClassName(className, templateType = TemplateType.Unspecified)
{
for(var i = 0; i < this.templates.length; i++)
if (this.templates.at(i).className == className)
return new AsyncReply(this.templates.at(i));
return new AsyncReply(null);
if (templateType == TemplateType.Unspecified)
{
// look in resources
var template = templates[TemplateType.Resource].values.find(x => x.className == className);
if (template != null)
return template;
// look in records
template = templates[TemplateType.Record].values.find(x => x.className == className);
if (template != null)
return template;
// look in wrappers
template = templates[TemplateType.Wrapper].values.find(x => x.className == className);
return template;
}
else
{
return templates[templateType].values.find(x => x.className == className);
}
}
_qureyIn(path, index, resources)