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 +5 -1
- package/dist/ipc.js +50 -13
- package/package.json +1 -1
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
|
|
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 (
|
|
512
|
+
for (const listener of [...listeners]) {
|
|
485
513
|
try {
|
|
486
|
-
yield*
|
|
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,
|
|
539
|
-
let
|
|
540
|
-
if (
|
|
541
|
-
|
|
542
|
-
|
|
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
|
-
|
|
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
|
-
|
|
548
|
-
|
|
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