@colyseus/schema 4.0.2 → 4.0.4
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/{lib → build}/Metadata.d.ts +2 -2
- package/{lib → build}/Reflection.d.ts +13 -13
- package/{lib → build}/Schema.d.ts +10 -10
- package/{lib/src → build}/annotations.d.ts +10 -10
- package/build/codegen/languages/cpp.d.ts +3 -0
- package/build/codegen/languages/csharp.d.ts +4 -0
- package/build/codegen/languages/haxe.d.ts +3 -0
- package/{lib → build}/codegen/languages/java.d.ts +2 -2
- package/build/codegen/languages/js.d.ts +3 -0
- package/build/codegen/languages/lua.d.ts +3 -0
- package/build/codegen/languages/ts.d.ts +3 -0
- package/{lib → build}/codegen/parser.d.ts +1 -1
- package/{lib → build}/decoder/DecodeOperation.d.ts +5 -5
- package/{lib/src → build}/decoder/Decoder.d.ts +7 -7
- package/{lib → build}/decoder/ReferenceTracker.d.ts +1 -1
- package/{lib → build}/decoder/strategy/Callbacks.d.ts +18 -43
- package/{lib → build}/decoder/strategy/RawChanges.d.ts +2 -2
- package/{lib → build}/decoder/strategy/getDecoderStateCallbacks.d.ts +3 -3
- package/{lib → build}/encoder/ChangeTree.d.ts +11 -11
- package/{lib → build}/encoder/EncodeOperation.d.ts +5 -5
- package/{lib → build}/encoder/Encoder.d.ts +6 -6
- package/{lib/src → build}/encoder/Root.d.ts +2 -2
- package/{lib/src → build}/encoder/StateView.d.ts +1 -1
- package/{lib/src → build}/encoding/assert.d.ts +6 -6
- package/{lib/src → build}/encoding/decode.d.ts +1 -1
- package/{lib/src → build}/encoding/encode.d.ts +1 -1
- package/build/{cjs/index.cjs → index.cjs} +8 -34
- package/build/index.cjs.map +1 -0
- package/build/index.d.ts +32 -0
- package/build/{umd/index.js → index.js} +8 -34
- package/build/{esm/index.mjs → index.mjs} +8 -34
- package/build/index.mjs.map +1 -0
- package/{lib → build}/types/HelperTypes.d.ts +6 -6
- package/{lib → build}/types/TypeContext.d.ts +1 -1
- package/{lib/src → build}/types/custom/ArraySchema.d.ts +8 -8
- package/{lib/src → build}/types/custom/CollectionSchema.d.ts +7 -7
- package/{lib → build}/types/custom/MapSchema.d.ts +7 -7
- package/{lib/src → build}/types/custom/SetSchema.d.ts +7 -7
- package/{lib/src → build}/types/registry.d.ts +2 -2
- package/{lib → build}/utils.d.ts +1 -1
- package/package.json +9 -10
- package/src/Metadata.ts +5 -5
- package/src/Reflection.ts +7 -7
- package/src/Schema.ts +11 -11
- package/src/annotations.ts +13 -13
- package/src/codegen/api.ts +3 -3
- package/src/codegen/cli.ts +2 -2
- package/src/codegen/languages/cpp.ts +2 -2
- package/src/codegen/languages/csharp.ts +3 -3
- package/src/codegen/languages/haxe.ts +2 -2
- package/src/codegen/languages/java.ts +2 -2
- package/src/codegen/languages/js.ts +2 -2
- package/src/codegen/languages/lua.ts +2 -2
- package/src/codegen/languages/ts.ts +2 -2
- package/src/codegen/parser.ts +6 -1
- package/src/decoder/DecodeOperation.ts +14 -14
- package/src/decoder/Decoder.ts +11 -11
- package/src/decoder/ReferenceTracker.ts +8 -8
- package/src/decoder/strategy/Callbacks.ts +27 -53
- package/src/decoder/strategy/RawChanges.ts +2 -2
- package/src/decoder/strategy/getDecoderStateCallbacks.ts +10 -10
- package/src/encoder/ChangeTree.ts +13 -13
- package/src/encoder/EncodeOperation.ts +9 -9
- package/src/encoder/Encoder.ts +10 -10
- package/src/encoder/Root.ts +4 -4
- package/src/encoder/StateView.ts +7 -7
- package/src/encoding/assert.ts +6 -6
- package/src/encoding/decode.ts +1 -1
- package/src/encoding/encode.ts +1 -1
- package/src/index.ts +27 -27
- package/src/types/HelperTypes.ts +6 -6
- package/src/types/TypeContext.ts +3 -3
- package/src/types/custom/ArraySchema.ts +11 -11
- package/src/types/custom/CollectionSchema.ts +9 -9
- package/src/types/custom/MapSchema.ts +10 -10
- package/src/types/custom/SetSchema.ts +9 -9
- package/src/types/registry.ts +3 -3
- package/src/utils.ts +3 -3
- package/src/v3_bench.ts +1 -1
- package/build/cjs/index.cjs.map +0 -1
- package/build/esm/index.mjs.map +0 -1
- package/lib/Metadata.js +0 -256
- package/lib/Metadata.js.map +0 -1
- package/lib/Reflection.js +0 -179
- package/lib/Reflection.js.map +0 -1
- package/lib/Schema.js +0 -352
- package/lib/Schema.js.map +0 -1
- package/lib/annotations.d.ts +0 -109
- package/lib/annotations.js +0 -473
- package/lib/annotations.js.map +0 -1
- package/lib/bench_encode.d.ts +0 -1
- package/lib/bench_encode.js +0 -91
- package/lib/bench_encode.js.map +0 -1
- package/lib/benchmark.d.ts +0 -1
- package/lib/benchmark.js +0 -218
- package/lib/benchmark.js.map +0 -1
- package/lib/codegen/api.js +0 -56
- package/lib/codegen/api.js.map +0 -1
- package/lib/codegen/argv.js +0 -39
- package/lib/codegen/argv.js.map +0 -1
- package/lib/codegen/cli.js +0 -58
- package/lib/codegen/cli.js.map +0 -1
- package/lib/codegen/languages/cpp.d.ts +0 -3
- package/lib/codegen/languages/cpp.js +0 -258
- package/lib/codegen/languages/cpp.js.map +0 -1
- package/lib/codegen/languages/csharp.d.ts +0 -4
- package/lib/codegen/languages/csharp.js +0 -154
- package/lib/codegen/languages/csharp.js.map +0 -1
- package/lib/codegen/languages/haxe.d.ts +0 -3
- package/lib/codegen/languages/haxe.js +0 -100
- package/lib/codegen/languages/haxe.js.map +0 -1
- package/lib/codegen/languages/java.js +0 -100
- package/lib/codegen/languages/java.js.map +0 -1
- package/lib/codegen/languages/js.d.ts +0 -3
- package/lib/codegen/languages/js.js +0 -101
- package/lib/codegen/languages/js.js.map +0 -1
- package/lib/codegen/languages/lua.d.ts +0 -3
- package/lib/codegen/languages/lua.js +0 -103
- package/lib/codegen/languages/lua.js.map +0 -1
- package/lib/codegen/languages/ts.d.ts +0 -3
- package/lib/codegen/languages/ts.js +0 -116
- package/lib/codegen/languages/ts.js.map +0 -1
- package/lib/codegen/parser.js +0 -327
- package/lib/codegen/parser.js.map +0 -1
- package/lib/codegen/types.js +0 -142
- package/lib/codegen/types.js.map +0 -1
- package/lib/decoder/DecodeOperation.js +0 -248
- package/lib/decoder/DecodeOperation.js.map +0 -1
- package/lib/decoder/Decoder.d.ts +0 -21
- package/lib/decoder/Decoder.js +0 -114
- package/lib/decoder/Decoder.js.map +0 -1
- package/lib/decoder/ReferenceTracker.js +0 -135
- package/lib/decoder/ReferenceTracker.js.map +0 -1
- package/lib/decoder/strategy/Callbacks.js +0 -336
- package/lib/decoder/strategy/Callbacks.js.map +0 -1
- package/lib/decoder/strategy/RawChanges.js +0 -4
- package/lib/decoder/strategy/RawChanges.js.map +0 -1
- package/lib/decoder/strategy/getDecoderStateCallbacks.js +0 -274
- package/lib/decoder/strategy/getDecoderStateCallbacks.js.map +0 -1
- package/lib/encoder/ChangeTree.js +0 -534
- package/lib/encoder/ChangeTree.js.map +0 -1
- package/lib/encoder/EncodeOperation.js +0 -132
- package/lib/encoder/EncodeOperation.js.map +0 -1
- package/lib/encoder/Encoder.js +0 -204
- package/lib/encoder/Encoder.js.map +0 -1
- package/lib/encoder/Root.d.ts +0 -28
- package/lib/encoder/Root.js +0 -229
- package/lib/encoder/Root.js.map +0 -1
- package/lib/encoder/StateView.d.ts +0 -34
- package/lib/encoder/StateView.js +0 -279
- package/lib/encoder/StateView.js.map +0 -1
- package/lib/encoding/assert.d.ts +0 -10
- package/lib/encoding/assert.js +0 -49
- package/lib/encoding/assert.js.map +0 -1
- package/lib/encoding/decode.d.ts +0 -67
- package/lib/encoding/decode.js +0 -217
- package/lib/encoding/decode.js.map +0 -1
- package/lib/encoding/encode.d.ts +0 -40
- package/lib/encoding/encode.js +0 -279
- package/lib/encoding/encode.js.map +0 -1
- package/lib/encoding/spec.js +0 -26
- package/lib/encoding/spec.js.map +0 -1
- package/lib/index.d.ts +0 -32
- package/lib/index.js +0 -39
- package/lib/index.js.map +0 -1
- package/lib/src/Metadata.d.ts +0 -49
- package/lib/src/Metadata.js +0 -256
- package/lib/src/Metadata.js.map +0 -1
- package/lib/src/Reflection.d.ts +0 -71
- package/lib/src/Reflection.js +0 -179
- package/lib/src/Reflection.js.map +0 -1
- package/lib/src/Schema.d.ts +0 -86
- package/lib/src/Schema.js +0 -352
- package/lib/src/Schema.js.map +0 -1
- package/lib/src/annotations.js +0 -473
- package/lib/src/annotations.js.map +0 -1
- package/lib/src/bench_encode.d.ts +0 -1
- package/lib/src/bench_encode.js +0 -91
- package/lib/src/bench_encode.js.map +0 -1
- package/lib/src/codegen/api.d.ts +0 -7
- package/lib/src/codegen/api.js +0 -56
- package/lib/src/codegen/api.js.map +0 -1
- package/lib/src/codegen/argv.d.ts +0 -6
- package/lib/src/codegen/argv.js +0 -39
- package/lib/src/codegen/argv.js.map +0 -1
- package/lib/src/codegen/cli.d.ts +0 -1
- package/lib/src/codegen/cli.js +0 -58
- package/lib/src/codegen/cli.js.map +0 -1
- package/lib/src/codegen/languages/cpp.d.ts +0 -3
- package/lib/src/codegen/languages/cpp.js +0 -258
- package/lib/src/codegen/languages/cpp.js.map +0 -1
- package/lib/src/codegen/languages/csharp.d.ts +0 -4
- package/lib/src/codegen/languages/csharp.js +0 -154
- package/lib/src/codegen/languages/csharp.js.map +0 -1
- package/lib/src/codegen/languages/haxe.d.ts +0 -3
- package/lib/src/codegen/languages/haxe.js +0 -100
- package/lib/src/codegen/languages/haxe.js.map +0 -1
- package/lib/src/codegen/languages/java.d.ts +0 -6
- package/lib/src/codegen/languages/java.js +0 -100
- package/lib/src/codegen/languages/java.js.map +0 -1
- package/lib/src/codegen/languages/js.d.ts +0 -3
- package/lib/src/codegen/languages/js.js +0 -101
- package/lib/src/codegen/languages/js.js.map +0 -1
- package/lib/src/codegen/languages/lua.d.ts +0 -3
- package/lib/src/codegen/languages/lua.js +0 -103
- package/lib/src/codegen/languages/lua.js.map +0 -1
- package/lib/src/codegen/languages/ts.d.ts +0 -3
- package/lib/src/codegen/languages/ts.js +0 -116
- package/lib/src/codegen/languages/ts.js.map +0 -1
- package/lib/src/codegen/parser.d.ts +0 -13
- package/lib/src/codegen/parser.js +0 -327
- package/lib/src/codegen/parser.js.map +0 -1
- package/lib/src/codegen/types.d.ts +0 -52
- package/lib/src/codegen/types.js +0 -142
- package/lib/src/codegen/types.js.map +0 -1
- package/lib/src/decoder/DecodeOperation.d.ts +0 -23
- package/lib/src/decoder/DecodeOperation.js +0 -248
- package/lib/src/decoder/DecodeOperation.js.map +0 -1
- package/lib/src/decoder/Decoder.js +0 -114
- package/lib/src/decoder/Decoder.js.map +0 -1
- package/lib/src/decoder/ReferenceTracker.d.ts +0 -25
- package/lib/src/decoder/ReferenceTracker.js +0 -135
- package/lib/src/decoder/ReferenceTracker.js.map +0 -1
- package/lib/src/decoder/strategy/Callbacks.d.ts +0 -154
- package/lib/src/decoder/strategy/Callbacks.js +0 -336
- package/lib/src/decoder/strategy/Callbacks.js.map +0 -1
- package/lib/src/decoder/strategy/RawChanges.d.ts +0 -3
- package/lib/src/decoder/strategy/RawChanges.js +0 -4
- package/lib/src/decoder/strategy/RawChanges.js.map +0 -1
- package/lib/src/decoder/strategy/getDecoderStateCallbacks.d.ts +0 -76
- package/lib/src/decoder/strategy/getDecoderStateCallbacks.js +0 -274
- package/lib/src/decoder/strategy/getDecoderStateCallbacks.js.map +0 -1
- package/lib/src/encoder/ChangeTree.d.ts +0 -135
- package/lib/src/encoder/ChangeTree.js +0 -534
- package/lib/src/encoder/ChangeTree.js.map +0 -1
- package/lib/src/encoder/EncodeOperation.d.ts +0 -22
- package/lib/src/encoder/EncodeOperation.js +0 -132
- package/lib/src/encoder/EncodeOperation.js.map +0 -1
- package/lib/src/encoder/Encoder.d.ts +0 -22
- package/lib/src/encoder/Encoder.js +0 -204
- package/lib/src/encoder/Encoder.js.map +0 -1
- package/lib/src/encoder/Root.js +0 -229
- package/lib/src/encoder/Root.js.map +0 -1
- package/lib/src/encoder/StateView.js +0 -279
- package/lib/src/encoder/StateView.js.map +0 -1
- package/lib/src/encoding/assert.js +0 -49
- package/lib/src/encoding/assert.js.map +0 -1
- package/lib/src/encoding/decode.js +0 -217
- package/lib/src/encoding/decode.js.map +0 -1
- package/lib/src/encoding/encode.js +0 -279
- package/lib/src/encoding/encode.js.map +0 -1
- package/lib/src/encoding/spec.d.ts +0 -24
- package/lib/src/encoding/spec.js +0 -26
- package/lib/src/encoding/spec.js.map +0 -1
- package/lib/src/index.d.ts +0 -32
- package/lib/src/index.js +0 -39
- package/lib/src/index.js.map +0 -1
- package/lib/src/symbol.shim.js +0 -3
- package/lib/src/symbol.shim.js.map +0 -1
- package/lib/src/types/HelperTypes.d.ts +0 -77
- package/lib/src/types/HelperTypes.js +0 -2
- package/lib/src/types/HelperTypes.js.map +0 -1
- package/lib/src/types/TypeContext.d.ts +0 -31
- package/lib/src/types/TypeContext.js +0 -143
- package/lib/src/types/TypeContext.js.map +0 -1
- package/lib/src/types/custom/ArraySchema.js +0 -733
- package/lib/src/types/custom/ArraySchema.js.map +0 -1
- package/lib/src/types/custom/CollectionSchema.js +0 -170
- package/lib/src/types/custom/CollectionSchema.js.map +0 -1
- package/lib/src/types/custom/MapSchema.d.ts +0 -51
- package/lib/src/types/custom/MapSchema.js +0 -222
- package/lib/src/types/custom/MapSchema.js.map +0 -1
- package/lib/src/types/custom/SetSchema.js +0 -178
- package/lib/src/types/custom/SetSchema.js.map +0 -1
- package/lib/src/types/registry.js +0 -30
- package/lib/src/types/registry.js.map +0 -1
- package/lib/src/types/symbols.js +0 -34
- package/lib/src/types/symbols.js.map +0 -1
- package/lib/src/types/utils.js +0 -13
- package/lib/src/types/utils.js.map +0 -1
- package/lib/src/utils.d.ts +0 -13
- package/lib/src/utils.js +0 -49
- package/lib/src/utils.js.map +0 -1
- package/lib/src/v3_bench.js +0 -128
- package/lib/src/v3_bench.js.map +0 -1
- package/lib/symbol.shim.d.ts +0 -6
- package/lib/symbol.shim.js +0 -3
- package/lib/symbol.shim.js.map +0 -1
- package/lib/types/HelperTypes.js +0 -2
- package/lib/types/HelperTypes.js.map +0 -1
- package/lib/types/TypeContext.js +0 -143
- package/lib/types/TypeContext.js.map +0 -1
- package/lib/types/custom/ArraySchema.d.ts +0 -270
- package/lib/types/custom/ArraySchema.js +0 -733
- package/lib/types/custom/ArraySchema.js.map +0 -1
- package/lib/types/custom/CollectionSchema.d.ts +0 -51
- package/lib/types/custom/CollectionSchema.js +0 -170
- package/lib/types/custom/CollectionSchema.js.map +0 -1
- package/lib/types/custom/MapSchema.js +0 -222
- package/lib/types/custom/MapSchema.js.map +0 -1
- package/lib/types/custom/SetSchema.d.ts +0 -48
- package/lib/types/custom/SetSchema.js +0 -178
- package/lib/types/custom/SetSchema.js.map +0 -1
- package/lib/types/registry.d.ts +0 -16
- package/lib/types/registry.js +0 -30
- package/lib/types/registry.js.map +0 -1
- package/lib/types/symbols.d.ts +0 -33
- package/lib/types/symbols.js +0 -34
- package/lib/types/symbols.js.map +0 -1
- package/lib/types/utils.d.ts +0 -1
- package/lib/types/utils.js +0 -13
- package/lib/types/utils.js.map +0 -1
- package/lib/utils.js +0 -49
- package/lib/utils.js.map +0 -1
- package/lib/v3_bench.d.ts +0 -1
- package/lib/v3_bench.js +0 -128
- package/lib/v3_bench.js.map +0 -1
- /package/{lib → build}/codegen/api.d.ts +0 -0
- /package/{lib → build}/codegen/argv.d.ts +0 -0
- /package/{lib → build}/codegen/cli.d.ts +0 -0
- /package/{lib → build}/codegen/types.d.ts +0 -0
- /package/{lib → build}/encoding/spec.d.ts +0 -0
- /package/{lib/src → build}/symbol.shim.d.ts +0 -0
- /package/{lib/src → build}/types/symbols.d.ts +0 -0
- /package/{lib/src → build}/types/utils.d.ts +0 -0
- /package/{lib/src → build}/v3_bench.d.ts +0 -0
package/lib/src/codegen/types.js
DELETED
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
import * as fs from "fs";
|
|
2
|
-
import * as path from "path";
|
|
3
|
-
if (typeof (__dirname) === "undefined") {
|
|
4
|
-
global.__dirname = path.dirname(new URL(import.meta.url).pathname);
|
|
5
|
-
}
|
|
6
|
-
const VERSION = JSON.parse(fs.readFileSync(__dirname + "/../../package.json").toString()).version;
|
|
7
|
-
const COMMENT_HEADER = `
|
|
8
|
-
THIS FILE HAS BEEN GENERATED AUTOMATICALLY
|
|
9
|
-
DO NOT CHANGE IT MANUALLY UNLESS YOU KNOW WHAT YOU'RE DOING
|
|
10
|
-
|
|
11
|
-
GENERATED USING @colyseus/schema ${VERSION}
|
|
12
|
-
`;
|
|
13
|
-
export function getCommentHeader(singleLineComment = "//") {
|
|
14
|
-
return `${COMMENT_HEADER.split("\n").map(line => `${singleLineComment} ${line}`).join("\n")}`;
|
|
15
|
-
}
|
|
16
|
-
export class Context {
|
|
17
|
-
constructor() {
|
|
18
|
-
this.classes = [];
|
|
19
|
-
this.interfaces = [];
|
|
20
|
-
this.enums = [];
|
|
21
|
-
}
|
|
22
|
-
getStructures() {
|
|
23
|
-
return {
|
|
24
|
-
classes: this.classes.filter(klass => {
|
|
25
|
-
if (this.isSchemaClass(klass)) {
|
|
26
|
-
return true;
|
|
27
|
-
}
|
|
28
|
-
else {
|
|
29
|
-
let parentClass = klass;
|
|
30
|
-
while (parentClass = this.getParentClass(parentClass)) {
|
|
31
|
-
if (this.isSchemaClass(parentClass)) {
|
|
32
|
-
return true;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
return false;
|
|
37
|
-
}),
|
|
38
|
-
interfaces: this.interfaces,
|
|
39
|
-
enums: this.enums,
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
addStructure(structure) {
|
|
43
|
-
if (structure.context === this) {
|
|
44
|
-
return;
|
|
45
|
-
} // skip if already added.
|
|
46
|
-
structure.context = this;
|
|
47
|
-
if (structure instanceof Class) {
|
|
48
|
-
this.classes.push(structure);
|
|
49
|
-
}
|
|
50
|
-
else if (structure instanceof Interface) {
|
|
51
|
-
this.interfaces.push(structure);
|
|
52
|
-
}
|
|
53
|
-
else if (structure instanceof Enum) {
|
|
54
|
-
this.enums.push(structure);
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
getParentClass(klass) {
|
|
58
|
-
return this.classes.find(c => c.name === klass.extends);
|
|
59
|
-
}
|
|
60
|
-
isSchemaClass(klass) {
|
|
61
|
-
let isSchema = false;
|
|
62
|
-
let currentClass = klass;
|
|
63
|
-
while (!isSchema && currentClass) {
|
|
64
|
-
//
|
|
65
|
-
// TODO: ideally we should check for actual @colyseus/schema module
|
|
66
|
-
// reference rather than arbitrary strings.
|
|
67
|
-
//
|
|
68
|
-
isSchema = (currentClass.extends === "Schema" ||
|
|
69
|
-
currentClass.extends === "schema.Schema" ||
|
|
70
|
-
currentClass.extends === "Schema.Schema");
|
|
71
|
-
//
|
|
72
|
-
// When extending from `schema.Schema`, it is required to
|
|
73
|
-
// normalize as "Schema" for code generation.
|
|
74
|
-
//
|
|
75
|
-
if (currentClass === klass && isSchema) {
|
|
76
|
-
klass.extends = "Schema";
|
|
77
|
-
}
|
|
78
|
-
currentClass = this.getParentClass(currentClass);
|
|
79
|
-
}
|
|
80
|
-
return isSchema;
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
export class Interface {
|
|
84
|
-
constructor() {
|
|
85
|
-
this.properties = [];
|
|
86
|
-
}
|
|
87
|
-
addProperty(property) {
|
|
88
|
-
if (property.type.indexOf("[]") >= 0) {
|
|
89
|
-
// is array!
|
|
90
|
-
property.childType = property.type.match(/([^\[]+)/i)[1];
|
|
91
|
-
property.type = "array";
|
|
92
|
-
this.properties.push(property);
|
|
93
|
-
}
|
|
94
|
-
else {
|
|
95
|
-
this.properties.push(property);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
export class Class {
|
|
100
|
-
constructor() {
|
|
101
|
-
this.properties = [];
|
|
102
|
-
}
|
|
103
|
-
addProperty(property) {
|
|
104
|
-
property.index = this.properties.length;
|
|
105
|
-
this.properties.push(property);
|
|
106
|
-
}
|
|
107
|
-
postProcessing() {
|
|
108
|
-
/**
|
|
109
|
-
* Ensure the proprierties `index` are correct using inheritance
|
|
110
|
-
*/
|
|
111
|
-
let parentKlass = this;
|
|
112
|
-
while (parentKlass &&
|
|
113
|
-
(parentKlass = this.context.classes.find(k => k.name === parentKlass.extends))) {
|
|
114
|
-
this.properties.forEach(prop => {
|
|
115
|
-
prop.index += parentKlass.properties.length;
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
export class Enum {
|
|
121
|
-
constructor() {
|
|
122
|
-
this.properties = [];
|
|
123
|
-
}
|
|
124
|
-
addProperty(property) {
|
|
125
|
-
this.properties.push(property);
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
export class Property {
|
|
129
|
-
}
|
|
130
|
-
export function getInheritanceTree(klass, allClasses, includeSelf = true) {
|
|
131
|
-
let currentClass = klass;
|
|
132
|
-
let inheritanceTree = [];
|
|
133
|
-
if (includeSelf) {
|
|
134
|
-
inheritanceTree.push(currentClass);
|
|
135
|
-
}
|
|
136
|
-
while (currentClass.extends !== "Schema") {
|
|
137
|
-
currentClass = allClasses.find(klass => klass.name == currentClass.extends);
|
|
138
|
-
inheritanceTree.push(currentClass);
|
|
139
|
-
}
|
|
140
|
-
return inheritanceTree;
|
|
141
|
-
}
|
|
142
|
-
//# sourceMappingURL=types.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/codegen/types.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from \"fs\";\nimport * as path from \"path\";\n\nif (typeof(__dirname) === \"undefined\") {\n global.__dirname = path.dirname(new URL(import.meta.url).pathname);\n}\n\nconst VERSION = JSON.parse(fs.readFileSync(__dirname + \"/../../package.json\").toString()).version;\nconst COMMENT_HEADER = `\nTHIS FILE HAS BEEN GENERATED AUTOMATICALLY\nDO NOT CHANGE IT MANUALLY UNLESS YOU KNOW WHAT YOU'RE DOING\n\nGENERATED USING @colyseus/schema ${VERSION}\n`;\n\nexport function getCommentHeader(singleLineComment: string = \"//\") {\n return `${COMMENT_HEADER.split(\"\\n\").map(line => `${singleLineComment} ${line}`).join(\"\\n\")}`;\n}\n\nexport class Context {\n classes: Class[] = [];\n interfaces: Interface[] = [];\n enums: Enum[] = [];\n\n getStructures() {\n return {\n classes: this.classes.filter(klass => {\n if (this.isSchemaClass(klass)) {\n return true;\n\n } else {\n let parentClass = klass;\n while (parentClass = this.getParentClass(parentClass)) {\n if (this.isSchemaClass(parentClass)) {\n return true;\n }\n }\n }\n return false;\n }),\n interfaces: this.interfaces,\n enums: this.enums,\n };\n }\n\n addStructure(structure: IStructure) {\n if (structure.context === this) { return; } // skip if already added.\n structure.context = this;\n\n if (structure instanceof Class) {\n this.classes.push(structure);\n } else if (structure instanceof Interface) {\n this.interfaces.push(structure);\n } else if (structure instanceof Enum) {\n this.enums.push(structure);\n }\n }\n\n private getParentClass(klass: Class) {\n return this.classes.find(c => c.name === klass.extends);\n }\n\n private isSchemaClass(klass: Class) {\n let isSchema: boolean = false;\n\n let currentClass = klass;\n while (!isSchema && currentClass) {\n //\n // TODO: ideally we should check for actual @colyseus/schema module\n // reference rather than arbitrary strings.\n //\n isSchema = (\n currentClass.extends === \"Schema\" ||\n currentClass.extends === \"schema.Schema\" ||\n currentClass.extends === \"Schema.Schema\"\n );\n\n //\n // When extending from `schema.Schema`, it is required to\n // normalize as \"Schema\" for code generation.\n //\n if (currentClass === klass && isSchema) {\n klass.extends = \"Schema\";\n }\n\n currentClass = this.getParentClass(currentClass);\n }\n\n return isSchema;\n }\n}\n\nexport interface IStructure {\n context: Context;\n name: string;\n properties: Property[];\n addProperty(property: Property): void;\n}\n\nexport class Interface implements IStructure {\n context: Context;\n name: string;\n properties: Property[] = [];\n\n addProperty(property: Property): void {\n if (property.type.indexOf(\"[]\") >= 0) {\n // is array!\n property.childType = property.type.match(/([^\\[]+)/i)[1];\n property.type = \"array\";\n this.properties.push(property);\n\n } else {\n this.properties.push(property);\n }\n }\n}\n\nexport class Class implements IStructure {\n context: Context;\n name: string;\n properties: Property[] = [];\n extends: string;\n\n addProperty(property: Property) {\n property.index = this.properties.length;\n this.properties.push(property);\n }\n\n postProcessing() {\n /**\n * Ensure the proprierties `index` are correct using inheritance\n */\n let parentKlass: Class = this;\n\n while (\n parentKlass &&\n (parentKlass = this.context.classes.find(k => k.name === parentKlass.extends))\n ) {\n this.properties.forEach(prop => {\n prop.index += parentKlass.properties.length;\n });\n }\n }\n}\n\nexport class Enum implements IStructure {\n context: Context;\n name: string;\n properties: Property[] = [];\n\n addProperty(property: Property) {\n this.properties.push(property);\n }\n}\n\nexport class Property {\n index: number;\n name: string;\n type: string;\n childType: string;\n deprecated?: boolean;\n}\n\nexport interface File {\n name: string\n content: string;\n}\n\nexport function getInheritanceTree(klass: Class, allClasses: Class[], includeSelf: boolean = true) {\n let currentClass = klass;\n let inheritanceTree: Class[] = [];\n\n if (includeSelf) {\n inheritanceTree.push(currentClass);\n }\n\n while (currentClass.extends !== \"Schema\") {\n currentClass = allClasses.find(klass => klass.name == currentClass.extends);\n inheritanceTree.push(currentClass);\n }\n\n return inheritanceTree;\n}\n"]}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { OPERATION } from "../encoding/spec";
|
|
2
|
-
import { Schema } from "../Schema";
|
|
3
|
-
import type { Ref } from "../encoder/ChangeTree";
|
|
4
|
-
import type { Decoder } from "./Decoder";
|
|
5
|
-
import { Iterator } from "../encoding/decode";
|
|
6
|
-
export interface DataChange<T = any, F = string> {
|
|
7
|
-
ref: Ref;
|
|
8
|
-
refId: number;
|
|
9
|
-
op: OPERATION;
|
|
10
|
-
field: F;
|
|
11
|
-
dynamicIndex?: number | string;
|
|
12
|
-
value: T;
|
|
13
|
-
previousValue: T;
|
|
14
|
-
}
|
|
15
|
-
export declare const DEFINITION_MISMATCH = -1;
|
|
16
|
-
export type DecodeOperation<T extends Schema = any> = (decoder: Decoder<T>, bytes: Uint8Array, it: Iterator, ref: Ref, allChanges: DataChange[]) => number | void;
|
|
17
|
-
export declare function decodeValue<T extends Ref>(decoder: Decoder, operation: OPERATION, ref: T, index: number, type: any, bytes: Uint8Array, it: Iterator, allChanges: DataChange[]): {
|
|
18
|
-
value: any;
|
|
19
|
-
previousValue: T;
|
|
20
|
-
};
|
|
21
|
-
export declare const decodeSchemaOperation: DecodeOperation;
|
|
22
|
-
export declare const decodeKeyValueOperation: DecodeOperation;
|
|
23
|
-
export declare const decodeArray: DecodeOperation;
|
|
@@ -1,248 +0,0 @@
|
|
|
1
|
-
import { OPERATION } from "../encoding/spec";
|
|
2
|
-
import { Schema } from "../Schema";
|
|
3
|
-
import { decode } from "../encoding/decode";
|
|
4
|
-
import { $childType, $deleteByIndex, $getByIndex, $refId } from "../types/symbols";
|
|
5
|
-
import { getType } from "../types/registry";
|
|
6
|
-
export const DEFINITION_MISMATCH = -1;
|
|
7
|
-
export function decodeValue(decoder, operation, ref, index, type, bytes, it, allChanges) {
|
|
8
|
-
const $root = decoder.root;
|
|
9
|
-
const previousValue = ref[$getByIndex](index);
|
|
10
|
-
let value;
|
|
11
|
-
if ((operation & OPERATION.DELETE) === OPERATION.DELETE) {
|
|
12
|
-
// Flag `refId` for garbage collection.
|
|
13
|
-
const previousRefId = previousValue?.[$refId];
|
|
14
|
-
if (previousRefId !== undefined) {
|
|
15
|
-
$root.removeRef(previousRefId);
|
|
16
|
-
}
|
|
17
|
-
//
|
|
18
|
-
// Delete operations
|
|
19
|
-
//
|
|
20
|
-
if (operation !== OPERATION.DELETE_AND_ADD) {
|
|
21
|
-
ref[$deleteByIndex](index);
|
|
22
|
-
}
|
|
23
|
-
value = undefined;
|
|
24
|
-
}
|
|
25
|
-
if (operation === OPERATION.DELETE) {
|
|
26
|
-
//
|
|
27
|
-
// Don't do anything
|
|
28
|
-
//
|
|
29
|
-
}
|
|
30
|
-
else if (Schema.is(type)) {
|
|
31
|
-
const refId = decode.number(bytes, it);
|
|
32
|
-
value = $root.refs.get(refId);
|
|
33
|
-
if ((operation & OPERATION.ADD) === OPERATION.ADD) {
|
|
34
|
-
const childType = decoder.getInstanceType(bytes, it, type);
|
|
35
|
-
if (!value) {
|
|
36
|
-
value = decoder.createInstanceOfType(childType);
|
|
37
|
-
}
|
|
38
|
-
$root.addRef(refId, value, (value !== previousValue || // increment ref count if value has changed
|
|
39
|
-
(operation === OPERATION.DELETE_AND_ADD && value === previousValue) // increment ref count if the same instance is being added again
|
|
40
|
-
));
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
else if (typeof (type) === "string") {
|
|
44
|
-
//
|
|
45
|
-
// primitive value (number, string, boolean, etc)
|
|
46
|
-
//
|
|
47
|
-
value = decode[type](bytes, it);
|
|
48
|
-
}
|
|
49
|
-
else {
|
|
50
|
-
const typeDef = getType(Object.keys(type)[0]);
|
|
51
|
-
const refId = decode.number(bytes, it);
|
|
52
|
-
const valueRef = ($root.refs.has(refId))
|
|
53
|
-
? previousValue || $root.refs.get(refId)
|
|
54
|
-
: new typeDef.constructor();
|
|
55
|
-
value = valueRef.clone(true);
|
|
56
|
-
value[$childType] = Object.values(type)[0]; // cache childType for ArraySchema and MapSchema
|
|
57
|
-
if (previousValue) {
|
|
58
|
-
let previousRefId = previousValue[$refId];
|
|
59
|
-
if (previousRefId !== undefined && refId !== previousRefId) {
|
|
60
|
-
//
|
|
61
|
-
// enqueue onRemove if structure has been replaced.
|
|
62
|
-
//
|
|
63
|
-
const entries = previousValue.entries();
|
|
64
|
-
let iter;
|
|
65
|
-
while ((iter = entries.next()) && !iter.done) {
|
|
66
|
-
const [key, value] = iter.value;
|
|
67
|
-
// if value is a schema, remove its reference
|
|
68
|
-
if (typeof (value) === "object") {
|
|
69
|
-
previousRefId = value[$refId];
|
|
70
|
-
$root.removeRef(previousRefId);
|
|
71
|
-
}
|
|
72
|
-
allChanges.push({
|
|
73
|
-
ref: previousValue,
|
|
74
|
-
refId: previousRefId,
|
|
75
|
-
op: OPERATION.DELETE,
|
|
76
|
-
field: key,
|
|
77
|
-
value: undefined,
|
|
78
|
-
previousValue: value,
|
|
79
|
-
});
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
$root.addRef(refId, value, (valueRef !== previousValue ||
|
|
84
|
-
(operation === OPERATION.DELETE_AND_ADD && valueRef === previousValue)));
|
|
85
|
-
}
|
|
86
|
-
return { value, previousValue };
|
|
87
|
-
}
|
|
88
|
-
export const decodeSchemaOperation = function (decoder, bytes, it, ref, allChanges) {
|
|
89
|
-
const first_byte = bytes[it.offset++];
|
|
90
|
-
const metadata = ref.constructor[Symbol.metadata];
|
|
91
|
-
// "compressed" index + operation
|
|
92
|
-
const operation = (first_byte >> 6) << 6;
|
|
93
|
-
const index = first_byte % (operation || 255);
|
|
94
|
-
// skip early if field is not defined
|
|
95
|
-
const field = metadata[index];
|
|
96
|
-
if (field === undefined) {
|
|
97
|
-
console.warn("@colyseus/schema: field not defined at", { index, ref: ref.constructor.name, metadata });
|
|
98
|
-
return DEFINITION_MISMATCH;
|
|
99
|
-
}
|
|
100
|
-
const { value, previousValue } = decodeValue(decoder, operation, ref, index, field.type, bytes, it, allChanges);
|
|
101
|
-
if (value !== null && value !== undefined) {
|
|
102
|
-
ref[field.name] = value;
|
|
103
|
-
}
|
|
104
|
-
// add change
|
|
105
|
-
if (previousValue !== value) {
|
|
106
|
-
allChanges.push({
|
|
107
|
-
ref,
|
|
108
|
-
refId: decoder.currentRefId,
|
|
109
|
-
op: operation,
|
|
110
|
-
field: field.name,
|
|
111
|
-
value,
|
|
112
|
-
previousValue,
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
};
|
|
116
|
-
export const decodeKeyValueOperation = function (decoder, bytes, it, ref, allChanges) {
|
|
117
|
-
// "uncompressed" index + operation (array/map items)
|
|
118
|
-
const operation = bytes[it.offset++];
|
|
119
|
-
if (operation === OPERATION.CLEAR) {
|
|
120
|
-
//
|
|
121
|
-
// When decoding:
|
|
122
|
-
// - enqueue items for DELETE callback.
|
|
123
|
-
// - flag child items for garbage collection.
|
|
124
|
-
//
|
|
125
|
-
decoder.removeChildRefs(ref, allChanges);
|
|
126
|
-
ref.clear();
|
|
127
|
-
return;
|
|
128
|
-
}
|
|
129
|
-
const index = decode.number(bytes, it);
|
|
130
|
-
const type = ref[$childType];
|
|
131
|
-
let dynamicIndex;
|
|
132
|
-
if ((operation & OPERATION.ADD) === OPERATION.ADD) { // ADD or DELETE_AND_ADD
|
|
133
|
-
if (typeof (ref['set']) === "function") {
|
|
134
|
-
dynamicIndex = decode.string(bytes, it); // MapSchema
|
|
135
|
-
ref['setIndex'](index, dynamicIndex);
|
|
136
|
-
}
|
|
137
|
-
else {
|
|
138
|
-
dynamicIndex = index; // ArraySchema
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
else {
|
|
142
|
-
// get dynamic index from "ref"
|
|
143
|
-
dynamicIndex = ref['getIndex'](index);
|
|
144
|
-
}
|
|
145
|
-
const { value, previousValue } = decodeValue(decoder, operation, ref, index, type, bytes, it, allChanges);
|
|
146
|
-
if (value !== null && value !== undefined) {
|
|
147
|
-
if (typeof (ref['set']) === "function") {
|
|
148
|
-
// MapSchema
|
|
149
|
-
ref['$items'].set(dynamicIndex, value);
|
|
150
|
-
}
|
|
151
|
-
else if (typeof (ref['$setAt']) === "function") {
|
|
152
|
-
// ArraySchema
|
|
153
|
-
ref['$setAt'](index, value, operation);
|
|
154
|
-
}
|
|
155
|
-
else if (typeof (ref['add']) === "function") {
|
|
156
|
-
// CollectionSchema && SetSchema
|
|
157
|
-
const index = ref.add(value);
|
|
158
|
-
if (typeof (index) === "number") {
|
|
159
|
-
ref['setIndex'](index, index);
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
// add change
|
|
164
|
-
if (previousValue !== value) {
|
|
165
|
-
allChanges.push({
|
|
166
|
-
ref,
|
|
167
|
-
refId: decoder.currentRefId,
|
|
168
|
-
op: operation,
|
|
169
|
-
field: "", // FIXME: remove this
|
|
170
|
-
dynamicIndex,
|
|
171
|
-
value,
|
|
172
|
-
previousValue,
|
|
173
|
-
});
|
|
174
|
-
}
|
|
175
|
-
};
|
|
176
|
-
export const decodeArray = function (decoder, bytes, it, ref, allChanges) {
|
|
177
|
-
// "uncompressed" index + operation (array/map items)
|
|
178
|
-
let operation = bytes[it.offset++];
|
|
179
|
-
let index;
|
|
180
|
-
if (operation === OPERATION.CLEAR) {
|
|
181
|
-
//
|
|
182
|
-
// When decoding:
|
|
183
|
-
// - enqueue items for DELETE callback.
|
|
184
|
-
// - flag child items for garbage collection.
|
|
185
|
-
//
|
|
186
|
-
decoder.removeChildRefs(ref, allChanges);
|
|
187
|
-
ref.clear();
|
|
188
|
-
return;
|
|
189
|
-
}
|
|
190
|
-
else if (operation === OPERATION.REVERSE) {
|
|
191
|
-
ref.reverse();
|
|
192
|
-
return;
|
|
193
|
-
}
|
|
194
|
-
else if (operation === OPERATION.DELETE_BY_REFID) {
|
|
195
|
-
// TODO: refactor here, try to follow same flow as below
|
|
196
|
-
const refId = decode.number(bytes, it);
|
|
197
|
-
const previousValue = decoder.root.refs.get(refId);
|
|
198
|
-
index = ref.findIndex((value) => value === previousValue);
|
|
199
|
-
ref[$deleteByIndex](index);
|
|
200
|
-
allChanges.push({
|
|
201
|
-
ref,
|
|
202
|
-
refId: decoder.currentRefId,
|
|
203
|
-
op: OPERATION.DELETE,
|
|
204
|
-
field: "", // FIXME: remove this
|
|
205
|
-
dynamicIndex: index,
|
|
206
|
-
value: undefined,
|
|
207
|
-
previousValue,
|
|
208
|
-
});
|
|
209
|
-
return;
|
|
210
|
-
}
|
|
211
|
-
else if (operation === OPERATION.ADD_BY_REFID) {
|
|
212
|
-
const refId = decode.number(bytes, it);
|
|
213
|
-
const itemByRefId = decoder.root.refs.get(refId);
|
|
214
|
-
// if item already exists, use existing index
|
|
215
|
-
if (itemByRefId) {
|
|
216
|
-
index = ref.findIndex((value) => value === itemByRefId);
|
|
217
|
-
}
|
|
218
|
-
// fallback to use last index
|
|
219
|
-
if (index === -1 || index === undefined) {
|
|
220
|
-
index = ref.length;
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
else {
|
|
224
|
-
index = decode.number(bytes, it);
|
|
225
|
-
}
|
|
226
|
-
const type = ref[$childType];
|
|
227
|
-
let dynamicIndex = index;
|
|
228
|
-
const { value, previousValue } = decodeValue(decoder, operation, ref, index, type, bytes, it, allChanges);
|
|
229
|
-
if (value !== null && value !== undefined &&
|
|
230
|
-
value !== previousValue // avoid setting same value twice (if index === 0 it will result in a "unshift" for ArraySchema)
|
|
231
|
-
) {
|
|
232
|
-
// ArraySchema
|
|
233
|
-
ref['$setAt'](index, value, operation);
|
|
234
|
-
}
|
|
235
|
-
// add change
|
|
236
|
-
if (previousValue !== value) {
|
|
237
|
-
allChanges.push({
|
|
238
|
-
ref,
|
|
239
|
-
refId: decoder.currentRefId,
|
|
240
|
-
op: operation,
|
|
241
|
-
field: "", // FIXME: remove this
|
|
242
|
-
dynamicIndex,
|
|
243
|
-
value,
|
|
244
|
-
previousValue,
|
|
245
|
-
});
|
|
246
|
-
}
|
|
247
|
-
};
|
|
248
|
-
//# sourceMappingURL=DecodeOperation.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DecodeOperation.js","sourceRoot":"","sources":["../../../src/decoder/DecodeOperation.ts"],"names":[],"mappings":"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","sourcesContent":["import { OPERATION } from \"../encoding/spec\";\nimport { Metadata } from \"../Metadata\";\nimport { Schema } from \"../Schema\";\nimport type { Ref } from \"../encoder/ChangeTree\";\nimport type { Decoder } from \"./Decoder\";\nimport { Iterator, decode } from \"../encoding/decode\";\nimport { $childType, $deleteByIndex, $getByIndex, $refId } from \"../types/symbols\";\n\nimport type { MapSchema } from \"../types/custom/MapSchema\";\nimport type { ArraySchema } from \"../types/custom/ArraySchema\";\nimport type { CollectionSchema } from \"../types/custom/CollectionSchema\";\n\nimport { getType } from \"../types/registry\";\nimport { Collection } from \"../types/HelperTypes\";\n\nexport interface DataChange<T = any, F = string> {\n ref: Ref,\n refId: number,\n op: OPERATION,\n field: F;\n dynamicIndex?: number | string;\n value: T;\n previousValue: T;\n}\n\nexport const DEFINITION_MISMATCH = -1;\n\nexport type DecodeOperation<T extends Schema = any> = (\n decoder: Decoder<T>,\n bytes: Uint8Array,\n it: Iterator,\n ref: Ref,\n allChanges: DataChange[],\n) => number | void;\n\nexport function decodeValue<T extends Ref>(\n decoder: Decoder,\n operation: OPERATION,\n ref: T,\n index: number,\n type: any,\n bytes: Uint8Array,\n it: Iterator,\n allChanges: DataChange[],\n) {\n const $root = decoder.root;\n const previousValue = (ref as any)[$getByIndex](index) as T;\n\n let value: any;\n\n if ((operation & OPERATION.DELETE) === OPERATION.DELETE)\n {\n // Flag `refId` for garbage collection.\n const previousRefId = previousValue?.[$refId];\n if (previousRefId !== undefined) { $root.removeRef(previousRefId); }\n\n //\n // Delete operations\n //\n if (operation !== OPERATION.DELETE_AND_ADD) {\n (ref as any)[$deleteByIndex](index);\n }\n\n value = undefined;\n }\n\n if (operation === OPERATION.DELETE) {\n //\n // Don't do anything\n //\n\n } else if (Schema.is(type)) {\n const refId = decode.number(bytes, it);\n value = $root.refs.get(refId);\n\n if ((operation & OPERATION.ADD) === OPERATION.ADD) {\n const childType = decoder.getInstanceType(bytes, it, type);\n if (!value) {\n value = decoder.createInstanceOfType(childType);\n }\n\n $root.addRef(\n refId,\n value,\n (\n value !== previousValue || // increment ref count if value has changed\n (operation === OPERATION.DELETE_AND_ADD && value === previousValue) // increment ref count if the same instance is being added again\n )\n );\n }\n\n } else if (typeof(type) === \"string\") {\n //\n // primitive value (number, string, boolean, etc)\n //\n value = (decode as any)[type](bytes, it);\n\n } else {\n const typeDef = getType(Object.keys(type)[0]);\n const refId = decode.number(bytes, it);\n\n const valueRef: Ref = ($root.refs.has(refId))\n ? previousValue || $root.refs.get(refId)\n : new typeDef.constructor();\n\n value = valueRef.clone(true);\n value[$childType] = Object.values(type)[0]; // cache childType for ArraySchema and MapSchema\n\n if (previousValue) {\n let previousRefId = previousValue[$refId];\n\n if (previousRefId !== undefined && refId !== previousRefId) {\n //\n // enqueue onRemove if structure has been replaced.\n //\n const entries: IterableIterator<[any, any]> = (previousValue as any).entries();\n let iter: IteratorResult<[any, any]>;\n while ((iter = entries.next()) && !iter.done) {\n const [key, value] = iter.value;\n\n // if value is a schema, remove its reference\n if (typeof(value) === \"object\") {\n previousRefId = value[$refId];\n $root.removeRef(previousRefId);\n }\n\n allChanges.push({\n ref: previousValue,\n refId: previousRefId,\n op: OPERATION.DELETE,\n field: key,\n value: undefined,\n previousValue: value,\n });\n }\n\n }\n }\n\n $root.addRef(refId, value, (\n valueRef !== previousValue ||\n (operation === OPERATION.DELETE_AND_ADD && valueRef === previousValue)\n ));\n }\n\n return { value, previousValue };\n}\n\nexport const decodeSchemaOperation: DecodeOperation = function <T extends Schema>(\n decoder: Decoder<any>,\n bytes: Uint8Array,\n it: Iterator,\n ref: T,\n allChanges: DataChange[],\n) {\n const first_byte = bytes[it.offset++];\n const metadata: Metadata = (ref.constructor as typeof Schema)[Symbol.metadata];\n\n // \"compressed\" index + operation\n const operation = (first_byte >> 6) << 6\n const index = first_byte % (operation || 255);\n\n // skip early if field is not defined\n const field = metadata[index];\n if (field === undefined) {\n console.warn(\"@colyseus/schema: field not defined at\", { index, ref: ref.constructor.name, metadata });\n return DEFINITION_MISMATCH;\n }\n\n const { value, previousValue } = decodeValue(\n decoder,\n operation,\n ref,\n index,\n field.type,\n bytes,\n it,\n allChanges,\n );\n\n if (value !== null && value !== undefined) {\n ref[field.name as keyof T] = value;\n }\n\n // add change\n if (previousValue !== value) {\n allChanges.push({\n ref,\n refId: decoder.currentRefId,\n op: operation,\n field: field.name,\n value,\n previousValue,\n });\n }\n}\n\nexport const decodeKeyValueOperation: DecodeOperation = function (\n decoder: Decoder<any>,\n bytes: Uint8Array,\n it: Iterator,\n ref: Ref,\n allChanges: DataChange[]\n) {\n // \"uncompressed\" index + operation (array/map items)\n const operation = bytes[it.offset++];\n\n if (operation === OPERATION.CLEAR) {\n //\n // When decoding:\n // - enqueue items for DELETE callback.\n // - flag child items for garbage collection.\n //\n decoder.removeChildRefs(ref as unknown as Collection, allChanges);\n\n (ref as any).clear();\n return;\n }\n\n const index = decode.number(bytes, it);\n const type = (ref as any)[$childType];\n\n let dynamicIndex: number | string;\n\n if ((operation & OPERATION.ADD) === OPERATION.ADD) { // ADD or DELETE_AND_ADD\n if (typeof((ref as any)['set']) === \"function\") {\n dynamicIndex = decode.string(bytes, it); // MapSchema\n (ref as any)['setIndex'](index, dynamicIndex);\n } else {\n dynamicIndex = index; // ArraySchema\n }\n } else {\n // get dynamic index from \"ref\"\n dynamicIndex = (ref as any)['getIndex'](index);\n }\n\n const { value, previousValue } = decodeValue(\n decoder,\n operation,\n ref,\n index,\n type,\n bytes,\n it,\n allChanges,\n );\n\n if (value !== null && value !== undefined) {\n if (typeof((ref as any)['set']) === \"function\") {\n // MapSchema\n (ref as any)['$items'].set(dynamicIndex as string, value);\n\n } else if (typeof((ref as any)['$setAt']) === \"function\") {\n // ArraySchema\n (ref as any)['$setAt'](index, value, operation);\n\n } else if (typeof((ref as any)['add']) === \"function\") {\n // CollectionSchema && SetSchema\n const index = (ref as any).add(value);\n\n if (typeof(index) === \"number\") {\n (ref as any)['setIndex'](index, index);\n }\n }\n }\n\n // add change\n if (previousValue !== value) {\n allChanges.push({\n ref,\n refId: decoder.currentRefId,\n op: operation,\n field: \"\", // FIXME: remove this\n dynamicIndex,\n value,\n previousValue,\n });\n }\n}\n\nexport const decodeArray: DecodeOperation = function (\n decoder: Decoder<any>,\n bytes: Uint8Array,\n it: Iterator,\n ref: ArraySchema,\n allChanges: DataChange[]\n) {\n // \"uncompressed\" index + operation (array/map items)\n let operation = bytes[it.offset++];\n let index: number;\n\n if (operation === OPERATION.CLEAR) {\n //\n // When decoding:\n // - enqueue items for DELETE callback.\n // - flag child items for garbage collection.\n //\n decoder.removeChildRefs(ref as unknown as Collection, allChanges);\n (ref as ArraySchema).clear();\n return;\n\n } else if (operation === OPERATION.REVERSE) {\n (ref as ArraySchema).reverse();\n return;\n\n } else if (operation === OPERATION.DELETE_BY_REFID) {\n // TODO: refactor here, try to follow same flow as below\n const refId = decode.number(bytes, it);\n const previousValue = decoder.root.refs.get(refId);\n index = ref.findIndex((value) => value === previousValue);\n ref[$deleteByIndex](index);\n allChanges.push({\n ref,\n refId: decoder.currentRefId,\n op: OPERATION.DELETE,\n field: \"\", // FIXME: remove this\n dynamicIndex: index,\n value: undefined,\n previousValue,\n });\n\n return;\n\n } else if (operation === OPERATION.ADD_BY_REFID) {\n const refId = decode.number(bytes, it);\n const itemByRefId = decoder.root.refs.get(refId);\n\n // if item already exists, use existing index\n if (itemByRefId) {\n index = ref.findIndex((value) => value === itemByRefId);\n }\n\n // fallback to use last index\n if (index === -1 || index === undefined) {\n index = ref.length;\n }\n\n } else {\n index = decode.number(bytes, it);\n }\n\n const type = ref[$childType];\n\n let dynamicIndex: number | string = index;\n\n const { value, previousValue } = decodeValue(\n decoder,\n operation,\n ref,\n index,\n type,\n bytes,\n it,\n allChanges,\n );\n\n if (\n value !== null && value !== undefined &&\n value !== previousValue // avoid setting same value twice (if index === 0 it will result in a \"unshift\" for ArraySchema)\n ) {\n // ArraySchema\n (ref as ArraySchema)['$setAt'](index, value, operation);\n }\n\n // add change\n if (previousValue !== value) {\n allChanges.push({\n ref,\n refId: decoder.currentRefId,\n op: operation,\n field: \"\", // FIXME: remove this\n dynamicIndex,\n value,\n previousValue,\n });\n }\n}"]}
|
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
import { TypeContext } from "../types/TypeContext";
|
|
2
|
-
import { $childType, $decoder, $onDecodeEnd, $refId } from "../types/symbols";
|
|
3
|
-
import { decode } from "../encoding/decode";
|
|
4
|
-
import { OPERATION, SWITCH_TO_STRUCTURE, TYPE_ID } from '../encoding/spec';
|
|
5
|
-
import { ReferenceTracker } from "./ReferenceTracker";
|
|
6
|
-
import { DEFINITION_MISMATCH } from "./DecodeOperation";
|
|
7
|
-
export class Decoder {
|
|
8
|
-
constructor(root, context) {
|
|
9
|
-
this.currentRefId = 0;
|
|
10
|
-
this.setState(root);
|
|
11
|
-
this.context = context || new TypeContext(root.constructor);
|
|
12
|
-
// console.log(">>>>>>>>>>>>>>>> Decoder types");
|
|
13
|
-
// this.context.schemas.forEach((id, schema) => {
|
|
14
|
-
// console.log("type:", id, schema.name, Object.keys(schema[Symbol.metadata]));
|
|
15
|
-
// });
|
|
16
|
-
}
|
|
17
|
-
setState(root) {
|
|
18
|
-
this.state = root;
|
|
19
|
-
this.root = new ReferenceTracker();
|
|
20
|
-
this.root.addRef(0, root);
|
|
21
|
-
}
|
|
22
|
-
decode(bytes, it = { offset: 0 }, ref = this.state) {
|
|
23
|
-
const allChanges = [];
|
|
24
|
-
const $root = this.root;
|
|
25
|
-
const totalBytes = bytes.byteLength;
|
|
26
|
-
let decoder = ref['constructor'][$decoder];
|
|
27
|
-
this.currentRefId = 0;
|
|
28
|
-
while (it.offset < totalBytes) {
|
|
29
|
-
//
|
|
30
|
-
// Peek ahead, check if it's a switch to a different structure
|
|
31
|
-
//
|
|
32
|
-
if (bytes[it.offset] == SWITCH_TO_STRUCTURE) {
|
|
33
|
-
it.offset++;
|
|
34
|
-
ref[$onDecodeEnd]?.();
|
|
35
|
-
const nextRefId = decode.number(bytes, it);
|
|
36
|
-
const nextRef = $root.refs.get(nextRefId);
|
|
37
|
-
//
|
|
38
|
-
// Trying to access a reference that haven't been decoded yet.
|
|
39
|
-
//
|
|
40
|
-
if (!nextRef) {
|
|
41
|
-
// throw new Error(`"refId" not found: ${nextRefId}`);
|
|
42
|
-
console.error(`"refId" not found: ${nextRefId}`, { previousRef: ref, previousRefId: this.currentRefId });
|
|
43
|
-
console.warn("Please report this issue to the developers.");
|
|
44
|
-
this.skipCurrentStructure(bytes, it, totalBytes);
|
|
45
|
-
}
|
|
46
|
-
else {
|
|
47
|
-
ref = nextRef;
|
|
48
|
-
decoder = ref.constructor[$decoder];
|
|
49
|
-
this.currentRefId = nextRefId;
|
|
50
|
-
}
|
|
51
|
-
continue;
|
|
52
|
-
}
|
|
53
|
-
const result = decoder(this, bytes, it, ref, allChanges);
|
|
54
|
-
if (result === DEFINITION_MISMATCH) {
|
|
55
|
-
console.warn("@colyseus/schema: definition mismatch");
|
|
56
|
-
this.skipCurrentStructure(bytes, it, totalBytes);
|
|
57
|
-
continue;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
// FIXME: DRY with SWITCH_TO_STRUCTURE block.
|
|
61
|
-
ref[$onDecodeEnd]?.();
|
|
62
|
-
// trigger changes
|
|
63
|
-
this.triggerChanges?.(allChanges);
|
|
64
|
-
// drop references of unused schemas
|
|
65
|
-
$root.garbageCollectDeletedRefs();
|
|
66
|
-
return allChanges;
|
|
67
|
-
}
|
|
68
|
-
skipCurrentStructure(bytes, it, totalBytes) {
|
|
69
|
-
//
|
|
70
|
-
// keep skipping next bytes until reaches a known structure
|
|
71
|
-
// by local decoder.
|
|
72
|
-
//
|
|
73
|
-
const nextIterator = { offset: it.offset };
|
|
74
|
-
while (it.offset < totalBytes) {
|
|
75
|
-
if (bytes[it.offset] === SWITCH_TO_STRUCTURE) {
|
|
76
|
-
nextIterator.offset = it.offset + 1;
|
|
77
|
-
if (this.root.refs.has(decode.number(bytes, nextIterator))) {
|
|
78
|
-
break;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
it.offset++;
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
getInstanceType(bytes, it, defaultType) {
|
|
85
|
-
let type;
|
|
86
|
-
if (bytes[it.offset] === TYPE_ID) {
|
|
87
|
-
it.offset++;
|
|
88
|
-
const type_id = decode.number(bytes, it);
|
|
89
|
-
type = this.context.get(type_id);
|
|
90
|
-
}
|
|
91
|
-
return type || defaultType;
|
|
92
|
-
}
|
|
93
|
-
createInstanceOfType(type) {
|
|
94
|
-
return new type();
|
|
95
|
-
}
|
|
96
|
-
removeChildRefs(ref, allChanges) {
|
|
97
|
-
const needRemoveRef = typeof (ref[$childType]) !== "string";
|
|
98
|
-
const refId = ref[$refId];
|
|
99
|
-
ref.forEach((value, key) => {
|
|
100
|
-
allChanges.push({
|
|
101
|
-
ref: ref,
|
|
102
|
-
refId,
|
|
103
|
-
op: OPERATION.DELETE,
|
|
104
|
-
field: key,
|
|
105
|
-
value: undefined,
|
|
106
|
-
previousValue: value
|
|
107
|
-
});
|
|
108
|
-
if (needRemoveRef) {
|
|
109
|
-
this.root.removeRef(value[$refId]);
|
|
110
|
-
}
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
//# sourceMappingURL=Decoder.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Decoder.js","sourceRoot":"","sources":["../../../src/decoder/Decoder.ts"],"names":[],"mappings":"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","sourcesContent":["import { TypeContext } from \"../types/TypeContext\";\nimport { $changes, $childType, $decoder, $onDecodeEnd, $refId } from \"../types/symbols\";\nimport { Schema } from \"../Schema\";\n\nimport { decode } from \"../encoding/decode\";\nimport { OPERATION, SWITCH_TO_STRUCTURE, TYPE_ID } from '../encoding/spec';\nimport type { Ref } from \"../encoder/ChangeTree\";\nimport type { Iterator } from \"../encoding/decode\";\nimport { ReferenceTracker } from \"./ReferenceTracker\";\nimport { DEFINITION_MISMATCH, type DataChange, type DecodeOperation } from \"./DecodeOperation\";\nimport { Collection } from \"../types/HelperTypes\";\n\nexport class Decoder<T extends Schema = any> {\n context: TypeContext;\n\n state: T;\n root: ReferenceTracker;\n\n currentRefId: number = 0;\n\n triggerChanges?: (allChanges: DataChange[]) => void;\n\n constructor(root: T, context?: TypeContext) {\n this.setState(root);\n\n this.context = context || new TypeContext(root.constructor as typeof Schema);\n\n // console.log(\">>>>>>>>>>>>>>>> Decoder types\");\n // this.context.schemas.forEach((id, schema) => {\n // console.log(\"type:\", id, schema.name, Object.keys(schema[Symbol.metadata]));\n // });\n }\n\n protected setState(root: T) {\n this.state = root;\n this.root = new ReferenceTracker();\n this.root.addRef(0, root);\n }\n\n decode(\n bytes: Uint8Array,\n it: Iterator = { offset: 0 },\n ref: Ref = this.state,\n ) {\n const allChanges: DataChange[] = [];\n\n const $root = this.root;\n const totalBytes = bytes.byteLength;\n\n let decoder: DecodeOperation = ref['constructor'][$decoder];\n\n this.currentRefId = 0;\n\n while (it.offset < totalBytes) {\n //\n // Peek ahead, check if it's a switch to a different structure\n //\n if (bytes[it.offset] == SWITCH_TO_STRUCTURE) {\n it.offset++;\n\n (ref as any)[$onDecodeEnd]?.()\n\n const nextRefId = decode.number(bytes, it);\n const nextRef = $root.refs.get(nextRefId);\n\n //\n // Trying to access a reference that haven't been decoded yet.\n //\n if (!nextRef) {\n // throw new Error(`\"refId\" not found: ${nextRefId}`);\n console.error(`\"refId\" not found: ${nextRefId}`, { previousRef: ref, previousRefId: this.currentRefId });\n console.warn(\"Please report this issue to the developers.\");\n this.skipCurrentStructure(bytes, it, totalBytes);\n\n } else {\n ref = nextRef;\n decoder = ref.constructor[$decoder];\n this.currentRefId = nextRefId;\n }\n\n continue;\n }\n\n const result = decoder(this, bytes, it, ref, allChanges);\n\n if (result === DEFINITION_MISMATCH) {\n console.warn(\"@colyseus/schema: definition mismatch\");\n this.skipCurrentStructure(bytes, it, totalBytes);\n continue;\n }\n }\n\n // FIXME: DRY with SWITCH_TO_STRUCTURE block.\n (ref as any)[$onDecodeEnd]?.()\n\n // trigger changes\n this.triggerChanges?.(allChanges);\n\n // drop references of unused schemas\n $root.garbageCollectDeletedRefs();\n\n return allChanges;\n }\n\n skipCurrentStructure(bytes: Uint8Array, it: Iterator, totalBytes: number) {\n //\n // keep skipping next bytes until reaches a known structure\n // by local decoder.\n //\n const nextIterator: Iterator = { offset: it.offset };\n while (it.offset < totalBytes) {\n if (bytes[it.offset] === SWITCH_TO_STRUCTURE) {\n nextIterator.offset = it.offset + 1;\n if (this.root.refs.has(decode.number(bytes, nextIterator))) {\n break;\n }\n }\n it.offset++;\n }\n }\n\n getInstanceType(bytes: Uint8Array, it: Iterator, defaultType: typeof Schema): typeof Schema {\n let type: typeof Schema;\n\n if (bytes[it.offset] === TYPE_ID) {\n it.offset++;\n const type_id = decode.number(bytes, it);\n type = this.context.get(type_id);\n }\n\n return type || defaultType;\n }\n\n createInstanceOfType (type: typeof Schema): Schema {\n return new (type as any)();\n }\n\n removeChildRefs(ref: Collection, allChanges: DataChange[]) {\n const needRemoveRef = typeof ((ref as any)[$childType]) !== \"string\";\n const refId = (ref as Ref)[$refId];\n\n ref.forEach((value: any, key: any) => {\n allChanges.push({\n ref: ref as Ref,\n refId,\n op: OPERATION.DELETE,\n field: key,\n value: undefined,\n previousValue: value\n });\n\n if (needRemoveRef) {\n this.root.removeRef(value[$refId]);\n }\n });\n }\n\n}\n"]}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { Ref } from "../encoder/ChangeTree";
|
|
2
|
-
/**
|
|
3
|
-
* Used for decoding only.
|
|
4
|
-
*/
|
|
5
|
-
export type SchemaCallbacks = {
|
|
6
|
-
[field: string | number]: Function[];
|
|
7
|
-
};
|
|
8
|
-
export declare class ReferenceTracker {
|
|
9
|
-
refs: Map<number, Ref>;
|
|
10
|
-
refCount: {
|
|
11
|
-
[refId: number]: number;
|
|
12
|
-
};
|
|
13
|
-
deletedRefs: Set<number>;
|
|
14
|
-
callbacks: {
|
|
15
|
-
[refId: number]: SchemaCallbacks;
|
|
16
|
-
};
|
|
17
|
-
protected nextUniqueId: number;
|
|
18
|
-
getNextUniqueId(): number;
|
|
19
|
-
addRef(refId: number, ref: Ref, incrementCount?: boolean): void;
|
|
20
|
-
removeRef(refId: number): void;
|
|
21
|
-
clearRefs(): void;
|
|
22
|
-
garbageCollectDeletedRefs(): void;
|
|
23
|
-
addCallback(refId: number, fieldOrOperation: string | number, callback: Function): () => void;
|
|
24
|
-
removeCallback(refId: number, field: string | number, callback: Function): void;
|
|
25
|
-
}
|