From 93ed4edcbd96bf018d759e583cf5270e7c308b10 Mon Sep 17 00:00:00 2001 From: Esiur Project Date: Sat, 3 Sep 2022 03:08:57 +0300 Subject: [PATCH] Generator --- bin/esiur.cjs | 13 +- demo/chat/chat.js | 12 +- demo/mongo/mongo.js | 5 +- esiur-2.1.4.tgz | Bin 0 -> 156771 bytes lib/333/Test.MyChildRecord.g.js | 20 + lib/333/Test.MyChildResource.g.js | 37 ++ ...Test.MyGenericRecordOfTest_MyResource.g.js | 26 + lib/333/Test.MyRecord.g.js | 23 + lib/333/Test.MyResource.g.js | 36 ++ lib/333/Test.MyService.g.js | 268 ++++++++++ lib/333/Test.SizeEnum.g.js | 16 + lib/333/init.g.dart | 30 ++ src/Data/DC.js | 8 +- src/Data/DataSerializer.js | 4 +- src/Data/Guid.js | 8 +- src/Data/Nullable.js | 25 + src/Data/RepresentationType.js | 215 +++++--- src/Data/Void.js | 4 + src/Net/IIP/DistributedConnection.js | 6 +- src/Net/IIP/DistributedResource.js | 21 +- src/Proxy/TemplateGenerator.js | 488 ++++++++++++++++++ src/Resource/IResource.js | 8 +- src/Resource/Template/TemplateDescriber.js | 129 +++++ src/Resource/Template/TypeTemplate.js | 73 ++- src/Resource/Warehouse.js | 108 +--- src/esiur.js | 32 +- 26 files changed, 1377 insertions(+), 238 deletions(-) create mode 100644 esiur-2.1.4.tgz create mode 100644 lib/333/Test.MyChildRecord.g.js create mode 100644 lib/333/Test.MyChildResource.g.js create mode 100644 lib/333/Test.MyGenericRecordOfTest_MyResource.g.js create mode 100644 lib/333/Test.MyRecord.g.js create mode 100644 lib/333/Test.MyResource.g.js create mode 100644 lib/333/Test.MyService.g.js create mode 100644 lib/333/Test.SizeEnum.g.js create mode 100644 lib/333/init.g.dart create mode 100644 src/Data/Nullable.js create mode 100644 src/Data/Void.js create mode 100644 src/Proxy/TemplateGenerator.js create mode 100644 src/Resource/Template/TemplateDescriber.js diff --git a/bin/esiur.cjs b/bin/esiur.cjs index 458bd67..bb252d3 100644 --- a/bin/esiur.cjs +++ b/bin/esiur.cjs @@ -1,7 +1,5 @@ #!/usr/bin/env node - - if (process.argv.length == 2) { console.log("Usage: [arguments]"); console.log(""); @@ -50,12 +48,19 @@ else if (cmd == "get-template") let url = args[0]; console.log(`Getting ${url} ${username} ${password} ${dir}`); + + let getTemplate = async () => { + let Esiur = (await import('../src/esiur.js')).default; + await Esiur.Proxy.TemplateGenerator.getTemplate(url, dir, username, password, true); + } + + getTemplate(); } function getOption(args, option, abbreviation) { let index = args.indexOf(abbreviation); if (index == -1) index = args.indexOf(option); if (index > -1 && index + 1 < args.length) - return args.slice(index, index + 1)[1]; + return args.splice(index, 2)[1]; return null; -} \ No newline at end of file +} diff --git a/demo/chat/chat.js b/demo/chat/chat.js index 6635812..99a042d 100644 --- a/demo/chat/chat.js +++ b/demo/chat/chat.js @@ -10,6 +10,8 @@ import DC from "../../src/Data/DC.js"; import IResource from "../../src/Resource/IResource.js"; import TransmissionType, { TransmissionTypeIdentifier } from "../../src/Data/TransmissionType.js"; import TypedMap from "../../src/Data/TypedMap.js"; +import { Arg, Evt, Func, Prop, TemplateDescriber } from "../../src/Resource/Template/TemplateDescriber.js"; +import { Int32 } from "../../src/Data/ExtendedTypes.js"; const require = createRequire(import.meta.url); @@ -36,7 +38,7 @@ var server; class MyChat extends IResource { // void (string, string)->void - static get template() { + static get templateOld() { return { namespace: "Chat", properties: [["title", String], ["messages", Array], ["users", Array]], @@ -45,6 +47,14 @@ class MyChat extends IResource { }; } + static get template() { + return new TemplateDescriber("Chat",[ + new Prop("title", String), new Prop("messages", Array), new Prop("users", Array), + new Func("send", null, [new Arg("msg", String, true)]), + new Evt("message", Map), new Evt("voice", Int32, true), new Evt("login"), new Evt("logout")] + ); + } + constructor() { super(); this.messages = [new TypedMap({usr: "Admin", msg: "Welcome to Esiur", date: new Date()})]; diff --git a/demo/mongo/mongo.js b/demo/mongo/mongo.js index 052c502..07ce67a 100644 --- a/demo/mongo/mongo.js +++ b/demo/mongo/mongo.js @@ -10,13 +10,12 @@ import DC from "../../src/Data/DC.js"; import IResource from "../../src/Resource/IResource.js"; import Structure from "../../src/Data/Structure.js"; import MongoDBStore from "../../src/Stores/MongoDBStore.js"; +import { Prop, TemplateDescriber } from "../../src/Resource/Template/TemplateDescriber.js"; class User extends IResource { static get template() { - return { - properties: [{name: "username"}, {name: "password"}] - }; + return new TemplateDescriber("Esiur", [new Prop("username", String), new Prop("password", String)]); } } diff --git a/esiur-2.1.4.tgz b/esiur-2.1.4.tgz new file mode 100644 index 0000000000000000000000000000000000000000..41dd74765d7ae11b7211deb79ed853344a32c949 GIT binary patch literal 156771 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 ZpkzIK9zGABhtD_o`9CD$T^ayL5&+5vXQ2Q9 literal 0 HcmV?d00001 diff --git a/lib/333/Test.MyChildRecord.g.js b/lib/333/Test.MyChildRecord.g.js new file mode 100644 index 0000000..54f16bc --- /dev/null +++ b/lib/333/Test.MyChildRecord.g.js @@ -0,0 +1,20 @@ +import Test_MyService from './Test.MyService.g.js'; +import Test_MyGenericRecordOfTest_MyResource from './Test.MyGenericRecordOfTest_MyResource.g.js'; +import Test_MyResource from './Test.MyResource.g.js'; +import Test_MyRecord from './Test.MyRecord.g.js'; +import Test_MyChildResource from './Test.MyChildResource.g.js'; +import Test_SizeEnum from './Test.SizeEnum.g.js'; + +class MyChildRecord extends Test_MyRecord { +/* String */ ChildName; + + + +static get template() {return new TemplateDescriber('Test.MyChildRecord', [ +new Prop('Id', Esiur.Data.Int32, 'Int32', null), +new Prop('Name', String, 'String', null), +new Prop('Score', Esiur.Data.Float64, 'Double', null), +new Prop('ChildName', String, 'String', null)], +Test_MyRecord, 0, null); +} +} \ No newline at end of file diff --git a/lib/333/Test.MyChildResource.g.js b/lib/333/Test.MyChildResource.g.js new file mode 100644 index 0000000..addeb7e --- /dev/null +++ b/lib/333/Test.MyChildResource.g.js @@ -0,0 +1,37 @@ +import Test_MyService from './Test.MyService.g.js'; +import Test_MyGenericRecordOfTest_MyResource from './Test.MyGenericRecordOfTest_MyResource.g.js'; +import Test_MyResource from './Test.MyResource.g.js'; +import Test_MyRecord from './Test.MyRecord.g.js'; +import Test_MyChildRecord from './Test.MyChildRecord.g.js'; +import Test_SizeEnum from './Test.SizeEnum.g.js'; + +export default class MyChildResource extends Test_MyResource { +/* Esiur.Data.Int32 */ Hell2o(/* String */ childName) { +var args = new (Esiur.Data.TypedMap.of(Esiur.Data.UInt8, Object))({new Esiur.Data.UInt8(0) :childName}); +var rt = new Esiur.Core.AsyncReply(); +this._invoke(2, args).then((x) => rt.trigger(x)) +.error((x) => rt.triggerError(x)) +.chunk((x) => rt.triggerChunk(x)); +return rt; } +/* String */ HelloChild() { +var args = new (Esiur.Data.TypedMap.of(Esiur.Data.UInt8, Object))({}); +var rt = new Esiur.Core.AsyncReply(); +this._invoke(3, args).then((x) => rt.trigger(x)) +.error((x) => rt.triggerError(x)) +.chunk((x) => rt.triggerChunk(x)); +return rt; } +/* String */ get ChildName() { return this._get(2); } +set ChildName(/* String */ value) { this._set(2, value); } + +static get template() {return new Esiur.Resource.Template.TemplateDescriber('Test', [ +new Esiur.Resource.Template.Prop('CategoryId', Esiur.Data.Int32, 'Int32', null), +new Esiur.Resource.Template.Prop('Description', String, 'Comment', null), +new Esiur.Resource.Template.Prop('ChildName', String, 'String', null), +new Esiur.Resource.Template.Func('Hello', String, [], '() -> String'), +new Esiur.Resource.Template.Func('HelloParent', String, [], '() -> String'), +new Esiur.Resource.Template.Func('Hell2o', Esiur.Data.Int32, [new Esiur.Resource.Template.Arg('childName', String, false)], '([String] childName) -> Int32'), +new Esiur.Resource.Template.Func('HelloChild', String, [], '() -> String')], +Test_MyResource, 0, null, Esiur.Data.Guid.parse('a884cf07481805fe97e6713175a99320'), 'MyChildResource'); +} +} +new Esiur.Resource.Template.TypeTemplate(MyChildResource, true); diff --git a/lib/333/Test.MyGenericRecordOfTest_MyResource.g.js b/lib/333/Test.MyGenericRecordOfTest_MyResource.g.js new file mode 100644 index 0000000..c6af216 --- /dev/null +++ b/lib/333/Test.MyGenericRecordOfTest_MyResource.g.js @@ -0,0 +1,26 @@ +import Test_MyService from './Test.MyService.g.js'; +import Test_MyResource from './Test.MyResource.g.js'; +import Test_MyRecord from './Test.MyRecord.g.js'; +import Test_MyChildRecord from './Test.MyChildRecord.g.js'; +import Test_MyChildResource from './Test.MyChildResource.g.js'; +import Test_SizeEnum from './Test.SizeEnum.g.js'; + +class MyGenericRecordOfTest_MyResource extends IRecord { +/* Esiur.Data.Int32 */ Needed; + +/* TypedList.of(Test_MyResource) */ Results; + +/* Esiur.Data.Int32 */ Start; + +/* Esiur.Data.Int32 */ Total; + + + +static get template() {return new TemplateDescriber('Test.MyGenericRecordOfTest_MyResource', [ +new Prop('Needed', Esiur.Data.Int32, 'Int32', null), +new Prop('Results', TypedList.of(Test_MyResource), 'MyResource[]', null), +new Prop('Start', Esiur.Data.Int32, 'Int32', null), +new Prop('Total', Esiur.Data.Int32, 'Int32', null)], +undefined, 0, null); +} +} \ No newline at end of file diff --git a/lib/333/Test.MyRecord.g.js b/lib/333/Test.MyRecord.g.js new file mode 100644 index 0000000..5010dca --- /dev/null +++ b/lib/333/Test.MyRecord.g.js @@ -0,0 +1,23 @@ +import Test_MyService from './Test.MyService.g.js'; +import Test_MyGenericRecordOfTest_MyResource from './Test.MyGenericRecordOfTest_MyResource.g.js'; +import Test_MyResource from './Test.MyResource.g.js'; +import Test_MyChildRecord from './Test.MyChildRecord.g.js'; +import Test_MyChildResource from './Test.MyChildResource.g.js'; +import Test_SizeEnum from './Test.SizeEnum.g.js'; + +class MyRecord extends IRecord { +/* Esiur.Data.Int32 */ Id; + +/* String */ Name; + +/* Esiur.Data.Float64 */ Score; + + + +static get template() {return new TemplateDescriber('Test.MyRecord', [ +new Prop('Id', Esiur.Data.Int32, 'Int32', null), +new Prop('Name', String, 'String', null), +new Prop('Score', Esiur.Data.Float64, 'Double', null)], +undefined, 0, null); +} +} \ No newline at end of file diff --git a/lib/333/Test.MyResource.g.js b/lib/333/Test.MyResource.g.js new file mode 100644 index 0000000..cc543eb --- /dev/null +++ b/lib/333/Test.MyResource.g.js @@ -0,0 +1,36 @@ +import Test_MyService from './Test.MyService.g.js'; +import Test_MyGenericRecordOfTest_MyResource from './Test.MyGenericRecordOfTest_MyResource.g.js'; +import Test_MyRecord from './Test.MyRecord.g.js'; +import Test_MyChildRecord from './Test.MyChildRecord.g.js'; +import Test_MyChildResource from './Test.MyChildResource.g.js'; +import Test_SizeEnum from './Test.SizeEnum.g.js'; + +export default class MyResource extends Esiur.Net.IIP.DistributedResource { +/* String */ Hello() { +var args = new (Esiur.Data.TypedMap.of(Esiur.Data.UInt8, Object))({}); +var rt = new Esiur.Core.AsyncReply(); +this._invoke(0, args).then((x) => rt.trigger(x)) +.error((x) => rt.triggerError(x)) +.chunk((x) => rt.triggerChunk(x)); +return rt; } +/* String */ HelloParent() { +var args = new (Esiur.Data.TypedMap.of(Esiur.Data.UInt8, Object))({}); +var rt = new Esiur.Core.AsyncReply(); +this._invoke(1, args).then((x) => rt.trigger(x)) +.error((x) => rt.triggerError(x)) +.chunk((x) => rt.triggerChunk(x)); +return rt; } +/* Esiur.Data.Int32 */ get CategoryId() { return this._get(0); } +set CategoryId(/* Esiur.Data.Int32 */ value) { this._set(0, value); } +/* String */ get Description() { return this._get(1); } +set Description(/* String */ value) { this._set(1, value); } + +static get template() {return new Esiur.Resource.Template.TemplateDescriber('Test', [ +new Esiur.Resource.Template.Prop('CategoryId', Esiur.Data.Int32, 'Int32', null), +new Esiur.Resource.Template.Prop('Description', String, 'Comment', null), +new Esiur.Resource.Template.Func('Hello', String, [], '() -> String'), +new Esiur.Resource.Template.Func('HelloParent', String, [], '() -> String')], +null, 0, "A\nB\nC\nD", Esiur.Data.Guid.parse('99ce4d8acdf8ab959b8328d636b98ba9'), 'MyResource'); +} +} +new Esiur.Resource.Template.TypeTemplate(MyResource, true); diff --git a/lib/333/Test.MyService.g.js b/lib/333/Test.MyService.g.js new file mode 100644 index 0000000..61b2c04 --- /dev/null +++ b/lib/333/Test.MyService.g.js @@ -0,0 +1,268 @@ +import Test_MyGenericRecordOfTest_MyResource from './Test.MyGenericRecordOfTest_MyResource.g.js'; +import Test_MyResource from './Test.MyResource.g.js'; +import Test_MyRecord from './Test.MyRecord.g.js'; +import Test_MyChildRecord from './Test.MyChildRecord.g.js'; +import Test_MyChildResource from './Test.MyChildResource.g.js'; +import Test_SizeEnum from './Test.SizeEnum.g.js'; + +export default class MyService extends Esiur.Net.IIP.DistributedResource { +/* TypedList.of(Esiur.Data.Nullable.of(TypedMap.of(Esiur.Data.Int32,Esiur.Data.Nullable.of(String)))) */ AsyncHello() { + var args = new (Esiur.Data.TypedMap.of(Esiur.Data.UInt8, Object))({}); + var rt = new Esiur.Core.AsyncReply(); + this._invoke(0, args).then((x) => rt.trigger(x)) + .error((x) => rt.triggerError(x)) + .chunk((x) => rt.triggerChunk(x)); + return rt; + } +/* Object */ Connection(/* Object */ a1,/* Esiur.Data.Int32 */ a2) { + var args = new (Esiur.Data.TypedMap.of(Esiur.Data.UInt8, Object))({ (new Esiur.Data.UInt8(0)) : a1, new Esiur.Data.UInt8(1) : a2 }); + var rt = new Esiur.Core.AsyncReply(); + this._invoke(1, args).then((x) => rt.trigger(x)) + .error((x) => rt.triggerError(x)) + .chunk((x) => rt.triggerChunk(x)); + return rt; + } +/* Object */ ConnectionOptional(/* Object */ a1,/* Esiur.Data.Int32 */ a2,/* Esiur.Data.Nullable.of(String) */ a3 = null) { + var args = new (Esiur.Data.TypedMap.of(Esiur.Data.UInt8, Object))({ new Esiur.Data.UInt8(0) : a1, new Esiur.Data.UInt8(1) : a2 }); + if (a3 != null) args.set(new Esiur.Data.UInt8(2), a3); + var rt = new Esiur.Core.AsyncReply(); + this._invoke(2, args).then((x) => rt.trigger(x)) + .error((x) => rt.triggerError(x)) + .chunk((x) => rt.triggerChunk(x)); + return rt; + } +/* Test_MyGenericRecordOfTest_MyResource */ GetGenericRecord() { + var args = new (Esiur.Data.TypedMap.of(Esiur.Data.UInt8, Object))({}); + var rt = new Esiur.Core.AsyncReply(); + this._invoke(3, args).then((x) => rt.trigger(x)) + .error((x) => rt.triggerError(x)) + .chunk((x) => rt.triggerChunk(x)); + return rt; + } +/* Tuple.of(Object,Object) */ GetTuple2(/* Esiur.Data.Int32 */ a1,/* String */ a2) { + var args = new (Esiur.Data.TypedMap.of(Esiur.Data.UInt8, Object))({ new Esiur.Data.UInt8(0) : a1, new Esiur.Data.UInt8(1) : a2 }); + var rt = new Esiur.Core.AsyncReply(); + this._invoke(4, args).then((x) => rt.trigger(x)) + .error((x) => rt.triggerError(x)) + .chunk((x) => rt.triggerChunk(x)); + return rt; + } +/* Tuple.of(Object,Object,Object) */ GetTuple3(/* Esiur.Data.Int32 */ a1,/* String */ a2,/* Esiur.Data.Float64 */ a3) { + var args = new (Esiur.Data.TypedMap.of(Esiur.Data.UInt8, Object))({ new Esiur.Data.UInt8(0) : a1, new Esiur.Data.UInt8(1) : a2, new Esiur.Data.UInt8(2) : a3 }); + var rt = new Esiur.Core.AsyncReply(); + this._invoke(5, args).then((x) => rt.trigger(x)) + .error((x) => rt.triggerError(x)) + .chunk((x) => rt.triggerChunk(x)); + return rt; + } +/* Tuple.of(Object,Object,Object,Object) */ GetTuple4(/* Esiur.Data.Int32 */ a1,/* String */ a2,/* Esiur.Data.Float64 */ a3,/* Boolean */ a4) { + var args = new (Esiur.Data.TypedMap.of(Esiur.Data.UInt8, Object))({ new Esiur.Data.UInt8(0) : a1, new Esiur.Data.UInt8(1) : a2, new Esiur.Data.UInt8(2) : a3, new Esiur.Data.UInt8(3) : a4 }); + var rt = new Esiur.Core.AsyncReply(); + this._invoke(6, args).then((x) => rt.trigger(x)) + .error((x) => rt.triggerError(x)) + .chunk((x) => rt.triggerChunk(x)); + return rt; + } +/* Object */ InvokeEvents(/* String */ msg) { + var args = new (Esiur.Data.TypedMap.of(Esiur.Data.UInt8, Object))({ new Esiur.Data.UInt8(0) : msg }); + var rt = new Esiur.Core.AsyncReply(); + this._invoke(7, args).then((x) => rt.trigger(x)) + .error((x) => rt.triggerError(x)) + .chunk((x) => rt.triggerChunk(x)); + return rt; + } +/* Esiur.Data.Float64 */ Optional(/* Object */ a1,/* Esiur.Data.Int32 */ a2,/* Esiur.Data.Nullable.of(String) */ a3 = null,/* Esiur.Data.Nullable.of(String) */ a4 = null) { + var args = new (Esiur.Data.TypedMap.of(Esiur.Data.UInt8, Object))({ new Esiur.Data.UInt8(0) : a1, new Esiur.Data.UInt8(1) : a2 }); + if (a3 != null) args.set(new Esiur.Data.UInt8(2), a3); + if (a4 != null) args.set(new Esiur.Data.UInt8(3), a4); + var rt = new Esiur.Core.AsyncReply(); + this._invoke(8, args).then((x) => rt.trigger(x)) + .error((x) => rt.triggerError(x)) + .chunk((x) => rt.triggerChunk(x)); + return rt; + } +/* Test_MyRecord */ SendRecord(/* Test_MyRecord */ record) { + var args = new (Esiur.Data.TypedMap.of(Esiur.Data.UInt8, Object))({ new Esiur.Data.UInt8(0) : record }); + var rt = new Esiur.Core.AsyncReply(); + this._invoke(9, args).then((x) => rt.trigger(x)) + .error((x) => rt.triggerError(x)) + .chunk((x) => rt.triggerChunk(x)); + return rt; + } + static /* String */ staticFunction(connection, /* String */ name) { + var args = new (Esiur.Data.TypedMap.of(Esiur.Data.UInt8, Object))({ new Esiur.Data.UInt8(0) : name }); + var rt = new Esiur.Core.AsyncReply(); + connection.staticCall(Guid.parse('c4250e9a35c707e9280c7ff2f46d3654'), 10, args).then((x) => rt.trigger(x)) + .error((x) => rt.triggerError(x)) + .chunk((x) => rt.triggerChunk(x)); + return rt; + } +/* Object */ Void() { + var args = new (Esiur.Data.TypedMap.of(Esiur.Data.UInt8, Object))({}); + var rt = new Esiur.Core.AsyncReply(); + this._invoke(11, args).then((x) => rt.trigger(x)) + .error((x) => rt.triggerError(x)) + .chunk((x) => rt.triggerChunk(x)); + return rt; + } + + /* TypedList.of(Boolean) */ get BooleanArray() { return this._get(1); } + set BooleanArray(/* TypedList.of(Boolean) */ value) { this._set(1, value); } +/* String */ get Char16() { return this._get(2); } + set Char16(/* String */ value) { this._set(2, value); } +/* TypedList.of(String) */ get Char16Array() { return this._get(3); } + set Char16Array(/* TypedList.of(String) */ value) { this._set(3, value); } +/* Test_MyChildRecord */ get ChildRecord() { return this._get(4); } + set ChildRecord(/* Test_MyChildRecord */ value) { this._set(4, value); } +/* Test_MyChildResource */ get ChildResource() { return this._get(5); } + set ChildResource(/* Test_MyChildResource */ value) { this._set(5, value); } +/* Test_SizeEnum */ get Enum() { return this._get(6); } + set Enum(/* Test_SizeEnum */ value) { this._set(6, value); } +/* Esiur.Data.Float128 */ get Float128() { return this._get(7); } + set Float128(/* Esiur.Data.Float128 */ value) { this._set(7, value); } +/* TypedList.of(Esiur.Data.Float128) */ get Float128Array() { return this._get(8); } + set Float128Array(/* TypedList.of(Esiur.Data.Float128) */ value) { this._set(8, value); } +/* Esiur.Data.Float32 */ get Float32() { return this._get(9); } + set Float32(/* Esiur.Data.Float32 */ value) { this._set(9, value); } +/* TypedList.of(Esiur.Data.Float32) */ get Float32Array() { return this._get(10); } + set Float32Array(/* TypedList.of(Esiur.Data.Float32) */ value) { this._set(10, value); } +/* Esiur.Data.Float64 */ get Float64() { return this._get(11); } + set Float64(/* Esiur.Data.Float64 */ value) { this._set(11, value); } +/* TypedList.of(Esiur.Data.Float64) */ get Float64Array() { return this._get(12); } + set Float64Array(/* TypedList.of(Esiur.Data.Float64) */ value) { this._set(12, value); } +/* Esiur.Data.Int16 */ get Int16() { return this._get(13); } + set Int16(/* Esiur.Data.Int16 */ value) { this._set(13, value); } +/* TypedList.of(Esiur.Data.Int16) */ get Int16Array() { return this._get(14); } + set Int16Array(/* TypedList.of(Esiur.Data.Int16) */ value) { this._set(14, value); } +/* TypedList.of(Esiur.Data.Int32) */ get Int32Array() { return this._get(15); } + set Int32Array(/* TypedList.of(Esiur.Data.Int32) */ value) { this._set(15, value); } +/* Esiur.Data.Int32 */ get Int32Prop() { return this._get(16); } + set Int32Prop(/* Esiur.Data.Int32 */ value) { this._set(16, value); } +/* Esiur.Data.Int64 */ get Int64() { return this._get(17); } + set Int64(/* Esiur.Data.Int64 */ value) { this._set(17, value); } +/* TypedList.of(Esiur.Data.Int64) */ get Int64Array() { return this._get(18); } + set Int64Array(/* TypedList.of(Esiur.Data.Int64) */ value) { this._set(18, value); } +/* Esiur.Data.Int8 */ get Int8() { return this._get(19); } + set Int8(/* Esiur.Data.Int8 */ value) { this._set(19, value); } +/* TypedList.of(Esiur.Data.Int8) */ get Int8Array() { return this._get(20); } + set Int8Array(/* TypedList.of(Esiur.Data.Int8) */ value) { this._set(20, value); } +/* TypedList.of(Esiur.Data.Int32) */ get IntList() { return this._get(21); } + set IntList(/* TypedList.of(Esiur.Data.Int32) */ value) { this._set(21, value); } +/* TypedMap.of(Esiur.Data.Int32,String) */ get IntStringMap() { return this._get(22); } + set IntStringMap(/* TypedMap.of(Esiur.Data.Int32,String) */ value) { this._set(22, value); } +/* undefined */ get Me() { return this._get(23); } + set Me(/* undefined */ value) { this._set(23, value); } +/* TypedList.of(Test_MyResource) */ get MyResources() { return this._get(24); } + set MyResources(/* TypedList.of(Test_MyResource) */ value) { this._set(24, value); } +/* Object */ get Object() { return this._get(25); } + set Object(/* Object */ value) { this._set(25, value); } +/* Esiur.Data.List */ get ObjectArray() { return this._get(26); } + set ObjectArray(/* Esiur.Data.List */ value) { this._set(26, value); } +/* Esiur.Data.Int32 */ get PropertyContext() { return this._get(27); } + set PropertyContext(/* Esiur.Data.Int32 */ value) { this._set(27, value); } +/* Test_MyRecord */ get Record() { return this._get(28); } + set Record(/* Test_MyRecord */ value) { this._set(28, value); } +/* TypedList.of(Esiur.Data.IRecord) */ get RecordsArray() { return this._get(29); } + set RecordsArray(/* TypedList.of(Esiur.Data.IRecord) */ value) { this._set(29, value); } +/* TypedList.of(Test_MyRecord) */ get RecordsList() { return this._get(30); } + set RecordsList(/* TypedList.of(Test_MyRecord) */ value) { this._set(30, value); } +/* Test_MyResource */ get Resource() { return this._get(31); } + set Resource(/* Test_MyResource */ value) { this._set(31, value); } +/* TypedList.of(Esiur.Resource.IResource) */ get Resources() { return this._get(32); } + set Resources(/* TypedList.of(Esiur.Resource.IResource) */ value) { this._set(32, value); } +/* TypedList.of(String) */ get StringArray() { return this._get(33); } + set StringArray(/* TypedList.of(String) */ value) { this._set(33, value); } +/* TypedMap.of(String,Object) */ get StringMap() { return this._get(34); } + set StringMap(/* TypedMap.of(String,Object) */ value) { this._set(34, value); } +/* String */ get Text() { return this._get(35); } + set Text(/* String */ value) { this._set(35, value); } +/* Date */ get Time() { return this._get(36); } + set Time(/* Date */ value) { this._set(36, value); } +/* Esiur.Data.UInt16 */ get UInt16() { return this._get(37); } + set UInt16(/* Esiur.Data.UInt16 */ value) { this._set(37, value); } +/* TypedList.of(Esiur.Data.UInt16) */ get UInt16Array() { return this._get(38); } + set UInt16Array(/* TypedList.of(Esiur.Data.UInt16) */ value) { this._set(38, value); } +/* Esiur.Data.UInt32 */ get UInt32() { return this._get(39); } + set UInt32(/* Esiur.Data.UInt32 */ value) { this._set(39, value); } +/* TypedList.of(Esiur.Data.UInt32) */ get UInt32Array() { return this._get(40); } + set UInt32Array(/* TypedList.of(Esiur.Data.UInt32) */ value) { this._set(40, value); } +/* Esiur.Data.UInt64 */ get UInt64() { return this._get(41); } + set UInt64(/* Esiur.Data.UInt64 */ value) { this._set(41, value); } +/* TypedList.of(Esiur.Data.UInt64) */ get UInt64Array() { return this._get(42); } + set UInt64Array(/* TypedList.of(Esiur.Data.UInt64) */ value) { this._set(42, value); } +/* TypedList.of(Esiur.Data.UInt8) */ get UInt8Array() { return this._get(43); } + set UInt8Array(/* TypedList.of(Esiur.Data.UInt8) */ value) { this._set(43, value); } +/* TypedList.of(Esiur.Data.Nullable.of(Esiur.Data.UInt8)) */ get UInt8ArrayNull() { return this._get(44); } + set UInt8ArrayNull(/* TypedList.of(Esiur.Data.Nullable.of(Esiur.Data.UInt8)) */ value) { this._set(44, value); } +/* Esiur.Data.Nullable.of(Esiur.Data.UInt8) */ get UInt8Null() { return this._get(45); } + set UInt8Null(/* Esiur.Data.Nullable.of(Esiur.Data.UInt8) */ value) { this._set(45, value); } +/* Esiur.Data.UInt8 */ get UInt8Test() { return this._get(46); } + set UInt8Test(/* Esiur.Data.UInt8 */ value) { this._set(46, value); } + + static get template() { + return new Esiur.Resource.Template.TemplateDescriber('Test', [ + new Esiur.Resource.Template.Prop('Boolean', Boolean, 'Boolean', null), + new Esiur.Resource.Template.Prop('BooleanArray', TypedList.of(Boolean), 'Boolean[]', null), + new Esiur.Resource.Template.Prop('Char16', String, 'Char', null), + new Esiur.Resource.Template.Prop('Char16Array', TypedList.of(String), 'Char[]', null), + new Esiur.Resource.Template.Prop('ChildRecord', Test_MyChildRecord, 'MyChildRecord', null), + new Esiur.Resource.Template.Prop('ChildResource', Test_MyChildResource, 'MyChildResource', null), + new Esiur.Resource.Template.Prop('Enum', Test_SizeEnum, 'SizeEnum', null), + new Esiur.Resource.Template.Prop('Float128', Esiur.Data.Float128, 'Decimal', null), + new Esiur.Resource.Template.Prop('Float128Array', TypedList.of(Esiur.Data.Float128), 'Decimal[]', null), + new Esiur.Resource.Template.Prop('Float32', Esiur.Data.Float32, 'Single', null), + new Esiur.Resource.Template.Prop('Float32Array', TypedList.of(Esiur.Data.Float32), 'Single[]', null), + new Esiur.Resource.Template.Prop('Float64', Esiur.Data.Float64, 'Double', null), + new Esiur.Resource.Template.Prop('Float64Array', TypedList.of(Esiur.Data.Float64), 'Double[]', null), + new Esiur.Resource.Template.Prop('Int16', Esiur.Data.Int16, 'Int16', null), + new Esiur.Resource.Template.Prop('Int16Array', TypedList.of(Esiur.Data.Int16), 'Int16[]', null), + new Esiur.Resource.Template.Prop('Int32Array', TypedList.of(Esiur.Data.Int32), 'Int32[]', null), + new Esiur.Resource.Template.Prop('Int32Prop', Esiur.Data.Int32, 'Int32', null), + new Esiur.Resource.Template.Prop('Int64', Esiur.Data.Int64, 'Int64', null), + new Esiur.Resource.Template.Prop('Int64Array', TypedList.of(Esiur.Data.Int64), 'Int64[]', null), + new Esiur.Resource.Template.Prop('Int8', Esiur.Data.Int8, 'SByte', null), + new Esiur.Resource.Template.Prop('Int8Array', TypedList.of(Esiur.Data.Int8), 'SByte[]', null), + new Esiur.Resource.Template.Prop('IntList', TypedList.of(Esiur.Data.Int32), 'List`1', null), + new Esiur.Resource.Template.Prop('IntStringMap', TypedMap.of(Esiur.Data.Int32, String), 'Map`2', null), + new Esiur.Resource.Template.Prop('Me', undefined, 'MyService', null), + new Esiur.Resource.Template.Prop('MyResources', TypedList.of(Test_MyResource), 'MyResource[]', null), + new Esiur.Resource.Template.Prop('Object', Object, 'Object', null), + new Esiur.Resource.Template.Prop('ObjectArray', Esiur.Data.List, 'Object[]', null), + new Esiur.Resource.Template.Prop('PropertyContext', Esiur.Data.Int32, 'DistributedPropertyContext`1', null), + new Esiur.Resource.Template.Prop('Record', Test_MyRecord, 'MyRecord', null), + new Esiur.Resource.Template.Prop('RecordsArray', TypedList.of(Esiur.Data.IRecord), 'IRecord[]', null), + new Esiur.Resource.Template.Prop('RecordsList', TypedList.of(Test_MyRecord), 'List`1', null), + new Esiur.Resource.Template.Prop('Resource', Test_MyResource, 'MyResource', null), + new Esiur.Resource.Template.Prop('Resources', TypedList.of(Esiur.Resource.IResource), 'IResource[]', null), + new Esiur.Resource.Template.Prop('StringArray', TypedList.of(String), 'String[]', null), + new Esiur.Resource.Template.Prop('StringMap', TypedMap.of(String, Object), 'Map`2', null), + new Esiur.Resource.Template.Prop('Text', String, 'String', null), + new Esiur.Resource.Template.Prop('Time', Date, 'DateTime', null), + new Esiur.Resource.Template.Prop('UInt16', Esiur.Data.UInt16, 'UInt16', null), + new Esiur.Resource.Template.Prop('UInt16Array', TypedList.of(Esiur.Data.UInt16), 'UInt16[]', null), + new Esiur.Resource.Template.Prop('UInt32', Esiur.Data.UInt32, 'UInt32', null), + new Esiur.Resource.Template.Prop('UInt32Array', TypedList.of(Esiur.Data.UInt32), 'UInt32[]', null), + new Esiur.Resource.Template.Prop('UInt64', Esiur.Data.UInt64, 'UInt64', null), + new Esiur.Resource.Template.Prop('UInt64Array', TypedList.of(Esiur.Data.UInt64), 'UInt64[]', null), + new Esiur.Resource.Template.Prop('UInt8Array', TypedList.of(Esiur.Data.UInt8), 'Byte[]', null), + new Esiur.Resource.Template.Prop('UInt8ArrayNull', TypedList.of(Esiur.Data.Nullable.of(Esiur.Data.UInt8)), 'Nullable`1[]', null), + new Esiur.Resource.Template.Prop('UInt8Null', Esiur.Data.Nullable.of(Esiur.Data.UInt8), 'Nullable`1?', null), + new Esiur.Resource.Template.Prop('UInt8Test', Esiur.Data.UInt8, 'Byte', null), + new Esiur.Resource.Template.Func('AsyncHello', TypedList.of(Esiur.Data.Nullable.of(TypedMap.of(Esiur.Data.Int32, Esiur.Data.Nullable.of(String)))), [], '() -> AsyncReply`1'), + new Esiur.Resource.Template.Func('Connection', Object, [new Esiur.Resource.Template.Arg('a1', Object, false), new Esiur.Resource.Template.Arg('a2', Esiur.Data.Int32, false)], '([Object] a1,[Int32] a2) -> Void'), + new Esiur.Resource.Template.Func('ConnectionOptional', Object, [new Esiur.Resource.Template.Arg('a1', Object, false), new Esiur.Resource.Template.Arg('a2', Esiur.Data.Int32, false), new Esiur.Resource.Template.Arg('a3', String, true)], '([Object] a1,[Int32] a2,[String] a3) -> Void'), + new Esiur.Resource.Template.Func('GetGenericRecord', Test_MyGenericRecordOfTest_MyResource, [], '() -> MyGenericRecord`1'), + new Esiur.Resource.Template.Func('GetTuple2', Tuple.of(Object, Object), [new Esiur.Resource.Template.Arg('a1', Esiur.Data.Int32, false), new Esiur.Resource.Template.Arg('a2', String, false)], '([Int32] a1,[String] a2) -> ValueTuple`2'), + new Esiur.Resource.Template.Func('GetTuple3', Tuple.of(Object, Object, Object), [new Esiur.Resource.Template.Arg('a1', Esiur.Data.Int32, false), new Esiur.Resource.Template.Arg('a2', String, false), new Esiur.Resource.Template.Arg('a3', Esiur.Data.Float64, false)], '([Int32] a1,[String] a2,[Double] a3) -> ValueTuple`3'), + new Esiur.Resource.Template.Func('GetTuple4', Tuple.of(Object, Object, Object, Object), [new Esiur.Resource.Template.Arg('a1', Esiur.Data.Int32, false), new Esiur.Resource.Template.Arg('a2', String, false), new Esiur.Resource.Template.Arg('a3', Esiur.Data.Float64, false), new Esiur.Resource.Template.Arg('a4', Boolean, false)], '([Int32] a1,[String] a2,[Double] a3,[Boolean] a4) -> ValueTuple`4'), + new Esiur.Resource.Template.Func('InvokeEvents', Object, [new Esiur.Resource.Template.Arg('msg', String, false)], '([String] msg) -> Void'), + new Esiur.Resource.Template.Func('Optional', Esiur.Data.Float64, [new Esiur.Resource.Template.Arg('a1', Object, false), new Esiur.Resource.Template.Arg('a2', Esiur.Data.Int32, false), new Esiur.Resource.Template.Arg('a3', String, true), new Esiur.Resource.Template.Arg('a4', String, true)], '([Object] a1,[Int32] a2,[String] a3,[String] a4) -> Double'), + new Esiur.Resource.Template.Func('SendRecord', Test_MyRecord, [new Esiur.Resource.Template.Arg('record', Test_MyRecord, false)], '([MyRecord] record) -> MyRecord'), + new Esiur.Resource.Template.Func('staticFunction', String, [new Esiur.Resource.Template.Arg('name', String, false)], '([String] name) -> String'), + new Esiur.Resource.Template.Func('Void', Object, [], '() -> Void'), + new Esiur.Resource.Template.Evt('ArrayEvent', Esiur.Data.List, false, null), + new Esiur.Resource.Template.Evt('StringEvent', String, false, null)], + null, 0, null, Esiur.Data.Guid.parse('c4250e9a35c707e9280c7ff2f46d3654'), 'MyService'); + } +} +new Esiur.Resource.Template.TypeTemplate(MyService, true); diff --git a/lib/333/Test.SizeEnum.g.js b/lib/333/Test.SizeEnum.g.js new file mode 100644 index 0000000..69b54de --- /dev/null +++ b/lib/333/Test.SizeEnum.g.js @@ -0,0 +1,16 @@ +import Test_MyService from './Test.MyService.g.js'; +import Test_MyGenericRecordOfTest_MyResource from './Test.MyGenericRecordOfTest_MyResource.g.js'; +import Test_MyResource from './Test.MyResource.g.js'; +import Test_MyRecord from './Test.MyRecord.g.js'; +import Test_MyChildRecord from './Test.MyChildRecord.g.js'; +import Test_MyChildResource from './Test.MyChildResource.g.js'; + +class SizeEnum extends IEnum { +static SizeEnum Large = SizeEnum(0, 1, 'Large'); +static SizeEnum Medium = SizeEnum(1, 0, 'Medium'); +static SizeEnum Small = SizeEnum(2, -10, 'Small'); +static SizeEnum XLarge = SizeEnum(3, 22, 'XLarge'); +static SizeEnum xSmall = SizeEnum(4, -11, 'xSmall'); + +SizeEnum([int index = 0, value, String name = '']) : super(index, value, name);TemplateDescriber get template => TemplateDescriber('Test.SizeEnum', constants: [Const('Large', getTypeOf(), 1, null), Const('Medium', getTypeOf(), 0, null), Const('Small', getTypeOf(), -10, null), Const('XLarge', getTypeOf(), 22, null), Const('xSmall', getTypeOf(), -11, null)], annotation: null); +} \ No newline at end of file diff --git a/lib/333/init.g.dart b/lib/333/init.g.dart new file mode 100644 index 0000000..6c5f4c1 --- /dev/null +++ b/lib/333/init.g.dart @@ -0,0 +1,30 @@ +import 'dart:async'; +import 'package:esiur/esiur.dart'; +import 'Test.MyService.g.js' as myservice;import 'Test.MyGenericRecordOfTest_MyResource.g.js' as mygenericrecordoftest_myresource;import 'Test.MyResource.g.js' as myresource;import 'Test.MyRecord.g.js' as myrecord;import 'Test.MyChildRecord.g.js' as mychildrecord;import 'Test.MyChildResource.g.js' as mychildresource;import 'Test.SizeEnum.g.js' as sizeenum; + + void init_333(){ + + + Warehouse.defineType(() => myservice.MyService(), RepresentationType(RepresentationTypeIdentifier.TypedResource, false, Guid.parse(''))); + +Warehouse.defineType(() => mygenericrecordoftest_myresource.MyGenericRecordOfTest_MyResource(), RepresentationType(RepresentationTypeIdentifier.TypedRecord, false, Guid.parse(''))); + +Warehouse.defineType(() => myresource.MyResource(), RepresentationType(RepresentationTypeIdentifier.TypedResource, false, Guid.parse(''))); + +Warehouse.defineType(() => myrecord.MyRecord(), RepresentationType(RepresentationTypeIdentifier.TypedRecord, false, Guid.parse(''))); + +Warehouse.defineType(() => mychildrecord.MyChildRecord(), RepresentationType(RepresentationTypeIdentifier.TypedRecord, false, Guid.parse(''))); + +Warehouse.defineType(() => mychildresource.MyChildResource(), RepresentationType(RepresentationTypeIdentifier.TypedResource, false, Guid.parse(''))); + +Warehouse.defineType(() => sizeenum.SizeEnum(), RepresentationType(RepresentationTypeIdentifier.Enum, false, Guid.parse(''))); + + Esiur.Resource.Warehouse.putTemplate(Esiur.Resource.Template.TypeTemplate.fromType(myservice.MyService)); + + +Warehouse.putTemplate(TypeTemplate.fromType(mygenericrecordoftest_myresource.MyGenericRecordOfTest_MyResource)); +Warehouse.putTemplate(TypeTemplate.fromType(myresource.MyResource)); +Warehouse.putTemplate(TypeTemplate.fromType(myrecord.MyRecord)); +Warehouse.putTemplate(TypeTemplate.fromType(mychildrecord.MyChildRecord)); +Warehouse.putTemplate(TypeTemplate.fromType(mychildresource.MyChildResource)); +Warehouse.putTemplate(TypeTemplate.fromType(sizeenum.SizeEnum));} \ No newline at end of file diff --git a/src/Data/DC.js b/src/Data/DC.js index 8e9d5eb..f04533f 100644 --- a/src/Data/DC.js +++ b/src/Data/DC.js @@ -72,7 +72,7 @@ export default class DC extends Uint8Array return new DC(list); } - static hexToBytes(value) + static fromHex(value) { // convert hex to Uint8Array var rt = new DC(value.length/2); @@ -467,9 +467,13 @@ export default class DC extends Uint8Array return rt; } - getHex(offset, length) + toHex(offset, length) { var rt = ""; + if (length == null) + length = this.byteLength; + if (offset == null) + offset = 0; for(var i = offset; i < offset + length; i++) { var h = this[i].toString(16); rt += h.length == 1 ? "0" + h : h; diff --git a/src/Data/DataSerializer.js b/src/Data/DataSerializer.js index 8a1f13a..e418fd0 100644 --- a/src/Data/DataSerializer.js +++ b/src/Data/DataSerializer.js @@ -129,7 +129,7 @@ export default class DataSerializer { return new DataSerializerComposeResults( TransmissionTypeIdentifier.Null, new DC(0)); - var template = Warehouse.getTemplateByType(value.runtimeType) ?? value.template; + var template = Warehouse.getTemplateByType(value.constructor); if (template == null) return new DataSerializerComposeResults( @@ -355,7 +355,7 @@ export default class DataSerializer { var rt = BinaryList(); - var template = Warehouse.getTemplateByType(value.runtimeType); + var template = Warehouse.getTemplateByType(value.constructor); if (template == null) return new DataSerializerComposeResults( diff --git a/src/Data/Guid.js b/src/Data/Guid.js index ea7b3c2..0042bbf 100644 --- a/src/Data/Guid.js +++ b/src/Data/Guid.js @@ -35,15 +35,15 @@ export default class Guid valueOf() { - return this.value.getHex(0, 16); + return this.value.toHex(0, 16); } - static fromString(data) { - this.value = DC.fromHex(data, ''); + static parse(data) { + return new Guid(DC.fromHex(data, '')) } toString() { - return this.vlue.toHex(''); + return this.value.toHex(); } // [Symbol.toPrimitive](hint){ diff --git a/src/Data/Nullable.js b/src/Data/Nullable.js new file mode 100644 index 0000000..9166da6 --- /dev/null +++ b/src/Data/Nullable.js @@ -0,0 +1,25 @@ +export default class Nullable { + + static cache = { }; + + static getType(nullableType){ + return nullableType.constructor.type; + } + + static of(type){ + + if (type.constructor.isNullable) + return type; + + if (Nullable.cache[type] != null) + return Nullable.cache[type]; + + let c = class extends type{} + Object.defineProperty(c, "isNullable", {value: true}); + Object.defineProperty(c, "type", {value: type}); + + Nullable.cache[type] = c; + + return c; + } +} \ No newline at end of file diff --git a/src/Data/RepresentationType.js b/src/Data/RepresentationType.js index b96aa95..9573cc9 100644 --- a/src/Data/RepresentationType.js +++ b/src/Data/RepresentationType.js @@ -9,8 +9,17 @@ import DC from './DC.js'; import Warehouse from '../Resource/Warehouse.js'; import {Int8, Int16, Int32, Int64, Int128, UInt8, UInt16, UInt32, UInt64, UInt128, Char8, Char16, Float32, Float64, Float128} from './ExtendedTypes.js'; +import Nullable from './Nullable.js'; +import IEnum from './IEnum.js'; +import TypedList from './TypedList.js'; +import TypedMap from './TypedMap.js'; +import RecordArray from './RecordArray.js'; +import ResourceArray from './ResourceArray.js'; +import Tuple from './Tuple.js'; +import Void from './Void.js'; + export const RepresentationTypeIdentifier = { - Void: 0x0, + Void: 0x0, Dynamic : 0x1, Bool : 0x2, UInt8 : 0x3, @@ -47,31 +56,70 @@ export const RepresentationTypeIdentifier = { Tuple7 : 0x78 } -let RuntimeTypes = {}; +let IdentifierToTypeMap = {}; -RuntimeTypes[RepresentationTypeIdentifier.Void] = [Object, Object]; -RuntimeTypes[RepresentationTypeIdentifier.Bool] = [Boolean, Object]; -RuntimeTypes[RepresentationTypeIdentifier.Char] = [Char8, Object]; -RuntimeTypes[RepresentationTypeIdentifier.Char16] = [Char16, Object]; -RuntimeTypes[RepresentationTypeIdentifier.UInt8] = [UInt8, UInt8]; -RuntimeTypes[RepresentationTypeIdentifier.Int8] = [Int8, Object]; -RuntimeTypes[RepresentationTypeIdentifier.Int16] = [Int16, Object]; -RuntimeTypes[RepresentationTypeIdentifier.UInt16] = [UInt16, Object]; -RuntimeTypes[RepresentationTypeIdentifier.Int32] = [Int32, Object]; -RuntimeTypes[RepresentationTypeIdentifier.UInt32] = [UInt32, Object]; -RuntimeTypes[RepresentationTypeIdentifier.Int64] = [Int64, Object]; -RuntimeTypes[RepresentationTypeIdentifier.UInt64] = [UInt64, Object]; -RuntimeTypes[RepresentationTypeIdentifier.Int128] = [Int128, Object]; -RuntimeTypes[RepresentationTypeIdentifier.UInt128] = [UInt128, Object]; -RuntimeTypes[RepresentationTypeIdentifier.Float32] = [Float32, Object]; -RuntimeTypes[RepresentationTypeIdentifier.Float64] = [Float64, Object]; -RuntimeTypes[RepresentationTypeIdentifier.Decimal] = [Float128, Object]; -RuntimeTypes[RepresentationTypeIdentifier.String] = [String, Object]; -RuntimeTypes[RepresentationTypeIdentifier.DateTime] = [Date, Object]; -RuntimeTypes[RepresentationTypeIdentifier.Resource] = [IResource, IResource]; -RuntimeTypes[RepresentationTypeIdentifier.Record] = [IRecord, IRecord]; +IdentifierToTypeMap[RepresentationTypeIdentifier.Void] = Void; +IdentifierToTypeMap[RepresentationTypeIdentifier.Bool] = Boolean; +IdentifierToTypeMap[RepresentationTypeIdentifier.Char] = Char8; +IdentifierToTypeMap[RepresentationTypeIdentifier.Char16] = Char16; +IdentifierToTypeMap[RepresentationTypeIdentifier.UInt8] = UInt8; +IdentifierToTypeMap[RepresentationTypeIdentifier.Int8] = Int8; +IdentifierToTypeMap[RepresentationTypeIdentifier.Int16] = Int16; +IdentifierToTypeMap[RepresentationTypeIdentifier.UInt16] = UInt16; +IdentifierToTypeMap[RepresentationTypeIdentifier.Int32] = Int32; +IdentifierToTypeMap[RepresentationTypeIdentifier.UInt32] = UInt32; +IdentifierToTypeMap[RepresentationTypeIdentifier.Int64] = Int64; +IdentifierToTypeMap[RepresentationTypeIdentifier.UInt64] = UInt64; +IdentifierToTypeMap[RepresentationTypeIdentifier.Int128] = Int128; +IdentifierToTypeMap[RepresentationTypeIdentifier.UInt128] = UInt128; +IdentifierToTypeMap[RepresentationTypeIdentifier.Float32] = Float32; +IdentifierToTypeMap[RepresentationTypeIdentifier.Float64] = Float64; +IdentifierToTypeMap[RepresentationTypeIdentifier.Decimal] = Float128; +IdentifierToTypeMap[RepresentationTypeIdentifier.String] = String; +IdentifierToTypeMap[RepresentationTypeIdentifier.DateTime] = Date; +IdentifierToTypeMap[RepresentationTypeIdentifier.Resource] = IResource; +IdentifierToTypeMap[RepresentationTypeIdentifier.Record] = IRecord; +IdentifierToTypeMap[RepresentationTypeIdentifier.List] = Array; +IdentifierToTypeMap[RepresentationTypeIdentifier.Map] = Map; +IdentifierToTypeMap[RepresentationTypeIdentifier.ResourceArray] = ResourceArray; +IdentifierToTypeMap[RepresentationTypeIdentifier.RecordArray] = RecordArray; + +const TypeToIdentifierMap = {}; +TypeToIdentifierMap[Void] = RepresentationTypeIdentifier.Void; +TypeToIdentifierMap[Boolean] = RepresentationTypeIdentifier.Bool; +TypeToIdentifierMap[Char8] = RepresentationTypeIdentifier.Char; +TypeToIdentifierMap[Char16] = RepresentationTypeIdentifier.Char16; +TypeToIdentifierMap[UInt8] = RepresentationTypeIdentifier.UInt8; +TypeToIdentifierMap[Int8] = RepresentationTypeIdentifier.Int8; +TypeToIdentifierMap[Int16] = RepresentationTypeIdentifier.Int16; +TypeToIdentifierMap[UInt16] = RepresentationTypeIdentifier.UInt16; +TypeToIdentifierMap[Int32] = RepresentationTypeIdentifier.Int32; +TypeToIdentifierMap[UInt32] = RepresentationTypeIdentifier.UInt32; +TypeToIdentifierMap[Int64] = RepresentationTypeIdentifier.Int64; +TypeToIdentifierMap[UInt64] = RepresentationTypeIdentifier.UInt64; +TypeToIdentifierMap[Int128] = RepresentationTypeIdentifier.Int128; +TypeToIdentifierMap[UInt128] = RepresentationTypeIdentifier.UInt128; +TypeToIdentifierMap[Float32] = RepresentationTypeIdentifier.Float32; +TypeToIdentifierMap[Float64] = RepresentationTypeIdentifier.Float64; +TypeToIdentifierMap[Float128] = RepresentationTypeIdentifier.Decimal; +TypeToIdentifierMap[String] = RepresentationTypeIdentifier.String; +TypeToIdentifierMap[Date] = RepresentationTypeIdentifier.DateTime; +TypeToIdentifierMap[IResource] = RepresentationTypeIdentifier.Resource; +TypeToIdentifierMap[IRecord] = RepresentationTypeIdentifier.Record; +TypeToIdentifierMap[Array] = RepresentationTypeIdentifier.List; +TypeToIdentifierMap[Map] = RepresentationTypeIdentifier.Map; +TypeToIdentifierMap[RecordArray] = RepresentationTypeIdentifier.RecordArray; +TypeToIdentifierMap[ResourceArray] = RepresentationTypeIdentifier.ResourceArray; + +const TupleIdentifierByLength = { + 2: RepresentationTypeIdentifier.Tuple2, + 3: RepresentationTypeIdentifier.Tuple3, + 4: RepresentationTypeIdentifier.Tuple4, + 5: RepresentationTypeIdentifier.Tuple5, + 6: RepresentationTypeIdentifier.Tuple6, + 7: RepresentationTypeIdentifier.Tuple7, +} - export class RepresentationTypeParseResults { //RepresentationType type; //int size; @@ -82,23 +130,41 @@ export class RepresentationTypeParseResults { } export default class RepresentationType { -// static getTypeFromName(name) { -// const types = { -// "int": int, -// "bool": bool, -// "double": double, -// "String": String, -// "IResource": IResource, -// "IRecord": IRecord, -// "IEnum": IEnum, -// "DC": DC, -// }; -// if (types[name] != null) { -// return types[name]; -// } else -// return Object().runtimeType; -// } + static getRuntimeType() { + let runtimeType = null; + + if (IdentifierToTypeMap[this.identifier] != undefined) + runtimeType = IdentifierToTypeMap[this.identifier] + if (this.identifier == RepresentationTypeIdentifier.TypedResource) { + runtimeType = Warehouse.getTemplateByClassId(this.guid)?.definedType; + } else if (this.identifier == RepresentationTypeIdentifier.TypedRecord) { + runtimeType = Warehouse.getTemplateByClassId(this.guid, TemplateType.Record)?.definedType; + } else if (this.identifier == RepresentationTypeIdentifier.Enum) { + runtimeType = Warehouse.getTemplateByClassId(this.guid, TemplateType.Enum)?.definedType; + } else if (this.identifier == RepresentationTypeIdentifier.TypedList){ + let elementType = this.subTypes[0].getRuntimeType(); + runtimeType = TypedList.of(elementType); + } else if (this.identifier == RepresentationTypeIdentifier.TypedMap){ + let keyType = this.subTypes[0].getRuntimeType(); + let valueType = this.subTypes[1].getRuntimeType(); + runtimeType = TypedMap.of(keyType, valueType); + } else if (this.identifier == RepresentationTypeIdentifier.Tuple2 + || this.identifier == RepresentationTypeIdentifier.Tuple3 + || this.identifier == RepresentationTypeIdentifier.Tuple4 + || this.identifier == RepresentationTypeIdentifier.Tuple5 + || this.identifier == RepresentationTypeIdentifier.Tuple6 + || this.identifier == RepresentationTypeIdentifier.Tuple7) { + + let subs = this.subTypes.map(x=>x.getRuntimeType()); + runtimeType = Tuple.of(...subs); + } + + if (this.nullable) + return Nullable.of(runtimeType); + else + return runtimeType; + } toNullable() { return new RepresentationType(this.identifier, true, this.guid, this.subTypes); @@ -108,29 +174,60 @@ export default class RepresentationType { static get Dynamic() { return new RepresentationType(RepresentationTypeIdentifier.Dynamic, true, null, null);} - static fromType(type) { - return Warehouse.typesFactory[type]?.representationType; - } - - getRuntimeType() { - if (RuntimeTypes[this.identifier]) - return this.nullable - ? RuntimeTypes[this.identifier][1] - : RuntimeTypes[this.identifier][0]; - if (this.identifier == RepresentationTypeIdentifier.TypedRecord) - return Warehouse.getTemplateByClassId(this.guid, TemplateType.Record) - ?.definedType; - else if (this.identifier == RepresentationTypeIdentifier.TypedResource) - return Warehouse.getTemplateByClassId(this.guid, TemplateType.Unspecified) - ?.definedType; - else if (this.identifier == RepresentationTypeIdentifier.Enum) - return Warehouse.getTemplateByClassId(this.guid, TemplateType.Enum) - ?.definedType; + static fromType(type) { + + + if (type == null) + throw new Error("Type can't be null."); + + let nullable = type.constructor.isNullable; + + if (nullable) + type = type.constructor.type; // original type + + let identifier = TypeToIdentifierMap[type]; + + if (identifier != null) + return new RepresentationType(identifier, null); + + if (type.prototype instanceof IResource){ + + let template = Warehouse.getTemplateByType(type); + return new RepresentationType(RepresentationTypeIdentifier.TypedResource, nullable, template.classId); + + } else if (type.prototype instanceof IRecord) { + + let template = Warehouse.getTemplateByType(type); + return new RepresentationType(RepresentationTypeIdentifier.TypedRecord, nullable, template.classId); + + } else if (type.prototype instanceof IEnum) { + + let template = Warehouse.getTemplateByType(type); + return new RepresentationType(RepresentationTypeIdentifier.Enum, nullable, template.classId); + + } else if (type.prototype instanceof TypedList) { + + let elementType = RepresentationType.fromType(TypedList.getType(type)); + return new RepresentationType(RepresentationTypeIdentifier.TypedList, null, null, [elementType]); + + } else if (type.prototype instanceof TypedMap) { + + let subs = TypedMap.getTypes(type); + let keyType = RepresentationType.fromType(subs[0]); + let valueType = RepresentationType.fromType(subs[1]); + return new RepresentationType(RepresentationTypeIdentifier.TypedMap, null, null, [keyType, valueType]); + + } else if (type.prototype instanceof Tuple) { + + let subs = Tuple.gettypes(type).map(x=> RepresentationType.fromType(x)); + return new RepresentationType(TupleIdentifierByLength[subs.length], nullable, null, subs); + } + return null; } - + constructor(identifier, nullable, guid, subTypes) { this.identifier = identifier; diff --git a/src/Data/Void.js b/src/Data/Void.js new file mode 100644 index 0000000..8bfc666 --- /dev/null +++ b/src/Data/Void.js @@ -0,0 +1,4 @@ + +export default class Void { + +} \ No newline at end of file diff --git a/src/Net/IIP/DistributedConnection.js b/src/Net/IIP/DistributedConnection.js index a9025eb..2e15860 100644 --- a/src/Net/IIP/DistributedConnection.js +++ b/src/Net/IIP/DistributedConnection.js @@ -82,6 +82,7 @@ import PropertyValue from '../../Data/PropertyValue.js'; import PropertyValueArray from '../../Data/PropertyValueArray.js'; import { UInt8 } from '../../Data/ExtendedTypes.js'; import ConnectionStatus from './ConnectionStatus.js'; +import { Prop, TemplateDescriber } from '../../Resource/Template/TemplateDescriber.js'; export default class DistributedConnection extends IStore { @@ -3184,9 +3185,6 @@ export default class DistributedConnection extends IStore { static get template() { - return { - namespace: "Esiur", - properties: [["status", UInt8]] - }; + return new TemplateDescriber("Esiur", [new Prop("status", UInt8)]); } } diff --git a/src/Net/IIP/DistributedResource.js b/src/Net/IIP/DistributedResource.js index 92964fd..419e503 100644 --- a/src/Net/IIP/DistributedResource.js +++ b/src/Net/IIP/DistributedResource.js @@ -171,15 +171,6 @@ export default class DistributedResource extends IResource var makeSetter = function(index) { return async function (value) { - if (self._p.destroyed) - throw new Error("Trying to access a destroyed object."); - - if (self._p.suspended) - throw new Error("Trying to access a suspended object."); - - if (self._p.attached) - return; - await self._set(index, value); }; }; @@ -286,11 +277,15 @@ export default class DistributedResource extends IResource _set(index, value) { + if (this._p.destroyed) + throw new Error("Trying to access a destroyed object."); + + if (this._p.suspended) + throw new Error("Trying to access a suspended object."); + if (!this._p.attached) - { - console.log("Resource not attached."); - return; - } + throw new Error("Resource not attached."); + if (this._p.neglect) return; diff --git a/src/Proxy/TemplateGenerator.js b/src/Proxy/TemplateGenerator.js new file mode 100644 index 0000000..d397c6e --- /dev/null +++ b/src/Proxy/TemplateGenerator.js @@ -0,0 +1,488 @@ + +import { RepresentationTypeIdentifier } from '../Data/RepresentationType.js'; +import TemplateType from '../Resource/Template/TemplateType.js'; +import Warehouse from '../Resource/Warehouse.js'; + +export default class TemplateGenerator { + + static toLiteral(input) { + if (input == null) return "null"; + + let literal = ""; + + literal += "\""; + + input.split('').forEach((c) => { + switch (c) { + case '"': + literal += "\\\""; + break; + case '\\': + literal += "\\\\"; + break; + case '\0': + literal += "\\0"; + break; + case '\b': + literal += "\\b"; + break; + case '\f': + literal += "\\f"; + break; + case '\n': + literal += "\\n"; + break; + case '\r': + literal += "\\r"; + break; + case '\t': + literal += "\\t"; + break; + case '\v': + literal += "\\v"; + break; + default: + literal += c; + break; + } + }); + + literal += "\""; + return literal; + } + + static generateRecord(template, templates) { + let className = template.className.split('.').slice(-1)[0]; + let rt = ""; + + let parentName; + + if (template.parentId != null) { + parentName = this._translateClassName(templates + .find((x) => + (x.classId.valueOf() == template.parentId.valueOf()) && + (x.type == TemplateType.Record)) + .className); + rt += `class ${className} extends ${parentName} {\r\n`; + } else { + rt += `class ${className} extends IRecord { \r\n`; + } + + template.properties.forEach((p) => { + if (p.inherited) return; + let ptTypeName = this.getDecoratedTypeName(template, p.valueType, templates); + rt += `${ptTypeName} ${p.name};\r\n\r\n`; + }); + + rt += "\r\n"; + + + // rt += "deserialize(Map value) {"); + + // template.properties.forEach((p) { + // rt.writeln("${p.name} = value['${p.name}'];"); + // }); + + //rt += "}\r\n"; + + // rt.writeln("Map serialize() {"); + // rt.writeln("var rt = Map();"); + + // template.properties.forEach((p) { + // rt.writeln("rt['${p.name}'] = ${p.name};"); + // }); + + // rt.writeln("return rt;"); + // rt.writeln("}"); + + // add template + var descProps = template.properties + .map((p) => { + var ptTypeName = this.getTypeName(template, p.valueType, templates); + return `new Prop('${p.name}', ${ptTypeName}, ${this._escape(p.readAnnotation)}, ${this._escape(p.writeAnnotation)})`; + }); + + rt += `\r\nstatic get template() {return new TemplateDescriber('${template.className}', [\r\n${descProps.join(',\r\n')}], \r\n${parentName}, ${template.version}, ${this.toLiteral(template.annotation)});\r\n}`; + + rt += "\r\n}"; + + return rt; + } + + static _translateClassName(className) { + var cls = className.split('.'); + return cls.join('_'); + } + + static getDecoratedTypeName(forTemplate, representationType, templates){ + return `/* ${this.getTypeName(forTemplate, representationType, templates)} */`; + } + + static getTypeName(forTemplate, representationType, templates) { + let name; + + if (representationType.identifier == RepresentationTypeIdentifier.TypedResource) { + if (representationType.guid.valueOf() == forTemplate.classId.valueOf()) + name = forTemplate.className.split('.').last; + else + name = this._translateClassName(templates + .find((x) => + x.classId.valueOf() == representationType.guid.valueOf() && + (x.type == TemplateType.Resource || + x.type == TemplateType.Wrapper)) + .className); + } else if (representationType.identifier == RepresentationTypeIdentifier.TypedRecord) { + if (representationType.guid.valueOf() == forTemplate.classId.valueOf()) + name = forTemplate.className.split('.').last; + else + name = this._translateClassName(templates + .find((x) => + x.classId.valueOf() == representationType.guid.valueOf() && + x.type == TemplateType.Record) + .className); + } else if (representationType.identifier == RepresentationTypeIdentifier.Enum) { + if (representationType.guid.valueOf() == forTemplate.classId.valueOf()) + name = forTemplate.className.split('.').last; + else + name = this._translateClassName(templates + .find((x) => + x.classId.valueOf() == representationType.guid.valueOf() && + x.type == TemplateType.Enum) + .className); + } else if (representationType.identifier == RepresentationTypeIdentifier.TypedList) + name = "TypedList.of(" + this.getTypeName(forTemplate, representationType.subTypes[0], templates) + ")"; + else if (representationType.identifier == + RepresentationTypeIdentifier.TypedMap) + name = "TypedMap.of(" + + this.getTypeName(forTemplate, representationType.subTypes[0], templates) + + "," + + this.getTypeName(forTemplate, representationType.subTypes[1], templates) + + ")"; + else if (representationType.identifier == + RepresentationTypeIdentifier.Tuple2 || + representationType.identifier == RepresentationTypeIdentifier.Tuple3 || + representationType.identifier == RepresentationTypeIdentifier.Tuple4 || + representationType.identifier == RepresentationTypeIdentifier.Tuple5 || + representationType.identifier == RepresentationTypeIdentifier.Tuple6 || + representationType.identifier == RepresentationTypeIdentifier.Tuple7) + name = "Tuple.of(" + representationType.subTypes.map( x => this.getTypeName(x, templates)).join(',') + ")"; + else { + switch (representationType.identifier) { + case RepresentationTypeIdentifier.Dynamic: + name = "Object"; + break; + case RepresentationTypeIdentifier.Bool: + name = "Boolean"; + break; + case RepresentationTypeIdentifier.Char: + name = "String"; + break; + case RepresentationTypeIdentifier.DateTime: + name = "Date"; + break; + case RepresentationTypeIdentifier.Decimal: + name = "Esiur.Data.Float128"; + break; + case RepresentationTypeIdentifier.Float32: + name = "Esiur.Data.Float32"; + break; + case RepresentationTypeIdentifier.Float64: + name = "Esiur.Data.Float64"; + break; + case RepresentationTypeIdentifier.Int16: + name = "Esiur.Data.Int16"; + break; + case RepresentationTypeIdentifier.Int32: + name = "Esiur.Data.Int32"; + break; + case RepresentationTypeIdentifier.Int64: + name = "Esiur.Data.Int64"; + break; + case RepresentationTypeIdentifier.Int8: + name = "Esiur.Data.Int8"; + break; + case RepresentationTypeIdentifier.String: + name = "String"; + break; + case RepresentationTypeIdentifier.Map: + name = "Map"; + break; + case RepresentationTypeIdentifier.UInt16: + name = "Esiur.Data.UInt16"; + break; + case RepresentationTypeIdentifier.UInt32: + name = "Esiur.Data.UInt32"; + break; + case RepresentationTypeIdentifier.UInt64: + name = "Esiur.Data.UInt64"; + break; + case RepresentationTypeIdentifier.UInt8: + name = "Esiur.Data.UInt8"; + break; + case RepresentationTypeIdentifier.List: + name = "Esiur.Data.List"; + break; + case RepresentationTypeIdentifier.Resource: + name = "Esiur.Resource.IResource"; + break; + case RepresentationTypeIdentifier.Record: + name = "Esiur.Data.IRecord"; + break; + default: + name = "Object"; + } + } + + return (representationType.nullable) ? `Esiur.Data.Nullable.of(${name})` : name; + } + + static isNullOrEmpty(v) { + return v == null || v == ""; + } + + static async getTemplate(url, dir, username, password, asyncSetters = true) { + + + const fs = await import("fs"); + // var fs = require('fs'); + + const _urlRegex = /^(?:([^\s|:]*):\/\/([^/]*)\/?(.*))/; + // /^(?:([^\s|:]*):\/\/([^/]*)\/?)/; + + if (!_urlRegex.test(url)) + throw Error(`Invalid IIP URL '${url}'`); + + let path = url.split(_urlRegex); + + let con = await Warehouse.get(path[1] + "://" + path[2], username != null + ? {"username": username, "password": password ?? ""} + : null); + + if (con == null) + throw Error("Can't connect to server"); + + if (dir == null || dir == "") + dir = path[2].replaceAll(":", "_"); + + let templates = await con.getLinkTemplates(path[3]); + + // no longer needed + Warehouse.remove(con); + + let dstDir = `lib/${dir}`; + + + if (!fs.existsSync(dstDir)){ + fs.mkdirSync(dstDir, { recursive: true }); + } + + var makeImports = (skipTemplate) => { + let imports = ""; + // make import names + templates.forEach((tmp) => { + if (tmp != skipTemplate) { + let cls = tmp.className.split('.'); + imports += `import ${cls.join('_')} from './${tmp.className}.g.js';\r\n`; + } + }); + + imports += "\r\n"; + return imports; + }; + + // make sources + templates.forEach(async (tmp) => { + console.log(`Generating '${tmp.className}'.`); + let filePath = `${dstDir}/${tmp.className}.g.js`; + + var source = ""; + if (tmp.type == TemplateType.Resource) { + source = makeImports(tmp) + this.generateClass(tmp, templates, asyncSetters); + } else if (tmp.type == TemplateType.Record) { + source = makeImports(tmp) + this.generateRecord(tmp, templates); + } else if (tmp.type == TemplateType.Enum) { + source = makeImports(tmp) + this.generateEnum(tmp, templates); + } + + fs.writeFileSync(filePath, source); + + }); + + + return dstDir; + + } + + static _escape(str) { + if (str == null) + return "null"; + else + return `'${str}'`; + } + + static generateEnum(template, templates) { + var className = template.className.split('.').slice(-1)[0]; + var rt = ""; + + rt += `class ${className} extends IEnum {\r\n`; + + template.constants.forEach((c) => { + rt += `static ${className} ${c.name} = ${className}(${c.index}, ${c.value}, '${c.name}');\r\n`; + }); + + rt += "\r\n"; + + rt += `${className}([int index = 0, value, String name = '']) : super(index, value, name);`; + + // add template + var descConsts = template.constants.map((p) => { + var ctTypeName = this.getTypeName(template, p.valueType, templates); + return `Const('${p.name}', getTypeOf<${ctTypeName}>(), ${p.value}, ${this._escape(p.annotation)})`; + }).join(', '); + + rt += `TemplateDescriber get template => TemplateDescriber('${template.className}', constants: [${descConsts}], annotation: ${this.toLiteral(template.annotation)});`; + + rt += "\r\n}"; + + return rt; + } + + static generateClass(template, templates, asyncSetters = true) { + let className = template.className.split('.').slice(-1)[0]; + + let parentName = null; + + let rt = ""; + + if (template.parentId != null) { + parentName = this._translateClassName(templates + .find((x) => + (x.classId.valueOf() == template.parentId.valueOf()) && + (x.type == TemplateType.Resource || + x.type == TemplateType.Wrapper)) + .className); + rt += `export default class ${className} extends ${parentName} {\r\n`; + } else { + rt += `export default class ${className} extends Esiur.Net.IIP.DistributedResource {\r\n`; + } + + // rt += `constructor() {`; + + // template.events.filter((e) => !e.inherited).forEach((e) => { + // rt += `on('${e.name}', (x) => _${e.name}Controller.add(x));`; + // }); + + // rt += "}\r\n"; + + + template.functions.filter((f) => !f.inherited).forEach((f) => { + var rtTypeName = this.getDecoratedTypeName(template, f.returnType, templates); + var positionalArgs = f.args.filter((x) => !x.optional); + var optionalArgs = f.args.filter((x) => x.optional); + + if (f.isStatic) { + //rt += `static AsyncReply<${rtTypeName}> ${f.name}(DistributedConnection connection`; + rt += `static ${rtTypeName} ${f.name}(connection`; + + if (positionalArgs.length > 0) + rt += `, ${positionalArgs.map((a) => this.getDecoratedTypeName(template, a.type, templates) + " " + a.name).join(',')}`; + + if (optionalArgs.length > 0) { + rt += `, [${optionalArgs.map((a) => this.getDecoratedTypeName(template, a.type.toNullable(), templates) + " " + a.name).join(',')}]`; + } + } else { + //rt += `AsyncReply<${rtTypeName}> ${f.name}(`; + rt += `${rtTypeName} ${f.name}(`; + + if (positionalArgs.length > 0) + rt += `${positionalArgs.map((a) => this.getDecoratedTypeName(template, a.type, templates) + " " + a.name).join(',')}`; + + if (optionalArgs.length > 0) { + if (positionalArgs.length > 0) rt += ","; + //rt += `[${optionalArgs.map((a) => this.getTypeName(template, a.type.toNullable(), templates) + " " + a.name).join(',')}]`; + rt += `${optionalArgs.map((a) => this.getDecoratedTypeName(template, a.type.toNullable(), templates) + " " + a.name + " = null").join(',')}`; + } + } + + rt += ") {\r\n"; +// var argsMap = new (TypedMap.of(UInt8, Object)); + + rt += "var args = new (Esiur.Data.TypedMap.of(Esiur.Data.UInt8, Object))("; + rt += `{${positionalArgs.map((e) => "new Esiur.Data.UInt8(" + e.index.toString() + ') :' + e.name).join(',')}});\r\n`; + + optionalArgs.forEach((a) => { + rt += `if (${a.name} != null) args.set(new Esiur.Data.UInt8(${a.index}), ${a.name});\r\n`; + }); + + //rt += `var rt = new AsyncReply<${rtTypeName}>();\r\n`; + rt += `var rt = new Esiur.Core.AsyncReply();\r\n`; + if (f.isStatic) { + rt += `connection.staticCall(Guid.parse('${template.classId.toString()}'), ${f.index}, args)`; + } else { + rt += `this._invoke(${f.index}, args)`; + } + rt += `.then((x) => rt.trigger(x))\r\n`; + rt += `.error((x) => rt.triggerError(x))\r\n`; + rt += `.chunk((x) => rt.triggerChunk(x));\r\n`; + rt += `return rt; }\r\n`; + }); + + template.properties.filter((p) => !p.inherited).forEach((p) => { + let ptTypeName = this.getDecoratedTypeName(template, p.valueType, templates); + rt += `${ptTypeName} get ${p.name}() { return this._get(${p.index}); }\r\n`; + + if (asyncSetters) + rt += `set ${p.name}(${ptTypeName} value) { this._set(${p.index}, value); }\r\n`; + else + rt += `set ${p.name}(${ptTypeName} value) { this._setSync(${p.index}, value); }\r\n`; + }); + + // template.events.filter((e) => !e.inherited).forEach((e) => { + // var etTypeName = this.getTypeName(template, e.argumentType, templates); + + // rt += `final _${e.name}Controller = StreamController<$etTypeName>();\r\n`; + // rt += `Stream<${etTypeName}> get ${e.name} { \r\n`; + // rt += `return _${e.name}Controller.stream;\r\n`; + // rt += "}"; + // }); + + // add template + var descProps = template.properties //.where((p) => !p.inherited) + .map((p) => { + var ptTypeName = this.getTypeName(template, p.valueType, templates); + return `new Esiur.Resource.Template.Prop('${p.name}', ${ptTypeName}, ${this._escape(p.readAnnotation)}, ${this._escape(p.writeAnnotation)})`; + }); + + var descFuncs = template.functions + .map((f) => { + var ftTypeName = this.getTypeName(template, f.returnType, templates); + + var args = f.args.map((a) => { + var atTypeName = this.getTypeName(template, a.type, templates); + return `new Esiur.Resource.Template.Arg('${a.name}', ${atTypeName}, ${a.optional})`; + }).join(', '); + + return `new Esiur.Resource.Template.Func('${f.name}', ${ftTypeName}, [${args}], ${this._escape(f.annotation)})`; + }); + + var descEvents = template.events + //.where((e) => !e.inherited) + .map((e) => { + var etTypeName = this.getTypeName(template, e.argumentType, templates); + return `new Esiur.Resource.Template.Evt('${e.name}', ${etTypeName}, ${e.listenable}, ${this._escape(e.annotation)})`; + }); + + // constructor(namespace, members, parent, version = 0, annotation = null){ + + + let cls = template.className.split('.'); + let namespace = cls.slice(0, cls.length - 1).join('.'); + + rt += `\r\nstatic get template() {return new Esiur.Resource.Template.TemplateDescriber('${namespace}', [\r\n${[...descProps, ...descFuncs, ...descEvents].join(',\r\n')}], \r\n${parentName}, ${template.version}, ${this.toLiteral(template.annotation)}, Esiur.Data.Guid.parse('${template.classId.toString()}'), '${className}');\r\n}`; + + rt += "\r\n}\r\n"; + + rt += `new Esiur.Resource.Template.TypeTemplate(${className}, true);\r\n` + return rt; + } +} diff --git a/src/Resource/IResource.js b/src/Resource/IResource.js index a3de804..6f109f6 100644 --- a/src/Resource/IResource.js +++ b/src/Resource/IResource.js @@ -29,6 +29,7 @@ import AsyncBag from '../Core/AsyncBag.js'; import AsyncReply from '../Core/AsyncReply.js'; import IDestructible from '../Core/IDestructible.js'; +import { TemplateDescriber } from './Template/TemplateDescriber.js'; export const ResourceTrigger = { @@ -59,11 +60,6 @@ export default class IResource extends IDestructible static get template() { - return { - namespace: "Esiur", - properties: [], - functions: [], - events: [] - } + return new TemplateDescriber("Esiur", []); } } diff --git a/src/Resource/Template/TemplateDescriber.js b/src/Resource/Template/TemplateDescriber.js new file mode 100644 index 0000000..61d0c1f --- /dev/null +++ b/src/Resource/Template/TemplateDescriber.js @@ -0,0 +1,129 @@ +import Void from "../../Data/Void.js"; + +export class TemplateDescriber { + properties; + events; + functions; + constants; + + namespace; + version; + parent; + annotation; + + classId; + className; + + constructor(namespace, members, parent, version = 0, annotation = null, classId = null, className = null){ + + if (namespace == null) + throw new Error("Namespace name can't be null."); + + if (members == null) + throw new Error("Members name can't be null."); + + this.namespace = namespace; + this.parent = parent; + this.properties = members.filter(x=>x instanceof Prop);; + this.functions = members.filter(x=>x instanceof Func); + this.events = members.filter(x=>x instanceof Evt);; + this.constants = members.filter(x=>x instanceof Const);; + this.version = version; + this.annotation = annotation; + this.classId = classId; + this.className = className; + } + } + + export class Prop { + name; + type; + + readAnnotation; + writeAnnotation; + recordable; + + constructor(name, type = Object, readAnnotation = null, writeAnnotation = null, recordable = false) + { + if (name == null) + throw new Error("Property name can't be null."); + this.name = name; + this.type = type ?? Object; + this.readAnnotation = readAnnotation; + this.writeAnnotation = writeAnnotation; + this.recordable = recordable; + } + } + + export class Evt { + name; + listenable; + type; + annotation; + + constructor(name, type = Object, listenable = false, annotation = null) + { + if (name == null) + throw new Error("Event name can't be null."); + this.name = name; + this.type = type ?? Object; + this.listenable = listenable; + this.annotation = annotation; + } + } + + export class Const { + name; + type; + annotation; + value; + + constructor(name, type = String, value, annotation) + { + if (name == null) + throw new Error("Constant name can't be null."); + + this.name = name; + this.type = type ?? String; + this.value = value ?? ""; + this.annotation = annotation; + } + } + + export class Func { + name; + returnType; + args; + + annotation; + isStatic; + + constructor(name, returnType = Void, args = [], annotation = null, isStatic = false) + { + if (name == null) + throw new Error("Function name can't be null."); + + this.name = name; + this.returnType = returnType ?? Void; + this.args = args ?? []; + this.annotation = annotation; + this.isStatic = isStatic; + } + } + + export class Arg { + name; + type; + optional; + + constructor(name, type = Object, optional = false) + { + if (name == null) + throw new Error("Argument name can't be null."); + + this.name = name; + this.type = type ?? Object; + this.optional = optional; + } + } + \ No newline at end of file diff --git a/src/Resource/Template/TypeTemplate.js b/src/Resource/Template/TypeTemplate.js index b358de4..57246c4 100644 --- a/src/Resource/Template/TypeTemplate.js +++ b/src/Resource/Template/TypeTemplate.js @@ -255,74 +255,73 @@ export default class TypeTemplate { this.definedType = type; - var template = type.template; + let describer = type.template; // set guid - this.className = template.namespace + "." + type.prototype.constructor.name; - - this.classId = SHA256.compute(DC.stringToBytes(this.className)).getGuid(0); + this.className = describer.namespace + "." + (describer.className ?? type.prototype.constructor.name); + this.classId = describer.classId ?? SHA256.compute(DC.stringToBytes(this.className)).getGuid(0); if (addToWarehouse) - addToWarehouse.putTemplate(this); + Warehouse.putTemplate(this); //byte currentIndex = 0; - if (template.properties != null) - for (let i = 0; i < template.properties.length; i++) { + if (describer.properties != null) + for (let i = 0; i < describer.properties.length; i++) { //[name, type, {read: comment, write: comment, recordable: }] - let pi = template.properties[i]; - let pt = new PropertyTemplate(this, i, pi[0], false, - RepresentationType.fromType(pi[1]) ?? RepresentationType.Void, - pi[2]?.read, pi[2]?.write, pi[2]?.recordable); + let pi = describer.properties[i]; + let pt = new PropertyTemplate(this, i, pi.name, false, + RepresentationType.fromType(pi.type) ?? RepresentationType.Void, + pi.readAnnotation, pi.writeAnnotation, pi.recordable); pt.propertyInfo = pi; this.properties.push(pt); } - if (template.constants != null) - for (let i = 0; i < template.constants.length; i++) { - let ci = template.constants[i]; - let ct = new ConstantTemplate(this, i, ci[0], false, - RepresentationType.fromType(ci[1]) ?? RepresentationType.Void, - ci.value, ci.help); + if (describer.constants != null) + for (let i = 0; i < describer.constants.length; i++) { + let ci = describer.constants[i]; + let ct = new ConstantTemplate(this, i, ci.name, false, + RepresentationType.fromType(ci.type) ?? RepresentationType.Void, + ci.value, ci.annotation); ct.propertyInfo = ci; this.constants.push(ct); } if (this.templateType == TemplateType.Resource) { - if (template.events != null) + if (describer.events != null) { - for (let i = 0; i < template.events.length; i++) { + for (let i = 0; i < describer.events.length; i++) { // [name, type, {listenable: true/false, help: ""}] - var ei = template.events[i]; - var et = new EventTemplate(this, i, ei[0], false, - RepresentationType.fromType(ei[1]) ?? RepresentationType.Void, - ei[2]?.help, ei[2]?.listenable) + var ei = describer.events[i]; + var et = new EventTemplate(this, i, ei.name, false, + RepresentationType.fromType(ei.type) ?? RepresentationType.Void, + ei.annotation, ei.listenable) et.eventInfo = ei; this.events.push(et); } } - if (template.functions != null) + if (describer.functions != null) { - for (let i = 0; i < template.functions.length; i++) { + for (let i = 0; i < describer.functions.length; i++) { - var fi = template.functions[i]; + var fi = describer.functions[i]; let args = []; - for(let ai = 0; ai < fi[1].length; ai++) - args.push(new ArgumentTemplate(fi[1][ai][0], RepresentationType.fromType(fi[1][ai][1]) - ?? RepresentationType.Dynamic, fi[1][ai][2]?.optional, ai)); + for(let ai = 0; ai < fi.args.length; ai++) + args.push(new ArgumentTemplate(fi.args[ai].name, RepresentationType.fromType(fi.args[ai].type) + ?? RepresentationType.Dynamic, fi.args[ai].optional, ai)); // [name, {param1: type, param2: int}, returnType, "Description"] - let isStatic = type[fi[0]] instanceof Function; + let isStatic = type[fi.name] instanceof Function; - var ft = new FunctionTemplate(this, i, fi[0], false, isStatic, args, - RepresentationType.fromType(fi[2]) ?? RepresentationType.Void, - fi[3]); + var ft = new FunctionTemplate(this, i, fi.name, false, isStatic, args, + RepresentationType.fromType(fi.returnType) ?? RepresentationType.Void, + fi.annotation); ft.methodInfo = fi; @@ -347,7 +346,7 @@ export default class TypeTemplate { // bake it binarily let b = BL(); - let hasClassAnnotation = template.annotation != null; + let hasClassAnnotation = describer.annotation != null; var cls = DC.stringToBytes(this.className); b.addUint8( (hasClassAnnotation ? 0x40 : 0 ) | this.templateType) @@ -357,13 +356,13 @@ export default class TypeTemplate { if (hasClassAnnotation) { - var classAnnotationBytes = DC.stringToBytes(template.annotation); + var classAnnotationBytes = DC.stringToBytes(describer.annotation); b.addUint16(classAnnotationBytes.length) .addUint8Array(classAnnotationBytes); - this.annotation = template.annotation; + this.annotation = describer.annotation; } - b.addUint32(template.version) + b.addUint32(describer.version) .addUint16(this.members.length); for (let i = 0; i < this.functions.length; i++) diff --git a/src/Resource/Warehouse.js b/src/Resource/Warehouse.js index 2d72d70..1979092 100644 --- a/src/Resource/Warehouse.js +++ b/src/Resource/Warehouse.js @@ -1,5 +1,5 @@ /* -* Copyright (c) 2017 Ahmed Kh. Zamil +* Copyright (c) 2017 - 2022 Ahmed Kh. Zamil * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -42,12 +42,6 @@ import AsyncBag from '../Core/AsyncBag.js'; import IRecord from '../Data/IRecord.js'; import TemplateType from './Template/TemplateType.js'; import DistributedResource from '../Net/IIP/DistributedResource.js'; -import TypedList from '../Data/TypedList.js'; -import { Int8, Int16, Int32, Int64, UInt8, UInt16, UInt32, UInt64, Float32, Float64 } from '../Data/ExtendedTypes.js'; -import Record from '../Data/Record.js'; -import TypedMap from '../Data/TypedMap.js'; -import {RepresentationType, RepresentationTypeIdentifier} from '../Data/RepresentationType.js'; -import FactoryEntry from './FactoryEntry.js'; import IEnum from '../Data/IEnum.js'; export class WH extends IEventHandler @@ -69,8 +63,6 @@ export class WH extends IEventHandler this.protocols = new KeyList(); - this.typesFactory = this._getBuiltInTypes(); - this._register("connected"); this._register("disconnected"); ///this._urlRegex = /^(?:([\S]*):\/\/([^\/]*)\/?)/; @@ -122,7 +114,7 @@ export class WH extends IEventHandler } get(path, attributes = null)//, parent = null, manager = null) - { + { var rt = new AsyncReply(); // var self = this; @@ -348,7 +340,7 @@ export class WH extends IEventHandler if (className.startsWith("E_")) className = className.substr(2); - className = type.template.namespace + "." + className; + className = type.template.namespace + "." + (type.template.className ?? className); var templates = this.templates.get(templateType); @@ -358,7 +350,7 @@ export class WH extends IEventHandler if (templates.at(i).className == className) return templates.at(i); - var template = new TypeTemplate(type, this); + var template = new TypeTemplate(type, true); return template; } @@ -434,8 +426,6 @@ export class WH extends IEventHandler query(path) { - - var p = path.trim().split('/'); var resource; @@ -543,92 +533,14 @@ export class WH extends IEventHandler // } return rt; - } + } - /** - * @param {Function} instanceCreator - creator - * @param {RepresentationType} representationType - type - */ - _getTypeEntries(type, representationType) { - let listType = TypedList.of(type); - - - var entry = new FactoryEntry(type, representationType); - let nullableEntry = new FactoryEntry(entry.nullableType, representationType.toNullable()); - let listEntry = new FactoryEntry(listType, - new RepresentationType(RepresentationTypeIdentifier.TypedList, false, - null, [representationType])); - let nullableList = new FactoryEntry(listEntry.nullableType, - new RepresentationType(RepresentationTypeIdentifier.TypedList, true, null, - [representationType])); - - let nullableItemListType = TypedList.of(entry.nullableType); - let listNullableItemEntry = new FactoryEntry(nullableItemListType, - new RepresentationType(RepresentationTypeIdentifier.TypedList, false, - null, [representationType.toNullable()])); - - let nullableListNullableItemEntry = new FactoryEntry(nullableItemListType, - new RepresentationType(RepresentationTypeIdentifier.TypedList, true, null, - [representationType.toNullable()])); - - return [ - entry, nullableEntry, listEntry, nullableList, listNullableItemEntry, nullableListNullableItemEntry - ]; - } - - - /** - * @param {Function} instanceCreator - creator - * @param {RepresentationType} representationType - type - */ - defineType(type, representationType) { - var entries = this._getTypeEntries(type, representationType); - - for(var e of entries) - this.typesFactory[e.type] = e; //.push(e); - } - - _getBuiltInTypes() { - - let entries = [ - ...this._getTypeEntries(Int8, new RepresentationType(RepresentationTypeIdentifier.Int8, false)), - ...this._getTypeEntries(UInt8, new RepresentationType(RepresentationTypeIdentifier.UInt8, false)), - ...this._getTypeEntries(Int16, new RepresentationType(RepresentationTypeIdentifier.Int16, false)), - ...this._getTypeEntries(UInt16, new RepresentationType(RepresentationTypeIdentifier.UInt16, false)), - ...this._getTypeEntries(Int32, new RepresentationType(RepresentationTypeIdentifier.Int32, false)), - ...this._getTypeEntries(UInt32, new RepresentationType(RepresentationTypeIdentifier.UInt32, false)), - ...this._getTypeEntries(Int64, new RepresentationType(RepresentationTypeIdentifier.Int64, false)), - ...this._getTypeEntries(UInt64, new RepresentationType(RepresentationTypeIdentifier.UInt64, false)), - ...this._getTypeEntries(Float32, new RepresentationType(RepresentationTypeIdentifier.Float32, false)), - ...this._getTypeEntries(Float64, new RepresentationType(RepresentationTypeIdentifier.Float64, false)), - ...this._getTypeEntries(String, new RepresentationType(RepresentationTypeIdentifier.String, String)), - ...this._getTypeEntries(Date, new RepresentationType(RepresentationTypeIdentifier.DateTime, Date)), - ...this._getTypeEntries(Record, new RepresentationType(RepresentationTypeIdentifier.Record, false)), - ...this._getTypeEntries(IResource, new RepresentationType(RepresentationTypeIdentifier.Resource, false)), - ...this._getTypeEntries(Array, new RepresentationType(RepresentationTypeIdentifier.List, false)), - ...this._getTypeEntries(Map, new RepresentationType(RepresentationTypeIdentifier.Map, false)), - //...this._getTypeEntries(IResource, new RepresentationType(RepresentationTypeIdentifier.Resource, false)), - //...this._getTypeEntries(TypedMap, new RepresentationType(RepresentationTypeIdentifier.Resource, false)), - - ...this._getTypeEntries(TypedMap.of(String, Object), new RepresentationType(RepresentationTypeIdentifier.TypedMap, false, null, [ - new RepresentationType(RepresentationTypeIdentifier.String, false), - RepresentationType.Dynamic])), - - ...this._getTypeEntries(TypedMap.of(UInt8, Object), new RepresentationType(RepresentationTypeIdentifier.TypedMap, false, null, [ - new RepresentationType(RepresentationTypeIdentifier.UInt8, false), - RepresentationType.Dynamic])), - - ...this._getTypeEntries(TypedMap.of(Int32, Object), new RepresentationType(RepresentationTypeIdentifier.TypedMap, false, null, [ - new RepresentationType(RepresentationTypeIdentifier.Int32, false), - RepresentationType.Dynamic])), - - ]; - - let rt = {}; - for(let entry of entries) - rt[entry.type] = entry; - return rt; + defineType(type){ + let template = this.getTemplateByType(type); + if (template == null) + throw new Error("Unsupported type."); + this.putTemplate(template); } } diff --git a/src/esiur.js b/src/esiur.js index b0c8ebf..ca1a4fd 100644 --- a/src/esiur.js +++ b/src/esiur.js @@ -6,7 +6,10 @@ import DistributedResource from './Net/IIP/DistributedResource.js' import MemoryStore from './Stores/MemoryStore.js'; import IndexedDBStore from './Stores/IndexedDBStore.js'; import IResource from './Resource/IResource.js'; + import ResourceProxy from './Proxy/ResourceProxy.js'; +import TemplateGenerator from './Proxy/TemplateGenerator.js'; + import DistributedConnection from './Net/IIP/DistributedConnection.js'; import IIPAuthPacket from './Net/Packets/IIPAuthPacket.js'; import IIPPacketCommand from './Net/Packets/IIPPacketCommand.js'; @@ -84,12 +87,16 @@ import IPermissionsManager from './Security/Permissions/IPermissionsManager.js'; import Ruling from './Security/Permissions/Ruling.js'; import { Int8, UInt8, Int16, UInt16, Int32, UInt32, Int64, UInt64, Int128, UInt128, Float32, Float64, Float128, Char16, Char8 } from './Data/ExtendedTypes.js'; +import Tuple from './Data/Tuple.js'; +import Nullable from './Data/Nullable.js'; +import Void from './Data/Void.js'; -let namespace = { +const namespace = { Core: { AsyncReply, AsyncException, AsyncQueue, ErrorType, ExceptionCode, IDestructible, IEventHandler, ProgressType}, - Data: {AutoList, AutoMap, BinaryList, Codec, DC, TypedList, TypedMap, Guid, IRecord, KeyList, NotModified, + Data: {AutoList, AutoMap, BinaryList, Codec, DC, TypedList, TypedMap, Guid, IRecord, KeyList, NotModified, ResourceArrayType, PropertyValue, Record, ResourceArray, RepresentationType, RepresentationTypeIdentifier, TransmissionType, TransmissionTypeIdentifier, - Int8, UInt8, Int16, UInt16, Int32, UInt32, Int64, UInt64, Int128, UInt128, Float32, Float64, Float128, Char16, Char8 + Int8, UInt8, Int16, UInt16, Int32, UInt32, Int64, UInt64, Int128, UInt128, Float32, Float64, Float128, Char16, Char8, Tuple, + Nullable, Void }, Net: {INetworkReceiver, NetworkBuffer, NetworkConnections, NetworkServer, NetworkSession, SendList, IIP: {DistributedConnection, DistributedPropertyContext, DistributedResource, DistributedResourceQueueItem, @@ -98,7 +105,7 @@ let namespace = { Sockets: {ISocket, SocketState, WSocket} }, - Proxy: {ResourceProxy}, + Proxy: {ResourceProxy, TemplateGenerator}, Resource: {CustomResourceEvent, Instance, IResource, IStore, Warehouse, Template: { ArgumentTemplate, EventTemplate, FunctionTemplate, MemberTemplate, @@ -115,8 +122,23 @@ let namespace = { Permissions: {ActionType, IPermissionsManager, Ruling}, }, Stores: {IndexedDBStore, MemoryStore}, + Generated: {}, }; +namespace.define = function(type, className) { + let sc = className.split('.'); + let target = namespace.Generated; + + for(let i = 0; i < sc.length; i++) { + if (target[sc[i]] == undefined) + target[sc[i]] = {}; + target = target[sc[i]]; + } + + target[sc[sc.length - 1]] = type; +} + + if (typeof window !== 'undefined') { window.wh = Warehouse; @@ -144,4 +166,4 @@ else if (typeof global !== 'undefined') global.Esiur = namespace; } -export default Warehouse; \ No newline at end of file +export default namespace; \ No newline at end of file