@colyseus/schema 4.0.0 → 4.0.2

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.
Files changed (241) hide show
  1. package/build/cjs/{index.js → index.cjs} +1 -1
  2. package/build/cjs/index.cjs.map +1 -0
  3. package/build/esm/index.mjs.map +1 -1
  4. package/lib/Metadata.js +54 -58
  5. package/lib/Metadata.js.map +1 -1
  6. package/lib/Reflection.js +29 -32
  7. package/lib/Reflection.js.map +1 -1
  8. package/lib/Schema.js +41 -45
  9. package/lib/Schema.js.map +1 -1
  10. package/lib/annotations.d.ts +1 -1
  11. package/lib/annotations.js +58 -69
  12. package/lib/annotations.js.map +1 -1
  13. package/lib/bench_encode.js +24 -59
  14. package/lib/bench_encode.js.map +1 -1
  15. package/lib/benchmark.d.ts +1 -0
  16. package/lib/benchmark.js +218 -0
  17. package/lib/benchmark.js.map +1 -0
  18. package/lib/codegen/api.js +10 -41
  19. package/lib/codegen/api.js.map +1 -1
  20. package/lib/codegen/argv.js +1 -3
  21. package/lib/codegen/argv.js.map +1 -1
  22. package/lib/codegen/cli.js +4 -9
  23. package/lib/codegen/cli.js.map +1 -1
  24. package/lib/codegen/languages/cpp.js +5 -8
  25. package/lib/codegen/languages/cpp.js.map +1 -1
  26. package/lib/codegen/languages/csharp.js +5 -8
  27. package/lib/codegen/languages/csharp.js.map +1 -1
  28. package/lib/codegen/languages/haxe.js +3 -6
  29. package/lib/codegen/languages/haxe.js.map +1 -1
  30. package/lib/codegen/languages/java.js +3 -6
  31. package/lib/codegen/languages/java.js.map +1 -1
  32. package/lib/codegen/languages/js.js +4 -7
  33. package/lib/codegen/languages/js.js.map +1 -1
  34. package/lib/codegen/languages/lua.js +4 -7
  35. package/lib/codegen/languages/lua.js.map +1 -1
  36. package/lib/codegen/languages/ts.js +5 -8
  37. package/lib/codegen/languages/ts.js.map +1 -1
  38. package/lib/codegen/parser.js +22 -59
  39. package/lib/codegen/parser.js.map +1 -1
  40. package/lib/codegen/types.js +12 -51
  41. package/lib/codegen/types.js.map +1 -1
  42. package/lib/decoder/DecodeOperation.js +44 -51
  43. package/lib/decoder/DecodeOperation.js.map +1 -1
  44. package/lib/decoder/Decoder.js +24 -28
  45. package/lib/decoder/Decoder.js.map +1 -1
  46. package/lib/decoder/ReferenceTracker.js +10 -14
  47. package/lib/decoder/ReferenceTracker.js.map +1 -1
  48. package/lib/decoder/strategy/Callbacks.js +39 -43
  49. package/lib/decoder/strategy/Callbacks.js.map +1 -1
  50. package/lib/decoder/strategy/RawChanges.js +1 -4
  51. package/lib/decoder/strategy/RawChanges.js.map +1 -1
  52. package/lib/decoder/strategy/getDecoderStateCallbacks.js +24 -27
  53. package/lib/decoder/strategy/getDecoderStateCallbacks.js.map +1 -1
  54. package/lib/encoder/ChangeTree.js +36 -44
  55. package/lib/encoder/ChangeTree.js.map +1 -1
  56. package/lib/encoder/EncodeOperation.js +25 -32
  57. package/lib/encoder/EncodeOperation.js.map +1 -1
  58. package/lib/encoder/Encoder.d.ts +5 -5
  59. package/lib/encoder/Encoder.js +25 -29
  60. package/lib/encoder/Encoder.js.map +1 -1
  61. package/lib/encoder/Root.js +17 -21
  62. package/lib/encoder/Root.js.map +1 -1
  63. package/lib/encoder/StateView.js +40 -45
  64. package/lib/encoder/StateView.js.map +1 -1
  65. package/lib/encoding/assert.js +3 -9
  66. package/lib/encoding/assert.js.map +1 -1
  67. package/lib/encoding/decode.js +2 -6
  68. package/lib/encoding/decode.js.map +1 -1
  69. package/lib/encoding/encode.js +1 -4
  70. package/lib/encoding/encode.js.map +1 -1
  71. package/lib/encoding/spec.js +4 -7
  72. package/lib/encoding/spec.js.map +1 -1
  73. package/lib/index.d.ts +2 -2
  74. package/lib/index.js +33 -75
  75. package/lib/index.js.map +1 -1
  76. package/lib/src/Metadata.d.ts +49 -0
  77. package/lib/src/Metadata.js +256 -0
  78. package/lib/src/Metadata.js.map +1 -0
  79. package/lib/src/Reflection.d.ts +71 -0
  80. package/lib/src/Reflection.js +179 -0
  81. package/lib/src/Reflection.js.map +1 -0
  82. package/lib/src/Schema.d.ts +86 -0
  83. package/lib/src/Schema.js +352 -0
  84. package/lib/src/Schema.js.map +1 -0
  85. package/lib/src/annotations.d.ts +109 -0
  86. package/lib/src/annotations.js +473 -0
  87. package/lib/src/annotations.js.map +1 -0
  88. package/lib/src/bench_encode.d.ts +1 -0
  89. package/lib/src/bench_encode.js +91 -0
  90. package/lib/src/bench_encode.js.map +1 -0
  91. package/lib/src/codegen/api.d.ts +7 -0
  92. package/lib/src/codegen/api.js +56 -0
  93. package/lib/src/codegen/api.js.map +1 -0
  94. package/lib/src/codegen/argv.d.ts +6 -0
  95. package/lib/src/codegen/argv.js +39 -0
  96. package/lib/src/codegen/argv.js.map +1 -0
  97. package/lib/src/codegen/cli.d.ts +1 -0
  98. package/lib/src/codegen/cli.js +58 -0
  99. package/lib/src/codegen/cli.js.map +1 -0
  100. package/lib/src/codegen/languages/cpp.d.ts +3 -0
  101. package/lib/src/codegen/languages/cpp.js +258 -0
  102. package/lib/src/codegen/languages/cpp.js.map +1 -0
  103. package/lib/src/codegen/languages/csharp.d.ts +4 -0
  104. package/lib/src/codegen/languages/csharp.js +154 -0
  105. package/lib/src/codegen/languages/csharp.js.map +1 -0
  106. package/lib/src/codegen/languages/haxe.d.ts +3 -0
  107. package/lib/src/codegen/languages/haxe.js +100 -0
  108. package/lib/src/codegen/languages/haxe.js.map +1 -0
  109. package/lib/src/codegen/languages/java.d.ts +6 -0
  110. package/lib/src/codegen/languages/java.js +100 -0
  111. package/lib/src/codegen/languages/java.js.map +1 -0
  112. package/lib/src/codegen/languages/js.d.ts +3 -0
  113. package/lib/src/codegen/languages/js.js +101 -0
  114. package/lib/src/codegen/languages/js.js.map +1 -0
  115. package/lib/src/codegen/languages/lua.d.ts +3 -0
  116. package/lib/src/codegen/languages/lua.js +103 -0
  117. package/lib/src/codegen/languages/lua.js.map +1 -0
  118. package/lib/src/codegen/languages/ts.d.ts +3 -0
  119. package/lib/src/codegen/languages/ts.js +116 -0
  120. package/lib/src/codegen/languages/ts.js.map +1 -0
  121. package/lib/src/codegen/parser.d.ts +13 -0
  122. package/lib/src/codegen/parser.js +327 -0
  123. package/lib/src/codegen/parser.js.map +1 -0
  124. package/lib/src/codegen/types.d.ts +52 -0
  125. package/lib/src/codegen/types.js +142 -0
  126. package/lib/src/codegen/types.js.map +1 -0
  127. package/lib/src/decoder/DecodeOperation.d.ts +23 -0
  128. package/lib/src/decoder/DecodeOperation.js +248 -0
  129. package/lib/src/decoder/DecodeOperation.js.map +1 -0
  130. package/lib/src/decoder/Decoder.d.ts +21 -0
  131. package/lib/src/decoder/Decoder.js +114 -0
  132. package/lib/src/decoder/Decoder.js.map +1 -0
  133. package/lib/src/decoder/ReferenceTracker.d.ts +25 -0
  134. package/lib/src/decoder/ReferenceTracker.js +135 -0
  135. package/lib/src/decoder/ReferenceTracker.js.map +1 -0
  136. package/lib/src/decoder/strategy/Callbacks.d.ts +154 -0
  137. package/lib/src/decoder/strategy/Callbacks.js +336 -0
  138. package/lib/src/decoder/strategy/Callbacks.js.map +1 -0
  139. package/lib/src/decoder/strategy/RawChanges.d.ts +3 -0
  140. package/lib/src/decoder/strategy/RawChanges.js +4 -0
  141. package/lib/src/decoder/strategy/RawChanges.js.map +1 -0
  142. package/lib/src/decoder/strategy/getDecoderStateCallbacks.d.ts +76 -0
  143. package/lib/src/decoder/strategy/getDecoderStateCallbacks.js +274 -0
  144. package/lib/src/decoder/strategy/getDecoderStateCallbacks.js.map +1 -0
  145. package/lib/src/encoder/ChangeTree.d.ts +135 -0
  146. package/lib/src/encoder/ChangeTree.js +534 -0
  147. package/lib/src/encoder/ChangeTree.js.map +1 -0
  148. package/lib/src/encoder/EncodeOperation.d.ts +22 -0
  149. package/lib/src/encoder/EncodeOperation.js +132 -0
  150. package/lib/src/encoder/EncodeOperation.js.map +1 -0
  151. package/lib/src/encoder/Encoder.d.ts +22 -0
  152. package/lib/src/encoder/Encoder.js +204 -0
  153. package/lib/src/encoder/Encoder.js.map +1 -0
  154. package/lib/src/encoder/Root.d.ts +28 -0
  155. package/lib/src/encoder/Root.js +229 -0
  156. package/lib/src/encoder/Root.js.map +1 -0
  157. package/lib/src/encoder/StateView.d.ts +34 -0
  158. package/lib/src/encoder/StateView.js +279 -0
  159. package/lib/src/encoder/StateView.js.map +1 -0
  160. package/lib/src/encoding/assert.d.ts +10 -0
  161. package/lib/src/encoding/assert.js +49 -0
  162. package/lib/src/encoding/assert.js.map +1 -0
  163. package/lib/src/encoding/decode.d.ts +67 -0
  164. package/lib/src/encoding/decode.js +217 -0
  165. package/lib/src/encoding/decode.js.map +1 -0
  166. package/lib/src/encoding/encode.d.ts +40 -0
  167. package/lib/src/encoding/encode.js +279 -0
  168. package/lib/src/encoding/encode.js.map +1 -0
  169. package/lib/src/encoding/spec.d.ts +24 -0
  170. package/lib/src/encoding/spec.js +26 -0
  171. package/lib/src/encoding/spec.js.map +1 -0
  172. package/lib/src/index.d.ts +32 -0
  173. package/lib/src/index.js +39 -0
  174. package/lib/src/index.js.map +1 -0
  175. package/lib/src/symbol.shim.d.ts +6 -0
  176. package/lib/src/symbol.shim.js +3 -0
  177. package/lib/src/symbol.shim.js.map +1 -0
  178. package/lib/src/types/HelperTypes.d.ts +77 -0
  179. package/lib/src/types/HelperTypes.js +2 -0
  180. package/lib/src/types/HelperTypes.js.map +1 -0
  181. package/lib/src/types/TypeContext.d.ts +31 -0
  182. package/lib/src/types/TypeContext.js +143 -0
  183. package/lib/src/types/TypeContext.js.map +1 -0
  184. package/lib/src/types/custom/ArraySchema.d.ts +270 -0
  185. package/lib/src/types/custom/ArraySchema.js +733 -0
  186. package/lib/src/types/custom/ArraySchema.js.map +1 -0
  187. package/lib/src/types/custom/CollectionSchema.d.ts +51 -0
  188. package/lib/src/types/custom/CollectionSchema.js +170 -0
  189. package/lib/src/types/custom/CollectionSchema.js.map +1 -0
  190. package/lib/src/types/custom/MapSchema.d.ts +51 -0
  191. package/lib/src/types/custom/MapSchema.js +222 -0
  192. package/lib/src/types/custom/MapSchema.js.map +1 -0
  193. package/lib/src/types/custom/SetSchema.d.ts +48 -0
  194. package/lib/src/types/custom/SetSchema.js +178 -0
  195. package/lib/src/types/custom/SetSchema.js.map +1 -0
  196. package/lib/src/types/registry.d.ts +16 -0
  197. package/lib/src/types/registry.js +30 -0
  198. package/lib/src/types/registry.js.map +1 -0
  199. package/lib/src/types/symbols.d.ts +33 -0
  200. package/lib/src/types/symbols.js +34 -0
  201. package/lib/src/types/symbols.js.map +1 -0
  202. package/lib/src/types/utils.d.ts +1 -0
  203. package/lib/src/types/utils.js +13 -0
  204. package/lib/src/types/utils.js.map +1 -0
  205. package/lib/src/utils.d.ts +13 -0
  206. package/lib/src/utils.js +49 -0
  207. package/lib/src/utils.js.map +1 -0
  208. package/lib/src/v3_bench.d.ts +1 -0
  209. package/lib/src/v3_bench.js +128 -0
  210. package/lib/src/v3_bench.js.map +1 -0
  211. package/lib/symbol.shim.js +1 -2
  212. package/lib/symbol.shim.js.map +1 -1
  213. package/lib/types/HelperTypes.js +1 -2
  214. package/lib/types/TypeContext.js +8 -12
  215. package/lib/types/TypeContext.js.map +1 -1
  216. package/lib/types/custom/ArraySchema.js +63 -67
  217. package/lib/types/custom/ArraySchema.js.map +1 -1
  218. package/lib/types/custom/CollectionSchema.js +27 -31
  219. package/lib/types/custom/CollectionSchema.js.map +1 -1
  220. package/lib/types/custom/MapSchema.js +37 -41
  221. package/lib/types/custom/MapSchema.js.map +1 -1
  222. package/lib/types/custom/SetSchema.js +28 -32
  223. package/lib/types/custom/SetSchema.js.map +1 -1
  224. package/lib/types/registry.js +13 -20
  225. package/lib/types/registry.js.map +1 -1
  226. package/lib/types/symbols.js +16 -19
  227. package/lib/types/symbols.js.map +1 -1
  228. package/lib/types/utils.js +1 -4
  229. package/lib/types/utils.js.map +1 -1
  230. package/lib/utils.js +9 -14
  231. package/lib/utils.js.map +1 -1
  232. package/lib/v3_bench.js +17 -19
  233. package/lib/v3_bench.js.map +1 -1
  234. package/package.json +9 -7
  235. package/src/codegen/api.ts +7 -0
  236. package/src/codegen/parser.ts +2 -2
  237. package/src/codegen/types.ts +5 -0
  238. package/src/encoder/Encoder.ts +24 -7
  239. package/src/index.ts +2 -2
  240. package/build/cjs/index.js.map +0 -1
  241. package/src/bench_encode.ts +0 -64
