mcbe-ipc 3.3.0 → 3.4.0

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/dist/ipc.d.ts CHANGED
@@ -81,6 +81,7 @@ export declare namespace PROTO {
81
81
  function Optional<T>(s: PROTO.Serializable<T>): PROTO.Serializable<T | undefined>;
82
82
  function Map<K, V>(kS: PROTO.Serializable<K>, vS: PROTO.Serializable<V>): PROTO.Serializable<Map<K, V>>;
83
83
  function Set<V>(s: PROTO.Serializable<V>): PROTO.Serializable<Set<V>>;
84
+ function Cached<V>(s: PROTO.Serializable<V>, depth?: number): PROTO.Serializable<V>;
84
85
  }
85
86
  export declare namespace NET {
86
87
  type Meta = {
@@ -96,7 +97,10 @@ export declare namespace NET {
96
97
  metaOverride?: Partial<Meta>;
97
98
  }
98
99
  export function emit<S>(endpoint: string, serializer: PROTO.Serializer<S>, value: NoInfer<S>, options?: EmitOptions): Generator<void, void, void>;
99
- export function listen<D>(endpoint: string, deserializer: PROTO.Deserializer<D>, callback: (value: NoInfer<D>, meta: Meta) => Generator<void, void, void>): () => void;
100
+ export interface ListenOptions {
101
+ filter?: (meta: Meta) => boolean;
102
+ }
103
+ export function listen<D>(endpoint: string, deserializer: PROTO.Deserializer<D>, callback: (value: NoInfer<D>, meta: Meta) => Generator<void, void, void>, options?: ListenOptions): () => void;
100
104
  export {};
101
105
  }
102
106
  export declare namespace IPC {
package/dist/ipc.js CHANGED
@@ -402,6 +402,34 @@ export var PROTO;
402
402
  };
403
403
  }
404
404
  PROTO.Set = Set;
405
+ function Cached(s, depth = 16) {
406
+ const cache = new globalThis.Map();
407
+ return {
408
+ *serialize(value, stream) {
409
+ const hit = cache.get(value);
410
+ if (hit !== undefined) {
411
+ stream.write(hit);
412
+ cache.delete(value);
413
+ cache.set(value, hit);
414
+ }
415
+ else {
416
+ const buffer = new PROTO.Buffer();
417
+ yield* s.serialize(value, buffer);
418
+ const bytes = buffer.to_uint8array();
419
+ stream.write(bytes);
420
+ cache.set(value, bytes);
421
+ if (cache.size > depth) {
422
+ const first = cache.keys().next().value;
423
+ cache.delete(first);
424
+ }
425
+ }
426
+ },
427
+ *deserialize(stream) {
428
+ return yield* s.deserialize(stream);
429
+ }
430
+ };
431
+ }
432
+ PROTO.Cached = Cached;
405
433
  })(PROTO || (PROTO = {}));
406
434
  export var NET;
407
435
  (function (NET) {
@@ -481,9 +509,9 @@ export var NET;
481
509
  const header_stream = yield* PROTO.MIPS.deserialize(serialized_header);
482
510
  const header = yield* Header.deserialize(header_stream);
483
511
  const errors = [];
484
- for (let i = 0; i < listeners.length; i++) {
512
+ for (const listener of [...listeners]) {
485
513
  try {
486
- yield* listeners[i](header, event.message);
514
+ yield* listener(header, event.message);
487
515
  }
488
516
  catch (e) {
489
517
  errors.push(e);
@@ -533,21 +561,28 @@ export var NET;
533
561
  }
534
562
  }
535
563
  NET.emit = emit;
536
- function listen(endpoint, deserializer, callback) {
564
+ function listen(endpoint, deserializer, callback, options) {
537
565
  const buffer = new Map();
538
- const listener = function* (header, serialized_packet) {
539
- let fragment = buffer.get(header.meta.guid);
540
- if (!fragment) {
541
- fragment = { size: -1, serialized_packets: [], data_size: 0 };
542
- buffer.set(header.meta.guid, fragment);
566
+ const listener = function* (header, fragment) {
567
+ let packet = buffer.get(header.meta.guid);
568
+ if (packet === undefined) {
569
+ if (options?.filter?.(header.meta) === false)
570
+ return;
571
+ packet = { size: -1, fragments: [], received: 0 };
572
+ buffer.set(header.meta.guid, packet);
543
573
  }
544
574
  if (header.final) {
545
- fragment.size = header.index + 1;
575
+ packet.size = header.index + 1;
576
+ }
577
+ if (packet.fragments[header.index] === undefined) {
578
+ packet.fragments[header.index] = fragment;
579
+ packet.received++;
580
+ }
581
+ else {
582
+ throw new Error(`received duplicate fragment ${header.index} for packet ${header.meta.guid}`);
546
583
  }
547
- fragment.serialized_packets[header.index] = serialized_packet;
548
- fragment.data_size += header.index + 1;
549
- if (fragment.size !== -1 && fragment.data_size === (fragment.size * (fragment.size + 1)) / 2) {
550
- const stream = yield* deserialize(fragment.serialized_packets);
584
+ if (packet.size !== -1 && packet.size === packet.received) {
585
+ const stream = yield* deserialize(packet.fragments);
551
586
  const value = yield* deserializer.deserialize(stream);
552
587
  yield* callback(value, header.meta);
553
588
  buffer.delete(header.meta.guid);
@@ -573,6 +608,8 @@ export var IPC;
573
608
  return;
574
609
  resolve(value);
575
610
  terminate();
611
+ }, {
612
+ filter: meta => !meta.signature.includes(`+correlation`) || meta.guid === id
576
613
  });
577
614
  system.runJob(NET.emit(`ipc:${channel}:invoke`, serializer, value, {
578
615
  metaOverride: {
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "author": "OmniacDev",
4
4
  "description": "IPC system for MCBE Script API projects",
5
5
  "license": "MIT",
6
- "version": "3.3.0",
6
+ "version": "3.4.0",
7
7
  "repository": {
8
8
  "type": "git",
9
9
  "url": "git+https://github.com/OmniacDev/MCBE-IPC.git"