@colyseus/schema 4.0.2 → 4.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (326) hide show
  1. package/{lib → build}/Metadata.d.ts +2 -2
  2. package/{lib → build}/Reflection.d.ts +13 -13
  3. package/{lib → build}/Schema.d.ts +10 -10
  4. package/{lib/src → build}/annotations.d.ts +10 -10
  5. package/build/codegen/languages/cpp.d.ts +3 -0
  6. package/build/codegen/languages/csharp.d.ts +4 -0
  7. package/build/codegen/languages/haxe.d.ts +3 -0
  8. package/{lib → build}/codegen/languages/java.d.ts +2 -2
  9. package/build/codegen/languages/js.d.ts +3 -0
  10. package/build/codegen/languages/lua.d.ts +3 -0
  11. package/build/codegen/languages/ts.d.ts +3 -0
  12. package/{lib → build}/codegen/parser.d.ts +1 -1
  13. package/{lib → build}/decoder/DecodeOperation.d.ts +5 -5
  14. package/{lib/src → build}/decoder/Decoder.d.ts +7 -7
  15. package/{lib → build}/decoder/ReferenceTracker.d.ts +1 -1
  16. package/{lib → build}/decoder/strategy/Callbacks.d.ts +18 -43
  17. package/{lib → build}/decoder/strategy/RawChanges.d.ts +2 -2
  18. package/{lib → build}/decoder/strategy/getDecoderStateCallbacks.d.ts +3 -3
  19. package/{lib → build}/encoder/ChangeTree.d.ts +11 -11
  20. package/{lib → build}/encoder/EncodeOperation.d.ts +5 -5
  21. package/{lib → build}/encoder/Encoder.d.ts +6 -6
  22. package/{lib/src → build}/encoder/Root.d.ts +2 -2
  23. package/{lib/src → build}/encoder/StateView.d.ts +1 -1
  24. package/{lib/src → build}/encoding/assert.d.ts +6 -6
  25. package/{lib/src → build}/encoding/decode.d.ts +1 -1
  26. package/{lib/src → build}/encoding/encode.d.ts +1 -1
  27. package/build/{cjs/index.cjs → index.cjs} +8 -34
  28. package/build/index.cjs.map +1 -0
  29. package/build/index.d.ts +32 -0
  30. package/build/{umd/index.js → index.js} +8 -34
  31. package/build/{esm/index.mjs → index.mjs} +8 -34
  32. package/build/index.mjs.map +1 -0
  33. package/{lib → build}/types/HelperTypes.d.ts +6 -6
  34. package/{lib → build}/types/TypeContext.d.ts +1 -1
  35. package/{lib/src → build}/types/custom/ArraySchema.d.ts +8 -8
  36. package/{lib/src → build}/types/custom/CollectionSchema.d.ts +7 -7
  37. package/{lib → build}/types/custom/MapSchema.d.ts +7 -7
  38. package/{lib/src → build}/types/custom/SetSchema.d.ts +7 -7
  39. package/{lib/src → build}/types/registry.d.ts +2 -2
  40. package/{lib → build}/utils.d.ts +1 -1
  41. package/package.json +9 -10
  42. package/src/Metadata.ts +5 -5
  43. package/src/Reflection.ts +7 -7
  44. package/src/Schema.ts +11 -11
  45. package/src/annotations.ts +13 -13
  46. package/src/codegen/api.ts +3 -3
  47. package/src/codegen/cli.ts +2 -2
  48. package/src/codegen/languages/cpp.ts +2 -2
  49. package/src/codegen/languages/csharp.ts +3 -3
  50. package/src/codegen/languages/haxe.ts +2 -2
  51. package/src/codegen/languages/java.ts +2 -2
  52. package/src/codegen/languages/js.ts +2 -2
  53. package/src/codegen/languages/lua.ts +2 -2
  54. package/src/codegen/languages/ts.ts +2 -2
  55. package/src/codegen/parser.ts +6 -1
  56. package/src/decoder/DecodeOperation.ts +14 -14
  57. package/src/decoder/Decoder.ts +11 -11
  58. package/src/decoder/ReferenceTracker.ts +8 -8
  59. package/src/decoder/strategy/Callbacks.ts +27 -53
  60. package/src/decoder/strategy/RawChanges.ts +2 -2
  61. package/src/decoder/strategy/getDecoderStateCallbacks.ts +10 -10
  62. package/src/encoder/ChangeTree.ts +13 -13
  63. package/src/encoder/EncodeOperation.ts +9 -9
  64. package/src/encoder/Encoder.ts +10 -10
  65. package/src/encoder/Root.ts +4 -4
  66. package/src/encoder/StateView.ts +7 -7
  67. package/src/encoding/assert.ts +6 -6
  68. package/src/encoding/decode.ts +1 -1
  69. package/src/encoding/encode.ts +1 -1
  70. package/src/index.ts +27 -27
  71. package/src/types/HelperTypes.ts +6 -6
  72. package/src/types/TypeContext.ts +3 -3
  73. package/src/types/custom/ArraySchema.ts +11 -11
  74. package/src/types/custom/CollectionSchema.ts +9 -9
  75. package/src/types/custom/MapSchema.ts +10 -10
  76. package/src/types/custom/SetSchema.ts +9 -9
  77. package/src/types/registry.ts +3 -3
  78. package/src/utils.ts +3 -3
  79. package/src/v3_bench.ts +1 -1
  80. package/build/cjs/index.cjs.map +0 -1
  81. package/build/esm/index.mjs.map +0 -1
  82. package/lib/Metadata.js +0 -256
  83. package/lib/Metadata.js.map +0 -1
  84. package/lib/Reflection.js +0 -179
  85. package/lib/Reflection.js.map +0 -1
  86. package/lib/Schema.js +0 -352
  87. package/lib/Schema.js.map +0 -1
  88. package/lib/annotations.d.ts +0 -109
  89. package/lib/annotations.js +0 -473
  90. package/lib/annotations.js.map +0 -1
  91. package/lib/bench_encode.d.ts +0 -1
  92. package/lib/bench_encode.js +0 -91
  93. package/lib/bench_encode.js.map +0 -1
  94. package/lib/benchmark.d.ts +0 -1
  95. package/lib/benchmark.js +0 -218
  96. package/lib/benchmark.js.map +0 -1
  97. package/lib/codegen/api.js +0 -56
  98. package/lib/codegen/api.js.map +0 -1
  99. package/lib/codegen/argv.js +0 -39
  100. package/lib/codegen/argv.js.map +0 -1
  101. package/lib/codegen/cli.js +0 -58
  102. package/lib/codegen/cli.js.map +0 -1
  103. package/lib/codegen/languages/cpp.d.ts +0 -3
  104. package/lib/codegen/languages/cpp.js +0 -258
  105. package/lib/codegen/languages/cpp.js.map +0 -1
  106. package/lib/codegen/languages/csharp.d.ts +0 -4
  107. package/lib/codegen/languages/csharp.js +0 -154
  108. package/lib/codegen/languages/csharp.js.map +0 -1
  109. package/lib/codegen/languages/haxe.d.ts +0 -3
  110. package/lib/codegen/languages/haxe.js +0 -100
  111. package/lib/codegen/languages/haxe.js.map +0 -1
  112. package/lib/codegen/languages/java.js +0 -100
  113. package/lib/codegen/languages/java.js.map +0 -1
  114. package/lib/codegen/languages/js.d.ts +0 -3
  115. package/lib/codegen/languages/js.js +0 -101
  116. package/lib/codegen/languages/js.js.map +0 -1
  117. package/lib/codegen/languages/lua.d.ts +0 -3
  118. package/lib/codegen/languages/lua.js +0 -103
  119. package/lib/codegen/languages/lua.js.map +0 -1
  120. package/lib/codegen/languages/ts.d.ts +0 -3
  121. package/lib/codegen/languages/ts.js +0 -116
  122. package/lib/codegen/languages/ts.js.map +0 -1
  123. package/lib/codegen/parser.js +0 -327
  124. package/lib/codegen/parser.js.map +0 -1
  125. package/lib/codegen/types.js +0 -142
  126. package/lib/codegen/types.js.map +0 -1
  127. package/lib/decoder/DecodeOperation.js +0 -248
  128. package/lib/decoder/DecodeOperation.js.map +0 -1
  129. package/lib/decoder/Decoder.d.ts +0 -21
  130. package/lib/decoder/Decoder.js +0 -114
  131. package/lib/decoder/Decoder.js.map +0 -1
  132. package/lib/decoder/ReferenceTracker.js +0 -135
  133. package/lib/decoder/ReferenceTracker.js.map +0 -1
  134. package/lib/decoder/strategy/Callbacks.js +0 -336
  135. package/lib/decoder/strategy/Callbacks.js.map +0 -1
  136. package/lib/decoder/strategy/RawChanges.js +0 -4
  137. package/lib/decoder/strategy/RawChanges.js.map +0 -1
  138. package/lib/decoder/strategy/getDecoderStateCallbacks.js +0 -274
  139. package/lib/decoder/strategy/getDecoderStateCallbacks.js.map +0 -1
  140. package/lib/encoder/ChangeTree.js +0 -534
  141. package/lib/encoder/ChangeTree.js.map +0 -1
  142. package/lib/encoder/EncodeOperation.js +0 -132
  143. package/lib/encoder/EncodeOperation.js.map +0 -1
  144. package/lib/encoder/Encoder.js +0 -204
  145. package/lib/encoder/Encoder.js.map +0 -1
  146. package/lib/encoder/Root.d.ts +0 -28
  147. package/lib/encoder/Root.js +0 -229
  148. package/lib/encoder/Root.js.map +0 -1
  149. package/lib/encoder/StateView.d.ts +0 -34
  150. package/lib/encoder/StateView.js +0 -279
  151. package/lib/encoder/StateView.js.map +0 -1
  152. package/lib/encoding/assert.d.ts +0 -10
  153. package/lib/encoding/assert.js +0 -49
  154. package/lib/encoding/assert.js.map +0 -1
  155. package/lib/encoding/decode.d.ts +0 -67
  156. package/lib/encoding/decode.js +0 -217
  157. package/lib/encoding/decode.js.map +0 -1
  158. package/lib/encoding/encode.d.ts +0 -40
  159. package/lib/encoding/encode.js +0 -279
  160. package/lib/encoding/encode.js.map +0 -1
  161. package/lib/encoding/spec.js +0 -26
  162. package/lib/encoding/spec.js.map +0 -1
  163. package/lib/index.d.ts +0 -32
  164. package/lib/index.js +0 -39
  165. package/lib/index.js.map +0 -1
  166. package/lib/src/Metadata.d.ts +0 -49
  167. package/lib/src/Metadata.js +0 -256
  168. package/lib/src/Metadata.js.map +0 -1
  169. package/lib/src/Reflection.d.ts +0 -71
  170. package/lib/src/Reflection.js +0 -179
  171. package/lib/src/Reflection.js.map +0 -1
  172. package/lib/src/Schema.d.ts +0 -86
  173. package/lib/src/Schema.js +0 -352
  174. package/lib/src/Schema.js.map +0 -1
  175. package/lib/src/annotations.js +0 -473
  176. package/lib/src/annotations.js.map +0 -1
  177. package/lib/src/bench_encode.d.ts +0 -1
  178. package/lib/src/bench_encode.js +0 -91
  179. package/lib/src/bench_encode.js.map +0 -1
  180. package/lib/src/codegen/api.d.ts +0 -7
  181. package/lib/src/codegen/api.js +0 -56
  182. package/lib/src/codegen/api.js.map +0 -1
  183. package/lib/src/codegen/argv.d.ts +0 -6
  184. package/lib/src/codegen/argv.js +0 -39
  185. package/lib/src/codegen/argv.js.map +0 -1
  186. package/lib/src/codegen/cli.d.ts +0 -1
  187. package/lib/src/codegen/cli.js +0 -58
  188. package/lib/src/codegen/cli.js.map +0 -1
  189. package/lib/src/codegen/languages/cpp.d.ts +0 -3
  190. package/lib/src/codegen/languages/cpp.js +0 -258
  191. package/lib/src/codegen/languages/cpp.js.map +0 -1
  192. package/lib/src/codegen/languages/csharp.d.ts +0 -4
  193. package/lib/src/codegen/languages/csharp.js +0 -154
  194. package/lib/src/codegen/languages/csharp.js.map +0 -1
  195. package/lib/src/codegen/languages/haxe.d.ts +0 -3
  196. package/lib/src/codegen/languages/haxe.js +0 -100
  197. package/lib/src/codegen/languages/haxe.js.map +0 -1
  198. package/lib/src/codegen/languages/java.d.ts +0 -6
  199. package/lib/src/codegen/languages/java.js +0 -100
  200. package/lib/src/codegen/languages/java.js.map +0 -1
  201. package/lib/src/codegen/languages/js.d.ts +0 -3
  202. package/lib/src/codegen/languages/js.js +0 -101
  203. package/lib/src/codegen/languages/js.js.map +0 -1
  204. package/lib/src/codegen/languages/lua.d.ts +0 -3
  205. package/lib/src/codegen/languages/lua.js +0 -103
  206. package/lib/src/codegen/languages/lua.js.map +0 -1
  207. package/lib/src/codegen/languages/ts.d.ts +0 -3
  208. package/lib/src/codegen/languages/ts.js +0 -116
  209. package/lib/src/codegen/languages/ts.js.map +0 -1
  210. package/lib/src/codegen/parser.d.ts +0 -13
  211. package/lib/src/codegen/parser.js +0 -327
  212. package/lib/src/codegen/parser.js.map +0 -1
  213. package/lib/src/codegen/types.d.ts +0 -52
  214. package/lib/src/codegen/types.js +0 -142
  215. package/lib/src/codegen/types.js.map +0 -1
  216. package/lib/src/decoder/DecodeOperation.d.ts +0 -23
  217. package/lib/src/decoder/DecodeOperation.js +0 -248
  218. package/lib/src/decoder/DecodeOperation.js.map +0 -1
  219. package/lib/src/decoder/Decoder.js +0 -114
  220. package/lib/src/decoder/Decoder.js.map +0 -1
  221. package/lib/src/decoder/ReferenceTracker.d.ts +0 -25
  222. package/lib/src/decoder/ReferenceTracker.js +0 -135
  223. package/lib/src/decoder/ReferenceTracker.js.map +0 -1
  224. package/lib/src/decoder/strategy/Callbacks.d.ts +0 -154
  225. package/lib/src/decoder/strategy/Callbacks.js +0 -336
  226. package/lib/src/decoder/strategy/Callbacks.js.map +0 -1
  227. package/lib/src/decoder/strategy/RawChanges.d.ts +0 -3
  228. package/lib/src/decoder/strategy/RawChanges.js +0 -4
  229. package/lib/src/decoder/strategy/RawChanges.js.map +0 -1
  230. package/lib/src/decoder/strategy/getDecoderStateCallbacks.d.ts +0 -76
  231. package/lib/src/decoder/strategy/getDecoderStateCallbacks.js +0 -274
  232. package/lib/src/decoder/strategy/getDecoderStateCallbacks.js.map +0 -1
  233. package/lib/src/encoder/ChangeTree.d.ts +0 -135
  234. package/lib/src/encoder/ChangeTree.js +0 -534
  235. package/lib/src/encoder/ChangeTree.js.map +0 -1
  236. package/lib/src/encoder/EncodeOperation.d.ts +0 -22
  237. package/lib/src/encoder/EncodeOperation.js +0 -132
  238. package/lib/src/encoder/EncodeOperation.js.map +0 -1
  239. package/lib/src/encoder/Encoder.d.ts +0 -22
  240. package/lib/src/encoder/Encoder.js +0 -204
  241. package/lib/src/encoder/Encoder.js.map +0 -1
  242. package/lib/src/encoder/Root.js +0 -229
  243. package/lib/src/encoder/Root.js.map +0 -1
  244. package/lib/src/encoder/StateView.js +0 -279
  245. package/lib/src/encoder/StateView.js.map +0 -1
  246. package/lib/src/encoding/assert.js +0 -49
  247. package/lib/src/encoding/assert.js.map +0 -1
  248. package/lib/src/encoding/decode.js +0 -217
  249. package/lib/src/encoding/decode.js.map +0 -1
  250. package/lib/src/encoding/encode.js +0 -279
  251. package/lib/src/encoding/encode.js.map +0 -1
  252. package/lib/src/encoding/spec.d.ts +0 -24
  253. package/lib/src/encoding/spec.js +0 -26
  254. package/lib/src/encoding/spec.js.map +0 -1
  255. package/lib/src/index.d.ts +0 -32
  256. package/lib/src/index.js +0 -39
  257. package/lib/src/index.js.map +0 -1
  258. package/lib/src/symbol.shim.js +0 -3
  259. package/lib/src/symbol.shim.js.map +0 -1
  260. package/lib/src/types/HelperTypes.d.ts +0 -77
  261. package/lib/src/types/HelperTypes.js +0 -2
  262. package/lib/src/types/HelperTypes.js.map +0 -1
  263. package/lib/src/types/TypeContext.d.ts +0 -31
  264. package/lib/src/types/TypeContext.js +0 -143
  265. package/lib/src/types/TypeContext.js.map +0 -1
  266. package/lib/src/types/custom/ArraySchema.js +0 -733
  267. package/lib/src/types/custom/ArraySchema.js.map +0 -1
  268. package/lib/src/types/custom/CollectionSchema.js +0 -170
  269. package/lib/src/types/custom/CollectionSchema.js.map +0 -1
  270. package/lib/src/types/custom/MapSchema.d.ts +0 -51
  271. package/lib/src/types/custom/MapSchema.js +0 -222
  272. package/lib/src/types/custom/MapSchema.js.map +0 -1
  273. package/lib/src/types/custom/SetSchema.js +0 -178
  274. package/lib/src/types/custom/SetSchema.js.map +0 -1
  275. package/lib/src/types/registry.js +0 -30
  276. package/lib/src/types/registry.js.map +0 -1
  277. package/lib/src/types/symbols.js +0 -34
  278. package/lib/src/types/symbols.js.map +0 -1
  279. package/lib/src/types/utils.js +0 -13
  280. package/lib/src/types/utils.js.map +0 -1
  281. package/lib/src/utils.d.ts +0 -13
  282. package/lib/src/utils.js +0 -49
  283. package/lib/src/utils.js.map +0 -1
  284. package/lib/src/v3_bench.js +0 -128
  285. package/lib/src/v3_bench.js.map +0 -1
  286. package/lib/symbol.shim.d.ts +0 -6
  287. package/lib/symbol.shim.js +0 -3
  288. package/lib/symbol.shim.js.map +0 -1
  289. package/lib/types/HelperTypes.js +0 -2
  290. package/lib/types/HelperTypes.js.map +0 -1
  291. package/lib/types/TypeContext.js +0 -143
  292. package/lib/types/TypeContext.js.map +0 -1
  293. package/lib/types/custom/ArraySchema.d.ts +0 -270
  294. package/lib/types/custom/ArraySchema.js +0 -733
  295. package/lib/types/custom/ArraySchema.js.map +0 -1
  296. package/lib/types/custom/CollectionSchema.d.ts +0 -51
  297. package/lib/types/custom/CollectionSchema.js +0 -170
  298. package/lib/types/custom/CollectionSchema.js.map +0 -1
  299. package/lib/types/custom/MapSchema.js +0 -222
  300. package/lib/types/custom/MapSchema.js.map +0 -1
  301. package/lib/types/custom/SetSchema.d.ts +0 -48
  302. package/lib/types/custom/SetSchema.js +0 -178
  303. package/lib/types/custom/SetSchema.js.map +0 -1
  304. package/lib/types/registry.d.ts +0 -16
  305. package/lib/types/registry.js +0 -30
  306. package/lib/types/registry.js.map +0 -1
  307. package/lib/types/symbols.d.ts +0 -33
  308. package/lib/types/symbols.js +0 -34
  309. package/lib/types/symbols.js.map +0 -1
  310. package/lib/types/utils.d.ts +0 -1
  311. package/lib/types/utils.js +0 -13
  312. package/lib/types/utils.js.map +0 -1
  313. package/lib/utils.js +0 -49
  314. package/lib/utils.js.map +0 -1
  315. package/lib/v3_bench.d.ts +0 -1
  316. package/lib/v3_bench.js +0 -128
  317. package/lib/v3_bench.js.map +0 -1
  318. /package/{lib → build}/codegen/api.d.ts +0 -0
  319. /package/{lib → build}/codegen/argv.d.ts +0 -0
  320. /package/{lib → build}/codegen/cli.d.ts +0 -0
  321. /package/{lib → build}/codegen/types.d.ts +0 -0
  322. /package/{lib → build}/encoding/spec.d.ts +0 -0
  323. /package/{lib/src → build}/symbol.shim.d.ts +0 -0
  324. /package/{lib/src → build}/types/symbols.d.ts +0 -0
  325. /package/{lib/src → build}/types/utils.d.ts +0 -0
  326. /package/{lib/src → build}/v3_bench.d.ts +0 -0
