@colyseus/schema 4.0.3 → 4.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/build/index.js CHANGED
@@ -3672,6 +3672,15 @@
3672
3672
  static is(type) {
3673
3673
  return typeof (type[Symbol.metadata]) === "object";
3674
3674
  }
3675
+ /**
3676
+ * Check if a value is an instance of Schema.
3677
+ * This method uses duck-typing to avoid issues with multiple @colyseus/schema versions.
3678
+ * @param obj Value to check
3679
+ * @returns true if the value is a Schema instance
3680
+ */
3681
+ static isSchema(obj) {
3682
+ return typeof obj?.assign === "function";
3683
+ }
3675
3684
  /**
3676
3685
  * Track property changes
3677
3686
  */
@@ -4876,13 +4885,13 @@
4876
4885
  // trigger onRemove on child structure.
4877
4886
  //
4878
4887
  if ((change.op & exports.OPERATION.DELETE) === exports.OPERATION.DELETE &&
4879
- change.previousValue instanceof Schema) {
4888
+ Schema.isSchema(change.previousValue)) {
4880
4889
  const deleteCallbacks = callbacks[change.previousValue[$refId]]?.[exports.OPERATION.DELETE];
4881
4890
  for (let i = deleteCallbacks?.length - 1; i >= 0; i--) {
4882
4891
  deleteCallbacks[i]();
4883
4892
  }
4884
4893
  }
