@bloopjs/engine 0.0.80 → 0.0.82

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.
@@ -7,11 +7,13 @@ export declare enum EventType {
7
7
  MouseUp = 5,
8
8
  MouseWheel = 6,
9
9
  FrameStart = 7,
10
- SessionInit = 8,
11
- SessionSetLocalPeer = 9,
12
- SessionConnectPeer = 10,
13
- SessionDisconnectPeer = 11,
14
- SessionEnd = 12
10
+ NetJoinOk = 8,
11
+ NetJoinFail = 9,
12
+ NetPeerJoin = 10,
13
+ NetPeerLeave = 11,
14
+ NetPeerAssignLocalId = 12,
15
+ NetPacketReceived = 13,
16
+ NetSessionInit = 14
15
17
  }
16
18
  export declare enum MouseButton {
17
19
  None = 0,
@@ -252,4 +254,11 @@ export declare enum InputSource {
252
254
  RemotePeer11 = 139,
253
255
  Unmapped = 255
254
256
  }
257
+ export declare enum NetJoinFailReason {
258
+ unknown = 0,
259
+ timeout = 1,
260
+ room_full = 2,
261
+ room_not_found = 3,
262
+ already_in_room = 4
263
+ }
255
264
  //# sourceMappingURL=enums.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"enums.d.ts","sourceRoot":"","sources":["../../js/codegen/enums.ts"],"names":[],"mappings":"AAEA,oBAAY,SAAS;IACnB,IAAI,IAAI;IACR,OAAO,IAAI;IACX,KAAK,IAAI;IACT,SAAS,IAAI;IACb,SAAS,IAAI;IACb,OAAO,IAAI;IACX,UAAU,IAAI;IACd,UAAU,IAAI;IACd,WAAW,IAAI;IACf,mBAAmB,IAAI;IACvB,kBAAkB,KAAK;IACvB,qBAAqB,KAAK;IAC1B,UAAU,KAAK;CAChB;AAED,oBAAY,WAAW;IACrB,IAAI,IAAI;IACR,IAAI,IAAI;IACR,MAAM,IAAI;IACV,KAAK,IAAI;IACT,EAAE,IAAI;IACN,EAAE,IAAI;IACN,EAAE,IAAI;IACN,EAAE,IAAI;IACN,EAAE,IAAI;CACP;AAED,oBAAY,GAAG;IACb,IAAI,IAAI;IACR,SAAS,IAAI;IACb,SAAS,IAAI;IACb,WAAW,IAAI;IACf,YAAY,IAAI;IAChB,KAAK,IAAI;IACT,MAAM,IAAI;IACV,MAAM,IAAI;IACV,MAAM,IAAI;IACV,MAAM,IAAI;IACV,MAAM,KAAK;IACX,MAAM,KAAK;IACX,MAAM,KAAK;IACX,MAAM,KAAK;IACX,MAAM,KAAK;IACX,MAAM,KAAK;IACX,KAAK,KAAK;IACV,aAAa,KAAK;IAClB,MAAM,KAAK;IACX,OAAO,KAAK;IACZ,IAAI,KAAK;IACT,IAAI,KAAK;IACT,IAAI,KAAK;IACT,IAAI,KAAK;IACT,IAAI,KAAK;IACT,IAAI,KAAK;IACT,IAAI,KAAK;IACT,IAAI,KAAK;IACT,IAAI,KAAK;IACT,IAAI,KAAK;IACT,IAAI,KAAK;IACT,IAAI,KAAK;IACT,IAAI,KAAK;IACT,IAAI,KAAK;IACT,IAAI,KAAK;IACT,IAAI,KAAK;IACT,IAAI,KAAK;IACT,IAAI,KAAK;IACT,IAAI,KAAK;IACT,IAAI,KAAK;IACT,IAAI,KAAK;IACT,IAAI,KAAK;IACT,IAAI,KAAK;IACT,IAAI,KAAK;IACT,IAAI,KAAK;IACT,IAAI,KAAK;IACT,KAAK,KAAK;IACV,MAAM,KAAK;IACX,KAAK,KAAK;IACV,SAAS,KAAK;IACd,KAAK,KAAK;IACV,OAAO,KAAK;IACZ,QAAQ,KAAK;IACb,SAAS,KAAK;IACd,QAAQ,KAAK;IACb,WAAW,KAAK;IAChB,WAAW,KAAK;IAChB,YAAY,KAAK;IACjB,KAAK,KAAK;IACV,QAAQ,KAAK;IACb,SAAS,KAAK;IACd,SAAS,KAAK;IACd,UAAU,KAAK;IACf,KAAK,KAAK;IACV,GAAG,KAAK;IACR,OAAO,KAAK;IACZ,QAAQ,KAAK;IACb,KAAK,KAAK;IACV,KAAK,KAAK;IACV,KAAK,KAAK;IACV,KAAK,KAAK;IACV,KAAK,KAAK;IACV,UAAU,KAAK;IACf,MAAM,KAAK;IACX,GAAG,KAAK;IACR,IAAI,KAAK;IACT,IAAI,KAAK;IACT,MAAM,KAAK;IACX,QAAQ,KAAK;IACb,MAAM,KAAK;IACX,SAAS,KAAK;IACd,SAAS,KAAK;IACd,UAAU,KAAK;IACf,OAAO,KAAK;IACZ,OAAO,KAAK;IACZ,OAAO,KAAK;IACZ,OAAO,KAAK;IACZ,OAAO,KAAK;IACZ,OAAO,KAAK;IACZ,OAAO,KAAK;IACZ,OAAO,KAAK;IACZ,OAAO,KAAK;IACZ,OAAO,KAAK;IACZ,OAAO,KAAK;IACZ,OAAO,KAAK;IACZ,SAAS,KAAK;IACd,eAAe,KAAK;IACpB,WAAW,KAAK;IAChB,gBAAgB,KAAK;IACrB,WAAW,KAAK;IAChB,aAAa,MAAM;IACnB,YAAY,MAAM;IAClB,WAAW,MAAM;IACjB,WAAW,MAAM;IACjB,UAAU,MAAM;IAChB,eAAe,MAAM;IACrB,iBAAiB,MAAM;IACvB,kBAAkB,MAAM;IACxB,iBAAiB,MAAM;IACvB,oBAAoB,MAAM;IAC1B,cAAc,MAAM;IACpB,eAAe,MAAM;IACrB,gBAAgB,MAAM;IACtB,UAAU,MAAM;IAChB,cAAc,MAAM;IACpB,MAAM,MAAM;IACZ,EAAE,MAAM;IACR,MAAM,MAAM;IACZ,WAAW,MAAM;IACjB,UAAU,MAAM;IAChB,KAAK,MAAM;IACX,WAAW,MAAM;IACjB,gBAAgB,MAAM;IACtB,cAAc,MAAM;IACpB,WAAW,MAAM;IACjB,cAAc,MAAM;IACpB,aAAa,MAAM;IACnB,WAAW,MAAM;IACjB,KAAK,MAAM;IACX,UAAU,MAAM;IAChB,UAAU,MAAM;IAChB,UAAU,MAAM;IAChB,cAAc,MAAM;IACpB,WAAW,MAAM;IACjB,SAAS,MAAM;IACf,cAAc,MAAM;IACpB,kBAAkB,MAAM;IACxB,KAAK,MAAM;IACX,KAAK,MAAM;IACX,eAAe,MAAM;IACrB,eAAe,MAAM;IACrB,aAAa,MAAM;IACnB,MAAM,MAAM;IACZ,KAAK,MAAM;IACX,KAAK,MAAM;IACX,KAAK,MAAM;IACX,KAAK,MAAM;IACX,MAAM,MAAM;IACZ,OAAO,MAAM;IACb,KAAK,MAAM;IACX,IAAI,MAAM;IACV,GAAG,MAAM;IACT,IAAI,MAAM;IACV,IAAI,MAAM;IACV,KAAK,MAAM;IACX,KAAK,MAAM;IACX,MAAM,MAAM;IACZ,IAAI,MAAM;IACV,QAAQ,MAAM;IACd,QAAQ,MAAM;IACd,EAAE,MAAM;IACR,EAAE,MAAM;IACR,EAAE,MAAM;IACR,EAAE,MAAM;IACR,EAAE,MAAM;IACR,EAAE,MAAM;IACR,EAAE,MAAM;IACR,EAAE,MAAM;IACR,EAAE,MAAM;IACR,GAAG,MAAM;IACT,GAAG,MAAM;IACT,GAAG,MAAM;IACT,GAAG,MAAM;IACT,GAAG,MAAM;IACT,GAAG,MAAM;IACT,GAAG,MAAM;IACT,GAAG,MAAM;IACT,GAAG,MAAM;IACT,GAAG,MAAM;IACT,GAAG,MAAM;IACT,GAAG,MAAM;IACT,GAAG,MAAM;IACT,GAAG,MAAM;IACT,GAAG,MAAM;IACT,GAAG,MAAM;IACT,GAAG,MAAM;IACT,GAAG,MAAM;IACT,GAAG,MAAM;IACT,GAAG,MAAM;IACT,GAAG,MAAM;IACT,GAAG,MAAM;IACT,GAAG,MAAM;IACT,GAAG,MAAM;IACT,GAAG,MAAM;IACT,GAAG,MAAM;CACV;AAED,oBAAY,WAAW;IACrB,IAAI,IAAI;IACR,aAAa,IAAI;IACjB,UAAU,IAAI;IACd,UAAU,IAAI;IACd,aAAa,IAAI;IACjB,aAAa,IAAI;IACjB,aAAa,IAAI;IACjB,aAAa,IAAI;IACjB,aAAa,IAAI;IACjB,aAAa,IAAI;IACjB,aAAa,KAAK;IAClB,aAAa,KAAK;IAClB,aAAa,KAAK;IAClB,aAAa,KAAK;IAClB,cAAc,KAAK;IACnB,cAAc,KAAK;IACnB,WAAW,MAAM;IACjB,WAAW,MAAM;IACjB,WAAW,MAAM;IACjB,WAAW,MAAM;IACjB,WAAW,MAAM;IACjB,WAAW,MAAM;IACjB,WAAW,MAAM;IACjB,WAAW,MAAM;IACjB,WAAW,MAAM;IACjB,WAAW,MAAM;IACjB,YAAY,MAAM;IAClB,YAAY,MAAM;IAClB,QAAQ,MAAM;CACf"}
1
+ {"version":3,"file":"enums.d.ts","sourceRoot":"","sources":["../../js/codegen/enums.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,102 @@
1
+ /**
2
+ * Network status values matching Zig NetStatus enum
3
+ */
4
+ export type NetStatus = "offline" | "local" | "join:pending" | "connected" | "disconnected";
5
+ export type NetEvent = {
6
+ type: "join:ok";
7
+ data: {
8
+ roomCode: string;
9
+ };
10
+ } | {
11
+ type: "join:fail";
12
+ data: {
13
+ reason: string;
14
+ };
15
+ } | {
16
+ type: "peer:join";
17
+ data: {
18
+ peerId: number;
19
+ };
20
+ } | {
21
+ type: "peer:leave";
22
+ data: {
23
+ peerId: number;
24
+ };
25
+ } | {
26
+ type: "peer:assign_local_id";
27
+ data: {
28
+ peerId: number;
29
+ };
30
+ } | {
31
+ type: "session:start";
32
+ data: Record<string, never>;
33
+ } | {
34
+ type: "session:end";
35
+ data: Record<string, never>;
36
+ };
37
+ export type NetEventType = Extract<NetEvent, {
38
+ type: string;
39
+ }>["type"];
40
+ /**
41
+ * Peer synchronization state for netcode
42
+ */
43
+ export type PeerInfo = {
44
+ isLocal: boolean;
45
+ seq: number;
46
+ ack: number;
47
+ };
48
+ /**
49
+ * NetCtx struct layout (from context.zig):
50
+ * - peer_count: u8 (offset 0)
51
+ * - local_peer_id: u8 (offset 1)
52
+ * - in_session: u8 (offset 2)
53
+ * - status: u8 (offset 3)
54
+ * - match_frame: u32 (offset 4)
55
+ * - session_start_frame: u32 (offset 8)
56
+ * - room_code: [8]u8 (offset 12)
57
+ *
58
+ * All getters read directly from the engine's memory via DataView.
59
+ * State is managed by the Zig engine, not TypeScript.
60
+ */
1
61
  export declare class NetContext {
62
+ #private;
2
63
  dataView?: DataView;
3
64
  constructor(dataView?: DataView);
4
65
  /** Number of peers in the current session (0 if not in a multiplayer session) */
5
66
  get peerCount(): number;
67
+ /** Local peer ID in the session */
68
+ get localPeerId(): number;
69
+ /** Whether we're in an active multiplayer session */
6
70
  get isInSession(): boolean;
71
+ /** Current network status */
72
+ get status(): NetStatus;
7
73
  /** Current match frame (frames since session start, 0 if no session) */
8
74
  get matchFrame(): number;
75
+ /**
76
+ * The number of frames since the game booted that the session started.
77
+ * Match frame is calculated relative to this.
78
+ */
79
+ get sessionStartFrame(): number;
80
+ /** Current room code (empty string if not in a room) */
81
+ get roomCode(): string;
82
+ /** Game code sets this to request joining a room */
83
+ get wantsRoomCode(): string | undefined;
84
+ set wantsRoomCode(code: string | undefined);
85
+ /** Game code sets this to request disconnection */
86
+ get wantsDisconnect(): boolean;
87
+ set wantsDisconnect(value: boolean);
88
+ /**
89
+ * Get all connected peers in the session.
90
+ * Returns peer info with seq/ack values.
91
+ *
92
+ * For the local peer:
93
+ * - seq = matchFrame (our current frame)
94
+ * - ack = minimum seq across all connected remote peers (-1 if none)
95
+ *
96
+ * For remote peers:
97
+ * - seq = their latest frame we've received (-1 if none)
98
+ * - ack = the frame they've acknowledged from us (-1 if none)
99
+ */
100
+ get peers(): PeerInfo[];
9
101
  }
10
102
  //# sourceMappingURL=netContext.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"netContext.d.ts","sourceRoot":"","sources":["../../js/contexts/netContext.ts"],"names":[],"mappings":"AAAA,qBAAa,UAAU;IACrB,QAAQ,CAAC,EAAE,QAAQ,CAAC;gBAER,QAAQ,CAAC,EAAE,QAAQ;IAI/B,iFAAiF;IACjF,IAAI,SAAS,IAAI,MAAM,CAKtB;IAED,IAAI,WAAW,IAAI,OAAO,CAKzB;IAED,wEAAwE;IACxE,IAAI,UAAU,IAAI,MAAM,CAKvB;CACF"}
1
+ {"version":3,"file":"netContext.d.ts","sourceRoot":"","sources":["../../js/contexts/netContext.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,SAAS,GACjB,SAAS,GACT,OAAO,GACP,cAAc,GACd,WAAW,GACX,cAAc,CAAC;AAEnB,MAAM,MAAM,QAAQ,GAChB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,sBAAsB,CAAC;IAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAC1D;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;CAAE,GACtD;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;CAAE,CAAC;AAEzD,MAAM,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvE;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAqBF;;;;;;;;;;;;GAYG;AACH,qBAAa,UAAU;;IACrB,QAAQ,CAAC,EAAE,QAAQ,CAAC;gBAUR,QAAQ,CAAC,EAAE,QAAQ;IAW/B,iFAAiF;IACjF,IAAI,SAAS,IAAI,MAAM,CAKtB;IAED,mCAAmC;IACnC,IAAI,WAAW,IAAI,MAAM,CAKxB;IAED,qDAAqD;IACrD,IAAI,WAAW,IAAI,OAAO,CAKzB;IAED,6BAA6B;IAC7B,IAAI,MAAM,IAAI,SAAS,CAMtB;IAED,wEAAwE;IACxE,IAAI,UAAU,IAAI,MAAM,CAKvB;IAED;;;OAGG;IACH,IAAI,iBAAiB,IAAI,MAAM,CAK9B;IAED,wDAAwD;IACxD,IAAI,QAAQ,IAAI,MAAM,CAYrB;IAED,oDAAoD;IACpD,IAAI,aAAa,IAAI,MAAM,GAAG,SAAS,CAYtC;IAED,IAAI,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAczC;IAED,mDAAmD;IACnD,IAAI,eAAe,IAAI,OAAO,CAK7B;IAED,IAAI,eAAe,CAAC,KAAK,EAAE,OAAO,EAKjC;IAED;;;;;;;;;;;OAWG;IACH,IAAI,KAAK,IAAI,QAAQ,EAAE,CA+CtB;CACF"}
package/dist/engine.js CHANGED
@@ -12,6 +12,7 @@ var __export = (target, all) => {
12
12
  // js/codegen/enums.ts
13
13
  var exports_enums = {};
14
14
  __export(exports_enums, {
15
+ NetJoinFailReason: () => NetJoinFailReason,
15
16
  MouseButton: () => MouseButton,
16
17
  Key: () => Key,
17
18
  InputSource: () => InputSource,
@@ -27,11 +28,13 @@ var EventType;
27
28
  EventType2[EventType2["MouseUp"] = 5] = "MouseUp";
28
29
  EventType2[EventType2["MouseWheel"] = 6] = "MouseWheel";
29
30
  EventType2[EventType2["FrameStart"] = 7] = "FrameStart";
30
- EventType2[EventType2["SessionInit"] = 8] = "SessionInit";
31
- EventType2[EventType2["SessionSetLocalPeer"] = 9] = "SessionSetLocalPeer";
32
- EventType2[EventType2["SessionConnectPeer"] = 10] = "SessionConnectPeer";
33
- EventType2[EventType2["SessionDisconnectPeer"] = 11] = "SessionDisconnectPeer";
34
- EventType2[EventType2["SessionEnd"] = 12] = "SessionEnd";
31
+ EventType2[EventType2["NetJoinOk"] = 8] = "NetJoinOk";
32
+ EventType2[EventType2["NetJoinFail"] = 9] = "NetJoinFail";
33
+ EventType2[EventType2["NetPeerJoin"] = 10] = "NetPeerJoin";
34
+ EventType2[EventType2["NetPeerLeave"] = 11] = "NetPeerLeave";
35
+ EventType2[EventType2["NetPeerAssignLocalId"] = 12] = "NetPeerAssignLocalId";
36
+ EventType2[EventType2["NetPacketReceived"] = 13] = "NetPacketReceived";
37
+ EventType2[EventType2["NetSessionInit"] = 14] = "NetSessionInit";
35
38
  })(EventType ||= {});
36
39
  var MouseButton;
37
40
  ((MouseButton2) => {
@@ -275,6 +278,14 @@ var InputSource;
275
278
  InputSource2[InputSource2["RemotePeer11"] = 139] = "RemotePeer11";
276
279
  InputSource2[InputSource2["Unmapped"] = 255] = "Unmapped";
277
280
  })(InputSource ||= {});
281
+ var NetJoinFailReason;
282
+ ((NetJoinFailReason2) => {
283
+ NetJoinFailReason2[NetJoinFailReason2["unknown"] = 0] = "unknown";
284
+ NetJoinFailReason2[NetJoinFailReason2["timeout"] = 1] = "timeout";
285
+ NetJoinFailReason2[NetJoinFailReason2["room_full"] = 2] = "room_full";
286
+ NetJoinFailReason2[NetJoinFailReason2["room_not_found"] = 3] = "room_not_found";
287
+ NetJoinFailReason2[NetJoinFailReason2["already_in_room"] = 4] = "already_in_room";
288
+ })(NetJoinFailReason ||= {});
278
289
  // js/inputs.ts
279
290
  var MAX_PLAYERS = 12;
280
291
  var KEYBOARD_OFFSET = 0;
@@ -1031,29 +1042,171 @@ class KeyboardContext {
1031
1042
  }
1032
1043
  }
1033
1044
  // js/contexts/netContext.ts
1045
+ var MAX_PEERS = 12;
1046
+ var PEERS_ARRAY_OFFSET = 32;
1047
+ var PEER_CTX_SIZE = 8;
1048
+ var PEER_CONNECTED_OFFSET = 0;
1049
+ var PEER_PACKET_COUNT_OFFSET = 1;
1050
+ var PEER_SEQ_OFFSET = 2;
1051
+ var PEER_ACK_OFFSET = 4;
1052
+ var PEER_ACK_COUNT_OFFSET = 6;
1053
+ var STATUS_MAP = {
1054
+ 0: "offline",
1055
+ 1: "local",
1056
+ 2: "join:pending",
1057
+ 3: "connected",
1058
+ 4: "disconnected"
1059
+ };
1060
+
1034
1061
  class NetContext {
1035
1062
  dataView;
1063
+ #peers = Array.from({ length: MAX_PEERS }, () => ({
1064
+ isLocal: false,
1065
+ seq: -1,
1066
+ ack: -1
1067
+ }));
1068
+ #peersResult = [];
1036
1069
  constructor(dataView) {
1037
1070
  this.dataView = dataView;
1038
1071
  }
1072
+ #hasValidBuffer() {
1073
+ if (!this.dataView)
1074
+ return false;
1075
+ return this.dataView.buffer.byteLength > 0;
1076
+ }
1039
1077
  get peerCount() {
1040
- if (!this.dataView) {
1041
- throw new Error("NetContext DataView is not initialized");
1078
+ if (!this.#hasValidBuffer()) {
1079
+ throw new Error("NetContext dataView is not valid");
1042
1080
  }
1043
1081
  return this.dataView.getUint8(0);
1044
1082
  }
1083
+ get localPeerId() {
1084
+ if (!this.#hasValidBuffer()) {
1085
+ throw new Error("NetContext dataView is not valid");
1086
+ }
1087
+ return this.dataView.getUint8(1);
1088
+ }
1045
1089
  get isInSession() {
1046
- if (!this.dataView) {
1047
- throw new Error("NetContext DataView is not initialized");
1090
+ if (!this.#hasValidBuffer()) {
1091
+ throw new Error("NetContext dataView is not valid");
1048
1092
  }
1049
1093
  return this.dataView.getUint8(2) !== 0;
1050
1094
  }
1095
+ get status() {
1096
+ if (!this.#hasValidBuffer()) {
1097
+ throw new Error("NetContext dataView is not valid");
1098
+ }
1099
+ const statusByte = this.dataView.getUint8(3);
1100
+ return STATUS_MAP[statusByte] ?? "local";
1101
+ }
1051
1102
  get matchFrame() {
1052
- if (!this.dataView) {
1053
- throw new Error("NetContext DataView is not initialized");
1103
+ if (!this.#hasValidBuffer()) {
1104
+ throw new Error("NetContext dataView is not valid");
1054
1105
  }
1055
1106
  return this.dataView.getUint32(4, true);
1056
1107
  }
1108
+ get sessionStartFrame() {
1109
+ if (!this.#hasValidBuffer()) {
1110
+ throw new Error("NetContext dataView is not valid");
1111
+ }
1112
+ return this.dataView.getUint32(8, true);
1113
+ }
1114
+ get roomCode() {
1115
+ if (!this.#hasValidBuffer()) {
1116
+ throw new Error("NetContext dataView is not valid");
1117
+ }
1118
+ const bytes = [];
1119
+ for (let i = 0;i < 8; i++) {
1120
+ const byte = this.dataView.getUint8(12 + i);
1121
+ if (byte === 0)
1122
+ break;
1123
+ bytes.push(byte);
1124
+ }
1125
+ return String.fromCharCode(...bytes);
1126
+ }
1127
+ get wantsRoomCode() {
1128
+ if (!this.#hasValidBuffer()) {
1129
+ return;
1130
+ }
1131
+ const bytes = [];
1132
+ for (let i = 0;i < 8; i++) {
1133
+ const byte = this.dataView.getUint8(20 + i);
1134
+ if (byte === 0)
1135
+ break;
1136
+ bytes.push(byte);
1137
+ }
1138
+ return bytes.length > 0 ? String.fromCharCode(...bytes) : undefined;
1139
+ }
1140
+ set wantsRoomCode(code) {
1141
+ if (!this.#hasValidBuffer()) {
1142
+ throw new Error("NetContext dataView is not valid");
1143
+ }
1144
+ for (let i = 0;i < 8; i++) {
1145
+ this.dataView.setUint8(20 + i, 0);
1146
+ }
1147
+ if (code) {
1148
+ for (let i = 0;i < Math.min(code.length, 7); i++) {
1149
+ this.dataView.setUint8(20 + i, code.charCodeAt(i));
1150
+ }
1151
+ }
1152
+ }
1153
+ get wantsDisconnect() {
1154
+ if (!this.#hasValidBuffer()) {
1155
+ return false;
1156
+ }
1157
+ return this.dataView.getUint8(28) !== 0;
1158
+ }
1159
+ set wantsDisconnect(value) {
1160
+ if (!this.#hasValidBuffer()) {
1161
+ throw new Error("NetContext dataView is not valid");
1162
+ }
1163
+ this.dataView.setUint8(28, value ? 1 : 0);
1164
+ }
1165
+ get peers() {
1166
+ if (!this.#hasValidBuffer()) {
1167
+ throw new Error("NetContext dataView is not valid");
1168
+ }
1169
+ const dv = this.dataView;
1170
+ const localPeerId = this.localPeerId;
1171
+ const matchFrame = this.matchFrame;
1172
+ let minRemoteSeq = -1;
1173
+ for (let i = 0;i < MAX_PEERS; i++) {
1174
+ if (i === localPeerId)
1175
+ continue;
1176
+ const peerOffset = PEERS_ARRAY_OFFSET + i * PEER_CTX_SIZE;
1177
+ if (dv.getUint8(peerOffset + PEER_CONNECTED_OFFSET) !== 1)
1178
+ continue;
1179
+ if (dv.getUint8(peerOffset + PEER_PACKET_COUNT_OFFSET) === 0)
1180
+ continue;
1181
+ const seq = dv.getUint16(peerOffset + PEER_SEQ_OFFSET, true);
1182
+ if (minRemoteSeq === -1 || seq < minRemoteSeq) {
1183
+ minRemoteSeq = seq;
1184
+ }
1185
+ }
1186
+ this.#peersResult.length = 0;
1187
+ for (let i = 0;i < MAX_PEERS; i++) {
1188
+ const peerOffset = PEERS_ARRAY_OFFSET + i * PEER_CTX_SIZE;
1189
+ if (dv.getUint8(peerOffset + PEER_CONNECTED_OFFSET) !== 1)
1190
+ continue;
1191
+ const peer = this.#peers[i];
1192
+ if (!peer) {
1193
+ throw new Error(`Unexpected missing peer object at index ${i}`);
1194
+ }
1195
+ const isLocal = i === localPeerId;
1196
+ peer.isLocal = isLocal;
1197
+ if (isLocal) {
1198
+ peer.seq = matchFrame;
1199
+ peer.ack = minRemoteSeq;
1200
+ } else {
1201
+ const packetCount = dv.getUint8(peerOffset + PEER_PACKET_COUNT_OFFSET);
1202
+ const ackCount = dv.getUint8(peerOffset + PEER_ACK_COUNT_OFFSET);
1203
+ peer.seq = packetCount === 0 ? -1 : dv.getUint16(peerOffset + PEER_SEQ_OFFSET, true);
1204
+ peer.ack = ackCount === 0 ? -1 : dv.getUint16(peerOffset + PEER_ACK_OFFSET, true);
1205
+ }
1206
+ this.#peersResult.push(peer);
1207
+ }
1208
+ return this.#peersResult;
1209
+ }
1057
1210
  }
1058
1211
  // js/contexts/timeContext.ts
1059
1212
  class TimeContext {
@@ -1097,7 +1250,7 @@ function readTapeHeader(tape) {
1097
1250
  };
1098
1251
  }
1099
1252
  // js/defaultUrl.ts
1100
- var DEFAULT_WASM_URL = new URL("https://unpkg.com/@bloopjs/engine@0.0.80/wasm/bloop.wasm");
1253
+ var DEFAULT_WASM_URL = new URL("https://unpkg.com/@bloopjs/engine@0.0.82/wasm/bloop.wasm");
1101
1254
 
1102
1255
  // js/engine.ts
1103
1256
  var MAX_ROLLBACK_FRAMES = 500;
@@ -1143,5 +1296,5 @@ export {
1143
1296
  DEFAULT_WASM_URL
1144
1297
  };
1145
1298
 
1146
- //# debugId=DA66B69CCED4106764756E2164756E21
1299
+ //# debugId=F357B2D2ABF7D74464756E2164756E21
1147
1300
  //# sourceMappingURL=engine.js.map
@@ -2,16 +2,16 @@
2
2
  "version": 3,
3
3
  "sources": ["../js/codegen/enums.ts", "../js/inputs.ts", "../js/contexts/inputContext.ts", "../js/contexts/netContext.ts", "../js/contexts/timeContext.ts", "../js/tape.ts", "../js/defaultUrl.ts", "../js/engine.ts"],
4
4
  "sourcesContent": [
5
- "// AUTO-GENERATED FILE - DO NOT MODIFY\n\nexport enum EventType {\n None = 0,\n KeyDown = 1,\n KeyUp = 2,\n MouseMove = 3,\n MouseDown = 4,\n MouseUp = 5,\n MouseWheel = 6,\n FrameStart = 7,\n SessionInit = 8,\n SessionSetLocalPeer = 9,\n SessionConnectPeer = 10,\n SessionDisconnectPeer = 11,\n SessionEnd = 12,\n}\n\nexport enum MouseButton {\n None = 0,\n Left = 1,\n Middle = 2,\n Right = 3,\n X1 = 4,\n X2 = 5,\n X3 = 6,\n X4 = 7,\n X5 = 8,\n}\n\nexport enum Key {\n None = 0,\n Backquote = 1,\n Backslash = 2,\n BracketLeft = 3,\n BracketRight = 4,\n Comma = 5,\n Digit0 = 6,\n Digit1 = 7,\n Digit2 = 8,\n Digit3 = 9,\n Digit4 = 10,\n Digit5 = 11,\n Digit6 = 12,\n Digit7 = 13,\n Digit8 = 14,\n Digit9 = 15,\n Equal = 16,\n IntlBackslash = 17,\n IntlRo = 18,\n IntlYen = 19,\n KeyA = 20,\n KeyB = 21,\n KeyC = 22,\n KeyD = 23,\n KeyE = 24,\n KeyF = 25,\n KeyG = 26,\n KeyH = 27,\n KeyI = 28,\n KeyJ = 29,\n KeyK = 30,\n KeyL = 31,\n KeyM = 32,\n KeyN = 33,\n KeyO = 34,\n KeyP = 35,\n KeyQ = 36,\n KeyR = 37,\n KeyS = 38,\n KeyT = 39,\n KeyU = 40,\n KeyV = 41,\n KeyW = 42,\n KeyX = 43,\n KeyY = 44,\n KeyZ = 45,\n Minus = 46,\n Period = 47,\n Quote = 48,\n Semicolon = 49,\n Slash = 50,\n AltLeft = 51,\n AltRight = 52,\n Backspace = 53,\n CapsLock = 54,\n ContextMenu = 55,\n ControlLeft = 56,\n ControlRight = 57,\n Enter = 58,\n MetaLeft = 59,\n MetaRight = 60,\n ShiftLeft = 61,\n ShiftRight = 62,\n Space = 63,\n Tab = 64,\n Convert = 65,\n KanaMode = 66,\n Lang1 = 67,\n Lang2 = 68,\n Lang3 = 69,\n Lang4 = 70,\n Lang5 = 71,\n NonConvert = 72,\n Delete = 73,\n End = 74,\n Help = 75,\n Home = 76,\n Insert = 77,\n PageDown = 78,\n PageUp = 79,\n ArrowDown = 80,\n ArrowLeft = 81,\n ArrowRight = 82,\n ArrowUp = 83,\n NumLock = 84,\n Numpad0 = 85,\n Numpad1 = 86,\n Numpad2 = 87,\n Numpad3 = 88,\n Numpad4 = 89,\n Numpad5 = 90,\n Numpad6 = 91,\n Numpad7 = 92,\n Numpad8 = 93,\n Numpad9 = 94,\n NumpadAdd = 95,\n NumpadBackspace = 96,\n NumpadClear = 97,\n NumpadClearEntry = 98,\n NumpadComma = 99,\n NumpadDecimal = 100,\n NumpadDivide = 101,\n NumpadEnter = 102,\n NumpadEqual = 103,\n NumpadHash = 104,\n NumpadMemoryAdd = 105,\n NumpadMemoryClear = 106,\n NumpadMemoryRecall = 107,\n NumpadMemoryStore = 108,\n NumpadMemorySubtract = 109,\n NumpadMultiply = 110,\n NumpadParenLeft = 111,\n NumpadParenRight = 112,\n NumpadStar = 113,\n NumpadSubtract = 114,\n Escape = 115,\n Fn = 116,\n FnLock = 117,\n PrintScreen = 118,\n ScrollLock = 119,\n Pause = 120,\n BrowserBack = 121,\n BrowserFavorites = 122,\n BrowserForward = 123,\n BrowserHome = 124,\n BrowserRefresh = 125,\n BrowserSearch = 126,\n BrowserStop = 127,\n Eject = 128,\n LaunchApp1 = 129,\n LaunchApp2 = 130,\n LaunchMail = 131,\n MediaPlayPause = 132,\n MediaSelect = 133,\n MediaStop = 134,\n MediaTrackNext = 135,\n MediaTrackPrevious = 136,\n Power = 137,\n Sleep = 138,\n AudioVolumeDown = 139,\n AudioVolumeMute = 140,\n AudioVolumeUp = 141,\n WakeUp = 142,\n Hyper = 143,\n Super = 144,\n Turbo = 145,\n Abort = 146,\n Resume = 147,\n Suspend = 148,\n Again = 149,\n Copy = 150,\n Cut = 151,\n Find = 152,\n Open = 153,\n Paste = 154,\n Props = 155,\n Select = 156,\n Undo = 157,\n Hiragana = 158,\n Katakana = 159,\n F1 = 160,\n F2 = 161,\n F3 = 162,\n F4 = 163,\n F5 = 164,\n F6 = 165,\n F7 = 166,\n F8 = 167,\n F9 = 168,\n F10 = 169,\n F11 = 170,\n F12 = 171,\n F13 = 172,\n F14 = 173,\n F15 = 174,\n F16 = 175,\n F17 = 176,\n F18 = 177,\n F19 = 178,\n F20 = 179,\n F21 = 180,\n F22 = 181,\n F23 = 182,\n F24 = 183,\n F25 = 184,\n F26 = 185,\n F27 = 186,\n F28 = 187,\n F29 = 188,\n F30 = 189,\n F31 = 190,\n F32 = 191,\n F33 = 192,\n F34 = 193,\n F35 = 194,\n}\n\nexport enum InputSource {\n None = 0,\n LocalKeyboard = 1,\n LocalMouse = 2,\n LocalTouch = 3,\n LocalGamepad0 = 4,\n LocalGamepad1 = 5,\n LocalGamepad2 = 6,\n LocalGamepad3 = 7,\n LocalGamepad4 = 8,\n LocalGamepad5 = 9,\n LocalGamepad6 = 10,\n LocalGamepad7 = 11,\n LocalGamepad8 = 12,\n LocalGamepad9 = 13,\n LocalGamepad10 = 14,\n LocalGamepad11 = 15,\n RemotePeer0 = 128,\n RemotePeer1 = 129,\n RemotePeer2 = 130,\n RemotePeer3 = 131,\n RemotePeer4 = 132,\n RemotePeer5 = 133,\n RemotePeer6 = 134,\n RemotePeer7 = 135,\n RemotePeer8 = 136,\n RemotePeer9 = 137,\n RemotePeer10 = 138,\n RemotePeer11 = 139,\n Unmapped = 255,\n}\n\n",
5
+ "// AUTO-GENERATED FILE - DO NOT MODIFY\n\nexport enum EventType {\n None = 0,\n KeyDown = 1,\n KeyUp = 2,\n MouseMove = 3,\n MouseDown = 4,\n MouseUp = 5,\n MouseWheel = 6,\n FrameStart = 7,\n NetJoinOk = 8,\n NetJoinFail = 9,\n NetPeerJoin = 10,\n NetPeerLeave = 11,\n NetPeerAssignLocalId = 12,\n NetPacketReceived = 13,\n NetSessionInit = 14,\n}\n\nexport enum MouseButton {\n None = 0,\n Left = 1,\n Middle = 2,\n Right = 3,\n X1 = 4,\n X2 = 5,\n X3 = 6,\n X4 = 7,\n X5 = 8,\n}\n\nexport enum Key {\n None = 0,\n Backquote = 1,\n Backslash = 2,\n BracketLeft = 3,\n BracketRight = 4,\n Comma = 5,\n Digit0 = 6,\n Digit1 = 7,\n Digit2 = 8,\n Digit3 = 9,\n Digit4 = 10,\n Digit5 = 11,\n Digit6 = 12,\n Digit7 = 13,\n Digit8 = 14,\n Digit9 = 15,\n Equal = 16,\n IntlBackslash = 17,\n IntlRo = 18,\n IntlYen = 19,\n KeyA = 20,\n KeyB = 21,\n KeyC = 22,\n KeyD = 23,\n KeyE = 24,\n KeyF = 25,\n KeyG = 26,\n KeyH = 27,\n KeyI = 28,\n KeyJ = 29,\n KeyK = 30,\n KeyL = 31,\n KeyM = 32,\n KeyN = 33,\n KeyO = 34,\n KeyP = 35,\n KeyQ = 36,\n KeyR = 37,\n KeyS = 38,\n KeyT = 39,\n KeyU = 40,\n KeyV = 41,\n KeyW = 42,\n KeyX = 43,\n KeyY = 44,\n KeyZ = 45,\n Minus = 46,\n Period = 47,\n Quote = 48,\n Semicolon = 49,\n Slash = 50,\n AltLeft = 51,\n AltRight = 52,\n Backspace = 53,\n CapsLock = 54,\n ContextMenu = 55,\n ControlLeft = 56,\n ControlRight = 57,\n Enter = 58,\n MetaLeft = 59,\n MetaRight = 60,\n ShiftLeft = 61,\n ShiftRight = 62,\n Space = 63,\n Tab = 64,\n Convert = 65,\n KanaMode = 66,\n Lang1 = 67,\n Lang2 = 68,\n Lang3 = 69,\n Lang4 = 70,\n Lang5 = 71,\n NonConvert = 72,\n Delete = 73,\n End = 74,\n Help = 75,\n Home = 76,\n Insert = 77,\n PageDown = 78,\n PageUp = 79,\n ArrowDown = 80,\n ArrowLeft = 81,\n ArrowRight = 82,\n ArrowUp = 83,\n NumLock = 84,\n Numpad0 = 85,\n Numpad1 = 86,\n Numpad2 = 87,\n Numpad3 = 88,\n Numpad4 = 89,\n Numpad5 = 90,\n Numpad6 = 91,\n Numpad7 = 92,\n Numpad8 = 93,\n Numpad9 = 94,\n NumpadAdd = 95,\n NumpadBackspace = 96,\n NumpadClear = 97,\n NumpadClearEntry = 98,\n NumpadComma = 99,\n NumpadDecimal = 100,\n NumpadDivide = 101,\n NumpadEnter = 102,\n NumpadEqual = 103,\n NumpadHash = 104,\n NumpadMemoryAdd = 105,\n NumpadMemoryClear = 106,\n NumpadMemoryRecall = 107,\n NumpadMemoryStore = 108,\n NumpadMemorySubtract = 109,\n NumpadMultiply = 110,\n NumpadParenLeft = 111,\n NumpadParenRight = 112,\n NumpadStar = 113,\n NumpadSubtract = 114,\n Escape = 115,\n Fn = 116,\n FnLock = 117,\n PrintScreen = 118,\n ScrollLock = 119,\n Pause = 120,\n BrowserBack = 121,\n BrowserFavorites = 122,\n BrowserForward = 123,\n BrowserHome = 124,\n BrowserRefresh = 125,\n BrowserSearch = 126,\n BrowserStop = 127,\n Eject = 128,\n LaunchApp1 = 129,\n LaunchApp2 = 130,\n LaunchMail = 131,\n MediaPlayPause = 132,\n MediaSelect = 133,\n MediaStop = 134,\n MediaTrackNext = 135,\n MediaTrackPrevious = 136,\n Power = 137,\n Sleep = 138,\n AudioVolumeDown = 139,\n AudioVolumeMute = 140,\n AudioVolumeUp = 141,\n WakeUp = 142,\n Hyper = 143,\n Super = 144,\n Turbo = 145,\n Abort = 146,\n Resume = 147,\n Suspend = 148,\n Again = 149,\n Copy = 150,\n Cut = 151,\n Find = 152,\n Open = 153,\n Paste = 154,\n Props = 155,\n Select = 156,\n Undo = 157,\n Hiragana = 158,\n Katakana = 159,\n F1 = 160,\n F2 = 161,\n F3 = 162,\n F4 = 163,\n F5 = 164,\n F6 = 165,\n F7 = 166,\n F8 = 167,\n F9 = 168,\n F10 = 169,\n F11 = 170,\n F12 = 171,\n F13 = 172,\n F14 = 173,\n F15 = 174,\n F16 = 175,\n F17 = 176,\n F18 = 177,\n F19 = 178,\n F20 = 179,\n F21 = 180,\n F22 = 181,\n F23 = 182,\n F24 = 183,\n F25 = 184,\n F26 = 185,\n F27 = 186,\n F28 = 187,\n F29 = 188,\n F30 = 189,\n F31 = 190,\n F32 = 191,\n F33 = 192,\n F34 = 193,\n F35 = 194,\n}\n\nexport enum InputSource {\n None = 0,\n LocalKeyboard = 1,\n LocalMouse = 2,\n LocalTouch = 3,\n LocalGamepad0 = 4,\n LocalGamepad1 = 5,\n LocalGamepad2 = 6,\n LocalGamepad3 = 7,\n LocalGamepad4 = 8,\n LocalGamepad5 = 9,\n LocalGamepad6 = 10,\n LocalGamepad7 = 11,\n LocalGamepad8 = 12,\n LocalGamepad9 = 13,\n LocalGamepad10 = 14,\n LocalGamepad11 = 15,\n RemotePeer0 = 128,\n RemotePeer1 = 129,\n RemotePeer2 = 130,\n RemotePeer3 = 131,\n RemotePeer4 = 132,\n RemotePeer5 = 133,\n RemotePeer6 = 134,\n RemotePeer7 = 135,\n RemotePeer8 = 136,\n RemotePeer9 = 137,\n RemotePeer10 = 138,\n RemotePeer11 = 139,\n Unmapped = 255,\n}\n\nexport enum NetJoinFailReason {\n unknown = 0,\n timeout = 1,\n room_full = 2,\n room_not_found = 3,\n already_in_room = 4,\n}\n\n",
6
6
  "import * as Enums from \"./codegen/enums\";\n\n// Constants for memory layout\n// TODO: move magic numbers to codegen\nexport const MAX_PLAYERS = 12;\n\n// Per-player offsets (relative to start of PlayerInputs)\nexport const KEYBOARD_OFFSET = 0;\nexport const KEYBOARD_SIZE = 256;\nexport const MOUSE_OFFSET = 256; // After keyboard\nexport const MOUSE_BUTTONS_OFFSET = 16; // Within MouseCtx, after x, y, wheel_x, wheel_y (4 floats = 16 bytes)\n\n// PlayerInputs size = KeyCtx (256) + MouseCtx (24) = 280 bytes\nexport const PLAYER_INPUTS_SIZE = 280;\n\n// InputCtx layout: players[12] = 12 * 280 = 3360 bytes\nexport const INPUT_CTX_SIZE = MAX_PLAYERS * PLAYER_INPUTS_SIZE;\n\nexport const EVENT_PAYLOAD_SIZE = 8;\nexport const EVENT_PAYLOAD_ALIGN = 4;\n\nexport type MouseButton = keyof typeof Enums.MouseButton;\nexport type Key = keyof typeof Enums.Key;\nexport type InputSource = keyof typeof Enums.InputSource;\n\nexport function keyToKeyCode(key: Key): Enums.Key {\n return Enums.Key[key];\n}\n\nexport function keyCodeToKey(code: Enums.Key | number): Key {\n return Enums.Key[code] as Key;\n}\n\nexport function mouseButtonToMouseButtonCode(\n button: MouseButton,\n): Enums.MouseButton {\n return Enums.MouseButton[button];\n}\n\nexport function mouseButtonCodeToMouseButton(\n code: Enums.MouseButton | number,\n): MouseButton {\n return Enums.MouseButton[code] as MouseButton;\n}\n\nexport function inputSourceToInputSourceCode(\n source: InputSource,\n): Enums.InputSource {\n return Enums.InputSource[source];\n}\n\nexport function inputSourceCodeToInputSource(\n code: Enums.InputSource | number,\n): InputSource {\n return Enums.InputSource[code] as InputSource;\n}\n\nexport type KeyState = {\n down: boolean;\n held: boolean;\n up: boolean;\n};\n\nexport type MouseState = {\n left: KeyState;\n middle: KeyState;\n right: KeyState;\n wheel: { x: number; y: number };\n x: number;\n y: number;\n};\n",
7
7
  "import * as Enums from \"../codegen/enums\";\nimport {\n KEYBOARD_OFFSET,\n type KeyState,\n MAX_PLAYERS,\n MOUSE_BUTTONS_OFFSET,\n MOUSE_OFFSET,\n PLAYER_INPUTS_SIZE,\n} from \"../inputs\";\n\n/**\n * Per-player input state containing keyboard and mouse state\n */\nexport class PlayerInputContext {\n #dataView: DataView;\n #keys?: KeyboardContext;\n #mouse?: MouseContext;\n\n constructor(dataView: DataView) {\n this.#dataView = dataView;\n }\n\n get keys(): KeyboardContext {\n if (!this.#keys) {\n this.#keys = new KeyboardContext(\n new DataView(\n this.#dataView.buffer,\n this.#dataView.byteOffset + KEYBOARD_OFFSET,\n ),\n );\n }\n return this.#keys;\n }\n\n get mouse(): MouseContext {\n if (!this.#mouse) {\n this.#mouse = new MouseContext(\n new DataView(\n this.#dataView.buffer,\n this.#dataView.byteOffset + MOUSE_OFFSET,\n ),\n );\n }\n return this.#mouse;\n }\n}\n\n/**\n * Input context containing all player input states.\n *\n * Provides convenience methods to access player 0 keyboard and mouse\n */\nexport class InputContext {\n #dataView?: DataView;\n #players: PlayerInputContext[] = [];\n\n constructor(dataView?: DataView) {\n if (dataView) {\n this.#dataView = dataView;\n this.#buildPlayers();\n }\n }\n\n /**\n * Access the input context dataview for debugging.\n * Typically you would access player inputs via `players`\n */\n get dataView(): NonNullable<DataView> {\n if (!this.#dataView) {\n throw new Error(\"DataView is not initialized on InputContext\");\n }\n return this.#dataView!;\n }\n\n set dataView(dataView: DataView) {\n this.#dataView = dataView;\n this.#buildPlayers();\n }\n\n #buildPlayers() {\n this.#players = [];\n for (let i = 0; i < MAX_PLAYERS; i++) {\n const playerOffset = i * PLAYER_INPUTS_SIZE;\n const playerDataView = new DataView(\n this.dataView.buffer,\n this.dataView.byteOffset + playerOffset,\n PLAYER_INPUTS_SIZE,\n );\n this.#players.push(new PlayerInputContext(playerDataView));\n }\n }\n\n /**\n * Array of all player input contexts.\n * Access via: context.players[0].keys.a.held\n */\n get players(): readonly PlayerInputContext[] {\n return this.#players;\n }\n\n // Convenience: delegate to player 0 if no player is specified\n get keys(): KeyboardContext {\n if (!this.#players[0]) {\n throw new Error(\"No player inputs available in InputContext\");\n }\n return this.#players[0].keys;\n }\n\n get mouse(): MouseContext {\n if (!this.#players[0]) {\n throw new Error(\"No player inputs available in InputContext\");\n }\n return this.#players[0].mouse;\n }\n}\n\nexport class MouseContext {\n #dataView: DataView;\n #buttonStates: Map<Enums.MouseButton, KeyState> = new Map();\n\n constructor(dataView: DataView) {\n this.#dataView = dataView;\n }\n\n get x(): number {\n return this.#dataView.getFloat32(0, true);\n }\n\n get y(): number {\n return this.#dataView.getFloat32(4, true);\n }\n\n get wheel(): { x: number; y: number } {\n return { x: this.wheelX, y: this.wheelY };\n }\n\n get wheelX(): number {\n return this.#dataView.getFloat32(8, true);\n }\n\n get wheelY(): number {\n return this.#dataView.getFloat32(12, true);\n }\n\n get left(): KeyState {\n return this.#buttonState(Enums.MouseButton.Left);\n }\n\n get right(): KeyState {\n return this.#buttonState(Enums.MouseButton.Right);\n }\n get middle(): KeyState {\n return this.#buttonState(Enums.MouseButton.Middle);\n }\n\n #buttonState(code: Enums.MouseButton): KeyState {\n let state: KeyState;\n if (this.#buttonStates.has(code)) {\n state = this.#buttonStates.get(code)!;\n } else {\n state = { down: false, held: false, up: false };\n this.#buttonStates.set(code, state);\n }\n\n // xxxx xxx1 = held\n // xxxx xx01 = down\n // xxxx xx10 = up\n const offset = MOUSE_BUTTONS_OFFSET;\n state.held = !!(this.#dataView.getUint8(offset + code) & 1);\n state.down = state.held && !(this.#dataView.getUint8(offset + code) & 2);\n state.up = !state.held && !!(this.#dataView.getUint8(offset + code) & 2);\n\n return state;\n }\n}\n\nexport class KeyboardContext {\n #dataView: DataView;\n\n #keystates: Map<Enums.Key, KeyState> = new Map();\n\n constructor(dataView: DataView) {\n this.#dataView = dataView;\n }\n\n // modifier key helpers\n get shift(): KeyState {\n return this.shiftLeft || this.shiftRight;\n }\n get alt(): KeyState {\n return this.altLeft || this.altRight;\n }\n get control(): KeyState {\n return this.controlLeft || this.controlRight;\n }\n get meta(): KeyState {\n return this.metaLeft || this.metaRight;\n }\n\n // this line on is generated from the engine keysEnum manually\n // (unlikely to change often)\n get backquote(): KeyState {\n return this.#keystate(Enums.Key.Backquote);\n }\n get backslash(): KeyState {\n return this.#keystate(Enums.Key.Backslash);\n }\n get bracketLeft(): KeyState {\n return this.#keystate(Enums.Key.BracketLeft);\n }\n get bracketRight(): KeyState {\n return this.#keystate(Enums.Key.BracketRight);\n }\n get comma(): KeyState {\n return this.#keystate(Enums.Key.Comma);\n }\n get digit0(): KeyState {\n return this.#keystate(Enums.Key.Digit0);\n }\n get digit1(): KeyState {\n return this.#keystate(Enums.Key.Digit1);\n }\n get digit2(): KeyState {\n return this.#keystate(Enums.Key.Digit2);\n }\n get digit3(): KeyState {\n return this.#keystate(Enums.Key.Digit3);\n }\n get digit4(): KeyState {\n return this.#keystate(Enums.Key.Digit4);\n }\n get digit5(): KeyState {\n return this.#keystate(Enums.Key.Digit5);\n }\n get digit6(): KeyState {\n return this.#keystate(Enums.Key.Digit6);\n }\n get digit7(): KeyState {\n return this.#keystate(Enums.Key.Digit7);\n }\n get digit8(): KeyState {\n return this.#keystate(Enums.Key.Digit8);\n }\n get digit9(): KeyState {\n return this.#keystate(Enums.Key.Digit9);\n }\n get equal(): KeyState {\n return this.#keystate(Enums.Key.Equal);\n }\n get intlBackslash(): KeyState {\n return this.#keystate(Enums.Key.IntlBackslash);\n }\n get intlRo(): KeyState {\n return this.#keystate(Enums.Key.IntlRo);\n }\n get intlYen(): KeyState {\n return this.#keystate(Enums.Key.IntlYen);\n }\n get a(): KeyState {\n return this.#keystate(Enums.Key.KeyA);\n }\n get b(): KeyState {\n return this.#keystate(Enums.Key.KeyB);\n }\n get c(): KeyState {\n return this.#keystate(Enums.Key.KeyC);\n }\n get d(): KeyState {\n return this.#keystate(Enums.Key.KeyD);\n }\n get e(): KeyState {\n return this.#keystate(Enums.Key.KeyE);\n }\n get f(): KeyState {\n return this.#keystate(Enums.Key.KeyF);\n }\n get g(): KeyState {\n return this.#keystate(Enums.Key.KeyG);\n }\n get h(): KeyState {\n return this.#keystate(Enums.Key.KeyH);\n }\n get i(): KeyState {\n return this.#keystate(Enums.Key.KeyI);\n }\n get j(): KeyState {\n return this.#keystate(Enums.Key.KeyJ);\n }\n get k(): KeyState {\n return this.#keystate(Enums.Key.KeyK);\n }\n get l(): KeyState {\n return this.#keystate(Enums.Key.KeyL);\n }\n get m(): KeyState {\n return this.#keystate(Enums.Key.KeyM);\n }\n get n(): KeyState {\n return this.#keystate(Enums.Key.KeyN);\n }\n get o(): KeyState {\n return this.#keystate(Enums.Key.KeyO);\n }\n get p(): KeyState {\n return this.#keystate(Enums.Key.KeyP);\n }\n get q(): KeyState {\n return this.#keystate(Enums.Key.KeyQ);\n }\n get r(): KeyState {\n return this.#keystate(Enums.Key.KeyR);\n }\n get s(): KeyState {\n return this.#keystate(Enums.Key.KeyS);\n }\n get t(): KeyState {\n return this.#keystate(Enums.Key.KeyT);\n }\n get u(): KeyState {\n return this.#keystate(Enums.Key.KeyU);\n }\n get v(): KeyState {\n return this.#keystate(Enums.Key.KeyV);\n }\n get w(): KeyState {\n return this.#keystate(Enums.Key.KeyW);\n }\n get x(): KeyState {\n return this.#keystate(Enums.Key.KeyX);\n }\n get y(): KeyState {\n return this.#keystate(Enums.Key.KeyY);\n }\n get z(): KeyState {\n return this.#keystate(Enums.Key.KeyZ);\n }\n get minus(): KeyState {\n return this.#keystate(Enums.Key.Minus);\n }\n get period(): KeyState {\n return this.#keystate(Enums.Key.Period);\n }\n get quote(): KeyState {\n return this.#keystate(Enums.Key.Quote);\n }\n get semicolon(): KeyState {\n return this.#keystate(Enums.Key.Semicolon);\n }\n get slash(): KeyState {\n return this.#keystate(Enums.Key.Slash);\n }\n get altLeft(): KeyState {\n return this.#keystate(Enums.Key.AltLeft);\n }\n get altRight(): KeyState {\n return this.#keystate(Enums.Key.AltRight);\n }\n get backspace(): KeyState {\n return this.#keystate(Enums.Key.Backspace);\n }\n get capsLock(): KeyState {\n return this.#keystate(Enums.Key.CapsLock);\n }\n get contextMenu(): KeyState {\n return this.#keystate(Enums.Key.ContextMenu);\n }\n get controlLeft(): KeyState {\n return this.#keystate(Enums.Key.ControlLeft);\n }\n get controlRight(): KeyState {\n return this.#keystate(Enums.Key.ControlRight);\n }\n get enter(): KeyState {\n return this.#keystate(Enums.Key.Enter);\n }\n get metaLeft(): KeyState {\n return this.#keystate(Enums.Key.MetaLeft);\n }\n get metaRight(): KeyState {\n return this.#keystate(Enums.Key.MetaRight);\n }\n get shiftLeft(): KeyState {\n return this.#keystate(Enums.Key.ShiftLeft);\n }\n get shiftRight(): KeyState {\n return this.#keystate(Enums.Key.ShiftRight);\n }\n get space(): KeyState {\n return this.#keystate(Enums.Key.Space);\n }\n get tab(): KeyState {\n return this.#keystate(Enums.Key.Tab);\n }\n get convert(): KeyState {\n return this.#keystate(Enums.Key.Convert);\n }\n get kanaMode(): KeyState {\n return this.#keystate(Enums.Key.KanaMode);\n }\n get lang1(): KeyState {\n return this.#keystate(Enums.Key.Lang1);\n }\n get lang2(): KeyState {\n return this.#keystate(Enums.Key.Lang2);\n }\n get lang3(): KeyState {\n return this.#keystate(Enums.Key.Lang3);\n }\n get lang4(): KeyState {\n return this.#keystate(Enums.Key.Lang4);\n }\n get lang5(): KeyState {\n return this.#keystate(Enums.Key.Lang5);\n }\n get nonConvert(): KeyState {\n return this.#keystate(Enums.Key.NonConvert);\n }\n get delete(): KeyState {\n return this.#keystate(Enums.Key.Delete);\n }\n get end(): KeyState {\n return this.#keystate(Enums.Key.End);\n }\n get help(): KeyState {\n return this.#keystate(Enums.Key.Help);\n }\n get home(): KeyState {\n return this.#keystate(Enums.Key.Home);\n }\n get insert(): KeyState {\n return this.#keystate(Enums.Key.Insert);\n }\n get pageDown(): KeyState {\n return this.#keystate(Enums.Key.PageDown);\n }\n get pageUp(): KeyState {\n return this.#keystate(Enums.Key.PageUp);\n }\n get arrowDown(): KeyState {\n return this.#keystate(Enums.Key.ArrowDown);\n }\n get arrowLeft(): KeyState {\n return this.#keystate(Enums.Key.ArrowLeft);\n }\n get arrowRight(): KeyState {\n return this.#keystate(Enums.Key.ArrowRight);\n }\n get arrowUp(): KeyState {\n return this.#keystate(Enums.Key.ArrowUp);\n }\n get numLock(): KeyState {\n return this.#keystate(Enums.Key.NumLock);\n }\n get numpad0(): KeyState {\n return this.#keystate(Enums.Key.Numpad0);\n }\n get numpad1(): KeyState {\n return this.#keystate(Enums.Key.Numpad1);\n }\n get numpad2(): KeyState {\n return this.#keystate(Enums.Key.Numpad2);\n }\n get numpad3(): KeyState {\n return this.#keystate(Enums.Key.Numpad3);\n }\n get numpad4(): KeyState {\n return this.#keystate(Enums.Key.Numpad4);\n }\n get numpad5(): KeyState {\n return this.#keystate(Enums.Key.Numpad5);\n }\n get numpad6(): KeyState {\n return this.#keystate(Enums.Key.Numpad6);\n }\n get numpad7(): KeyState {\n return this.#keystate(Enums.Key.Numpad7);\n }\n get numpad8(): KeyState {\n return this.#keystate(Enums.Key.Numpad8);\n }\n get numpad9(): KeyState {\n return this.#keystate(Enums.Key.Numpad9);\n }\n get numpadAdd(): KeyState {\n return this.#keystate(Enums.Key.NumpadAdd);\n }\n get numpadBackspace(): KeyState {\n return this.#keystate(Enums.Key.NumpadBackspace);\n }\n get numpadClear(): KeyState {\n return this.#keystate(Enums.Key.NumpadClear);\n }\n get numpadClearEntry(): KeyState {\n return this.#keystate(Enums.Key.NumpadClearEntry);\n }\n get numpadComma(): KeyState {\n return this.#keystate(Enums.Key.NumpadComma);\n }\n get numpadDecimal(): KeyState {\n return this.#keystate(Enums.Key.NumpadDecimal);\n }\n get numpadDivide(): KeyState {\n return this.#keystate(Enums.Key.NumpadDivide);\n }\n get numpadEnter(): KeyState {\n return this.#keystate(Enums.Key.NumpadEnter);\n }\n get numpadEqual(): KeyState {\n return this.#keystate(Enums.Key.NumpadEqual);\n }\n get numpadHash(): KeyState {\n return this.#keystate(Enums.Key.NumpadHash);\n }\n get numpadMemoryAdd(): KeyState {\n return this.#keystate(Enums.Key.NumpadMemoryAdd);\n }\n get numpadMemoryClear(): KeyState {\n return this.#keystate(Enums.Key.NumpadMemoryClear);\n }\n get numpadMemoryRecall(): KeyState {\n return this.#keystate(Enums.Key.NumpadMemoryRecall);\n }\n get numpadMemoryStore(): KeyState {\n return this.#keystate(Enums.Key.NumpadMemoryStore);\n }\n get numpadMemorySubtract(): KeyState {\n return this.#keystate(Enums.Key.NumpadMemorySubtract);\n }\n get numpadMultiply(): KeyState {\n return this.#keystate(Enums.Key.NumpadMultiply);\n }\n get numpadParenLeft(): KeyState {\n return this.#keystate(Enums.Key.NumpadParenLeft);\n }\n get numpadParenRight(): KeyState {\n return this.#keystate(Enums.Key.NumpadParenRight);\n }\n get numpadStar(): KeyState {\n return this.#keystate(Enums.Key.NumpadStar);\n }\n get numpadSubtract(): KeyState {\n return this.#keystate(Enums.Key.NumpadSubtract);\n }\n get escape(): KeyState {\n return this.#keystate(Enums.Key.Escape);\n }\n get fn(): KeyState {\n return this.#keystate(Enums.Key.Fn);\n }\n get fnLock(): KeyState {\n return this.#keystate(Enums.Key.FnLock);\n }\n get printScreen(): KeyState {\n return this.#keystate(Enums.Key.PrintScreen);\n }\n get scrollLock(): KeyState {\n return this.#keystate(Enums.Key.ScrollLock);\n }\n get pause(): KeyState {\n return this.#keystate(Enums.Key.Pause);\n }\n get browserBack(): KeyState {\n return this.#keystate(Enums.Key.BrowserBack);\n }\n get browserFavorites(): KeyState {\n return this.#keystate(Enums.Key.BrowserFavorites);\n }\n get browserForward(): KeyState {\n return this.#keystate(Enums.Key.BrowserForward);\n }\n get browserHome(): KeyState {\n return this.#keystate(Enums.Key.BrowserHome);\n }\n get browserRefresh(): KeyState {\n return this.#keystate(Enums.Key.BrowserRefresh);\n }\n get browserSearch(): KeyState {\n return this.#keystate(Enums.Key.BrowserSearch);\n }\n get browserStop(): KeyState {\n return this.#keystate(Enums.Key.BrowserStop);\n }\n get eject(): KeyState {\n return this.#keystate(Enums.Key.Eject);\n }\n get launchApp1(): KeyState {\n return this.#keystate(Enums.Key.LaunchApp1);\n }\n get launchApp2(): KeyState {\n return this.#keystate(Enums.Key.LaunchApp2);\n }\n get launchMail(): KeyState {\n return this.#keystate(Enums.Key.LaunchMail);\n }\n get mediaPlayPause(): KeyState {\n return this.#keystate(Enums.Key.MediaPlayPause);\n }\n get mediaSelect(): KeyState {\n return this.#keystate(Enums.Key.MediaSelect);\n }\n get mediaStop(): KeyState {\n return this.#keystate(Enums.Key.MediaStop);\n }\n get mediaTrackNext(): KeyState {\n return this.#keystate(Enums.Key.MediaTrackNext);\n }\n get mediaTrackPrevious(): KeyState {\n return this.#keystate(Enums.Key.MediaTrackPrevious);\n }\n get power(): KeyState {\n return this.#keystate(Enums.Key.Power);\n }\n get sleep(): KeyState {\n return this.#keystate(Enums.Key.Sleep);\n }\n get audioVolumeDown(): KeyState {\n return this.#keystate(Enums.Key.AudioVolumeDown);\n }\n get audioVolumeMute(): KeyState {\n return this.#keystate(Enums.Key.AudioVolumeMute);\n }\n get audioVolumeUp(): KeyState {\n return this.#keystate(Enums.Key.AudioVolumeUp);\n }\n get wakeUp(): KeyState {\n return this.#keystate(Enums.Key.WakeUp);\n }\n get hyper(): KeyState {\n return this.#keystate(Enums.Key.Hyper);\n }\n get super(): KeyState {\n return this.#keystate(Enums.Key.Super);\n }\n get turbo(): KeyState {\n return this.#keystate(Enums.Key.Turbo);\n }\n get abort(): KeyState {\n return this.#keystate(Enums.Key.Abort);\n }\n get resume(): KeyState {\n return this.#keystate(Enums.Key.Resume);\n }\n get suspend(): KeyState {\n return this.#keystate(Enums.Key.Suspend);\n }\n get again(): KeyState {\n return this.#keystate(Enums.Key.Again);\n }\n get copy(): KeyState {\n return this.#keystate(Enums.Key.Copy);\n }\n get cut(): KeyState {\n return this.#keystate(Enums.Key.Cut);\n }\n get find(): KeyState {\n return this.#keystate(Enums.Key.Find);\n }\n get open(): KeyState {\n return this.#keystate(Enums.Key.Open);\n }\n get paste(): KeyState {\n return this.#keystate(Enums.Key.Paste);\n }\n get props(): KeyState {\n return this.#keystate(Enums.Key.Props);\n }\n get select(): KeyState {\n return this.#keystate(Enums.Key.Select);\n }\n get undo(): KeyState {\n return this.#keystate(Enums.Key.Undo);\n }\n get hiragana(): KeyState {\n return this.#keystate(Enums.Key.Hiragana);\n }\n get katakana(): KeyState {\n return this.#keystate(Enums.Key.Katakana);\n }\n get f1(): KeyState {\n return this.#keystate(Enums.Key.F1);\n }\n get f2(): KeyState {\n return this.#keystate(Enums.Key.F2);\n }\n get f3(): KeyState {\n return this.#keystate(Enums.Key.F3);\n }\n get f4(): KeyState {\n return this.#keystate(Enums.Key.F4);\n }\n get f5(): KeyState {\n return this.#keystate(Enums.Key.F5);\n }\n get f6(): KeyState {\n return this.#keystate(Enums.Key.F6);\n }\n get f7(): KeyState {\n return this.#keystate(Enums.Key.F7);\n }\n get f8(): KeyState {\n return this.#keystate(Enums.Key.F8);\n }\n get f9(): KeyState {\n return this.#keystate(Enums.Key.F9);\n }\n get f10(): KeyState {\n return this.#keystate(Enums.Key.F10);\n }\n get f11(): KeyState {\n return this.#keystate(Enums.Key.F11);\n }\n get f12(): KeyState {\n return this.#keystate(Enums.Key.F12);\n }\n get f13(): KeyState {\n return this.#keystate(Enums.Key.F13);\n }\n get f14(): KeyState {\n return this.#keystate(Enums.Key.F14);\n }\n get f15(): KeyState {\n return this.#keystate(Enums.Key.F15);\n }\n get f16(): KeyState {\n return this.#keystate(Enums.Key.F16);\n }\n get f17(): KeyState {\n return this.#keystate(Enums.Key.F17);\n }\n get f18(): KeyState {\n return this.#keystate(Enums.Key.F18);\n }\n get f19(): KeyState {\n return this.#keystate(Enums.Key.F19);\n }\n get f20(): KeyState {\n return this.#keystate(Enums.Key.F20);\n }\n get f21(): KeyState {\n return this.#keystate(Enums.Key.F21);\n }\n get f22(): KeyState {\n return this.#keystate(Enums.Key.F22);\n }\n get f23(): KeyState {\n return this.#keystate(Enums.Key.F23);\n }\n get f24(): KeyState {\n return this.#keystate(Enums.Key.F24);\n }\n get f25(): KeyState {\n return this.#keystate(Enums.Key.F25);\n }\n get f26(): KeyState {\n return this.#keystate(Enums.Key.F26);\n }\n get f27(): KeyState {\n return this.#keystate(Enums.Key.F27);\n }\n get f28(): KeyState {\n return this.#keystate(Enums.Key.F28);\n }\n get f29(): KeyState {\n return this.#keystate(Enums.Key.F29);\n }\n get f30(): KeyState {\n return this.#keystate(Enums.Key.F30);\n }\n get f31(): KeyState {\n return this.#keystate(Enums.Key.F31);\n }\n get f32(): KeyState {\n return this.#keystate(Enums.Key.F32);\n }\n get f33(): KeyState {\n return this.#keystate(Enums.Key.F33);\n }\n get f34(): KeyState {\n return this.#keystate(Enums.Key.F34);\n }\n get f35(): KeyState {\n return this.#keystate(Enums.Key.F35);\n }\n\n #keystate(code: Enums.Key) {\n let state: KeyState;\n if (this.#keystates.has(code)) {\n state = this.#keystates.get(code)!;\n } else {\n state = { down: false, held: false, up: false };\n this.#keystates.set(code, state);\n }\n\n // xxxx xxx1 = held\n // xxxx xx01 = down\n // xxxx xx10 = up\n state.held = !!(this.#dataView.getUint8(code) & 1);\n state.down = state.held && !(this.#dataView.getUint8(code) & 2);\n state.up = !state.held && !!(this.#dataView.getUint8(code) & 2);\n\n return state;\n }\n}\n",
8
- "export class NetContext {\n dataView?: DataView;\n\n constructor(dataView?: DataView) {\n this.dataView = dataView;\n }\n\n /** Number of peers in the current session (0 if not in a multiplayer session) */\n get peerCount(): number {\n if (!this.dataView) {\n throw new Error(\"NetContext DataView is not initialized\");\n }\n return this.dataView.getUint8(0);\n }\n\n get isInSession(): boolean {\n if (!this.dataView) {\n throw new Error(\"NetContext DataView is not initialized\");\n }\n return this.dataView.getUint8(2) !== 0;\n }\n\n /** Current match frame (frames since session start, 0 if no session) */\n get matchFrame(): number {\n if (!this.dataView) {\n throw new Error(\"NetContext DataView is not initialized\");\n }\n return this.dataView.getUint32(4, true);\n }\n}\n",
8
+ "/**\n * Network status values matching Zig NetStatus enum\n */\nexport type NetStatus =\n | \"offline\"\n | \"local\"\n | \"join:pending\"\n | \"connected\"\n | \"disconnected\";\n\nexport type NetEvent =\n | { type: \"join:ok\"; data: { roomCode: string } }\n | { type: \"join:fail\"; data: { reason: string } }\n | { type: \"peer:join\"; data: { peerId: number } }\n | { type: \"peer:leave\"; data: { peerId: number } }\n | { type: \"peer:assign_local_id\"; data: { peerId: number } }\n | { type: \"session:start\"; data: Record<string, never> }\n | { type: \"session:end\"; data: Record<string, never> };\n\nexport type NetEventType = Extract<NetEvent, { type: string }>[\"type\"];\n\n/**\n * Peer synchronization state for netcode\n */\nexport type PeerInfo = {\n isLocal: boolean;\n seq: number; // -1 if no packets received\n ack: number; // -1 if no packets received\n};\n\nconst MAX_PEERS = 12;\nconst PEERS_ARRAY_OFFSET = 32; // After _pad at offset 29-31\nconst PEER_CTX_SIZE = 8; // connected(1) + packet_count(1) + seq(2) + ack(2) + ack_count(1) + pad(1)\n\n// Offsets within PeerCtx struct\nconst PEER_CONNECTED_OFFSET = 0;\nconst PEER_PACKET_COUNT_OFFSET = 1;\nconst PEER_SEQ_OFFSET = 2;\nconst PEER_ACK_OFFSET = 4;\nconst PEER_ACK_COUNT_OFFSET = 6;\n\nconst STATUS_MAP: Record<number, NetStatus> = {\n 0: \"offline\",\n 1: \"local\",\n 2: \"join:pending\",\n 3: \"connected\",\n 4: \"disconnected\",\n};\n\n/**\n * NetCtx struct layout (from context.zig):\n * - peer_count: u8 (offset 0)\n * - local_peer_id: u8 (offset 1)\n * - in_session: u8 (offset 2)\n * - status: u8 (offset 3)\n * - match_frame: u32 (offset 4)\n * - session_start_frame: u32 (offset 8)\n * - room_code: [8]u8 (offset 12)\n *\n * All getters read directly from the engine's memory via DataView.\n * State is managed by the Zig engine, not TypeScript.\n */\nexport class NetContext {\n dataView?: DataView;\n\n // Pre-allocated peer objects to avoid GC pressure\n #peers: PeerInfo[] = Array.from({ length: MAX_PEERS }, () => ({\n isLocal: false,\n seq: -1,\n ack: -1,\n }));\n #peersResult: PeerInfo[] = []; // Reused return array\n\n constructor(dataView?: DataView) {\n this.dataView = dataView;\n }\n\n /** Check if dataView is valid (not undefined and not detached) */\n #hasValidBuffer(): boolean {\n if (!this.dataView) return false;\n // Check if buffer is detached (byteLength becomes 0)\n return this.dataView.buffer.byteLength > 0;\n }\n\n /** Number of peers in the current session (0 if not in a multiplayer session) */\n get peerCount(): number {\n if (!this.#hasValidBuffer()) {\n throw new Error(\"NetContext dataView is not valid\");\n }\n return this.dataView!.getUint8(0);\n }\n\n /** Local peer ID in the session */\n get localPeerId(): number {\n if (!this.#hasValidBuffer()) {\n throw new Error(\"NetContext dataView is not valid\");\n }\n return this.dataView!.getUint8(1);\n }\n\n /** Whether we're in an active multiplayer session */\n get isInSession(): boolean {\n if (!this.#hasValidBuffer()) {\n throw new Error(\"NetContext dataView is not valid\");\n }\n return this.dataView!.getUint8(2) !== 0;\n }\n\n /** Current network status */\n get status(): NetStatus {\n if (!this.#hasValidBuffer()) {\n throw new Error(\"NetContext dataView is not valid\");\n }\n const statusByte = this.dataView!.getUint8(3);\n return STATUS_MAP[statusByte] ?? \"local\";\n }\n\n /** Current match frame (frames since session start, 0 if no session) */\n get matchFrame(): number {\n if (!this.#hasValidBuffer()) {\n throw new Error(\"NetContext dataView is not valid\");\n }\n return this.dataView!.getUint32(4, true);\n }\n\n /**\n * The number of frames since the game booted that the session started.\n * Match frame is calculated relative to this.\n */\n get sessionStartFrame(): number {\n if (!this.#hasValidBuffer()) {\n throw new Error(\"NetContext dataView is not valid\");\n }\n return this.dataView!.getUint32(8, true);\n }\n\n /** Current room code (empty string if not in a room) */\n get roomCode(): string {\n if (!this.#hasValidBuffer()) {\n throw new Error(\"NetContext dataView is not valid\");\n }\n // Read 8 bytes starting at offset 12, convert to string until null terminator\n const bytes: number[] = [];\n for (let i = 0; i < 8; i++) {\n const byte = this.dataView!.getUint8(12 + i);\n if (byte === 0) break;\n bytes.push(byte);\n }\n return String.fromCharCode(...bytes);\n }\n\n /** Game code sets this to request joining a room */\n get wantsRoomCode(): string | undefined {\n if (!this.#hasValidBuffer()) {\n return undefined;\n }\n // Read 8 bytes starting at offset 20, convert to string until null terminator\n const bytes: number[] = [];\n for (let i = 0; i < 8; i++) {\n const byte = this.dataView!.getUint8(20 + i);\n if (byte === 0) break;\n bytes.push(byte);\n }\n return bytes.length > 0 ? String.fromCharCode(...bytes) : undefined;\n }\n\n set wantsRoomCode(code: string | undefined) {\n if (!this.#hasValidBuffer()) {\n throw new Error(\"NetContext dataView is not valid\");\n }\n // Clear first\n for (let i = 0; i < 8; i++) {\n this.dataView!.setUint8(20 + i, 0);\n }\n if (code) {\n // Write up to 7 chars (leave room for null terminator)\n for (let i = 0; i < Math.min(code.length, 7); i++) {\n this.dataView!.setUint8(20 + i, code.charCodeAt(i));\n }\n }\n }\n\n /** Game code sets this to request disconnection */\n get wantsDisconnect(): boolean {\n if (!this.#hasValidBuffer()) {\n return false;\n }\n return this.dataView!.getUint8(28) !== 0;\n }\n\n set wantsDisconnect(value: boolean) {\n if (!this.#hasValidBuffer()) {\n throw new Error(\"NetContext dataView is not valid\");\n }\n this.dataView!.setUint8(28, value ? 1 : 0);\n }\n\n /**\n * Get all connected peers in the session.\n * Returns peer info with seq/ack values.\n *\n * For the local peer:\n * - seq = matchFrame (our current frame)\n * - ack = minimum seq across all connected remote peers (-1 if none)\n *\n * For remote peers:\n * - seq = their latest frame we've received (-1 if none)\n * - ack = the frame they've acknowledged from us (-1 if none)\n */\n get peers(): PeerInfo[] {\n if (!this.#hasValidBuffer()) {\n throw new Error(\"NetContext dataView is not valid\");\n }\n\n const dv = this.dataView!;\n const localPeerId = this.localPeerId;\n const matchFrame = this.matchFrame;\n\n // Calculate local peer ack = min(seq) across connected remotes with packets\n let minRemoteSeq = -1;\n for (let i = 0; i < MAX_PEERS; i++) {\n if (i === localPeerId) continue;\n const peerOffset = PEERS_ARRAY_OFFSET + i * PEER_CTX_SIZE;\n if (dv.getUint8(peerOffset + PEER_CONNECTED_OFFSET) !== 1) continue;\n if (dv.getUint8(peerOffset + PEER_PACKET_COUNT_OFFSET) === 0) continue;\n const seq = dv.getUint16(peerOffset + PEER_SEQ_OFFSET, true);\n if (minRemoteSeq === -1 || seq < minRemoteSeq) {\n minRemoteSeq = seq;\n }\n }\n\n // Update pre-allocated peer objects and build result array\n this.#peersResult.length = 0;\n for (let i = 0; i < MAX_PEERS; i++) {\n const peerOffset = PEERS_ARRAY_OFFSET + i * PEER_CTX_SIZE;\n if (dv.getUint8(peerOffset + PEER_CONNECTED_OFFSET) !== 1) continue;\n\n const peer = this.#peers[i];\n if (!peer) {\n throw new Error(`Unexpected missing peer object at index ${i}`);\n }\n const isLocal = i === localPeerId;\n peer.isLocal = isLocal;\n\n if (isLocal) {\n peer.seq = matchFrame;\n peer.ack = minRemoteSeq;\n } else {\n const packetCount = dv.getUint8(peerOffset + PEER_PACKET_COUNT_OFFSET);\n const ackCount = dv.getUint8(peerOffset + PEER_ACK_COUNT_OFFSET);\n peer.seq = packetCount === 0 ? -1 : dv.getUint16(peerOffset + PEER_SEQ_OFFSET, true);\n peer.ack = ackCount === 0 ? -1 : dv.getUint16(peerOffset + PEER_ACK_OFFSET, true);\n }\n this.#peersResult.push(peer);\n }\n return this.#peersResult;\n }\n}\n",
9
9
  "export class TimeContext {\n dataView?: DataView;\n\n constructor(dataView?: DataView) {\n this.dataView = dataView;\n }\n\n /** The current frame number, eg after processing frame 0, this will be 1 */\n get frame(): number {\n if (!this.dataView) {\n throw new Error(\"TimeContext DataView is not initialized\");\n }\n return this.dataView.getUint32(0, true);\n }\n\n /** The number of seconds since the last frame */\n get dt(): number {\n if (!this.dataView) {\n throw new Error(\"TimeContext DataView is not initialized\");\n }\n return this.dataView.getUint32(4, true) / 1000;\n }\n\n /** The total number of seconds since the engine started */\n get time(): number {\n if (!this.dataView) {\n throw new Error(\"TimeContext DataView is not initialized\");\n }\n return this.dataView.getUint32(8, true) / 1000;\n }\n}\n",
10
10
  "// Tape header parsing (ABI matches packages/engine/src/tapes.zig TapeHeader struct)\nconst TAPE_MAGIC = 0x54415045; // \"TAPE\" in ASCII\n\nexport type TapeHeader = {\n magic: number;\n version: number;\n startFrame: number;\n frameCount: number;\n eventCount: number;\n};\n\nexport function readTapeHeader(tape: Uint8Array): TapeHeader {\n const view = new DataView(tape.buffer, tape.byteOffset, tape.byteLength);\n const magic = view.getUint32(0, true);\n if (magic !== TAPE_MAGIC) {\n throw new Error(\n `Invalid tape format: expected magic ${TAPE_MAGIC.toString(16)}, got ${magic.toString(16)}`,\n );\n }\n return {\n magic,\n version: view.getUint16(4, true),\n startFrame: view.getUint32(8, true),\n frameCount: view.getUint16(12, true),\n eventCount: view.getUint16(14, true),\n };\n}\n",
11
- "export const DEFAULT_WASM_URL: URL = new URL(\"https://unpkg.com/@bloopjs/engine@0.0.80/wasm/bloop.wasm\");\n",
11
+ "export const DEFAULT_WASM_URL: URL = new URL(\"https://unpkg.com/@bloopjs/engine@0.0.82/wasm/bloop.wasm\");\n",
12
12
  "export * as Enums from \"./codegen/enums\";\nexport * from \"./contexts/inputContext\";\nexport * from \"./contexts/netContext\";\nexport * from \"./contexts/timeContext\";\nexport * from \"./inputs\";\nexport * from \"./tape\";\nexport type * from \"./wasmEngine\";\n\n/**\n * A pointer to shared wasm memory space. Use it like\n *\n * const dataView = new DataView(wasmMemory.buffer, ptr);\n */\nexport type EnginePointer = number;\nexport type EngineLen = number;\n/**\n * A return value indicating success.\n *\n * 0 = success\n * 1 = failure\n * other values are function specific error codes\n */\nexport type EngineOk = number;\n\nexport { DEFAULT_WASM_URL } from \"./defaultUrl\";\n\nexport const MAX_ROLLBACK_FRAMES = 500;\n\nexport const TIME_CTX_OFFSET = 0;\nexport const INPUT_CTX_OFFSET = TIME_CTX_OFFSET + 4;\nexport const EVENTS_OFFSET = INPUT_CTX_OFFSET + 4;\nexport const NET_CTX_OFFSET = EVENTS_OFFSET + 4;\n\n/**\n * Size of snapshot header in bytes\n */\nexport const SNAPSHOT_HEADER_LEN = 16;\nexport const SNAPSHOT_HEADER_USER_LEN_OFFSET = 4;\nexport const SNAPSHOT_HEADER_ENGINE_LEN_OFFSET = 8;\n"
13
13
  ],
14
- "mappings": "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O,KAAK,uBAAuB;AAAA;AAAA,MAEjC,GAAG,GAAa;AAAA,IAClB,OAAO,KAAK,uBAAuB;AAAA;AAAA,MAEjC,GAAG,GAAa;AAAA,IAClB,OAAO,KAAK,uBAAuB;AAAA;AAAA,MAEjC,GAAG,GAAa;AAAA,IAClB,OAAO,KAAK,uBAAuB;AAAA;AAAA,MAEjC,GAAG,GAAa;AAAA,IAClB,OAAO,KAAK,uBAAuB;AAAA;AAAA,MAEjC,GAAG,GAAa;AAAA,IAClB,OAAO,KAAK,uBAAuB;AAAA;AAAA,MAEjC,GAAG,GAAa;AAAA,IAClB,OAAO,KAAK,uBAAuB;AAAA;AAAA,MAEjC,GAAG,GAAa;AAAA,IAClB,OAAO,KAAK,uBAAuB;AAAA;AAAA,MAEjC,GAAG,GAAa;AAAA,IAClB,OAAO,KAAK,uBAAuB;AAAA;AAAA,MAEjC,GAAG,GAAa;AAAA,IAClB,OAAO,KAAK,uBAAuB;AAAA;AAAA,MAEjC,GAAG,GAAa;AAAA,IAClB,OAAO,KAAK,uBAAuB;AAAA;AAAA,MAEjC,GAAG,GAAa;AAAA,IAClB,OAAO,KAAK,uBAAuB;AAAA;AAAA,MAEjC,GAAG,GAAa;AAAA,IAClB,OAAO,KAAK,uBAAuB;AAAA;AAAA,MAEjC,GAAG,GAAa;AAAA,IAClB,OAAO,KAAK,uBAAuB;AAAA;AAAA,MAEjC,GAAG,GAAa;AAAA,IAClB,OAAO,KAAK,uBAAuB;AAAA;AAAA,MAEjC,GAAG,GAAa;AAAA,IAClB,OAAO,KAAK,uBAAuB;AAAA;AAAA,MAEjC,GAAG,GAAa;AAAA,IAClB,OAAO,KAAK,uBAAuB;AAAA;AAAA,MAEjC,GAAG,GAAa;AAAA,IAClB,OAAO,KAAK,uBAAuB;AAAA;AAAA,MAEjC,GAAG,GAAa;AAAA,IAClB,OAAO,KAAK,uBAAuB;AAAA;AAAA,MAEjC,GAAG,GAAa;AAAA,IAClB,OAAO,KAAK,uBAAuB;AAAA;AAAA,MAEjC,GAAG,GAAa;AAAA,IAClB,OAAO,KAAK,uBAAuB;AAAA;AAAA,MAEjC,GAAG,GAAa;AAAA,IAClB,OAAO,KAAK,uBAAuB;AAAA;AAAA,MAEjC,GAAG,GAAa;AAAA,IAClB,OAAO,KAAK,uBAAu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",
15
- "debugId": "DA66B69CCED4106764756E2164756E21",
14
+ "mappings": "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A,MAEhC,GAAG,GAAa;AAAA,IAClB,OAAO,KAAK,uBAAuB;AAAA;AAAA,MAEjC,GAAG,GAAa;AAAA,IAClB,OAAO,KAAK,uBAAuB;AAAA;AAAA,MAEjC,GAAG,GAAa;AAAA,IAClB,OAAO,KAAK,uBAAuB;AAAA;AAAA,MAEjC,GAAG,GAAa;AAAA,IAClB,OAAO,KAAK,uBAAuB;AAAA;AAAA,MAEjC,GAAG,GAAa;AAAA,IAClB,OAAO,KAAK,uBAAuB;AAAA;AAAA,MAEjC,GAAG,GAAa;AAAA,IAClB,OAAO,KAAK,uBAAuB;AAAA;AAAA,MAEjC,GAAG,GAAa;AAAA,IAClB,OAAO,KAAK,uBAAuB;AAAA;AAAA,MAEjC,GAAG,GAAa;AAAA,IAClB,OAAO,KAAK,uBAAuB;AAAA;AAAA,MAEjC,GAAG,GAAa;AAAA,IAClB,OAAO,KAAK,uBAAuB;AAAA;AAAA,MAEjC,GAAG,GAAa;AAAA,IAClB,OAAO,KAAK,uBAAuB;AAAA;AAAA,MAEjC,GAAG,GAAa;AAAA,IAClB,OAAO,KAAK,uBAAuB;AAAA;AAAA,MAEjC,GAAG,GAAa;AAAA,IAClB,OAAO,KAAK,uBAAuB;AAAA;AAAA,MAEjC,GAAG,GAAa;AAAA,IAClB,OAAO,KAAK,uBAAuB;AAAA;AAAA,MAEjC,GAAG,GAAa;AAAA,IAClB,OAAO,KAAK,uBAAuB;AAAA;AAAA,MAEjC,GAAG,GAAa;AAAA,IAClB,OAAO,KAAK,uBAAuB;AAAA;AAAA,MAEjC,GAAG,GAAa;AAAA,IAClB,OAAO,KAAK,uBAAuB;AAAA;AAAA,MAEjC,GAAG,GAAa;AAAA,IAClB,OAAO,KAAK,uBAAuB;AAAA;AAAA,MAEjC,GAAG,GAAa;AAAA,IAClB,OAAO,KAAK,uBAAuB;AAAA;AAAA,MAEjC,GAAG,GAAa;AAAA,IAClB,OAAO,KAAK,uBAAuB;AAAA;AAAA,MAEjC,GAAG,GAAa;AAAA,IAClB,OAAO,KAAK,uBAAuB;AAAA;AAAA,MAEjC,GAAG,GAAa;AAAA,IAClB,OAAO,KAAK,uBAAuB;AAAA;AAAA,MAEjC,GAAG,GAAa;AAAA,IAClB,OAAO,KAAK,uBAAuB;AAAA;AAAA,MAEjC,GAAG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",
15
+ "debugId": "F357B2D2ABF7D74464756E2164756E21",
16
16
  "names": []
17
17
  }
@@ -78,30 +78,10 @@ export type WasmEngine = {
78
78
  * End the current session
79
79
  */
80
80
  session_end: () => void;
81
- /**
82
- * Emit inputs for a peer at a given match frame
83
- * @param peer Peer ID (0-indexed)
84
- * @param match_frame Frame number relative to session start
85
- * @param events_ptr Pointer to Event array in WASM memory
86
- * @param events_len Number of events
87
- */
88
- session_emit_inputs: (peer: number, match_frame: number, events_ptr: EnginePointer, events_len: number) => void;
89
81
  /**
90
82
  * Get pointer to net context struct
91
83
  */
92
84
  get_net_ctx: () => EnginePointer;
93
- /**
94
- * Set local peer ID for packet encoding
95
- */
96
- session_set_local_peer: (peer_id: number) => void;
97
- /**
98
- * Mark a peer as connected for packet management
99
- */
100
- session_peer_connect: (peer_id: number) => void;
101
- /**
102
- * Mark a peer as disconnected
103
- */
104
- session_peer_disconnect: (peer_id: number) => void;
105
85
  /**
106
86
  * Build an outbound packet for a target peer
107
87
  * Call get_outbound_packet() and get_outbound_packet_len() to retrieve the packet
@@ -116,17 +96,43 @@ export type WasmEngine = {
116
96
  */
117
97
  get_outbound_packet_len: () => number;
118
98
  /**
119
- * Process a received packet
99
+ * Emit NetJoinOk event - successfully joined a room
100
+ * @param room_code_ptr Pointer to room code string in WASM memory
101
+ * @param len Length of the room code (max 8)
102
+ */
103
+ emit_net_join_ok: (room_code_ptr: EnginePointer, len: number) => void;
104
+ /**
105
+ * Emit NetJoinFail event - failed to join a room
106
+ * @param reason Reason code (0=unknown, 1=timeout, 2=room_full, etc.)
107
+ */
108
+ emit_net_join_fail: (reason: number) => void;
109
+ /**
110
+ * Emit NetPeerJoin event - a peer joined the room
111
+ * @param peer_id Numeric peer ID (0-11)
112
+ */
113
+ emit_net_peer_join: (peer_id: number) => void;
114
+ /**
115
+ * Emit NetPeerLeave event - a peer left the room
116
+ * @param peer_id Numeric peer ID (0-11)
117
+ */
118
+ emit_net_peer_leave: (peer_id: number) => void;
119
+ /**
120
+ * Queue a received packet for processing in the next tick
120
121
  * @returns 0 on success, error code otherwise
121
122
  */
122
- receive_packet: (ptr: EnginePointer, len: number) => number;
123
+ emit_receive_packet: (ptr: EnginePointer, len: number) => EngineOk;
124
+ /**
125
+ * Initialize a session (derives peer count/local ID from prior events)
126
+ */
127
+ emit_net_session_init: () => void;
123
128
  /**
124
- * Get seq for a peer (latest frame received from them)
129
+ * End the current session (emits disconnect events for all peers)
125
130
  */
126
- get_peer_seq: (peer: number) => number;
131
+ emit_net_session_end: () => void;
127
132
  /**
128
- * Get ack for a peer (latest frame they acked from us)
133
+ * Assign local peer ID (for session setup)
134
+ * @param peer_id Local peer ID (0-11)
129
135
  */
130
- get_peer_ack: (peer: number) => number;
136
+ emit_net_peer_assign_local_id: (peer_id: number) => void;
131
137
  };
132
138
  //# sourceMappingURL=wasmEngine.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"wasmEngine.d.ts","sourceRoot":"","sources":["../js/wasmEngine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wasmEngine.d.ts","sourceRoot":"","sources":["../js/wasmEngine.ts"],"names":[],"mappings":"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"}
@@ -9,11 +9,13 @@ export enum EventType {
9
9
  MouseUp = 5,
10
10
  MouseWheel = 6,
11
11
  FrameStart = 7,
12
- SessionInit = 8,
13
- SessionSetLocalPeer = 9,
14
- SessionConnectPeer = 10,
15
- SessionDisconnectPeer = 11,
16
- SessionEnd = 12,
12
+ NetJoinOk = 8,
13
+ NetJoinFail = 9,
14
+ NetPeerJoin = 10,
15
+ NetPeerLeave = 11,
16
+ NetPeerAssignLocalId = 12,
17
+ NetPacketReceived = 13,
18
+ NetSessionInit = 14,
17
19
  }
18
20
 
19
21
  export enum MouseButton {
@@ -258,3 +260,11 @@ export enum InputSource {
258
260
  Unmapped = 255,
259
261
  }
260
262
 
263
+ export enum NetJoinFailReason {
264
+ unknown = 0,
265
+ timeout = 1,
266
+ room_full = 2,
267
+ room_not_found = 3,
268
+ already_in_room = 4,
269
+ }
270
+
@@ -1,30 +1,258 @@
1
+ /**
2
+ * Network status values matching Zig NetStatus enum
3
+ */
4
+ export type NetStatus =
5
+ | "offline"
6
+ | "local"
7
+ | "join:pending"
8
+ | "connected"
9
+ | "disconnected";
10
+
11
+ export type NetEvent =
12
+ | { type: "join:ok"; data: { roomCode: string } }
13
+ | { type: "join:fail"; data: { reason: string } }
14
+ | { type: "peer:join"; data: { peerId: number } }
15
+ | { type: "peer:leave"; data: { peerId: number } }
16
+ | { type: "peer:assign_local_id"; data: { peerId: number } }
17
+ | { type: "session:start"; data: Record<string, never> }
18
+ | { type: "session:end"; data: Record<string, never> };
19
+
20
+ export type NetEventType = Extract<NetEvent, { type: string }>["type"];
21
+
22
+ /**
23
+ * Peer synchronization state for netcode
24
+ */
25
+ export type PeerInfo = {
26
+ isLocal: boolean;
27
+ seq: number; // -1 if no packets received
28
+ ack: number; // -1 if no packets received
29
+ };
30
+
31
+ const MAX_PEERS = 12;
32
+ const PEERS_ARRAY_OFFSET = 32; // After _pad at offset 29-31
33
+ const PEER_CTX_SIZE = 8; // connected(1) + packet_count(1) + seq(2) + ack(2) + ack_count(1) + pad(1)
34
+
35
+ // Offsets within PeerCtx struct
36
+ const PEER_CONNECTED_OFFSET = 0;
37
+ const PEER_PACKET_COUNT_OFFSET = 1;
38
+ const PEER_SEQ_OFFSET = 2;
39
+ const PEER_ACK_OFFSET = 4;
40
+ const PEER_ACK_COUNT_OFFSET = 6;
41
+
42
+ const STATUS_MAP: Record<number, NetStatus> = {
43
+ 0: "offline",
44
+ 1: "local",
45
+ 2: "join:pending",
46
+ 3: "connected",
47
+ 4: "disconnected",
48
+ };
49
+
50
+ /**
51
+ * NetCtx struct layout (from context.zig):
52
+ * - peer_count: u8 (offset 0)
53
+ * - local_peer_id: u8 (offset 1)
54
+ * - in_session: u8 (offset 2)
55
+ * - status: u8 (offset 3)
56
+ * - match_frame: u32 (offset 4)
57
+ * - session_start_frame: u32 (offset 8)
58
+ * - room_code: [8]u8 (offset 12)
59
+ *
60
+ * All getters read directly from the engine's memory via DataView.
61
+ * State is managed by the Zig engine, not TypeScript.
62
+ */
1
63
  export class NetContext {
2
64
  dataView?: DataView;
3
65
 
66
+ // Pre-allocated peer objects to avoid GC pressure
67
+ #peers: PeerInfo[] = Array.from({ length: MAX_PEERS }, () => ({
68
+ isLocal: false,
69
+ seq: -1,
70
+ ack: -1,
71
+ }));
72
+ #peersResult: PeerInfo[] = []; // Reused return array
73
+
4
74
  constructor(dataView?: DataView) {
5
75
  this.dataView = dataView;
6
76
  }
7
77
 
78
+ /** Check if dataView is valid (not undefined and not detached) */
79
+ #hasValidBuffer(): boolean {
80
+ if (!this.dataView) return false;
81
+ // Check if buffer is detached (byteLength becomes 0)
82
+ return this.dataView.buffer.byteLength > 0;
83
+ }
84
+
8
85
  /** Number of peers in the current session (0 if not in a multiplayer session) */
