rollback-netcode 0.0.4
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/LICENSE +21 -0
- package/README.md +140 -0
- package/dist/debug.d.ts +29 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/debug.js +56 -0
- package/dist/debug.js.map +1 -0
- package/dist/index.d.ts +62 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +57 -0
- package/dist/index.js.map +1 -0
- package/dist/protocol/encoding.d.ts +80 -0
- package/dist/protocol/encoding.d.ts.map +1 -0
- package/dist/protocol/encoding.js +992 -0
- package/dist/protocol/encoding.js.map +1 -0
- package/dist/protocol/messages.d.ts +271 -0
- package/dist/protocol/messages.d.ts.map +1 -0
- package/dist/protocol/messages.js +114 -0
- package/dist/protocol/messages.js.map +1 -0
- package/dist/rollback/engine.d.ts +261 -0
- package/dist/rollback/engine.d.ts.map +1 -0
- package/dist/rollback/engine.js +543 -0
- package/dist/rollback/engine.js.map +1 -0
- package/dist/rollback/input-buffer.d.ts +225 -0
- package/dist/rollback/input-buffer.d.ts.map +1 -0
- package/dist/rollback/input-buffer.js +483 -0
- package/dist/rollback/input-buffer.js.map +1 -0
- package/dist/rollback/snapshot-buffer.d.ts +119 -0
- package/dist/rollback/snapshot-buffer.d.ts.map +1 -0
- package/dist/rollback/snapshot-buffer.js +256 -0
- package/dist/rollback/snapshot-buffer.js.map +1 -0
- package/dist/session/desync-manager.d.ts +106 -0
- package/dist/session/desync-manager.d.ts.map +1 -0
- package/dist/session/desync-manager.js +136 -0
- package/dist/session/desync-manager.js.map +1 -0
- package/dist/session/lag-monitor.d.ts +69 -0
- package/dist/session/lag-monitor.d.ts.map +1 -0
- package/dist/session/lag-monitor.js +74 -0
- package/dist/session/lag-monitor.js.map +1 -0
- package/dist/session/message-builders.d.ts +86 -0
- package/dist/session/message-builders.d.ts.map +1 -0
- package/dist/session/message-builders.js +199 -0
- package/dist/session/message-builders.js.map +1 -0
- package/dist/session/message-router.d.ts +61 -0
- package/dist/session/message-router.d.ts.map +1 -0
- package/dist/session/message-router.js +105 -0
- package/dist/session/message-router.js.map +1 -0
- package/dist/session/player-manager.d.ts +100 -0
- package/dist/session/player-manager.d.ts.map +1 -0
- package/dist/session/player-manager.js +160 -0
- package/dist/session/player-manager.js.map +1 -0
- package/dist/session/session.d.ts +379 -0
- package/dist/session/session.d.ts.map +1 -0
- package/dist/session/session.js +1294 -0
- package/dist/session/session.js.map +1 -0
- package/dist/session/topology.d.ts +66 -0
- package/dist/session/topology.d.ts.map +1 -0
- package/dist/session/topology.js +72 -0
- package/dist/session/topology.js.map +1 -0
- package/dist/transport/adapter.d.ts +99 -0
- package/dist/transport/adapter.d.ts.map +1 -0
- package/dist/transport/adapter.js +8 -0
- package/dist/transport/adapter.js.map +1 -0
- package/dist/transport/local.d.ts +192 -0
- package/dist/transport/local.d.ts.map +1 -0
- package/dist/transport/local.js +435 -0
- package/dist/transport/local.js.map +1 -0
- package/dist/transport/transforming.d.ts +177 -0
- package/dist/transport/transforming.d.ts.map +1 -0
- package/dist/transport/transforming.js +407 -0
- package/dist/transport/transforming.js.map +1 -0
- package/dist/transport/webrtc.d.ts +285 -0
- package/dist/transport/webrtc.d.ts.map +1 -0
- package/dist/transport/webrtc.js +734 -0
- package/dist/transport/webrtc.js.map +1 -0
- package/dist/types.d.ts +394 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +256 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/rate-limiter.d.ts +59 -0
- package/dist/utils/rate-limiter.d.ts.map +1 -0
- package/dist/utils/rate-limiter.js +93 -0
- package/dist/utils/rate-limiter.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebRTC transport implementation.
|
|
3
|
+
*
|
|
4
|
+
* Provides peer-to-peer communication using WebRTC DataChannels.
|
|
5
|
+
* Uses dual channels: reliable (ordered, guaranteed) and unreliable (best-effort).
|
|
6
|
+
*
|
|
7
|
+
* This implementation is signaling-agnostic - you must provide your own signaling
|
|
8
|
+
* mechanism (WebSocket, HTTP, etc.) to exchange SDP offers/answers and ICE candidates.
|
|
9
|
+
*/
|
|
10
|
+
import type { ConnectionMetrics, TransportAdapter } from "./adapter.js";
|
|
11
|
+
/**
|
|
12
|
+
* Configuration for the WebRTC transport.
|
|
13
|
+
*/
|
|
14
|
+
export interface WebRTCTransportConfig {
|
|
15
|
+
/** RTCPeerConnection configuration (STUN/TURN servers, etc.) */
|
|
16
|
+
rtcConfiguration?: RTCConfiguration;
|
|
17
|
+
/** Configuration for the reliable data channel */
|
|
18
|
+
reliableChannelConfig?: RTCDataChannelInit;
|
|
19
|
+
/** Configuration for the unreliable data channel */
|
|
20
|
+
unreliableChannelConfig?: RTCDataChannelInit;
|
|
21
|
+
/** Maximum reconnection attempts before giving up */
|
|
22
|
+
maxReconnectAttempts?: number;
|
|
23
|
+
/** Delay between reconnection attempts in milliseconds */
|
|
24
|
+
reconnectDelay?: number;
|
|
25
|
+
/** Interval for sending keepalive pings (0 to disable, default: 5000ms) */
|
|
26
|
+
keepaliveInterval?: number;
|
|
27
|
+
/** Time without response before considering peer dead (default: 15000ms) */
|
|
28
|
+
keepaliveTimeout?: number;
|
|
29
|
+
/** Timeout for connection establishment (default: 30000ms) */
|
|
30
|
+
connectionTimeout?: number;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* A signaling message to be sent to a remote peer.
|
|
34
|
+
* This is a discriminated union - check the `type` field to determine the payload.
|
|
35
|
+
*/
|
|
36
|
+
export type SignalMessage = {
|
|
37
|
+
type: "description";
|
|
38
|
+
description: RTCSessionDescriptionInit;
|
|
39
|
+
} | {
|
|
40
|
+
type: "candidate";
|
|
41
|
+
candidate: RTCIceCandidateInit;
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Callbacks for signaling integration.
|
|
45
|
+
* You must implement this to handle WebRTC signaling exchange.
|
|
46
|
+
*
|
|
47
|
+
* The unified `onSignal` callback receives all signaling messages (SDP and ICE),
|
|
48
|
+
* making it easier to route through a single signaling path.
|
|
49
|
+
*/
|
|
50
|
+
export interface SignalingCallbacks {
|
|
51
|
+
/**
|
|
52
|
+
* Called when a signaling message needs to be sent to a peer.
|
|
53
|
+
* The message should be serialized and sent through your signaling server.
|
|
54
|
+
*
|
|
55
|
+
* @param peerId - The target peer's ID
|
|
56
|
+
* @param signal - The signal message (either a description or candidate)
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* ```typescript
|
|
60
|
+
* transport.setSignalingCallbacks({
|
|
61
|
+
* onSignal: (peerId, signal) => {
|
|
62
|
+
* websocket.send(JSON.stringify({ to: peerId, signal }));
|
|
63
|
+
* }
|
|
64
|
+
* });
|
|
65
|
+
*
|
|
66
|
+
* // On the receiving side, parse and call:
|
|
67
|
+
* if (signal.type === 'description') {
|
|
68
|
+
* transport.handleRemoteDescription(fromPeerId, signal.description);
|
|
69
|
+
* } else {
|
|
70
|
+
* transport.handleRemoteCandidate(fromPeerId, signal.candidate);
|
|
71
|
+
* }
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
onSignal: (peerId: string, signal: SignalMessage) => void;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* WebRTC transport implementation.
|
|
78
|
+
*/
|
|
79
|
+
export declare class WebRTCTransport implements TransportAdapter {
|
|
80
|
+
readonly localPeerId: string;
|
|
81
|
+
private readonly rtcConfig;
|
|
82
|
+
private readonly reliableChannelConfig;
|
|
83
|
+
private readonly unreliableChannelConfig;
|
|
84
|
+
private readonly maxReconnectAttempts;
|
|
85
|
+
private readonly reconnectDelay;
|
|
86
|
+
private readonly keepaliveInterval;
|
|
87
|
+
private readonly keepaliveTimeout;
|
|
88
|
+
private readonly connectionTimeout;
|
|
89
|
+
private readonly peers;
|
|
90
|
+
private readonly _connectedPeers;
|
|
91
|
+
private readonly peerMetrics;
|
|
92
|
+
private signalingCallbacks;
|
|
93
|
+
private keepaliveTimer;
|
|
94
|
+
/** Callback for keepalive ping - set by Session to send Ping messages */
|
|
95
|
+
onKeepalivePing: ((peerId: string) => void) | null;
|
|
96
|
+
onMessage: ((peerId: string, message: Uint8Array) => void) | null;
|
|
97
|
+
onConnect: ((peerId: string) => void) | null;
|
|
98
|
+
onDisconnect: ((peerId: string) => void) | null;
|
|
99
|
+
onError: ((peerId: string | null, error: Error, context: string) => void) | null;
|
|
100
|
+
/**
|
|
101
|
+
* Create a new WebRTC transport.
|
|
102
|
+
*
|
|
103
|
+
* @param localPeerId - Unique identifier for this peer
|
|
104
|
+
* @param config - Optional configuration
|
|
105
|
+
*/
|
|
106
|
+
constructor(localPeerId: string, config?: WebRTCTransportConfig);
|
|
107
|
+
/**
|
|
108
|
+
* Set of currently connected peer IDs.
|
|
109
|
+
*/
|
|
110
|
+
get connectedPeers(): ReadonlySet<string>;
|
|
111
|
+
/**
|
|
112
|
+
* Set signaling callbacks for SDP and ICE candidate exchange.
|
|
113
|
+
* Must be called before initiating or accepting connections.
|
|
114
|
+
*
|
|
115
|
+
* @param callbacks - Signaling callbacks
|
|
116
|
+
*/
|
|
117
|
+
setSignalingCallbacks(callbacks: SignalingCallbacks): void;
|
|
118
|
+
/**
|
|
119
|
+
* Connect to a peer by creating an offer.
|
|
120
|
+
* This initiates the WebRTC connection handshake.
|
|
121
|
+
*
|
|
122
|
+
* @param peerId - The peer's ID
|
|
123
|
+
*/
|
|
124
|
+
connect(peerId: string): Promise<void>;
|
|
125
|
+
/**
|
|
126
|
+
* Create and send an offer to a peer.
|
|
127
|
+
*
|
|
128
|
+
* @param peerId - The peer's ID
|
|
129
|
+
*/
|
|
130
|
+
createOffer(peerId: string): Promise<void>;
|
|
131
|
+
/**
|
|
132
|
+
* Handle a remote SDP description (offer or answer).
|
|
133
|
+
*
|
|
134
|
+
* @param peerId - The peer's ID
|
|
135
|
+
* @param description - The SDP description
|
|
136
|
+
*/
|
|
137
|
+
handleRemoteDescription(peerId: string, description: RTCSessionDescriptionInit): Promise<void>;
|
|
138
|
+
/**
|
|
139
|
+
* Handle a remote ICE candidate.
|
|
140
|
+
*
|
|
141
|
+
* @param peerId - The peer's ID
|
|
142
|
+
* @param candidate - The ICE candidate
|
|
143
|
+
*/
|
|
144
|
+
handleRemoteCandidate(peerId: string, candidate: RTCIceCandidateInit): Promise<void>;
|
|
145
|
+
/**
|
|
146
|
+
* Disconnect from a peer.
|
|
147
|
+
*
|
|
148
|
+
* @param peerId - The peer's ID
|
|
149
|
+
*/
|
|
150
|
+
disconnect(peerId: string): void;
|
|
151
|
+
/**
|
|
152
|
+
* Disconnect from all peers.
|
|
153
|
+
*/
|
|
154
|
+
disconnectAll(): void;
|
|
155
|
+
/**
|
|
156
|
+
* Destroy the transport and clean up all resources.
|
|
157
|
+
*/
|
|
158
|
+
destroy(): void;
|
|
159
|
+
/**
|
|
160
|
+
* Send a message to a peer.
|
|
161
|
+
*
|
|
162
|
+
* @param peerId - The peer's ID
|
|
163
|
+
* @param message - The message data
|
|
164
|
+
* @param reliable - Whether to use the reliable channel
|
|
165
|
+
*/
|
|
166
|
+
send(peerId: string, message: Uint8Array, reliable: boolean): void;
|
|
167
|
+
/**
|
|
168
|
+
* Broadcast a message to all connected peers.
|
|
169
|
+
*
|
|
170
|
+
* @param message - The message data
|
|
171
|
+
* @param reliable - Whether to use the reliable channel
|
|
172
|
+
*/
|
|
173
|
+
broadcast(message: Uint8Array, reliable: boolean): void;
|
|
174
|
+
/**
|
|
175
|
+
* Get connection statistics for a peer.
|
|
176
|
+
*
|
|
177
|
+
* @param peerId - The peer's ID
|
|
178
|
+
* @returns Connection stats or null if not connected
|
|
179
|
+
*/
|
|
180
|
+
getConnectionStats(peerId: string): Promise<RTCStatsReport | null>;
|
|
181
|
+
/**
|
|
182
|
+
* Get or create a peer connection.
|
|
183
|
+
*/
|
|
184
|
+
private getOrCreatePeer;
|
|
185
|
+
/**
|
|
186
|
+
* Set up event handlers for a peer connection.
|
|
187
|
+
*/
|
|
188
|
+
private setupPeerConnection;
|
|
189
|
+
/**
|
|
190
|
+
* Set up event handlers for a data channel.
|
|
191
|
+
*/
|
|
192
|
+
private setupDataChannel;
|
|
193
|
+
/**
|
|
194
|
+
* Check if both data channels are ready and mark connection as established.
|
|
195
|
+
*/
|
|
196
|
+
private checkConnectionReady;
|
|
197
|
+
/**
|
|
198
|
+
* Handle a connection failure.
|
|
199
|
+
*/
|
|
200
|
+
private handleConnectionFailure;
|
|
201
|
+
/**
|
|
202
|
+
* Calculate reconnection delay with exponential backoff.
|
|
203
|
+
*
|
|
204
|
+
* @param attempt - The reconnection attempt number (1-based)
|
|
205
|
+
* @returns The base delay in milliseconds
|
|
206
|
+
*/
|
|
207
|
+
private getReconnectDelay;
|
|
208
|
+
/**
|
|
209
|
+
* Calculate reconnection delay with exponential backoff and jitter.
|
|
210
|
+
* Jitter prevents multiple peers from reconnecting at exactly the same time.
|
|
211
|
+
*
|
|
212
|
+
* @param attempt - The reconnection attempt number (1-based)
|
|
213
|
+
* @returns The delay in milliseconds with random jitter applied
|
|
214
|
+
*/
|
|
215
|
+
private getReconnectDelayWithJitter;
|
|
216
|
+
/**
|
|
217
|
+
* Attempt to reconnect to a peer.
|
|
218
|
+
*/
|
|
219
|
+
private attemptReconnect;
|
|
220
|
+
/**
|
|
221
|
+
* Clean up a peer connection.
|
|
222
|
+
*/
|
|
223
|
+
private cleanupPeer;
|
|
224
|
+
/**
|
|
225
|
+
* Get connection quality metrics for a peer.
|
|
226
|
+
*
|
|
227
|
+
* @param peerId - The peer's ID
|
|
228
|
+
* @returns Connection metrics or null if not available
|
|
229
|
+
*/
|
|
230
|
+
getConnectionMetrics(peerId: string): ConnectionMetrics | null;
|
|
231
|
+
/**
|
|
232
|
+
* Record a ping sent to a peer for RTT tracking.
|
|
233
|
+
* Call this when sending a Ping message.
|
|
234
|
+
*
|
|
235
|
+
* @param peerId - The peer's ID
|
|
236
|
+
* @param timestamp - The timestamp sent in the ping
|
|
237
|
+
*/
|
|
238
|
+
recordPingSent(peerId: string, timestamp: number): void;
|
|
239
|
+
/**
|
|
240
|
+
* Record a pong received from a peer for RTT calculation.
|
|
241
|
+
* Call this when receiving a Pong message.
|
|
242
|
+
*
|
|
243
|
+
* @param peerId - The peer's ID
|
|
244
|
+
* @param timestamp - The timestamp from the pong (originally from our ping)
|
|
245
|
+
*/
|
|
246
|
+
recordPongReceived(peerId: string, timestamp: number): void;
|
|
247
|
+
/**
|
|
248
|
+
* Update packet loss estimate.
|
|
249
|
+
* Call this when detecting gaps in received input acks.
|
|
250
|
+
*
|
|
251
|
+
* @param peerId - The peer's ID
|
|
252
|
+
* @param received - Number of packets received
|
|
253
|
+
* @param expected - Number of packets expected
|
|
254
|
+
*/
|
|
255
|
+
updatePacketLoss(peerId: string, received: number, expected: number): void;
|
|
256
|
+
/**
|
|
257
|
+
* Get or create metrics data for a peer.
|
|
258
|
+
*/
|
|
259
|
+
private getOrCreateMetrics;
|
|
260
|
+
/**
|
|
261
|
+
* Start the keepalive timer.
|
|
262
|
+
*/
|
|
263
|
+
private startKeepaliveTimer;
|
|
264
|
+
/**
|
|
265
|
+
* Stop the keepalive timer.
|
|
266
|
+
*/
|
|
267
|
+
private stopKeepaliveTimer;
|
|
268
|
+
/**
|
|
269
|
+
* Check keepalive status for all connected peers.
|
|
270
|
+
* Sends pings and detects dead connections.
|
|
271
|
+
*/
|
|
272
|
+
private checkKeepalives;
|
|
273
|
+
/**
|
|
274
|
+
* Record that we received a response from a peer.
|
|
275
|
+
* Call this when any message is received from a peer.
|
|
276
|
+
*
|
|
277
|
+
* @param peerId - The peer's ID
|
|
278
|
+
*/
|
|
279
|
+
recordPeerResponse(peerId: string): void;
|
|
280
|
+
/**
|
|
281
|
+
* Update RTT metrics with a new sample.
|
|
282
|
+
*/
|
|
283
|
+
private updateRttMetrics;
|
|
284
|
+
}
|
|
285
|
+
//# sourceMappingURL=webrtc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webrtc.d.ts","sourceRoot":"","sources":["../../src/transport/webrtc.ts"],"names":[],"mappings":"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"}
|