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

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.
@@ -183,7 +183,11 @@ const Metadata = {
183
183
  name,
184
184
  });
185
185
  // create "descriptors" map
186
- metadata[$descriptors] ??= {};
186
+ Object.defineProperty(metadata, $descriptors, {
187
+ value: metadata[$descriptors] || {},
188
+ enumerable: false,
189
+ configurable: true,
190
+ });
187
191
  if (descriptor) {
188
192
  // for encoder
189
193
  metadata[$descriptors][name] = descriptor;
@@ -258,7 +262,7 @@ const Metadata = {
258
262
  TypeContext.register(constructor);
259
263
  const parentClass = Object.getPrototypeOf(constructor);
260
264
  const parentMetadata = parentClass && parentClass[Symbol.metadata];
261
- const metadata = Metadata.initialize(constructor, parentMetadata);
265
+ const metadata = Metadata.initialize(constructor);
262
266
  // Use Schema's methods if not defined in the class
263
267
  if (!constructor[$track]) {
264
268
  constructor[$track] = Schema[$track];
@@ -306,24 +310,62 @@ const Metadata = {
306
310
  configurable: true,
307
311
  });
308
312
  },
309
- initialize(constructor, parentMetadata) {
313
+ initialize(constructor) {
314
+ const parentClass = Object.getPrototypeOf(constructor);
315
+ const parentMetadata = parentClass[Symbol.metadata];
310
316
  let metadata = constructor[Symbol.metadata] ?? Object.create(null);
311
317
  // make sure inherited classes have their own metadata object.
312
- if (constructor[Symbol.metadata] === parentMetadata) {
318
+ if (parentClass !== Schema && metadata === parentMetadata) {
313
319
  metadata = Object.create(null);
314
320
  if (parentMetadata) {
321
+ //
315
322
  // assign parent metadata to current
316
- Object.assign(metadata, parentMetadata);
317
- for (let i = 0; i <= parentMetadata[$numFields]; i++) {
318
- const fieldName = parentMetadata[i].name;
319
- Object.defineProperty(metadata, fieldName, {
320
- value: parentMetadata[fieldName],
323
+ //
324
+ Object.setPrototypeOf(metadata, parentMetadata);
325
+ // Object.keys(parentMetadata).forEach((fieldIndex) => {
326
+ // const index = Number(fieldIndex);
327
+ // const field = parentMetadata[index];
328
+ // metadata[index] = field;
329
+ // // Object.defineProperty(metadata, field.name, {
330
+ // // value: index,
331
+ // // enumerable: false,
332
+ // // configurable: true,
333
+ // // });
334
+ // });
335
+ // $numFields
336
+ Object.defineProperty(metadata, $numFields, {
337
+ value: parentMetadata[$numFields],
338
+ enumerable: false,
339
+ configurable: true,
340
+ writable: true,
341
+ });
342
+ // $viewFieldIndexes / $fieldIndexesByViewTag
343
+ if (parentMetadata[$viewFieldIndexes] !== undefined) {
344
+ Object.defineProperty(metadata, $viewFieldIndexes, {
345
+ value: [...parentMetadata[$viewFieldIndexes]],
346
+ enumerable: false,
347
+ configurable: true,
348
+ writable: true,
349
+ });
350
+ Object.defineProperty(metadata, $fieldIndexesByViewTag, {
351
+ value: { ...parentMetadata[$fieldIndexesByViewTag] },
321
352
  enumerable: false,
322
353
  configurable: true,
354
+ writable: true,
323
355
  });
324
356
  }
325
- Object.defineProperty(metadata, $numFields, {
326
- value: parentMetadata[$numFields],
357
+ // $refTypeFieldIndexes
358
+ if (parentMetadata[$refTypeFieldIndexes] !== undefined) {
359
+ Object.defineProperty(metadata, $refTypeFieldIndexes, {
360
+ value: [...parentMetadata[$refTypeFieldIndexes]],
361
+ enumerable: false,
362
+ configurable: true,
363
+ writable: true,
364
+ });
365
+ }
366
+ // $descriptors
367
+ Object.defineProperty(metadata, $descriptors, {
368
+ value: { ...parentMetadata[$descriptors] },
327
369
  enumerable: false,
328
370
  configurable: true,
329
371
  writable: true,
@@ -2770,13 +2812,13 @@ function type(type, options) {
2770
2812
  // for inheritance support
2771
2813
  TypeContext.register(constructor);
2772
2814
  const parentClass = Object.getPrototypeOf(constructor);
2773
- const parentMetadata = parentClass && parentClass[Symbol.metadata];
2774
- const metadata = Metadata.initialize(constructor, parentMetadata);
2815
+ const parentMetadata = parentClass[Symbol.metadata];
2816
+ const metadata = Metadata.initialize(constructor);
2775
2817
  let fieldIndex = metadata[field];
2776
2818
  /**
2777
2819
  * skip if descriptor already exists for this field (`@deprecated()`)
2778
2820
  */
2779
- if (metadata[fieldIndex]) {
2821
+ if (metadata[fieldIndex] !== undefined) {
2780
2822
  if (metadata[fieldIndex].deprecated) {
2781
2823
  // do not create accessors for deprecated properties.
2782
2824
  return;
@@ -4253,18 +4295,14 @@ class Reflection extends Schema {
4253
4295
  const parentClass = typeContext.get(reflectionType.extendsId) ?? Schema;
4254
4296
  const schema = class _ extends parentClass {
4255
4297
  };
4256
- const parentMetadata = parentClass[Symbol.metadata];
4257
4298
  // register for inheritance support
4258
4299
  TypeContext.register(schema);
4259
- // for inheritance support
4260
- Metadata.initialize(schema, parentMetadata);
4300
+ // // for inheritance support
4301
+ // Metadata.initialize(schema);
4261
4302
  typeContext.add(schema, reflectionType.id);
4262
4303
  }, {});
4263
- // 2nd pass, set fields
4264
- reflection.types.forEach((reflectionType) => {
4265
- const schemaType = typeContext.get(reflectionType.id);
4266
- const metadata = schemaType[Symbol.metadata];
4267
- const parentFieldIndex = 0;
4304
+ // define fields
4305
+ const addFields = (metadata, reflectionType, parentFieldIndex) => {
4268
4306
  reflectionType.fields.forEach((field, i) => {
4269
4307
  const fieldIndex = parentFieldIndex + i;
4270
4308
  if (field.referencedType !== undefined) {
@@ -4287,6 +4325,25 @@ class Reflection extends Schema {
4287
4325
  Metadata.addField(metadata, fieldIndex, field.name, field.type);
4288
4326
  }
4289
4327
  });
4328
+ };
4329
+ // 2nd pass, set fields
4330
+ reflection.types.forEach((reflectionType) => {
4331
+ const schema = typeContext.get(reflectionType.id);
4332
+ // for inheritance support
4333
+ const metadata = Metadata.initialize(schema);
4334
+ const inheritedTypes = [];
4335
+ let parentType = reflectionType;
4336
+ do {
4337
+ inheritedTypes.push(parentType);
4338
+ parentType = reflection.types.find((t) => t.id === parentType.extendsId);
4339
+ } while (parentType);
4340
+ let parentFieldIndex = 0;
4341
+ inheritedTypes.reverse().forEach((reflectionType) => {
4342
+ // add fields from all inherited classes
4343
+ // TODO: refactor this to avoid adding fields from parent classes
4344
+ addFields(metadata, reflectionType, parentFieldIndex);
4345
+ parentFieldIndex += reflectionType.fields.length;
4346
+ });
4290
4347
  });
4291
4348
  const state = new (typeContext.get(0))();
4292
4349
  return new Decoder(state, typeContext);