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:
@ -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];
|
||||
|
||||
|
6
src/Data/ResourceArrayType.js
Normal file
6
src/Data/ResourceArrayType.js
Normal file
@ -0,0 +1,6 @@
|
||||
export default
|
||||
{
|
||||
Dynamic = 0x0,
|
||||
Static = 0x10,
|
||||
Wrapper = 0x20
|
||||
};
|
@ -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]);
|
||||
|
@ -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)
|
||||
|
@ -1,5 +1,7 @@
|
||||
export default
|
||||
{
|
||||
Resource: 0,
|
||||
Record: 1
|
||||
Unspecified: 0,
|
||||
Resource: 1,
|
||||
Record: 2,
|
||||
Wrapper: 3,
|
||||
}
|
@ -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++);
|
@ -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)
|
||||
|
Reference in New Issue
Block a user