@colyseus/schema 3.0.0-alpha.28 → 3.0.0-alpha.29
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.
- package/build/cjs/index.js +109 -84
- package/build/cjs/index.js.map +1 -1
- package/build/esm/index.mjs +109 -84
- package/build/esm/index.mjs.map +1 -1
- package/build/umd/index.js +109 -84
- package/lib/Metadata.d.ts +3 -0
- package/lib/Metadata.js.map +1 -1
- package/lib/Reflection.d.ts +1 -1
- package/lib/Reflection.js +4 -3
- package/lib/Reflection.js.map +1 -1
- package/lib/annotations.d.ts +0 -19
- package/lib/annotations.js +4 -106
- package/lib/annotations.js.map +1 -1
- package/lib/bench_encode.js +54 -27
- package/lib/bench_encode.js.map +1 -1
- package/lib/decoder/Decoder.d.ts +1 -1
- package/lib/decoder/Decoder.js +2 -2
- package/lib/decoder/Decoder.js.map +1 -1
- package/lib/encoder/ChangeTree.d.ts +1 -12
- package/lib/encoder/ChangeTree.js +24 -51
- package/lib/encoder/ChangeTree.js.map +1 -1
- package/lib/encoder/Encoder.d.ts +6 -5
- package/lib/encoder/Encoder.js +28 -19
- package/lib/encoder/Encoder.js.map +1 -1
- package/lib/encoder/Root.d.ts +17 -0
- package/lib/encoder/Root.js +44 -0
- package/lib/encoder/Root.js.map +1 -0
- package/lib/index.d.ts +2 -1
- package/lib/index.js +3 -3
- package/lib/index.js.map +1 -1
- package/lib/types/TypeContext.d.ts +23 -0
- package/lib/types/TypeContext.js +109 -0
- package/lib/types/TypeContext.js.map +1 -0
- package/lib/types/custom/ArraySchema.js +0 -1
- package/lib/types/custom/ArraySchema.js.map +1 -1
- package/package.json +1 -1
- package/src/Metadata.ts +1 -0
- package/src/Reflection.ts +2 -1
- package/src/annotations.ts +1 -126
- package/src/bench_encode.ts +47 -16
- package/src/decoder/Decoder.ts +1 -1
- package/src/encoder/ChangeTree.ts +30 -59
- package/src/encoder/Encoder.ts +36 -23
- package/src/encoder/Root.ts +51 -0
- package/src/index.ts +3 -11
- package/src/types/TypeContext.ts +127 -0
- package/src/types/custom/ArraySchema.ts +0 -1
package/build/umd/index.js
CHANGED
|
@@ -200,44 +200,6 @@
|
|
|
200
200
|
};
|
|
201
201
|
|
|
202
202
|
var _a$5;
|
|
203
|
-
class Root {
|
|
204
|
-
constructor() {
|
|
205
|
-
this.nextUniqueId = 0;
|
|
206
|
-
this.refCount = new WeakMap();
|
|
207
|
-
// all changes
|
|
208
|
-
this.allChanges = new Map();
|
|
209
|
-
this.allFilteredChanges = new Map();
|
|
210
|
-
// pending changes to be encoded
|
|
211
|
-
this.changes = new Map();
|
|
212
|
-
this.filteredChanges = new Map();
|
|
213
|
-
}
|
|
214
|
-
getNextUniqueId() {
|
|
215
|
-
return this.nextUniqueId++;
|
|
216
|
-
}
|
|
217
|
-
add(changeTree) {
|
|
218
|
-
const refCount = this.refCount.get(changeTree) || 0;
|
|
219
|
-
this.refCount.set(changeTree, refCount + 1);
|
|
220
|
-
}
|
|
221
|
-
remove(changeTree) {
|
|
222
|
-
const refCount = this.refCount.get(changeTree);
|
|
223
|
-
if (refCount <= 1) {
|
|
224
|
-
this.allChanges.delete(changeTree);
|
|
225
|
-
this.changes.delete(changeTree);
|
|
226
|
-
if (changeTree.isFiltered || changeTree.isPartiallyFiltered) {
|
|
227
|
-
this.allFilteredChanges.delete(changeTree);
|
|
228
|
-
this.filteredChanges.delete(changeTree);
|
|
229
|
-
}
|
|
230
|
-
this.refCount.delete(changeTree);
|
|
231
|
-
}
|
|
232
|
-
else {
|
|
233
|
-
this.refCount.set(changeTree, refCount - 1);
|
|
234
|
-
}
|
|
235
|
-
changeTree.forEachChild((child, _) => this.remove(child));
|
|
236
|
-
}
|
|
237
|
-
clear() {
|
|
238
|
-
this.changes.clear();
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
203
|
class ChangeTree {
|
|
242
204
|
static { _a$5 = $isNew; }
|
|
243
205
|
;
|
|
@@ -269,8 +231,6 @@
|
|
|
269
231
|
if (this.isFiltered || this.isPartiallyFiltered) {
|
|
270
232
|
this.root.allFilteredChanges.set(this, this.allFilteredChanges);
|
|
271
233
|
this.root.filteredChanges.set(this, this.filteredChanges);
|
|
272
|
-
// } else {
|
|
273
|
-
// this.root.allChanges.set(this, this.allChanges);
|
|
274
234
|
}
|
|
275
235
|
if (!this.isFiltered) {
|
|
276
236
|
this.root.allChanges.set(this, this.allChanges);
|
|
@@ -543,15 +503,30 @@
|
|
|
543
503
|
checkIsFiltered(parent, parentIndex) {
|
|
544
504
|
// Detect if current structure has "filters" declared
|
|
545
505
|
this.isPartiallyFiltered = (this.ref['constructor']?.[Symbol.metadata]?.[-2] !== undefined);
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
506
|
+
if (parent && !Metadata.isValidInstance(parent)) {
|
|
507
|
+
const parentChangeTree = parent[$changes];
|
|
508
|
+
parent = parentChangeTree.parent;
|
|
509
|
+
parentIndex = parentChangeTree.parentIndex;
|
|
510
|
+
}
|
|
511
|
+
const parentMetadata = parent?.['constructor']?.[Symbol.metadata];
|
|
512
|
+
this.isFiltered = (parent &&
|
|
513
|
+
parentMetadata?.[-2]?.includes(parentIndex));
|
|
514
|
+
// this.isFiltered = this.ref['constructor']?.[Symbol.metadata]?.[-4];
|
|
515
|
+
// // Detect if parent has "filters" declared
|
|
516
|
+
// while (parent && !this.isFiltered) {
|
|
517
|
+
// const metadata: Metadata = parent['constructor'][Symbol.metadata];
|
|
518
|
+
// // this.isFiltered = metadata?.[-4];
|
|
519
|
+
// const fieldName = metadata?.[parentIndex];
|
|
520
|
+
// const isParentOwned = metadata?.[fieldName]?.tag !== undefined;
|
|
521
|
+
// this.isFiltered = isParentOwned || parent[$changes].isFiltered; // metadata?.[-2]
|
|
522
|
+
// parent = parent[$changes].parent;
|
|
523
|
+
// };
|
|
524
|
+
// console.log("ChangeTree.checkIsFiltered", {
|
|
525
|
+
// parent: parent?.constructor.name,
|
|
526
|
+
// ref: this.ref.constructor.name,
|
|
527
|
+
// isFiltered: this.isFiltered,
|
|
528
|
+
// isPartiallyFiltered: this.isPartiallyFiltered,
|
|
529
|
+
// });
|
|
555
530
|
//
|
|
556
531
|
// TODO: refactor this!
|
|
557
532
|
//
|
|
@@ -1692,7 +1667,6 @@
|
|
|
1692
1667
|
}
|
|
1693
1668
|
const changeTree = this[$changes];
|
|
1694
1669
|
changeTree.indexedOperation(length, exports.OPERATION.ADD, this.items.length);
|
|
1695
|
-
// changeTree.indexes[length] = length;
|
|
1696
1670
|
this.items.push(value);
|
|
1697
1671
|
this.tmpItems.push(value);
|
|
1698
1672
|
//
|
|
@@ -2383,7 +2357,6 @@
|
|
|
2383
2357
|
}
|
|
2384
2358
|
registerType("map", { constructor: MapSchema });
|
|
2385
2359
|
|
|
2386
|
-
const DEFAULT_VIEW_TAG = -1;
|
|
2387
2360
|
class TypeContext {
|
|
2388
2361
|
/**
|
|
2389
2362
|
* For inheritance support
|
|
@@ -2405,6 +2378,7 @@
|
|
|
2405
2378
|
this.types = {};
|
|
2406
2379
|
this.schemas = new Map();
|
|
2407
2380
|
this.hasFilters = false;
|
|
2381
|
+
this.parentFiltered = {};
|
|
2408
2382
|
if (rootClass) {
|
|
2409
2383
|
this.discoverTypes(rootClass);
|
|
2410
2384
|
}
|
|
@@ -2433,32 +2407,32 @@
|
|
|
2433
2407
|
getTypeId(klass) {
|
|
2434
2408
|
return this.schemas.get(klass);
|
|
2435
2409
|
}
|
|
2436
|
-
discoverTypes(klass, parentFieldViewTag) {
|
|
2410
|
+
discoverTypes(klass, parentIndex, parentFieldViewTag) {
|
|
2437
2411
|
if (!this.add(klass)) {
|
|
2438
2412
|
return;
|
|
2439
2413
|
}
|
|
2440
2414
|
// add classes inherited from this base class
|
|
2441
2415
|
TypeContext.inheritedTypes.get(klass)?.forEach((child) => {
|
|
2442
|
-
this.discoverTypes(child, parentFieldViewTag);
|
|
2416
|
+
this.discoverTypes(child, parentIndex, parentFieldViewTag);
|
|
2443
2417
|
});
|
|
2444
|
-
|
|
2445
|
-
if (klass[Symbol.metadata] === undefined) {
|
|
2446
|
-
klass[Symbol.metadata] = {};
|
|
2447
|
-
}
|
|
2448
|
-
// const metadata = Metadata.getFor(klass);
|
|
2449
|
-
const metadata = klass[Symbol.metadata];
|
|
2418
|
+
const metadata = (klass[Symbol.metadata] ??= {});
|
|
2450
2419
|
// if any schema/field has filters, mark "context" as having filters.
|
|
2451
2420
|
if (metadata[-2]) {
|
|
2452
2421
|
this.hasFilters = true;
|
|
2453
2422
|
}
|
|
2423
|
+
if (parentFieldViewTag !== undefined) {
|
|
2424
|
+
this.parentFiltered[`${this.schemas.get(klass)}-${parentIndex}`] = true;
|
|
2425
|
+
}
|
|
2454
2426
|
for (const field in metadata) {
|
|
2455
|
-
//
|
|
2456
|
-
// Modify the field's metadata to include the parent field's view tag
|
|
2457
|
-
//
|
|
2458
|
-
if (
|
|
2459
|
-
|
|
2460
|
-
|
|
2461
|
-
|
|
2427
|
+
// //
|
|
2428
|
+
// // Modify the field's metadata to include the parent field's view tag
|
|
2429
|
+
// //
|
|
2430
|
+
// if (
|
|
2431
|
+
// parentFieldViewTag !== undefined &&
|
|
2432
|
+
// metadata[field].tag === undefined
|
|
2433
|
+
// ) {
|
|
2434
|
+
// metadata[field].tag = parentFieldViewTag;
|
|
2435
|
+
// }
|
|
2462
2436
|
const fieldType = metadata[field].type;
|
|
2463
2437
|
const viewTag = metadata[field].tag;
|
|
2464
2438
|
if (typeof (fieldType) === "string") {
|
|
@@ -2469,7 +2443,7 @@
|
|
|
2469
2443
|
if (type === "string") {
|
|
2470
2444
|
continue;
|
|
2471
2445
|
}
|
|
2472
|
-
this.discoverTypes(type, viewTag);
|
|
2446
|
+
this.discoverTypes(type, metadata[field].index, viewTag);
|
|
2473
2447
|
}
|
|
2474
2448
|
else if (typeof (fieldType) === "function") {
|
|
2475
2449
|
this.discoverTypes(fieldType, viewTag);
|
|
@@ -2480,11 +2454,13 @@
|
|
|
2480
2454
|
if (typeof (type) === "string") {
|
|
2481
2455
|
continue;
|
|
2482
2456
|
}
|
|
2483
|
-
this.discoverTypes(type, viewTag);
|
|
2457
|
+
this.discoverTypes(type, metadata[field].index, viewTag);
|
|
2484
2458
|
}
|
|
2485
2459
|
}
|
|
2486
2460
|
}
|
|
2487
2461
|
}
|
|
2462
|
+
|
|
2463
|
+
const DEFAULT_VIEW_TAG = -1;
|
|
2488
2464
|
/**
|
|
2489
2465
|
* [See documentation](https://docs.colyseus.io/state/schema/)
|
|
2490
2466
|
*
|
|
@@ -3446,16 +3422,56 @@
|
|
|
3446
3422
|
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
3447
3423
|
};
|
|
3448
3424
|
|
|
3425
|
+
class Root {
|
|
3426
|
+
constructor(types) {
|
|
3427
|
+
this.types = types;
|
|
3428
|
+
this.nextUniqueId = 0;
|
|
3429
|
+
this.refCount = new WeakMap();
|
|
3430
|
+
// all changes
|
|
3431
|
+
this.allChanges = new Map();
|
|
3432
|
+
this.allFilteredChanges = new Map();
|
|
3433
|
+
// pending changes to be encoded
|
|
3434
|
+
this.changes = new Map();
|
|
3435
|
+
this.filteredChanges = new Map();
|
|
3436
|
+
}
|
|
3437
|
+
getNextUniqueId() {
|
|
3438
|
+
return this.nextUniqueId++;
|
|
3439
|
+
}
|
|
3440
|
+
add(changeTree) {
|
|
3441
|
+
const refCount = this.refCount.get(changeTree) || 0;
|
|
3442
|
+
this.refCount.set(changeTree, refCount + 1);
|
|
3443
|
+
}
|
|
3444
|
+
remove(changeTree) {
|
|
3445
|
+
const refCount = this.refCount.get(changeTree);
|
|
3446
|
+
if (refCount <= 1) {
|
|
3447
|
+
this.allChanges.delete(changeTree);
|
|
3448
|
+
this.changes.delete(changeTree);
|
|
3449
|
+
if (changeTree.isFiltered || changeTree.isPartiallyFiltered) {
|
|
3450
|
+
this.allFilteredChanges.delete(changeTree);
|
|
3451
|
+
this.filteredChanges.delete(changeTree);
|
|
3452
|
+
}
|
|
3453
|
+
this.refCount.delete(changeTree);
|
|
3454
|
+
}
|
|
3455
|
+
else {
|
|
3456
|
+
this.refCount.set(changeTree, refCount - 1);
|
|
3457
|
+
}
|
|
3458
|
+
changeTree.forEachChild((child, _) => this.remove(child));
|
|
3459
|
+
}
|
|
3460
|
+
clear() {
|
|
3461
|
+
this.changes.clear();
|
|
3462
|
+
}
|
|
3463
|
+
}
|
|
3464
|
+
|
|
3449
3465
|
class Encoder {
|
|
3450
3466
|
static { this.BUFFER_SIZE = 8 * 1024; } // 8KB
|
|
3451
3467
|
constructor(state) {
|
|
3452
3468
|
this.sharedBuffer = Buffer.allocUnsafeSlow(Encoder.BUFFER_SIZE);
|
|
3453
|
-
this.root = new Root();
|
|
3454
3469
|
//
|
|
3455
3470
|
// TODO: cache and restore "Context" based on root schema
|
|
3456
3471
|
// (to avoid creating a new context for every new room)
|
|
3457
3472
|
//
|
|
3458
3473
|
this.context = new TypeContext(state.constructor);
|
|
3474
|
+
this.root = new Root(this.context);
|
|
3459
3475
|
this.setState(state);
|
|
3460
3476
|
// console.log(">>>>>>>>>>>>>>>> Encoder types");
|
|
3461
3477
|
// this.context.schemas.forEach((id, schema) => {
|
|
@@ -3492,7 +3508,8 @@
|
|
|
3492
3508
|
}
|
|
3493
3509
|
}
|
|
3494
3510
|
// skip root `refId` if it's the first change tree
|
|
3495
|
-
|
|
3511
|
+
// (unless it "hasView", which will need to revisit the root)
|
|
3512
|
+
if (hasView || changeTree !== rootChangeTree) {
|
|
3496
3513
|
buffer[it.offset++] = SWITCH_TO_STRUCTURE & 255;
|
|
3497
3514
|
number$1(buffer, changeTree.refId, it);
|
|
3498
3515
|
}
|
|
@@ -3554,35 +3571,43 @@
|
|
|
3554
3571
|
}
|
|
3555
3572
|
}
|
|
3556
3573
|
encodeAll(it = { offset: 0 }, buffer = this.sharedBuffer) {
|
|
3557
|
-
// console.log(
|
|
3558
|
-
//
|
|
3559
|
-
// console.log("->", { ref: item[0].ref.constructor.name, refId: item[0].refId, changes: item[1].size });
|
|
3560
|
-
// });
|
|
3574
|
+
// console.log(`\nencodeAll(), this.root.allChanges (${this.root.allChanges.size})`);
|
|
3575
|
+
// this.debugChanges("allChanges");
|
|
3561
3576
|
return this.encode(it, undefined, buffer, this.root.allChanges, true);
|
|
3562
3577
|
}
|
|
3563
3578
|
encodeAllView(view, sharedOffset, it, bytes = this.sharedBuffer) {
|
|
3564
3579
|
const viewOffset = it.offset;
|
|
3565
|
-
// console.log(
|
|
3566
|
-
// this.
|
|
3580
|
+
// console.log(`\nencodeAllView(), this.root.allFilteredChanges (${this.root.allFilteredChanges.size})`);
|
|
3581
|
+
// this.debugChanges("allFilteredChanges");
|
|
3567
3582
|
// try to encode "filtered" changes
|
|
3568
|
-
this.encode(it, view, bytes, this.root.allFilteredChanges, true);
|
|
3583
|
+
this.encode(it, view, bytes, this.root.allFilteredChanges, true, viewOffset);
|
|
3569
3584
|
return Buffer.concat([
|
|
3570
3585
|
bytes.subarray(0, sharedOffset),
|
|
3571
3586
|
bytes.subarray(viewOffset, it.offset)
|
|
3572
3587
|
]);
|
|
3573
3588
|
}
|
|
3574
|
-
|
|
3575
|
-
|
|
3576
|
-
|
|
3577
|
-
|
|
3578
|
-
|
|
3579
|
-
|
|
3589
|
+
debugChanges(field) {
|
|
3590
|
+
const changeSet = (typeof (field) === "string")
|
|
3591
|
+
? this.root[field]
|
|
3592
|
+
: field;
|
|
3593
|
+
Array.from(changeSet.entries()).map((item) => {
|
|
3594
|
+
const metadata = item[0].ref.constructor[Symbol.metadata];
|
|
3595
|
+
console.log("->", { ref: item[0].ref.constructor.name, refId: item[0].refId, changes: item[1].size });
|
|
3596
|
+
item[1].forEach((op, index) => {
|
|
3597
|
+
console.log(" ->", {
|
|
3598
|
+
index,
|
|
3599
|
+
field: metadata?.[index],
|
|
3600
|
+
op: exports.OPERATION[op],
|
|
3580
3601
|
});
|
|
3581
|
-
}
|
|
3602
|
+
});
|
|
3582
3603
|
});
|
|
3583
3604
|
}
|
|
3584
3605
|
encodeView(view, sharedOffset, it, bytes = this.sharedBuffer) {
|
|
3585
3606
|
const viewOffset = it.offset;
|
|
3607
|
+
// console.log(`\nencodeView(), view.changes (${view.changes.size})`);
|
|
3608
|
+
// this.debugChanges(view.changes);
|
|
3609
|
+
// console.log(`\nencodeView(), this.root.filteredChanges (${this.root.filteredChanges.size})`);
|
|
3610
|
+
// this.debugChanges("filteredChanges");
|
|
3586
3611
|
// encode visibility changes (add/remove for this view)
|
|
3587
3612
|
const viewChangesIterator = view.changes.entries();
|
|
3588
3613
|
for (const [changeTree, changes] of viewChangesIterator) {
|
package/lib/Metadata.d.ts
CHANGED
package/lib/Metadata.js.map
CHANGED
|
@@ -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 // TODO: remove/refactor this...\n //\n const metadata = {};\n klass[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
|
+
{"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 { [-4]: boolean; } & // is \"owned\" by parent structure\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[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}"]}
|
package/lib/Reflection.d.ts
CHANGED
package/lib/Reflection.js
CHANGED
|
@@ -8,6 +8,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
9
|
exports.Reflection = exports.ReflectionType = exports.ReflectionField = void 0;
|
|
10
10
|
const annotations_1 = require("./annotations");
|
|
11
|
+
const TypeContext_1 = require("./types/TypeContext");
|
|
11
12
|
const Metadata_1 = require("./Metadata");
|
|
12
13
|
const ArraySchema_1 = require("./types/custom/ArraySchema");
|
|
13
14
|
const Encoder_1 = require("./encoder/Encoder");
|
|
@@ -50,7 +51,7 @@ class Reflection extends Schema_1.Schema {
|
|
|
50
51
|
this.types = new ArraySchema_1.ArraySchema();
|
|
51
52
|
}
|
|
52
53
|
static encode(instance, context, it = { offset: 0 }) {
|
|
53
|
-
context ??= new
|
|
54
|
+
context ??= new TypeContext_1.TypeContext(instance.constructor);
|
|
54
55
|
const reflection = new Reflection();
|
|
55
56
|
const encoder = new Encoder_1.Encoder(reflection);
|
|
56
57
|
const buildType = (currentType, metadata) => {
|
|
@@ -111,7 +112,7 @@ class Reflection extends Schema_1.Schema {
|
|
|
111
112
|
const reflection = new Reflection();
|
|
112
113
|
const reflectionDecoder = new Decoder_1.Decoder(reflection);
|
|
113
114
|
reflectionDecoder.decode(bytes, it);
|
|
114
|
-
const typeContext = new
|
|
115
|
+
const typeContext = new TypeContext_1.TypeContext();
|
|
115
116
|
// 1st pass, initialize metadata + inheritance
|
|
116
117
|
reflection.types.forEach((reflectionType) => {
|
|
117
118
|
const parentClass = typeContext.get(reflectionType.extendsId) ?? Schema_1.Schema;
|
|
@@ -119,7 +120,7 @@ class Reflection extends Schema_1.Schema {
|
|
|
119
120
|
};
|
|
120
121
|
const parentMetadata = parentClass[Symbol.metadata];
|
|
121
122
|
// register for inheritance support
|
|
122
|
-
|
|
123
|
+
TypeContext_1.TypeContext.register(schema);
|
|
123
124
|
// for inheritance support
|
|
124
125
|
Metadata_1.Metadata.initialize(schema, parentMetadata);
|
|
125
126
|
typeContext.add(schema, reflectionType.id);
|
package/lib/Reflection.js.map
CHANGED
|
@@ -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 context ??= new TypeContext(instance.constructor as typeof Schema);\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"]}
|
|
1
|
+
{"version":3,"file":"Reflection.js","sourceRoot":"","sources":["../src/Reflection.ts"],"names":[],"mappings":"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","sourcesContent":["import { type, PrimitiveType, DefinitionType } from \"./annotations\";\nimport { TypeContext } from \"./types/TypeContext\";\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 context ??= new TypeContext(instance.constructor as typeof Schema);\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/annotations.d.ts
CHANGED
|
@@ -22,25 +22,6 @@ export interface TypeOptions {
|
|
|
22
22
|
manual?: boolean;
|
|
23
23
|
}
|
|
24
24
|
export declare const DEFAULT_VIEW_TAG = -1;
|
|
25
|
-
export declare class TypeContext {
|
|
26
|
-
types: {
|
|
27
|
-
[id: number]: typeof Schema;
|
|
28
|
-
};
|
|
29
|
-
schemas: Map<typeof Schema, number>;
|
|
30
|
-
hasFilters: boolean;
|
|
31
|
-
/**
|
|
32
|
-
* For inheritance support
|
|
33
|
-
* Keeps track of which classes extends which. (parent -> children)
|
|
34
|
-
*/
|
|
35
|
-
static inheritedTypes: Map<typeof Schema, Set<typeof Schema>>;
|
|
36
|
-
static register(target: typeof Schema): void;
|
|
37
|
-
constructor(rootClass?: typeof Schema);
|
|
38
|
-
has(schema: typeof Schema): boolean;
|
|
39
|
-
get(typeid: number): typeof Schema;
|
|
40
|
-
add(schema: typeof Schema, typeid?: number): boolean;
|
|
41
|
-
getTypeId(klass: typeof Schema): number;
|
|
42
|
-
private discoverTypes;
|
|
43
|
-
}
|
|
44
25
|
export declare function entity(constructor: any, context: ClassDecoratorContext): any;
|
|
45
26
|
/**
|
|
46
27
|
* [See documentation](https://docs.colyseus.io/state/schema/)
|
package/lib/annotations.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.DEFAULT_VIEW_TAG = void 0;
|
|
4
4
|
exports.entity = entity;
|
|
5
5
|
exports.view = view;
|
|
6
6
|
exports.unreliable = unreliable;
|
|
@@ -9,120 +9,18 @@ exports.getPropertyDescriptor = getPropertyDescriptor;
|
|
|
9
9
|
exports.deprecated = deprecated;
|
|
10
10
|
exports.defineTypes = defineTypes;
|
|
11
11
|
require("./symbol.shim");
|
|
12
|
-
const Schema_1 = require("./Schema");
|
|
13
12
|
const ArraySchema_1 = require("./types/custom/ArraySchema");
|
|
14
13
|
const MapSchema_1 = require("./types/custom/MapSchema");
|
|
15
14
|
const Metadata_1 = require("./Metadata");
|
|
16
15
|
const symbols_1 = require("./types/symbols");
|
|
17
16
|
const registry_1 = require("./types/registry");
|
|
18
17
|
const spec_1 = require("./encoding/spec");
|
|
18
|
+
const TypeContext_1 = require("./types/TypeContext");
|
|
19
19
|
exports.DEFAULT_VIEW_TAG = -1;
|
|
20
|
-
class TypeContext {
|
|
21
|
-
/**
|
|
22
|
-
* For inheritance support
|
|
23
|
-
* Keeps track of which classes extends which. (parent -> children)
|
|
24
|
-
*/
|
|
25
|
-
static { this.inheritedTypes = new Map(); }
|
|
26
|
-
static register(target) {
|
|
27
|
-
const parent = Object.getPrototypeOf(target);
|
|
28
|
-
if (parent !== Schema_1.Schema) {
|
|
29
|
-
let inherits = TypeContext.inheritedTypes.get(parent);
|
|
30
|
-
if (!inherits) {
|
|
31
|
-
inherits = new Set();
|
|
32
|
-
TypeContext.inheritedTypes.set(parent, inherits);
|
|
33
|
-
}
|
|
34
|
-
inherits.add(target);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
constructor(rootClass) {
|
|
38
|
-
this.types = {};
|
|
39
|
-
this.schemas = new Map();
|
|
40
|
-
this.hasFilters = false;
|
|
41
|
-
if (rootClass) {
|
|
42
|
-
this.discoverTypes(rootClass);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
has(schema) {
|
|
46
|
-
return this.schemas.has(schema);
|
|
47
|
-
}
|
|
48
|
-
get(typeid) {
|
|
49
|
-
return this.types[typeid];
|
|
50
|
-
}
|
|
51
|
-
add(schema, typeid = this.schemas.size) {
|
|
52
|
-
// skip if already registered
|
|
53
|
-
if (this.schemas.has(schema)) {
|
|
54
|
-
return false;
|
|
55
|
-
}
|
|
56
|
-
this.types[typeid] = schema;
|
|
57
|
-
//
|
|
58
|
-
// Workaround to allow using an empty Schema (with no `@type()` fields)
|
|
59
|
-
//
|
|
60
|
-
if (schema[Symbol.metadata] === undefined) {
|
|
61
|
-
Metadata_1.Metadata.init(schema);
|
|
62
|
-
}
|
|
63
|
-
this.schemas.set(schema, typeid);
|
|
64
|
-
return true;
|
|
65
|
-
}
|
|
66
|
-
getTypeId(klass) {
|
|
67
|
-
return this.schemas.get(klass);
|
|
68
|
-
}
|
|
69
|
-
discoverTypes(klass, parentFieldViewTag) {
|
|
70
|
-
if (!this.add(klass)) {
|
|
71
|
-
return;
|
|
72
|
-
}
|
|
73
|
-
// add classes inherited from this base class
|
|
74
|
-
TypeContext.inheritedTypes.get(klass)?.forEach((child) => {
|
|
75
|
-
this.discoverTypes(child, parentFieldViewTag);
|
|
76
|
-
});
|
|
77
|
-
// skip if no fields are defined for this class.
|
|
78
|
-
if (klass[Symbol.metadata] === undefined) {
|
|
79
|
-
klass[Symbol.metadata] = {};
|
|
80
|
-
}
|
|
81
|
-
// const metadata = Metadata.getFor(klass);
|
|
82
|
-
const metadata = klass[Symbol.metadata];
|
|
83
|
-
// if any schema/field has filters, mark "context" as having filters.
|
|
84
|
-
if (metadata[-2]) {
|
|
85
|
-
this.hasFilters = true;
|
|
86
|
-
}
|
|
87
|
-
for (const field in metadata) {
|
|
88
|
-
//
|
|
89
|
-
// Modify the field's metadata to include the parent field's view tag
|
|
90
|
-
//
|
|
91
|
-
if (parentFieldViewTag !== undefined &&
|
|
92
|
-
metadata[field].tag === undefined) {
|
|
93
|
-
metadata[field].tag = parentFieldViewTag;
|
|
94
|
-
}
|
|
95
|
-
const fieldType = metadata[field].type;
|
|
96
|
-
const viewTag = metadata[field].tag;
|
|
97
|
-
if (typeof (fieldType) === "string") {
|
|
98
|
-
continue;
|
|
99
|
-
}
|
|
100
|
-
if (Array.isArray(fieldType)) {
|
|
101
|
-
const type = fieldType[0];
|
|
102
|
-
if (type === "string") {
|
|
103
|
-
continue;
|
|
104
|
-
}
|
|
105
|
-
this.discoverTypes(type, viewTag);
|
|
106
|
-
}
|
|
107
|
-
else if (typeof (fieldType) === "function") {
|
|
108
|
-
this.discoverTypes(fieldType, viewTag);
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
111
|
-
const type = Object.values(fieldType)[0];
|
|
112
|
-
// skip primitive types
|
|
113
|
-
if (typeof (type) === "string") {
|
|
114
|
-
continue;
|
|
115
|
-
}
|
|
116
|
-
this.discoverTypes(type, viewTag);
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
exports.TypeContext = TypeContext;
|
|
122
20
|
function entity(constructor, context) {
|
|
123
21
|
if (!constructor._definition) {
|
|
124
22
|
// for inheritance support
|
|
125
|
-
TypeContext.register(constructor);
|
|
23
|
+
TypeContext_1.TypeContext.register(constructor);
|
|
126
24
|
}
|
|
127
25
|
return constructor;
|
|
128
26
|
}
|
|
@@ -319,7 +217,7 @@ function type(type, options) {
|
|
|
319
217
|
throw new Error(`${constructor.name}: @type() reference provided for "${field}" is undefined. Make sure you don't have any circular dependencies.`);
|
|
320
218
|
}
|
|
321
219
|
// for inheritance support
|
|
322
|
-
TypeContext.register(constructor);
|
|
220
|
+
TypeContext_1.TypeContext.register(constructor);
|
|
323
221
|
const parentClass = Object.getPrototypeOf(constructor);
|
|
324
222
|
const parentMetadata = parentClass && parentClass[Symbol.metadata];
|
|
325
223
|
const metadata = Metadata_1.Metadata.initialize(constructor, parentMetadata);
|