@colyseus/schema 2.0.4 → 2.0.6
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/README.md +0 -4
- package/build/cjs/index.js +48 -48
- package/build/cjs/index.js.map +1 -1
- package/build/esm/index.mjs +130 -104
- package/build/esm/index.mjs.map +1 -1
- package/build/umd/index.js +50 -50
- package/lib/Reflection.js +87 -119
- package/lib/Reflection.js.map +1 -1
- package/lib/Schema.js +195 -257
- package/lib/Schema.js.map +1 -1
- package/lib/annotations.d.ts +6 -6
- package/lib/annotations.js +64 -92
- package/lib/annotations.js.map +1 -1
- package/lib/changes/ChangeTree.d.ts +1 -1
- package/lib/changes/ChangeTree.js +63 -70
- package/lib/changes/ChangeTree.js.map +1 -1
- package/lib/changes/ReferenceTracker.js +24 -27
- package/lib/changes/ReferenceTracker.js.map +1 -1
- package/lib/codegen/api.js +9 -9
- package/lib/codegen/api.js.map +1 -1
- package/lib/codegen/argv.d.ts +1 -1
- package/lib/codegen/argv.js +11 -11
- package/lib/codegen/argv.js.map +1 -1
- package/lib/codegen/cli.js +21 -10
- package/lib/codegen/cli.js.map +1 -1
- package/lib/codegen/languages/cpp.js +126 -77
- package/lib/codegen/languages/cpp.js.map +1 -1
- package/lib/codegen/languages/csharp.js +121 -62
- package/lib/codegen/languages/csharp.js.map +1 -1
- package/lib/codegen/languages/haxe.js +34 -26
- package/lib/codegen/languages/haxe.js.map +1 -1
- package/lib/codegen/languages/java.js +39 -27
- package/lib/codegen/languages/java.js.map +1 -1
- package/lib/codegen/languages/js.js +48 -32
- package/lib/codegen/languages/js.js.map +1 -1
- package/lib/codegen/languages/lua.js +35 -24
- package/lib/codegen/languages/lua.js.map +1 -1
- package/lib/codegen/languages/ts.js +63 -68
- package/lib/codegen/languages/ts.js.map +1 -1
- package/lib/codegen/parser.d.ts +9 -1
- package/lib/codegen/parser.js +88 -46
- package/lib/codegen/parser.js.map +1 -1
- package/lib/codegen/types.d.ts +8 -0
- package/lib/codegen/types.js +64 -54
- package/lib/codegen/types.js.map +1 -1
- package/lib/encoding/decode.js +15 -15
- package/lib/encoding/decode.js.map +1 -1
- package/lib/encoding/encode.js +14 -14
- package/lib/encoding/encode.js.map +1 -1
- package/lib/events/EventEmitter.d.ts +1 -1
- package/lib/events/EventEmitter.js +16 -47
- package/lib/events/EventEmitter.js.map +1 -1
- package/lib/filters/index.js +7 -8
- package/lib/filters/index.js.map +1 -1
- package/lib/index.js +11 -11
- package/lib/index.js.map +1 -1
- package/lib/types/ArraySchema.d.ts +1 -1
- package/lib/types/ArraySchema.js +161 -219
- package/lib/types/ArraySchema.js.map +1 -1
- package/lib/types/CollectionSchema.d.ts +1 -1
- package/lib/types/CollectionSchema.js +63 -71
- package/lib/types/CollectionSchema.js.map +1 -1
- package/lib/types/HelperTypes.d.ts +9 -9
- package/lib/types/MapSchema.d.ts +16 -16
- package/lib/types/MapSchema.js +68 -78
- package/lib/types/MapSchema.js.map +1 -1
- package/lib/types/SetSchema.js +62 -71
- package/lib/types/SetSchema.js.map +1 -1
- package/lib/types/index.js +1 -1
- package/lib/types/index.js.map +1 -1
- package/lib/types/typeRegistry.js +1 -1
- package/lib/types/typeRegistry.js.map +1 -1
- package/lib/types/utils.js +9 -10
- package/lib/types/utils.js.map +1 -1
- package/lib/utils.js +10 -13
- package/lib/utils.js.map +1 -1
- package/package.json +18 -15
- package/src/Reflection.ts +159 -0
- package/src/Schema.ts +1024 -0
- package/src/annotations.ts +400 -0
- package/src/changes/ChangeTree.ts +295 -0
- package/src/changes/ReferenceTracker.ts +81 -0
- package/src/codegen/api.ts +46 -0
- package/src/codegen/argv.ts +40 -0
- package/src/codegen/cli.ts +65 -0
- package/src/codegen/languages/cpp.ts +297 -0
- package/src/codegen/languages/csharp.ts +208 -0
- package/src/codegen/languages/haxe.ts +110 -0
- package/src/codegen/languages/java.ts +115 -0
- package/src/codegen/languages/js.ts +115 -0
- package/src/codegen/languages/lua.ts +125 -0
- package/src/codegen/languages/ts.ts +129 -0
- package/src/codegen/parser.ts +299 -0
- package/src/codegen/types.ts +177 -0
- package/src/encoding/decode.ts +278 -0
- package/src/encoding/encode.ts +283 -0
- package/src/filters/index.ts +23 -0
- package/src/index.ts +59 -0
- package/src/spec.ts +49 -0
- package/src/types/ArraySchema.ts +612 -0
- package/src/types/CollectionSchema.ts +199 -0
- package/src/types/HelperTypes.ts +34 -0
- package/src/types/MapSchema.ts +268 -0
- package/src/types/SetSchema.ts +208 -0
- package/src/types/typeRegistry.ts +19 -0
- package/src/types/utils.ts +62 -0
- package/src/utils.ts +28 -0
package/lib/types/MapSchema.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.MapSchema = exports.getMapProxy = void 0;
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
const utils_1 = require("./utils");
|
|
5
|
+
const ChangeTree_1 = require("../changes/ChangeTree");
|
|
6
|
+
const spec_1 = require("../spec");
|
|
7
7
|
function getMapProxy(value) {
|
|
8
8
|
value['$proxy'] = true;
|
|
9
9
|
value = new Proxy(value, {
|
|
10
|
-
get:
|
|
10
|
+
get: (obj, prop) => {
|
|
11
11
|
if (typeof (prop) !== "symbol" && // accessing properties
|
|
12
12
|
typeof (obj[prop]) === "undefined") {
|
|
13
13
|
return obj.get(prop);
|
|
@@ -16,7 +16,7 @@ function getMapProxy(value) {
|
|
|
16
16
|
return obj[prop];
|
|
17
17
|
}
|
|
18
18
|
},
|
|
19
|
-
set:
|
|
19
|
+
set: (obj, prop, setValue) => {
|
|
20
20
|
if (typeof (prop) !== "symbol" &&
|
|
21
21
|
(prop.indexOf("$") === -1 &&
|
|
22
22
|
prop !== "onAdd" &&
|
|
@@ -29,7 +29,7 @@ function getMapProxy(value) {
|
|
|
29
29
|
}
|
|
30
30
|
return true;
|
|
31
31
|
},
|
|
32
|
-
deleteProperty:
|
|
32
|
+
deleteProperty: (obj, prop) => {
|
|
33
33
|
obj.delete(prop);
|
|
34
34
|
return true;
|
|
35
35
|
},
|
|
@@ -37,55 +37,50 @@ function getMapProxy(value) {
|
|
|
37
37
|
return value;
|
|
38
38
|
}
|
|
39
39
|
exports.getMapProxy = getMapProxy;
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
40
|
+
class MapSchema {
|
|
41
|
+
onAdd(callback, triggerAll = true) {
|
|
42
|
+
return (0, utils_1.addCallback)((this.$callbacks || (this.$callbacks = [])), spec_1.OPERATION.ADD, callback, (triggerAll)
|
|
43
|
+
? this.$items
|
|
44
|
+
: undefined);
|
|
45
|
+
}
|
|
46
|
+
onRemove(callback) { return (0, utils_1.addCallback)(this.$callbacks || (this.$callbacks = []), spec_1.OPERATION.DELETE, callback); }
|
|
47
|
+
onChange(callback) { return (0, utils_1.addCallback)(this.$callbacks || (this.$callbacks = []), spec_1.OPERATION.REPLACE, callback); }
|
|
48
|
+
static is(type) {
|
|
49
|
+
return type['map'] !== undefined;
|
|
50
|
+
}
|
|
51
|
+
constructor(initialValues) {
|
|
43
52
|
this.$changes = new ChangeTree_1.ChangeTree(this);
|
|
44
53
|
this.$items = new Map();
|
|
45
54
|
this.$indexes = new Map();
|
|
46
55
|
this.$refId = 0;
|
|
47
56
|
if (initialValues) {
|
|
48
|
-
if (initialValues instanceof Map
|
|
49
|
-
initialValues
|
|
57
|
+
if (initialValues instanceof Map ||
|
|
58
|
+
initialValues instanceof MapSchema) {
|
|
59
|
+
initialValues.forEach((v, k) => this.set(k, v));
|
|
50
60
|
}
|
|
51
61
|
else {
|
|
52
|
-
for (
|
|
62
|
+
for (const k in initialValues) {
|
|
53
63
|
this.set(k, initialValues[k]);
|
|
54
64
|
}
|
|
55
65
|
}
|
|
56
66
|
}
|
|
57
67
|
}
|
|
58
|
-
MapSchema.prototype.onAdd = function (callback, triggerAll) {
|
|
59
|
-
if (triggerAll === void 0) { triggerAll = true; }
|
|
60
|
-
return utils_1.addCallback((this.$callbacks || (this.$callbacks = [])), spec_1.OPERATION.ADD, callback, (triggerAll)
|
|
61
|
-
? this.$items
|
|
62
|
-
: undefined);
|
|
63
|
-
};
|
|
64
|
-
MapSchema.prototype.onRemove = function (callback) { return utils_1.addCallback(this.$callbacks || (this.$callbacks = []), spec_1.OPERATION.DELETE, callback); };
|
|
65
|
-
MapSchema.prototype.onChange = function (callback) { return utils_1.addCallback(this.$callbacks || (this.$callbacks = []), spec_1.OPERATION.REPLACE, callback); };
|
|
66
|
-
MapSchema.is = function (type) {
|
|
67
|
-
return type['map'] !== undefined;
|
|
68
|
-
};
|
|
69
68
|
/** Iterator */
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
enumerable: false,
|
|
74
|
-
configurable: true
|
|
75
|
-
});
|
|
76
|
-
MapSchema.prototype.set = function (key, value) {
|
|
69
|
+
[Symbol.iterator]() { return this.$items[Symbol.iterator](); }
|
|
70
|
+
get [Symbol.toStringTag]() { return this.$items[Symbol.toStringTag]; }
|
|
71
|
+
set(key, value) {
|
|
77
72
|
if (value === undefined || value === null) {
|
|
78
|
-
throw new Error(
|
|
73
|
+
throw new Error(`MapSchema#set('${key}', ${value}): trying to set ${value} value on '${key}'.`);
|
|
79
74
|
}
|
|
80
75
|
// get "index" for this value.
|
|
81
|
-
|
|
82
|
-
|
|
76
|
+
const hasIndex = typeof (this.$changes.indexes[key]) !== "undefined";
|
|
77
|
+
const index = (hasIndex)
|
|
83
78
|
? this.$changes.indexes[key]
|
|
84
79
|
: this.$refId++;
|
|
85
|
-
|
|
80
|
+
let operation = (hasIndex)
|
|
86
81
|
? spec_1.OPERATION.REPLACE
|
|
87
82
|
: spec_1.OPERATION.ADD;
|
|
88
|
-
|
|
83
|
+
const isRef = (value['$changes']) !== undefined;
|
|
89
84
|
if (isRef) {
|
|
90
85
|
value['$changes'].setParent(this, this.$changes.root, index);
|
|
91
86
|
}
|
|
@@ -104,11 +99,11 @@ var MapSchema = /** @class */ (function () {
|
|
|
104
99
|
this.$items.set(key, value);
|
|
105
100
|
this.$changes.change(key, operation);
|
|
106
101
|
return this;
|
|
107
|
-
}
|
|
108
|
-
|
|
102
|
+
}
|
|
103
|
+
get(key) {
|
|
109
104
|
return this.$items.get(key);
|
|
110
|
-
}
|
|
111
|
-
|
|
105
|
+
}
|
|
106
|
+
delete(key) {
|
|
112
107
|
//
|
|
113
108
|
// TODO: add a "purge" method after .encode() runs, to cleanup removed `$indexes`
|
|
114
109
|
//
|
|
@@ -119,8 +114,8 @@ var MapSchema = /** @class */ (function () {
|
|
|
119
114
|
// // this.$indexes.delete(index);
|
|
120
115
|
this.$changes.delete(key);
|
|
121
116
|
return this.$items.delete(key);
|
|
122
|
-
}
|
|
123
|
-
|
|
117
|
+
}
|
|
118
|
+
clear(changes) {
|
|
124
119
|
// discard previous operations.
|
|
125
120
|
this.$changes.discard(true, true);
|
|
126
121
|
this.$changes.indexes = {};
|
|
@@ -139,57 +134,53 @@ var MapSchema = /** @class */ (function () {
|
|
|
139
134
|
this.$changes.operation({ index: 0, op: spec_1.OPERATION.CLEAR });
|
|
140
135
|
// touch all structures until reach root
|
|
141
136
|
this.$changes.touchParents();
|
|
142
|
-
}
|
|
143
|
-
|
|
137
|
+
}
|
|
138
|
+
has(key) {
|
|
144
139
|
return this.$items.has(key);
|
|
145
|
-
}
|
|
146
|
-
|
|
140
|
+
}
|
|
141
|
+
forEach(callbackfn) {
|
|
147
142
|
this.$items.forEach(callbackfn);
|
|
148
|
-
}
|
|
149
|
-
|
|
143
|
+
}
|
|
144
|
+
entries() {
|
|
150
145
|
return this.$items.entries();
|
|
151
|
-
}
|
|
152
|
-
|
|
146
|
+
}
|
|
147
|
+
keys() {
|
|
153
148
|
return this.$items.keys();
|
|
154
|
-
}
|
|
155
|
-
|
|
149
|
+
}
|
|
150
|
+
values() {
|
|
156
151
|
return this.$items.values();
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
enumerable: false,
|
|
163
|
-
configurable: true
|
|
164
|
-
});
|
|
165
|
-
MapSchema.prototype.setIndex = function (index, key) {
|
|
152
|
+
}
|
|
153
|
+
get size() {
|
|
154
|
+
return this.$items.size;
|
|
155
|
+
}
|
|
156
|
+
setIndex(index, key) {
|
|
166
157
|
this.$indexes.set(index, key);
|
|
167
|
-
}
|
|
168
|
-
|
|
158
|
+
}
|
|
159
|
+
getIndex(index) {
|
|
169
160
|
return this.$indexes.get(index);
|
|
170
|
-
}
|
|
171
|
-
|
|
161
|
+
}
|
|
162
|
+
getByIndex(index) {
|
|
172
163
|
return this.$items.get(this.$indexes.get(index));
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
|
|
164
|
+
}
|
|
165
|
+
deleteByIndex(index) {
|
|
166
|
+
const key = this.$indexes.get(index);
|
|
176
167
|
this.$items.delete(key);
|
|
177
168
|
this.$indexes.delete(index);
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
this.forEach(
|
|
169
|
+
}
|
|
170
|
+
toJSON() {
|
|
171
|
+
const map = {};
|
|
172
|
+
this.forEach((value, key) => {
|
|
182
173
|
map[key] = (typeof (value['toJSON']) === "function")
|
|
183
174
|
? value['toJSON']()
|
|
184
175
|
: value;
|
|
185
176
|
});
|
|
186
177
|
return map;
|
|
187
|
-
}
|
|
178
|
+
}
|
|
188
179
|
//
|
|
189
180
|
// Decoding utilities
|
|
190
181
|
//
|
|
191
|
-
|
|
192
|
-
|
|
182
|
+
clone(isDecoding) {
|
|
183
|
+
let cloned;
|
|
193
184
|
if (isDecoding) {
|
|
194
185
|
// client-side
|
|
195
186
|
cloned = Object.assign(new MapSchema(), this);
|
|
@@ -197,7 +188,7 @@ var MapSchema = /** @class */ (function () {
|
|
|
197
188
|
else {
|
|
198
189
|
// server-side
|
|
199
190
|
cloned = new MapSchema();
|
|
200
|
-
this.forEach(
|
|
191
|
+
this.forEach((value, key) => {
|
|
201
192
|
if (value['$changes']) {
|
|
202
193
|
cloned.set(key, value['clone']());
|
|
203
194
|
}
|
|
@@ -207,8 +198,7 @@ var MapSchema = /** @class */ (function () {
|
|
|
207
198
|
});
|
|
208
199
|
}
|
|
209
200
|
return cloned;
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
}());
|
|
201
|
+
}
|
|
202
|
+
}
|
|
213
203
|
exports.MapSchema = MapSchema;
|
|
214
204
|
//# sourceMappingURL=MapSchema.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MapSchema.js","sourceRoot":"","sources":["../../src/types/MapSchema.ts"],"names":[],"mappings":"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","sourcesContent":["import { ChangeTree } from \"../changes/ChangeTree\";\nimport { OPERATION } from \"../spec\";\nimport { SchemaDecoderCallbacks, Schema } from \"../Schema\";\nimport { addCallback, removeChildRefs } from \"./utils\";\nimport { DataChange } from \"..\";\n\nexport function getMapProxy(value: MapSchema) {\n value['$proxy'] = true;\n\n value = new Proxy(value, {\n get: (obj, prop) => {\n if (\n typeof (prop) !== \"symbol\" && // accessing properties\n typeof (obj[prop]) === \"undefined\"\n ) {\n return obj.get(prop as string);\n\n } else {\n return obj[prop];\n }\n },\n\n set: (obj, prop, setValue) => {\n if (\n typeof (prop) !== \"symbol\" &&\n (\n (prop as string).indexOf(\"$\") === -1 &&\n prop !== \"onAdd\" &&\n prop !== \"onRemove\" &&\n prop !== \"onChange\"\n )\n ) {\n obj.set(prop as string, setValue);\n\n } else {\n obj[prop] = setValue;\n }\n return true;\n },\n\n deleteProperty: (obj, prop) => {\n obj.delete(prop as string);\n return true;\n },\n });\n\n return value;\n}\n\nexport class MapSchema<V=any> implements Map<string, V>, SchemaDecoderCallbacks {\n protected $changes: ChangeTree = new ChangeTree(this);\n\n protected $items: Map<string, V> = new Map<string, V>();\n protected $indexes: Map<number, string> = new Map<number, string>();\n\n protected $refId: number = 0;\n\n //\n // Decoding callbacks\n //\n public $callbacks: { [operation: number]: Array<(item: V, key: string) => void> };\n public onAdd(callback: (item: V, key: string) => void, triggerAll: boolean = true) {\n return addCallback(\n (this.$callbacks || (this.$callbacks = [])),\n OPERATION.ADD,\n callback,\n (triggerAll)\n ? this.$items\n : undefined\n );\n }\n public onRemove(callback: (item: V, key: string) => void) { return addCallback(this.$callbacks || (this.$callbacks = []), OPERATION.DELETE, callback); }\n public onChange(callback: (item: V, key: string) => void) { return addCallback(this.$callbacks || (this.$callbacks = []), OPERATION.REPLACE, callback); }\n\n static is(type: any) {\n return type['map'] !== undefined;\n }\n\n constructor (initialValues?: Map<string, V> | any) {\n if (initialValues) {\n if (initialValues instanceof Map) {\n initialValues.forEach((v, k) => this.set(k, v));\n\n } else {\n for (const k in initialValues) {\n this.set(k, initialValues[k]);\n }\n }\n }\n }\n\n /** Iterator */\n [Symbol.iterator](): IterableIterator<[string, V]> { return this.$items[Symbol.iterator](); }\n get [Symbol.toStringTag]() { return this.$items[Symbol.toStringTag] }\n\n set(key: string, value: V) {\n if (value === undefined || value === null) {\n throw new Error(`MapSchema#set('${key}', ${value}): trying to set ${value} value on '${key}'.`);\n }\n\n // get \"index\" for this value.\n const hasIndex = typeof(this.$changes.indexes[key]) !== \"undefined\";\n const index = (hasIndex)\n ? this.$changes.indexes[key]\n : this.$refId++;\n\n let operation: OPERATION = (hasIndex)\n ? OPERATION.REPLACE\n : OPERATION.ADD;\n\n const isRef = (value['$changes']) !== undefined;\n if (isRef) {\n (value['$changes'] as ChangeTree).setParent(\n this,\n this.$changes.root,\n index\n );\n }\n\n //\n // (encoding)\n // set a unique id to relate directly with this key/value.\n //\n if (!hasIndex) {\n this.$changes.indexes[key] = index;\n this.$indexes.set(index, key);\n\n } else if (\n isRef && // if is schema, force ADD operation if value differ from previous one.\n this.$items.get(key) !== value\n ) {\n operation = OPERATION.ADD;\n }\n\n this.$items.set(key, value);\n\n this.$changes.change(key, operation);\n\n return this;\n }\n\n get(key: string): V | undefined {\n return this.$items.get(key);\n }\n\n delete(key: string) {\n //\n // TODO: add a \"purge\" method after .encode() runs, to cleanup removed `$indexes`\n //\n // We don't remove $indexes to allow setting the same key in the same patch\n // (See \"should allow to remove and set an item in the same place\" test)\n //\n // // const index = this.$changes.indexes[key];\n // // this.$indexes.delete(index);\n\n this.$changes.delete(key);\n return this.$items.delete(key);\n }\n\n clear(changes?: DataChange[]) {\n // discard previous operations.\n this.$changes.discard(true, true);\n this.$changes.indexes = {};\n\n // clear previous indexes\n this.$indexes.clear();\n\n //\n // When decoding:\n // - enqueue items for DELETE callback.\n // - flag child items for garbage collection.\n //\n if (changes) {\n removeChildRefs.call(this, changes);\n }\n\n // clear items\n this.$items.clear();\n\n this.$changes.operation({ index: 0, op: OPERATION.CLEAR });\n\n // touch all structures until reach root\n this.$changes.touchParents();\n }\n\n has (key: string) {\n return this.$items.has(key);\n }\n\n forEach(callbackfn: (value: V, key: string, map: Map<string, V>) => void) {\n this.$items.forEach(callbackfn);\n }\n\n entries () {\n return this.$items.entries();\n }\n\n keys () {\n return this.$items.keys();\n }\n\n values() {\n return this.$items.values();\n }\n\n get size () {\n return this.$items.size;\n }\n\n protected setIndex(index: number, key: string) {\n this.$indexes.set(index, key);\n }\n\n protected getIndex(index: number) {\n return this.$indexes.get(index);\n }\n\n protected getByIndex(index: number) {\n return this.$items.get(this.$indexes.get(index));\n }\n\n protected deleteByIndex(index: number) {\n const key = this.$indexes.get(index);\n this.$items.delete(key);\n this.$indexes.delete(index);\n }\n\n toJSON() {\n const map: any = {};\n\n this.forEach((value, key) => {\n map[key] = (typeof (value['toJSON']) === \"function\")\n ? value['toJSON']()\n : value;\n });\n\n return map;\n }\n\n //\n // Decoding utilities\n //\n clone(isDecoding?: boolean): MapSchema<V> {\n let cloned: MapSchema;\n\n if (isDecoding) {\n // client-side\n cloned = Object.assign(new MapSchema(), this);\n\n } else {\n // server-side\n cloned = new MapSchema();\n this.forEach((value, key) => {\n if (value['$changes']) {\n cloned.set(key, value['clone']());\n } else {\n cloned.set(key, value);\n }\n })\n }\n\n return cloned;\n }\n\n}\n"]}
|
|
1
|
+
{"version":3,"file":"MapSchema.js","sourceRoot":"","sources":["../../src/types/MapSchema.ts"],"names":[],"mappings":";;;AACA,mCAAuD;AAEvD,sDAAmD;AACnD,kCAAoC;AAEpC,SAAgB,WAAW,CAAC,KAAgB;IACxC,KAAK,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;IAEvB,KAAK,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;QACrB,GAAG,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;YACf,IACI,OAAO,CAAC,IAAI,CAAC,KAAK,QAAQ,IAAI,uBAAuB;gBACrD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,WAAW,EACpC;gBACE,OAAO,GAAG,CAAC,GAAG,CAAC,IAAc,CAAC,CAAC;aAElC;iBAAM;gBACH,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC;aACpB;QACL,CAAC;QAED,GAAG,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;YACzB,IACI,OAAO,CAAC,IAAI,CAAC,KAAK,QAAQ;gBAC1B,CACK,IAAe,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;oBACpC,IAAI,KAAK,OAAO;oBAChB,IAAI,KAAK,UAAU;oBACnB,IAAI,KAAK,UAAU,CACtB,EACH;gBACE,GAAG,CAAC,GAAG,CAAC,IAAc,EAAE,QAAQ,CAAC,CAAC;aAErC;iBAAM;gBACH,GAAG,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC;aACxB;YACD,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,cAAc,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;YAC1B,GAAG,CAAC,MAAM,CAAC,IAAc,CAAC,CAAC;YAC3B,OAAO,IAAI,CAAC;QAChB,CAAC;KACJ,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC;AACjB,CAAC;AAzCD,kCAyCC;AAED,MAAa,SAAS;IAYX,KAAK,CAAC,QAAwC,EAAE,aAAsB,IAAI;QAC7E,OAAO,IAAA,mBAAW,EACd,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC,EAC3C,gBAAS,CAAC,GAAG,EACb,QAAQ,EACR,CAAC,UAAU,CAAC;YACR,CAAC,CAAC,IAAI,CAAC,MAAM;YACb,CAAC,CAAC,SAAS,CAClB,CAAC;IACN,CAAC;IACM,QAAQ,CAAC,QAAwC,IAAI,OAAO,IAAA,mBAAW,EAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC,EAAE,gBAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IACjJ,QAAQ,CAAC,QAAwC,IAAI,OAAO,IAAA,mBAAW,EAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC,EAAE,gBAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEzJ,MAAM,CAAC,EAAE,CAAC,IAAS;QACf,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC;IACrC,CAAC;IAED,YAAa,aAAwC;QA5B3C,aAAQ,GAAe,IAAI,uBAAU,CAAC,IAAI,CAAC,CAAC;QAE5C,WAAM,GAAc,IAAI,GAAG,EAAQ,CAAC;QACpC,aAAQ,GAAmB,IAAI,GAAG,EAAa,CAAC;QAEhD,WAAM,GAAW,CAAC,CAAC;QAwBzB,IAAI,aAAa,EAAE;YACf,IACI,aAAa,YAAY,GAAG;gBAC5B,aAAa,YAAY,SAAS,EACpC;gBACE,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;aAEnD;iBAAM;gBACH,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE;oBAC3B,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;iBACjC;aACJ;SACJ;IACL,CAAC;IAED,eAAe;IACf,CAAC,MAAM,CAAC,QAAQ,CAAC,KAA+B,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IACxF,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA,CAAC,CAAC;IAErE,GAAG,CAAC,GAAM,EAAE,KAAQ;QAChB,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE;YACvC,MAAM,IAAI,KAAK,CAAC,kBAAkB,GAAG,MAAM,KAAK,oBAAoB,KAAK,cAAc,GAAG,IAAI,CAAC,CAAC;SACnG;QAED,8BAA8B;QAC9B,MAAM,QAAQ,GAAG,OAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,WAAW,CAAC;QACpE,MAAM,KAAK,GAAG,CAAC,QAAQ,CAAC;YACpB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC;YAC5B,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QAEpB,IAAI,SAAS,GAAc,CAAC,QAAQ,CAAC;YACjC,CAAC,CAAC,gBAAS,CAAC,OAAO;YACnB,CAAC,CAAC,gBAAS,CAAC,GAAG,CAAC;QAEpB,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,KAAK,SAAS,CAAC;QAChD,IAAI,KAAK,EAAE;YACN,KAAK,CAAC,UAAU,CAAgB,CAAC,SAAS,CACvC,IAAI,EACJ,IAAI,CAAC,QAAQ,CAAC,IAAI,EAClB,KAAK,CACR,CAAC;SACL;QAED,EAAE;QACF,aAAa;QACb,0DAA0D;QAC1D,EAAE;QACF,IAAI,CAAC,QAAQ,EAAE;YACX,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACnC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;SAEjC;aAAM,IACH,KAAK,IAAI,uEAAuE;YAChF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK,EAChC;YACE,SAAS,GAAG,gBAAS,CAAC,GAAG,CAAC;SAC7B;QAED,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAE5B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAErC,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,GAAG,CAAC,GAAM;QACN,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;IAED,MAAM,CAAC,GAAM;QACT,EAAE;QACF,iFAAiF;QACjF,EAAE;QACF,2EAA2E;QAC3E,wEAAwE;QACxE,EAAE;QACF,+CAA+C;QAC/C,kCAAkC;QAElC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,OAAsB;QACxB,+BAA+B;QAC/B,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,QAAQ,CAAC,OAAO,GAAG,EAAE,CAAC;QAE3B,yBAAyB;QACzB,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QAEtB,EAAE;QACF,iBAAiB;QACjB,uCAAuC;QACvC,6CAA6C;QAC7C,EAAE;QACF,IAAI,OAAO,EAAE;YACT,uBAAe,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;SACvC;QAED,cAAc;QACd,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAEpB,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,gBAAS,CAAC,KAAK,EAAE,CAAC,CAAC;QAE3D,wCAAwC;QACxC,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC;IACjC,CAAC;IAED,GAAG,CAAE,GAAM;QACP,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,CAAC,UAAsD;QAC1D,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACpC,CAAC;IAED,OAAO;QACH,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;IACjC,CAAC;IAED,IAAI;QACA,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC9B,CAAC;IAED,MAAM;QACF,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;IAChC,CAAC;IAED,IAAI,IAAI;QACJ,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;IAC5B,CAAC;IAES,QAAQ,CAAC,KAAa,EAAE,GAAM;QACpC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAClC,CAAC;IAES,QAAQ,CAAC,KAAa;QAC5B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAES,UAAU,CAAC,KAAa;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IACrD,CAAC;IAES,aAAa,CAAC,KAAa;QACjC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IAED,MAAM;QACF,MAAM,GAAG,GAAQ,EAAE,CAAC;QAEpB,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YACxB,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,KAAK,UAAU,CAAC;gBAChD,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;gBACnB,CAAC,CAAC,KAAK,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,OAAO,GAAG,CAAC;IACf,CAAC;IAED,EAAE;IACF,qBAAqB;IACrB,EAAE;IACF,KAAK,CAAC,UAAoB;QACtB,IAAI,MAAiB,CAAC;QAEtB,IAAI,UAAU,EAAE;YACZ,cAAc;YACd,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,SAAS,EAAE,EAAE,IAAI,CAAC,CAAC;SAEjD;aAAM;YACH,cAAc;YACd,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;YACzB,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;gBACxB,IAAI,KAAK,CAAC,UAAU,CAAC,EAAE;oBACnB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;iBACrC;qBAAM;oBACH,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;iBAC1B;YACL,CAAC,CAAC,CAAA;SACL;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;CAEJ;AA1ND,8BA0NC","sourcesContent":["import { SchemaDecoderCallbacks } from \"../Schema\";\nimport { addCallback, removeChildRefs } from \"./utils\";\nimport { DataChange } from \"..\";\nimport { ChangeTree } from \"../changes/ChangeTree\";\nimport { OPERATION } from \"../spec\";\n\nexport function getMapProxy(value: MapSchema) {\n value['$proxy'] = true;\n\n value = new Proxy(value, {\n get: (obj, prop) => {\n if (\n typeof (prop) !== \"symbol\" && // accessing properties\n typeof (obj[prop]) === \"undefined\"\n ) {\n return obj.get(prop as string);\n\n } else {\n return obj[prop];\n }\n },\n\n set: (obj, prop, setValue) => {\n if (\n typeof (prop) !== \"symbol\" &&\n (\n (prop as string).indexOf(\"$\") === -1 &&\n prop !== \"onAdd\" &&\n prop !== \"onRemove\" &&\n prop !== \"onChange\"\n )\n ) {\n obj.set(prop as string, setValue);\n\n } else {\n obj[prop] = setValue;\n }\n return true;\n },\n\n deleteProperty: (obj, prop) => {\n obj.delete(prop as string);\n return true;\n },\n });\n\n return value;\n}\n\nexport class MapSchema<V=any, K extends string = string> implements Map<K, V>, SchemaDecoderCallbacks {\n protected $changes: ChangeTree = new ChangeTree(this);\n\n protected $items: Map<K, V> = new Map<K, V>();\n protected $indexes: Map<number, K> = new Map<number, K>();\n\n protected $refId: number = 0;\n\n //\n // Decoding callbacks\n //\n public $callbacks: { [operation: number]: Array<(item: V, key: string) => void> };\n public onAdd(callback: (item: V, key: string) => void, triggerAll: boolean = true) {\n return addCallback(\n (this.$callbacks || (this.$callbacks = [])),\n OPERATION.ADD,\n callback,\n (triggerAll)\n ? this.$items\n : undefined\n );\n }\n public onRemove(callback: (item: V, key: string) => void) { return addCallback(this.$callbacks || (this.$callbacks = []), OPERATION.DELETE, callback); }\n public onChange(callback: (item: V, key: string) => void) { return addCallback(this.$callbacks || (this.$callbacks = []), OPERATION.REPLACE, callback); }\n\n static is(type: any) {\n return type['map'] !== undefined;\n }\n\n constructor (initialValues?: Map<K, V> | Record<K, V>) {\n if (initialValues) {\n if (\n initialValues instanceof Map ||\n initialValues instanceof MapSchema\n ) {\n initialValues.forEach((v, k) => this.set(k, v));\n\n } else {\n for (const k in initialValues) {\n this.set(k, initialValues[k]);\n }\n }\n }\n }\n\n /** Iterator */\n [Symbol.iterator](): IterableIterator<[K, V]> { return this.$items[Symbol.iterator](); }\n get [Symbol.toStringTag]() { return this.$items[Symbol.toStringTag] }\n\n set(key: K, value: V) {\n if (value === undefined || value === null) {\n throw new Error(`MapSchema#set('${key}', ${value}): trying to set ${value} value on '${key}'.`);\n }\n\n // get \"index\" for this value.\n const hasIndex = typeof(this.$changes.indexes[key]) !== \"undefined\";\n const index = (hasIndex)\n ? this.$changes.indexes[key]\n : this.$refId++;\n\n let operation: OPERATION = (hasIndex)\n ? OPERATION.REPLACE\n : OPERATION.ADD;\n\n const isRef = (value['$changes']) !== undefined;\n if (isRef) {\n (value['$changes'] as ChangeTree).setParent(\n this,\n this.$changes.root,\n index\n );\n }\n\n //\n // (encoding)\n // set a unique id to relate directly with this key/value.\n //\n if (!hasIndex) {\n this.$changes.indexes[key] = index;\n this.$indexes.set(index, key);\n\n } else if (\n isRef && // if is schema, force ADD operation if value differ from previous one.\n this.$items.get(key) !== value\n ) {\n operation = OPERATION.ADD;\n }\n\n this.$items.set(key, value);\n\n this.$changes.change(key, operation);\n\n return this;\n }\n\n get(key: K): V | undefined {\n return this.$items.get(key);\n }\n\n delete(key: K) {\n //\n // TODO: add a \"purge\" method after .encode() runs, to cleanup removed `$indexes`\n //\n // We don't remove $indexes to allow setting the same key in the same patch\n // (See \"should allow to remove and set an item in the same place\" test)\n //\n // // const index = this.$changes.indexes[key];\n // // this.$indexes.delete(index);\n\n this.$changes.delete(key);\n return this.$items.delete(key);\n }\n\n clear(changes?: DataChange[]) {\n // discard previous operations.\n this.$changes.discard(true, true);\n this.$changes.indexes = {};\n\n // clear previous indexes\n this.$indexes.clear();\n\n //\n // When decoding:\n // - enqueue items for DELETE callback.\n // - flag child items for garbage collection.\n //\n if (changes) {\n removeChildRefs.call(this, changes);\n }\n\n // clear items\n this.$items.clear();\n\n this.$changes.operation({ index: 0, op: OPERATION.CLEAR });\n\n // touch all structures until reach root\n this.$changes.touchParents();\n }\n\n has (key: K) {\n return this.$items.has(key);\n }\n\n forEach(callbackfn: (value: V, key: K, map: Map<K, V>) => void) {\n this.$items.forEach(callbackfn);\n }\n\n entries () {\n return this.$items.entries();\n }\n\n keys () {\n return this.$items.keys();\n }\n\n values() {\n return this.$items.values();\n }\n\n get size () {\n return this.$items.size;\n }\n\n protected setIndex(index: number, key: K) {\n this.$indexes.set(index, key);\n }\n\n protected getIndex(index: number) {\n return this.$indexes.get(index);\n }\n\n protected getByIndex(index: number) {\n return this.$items.get(this.$indexes.get(index));\n }\n\n protected deleteByIndex(index: number) {\n const key = this.$indexes.get(index);\n this.$items.delete(key);\n this.$indexes.delete(index);\n }\n\n toJSON() {\n const map: any = {};\n\n this.forEach((value, key) => {\n map[key] = (typeof (value['toJSON']) === \"function\")\n ? value['toJSON']()\n : value;\n });\n\n return map;\n }\n\n //\n // Decoding utilities\n //\n clone(isDecoding?: boolean): MapSchema<V> {\n let cloned: MapSchema;\n\n if (isDecoding) {\n // client-side\n cloned = Object.assign(new MapSchema(), this);\n\n } else {\n // server-side\n cloned = new MapSchema();\n this.forEach((value, key) => {\n if (value['$changes']) {\n cloned.set(key, value['clone']());\n } else {\n cloned.set(key, value);\n }\n })\n }\n\n return cloned;\n }\n\n}\n"]}
|
package/lib/types/SetSchema.js
CHANGED
|
@@ -1,56 +1,53 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.SetSchema = void 0;
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
4
|
+
const ChangeTree_1 = require("../changes/ChangeTree");
|
|
5
|
+
const spec_1 = require("../spec");
|
|
6
|
+
const utils_1 = require("./utils");
|
|
7
|
+
class SetSchema {
|
|
8
|
+
onAdd(callback, triggerAll = true) {
|
|
9
|
+
return (0, utils_1.addCallback)((this.$callbacks || (this.$callbacks = [])), spec_1.OPERATION.ADD, callback, (triggerAll)
|
|
10
|
+
? this.$items
|
|
11
|
+
: undefined);
|
|
12
|
+
}
|
|
13
|
+
onRemove(callback) { return (0, utils_1.addCallback)(this.$callbacks || (this.$callbacks = []), spec_1.OPERATION.DELETE, callback); }
|
|
14
|
+
onChange(callback) { return (0, utils_1.addCallback)(this.$callbacks || (this.$callbacks = []), spec_1.OPERATION.REPLACE, callback); }
|
|
15
|
+
static is(type) {
|
|
16
|
+
return type['set'] !== undefined;
|
|
17
|
+
}
|
|
18
|
+
constructor(initialValues) {
|
|
10
19
|
this.$changes = new ChangeTree_1.ChangeTree(this);
|
|
11
20
|
this.$items = new Map();
|
|
12
21
|
this.$indexes = new Map();
|
|
13
22
|
this.$refId = 0;
|
|
14
23
|
if (initialValues) {
|
|
15
|
-
initialValues.forEach(
|
|
24
|
+
initialValues.forEach((v) => this.add(v));
|
|
16
25
|
}
|
|
17
26
|
}
|
|
18
|
-
|
|
19
|
-
if (triggerAll === void 0) { triggerAll = true; }
|
|
20
|
-
return utils_1.addCallback((this.$callbacks || (this.$callbacks = [])), spec_1.OPERATION.ADD, callback, (triggerAll)
|
|
21
|
-
? this.$items
|
|
22
|
-
: undefined);
|
|
23
|
-
};
|
|
24
|
-
SetSchema.prototype.onRemove = function (callback) { return utils_1.addCallback(this.$callbacks || (this.$callbacks = []), spec_1.OPERATION.DELETE, callback); };
|
|
25
|
-
SetSchema.prototype.onChange = function (callback) { return utils_1.addCallback(this.$callbacks || (this.$callbacks = []), spec_1.OPERATION.REPLACE, callback); };
|
|
26
|
-
SetSchema.is = function (type) {
|
|
27
|
-
return type['set'] !== undefined;
|
|
28
|
-
};
|
|
29
|
-
SetSchema.prototype.add = function (value) {
|
|
30
|
-
var _a, _b;
|
|
27
|
+
add(value) {
|
|
31
28
|
// immediatelly return false if value already added.
|
|
32
29
|
if (this.has(value)) {
|
|
33
30
|
return false;
|
|
34
31
|
}
|
|
35
32
|
// set "index" for reference.
|
|
36
|
-
|
|
33
|
+
const index = this.$refId++;
|
|
37
34
|
if ((value['$changes']) !== undefined) {
|
|
38
35
|
value['$changes'].setParent(this, this.$changes.root, index);
|
|
39
36
|
}
|
|
40
|
-
|
|
37
|
+
const operation = this.$changes.indexes[index]?.op ?? spec_1.OPERATION.ADD;
|
|
41
38
|
this.$changes.indexes[index] = index;
|
|
42
39
|
this.$indexes.set(index, index);
|
|
43
40
|
this.$items.set(index, value);
|
|
44
41
|
this.$changes.change(index, operation);
|
|
45
42
|
return index;
|
|
46
|
-
}
|
|
47
|
-
|
|
43
|
+
}
|
|
44
|
+
entries() {
|
|
48
45
|
return this.$items.entries();
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
46
|
+
}
|
|
47
|
+
delete(item) {
|
|
48
|
+
const entries = this.$items.entries();
|
|
49
|
+
let index;
|
|
50
|
+
let entry;
|
|
54
51
|
while (entry = entries.next()) {
|
|
55
52
|
if (entry.done) {
|
|
56
53
|
break;
|
|
@@ -66,8 +63,8 @@ var SetSchema = /** @class */ (function () {
|
|
|
66
63
|
this.$changes.delete(index);
|
|
67
64
|
this.$indexes.delete(index);
|
|
68
65
|
return this.$items.delete(index);
|
|
69
|
-
}
|
|
70
|
-
|
|
66
|
+
}
|
|
67
|
+
clear(changes) {
|
|
71
68
|
// discard previous operations.
|
|
72
69
|
this.$changes.discard(true, true);
|
|
73
70
|
this.$changes.indexes = {};
|
|
@@ -86,11 +83,11 @@ var SetSchema = /** @class */ (function () {
|
|
|
86
83
|
this.$changes.operation({ index: 0, op: spec_1.OPERATION.CLEAR });
|
|
87
84
|
// touch all structures until reach root
|
|
88
85
|
this.$changes.touchParents();
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
86
|
+
}
|
|
87
|
+
has(value) {
|
|
88
|
+
const values = this.$items.values();
|
|
89
|
+
let has = false;
|
|
90
|
+
let entry;
|
|
94
91
|
while (entry = values.next()) {
|
|
95
92
|
if (entry.done) {
|
|
96
93
|
break;
|
|
@@ -101,52 +98,47 @@ var SetSchema = /** @class */ (function () {
|
|
|
101
98
|
}
|
|
102
99
|
}
|
|
103
100
|
return has;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
SetSchema.prototype.values = function () {
|
|
101
|
+
}
|
|
102
|
+
forEach(callbackfn) {
|
|
103
|
+
this.$items.forEach((value, key, _) => callbackfn(value, key, this));
|
|
104
|
+
}
|
|
105
|
+
values() {
|
|
110
106
|
return this.$items.values();
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
enumerable: false,
|
|
117
|
-
configurable: true
|
|
118
|
-
});
|
|
119
|
-
SetSchema.prototype.setIndex = function (index, key) {
|
|
107
|
+
}
|
|
108
|
+
get size() {
|
|
109
|
+
return this.$items.size;
|
|
110
|
+
}
|
|
111
|
+
setIndex(index, key) {
|
|
120
112
|
this.$indexes.set(index, key);
|
|
121
|
-
}
|
|
122
|
-
|
|
113
|
+
}
|
|
114
|
+
getIndex(index) {
|
|
123
115
|
return this.$indexes.get(index);
|
|
124
|
-
}
|
|
125
|
-
|
|
116
|
+
}
|
|
117
|
+
getByIndex(index) {
|
|
126
118
|
return this.$items.get(this.$indexes.get(index));
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
|
|
119
|
+
}
|
|
120
|
+
deleteByIndex(index) {
|
|
121
|
+
const key = this.$indexes.get(index);
|
|
130
122
|
this.$items.delete(key);
|
|
131
123
|
this.$indexes.delete(index);
|
|
132
|
-
}
|
|
133
|
-
|
|
124
|
+
}
|
|
125
|
+
toArray() {
|
|
134
126
|
return Array.from(this.$items.values());
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
this.forEach(
|
|
127
|
+
}
|
|
128
|
+
toJSON() {
|
|
129
|
+
const values = [];
|
|
130
|
+
this.forEach((value, key) => {
|
|
139
131
|
values.push((typeof (value['toJSON']) === "function")
|
|
140
132
|
? value['toJSON']()
|
|
141
133
|
: value);
|
|
142
134
|
});
|
|
143
135
|
return values;
|
|
144
|
-
}
|
|
136
|
+
}
|
|
145
137
|
//
|
|
146
138
|
// Decoding utilities
|
|
147
139
|
//
|
|
148
|
-
|
|
149
|
-
|
|
140
|
+
clone(isDecoding) {
|
|
141
|
+
let cloned;
|
|
150
142
|
if (isDecoding) {
|
|
151
143
|
// client-side
|
|
152
144
|
cloned = Object.assign(new SetSchema(), this);
|
|
@@ -154,7 +146,7 @@ var SetSchema = /** @class */ (function () {
|
|
|
154
146
|
else {
|
|
155
147
|
// server-side
|
|
156
148
|
cloned = new SetSchema();
|
|
157
|
-
this.forEach(
|
|
149
|
+
this.forEach((value) => {
|
|
158
150
|
if (value['$changes']) {
|
|
159
151
|
cloned.add(value['clone']());
|
|
160
152
|
}
|
|
@@ -164,8 +156,7 @@ var SetSchema = /** @class */ (function () {
|
|
|
164
156
|
});
|
|
165
157
|
}
|
|
166
158
|
return cloned;
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
}());
|
|
159
|
+
}
|
|
160
|
+
}
|
|
170
161
|
exports.SetSchema = SetSchema;
|
|
171
162
|
//# sourceMappingURL=SetSchema.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SetSchema.js","sourceRoot":"","sources":["../../src/types/SetSchema.ts"],"names":[],"mappings":"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","sourcesContent":["import { ChangeTree } from \"../changes/ChangeTree\";\nimport { OPERATION } from \"../spec\";\nimport { SchemaDecoderCallbacks } from \"../Schema\";\nimport { addCallback, removeChildRefs } from \"./utils\";\nimport { DataChange } from \"..\";\n\nexport class SetSchema<V=any> implements SchemaDecoderCallbacks {\n protected $changes: ChangeTree = new ChangeTree(this);\n\n protected $items: Map<number, V> = new Map<number, V>();\n protected $indexes: Map<number, number> = new Map<number, number>();\n\n protected $refId: number = 0;\n\n //\n // Decoding callbacks\n //\n public $callbacks: { [operation: number]: Array<(item: V, key: string) => void> };\n public onAdd(callback: (item: V, key: string) => void, triggerAll: boolean = true) {\n return addCallback(\n (this.$callbacks || (this.$callbacks = [])),\n OPERATION.ADD,\n callback,\n (triggerAll)\n ? this.$items\n : undefined\n );\n }\n public onRemove(callback: (item: V, key: string) => void) { return addCallback(this.$callbacks || (this.$callbacks = []), OPERATION.DELETE, callback); }\n public onChange(callback: (item: V, key: string) => void) { return addCallback(this.$callbacks || (this.$callbacks = []), OPERATION.REPLACE, callback); }\n\n static is(type: any) {\n return type['set'] !== undefined;\n }\n\n constructor (initialValues?: Array<V>) {\n if (initialValues) {\n initialValues.forEach((v) => this.add(v));\n }\n }\n\n add(value: V) {\n // immediatelly return false if value already added.\n if (this.has(value)) { return false; }\n\n // set \"index\" for reference.\n const index = this.$refId++;\n\n if ((value['$changes']) !== undefined) {\n (value['$changes'] as ChangeTree).setParent(this, this.$changes.root, index);\n }\n\n const operation = this.$changes.indexes[index]?.op ?? OPERATION.ADD;\n\n this.$changes.indexes[index] = index;\n\n this.$indexes.set(index, index);\n this.$items.set(index, value);\n\n this.$changes.change(index, operation);\n return index;\n }\n\n entries () {\n return this.$items.entries();\n }\n\n delete(item: V) {\n const entries = this.$items.entries();\n\n let index: number;\n let entry: IteratorResult<[number, V]>;\n while (entry = entries.next()) {\n if (entry.done) { break; }\n\n if (item === entry.value[1]) {\n index = entry.value[0];\n break;\n }\n }\n\n if (index === undefined) {\n return false;\n }\n\n this.$changes.delete(index);\n this.$indexes.delete(index);\n\n return this.$items.delete(index);\n }\n\n clear(changes?: DataChange[]) {\n // discard previous operations.\n this.$changes.discard(true, true);\n this.$changes.indexes = {};\n\n // clear previous indexes\n this.$indexes.clear();\n\n //\n // When decoding:\n // - enqueue items for DELETE callback.\n // - flag child items for garbage collection.\n //\n if (changes) {\n removeChildRefs.call(this, changes);\n }\n\n // clear items\n this.$items.clear();\n\n this.$changes.operation({ index: 0, op: OPERATION.CLEAR });\n\n // touch all structures until reach root\n this.$changes.touchParents();\n }\n\n has (value: V): boolean {\n const values = this.$items.values();\n\n let has = false;\n let entry: IteratorResult<V>;\n\n while (entry = values.next()) {\n if (entry.done) { break; }\n if (value === entry.value) {\n has = true;\n break;\n }\n }\n\n return has;\n }\n\n forEach(callbackfn: (value: V, key: number, collection: SetSchema<V>) => void) {\n this.$items.forEach((value, key, _) => callbackfn(value, key, this));\n }\n\n values() {\n return this.$items.values();\n }\n\n get size () {\n return this.$items.size;\n }\n\n protected setIndex(index: number, key: number) {\n this.$indexes.set(index, key);\n }\n\n protected getIndex(index: number) {\n return this.$indexes.get(index);\n }\n\n protected getByIndex(index: number) {\n return this.$items.get(this.$indexes.get(index));\n }\n\n protected deleteByIndex(index: number) {\n const key = this.$indexes.get(index);\n this.$items.delete(key);\n this.$indexes.delete(index);\n }\n\n toArray() {\n return Array.from(this.$items.values());\n }\n\n toJSON() {\n const values: V[] = [];\n\n this.forEach((value, key) => {\n values.push(\n (typeof (value['toJSON']) === \"function\")\n ? value['toJSON']()\n : value\n );\n });\n\n return values;\n }\n\n //\n // Decoding utilities\n //\n clone(isDecoding?: boolean): SetSchema<V> {\n let cloned: SetSchema;\n\n if (isDecoding) {\n // client-side\n cloned = Object.assign(new SetSchema(), this);\n\n } else {\n // server-side\n cloned = new SetSchema();\n this.forEach((value) => {\n if (value['$changes']) {\n cloned.add(value['clone']());\n } else {\n cloned.add(value);\n }\n })\n }\n\n return cloned;\n }\n\n}"]}
|
|
1
|
+
{"version":3,"file":"SetSchema.js","sourceRoot":"","sources":["../../src/types/SetSchema.ts"],"names":[],"mappings":"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","sourcesContent":["import { ChangeTree } from \"../changes/ChangeTree\";\nimport { OPERATION } from \"../spec\";\nimport { SchemaDecoderCallbacks } from \"../Schema\";\nimport { addCallback, removeChildRefs } from \"./utils\";\nimport { DataChange } from \"..\";\n\nexport class SetSchema<V=any> implements SchemaDecoderCallbacks {\n protected $changes: ChangeTree = new ChangeTree(this);\n\n protected $items: Map<number, V> = new Map<number, V>();\n protected $indexes: Map<number, number> = new Map<number, number>();\n\n protected $refId: number = 0;\n\n //\n // Decoding callbacks\n //\n public $callbacks: { [operation: number]: Array<(item: V, key: string) => void> };\n public onAdd(callback: (item: V, key: string) => void, triggerAll: boolean = true) {\n return addCallback(\n (this.$callbacks || (this.$callbacks = [])),\n OPERATION.ADD,\n callback,\n (triggerAll)\n ? this.$items\n : undefined\n );\n }\n public onRemove(callback: (item: V, key: string) => void) { return addCallback(this.$callbacks || (this.$callbacks = []), OPERATION.DELETE, callback); }\n public onChange(callback: (item: V, key: string) => void) { return addCallback(this.$callbacks || (this.$callbacks = []), OPERATION.REPLACE, callback); }\n\n static is(type: any) {\n return type['set'] !== undefined;\n }\n\n constructor (initialValues?: Array<V>) {\n if (initialValues) {\n initialValues.forEach((v) => this.add(v));\n }\n }\n\n add(value: V) {\n // immediatelly return false if value already added.\n if (this.has(value)) { return false; }\n\n // set \"index\" for reference.\n const index = this.$refId++;\n\n if ((value['$changes']) !== undefined) {\n (value['$changes'] as ChangeTree).setParent(this, this.$changes.root, index);\n }\n\n const operation = this.$changes.indexes[index]?.op ?? OPERATION.ADD;\n\n this.$changes.indexes[index] = index;\n\n this.$indexes.set(index, index);\n this.$items.set(index, value);\n\n this.$changes.change(index, operation);\n return index;\n }\n\n entries () {\n return this.$items.entries();\n }\n\n delete(item: V) {\n const entries = this.$items.entries();\n\n let index: number;\n let entry: IteratorResult<[number, V]>;\n while (entry = entries.next()) {\n if (entry.done) { break; }\n\n if (item === entry.value[1]) {\n index = entry.value[0];\n break;\n }\n }\n\n if (index === undefined) {\n return false;\n }\n\n this.$changes.delete(index);\n this.$indexes.delete(index);\n\n return this.$items.delete(index);\n }\n\n clear(changes?: DataChange[]) {\n // discard previous operations.\n this.$changes.discard(true, true);\n this.$changes.indexes = {};\n\n // clear previous indexes\n this.$indexes.clear();\n\n //\n // When decoding:\n // - enqueue items for DELETE callback.\n // - flag child items for garbage collection.\n //\n if (changes) {\n removeChildRefs.call(this, changes);\n }\n\n // clear items\n this.$items.clear();\n\n this.$changes.operation({ index: 0, op: OPERATION.CLEAR });\n\n // touch all structures until reach root\n this.$changes.touchParents();\n }\n\n has (value: V): boolean {\n const values = this.$items.values();\n\n let has = false;\n let entry: IteratorResult<V>;\n\n while (entry = values.next()) {\n if (entry.done) { break; }\n if (value === entry.value) {\n has = true;\n break;\n }\n }\n\n return has;\n }\n\n forEach(callbackfn: (value: V, key: number, collection: SetSchema<V>) => void) {\n this.$items.forEach((value, key, _) => callbackfn(value, key, this));\n }\n\n values() {\n return this.$items.values();\n }\n\n get size () {\n return this.$items.size;\n }\n\n protected setIndex(index: number, key: number) {\n this.$indexes.set(index, key);\n }\n\n protected getIndex(index: number) {\n return this.$indexes.get(index);\n }\n\n protected getByIndex(index: number) {\n return this.$items.get(this.$indexes.get(index));\n }\n\n protected deleteByIndex(index: number) {\n const key = this.$indexes.get(index);\n this.$items.delete(key);\n this.$indexes.delete(index);\n }\n\n toArray() {\n return Array.from(this.$items.values());\n }\n\n toJSON() {\n const values: V[] = [];\n\n this.forEach((value, key) => {\n values.push(\n (typeof (value['toJSON']) === \"function\")\n ? value['toJSON']()\n : value\n );\n });\n\n return values;\n }\n\n //\n // Decoding utilities\n //\n clone(isDecoding?: boolean): SetSchema<V> {\n let cloned: SetSchema;\n\n if (isDecoding) {\n // client-side\n cloned = Object.assign(new SetSchema(), this);\n\n } else {\n // server-side\n cloned = new SetSchema();\n this.forEach((value) => {\n if (value['$changes']) {\n cloned.add(value['clone']());\n } else {\n cloned.add(value);\n }\n })\n }\n\n return cloned;\n }\n\n}"]}
|
package/lib/types/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getType = exports.registerType = void 0;
|
|
4
|
-
|
|
4
|
+
const registeredTypes = {};
|
|
5
5
|
function registerType(identifier, definition) {
|
|
6
6
|
registeredTypes[identifier] = definition;
|
|
7
7
|
}
|
package/lib/types/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":";;;AAUA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":";;;AAUA,MAAM,eAAe,GAA4C,EAAE,CAAC;AAEpE,SAAgB,YAAY,CAAC,UAAkB,EAAE,UAA0B;IACvE,eAAe,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC;AAC7C,CAAC;AAFD,oCAEC;AAED,SAAgB,OAAO,CAAC,UAAkB;IACtC,OAAO,eAAe,CAAC,UAAU,CAAC,CAAC;AACvC,CAAC;AAFD,0BAEC","sourcesContent":["export interface TypeDefinition {\n constructor: any,\n\n //\n // TODO: deprecate proxy on next version\n // the proxy is used for compatibility with versions <1.0.0 of @colyseus/schema\n //\n getProxy?: any,\n}\n\nconst registeredTypes: {[identifier: string] : TypeDefinition} = {};\n\nexport function registerType(identifier: string, definition: TypeDefinition) {\n registeredTypes[identifier] = definition;\n}\n\nexport function getType(identifier: string): TypeDefinition {\n return registeredTypes[identifier];\n}"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getType = exports.registerType = void 0;
|
|
4
|
-
|
|
4
|
+
const registeredTypes = {};
|
|
5
5
|
function registerType(identifier, definition) {
|
|
6
6
|
registeredTypes[identifier] = definition;
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typeRegistry.js","sourceRoot":"","sources":["../../src/types/typeRegistry.ts"],"names":[],"mappings":";;;AAUA,
|
|
1
|
+
{"version":3,"file":"typeRegistry.js","sourceRoot":"","sources":["../../src/types/typeRegistry.ts"],"names":[],"mappings":";;;AAUA,MAAM,eAAe,GAA4C,EAAE,CAAC;AAEpE,SAAgB,YAAY,CAAC,UAAkB,EAAE,UAA0B;IACvE,eAAe,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC;AAC7C,CAAC;AAFD,oCAEC;AAED,SAAgB,OAAO,CAAC,UAAkB;IACtC,OAAO,eAAe,CAAC,UAAU,CAAC,CAAC;AACvC,CAAC;AAFD,0BAEC","sourcesContent":["export interface TypeDefinition {\n constructor: any,\n\n // //\n // // TODO: deprecate proxy on next version\n // // the proxy is used for compatibility with versions <1.0.0 of @colyseus/schema\n // //\n // getProxy?: any,\n}\n\nconst registeredTypes: {[identifier: string] : TypeDefinition} = {};\n\nexport function registerType(identifier: string, definition: TypeDefinition) {\n registeredTypes[identifier] = definition;\n}\n\nexport function getType(identifier: string): TypeDefinition {\n return registeredTypes[identifier];\n}\n"]}
|