mirror of
				https://github.com/esiur/esiur-js.git
				synced 2025-11-03 19:01:35 +00:00 
			
		
		
		
	Deadlock prevention
This commit is contained in:
		@@ -46,7 +46,7 @@
 | 
				
			|||||||
                users.append(el);
 | 
					                users.append(el);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                if (!silent)
 | 
					                if (!silent)
 | 
				
			||||||
                    appendMessage({usr, msg: "joined the room", date: new Date()});
 | 
					                    appendMessage(new Map([['usr', usr], ['msg', "joined the room"], ['date', new Date()]]));
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            function removeUser(usr){
 | 
					            function removeUser(usr){
 | 
				
			||||||
@@ -57,7 +57,7 @@
 | 
				
			|||||||
                            break;
 | 
					                            break;
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                appendMessage({usr, msg: "left the room", date: new Date()});
 | 
					                appendMessage(new Map([['usr', usr], ['msg', "left the room"], ['date', new Date()]]));
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            function updateTitle()
 | 
					            function updateTitle()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -147,7 +147,7 @@ export default class Codec {
 | 
				
			|||||||
  /// <returns>Value</returns>
 | 
					  /// <returns>Value</returns>
 | 
				
			||||||
  static parse(
 | 
					  static parse(
 | 
				
			||||||
       data,  offset, connection,
 | 
					       data,  offset, connection,
 | 
				
			||||||
       dataType = null) {
 | 
					       requestSequence, dataType = null) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let len = 0;
 | 
					    let len = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -164,18 +164,18 @@ export default class Codec {
 | 
				
			|||||||
        return new CodecParseResults(
 | 
					        return new CodecParseResults(
 | 
				
			||||||
            len,
 | 
					            len,
 | 
				
			||||||
            Codec.fixedParsers[dataType.exponent][dataType.index](
 | 
					            Codec.fixedParsers[dataType.exponent][dataType.index](
 | 
				
			||||||
                data, dataType.offset, dataType.contentLength, connection));
 | 
					                data, dataType.offset, dataType.contentLength, connection, requestSequence));
 | 
				
			||||||
      } else if (dataType.classType == TransmissionTypeClass.Dynamic) {
 | 
					      } else if (dataType.classType == TransmissionTypeClass.Dynamic) {
 | 
				
			||||||
        return new CodecParseResults(
 | 
					        return new CodecParseResults(
 | 
				
			||||||
            len,
 | 
					            len,
 | 
				
			||||||
            Codec.dynamicParsers[dataType.index](
 | 
					            Codec.dynamicParsers[dataType.index](
 | 
				
			||||||
                data, dataType.offset, dataType.contentLength, connection));
 | 
					                data, dataType.offset, dataType.contentLength, connection, requestSequence));
 | 
				
			||||||
      } else //if (tt.Class == TransmissionTypeClass.Typed)
 | 
					      } else //if (tt.Class == TransmissionTypeClass.Typed)
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        return new CodecParseResults(
 | 
					        return new CodecParseResults(
 | 
				
			||||||
            len,
 | 
					            len,
 | 
				
			||||||
            Codec.typedParsers[dataType.index](
 | 
					            Codec.typedParsers[dataType.index](
 | 
				
			||||||
                data, dataType.offset, dataType.contentLength, connection));
 | 
					                data, dataType.offset, dataType.contentLength, connection, requestSequence));
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,6 +14,9 @@ import PropertyValueArray from './PropertyValueArray.js';
 | 
				
			|||||||
import PropertyValue from './PropertyValue.js';
 | 
					import PropertyValue from './PropertyValue.js';
 | 
				
			||||||
import Record from './Record.js';
 | 
					import Record from './Record.js';
 | 
				
			||||||
import { UInt64, Int64 } from '../Data/ExtendedTypes.js';
 | 
					import { UInt64, Int64 } from '../Data/ExtendedTypes.js';
 | 
				
			||||||
 | 
					import AsyncException from '../Core/AsyncException.js';
 | 
				
			||||||
 | 
					import ExceptionCode from '../Core/ExceptionCode.js';
 | 
				
			||||||
 | 
					import ErrorType from '../Core/ErrorType.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export class PropertyValueParserResults {
 | 
					export class PropertyValueParserResults {
 | 
				
			||||||
  //final int size;
 | 
					  //final int size;
 | 
				
			||||||
@@ -26,135 +29,135 @@ export class PropertyValueParserResults {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default class DataDeserializer {
 | 
					export default class DataDeserializer {
 | 
				
			||||||
  static nullParser(data, offset,  length,  connection) {
 | 
					  static nullParser(data, offset,  length,  connection, requestSequence) {
 | 
				
			||||||
    return new AsyncReply(null);
 | 
					    return new AsyncReply(null);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static booleanTrueParser(
 | 
					  static booleanTrueParser(
 | 
				
			||||||
      data, offset, length, connection) {
 | 
					      data, offset, length, connection, requestSequence) {
 | 
				
			||||||
        return new AsyncReply(true);
 | 
					        return new AsyncReply(true);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static booleanFalseParser(
 | 
					  static booleanFalseParser(
 | 
				
			||||||
      data, offset, length,  connection) {
 | 
					      data, offset, length,  connection, requestSequence) {
 | 
				
			||||||
        return new AsyncReply(false);
 | 
					        return new AsyncReply(false);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static notModifiedParser(
 | 
					  static notModifiedParser(
 | 
				
			||||||
      data,  offset,  length,  connection) {
 | 
					      data,  offset,  length,  connection, requestSequence) {
 | 
				
			||||||
        return new AsyncReply(NotModified());
 | 
					        return new AsyncReply(NotModified());
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static byteParser(
 | 
					  static byteParser(
 | 
				
			||||||
       data,  offset,  length,  connection) {
 | 
					       data,  offset,  length,  connection, requestSequence) {
 | 
				
			||||||
        return new AsyncReply(data[offset]);
 | 
					        return new AsyncReply(data[offset]);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static sByteParser(
 | 
					  static sByteParser(
 | 
				
			||||||
       data, offset, length,  connection) {
 | 
					       data, offset, length,  connection, requestSequence) {
 | 
				
			||||||
        return new AsyncReply(
 | 
					        return new AsyncReply(
 | 
				
			||||||
        data[offset] > 127 ? data[offset] - 256 : data[offset]);
 | 
					        data[offset] > 127 ? data[offset] - 256 : data[offset]);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static char16Parser(
 | 
					  static char16Parser(
 | 
				
			||||||
      data, offset, length,  connection) {
 | 
					      data, offset, length,  connection, requestSequence) {
 | 
				
			||||||
        return new AsyncReply(data.getChar(offset));
 | 
					        return new AsyncReply(data.getChar(offset));
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static char8Parser(
 | 
					  static char8Parser(
 | 
				
			||||||
      data, offset, length,  connection) {
 | 
					      data, offset, length,  connection, requestSequence) {
 | 
				
			||||||
        return new AsyncReply(String.fromCharCode(data[offset]));
 | 
					        return new AsyncReply(String.fromCharCode(data[offset]));
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static int16Parser(
 | 
					  static int16Parser(
 | 
				
			||||||
      data, offset, length, connection) {
 | 
					      data, offset, length, connection, requestSequence) {
 | 
				
			||||||
        return new AsyncReply(data.getInt16(offset));
 | 
					        return new AsyncReply(data.getInt16(offset));
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static  uInt16Parser(
 | 
					  static  uInt16Parser(
 | 
				
			||||||
      data, offset,  length, connection) {
 | 
					      data, offset,  length, connection, requestSequence) {
 | 
				
			||||||
        return new AsyncReply(data.getUint16(offset));
 | 
					        return new AsyncReply(data.getUint16(offset));
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static int32Parser(
 | 
					  static int32Parser(
 | 
				
			||||||
      data, offset, length,  connection) {
 | 
					      data, offset, length,  connection, requestSequence) {
 | 
				
			||||||
        return new AsyncReply(data.getInt32(offset));
 | 
					        return new AsyncReply(data.getInt32(offset));
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static  uInt32Parser(
 | 
					  static  uInt32Parser(
 | 
				
			||||||
      data, offset, length,  connection) {
 | 
					      data, offset, length,  connection, requestSequence) {
 | 
				
			||||||
        return new AsyncReply(data.getUint32(offset));
 | 
					        return new AsyncReply(data.getUint32(offset));
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static float32Parser(
 | 
					  static float32Parser(
 | 
				
			||||||
      data, offset, length,  connection) {
 | 
					      data, offset, length,  connection, requestSequence) {
 | 
				
			||||||
        return new AsyncReply(data.getFloat32(offset));
 | 
					        return new AsyncReply(data.getFloat32(offset));
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static float64Parser(
 | 
					  static float64Parser(
 | 
				
			||||||
      data, offset, length,  connection) {
 | 
					      data, offset, length,  connection, requestSequence) {
 | 
				
			||||||
        return new AsyncReply(data.getFloat64(offset));
 | 
					        return new AsyncReply(data.getFloat64(offset));
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static float128Parser(
 | 
					  static float128Parser(
 | 
				
			||||||
      data, offset, length,  connection) {
 | 
					      data, offset, length,  connection, requestSequence) {
 | 
				
			||||||
    // @TODO
 | 
					    // @TODO
 | 
				
			||||||
    return new AsyncReply(data.getFloat64(offset));
 | 
					    return new AsyncReply(data.getFloat64(offset));
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static int128Parser(
 | 
					  static int128Parser(
 | 
				
			||||||
      data, offset,  length,  connection) {
 | 
					      data, offset,  length,  connection, requestSequence) {
 | 
				
			||||||
    // @TODO
 | 
					    // @TODO
 | 
				
			||||||
    return new AsyncReply(data.getInt64(offset));
 | 
					    return new AsyncReply(data.getInt64(offset));
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static uInt128Parser(
 | 
					  static uInt128Parser(
 | 
				
			||||||
       data,  offset,  length,  connection) {
 | 
					       data,  offset,  length,  connection, requestSequence) {
 | 
				
			||||||
        return new AsyncReply(data.getUint64(offset));
 | 
					        return new AsyncReply(data.getUint64(offset));
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static int64Parser(
 | 
					  static int64Parser(
 | 
				
			||||||
      data, offset, length,  connection) {
 | 
					      data, offset, length,  connection, requestSequence) {
 | 
				
			||||||
        return new AsyncReply(new Int64(data.getInt64(offset)));
 | 
					        return new AsyncReply(new Int64(data.getInt64(offset)));
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static uInt64Parser(
 | 
					  static uInt64Parser(
 | 
				
			||||||
      data, offset, length,  connection) {
 | 
					      data, offset, length,  connection, requestSequence) {
 | 
				
			||||||
        return new AsyncReply(new UInt64(data.getUint64(offset)));
 | 
					        return new AsyncReply(new UInt64(data.getUint64(offset)));
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static dateTimeParser(
 | 
					  static dateTimeParser(
 | 
				
			||||||
      data, offset, length,  connection) {
 | 
					      data, offset, length,  connection, requestSequence) {
 | 
				
			||||||
        return new AsyncReply(data.getDateTime(offset));
 | 
					        return new AsyncReply(data.getDateTime(offset));
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static resourceParser(
 | 
					  static resourceParser(
 | 
				
			||||||
      data, offset, length,  connection) {
 | 
					      data, offset, length,  connection, requestSequence) {
 | 
				
			||||||
    if (connection != null) {
 | 
					    if (connection != null) {
 | 
				
			||||||
      var id = data.getUint32(offset);
 | 
					      var id = data.getUint32(offset, requestSequence);
 | 
				
			||||||
      return connection.fetch(id);
 | 
					      return connection.fetch(id);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    throw Error("Can't parse resource with no connection");
 | 
					    throw Error("Can't parse resource with no connection");
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static localResourceParser(
 | 
					  static localResourceParser(
 | 
				
			||||||
       data, offset, length,  connection) {
 | 
					       data, offset, length,  connection, requestSequence) {
 | 
				
			||||||
    var id = data.getUint32(offset);
 | 
					    var id = data.getUint32(offset);
 | 
				
			||||||
    return Warehouse.getById(id);
 | 
					    return Warehouse.getById(id);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static rawDataParser(
 | 
					  static rawDataParser(
 | 
				
			||||||
      data, offset, length,  connection) {
 | 
					      data, offset, length,  connection, requestSequence) {
 | 
				
			||||||
        return new AsyncReply(data.clip(offset, length));
 | 
					        return new AsyncReply(data.clip(offset, length));
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static  stringParser(
 | 
					  static  stringParser(
 | 
				
			||||||
      data, offset, length,  connection) {
 | 
					      data, offset, length,  connection, requestSequence) {
 | 
				
			||||||
        return new AsyncReply(data.getString(offset, length));
 | 
					        return new AsyncReply(data.getString(offset, length));
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static recordParser(
 | 
					  static recordParser(
 | 
				
			||||||
      data, offset, length, connection) {
 | 
					      data, offset, length, connection, requestSequence) {
 | 
				
			||||||
    var reply = new AsyncReply();
 | 
					    var reply = new AsyncReply();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var classId = data.getGuid(offset);
 | 
					    var classId = data.getGuid(offset);
 | 
				
			||||||
@@ -163,8 +166,8 @@ export default class DataDeserializer {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    var template = Warehouse.getTemplateByClassId(classId, TemplateType.Record);
 | 
					    var template = Warehouse.getTemplateByClassId(classId, TemplateType.Record);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (template != null) {
 | 
					    var initRecord = (template) => {
 | 
				
			||||||
      DataDeserializer.listParser(data, offset, length, connection).then((ar) => {
 | 
					        DataDeserializer.listParser(data, offset, length, connection, requestSequence).then((ar) => {
 | 
				
			||||||
        let record;
 | 
					        let record;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (template.definedType != null) {
 | 
					        if (template.definedType != null) {
 | 
				
			||||||
@@ -178,27 +181,25 @@ export default class DataDeserializer {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        reply.trigger(record);
 | 
					        reply.trigger(record);
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (template != null) {
 | 
				
			||||||
 | 
					      initRecord(template);
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      if (connection == null)
 | 
					      if (connection == null)
 | 
				
			||||||
        throw Error("Can't parse record with no connection");
 | 
					        throw Error("Can't parse record with no connection");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      connection.getTemplate(classId).then((tmp) => {
 | 
					      connection.getTemplate(classId).then((tmp) => {
 | 
				
			||||||
        if (tmp == null)
 | 
					        if (tmp == null)
 | 
				
			||||||
          reply.triggerError(new Error("Couldn't fetch record template."));
 | 
					        {
 | 
				
			||||||
 | 
					            reply.triggerError(new AsyncException(
 | 
				
			||||||
        DataDeserializer.listParser(data, offset, length, connection).then((ar) => {
 | 
					              ErrorType.Management,
 | 
				
			||||||
 | 
					              ExceptionCode.TemplateNotFound.index,
 | 
				
			||||||
          var record = new Record();
 | 
					              "Template not found for record."));
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
          //var kv = new Map();
 | 
					          initRecord(tmp);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
          for (var i = 0; i < tmp.properties.length; i++)
 | 
					     
 | 
				
			||||||
            record[tmp.properties[i].name] = ar[i];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
          //record.deserialize(kv);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
          reply.trigger(record);
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
      }).error((x) => reply.triggerError(x));
 | 
					      }).error((x) => reply.triggerError(x));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -206,11 +207,11 @@ export default class DataDeserializer {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static constantParser(
 | 
					  static constantParser(
 | 
				
			||||||
      data, offset, length,  connection) {
 | 
					      data, offset, length,  connection, requestSequence) {
 | 
				
			||||||
    throw Error("NotImplementedException");
 | 
					    throw Error("NotImplementedException");
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static enumParser(data, offset, length,  connection) {
 | 
					  static enumParser(data, offset, length,  connection, requestSequence) {
 | 
				
			||||||
    var classId = data.getGuid(offset);
 | 
					    var classId = data.getGuid(offset);
 | 
				
			||||||
    offset += 16;
 | 
					    offset += 16;
 | 
				
			||||||
    var index = data[offset++];
 | 
					    var index = data[offset++];
 | 
				
			||||||
@@ -254,11 +255,11 @@ export default class DataDeserializer {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static recordListParser(
 | 
					  static recordListParser(
 | 
				
			||||||
      data, offset, length,  connection) {
 | 
					      data, offset, length,  connection, requestSequence) {
 | 
				
			||||||
    var rt = new AsyncBag();
 | 
					    var rt = new AsyncBag();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    while (length > 0) {
 | 
					    while (length > 0) {
 | 
				
			||||||
      var parsed = Codec.parse(data, offset, connection);
 | 
					      var parsed = Codec.parse(data, offset, connection, requestSequence);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      rt.add(parsed.reply);
 | 
					      rt.add(parsed.reply);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -274,11 +275,11 @@ export default class DataDeserializer {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static resourceListParser(
 | 
					  static resourceListParser(
 | 
				
			||||||
      data, offset, length,  connection) {
 | 
					      data, offset, length,  connection, requestSequence) {
 | 
				
			||||||
    var rt = new AsyncBag();
 | 
					    var rt = new AsyncBag();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    while (length > 0) {
 | 
					    while (length > 0) {
 | 
				
			||||||
      var parsed = Codec.parse(data, offset, connection);
 | 
					      var parsed = Codec.parse(data, offset, connection, requestSequence);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      rt.add(parsed.reply);
 | 
					      rt.add(parsed.reply);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -294,11 +295,11 @@ export default class DataDeserializer {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static listParser(
 | 
					  static listParser(
 | 
				
			||||||
      data, offset, length,  connection) {
 | 
					      data, offset, length,  connection, requestSequence) {
 | 
				
			||||||
    var rt = new AsyncBag();
 | 
					    var rt = new AsyncBag();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    while (length > 0) {
 | 
					    while (length > 0) {
 | 
				
			||||||
      var parsed = Codec.parse(data, offset, connection);
 | 
					      var parsed = Codec.parse(data, offset, connection, requestSequence);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      rt.add(parsed.reply);
 | 
					      rt.add(parsed.reply);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -314,7 +315,7 @@ export default class DataDeserializer {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static typedMapParser(
 | 
					  static typedMapParser(
 | 
				
			||||||
      data, offset, length, connection) {
 | 
					      data, offset, length, connection, requestSequence) {
 | 
				
			||||||
    // get key type
 | 
					    // get key type
 | 
				
			||||||
    var keyRep = RepresentationType.parse(data, offset);
 | 
					    var keyRep = RepresentationType.parse(data, offset);
 | 
				
			||||||
    offset += keyRep.size;
 | 
					    offset += keyRep.size;
 | 
				
			||||||
@@ -332,7 +333,7 @@ export default class DataDeserializer {
 | 
				
			|||||||
    var results = new AsyncBag();
 | 
					    var results = new AsyncBag();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    while (length > 0) {
 | 
					    while (length > 0) {
 | 
				
			||||||
      var parsed = Codec.parse(data, offset, connection);
 | 
					      var parsed = Codec.parse(data, offset, connection, requestSequence);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      results.add(parsed.reply);
 | 
					      results.add(parsed.reply);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -356,7 +357,7 @@ export default class DataDeserializer {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static tupleParser(
 | 
					  static tupleParser(
 | 
				
			||||||
      data, offset, length,  connection) {
 | 
					      data, offset, length,  connection, requestSequence) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
    var results = new AsyncBag();
 | 
					    var results = new AsyncBag();
 | 
				
			||||||
@@ -368,7 +369,7 @@ export default class DataDeserializer {
 | 
				
			|||||||
    var types = [];
 | 
					    var types = [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (var i = 0; i < tupleSize; i++) {
 | 
					    for (var i = 0; i < tupleSize; i++) {
 | 
				
			||||||
      var rep = RepresentationType.parse(data, offset);
 | 
					      var rep = RepresentationType.parse(data, offset, requestSequence);
 | 
				
			||||||
      if (rep.type != null) 
 | 
					      if (rep.type != null) 
 | 
				
			||||||
        types.push(rep.type.getRuntimeType() ?? Object);
 | 
					        types.push(rep.type.getRuntimeType() ?? Object);
 | 
				
			||||||
      offset += rep.size;
 | 
					      offset += rep.size;
 | 
				
			||||||
@@ -376,7 +377,7 @@ export default class DataDeserializer {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    while (length > 0) {
 | 
					    while (length > 0) {
 | 
				
			||||||
      var parsed = Codec.parse(data, offset, connection);
 | 
					      var parsed = Codec.parse(data, offset, connection, requestSequence);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      results.add(parsed.reply);
 | 
					      results.add(parsed.reply);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -397,7 +398,7 @@ export default class DataDeserializer {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static typedListParser(
 | 
					  static typedListParser(
 | 
				
			||||||
      data, offset, length, connection) {
 | 
					      data, offset, length, connection, requestSequence) {
 | 
				
			||||||
    var rt = new AsyncBag();
 | 
					    var rt = new AsyncBag();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // get the type
 | 
					    // get the type
 | 
				
			||||||
@@ -411,7 +412,7 @@ export default class DataDeserializer {
 | 
				
			|||||||
    rt.arrayType = runtimeType;
 | 
					    rt.arrayType = runtimeType;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    while (length > 0) {
 | 
					    while (length > 0) {
 | 
				
			||||||
      var parsed = Codec.parse(data, offset, connection);
 | 
					      var parsed = Codec.parse(data, offset, connection, requestSequence);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      rt.add(parsed.reply);
 | 
					      rt.add(parsed.reply);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -430,11 +431,11 @@ export default class DataDeserializer {
 | 
				
			|||||||
      data,
 | 
					      data,
 | 
				
			||||||
      offset,
 | 
					      offset,
 | 
				
			||||||
      length,
 | 
					      length,
 | 
				
			||||||
      connection) //, bool ageIncluded = true)
 | 
					      connection, requestSequence) //, bool ageIncluded = true)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    var rt = new AsyncBag();
 | 
					    var rt = new AsyncBag();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    DataDeserializer.listParser(data, offset, length, connection).then((x) => {
 | 
					    DataDeserializer.listParser(data, offset, length, connection, requestSequence).then((x) => {
 | 
				
			||||||
      var pvs = new PropertyValueArray();
 | 
					      var pvs = new PropertyValueArray();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      for (var i = 0; i < x.length; i += 3)
 | 
					      for (var i = 0; i < x.length; i += 3)
 | 
				
			||||||
@@ -447,7 +448,7 @@ export default class DataDeserializer {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static propertyValueParser(data, offset,
 | 
					  static propertyValueParser(data, offset,
 | 
				
			||||||
      connection) //, bool ageIncluded = true)
 | 
					      connection, requestSequence) //, bool ageIncluded = true)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    let reply = new AsyncReply();
 | 
					    let reply = new AsyncReply();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -457,7 +458,7 @@ export default class DataDeserializer {
 | 
				
			|||||||
    let date = data.getDateTime(offset);
 | 
					    let date = data.getDateTime(offset);
 | 
				
			||||||
    offset += 8;
 | 
					    offset += 8;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let parsed = Codec.parse(data, offset, connection);
 | 
					    let parsed = Codec.parse(data, offset, connection, requestSequence);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    parsed.reply.then((value) => {
 | 
					    parsed.reply.then((value) => {
 | 
				
			||||||
      reply.trigger(new PropertyValue(value, age, date));
 | 
					      reply.trigger(new PropertyValue(value, age, date));
 | 
				
			||||||
@@ -468,7 +469,7 @@ export default class DataDeserializer {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  static 
 | 
					  static 
 | 
				
			||||||
      historyParser(data, offset, length, resource,
 | 
					      historyParser(data, offset, length, resource,
 | 
				
			||||||
           connection) {
 | 
					           connection, requestSequence) {
 | 
				
			||||||
    throw new Error("Not implemented");
 | 
					    throw new Error("Not implemented");
 | 
				
			||||||
    // @TODO
 | 
					    // @TODO
 | 
				
			||||||
    // var list = new KeyList<PropertyTemplate, List<PropertyValue>>();
 | 
					    // var list = new KeyList<PropertyTemplate, List<PropertyValue>>();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -949,7 +949,7 @@ export default class DistributedConnection extends IStore {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                    for (var i = 0; i < this.resources.keys.length; i++) {
 | 
					                    for (var i = 0; i < this.resources.keys.length; i++) {
 | 
				
			||||||
                        var index = this.resources.keys[i];
 | 
					                        var index = this.resources.keys[i];
 | 
				
			||||||
                        bag.add(this.fetch(index));
 | 
					                        bag.add(this.fetch(index, null));
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    bag.seal();
 | 
					                    bag.seal();
 | 
				
			||||||
@@ -1367,7 +1367,7 @@ export default class DistributedConnection extends IStore {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            this.requests.remove(callbackId);
 | 
					            this.requests.remove(callbackId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            Codec.parse(data, 0, this, dataType).reply.then(function (rt) {
 | 
					            Codec.parse(data, 0, this, null, dataType).reply.then(function (rt) {
 | 
				
			||||||
                req.trigger(rt);
 | 
					                req.trigger(rt);
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -1391,7 +1391,7 @@ export default class DistributedConnection extends IStore {
 | 
				
			|||||||
    IIPReportChunk(callbackId, dataType, data) {
 | 
					    IIPReportChunk(callbackId, dataType, data) {
 | 
				
			||||||
        var req = this.requests.item(callbackId);
 | 
					        var req = this.requests.item(callbackId);
 | 
				
			||||||
        if (req != null) {
 | 
					        if (req != null) {
 | 
				
			||||||
            Codec.parse(data, 0, this, dataType).reply.then(function (x) {
 | 
					            Codec.parse(data, 0, this, null, dataType).reply.then(function (x) {
 | 
				
			||||||
                req.triggerChunk(x);
 | 
					                req.triggerChunk(x);
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -1413,7 +1413,7 @@ export default class DistributedConnection extends IStore {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        let self = this;
 | 
					        let self = this;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        this.fetch(resourceId).then(function (r) {
 | 
					        this.fetch(resourceId, null).then(function (r) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            let pt = r.instance.template.getPropertyTemplateByIndex(index);
 | 
					            let pt = r.instance.template.getPropertyTemplateByIndex(index);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1424,7 +1424,7 @@ export default class DistributedConnection extends IStore {
 | 
				
			|||||||
            let item = new AsyncReply();
 | 
					            let item = new AsyncReply();
 | 
				
			||||||
            self.queue.add(item);
 | 
					            self.queue.add(item);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            Codec.parse(data, 0, self, dataType).reply.then(function (args) {
 | 
					            Codec.parse(data, 0, self, null, dataType).reply.then(function (args) {
 | 
				
			||||||
                item.trigger(new DistributedResourceQueueItem(r, DistributedResourceQueueItemType.Propery, args, index));
 | 
					                item.trigger(new DistributedResourceQueueItem(r, DistributedResourceQueueItemType.Propery, args, index));
 | 
				
			||||||
            }).error(function (ex) {
 | 
					            }).error(function (ex) {
 | 
				
			||||||
                self.queue.remove(item);
 | 
					                self.queue.remove(item);
 | 
				
			||||||
@@ -1437,7 +1437,7 @@ export default class DistributedConnection extends IStore {
 | 
				
			|||||||
    IIPEventEventOccurred(resourceId, index, dataType, data) {
 | 
					    IIPEventEventOccurred(resourceId, index, dataType, data) {
 | 
				
			||||||
        var self = this;
 | 
					        var self = this;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        this.fetch(resourceId).then(function (r) {
 | 
					        this.fetch(resourceId, null).then(function (r) {
 | 
				
			||||||
            let et = r.instance.template.getEventTemplateByIndex(index);
 | 
					            let et = r.instance.template.getEventTemplateByIndex(index);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (et == null)
 | 
					            if (et == null)
 | 
				
			||||||
@@ -1448,7 +1448,7 @@ export default class DistributedConnection extends IStore {
 | 
				
			|||||||
            self.queue.add(item);
 | 
					            self.queue.add(item);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
           // Codec.parseVarArray(content, 0, content.length, self).then(function (args) {
 | 
					           // Codec.parseVarArray(content, 0, content.length, self).then(function (args) {
 | 
				
			||||||
            Codec.parse(data, 0, self, dataType).reply.then(function (args) {
 | 
					            Codec.parse(data, 0, self, null, dataType).reply.then(function (args) {
 | 
				
			||||||
                item.trigger(new DistributedResourceQueueItem(r, DistributedResourceQueueItemType.Event, args, index));
 | 
					                item.trigger(new DistributedResourceQueueItem(r, DistributedResourceQueueItemType.Event, args, index));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            }).error(function (ex) {
 | 
					            }).error(function (ex) {
 | 
				
			||||||
@@ -1461,8 +1461,8 @@ export default class DistributedConnection extends IStore {
 | 
				
			|||||||
    IIPEventChildAdded(resourceId, childId) {
 | 
					    IIPEventChildAdded(resourceId, childId) {
 | 
				
			||||||
        var self = this;
 | 
					        var self = this;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        this.fetch(resourceId).then(function (parent) {
 | 
					        this.fetch(resourceId, null).then(function (parent) {
 | 
				
			||||||
            self.fetch(childId).then(function (child) {
 | 
					            self.fetch(childId, null).then(function (child) {
 | 
				
			||||||
                parent.instance.children.add(child);
 | 
					                parent.instance.children.add(child);
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
@@ -1471,15 +1471,15 @@ export default class DistributedConnection extends IStore {
 | 
				
			|||||||
    IIPEventChildRemoved(resourceId, childId) {
 | 
					    IIPEventChildRemoved(resourceId, childId) {
 | 
				
			||||||
        var self = this;
 | 
					        var self = this;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        this.fetch(resourceId).then(function (parent) {
 | 
					        this.fetch(resourceId, null).then(function (parent) {
 | 
				
			||||||
            self.fetch(childId).then(function (child) {
 | 
					            self.fetch(childId, null).then(function (child) {
 | 
				
			||||||
                parent.instance.children.remove(child);
 | 
					                parent.instance.children.remove(child);
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    IIPEventRenamed(resourceId, name) {
 | 
					    IIPEventRenamed(resourceId, name) {
 | 
				
			||||||
        this.fetch(resourceId).then(function (resource) {
 | 
					        this.fetch(resourceId, null).then(function (resource) {
 | 
				
			||||||
            resource.instance.attributes.set("name",  name);
 | 
					            resource.instance.attributes.set("name",  name);
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -1488,7 +1488,7 @@ export default class DistributedConnection extends IStore {
 | 
				
			|||||||
    IIPEventAttributesUpdated(resourceId, attributes) {
 | 
					    IIPEventAttributesUpdated(resourceId, attributes) {
 | 
				
			||||||
        var self = this;
 | 
					        var self = this;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        this.fetch(resourceId).then(function (resource) {
 | 
					        this.fetch(resourceId, null).then(function (resource) {
 | 
				
			||||||
            var attrs = attributes.getStringArray(0, attributes.length);
 | 
					            var attrs = attributes.getStringArray(0, attributes.length);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            self.getAttributes(resource, attrs).then(function (s) {
 | 
					            self.getAttributes(resource, attrs).then(function (s) {
 | 
				
			||||||
@@ -1691,14 +1691,14 @@ export default class DistributedConnection extends IStore {
 | 
				
			|||||||
                    return;
 | 
					                    return;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                DataDeserializer.listParser(content, offset, cl, self).then(function (parameters) {
 | 
					                DataDeserializer.listParser(content, offset, cl, self, null).then(function (parameters) {
 | 
				
			||||||
                    offset += cl;
 | 
					                    offset += cl;
 | 
				
			||||||
                    cl = content.getUint32(offset);
 | 
					                    cl = content.getUint32(offset);
 | 
				
			||||||
                    DataDeserializer.typedMapParser(content, offset, cl, self).then(function (attributes) {
 | 
					                    DataDeserializer.typedMapParser(content, offset, cl, self, null).then(function (attributes) {
 | 
				
			||||||
                        offset += cl;
 | 
					                        offset += cl;
 | 
				
			||||||
                        cl = content.length - offset;
 | 
					                        cl = content.length - offset;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        DataDeserializer.typedMapParser(content, offset, cl, self).then(function (values) {
 | 
					                        DataDeserializer.typedMapParser(content, offset, cl, self, null).then(function (values) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                            var resource = new (Function.prototype.bind.apply(type, values));
 | 
					                            var resource = new (Function.prototype.bind.apply(type, values));
 | 
				
			||||||
@@ -1849,7 +1849,7 @@ export default class DistributedConnection extends IStore {
 | 
				
			|||||||
                return;
 | 
					                return;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            Codec.parse(data, 0, self, dataType).reply.then(function (args) {
 | 
					            Codec.parse(data, 0, self, null, dataType).reply.then(function (args) {
 | 
				
			||||||
                if (r instanceof DistributedResource) {
 | 
					                if (r instanceof DistributedResource) {
 | 
				
			||||||
                    var rt = r._invoke(index, args);
 | 
					                    var rt = r._invoke(index, args);
 | 
				
			||||||
                    if (rt != null) {
 | 
					                    if (rt != null) {
 | 
				
			||||||
@@ -2121,7 +2121,7 @@ export default class DistributedConnection extends IStore {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                var pt = r.instance.template.getPropertyTemplateByIndex(index);
 | 
					                var pt = r.instance.template.getPropertyTemplateByIndex(index);
 | 
				
			||||||
                if (pt != null) {
 | 
					                if (pt != null) {
 | 
				
			||||||
                    Codec.parse(data, 0, self, dataType).reply.then(function (value) {
 | 
					                    Codec.parse(data, 0, self, null, dataType).reply.then(function (value) {
 | 
				
			||||||
                        if (r instanceof DistributedResource) {
 | 
					                        if (r instanceof DistributedResource) {
 | 
				
			||||||
                            // propagation
 | 
					                            // propagation
 | 
				
			||||||
                            r._set(index, value).then(function (x) {
 | 
					                            r._set(index, value).then(function (x) {
 | 
				
			||||||
@@ -2225,7 +2225,7 @@ export default class DistributedConnection extends IStore {
 | 
				
			|||||||
        this.sendRequest(IIPPacketAction.CreateResource).addUint8Array(pkt.ToArray()).done().then(function (args) {
 | 
					        this.sendRequest(IIPPacketAction.CreateResource).addUint8Array(pkt.ToArray()).done().then(function (args) {
 | 
				
			||||||
            var rid = args[0];
 | 
					            var rid = args[0];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            self.fetch(rid).then(function (r) {
 | 
					            self.fetch(rid, null).then(function (r) {
 | 
				
			||||||
                reply.trigger(r);
 | 
					                reply.trigger(r);
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
@@ -2248,7 +2248,7 @@ export default class DistributedConnection extends IStore {
 | 
				
			|||||||
                let dataType = ar[0];
 | 
					                let dataType = ar[0];
 | 
				
			||||||
                let data = ar[1];
 | 
					                let data = ar[1];
 | 
				
			||||||
      
 | 
					      
 | 
				
			||||||
                Codec.parse(data, 0, self, dataType).reply.then((resources) => {
 | 
					                Codec.parse(data, 0, self, null, dataType).reply.then((resources) => {
 | 
				
			||||||
                    reply.trigger((resources))
 | 
					                    reply.trigger((resources))
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                ).error((ex) => reply.triggerError(ex));
 | 
					                ).error((ex) => reply.triggerError(ex));
 | 
				
			||||||
@@ -2377,15 +2377,13 @@ export default class DistributedConnection extends IStore {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Get a resource from the other end
 | 
					    // Get a resource from the other end
 | 
				
			||||||
    fetch(id) {
 | 
					    fetch(id, requestSequence) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let resource = this.resources.item(id);
 | 
					        let resource = this.resources.item(id);
 | 
				
			||||||
        let request = this.resourceRequests.item(id);
 | 
					        let request = this.resourceRequests.item(id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (request != null) {
 | 
					        if (request != null) {
 | 
				
			||||||
 | 
					            if (resource != null && (requestSequence?.contains(id) ?? false))
 | 
				
			||||||
            if (resource != null)
 | 
					 | 
				
			||||||
                // dig for dead locks            // or not
 | 
					 | 
				
			||||||
                return new AsyncReply(resource);
 | 
					                return new AsyncReply(resource);
 | 
				
			||||||
            else
 | 
					            else
 | 
				
			||||||
                return request;
 | 
					                return request;
 | 
				
			||||||
@@ -2398,6 +2396,9 @@ export default class DistributedConnection extends IStore {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        this.resourceRequests.set(id, reply);
 | 
					        this.resourceRequests.set(id, reply);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        var newSequence =
 | 
				
			||||||
 | 
					           requestSequence != null ? [...requestSequence, id] : [id];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var self = this;
 | 
					        var self = this;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        this.sendRequest(IIPPacketAction.AttachResource)
 | 
					        this.sendRequest(IIPPacketAction.AttachResource)
 | 
				
			||||||
@@ -2405,11 +2406,19 @@ export default class DistributedConnection extends IStore {
 | 
				
			|||||||
            .done()
 | 
					            .done()
 | 
				
			||||||
            .then(function (rt) {
 | 
					            .then(function (rt) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (rt == null) {
 | 
				
			||||||
 | 
					                    reply.triggerError(new AsyncException(ErrorType.Management,
 | 
				
			||||||
 | 
					                        ExceptionCode.ResourceNotFound, "Null response"));
 | 
				
			||||||
 | 
					                    return;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					          
 | 
				
			||||||
                var dr;
 | 
					                var dr;
 | 
				
			||||||
 | 
					                let classId = rt[0];
 | 
				
			||||||
 | 
					                let template = null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                if (resource == null)
 | 
					                if (resource == null)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    var template = Warehouse.getTemplateByClassId(rt[0], TemplateType.Wrapper);
 | 
					                    template = Warehouse.getTemplateByClassId(classId, TemplateType.Wrapper);
 | 
				
			||||||
                    if (template?.definedType != null)
 | 
					                    if (template?.definedType != null)
 | 
				
			||||||
                        dr = new template.getDependencies(self, id, rt[1], rt[2]);
 | 
					                        dr = new template.getDependencies(self, id, rt[1], rt[2]);
 | 
				
			||||||
                    else
 | 
					                    else
 | 
				
			||||||
@@ -2423,61 +2432,52 @@ export default class DistributedConnection extends IStore {
 | 
				
			|||||||
                let transmissionType = rt[3] ;
 | 
					                let transmissionType = rt[3] ;
 | 
				
			||||||
                let content = rt[4] ;
 | 
					                let content = rt[4] ;
 | 
				
			||||||
      
 | 
					      
 | 
				
			||||||
                self.getTemplate(rt[0]).then(function (tmp) {
 | 
					                let initResource = (ok) => {
 | 
				
			||||||
 | 
					                    Codec.parse(content, 0, self, newSequence, transmissionType)
 | 
				
			||||||
 | 
					                    .reply
 | 
				
			||||||
 | 
					                    .then((ar) => {
 | 
				
			||||||
 | 
					                        var pvs = new PropertyValueArray();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    // ClassId, ResourceAge, ResourceLink, Content
 | 
					                        for (var i = 0; i < ar.length; i += 3)
 | 
				
			||||||
                    if (resource == null)
 | 
					 | 
				
			||||||
                    {
 | 
					 | 
				
			||||||
                        let wp =  Warehouse.put(id.toString(), dr, self, null, tmp).then(function(ok){
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                            
 | 
					 | 
				
			||||||
                            Codec.parse(content, 0, self, transmissionType)
 | 
					 | 
				
			||||||
                            .reply
 | 
					 | 
				
			||||||
                            .then((ar) => {
 | 
					 | 
				
			||||||
                          var pvs = new PropertyValueArray();
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
                          for (var i = 0; i < ar.length; i += 3)
 | 
					 | 
				
			||||||
                            pvs.push(new PropertyValue(
 | 
					                            pvs.push(new PropertyValue(
 | 
				
			||||||
                                ar[i + 2], ar[i], ar[i + 1]));
 | 
					                                ar[i + 2], ar[i], ar[i + 1]));
 | 
				
			||||||
    
 | 
					 | 
				
			||||||
                          dr._attach(pvs);
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
                          self.resourceRequests.remove(id);
 | 
					 | 
				
			||||||
                          reply.trigger(dr);
 | 
					 | 
				
			||||||
                        })
 | 
					 | 
				
			||||||
                          .error((ex) => reply.triggerError(ex));
 | 
					 | 
				
			||||||
                            
 | 
					 | 
				
			||||||
                            
 | 
					 | 
				
			||||||
                        });
 | 
					 | 
				
			||||||
                        
 | 
					 | 
				
			||||||
                        wp.error(function(ex){
 | 
					 | 
				
			||||||
                            reply.triggerError(ex);
 | 
					 | 
				
			||||||
                        });
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                    else
 | 
					 | 
				
			||||||
                    {
 | 
					 | 
				
			||||||
                        Codec.parse(content, 0, self, transmissionType)
 | 
					 | 
				
			||||||
                        .reply
 | 
					 | 
				
			||||||
                        .then((ar) => {
 | 
					 | 
				
			||||||
                      //print("attached");
 | 
					 | 
				
			||||||
                      if (results != null) {
 | 
					 | 
				
			||||||
                        var pvs = new PropertyValueArray();
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
                        for (var i = 0; i < ar.length; i += 3)
 | 
					 | 
				
			||||||
                          pvs.push(new PropertyValue(
 | 
					 | 
				
			||||||
                              ar[i + 2], ar[i], ar[i + 1]));
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
                        dr._attach(pvs);
 | 
					 | 
				
			||||||
                      }
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
                      self.resourceRequests.remove(id);
 | 
					 | 
				
			||||||
                      reply.trigger(dr);
 | 
					 | 
				
			||||||
                     }).error(function(ex) { reply.triggerError(ex)});
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    }
 | 
					                        dr._attach(pvs);
 | 
				
			||||||
                }).error(function(ex){
 | 
					
 | 
				
			||||||
                    reply.triggerError(ex);
 | 
					                        self.resourceRequests.remove(id);
 | 
				
			||||||
                });
 | 
					                        reply.trigger(dr);
 | 
				
			||||||
 | 
					                    })
 | 
				
			||||||
 | 
					                    .error((ex) => reply.triggerError(ex));        
 | 
				
			||||||
 | 
					                };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (template == null)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    self.getTemplate(rt[0]).then(function (tmp) {
 | 
				
			||||||
 | 
					                        // ClassId, ResourceAge, ResourceLink, Content
 | 
				
			||||||
 | 
					                        if (resource == null) {
 | 
				
			||||||
 | 
					                            Warehouse.put(id.toString(), dr, self, null, tmp).then(function(ok){
 | 
				
			||||||
 | 
					                                initResource(ok);
 | 
				
			||||||
 | 
					                            }).error(function(ex){
 | 
				
			||||||
 | 
					                                reply.triggerError(ex);
 | 
				
			||||||
 | 
					                            });
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        else
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            initResource(ok);
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }).error(function(ex){
 | 
				
			||||||
 | 
					                        reply.triggerError(ex);
 | 
				
			||||||
 | 
					                    });
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                    if (resource == null) {
 | 
				
			||||||
 | 
					                        Warehouse.put(id.toString(), dr, this, null, template)
 | 
				
			||||||
 | 
					                          .then(initResource)
 | 
				
			||||||
 | 
					                          .error((ex) => reply.triggerError(ex));
 | 
				
			||||||
 | 
					                      } else {
 | 
				
			||||||
 | 
					                        initResource(resource);
 | 
				
			||||||
 | 
					                      }        
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            }).error(function(ex){
 | 
					            }).error(function(ex){
 | 
				
			||||||
                reply.triggerError(ex);
 | 
					                reply.triggerError(ex);
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
@@ -2500,7 +2500,7 @@ export default class DistributedConnection extends IStore {
 | 
				
			|||||||
                .addDateTime(fromDate).addDateTime(toDate)
 | 
					                .addDateTime(fromDate).addDateTime(toDate)
 | 
				
			||||||
                .done()
 | 
					                .done()
 | 
				
			||||||
                .then(function (rt) {
 | 
					                .then(function (rt) {
 | 
				
			||||||
                    Codec.parseHistory(rt[0], 0, rt[0].length, resource, self).then(function (history) {
 | 
					                    Codec.historyParser(rt[0], 0, rt[0].length, resource, self, null).then(function (history) {
 | 
				
			||||||
                        reply.trigger(history);
 | 
					                        reply.trigger(history);
 | 
				
			||||||
                    });
 | 
					                    });
 | 
				
			||||||
                });
 | 
					                });
 | 
				
			||||||
@@ -2721,7 +2721,8 @@ export default class DistributedConnection extends IStore {
 | 
				
			|||||||
                return;
 | 
					                return;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            DataDeserializer.typedListParser(attributes, 0, attributes.length, this).then(function (attrs) {
 | 
					            DataDeserializer.typedListParser(attributes, 0, attributes.length, this, null)
 | 
				
			||||||
 | 
					                .then(function (attrs) {
 | 
				
			||||||
                if (r.instance.setAttributes(attrs, clearAttributes))
 | 
					                if (r.instance.setAttributes(attrs, clearAttributes))
 | 
				
			||||||
                    self.sendReply(clearAttributes ? IIPPacketAction.ClearAllAttributes : IIPPacketAction.ClearAttributes,
 | 
					                    self.sendReply(clearAttributes ? IIPPacketAction.ClearAllAttributes : IIPPacketAction.ClearAttributes,
 | 
				
			||||||
                        callback)
 | 
					                        callback)
 | 
				
			||||||
@@ -2751,7 +2752,7 @@ export default class DistributedConnection extends IStore {
 | 
				
			|||||||
            let dataType = ar[0];
 | 
					            let dataType = ar[0];
 | 
				
			||||||
            let data = ar[1];
 | 
					            let data = ar[1];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            Codec.parse(data, 0, self, dataType).reply.then((resources) => {
 | 
					            Codec.parse(data, 0, self, null, dataType).reply.then((resources) => {
 | 
				
			||||||
                rt.trigger(resources);
 | 
					                rt.trigger(resources);
 | 
				
			||||||
            })
 | 
					            })
 | 
				
			||||||
            .error((ex) => rt.triggerError(ex));
 | 
					            .error((ex) => rt.triggerError(ex));
 | 
				
			||||||
@@ -2775,7 +2776,7 @@ export default class DistributedConnection extends IStore {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                let dataType = ar[0] ;
 | 
					                let dataType = ar[0] ;
 | 
				
			||||||
                let data = ar[1];
 | 
					                let data = ar[1];
 | 
				
			||||||
                Codec.parse(data, 0, self, dataType).reply.then((resources) => {
 | 
					                Codec.parse(data, 0, self, null, dataType).reply.then((resources) => {
 | 
				
			||||||
                  rt.trigger(resources);
 | 
					                  rt.trigger(resources);
 | 
				
			||||||
                })
 | 
					                })
 | 
				
			||||||
                  .error((ex) => rt.triggerError(ex));
 | 
					                  .error((ex) => rt.triggerError(ex));
 | 
				
			||||||
@@ -2846,7 +2847,7 @@ export default class DistributedConnection extends IStore {
 | 
				
			|||||||
                    let dataType = ar[0];
 | 
					                    let dataType = ar[0];
 | 
				
			||||||
                    let data = ar[1];
 | 
					                    let data = ar[1];
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
                    Codec.parse(data, 0, self, dataType).reply.then((st) => {
 | 
					                    Codec.parse(data, 0, self, null, dataType).reply.then((st) => {
 | 
				
			||||||
                      resource.instance?.setAttributes(st);
 | 
					                      resource.instance?.setAttributes(st);
 | 
				
			||||||
                      rt.trigger(st);
 | 
					                      rt.trigger(st);
 | 
				
			||||||
                    })
 | 
					                    })
 | 
				
			||||||
@@ -2867,7 +2868,7 @@ export default class DistributedConnection extends IStore {
 | 
				
			|||||||
                    let dataType = ar[0] ;
 | 
					                    let dataType = ar[0] ;
 | 
				
			||||||
                    let data = ar[1] ;
 | 
					                    let data = ar[1] ;
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
                    Codec.parse(data, 0, self, dataType).reply
 | 
					                    Codec.parse(data, 0, self, null, dataType).reply
 | 
				
			||||||
                      .then((st) => {
 | 
					                      .then((st) => {
 | 
				
			||||||
                        resource.instance?.setAttributes(st);
 | 
					                        resource.instance?.setAttributes(st);
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,7 +7,7 @@ export default class PropertyModificationInfo {
 | 
				
			|||||||
    return this.propertyTemplate.name;
 | 
					    return this.propertyTemplate.name;
 | 
				
			||||||
  } 
 | 
					  } 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  PropertyModificationInfo(
 | 
					  constructor(
 | 
				
			||||||
      resource, propertyTemplate, value, age) {
 | 
					      resource, propertyTemplate, value, age) {
 | 
				
			||||||
        this.resource = resource;
 | 
					        this.resource = resource;
 | 
				
			||||||
        this.propertyTemplate = propertyTemplate;
 | 
					        this.propertyTemplate = propertyTemplate;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -545,7 +545,7 @@ export default class TypeTemplate {
 | 
				
			|||||||
        
 | 
					        
 | 
				
			||||||
                offset += dt.size;
 | 
					                offset += dt.size;
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
                let parsed = Codec.parse(data, offset, null);
 | 
					                let parsed = Codec.parse(data, offset, null, null);
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
                offset += parsed.size;
 | 
					                offset += parsed.size;
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -47,7 +47,9 @@ import { Int8, Int16, Int32, Int64, UInt8, UInt16, UInt32, UInt64, Float32, Floa
 | 
				
			|||||||
import Record from '../Data/Record.js';
 | 
					import Record from '../Data/Record.js';
 | 
				
			||||||
import TypedMap from '../Data/TypedMap.js';
 | 
					import TypedMap from '../Data/TypedMap.js';
 | 
				
			||||||
import {RepresentationType, RepresentationTypeIdentifier} from '../Data/RepresentationType.js';
 | 
					import {RepresentationType, RepresentationTypeIdentifier} from '../Data/RepresentationType.js';
 | 
				
			||||||
import FactoryEntry from './FactoryEntry.js'; './FactoryEntry.js';
 | 
					import FactoryEntry from './FactoryEntry.js';
 | 
				
			||||||
 | 
					import IEnum from '../Data/IEnum.js';
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
export class WH extends IEventHandler
 | 
					export class WH extends IEventHandler
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    constructor()
 | 
					    constructor()
 | 
				
			||||||
@@ -328,6 +330,8 @@ export class WH extends IEventHandler
 | 
				
			|||||||
            templateType = TemplateType.Resource;
 | 
					            templateType = TemplateType.Resource;
 | 
				
			||||||
        else if (type.prototype instanceof IRecord)
 | 
					        else if (type.prototype instanceof IRecord)
 | 
				
			||||||
            templateType = TemplateType.Record;
 | 
					            templateType = TemplateType.Record;
 | 
				
			||||||
 | 
					        else if (type.prototype instanceof IEnum)
 | 
				
			||||||
 | 
					            templateType = TemplateType.Enum;
 | 
				
			||||||
        else
 | 
					        else
 | 
				
			||||||
            return null;
 | 
					            return null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user