@colyseus/schema 3.0.0-alpha.37 → 3.0.0-alpha.39

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 (45) hide show
  1. package/build/cjs/index.js +142 -32
  2. package/build/cjs/index.js.map +1 -1
  3. package/build/esm/index.mjs +142 -33
  4. package/build/esm/index.mjs.map +1 -1
  5. package/build/umd/index.js +142 -32
  6. package/lib/Metadata.d.ts +3 -2
  7. package/lib/Metadata.js +57 -15
  8. package/lib/Metadata.js.map +1 -1
  9. package/lib/Reflection.d.ts +4 -3
  10. package/lib/Reflection.js +36 -11
  11. package/lib/Reflection.js.map +1 -1
  12. package/lib/Schema.d.ts +2 -2
  13. package/lib/Schema.js.map +1 -1
  14. package/lib/annotations.d.ts +29 -12
  15. package/lib/annotations.js +36 -3
  16. package/lib/annotations.js.map +1 -1
  17. package/lib/codegen/parser.js +83 -0
  18. package/lib/codegen/parser.js.map +1 -1
  19. package/lib/codegen/types.js +3 -0
  20. package/lib/codegen/types.js.map +1 -1
  21. package/lib/decoder/DecodeOperation.js +4 -0
  22. package/lib/decoder/DecodeOperation.js.map +1 -1
  23. package/lib/decoder/strategy/StateCallbacks.js.map +1 -1
  24. package/lib/encoder/EncodeOperation.js +2 -2
  25. package/lib/encoder/EncodeOperation.js.map +1 -1
  26. package/lib/index.d.ts +1 -1
  27. package/lib/index.js +2 -1
  28. package/lib/index.js.map +1 -1
  29. package/lib/types/HelperTypes.d.ts +34 -2
  30. package/lib/types/HelperTypes.js.map +1 -1
  31. package/lib/types/TypeContext.js +9 -1
  32. package/lib/types/TypeContext.js.map +1 -1
  33. package/package.json +1 -1
  34. package/src/Metadata.ts +62 -16
  35. package/src/Reflection.ts +43 -16
  36. package/src/Schema.ts +2 -3
  37. package/src/annotations.ts +68 -18
  38. package/src/codegen/parser.ts +107 -0
  39. package/src/codegen/types.ts +1 -0
  40. package/src/decoder/DecodeOperation.ts +4 -0
  41. package/src/decoder/strategy/StateCallbacks.ts +1 -1
  42. package/src/encoder/EncodeOperation.ts +4 -2
  43. package/src/index.ts +1 -1
  44. package/src/types/HelperTypes.ts +54 -2
  45. package/src/types/TypeContext.ts +11 -1
@@ -119,7 +119,7 @@
119
119
  // Workaround to allow using an empty Schema (with no `@type()` fields)
120
120
  //
121
121
  if (schema[Symbol.metadata] === undefined) {
122
- Metadata.init(schema);
122
+ Metadata.initialize(schema);
123
123
  }
124
124
  this.schemas.set(schema, typeid);
125
125
  return true;
@@ -135,6 +135,14 @@
135
135
  TypeContext.inheritedTypes.get(klass)?.forEach((child) => {
136
136
  this.discoverTypes(child, parentIndex, parentFieldViewTag);
137
137
  });
138
+ // add parent classes
139
+ let parent = klass;
140
+ while ((parent = Object.getPrototypeOf(parent)) &&
141
+ parent !== Schema && // stop at root (Schema)
142
+ parent !== Function.prototype // stop at root (non-Schema)
143
+ ) {
144
+ this.discoverTypes(parent);
145
+ }
138
146
  const metadata = (klass[Symbol.metadata] ??= {});
139
147
  // if any schema/field has filters, mark "context" as having filters.
140
148
  if (metadata[$viewFieldIndexes]) {
@@ -173,6 +181,13 @@
173
181
  }
174
182
  }
175
183
 