4885
- if (ref instanceof Schema) {
4894
+ if (Schema.isSchema(ref)) {
4886
4895
  //
4887
4896
  // Handle schema instance
4888
4897
  //
@@ -5126,32 +5135,6 @@
5126
5135
  decoder.triggerChanges = callback;
5127
5136
  }
5128
5137
 
5129
- /**
5130
- * State Callbacks handler
5131
- *
5132
- * Usage:
5133
- * ```ts
5134
- * const $ = Callbacks.get(decoder);
5135
- *
5136
- * // Listen to property changes
5137
- * $.listen("currentTurn", (currentValue, previousValue) => { ... });
5138
- *
5139
- * // Listen to collection additions
5140
- * $.onAdd("entities", (sessionId, entity) => {
5141
- * // Nested property listening
5142
- * $.listen(entity, "hp", (currentHp, previousHp) => { ... });
5143
- * });
5144
- *
5145
- * // Listen to collection removals
5146
- * $.onRemove("entities", (sessionId, entity) => { ... });
5147
- *
5148
- * // Listen to any property change on an instance
5149
- * $.onChange(entity, () => { ... });
5150
- *
5151
- * // Bind properties to another object
5152
- * $.bindTo(player, playerVisual);
5153
- * ```
5154
- */
5155
5138
  class StateCallbackStrategy {
5156
5139
  decoder;
5157
5140
  uniqueRefIds = new Set();
@@ -5190,7 +5173,7 @@
5190
5173
  immediate = immediate && this.isTriggering === false;
5191
5174
  if (operation === exports.OPERATION.ADD && immediate) {
5192
5175
  collection.forEach((value, key) => {
5193
- handler(key, value);
5176
+ handler(value, key);
5194
5177
  });
5195
5178
  }
5196
5179
  return this.addCallback(collection[$refId], operation, handler);
@@ -5292,7 +5275,7 @@
5292
5275
  // trigger onRemove on child structure.
5293
5276
  //
5294
5277
  if ((change.op & exports.OPERATION.DELETE) === exports.OPERATION.DELETE &&
5295
- change.previousValue instanceof Schema) {
5278
+ Schema.isSchema(change.previousValue)) {
5296
5279
  const childRefId = change.previousValue[$refId];
5297
5280
  const deleteCallbacks = this.callbacks[childRefId]?.[exports.OPERATION.DELETE];
5298
5281
  if (deleteCallbacks) {
@@ -5301,7 +5284,7 @@
5301
5284
  }
5302
5285
  }
5303
5286
  }
5304
- if (ref instanceof Schema) {
5287
+ if (Schema.isSchema(ref)) {
5305
5288
  //
5306
5289
  // Handle Schema instance
5307
5290
  //
@@ -5346,11 +5329,11 @@
5346
5329
  // FIXME: `previousValue` should always be available.
5347
5330
  //
5348
5331
  if (change.previousValue !== undefined) {
5349
- // trigger onRemove (key, value)
5332
+ // trigger onRemove (value, key)
5350
5333
  const deleteCallbacks = $callbacks[exports.OPERATION.DELETE];
5351
5334
  if (deleteCallbacks) {
5352
5335
  for (let j = deleteCallbacks.length - 1; j >= 0; j--) {
5353
- deleteCallbacks[j](dynamicIndex, change.previousValue);
5336
+ deleteCallbacks[j](change.previousValue, dynamicIndex);
5354
5337
  }
5355
5338
  }
5356
5339
  }
@@ -5360,7 +5343,7 @@
5360
5343
  if (addCallbacks) {
5361
5344
  this.isTriggering = true;
5362
5345
  for (let j = addCallbacks.length - 1; j >= 0; j--) {
5363
- addCallbacks[j](dynamicIndex, change.value);
5346
+ addCallbacks[j](change.value, dynamicIndex);
5364
5347
  }
5365
5348
  this.isTriggering = false;
5366
5349
  }
@@ -5368,12 +5351,12 @@
5368
5351
  }
5369
5352
  else if ((change.op & exports.OPERATION.ADD) === exports.OPERATION.ADD &&
5370
5353
  change.previousValue !== change.value) {
5371
- // trigger onAdd (key, value)
5354
+ // trigger onAdd (value, key)
5372
5355
  const addCallbacks = $callbacks[exports.OPERATION.ADD];
5373
5356
  if (addCallbacks) {
5374
5357
  this.isTriggering = true;
5375
5358
  for (let j = addCallbacks.length - 1; j >= 0; j--) {
5376
- addCallbacks[j](dynamicIndex, change.value);
5359
+ addCallbacks[j](change.value, dynamicIndex);
5377
5360
  }
5378
5361
  this.isTriggering = false;
5379
5362
  }
@@ -5407,13 +5390,13 @@
5407
5390
  * callbacks.listen("currentTurn", (currentValue, previousValue) => { ... });
5408
5391
  *
5409
5392
  * // Listen to collection additions
5410
- * callbacks.onAdd("entities", (sessionId, entity) => {
5393
+ * callbacks.onAdd("entities", (entity, sessionId) => {
5411
5394
  * // Nested property listening
5412
5395
  * callbacks.listen(entity, "hp", (currentHp, previousHp) => { ... });
5413
5396
  * });
5414
5397
  *
5415
5398
  * // Listen to collection removals
5416
- * callbacks.onRemove("entities", (sessionId, entity) => { ... });
5399
+ * callbacks.onRemove("entities", (entity, sessionId) => { ... });
5417
5400
  *
5418
5401
  * // Listen to any property change on an instance
5419
5402
  * callbacks.onChange(entity, () => { ... });
package/build/index.mjs CHANGED
@@ -3666,6 +3666,15 @@ class Schema {
3666
3666
  static is(type) {
3667
3667
  return typeof (type[Symbol.metadata]) === "object";
3668
3668
  }
3669
+ /**
3670
+ * Check if a value is an instance of Schema.
3671
+ * This method uses duck-typing to avoid issues with multiple @colyseus/schema versions.
3672
+ * @param obj Value to check
3673
+ * @returns true if the value is a Schema instance
3674
+ */
3675
+ static isSchema(obj) {
3676
+ return typeof obj?.assign === "function";
3677
+ }
3669
3678
  /**
3670
3679
  * Track property changes
3671
3680
  */
@@ -4870,13 +4879,13 @@ function getDecoderStateCallbacks(decoder) {
4870
4879
  // trigger onRemove on child structure.
4871
4880
  //
4872
4881
  if ((change.op & OPERATION.DELETE) === OPERATION.DELETE &&
4873
- change.previousValue instanceof Schema) {
4882
+ Schema.isSchema(change.previousValue)) {
4874
4883
  const deleteCallbacks = callbacks[change.previousValue[$refId]]?.[OPERATION.DELETE];
4875
4884
  for (let i = deleteCallbacks?.length - 1; i >= 0; i--) {
4876
4885
  deleteCallbacks[i]();
4877
4886
  }
4878
4887
  }
4879
- if (ref instanceof Schema) {
4888
+ if (Schema.isSchema(ref)) {
4880
4889
  //
4881
4890
  // Handle schema instance
4882
4891
  //
@@ -5120,32 +5129,6 @@ function getRawChangesCallback(decoder, callback) {
5120
5129
  decoder.triggerChanges = callback;
5121
5130
  }
5122
5131
 
5123
- /**
5124
- * State Callbacks handler
5125
- *
5126
- * Usage:
5127
- * ```ts
5128
- * const $ = Callbacks.get(decoder);
5129
- *
5130
- * // Listen to property changes
5131
- * $.listen("currentTurn", (currentValue, previousValue) => { ... });
5132
- *
5133
- * // Listen to collection additions
5134
- * $.onAdd("entities", (sessionId, entity) => {
5135
- * // Nested property listening
5136
- * $.listen(entity, "hp", (currentHp, previousHp) => { ... });
5137
- * });
5138
- *
5139
- * // Listen to collection removals
5140
- * $.onRemove("entities", (sessionId, entity) => { ... });
5141
- *
5142
- * // Listen to any property change on an instance
5143
- * $.onChange(entity, () => { ... });
5144
- *
5145
- * // Bind properties to another object
5146
- * $.bindTo(player, playerVisual);
5147
- * ```
5148
- */
5149
5132
  class StateCallbackStrategy {
5150
5133
  decoder;
5151
5134
  uniqueRefIds = new Set();
@@ -5184,7 +5167,7 @@ class StateCallbackStrategy {
5184
5167
  immediate = immediate && this.isTriggering === false;
5185
5168
  if (operation === OPERATION.ADD && immediate) {
5186
5169
  collection.forEach((value, key) => {
5187
- handler(key, value);
5170
+ handler(value, key);
5188
5171
  });
5189
5172
  }
5190
5173
  return this.addCallback(collection[$refId], operation, handler);
@@ -5286,7 +5269,7 @@ class StateCallbackStrategy {
5286
5269
  // trigger onRemove on child structure.
5287
5270
  //
5288
5271
  if ((change.op & OPERATION.DELETE) === OPERATION.DELETE &&
5289
- change.previousValue instanceof Schema) {
5272
+ Schema.isSchema(change.previousValue)) {
5290
5273
  const childRefId = change.previousValue[$refId];
5291
5274
  const deleteCallbacks = this.callbacks[childRefId]?.[OPERATION.DELETE];
5292
5275
  if (deleteCallbacks) {
@@ -5295,7 +5278,7 @@ class StateCallbackStrategy {
5295
5278
  }
5296
5279
  }
5297
5280
  }
5298
- if (ref instanceof Schema) {
5281
+ if (Schema.isSchema(ref)) {
5299
5282
  //
5300
5283
  // Handle Schema instance
5301
5284
  //
@@ -5340,11 +5323,11 @@ class StateCallbackStrategy {
5340
5323
  // FIXME: `previousValue` should always be available.
5341
5324
  //
5342
5325
  if (change.previousValue !== undefined) {
5343
- // trigger onRemove (key, value)
5326
+ // trigger onRemove (value, key)
5344
5327
  const deleteCallbacks = $callbacks[OPERATION.DELETE];
5345
5328
  if (deleteCallbacks) {
5346
5329
  for (let j = deleteCallbacks.length - 1; j >= 0; j--) {
5347
- deleteCallbacks[j](dynamicIndex, change.previousValue);
5330
+ deleteCallbacks[j](change.previousValue, dynamicIndex);
5348
5331
  }
5349
5332
  }
5350
5333
  }
@@ -5354,7 +5337,7 @@ class StateCallbackStrategy {
5354
5337
  if (addCallbacks) {
5355
5338
  this.isTriggering = true;
5356
5339
  for (let j = addCallbacks.length - 1; j >= 0; j--) {
5357
- addCallbacks[j](dynamicIndex, change.value);
5340
+ addCallbacks[j](change.value, dynamicIndex);
5358
5341
  }
5359
5342
  this.isTriggering = false;
5360
5343
  }
@@ -5362,12 +5345,12 @@ class StateCallbackStrategy {
5362
5345
  }
5363
5346
  else if ((change.op & OPERATION.ADD) === OPERATION.ADD &&
5364
5347
  change.previousValue !== change.value) {
5365
- // trigger onAdd (key, value)
5348
+ // trigger onAdd (value, key)
5366
5349
  const addCallbacks = $callbacks[OPERATION.ADD];
5367
5350
  if (addCallbacks) {
5368
5351
  this.isTriggering = true;
5369
5352
  for (let j = addCallbacks.length - 1; j >= 0; j--) {
5370
- addCallbacks[j](dynamicIndex, change.value);
5353
+ addCallbacks[j](change.value, dynamicIndex);
5371
5354
  }
5372
5355
  this.isTriggering = false;
5373
5356
  }
@@ -5401,13 +5384,13 @@ const Callbacks = {
5401
5384
  * callbacks.listen("currentTurn", (currentValue, previousValue) => { ... });
5402
5385
  *
5403
5386
  * // Listen to collection additions
5404
- * callbacks.onAdd("entities", (sessionId, entity) => {
5387
+ * callbacks.onAdd("entities", (entity, sessionId) => {
5405
5388
  * // Nested property listening
5406
5389
  * callbacks.listen(entity, "hp", (currentHp, previousHp) => { ... });
5407
5390
  * });
5408
5391
  *
5409
5392
  * // Listen to collection removals
5410
- * callbacks.onRemove("entities", (sessionId, entity) => { ... });
5393
+ * callbacks.onRemove("entities", (entity, sessionId) => { ... });
5411
5394
  *
5412
5395
  * // Listen to any property change on an instance
5413
5396
  * callbacks.onChange(entity, () => { ... });