@colyseus/schema 3.0.0-alpha.19 → 3.0.0-alpha.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/build/cjs/index.js +94 -63
  2. package/build/cjs/index.js.map +1 -1
  3. package/build/esm/index.mjs +94 -61
  4. package/build/esm/index.mjs.map +1 -1
  5. package/build/umd/index.js +94 -63
  6. package/lib/Metadata.d.ts +1 -0
  7. package/lib/Metadata.js +32 -1
  8. package/lib/Metadata.js.map +1 -1
  9. package/lib/Reflection.d.ts +0 -1
  10. package/lib/Reflection.js +27 -20
  11. package/lib/Reflection.js.map +1 -1
  12. package/lib/Schema.d.ts +1 -1
  13. package/lib/annotations.js +12 -10
  14. package/lib/annotations.js.map +1 -1
  15. package/lib/codegen/api.js +1 -2
  16. package/lib/codegen/api.js.map +1 -1
  17. package/lib/codegen/languages/cpp.js +1 -2
  18. package/lib/codegen/languages/cpp.js.map +1 -1
  19. package/lib/codegen/languages/csharp.js +1 -2
  20. package/lib/codegen/languages/csharp.js.map +1 -1
  21. package/lib/codegen/languages/haxe.js +1 -2
  22. package/lib/codegen/languages/haxe.js.map +1 -1
  23. package/lib/codegen/languages/java.js +1 -2
  24. package/lib/codegen/languages/java.js.map +1 -1
  25. package/lib/codegen/languages/js.js +1 -2
  26. package/lib/codegen/languages/js.js.map +1 -1
  27. package/lib/codegen/languages/lua.js +1 -2
  28. package/lib/codegen/languages/lua.js.map +1 -1
  29. package/lib/codegen/languages/ts.js +1 -2
  30. package/lib/codegen/languages/ts.js.map +1 -1
  31. package/lib/codegen/parser.js +2 -3
  32. package/lib/codegen/parser.js.map +1 -1
  33. package/lib/codegen/types.js +3 -3
  34. package/lib/codegen/types.js.map +1 -1
  35. package/lib/decoder/DecodeOperation.d.ts +0 -1
  36. package/lib/decoder/DecodeOperation.js +2 -2
  37. package/lib/decoder/DecodeOperation.js.map +1 -1
  38. package/lib/decoder/Decoder.d.ts +0 -1
  39. package/lib/decoder/strategy/RawChanges.js +1 -2
  40. package/lib/decoder/strategy/RawChanges.js.map +1 -1
  41. package/lib/decoder/strategy/StateCallbacks.js +1 -2
  42. package/lib/decoder/strategy/StateCallbacks.js.map +1 -1
  43. package/lib/encoder/EncodeOperation.d.ts +0 -1
  44. package/lib/encoder/EncodeOperation.js +3 -3
  45. package/lib/encoder/EncodeOperation.js.map +1 -1
  46. package/lib/encoder/Encoder.d.ts +0 -1
  47. package/lib/encoder/Encoder.js +5 -5
  48. package/lib/encoder/Encoder.js.map +1 -1
  49. package/lib/encoder/StateView.js +2 -2
  50. package/lib/encoder/StateView.js.map +1 -1
  51. package/lib/encoding/assert.js +3 -3
  52. package/lib/encoding/assert.js.map +1 -1
  53. package/lib/encoding/decode.js +20 -21
  54. package/lib/encoding/decode.js.map +1 -1
  55. package/lib/encoding/encode.d.ts +0 -1
  56. package/lib/encoding/encode.js +17 -17
  57. package/lib/encoding/encode.js.map +1 -1
  58. package/lib/index.d.ts +1 -0
  59. package/lib/index.js.map +1 -1
  60. package/lib/types/custom/ArraySchema.d.ts +2 -2
  61. package/lib/types/custom/ArraySchema.js +0 -8
  62. package/lib/types/custom/ArraySchema.js.map +1 -1
  63. package/lib/types/registry.js +3 -4
  64. package/lib/types/registry.js.map +1 -1
  65. package/lib/types/utils.js +1 -2
  66. package/lib/types/utils.js.map +1 -1
  67. package/lib/utils.js +3 -4
  68. package/lib/utils.js.map +1 -1
  69. package/package.json +5 -5
  70. package/src/Metadata.ts +39 -1
  71. package/src/Reflection.ts +30 -20
  72. package/src/annotations.ts +6 -2
  73. package/src/encoder/Encoder.ts +5 -5
  74. package/src/index.ts +2 -0
  75. package/src/types/custom/ArraySchema.ts +2 -1
@@ -149,10 +149,41 @@
149
149
  init(klass) {
150
150
  //
151
151
  // Used only to initialize an empty Schema (Encoder#constructor)
152
+ // TODO: remove/refactor this...
152
153
  //
153
154
  const metadata = {};
154
155
  klass.constructor[Symbol.metadata] = metadata;
155
- Object.defineProperty(metadata, -1, { value: 0, enumerable: false, configurable: true });
156
+ Object.defineProperty(metadata, -1, {
157
+ value: 0,
158
+ enumerable: false,
159
+ configurable: true,
160
+ });
161
+ },
162
+ initialize(constructor, parentMetadata) {
163
+ let metadata = constructor[Symbol.metadata] ?? Object.create(null);
164
+ // make sure inherited classes have their own metadata object.
165
+ if (constructor[Symbol.metadata] === parentMetadata) {
166
+ metadata = Object.create(null);
167
+ if (parentMetadata) {
168
+ // assign parent metadata to current
169
+ Object.assign(metadata, parentMetadata);
170
+ for (let i = 0; i <= parentMetadata[-1]; i++) {
171
+ Object.defineProperty(metadata, i, {
172
+ value: parentMetadata[i],
173
+ enumerable: false,
174
+ configurable: true,
175
+ });
176
+ }
177
+ Object.defineProperty(metadata, -1, {
178
+ value: parentMetadata[-1],
179
+ enumerable: false,
180
+ configurable: true,
181
+ writable: true,
182
+ });
183
+ }
184
+ }
185
+ constructor[Symbol.metadata] = metadata;
186
+ return metadata;
156
187
  },