184
+ function getNormalizedType(type) {
185
+ return (Array.isArray(type))
186
+ ? { array: type[0] }
187
+ : (typeof (type['type']) !== "undefined")
188
+ ? type['type']
189
+ : type;
190
+ }
176
191
  const Metadata = {
177
192
  addField(metadata, index, name, type, descriptor) {
178
193
  if (index > 64) {
@@ -180,14 +195,16 @@
180
195
  }
181
196
  metadata[index] = Object.assign(metadata[index] || {}, // avoid overwriting previous field metadata (@owned / @deprecated)
182
197
  {
183
- type: (Array.isArray(type))
184
- ? { array: type[0] }
185
- : type,
198
+ type: getNormalizedType(type),
186
199
  index,
187
200
  name,
188
201
  });
189
202
  // create "descriptors" map
190
- metadata[$descriptors] ??= {};
203
+ Object.defineProperty(metadata, $descriptors, {
204
+ value: metadata[$descriptors] || {},
205
+ enumerable: false,
206
+ configurable: true,
207
+ });
191
208
  if (descriptor) {
192
209
  // for encoder
193
210
  metadata[$descriptors][name] = descriptor;
@@ -262,7 +279,7 @@
262
279
  TypeContext.register(constructor);
263
280
  const parentClass = Object.getPrototypeOf(constructor);
264
281
  const parentMetadata = parentClass && parentClass[Symbol.metadata];
265
- const metadata = Metadata.initialize(constructor, parentMetadata);
282
+ const metadata = Metadata.initialize(constructor);
266
283
  // Use Schema's methods if not defined in the class
267
284
  if (!constructor[$track]) {
268
285
  constructor[$track] = Schema[$track];
@@ -285,11 +302,15 @@
285
302
  fieldIndex++;
286
303
  for (const field in fields) {
287
304
  const type = fields[field];
305
+ const normalizedType = getNormalizedType(type);
288
306
  // FIXME: this code is duplicated from @type() annotation
289
307
  const complexTypeKlass = (Array.isArray(type))
290
308
  ? getType("array")
291
309
  : (typeof (Object.keys(type)[0]) === "string") && getType(Object.keys(type)[0]);
292
- Metadata.addField(metadata, fieldIndex, field, type, getPropertyDescriptor(`_${field}`, fieldIndex, type, complexTypeKlass));
310
+ const childType = (complexTypeKlass)
311
+ ? Object.values(type)[0]
312
+ : normalizedType;
313
+ Metadata.addField(metadata, fieldIndex, field, type, getPropertyDescriptor(`_${field}`, fieldIndex, childType, complexTypeKlass));
293
314
  fieldIndex++;
294
315
  }
295
316
  return target;
@@ -310,24 +331,52 @@
310
331
  configurable: true,
311
332
  });
312
333
  },
313
- initialize(constructor, parentMetadata) {
334
+ initialize(constructor) {
335
+ const parentClass = Object.getPrototypeOf(constructor);
336
+ const parentMetadata = parentClass[Symbol.metadata];
314
337
  let metadata = constructor[Symbol.metadata] ?? Object.create(null);
315
338
  // make sure inherited classes have their own metadata object.
316
- if (constructor[Symbol.metadata] === parentMetadata) {
339
+ if (parentClass !== Schema && metadata === parentMetadata) {
317
340
  metadata = Object.create(null);
318
341
  if (parentMetadata) {
342
+ //
319
343
  // assign parent metadata to current
320
- Object.assign(metadata, parentMetadata);
321
- for (let i = 0; i <= parentMetadata[$numFields]; i++) {
322
- const fieldName = parentMetadata[i].name;
323
- Object.defineProperty(metadata, fieldName, {
324
- value: parentMetadata[fieldName],
344
+ //
345
+ Object.setPrototypeOf(metadata, parentMetadata);
346
+ // $numFields
347
+ Object.defineProperty(metadata, $numFields, {
348
+ value: parentMetadata[$numFields],
349
+ enumerable: false,
350
+ configurable: true,
351
+ writable: true,
352
+ });
353
+ // $viewFieldIndexes / $fieldIndexesByViewTag
354
+ if (parentMetadata[$viewFieldIndexes] !== undefined) {
355
+ Object.defineProperty(metadata, $viewFieldIndexes, {
356
+ value: [...parentMetadata[$viewFieldIndexes]],
325
357
  enumerable: false,
326
358
  configurable: true,
359
+ writable: true,
360
+ });
361
+ Object.defineProperty(metadata, $fieldIndexesByViewTag, {
362
+ value: { ...parentMetadata[$fieldIndexesByViewTag] },
363
+ enumerable: false,
364
+ configurable: true,
365
+ writable: true,
327
366
  });
328
367
  }
329
- Object.defineProperty(metadata, $numFields, {
330
- value: parentMetadata[$numFields],
368
+ // $refTypeFieldIndexes
369
+ if (parentMetadata[$refTypeFieldIndexes] !== undefined) {
370
+ Object.defineProperty(metadata, $refTypeFieldIndexes, {
371
+ value: [...parentMetadata[$refTypeFieldIndexes]],
372
+ enumerable: false,
373
+ configurable: true,
374
+ writable: true,
375
+ });
376
+ }
377
+ // $descriptors
378
+ Object.defineProperty(metadata, $descriptors, {
379
+ value: { ...parentMetadata[$descriptors] },
331
380
  enumerable: false,
332
381
  configurable: true,
333
382
  writable: true,
@@ -1102,7 +1151,6 @@
1102
1151
  return;
1103
1152
  }
1104
1153
  const ref = changeTree.ref;
1105
- // const metadata: Metadata = ref.constructor[Symbol.metadata];
1106
1154
  const field = metadata[index];
1107
1155
  // TODO: inline this function call small performance gain
1108
1156
  encodeValue(encoder, bytes, metadata[index].type, ref[field.name], operation, it);
@@ -1177,7 +1225,8 @@
1177
1225
  // encode operation
1178
1226
  bytes[it.offset++] = operation & 255;
1179
1227
  // custom operations
1180
- if (operation === exports.OPERATION.CLEAR) {
1228
+ if (operation === exports.OPERATION.CLEAR ||
1229
+ operation === exports.OPERATION.REVERSE) {
1181
1230
  return;
1182
1231
  }
1183
1232
  // encode index
@@ -1655,6 +1704,10 @@
1655
1704
  ref.clear();
1656
1705
  return;
1657
1706
  }
1707
+ else if (operation === exports.OPERATION.REVERSE) {
1708
+ ref.reverse();
1709
+ return;
1710
+ }
1658
1711
  else if (operation === exports.OPERATION.DELETE_BY_REFID) {
1659
1712
  // TODO: refactor here, try to follow same flow as below
1660
1713
  const refId = number(bytes, it);
@@ -2774,13 +2827,13 @@
2774
2827
  // for inheritance support
2775
2828
  TypeContext.register(constructor);
2776
2829
  const parentClass = Object.getPrototypeOf(constructor);
2777
- const parentMetadata = parentClass && parentClass[Symbol.metadata];
2778
- const metadata = Metadata.initialize(constructor, parentMetadata);
2830
+ const parentMetadata = parentClass[Symbol.metadata];
2831
+ const metadata = Metadata.initialize(constructor);
2779
2832
  let fieldIndex = metadata[field];
2780
2833
  /**
2781
2834
  * skip if descriptor already exists for this field (`@deprecated()`)
2782
2835
  */
2783
- if (metadata[fieldIndex]) {
2836
+ if (metadata[fieldIndex] !== undefined) {
2784
2837
  if (metadata[fieldIndex].deprecated) {
2785
2838
  // do not create accessors for deprecated properties.
2786
2839
  return;
@@ -2930,6 +2983,37 @@
2930
2983
  }
2931
2984
  return target;
2932
2985
  }
2986
+ function schema(fields, name, inherits = Schema) {
2987
+ const defaultValues = {};
2988
+ const viewTagFields = {};
2989
+ for (let fieldName in fields) {
2990
+ const field = fields[fieldName];
2991
+ if (typeof (field) === "object") {
2992
+ if (field['default'] !== undefined) {
2993
+ defaultValues[fieldName] = field['default'];
2994
+ }
2995
+ if (field['view'] !== undefined) {
2996
+ viewTagFields[fieldName] = (typeof (field['view']) === "boolean")
2997
+ ? DEFAULT_VIEW_TAG
2998
+ : field['view'];
2999
+ }
3000
+ }
3001
+ }
3002
+ const klass = Metadata.setFields(class extends inherits {
3003
+ constructor(...args) {
3004
+ args[0] = Object.assign({}, defaultValues, args[0]);
3005
+ super(...args);
3006
+ }
3007
+ }, fields);
3008
+ for (let fieldName in viewTagFields) {
3009
+ view(viewTagFields[fieldName])(klass.prototype, fieldName);
3010
+ }
3011
+ if (name) {
3012
+ Object.defineProperty(klass, "name", { value: name });
3013
+ }
3014
+ klass.extends = (fields, name) => schema(fields, name, klass);
3015
+ return klass;
3016
+ }
2933
3017
 
2934
3018
  function getIndent(level) {
2935
3019
  return (new Array(level).fill(0)).map((_, i) => (i === level - 1) ? `└─ ` : ` `).join("");
@@ -4177,13 +4261,20 @@
4177
4261
  /**
4178
4262
  * Encodes the TypeContext of an Encoder into a buffer.
4179
4263
  *
4180
- * @param context TypeContext instance
4264
+ * @param encoder Encoder instance
4181
4265
  * @param it
4182
4266
  * @returns
4183
4267
  */
4184
- static encode(context, it = { offset: 0 }) {
4268
+ static encode(encoder, it = { offset: 0 }) {
4269
+ const context = encoder.context;
4185
4270
  const reflection = new Reflection();
4186
4271
  const reflectionEncoder = new Encoder(reflection);
4272
+ // rootType is usually the first schema passed to the Encoder
4273
+ // (unless it inherits from another schema)
4274
+ const rootType = context.schemas.get(encoder.state.constructor);
4275
+ if (rootType > 0) {
4276
+ reflection.rootType = rootType;
4277
+ }
4187
4278
  const buildType = (currentType, metadata) => {
4188
4279
  for (const fieldIndex in metadata) {
4189
4280
  const index = Number(fieldIndex);
@@ -4257,18 +4348,14 @@
4257
4348
  const parentClass = typeContext.get(reflectionType.extendsId) ?? Schema;
4258
4349
  const schema = class _ extends parentClass {
4259
4350
  };
4260
- const parentMetadata = parentClass[Symbol.metadata];
4261
4351
  // register for inheritance support
4262
4352
  TypeContext.register(schema);
4263
- // for inheritance support
4264
- Metadata.initialize(schema, parentMetadata);
4353
+ // // for inheritance support
4354
+ // Metadata.initialize(schema);
4265
4355
  typeContext.add(schema, reflectionType.id);
4266
4356
  }, {});
4267
- // 2nd pass, set fields
4268
- reflection.types.forEach((reflectionType) => {
4269
- const schemaType = typeContext.get(reflectionType.id);
4270
- const metadata = schemaType[Symbol.metadata];
4271
- const parentFieldIndex = 0;
4357
+ // define fields
4358
+ const addFields = (metadata, reflectionType, parentFieldIndex) => {
4272
4359
  reflectionType.fields.forEach((field, i) => {
4273
4360
  const fieldIndex = parentFieldIndex + i;
4274
4361
  if (field.referencedType !== undefined) {
@@ -4291,14 +4378,36 @@
4291
4378
  Metadata.addField(metadata, fieldIndex, field.name, field.type);
4292
4379
  }
4293
4380
  });
4381
+ };
4382
+ // 2nd pass, set fields
4383
+ reflection.types.forEach((reflectionType) => {
4384
+ const schema = typeContext.get(reflectionType.id);
4385
+ // for inheritance support
4386
+ const metadata = Metadata.initialize(schema);
4387
+ const inheritedTypes = [];
4388
+ let parentType = reflectionType;
4389
+ do {
4390
+ inheritedTypes.push(parentType);
4391
+ parentType = reflection.types.find((t) => t.id === parentType.extendsId);
4392
+ } while (parentType);
4393
+ let parentFieldIndex = 0;
4394
+ inheritedTypes.reverse().forEach((reflectionType) => {
4395
+ // add fields from all inherited classes
4396
+ // TODO: refactor this to avoid adding fields from parent classes
4397
+ addFields(metadata, reflectionType, parentFieldIndex);
4398
+ parentFieldIndex += reflectionType.fields.length;
4399
+ });
4294
4400
  });
4295
- const state = new (typeContext.get(0))();
4401
+ const state = new (typeContext.get(reflection.rootType || 0))();
4296
4402
  return new Decoder(state, typeContext);
4297
4403
  }
4298
4404
  }
4299
4405
  __decorate([
4300
4406
  type([ReflectionType])
4301
4407
  ], Reflection.prototype, "types", void 0);
4408
+ __decorate([
4409
+ type("number")
4410
+ ], Reflection.prototype, "rootType", void 0);
4302
4411
 
4303
4412
  function getDecoderStateCallbacks(decoder) {
4304
4413
  const $root = decoder.root;
@@ -4771,6 +4880,7 @@
4771
4880
  exports.getDecoderStateCallbacks = getDecoderStateCallbacks;
4772
4881
  exports.getRawChangesCallback = getRawChangesCallback;
4773
4882
  exports.registerType = registerType;
4883
+ exports.schema = schema;
4774
4884
  exports.type = type;
4775
4885
  exports.view = view;
4776
4886
 
package/lib/Metadata.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { type DefinitionType } from "./annotations";
1
+ import { DefinitionType } from "./annotations";
2
2
  import { $descriptors, $fieldIndexesByViewTag, $numFields, $refTypeFieldIndexes, $viewFieldIndexes } from "./types/symbols";
3
3
  export type MetadataField = {
4
4
  type: DefinitionType;
@@ -33,6 +33,7 @@ export type Metadata = {
33
33
  [field: string]: PropertyDescriptor;
34
34
  };
35
35
  };
36
+ export declare function getNormalizedType(type: DefinitionType): DefinitionType;
36
37
  export declare const Metadata: {
37
38
  addField(metadata: any, index: number, name: string, type: DefinitionType, descriptor?: PropertyDescriptor): void;
38
39
  setTag(metadata: Metadata, fieldName: string, tag: number): void;
@@ -41,7 +42,7 @@ export declare const Metadata: {
41
42
  }): any;
42
43
  isDeprecated(metadata: any, field: string): boolean;
43
44
  init(klass: any): void;
44
- initialize(constructor: any, parentMetadata?: Metadata): Metadata;
45
+ initialize(constructor: any): Metadata;
45
46
  isValidInstance(klass: any): boolean;
46
47
  getFields(klass: any): {};
47
48
  };
package/lib/Metadata.js CHANGED
@@ -1,11 +1,19 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Metadata = void 0;
4
+ exports.getNormalizedType = getNormalizedType;
4
5
  const annotations_1 = require("./annotations");
5
6
  const Schema_1 = require("./Schema");
6
7
  const registry_1 = require("./types/registry");
7
8
  const symbols_1 = require("./types/symbols");
8
9
  const TypeContext_1 = require("./types/TypeContext");
10
+ function getNormalizedType(type) {
11
+ return (Array.isArray(type))
12
+ ? { array: type[0] }
13
+ : (typeof (type['type']) !== "undefined")
14
+ ? type['type']
15
+ : type;
16
+ }
9
17
  exports.Metadata = {
10
18
  addField(metadata, index, name, type, descriptor) {
11
19
  if (index > 64) {
@@ -13,14 +21,16 @@ exports.Metadata = {
13
21
  }
14
22
  metadata[index] = Object.assign(metadata[index] || {}, // avoid overwriting previous field metadata (@owned / @deprecated)
15
23
  {
16
- type: (Array.isArray(type))
17
- ? { array: type[0] }
18
- : type,
24
+ type: getNormalizedType(type),
19
25
  index,
20
26
  name,
21
27
  });
22
28
  // create "descriptors" map
23
- metadata[symbols_1.$descriptors] ??= {};
29
+ Object.defineProperty(metadata, symbols_1.$descriptors, {
30
+ value: metadata[symbols_1.$descriptors] || {},
31
+ enumerable: false,
32
+ configurable: true,
33
+ });
24
34
  if (descriptor) {
25
35
  // for encoder
26
36
  metadata[symbols_1.$descriptors][name] = descriptor;
@@ -95,7 +105,7 @@ exports.Metadata = {
95
105
  TypeContext_1.TypeContext.register(constructor);
96
106
  const parentClass = Object.getPrototypeOf(constructor);
97
107
  const parentMetadata = parentClass && parentClass[Symbol.metadata];
98
- const metadata = exports.Metadata.initialize(constructor, parentMetadata);
108
+ const metadata = exports.Metadata.initialize(constructor);
99
109
  // Use Schema's methods if not defined in the class
100
110
  if (!constructor[symbols_1.$track]) {
101
111
  constructor[symbols_1.$track] = Schema_1.Schema[symbols_1.$track];
@@ -118,11 +128,15 @@ exports.Metadata = {
118
128
  fieldIndex++;
119
129
  for (const field in fields) {
120
130
  const type = fields[field];
131
+ const normalizedType = getNormalizedType(type);
121
132
  // FIXME: this code is duplicated from @type() annotation
122
133
  const complexTypeKlass = (Array.isArray(type))
123
134
  ? (0, registry_1.getType)("array")
124
135
  : (typeof (Object.keys(type)[0]) === "string") && (0, registry_1.getType)(Object.keys(type)[0]);
125
- exports.Metadata.addField(metadata, fieldIndex, field, type, (0, annotations_1.getPropertyDescriptor)(`_${field}`, fieldIndex, type, complexTypeKlass));
136
+ const childType = (complexTypeKlass)
137
+ ? Object.values(type)[0]
138
+ : normalizedType;
139
+ exports.Metadata.addField(metadata, fieldIndex, field, type, (0, annotations_1.getPropertyDescriptor)(`_${field}`, fieldIndex, childType, complexTypeKlass));
126
140
  fieldIndex++;
127
141
  }
128
142
  return target;
@@ -143,24 +157,52 @@ exports.Metadata = {
143
157
  configurable: true,
144
158
  });
145
159
  },
146
- initialize(constructor, parentMetadata) {
160
+ initialize(constructor) {
161
+ const parentClass = Object.getPrototypeOf(constructor);
162
+ const parentMetadata = parentClass[Symbol.metadata];
147
163
  let metadata = constructor[Symbol.metadata] ?? Object.create(null);
148
164
  // make sure inherited classes have their own metadata object.
149
- if (constructor[Symbol.metadata] === parentMetadata) {
165
+ if (parentClass !== Schema_1.Schema && metadata === parentMetadata) {
150
166
  metadata = Object.create(null);
151
167
  if (parentMetadata) {
168
+ //
152
169
  // assign parent metadata to current
153
- Object.assign(metadata, parentMetadata);
154
- for (let i = 0; i <= parentMetadata[symbols_1.$numFields]; i++) {
155
- const fieldName = parentMetadata[i].name;
156
- Object.defineProperty(metadata, fieldName, {
157
- value: parentMetadata[fieldName],
170
+ //
171
+ Object.setPrototypeOf(metadata, parentMetadata);
172
+ // $numFields
173
+ Object.defineProperty(metadata, symbols_1.$numFields, {
174
+ value: parentMetadata[symbols_1.$numFields],
175
+ enumerable: false,
176
+ configurable: true,
177
+ writable: true,
178
+ });
179
+ // $viewFieldIndexes / $fieldIndexesByViewTag
180
+ if (parentMetadata[symbols_1.$viewFieldIndexes] !== undefined) {
181
+ Object.defineProperty(metadata, symbols_1.$viewFieldIndexes, {
182
+ value: [...parentMetadata[symbols_1.$viewFieldIndexes]],
158
183
  enumerable: false,
159
184
  configurable: true,
185
+ writable: true,
186
+ });
187
+ Object.defineProperty(metadata, symbols_1.$fieldIndexesByViewTag, {
188
+ value: { ...parentMetadata[symbols_1.$fieldIndexesByViewTag] },
189
+ enumerable: false,
190
+ configurable: true,
191
+ writable: true,
160
192
  });
161
193
  }
162
- Object.defineProperty(metadata, symbols_1.$numFields, {
163
- value: parentMetadata[symbols_1.$numFields],
194
+ // $refTypeFieldIndexes
195
+ if (parentMetadata[symbols_1.$refTypeFieldIndexes] !== undefined) {
196
+ Object.defineProperty(metadata, symbols_1.$refTypeFieldIndexes, {
197
+ value: [...parentMetadata[symbols_1.$refTypeFieldIndexes]],
198
+ enumerable: false,
199
+ configurable: true,
200
+ writable: true,
201
+ });
202
+ }
203
+ // $descriptors
204
+ Object.defineProperty(metadata, symbols_1.$descriptors, {
205
+ value: { ...parentMetadata[symbols_1.$descriptors] },
164
206
  enumerable: false,
165
207
  configurable: true,
166
208
  writable: true,
@@ -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 { Schema } from \"./Schema\";\nimport { getType } from \"./types/registry\";\nimport { $decoder, $descriptors, $encoder, $fieldIndexesByViewTag, $numFields, $refTypeFieldIndexes, $track, $viewFieldIndexes } from \"./types/symbols\";\nimport { TypeContext } from \"./types/TypeContext\";\n\nexport type MetadataField = {\n type: DefinitionType,\n name: string,\n index: number,\n tag?: number,\n unreliable?: boolean,\n deprecated?: boolean,\n};\n\nexport type Metadata =\n { [$numFields]: number; } & // number of fields\n { [$viewFieldIndexes]: number[]; } & // all field indexes with \"view\" tag\n { [$fieldIndexesByViewTag]: {[tag: number]: number[]}; } & // field indexes by \"view\" tag\n { [$refTypeFieldIndexes]: number[]; } & // all field indexes containing Ref types (Schema, ArraySchema, MapSchema, etc)\n { [field: number]: MetadataField; } & // index => field name\n { [field: string]: number; } & // field name => field metadata\n { [$descriptors]: { [field: string]: PropertyDescriptor } } // property descriptors\n\nexport const Metadata = {\n\n addField(metadata: any, index: number, name: string, type: DefinitionType, descriptor?: PropertyDescriptor) {\n if (index > 64) {\n throw new Error(`Can't define field '${name}'.\\nSchema instances may only have up to 64 fields.`);\n }\n\n metadata[index] = Object.assign(\n metadata[index] || {}, // avoid overwriting previous field metadata (@owned / @deprecated)\n {\n type: (Array.isArray(type))\n ? { array: type[0] }\n : type,\n index,\n name,\n }\n );\n\n // create \"descriptors\" map\n metadata[$descriptors] ??= {};\n\n if (descriptor) {\n // for encoder\n metadata[$descriptors][name] = descriptor;\n metadata[$descriptors][`_${name}`] = {\n value: undefined,\n writable: true,\n enumerable: false,\n configurable: true,\n };\n } else {\n // for decoder\n metadata[$descriptors][name] = {\n value: undefined,\n writable: true,\n enumerable: true,\n configurable: true,\n };\n }\n\n // map -1 as last field index\n Object.defineProperty(metadata, $numFields, {\n value: index,\n enumerable: false,\n configurable: true\n });\n\n // map field name => index (non enumerable)\n Object.defineProperty(metadata, name, {\n value: index,\n enumerable: false,\n configurable: true,\n });\n\n // if child Ref/complex type, add to -4\n if (typeof (metadata[index].type) !== \"string\") {\n if (metadata[$refTypeFieldIndexes] === undefined) {\n Object.defineProperty(metadata, $refTypeFieldIndexes, {\n value: [],\n enumerable: false,\n configurable: true,\n });\n }\n metadata[$refTypeFieldIndexes].push(index);\n }\n },\n\n setTag(metadata: Metadata, fieldName: string, tag: number) {\n const index = metadata[fieldName];\n const field = metadata[index];\n\n // add 'tag' to the field\n field.tag = tag;\n\n if (!metadata[$viewFieldIndexes]) {\n // -2: all field indexes with \"view\" tag\n Object.defineProperty(metadata, $viewFieldIndexes, {\n value: [],\n enumerable: false,\n configurable: true\n });\n\n // -3: field indexes by \"view\" tag\n Object.defineProperty(metadata, $fieldIndexesByViewTag, {\n value: {},\n enumerable: false,\n configurable: true\n });\n }\n\n metadata[$viewFieldIndexes].push(index);\n\n if (!metadata[$fieldIndexesByViewTag][tag]) {\n metadata[$fieldIndexesByViewTag][tag] = [];\n }\n\n metadata[$fieldIndexesByViewTag][tag].push(index);\n },\n\n setFields(target: any, fields: { [field: string]: DefinitionType }) {\n // for inheritance support\n const constructor = target.prototype.constructor;\n TypeContext.register(constructor);\n\n const parentClass = Object.getPrototypeOf(constructor);\n const parentMetadata = parentClass && parentClass[Symbol.metadata];\n const metadata = Metadata.initialize(constructor, parentMetadata);\n\n // Use Schema's methods if not defined in the class\n if (!constructor[$track]) { constructor[$track] = Schema[$track]; }\n if (!constructor[$encoder]) { constructor[$encoder] = Schema[$encoder]; }\n if (!constructor[$decoder]) { constructor[$decoder] = Schema[$decoder]; }\n if (!constructor.prototype.toJSON) { constructor.prototype.toJSON = Schema.prototype.toJSON; }\n\n //\n // detect index for this field, considering inheritance\n //\n let fieldIndex = metadata[$numFields] // current structure already has fields defined\n ?? (parentMetadata && parentMetadata[$numFields]) // parent structure has fields defined\n ?? -1; // no fields defined\n\n fieldIndex++;\n\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 fieldIndex,\n field,\n type,\n getPropertyDescriptor(`_${field}`, fieldIndex, type, complexTypeKlass)\n );\n\n fieldIndex++;\n }\n\n return target;\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[Symbol.metadata] = metadata;\n Object.defineProperty(metadata, $numFields, {\n value: 0,\n enumerable: false,\n configurable: true,\n });\n },\n\n initialize(constructor: any, parentMetadata?: Metadata) {\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[$numFields]; i++) {\n const fieldName = parentMetadata[i].name;\n Object.defineProperty(metadata, fieldName, {\n value: parentMetadata[fieldName],\n enumerable: false,\n configurable: true,\n });\n }\n\n Object.defineProperty(metadata, $numFields, {\n value: parentMetadata[$numFields],\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], $numFields) as boolean\n );\n },\n\n getFields(klass: any) {\n const metadata: Metadata = klass[Symbol.metadata];\n const fields = {};\n for (let i = 0; i <= metadata[$numFields]; i++) {\n fields[metadata[i].name] = 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 { Definition, DefinitionType, getPropertyDescriptor } from \"./annotations\";\nimport { Schema } from \"./Schema\";\nimport { getType } from \"./types/registry\";\nimport { $decoder, $descriptors, $encoder, $fieldIndexesByViewTag, $numFields, $refTypeFieldIndexes, $track, $viewFieldIndexes } from \"./types/symbols\";\nimport { TypeContext } from \"./types/TypeContext\";\n\nexport type MetadataField = {\n type: DefinitionType,\n name: string,\n index: number,\n tag?: number,\n unreliable?: boolean,\n deprecated?: boolean,\n};\n\nexport type Metadata =\n { [$numFields]: number; } & // number of fields\n { [$viewFieldIndexes]: number[]; } & // all field indexes with \"view\" tag\n { [$fieldIndexesByViewTag]: {[tag: number]: number[]}; } & // field indexes by \"view\" tag\n { [$refTypeFieldIndexes]: number[]; } & // all field indexes containing Ref types (Schema, ArraySchema, MapSchema, etc)\n { [field: number]: MetadataField; } & // index => field name\n { [field: string]: number; } & // field name => field metadata\n { [$descriptors]: { [field: string]: PropertyDescriptor } } // property descriptors\n\nexport function getNormalizedType(type: DefinitionType): DefinitionType {\n return (Array.isArray(type))\n ? { array: type[0] }\n : (typeof(type['type']) !== \"undefined\")\n ? type['type']\n : type;\n}\n\nexport const Metadata = {\n\n addField(metadata: any, index: number, name: string, type: DefinitionType, descriptor?: PropertyDescriptor) {\n if (index > 64) {\n throw new Error(`Can't define field '${name}'.\\nSchema instances may only have up to 64 fields.`);\n }\n\n metadata[index] = Object.assign(\n metadata[index] || {}, // avoid overwriting previous field metadata (@owned / @deprecated)\n {\n type: getNormalizedType(type),\n index,\n name,\n }\n );\n\n // create \"descriptors\" map\n Object.defineProperty(metadata, $descriptors, {\n value: metadata[$descriptors] || {},\n enumerable: false,\n configurable: true,\n });\n\n if (descriptor) {\n // for encoder\n metadata[$descriptors][name] = descriptor;\n metadata[$descriptors][`_${name}`] = {\n value: undefined,\n writable: true,\n enumerable: false,\n configurable: true,\n };\n } else {\n // for decoder\n metadata[$descriptors][name] = {\n value: undefined,\n writable: true,\n enumerable: true,\n configurable: true,\n };\n }\n\n // map -1 as last field index\n Object.defineProperty(metadata, $numFields, {\n value: index,\n enumerable: false,\n configurable: true\n });\n\n // map field name => index (non enumerable)\n Object.defineProperty(metadata, name, {\n value: index,\n enumerable: false,\n configurable: true,\n });\n\n // if child Ref/complex type, add to -4\n if (typeof (metadata[index].type) !== \"string\") {\n if (metadata[$refTypeFieldIndexes] === undefined) {\n Object.defineProperty(metadata, $refTypeFieldIndexes, {\n value: [],\n enumerable: false,\n configurable: true,\n });\n }\n metadata[$refTypeFieldIndexes].push(index);\n }\n },\n\n setTag(metadata: Metadata, fieldName: string, tag: number) {\n const index = metadata[fieldName];\n const field = metadata[index];\n\n // add 'tag' to the field\n field.tag = tag;\n\n if (!metadata[$viewFieldIndexes]) {\n // -2: all field indexes with \"view\" tag\n Object.defineProperty(metadata, $viewFieldIndexes, {\n value: [],\n enumerable: false,\n configurable: true\n });\n\n // -3: field indexes by \"view\" tag\n Object.defineProperty(metadata, $fieldIndexesByViewTag, {\n value: {},\n enumerable: false,\n configurable: true\n });\n }\n\n metadata[$viewFieldIndexes].push(index);\n\n if (!metadata[$fieldIndexesByViewTag][tag]) {\n metadata[$fieldIndexesByViewTag][tag] = [];\n }\n\n metadata[$fieldIndexesByViewTag][tag].push(index);\n },\n\n setFields(target: any, fields: { [field: string]: DefinitionType }) {\n // for inheritance support\n const constructor = target.prototype.constructor;\n TypeContext.register(constructor);\n\n const parentClass = Object.getPrototypeOf(constructor);\n const parentMetadata = parentClass && parentClass[Symbol.metadata];\n const metadata = Metadata.initialize(constructor);\n\n // Use Schema's methods if not defined in the class\n if (!constructor[$track]) { constructor[$track] = Schema[$track]; }\n if (!constructor[$encoder]) { constructor[$encoder] = Schema[$encoder]; }\n if (!constructor[$decoder]) { constructor[$decoder] = Schema[$decoder]; }\n if (!constructor.prototype.toJSON) { constructor.prototype.toJSON = Schema.prototype.toJSON; }\n\n //\n // detect index for this field, considering inheritance\n //\n let fieldIndex = metadata[$numFields] // current structure already has fields defined\n ?? (parentMetadata && parentMetadata[$numFields]) // parent structure has fields defined\n ?? -1; // no fields defined\n\n fieldIndex++;\n\n for (const field in fields) {\n const type = fields[field];\n const normalizedType = getNormalizedType(type);\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 const childType = (complexTypeKlass)\n ? Object.values(type)[0]\n : normalizedType;\n\n Metadata.addField(\n metadata,\n fieldIndex,\n field,\n type,\n getPropertyDescriptor(`_${field}`, fieldIndex, childType, complexTypeKlass)\n );\n\n fieldIndex++;\n }\n\n return target;\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[Symbol.metadata] = metadata;\n Object.defineProperty(metadata, $numFields, {\n value: 0,\n enumerable: false,\n configurable: true,\n });\n },\n\n initialize(constructor: any) {\n const parentClass = Object.getPrototypeOf(constructor);\n const parentMetadata: Metadata = parentClass[Symbol.metadata];\n\n let metadata: Metadata = constructor[Symbol.metadata] ?? Object.create(null);\n\n // make sure inherited classes have their own metadata object.\n if (parentClass !== Schema && metadata === parentMetadata) {\n metadata = Object.create(null);\n\n if (parentMetadata) {\n //\n // assign parent metadata to current\n //\n Object.setPrototypeOf(metadata, parentMetadata);\n\n // $numFields\n Object.defineProperty(metadata, $numFields, {\n value: parentMetadata[$numFields],\n enumerable: false,\n configurable: true,\n writable: true,\n });\n\n // $viewFieldIndexes / $fieldIndexesByViewTag\n if (parentMetadata[$viewFieldIndexes] !== undefined) {\n Object.defineProperty(metadata, $viewFieldIndexes, {\n value: [...parentMetadata[$viewFieldIndexes]],\n enumerable: false,\n configurable: true,\n writable: true,\n });\n Object.defineProperty(metadata, $fieldIndexesByViewTag, {\n value: { ...parentMetadata[$fieldIndexesByViewTag] },\n enumerable: false,\n configurable: true,\n writable: true,\n });\n }\n\n // $refTypeFieldIndexes\n if (parentMetadata[$refTypeFieldIndexes] !== undefined) {\n Object.defineProperty(metadata, $refTypeFieldIndexes, {\n value: [...parentMetadata[$refTypeFieldIndexes]],\n enumerable: false,\n configurable: true,\n writable: true,\n });\n }\n\n // $descriptors\n Object.defineProperty(metadata, $descriptors, {\n value: { ...parentMetadata[$descriptors] },\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], $numFields) as boolean\n );\n },\n\n getFields(klass: any) {\n const metadata: Metadata = klass[Symbol.metadata];\n const fields = {};\n for (let i = 0; i <= metadata[$numFields]; i++) {\n fields[metadata[i].name] = metadata[i].type;\n }\n return fields;\n }\n}"]}
@@ -1,6 +1,6 @@
1
- import { TypeContext } from "./types/TypeContext";
2
1
  import { ArraySchema } from "./types/custom/ArraySchema";
3
2
  import { Iterator } from "./encoding/decode";
3
+ import { Encoder } from "./encoder/Encoder";
4
4
  import { Decoder } from "./decoder/Decoder";
5
5
  import { Schema } from "./Schema";
6
6
  /**
@@ -18,14 +18,15 @@ export declare class ReflectionType extends Schema {
18
18
  }
19
19
  export declare class Reflection extends Schema {
20
20
  types: ArraySchema<ReflectionType>;
21
+ rootType: number;
21
22
  /**
22
23
  * Encodes the TypeContext of an Encoder into a buffer.
23
24
  *
24
- * @param context TypeContext instance
25
+ * @param encoder Encoder instance
25
26
  * @param it
26
27
  * @returns
27
28
  */
28
- static encode(context: TypeContext, it?: Iterator): Buffer;
29
+ static encode(encoder: Encoder, it?: Iterator): Buffer;
29
30
  /**
30
31
  * Decodes the TypeContext from a buffer into a Decoder instance.
31
32
  *
package/lib/Reflection.js CHANGED
@@ -53,13 +53,20 @@ class Reflection extends Schema_1.Schema {
53
53
  /**
54
54
  * Encodes the TypeContext of an Encoder into a buffer.
55
55
  *
56
- * @param context TypeContext instance
56
+ * @param encoder Encoder instance
57
57
  * @param it
58
58
  * @returns
59
59
  */
60
- static encode(context, it = { offset: 0 }) {
60
+ static encode(encoder, it = { offset: 0 }) {
61
+ const context = encoder.context;
61
62
  const reflection = new Reflection();
62
63
  const reflectionEncoder = new Encoder_1.Encoder(reflection);
64
+ // rootType is usually the first schema passed to the Encoder
65
+ // (unless it inherits from another schema)
66
+ const rootType = context.schemas.get(encoder.state.constructor);
67
+ if (rootType > 0) {
68
+ reflection.rootType = rootType;
69
+ }
63
70
  const buildType = (currentType, metadata) => {
64
71
  for (const fieldIndex in metadata) {
65
72
  const index = Number(fieldIndex);
@@ -133,18 +140,14 @@ class Reflection extends Schema_1.Schema {
133
140
  const parentClass = typeContext.get(reflectionType.extendsId) ?? Schema_1.Schema;
134
141
  const schema = class _ extends parentClass {
135
142
  };
136
- const parentMetadata = parentClass[Symbol.metadata];
137
143
  // register for inheritance support
138
144
  TypeContext_1.TypeContext.register(schema);
139
- // for inheritance support
140
- Metadata_1.Metadata.initialize(schema, parentMetadata);
145
+ // // for inheritance support
146
+ // Metadata.initialize(schema);
141
147
  typeContext.add(schema, reflectionType.id);
142
148
  }, {});
143
- // 2nd pass, set fields
144
- reflection.types.forEach((reflectionType) => {
145
- const schemaType = typeContext.get(reflectionType.id);
146
- const metadata = schemaType[Symbol.metadata];
147
- const parentFieldIndex = 0;
149
+ // define fields
150
+ const addFields = (metadata, reflectionType, parentFieldIndex) => {
148
151
  reflectionType.fields.forEach((field, i) => {
149
152
  const fieldIndex = parentFieldIndex + i;
150
153
  if (field.referencedType !== undefined) {
@@ -167,8 +170,27 @@ class Reflection extends Schema_1.Schema {
167
170
  Metadata_1.Metadata.addField(metadata, fieldIndex, field.name, field.type);
168
171
  }
169
172
  });
173
+ };
174
+ // 2nd pass, set fields
175
+ reflection.types.forEach((reflectionType) => {
176
+ const schema = typeContext.get(reflectionType.id);
177
+ // for inheritance support
178
+ const metadata = Metadata_1.Metadata.initialize(schema);
179
+ const inheritedTypes = [];
180
+ let parentType = reflectionType;
181
+ do {
182
+ inheritedTypes.push(parentType);
183
+ parentType = reflection.types.find((t) => t.id === parentType.extendsId);
184
+ } while (parentType);
185
+ let parentFieldIndex = 0;
186
+ inheritedTypes.reverse().forEach((reflectionType) => {
187
+ // add fields from all inherited classes
188
+ // TODO: refactor this to avoid adding fields from parent classes
189
+ addFields(metadata, reflectionType, parentFieldIndex);
190
+ parentFieldIndex += reflectionType.fields.length;
191
+ });
170
192
  });
171
- const state = new (typeContext.get(0))();
193
+ const state = new (typeContext.get(reflection.rootType || 0))();
172
194
  return new Decoder_1.Decoder(state, typeContext);
173
195
  }
174
196
  }
@@ -176,4 +198,7 @@ exports.Reflection = Reflection;
176
198
  __decorate([
177
199
  (0, annotations_1.type)([ReflectionType])
178
200
  ], Reflection.prototype, "types", void 0);
201
+ __decorate([
202
+ (0, annotations_1.type)("number")
203
+ ], Reflection.prototype, "rootType", void 0);
179
204
  //# sourceMappingURL=Reflection.js.map