9
86
  get peerCount(): number {
10
- if (!this.dataView) {
11
- throw new Error("NetContext DataView is not initialized");
87
+ if (!this.#hasValidBuffer()) {
88
+ throw new Error("NetContext dataView is not valid");
89
+ }
90
+ return this.dataView!.getUint8(0);
91
+ }
92
+
93
+ /** Local peer ID in the session */
94
+ get localPeerId(): number {
95
+ if (!this.#hasValidBuffer()) {
96
+ throw new Error("NetContext dataView is not valid");
12
97
  }
13
- return this.dataView.getUint8(0);
98
+ return this.dataView!.getUint8(1);
14
99
  }
15
100
 
101
+ /** Whether we're in an active multiplayer session */
16
102
  get isInSession(): boolean {
17
- if (!this.dataView) {
18
- throw new Error("NetContext DataView is not initialized");
103
+ if (!this.#hasValidBuffer()) {
104
+ throw new Error("NetContext dataView is not valid");
105
+ }
106
+ return this.dataView!.getUint8(2) !== 0;
107
+ }
108
+
109
+ /** Current network status */
110
+ get status(): NetStatus {
111
+ if (!this.#hasValidBuffer()) {
112
+ throw new Error("NetContext dataView is not valid");
19
113
  }
20
- return this.dataView.getUint8(2) !== 0;
114
+ const statusByte = this.dataView!.getUint8(3);
115
+ return STATUS_MAP[statusByte] ?? "local";
21
116
  }
22
117
 
23
118
  /** Current match frame (frames since session start, 0 if no session) */
24
119
  get matchFrame(): number {
25
- if (!this.dataView) {
26
- throw new Error("NetContext DataView is not initialized");
120
+ if (!this.#hasValidBuffer()) {
121
+ throw new Error("NetContext dataView is not valid");
122
+ }
123
+ return this.dataView!.getUint32(4, true);
124
+ }
125
+
126
+ /**
127
+ * The number of frames since the game booted that the session started.
128
+ * Match frame is calculated relative to this.
129
+ */
130
+ get sessionStartFrame(): number {
131
+ if (!this.#hasValidBuffer()) {
132
+ throw new Error("NetContext dataView is not valid");
133
+ }
134
+ return this.dataView!.getUint32(8, true);
135
+ }
136
+
137
+ /** Current room code (empty string if not in a room) */
138
+ get roomCode(): string {
139
+ if (!this.#hasValidBuffer()) {
140
+ throw new Error("NetContext dataView is not valid");
141
+ }
142
+ // Read 8 bytes starting at offset 12, convert to string until null terminator
143
+ const bytes: number[] = [];
144
+ for (let i = 0; i < 8; i++) {
145
+ const byte = this.dataView!.getUint8(12 + i);
146
+ if (byte === 0) break;
147
+ bytes.push(byte);
148
+ }
149
+ return String.fromCharCode(...bytes);
150
+ }
151
+
152
+ /** Game code sets this to request joining a room */
153
+ get wantsRoomCode(): string | undefined {
154
+ if (!this.#hasValidBuffer()) {
155
+ return undefined;
156
+ }
157
+ // Read 8 bytes starting at offset 20, convert to string until null terminator
158
+ const bytes: number[] = [];
159
+ for (let i = 0; i < 8; i++) {
160
+ const byte = this.dataView!.getUint8(20 + i);
161
+ if (byte === 0) break;
162
+ bytes.push(byte);
163
+ }
164
+ return bytes.length > 0 ? String.fromCharCode(...bytes) : undefined;
165
+ }
166
+
167
+ set wantsRoomCode(code: string | undefined) {
168
+ if (!this.#hasValidBuffer()) {
169
+ throw new Error("NetContext dataView is not valid");
170
+ }
171
+ // Clear first
172
+ for (let i = 0; i < 8; i++) {
173
+ this.dataView!.setUint8(20 + i, 0);
174
+ }
175
+ if (code) {
176
+ // Write up to 7 chars (leave room for null terminator)
177
+ for (let i = 0; i < Math.min(code.length, 7); i++) {
178
+ this.dataView!.setUint8(20 + i, code.charCodeAt(i));
179
+ }
180
+ }
181
+ }
182
+
183
+ /** Game code sets this to request disconnection */
184
+ get wantsDisconnect(): boolean {
185
+ if (!this.#hasValidBuffer()) {
186
+ return false;
187
+ }
188
+ return this.dataView!.getUint8(28) !== 0;
189
+ }
190
+
191
+ set wantsDisconnect(value: boolean) {
192
+ if (!this.#hasValidBuffer()) {
193
+ throw new Error("NetContext dataView is not valid");
194
+ }
195
+ this.dataView!.setUint8(28, value ? 1 : 0);
196
+ }
197
+
198
+ /**
199
+ * Get all connected peers in the session.
200
+ * Returns peer info with seq/ack values.
201
+ *
202
+ * For the local peer:
203
+ * - seq = matchFrame (our current frame)
204
+ * - ack = minimum seq across all connected remote peers (-1 if none)
205
+ *
206
+ * For remote peers:
207
+ * - seq = their latest frame we've received (-1 if none)
208
+ * - ack = the frame they've acknowledged from us (-1 if none)
209
+ */
210
+ get peers(): PeerInfo[] {
211
+ if (!this.#hasValidBuffer()) {
212
+ throw new Error("NetContext dataView is not valid");
213
+ }
214
+
215
+ const dv = this.dataView!;
216
+ const localPeerId = this.localPeerId;
217
+ const matchFrame = this.matchFrame;
218
+
219
+ // Calculate local peer ack = min(seq) across connected remotes with packets
220
+ let minRemoteSeq = -1;
221
+ for (let i = 0; i < MAX_PEERS; i++) {
222
+ if (i === localPeerId) continue;
223
+ const peerOffset = PEERS_ARRAY_OFFSET + i * PEER_CTX_SIZE;
224
+ if (dv.getUint8(peerOffset + PEER_CONNECTED_OFFSET) !== 1) continue;
225
+ if (dv.getUint8(peerOffset + PEER_PACKET_COUNT_OFFSET) === 0) continue;
226
+ const seq = dv.getUint16(peerOffset + PEER_SEQ_OFFSET, true);
227
+ if (minRemoteSeq === -1 || seq < minRemoteSeq) {
228
+ minRemoteSeq = seq;
229
+ }
230
+ }
231
+
232
+ // Update pre-allocated peer objects and build result array
233
+ this.#peersResult.length = 0;
234
+ for (let i = 0; i < MAX_PEERS; i++) {
235
+ const peerOffset = PEERS_ARRAY_OFFSET + i * PEER_CTX_SIZE;
236
+ if (dv.getUint8(peerOffset + PEER_CONNECTED_OFFSET) !== 1) continue;
237
+
238
+ const peer = this.#peers[i];
239
+ if (!peer) {
240
+ throw new Error(`Unexpected missing peer object at index ${i}`);
241
+ }
242
+ const isLocal = i === localPeerId;
243
+ peer.isLocal = isLocal;
244
+
245
+ if (isLocal) {
246
+ peer.seq = matchFrame;
247
+ peer.ack = minRemoteSeq;
248
+ } else {
249
+ const packetCount = dv.getUint8(peerOffset + PEER_PACKET_COUNT_OFFSET);
250
+ const ackCount = dv.getUint8(peerOffset + PEER_ACK_COUNT_OFFSET);
251
+ peer.seq = packetCount === 0 ? -1 : dv.getUint16(peerOffset + PEER_SEQ_OFFSET, true);
252
+ peer.ack = ackCount === 0 ? -1 : dv.getUint16(peerOffset + PEER_ACK_OFFSET, true);
253
+ }
254
+ this.#peersResult.push(peer);
27
255
  }
28
- return this.dataView.getUint32(4, true);
256
+ return this.#peersResult;
29
257
  }
30
258
  }
package/js/defaultUrl.ts CHANGED
@@ -1 +1 @@
1
- export const DEFAULT_WASM_URL: URL = new URL("https://unpkg.com/@bloopjs/engine@0.0.80/wasm/bloop.wasm");
1
+ export const DEFAULT_WASM_URL: URL = new URL("https://unpkg.com/@bloopjs/engine@0.0.82/wasm/bloop.wasm");
package/js/wasmEngine.ts CHANGED
@@ -95,37 +95,12 @@ export type WasmEngine = {
95
95
  * End the current session
96
96
  */
97
97
  session_end: () => void;
98
- /**
99
- * Emit inputs for a peer at a given match frame
100
- * @param peer Peer ID (0-indexed)
101
- * @param match_frame Frame number relative to session start
102
- * @param events_ptr Pointer to Event array in WASM memory
103
- * @param events_len Number of events
104
- */
105
- session_emit_inputs: (
106
- peer: number,
107
- match_frame: number,
108
- events_ptr: EnginePointer,
109
- events_len: number,
110
- ) => void;
111
98
  /**
112
99
  * Get pointer to net context struct
113
100
  */
114
101
  get_net_ctx: () => EnginePointer;
115
102
 
116
103
  // Network / Packets
117
- /**
118
- * Set local peer ID for packet encoding
119
- */
120
- session_set_local_peer: (peer_id: number) => void;
121
- /**
122
- * Mark a peer as connected for packet management
123
- */
124
- session_peer_connect: (peer_id: number) => void;
125
- /**
126
- * Mark a peer as disconnected
127
- */
128
- session_peer_disconnect: (peer_id: number) => void;
129
104
  /**
130
105
  * Build an outbound packet for a target peer
131
106
  * Call get_outbound_packet() and get_outbound_packet_len() to retrieve the packet
@@ -139,17 +114,46 @@ export type WasmEngine = {
139
114
  * Get length of the outbound packet
140
115
  */
141
116
  get_outbound_packet_len: () => number;
117
+
118
+ // Network events
119
+ /**
120
+ * Emit NetJoinOk event - successfully joined a room
121
+ * @param room_code_ptr Pointer to room code string in WASM memory
122
+ * @param len Length of the room code (max 8)
123
+ */
124
+ emit_net_join_ok: (room_code_ptr: EnginePointer, len: number) => void;
125
+ /**
126
+ * Emit NetJoinFail event - failed to join a room
127
+ * @param reason Reason code (0=unknown, 1=timeout, 2=room_full, etc.)
128
+ */
129
+ emit_net_join_fail: (reason: number) => void;
130
+ /**
131
+ * Emit NetPeerJoin event - a peer joined the room
132
+ * @param peer_id Numeric peer ID (0-11)
133
+ */
134
+ emit_net_peer_join: (peer_id: number) => void;
142
135
  /**
143
- * Process a received packet
136
+ * Emit NetPeerLeave event - a peer left the room
137
+ * @param peer_id Numeric peer ID (0-11)
138
+ */
139
+ emit_net_peer_leave: (peer_id: number) => void;
140
+ /**
141
+ * Queue a received packet for processing in the next tick
144
142
  * @returns 0 on success, error code otherwise
145
143
  */
146
- receive_packet: (ptr: EnginePointer, len: number) => number;
144
+ emit_receive_packet: (ptr: EnginePointer, len: number) => EngineOk;
145
+
146
+ /**
147
+ * Initialize a session (derives peer count/local ID from prior events)
148
+ */
149
+ emit_net_session_init: () => void;
147
150
  /**
148
- * Get seq for a peer (latest frame received from them)
151
+ * End the current session (emits disconnect events for all peers)
149
152
  */
150
- get_peer_seq: (peer: number) => number;
153
+ emit_net_session_end: () => void;
151
154
  /**
152
- * Get ack for a peer (latest frame they acked from us)
155
+ * Assign local peer ID (for session setup)
156
+ * @param peer_id Local peer ID (0-11)
153
157
  */
154
- get_peer_ack: (peer: number) => number;
158
+ emit_net_peer_assign_local_id: (peer_id: number) => void;
155
159
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bloopjs/engine",
3
- "version": "0.0.80",
3
+ "version": "0.0.82",
4
4
  "type": "module",
5
5
  "repository": {
6
6
  "type": "git",
package/wasm/bloop.wasm CHANGED
Binary file