@@ -1,17 +1,14 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Decoder = void 0;
4
- const TypeContext_1 = require("../types/TypeContext");
5
- const symbols_1 = require("../types/symbols");
6
- const decode_1 = require("../encoding/decode");
7
- const spec_1 = require("../encoding/spec");
8
- const ReferenceTracker_1 = require("./ReferenceTracker");
9
- const DecodeOperation_1 = require("./DecodeOperation");
10
- class Decoder {
1
+ import { TypeContext } from "../types/TypeContext";
2
+ import { $childType, $decoder, $onDecodeEnd, $refId } from "../types/symbols";
3
+ import { decode } from "../encoding/decode";
4
+ import { OPERATION, SWITCH_TO_STRUCTURE, TYPE_ID } from '../encoding/spec';
5
+ import { ReferenceTracker } from "./ReferenceTracker";
6
+ import { DEFINITION_MISMATCH } from "./DecodeOperation";
7
+ export class Decoder {
11
8
  constructor(root, context) {
12
9
  this.currentRefId = 0;
13
10
  this.setState(root);
14
- this.context = context || new TypeContext_1.TypeContext(root.constructor);
11
+ this.context = context || new TypeContext(root.constructor);
15
12
  // console.log(">>>>>>>>>>>>>>>> Decoder types");
16
13
  // this.context.schemas.forEach((id, schema) => {
17
14
  // console.log("type:", id, schema.name, Object.keys(schema[Symbol.metadata]));
@@ -19,23 +16,23 @@ class Decoder {
19
16
  }
20
17
  setState(root) {
21
18
  this.state = root;
22
- this.root = new ReferenceTracker_1.ReferenceTracker();
19
+ this.root = new ReferenceTracker();
23
20
  this.root.addRef(0, root);
24
21
  }
25
22
  decode(bytes, it = { offset: 0 }, ref = this.state) {
26
23
  const allChanges = [];
27
24
  const $root = this.root;
28
25
  const totalBytes = bytes.byteLength;
29
- let decoder = ref['constructor'][symbols_1.$decoder];
26
+ let decoder = ref['constructor'][$decoder];
30
27
  this.currentRefId = 0;
31
28
  while (it.offset < totalBytes) {
32
29
  //
33
30
  // Peek ahead, check if it's a switch to a different structure
34
31
  //
35
- if (bytes[it.offset] == spec_1.SWITCH_TO_STRUCTURE) {
32
+ if (bytes[it.offset] == SWITCH_TO_STRUCTURE) {
36
33
  it.offset++;
37
- ref[symbols_1.$onDecodeEnd]?.();
38
- const nextRefId = decode_1.decode.number(bytes, it);
34
+ ref[$onDecodeEnd]?.();
35
+ const nextRefId = decode.number(bytes, it);
39
36
  const nextRef = $root.refs.get(nextRefId);
40
37
  //
41
38
  // Trying to access a reference that haven't been decoded yet.
@@ -48,20 +45,20 @@ class Decoder {
48
45
  }
49
46
  else {
50
47
  ref = nextRef;
51
- decoder = ref.constructor[symbols_1.$decoder];
48
+ decoder = ref.constructor[$decoder];
52
49
  this.currentRefId = nextRefId;
53
50
  }
54
51
  continue;
55
52
  }
56
53
  const result = decoder(this, bytes, it, ref, allChanges);
57
- if (result === DecodeOperation_1.DEFINITION_MISMATCH) {
54
+ if (result === DEFINITION_MISMATCH) {
58
55
  console.warn("@colyseus/schema: definition mismatch");
59
56
  this.skipCurrentStructure(bytes, it, totalBytes);
60
57
  continue;
61
58
  }
62
59
  }
63
60
  // FIXME: DRY with SWITCH_TO_STRUCTURE block.
64
- ref[symbols_1.$onDecodeEnd]?.();
61
+ ref[$onDecodeEnd]?.();
65
62
  // trigger changes
66
63
  this.triggerChanges?.(allChanges);
67
64
  // drop references of unused schemas
@@ -75,9 +72,9 @@ class Decoder {
75
72
  //
76
73
  const nextIterator = { offset: it.offset };
77
74
  while (it.offset < totalBytes) {
78
- if (bytes[it.offset] === spec_1.SWITCH_TO_STRUCTURE) {
75
+ if (bytes[it.offset] === SWITCH_TO_STRUCTURE) {
79
76
  nextIterator.offset = it.offset + 1;
80
- if (this.root.refs.has(decode_1.decode.number(bytes, nextIterator))) {
77
+ if (this.root.refs.has(decode.number(bytes, nextIterator))) {
81
78
  break;
82
79
  }
83
80
  }
@@ -86,9 +83,9 @@ class Decoder {
86
83
  }
87
84
  getInstanceType(bytes, it, defaultType) {
88
85
  let type;
89
- if (bytes[it.offset] === spec_1.TYPE_ID) {
86
+ if (bytes[it.offset] === TYPE_ID) {
90
87
  it.offset++;
91
- const type_id = decode_1.decode.number(bytes, it);
88
+ const type_id = decode.number(bytes, it);
92
89
  type = this.context.get(type_id);
93
90
  }
94
91
  return type || defaultType;
@@ -97,22 +94,21 @@ class Decoder {
97
94
  return new type();
98
95
  }
99
96
  removeChildRefs(ref, allChanges) {
100
- const needRemoveRef = typeof (ref[symbols_1.$childType]) !== "string";
101
- const refId = ref[symbols_1.$refId];
97
+ const needRemoveRef = typeof (ref[$childType]) !== "string";
98
+ const refId = ref[$refId];
102
99
  ref.forEach((value, key) => {
103
100
  allChanges.push({
104
101
  ref: ref,
105
102
  refId,
106
- op: spec_1.OPERATION.DELETE,
103
+ op: OPERATION.DELETE,
107
104
  field: key,
108
105
  value: undefined,
109
106
  previousValue: value
110
107
  });
111
108
  if (needRemoveRef) {
112
- this.root.removeRef(value[symbols_1.$refId]);
109
+ this.root.removeRef(value[$refId]);
113
110
  }
114
111
  });
115
112
  }
116
113
  }
117
- exports.Decoder = Decoder;
118
114
  //# sourceMappingURL=Decoder.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Decoder.js","sourceRoot":"","sources":["../../src/decoder/Decoder.ts"],"names":[],"mappings":"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","sourcesContent":["import { TypeContext } from \"../types/TypeContext\";\nimport { $changes, $childType, $decoder, $onDecodeEnd, $refId } from \"../types/symbols\";\nimport { Schema } from \"../Schema\";\n\nimport { decode } from \"../encoding/decode\";\nimport { OPERATION, SWITCH_TO_STRUCTURE, TYPE_ID } from '../encoding/spec';\nimport type { Ref } from \"../encoder/ChangeTree\";\nimport type { Iterator } from \"../encoding/decode\";\nimport { ReferenceTracker } from \"./ReferenceTracker\";\nimport { DEFINITION_MISMATCH, type DataChange, type DecodeOperation } from \"./DecodeOperation\";\nimport { Collection } from \"../types/HelperTypes\";\n\nexport class Decoder<T extends Schema = any> {\n context: TypeContext;\n\n state: T;\n root: ReferenceTracker;\n\n currentRefId: number = 0;\n\n triggerChanges?: (allChanges: DataChange[]) => void;\n\n constructor(root: T, context?: TypeContext) {\n this.setState(root);\n\n this.context = context || new TypeContext(root.constructor as typeof Schema);\n\n // console.log(\">>>>>>>>>>>>>>>> Decoder types\");\n // this.context.schemas.forEach((id, schema) => {\n // console.log(\"type:\", id, schema.name, Object.keys(schema[Symbol.metadata]));\n // });\n }\n\n protected setState(root: T) {\n this.state = root;\n this.root = new ReferenceTracker();\n this.root.addRef(0, root);\n }\n\n decode(\n bytes: Uint8Array,\n it: Iterator = { offset: 0 },\n ref: Ref = this.state,\n ) {\n const allChanges: DataChange[] = [];\n\n const $root = this.root;\n const totalBytes = bytes.byteLength;\n\n let decoder: DecodeOperation = ref['constructor'][$decoder];\n\n this.currentRefId = 0;\n\n while (it.offset < totalBytes) {\n //\n // Peek ahead, check if it's a switch to a different structure\n //\n if (bytes[it.offset] == SWITCH_TO_STRUCTURE) {\n it.offset++;\n\n (ref as any)[$onDecodeEnd]?.()\n\n const nextRefId = decode.number(bytes, it);\n const nextRef = $root.refs.get(nextRefId);\n\n //\n // Trying to access a reference that haven't been decoded yet.\n //\n if (!nextRef) {\n // throw new Error(`\"refId\" not found: ${nextRefId}`);\n console.error(`\"refId\" not found: ${nextRefId}`, { previousRef: ref, previousRefId: this.currentRefId });\n console.warn(\"Please report this issue to the developers.\");\n this.skipCurrentStructure(bytes, it, totalBytes);\n\n } else {\n ref = nextRef;\n decoder = ref.constructor[$decoder];\n this.currentRefId = nextRefId;\n }\n\n continue;\n }\n\n const result = decoder(this, bytes, it, ref, allChanges);\n\n if (result === DEFINITION_MISMATCH) {\n console.warn(\"@colyseus/schema: definition mismatch\");\n this.skipCurrentStructure(bytes, it, totalBytes);\n continue;\n }\n }\n\n // FIXME: DRY with SWITCH_TO_STRUCTURE block.\n (ref as any)[$onDecodeEnd]?.()\n\n // trigger changes\n this.triggerChanges?.(allChanges);\n\n // drop references of unused schemas\n $root.garbageCollectDeletedRefs();\n\n return allChanges;\n }\n\n skipCurrentStructure(bytes: Uint8Array, it: Iterator, totalBytes: number) {\n //\n // keep skipping next bytes until reaches a known structure\n // by local decoder.\n //\n const nextIterator: Iterator = { offset: it.offset };\n while (it.offset < totalBytes) {\n if (bytes[it.offset] === SWITCH_TO_STRUCTURE) {\n nextIterator.offset = it.offset + 1;\n if (this.root.refs.has(decode.number(bytes, nextIterator))) {\n break;\n }\n }\n it.offset++;\n }\n }\n\n getInstanceType(bytes: Uint8Array, it: Iterator, defaultType: typeof Schema): typeof Schema {\n let type: typeof Schema;\n\n if (bytes[it.offset] === TYPE_ID) {\n it.offset++;\n const type_id = decode.number(bytes, it);\n type = this.context.get(type_id);\n }\n\n return type || defaultType;\n }\n\n createInstanceOfType (type: typeof Schema): Schema {\n return new (type as any)();\n }\n\n removeChildRefs(ref: Collection, allChanges: DataChange[]) {\n const needRemoveRef = typeof ((ref as any)[$childType]) !== \"string\";\n const refId = (ref as Ref)[$refId];\n\n ref.forEach((value: any, key: any) => {\n allChanges.push({\n ref: ref as Ref,\n refId,\n op: OPERATION.DELETE,\n field: key,\n value: undefined,\n previousValue: value\n });\n\n if (needRemoveRef) {\n this.root.removeRef(value[$refId]);\n }\n });\n }\n\n}\n"]}
1
+ {"version":3,"file":"Decoder.js","sourceRoot":"","sources":["../../src/decoder/Decoder.ts"],"names":[],"mappings":"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","sourcesContent":["import { TypeContext } from \"../types/TypeContext\";\nimport { $changes, $childType, $decoder, $onDecodeEnd, $refId } from \"../types/symbols\";\nimport { Schema } from \"../Schema\";\n\nimport { decode } from \"../encoding/decode\";\nimport { OPERATION, SWITCH_TO_STRUCTURE, TYPE_ID } from '../encoding/spec';\nimport type { Ref } from \"../encoder/ChangeTree\";\nimport type { Iterator } from \"../encoding/decode\";\nimport { ReferenceTracker } from \"./ReferenceTracker\";\nimport { DEFINITION_MISMATCH, type DataChange, type DecodeOperation } from \"./DecodeOperation\";\nimport { Collection } from \"../types/HelperTypes\";\n\nexport class Decoder<T extends Schema = any> {\n context: TypeContext;\n\n state: T;\n root: ReferenceTracker;\n\n currentRefId: number = 0;\n\n triggerChanges?: (allChanges: DataChange[]) => void;\n\n constructor(root: T, context?: TypeContext) {\n this.setState(root);\n\n this.context = context || new TypeContext(root.constructor as typeof Schema);\n\n // console.log(\">>>>>>>>>>>>>>>> Decoder types\");\n // this.context.schemas.forEach((id, schema) => {\n // console.log(\"type:\", id, schema.name, Object.keys(schema[Symbol.metadata]));\n // });\n }\n\n protected setState(root: T) {\n this.state = root;\n this.root = new ReferenceTracker();\n this.root.addRef(0, root);\n }\n\n decode(\n bytes: Uint8Array,\n it: Iterator = { offset: 0 },\n ref: Ref = this.state,\n ) {\n const allChanges: DataChange[] = [];\n\n const $root = this.root;\n const totalBytes = bytes.byteLength;\n\n let decoder: DecodeOperation = ref['constructor'][$decoder];\n\n this.currentRefId = 0;\n\n while (it.offset < totalBytes) {\n //\n // Peek ahead, check if it's a switch to a different structure\n //\n if (bytes[it.offset] == SWITCH_TO_STRUCTURE) {\n it.offset++;\n\n (ref as any)[$onDecodeEnd]?.()\n\n const nextRefId = decode.number(bytes, it);\n const nextRef = $root.refs.get(nextRefId);\n\n //\n // Trying to access a reference that haven't been decoded yet.\n //\n if (!nextRef) {\n // throw new Error(`\"refId\" not found: ${nextRefId}`);\n console.error(`\"refId\" not found: ${nextRefId}`, { previousRef: ref, previousRefId: this.currentRefId });\n console.warn(\"Please report this issue to the developers.\");\n this.skipCurrentStructure(bytes, it, totalBytes);\n\n } else {\n ref = nextRef;\n decoder = ref.constructor[$decoder];\n this.currentRefId = nextRefId;\n }\n\n continue;\n }\n\n const result = decoder(this, bytes, it, ref, allChanges);\n\n if (result === DEFINITION_MISMATCH) {\n console.warn(\"@colyseus/schema: definition mismatch\");\n this.skipCurrentStructure(bytes, it, totalBytes);\n continue;\n }\n }\n\n // FIXME: DRY with SWITCH_TO_STRUCTURE block.\n (ref as any)[$onDecodeEnd]?.()\n\n // trigger changes\n this.triggerChanges?.(allChanges);\n\n // drop references of unused schemas\n $root.garbageCollectDeletedRefs();\n\n return allChanges;\n }\n\n skipCurrentStructure(bytes: Uint8Array, it: Iterator, totalBytes: number) {\n //\n // keep skipping next bytes until reaches a known structure\n // by local decoder.\n //\n const nextIterator: Iterator = { offset: it.offset };\n while (it.offset < totalBytes) {\n if (bytes[it.offset] === SWITCH_TO_STRUCTURE) {\n nextIterator.offset = it.offset + 1;\n if (this.root.refs.has(decode.number(bytes, nextIterator))) {\n break;\n }\n }\n it.offset++;\n }\n }\n\n getInstanceType(bytes: Uint8Array, it: Iterator, defaultType: typeof Schema): typeof Schema {\n let type: typeof Schema;\n\n if (bytes[it.offset] === TYPE_ID) {\n it.offset++;\n const type_id = decode.number(bytes, it);\n type = this.context.get(type_id);\n }\n\n return type || defaultType;\n }\n\n createInstanceOfType (type: typeof Schema): Schema {\n return new (type as any)();\n }\n\n removeChildRefs(ref: Collection, allChanges: DataChange[]) {\n const needRemoveRef = typeof ((ref as any)[$childType]) !== \"string\";\n const refId = (ref as Ref)[$refId];\n\n ref.forEach((value: any, key: any) => {\n allChanges.push({\n ref: ref as Ref,\n refId,\n op: OPERATION.DELETE,\n field: key,\n value: undefined,\n previousValue: value\n });\n\n if (needRemoveRef) {\n this.root.removeRef(value[$refId]);\n }\n });\n }\n\n}\n"]}
@@ -1,16 +1,13 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ReferenceTracker = void 0;
4
- const symbols_1 = require("../types/symbols");
5
- const utils_1 = require("../types/utils");
6
- const spec_1 = require("../encoding/spec");
1
+ import { $childType, $refId } from "../types/symbols";
2
+ import { spliceOne } from "../types/utils";
3
+ import { OPERATION } from "../encoding/spec";
7
4
  class DecodingWarning extends Error {
8
5
  constructor(message) {
9
6
  super(message);
10
7
  this.name = "DecodingWarning";
11
8
  }
12
9
  }
13
- class ReferenceTracker {
10
+ export class ReferenceTracker {
14
11
  constructor() {
15
12
  //
16
13
  // Relation of refId => Schema structure
@@ -28,7 +25,7 @@ class ReferenceTracker {
28
25
  // for decoding
29
26
  addRef(refId, ref, incrementCount = true) {
30
27
  this.refs.set(refId, ref);
31
- ref[symbols_1.$refId] = refId;
28
+ ref[$refId] = refId;
32
29
  if (incrementCount) {
33
30
  this.refCount[refId] = (this.refCount[refId] || 0) + 1;
34
31
  }
@@ -87,7 +84,7 @@ class ReferenceTracker {
87
84
  const field = metadata[index].name;
88
85
  const child = ref[field];
89
86
  if (typeof (child) === "object" && child) {
90
- const childRefId = child[symbols_1.$refId];
87
+ const childRefId = child[$refId];
91
88
  if (childRefId !== undefined && !this.deletedRefs.has(childRefId)) {
92
89
  this.removeRef(childRefId);
93
90
  }
@@ -95,10 +92,10 @@ class ReferenceTracker {
95
92
  }
96
93
  }
97
94
  else {
98
- if (typeof (ref[symbols_1.$childType]) === "function") {
95
+ if (typeof (ref[$childType]) === "function") {
99
96
  Array.from(ref.values())
100
97
  .forEach((child) => {
101
- const childRefId = child[symbols_1.$refId];
98
+ const childRefId = child[$refId];
102
99
  if (childRefId !== undefined && !this.deletedRefs.has(childRefId)) {
103
100
  this.removeRef(childRefId);
104
101
  }
@@ -115,7 +112,7 @@ class ReferenceTracker {
115
112
  addCallback(refId, fieldOrOperation, callback) {
116
113
  if (refId === undefined) {
117
114
  const name = (typeof (fieldOrOperation) === "number")
118
- ? spec_1.OPERATION[fieldOrOperation]
115
+ ? OPERATION[fieldOrOperation]
119
116
  : fieldOrOperation;
120
117
  throw new Error(`Can't addCallback on '${name}' (refId is undefined)`);
121
118
  }
@@ -131,9 +128,8 @@ class ReferenceTracker {
131
128
  removeCallback(refId, field, callback) {
132
129
  const index = this.callbacks?.[refId]?.[field]?.indexOf(callback);
133
130
  if (index !== undefined && index !== -1) {
134
- (0, utils_1.spliceOne)(this.callbacks[refId][field], index);
131
+ spliceOne(this.callbacks[refId][field], index);
135
132
  }
136
133
  }
137
134
  }
138
- exports.ReferenceTracker = ReferenceTracker;
139
135
  //# sourceMappingURL=ReferenceTracker.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ReferenceTracker.js","sourceRoot":"","sources":["../../src/decoder/ReferenceTracker.ts"],"names":[],"mappings":"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","sourcesContent":["import { Metadata } from \"../Metadata\";\nimport { $childType, $refId } from \"../types/symbols\";\nimport { Ref } from \"../encoder/ChangeTree\";\nimport { spliceOne } from \"../types/utils\";\nimport { OPERATION } from \"../encoding/spec\";\n\nimport type { MapSchema } from \"../types/custom/MapSchema\";\nimport type { Schema } from \"../Schema\";\n\nclass DecodingWarning extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"DecodingWarning\";\n }\n}\n\n/**\n * Used for decoding only.\n */\n\nexport type SchemaCallbacks = { [field: string | number]: Function[] };\n\nexport class ReferenceTracker {\n //\n // Relation of refId => Schema structure\n // For direct access of structures during decoding time.\n //\n public refs = new Map<number, Ref>();\n\n public refCount: { [refId: number]: number; } = {};\n public deletedRefs = new Set<number>();\n\n public callbacks: { [refId: number]: SchemaCallbacks } = {};\n protected nextUniqueId: number = 0;\n\n getNextUniqueId() {\n return this.nextUniqueId++;\n }\n\n // for decoding\n addRef(refId: number, ref: Ref, incrementCount: boolean = true) {\n this.refs.set(refId, ref);\n ref[$refId] = refId;\n\n if (incrementCount) {\n this.refCount[refId] = (this.refCount[refId] || 0) + 1;\n }\n\n if (this.deletedRefs.has(refId)) {\n this.deletedRefs.delete(refId);\n }\n }\n\n // for decoding\n removeRef(refId: number) {\n const refCount = this.refCount[refId];\n\n if (refCount === undefined) {\n try {\n throw new DecodingWarning(\"trying to remove refId that doesn't exist: \" + refId);\n } catch (e) {\n console.warn(e);\n }\n return;\n }\n\n if (refCount === 0) {\n try {\n const ref = this.refs.get(refId);\n throw new DecodingWarning(`trying to remove refId '${refId}' with 0 refCount (${ref.constructor.name}: ${JSON.stringify(ref)})`);\n } catch (e) {\n console.warn(e);\n }\n return;\n }\n\n if ((this.refCount[refId] = refCount - 1) <= 0) {\n this.deletedRefs.add(refId);\n }\n }\n\n clearRefs() {\n this.refs.clear();\n this.deletedRefs.clear();\n this.callbacks = {};\n this.refCount = {};\n }\n\n // for decoding\n garbageCollectDeletedRefs() {\n this.deletedRefs.forEach((refId) => {\n //\n // Skip active references.\n //\n if (this.refCount[refId] > 0) { return; }\n\n const ref = this.refs.get(refId);\n\n //\n // Ensure child schema instances have their references removed as well.\n //\n if ((ref.constructor as typeof Schema)[Symbol.metadata] !== undefined) {\n const metadata: Metadata = (ref.constructor as typeof Schema)[Symbol.metadata];\n for (const index in metadata) {\n const field = metadata[index as any as number].name;\n const child = ref[field as keyof Ref];\n if (typeof(child) === \"object\" && child) {\n const childRefId = (child as any)[$refId];\n if (childRefId !== undefined && !this.deletedRefs.has(childRefId)) {\n this.removeRef(childRefId);\n }\n }\n }\n\n } else {\n if (typeof ((ref as any)[$childType]) === \"function\") {\n Array.from((ref as MapSchema).values())\n .forEach((child) => {\n const childRefId = child[$refId];\n if (childRefId !== undefined && !this.deletedRefs.has(childRefId)) {\n this.removeRef(childRefId);\n }\n });\n }\n }\n\n this.refs.delete(refId); // remove ref\n delete this.refCount[refId]; // remove ref count\n delete this.callbacks[refId]; // remove callbacks\n });\n\n // clear deleted refs.\n this.deletedRefs.clear();\n }\n\n addCallback(refId: number, fieldOrOperation: string | number, callback: Function) {\n if (refId === undefined) {\n const name = (typeof(fieldOrOperation) === \"number\")\n ? OPERATION[fieldOrOperation]\n : fieldOrOperation\n throw new Error(\n `Can't addCallback on '${name}' (refId is undefined)`\n );\n }\n if (!this.callbacks[refId]) {\n this.callbacks[refId] = {};\n }\n if (!this.callbacks[refId][fieldOrOperation]) {\n this.callbacks[refId][fieldOrOperation] = [];\n }\n this.callbacks[refId][fieldOrOperation].push(callback);\n return () => this.removeCallback(refId, fieldOrOperation, callback);\n }\n\n removeCallback(refId: number, field: string | number, callback: Function) {\n const index: number | undefined = this.callbacks?.[refId]?.[field]?.indexOf(callback);\n if (index !== undefined && index !== -1) {\n spliceOne(this.callbacks[refId][field], index);\n }\n }\n\n}\n"]}
1
+ {"version":3,"file":"ReferenceTracker.js","sourceRoot":"","sources":["../../src/decoder/ReferenceTracker.ts"],"names":[],"mappings":"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","sourcesContent":["import { Metadata } from \"../Metadata\";\nimport { $childType, $refId } from \"../types/symbols\";\nimport { Ref } from \"../encoder/ChangeTree\";\nimport { spliceOne } from \"../types/utils\";\nimport { OPERATION } from \"../encoding/spec\";\n\nimport type { MapSchema } from \"../types/custom/MapSchema\";\nimport type { Schema } from \"../Schema\";\n\nclass DecodingWarning extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"DecodingWarning\";\n }\n}\n\n/**\n * Used for decoding only.\n */\n\nexport type SchemaCallbacks = { [field: string | number]: Function[] };\n\nexport class ReferenceTracker {\n //\n // Relation of refId => Schema structure\n // For direct access of structures during decoding time.\n //\n public refs = new Map<number, Ref>();\n\n public refCount: { [refId: number]: number; } = {};\n public deletedRefs = new Set<number>();\n\n public callbacks: { [refId: number]: SchemaCallbacks } = {};\n protected nextUniqueId: number = 0;\n\n getNextUniqueId() {\n return this.nextUniqueId++;\n }\n\n // for decoding\n addRef(refId: number, ref: Ref, incrementCount: boolean = true) {\n this.refs.set(refId, ref);\n ref[$refId] = refId;\n\n if (incrementCount) {\n this.refCount[refId] = (this.refCount[refId] || 0) + 1;\n }\n\n if (this.deletedRefs.has(refId)) {\n this.deletedRefs.delete(refId);\n }\n }\n\n // for decoding\n removeRef(refId: number) {\n const refCount = this.refCount[refId];\n\n if (refCount === undefined) {\n try {\n throw new DecodingWarning(\"trying to remove refId that doesn't exist: \" + refId);\n } catch (e) {\n console.warn(e);\n }\n return;\n }\n\n if (refCount === 0) {\n try {\n const ref = this.refs.get(refId);\n throw new DecodingWarning(`trying to remove refId '${refId}' with 0 refCount (${ref.constructor.name}: ${JSON.stringify(ref)})`);\n } catch (e) {\n console.warn(e);\n }\n return;\n }\n\n if ((this.refCount[refId] = refCount - 1) <= 0) {\n this.deletedRefs.add(refId);\n }\n }\n\n clearRefs() {\n this.refs.clear();\n this.deletedRefs.clear();\n this.callbacks = {};\n this.refCount = {};\n }\n\n // for decoding\n garbageCollectDeletedRefs() {\n this.deletedRefs.forEach((refId) => {\n //\n // Skip active references.\n //\n if (this.refCount[refId] > 0) { return; }\n\n const ref = this.refs.get(refId);\n\n //\n // Ensure child schema instances have their references removed as well.\n //\n if ((ref.constructor as typeof Schema)[Symbol.metadata] !== undefined) {\n const metadata: Metadata = (ref.constructor as typeof Schema)[Symbol.metadata];\n for (const index in metadata) {\n const field = metadata[index as any as number].name;\n const child = ref[field as keyof Ref];\n if (typeof(child) === \"object\" && child) {\n const childRefId = (child as any)[$refId];\n if (childRefId !== undefined && !this.deletedRefs.has(childRefId)) {\n this.removeRef(childRefId);\n }\n }\n }\n\n } else {\n if (typeof ((ref as any)[$childType]) === \"function\") {\n Array.from((ref as MapSchema).values())\n .forEach((child) => {\n const childRefId = child[$refId];\n if (childRefId !== undefined && !this.deletedRefs.has(childRefId)) {\n this.removeRef(childRefId);\n }\n });\n }\n }\n\n this.refs.delete(refId); // remove ref\n delete this.refCount[refId]; // remove ref count\n delete this.callbacks[refId]; // remove callbacks\n });\n\n // clear deleted refs.\n this.deletedRefs.clear();\n }\n\n addCallback(refId: number, fieldOrOperation: string | number, callback: Function) {\n if (refId === undefined) {\n const name = (typeof(fieldOrOperation) === \"number\")\n ? OPERATION[fieldOrOperation]\n : fieldOrOperation\n throw new Error(\n `Can't addCallback on '${name}' (refId is undefined)`\n );\n }\n if (!this.callbacks[refId]) {\n this.callbacks[refId] = {};\n }\n if (!this.callbacks[refId][fieldOrOperation]) {\n this.callbacks[refId][fieldOrOperation] = [];\n }\n this.callbacks[refId][fieldOrOperation].push(callback);\n return () => this.removeCallback(refId, fieldOrOperation, callback);\n }\n\n removeCallback(refId: number, field: string | number, callback: Function) {\n const index: number | undefined = this.callbacks?.[refId]?.[field]?.indexOf(callback);\n if (index !== undefined && index !== -1) {\n spliceOne(this.callbacks[refId][field], index);\n }\n }\n\n}\n"]}
@@ -1,12 +1,9 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Callbacks = exports.StateCallbackStrategy = void 0;
4
- const Decoder_1 = require("../Decoder");
5
- const spec_1 = require("../../encoding/spec");
6
- const Schema_1 = require("../../Schema");
7
- const symbols_1 = require("../../types/symbols");
8
- const getDecoderStateCallbacks_1 = require("./getDecoderStateCallbacks");
9
- const RawChanges_1 = require("./RawChanges");
1
+ import { Decoder } from "../Decoder";
2
+ import { OPERATION } from "../../encoding/spec";
3
+ import { Schema } from "../../Schema";
4
+ import { $refId } from "../../types/symbols";
5
+ import { getDecoderStateCallbacks } from "./getDecoderStateCallbacks";
6
+ import { getRawChangesCallback } from "./RawChanges";
10
7
  /**
11
8
  * State Callbacks handler
12
9
  *
@@ -33,7 +30,7 @@ const RawChanges_1 = require("./RawChanges");
33
30
  * $.bindTo(player, playerVisual);
34
31
  * ```
35
32
  */
36
- class StateCallbackStrategy {
33
+ export class StateCallbackStrategy {
37
34
  constructor(decoder) {
38
35
  this.uniqueRefIds = new Set();
39
36
  this.isTriggering = false;
@@ -56,9 +53,9 @@ class StateCallbackStrategy {
56
53
  const collection = instance[propertyName];
57
54
  // Collection not available yet. Listen for its availability before attaching the handler.
58
55
  if (collection === null || collection === undefined) {
59
- removeHandler = this.addCallback(instance[symbols_1.$refId], propertyName, (value, _) => {
56
+ removeHandler = this.addCallback(instance[$refId], propertyName, (value, _) => {
60
57
  if (value !== null && value !== undefined) {
61
- removeHandler = this.addCallback(value[symbols_1.$refId], operation, handler);
58
+ removeHandler = this.addCallback(value[$refId], operation, handler);
62
59
  }
63
60
  });
64
61
  return removeOnAdd;
@@ -68,12 +65,12 @@ class StateCallbackStrategy {
68
65
  // Call immediately if collection is already available, if it's an ADD operation.
69
66
  //
70
67
  immediate = immediate && this.isTriggering === false;
71
- if (operation === spec_1.OPERATION.ADD && immediate) {
68
+ if (operation === OPERATION.ADD && immediate) {
72
69
  collection.forEach((value, key) => {
73
70
  handler(key, value);
74
71
  });
75
72
  }
76
- return this.addCallback(collection[symbols_1.$refId], operation, handler);
73
+ return this.addCallback(collection[$refId], operation, handler);
77
74
  }
78
75
  }
79
76
  listen(...args) {
@@ -95,42 +92,42 @@ class StateCallbackStrategy {
95
92
  if (immediate && currentValue !== null && currentValue !== undefined) {
96
93
  handler(currentValue, undefined);
97
94
  }
98
- return this.addCallback(instance[symbols_1.$refId], propertyName, handler);
95
+ return this.addCallback(instance[$refId], propertyName, handler);
99
96
  }
100
97
  onChange(...args) {
101
98
  if (args.length === 2 && typeof args[0] !== 'string') {
102
99
  // onChange(instance, handler) - instance change
103
100
  const instance = args[0];
104
101
  const handler = args[1];
105
- return this.addCallback(instance[symbols_1.$refId], spec_1.OPERATION.REPLACE, handler);
102
+ return this.addCallback(instance[$refId], OPERATION.REPLACE, handler);
106
103
  }
107
104
  if (typeof args[0] === 'string') {
108
105
  // onChange(property, handler) - collection on root state
109
- return this.addCallbackOrWaitCollectionAvailable(this.state, args[0], spec_1.OPERATION.REPLACE, args[1]);
106
+ return this.addCallbackOrWaitCollectionAvailable(this.state, args[0], OPERATION.REPLACE, args[1]);
110
107
  }
111
108
  else {
112
109
  // onChange(instance, property, handler) - nested collection
113
- return this.addCallbackOrWaitCollectionAvailable(args[0], args[1], spec_1.OPERATION.REPLACE, args[2]);
110
+ return this.addCallbackOrWaitCollectionAvailable(args[0], args[1], OPERATION.REPLACE, args[2]);
114
111
  }
115
112
  }
116
113
  onAdd(...args) {
117
114
  if (typeof args[0] === 'string') {
118
115
  // onAdd(property, handler, immediate?) - collection on root state
119
- return this.addCallbackOrWaitCollectionAvailable(this.state, args[0], spec_1.OPERATION.ADD, args[1], args[2] !== false);
116
+ return this.addCallbackOrWaitCollectionAvailable(this.state, args[0], OPERATION.ADD, args[1], args[2] !== false);
120
117
  }
121
118
  else {
122
119
  // onAdd(instance, property, handler, immediate?) - nested collection
123
- return this.addCallbackOrWaitCollectionAvailable(args[0], args[1], spec_1.OPERATION.ADD, args[2], args[3] !== false);
120
+ return this.addCallbackOrWaitCollectionAvailable(args[0], args[1], OPERATION.ADD, args[2], args[3] !== false);
124
121
  }
125
122
  }
126
123
  onRemove(...args) {
127
124
  if (typeof args[0] === 'string') {
128
125
  // onRemove(property, handler) - collection on root state
129
- return this.addCallbackOrWaitCollectionAvailable(this.state, args[0], spec_1.OPERATION.DELETE, args[1]);
126
+ return this.addCallbackOrWaitCollectionAvailable(this.state, args[0], OPERATION.DELETE, args[1]);
130
127
  }
131
128
  else {
132
129
  // onRemove(instance, property, handler) - nested collection
133
- return this.addCallbackOrWaitCollectionAvailable(args[0], args[1], spec_1.OPERATION.DELETE, args[2]);
130
+ return this.addCallbackOrWaitCollectionAvailable(args[0], args[1], OPERATION.DELETE, args[2]);
134
131
  }
135
132
  }
136
133
  /**
@@ -156,7 +153,7 @@ class StateCallbackStrategy {
156
153
  if (immediate) {
157
154
  action();
158
155
  }
159
- return this.addCallback(from[symbols_1.$refId], spec_1.OPERATION.REPLACE, action);
156
+ return this.addCallback(from[$refId], OPERATION.REPLACE, action);
160
157
  }
161
158
  triggerChanges(allChanges) {
162
159
  this.uniqueRefIds.clear();
@@ -171,23 +168,23 @@ class StateCallbackStrategy {
171
168
  //
172
169
  // trigger onRemove on child structure.
173
170
  //
174
- if ((change.op & spec_1.OPERATION.DELETE) === spec_1.OPERATION.DELETE &&
175
- change.previousValue instanceof Schema_1.Schema) {
176
- const childRefId = change.previousValue[symbols_1.$refId];
177
- const deleteCallbacks = this.callbacks[childRefId]?.[spec_1.OPERATION.DELETE];
171
+ if ((change.op & OPERATION.DELETE) === OPERATION.DELETE &&
172
+ change.previousValue instanceof Schema) {
173
+ const childRefId = change.previousValue[$refId];
174
+ const deleteCallbacks = this.callbacks[childRefId]?.[OPERATION.DELETE];
178
175
  if (deleteCallbacks) {
179
176
  for (let j = deleteCallbacks.length - 1; j >= 0; j--) {
180
177
  deleteCallbacks[j]();
181
178
  }
182
179
  }
183
180
  }
184
- if (ref instanceof Schema_1.Schema) {
181
+ if (ref instanceof Schema) {
185
182
  //
186
183
  // Handle Schema instance
187
184
  //
188
185
  if (!this.uniqueRefIds.has(refId)) {
189
186
  // trigger onChange
190
- const replaceCallbacks = $callbacks[spec_1.OPERATION.REPLACE];
187
+ const replaceCallbacks = $callbacks[OPERATION.REPLACE];
191
188
  if (replaceCallbacks) {
192
189
  for (let j = replaceCallbacks.length - 1; j >= 0; j--) {
193
190
  try {
@@ -221,13 +218,13 @@ class StateCallbackStrategy {
221
218
  // Handle collection of items
222
219
  //
223
220
  const dynamicIndex = change.dynamicIndex ?? change.field;
224
- if ((change.op & spec_1.OPERATION.DELETE) === spec_1.OPERATION.DELETE) {
221
+ if ((change.op & OPERATION.DELETE) === OPERATION.DELETE) {
225
222
  //
226
223
  // FIXME: `previousValue` should always be available.
227
224
  //
228
225
  if (change.previousValue !== undefined) {
229
226
  // trigger onRemove (key, value)
230
- const deleteCallbacks = $callbacks[spec_1.OPERATION.DELETE];
227
+ const deleteCallbacks = $callbacks[OPERATION.DELETE];
231
228
  if (deleteCallbacks) {
232
229
  for (let j = deleteCallbacks.length - 1; j >= 0; j--) {
233
230
  deleteCallbacks[j](dynamicIndex, change.previousValue);
@@ -235,8 +232,8 @@ class StateCallbackStrategy {
235
232
  }
236
233
  }
237
234
  // Handle DELETE_AND_ADD operation
238
- if ((change.op & spec_1.OPERATION.ADD) === spec_1.OPERATION.ADD) {
239
- const addCallbacks = $callbacks[spec_1.OPERATION.ADD];
235
+ if ((change.op & OPERATION.ADD) === OPERATION.ADD) {
236
+ const addCallbacks = $callbacks[OPERATION.ADD];
240
237
  if (addCallbacks) {
241
238
  this.isTriggering = true;
242
239
  for (let j = addCallbacks.length - 1; j >= 0; j--) {
@@ -246,10 +243,10 @@ class StateCallbackStrategy {
246
243
  }
247
244
  }
248
245
  }
249
- else if ((change.op & spec_1.OPERATION.ADD) === spec_1.OPERATION.ADD &&
246
+ else if ((change.op & OPERATION.ADD) === OPERATION.ADD &&
250
247
  change.previousValue !== change.value) {
251
248
  // trigger onAdd (key, value)
252
- const addCallbacks = $callbacks[spec_1.OPERATION.ADD];
249
+ const addCallbacks = $callbacks[OPERATION.ADD];
253
250
  if (addCallbacks) {
254
251
  this.isTriggering = true;
255
252
  for (let j = addCallbacks.length - 1; j >= 0; j--) {
@@ -260,7 +257,7 @@ class StateCallbackStrategy {
260
257
  }
261
258
  // trigger onChange (key, value)
262
259
  if (change.value !== change.previousValue) {
263
- const replaceCallbacks = $callbacks[spec_1.OPERATION.REPLACE];
260
+ const replaceCallbacks = $callbacks[OPERATION.REPLACE];
264
261
  if (replaceCallbacks) {
265
262
  for (let j = replaceCallbacks.length - 1; j >= 0; j--) {
266
263
  replaceCallbacks[j](dynamicIndex, change.value);
@@ -272,11 +269,10 @@ class StateCallbackStrategy {
272
269
  }
273
270
  }
274
271
  }
275
- exports.StateCallbackStrategy = StateCallbackStrategy;
276
272
  /**
277
273
  * Factory class for retrieving the callbacks API.
278
274
  */
279
- exports.Callbacks = {
275
+ export const Callbacks = {
280
276
  /**
281
277
  * Get the new callbacks standard API.
282
278
  *
@@ -307,7 +303,7 @@ exports.Callbacks = {
307
303
  * @returns the new callbacks standard API.
308
304
  */
309
305
  get(roomOrDecoder) {
310
- if (roomOrDecoder instanceof Decoder_1.Decoder) {
306
+ if (roomOrDecoder instanceof Decoder) {
311
307
  return new StateCallbackStrategy(roomOrDecoder);
312
308
  }
313
309
  else if (roomOrDecoder.serializer.decoder) {
@@ -326,15 +322,15 @@ exports.Callbacks = {
326
322
  * @returns the legacy callbacks API.
327
323
  */
328
324
  getLegacy(roomOrDecoder) {
329
- if (roomOrDecoder instanceof Decoder_1.Decoder) {
330
- return (0, getDecoderStateCallbacks_1.getDecoderStateCallbacks)(roomOrDecoder);
325
+ if (roomOrDecoder instanceof Decoder) {
326
+ return getDecoderStateCallbacks(roomOrDecoder);
331
327
  }
332
328
  else if (roomOrDecoder.serializer.decoder) {
333
- return (0, getDecoderStateCallbacks_1.getDecoderStateCallbacks)(roomOrDecoder.serializer.decoder);
329
+ return getDecoderStateCallbacks(roomOrDecoder.serializer.decoder);
334
330
  }
335
331
  },
336
332
  getRawChanges(decoder, callback) {
337
- return (0, RawChanges_1.getRawChangesCallback)(decoder, callback);
333
+ return getRawChangesCallback(decoder, callback);
338
334
  }
339
335
  };
340
336
  //# sourceMappingURL=Callbacks.js.map