diff --git a/package.json b/package.json index ae6fae8..e0811db 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "esiur", - "version": "2.1.0", + "version": "2.1.1", "description": "Distributed Object Framework", "main": "esiur.js", "type": "module", diff --git a/src/Net/IIP/ConnectionStatus.js b/src/Net/IIP/ConnectionStatus.js new file mode 100644 index 0000000..f51f464 --- /dev/null +++ b/src/Net/IIP/ConnectionStatus.js @@ -0,0 +1,6 @@ +export default +{ + Closed : 0, + Connecting: 1, + Connected: 2 +}; \ No newline at end of file diff --git a/src/Net/IIP/DistributedConnection.js b/src/Net/IIP/DistributedConnection.js index 64e64b9..2fc7dc8 100644 --- a/src/Net/IIP/DistributedConnection.js +++ b/src/Net/IIP/DistributedConnection.js @@ -80,6 +80,8 @@ import {TransmissionType, TransmissionTypeIdentifier} from '../../Data/Transmiss import PropertyValue from '../../Data/PropertyValue.js'; import PropertyValueArray from '../../Data/PropertyValueArray.js'; +import { UInt8 } from '../../Data/ExtendedTypes.js'; +import ConnectionStatus from './ConnectionStatus.js'; export default class DistributedConnection extends IStore { @@ -671,8 +673,11 @@ export default class DistributedConnection extends IStore { { this.ready = true; + this.status = ConnectionStatus.Connected; + this._openReply?.trigger(true); this._openReply = null; + this._emit("ready", this); this.server?.membership.login(this.session); @@ -685,8 +690,11 @@ export default class DistributedConnection extends IStore { else { this.ready = true; + this.status = ConnectionStatus.Connected; + this._openReply?.trigger(true); this._openReply = null; + this._emit("ready", this); this.server?.membership.login(this.session); } @@ -772,8 +780,9 @@ export default class DistributedConnection extends IStore { { this.session.id = authPacket.sessionId; this.ready = true; - this._emit("ready", this); + this.status = ConnectionStatus.Connected; + // put it in the warehouse if (this.instance == null) { @@ -1002,6 +1011,8 @@ export default class DistributedConnection extends IStore { if (this._openReply != null) throw new AsyncException(ErrorType.Exception, 0, "Connection in progress"); + this.status = ConnectionStatus.Connecting; + this._openReply = new AsyncReply(); if (hostname != null) @@ -1131,6 +1142,8 @@ export default class DistributedConnection extends IStore { { // clean up this.ready = false; + this.status = ConnectionStatus.Closed; + this.readyToEstablish = false; clearTimeout(this._keepAliveTimer); @@ -3166,4 +3179,11 @@ export default class DistributedConnection extends IStore { this._lastKeepAliveReceived = now; } + + static get template() { + return { + namespace: "Esiur", + properties: [["status", UInt8]] + }; + } } diff --git a/src/Proxy/ResourceProxy.js b/src/Proxy/ResourceProxy.js index c829079..961c606 100644 --- a/src/Proxy/ResourceProxy.js +++ b/src/Proxy/ResourceProxy.js @@ -1,35 +1,37 @@ import Warehouse from "../Resource/Warehouse.js"; -export default class ResourceProxy -{ +export default class ResourceProxy { static cache = {}; - static getProxy(type) - { - var template = Warehouse.getTemplateByType(type); - var className = type.prototype.constructor.name; + static getProxy(type) { + let template = Warehouse.getTemplateByType(type); + let className = type.prototype.constructor.name; + let classUrl = "esiur://" + template.className.replace('.', '/'); + + if (template.namespace != null) { + className = template.namespace + "_" + className; + } if (ResourceProxy.cache[className]) return ResourceProxy.cache[className]; - var code = `return (class E_${className} extends b { constructor() {super();} `; + var code = `return ( class E_${className} extends b { constructor() {super();} `; // generate class - for(var i = 0; i < template.properties.length; i++) - { + for (var i = 0; i < template.properties.length; i++) { let pt = template.properties[i]; let desc = Object.getOwnPropertyDescriptor(type.prototype, pt.name); - if (desc) - { - code += `\r\n set ${pt.name}(v) { \r\n if (this.instance) this.instance.emitModification(this.instance.template.properties[${i}], v); \r\n super.${pt.name} = v; } \r\n get ${pt.name}() { \r\n return super.${pt.name};}`; + if (desc) { + code += `\r\n set ${pt.name}(v) { \r\n super.${pt.name} = v; \r\n if (this.instance) this.instance.emitModification(this.instance.template.properties[${i}], v); } \r\n get ${pt.name}() { \r\n return super.${pt.name};}`; } - else - { - code += `\r\n set ${pt.name}(v) { \r\n if (this.instance) this.instance.emitModification(this.instance.template.properties[${i}], v); \r\n this._${pt.name} = v; } \r\n get ${pt.name}() { \r\n return this._${pt.name};}`; + else { + code += `\r\n set ${pt.name}(v) { \r\n super._${pt.name} = v; \r\n if (this.instance) this.instance.emitModification(this.instance.template.properties[${i}], v); } \r\n get ${pt.name}() { \r\n return this._${pt.name};}`; } } - var func = new Function("b", code + "})"); + debugger; + + var func = new Function("b", `//# sourceURL=${classUrl} \r\n ${code}});`); var proxyType = func.call(type /* this */, type); diff --git a/src/Resource/Instance.js b/src/Resource/Instance.js index 870d14f..f931047 100644 --- a/src/Resource/Instance.js +++ b/src/Resource/Instance.js @@ -155,9 +155,9 @@ export default class Instance extends IEventHandler this.modificationDates[pt.index] = now; if (pt.recordable) - this.store.record(resource, pt.name, value, this.ages[pt.index], now); + this.store?.record(resource, pt.name, value, this.ages[pt.index], now); else - this.store.modify(resource, pt.name, value, this.ages[pt.index], now); + this.store?.modify(resource, pt.name, value, this.ages[pt.index], now); let pmInfo = new PropertyModificationInfo(resource, pt, value, this.instanceAge);