mcbe-ipc 3.2.0 → 3.2.1

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/README.md CHANGED
@@ -23,4 +23,13 @@ npm install mcbe-ipc
23
23
 
24
24
 
25
25
 
26
+
27
+ > [!NOTE]
28
+ > Official documentation is still in progress.
29
+ >
30
+ > For now, you can refer to the [DeepWiki page](https://deepwiki.com/OmniacDev/MCBE-IPC/).
31
+ > Please note that while it is generally accurate, some of the more advanced sections may contain small inaccuracies.
32
+
33
+
34
+
26
35
  [^1]: Inter-Pack Communication
package/dist/ipc.d.ts CHANGED
@@ -23,12 +23,20 @@
23
23
  * SOFTWARE.
24
24
  */
25
25
  export declare namespace PROTO {
26
- interface Serializable<T> {
26
+ const t: unique symbol;
27
+ interface Phantom<T> {
28
+ readonly [t]?: T;
29
+ }
30
+ export interface Serializer<T> extends Phantom<T> {
27
31
  serialize(value: T, stream: Buffer): Generator<void, void, void>;
32
+ }
33
+ export interface Deserializer<T> extends Phantom<T> {
28
34
  deserialize(stream: Buffer): Generator<void, T, void>;
29
35
  }
30
- type Infer<S> = S extends PROTO.Serializable<infer T> ? T : never;
31
- class Buffer {
36
+ export interface Serializable<T> extends Serializer<T>, Deserializer<T> {
37
+ }
38
+ export type Infer<S> = S extends Phantom<infer T> ? T : never;
39
+ export class Buffer {
32
40
  private _buffer;
33
41
  private _data_view;
34
42
  private _length;
@@ -47,64 +55,65 @@ export declare namespace PROTO {
47
55
  static from_uint8array(array: Uint8Array): Buffer;
48
56
  to_uint8array(): Uint8Array;
49
57
  }
50
- namespace MIPS {
58
+ export namespace MIPS {
51
59
  function serialize(stream: PROTO.Buffer): Generator<void, string, void>;
52
60
  function deserialize(str: string): Generator<void, PROTO.Buffer, void>;
53
61
  }
54
- const Void: PROTO.Serializable<void>;
55
- const Null: PROTO.Serializable<null>;
56
- const Undefined: PROTO.Serializable<undefined>;
57
- const Int8: PROTO.Serializable<number>;
58
- const Int16: PROTO.Serializable<number>;
59
- const Int32: PROTO.Serializable<number>;
60
- const UInt8: PROTO.Serializable<number>;
61
- const UInt16: PROTO.Serializable<number>;
62
- const UInt32: PROTO.Serializable<number>;
63
- const UVarInt32: PROTO.Serializable<number>;
64
- const VarInt32: PROTO.Serializable<number>;
65
- const Float32: PROTO.Serializable<number>;
66
- const Float64: PROTO.Serializable<number>;
67
- const String: PROTO.Serializable<string>;
68
- const Boolean: PROTO.Serializable<boolean>;
69
- const UInt8Array: PROTO.Serializable<Uint8Array>;
70
- const Date: PROTO.Serializable<Date>;
71
- function Object<T extends object>(s: {
62
+ export const Void: PROTO.Serializable<void>;
63
+ export const Null: PROTO.Serializable<null>;
64
+ export const Undefined: PROTO.Serializable<undefined>;
65
+ export const Int8: PROTO.Serializable<number>;
66
+ export const Int16: PROTO.Serializable<number>;
67
+ export const Int32: PROTO.Serializable<number>;
68
+ export const UInt8: PROTO.Serializable<number>;
69
+ export const UInt16: PROTO.Serializable<number>;
70
+ export const UInt32: PROTO.Serializable<number>;
71
+ export const UVarInt32: PROTO.Serializable<number>;
72
+ export const VarInt32: PROTO.Serializable<number>;
73
+ export const Float32: PROTO.Serializable<number>;
74
+ export const Float64: PROTO.Serializable<number>;
75
+ export const String: PROTO.Serializable<string>;
76
+ export const Boolean: PROTO.Serializable<boolean>;
77
+ export const UInt8Array: PROTO.Serializable<Uint8Array>;
78
+ export const Date: PROTO.Serializable<Date>;
79
+ export function Object<T extends object>(s: {
72
80
  [K in keyof T]: PROTO.Serializable<T[K]>;
73
81
  }): PROTO.Serializable<T>;
74
- function Array<T>(s: PROTO.Serializable<T>): PROTO.Serializable<T[]>;
75
- function Tuple<T extends any[]>(...s: {
82
+ export function Array<T>(s: PROTO.Serializable<T>): PROTO.Serializable<T[]>;
83
+ export function Tuple<T extends any[]>(...s: {
76
84
  [K in keyof T]: PROTO.Serializable<T[K]>;
77
85
  }): PROTO.Serializable<T>;
78
- function Optional<T>(s: PROTO.Serializable<T>): PROTO.Serializable<T | undefined>;
79
- function Map<K, V>(kS: PROTO.Serializable<K>, vS: PROTO.Serializable<V>): PROTO.Serializable<Map<K, V>>;
80
- function Set<V>(s: PROTO.Serializable<V>): PROTO.Serializable<Set<V>>;
81
- type Endpoint = string;
82
- type Header = {
86
+ export function Optional<T>(s: PROTO.Serializable<T>): PROTO.Serializable<T | undefined>;
87
+ export function Map<K, V>(kS: PROTO.Serializable<K>, vS: PROTO.Serializable<V>): PROTO.Serializable<Map<K, V>>;
88
+ export function Set<V>(s: PROTO.Serializable<V>): PROTO.Serializable<Set<V>>;
89
+ export type Endpoint = string;
90
+ export type Header = {
83
91
  guid: string;
84
92
  encoding: string;
85
93
  index: number;
86
94
  final: boolean;
87
95
  };
88
- const Endpoint: PROTO.Serializable<Endpoint>;
89
- const Header: PROTO.Serializable<Header>;
96
+ export const Endpoint: PROTO.Serializable<Endpoint>;
97
+ export const Header: PROTO.Serializable<Header>;
98
+ export {};
90
99
  }
91
100
  export declare namespace NET {
92
101
  let FRAG_MAX: number;
93
102
  function serialize(buffer: PROTO.Buffer, max_size?: number): Generator<void, string[], void>;
94
103
  function deserialize(strings: string[]): Generator<void, PROTO.Buffer, void>;
95
- function emit<S extends PROTO.Serializable<any>>(endpoint: string, serializer: S, value: PROTO.Infer<S>): Generator<void, void, void>;
96
- function listen<S extends PROTO.Serializable<any>>(endpoint: string, serializer: S, callback: (value: PROTO.Infer<S>) => Generator<void, void, void>): () => void;
104
+ function emit<S extends PROTO.Serializer<any>>(endpoint: string, serializer: S, value: PROTO.Infer<S>): Generator<void, void, void>;
105
+ function listen<D extends PROTO.Deserializer<any>>(endpoint: string, deserializer: D, callback: (value: PROTO.Infer<D>) => Generator<void, void, void>): () => void;
97
106
  }
98
107
  export declare namespace IPC {
99
108
  /** Sends a message with `args` to `channel` */
100
- function send<S extends PROTO.Serializable<any>>(channel: string, serializer: S, value: PROTO.Infer<S>): void;
109
+ function send<S extends PROTO.Serializer<any>>(channel: string, serializer: S, value: PROTO.Infer<S>): void;
101
110
  /** Sends an `invoke` message through IPC, and expects a result asynchronously. */
102
- function invoke<S extends PROTO.Serializable<any>, D extends PROTO.Serializable<any>>(channel: string, serializer: S, value: PROTO.Infer<S>, deserializer: D): Promise<PROTO.Infer<D>>;
111
+ function invoke<S extends PROTO.Serializer<any>, D extends PROTO.Deserializer<any>>(channel: string, serializer: S, value: PROTO.Infer<S>, deserializer: D): Promise<PROTO.Infer<D>>;
103
112
  /** Listens to `channel`. When a new message arrives, `listener` will be called with `listener(args)`. */
104
- function on<D extends PROTO.Serializable<any>>(channel: string, deserializer: D, listener: (value: PROTO.Infer<D>) => void): () => void;
113
+ function on<D extends PROTO.Deserializer<any>>(channel: string, deserializer: D, listener: (value: PROTO.Infer<D>) => void): () => void;
105
114
  /** Listens to `channel` once. When a new message arrives, `listener` will be called with `listener(args)`, and then removed. */
106
- function once<D extends PROTO.Serializable<any>>(channel: string, deserializer: D, listener: (value: PROTO.Infer<D>) => void): () => void;
115
+ function once<D extends PROTO.Deserializer<any>>(channel: string, deserializer: D, listener: (value: PROTO.Infer<D>) => void): () => void;
107
116
  /** Adds a handler for an `invoke` IPC. This handler will be called whenever `invoke(channel, ...args)` is called */
108
- function handle<D extends PROTO.Serializable<any>, S extends PROTO.Serializable<any>>(channel: string, deserializer: D, serializer: S, listener: (value: PROTO.Infer<D>) => PROTO.Infer<S>): () => void;
117
+ function handle<D extends PROTO.Deserializer<any>, S extends PROTO.Serializer<any>>(channel: string, deserializer: D, serializer: S, listener: (value: PROTO.Infer<D>) => PROTO.Infer<S>): () => void;
109
118
  }
110
119
  export default IPC;
package/dist/ipc.js CHANGED
@@ -524,7 +524,7 @@ export var NET;
524
524
  }
525
525
  }
526
526
  NET.emit = emit;
527
- function listen(endpoint, serializer, callback) {
527
+ function listen(endpoint, deserializer, callback) {
528
528
  const buffer = new Map();
529
529
  const listener = function* (payload, serialized_packet) {
530
530
  let fragment = buffer.get(payload.guid);
@@ -539,7 +539,7 @@ export var NET;
539
539
  fragment.data_size += payload.index + 1;
540
540
  if (fragment.size !== -1 && fragment.data_size === (fragment.size * (fragment.size + 1)) / 2) {
541
541
  const stream = yield* deserialize(fragment.serialized_packets);
542
- const value = yield* serializer.deserialize(stream);
542
+ const value = yield* deserializer.deserialize(stream);
543
543
  yield* callback(value);
544
544
  buffer.delete(payload.guid);
545
545
  }
@@ -557,12 +557,12 @@ export var IPC;
557
557
  IPC.send = send;
558
558
  /** Sends an `invoke` message through IPC, and expects a result asynchronously. */
559
559
  function invoke(channel, serializer, value, deserializer) {
560
- system.runJob(NET.emit(`ipc:${channel}:invoke`, serializer, value));
561
560
  return new Promise(resolve => {
562
561
  const terminate = NET.listen(`ipc:${channel}:handle`, deserializer, function* (value) {
563
562
  resolve(value);
564
563
  terminate();
565
564
  });
565
+ system.runJob(NET.emit(`ipc:${channel}:invoke`, serializer, value));
566
566
  });
567
567
  }
568
568
  IPC.invoke = invoke;
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.2.0",
6
+ "version": "3.2.1",
7
7
  "repository": {
8
8
  "type": "git",
9
9
  "url": "git+https://github.com/OmniacDev/MCBE-IPC.git"
@@ -20,12 +20,15 @@
20
20
  ],
21
21
  "scripts": {
22
22
  "build": "tsc",
23
+ "test": "vitest",
24
+ "bench": "vitest bench",
23
25
  "format": "prettier --write src",
24
26
  "prepublishOnly": "npm run build"
25
27
  },
26
28
  "devDependencies": {
27
29
  "prettier": "^3.3.3",
28
- "typescript": "^5.5.4"
30
+ "typescript": "^5.5.4",
31
+ "vitest": "^4.0.16"
29
32
  },
30
33
  "dependencies": {
31
34
  "@minecraft/server": "^1.18.0"