157
188
  isValidInstance(klass) {
158
189
  return (klass.constructor[Symbol.metadata] &&
@@ -799,23 +830,23 @@
799
830
 
800
831
  var encode = /*#__PURE__*/Object.freeze({
801
832
  __proto__: null,
802
- utf8Length: utf8Length,
803
- utf8Write: utf8Write,
804
- int8: int8$1,
805
- uint8: uint8$1,
833
+ boolean: boolean$1,
834
+ float32: float32$1,
835
+ float64: float64$1,
806
836
  int16: int16$1,
807
- uint16: uint16$1,
808
837
  int32: int32$1,
809
- uint32: uint32$1,
810
838
  int64: int64$1,
839
+ int8: int8$1,
840
+ number: number$1,
841
+ string: string$1,
842
+ uint16: uint16$1,
843
+ uint32: uint32$1,
811
844
  uint64: uint64$1,
812
- float32: float32$1,
813
- float64: float64$1,
845
+ uint8: uint8$1,
846
+ utf8Length: utf8Length,
847
+ utf8Write: utf8Write,
814
848
  writeFloat32: writeFloat32,
815
- writeFloat64: writeFloat64,
816
- boolean: boolean$1,
817
- string: string$1,
818
- number: number$1
849
+ writeFloat64: writeFloat64
819
850
  });
820
851
 
821
852
  class EncodeSchemaError extends Error {
@@ -1248,26 +1279,26 @@
1248
1279
 
1249
1280
  var decode = /*#__PURE__*/Object.freeze({
1250
1281
  __proto__: null,
1251
- utf8Read: utf8Read,
1252
- int8: int8,
1253
- uint8: uint8,
1254
- int16: int16,
1255
- uint16: uint16,
1256
- int32: int32,
1257
- uint32: uint32,
1282
+ arrayCheck: arrayCheck,
1283
+ boolean: boolean,
1258
1284
  float32: float32,
1259
1285
  float64: float64,
1286
+ int16: int16,
1287
+ int32: int32,
1260
1288
  int64: int64,
1261
- uint64: uint64,
1289
+ int8: int8,
1290
+ number: number,
1291
+ numberCheck: numberCheck,
1262
1292
  readFloat32: readFloat32,
1263
1293
  readFloat64: readFloat64,
1264
- boolean: boolean,
1265
1294
  string: string,
1266
1295
  stringCheck: stringCheck,
1267
- number: number,
1268
- numberCheck: numberCheck,
1269
- arrayCheck: arrayCheck,
1270
- switchStructureCheck: switchStructureCheck
1296
+ switchStructureCheck: switchStructureCheck,
1297
+ uint16: uint16,
1298
+ uint32: uint32,
1299
+ uint64: uint64,
1300
+ uint8: uint8,
1301
+ utf8Read: utf8Read
1271
1302
  });
1272
1303
 
1273
1304
  const DEFINITION_MISMATCH = -1;
@@ -1907,14 +1938,6 @@
1907
1938
  lastIndexOf(searchElement, fromIndex = this.length - 1) {
1908
1939
  return this.items.lastIndexOf(searchElement, fromIndex);
1909
1940
  }
1910
- /**
1911
- * Determines whether all the members of an array satisfy the specified test.
1912
- * @param callbackfn A function that accepts up to three arguments. The every method calls
1913
- * the callbackfn function for each element in the array until the callbackfn returns a value
1914
- * which is coercible to the Boolean value false, or until the end of the array.
1915
- * @param thisArg An object to which the this keyword can refer in the callbackfn function.
1916
- * If thisArg is omitted, undefined is used as the this value.
1917
- */
1918
1941
  every(callbackfn, thisArg) {
1919
1942
  return this.items.every(callbackfn, thisArg);
1920
1943
  }
@@ -2593,6 +2616,7 @@
2593
2616
  const constructor = target.constructor;
2594
2617
  const parentClass = Object.getPrototypeOf(constructor);
2595
2618
  const parentMetadata = parentClass[Symbol.metadata];
2619
+ // TODO: use Metadata.initialize()
2596
2620
  const metadata = (constructor[Symbol.metadata] ??= Object.assign({}, constructor[Symbol.metadata], parentMetadata ?? Object.create(null)));
2597
2621
  if (!metadata[fieldName]) {
2598
2622
  //
@@ -2617,8 +2641,8 @@
2617
2641
  // for inheritance support
2618
2642
  TypeContext.register(constructor);
2619
2643
  const parentClass = Object.getPrototypeOf(constructor);
2620
- const parentMetadata = parentClass[Symbol.metadata];
2621
- const metadata = (constructor[Symbol.metadata] ??= Object.assign({}, constructor[Symbol.metadata], parentMetadata ?? Object.create(null)));
2644
+ const parentMetadata = parentClass && parentClass[Symbol.metadata];
2645
+ const metadata = Metadata.initialize(constructor, parentMetadata);
2622
2646
  let fieldIndex;
2623
2647
  /**
2624
2648
  * skip if descriptor already exists for this field (`@deprecated()`)
@@ -3391,6 +3415,8 @@
3391
3415
  OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
3392
3416
  PERFORMANCE OF THIS SOFTWARE.
3393
3417
  ***************************************************************************** */
3418
+ /* global Reflect, Promise, SuppressedError, Symbol */
3419
+
3394
3420
 
3395
3421
  function __decorate(decorators, target, key, desc) {
3396
3422
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
@@ -3476,11 +3502,11 @@
3476
3502
  // try { throw new Error(); } catch (e) {
3477
3503
  // // only print if not coming from Reflection.ts
3478
3504
  // if (!e.stack.includes("src/Reflection.ts")) {
3479
- // // console.log("WILL ENCODE", {
3480
- // // ref: changeTree.ref.constructor.name,
3481
- // // fieldIndex,
3482
- // // operation: OPERATION[operation],
3483
- // // });
3505
+ // console.log("WILL ENCODE", {
3506
+ // ref: changeTree.ref.constructor.name,
3507
+ // fieldIndex,
3508
+ // operation: OPERATION[operation],
3509
+ // });
3484
3510
  // }
3485
3511
  // }
3486
3512
  encoder(this, buffer, changeTree, fieldIndex, operation, it, isEncodeAll, hasView);
@@ -3941,53 +3967,60 @@
3941
3967
  const reflection = new Reflection();
3942
3968
  const reflectionDecoder = new Decoder(reflection);
3943
3969
  reflectionDecoder.decode(bytes, it);
3944
- const context = new TypeContext();
3945
- const schemaTypes = reflection.types.reduce((types, reflectionType) => {
3946
- const parentKlass = types[reflectionType.extendsId] || Schema;
3947
- const schema = class _ extends parentKlass {
3970
+ const typeContext = new TypeContext();
3971
+ // 1st pass, initialize metadata + inheritance
3972
+ reflection.types.forEach((reflectionType) => {
3973
+ const parentClass = typeContext.get(reflectionType.extendsId) ?? Schema;
3974
+ const schema = class _ extends parentClass {
3948
3975
  };
3949
- // const _metadata = Object.create(_classSuper[Symbol.metadata] ?? null);
3950
- const _metadata = parentKlass && parentKlass[Symbol.metadata] || Object.create(null);
3951
- Object.defineProperty(schema, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
3976
+ const parentMetadata = parentClass[Symbol.metadata];
3952
3977
  // register for inheritance support
3953
3978
  TypeContext.register(schema);
3954
- const typeid = reflectionType.id;
3955
- types[typeid] = schema;
3956
- context.add(schema, typeid);
3957
- return types;
3979
+ // for inheritance support
3980
+ Metadata.initialize(schema, parentMetadata);
3981
+ typeContext.add(schema, reflectionType.id);
3958
3982
  }, {});
3983
+ // 2nd pass, set fields
3959
3984
  reflection.types.forEach((reflectionType) => {
3960
- const schemaType = schemaTypes[reflectionType.id];
3985
+ const schemaType = typeContext.get(reflectionType.id);
3961
3986
  const metadata = schemaType[Symbol.metadata];
3962
- const parentKlass = reflection.types[reflectionType.extendsId];
3963
- const parentFieldIndex = parentKlass && parentKlass.fields.length || 0;
3987
+ // FIXME: use metadata[-1] to get field count
3988
+ const parentFieldIndex = 0;
3989
+ // console.log("--------------------");
3990
+ // // console.log("reflectionType", reflectionType.toJSON());
3991
+ // console.log("reflectionType.fields", reflectionType.fields.toJSON());
3992
+ // console.log("parentFieldIndex", parentFieldIndex);
3993
+ //
3994
+ // FIXME: set fields using parentKlass as well
3995
+ // currently the fields are duplicated on inherited classes
3996
+ //
3997
+ // // const parentKlass = reflection.types[reflectionType.extendsId];
3998
+ // // parentKlass.fields
3964
3999
  reflectionType.fields.forEach((field, i) => {
3965
4000
  const fieldIndex = parentFieldIndex + i;
3966
4001
  if (field.referencedType !== undefined) {
3967
4002
  let fieldType = field.type;
3968
- let refType = schemaTypes[field.referencedType];
4003
+ let refType = typeContext.get(field.referencedType);
3969
4004
  // map or array of primitive type (-1)
3970
4005
  if (!refType) {
3971
4006
  const typeInfo = field.type.split(":");
3972
4007
  fieldType = typeInfo[0];
3973
- refType = typeInfo[1];
4008
+ refType = typeInfo[1]; // string
3974
4009
  }
3975
4010
  if (fieldType === "ref") {
3976
- // type(refType)(schemaType.prototype, field.name);
3977
4011
  Metadata.addField(metadata, fieldIndex, field.name, refType);
3978
4012
  }
3979
4013
  else {
3980
- // type({ [fieldType]: refType } as DefinitionType)(schemaType.prototype, field.name);
3981
4014
  Metadata.addField(metadata, fieldIndex, field.name, { [fieldType]: refType });
3982
4015
  }
3983
4016
  }
3984
4017
  else {
3985
- // type(field.type as PrimitiveType)(schemaType.prototype, field.name);
3986
4018
  Metadata.addField(metadata, fieldIndex, field.name, field.type);
3987
4019
  }
3988
4020
  });
3989
4021
  });
3990
- return new (schemaTypes[0])();
4022
+ // @ts-ignore
4023
+ return new (typeContext.get(0))();
3991
4024
  }
3992
4025
  }
3993
4026
  __decorate([
@@ -4461,6 +4494,4 @@
4461
4494
  exports.type = type;
4462
4495
  exports.view = view;
4463
4496
 
4464
- Object.defineProperty(exports, '__esModule', { value: true });
4465
-
4466
4497
  }));
package/lib/Metadata.d.ts CHANGED
@@ -32,6 +32,7 @@ export declare const Metadata: {
32
32
  }): void;
33
33
  isDeprecated(metadata: any, field: string): boolean;
34
34
  init(klass: any): void;
35
+ initialize(constructor: any, parentMetadata?: any): Metadata;
35
36
  isValidInstance(klass: any): boolean;
36
37
  getFields(klass: any): {};
37
38
  };
package/lib/Metadata.js CHANGED
@@ -78,10 +78,41 @@ exports.Metadata = {
78
78
  init(klass) {
79
79
  //
80
80
  // Used only to initialize an empty Schema (Encoder#constructor)
81
+ // TODO: remove/refactor this...
81
82
  //
82
83
  const metadata = {};
83
84
  klass.constructor[Symbol.metadata] = metadata;
84
- Object.defineProperty(metadata, -1, { value: 0, enumerable: false, configurable: true });
85
+ Object.defineProperty(metadata, -1, {
86
+ value: 0,
87
+ enumerable: false,
88
+ configurable: true,
89
+ });
90
+ },
91
+ initialize(constructor, parentMetadata) {
92
+ let metadata = constructor[Symbol.metadata] ?? Object.create(null);
93
+ // make sure inherited classes have their own metadata object.
94
+ if (constructor[Symbol.metadata] === parentMetadata) {
95
+ metadata = Object.create(null);
96
+ if (parentMetadata) {
97
+ // assign parent metadata to current
98
+ Object.assign(metadata, parentMetadata);
99
+ for (let i = 0; i <= parentMetadata[-1]; i++) {
100
+ Object.defineProperty(metadata, i, {
101
+ value: parentMetadata[i],
102
+ enumerable: false,
103
+ configurable: true,
104
+ });
105
+ }
106
+ Object.defineProperty(metadata, -1, {
107
+ value: parentMetadata[-1],
108
+ enumerable: false,
109
+ configurable: true,
110
+ writable: true,
111
+ });
112
+ }
113
+ }
114
+ constructor[Symbol.metadata] = metadata;
115
+ return metadata;
85
116
  },
86
117
  isValidInstance(klass) {
87
118
  return (klass.constructor[Symbol.metadata] &&
@@ -1 +1 @@
1
- {"version":3,"file":"Metadata.js","sourceRoot":"","sources":["../src/Metadata.ts"],"names":[],"mappings":"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","sourcesContent":["import { getPropertyDescriptor, type DefinitionType } from \"./annotations\";\nimport { getType } from \"./types/registry\";\n\nexport type MetadataField = {\n type: DefinitionType,\n index: number,\n tag?: number,\n unreliable?: boolean,\n deprecated?: boolean,\n descriptor?: PropertyDescriptor,\n};\n\nexport type Metadata =\n { [-1]: number; } & // number of fields\n { [-2]: number[]; } & // all field indexes with \"view\" tag\n { [-3]: {[tag: number]: number[]}; } & // field indexes by \"view\" tag\n { [field: number]: string; } & // index => field name\n { [field: string]: MetadataField; } // field name => field metadata\n\nexport const Metadata = {\n\n addField(metadata: any, index: number, field: string, type: DefinitionType, descriptor?: PropertyDescriptor) {\n if (index > 64) {\n throw new Error(`Can't define field '${field}'.\\nSchema instances may only have up to 64 fields.`);\n }\n\n metadata[field] = Object.assign(\n metadata[field] || {}, // avoid overwriting previous field metadata (@owned / @deprecated)\n {\n type: (Array.isArray(type))\n ? { array: type[0] }\n : type,\n index,\n descriptor,\n }\n );\n\n // map -1 as last field index\n Object.defineProperty(metadata, -1, {\n value: index,\n enumerable: false,\n configurable: true\n });\n\n // map index => field name (non enumerable)\n Object.defineProperty(metadata, index, {\n value: field,\n enumerable: false,\n configurable: true,\n });\n },\n\n setTag(metadata: Metadata, fieldName: string, tag: number) {\n // add 'tag' to the field\n const field = metadata[fieldName];\n field.tag = tag;\n\n if (!metadata[-2]) {\n // -2: all field indexes with \"view\" tag\n Object.defineProperty(metadata, -2, {\n value: [],\n enumerable: false,\n configurable: true\n });\n\n // -3: field indexes by \"view\" tag\n Object.defineProperty(metadata, -3, {\n value: {},\n enumerable: false,\n configurable: true\n });\n }\n\n metadata[-2].push(field.index);\n\n if (!metadata[-3][tag]) {\n metadata[-3][tag] = [];\n }\n\n metadata[-3][tag].push(field.index);\n },\n\n setFields(target: any, fields: { [field: string]: DefinitionType }) {\n const metadata = (target.prototype.constructor[Symbol.metadata] ??= {});\n\n // target[$track] = function (changeTree, index: number, operation: OPERATION = OPERATION.ADD) {\n // changeTree.change(index, operation, encodeSchemaOperation);\n // };\n\n // target[$encoder] = encodeSchemaOperation;\n // target[$decoder] = decodeSchemaOperation;\n\n // if (!target.prototype.toJSON) { target.prototype.toJSON = Schema.prototype.toJSON; }\n\n let index = 0;\n for (const field in fields) {\n const type = fields[field];\n\n // FIXME: this code is duplicated from @type() annotation\n const complexTypeKlass = (Array.isArray(type))\n ? getType(\"array\")\n : (typeof(Object.keys(type)[0]) === \"string\") && getType(Object.keys(type)[0]);\n\n Metadata.addField(\n metadata,\n index,\n field,\n type,\n getPropertyDescriptor(`_${field}`, index, type, complexTypeKlass, metadata, field)\n );\n\n index++;\n }\n },\n\n isDeprecated(metadata: any, field: string) {\n return metadata[field].deprecated === true;\n },\n\n init(klass: any) {\n //\n // Used only to initialize an empty Schema (Encoder#constructor)\n //\n const metadata = {};\n klass.constructor[Symbol.metadata] = metadata;\n Object.defineProperty(metadata, -1, { value: 0, enumerable: false, configurable: true });\n },\n\n isValidInstance(klass: any) {\n return (\n klass.constructor[Symbol.metadata] &&\n Object.prototype.hasOwnProperty.call(klass.constructor[Symbol.metadata], -1) as boolean\n );\n },\n\n getFields(klass: any) {\n const metadata = klass[Symbol.metadata];\n const fields = {};\n for (let i = 0; i <= metadata[-1]; i++) {\n fields[metadata[i]] = metadata[metadata[i]].type;\n }\n return fields;\n }\n}"]}
1
+ {"version":3,"file":"Metadata.js","sourceRoot":"","sources":["../src/Metadata.ts"],"names":[],"mappings":"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","sourcesContent":["import { getPropertyDescriptor, type DefinitionType } from \"./annotations\";\nimport { getType } from \"./types/registry\";\n\nexport type MetadataField = {\n type: DefinitionType,\n index: number,\n tag?: number,\n unreliable?: boolean,\n deprecated?: boolean,\n descriptor?: PropertyDescriptor,\n};\n\nexport type Metadata =\n { [-1]: number; } & // number of fields\n { [-2]: number[]; } & // all field indexes with \"view\" tag\n { [-3]: {[tag: number]: number[]}; } & // field indexes by \"view\" tag\n { [field: number]: string; } & // index => field name\n { [field: string]: MetadataField; } // field name => field metadata\n\nexport const Metadata = {\n\n addField(metadata: any, index: number, field: string, type: DefinitionType, descriptor?: PropertyDescriptor) {\n if (index > 64) {\n throw new Error(`Can't define field '${field}'.\\nSchema instances may only have up to 64 fields.`);\n }\n\n metadata[field] = Object.assign(\n metadata[field] || {}, // avoid overwriting previous field metadata (@owned / @deprecated)\n {\n type: (Array.isArray(type))\n ? { array: type[0] }\n : type,\n index,\n descriptor,\n }\n );\n\n // map -1 as last field index\n Object.defineProperty(metadata, -1, {\n value: index,\n enumerable: false,\n configurable: true\n });\n\n // map index => field name (non enumerable)\n Object.defineProperty(metadata, index, {\n value: field,\n enumerable: false,\n configurable: true,\n });\n },\n\n setTag(metadata: Metadata, fieldName: string, tag: number) {\n // add 'tag' to the field\n const field = metadata[fieldName];\n field.tag = tag;\n\n if (!metadata[-2]) {\n // -2: all field indexes with \"view\" tag\n Object.defineProperty(metadata, -2, {\n value: [],\n enumerable: false,\n configurable: true\n });\n\n // -3: field indexes by \"view\" tag\n Object.defineProperty(metadata, -3, {\n value: {},\n enumerable: false,\n configurable: true\n });\n }\n\n metadata[-2].push(field.index);\n\n if (!metadata[-3][tag]) {\n metadata[-3][tag] = [];\n }\n\n metadata[-3][tag].push(field.index);\n },\n\n setFields(target: any, fields: { [field: string]: DefinitionType }) {\n const metadata = (target.prototype.constructor[Symbol.metadata] ??= {});\n\n // target[$track] = function (changeTree, index: number, operation: OPERATION = OPERATION.ADD) {\n // changeTree.change(index, operation, encodeSchemaOperation);\n // };\n\n // target[$encoder] = encodeSchemaOperation;\n // target[$decoder] = decodeSchemaOperation;\n\n // if (!target.prototype.toJSON) { target.prototype.toJSON = Schema.prototype.toJSON; }\n\n let index = 0;\n for (const field in fields) {\n const type = fields[field];\n\n // FIXME: this code is duplicated from @type() annotation\n const complexTypeKlass = (Array.isArray(type))\n ? getType(\"array\")\n : (typeof(Object.keys(type)[0]) === \"string\") && getType(Object.keys(type)[0]);\n\n Metadata.addField(\n metadata,\n index,\n field,\n type,\n getPropertyDescriptor(`_${field}`, index, type, complexTypeKlass, metadata, field)\n );\n\n index++;\n }\n },\n\n isDeprecated(metadata: any, field: string) {\n return metadata[field].deprecated === true;\n },\n\n init(klass: any) {\n //\n // Used only to initialize an empty Schema (Encoder#constructor)\n // TODO: remove/refactor this...\n //\n const metadata = {};\n klass.constructor[Symbol.metadata] = metadata;\n Object.defineProperty(metadata, -1, {\n value: 0,\n enumerable: false,\n configurable: true,\n });\n },\n\n initialize(constructor: any, parentMetadata?: any) {\n let metadata: Metadata = constructor[Symbol.metadata] ?? Object.create(null);\n\n // make sure inherited classes have their own metadata object.\n if (constructor[Symbol.metadata] === parentMetadata) {\n metadata = Object.create(null);\n\n if (parentMetadata) {\n // assign parent metadata to current\n Object.assign(metadata, parentMetadata);\n\n for (let i = 0; i <= parentMetadata[-1]; i++) {\n Object.defineProperty(metadata, i, {\n value: parentMetadata[i],\n enumerable: false,\n configurable: true,\n });\n }\n\n Object.defineProperty(metadata, -1, {\n value: parentMetadata[-1],\n enumerable: false,\n configurable: true,\n writable: true,\n });\n }\n }\n\n constructor[Symbol.metadata] = metadata;\n\n return metadata;\n },\n\n isValidInstance(klass: any) {\n return (\n klass.constructor[Symbol.metadata] &&\n Object.prototype.hasOwnProperty.call(klass.constructor[Symbol.metadata], -1) as boolean\n );\n },\n\n getFields(klass: any) {\n const metadata = klass[Symbol.metadata];\n const fields = {};\n for (let i = 0; i <= metadata[-1]; i++) {\n fields[metadata[i]] = metadata[metadata[i]].type;\n }\n return fields;\n }\n}"]}
@@ -1,4 +1,3 @@
1
- /// <reference types="node" />
2
1
  import { TypeContext } from "./annotations";
3
2
  import { ArraySchema } from "./types/custom/ArraySchema";
4
3
  import { Iterator } from "./encoding/decode";
package/lib/Reflection.js CHANGED
@@ -113,53 +113,60 @@ class Reflection extends Schema_1.Schema {
113
113
  const reflection = new Reflection();
114
114
  const reflectionDecoder = new Decoder_1.Decoder(reflection);
115
115
  reflectionDecoder.decode(bytes, it);
116
- const context = new annotations_1.TypeContext();
117
- const schemaTypes = reflection.types.reduce((types, reflectionType) => {
118
- const parentKlass = types[reflectionType.extendsId] || Schema_1.Schema;
119
- const schema = class _ extends parentKlass {
116
+ const typeContext = new annotations_1.TypeContext();
117
+ // 1st pass, initialize metadata + inheritance
118
+ reflection.types.forEach((reflectionType) => {
119
+ const parentClass = typeContext.get(reflectionType.extendsId) ?? Schema_1.Schema;
120
+ const schema = class _ extends parentClass {
120
121
  };
121
- // const _metadata = Object.create(_classSuper[Symbol.metadata] ?? null);
122
- const _metadata = parentKlass && parentKlass[Symbol.metadata] || Object.create(null);
123
- Object.defineProperty(schema, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
122
+ const parentMetadata = parentClass[Symbol.metadata];
124
123
  // register for inheritance support
125
124
  annotations_1.TypeContext.register(schema);
126
- const typeid = reflectionType.id;
127
- types[typeid] = schema;
128
- context.add(schema, typeid);
129
- return types;
125
+ // for inheritance support
126
+ Metadata_1.Metadata.initialize(schema, parentMetadata);
127
+ typeContext.add(schema, reflectionType.id);
130
128
  }, {});
129
+ // 2nd pass, set fields
131
130
  reflection.types.forEach((reflectionType) => {
132
- const schemaType = schemaTypes[reflectionType.id];
131
+ const schemaType = typeContext.get(reflectionType.id);
133
132
  const metadata = schemaType[Symbol.metadata];
134
- const parentKlass = reflection.types[reflectionType.extendsId];
135
- const parentFieldIndex = parentKlass && parentKlass.fields.length || 0;
133
+ // FIXME: use metadata[-1] to get field count
134
+ const parentFieldIndex = 0;
135
+ // console.log("--------------------");
136
+ // // console.log("reflectionType", reflectionType.toJSON());
137
+ // console.log("reflectionType.fields", reflectionType.fields.toJSON());
138
+ // console.log("parentFieldIndex", parentFieldIndex);
139
+ //
140
+ // FIXME: set fields using parentKlass as well
141
+ // currently the fields are duplicated on inherited classes
142
+ //
143
+ // // const parentKlass = reflection.types[reflectionType.extendsId];
144
+ // // parentKlass.fields
136
145
  reflectionType.fields.forEach((field, i) => {
137
146
  const fieldIndex = parentFieldIndex + i;
138
147
  if (field.referencedType !== undefined) {
139
148
  let fieldType = field.type;
140
- let refType = schemaTypes[field.referencedType];
149
+ let refType = typeContext.get(field.referencedType);
141
150
  // map or array of primitive type (-1)
142
151
  if (!refType) {
143
152
  const typeInfo = field.type.split(":");
144
153
  fieldType = typeInfo[0];
145
- refType = typeInfo[1];
154
+ refType = typeInfo[1]; // string
146
155
  }
147
156
  if (fieldType === "ref") {
148
- // type(refType)(schemaType.prototype, field.name);
149
157
  Metadata_1.Metadata.addField(metadata, fieldIndex, field.name, refType);
150
158
  }
151
159
  else {
152
- // type({ [fieldType]: refType } as DefinitionType)(schemaType.prototype, field.name);
153
160
  Metadata_1.Metadata.addField(metadata, fieldIndex, field.name, { [fieldType]: refType });
154
161
  }
155
162
  }
156
163
  else {
157
- // type(field.type as PrimitiveType)(schemaType.prototype, field.name);
158
164
  Metadata_1.Metadata.addField(metadata, fieldIndex, field.name, field.type);
159
165
  }
160
166
  });
161
167
  });
162
- return new (schemaTypes[0])();
168
+ // @ts-ignore
169
+ return new (typeContext.get(0))();
163
170
  }
164
171
  }
165
172
  exports.Reflection = Reflection;
@@ -1 +1 @@
1
- {"version":3,"file":"Reflection.js","sourceRoot":"","sources":["../src/Reflection.ts"],"names":[],"mappings":"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","sourcesContent":["import { type, PrimitiveType, DefinitionType, TypeContext } from \"./annotations\";\nimport { Metadata } from \"./Metadata\";\nimport { ArraySchema } from \"./types/custom/ArraySchema\";\nimport { Iterator } from \"./encoding/decode\";\nimport { Encoder } from \"./encoder/Encoder\";\nimport { Decoder } from \"./decoder/Decoder\";\nimport { Schema } from \"./Schema\";\n\n/**\n * Reflection\n */\nexport class ReflectionField extends Schema {\n @type(\"string\") name: string;\n @type(\"string\") type: string;\n @type(\"number\") referencedType: number;\n}\n\nexport class ReflectionType extends Schema {\n @type(\"number\") id: number;\n @type(\"number\") extendsId: number;\n @type([ ReflectionField ]) fields = new ArraySchema<ReflectionField>();\n}\n\nexport class Reflection extends Schema {\n @type([ ReflectionType ]) types: ArraySchema<ReflectionType> = new ArraySchema<ReflectionType>();\n\n static encode(instance: Schema, context?: TypeContext, it: Iterator = { offset: 0 }) {\n if (!context) {\n context = new TypeContext(instance.constructor as typeof Schema);\n }\n\n const reflection = new Reflection();\n const encoder = new Encoder(reflection);\n\n const buildType = (currentType: ReflectionType, metadata: Metadata) => {\n for (const fieldName in metadata) {\n // skip fields from parent classes\n if (!Object.prototype.hasOwnProperty.call(metadata, fieldName)) {\n continue;\n }\n\n const field = new ReflectionField();\n field.name = fieldName;\n\n let fieldType: string;\n\n const type = metadata[fieldName].type;\n\n if (typeof (type) === \"string\") {\n fieldType = type;\n\n } else {\n let childTypeSchema: typeof Schema;\n\n //\n // TODO: refactor below.\n //\n if (Schema.is(type)) {\n fieldType = \"ref\";\n childTypeSchema = type as typeof Schema;\n\n } else {\n fieldType = Object.keys(type)[0];\n\n if (typeof(type[fieldType]) === \"string\") {\n fieldType += \":\" + type[fieldType]; // array:string\n\n } else {\n childTypeSchema = type[fieldType];\n }\n }\n\n field.referencedType = (childTypeSchema)\n ? context.getTypeId(childTypeSchema)\n : -1;\n }\n\n field.type = fieldType;\n currentType.fields.push(field);\n }\n\n reflection.types.push(currentType);\n }\n\n for (let typeid in context.types) {\n const klass = context.types[typeid];\n const type = new ReflectionType();\n type.id = Number(typeid);\n\n // support inheritance\n const inheritFrom = Object.getPrototypeOf(klass);\n if (inheritFrom !== Schema) {\n type.extendsId = context.schemas.get(inheritFrom);\n }\n\n buildType(type, klass[Symbol.metadata]);\n }\n\n const buf = encoder.encodeAll(it);\n return Buffer.from(buf, 0, it.offset);\n }\n\n static decode<T extends Schema = Schema>(bytes: Buffer, it?: Iterator): T {\n const reflection = new Reflection();\n\n const reflectionDecoder = new Decoder(reflection);\n reflectionDecoder.decode(bytes, it);\n\n const context = new TypeContext();\n\n const schemaTypes = reflection.types.reduce((types, reflectionType) => {\n const parentKlass: typeof Schema = types[reflectionType.extendsId] || Schema;\n const schema: typeof Schema = class _ extends parentKlass {};\n\n // const _metadata = Object.create(_classSuper[Symbol.metadata] ?? null);\n const _metadata = parentKlass && parentKlass[Symbol.metadata] || Object.create(null);\n Object.defineProperty(schema, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata })\n\n // register for inheritance support\n TypeContext.register(schema);\n\n const typeid = reflectionType.id;\n types[typeid] = schema\n context.add(schema, typeid);\n return types;\n }, {});\n\n reflection.types.forEach((reflectionType) => {\n const schemaType = schemaTypes[reflectionType.id];\n const metadata = schemaType[Symbol.metadata];\n\n const parentKlass = reflection.types[reflectionType.extendsId];\n const parentFieldIndex = parentKlass && parentKlass.fields.length || 0;\n\n reflectionType.fields.forEach((field, i) => {\n const fieldIndex = parentFieldIndex + i;\n\n if (field.referencedType !== undefined) {\n let fieldType = field.type;\n let refType = schemaTypes[field.referencedType];\n\n // map or array of primitive type (-1)\n if (!refType) {\n const typeInfo = field.type.split(\":\");\n fieldType = typeInfo[0];\n refType = typeInfo[1];\n }\n\n if (fieldType === \"ref\") {\n // type(refType)(schemaType.prototype, field.name);\n Metadata.addField(metadata, fieldIndex, field.name, refType);\n\n } else {\n // type({ [fieldType]: refType } as DefinitionType)(schemaType.prototype, field.name);\n Metadata.addField(metadata, fieldIndex, field.name, { [fieldType]: refType } as DefinitionType);\n }\n\n } else {\n // type(field.type as PrimitiveType)(schemaType.prototype, field.name);\n Metadata.addField(metadata, fieldIndex, field.name, field.type as PrimitiveType);\n }\n });\n });\n\n return new (schemaTypes[0])();\n }\n}\n"]}
1
+ {"version":3,"file":"Reflection.js","sourceRoot":"","sources":["../src/Reflection.ts"],"names":[],"mappings":";;;;;;;;;AAAA,+CAAiF;AACjF,yCAAsC;AACtC,4DAAyD;AAEzD,+CAA4C;AAC5C,+CAA4C;AAC5C,qCAAkC;AAElC;;GAEG;AACH,MAAa,eAAgB,SAAQ,eAAM;CAI1C;AAJD,0CAIC;AAHmB;IAAf,IAAA,kBAAI,EAAC,QAAQ,CAAC;6CAAc;AACb;IAAf,IAAA,kBAAI,EAAC,QAAQ,CAAC;6CAAc;AACb;IAAf,IAAA,kBAAI,EAAC,QAAQ,CAAC;uDAAwB;AAG3C,MAAa,cAAe,SAAQ,eAAM;IAA1C;;QAG+B,WAAM,GAAG,IAAI,yBAAW,EAAmB,CAAC;IAC3E,CAAC;CAAA;AAJD,wCAIC;AAHmB;IAAf,IAAA,kBAAI,EAAC,QAAQ,CAAC;0CAAY;AACX;IAAf,IAAA,kBAAI,EAAC,QAAQ,CAAC;iDAAmB;AACP;IAA1B,IAAA,kBAAI,EAAC,CAAE,eAAe,CAAE,CAAC;8CAA6C;AAG3E,MAAa,UAAW,SAAQ,eAAM;IAAtC;;QAC8B,UAAK,GAAgC,IAAI,yBAAW,EAAkB,CAAC;IAwJrG,CAAC;IAtJG,MAAM,CAAC,MAAM,CAAC,QAAgB,EAAE,OAAqB,EAAE,KAAe,EAAE,MAAM,EAAE,CAAC,EAAE;QAC/E,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,OAAO,GAAG,IAAI,yBAAW,CAAC,QAAQ,CAAC,WAA4B,CAAC,CAAC;QACrE,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,IAAI,iBAAO,CAAC,UAAU,CAAC,CAAC;QAExC,MAAM,SAAS,GAAG,CAAC,WAA2B,EAAE,QAAkB,EAAE,EAAE;YAClE,KAAK,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;gBAC/B,kCAAkC;gBAClC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC;oBAC7D,SAAS;gBACb,CAAC;gBAED,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;gBACpC,KAAK,CAAC,IAAI,GAAG,SAAS,CAAC;gBAEvB,IAAI,SAAiB,CAAC;gBAEtB,MAAM,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC;gBAEtC,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC;oBAC7B,SAAS,GAAG,IAAI,CAAC;gBAErB,CAAC;qBAAM,CAAC;oBACJ,IAAI,eAA8B,CAAC;oBAEnC,EAAE;oBACF,wBAAwB;oBACxB,EAAE;oBACF,IAAI,eAAM,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;wBAClB,SAAS,GAAG,KAAK,CAAC;wBAClB,eAAe,GAAG,IAAqB,CAAC;oBAE5C,CAAC;yBAAM,CAAC;wBACJ,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;wBAEjC,IAAI,OAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;4BACvC,SAAS,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe;wBAEvD,CAAC;6BAAM,CAAC;4BACJ,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;wBACtC,CAAC;oBACL,CAAC;oBAED,KAAK,CAAC,cAAc,GAAG,CAAC,eAAe,CAAC;wBACpC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,eAAe,CAAC;wBACpC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACb,CAAC;gBAED,KAAK,CAAC,IAAI,GAAG,SAAS,CAAC;gBACvB,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,CAAC;YAED,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACvC,CAAC,CAAA;QAED,KAAK,IAAI,MAAM,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACpC,MAAM,IAAI,GAAG,IAAI,cAAc,EAAE,CAAC;YAClC,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;YAEzB,sBAAsB;YACtB,MAAM,WAAW,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;YACjD,IAAI,WAAW,KAAK,eAAM,EAAE,CAAC;gBACzB,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACtD,CAAC;YAED,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC5C,CAAC;QAED,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAClC,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,CAAC,MAAM,CAA4B,KAAa,EAAE,EAAa;QACjE,MAAM,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;QAEpC,MAAM,iBAAiB,GAAG,IAAI,iBAAO,CAAC,UAAU,CAAC,CAAC;QAClD,iBAAiB,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAEpC,MAAM,WAAW,GAAG,IAAI,yBAAW,EAAE,CAAC;QAEtC,8CAA8C;QAC9C,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,cAAc,EAAE,EAAE;YACxC,MAAM,WAAW,GAAkB,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC,SAAS,CAAC,IAAI,eAAM,CAAC;YACvF,MAAM,MAAM,GAAkB,MAAM,CAAE,SAAQ,WAAW;aAAG,CAAC;YAE7D,MAAM,cAAc,GAAG,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAEpD,mCAAmC;YACnC,yBAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAE7B,0BAA0B;YAC1B,mBAAQ,CAAC,UAAU,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;YAE5C,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,EAAE,CAAC,CAAC;QAC/C,CAAC,EAAE,EAAE,CAAC,CAAC;QAEP,uBAAuB;QACvB,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,cAAc,EAAE,EAAE;YACxC,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;YACtD,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAE7C,6CAA6C;YAC7C,MAAM,gBAAgB,GAAG,CAAC,CAAC;YAE3B,uCAAuC;YACvC,6DAA6D;YAC7D,wEAAwE;YACxE,qDAAqD;YAErD,EAAE;YACF,8CAA8C;YAC9C,2DAA2D;YAC3D,EAAE;YACF,qEAAqE;YACrE,wBAAwB;YAExB,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;gBACvC,MAAM,UAAU,GAAG,gBAAgB,GAAG,CAAC,CAAC;gBAExC,IAAI,KAAK,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;oBACrC,IAAI,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC;oBAC3B,IAAI,OAAO,GAAkB,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;oBAEnE,sCAAsC;oBACtC,IAAI,CAAC,OAAO,EAAE,CAAC;wBACX,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;wBACvC,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;wBACxB,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAkB,CAAC,CAAC,SAAS;oBACrD,CAAC;oBAED,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;wBACtB,mBAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;oBAEjE,CAAC;yBAAM,CAAC;wBACJ,mBAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,OAAO,EAAoB,CAAC,CAAC;oBACpG,CAAC;gBAEL,CAAC;qBAAM,CAAC;oBACJ,mBAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAqB,CAAC,CAAC;gBACrF,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;QAEH,aAAa;QACb,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACtC,CAAC;CACJ;AAzJD,gCAyJC;AAxJ6B;IAAzB,IAAA,kBAAI,EAAC,CAAE,cAAc,CAAE,CAAC;yCAAwE","sourcesContent":["import { type, PrimitiveType, DefinitionType, TypeContext } from \"./annotations\";\nimport { Metadata } from \"./Metadata\";\nimport { ArraySchema } from \"./types/custom/ArraySchema\";\nimport { Iterator } from \"./encoding/decode\";\nimport { Encoder } from \"./encoder/Encoder\";\nimport { Decoder } from \"./decoder/Decoder\";\nimport { Schema } from \"./Schema\";\n\n/**\n * Reflection\n */\nexport class ReflectionField extends Schema {\n @type(\"string\") name: string;\n @type(\"string\") type: string;\n @type(\"number\") referencedType: number;\n}\n\nexport class ReflectionType extends Schema {\n @type(\"number\") id: number;\n @type(\"number\") extendsId: number;\n @type([ ReflectionField ]) fields = new ArraySchema<ReflectionField>();\n}\n\nexport class Reflection extends Schema {\n @type([ ReflectionType ]) types: ArraySchema<ReflectionType> = new ArraySchema<ReflectionType>();\n\n static encode(instance: Schema, context?: TypeContext, it: Iterator = { offset: 0 }) {\n if (!context) {\n context = new TypeContext(instance.constructor as typeof Schema);\n }\n\n const reflection = new Reflection();\n const encoder = new Encoder(reflection);\n\n const buildType = (currentType: ReflectionType, metadata: Metadata) => {\n for (const fieldName in metadata) {\n // skip fields from parent classes\n if (!Object.prototype.hasOwnProperty.call(metadata, fieldName)) {\n continue;\n }\n\n const field = new ReflectionField();\n field.name = fieldName;\n\n let fieldType: string;\n\n const type = metadata[fieldName].type;\n\n if (typeof (type) === \"string\") {\n fieldType = type;\n\n } else {\n let childTypeSchema: typeof Schema;\n\n //\n // TODO: refactor below.\n //\n if (Schema.is(type)) {\n fieldType = \"ref\";\n childTypeSchema = type as typeof Schema;\n\n } else {\n fieldType = Object.keys(type)[0];\n\n if (typeof(type[fieldType]) === \"string\") {\n fieldType += \":\" + type[fieldType]; // array:string\n\n } else {\n childTypeSchema = type[fieldType];\n }\n }\n\n field.referencedType = (childTypeSchema)\n ? context.getTypeId(childTypeSchema)\n : -1;\n }\n\n field.type = fieldType;\n currentType.fields.push(field);\n }\n\n reflection.types.push(currentType);\n }\n\n for (let typeid in context.types) {\n const klass = context.types[typeid];\n const type = new ReflectionType();\n type.id = Number(typeid);\n\n // support inheritance\n const inheritFrom = Object.getPrototypeOf(klass);\n if (inheritFrom !== Schema) {\n type.extendsId = context.schemas.get(inheritFrom);\n }\n\n buildType(type, klass[Symbol.metadata]);\n }\n\n const buf = encoder.encodeAll(it);\n return Buffer.from(buf, 0, it.offset);\n }\n\n static decode<T extends Schema = Schema>(bytes: Buffer, it?: Iterator): T {\n const reflection = new Reflection();\n\n const reflectionDecoder = new Decoder(reflection);\n reflectionDecoder.decode(bytes, it);\n\n const typeContext = new TypeContext();\n\n // 1st pass, initialize metadata + inheritance\n reflection.types.forEach((reflectionType) => {\n const parentClass: typeof Schema = typeContext.get(reflectionType.extendsId) ?? Schema;\n const schema: typeof Schema = class _ extends parentClass {};\n\n const parentMetadata = parentClass[Symbol.metadata];\n\n // register for inheritance support\n TypeContext.register(schema);\n\n // for inheritance support\n Metadata.initialize(schema, parentMetadata);\n\n typeContext.add(schema, reflectionType.id);\n }, {});\n\n // 2nd pass, set fields\n reflection.types.forEach((reflectionType) => {\n const schemaType = typeContext.get(reflectionType.id);\n const metadata = schemaType[Symbol.metadata];\n\n // FIXME: use metadata[-1] to get field count\n const parentFieldIndex = 0;\n\n // console.log(\"--------------------\");\n // // console.log(\"reflectionType\", reflectionType.toJSON());\n // console.log(\"reflectionType.fields\", reflectionType.fields.toJSON());\n // console.log(\"parentFieldIndex\", parentFieldIndex);\n\n //\n // FIXME: set fields using parentKlass as well\n // currently the fields are duplicated on inherited classes\n //\n // // const parentKlass = reflection.types[reflectionType.extendsId];\n // // parentKlass.fields\n\n reflectionType.fields.forEach((field, i) => {\n const fieldIndex = parentFieldIndex + i;\n\n if (field.referencedType !== undefined) {\n let fieldType = field.type;\n let refType: PrimitiveType = typeContext.get(field.referencedType);\n\n // map or array of primitive type (-1)\n if (!refType) {\n const typeInfo = field.type.split(\":\");\n fieldType = typeInfo[0];\n refType = typeInfo[1] as PrimitiveType; // string\n }\n\n if (fieldType === \"ref\") {\n Metadata.addField(metadata, fieldIndex, field.name, refType);\n\n } else {\n Metadata.addField(metadata, fieldIndex, field.name, { [fieldType]: refType } as DefinitionType);\n }\n\n } else {\n Metadata.addField(metadata, fieldIndex, field.name, field.type as PrimitiveType);\n }\n });\n });\n\n // @ts-ignore\n return new (typeContext.get(0))();\n }\n}\n"]}
package/lib/Schema.d.ts CHANGED
@@ -42,7 +42,7 @@ export declare abstract class Schema {
42
42
  */
43
43
  setDirty<K extends NonFunctionPropNames<this>>(property: K | number, operation?: OPERATION): void;
44
44
  clone(): this;
45
- toJSON(): ToJSON<this>;
45
+ toJSON(): ToJSON<typeof this>;
46
46
  discardAllChanges(): void;
47
47
  protected [$getByIndex](index: number): any;
48
48
  protected [$deleteByIndex](index: number): void;
@@ -1,6 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.defineTypes = exports.deprecated = exports.getPropertyDescriptor = exports.type = exports.unreliable = exports.view = exports.entity = exports.TypeContext = exports.DEFAULT_VIEW_TAG = void 0;
3
+ exports.TypeContext = exports.DEFAULT_VIEW_TAG = void 0;
4
+ exports.entity = entity;
5
+ exports.view = view;
6
+ exports.unreliable = unreliable;
7
+ exports.type = type;
8
+ exports.getPropertyDescriptor = getPropertyDescriptor;
9
+ exports.deprecated = deprecated;
10
+ exports.defineTypes = defineTypes;
4
11
  require("./symbol.shim");
5
12
  const Schema_1 = require("./Schema");
6
13
  const ArraySchema_1 = require("./types/custom/ArraySchema");
@@ -105,7 +112,6 @@ function entity(constructor, context) {
105
112
  }
106
113
  return constructor;
107
114
  }
108
- exports.entity = entity;
109
115
  /**
110
116
  * [See documentation](https://docs.colyseus.io/state/schema/)
111
117
  *
@@ -253,6 +259,7 @@ function view(tag = exports.DEFAULT_VIEW_TAG) {
253
259
  const constructor = target.constructor;
254
260
  const parentClass = Object.getPrototypeOf(constructor);
255
261
  const parentMetadata = parentClass[Symbol.metadata];
262
+ // TODO: use Metadata.initialize()
256
263
  const metadata = (constructor[Symbol.metadata] ??= Object.assign({}, constructor[Symbol.metadata], parentMetadata ?? Object.create(null)));
257
264
  if (!metadata[fieldName]) {
258
265
  //
@@ -268,7 +275,6 @@ function view(tag = exports.DEFAULT_VIEW_TAG) {
268
275
  Metadata_1.Metadata.setTag(metadata, fieldName, tag);
269
276
  };
270
277
  }
271
- exports.view = view;
272
278
  function unreliable(target, field) {
273
279
  //
274
280
  // FIXME: the following block of code is repeated across `@type()`, `@deprecated()` and `@unreliable()` decorators.
@@ -276,6 +282,7 @@ function unreliable(target, field) {
276
282
  const constructor = target.constructor;
277
283
  const parentClass = Object.getPrototypeOf(constructor);
278
284
  const parentMetadata = parentClass[Symbol.metadata];
285
+ // TODO: use Metadata.initialize()
279
286
  const metadata = (constructor[Symbol.metadata] ??= Object.assign({}, constructor[Symbol.metadata], parentMetadata ?? Object.create(null)));
280
287
  if (!metadata[field]) {
281
288
  //
@@ -291,7 +298,6 @@ function unreliable(target, field) {
291
298
  // add owned flag to the field
292
299
  metadata[field].unreliable = true;
293
300
  }
294
- exports.unreliable = unreliable;
295
301
  function type(type, options) {
296
302
  return function (target, field) {
297
303
  const constructor = target.constructor;
@@ -301,8 +307,8 @@ function type(type, options) {
301
307
  // for inheritance support
302
308
  TypeContext.register(constructor);
303
309
  const parentClass = Object.getPrototypeOf(constructor);
304
- const parentMetadata = parentClass[Symbol.metadata];
305
- const metadata = (constructor[Symbol.metadata] ??= Object.assign({}, constructor[Symbol.metadata], parentMetadata ?? Object.create(null)));
310
+ const parentMetadata = parentClass && parentClass[Symbol.metadata];
311
+ const metadata = Metadata_1.Metadata.initialize(constructor, parentMetadata);
306
312
  let fieldIndex;
307
313
  /**
308
314
  * skip if descriptor already exists for this field (`@deprecated()`)
@@ -355,7 +361,6 @@ function type(type, options) {
355
361
  }
356
362
  };
357
363
  }
358
- exports.type = type;
359
364
  function getPropertyDescriptor(fieldCached, fieldIndex, type, complexTypeKlass, metadata, field) {
360
365
  return {
361
366
  get: function () { return this[fieldCached]; },
@@ -407,7 +412,6 @@ function getPropertyDescriptor(fieldCached, fieldIndex, type, complexTypeKlass,
407
412
  configurable: true
408
413
  };
409
414
  }
410
- exports.getPropertyDescriptor = getPropertyDescriptor;
411
415
  /**
412
416
  * `@deprecated()` flag a field as deprecated.
413
417
  * The previous `@type()` annotation should remain along with this one.
@@ -449,12 +453,10 @@ function deprecated(throws = true) {
449
453
  });
450
454
  };
451
455
  }
452
- exports.deprecated = deprecated;
453
456
  function defineTypes(target, fields, options) {
454
457
  for (let field in fields) {
455
458
  type(fields[field], options)(target.prototype, field);
456
459
  }
457
460
  return target;
458
461
  }
459
- exports.defineTypes = defineTypes;
460
462
  //# sourceMappingURL=annotations.js.map