@colyseus/schema 3.0.69 → 3.0.71
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 +3 -5
- package/build/cjs/index.js.map +1 -1
- package/build/esm/index.mjs +3 -5
- package/build/esm/index.mjs.map +1 -1
- package/build/umd/index.js +3 -5
- package/lib/Decoder.d.ts +16 -0
- package/lib/Decoder.js +182 -0
- package/lib/Decoder.js.map +1 -0
- package/lib/Encoder.d.ts +13 -0
- package/lib/Encoder.js +79 -0
- package/lib/Encoder.js.map +1 -0
- package/lib/annotations.js +4 -2
- package/lib/annotations.js.map +1 -1
- package/lib/bench_encode.d.ts +1 -0
- package/lib/bench_encode.js +93 -0
- package/lib/bench_encode.js.map +1 -0
- package/lib/changes/ChangeSet.d.ts +12 -0
- package/lib/changes/ChangeSet.js +35 -0
- package/lib/changes/ChangeSet.js.map +1 -0
- package/lib/changes/ChangeTree.d.ts +53 -0
- package/lib/changes/ChangeTree.js +202 -0
- package/lib/changes/ChangeTree.js.map +1 -0
- package/lib/changes/DecodeOperation.d.ts +15 -0
- package/lib/changes/DecodeOperation.js +186 -0
- package/lib/changes/DecodeOperation.js.map +1 -0
- package/lib/changes/EncodeOperation.d.ts +18 -0
- package/lib/changes/EncodeOperation.js +130 -0
- package/lib/changes/EncodeOperation.js.map +1 -0
- package/lib/changes/ReferenceTracker.d.ts +14 -0
- package/lib/changes/ReferenceTracker.js +83 -0
- package/lib/changes/ReferenceTracker.js.map +1 -0
- package/lib/changes/consts.d.ts +14 -0
- package/lib/changes/consts.js +18 -0
- package/lib/changes/consts.js.map +1 -0
- package/lib/codegen/parser.js +2 -2
- package/lib/codegen/parser.js.map +1 -1
- package/lib/decoding/decode.d.ts +48 -0
- package/lib/decoding/decode.js +267 -0
- package/lib/decoding/decode.js.map +1 -0
- package/lib/ecs.d.ts +11 -0
- package/lib/ecs.js +160 -0
- package/lib/ecs.js.map +1 -0
- package/lib/filters/index.d.ts +8 -0
- package/lib/filters/index.js +24 -0
- package/lib/filters/index.js.map +1 -0
- package/lib/spec.d.ts +13 -0
- package/lib/spec.js +42 -0
- package/lib/spec.js.map +1 -0
- package/lib/types/ArraySchema.d.ts +238 -0
- package/lib/types/ArraySchema.js +555 -0
- package/lib/types/ArraySchema.js.map +1 -0
- package/lib/types/CollectionSchema.d.ts +35 -0
- package/lib/types/CollectionSchema.js +150 -0
- package/lib/types/CollectionSchema.js.map +1 -0
- package/lib/types/MapSchema.d.ts +38 -0
- package/lib/types/MapSchema.js +215 -0
- package/lib/types/MapSchema.js.map +1 -0
- package/lib/types/SetSchema.d.ts +32 -0
- package/lib/types/SetSchema.js +162 -0
- package/lib/types/SetSchema.js.map +1 -0
- package/lib/types/typeRegistry.d.ts +5 -0
- package/lib/types/typeRegistry.js +13 -0
- package/lib/types/typeRegistry.js.map +1 -0
- package/lib/usage.d.ts +1 -0
- package/lib/usage.js +22 -0
- package/lib/usage.js.map +1 -0
- package/lib/v3.d.ts +1 -0
- package/lib/v3.js +427 -0
- package/lib/v3.js.map +1 -0
- package/lib/v3_experiment.d.ts +1 -0
- package/lib/v3_experiment.js +407 -0
- package/lib/v3_experiment.js.map +1 -0
- package/package.json +1 -1
- package/src/annotations.ts +4 -2
- package/src/bench_encode.ts +64 -0
- package/src/codegen/parser.ts +2 -2
package/lib/v3.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"v3.js","sourceRoot":"","sources":["../src/v3.ts"],"names":[],"mappings":"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","sourcesContent":["import * as util from \"node:util\";\nimport \"./symbol.shim\";\n\nimport { owned, type } from \"./annotations\";\n// import { Reflection, ReflectionField, ReflectionType } from \"./Reflection\";\n\nimport { DataChange, Schema } from \"./Schema\";\nimport { ArraySchema } from \"./types/ArraySchema\";\nimport { MapSchema } from \"./types/MapSchema\";\n\nimport { Encoder } from \"./encoder/Encoder\";\nimport { Decoder } from \"./decoder/Decoder\";\nimport { OPERATION } from \"./encoding/spec\";\nimport { encodeKeyValueOperation, encodeSchemaOperation, encodeValue } from \"./encoder/EncodeOperation\";\n\nimport * as encode from \"./encoding/encode\";\nimport * as decode from \"./encoding/decode\";\nimport { $changes, $decoder, $deleteByIndex, $encoder, $getByIndex, $track } from \"./types/symbols\";\nimport { decodeKeyValueOperation, decodeSchemaOperation } from \"./decoder/DecodeOperation\";\nimport { ChangeTree, Ref } from \"./encoder/ChangeTree\";\nimport { Metadata } from \"./Metadata\";\nimport { Reflection } from \"./Reflection\";\nimport { StateView } from \"./encoder/StateView\";\n\nfunction logSingleCall(label: string, callback: Function) {\n const time = Date.now();\n const res = callback();\n console.log(`${label}:`, Date.now() - time);\n return res;\n}\n\nfunction logTime(label: string, callback: Function) {\n const time = Date.now();\n for (let i = 0; i < 500000; i++) {\n callback();\n }\n console.log(`${label}:`, Date.now() - time);\n}\n\n\n// // @ts-ignore\n// globalThis.perform = function perform() {\n// for (let i = 0; i < 500000; i++) {\n// encoder.encodeAll();\n// }\n// }\n\n// const timeout = setInterval(() => {}, 1000);\n\n// function decorate({ get, set }, context: ClassAccessorDecoratorContext): ClassAccessorDecoratorResult<any, any> {\n// const field = context.name.toString();\n// // const fieldIndex = Metadata.addField(context.metadata, field, type);\n\n// const parent = Object.getPrototypeOf(context.metadata);\n\n// let lastIndex = (parent && parent[-1] as number) ?? -1;\n// lastIndex++;\n\n// context.metadata[field] = { type: \"number\" };\n\n// Object.defineProperty(context.metadata, lastIndex, {\n// value: field,\n// enumerable: false,\n// configurable: true,\n// });\n\n// Object.defineProperty(context.metadata, -1, {\n// value: lastIndex,\n// enumerable: false,\n// configurable: true\n// });\n\n// return {\n// init(value) { return value; },\n// get() { return get.call(this); },\n// set(value: any) { set.call(this, value); },\n// };\n// }\n\n// class Fruit {\n// @decorate accessor frutose: number = 1;\n// }\n\n// class Banana extends Fruit {\n// @decorate accessor potassium: number = 10;\n// }\n\n// class Berry extends Fruit {\n// @decorate accessor antioxidants: number = 10;\n// }\n\n// class Strawberry extends Berry {\n// @decorate accessor fiber: number = 10;\n// }\n\n// class Grape extends Berry {\n// @decorate accessor vitaminc: number = 5;\n// }\n\n// console.log(\"fruit:\", Fruit[Symbol.metadata], Object.keys(Fruit[Symbol.metadata]));\n// console.log(\"banana:\", Banana[Symbol.metadata], Object.keys(Banana[Symbol.metadata]));\n// console.log(\"strawberry:\", Strawberry[Symbol.metadata], Object.keys(Strawberry[Symbol.metadata]));\n// console.log(\"grape:\", Grape[Symbol.metadata], Object.keys(Grape[Symbol.metadata]));\n\n// console.log(\"GRAPE =>\");\n\n// function printFields(metadata) {\n// let i = 0;\n// const len = metadata[-1]\n// console.log({ len });\n// for (let i = 0; i <= len; i++) {\n// console.log(\"over len...\", i, metadata[i])\n// }\n// }\n\n// console.log(\"Grape...\");\n// printFields(Grape[Symbol.metadata]);\n\n// console.log(\"Banana...\");\n// printFields(Banana[Symbol.metadata]);\n\n\n// class Item extends Schema {\n// @type(\"string\") accessor name: string;\n// }\n\n// class RootState extends Schema {\n// @type([Item]) accessor items = new ArraySchema<Item>();\n// }\n\n// const s = new RootState();\n// s.items.push(new Item().assign({ name: \"hello\" }));\n\n// const encoder = new Encoder(s);\n// const encoded = encoder.encode();\n\n// const decoder = new Decoder(new RootState());\n// decoder.decode(encoded);\n\nfunction log(message: any) {\n console.log(util.inspect(message, false, 10, true));\n}\n\nSchema[$encoder] = encodeSchemaOperation;\nSchema[$decoder] = decodeSchemaOperation;\n\nMapSchema[$encoder] = encodeKeyValueOperation;\nMapSchema[$decoder] = decodeKeyValueOperation;\n\nArraySchema[$encoder] = encodeKeyValueOperation;\nArraySchema[$decoder] = decodeKeyValueOperation;\n\n// // No need to extend Schema!\n// class Vec3 {\n// x: number;\n// y: number;\n// z: number;\n// constructor() {\n// // Need to initialize property descriptors\n// Schema.initialize(this);\n// }\n// }\n// // Define fields to encode/decode\n// Metadata.setFields(Vec3, {\n// x: \"number\",\n// y: \"number\",\n// z: \"number\",\n// });\n// //\n// Vec3[$track] = function (\n// changeTree: ChangeTree,\n// index: number,\n// operation: OPERATION = OPERATION.ADD\n// ) {\n// changeTree.change(index, operation);\n// };\n// Vec3[$encoder] = encodeSchemaOperation;\n// Vec3[$decoder] = decodeSchemaOperation;\n// // @ts-ignore\n// if (!Vec3.prototype.toJSON) { Vec3.prototype.toJSON = Schema.prototype.toJSON; }\n\n// -------------------------------------------------------------------------------\n\nclass Vec3 extends Schema {\n @type(\"number\") x: number;\n @type(\"number\") y: number;\n @type(\"number\") z: number;\n}\n// Vec3[$track] = function (changeTree, index) {\n// changeTree.change(0, OPERATION.ADD);\n// };\n// Vec3[$encoder] = function (encoder, bytes, changeTree, index, operation, it) {\n// encode.number(bytes, changeTree.ref.x, it);\n// encode.number(bytes, changeTree.ref.y, it);\n// encode.number(bytes, changeTree.ref.z, it);\n// };\n// Vec3[$decoder] = function (\n// decoder: Decoder<any>,\n// bytes: number[],\n// it: decode.Iterator,\n// ref: Vec3,\n// allChanges: DataChange[]\n// ) {\n// ref.x = decode.number(bytes, it);\n// ref.y = decode.number(bytes, it);\n// ref.z = decode.number(bytes, it);\n// };\n\nclass Base extends Schema {}\n\nclass Entity extends Schema {\n @type(Vec3) position = new Vec3().assign({ x: 0, y: 0, z: 0 });\n}\n\nclass Card extends Schema {\n @type(\"string\") suit: string;\n @type(\"number\") num: number;\n}\n\nclass Player extends Entity {\n @type(Vec3) rotation = new Vec3().assign({ x: 0, y: 0, z: 0 });\n @type(\"string\") secret: string = \"private info only for this player\";\n\n // @type([Card])\n // cards = new ArraySchema<Card>(\n // new Card().assign({ suit: \"Hearts\", num: 1 }),\n // new Card().assign({ suit: \"Spaces\", num: 2 }),\n // new Card().assign({ suit: \"Diamonds\", num: 3 }),\n // );\n}\n\nclass Team extends Schema {\n @type({ map: Entity }) entities = new MapSchema<Entity>();\n}\n\nclass State extends Schema {\n @type(\"number\") num: number = 0;\n @type(\"string\") str = \"Hello world!\"\n\n @owned @type([Team]) teams = new ArraySchema<Team>();\n\n // @type({ map: Entity }) entities = new MapSchema<Entity>();\n\n // @type(Entity) entity1 = new Player().assign({\n // position: new Vec3().assign({ x: 1, y: 2, z: 3 }),\n // rotation: new Vec3().assign({ x: 4, y: 5, z: 6 }),\n // });\n // @type(Entity) entity2 = new Player().assign({\n // position: new Vec3().assign({ x: 1, y: 2, z: 3 }),\n // rotation: new Vec3().assign({ x: 4, y: 5, z: 6 }),\n // });\n}\n\nconst state = new State();\n\n// for (let i=0;i<1000;i++) {\n// state.entities.set(\"one\" + i, new Player().assign({\n// position: new Vec3().assign({ x: 1, y: 2, z: 3 }),\n// rotation: new Vec3().assign({ x: 4, y: 5, z: 6 }),\n// }));\n// }\n\n// state.entities.set(\"one\", new Player().assign({\n// position: new Vec3().assign({ x: 1, y: 2, z: 3 }),\n// rotation: new Vec3().assign({ x: 4, y: 5, z: 6 }),\n// }));\n\n// state.entities.set(\"two\", new Player().assign({\n// position: new Vec3().assign({ x: 10, y: 10, z: 3 }),\n// rotation: new Vec3().assign({ x: 4, y: 5, z: 6 }),\n// }));\n\nfunction addTeam() {\n const team = new Team();\n team.entities.set(\"one\", new Player().assign({\n position: new Vec3().assign({ x: 1, y: 2, z: 3 }),\n rotation: new Vec3().assign({ x: 4, y: 5, z: 6 }),\n }));\n team.entities.set(\"two\", new Player().assign({\n position: new Vec3().assign({ x: 7, y: 8, z: 9 }),\n rotation: new Vec3().assign({ x: 2, y: 3, z: 4 }),\n }));\n state.teams.push(team);\n}\n\naddTeam();\naddTeam();\n\nconst it = { offset: 0 };\n\n\nconst encoder = new Encoder(state);\n// logTime(\"encode time\", () => encoder.encodeAll());\n\n// const encoded = encoder.encode(it);\n\nconsole.log(\"> will encode all...\", state.toJSON());\nconst encoded = encoder.encode(it);\n\nconsole.log(\"HEAP TOTAL:\", process.memoryUsage().heapTotal / 1024 / 1024, \"MB\");\nconsole.log(\"HEAP USED:\", process.memoryUsage().heapUsed / 1024 / 1024, \"MB\");\n\n// console.log(\"encoded.buffer =>\", `(${encoded.byteLength} bytes)`);\n\nconst sharedOffset = it.offset;\n\n// const team1View = new StateView<State>();\n// team1View.owns(state.teams[0]);\n\nconst view = new StateView();\nview.owns(state.teams[0]);\n\n// view1['owned'].add(state[$changes]);\n// view1['owned'].add(state.teams[$changes]);\n// view1.owns(state.teams[0]);\n// view1.owns(state.entities);\n// view1.owns(state.entities.get(\"one\"));\n\nconst view2 = new StateView<State>();\nconsole.log(\">>> VIEW 2\");\nview2.owns(state.teams[1]);\n// view2.owns(state.entities.get(\"two\"));\n\nconsole.log(\"> will encode view 1...\");\nconst viewEncoded1 = encoder.encodeView(view, sharedOffset, it, encoder.sharedBuffer);\nconsole.log(\"done. view1 encoded =>\", `(${viewEncoded1.byteLength} bytes)`);\n\nconsole.log(\"> will encode view 2...\");\nconst viewEncoded2 = encoder.encodeView(view2, sharedOffset, it, encoder.sharedBuffer);\nconsole.log(\"done. view2 encoded =>\", `(${viewEncoded2.byteLength} bytes)`);\n\n// setTimeout(() => {\n// for (let i = 0; i < 500000; i++) {\n// encoder.encodeAll();\n// }\n// }, 1000)\n\n// logTime(\"encode time\", () => encoder.encodeAll());\n\n// console.log(`encode: (${encoded.length})`, encoded);\n\nconsole.log(\"----------------------------------- ENCODE reflection...\");\nconst encodedReflection = Reflection.encode(state, encoder.context);\nconsole.log(\"----------------------------------- DECODE reflection...\");\nconst decodedState = Reflection.decode<State>(encodedReflection);\n\n// const decodedState = new State();\nconst decoder = new Decoder(decodedState);\n\nconsole.log(\"> will decode...\");\n\n// decoder.decode(encoded);\nconst changes = decoder.decode(viewEncoded1);\n\n// decoder.decode(viewEncoded2);\nconsole.log(\"CHANGES =>\", changes)\n\n// log(new DataView(encoded.buffer, 0, it.offset));\n// log(new DataView(viewEncoded1.buffer, 0, it.offset));\nlog(decodedState.toJSON());\n\n// console.log(\"encoder.$root.changes =>\", encoder.$root.changes.length);\n// console.log(\"encoder.$root.filteredChanges =>\", encoder.$root.filteredChanges.length);\n\n// state.teams[0].entities.get(\"one\").position.x = 100;\n\n// // encoder.\n\n// const it2 = { offset: 0 };\n// // const encoded = encoder.encode(it);\n// const encoded2 = encoder.encode(it2);\n// console.log(`> shared encode... (${encoded2.byteLength} bytes)`);\n\n// const viewEncoded3 = encoder.encodeView(view1, sharedOffset, it, encoder.sharedBuffer);\n// console.log(`> view1... (${viewEncoded3.byteLength} bytes)`);\n\n\n// log(decoder.root.toJSON());\n// logTime(\"decode time\", () => decoder.decode(encoded));\n\n// console.log(\"changes =>\", changes);\n\n// const rotation = state.entity.rotation;\n// rotation.x = 100;\n\n// state.entity.rotation = undefined;\n\n// const encoded2 = encoder.encode();\n// console.log({ encoded2 });\n\n// decoder.decode(encoded2);\n// console.log(\"decoded =>\", decoded.toJSON());\n\n// console.profile();\n// const time = Date.now();\n// for (let i = 0; i < 300000; i++) {\n// const state = new State();\n// encoder['setRoot'](state);\n// encoder.encode();\n// }\n// console.log(\"encode time:\", Date.now() - time);\n// console.profileEnd();\n\n// state.players.set(\"entity\", new Entity());\n// state.players.set(\"one\", new Player());\n// console.log(\"state:\", state);\n// console.log(\"state.players\", state.players);\n// console.log(\"state.players.one\", state.players.get(\"one\"));\n// console.log(\"state.players.one.position\", state.players.get(\"one\").position);\n\n// const encoder = new Encoder(state);\n// // encoder.change()\n\n// let encoded = encoder.encodeAll();\n// console.log({ encoded })\n\n// const decoder = new Decoder(new State());\n// decoder.decode(encoded);\n// log(decoder['root'].toJSON());\n\n// const reflection = Reflection.encode(state);\n// console.log(\"encoded =>\", reflection);\n// log(Reflection.decode(reflection))\n\n///////...............................................\n// function type (type: string) {\n// return function (_: any, context: ClassFieldDecoratorContext) {\n// context.addInitializer(function() {\n// console.log(\"INITIALIZER!\", this);\n// setTimeout(() => {\n// context.access.set(this, \"WHAT\");\n// }, 1000);\n// });\n\n// context.access.get = function(object) {\n// return object[context.name];\n// }\n\n// context.access.set = function(object, value) {\n// console.log(\"setter...\", object, value);\n// object[context.name] = `Setter[${value}]`;\n// };\n\n// return function(value) {\n// console.log(\"SET\", this, value);\n// if (typeof(value) === \"string\") {\n// value = `Initializer[${value}]`;\n// } else {\n// value = value * 100;\n// }\n// return value;\n// };\n// }\n// }\n\n// class MyState {\n// @type(\"string\") name: string = \"Hello world!\";\n// @type(\"number\") num: number = 1;\n// }\n\n// const state = new MyState();\n// console.log(\"name: \", state.name);\n// console.log(\"num: \", state.num);\n// state.name = `${state.name} modified...`;\n// setTimeout(() => console.log(state.name), 1100);\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import "./symbol.shim";
|
|
@@ -0,0 +1,407 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
const util = require("node:util");
|
|
10
|
+
require("./symbol.shim");
|
|
11
|
+
const _1 = require(".");
|
|
12
|
+
const $callback = {
|
|
13
|
+
$onCreate: Symbol('$onCreate'),
|
|
14
|
+
$onDelete: Symbol('$onDelete'),
|
|
15
|
+
$onUpdate: Symbol('$onUpdate'),
|
|
16
|
+
};
|
|
17
|
+
function logSingleCall(label, callback) {
|
|
18
|
+
const time = Date.now();
|
|
19
|
+
const res = callback();
|
|
20
|
+
console.log(`${label}:`, Date.now() - time);
|
|
21
|
+
return res;
|
|
22
|
+
}
|
|
23
|
+
function logTime(label, callback) {
|
|
24
|
+
const time = Date.now();
|
|
25
|
+
for (let i = 0; i < 500000; i++) {
|
|
26
|
+
callback();
|
|
27
|
+
}
|
|
28
|
+
console.log(`${label}:`, Date.now() - time);
|
|
29
|
+
}
|
|
30
|
+
// // @ts-ignore
|
|
31
|
+
// globalThis.perform = function perform() {
|
|
32
|
+
// for (let i = 0; i < 500000; i++) {
|
|
33
|
+
// encoder.encodeAll();
|
|
34
|
+
// }
|
|
35
|
+
// }
|
|
36
|
+
// const timeout = setInterval(() => {}, 1000);
|
|
37
|
+
// function decorate({ get, set }, context: ClassAccessorDecoratorContext): ClassAccessorDecoratorResult<any, any> {
|
|
38
|
+
// const field = context.name.toString();
|
|
39
|
+
// // const fieldIndex = Metadata.addField(context.metadata, field, type);
|
|
40
|
+
// const parent = Object.getPrototypeOf(context.metadata);
|
|
41
|
+
// let lastIndex = (parent && parent[-1] as number) ?? -1;
|
|
42
|
+
// lastIndex++;
|
|
43
|
+
// context.metadata[field] = { type: "number" };
|
|
44
|
+
// Object.defineProperty(context.metadata, lastIndex, {
|
|
45
|
+
// value: field,
|
|
46
|
+
// enumerable: false,
|
|
47
|
+
// configurable: true,
|
|
48
|
+
// });
|
|
49
|
+
// Object.defineProperty(context.metadata, -1, {
|
|
50
|
+
// value: lastIndex,
|
|
51
|
+
// enumerable: false,
|
|
52
|
+
// configurable: true
|
|
53
|
+
// });
|
|
54
|
+
// return {
|
|
55
|
+
// init(value) { return value; },
|
|
56
|
+
// get() { return get.call(this); },
|
|
57
|
+
// set(value: any) { set.call(this, value); },
|
|
58
|
+
// };
|
|
59
|
+
// }
|
|
60
|
+
// class Fruit {
|
|
61
|
+
// @decorate accessor frutose: number = 1;
|
|
62
|
+
// }
|
|
63
|
+
// class Banana extends Fruit {
|
|
64
|
+
// @decorate accessor potassium: number = 10;
|
|
65
|
+
// }
|
|
66
|
+
// class Berry extends Fruit {
|
|
67
|
+
// @decorate accessor antioxidants: number = 10;
|
|
68
|
+
// }
|
|
69
|
+
// class Strawberry extends Berry {
|
|
70
|
+
// @decorate accessor fiber: number = 10;
|
|
71
|
+
// }
|
|
72
|
+
// class Grape extends Berry {
|
|
73
|
+
// @decorate accessor vitaminc: number = 5;
|
|
74
|
+
// }
|
|
75
|
+
// console.log("fruit:", Fruit[Symbol.metadata], Object.keys(Fruit[Symbol.metadata]));
|
|
76
|
+
// console.log("banana:", Banana[Symbol.metadata], Object.keys(Banana[Symbol.metadata]));
|
|
77
|
+
// console.log("strawberry:", Strawberry[Symbol.metadata], Object.keys(Strawberry[Symbol.metadata]));
|
|
78
|
+
// console.log("grape:", Grape[Symbol.metadata], Object.keys(Grape[Symbol.metadata]));
|
|
79
|
+
// console.log("GRAPE =>");
|
|
80
|
+
// function printFields(metadata) {
|
|
81
|
+
// let i = 0;
|
|
82
|
+
// const len = metadata[-1]
|
|
83
|
+
// console.log({ len });
|
|
84
|
+
// for (let i = 0; i <= len; i++) {
|
|
85
|
+
// console.log("over len...", i, metadata[i])
|
|
86
|
+
// }
|
|
87
|
+
// }
|
|
88
|
+
// console.log("Grape...");
|
|
89
|
+
// printFields(Grape[Symbol.metadata]);
|
|
90
|
+
// console.log("Banana...");
|
|
91
|
+
// printFields(Banana[Symbol.metadata]);
|
|
92
|
+
// class Item extends Schema {
|
|
93
|
+
// @type("string") accessor name: string;
|
|
94
|
+
// }
|
|
95
|
+
// class RootState extends Schema {
|
|
96
|
+
// @type([Item]) accessor items = new ArraySchema<Item>();
|
|
97
|
+
// }
|
|
98
|
+
// const s = new RootState();
|
|
99
|
+
// s.items.push(new Item().assign({ name: "hello" }));
|
|
100
|
+
// const encoder = new Encoder(s);
|
|
101
|
+
// const encoded = encoder.encode();
|
|
102
|
+
// const decoder = new Decoder(new RootState());
|
|
103
|
+
// decoder.decode(encoded);
|
|
104
|
+
function log(message) {
|
|
105
|
+
console.log(util.inspect(message, false, 10, true));
|
|
106
|
+
}
|
|
107
|
+
// // No need to extend Schema!
|
|
108
|
+
// class Vec3 {
|
|
109
|
+
// x: number;
|
|
110
|
+
// y: number;
|
|
111
|
+
// z: number;
|
|
112
|
+
// constructor() {
|
|
113
|
+
// // Need to initialize property descriptors
|
|
114
|
+
// Schema.initialize(this);
|
|
115
|
+
// }
|
|
116
|
+
// }
|
|
117
|
+
// // Define fields to encode/decode
|
|
118
|
+
// Metadata.setFields(Vec3, {
|
|
119
|
+
// x: "number",
|
|
120
|
+
// y: "number",
|
|
121
|
+
// z: "number",
|
|
122
|
+
// });
|
|
123
|
+
// //
|
|
124
|
+
// Vec3[$track] = function (
|
|
125
|
+
// changeTree: ChangeTree,
|
|
126
|
+
// index: number,
|
|
127
|
+
// operation: OPERATION = OPERATION.ADD
|
|
128
|
+
// ) {
|
|
129
|
+
// changeTree.change(index, operation);
|
|
130
|
+
// };
|
|
131
|
+
// Vec3[$encoder] = encodeSchemaOperation;
|
|
132
|
+
// Vec3[$decoder] = decodeSchemaOperation;
|
|
133
|
+
// // @ts-ignore
|
|
134
|
+
// if (!Vec3.prototype.toJSON) { Vec3.prototype.toJSON = Schema.prototype.toJSON; }
|
|
135
|
+
// -------------------------------------------------------------------------------
|
|
136
|
+
class Vec3 extends _1.Schema {
|
|
137
|
+
}
|
|
138
|
+
__decorate([
|
|
139
|
+
(0, _1.type)("number")
|
|
140
|
+
], Vec3.prototype, "x", void 0);
|
|
141
|
+
__decorate([
|
|
142
|
+
(0, _1.type)("number")
|
|
143
|
+
], Vec3.prototype, "y", void 0);
|
|
144
|
+
__decorate([
|
|
145
|
+
(0, _1.type)("number")
|
|
146
|
+
], Vec3.prototype, "z", void 0);
|
|
147
|
+
// Vec3[$track] = function (changeTree, index) {
|
|
148
|
+
// changeTree.change(0, OPERATION.ADD);
|
|
149
|
+
// };
|
|
150
|
+
// Vec3[$encoder] = function (encoder, bytes, changeTree, index, operation, it) {
|
|
151
|
+
// encode.number(bytes, changeTree.ref.x, it);
|
|
152
|
+
// encode.number(bytes, changeTree.ref.y, it);
|
|
153
|
+
// encode.number(bytes, changeTree.ref.z, it);
|
|
154
|
+
// };
|
|
155
|
+
// Vec3[$decoder] = function (
|
|
156
|
+
// decoder: Decoder<any>,
|
|
157
|
+
// bytes: number[],
|
|
158
|
+
// it: decode.Iterator,
|
|
159
|
+
// ref: Vec3,
|
|
160
|
+
// allChanges: DataChange[]
|
|
161
|
+
// ) {
|
|
162
|
+
// ref.x = decode.number(bytes, it);
|
|
163
|
+
// ref.y = decode.number(bytes, it);
|
|
164
|
+
// ref.z = decode.number(bytes, it);
|
|
165
|
+
// };
|
|
166
|
+
class Base extends _1.Schema {
|
|
167
|
+
}
|
|
168
|
+
class Entity extends _1.Schema {
|
|
169
|
+
constructor() {
|
|
170
|
+
super(...arguments);
|
|
171
|
+
this.position = new Vec3().assign({ x: 0, y: 0, z: 0 });
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
__decorate([
|
|
175
|
+
(0, _1.type)(Vec3)
|
|
176
|
+
], Entity.prototype, "position", void 0);
|
|
177
|
+
class Card extends _1.Schema {
|
|
178
|
+
}
|
|
179
|
+
__decorate([
|
|
180
|
+
(0, _1.type)("string")
|
|
181
|
+
], Card.prototype, "suit", void 0);
|
|
182
|
+
__decorate([
|
|
183
|
+
(0, _1.type)("number")
|
|
184
|
+
], Card.prototype, "num", void 0);
|
|
185
|
+
class Player extends Entity {
|
|
186
|
+
constructor() {
|
|
187
|
+
super(...arguments);
|
|
188
|
+
this.rotation = new Vec3().assign({ x: 0, y: 0, z: 0 });
|
|
189
|
+
this.secret = "private info only for this player";
|
|
190
|
+
this.cards = new _1.ArraySchema(new Card().assign({ suit: "Hearts", num: 1 }), new Card().assign({ suit: "Spaces", num: 2 }), new Card().assign({ suit: "Diamonds", num: 3 }));
|
|
191
|
+
}
|
|
192
|
+
[$callback.$onCreate]() {
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
__decorate([
|
|
196
|
+
(0, _1.type)(Vec3)
|
|
197
|
+
], Player.prototype, "rotation", void 0);
|
|
198
|
+
__decorate([
|
|
199
|
+
(0, _1.type)("string")
|
|
200
|
+
], Player.prototype, "secret", void 0);
|
|
201
|
+
__decorate([
|
|
202
|
+
(0, _1.type)([Card])
|
|
203
|
+
], Player.prototype, "cards", void 0);
|
|
204
|
+
class Team extends _1.Schema {
|
|
205
|
+
constructor() {
|
|
206
|
+
super(...arguments);
|
|
207
|
+
this.entities = new _1.MapSchema();
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
__decorate([
|
|
211
|
+
(0, _1.type)({ map: Entity })
|
|
212
|
+
], Team.prototype, "entities", void 0);
|
|
213
|
+
class State extends _1.Schema {
|
|
214
|
+
constructor() {
|
|
215
|
+
super(...arguments);
|
|
216
|
+
this.num = 0;
|
|
217
|
+
this.str = "Hello world!";
|
|
218
|
+
this.teams = new _1.ArraySchema();
|
|
219
|
+
// @type({ map: Entity }) entities = new MapSchema<Entity>();
|
|
220
|
+
// @type(Entity) entity1 = new Player().assign({
|
|
221
|
+
// position: new Vec3().assign({ x: 1, y: 2, z: 3 }),
|
|
222
|
+
// rotation: new Vec3().assign({ x: 4, y: 5, z: 6 }),
|
|
223
|
+
// });
|
|
224
|
+
// @type(Entity) entity2 = new Player().assign({
|
|
225
|
+
// position: new Vec3().assign({ x: 1, y: 2, z: 3 }),
|
|
226
|
+
// rotation: new Vec3().assign({ x: 4, y: 5, z: 6 }),
|
|
227
|
+
// });
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
__decorate([
|
|
231
|
+
(0, _1.type)("number")
|
|
232
|
+
], State.prototype, "num", void 0);
|
|
233
|
+
__decorate([
|
|
234
|
+
(0, _1.type)("string")
|
|
235
|
+
], State.prototype, "str", void 0);
|
|
236
|
+
__decorate([
|
|
237
|
+
(0, _1.view)(),
|
|
238
|
+
(0, _1.type)([Team])
|
|
239
|
+
], State.prototype, "teams", void 0);
|
|
240
|
+
const state = new State();
|
|
241
|
+
// for (let i=0;i<1000;i++) {
|
|
242
|
+
// state.entities.set("one" + i, new Player().assign({
|
|
243
|
+
// position: new Vec3().assign({ x: 1, y: 2, z: 3 }),
|
|
244
|
+
// rotation: new Vec3().assign({ x: 4, y: 5, z: 6 }),
|
|
245
|
+
// }));
|
|
246
|
+
// }
|
|
247
|
+
// state.entities.set("one", new Player().assign({
|
|
248
|
+
// position: new Vec3().assign({ x: 1, y: 2, z: 3 }),
|
|
249
|
+
// rotation: new Vec3().assign({ x: 4, y: 5, z: 6 }),
|
|
250
|
+
// }));
|
|
251
|
+
// state.entities.set("two", new Player().assign({
|
|
252
|
+
// position: new Vec3().assign({ x: 10, y: 10, z: 3 }),
|
|
253
|
+
// rotation: new Vec3().assign({ x: 4, y: 5, z: 6 }),
|
|
254
|
+
// }));
|
|
255
|
+
function addTeam() {
|
|
256
|
+
const team = new Team();
|
|
257
|
+
team.entities.set("one", new Player().assign({
|
|
258
|
+
position: new Vec3().assign({ x: 1, y: 2, z: 3 }),
|
|
259
|
+
rotation: new Vec3().assign({ x: 4, y: 5, z: 6 }),
|
|
260
|
+
}));
|
|
261
|
+
team.entities.set("two", new Player().assign({
|
|
262
|
+
position: new Vec3().assign({ x: 7, y: 8, z: 9 }),
|
|
263
|
+
rotation: new Vec3().assign({ x: 2, y: 3, z: 4 }),
|
|
264
|
+
}));
|
|
265
|
+
state.teams.push(team);
|
|
266
|
+
}
|
|
267
|
+
addTeam();
|
|
268
|
+
addTeam();
|
|
269
|
+
const it = { offset: 0 };
|
|
270
|
+
const encoder = new _1.Encoder(state);
|
|
271
|
+
// logTime("encode time", () => encoder.encodeAll());
|
|
272
|
+
// const encoded = encoder.encode(it);
|
|
273
|
+
console.log("> will encode all...", state.toJSON());
|
|
274
|
+
const encoded = encoder.encode(it);
|
|
275
|
+
console.log("HEAP TOTAL:", process.memoryUsage().heapTotal / 1024 / 1024, "MB");
|
|
276
|
+
console.log("HEAP USED:", process.memoryUsage().heapUsed / 1024 / 1024, "MB");
|
|
277
|
+
// console.log("encoded.buffer =>", `(${encoded.byteLength} bytes)`);
|
|
278
|
+
const sharedOffset = it.offset;
|
|
279
|
+
// const team1View = new StateView<State>();
|
|
280
|
+
// team1View.owns(state.teams[0]);
|
|
281
|
+
const view1 = new _1.StateView();
|
|
282
|
+
view1.add(state.teams[0]);
|
|
283
|
+
// view1['owned'].add(state[$changes]);
|
|
284
|
+
// view1['owned'].add(state.teams[$changes]);
|
|
285
|
+
// view1.owns(state.teams[0]);
|
|
286
|
+
// view1.owns(state.entities);
|
|
287
|
+
// view1.owns(state.entities.get("one"));
|
|
288
|
+
const view2 = new _1.StateView();
|
|
289
|
+
console.log(">>> VIEW 2");
|
|
290
|
+
view2.add(state.teams[1]);
|
|
291
|
+
// view2.owns(state.entities.get("two"));
|
|
292
|
+
console.log("> will encode view 1...");
|
|
293
|
+
const viewEncoded1 = encoder.encodeView(view1, sharedOffset, it, encoder.sharedBuffer);
|
|
294
|
+
console.log("done. view1 encoded =>", `(${viewEncoded1.byteLength} bytes)`);
|
|
295
|
+
console.log("> will encode view 2...");
|
|
296
|
+
const viewEncoded2 = encoder.encodeView(view2, sharedOffset, it, encoder.sharedBuffer);
|
|
297
|
+
console.log("done. view2 encoded =>", `(${viewEncoded2.byteLength} bytes)`);
|
|
298
|
+
// setTimeout(() => {
|
|
299
|
+
// for (let i = 0; i < 500000; i++) {
|
|
300
|
+
// encoder.encodeAll();
|
|
301
|
+
// }
|
|
302
|
+
// }, 1000)
|
|
303
|
+
// logTime("encode time", () => encoder.encodeAll());
|
|
304
|
+
// console.log(`encode: (${encoded.length})`, encoded);
|
|
305
|
+
console.log("----------------------------------- ENCODE reflection...");
|
|
306
|
+
const encodedReflection = _1.Reflection.encode(state, encoder.context);
|
|
307
|
+
console.log("----------------------------------- DECODE reflection...");
|
|
308
|
+
const decodedState = _1.Reflection.decode(encodedReflection);
|
|
309
|
+
// const decodedState = new State();
|
|
310
|
+
const decoder = new _1.Decoder(decodedState);
|
|
311
|
+
// $(decoder.state).teams.onAdd((team, index) => {
|
|
312
|
+
// // room.$state.bind(team, frontendTeam);
|
|
313
|
+
// $(team).entities.onAdd((entity, entityId) => {
|
|
314
|
+
// $(entity as Player).listen("secret", (value, previousValue) => {
|
|
315
|
+
// });
|
|
316
|
+
// $(entity).position.onChange(() => {
|
|
317
|
+
// });
|
|
318
|
+
// });
|
|
319
|
+
// });
|
|
320
|
+
console.log("> will decode...");
|
|
321
|
+
// decoder.decode(encoded);
|
|
322
|
+
decoder.decode(viewEncoded1);
|
|
323
|
+
console.log("Decoded =>", decoder.state.toJSON());
|
|
324
|
+
// decoder.decode(viewEncoded2);
|
|
325
|
+
// log(decodedState.toJSON());
|
|
326
|
+
// console.log("encoder.$root.changes =>", encoder.$root.changes.length);
|
|
327
|
+
// console.log("encoder.$root.filteredChanges =>", encoder.$root.filteredChanges.length);
|
|
328
|
+
// state.teams[0].entities.get("one").position.x = 100;
|
|
329
|
+
// // encoder.
|
|
330
|
+
// const it2 = { offset: 0 };
|
|
331
|
+
// // const encoded = encoder.encode(it);
|
|
332
|
+
// const encoded2 = encoder.encode(it2);
|
|
333
|
+
// console.log(`> shared encode... (${encoded2.byteLength} bytes)`);
|
|
334
|
+
// const viewEncoded3 = encoder.encodeView(view1, sharedOffset, it, encoder.sharedBuffer);
|
|
335
|
+
// console.log(`> view1... (${viewEncoded3.byteLength} bytes)`);
|
|
336
|
+
// log(decoder.root.toJSON());
|
|
337
|
+
// logTime("decode time", () => decoder.decode(encoded));
|
|
338
|
+
// console.log("changes =>", changes);
|
|
339
|
+
// const rotation = state.entity.rotation;
|
|
340
|
+
// rotation.x = 100;
|
|
341
|
+
// state.entity.rotation = undefined;
|
|
342
|
+
// const encoded2 = encoder.encode();
|
|
343
|
+
// console.log({ encoded2 });
|
|
344
|
+
// decoder.decode(encoded2);
|
|
345
|
+
// console.log("decoded =>", decoded.toJSON());
|
|
346
|
+
// console.profile();
|
|
347
|
+
// const time = Date.now();
|
|
348
|
+
// for (let i = 0; i < 300000; i++) {
|
|
349
|
+
// const state = new State();
|
|
350
|
+
// encoder['setRoot'](state);
|
|
351
|
+
// encoder.encode();
|
|
352
|
+
// }
|
|
353
|
+
// console.log("encode time:", Date.now() - time);
|
|
354
|
+
// console.profileEnd();
|
|
355
|
+
// state.players.set("entity", new Entity());
|
|
356
|
+
// state.players.set("one", new Player());
|
|
357
|
+
// console.log("state:", state);
|
|
358
|
+
// console.log("state.players", state.players);
|
|
359
|
+
// console.log("state.players.one", state.players.get("one"));
|
|
360
|
+
// console.log("state.players.one.position", state.players.get("one").position);
|
|
361
|
+
// const encoder = new Encoder(state);
|
|
362
|
+
// // encoder.change()
|
|
363
|
+
// let encoded = encoder.encodeAll();
|
|
364
|
+
// console.log({ encoded })
|
|
365
|
+
// const decoder = new Decoder(new State());
|
|
366
|
+
// decoder.decode(encoded);
|
|
367
|
+
// log(decoder['root'].toJSON());
|
|
368
|
+
// const reflection = Reflection.encode(state);
|
|
369
|
+
// console.log("encoded =>", reflection);
|
|
370
|
+
// log(Reflection.decode(reflection))
|
|
371
|
+
///////...............................................
|
|
372
|
+
// function type (type: string) {
|
|
373
|
+
// return function (_: any, context: ClassFieldDecoratorContext) {
|
|
374
|
+
// context.addInitializer(function() {
|
|
375
|
+
// console.log("INITIALIZER!", this);
|
|
376
|
+
// setTimeout(() => {
|
|
377
|
+
// context.access.set(this, "WHAT");
|
|
378
|
+
// }, 1000);
|
|
379
|
+
// });
|
|
380
|
+
// context.access.get = function(object) {
|
|
381
|
+
// return object[context.name];
|
|
382
|
+
// }
|
|
383
|
+
// context.access.set = function(object, value) {
|
|
384
|
+
// console.log("setter...", object, value);
|
|
385
|
+
// object[context.name] = `Setter[${value}]`;
|
|
386
|
+
// };
|
|
387
|
+
// return function(value) {
|
|
388
|
+
// console.log("SET", this, value);
|
|
389
|
+
// if (typeof(value) === "string") {
|
|
390
|
+
// value = `Initializer[${value}]`;
|
|
391
|
+
// } else {
|
|
392
|
+
// value = value * 100;
|
|
393
|
+
// }
|
|
394
|
+
// return value;
|
|
395
|
+
// };
|
|
396
|
+
// }
|
|
397
|
+
// }
|
|
398
|
+
// class MyState {
|
|
399
|
+
// @type("string") name: string = "Hello world!";
|
|
400
|
+
// @type("number") num: number = 1;
|
|
401
|
+
// }
|
|
402
|
+
// const state = new MyState();
|
|
403
|
+
// console.log("name: ", state.name);
|
|
404
|
+
// console.log("num: ", state.num);
|
|
405
|
+
// state.name = `${state.name} modified...`;
|
|
406
|
+
// setTimeout(() => console.log(state.name), 1100);
|
|
407
|
+
//# sourceMappingURL=v3_experiment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"v3_experiment.js","sourceRoot":"","sources":["../src/v3_experiment.ts"],"names":[],"mappings":";;;;;;;;AAAA,kCAAkC;AAClC,yBAAuB;AAEvB,wBAwBW;AAKX,MAAM,SAAS,GAAG;IACd,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC;CACjC,CAAA;AAED,SAAS,aAAa,CAAC,KAAa,EAAE,QAAkB;IACpD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACxB,MAAM,GAAG,GAAG,QAAQ,EAAE,CAAC;IACvB,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAC5C,OAAO,GAAG,CAAC;AACf,CAAC;AAED,SAAS,OAAO,CAAC,KAAa,EAAE,QAAkB;IAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9B,QAAQ,EAAE,CAAC;IACf,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;AAChD,CAAC;AAGD,gBAAgB;AAChB,4CAA4C;AAC5C,yCAAyC;AACzC,+BAA+B;AAC/B,QAAQ;AACR,IAAI;AAEJ,+CAA+C;AAE/C,oHAAoH;AACpH,6CAA6C;AAC7C,8EAA8E;AAE9E,8DAA8D;AAE9D,8DAA8D;AAC9D,mBAAmB;AAEnB,oDAAoD;AAEpD,2DAA2D;AAC3D,wBAAwB;AACxB,6BAA6B;AAC7B,8BAA8B;AAC9B,UAAU;AAEV,oDAAoD;AACpD,4BAA4B;AAC5B,6BAA6B;AAC7B,6BAA6B;AAC7B,UAAU;AAEV,eAAe;AACf,yCAAyC;AACzC,4CAA4C;AAC5C,sDAAsD;AACtD,SAAS;AACT,IAAI;AAEJ,gBAAgB;AAChB,8CAA8C;AAC9C,IAAI;AAEJ,+BAA+B;AAC/B,iDAAiD;AACjD,IAAI;AAEJ,8BAA8B;AAC9B,oDAAoD;AACpD,IAAI;AAEJ,mCAAmC;AACnC,6CAA6C;AAC7C,IAAI;AAEJ,8BAA8B;AAC9B,+CAA+C;AAC/C,IAAI;AAEJ,sFAAsF;AACtF,yFAAyF;AACzF,qGAAqG;AACrG,sFAAsF;AAEtF,2BAA2B;AAE3B,mCAAmC;AACnC,iBAAiB;AACjB,+BAA+B;AAC/B,4BAA4B;AAC5B,uCAAuC;AACvC,qDAAqD;AACrD,QAAQ;AACR,IAAI;AAEJ,2BAA2B;AAC3B,uCAAuC;AAEvC,4BAA4B;AAC5B,wCAAwC;AAGxC,8BAA8B;AAC9B,6CAA6C;AAC7C,IAAI;AAEJ,mCAAmC;AACnC,8DAA8D;AAC9D,IAAI;AAEJ,6BAA6B;AAC7B,sDAAsD;AAEtD,kCAAkC;AAClC,oCAAoC;AAEpC,gDAAgD;AAChD,2BAA2B;AAE3B,SAAS,GAAG,CAAC,OAAY;IACrB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,+BAA+B;AAC/B,eAAe;AACf,iBAAiB;AACjB,iBAAiB;AACjB,iBAAiB;AACjB,sBAAsB;AACtB,qDAAqD;AACrD,mCAAmC;AACnC,QAAQ;AACR,IAAI;AACJ,oCAAoC;AACpC,6BAA6B;AAC7B,mBAAmB;AACnB,mBAAmB;AACnB,mBAAmB;AACnB,MAAM;AACN,KAAK;AACL,4BAA4B;AAC5B,8BAA8B;AAC9B,qBAAqB;AACrB,2CAA2C;AAC3C,MAAM;AACN,2CAA2C;AAC3C,KAAK;AACL,0CAA0C;AAC1C,0CAA0C;AAC1C,gBAAgB;AAChB,mFAAmF;AAEnF,kFAAkF;AAElF,MAAM,IAAK,SAAQ,SAAM;CAIxB;AAHmB;IAAf,IAAA,OAAI,EAAC,QAAQ,CAAC;+BAAW;AACV;IAAf,IAAA,OAAI,EAAC,QAAQ,CAAC;+BAAW;AACV;IAAf,IAAA,OAAI,EAAC,QAAQ,CAAC;+BAAW;AAE9B,gDAAgD;AAChD,2CAA2C;AAC3C,KAAK;AACL,iFAAiF;AACjF,kDAAkD;AAClD,kDAAkD;AAClD,kDAAkD;AAClD,KAAK;AACL,8BAA8B;AAC9B,6BAA6B;AAC7B,uBAAuB;AACvB,2BAA2B;AAC3B,iBAAiB;AACjB,+BAA+B;AAC/B,MAAM;AACN,wCAAwC;AACxC,wCAAwC;AACxC,wCAAwC;AACxC,KAAK;AAEL,MAAM,IAAK,SAAQ,SAAM;CAAG;AAE5B,MAAM,MAAO,SAAQ,SAAM;IAA3B;;QACgB,aAAQ,GAAG,IAAI,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACnE,CAAC;CAAA;AADe;IAAX,IAAA,OAAI,EAAC,IAAI,CAAC;wCAAoD;AAGnE,MAAM,IAAK,SAAQ,SAAM;CAGxB;AAFmB;IAAf,IAAA,OAAI,EAAC,QAAQ,CAAC;kCAAc;AACb;IAAf,IAAA,OAAI,EAAC,QAAQ,CAAC;iCAAa;AAGhC,MAAM,MAAO,SAAQ,MAAM;IAA3B;;QACgB,aAAQ,GAAG,IAAI,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/C,WAAM,GAAW,mCAAmC,CAAC;QAGrE,UAAK,GAAG,IAAI,cAAW,CACnB,IAAI,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAC7C,IAAI,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAC7C,IAAI,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAClD,CAAC;IAKN,CAAC;IAHG,CAAC,SAAS,CAAC,SAAS,CAAC;IACrB,CAAC;CAEJ;AAbe;IAAX,IAAA,OAAI,EAAC,IAAI,CAAC;wCAAoD;AAC/C;IAAf,IAAA,OAAI,EAAC,QAAQ,CAAC;sCAAsD;AAGrE;IADC,IAAA,OAAI,EAAC,CAAC,IAAI,CAAC,CAAC;qCAKX;AAON,MAAM,IAAK,SAAQ,SAAM;IAAzB;;QAC2B,aAAQ,GAAG,IAAI,YAAS,EAAU,CAAC;IAC9D,CAAC;CAAA;AAD0B;IAAtB,IAAA,OAAI,EAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;sCAAoC;AAG9D,MAAM,KAAM,SAAQ,SAAM;IAA1B;;QACoB,QAAG,GAAW,CAAC,CAAC;QAChB,QAAG,GAAG,cAAc,CAAA;QAEd,UAAK,GAAG,IAAI,cAAW,EAAQ,CAAC;QAEtD,6DAA6D;QAE7D,gDAAgD;QAChD,yDAAyD;QACzD,yDAAyD;QACzD,MAAM;QACN,gDAAgD;QAChD,yDAAyD;QACzD,yDAAyD;QACzD,MAAM;IACV,CAAC;CAAA;AAfmB;IAAf,IAAA,OAAI,EAAC,QAAQ,CAAC;kCAAiB;AAChB;IAAf,IAAA,OAAI,EAAC,QAAQ,CAAC;kCAAqB;AAEd;IAArB,IAAA,OAAI,GAAE;IAAE,IAAA,OAAI,EAAC,CAAC,IAAI,CAAC,CAAC;oCAAiC;AAc1D,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;AAE1B,6BAA6B;AAC7B,0DAA0D;AAC1D,6DAA6D;AAC7D,6DAA6D;AAC7D,WAAW;AACX,IAAI;AAEJ,kDAAkD;AAClD,yDAAyD;AACzD,yDAAyD;AACzD,OAAO;AAEP,kDAAkD;AAClD,2DAA2D;AAC3D,yDAAyD;AACzD,OAAO;AAEP,SAAS,OAAO;IACZ,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;IACxB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,MAAM,EAAE,CAAC,MAAM,CAAC;QACzC,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QACjD,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;KACpD,CAAC,CAAC,CAAC;IACJ,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,MAAM,EAAE,CAAC,MAAM,CAAC;QACzC,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QACjD,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;KACpD,CAAC,CAAC,CAAC;IACJ,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED,OAAO,EAAE,CAAC;AACV,OAAO,EAAE,CAAC;AAEV,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;AAEzB,MAAM,OAAO,GAAG,IAAI,UAAO,CAAC,KAAK,CAAC,CAAC;AACnC,qDAAqD;AAErD,sCAAsC;AAEtC,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;AACpD,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAEnC,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,SAAS,GAAG,IAAI,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC;AAChF,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,GAAG,IAAI,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC;AAE9E,qEAAqE;AAErE,MAAM,YAAY,GAAG,EAAE,CAAC,MAAM,CAAC;AAE/B,4CAA4C;AAC5C,kCAAkC;AAElC,MAAM,KAAK,GAAG,IAAI,YAAS,EAAE,CAAC;AAC9B,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAE1B,uCAAuC;AACvC,6CAA6C;AAC7C,8BAA8B;AAC9B,8BAA8B;AAC9B,yCAAyC;AAEzC,MAAM,KAAK,GAAG,IAAI,YAAS,EAAS,CAAC;AACrC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AAC1B,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1B,yCAAyC;AAEzC,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;AACvC,MAAM,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;AACvF,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,IAAI,YAAY,CAAC,UAAU,SAAS,CAAC,CAAC;AAE5E,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;AACvC,MAAM,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;AACvF,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,IAAI,YAAY,CAAC,UAAU,SAAS,CAAC,CAAC;AAE5E,qBAAqB;AACrB,yCAAyC;AACzC,+BAA+B;AAC/B,QAAQ;AACR,WAAW;AAEX,qDAAqD;AAErD,uDAAuD;AAEvD,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;AACxE,MAAM,iBAAiB,GAAG,aAAU,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;AACpE,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;AACxE,MAAM,YAAY,GAAG,aAAU,CAAC,MAAM,CAAQ,iBAAiB,CAAC,CAAC;AAEjE,oCAAoC;AACpC,MAAM,OAAO,GAAG,IAAI,UAAO,CAAC,YAAY,CAAC,CAAC;AAG1C,kDAAkD;AAClD,+CAA+C;AAC/C,qDAAqD;AACrD,2EAA2E;AAC3E,cAAc;AAEd,8CAA8C;AAC9C,cAAc;AACd,UAAU;AACV,MAAM;AAEN,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;AAChC,2BAA2B;AAC3B,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;AAE7B,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;AAElD,gCAAgC;AAEhC,8BAA8B;AAE9B,yEAAyE;AACzE,yFAAyF;AAEzF,uDAAuD;AAEvD,cAAc;AAEd,6BAA6B;AAC7B,yCAAyC;AACzC,wCAAwC;AACxC,oEAAoE;AAEpE,0FAA0F;AAC1F,gEAAgE;AAGhE,8BAA8B;AAC9B,yDAAyD;AAEzD,sCAAsC;AAEtC,0CAA0C;AAC1C,oBAAoB;AAEpB,qCAAqC;AAErC,qCAAqC;AACrC,6BAA6B;AAE7B,4BAA4B;AAC5B,+CAA+C;AAE/C,qBAAqB;AACrB,2BAA2B;AAC3B,qCAAqC;AACrC,iCAAiC;AACjC,iCAAiC;AACjC,wBAAwB;AACxB,IAAI;AACJ,kDAAkD;AAClD,wBAAwB;AAExB,6CAA6C;AAC7C,0CAA0C;AAC1C,gCAAgC;AAChC,+CAA+C;AAC/C,8DAA8D;AAC9D,gFAAgF;AAEhF,sCAAsC;AACtC,sBAAsB;AAEtB,qCAAqC;AACrC,2BAA2B;AAE3B,4CAA4C;AAC5C,2BAA2B;AAC3B,iCAAiC;AAEjC,+CAA+C;AAC/C,yCAAyC;AACzC,qCAAqC;AAErC,sDAAsD;AACtD,iCAAiC;AACjC,sEAAsE;AACtE,8CAA8C;AAC9C,iDAAiD;AACjD,iCAAiC;AACjC,oDAAoD;AACpD,wBAAwB;AACxB,cAAc;AAEd,kDAAkD;AAClD,2CAA2C;AAC3C,YAAY;AAEZ,yDAAyD;AACzD,uDAAuD;AACvD,yDAAyD;AACzD,aAAa;AAEb,mCAAmC;AACnC,+CAA+C;AAC/C,gDAAgD;AAChD,mDAAmD;AACnD,uBAAuB;AACvB,uCAAuC;AACvC,gBAAgB;AAChB,4BAA4B;AAC5B,aAAa;AACb,QAAQ;AACR,IAAI;AAEJ,kBAAkB;AAClB,qDAAqD;AACrD,uCAAuC;AACvC,IAAI;AAEJ,+BAA+B;AAC/B,qCAAqC;AACrC,mCAAmC;AACnC,4CAA4C;AAC5C,mDAAmD","sourcesContent":["import * as util from \"node:util\";\nimport \"./symbol.shim\";\n\nimport {\n view,\n type,\n Schema,\n ArraySchema,\n MapSchema,\n Encoder,\n Decoder,\n StateView,\n\n encode, decode,\n OPERATION,\n encodeKeyValueOperation,\n encodeSchemaOperation,\n decodeKeyValueOperation,\n decodeSchemaOperation,\n\n $changes, $decoder, $deleteByIndex, $encoder, $getByIndex, $track,\n\n Metadata,\n ChangeTree,\n Ref,\n Reflection,\n\n} from \".\";\n\nimport { getStateCallbacks } from \"./decoder/strategy/StateCallbacks\";\nimport { getRawChangesCallback } from \"./decoder/strategy/RawChanges\";\n\nconst $callback = {\n $onCreate: Symbol('$onCreate'),\n $onDelete: Symbol('$onDelete'),\n $onUpdate: Symbol('$onUpdate'),\n}\n\nfunction logSingleCall(label: string, callback: Function) {\n const time = Date.now();\n const res = callback();\n console.log(`${label}:`, Date.now() - time);\n return res;\n}\n\nfunction logTime(label: string, callback: Function) {\n const time = Date.now();\n for (let i = 0; i < 500000; i++) {\n callback();\n }\n console.log(`${label}:`, Date.now() - time);\n}\n\n\n// // @ts-ignore\n// globalThis.perform = function perform() {\n// for (let i = 0; i < 500000; i++) {\n// encoder.encodeAll();\n// }\n// }\n\n// const timeout = setInterval(() => {}, 1000);\n\n// function decorate({ get, set }, context: ClassAccessorDecoratorContext): ClassAccessorDecoratorResult<any, any> {\n// const field = context.name.toString();\n// // const fieldIndex = Metadata.addField(context.metadata, field, type);\n\n// const parent = Object.getPrototypeOf(context.metadata);\n\n// let lastIndex = (parent && parent[-1] as number) ?? -1;\n// lastIndex++;\n\n// context.metadata[field] = { type: \"number\" };\n\n// Object.defineProperty(context.metadata, lastIndex, {\n// value: field,\n// enumerable: false,\n// configurable: true,\n// });\n\n// Object.defineProperty(context.metadata, -1, {\n// value: lastIndex,\n// enumerable: false,\n// configurable: true\n// });\n\n// return {\n// init(value) { return value; },\n// get() { return get.call(this); },\n// set(value: any) { set.call(this, value); },\n// };\n// }\n\n// class Fruit {\n// @decorate accessor frutose: number = 1;\n// }\n\n// class Banana extends Fruit {\n// @decorate accessor potassium: number = 10;\n// }\n\n// class Berry extends Fruit {\n// @decorate accessor antioxidants: number = 10;\n// }\n\n// class Strawberry extends Berry {\n// @decorate accessor fiber: number = 10;\n// }\n\n// class Grape extends Berry {\n// @decorate accessor vitaminc: number = 5;\n// }\n\n// console.log(\"fruit:\", Fruit[Symbol.metadata], Object.keys(Fruit[Symbol.metadata]));\n// console.log(\"banana:\", Banana[Symbol.metadata], Object.keys(Banana[Symbol.metadata]));\n// console.log(\"strawberry:\", Strawberry[Symbol.metadata], Object.keys(Strawberry[Symbol.metadata]));\n// console.log(\"grape:\", Grape[Symbol.metadata], Object.keys(Grape[Symbol.metadata]));\n\n// console.log(\"GRAPE =>\");\n\n// function printFields(metadata) {\n// let i = 0;\n// const len = metadata[-1]\n// console.log({ len });\n// for (let i = 0; i <= len; i++) {\n// console.log(\"over len...\", i, metadata[i])\n// }\n// }\n\n// console.log(\"Grape...\");\n// printFields(Grape[Symbol.metadata]);\n\n// console.log(\"Banana...\");\n// printFields(Banana[Symbol.metadata]);\n\n\n// class Item extends Schema {\n// @type(\"string\") accessor name: string;\n// }\n\n// class RootState extends Schema {\n// @type([Item]) accessor items = new ArraySchema<Item>();\n// }\n\n// const s = new RootState();\n// s.items.push(new Item().assign({ name: \"hello\" }));\n\n// const encoder = new Encoder(s);\n// const encoded = encoder.encode();\n\n// const decoder = new Decoder(new RootState());\n// decoder.decode(encoded);\n\nfunction log(message: any) {\n console.log(util.inspect(message, false, 10, true));\n}\n\n// // No need to extend Schema!\n// class Vec3 {\n// x: number;\n// y: number;\n// z: number;\n// constructor() {\n// // Need to initialize property descriptors\n// Schema.initialize(this);\n// }\n// }\n// // Define fields to encode/decode\n// Metadata.setFields(Vec3, {\n// x: \"number\",\n// y: \"number\",\n// z: \"number\",\n// });\n// //\n// Vec3[$track] = function (\n// changeTree: ChangeTree,\n// index: number,\n// operation: OPERATION = OPERATION.ADD\n// ) {\n// changeTree.change(index, operation);\n// };\n// Vec3[$encoder] = encodeSchemaOperation;\n// Vec3[$decoder] = decodeSchemaOperation;\n// // @ts-ignore\n// if (!Vec3.prototype.toJSON) { Vec3.prototype.toJSON = Schema.prototype.toJSON; }\n\n// -------------------------------------------------------------------------------\n\nclass Vec3 extends Schema {\n @type(\"number\") x: number;\n @type(\"number\") y: number;\n @type(\"number\") z: number;\n}\n// Vec3[$track] = function (changeTree, index) {\n// changeTree.change(0, OPERATION.ADD);\n// };\n// Vec3[$encoder] = function (encoder, bytes, changeTree, index, operation, it) {\n// encode.number(bytes, changeTree.ref.x, it);\n// encode.number(bytes, changeTree.ref.y, it);\n// encode.number(bytes, changeTree.ref.z, it);\n// };\n// Vec3[$decoder] = function (\n// decoder: Decoder<any>,\n// bytes: number[],\n// it: decode.Iterator,\n// ref: Vec3,\n// allChanges: DataChange[]\n// ) {\n// ref.x = decode.number(bytes, it);\n// ref.y = decode.number(bytes, it);\n// ref.z = decode.number(bytes, it);\n// };\n\nclass Base extends Schema {}\n\nclass Entity extends Schema {\n @type(Vec3) position = new Vec3().assign({ x: 0, y: 0, z: 0 });\n}\n\nclass Card extends Schema {\n @type(\"string\") suit: string;\n @type(\"number\") num: number;\n}\n\nclass Player extends Entity {\n @type(Vec3) rotation = new Vec3().assign({ x: 0, y: 0, z: 0 });\n @type(\"string\") secret: string = \"private info only for this player\";\n\n @type([Card])\n cards = new ArraySchema<Card>(\n new Card().assign({ suit: \"Hearts\", num: 1 }),\n new Card().assign({ suit: \"Spaces\", num: 2 }),\n new Card().assign({ suit: \"Diamonds\", num: 3 }),\n );\n\n [$callback.$onCreate]() {\n }\n\n}\n\nclass Team extends Schema {\n @type({ map: Entity }) entities = new MapSchema<Entity>();\n}\n\nclass State extends Schema {\n @type(\"number\") num: number = 0;\n @type(\"string\") str = \"Hello world!\"\n\n @view() @type([Team]) teams = new ArraySchema<Team>();\n\n // @type({ map: Entity }) entities = new MapSchema<Entity>();\n\n // @type(Entity) entity1 = new Player().assign({\n // position: new Vec3().assign({ x: 1, y: 2, z: 3 }),\n // rotation: new Vec3().assign({ x: 4, y: 5, z: 6 }),\n // });\n // @type(Entity) entity2 = new Player().assign({\n // position: new Vec3().assign({ x: 1, y: 2, z: 3 }),\n // rotation: new Vec3().assign({ x: 4, y: 5, z: 6 }),\n // });\n}\n\nconst state = new State();\n\n// for (let i=0;i<1000;i++) {\n// state.entities.set(\"one\" + i, new Player().assign({\n// position: new Vec3().assign({ x: 1, y: 2, z: 3 }),\n// rotation: new Vec3().assign({ x: 4, y: 5, z: 6 }),\n// }));\n// }\n\n// state.entities.set(\"one\", new Player().assign({\n// position: new Vec3().assign({ x: 1, y: 2, z: 3 }),\n// rotation: new Vec3().assign({ x: 4, y: 5, z: 6 }),\n// }));\n\n// state.entities.set(\"two\", new Player().assign({\n// position: new Vec3().assign({ x: 10, y: 10, z: 3 }),\n// rotation: new Vec3().assign({ x: 4, y: 5, z: 6 }),\n// }));\n\nfunction addTeam() {\n const team = new Team();\n team.entities.set(\"one\", new Player().assign({\n position: new Vec3().assign({ x: 1, y: 2, z: 3 }),\n rotation: new Vec3().assign({ x: 4, y: 5, z: 6 }),\n }));\n team.entities.set(\"two\", new Player().assign({\n position: new Vec3().assign({ x: 7, y: 8, z: 9 }),\n rotation: new Vec3().assign({ x: 2, y: 3, z: 4 }),\n }));\n state.teams.push(team);\n}\n\naddTeam();\naddTeam();\n\nconst it = { offset: 0 };\n\nconst encoder = new Encoder(state);\n// logTime(\"encode time\", () => encoder.encodeAll());\n\n// const encoded = encoder.encode(it);\n\nconsole.log(\"> will encode all...\", state.toJSON());\nconst encoded = encoder.encode(it);\n\nconsole.log(\"HEAP TOTAL:\", process.memoryUsage().heapTotal / 1024 / 1024, \"MB\");\nconsole.log(\"HEAP USED:\", process.memoryUsage().heapUsed / 1024 / 1024, \"MB\");\n\n// console.log(\"encoded.buffer =>\", `(${encoded.byteLength} bytes)`);\n\nconst sharedOffset = it.offset;\n\n// const team1View = new StateView<State>();\n// team1View.owns(state.teams[0]);\n\nconst view1 = new StateView();\nview1.add(state.teams[0]);\n\n// view1['owned'].add(state[$changes]);\n// view1['owned'].add(state.teams[$changes]);\n// view1.owns(state.teams[0]);\n// view1.owns(state.entities);\n// view1.owns(state.entities.get(\"one\"));\n\nconst view2 = new StateView<State>();\nconsole.log(\">>> VIEW 2\");\nview2.add(state.teams[1]);\n// view2.owns(state.entities.get(\"two\"));\n\nconsole.log(\"> will encode view 1...\");\nconst viewEncoded1 = encoder.encodeView(view1, sharedOffset, it, encoder.sharedBuffer);\nconsole.log(\"done. view1 encoded =>\", `(${viewEncoded1.byteLength} bytes)`);\n\nconsole.log(\"> will encode view 2...\");\nconst viewEncoded2 = encoder.encodeView(view2, sharedOffset, it, encoder.sharedBuffer);\nconsole.log(\"done. view2 encoded =>\", `(${viewEncoded2.byteLength} bytes)`);\n\n// setTimeout(() => {\n// for (let i = 0; i < 500000; i++) {\n// encoder.encodeAll();\n// }\n// }, 1000)\n\n// logTime(\"encode time\", () => encoder.encodeAll());\n\n// console.log(`encode: (${encoded.length})`, encoded);\n\nconsole.log(\"----------------------------------- ENCODE reflection...\");\nconst encodedReflection = Reflection.encode(state, encoder.context);\nconsole.log(\"----------------------------------- DECODE reflection...\");\nconst decodedState = Reflection.decode<State>(encodedReflection);\n\n// const decodedState = new State();\nconst decoder = new Decoder(decodedState);\n\n\n// $(decoder.state).teams.onAdd((team, index) => {\n// // room.$state.bind(team, frontendTeam);\n// $(team).entities.onAdd((entity, entityId) => {\n// $(entity as Player).listen(\"secret\", (value, previousValue) => {\n// });\n\n// $(entity).position.onChange(() => {\n// });\n// });\n// });\n\nconsole.log(\"> will decode...\");\n// decoder.decode(encoded);\ndecoder.decode(viewEncoded1);\n\nconsole.log(\"Decoded =>\", decoder.state.toJSON());\n\n// decoder.decode(viewEncoded2);\n\n// log(decodedState.toJSON());\n\n// console.log(\"encoder.$root.changes =>\", encoder.$root.changes.length);\n// console.log(\"encoder.$root.filteredChanges =>\", encoder.$root.filteredChanges.length);\n\n// state.teams[0].entities.get(\"one\").position.x = 100;\n\n// // encoder.\n\n// const it2 = { offset: 0 };\n// // const encoded = encoder.encode(it);\n// const encoded2 = encoder.encode(it2);\n// console.log(`> shared encode... (${encoded2.byteLength} bytes)`);\n\n// const viewEncoded3 = encoder.encodeView(view1, sharedOffset, it, encoder.sharedBuffer);\n// console.log(`> view1... (${viewEncoded3.byteLength} bytes)`);\n\n\n// log(decoder.root.toJSON());\n// logTime(\"decode time\", () => decoder.decode(encoded));\n\n// console.log(\"changes =>\", changes);\n\n// const rotation = state.entity.rotation;\n// rotation.x = 100;\n\n// state.entity.rotation = undefined;\n\n// const encoded2 = encoder.encode();\n// console.log({ encoded2 });\n\n// decoder.decode(encoded2);\n// console.log(\"decoded =>\", decoded.toJSON());\n\n// console.profile();\n// const time = Date.now();\n// for (let i = 0; i < 300000; i++) {\n// const state = new State();\n// encoder['setRoot'](state);\n// encoder.encode();\n// }\n// console.log(\"encode time:\", Date.now() - time);\n// console.profileEnd();\n\n// state.players.set(\"entity\", new Entity());\n// state.players.set(\"one\", new Player());\n// console.log(\"state:\", state);\n// console.log(\"state.players\", state.players);\n// console.log(\"state.players.one\", state.players.get(\"one\"));\n// console.log(\"state.players.one.position\", state.players.get(\"one\").position);\n\n// const encoder = new Encoder(state);\n// // encoder.change()\n\n// let encoded = encoder.encodeAll();\n// console.log({ encoded })\n\n// const decoder = new Decoder(new State());\n// decoder.decode(encoded);\n// log(decoder['root'].toJSON());\n\n// const reflection = Reflection.encode(state);\n// console.log(\"encoded =>\", reflection);\n// log(Reflection.decode(reflection))\n\n///////...............................................\n// function type (type: string) {\n// return function (_: any, context: ClassFieldDecoratorContext) {\n// context.addInitializer(function() {\n// console.log(\"INITIALIZER!\", this);\n// setTimeout(() => {\n// context.access.set(this, \"WHAT\");\n// }, 1000);\n// });\n\n// context.access.get = function(object) {\n// return object[context.name];\n// }\n\n// context.access.set = function(object, value) {\n// console.log(\"setter...\", object, value);\n// object[context.name] = `Setter[${value}]`;\n// };\n\n// return function(value) {\n// console.log(\"SET\", this, value);\n// if (typeof(value) === \"string\") {\n// value = `Initializer[${value}]`;\n// } else {\n// value = value * 100;\n// }\n// return value;\n// };\n// }\n// }\n\n// class MyState {\n// @type(\"string\") name: string = \"Hello world!\";\n// @type(\"number\") num: number = 1;\n// }\n\n// const state = new MyState();\n// console.log(\"name: \", state.name);\n// console.log(\"num: \", state.num);\n// state.name = `${state.name} modified...`;\n// setTimeout(() => console.log(state.name), 1100);\n"]}
|
package/package.json
CHANGED
package/src/annotations.ts
CHANGED
|
@@ -597,7 +597,8 @@ export function schema<
|
|
|
597
597
|
|
|
598
598
|
} else if (value['type'] !== undefined && Schema.is(value['type'])) {
|
|
599
599
|
// Direct Schema type: Type → new Type()
|
|
600
|
-
|
|
600
|
+
// TODO: should we auto-initialize Schema instances, in case their initialize() method is not defined?
|
|
601
|
+
// defaultValues[fieldName] = new value['type']();
|
|
601
602
|
}
|
|
602
603
|
} else {
|
|
603
604
|
defaultValues[fieldName] = value['default'];
|
|
@@ -607,7 +608,8 @@ export function schema<
|
|
|
607
608
|
} else if (typeof (value) === "function") {
|
|
608
609
|
if (Schema.is(value)) {
|
|
609
610
|
// Direct Schema type: Type → new Type()
|
|
610
|
-
|
|
611
|
+
// TODO: should we auto-initialize Schema instances, in case their initialize() method is not defined?
|
|
612
|
+
// defaultValues[fieldName] = new value();
|
|
611
613
|
fields[fieldName] = getNormalizedType(value);
|
|
612
614
|
} else {
|
|
613
615
|
methods[fieldName] = value;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { nanoid } from "nanoid";
|
|
2
|
+
import { Schema, type, MapSchema, ArraySchema, Encoder } from ".";
|
|
3
|
+
import * as benchmark from "benchmark";
|
|
4
|
+
|
|
5
|
+
const suite = new benchmark.Suite();
|
|
6
|
+
|
|
7
|
+
class AttributeNew extends Schema {
|
|
8
|
+
@type("string") name: string;
|
|
9
|
+
@type("number") value: number;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
class ItemNew extends Schema {
|
|
13
|
+
@type("number") price: number;
|
|
14
|
+
@type([ AttributeNew ]) attributes = new ArraySchema<AttributeNew>();
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
class PositionNew extends Schema {
|
|
18
|
+
@type("number") x: number;
|
|
19
|
+
@type("number") y: number;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
class PlayerNew extends Schema {
|
|
23
|
+
@type(PositionNew) position = new PositionNew();
|
|
24
|
+
@type({ map: ItemNew }) items = new MapSchema<ItemNew>();
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
class StateNew extends Schema {
|
|
28
|
+
@type({ map: PlayerNew }) players = new MapSchema<PlayerNew>();
|
|
29
|
+
@type("string") currentTurn: string;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const state = new StateNew();
|
|
33
|
+
|
|
34
|
+
for (let i = 0; i < 50; i++) {
|
|
35
|
+
const player = new PlayerNew();
|
|
36
|
+
state.players.set(`p-${nanoid()}`, player);
|
|
37
|
+
|
|
38
|
+
player.position.x = (i + 1) * 100;
|
|
39
|
+
player.position.y = (i + 1) * 100;
|
|
40
|
+
for (let j = 0; j < 10; j++) {
|
|
41
|
+
const item = new ItemNew();
|
|
42
|
+
item.price = (i + 1) * 50;
|
|
43
|
+
for (let k = 0; k < 5; k++) {
|
|
44
|
+
const attr = new AttributeNew();
|
|
45
|
+
attr.name = `Attribute ${k}`;
|
|
46
|
+
attr.value = k;
|
|
47
|
+
item.attributes.push(attr);
|
|
48
|
+
|
|
49
|
+
}
|
|
50
|
+
player.items.set(`item-${j}`, item);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
Encoder.BUFFER_SIZE = 1024 * 128;
|
|
55
|
+
const encoder = new Encoder(state);
|
|
56
|
+
|
|
57
|
+
// measure time to .encodeAll()
|
|
58
|
+
|
|
59
|
+
const now = Date.now();
|
|
60
|
+
for (let i = 0; i < 1000; i++) {
|
|
61
|
+
encoder.encodeAll();
|
|
62
|
+
}
|
|
63
|
+
console.log(Date.now() - now);
|
|
64
|
+
console.log(Array.from(encoder.encodeAll()).join(","));
|
package/src/codegen/parser.ts
CHANGED
|
@@ -186,7 +186,7 @@ function inspectNode(node: ts.Node, context: Context, decoratorName: string) {
|
|
|
186
186
|
// skip if no className is provided
|
|
187
187
|
if (!className) { break; }
|
|
188
188
|
|
|
189
|
-
if (currentStructure
|
|
189
|
+
if (currentStructure?.name !== className) {
|
|
190
190
|
currentStructure = new Class();
|
|
191
191
|
}
|
|
192
192
|
context.addStructure(currentStructure);
|
|
@@ -277,7 +277,7 @@ function inspectNode(node: ts.Node, context: Context, decoratorName: string) {
|
|
|
277
277
|
// skip if no className is provided
|
|
278
278
|
if (!className) { break; }
|
|
279
279
|
|
|
280
|
-
if (currentStructure
|
|
280
|
+
if (currentStructure?.name !== className) {
|
|
281
281
|
currentStructure = new Class();
|
|
282
282
|
context.addStructure(currentStructure);
|
|
283
283
|
}
|