@colyseus/schema 3.0.75 → 4.0.0
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 +780 -429
- package/build/cjs/index.js.map +1 -1
- package/build/esm/index.mjs +778 -430
- package/build/esm/index.mjs.map +1 -1
- package/build/umd/index.js +780 -429
- package/lib/Reflection.d.ts +50 -17
- package/lib/Reflection.js +151 -202
- package/lib/Reflection.js.map +1 -1
- package/lib/Schema.d.ts +13 -1
- package/lib/Schema.js +73 -9
- package/lib/Schema.js.map +1 -1
- package/lib/annotations.d.ts +6 -1
- package/lib/annotations.js +8 -34
- package/lib/annotations.js.map +1 -1
- package/lib/bench_encode.js +34 -1
- package/lib/bench_encode.js.map +1 -1
- package/lib/codegen/api.js +35 -2
- package/lib/codegen/api.js.map +1 -1
- package/lib/codegen/cli.js +4 -1
- package/lib/codegen/cli.js.map +1 -1
- package/lib/codegen/parser.js +35 -2
- package/lib/codegen/parser.js.map +1 -1
- package/lib/codegen/types.js +34 -1
- package/lib/codegen/types.js.map +1 -1
- package/lib/decoder/DecodeOperation.d.ts +2 -2
- package/lib/decoder/DecodeOperation.js +3 -3
- package/lib/decoder/DecodeOperation.js.map +1 -1
- package/lib/decoder/Decoder.d.ts +3 -3
- package/lib/decoder/Decoder.js +2 -2
- package/lib/decoder/Decoder.js.map +1 -1
- package/lib/decoder/ReferenceTracker.d.ts +0 -1
- package/lib/decoder/ReferenceTracker.js +9 -7
- package/lib/decoder/ReferenceTracker.js.map +1 -1
- package/lib/decoder/strategy/Callbacks.d.ts +154 -0
- package/lib/decoder/strategy/Callbacks.js +340 -0
- package/lib/decoder/strategy/Callbacks.js.map +1 -0
- package/lib/decoder/strategy/{StateCallbacks.d.ts → getDecoderStateCallbacks.d.ts} +6 -0
- package/lib/decoder/strategy/{StateCallbacks.js → getDecoderStateCallbacks.js} +17 -10
- package/lib/decoder/strategy/getDecoderStateCallbacks.js.map +1 -0
- package/lib/encoder/ChangeTree.d.ts +2 -2
- package/lib/encoder/ChangeTree.js.map +1 -1
- package/lib/encoder/EncodeOperation.d.ts +2 -2
- package/lib/encoder/EncodeOperation.js +3 -3
- package/lib/encoder/EncodeOperation.js.map +1 -1
- package/lib/encoder/Encoder.d.ts +6 -6
- package/lib/encoder/Encoder.js +19 -18
- package/lib/encoder/Encoder.js.map +1 -1
- package/lib/encoder/Root.js +17 -14
- package/lib/encoder/Root.js.map +1 -1
- package/lib/encoder/StateView.js +13 -12
- package/lib/encoder/StateView.js.map +1 -1
- package/lib/encoding/decode.d.ts +2 -2
- package/lib/encoding/encode.d.ts +3 -1
- package/lib/encoding/encode.js.map +1 -1
- package/lib/index.d.ts +3 -2
- package/lib/index.js +7 -3
- package/lib/index.js.map +1 -1
- package/lib/types/HelperTypes.d.ts +7 -14
- package/lib/types/HelperTypes.js.map +1 -1
- package/lib/types/custom/ArraySchema.d.ts +2 -1
- package/lib/types/custom/ArraySchema.js.map +1 -1
- package/lib/types/custom/CollectionSchema.d.ts +2 -1
- package/lib/types/custom/CollectionSchema.js.map +1 -1
- package/lib/types/custom/MapSchema.d.ts +3 -2
- package/lib/types/custom/MapSchema.js.map +1 -1
- package/lib/types/custom/SetSchema.d.ts +2 -1
- package/lib/types/custom/SetSchema.js.map +1 -1
- package/lib/types/symbols.d.ts +1 -0
- package/lib/types/symbols.js +2 -1
- package/lib/types/symbols.js.map +1 -1
- package/lib/utils.js +1 -1
- package/lib/utils.js.map +1 -1
- package/package.json +12 -16
- package/src/Reflection.ts +185 -174
- package/src/Schema.ts +81 -13
- package/src/annotations.ts +14 -40
- package/src/codegen/parser.ts +1 -1
- package/src/decoder/DecodeOperation.ts +9 -9
- package/src/decoder/Decoder.ts +6 -6
- package/src/decoder/ReferenceTracker.ts +10 -8
- package/src/decoder/strategy/Callbacks.ts +547 -0
- package/src/decoder/strategy/{StateCallbacks.ts → getDecoderStateCallbacks.ts} +17 -11
- package/src/encoder/ChangeTree.ts +4 -7
- package/src/encoder/EncodeOperation.ts +9 -9
- package/src/encoder/Encoder.ts +26 -18
- package/src/encoder/Root.ts +20 -15
- package/src/encoder/StateView.ts +15 -13
- package/src/encoding/encode.ts +1 -1
- package/src/index.ts +3 -2
- package/src/types/HelperTypes.ts +13 -11
- package/src/types/custom/ArraySchema.ts +2 -1
- package/src/types/custom/CollectionSchema.ts +4 -2
- package/src/types/custom/MapSchema.ts +4 -2
- package/src/types/custom/SetSchema.ts +3 -1
- package/src/types/symbols.ts +1 -0
- package/src/utils.ts +2 -2
- package/lib/Decoder.d.ts +0 -16
- package/lib/Decoder.js +0 -182
- package/lib/Decoder.js.map +0 -1
- package/lib/Encoder.d.ts +0 -13
- package/lib/Encoder.js +0 -79
- package/lib/Encoder.js.map +0 -1
- package/lib/changes/ChangeSet.d.ts +0 -12
- package/lib/changes/ChangeSet.js +0 -35
- package/lib/changes/ChangeSet.js.map +0 -1
- package/lib/changes/ChangeTree.d.ts +0 -53
- package/lib/changes/ChangeTree.js +0 -202
- package/lib/changes/ChangeTree.js.map +0 -1
- package/lib/changes/DecodeOperation.d.ts +0 -15
- package/lib/changes/DecodeOperation.js +0 -186
- package/lib/changes/DecodeOperation.js.map +0 -1
- package/lib/changes/EncodeOperation.d.ts +0 -18
- package/lib/changes/EncodeOperation.js +0 -130
- package/lib/changes/EncodeOperation.js.map +0 -1
- package/lib/changes/ReferenceTracker.d.ts +0 -14
- package/lib/changes/ReferenceTracker.js +0 -83
- package/lib/changes/ReferenceTracker.js.map +0 -1
- package/lib/changes/consts.d.ts +0 -14
- package/lib/changes/consts.js +0 -18
- package/lib/changes/consts.js.map +0 -1
- package/lib/decoder/strategy/StateCallbacks.js.map +0 -1
- package/lib/decoding/decode.d.ts +0 -48
- package/lib/decoding/decode.js +0 -267
- package/lib/decoding/decode.js.map +0 -1
- package/lib/ecs.d.ts +0 -11
- package/lib/ecs.js +0 -160
- package/lib/ecs.js.map +0 -1
- package/lib/filters/index.d.ts +0 -8
- package/lib/filters/index.js +0 -24
- package/lib/filters/index.js.map +0 -1
- package/lib/spec.d.ts +0 -13
- package/lib/spec.js +0 -42
- package/lib/spec.js.map +0 -1
- package/lib/types/ArraySchema.d.ts +0 -238
- package/lib/types/ArraySchema.js +0 -555
- package/lib/types/ArraySchema.js.map +0 -1
- package/lib/types/CollectionSchema.d.ts +0 -35
- package/lib/types/CollectionSchema.js +0 -150
- package/lib/types/CollectionSchema.js.map +0 -1
- package/lib/types/MapSchema.d.ts +0 -38
- package/lib/types/MapSchema.js +0 -215
- package/lib/types/MapSchema.js.map +0 -1
- package/lib/types/SetSchema.d.ts +0 -32
- package/lib/types/SetSchema.js +0 -162
- package/lib/types/SetSchema.js.map +0 -1
- package/lib/types/typeRegistry.d.ts +0 -5
- package/lib/types/typeRegistry.js +0 -13
- package/lib/types/typeRegistry.js.map +0 -1
- package/lib/usage.d.ts +0 -1
- package/lib/usage.js +0 -22
- package/lib/usage.js.map +0 -1
- package/lib/v3.d.ts +0 -1
- package/lib/v3.js +0 -427
- package/lib/v3.js.map +0 -1
- package/lib/v3_experiment.d.ts +0 -1
- package/lib/v3_experiment.js +0 -407
- package/lib/v3_experiment.js.map +0 -1
package/lib/Reflection.d.ts
CHANGED
|
@@ -1,24 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { schema, SchemaType } from "./annotations";
|
|
2
2
|
import { Iterator } from "./encoding/decode";
|
|
3
3
|
import { Encoder } from "./encoder/Encoder";
|
|
4
4
|
import { Decoder } from "./decoder/Decoder";
|
|
5
5
|
import { Schema } from "./Schema";
|
|
6
6
|
/**
|
|
7
|
-
* Reflection
|
|
7
|
+
* Static methods available on Reflection
|
|
8
8
|
*/
|
|
9
|
-
|
|
10
|
-
name: string;
|
|
11
|
-
type: string;
|
|
12
|
-
referencedType: number;
|
|
13
|
-
}
|
|
14
|
-
export declare class ReflectionType extends Schema {
|
|
15
|
-
id: number;
|
|
16
|
-
extendsId: number;
|
|
17
|
-
fields: ArraySchema<ReflectionField>;
|
|
18
|
-
}
|
|
19
|
-
export declare class Reflection extends Schema {
|
|
20
|
-
types: ArraySchema<ReflectionType>;
|
|
21
|
-
rootType: number;
|
|
9
|
+
interface ReflectionStatic {
|
|
22
10
|
/**
|
|
23
11
|
* Encodes the TypeContext of an Encoder into a buffer.
|
|
24
12
|
*
|
|
@@ -26,7 +14,7 @@ export declare class Reflection extends Schema {
|
|
|
26
14
|
* @param it
|
|
27
15
|
* @returns
|
|
28
16
|
*/
|
|
29
|
-
|
|
17
|
+
encode: (encoder: Encoder, it?: Iterator) => Uint8Array;
|
|
30
18
|
/**
|
|
31
19
|
* Decodes the TypeContext from a buffer into a Decoder instance.
|
|
32
20
|
*
|
|
@@ -34,5 +22,50 @@ export declare class Reflection extends Schema {
|
|
|
34
22
|
* @param it
|
|
35
23
|
* @returns Decoder instance
|
|
36
24
|
*/
|
|
37
|
-
|
|
25
|
+
decode: <T extends Schema = Schema>(bytes: Uint8Array, it?: Iterator) => Decoder<T>;
|
|
38
26
|
}
|
|
27
|
+
/**
|
|
28
|
+
* Reflection
|
|
29
|
+
*/
|
|
30
|
+
export declare const ReflectionField: import("./annotations").SchemaWithExtendsConstructor<{
|
|
31
|
+
name: "string";
|
|
32
|
+
type: "string";
|
|
33
|
+
referencedType: "number";
|
|
34
|
+
}, import(".").AssignableProps<import(".").InferSchemaInstanceType<{
|
|
35
|
+
name: "string";
|
|
36
|
+
type: "string";
|
|
37
|
+
referencedType: "number";
|
|
38
|
+
}>>, typeof Schema>;
|
|
39
|
+
export type ReflectionField = SchemaType<typeof ReflectionField>;
|
|
40
|
+
export declare const ReflectionType: import("./annotations").SchemaWithExtendsConstructor<{
|
|
41
|
+
id: "number";
|
|
42
|
+
extendsId: "number";
|
|
43
|
+
fields: import("./annotations").SchemaWithExtendsConstructor<{
|
|
44
|
+
name: "string";
|
|
45
|
+
type: "string";
|
|
46
|
+
referencedType: "number";
|
|
47
|
+
}, import(".").AssignableProps<import(".").InferSchemaInstanceType<{
|
|
48
|
+
name: "string";
|
|
49
|
+
type: "string";
|
|
50
|
+
referencedType: "number";
|
|
51
|
+
}>>, typeof Schema>[];
|
|
52
|
+
}, import(".").AssignableProps<import(".").InferSchemaInstanceType<{
|
|
53
|
+
id: "number";
|
|
54
|
+
extendsId: "number";
|
|
55
|
+
fields: import("./annotations").SchemaWithExtendsConstructor<{
|
|
56
|
+
name: "string";
|
|
57
|
+
type: "string";
|
|
58
|
+
referencedType: "number";
|
|
59
|
+
}, import(".").AssignableProps<import(".").InferSchemaInstanceType<{
|
|
60
|
+
name: "string";
|
|
61
|
+
type: "string";
|
|
62
|
+
referencedType: "number";
|
|
63
|
+
}>>, typeof Schema>[];
|
|
64
|
+
}>>, typeof Schema>;
|
|
65
|
+
export type ReflectionType = SchemaType<typeof ReflectionType>;
|
|
66
|
+
export declare const Reflection: ReturnType<typeof schema<{
|
|
67
|
+
types: [typeof ReflectionType];
|
|
68
|
+
rootType: "number";
|
|
69
|
+
}>> & ReflectionStatic;
|
|
70
|
+
export type Reflection = SchemaType<typeof Reflection>;
|
|
71
|
+
export {};
|
package/lib/Reflection.js
CHANGED
|
@@ -1,233 +1,182 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
-
};
|
|
8
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
3
|
exports.Reflection = exports.ReflectionType = exports.ReflectionField = void 0;
|
|
10
4
|
const annotations_1 = require("./annotations");
|
|
11
5
|
const TypeContext_1 = require("./types/TypeContext");
|
|
12
6
|
const Metadata_1 = require("./Metadata");
|
|
13
|
-
const ArraySchema_1 = require("./types/custom/ArraySchema");
|
|
14
7
|
const Encoder_1 = require("./encoder/Encoder");
|
|
15
8
|
const Decoder_1 = require("./decoder/Decoder");
|
|
16
9
|
const Schema_1 = require("./Schema");
|
|
17
10
|
/**
|
|
18
11
|
* Reflection
|
|
19
12
|
*/
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
(0, annotations_1.type)("number")
|
|
44
|
-
], ReflectionType.prototype, "extendsId", void 0);
|
|
45
|
-
__decorate([
|
|
46
|
-
(0, annotations_1.type)([ReflectionField])
|
|
47
|
-
], ReflectionType.prototype, "fields", void 0);
|
|
48
|
-
class Reflection extends Schema_1.Schema {
|
|
49
|
-
constructor() {
|
|
50
|
-
super(...arguments);
|
|
51
|
-
this.types = new ArraySchema_1.ArraySchema();
|
|
13
|
+
exports.ReflectionField = (0, annotations_1.schema)({
|
|
14
|
+
name: "string",
|
|
15
|
+
type: "string",
|
|
16
|
+
referencedType: "number",
|
|
17
|
+
});
|
|
18
|
+
exports.ReflectionType = (0, annotations_1.schema)({
|
|
19
|
+
id: "number",
|
|
20
|
+
extendsId: "number",
|
|
21
|
+
fields: [exports.ReflectionField],
|
|
22
|
+
});
|
|
23
|
+
exports.Reflection = (0, annotations_1.schema)({
|
|
24
|
+
types: [exports.ReflectionType],
|
|
25
|
+
rootType: "number",
|
|
26
|
+
});
|
|
27
|
+
exports.Reflection.encode = function (encoder, it = { offset: 0 }) {
|
|
28
|
+
const context = encoder.context;
|
|
29
|
+
const reflection = new exports.Reflection();
|
|
30
|
+
const reflectionEncoder = new Encoder_1.Encoder(reflection);
|
|
31
|
+
// rootType is usually the first schema passed to the Encoder
|
|
32
|
+
// (unless it inherits from another schema)
|
|
33
|
+
const rootType = context.schemas.get(encoder.state.constructor);
|
|
34
|
+
if (rootType > 0) {
|
|
35
|
+
reflection.rootType = rootType;
|
|
52
36
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
const rootType = context.schemas.get(encoder.state.constructor);
|
|
67
|
-
if (rootType > 0) {
|
|
68
|
-
reflection.rootType = rootType;
|
|
37
|
+
const includedTypeIds = new Set();
|
|
38
|
+
const pendingReflectionTypes = {};
|
|
39
|
+
// add type to reflection in a way that respects inheritance
|
|
40
|
+
// (parent types should be added before their children)
|
|
41
|
+
const addType = (type) => {
|
|
42
|
+
if (type.extendsId === undefined || includedTypeIds.has(type.extendsId)) {
|
|
43
|
+
includedTypeIds.add(type.id);
|
|
44
|
+
reflection.types.push(type);
|
|
45
|
+
const deps = pendingReflectionTypes[type.id];
|
|
46
|
+
if (deps !== undefined) {
|
|
47
|
+
delete pendingReflectionTypes[type.id];
|
|
48
|
+
deps.forEach((childType) => addType(childType));
|
|
49
|
+
}
|
|
69
50
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
// (parent types should be added before their children)
|
|
74
|
-
const addType = (type) => {
|
|
75
|
-
if (type.extendsId === undefined || includedTypeIds.has(type.extendsId)) {
|
|
76
|
-
includedTypeIds.add(type.id);
|
|
77
|
-
reflection.types.push(type);
|
|
78
|
-
const deps = pendingReflectionTypes[type.id];
|
|
79
|
-
if (deps !== undefined) {
|
|
80
|
-
delete pendingReflectionTypes[type.id];
|
|
81
|
-
deps.forEach((childType) => addType(childType));
|
|
82
|
-
}
|
|
51
|
+
else {
|
|
52
|
+
if (pendingReflectionTypes[type.extendsId] === undefined) {
|
|
53
|
+
pendingReflectionTypes[type.extendsId] = [];
|
|
83
54
|
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
55
|
+
pendingReflectionTypes[type.extendsId].push(type);
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
context.schemas.forEach((typeid, klass) => {
|
|
59
|
+
const type = new exports.ReflectionType();
|
|
60
|
+
type.id = Number(typeid);
|
|
61
|
+
// support inheritance
|
|
62
|
+
const inheritFrom = Object.getPrototypeOf(klass);
|
|
63
|
+
if (inheritFrom !== Schema_1.Schema) {
|
|
64
|
+
type.extendsId = context.schemas.get(inheritFrom);
|
|
65
|
+
}
|
|
66
|
+
const metadata = klass[Symbol.metadata];
|
|
67
|
+
//
|
|
68
|
+
// FIXME: this is a workaround for inherited types without additional fields
|
|
69
|
+
// if metadata is the same reference as the parent class - it means the class has no own metadata
|
|
70
|
+
//
|
|
71
|
+
if (metadata !== inheritFrom[Symbol.metadata]) {
|
|
72
|
+
for (const fieldIndex in metadata) {
|
|
73
|
+
const index = Number(fieldIndex);
|
|
74
|
+
const fieldName = metadata[index].name;
|
|
75
|
+
// skip fields from parent classes
|
|
76
|
+
if (!Object.prototype.hasOwnProperty.call(metadata, fieldName)) {
|
|
77
|
+
continue;
|
|
87
78
|
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
//
|
|
104
|
-
if (metadata !== inheritFrom[Symbol.metadata]) {
|
|
105
|
-
for (const fieldIndex in metadata) {
|
|
106
|
-
const index = Number(fieldIndex);
|
|
107
|
-
const fieldName = metadata[index].name;
|
|
108
|
-
// skip fields from parent classes
|
|
109
|
-
if (!Object.prototype.hasOwnProperty.call(metadata, fieldName)) {
|
|
110
|
-
continue;
|
|
111
|
-
}
|
|
112
|
-
const reflectionField = new ReflectionField();
|
|
113
|
-
reflectionField.name = fieldName;
|
|
114
|
-
let fieldType;
|
|
115
|
-
const field = metadata[index];
|
|
116
|
-
if (typeof (field.type) === "string") {
|
|
117
|
-
fieldType = field.type;
|
|
79
|
+
const reflectionField = new exports.ReflectionField();
|
|
80
|
+
reflectionField.name = fieldName;
|
|
81
|
+
let fieldType;
|
|
82
|
+
const field = metadata[index];
|
|
83
|
+
if (typeof (field.type) === "string") {
|
|
84
|
+
fieldType = field.type;
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
let childTypeSchema;
|
|
88
|
+
//
|
|
89
|
+
// TODO: refactor below.
|
|
90
|
+
//
|
|
91
|
+
if (Schema_1.Schema.is(field.type)) {
|
|
92
|
+
fieldType = "ref";
|
|
93
|
+
childTypeSchema = field.type;
|
|
118
94
|
}
|
|
119
95
|
else {
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
//
|
|
124
|
-
if (Schema_1.Schema.is(field.type)) {
|
|
125
|
-
fieldType = "ref";
|
|
126
|
-
childTypeSchema = field.type;
|
|
96
|
+
fieldType = Object.keys(field.type)[0];
|
|
97
|
+
if (typeof (field.type[fieldType]) === "string") {
|
|
98
|
+
fieldType += ":" + field.type[fieldType]; // array:string
|
|
127
99
|
}
|
|
128
100
|
else {
|
|
129
|
-
|
|
130
|
-
if (typeof (field.type[fieldType]) === "string") {
|
|
131
|
-
fieldType += ":" + field.type[fieldType]; // array:string
|
|
132
|
-
}
|
|
133
|
-
else {
|
|
134
|
-
childTypeSchema = field.type[fieldType];
|
|
135
|
-
}
|
|
101
|
+
childTypeSchema = field.type[fieldType];
|
|
136
102
|
}
|
|
137
|
-
reflectionField.referencedType = (childTypeSchema)
|
|
138
|
-
? context.getTypeId(childTypeSchema)
|
|
139
|
-
: -1;
|
|
140
103
|
}
|
|
141
|
-
reflectionField.
|
|
142
|
-
|
|
104
|
+
reflectionField.referencedType = (childTypeSchema)
|
|
105
|
+
? context.getTypeId(childTypeSchema)
|
|
106
|
+
: -1;
|
|
143
107
|
}
|
|
108
|
+
reflectionField.type = fieldType;
|
|
109
|
+
type.fields.push(reflectionField);
|
|
144
110
|
}
|
|
145
|
-
addType(type);
|
|
146
|
-
});
|
|
147
|
-
// in case there are types that were not added due to inheritance
|
|
148
|
-
for (const typeid in pendingReflectionTypes) {
|
|
149
|
-
pendingReflectionTypes[typeid].forEach((type) => reflection.types.push(type));
|
|
150
111
|
}
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
112
|
+
addType(type);
|
|
113
|
+
});
|
|
114
|
+
// in case there are types that were not added due to inheritance
|
|
115
|
+
for (const typeid in pendingReflectionTypes) {
|
|
116
|
+
pendingReflectionTypes[typeid].forEach((type) => reflection.types.push(type));
|
|
154
117
|
}
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
const
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
const typeInfo = field.type.split(":");
|
|
188
|
-
fieldType = typeInfo[0];
|
|
189
|
-
refType = typeInfo[1]; // string
|
|
190
|
-
}
|
|
191
|
-
if (fieldType === "ref") {
|
|
192
|
-
Metadata_1.Metadata.addField(metadata, fieldIndex, field.name, refType);
|
|
193
|
-
}
|
|
194
|
-
else {
|
|
195
|
-
Metadata_1.Metadata.addField(metadata, fieldIndex, field.name, { [fieldType]: refType });
|
|
196
|
-
}
|
|
118
|
+
const buf = reflectionEncoder.encodeAll(it);
|
|
119
|
+
return buf.slice(0, it.offset);
|
|
120
|
+
};
|
|
121
|
+
exports.Reflection.decode = function (bytes, it) {
|
|
122
|
+
const reflection = new exports.Reflection();
|
|
123
|
+
const reflectionDecoder = new Decoder_1.Decoder(reflection);
|
|
124
|
+
reflectionDecoder.decode(bytes, it);
|
|
125
|
+
const typeContext = new TypeContext_1.TypeContext();
|
|
126
|
+
// 1st pass, initialize metadata + inheritance
|
|
127
|
+
reflection.types.forEach((reflectionType) => {
|
|
128
|
+
const parentClass = typeContext.get(reflectionType.extendsId) ?? Schema_1.Schema;
|
|
129
|
+
const schema = class _ extends parentClass {
|
|
130
|
+
};
|
|
131
|
+
// register for inheritance support
|
|
132
|
+
TypeContext_1.TypeContext.register(schema);
|
|
133
|
+
typeContext.add(schema, reflectionType.id);
|
|
134
|
+
}, {});
|
|
135
|
+
// define fields
|
|
136
|
+
const addFields = (metadata, reflectionType, parentFieldIndex) => {
|
|
137
|
+
reflectionType.fields.forEach((field, i) => {
|
|
138
|
+
const fieldIndex = parentFieldIndex + i;
|
|
139
|
+
if (field.referencedType !== undefined) {
|
|
140
|
+
let fieldType = field.type;
|
|
141
|
+
let refType = typeContext.get(field.referencedType);
|
|
142
|
+
// map or array of primitive type (-1)
|
|
143
|
+
if (!refType) {
|
|
144
|
+
const typeInfo = field.type.split(":");
|
|
145
|
+
fieldType = typeInfo[0];
|
|
146
|
+
refType = typeInfo[1]; // string
|
|
147
|
+
}
|
|
148
|
+
if (fieldType === "ref") {
|
|
149
|
+
Metadata_1.Metadata.addField(metadata, fieldIndex, field.name, refType);
|
|
197
150
|
}
|
|
198
151
|
else {
|
|
199
|
-
Metadata_1.Metadata.addField(metadata, fieldIndex, field.name,
|
|
152
|
+
Metadata_1.Metadata.addField(metadata, fieldIndex, field.name, { [fieldType]: refType });
|
|
200
153
|
}
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
const schema = typeContext.get(reflectionType.id);
|
|
206
|
-
// for inheritance support
|
|
207
|
-
const metadata = Metadata_1.Metadata.initialize(schema);
|
|
208
|
-
const inheritedTypes = [];
|
|
209
|
-
let parentType = reflectionType;
|
|
210
|
-
do {
|
|
211
|
-
inheritedTypes.push(parentType);
|
|
212
|
-
parentType = reflection.types.find((t) => t.id === parentType.extendsId);
|
|
213
|
-
} while (parentType);
|
|
214
|
-
let parentFieldIndex = 0;
|
|
215
|
-
inheritedTypes.reverse().forEach((reflectionType) => {
|
|
216
|
-
// add fields from all inherited classes
|
|
217
|
-
// TODO: refactor this to avoid adding fields from parent classes
|
|
218
|
-
addFields(metadata, reflectionType, parentFieldIndex);
|
|
219
|
-
parentFieldIndex += reflectionType.fields.length;
|
|
220
|
-
});
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
Metadata_1.Metadata.addField(metadata, fieldIndex, field.name, field.type);
|
|
157
|
+
}
|
|
221
158
|
});
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
159
|
+
};
|
|
160
|
+
// 2nd pass, set fields
|
|
161
|
+
reflection.types.forEach((reflectionType) => {
|
|
162
|
+
const schema = typeContext.get(reflectionType.id);
|
|
163
|
+
// for inheritance support
|
|
164
|
+
const metadata = Metadata_1.Metadata.initialize(schema);
|
|
165
|
+
const inheritedTypes = [];
|
|
166
|
+
let parentType = reflectionType;
|
|
167
|
+
do {
|
|
168
|
+
inheritedTypes.push(parentType);
|
|
169
|
+
parentType = reflection.types.find((t) => t.id === parentType.extendsId);
|
|
170
|
+
} while (parentType);
|
|
171
|
+
let parentFieldIndex = 0;
|
|
172
|
+
inheritedTypes.reverse().forEach((reflectionType) => {
|
|
173
|
+
// add fields from all inherited classes
|
|
174
|
+
// TODO: refactor this to avoid adding fields from parent classes
|
|
175
|
+
addFields(metadata, reflectionType, parentFieldIndex);
|
|
176
|
+
parentFieldIndex += reflectionType.fields.length;
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
const state = new (typeContext.get(reflection.rootType || 0))();
|
|
180
|
+
return new Decoder_1.Decoder(state, typeContext);
|
|
181
|
+
};
|
|
233
182
|
//# sourceMappingURL=Reflection.js.map
|
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 } 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 @type(\"number\") rootType: number;\n\n /**\n * Encodes the TypeContext of an Encoder into a buffer.\n *\n * @param encoder Encoder instance\n * @param it\n * @returns\n */\n static encode(encoder: Encoder, it: Iterator = { offset: 0 }) {\n const context = encoder.context;\n\n const reflection = new Reflection();\n const reflectionEncoder = new Encoder(reflection);\n\n // rootType is usually the first schema passed to the Encoder\n // (unless it inherits from another schema)\n const rootType = context.schemas.get(encoder.state.constructor);\n if (rootType > 0) { reflection.rootType = rootType; }\n\n const includedTypeIds = new Set<number>();\n const pendingReflectionTypes: { [typeid: number]: ReflectionType[] } = {};\n\n // add type to reflection in a way that respects inheritance\n // (parent types should be added before their children)\n const addType = (type: ReflectionType) => {\n if (type.extendsId === undefined || includedTypeIds.has(type.extendsId)) {\n includedTypeIds.add(type.id);\n\n reflection.types.push(type);\n\n const deps = pendingReflectionTypes[type.id];\n if (deps !== undefined) {\n delete pendingReflectionTypes[type.id];\n deps.forEach((childType) => addType(childType));\n }\n } else {\n if (pendingReflectionTypes[type.extendsId] === undefined) {\n pendingReflectionTypes[type.extendsId] = [];\n }\n pendingReflectionTypes[type.extendsId].push(type);\n }\n };\n\n context.schemas.forEach((typeid, klass) => {\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 const metadata = klass[Symbol.metadata];\n\n //\n // FIXME: this is a workaround for inherited types without additional fields\n // if metadata is the same reference as the parent class - it means the class has no own metadata\n //\n if (metadata !== inheritFrom[Symbol.metadata]) {\n for (const fieldIndex in metadata) {\n const index = Number(fieldIndex);\n const fieldName = metadata[index].name;\n\n // skip fields from parent classes\n if (!Object.prototype.hasOwnProperty.call(metadata, fieldName)) {\n continue;\n }\n\n const reflectionField = new ReflectionField();\n reflectionField.name = fieldName;\n\n let fieldType: string;\n\n const field = metadata[index];\n\n if (typeof (field.type) === \"string\") {\n fieldType = field.type;\n\n } else {\n let childTypeSchema: typeof Schema;\n\n //\n // TODO: refactor below.\n //\n if (Schema.is(field.type)) {\n fieldType = \"ref\";\n childTypeSchema = field.type as typeof Schema;\n\n } else {\n fieldType = Object.keys(field.type)[0];\n\n if (typeof (field.type[fieldType as keyof typeof field.type]) === \"string\") {\n fieldType += \":\" + field.type[fieldType as keyof typeof field.type]; // array:string\n\n } else {\n childTypeSchema = field.type[fieldType as keyof typeof field.type];\n }\n }\n\n reflectionField.referencedType = (childTypeSchema)\n ? context.getTypeId(childTypeSchema)\n : -1;\n }\n\n reflectionField.type = fieldType;\n type.fields.push(reflectionField);\n }\n }\n\n addType(type);\n });\n\n // in case there are types that were not added due to inheritance\n for (const typeid in pendingReflectionTypes) {\n pendingReflectionTypes[typeid].forEach((type) =>\n reflection.types.push(type))\n }\n\n const buf = reflectionEncoder.encodeAll(it);\n return buf.slice(0, it.offset)\n // return Buffer.from(buf, 0, it.offset);\n }\n\n /**\n * Decodes the TypeContext from a buffer into a Decoder instance.\n *\n * @param bytes Reflection.encode() output\n * @param it\n * @returns Decoder instance\n */\n static decode<T extends Schema = Schema>(bytes: Buffer, it?: Iterator): Decoder<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 // register for inheritance support\n TypeContext.register(schema);\n\n // // for inheritance support\n // Metadata.initialize(schema);\n\n typeContext.add(schema, reflectionType.id);\n }, {});\n\n // define fields\n const addFields = (metadata: Metadata, reflectionType: ReflectionType, parentFieldIndex: number) => {\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 });\n }\n\n } else {\n Metadata.addField(metadata, fieldIndex, field.name, field.type as PrimitiveType);\n }\n });\n };\n\n // 2nd pass, set fields\n reflection.types.forEach((reflectionType) => {\n const schema = typeContext.get(reflectionType.id);\n\n // for inheritance support\n const metadata = Metadata.initialize(schema);\n\n const inheritedTypes: ReflectionType[] = [];\n\n let parentType: ReflectionType = reflectionType;\n do {\n inheritedTypes.push(parentType);\n parentType = reflection.types.find((t) => t.id === parentType.extendsId);\n } while (parentType);\n\n let parentFieldIndex = 0;\n\n inheritedTypes.reverse().forEach((reflectionType) => {\n // add fields from all inherited classes\n // TODO: refactor this to avoid adding fields from parent classes\n addFields(metadata, reflectionType, parentFieldIndex);\n parentFieldIndex += reflectionType.fields.length;\n });\n });\n\n const state: T = new (typeContext.get(reflection.rootType || 0) as unknown as any)();\n\n return new Decoder<T>(state, typeContext);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Reflection.js","sourceRoot":"","sources":["../src/Reflection.ts"],"names":[],"mappings":"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","sourcesContent":["import { PrimitiveType, schema, SchemaType } from \"./annotations\";\nimport { TypeContext } from \"./types/TypeContext\";\nimport { Metadata } from \"./Metadata\";\nimport { Iterator } from \"./encoding/decode\";\nimport { Encoder } from \"./encoder/Encoder\";\nimport { Decoder } from \"./decoder/Decoder\";\nimport { Schema } from \"./Schema\";\n\n/**\n * Static methods available on Reflection\n */\ninterface ReflectionStatic {\n /**\n * Encodes the TypeContext of an Encoder into a buffer.\n *\n * @param encoder Encoder instance\n * @param it\n * @returns\n */\n encode: (encoder: Encoder, it?: Iterator) => Uint8Array;\n\n /**\n * Decodes the TypeContext from a buffer into a Decoder instance.\n *\n * @param bytes Reflection.encode() output\n * @param it\n * @returns Decoder instance\n */\n decode: <T extends Schema = Schema>(bytes: Uint8Array, it?: Iterator) => Decoder<T>;\n}\n\n/**\n * Reflection\n */\nexport const ReflectionField = schema({\n name: \"string\",\n type: \"string\",\n referencedType: \"number\",\n})\nexport type ReflectionField = SchemaType<typeof ReflectionField>;\n\nexport const ReflectionType = schema({\n id: \"number\",\n extendsId: \"number\",\n fields: [ ReflectionField ],\n})\nexport type ReflectionType = SchemaType<typeof ReflectionType>;\n\nexport const Reflection = schema({\n types: [ ReflectionType ],\n rootType: \"number\",\n}) as ReturnType<typeof schema<{\n types: [typeof ReflectionType];\n rootType: \"number\";\n}>> & ReflectionStatic;\n\nexport type Reflection = SchemaType<typeof Reflection>;\n\nReflection.encode = function (encoder: Encoder, it: Iterator = { offset: 0 }) {\n const context = encoder.context;\n\n const reflection = new Reflection();\n const reflectionEncoder = new Encoder(reflection);\n\n // rootType is usually the first schema passed to the Encoder\n // (unless it inherits from another schema)\n const rootType = context.schemas.get(encoder.state.constructor);\n if (rootType > 0) { reflection.rootType = rootType; }\n\n const includedTypeIds = new Set<number>();\n const pendingReflectionTypes: { [typeid: number]: ReflectionType[] } = {};\n\n // add type to reflection in a way that respects inheritance\n // (parent types should be added before their children)\n const addType = (type: ReflectionType) => {\n if (type.extendsId === undefined || includedTypeIds.has(type.extendsId)) {\n includedTypeIds.add(type.id);\n\n reflection.types.push(type);\n\n const deps = pendingReflectionTypes[type.id];\n if (deps !== undefined) {\n delete pendingReflectionTypes[type.id];\n deps.forEach((childType) => addType(childType));\n }\n } else {\n if (pendingReflectionTypes[type.extendsId] === undefined) {\n pendingReflectionTypes[type.extendsId] = [];\n }\n pendingReflectionTypes[type.extendsId].push(type);\n }\n };\n\n context.schemas.forEach((typeid, klass) => {\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 const metadata = klass[Symbol.metadata];\n\n //\n // FIXME: this is a workaround for inherited types without additional fields\n // if metadata is the same reference as the parent class - it means the class has no own metadata\n //\n if (metadata !== inheritFrom[Symbol.metadata]) {\n for (const fieldIndex in metadata) {\n const index = Number(fieldIndex);\n const fieldName = metadata[index].name;\n\n // skip fields from parent classes\n if (!Object.prototype.hasOwnProperty.call(metadata, fieldName)) {\n continue;\n }\n\n const reflectionField = new ReflectionField();\n reflectionField.name = fieldName;\n\n let fieldType: string;\n\n const field = metadata[index];\n\n if (typeof (field.type) === \"string\") {\n fieldType = field.type;\n\n } else {\n let childTypeSchema: typeof Schema;\n\n //\n // TODO: refactor below.\n //\n if (Schema.is(field.type)) {\n fieldType = \"ref\";\n childTypeSchema = field.type as typeof Schema;\n\n } else {\n fieldType = Object.keys(field.type)[0];\n\n if (typeof (field.type[fieldType as keyof typeof field.type]) === \"string\") {\n fieldType += \":\" + field.type[fieldType as keyof typeof field.type]; // array:string\n\n } else {\n childTypeSchema = field.type[fieldType as keyof typeof field.type];\n }\n }\n\n reflectionField.referencedType = (childTypeSchema)\n ? context.getTypeId(childTypeSchema)\n : -1;\n }\n\n reflectionField.type = fieldType;\n type.fields.push(reflectionField);\n }\n }\n\n addType(type);\n });\n\n // in case there are types that were not added due to inheritance\n for (const typeid in pendingReflectionTypes) {\n pendingReflectionTypes[typeid].forEach((type) =>\n reflection.types.push(type))\n }\n\n const buf = reflectionEncoder.encodeAll(it);\n return buf.slice(0, it.offset);\n};\n\nReflection.decode = function <T extends Schema = Schema>(bytes: Uint8Array, it?: Iterator): Decoder<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 // register for inheritance support\n TypeContext.register(schema);\n\n typeContext.add(schema, reflectionType.id);\n }, {});\n\n // define fields\n const addFields = (metadata: Metadata, reflectionType: ReflectionType, parentFieldIndex: number) => {\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 });\n }\n\n } else {\n Metadata.addField(metadata, fieldIndex, field.name, field.type as PrimitiveType);\n }\n });\n };\n\n // 2nd pass, set fields\n reflection.types.forEach((reflectionType) => {\n const schema = typeContext.get(reflectionType.id);\n\n // for inheritance support\n const metadata = Metadata.initialize(schema);\n\n const inheritedTypes: ReflectionType[] = [];\n\n let parentType: ReflectionType = reflectionType;\n do {\n inheritedTypes.push(parentType);\n parentType = reflection.types.find((t) => t.id === parentType.extendsId);\n } while (parentType);\n\n let parentFieldIndex = 0;\n\n inheritedTypes.reverse().forEach((reflectionType) => {\n // add fields from all inherited classes\n // TODO: refactor this to avoid adding fields from parent classes\n addFields(metadata, reflectionType, parentFieldIndex);\n parentFieldIndex += reflectionType.fields.length;\n });\n });\n\n const state: T = new (typeContext.get(reflection.rootType || 0) as unknown as any)();\n\n return new Decoder<T>(state, typeContext);\n}"]}
|
package/lib/Schema.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { OPERATION } from './encoding/spec';
|
|
|
2
2
|
import { type DefinitionType } from "./annotations";
|
|
3
3
|
import { AssignableProps, NonFunctionPropNames, ToJSON } from './types/HelperTypes';
|
|
4
4
|
import { ChangeSetName, ChangeTree, IRef, Ref } from './encoder/ChangeTree';
|
|
5
|
-
import { $decoder, $deleteByIndex, $encoder, $filter, $getByIndex, $track } from './types/symbols';
|
|
5
|
+
import { $decoder, $deleteByIndex, $encoder, $filter, $getByIndex, $refId, $track } from './types/symbols';
|
|
6
6
|
import { StateView } from './encoder/StateView';
|
|
7
7
|
import type { Decoder } from './decoder/Decoder';
|
|
8
8
|
import type { Metadata } from './Metadata';
|
|
@@ -13,6 +13,7 @@ export declare class Schema<C = any> implements IRef {
|
|
|
13
13
|
static [Symbol.metadata]: Metadata;
|
|
14
14
|
static [$encoder]: import("./encoder/EncodeOperation").EncodeOperation<any>;
|
|
15
15
|
static [$decoder]: import("./decoder/DecodeOperation").DecodeOperation<any>;
|
|
16
|
+
[$refId]?: number;
|
|
16
17
|
/**
|
|
17
18
|
* Assign the property descriptors required to track changes on this instance.
|
|
18
19
|
* @param instance
|
|
@@ -34,7 +35,18 @@ export declare class Schema<C = any> implements IRef {
|
|
|
34
35
|
*/
|
|
35
36
|
static [$filter](ref: Schema, index: number, view: StateView): boolean;
|
|
36
37
|
constructor(arg?: C);
|
|
38
|
+
/**
|
|
39
|
+
* Assign properties to the instance.
|
|
40
|
+
* @param props Properties to assign to the instance
|
|
41
|
+
* @returns
|
|
42
|
+
*/
|
|
37
43
|
assign<T extends Partial<this>>(props: AssignableProps<T>): this;
|
|
44
|
+
/**
|
|
45
|
+
* Restore the instance from JSON data.
|
|
46
|
+
* @param jsonData JSON data to restore the instance from
|
|
47
|
+
* @returns
|
|
48
|
+
*/
|
|
49
|
+
restore(jsonData: ToJSON<this>): this;
|
|
38
50
|
/**
|
|
39
51
|
* (Server-side): Flag a property to be encoded for the next patch.
|
|
40
52
|
* @param instance Schema instance
|