@@ -1,274 +0,0 @@
1
- import { OPERATION } from "../../encoding/spec";
2
- import { Schema } from "../../Schema";
3
- import { $refId } from "../../types/symbols";
4
- /**
5
- * Legacy callback system
6
- *
7
- * @param decoder
8
- * @returns
9
- */
10
- export function getDecoderStateCallbacks(decoder) {
11
- const $root = decoder.root;
12
- const callbacks = $root.callbacks;
13
- const onAddCalls = new WeakMap();
14
- let currentOnAddCallback;
15
- decoder.triggerChanges = function (allChanges) {
16
- const uniqueRefIds = new Set();
17
- for (let i = 0, l = allChanges.length; i < l; i++) {
18
- const change = allChanges[i];
19
- const refId = change.refId;
20
- const ref = change.ref;
21
- const $callbacks = callbacks[refId];
22
- if (!$callbacks) {
23
- continue;
24
- }
25
- //
26
- // trigger onRemove on child structure.
27
- //
28
- if ((change.op & OPERATION.DELETE) === OPERATION.DELETE &&
29
- change.previousValue instanceof Schema) {
30
- const deleteCallbacks = callbacks[change.previousValue[$refId]]?.[OPERATION.DELETE];
31
- for (let i = deleteCallbacks?.length - 1; i >= 0; i--) {
32
- deleteCallbacks[i]();
33
- }
34
- }
35
- if (ref instanceof Schema) {
36
- //
37
- // Handle schema instance
38
- //
39
- if (!uniqueRefIds.has(refId)) {
40
- // trigger onChange
41
- const replaceCallbacks = $callbacks?.[OPERATION.REPLACE];
42
- for (let i = replaceCallbacks?.length - 1; i >= 0; i--) {
43
- replaceCallbacks[i]();
44
- // try {
45
- // } catch (e) {
46
- // console.error(e);
47
- // }
48
- }
49
- }
50
- if ($callbacks.hasOwnProperty(change.field)) {
51
- const fieldCallbacks = $callbacks[change.field];
52
- for (let i = fieldCallbacks?.length - 1; i >= 0; i--) {
53
- fieldCallbacks[i](change.value, change.previousValue);
54
- // try {
55
- // } catch (e) {
56
- // console.error(e);
57
- // }
58
- }
59
- }
60
- }
61
- else {
62
- //
63
- // Handle collection of items
64
- //
65
- if ((change.op & OPERATION.DELETE) === OPERATION.DELETE) {
66
- //
67
- // FIXME: `previousValue` should always be available.
68
- //
69
- if (change.previousValue !== undefined) {
70
- // triger onRemove
71
- const deleteCallbacks = $callbacks[OPERATION.DELETE];
72
- for (let i = deleteCallbacks?.length - 1; i >= 0; i--) {
73
- deleteCallbacks[i](change.previousValue, change.dynamicIndex ?? change.field);
74
- }
75
- }
76
- // Handle DELETE_AND_ADD operations
77
- if ((change.op & OPERATION.ADD) === OPERATION.ADD) {
78
- const addCallbacks = $callbacks[OPERATION.ADD];
79
- for (let i = addCallbacks?.length - 1; i >= 0; i--) {
80
- addCallbacks[i](change.value, change.dynamicIndex ?? change.field);
81
- }
82
- }
83
- }
84
- else if ((change.op & OPERATION.ADD) === OPERATION.ADD &&
85
- change.previousValue !== change.value) {
86
- // triger onAdd
87
- const addCallbacks = $callbacks[OPERATION.ADD];
88
- for (let i = addCallbacks?.length - 1; i >= 0; i--) {
89
- addCallbacks[i](change.value, change.dynamicIndex ?? change.field);
90
- }
91
- }
92
- // trigger onChange
93
- if (change.value !== change.previousValue &&
94
- // FIXME: see "should not encode item if added and removed at the same patch" test case.
95
- // some "ADD" + "DELETE" operations on same patch are being encoded as "DELETE"
96
- (change.value !== undefined || change.previousValue !== undefined)) {
97
- const replaceCallbacks = $callbacks[OPERATION.REPLACE];
98
- for (let i = replaceCallbacks?.length - 1; i >= 0; i--) {
99
- replaceCallbacks[i](change.value, change.dynamicIndex ?? change.field);
100
- }
101
- }
102
- }
103
- uniqueRefIds.add(refId);
104
- }
105
- };
106
- function getProxy(metadataOrType, context) {
107
- let metadata = context.instance?.constructor[Symbol.metadata] || metadataOrType;
108
- let isCollection = ((context.instance && typeof (context.instance['forEach']) === "function") ||
109
- (metadataOrType && typeof (metadataOrType[Symbol.metadata]) === "undefined"));
110
- if (metadata && !isCollection) {
111
- const onAddListen = function (ref, prop, callback, immediate) {
112
- // immediate trigger
113
- if (immediate &&
114
- context.instance[prop] !== undefined &&
115
- !onAddCalls.has(currentOnAddCallback) // Workaround for https://github.com/colyseus/schema/issues/147
116
- ) {
117
- callback(context.instance[prop], undefined);
118
- }
119
- return $root.addCallback(ref[$refId], prop, callback);
120
- };
121
- /**
122
- * Schema instances
123
- */
124
- return new Proxy({
125
- listen: function listen(prop, callback, immediate = true) {
126
- if (context.instance) {
127
- return onAddListen(context.instance, prop, callback, immediate);
128
- }
129
- else {
130
- // collection instance not received yet
131
- let detachCallback = () => { };
132
- context.onInstanceAvailable((ref, existing) => {
133
- detachCallback = onAddListen(ref, prop, callback, immediate && existing && !onAddCalls.has(currentOnAddCallback));
134
- });
135
- return () => detachCallback();
136
- }
137
- },
138
- onChange: function onChange(callback) {
139
- return $root.addCallback(context.instance[$refId], OPERATION.REPLACE, callback);
140
- },
141
- //
142
- // TODO: refactor `bindTo()` implementation.
143
- // There is room for improvement.
144
- //
145
- bindTo: function bindTo(targetObject, properties) {
146
- if (!properties) {
147
- properties = Object.keys(metadata).map((index) => metadata[index].name);
148
- }
149
- return $root.addCallback(context.instance[$refId], OPERATION.REPLACE, () => {
150
- properties.forEach((prop) => targetObject[prop] = context.instance[prop]);
151
- });
152
- }
153
- }, {
154
- get(target, prop) {
155
- const metadataField = metadata[metadata[prop]];
156
- if (metadataField) {
157
- const instance = context.instance?.[prop];
158
- const onInstanceAvailable = ((callback) => {
159
- const unbind = $(context.instance).listen(prop, (value, _) => {
160
- callback(value, false);
161
- // FIXME: by "unbinding" the callback here,
162
- // it will not support when the server
163
- // re-instantiates the instance.
164
- //
165
- unbind?.();
166
- }, false);
167
- // has existing value
168
- if (instance?.[$refId] !== undefined) {
169
- callback(instance, true);
170
- }
171
- });
172
- return getProxy(metadataField.type, {
173
- // make sure refId is available, otherwise need to wait for the instance to be available.
174
- instance: (instance?.[$refId] !== undefined && instance),
175
- parentInstance: context.instance,
176
- onInstanceAvailable,
177
- });
178
- }
179
- else {
180
- // accessing the function
181
- return target[prop];
182
- }
183
- },
184
- has(target, prop) { return metadata[prop] !== undefined; },
185
- set(_, _1, _2) { throw new Error("not allowed"); },
186
- deleteProperty(_, _1) { throw new Error("not allowed"); },
187
- });
188
- }
189
- else {
190
- /**
191
- * Collection instances
192
- */
193
- const onAdd = function (ref, callback, immediate) {
194
- // Trigger callback on existing items
195
- if (immediate) {
196
- ref.forEach((v, k) => callback(v, k));
197
- }
198
- return $root.addCallback(ref[$refId], OPERATION.ADD, (value, key) => {
199
- onAddCalls.set(callback, true);
200
- currentOnAddCallback = callback;
201
- callback(value, key);
202
- onAddCalls.delete(callback);
203
- currentOnAddCallback = undefined;
204
- });
205
- };
206
- const onRemove = function (ref, callback) {
207
- return $root.addCallback(ref[$refId], OPERATION.DELETE, callback);
208
- };
209
- const onChange = function (ref, callback) {
210
- return $root.addCallback(ref[$refId], OPERATION.REPLACE, callback);
211
- };
212
- return new Proxy({
213
- onAdd: function (callback, immediate = true) {
214
- //
215
- // https://github.com/colyseus/schema/issues/147
216
- // If parent instance has "onAdd" registered, avoid triggering immediate callback.
217
- //
218
- if (context.instance) {
219
- return onAdd(context.instance, callback, immediate && !onAddCalls.has(currentOnAddCallback));
220
- }
221
- else if (context.onInstanceAvailable) {
222
- // collection instance not received yet
223
- let detachCallback = () => { };
224
- context.onInstanceAvailable((ref, existing) => {
225
- detachCallback = onAdd(ref, callback, immediate && existing && !onAddCalls.has(currentOnAddCallback));
226
- });
227
- return () => detachCallback();
228
- }
229
- },
230
- onRemove: function (callback) {
231
- if (context.instance) {
232
- return onRemove(context.instance, callback);
233
- }
234
- else if (context.onInstanceAvailable) {
235
- // collection instance not received yet
236
- let detachCallback = () => { };
237
- context.onInstanceAvailable((ref) => {
238
- detachCallback = onRemove(ref, callback);
239
- });
240
- return () => detachCallback();
241
- }
242
- },
243
- onChange: function (callback) {
244
- if (context.instance) {
245
- return onChange(context.instance, callback);
246
- }
247
- else if (context.onInstanceAvailable) {
248
- // collection instance not received yet
249
- let detachCallback = () => { };
250
- context.onInstanceAvailable((ref) => {
251
- detachCallback = onChange(ref, callback);
252
- });
253
- return () => detachCallback();
254
- }
255
- },
256
- }, {
257
- get(target, prop) {
258
- if (!target[prop]) {
259
- throw new Error(`Can't access '${prop}' through callback proxy. access the instance directly.`);
260
- }
261
- return target[prop];
262
- },
263
- has(target, prop) { return target[prop] !== undefined; },
264
- set(_, _1, _2) { throw new Error("not allowed"); },
265
- deleteProperty(_, _1) { throw new Error("not allowed"); },
266
- });
267
- }
268
- }
269
- function $(instance) {
270
- return getProxy(undefined, { instance });
271
- }
272
- return $;
273
- }
274
- //# sourceMappingURL=getDecoderStateCallbacks.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"getDecoderStateCallbacks.js","sourceRoot":"","sources":["../../../src/decoder/strategy/getDecoderStateCallbacks.ts"],"names":[],"mappings":"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","sourcesContent":["import { Metadata } from \"../../Metadata\";\nimport { Collection, NonFunctionNonPrimitivePropNames, NonFunctionPropNames } from \"../../types/HelperTypes\";\nimport { IRef, Ref } from \"../../encoder/ChangeTree\";\nimport { Decoder } from \"../Decoder\";\nimport { DataChange } from \"../DecodeOperation\";\nimport { OPERATION } from \"../../encoding/spec\";\nimport { Schema } from \"../../Schema\";\nimport { $refId } from \"../../types/symbols\";\nimport type { DefinitionType } from \"../../annotations\";\nimport type { CollectionSchema } from \"../../types/custom/CollectionSchema\";\n\n//\n// Discussion: https://github.com/colyseus/schema/issues/155\n//\n// Main points:\n// - Decouple structures from their callbacks.\n// - Registering deep callbacks can be confusing.\n// - Avoid closures by allowing to pass a context. (https://github.com/colyseus/schema/issues/155#issuecomment-1804694081)\n//\n\n/**\n * TODO: define a schema interface, which even having duplicate definitions, it could be used to get the callback proxy.\n *\n * ```ts\n * export type SchemaCallbackProxy<RoomState> = (<T extends Schema>(instance: T) => CallbackProxy<T>);\n * ```\n */\nexport type SchemaCallbackProxy<RoomState> = (<T>(instance: T) => CallbackProxy<T>);\nexport type GetCallbackProxy = SchemaCallbackProxy<any>; // workaround for compatibility for < colyseus.js0.16.6. Remove me on next major release.\n\nexport type CallbackProxy<T> = unknown extends T // is \"any\"?\n ? SchemaCallback<T> & CollectionCallback<any, any>\n : T extends Collection<infer K, infer V, infer _>\n ? CollectionCallback<K, V>\n : SchemaCallback<T>;\n\nexport type SchemaCallback<T> = {\n /**\n * Trigger callback when value of a property changes.\n *\n * @param prop name of the property\n * @param callback callback to be triggered on property change\n * @param immediate trigger immediatelly if property has been already set.\n * @return callback to detach the listener\n */\n listen<K extends NonFunctionPropNames<T>>(\n prop: K,\n callback: (value: T[K], previousValue: T[K]) => void,\n immediate?: boolean,\n ): () => void;\n\n /**\n * Trigger callback whenever any property changed within this instance.\n *\n * @param prop name of the property\n * @param callback callback to be triggered on property change\n * @param immediate trigger immediatelly if property has been already set.\n * @return callback to detach the listener\n */\n onChange(callback: () => void): () => void;\n\n /**\n * Bind properties to another object. Changes on the properties will be reflected on the target object.\n *\n * @param targetObject object to bind properties to\n * @param properties list of properties to bind. If not provided, all properties will be bound.\n */\n bindTo(targetObject: any, properties?: Array<NonFunctionPropNames<T>>): void;\n} & {\n [K in NonFunctionNonPrimitivePropNames<T>]: CallbackProxy<T[K]>;\n}\n\nexport type CollectionCallback<K, V> = {\n /**\n * Trigger callback when an item has been added to the collection.\n *\n * @param callback\n * @param immediate\n * @return callback to detach the onAdd listener\n */\n onAdd(callback: (item: V, index: K) => void, immediate?: boolean): () => void;\n\n /**\n * Trigger callback when an item has been removed to the collection.\n *\n * @param callback\n * @return callback to detach the onRemove listener\n */\n onRemove(callback: (item: V, index: K) => void): () => void;\n\n /**\n * Trigger callback when the value on a key has changed.\n *\n * THIS METHOD IS NOT RECURSIVE!\n * If you want to listen to changes on individual items, you need to attach callbacks to the them directly inside the `onAdd` callback.\n *\n * @param callback\n * @return callback to detach the onChange listener\n */\n onChange(callback: (item: V, index: K) => void): () => void;\n};\n\ntype OnInstanceAvailableCallback = (callback: (ref: Ref, existing: boolean) => void) => void;\n\ntype CallContext = {\n instance?: any,\n parentInstance?: any,\n onInstanceAvailable?: OnInstanceAvailableCallback,\n}\n\n/**\n * Legacy callback system\n *\n * @param decoder\n * @returns\n */\nexport function getDecoderStateCallbacks<T extends Schema>(decoder: Decoder<T>): SchemaCallbackProxy<T> {\n const $root = decoder.root;\n const callbacks = $root.callbacks;\n\n const onAddCalls: WeakMap<Function, boolean> = new WeakMap();\n let currentOnAddCallback: Function | undefined;\n\n decoder.triggerChanges = function (allChanges: DataChange[]) {\n const uniqueRefIds = new Set<number>();\n\n for (let i = 0, l = allChanges.length; i < l; i++) {\n const change = allChanges[i];\n const refId = change.refId;\n const ref = change.ref;\n const $callbacks = callbacks[refId];\n\n if (!$callbacks) { continue; }\n\n //\n // trigger onRemove on child structure.\n //\n if (\n (change.op & OPERATION.DELETE) === OPERATION.DELETE &&\n change.previousValue instanceof Schema\n ) {\n const deleteCallbacks = callbacks[(change.previousValue as Ref)[$refId]]?.[OPERATION.DELETE];\n for (let i = deleteCallbacks?.length - 1; i >= 0; i--) {\n deleteCallbacks[i]();\n }\n }\n\n if (ref instanceof Schema) {\n //\n // Handle schema instance\n //\n\n if (!uniqueRefIds.has(refId)) {\n // trigger onChange\n const replaceCallbacks = $callbacks?.[OPERATION.REPLACE];\n for (let i = replaceCallbacks?.length - 1; i >= 0; i--) {\n replaceCallbacks[i]();\n // try {\n // } catch (e) {\n // console.error(e);\n // }\n }\n }\n\n if ($callbacks.hasOwnProperty(change.field)) {\n const fieldCallbacks = $callbacks[change.field];\n for (let i = fieldCallbacks?.length - 1; i >= 0; i--) {\n fieldCallbacks[i](change.value, change.previousValue);\n // try {\n // } catch (e) {\n // console.error(e);\n // }\n }\n }\n\n\n } else {\n //\n // Handle collection of items\n //\n\n if ((change.op & OPERATION.DELETE) === OPERATION.DELETE) {\n //\n // FIXME: `previousValue` should always be available.\n //\n if (change.previousValue !== undefined) {\n // triger onRemove\n const deleteCallbacks = $callbacks[OPERATION.DELETE];\n for (let i = deleteCallbacks?.length - 1; i >= 0; i--) {\n deleteCallbacks[i](change.previousValue, change.dynamicIndex ?? change.field);\n }\n }\n\n // Handle DELETE_AND_ADD operations\n if ((change.op & OPERATION.ADD) === OPERATION.ADD) {\n const addCallbacks = $callbacks[OPERATION.ADD];\n for (let i = addCallbacks?.length - 1; i >= 0; i--) {\n addCallbacks[i](change.value, change.dynamicIndex ?? change.field);\n }\n }\n\n } else if (\n (change.op & OPERATION.ADD) === OPERATION.ADD &&\n change.previousValue !== change.value\n ) {\n // triger onAdd\n const addCallbacks = $callbacks[OPERATION.ADD];\n for (let i = addCallbacks?.length - 1; i >= 0; i--) {\n addCallbacks[i](change.value, change.dynamicIndex ?? change.field);\n }\n }\n\n // trigger onChange\n if (\n change.value !== change.previousValue &&\n // FIXME: see \"should not encode item if added and removed at the same patch\" test case.\n // some \"ADD\" + \"DELETE\" operations on same patch are being encoded as \"DELETE\"\n (change.value !== undefined || change.previousValue !== undefined)\n ) {\n const replaceCallbacks = $callbacks[OPERATION.REPLACE];\n for (let i = replaceCallbacks?.length - 1; i >= 0; i--) {\n replaceCallbacks[i](change.value, change.dynamicIndex ?? change.field);\n }\n }\n }\n\n uniqueRefIds.add(refId);\n }\n };\n\n function getProxy(\n metadataOrType: Metadata | DefinitionType,\n context: CallContext\n ) {\n let metadata: Metadata = context.instance?.constructor[Symbol.metadata] || metadataOrType;\n let isCollection = (\n (context.instance && typeof (context.instance['forEach']) === \"function\") ||\n (metadataOrType && typeof ((metadataOrType as typeof Schema)[Symbol.metadata]) === \"undefined\")\n );\n\n if (metadata && !isCollection) {\n\n const onAddListen = function (\n ref: Ref,\n prop: string,\n callback: (value: any, previousValue: any) => void, immediate: boolean\n ) {\n // immediate trigger\n if (\n immediate &&\n context.instance[prop] !== undefined &&\n !onAddCalls.has(currentOnAddCallback) // Workaround for https://github.com/colyseus/schema/issues/147\n ) {\n callback(context.instance[prop], undefined);\n }\n return $root.addCallback(ref[$refId], prop, callback);\n }\n\n /**\n * Schema instances\n */\n return new Proxy({\n listen: function listen(prop: string, callback: (value: any, previousValue: any) => void, immediate: boolean = true) {\n if (context.instance) {\n return onAddListen(context.instance, prop, callback, immediate);\n\n } else {\n // collection instance not received yet\n let detachCallback = () => {};\n\n context.onInstanceAvailable((ref: Ref, existing: boolean) => {\n detachCallback = onAddListen(ref, prop, callback, immediate && existing && !onAddCalls.has(currentOnAddCallback))\n });\n\n return () => detachCallback();\n }\n },\n\n onChange: function onChange(callback: () => void) {\n return $root.addCallback(\n context.instance[$refId],\n OPERATION.REPLACE,\n callback\n );\n },\n\n //\n // TODO: refactor `bindTo()` implementation.\n // There is room for improvement.\n //\n bindTo: function bindTo(targetObject: any, properties?: string[]) {\n if (!properties) {\n properties = Object.keys(metadata).map((index) => metadata[index as any as number].name);\n }\n return $root.addCallback(\n context.instance[$refId],\n OPERATION.REPLACE,\n () => {\n properties.forEach((prop) =>\n targetObject[prop] = context.instance[prop])\n }\n );\n }\n }, {\n get(target, prop: string) {\n const metadataField = metadata[metadata[prop]];\n if (metadataField) {\n const instance = context.instance?.[prop];\n const onInstanceAvailable: OnInstanceAvailableCallback = (\n (callback: (ref: Ref, existing: boolean) => void) => {\n const unbind = $(context.instance).listen(prop, (value, _) => {\n callback(value, false);\n\n // FIXME: by \"unbinding\" the callback here,\n // it will not support when the server\n // re-instantiates the instance.\n //\n unbind?.();\n }, false);\n\n // has existing value\n if (instance?.[$refId] !== undefined) {\n callback(instance, true);\n }\n }\n );\n\n return getProxy(metadataField.type, {\n // make sure refId is available, otherwise need to wait for the instance to be available.\n instance: (instance?.[$refId] !== undefined && instance),\n parentInstance: context.instance,\n onInstanceAvailable,\n });\n\n } else {\n // accessing the function\n return target[prop as keyof typeof target];\n }\n },\n has(target, prop: string) { return metadata[prop] !== undefined; },\n set(_, _1, _2) { throw new Error(\"not allowed\"); },\n deleteProperty(_, _1) { throw new Error(\"not allowed\"); },\n });\n\n } else {\n /**\n * Collection instances\n */\n\n const onAdd = function (ref: Ref, callback: (value: any, key: any) => void, immediate: boolean) {\n // Trigger callback on existing items\n if (immediate) {\n (ref as CollectionSchema).forEach((v, k) => callback(v, k));\n }\n\n return $root.addCallback(ref[$refId], OPERATION.ADD, (value: any, key: any) => {\n onAddCalls.set(callback, true);\n currentOnAddCallback = callback;\n callback(value, key);\n onAddCalls.delete(callback)\n currentOnAddCallback = undefined;\n });\n };\n\n const onRemove = function (ref: Ref, callback: (value: any, key: any) => void) {\n return $root.addCallback(ref[$refId], OPERATION.DELETE, callback);\n };\n\n const onChange = function (ref: Ref, callback: (value: any, key: any) => void) {\n return $root.addCallback(ref[$refId], OPERATION.REPLACE, callback);\n };\n\n return new Proxy({\n onAdd: function(callback: (value: any, key: any) => void, immediate: boolean = true) {\n //\n // https://github.com/colyseus/schema/issues/147\n // If parent instance has \"onAdd\" registered, avoid triggering immediate callback.\n //\n\n if (context.instance) {\n return onAdd(context.instance, callback, immediate && !onAddCalls.has(currentOnAddCallback));\n\n } else if (context.onInstanceAvailable) {\n // collection instance not received yet\n let detachCallback = () => {};\n\n context.onInstanceAvailable((ref: Ref, existing: boolean) => {\n detachCallback = onAdd(ref, callback, immediate && existing && !onAddCalls.has(currentOnAddCallback));\n });\n\n return () => detachCallback();\n }\n },\n onRemove: function(callback: (value: any, key: any) => void) {\n if (context.instance) {\n return onRemove(context.instance, callback);\n\n } else if (context.onInstanceAvailable) {\n // collection instance not received yet\n let detachCallback = () => {};\n\n context.onInstanceAvailable((ref: Ref) => {\n detachCallback = onRemove(ref, callback)\n });\n\n return () => detachCallback();\n }\n },\n onChange: function(callback: (value: any, key: any) => void) {\n if (context.instance) {\n return onChange(context.instance, callback);\n\n } else if (context.onInstanceAvailable) {\n // collection instance not received yet\n let detachCallback = () => {};\n\n context.onInstanceAvailable((ref: Ref) => {\n detachCallback = onChange(ref, callback)\n });\n\n return () => detachCallback();\n }\n },\n }, {\n get(target, prop: string) {\n if (!target[prop as keyof typeof target]) {\n throw new Error(`Can't access '${prop}' through callback proxy. access the instance directly.`);\n }\n return target[prop as keyof typeof target];\n },\n has(target, prop) { return target[prop as keyof typeof target] !== undefined; },\n set(_, _1, _2) { throw new Error(\"not allowed\"); },\n deleteProperty(_, _1) { throw new Error(\"not allowed\"); },\n });\n }\n }\n\n function $<T>(instance: T): CallbackProxy<T> {\n return getProxy(undefined, { instance }) as unknown as CallbackProxy<T>;\n }\n\n return $;\n}\n"]}