@lagless/relay-client 0.0.33

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.
@@ -0,0 +1,5 @@
1
+ export * from './lib/types.js';
2
+ export { RelayConnection, type RelayConnectionEvents } from './lib/relay-connection.js';
3
+ export { RelayInputProvider } from './lib/relay-input-provider.js';
4
+ export type { ServerHelloData } from '@lagless/net-wire';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,KAAK,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AACxF,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export * from './lib/types.js';
2
+ export { RelayConnection } from './lib/relay-connection.js';
3
+ export { RelayInputProvider } from './lib/relay-input-provider.js';
@@ -0,0 +1,37 @@
1
+ import { type ServerHelloData, type FanoutData, type CancelInputData, type PongData, type TickInputData, type StateResponseData, type PlayerFinishedData } from '@lagless/net-wire';
2
+ import { type RelayConnectionConfig } from './types.js';
3
+ export interface RelayConnectionEvents {
4
+ onServerHello(data: ServerHelloData): void;
5
+ onTickInputFanout(data: FanoutData): void;
6
+ onCancelInput(data: CancelInputData): void;
7
+ onPong(data: PongData): void;
8
+ onStateRequest(requestId: number): void;
9
+ onStateResponse(data: StateResponseData): void;
10
+ onConnected(): void;
11
+ onDisconnected(): void;
12
+ }
13
+ /**
14
+ * Thin WebSocket wrapper for relay server communication.
15
+ * Handles binary protocol parsing and ping interval management.
16
+ */
17
+ export declare class RelayConnection {
18
+ private readonly _config;
19
+ private readonly _events;
20
+ private _ws;
21
+ private _pingInterval;
22
+ private _pingCount;
23
+ private _connected;
24
+ constructor(_config: RelayConnectionConfig, _events: RelayConnectionEvents);
25
+ get isConnected(): boolean;
26
+ connect(): void;
27
+ disconnect(): void;
28
+ sendTickInputBatch(inputs: ReadonlyArray<TickInputData>): void;
29
+ sendStateResponse(data: StateResponseData): void;
30
+ sendPlayerFinished(data: PlayerFinishedData): void;
31
+ sendPing(): void;
32
+ private sendBinary;
33
+ private handleBinaryMessage;
34
+ private startPingInterval;
35
+ private stopPingInterval;
36
+ }
37
+ //# sourceMappingURL=relay-connection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay-connection.d.ts","sourceRoot":"","sources":["../../src/lib/relay-connection.ts"],"names":[],"mappings":"AACA,OAAO,EAaL,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACxB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,KAAK,qBAAqB,EAI3B,MAAM,YAAY,CAAC;AAMpB,MAAM,WAAW,qBAAqB;IACpC,aAAa,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,CAAC;IAC3C,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC;IAC1C,aAAa,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,CAAC;IAC3C,MAAM,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC7B,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,eAAe,CAAC,IAAI,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC/C,WAAW,IAAI,IAAI,CAAC;IACpB,cAAc,IAAI,IAAI,CAAC;CACxB;AAID;;;GAGG;AACH,qBAAa,eAAe;IAOxB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAP1B,OAAO,CAAC,GAAG,CAA0B;IACrC,OAAO,CAAC,aAAa,CAA+C;IACpE,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,UAAU,CAAS;gBAGR,OAAO,EAAE,qBAAqB,EAC9B,OAAO,EAAE,qBAAqB;IAGjD,IAAW,WAAW,IAAI,OAAO,CAEhC;IAEM,OAAO,IAAI,IAAI;IA2Cf,UAAU,IAAI,IAAI;IAclB,kBAAkB,CAAC,MAAM,EAAE,aAAa,CAAC,aAAa,CAAC,GAAG,IAAI;IAK9D,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,GAAG,IAAI;IAIhD,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,GAAG,IAAI;IAIlD,QAAQ,IAAI,IAAI;IAMvB,OAAO,CAAC,UAAU;IAKlB,OAAO,CAAC,mBAAmB;IA6B3B,OAAO,CAAC,iBAAiB;IAgBzB,OAAO,CAAC,gBAAgB;CAMzB"}
@@ -0,0 +1,139 @@
1
+ import { createLogger } from '@lagless/misc';
2
+ import { MsgType, unpackHeader, unpackServerHello, unpackTickInputFanout, unpackCancelInput, unpackPong, unpackStateRequest, unpackStateResponse, packTickInputBatch, packPing, packStateResponse, packPlayerFinished, } from '@lagless/net-wire';
3
+ import { PING_WARMUP_INTERVAL_MS, PING_WARMUP_COUNT, PING_STEADY_INTERVAL_MS, } from './types.js';
4
+ const log = createLogger('RelayConnection');
5
+ // ─── RelayConnection ────────────────────────────────────────
6
+ /**
7
+ * Thin WebSocket wrapper for relay server communication.
8
+ * Handles binary protocol parsing and ping interval management.
9
+ */
10
+ export class RelayConnection {
11
+ _config;
12
+ _events;
13
+ _ws = null;
14
+ _pingInterval = null;
15
+ _pingCount = 0;
16
+ _connected = false;
17
+ constructor(_config, _events) {
18
+ this._config = _config;
19
+ this._events = _events;
20
+ }
21
+ get isConnected() {
22
+ return this._connected;
23
+ }
24
+ connect() {
25
+ if (this._ws) {
26
+ // Allow reconnect if previous WS is already closed/closing
27
+ if (this._ws.readyState === WebSocket.CLOSED || this._ws.readyState === WebSocket.CLOSING) {
28
+ this._ws = null;
29
+ }
30
+ else {
31
+ log.warn('Already connected, ignoring connect()');
32
+ return;
33
+ }
34
+ }
35
+ const url = `${this._config.serverUrl}/match/${this._config.matchId}?token=${encodeURIComponent(this._config.token)}`;
36
+ log.info(`Connecting to ${url}`);
37
+ this._ws = new WebSocket(url);
38
+ this._ws.binaryType = 'arraybuffer';
39
+ this._ws.onopen = () => {
40
+ this._connected = true;
41
+ log.info('Connected');
42
+ this.startPingInterval();
43
+ this._events.onConnected();
44
+ };
45
+ this._ws.onmessage = (event) => {
46
+ if (event.data instanceof ArrayBuffer) {
47
+ this.handleBinaryMessage(event.data);
48
+ }
49
+ };
50
+ this._ws.onclose = () => {
51
+ this._connected = false;
52
+ this._ws = null;
53
+ this.stopPingInterval();
54
+ log.info('Disconnected');
55
+ this._events.onDisconnected();
56
+ };
57
+ this._ws.onerror = () => {
58
+ log.error('WebSocket error');
59
+ };
60
+ }
61
+ disconnect() {
62
+ this.stopPingInterval();
63
+ if (this._ws) {
64
+ this._ws.onclose = null;
65
+ this._ws.onmessage = null;
66
+ this._ws.onerror = null;
67
+ this._ws.close();
68
+ this._ws = null;
69
+ }
70
+ this._connected = false;
71
+ }
72
+ // ─── Sending ──────────────────────────────────────────
73
+ sendTickInputBatch(inputs) {
74
+ if (inputs.length === 0)
75
+ return;
76
+ this.sendBinary(packTickInputBatch(inputs));
77
+ }
78
+ sendStateResponse(data) {
79
+ this.sendBinary(packStateResponse(data));
80
+ }
81
+ sendPlayerFinished(data) {
82
+ this.sendBinary(packPlayerFinished(data));
83
+ }
84
+ sendPing() {
85
+ this.sendBinary(packPing(performance.now()));
86
+ }
87
+ // ─── Private ──────────────────────────────────────────
88
+ sendBinary(data) {
89
+ if (!this._ws || this._ws.readyState !== WebSocket.OPEN)
90
+ return;
91
+ this._ws.send(data);
92
+ }
93
+ handleBinaryMessage(data) {
94
+ if (data.byteLength < 2)
95
+ return;
96
+ const header = unpackHeader(data);
97
+ switch (header.type) {
98
+ case MsgType.ServerHello:
99
+ this._events.onServerHello(unpackServerHello(data));
100
+ break;
101
+ case MsgType.TickInputFanout:
102
+ this._events.onTickInputFanout(unpackTickInputFanout(data));
103
+ break;
104
+ case MsgType.CancelInput:
105
+ this._events.onCancelInput(unpackCancelInput(data));
106
+ break;
107
+ case MsgType.Pong:
108
+ this._events.onPong(unpackPong(data));
109
+ break;
110
+ case MsgType.StateRequest:
111
+ this._events.onStateRequest(unpackStateRequest(data));
112
+ break;
113
+ case MsgType.StateResponse:
114
+ this._events.onStateResponse(unpackStateResponse(data));
115
+ break;
116
+ default:
117
+ log.warn(`Unknown message type: ${header.type}`);
118
+ }
119
+ }
120
+ startPingInterval() {
121
+ this.stopPingInterval();
122
+ this._pingCount = 0;
123
+ this.sendPing();
124
+ this._pingInterval = setInterval(() => {
125
+ this.sendPing();
126
+ this._pingCount++;
127
+ if (this._pingCount === PING_WARMUP_COUNT) {
128
+ this.stopPingInterval();
129
+ this._pingInterval = setInterval(() => this.sendPing(), PING_STEADY_INTERVAL_MS);
130
+ }
131
+ }, PING_WARMUP_INTERVAL_MS);
132
+ }
133
+ stopPingInterval() {
134
+ if (this._pingInterval !== null) {
135
+ clearInterval(this._pingInterval);
136
+ this._pingInterval = null;
137
+ }
138
+ }
139
+ }
@@ -0,0 +1,105 @@
1
+ import { AbstractInputProvider, type InputRegistry, type ECSConfig } from '@lagless/core';
2
+ import { ClockSync, InputDelayController, type ServerHelloData, type StateResponseData, type FanoutData, type CancelInputData, type PongData } from '@lagless/net-wire';
3
+ import type { RelayConnection } from './relay-connection.js';
4
+ /**
5
+ * Input provider for relay-based multiplayer.
6
+ *
7
+ * Handles:
8
+ * - Local input prediction (adds to history + sends to server)
9
+ * - Remote input injection (from TickInputFanout)
10
+ * - CancelInput rollback
11
+ * - Clock synchronization
12
+ * - Adaptive input delay
13
+ * - State transfer for late-join
14
+ */
15
+ export declare class RelayInputProvider extends AbstractInputProvider {
16
+ playerSlot: number;
17
+ private readonly _clockSync;
18
+ private readonly _inputDelayController;
19
+ private readonly _serverHello;
20
+ private _resolveServerHello;
21
+ private _firstHelloReceived;
22
+ private _connection;
23
+ private _rollbackCount;
24
+ /**
25
+ * Minimum tick that needs rollback. Consumed (reset) each frame by
26
+ * `getInvalidateRollbackTick()`.
27
+ */
28
+ private _invalidateRollbackTick;
29
+ constructor(playerSlot: number, ecsConfig: ECSConfig, inputRegistry: InputRegistry);
30
+ get clockSync(): ClockSync;
31
+ get inputDelayController(): InputDelayController;
32
+ get rollbackCount(): number;
33
+ /**
34
+ * Resolves with the first ServerHello received from the server.
35
+ * Await this before creating the ECSSimulation to ensure the
36
+ * correct PRNG seed is available for ECSConfig.
37
+ */
38
+ get serverHello(): Promise<ServerHelloData>;
39
+ get connection(): RelayConnection | null;
40
+ setConnection(connection: RelayConnection): void;
41
+ getInvalidateRollbackTick(): number | undefined;
42
+ update(): void;
43
+ /**
44
+ * Handle ServerHello from server.
45
+ *
46
+ * First call: resolves the `serverHello` promise so the game client
47
+ * can create ECSConfig with the correct seed before constructing the simulation.
48
+ *
49
+ * Subsequent calls (reconnect): syncs the simulation clock to the
50
+ * server's tick so client inputs are not rejected as TooOld.
51
+ */
52
+ handleServerHello(data: ServerHelloData): void;
53
+ /**
54
+ * Handle TickInputFanout from server.
55
+ * Adds remote inputs to history, triggers rollback if needed.
56
+ */
57
+ handleTickInputFanout(data: FanoutData): void;
58
+ /**
59
+ * Handle CancelInput from server.
60
+ * Removes the rejected input and triggers rollback.
61
+ */
62
+ handleCancelInput(data: CancelInputData): void;
63
+ /**
64
+ * Handle Pong from server.
65
+ * Updates clock sync, corrects clock drift, and adjusts input delay.
66
+ */
67
+ handlePong(data: PongData): void;
68
+ /**
69
+ * Handle StateRequest from server (for late-join state transfer).
70
+ * Exports current simulation state and sends to server.
71
+ */
72
+ handleStateRequest(requestId: number): void;
73
+ /**
74
+ * Handle StateResponse from server (reconnect state transfer).
75
+ * Applies the received state to the simulation and resets all provider state.
76
+ */
77
+ handleStateResponse(data: StateResponseData): void;
78
+ /**
79
+ * Sync the simulation clock to the server's tick.
80
+ * Used on reconnect — the state transfer will overwrite everything else.
81
+ */
82
+ private _syncClockToServer;
83
+ /**
84
+ * Send this frame's local inputs to the server as a single batch.
85
+ */
86
+ private sendBufferedInputs;
87
+ /**
88
+ * Convert a TickInputData (from network) to an RPC (for history).
89
+ */
90
+ private tickInputToRPC;
91
+ /**
92
+ * Pack an RPC's data into binary payload for network transmission.
93
+ */
94
+ private packRpcPayload;
95
+ /**
96
+ * Unpack binary payload into input data.
97
+ */
98
+ private unpackInputPayload;
99
+ /**
100
+ * Request a rollback to a specific tick.
101
+ * Keeps the minimum (earliest) tick that needs rollback.
102
+ */
103
+ private requestRollback;
104
+ }
105
+ //# sourceMappingURL=relay-input-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay-input-provider.d.ts","sourceRoot":"","sources":["../../src/lib/relay-input-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAO,KAAK,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AAG/F,OAAO,EACL,SAAS,EAAE,oBAAoB,EAE/B,KAAK,eAAe,EAAE,KAAK,iBAAiB,EAC5C,KAAK,UAAU,EAAE,KAAK,eAAe,EAAE,KAAK,QAAQ,EACrD,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAI7D;;;;;;;;;;GAUG;AACH,qBAAa,kBAAmB,SAAQ,qBAAqB;IAC3C,UAAU,EAAE,MAAM,CAAC;IAEnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAY;IACvC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAuB;IAC7D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA2B;IACxD,OAAO,CAAC,mBAAmB,CAAmC;IAC9D,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,WAAW,CAAgC;IACnD,OAAO,CAAC,cAAc,CAAK;IAE3B;;;OAGG;IACH,OAAO,CAAC,uBAAuB,CAAiC;gBAG9D,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,SAAS,EACpB,aAAa,EAAE,aAAa;IAiB9B,IAAW,SAAS,IAAI,SAAS,CAEhC;IAED,IAAW,oBAAoB,IAAI,oBAAoB,CAEtD;IAED,IAAW,aAAa,IAAI,MAAM,CAEjC;IAED;;;;OAIG;IACH,IAAW,WAAW,IAAI,OAAO,CAAC,eAAe,CAAC,CAEjD;IAID,IAAW,UAAU,IAAI,eAAe,GAAG,IAAI,CAE9C;IAEM,aAAa,CAAC,UAAU,EAAE,eAAe,GAAG,IAAI;IAMvC,yBAAyB,IAAI,MAAM,GAAG,SAAS;IAM/C,MAAM,IAAI,IAAI;IAQ9B;;;;;;;;OAQG;IACI,iBAAiB,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI;IAWrD;;;OAGG;IACI,qBAAqB,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IA8BpD;;;OAGG;IACI,iBAAiB,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI;IAUrD;;;OAGG;IACI,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;IA4CvC;;;OAGG;IACI,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAoBlD;;;OAGG;IACI,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,GAAG,IAAI;IAkBzD;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAQ1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAsB1B;;OAEG;IACH,OAAO,CAAC,cAAc;IAiBtB;;OAEG;IACH,OAAO,CAAC,cAAc;IAStB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAc1B;;;OAGG;IACH,OAAO,CAAC,eAAe;CAMxB"}
@@ -0,0 +1,284 @@
1
+ import { AbstractInputProvider, RPC } from '@lagless/core';
2
+ // eslint-disable-next-line @nx/enforce-module-boundaries -- direct dep, used for input payload packing
3
+ import { InputBinarySchema } from '@lagless/binary';
4
+ import { ClockSync, InputDelayController, TickInputKind, } from '@lagless/net-wire';
5
+ import { createLogger } from '@lagless/misc';
6
+ const log = createLogger('RelayInputProvider');
7
+ /**
8
+ * Input provider for relay-based multiplayer.
9
+ *
10
+ * Handles:
11
+ * - Local input prediction (adds to history + sends to server)
12
+ * - Remote input injection (from TickInputFanout)
13
+ * - CancelInput rollback
14
+ * - Clock synchronization
15
+ * - Adaptive input delay
16
+ * - State transfer for late-join
17
+ */
18
+ export class RelayInputProvider extends AbstractInputProvider {
19
+ playerSlot;
20
+ _clockSync;
21
+ _inputDelayController;
22
+ _serverHello;
23
+ _resolveServerHello;
24
+ _firstHelloReceived = false;
25
+ _connection = null;
26
+ _rollbackCount = 0;
27
+ /**
28
+ * Minimum tick that needs rollback. Consumed (reset) each frame by
29
+ * `getInvalidateRollbackTick()`.
30
+ */
31
+ _invalidateRollbackTick = undefined;
32
+ constructor(playerSlot, ecsConfig, inputRegistry) {
33
+ super(ecsConfig, inputRegistry);
34
+ this.playerSlot = playerSlot;
35
+ this._clockSync = new ClockSync();
36
+ this._inputDelayController = new InputDelayController(ecsConfig.minInputDelayTick, ecsConfig.maxInputDelayTick, ecsConfig.initialInputDelayTick);
37
+ this._serverHello = new Promise((resolve) => {
38
+ this._resolveServerHello = resolve;
39
+ });
40
+ }
41
+ // ─── Public Getters ─────────────────────────────────────
42
+ get clockSync() {
43
+ return this._clockSync;
44
+ }
45
+ get inputDelayController() {
46
+ return this._inputDelayController;
47
+ }
48
+ get rollbackCount() {
49
+ return this._rollbackCount;
50
+ }
51
+ /**
52
+ * Resolves with the first ServerHello received from the server.
53
+ * Await this before creating the ECSSimulation to ensure the
54
+ * correct PRNG seed is available for ECSConfig.
55
+ */
56
+ get serverHello() {
57
+ return this._serverHello;
58
+ }
59
+ // ─── Connection ─────────────────────────────────────────
60
+ get connection() {
61
+ return this._connection;
62
+ }
63
+ setConnection(connection) {
64
+ this._connection = connection;
65
+ }
66
+ // ─── AbstractInputProvider overrides ────────────────────
67
+ getInvalidateRollbackTick() {
68
+ const tick = this._invalidateRollbackTick;
69
+ this._invalidateRollbackTick = undefined;
70
+ return tick;
71
+ }
72
+ update() {
73
+ super.update();
74
+ this.sendBufferedInputs();
75
+ }
76
+ // ─── Network Event Handlers ─────────────────────────────
77
+ // Called by RelayConnection (or directly in tests)
78
+ /**
79
+ * Handle ServerHello from server.
80
+ *
81
+ * First call: resolves the `serverHello` promise so the game client
82
+ * can create ECSConfig with the correct seed before constructing the simulation.
83
+ *
84
+ * Subsequent calls (reconnect): syncs the simulation clock to the
85
+ * server's tick so client inputs are not rejected as TooOld.
86
+ */
87
+ handleServerHello(data) {
88
+ if (!this._firstHelloReceived) {
89
+ this._firstHelloReceived = true;
90
+ this._resolveServerHello(data);
91
+ return;
92
+ }
93
+ // Reconnect: sync clock only (state transfer will overwrite everything)
94
+ this._syncClockToServer(data);
95
+ }
96
+ /**
97
+ * Handle TickInputFanout from server.
98
+ * Adds remote inputs to history, triggers rollback if needed.
99
+ */
100
+ handleTickInputFanout(data) {
101
+ const currentTick = this._simulation?.tick ?? 0;
102
+ for (const input of data.inputs) {
103
+ // Skip our own client inputs — already in history from prediction
104
+ if (input.kind === TickInputKind.Client && input.playerSlot === this.playerSlot) {
105
+ log.debug(`Fanout SKIP own: tick=${input.tick} slot=${input.playerSlot} seq=${input.seq}`);
106
+ continue;
107
+ }
108
+ const rpc = this.tickInputToRPC(input);
109
+ this.addRemoteRpc(rpc);
110
+ const needsRollback = input.tick <= currentTick;
111
+ log.debug(`Fanout REMOTE: inputId=${rpc.inputId} tick=${input.tick} slot=${input.playerSlot} kind=${input.kind} seq=${input.seq} localTick=${currentTick} rollback=${needsRollback}`);
112
+ // If remote input is for a tick we already simulated → need rollback
113
+ if (needsRollback) {
114
+ this.requestRollback(input.tick);
115
+ }
116
+ }
117
+ // Update PhaseNudger with server's authoritative tick
118
+ if (this._simulation) {
119
+ this._simulation.clock.phaseNudger.onServerTickHint(data.serverTick, this._simulation.tick);
120
+ }
121
+ }
122
+ /**
123
+ * Handle CancelInput from server.
124
+ * Removes the rejected input and triggers rollback.
125
+ */
126
+ handleCancelInput(data) {
127
+ const reasonNames = ['TooOld', 'TooFarFuture', 'InvalidSlot'];
128
+ log.warn(`CANCEL received: tick=${data.tick} seq=${data.seq} slot=${data.playerSlot} reason=${reasonNames[data.reason] ?? data.reason}`);
129
+ this.removeRpcAt(data.playerSlot, data.tick, data.seq);
130
+ this.requestRollback(data.tick);
131
+ }
132
+ /**
133
+ * Handle Pong from server.
134
+ * Updates clock sync, corrects clock drift, and adjusts input delay.
135
+ */
136
+ handlePong(data) {
137
+ const clientReceiveMs = performance.now();
138
+ const becameReady = this._clockSync.updateFromPong(clientReceiveMs, data);
139
+ if (becameReady && this._simulation) {
140
+ this._simulation.clock.phaseNudger.activate();
141
+ }
142
+ // Correct clock drift using server tick from Pong
143
+ if (this._simulation) {
144
+ const rtt = clientReceiveMs - data.cSend;
145
+ const oneWayTicks = Math.round((rtt / 2) / this._frameLength);
146
+ const estimatedServerTick = data.sTick + oneWayTicks;
147
+ const localTargetTick = Math.floor(this._simulation.clock.accumulatedTime / this._frameLength);
148
+ const drift = estimatedServerTick - localTargetTick;
149
+ if (this._simulation.clock.phaseNudger.isActive) {
150
+ // PhaseNudger active: feed it server tick hints from Pong
151
+ // (breaks deadlock where rejected inputs → no fanout → no hints)
152
+ this._simulation.clock.phaseNudger.onServerTickHint(estimatedServerTick, this._simulation.tick);
153
+ }
154
+ else if (Math.abs(drift) > 1) {
155
+ // PhaseNudger not yet active: hard sync if drifted more than 1 tick
156
+ const correctionMs = drift * this._frameLength;
157
+ log.info(`Pong clock correction: drift=${drift} ticks, localTarget=${localTargetTick} estServer=${estimatedServerTick} rtt=${rtt.toFixed(1)}ms`);
158
+ this._simulation.clock.setAccumulatedTime(this._simulation.clock.accumulatedTime + correctionMs);
159
+ }
160
+ }
161
+ // Recompute input delay based on network conditions
162
+ if (this._clockSync.isReady) {
163
+ const newDelay = this._inputDelayController.recompute(this._frameLength, this._clockSync.rttEwmaMs, this._clockSync.jitterEwmaMs);
164
+ this.setInputDelay(newDelay);
165
+ }
166
+ }
167
+ /**
168
+ * Handle StateRequest from server (for late-join state transfer).
169
+ * Exports current simulation state and sends to server.
170
+ */
171
+ handleStateRequest(requestId) {
172
+ if (!this._simulation) {
173
+ log.warn('StateRequest received but simulation not initialized');
174
+ return;
175
+ }
176
+ const state = this._simulation.mem.exportSnapshot();
177
+ const tick = this._simulation.tick;
178
+ const hash = this._simulation.mem.getHash();
179
+ log.info(`Responding to StateRequest #${requestId}: tick=${tick}, hash=0x${hash.toString(16)}`);
180
+ this._connection?.sendStateResponse({
181
+ requestId,
182
+ tick,
183
+ hash,
184
+ state,
185
+ });
186
+ }
187
+ /**
188
+ * Handle StateResponse from server (reconnect state transfer).
189
+ * Applies the received state to the simulation and resets all provider state.
190
+ */
191
+ handleStateResponse(data) {
192
+ if (!this._simulation) {
193
+ log.warn('StateResponse received but simulation not initialized');
194
+ return;
195
+ }
196
+ log.info(`State transfer: tick=${data.tick}, hash=0x${data.hash.toString(16)}, size=${data.state.byteLength}`);
197
+ this._simulation.applyExternalState(data.state, data.tick);
198
+ this._rpcHistory.clear();
199
+ this._invalidateRollbackTick = undefined;
200
+ this._clockSync.reset();
201
+ this._currentInputDelay = this.ecsConfig.initialInputDelayTick;
202
+ this.resetSequences();
203
+ }
204
+ // ─── Private ──────────────────────────────────────────
205
+ /**
206
+ * Sync the simulation clock to the server's tick.
207
+ * Used on reconnect — the state transfer will overwrite everything else.
208
+ */
209
+ _syncClockToServer(data) {
210
+ if (!this._simulation)
211
+ return;
212
+ const beforeTick = this._simulation.tick;
213
+ this._simulation.clock.setAccumulatedTime(data.serverTick * this._frameLength);
214
+ log.info(`Clock synced: beforeTick=${beforeTick} → serverTick=${data.serverTick} (${(data.serverTick * this._frameLength).toFixed(0)}ms) playerSlot=${this.playerSlot}`);
215
+ }
216
+ /**
217
+ * Send this frame's local inputs to the server as a single batch.
218
+ */
219
+ sendBufferedInputs() {
220
+ if (!this._connection)
221
+ return;
222
+ const buffer = this.getFrameRPCBuffer();
223
+ if (buffer.length === 0)
224
+ return;
225
+ const inputs = [];
226
+ for (const rpc of buffer) {
227
+ log.debug(`SEND: inputId=${rpc.inputId} tick=${rpc.meta.tick} slot=${rpc.meta.playerSlot} seq=${rpc.meta.seq} simTick=${this._simulation?.tick ?? '?'}`);
228
+ inputs.push({
229
+ tick: rpc.meta.tick,
230
+ playerSlot: rpc.meta.playerSlot,
231
+ seq: rpc.meta.seq,
232
+ kind: TickInputKind.Client,
233
+ payload: this.packRpcPayload(rpc),
234
+ });
235
+ }
236
+ log.debug(`SEND BATCH: ${inputs.length} inputs, wsOpen=${this._connection.isConnected}`);
237
+ this._connection.sendTickInputBatch(inputs);
238
+ }
239
+ /**
240
+ * Convert a TickInputData (from network) to an RPC (for history).
241
+ */
242
+ tickInputToRPC(input) {
243
+ // Unpack the payload to get inputId, ordinal, and values
244
+ // The payload is an InputBinarySchema-packed batch
245
+ const unpacked = this.unpackInputPayload(input.payload);
246
+ return new RPC(unpacked.inputId, {
247
+ tick: input.tick,
248
+ seq: input.seq,
249
+ ordinal: unpacked.ordinal,
250
+ playerSlot: input.playerSlot,
251
+ }, unpacked.values);
252
+ }
253
+ /**
254
+ * Pack an RPC's data into binary payload for network transmission.
255
+ */
256
+ packRpcPayload(rpc) {
257
+ const buffer = InputBinarySchema.packBatch(this.inputRegistry, [{
258
+ inputId: rpc.inputId,
259
+ ordinal: rpc.meta.ordinal,
260
+ values: rpc.data,
261
+ }]);
262
+ return new Uint8Array(buffer);
263
+ }
264
+ /**
265
+ * Unpack binary payload into input data.
266
+ */
267
+ unpackInputPayload(payload) {
268
+ const unpacked = InputBinarySchema.unpackBatch(this.inputRegistry, payload.buffer);
269
+ if (unpacked.length !== 1) {
270
+ throw new Error(`Expected 1 input in payload, got ${unpacked.length}`);
271
+ }
272
+ return unpacked[0];
273
+ }
274
+ /**
275
+ * Request a rollback to a specific tick.
276
+ * Keeps the minimum (earliest) tick that needs rollback.
277
+ */
278
+ requestRollback(tick) {
279
+ this._rollbackCount++;
280
+ if (this._invalidateRollbackTick === undefined || tick < this._invalidateRollbackTick) {
281
+ this._invalidateRollbackTick = tick;
282
+ }
283
+ }
284
+ }
@@ -0,0 +1,9 @@
1
+ export interface RelayConnectionConfig {
2
+ readonly serverUrl: string;
3
+ readonly matchId: string;
4
+ readonly token: string;
5
+ }
6
+ export declare const PING_WARMUP_INTERVAL_MS = 150;
7
+ export declare const PING_WARMUP_COUNT = 5;
8
+ export declare const PING_STEADY_INTERVAL_MS = 1000;
9
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAC3C,eAAO,MAAM,iBAAiB,IAAI,CAAC;AACnC,eAAO,MAAM,uBAAuB,OAAO,CAAC"}
@@ -0,0 +1,3 @@
1
+ export const PING_WARMUP_INTERVAL_MS = 150;
2
+ export const PING_WARMUP_COUNT = 5;
3
+ export const PING_STEADY_INTERVAL_MS = 1000;
@@ -0,0 +1 @@
1
+ {"fileNames":["../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es5.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.dom.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.core.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.date.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.object.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.string.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.array.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.object.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.string.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.date.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.string.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.number.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.promise.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.string.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.array.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.error.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.object.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.string.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../../node_modules/.pnpm/tslib@2.8.1/node_modules/tslib/tslib.d.ts","../../../node_modules/.pnpm/tslib@2.8.1/node_modules/tslib/modules/index.d.ts","../src/lib/types.ts","../../misc/dist/lib/now.d.ts","../../misc/dist/lib/uuid.d.ts","../../misc/dist/lib/ring-buffer.d.ts","../../misc/dist/lib/snapshot-history.d.ts","../../misc/dist/lib/phase-nudger.d.ts","../../misc/dist/lib/simulation-clock.d.ts","../../misc/dist/lib/transform2d-utils.d.ts","../../misc/dist/lib/visual-smoother-2d.d.ts","../../misc/dist/lib/logger.d.ts","../../misc/dist/index.d.ts","../../binary/dist/lib/binary.d.ts","../../binary/dist/lib/types.d.ts","../../binary/dist/index.d.ts","../../net-wire/dist/lib/protocol.d.ts","../../net-wire/dist/lib/clock-sync.d.ts","../../net-wire/dist/lib/input-delay-controller.d.ts","../../net-wire/dist/lib/tick-input-buffer.d.ts","../../net-wire/dist/index.d.ts","../src/lib/relay-connection.ts","../../core/dist/lib/types/abstract-filter.d.ts","../../core/dist/lib/types/ecs-types.d.ts","../../core/dist/lib/types/index.d.ts","../../core/dist/lib/prefab.d.ts","../../core/dist/lib/di/di-container.d.ts","../../core/dist/lib/di/di-decorators.d.ts","../../core/dist/lib/di/index.d.ts","../../core/dist/lib/ecs-config.d.ts","../../core/dist/lib/mem/abstract-memory.interface.d.ts","../../core/dist/lib/mem/managers/components-manager.d.ts","../../core/dist/lib/mem/managers/filters-manager.d.ts","../../core/dist/lib/mem/managers/entities-manager.d.ts","../../core/dist/lib/mem/managers/singletons-manager.d.ts","../../core/dist/lib/mem/managers/player-resources-manager.d.ts","../../core/dist/lib/mem/managers/tick-manager.d.ts","../../core/dist/lib/mem/managers/prng-manager.d.ts","../../core/dist/lib/mem/mem.d.ts","../../core/dist/lib/mem/index.d.ts","../../core/dist/lib/input/rpc.d.ts","../../core/dist/lib/input/input-registry.d.ts","../../core/dist/lib/input/rpc-history.d.ts","../../core/dist/lib/input/abstract-input-provider.d.ts","../../core/dist/lib/input/local-input-provider.d.ts","../../core/dist/lib/input/input-provider-di-token.d.ts","../../core/dist/lib/input/replay-input-provider.d.ts","../../core/dist/lib/input/index.d.ts","../../core/dist/lib/signals/event-emitter.d.ts","../../core/dist/lib/signals/signal.d.ts","../../core/dist/lib/ecs-simulation.d.ts","../../core/dist/lib/ecs-runner.d.ts","../../core/dist/lib/hash-verification/divergence.signal.d.ts","../../core/dist/lib/hash-verification/abstract-hash-verification.system.d.ts","../../core/dist/lib/hash-verification/create-hash-reporter.d.ts","../../core/dist/lib/hash-verification/index.d.ts","../../core/dist/index.d.ts","../src/lib/relay-input-provider.ts","../src/index.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/compatibility/disposable.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/compatibility/indexable.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/compatibility/iterators.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/compatibility/index.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/globals.typedarray.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/buffer.buffer.d.ts","../../../node_modules/.pnpm/buffer@6.0.3/node_modules/buffer/index.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/header.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/readable.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/file.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/fetch.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/formdata.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/connector.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/client.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/errors.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/dispatcher.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/global-dispatcher.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/global-origin.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/pool-stats.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/pool.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/handlers.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/balanced-pool.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/agent.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-interceptor.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-agent.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-client.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-pool.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-errors.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/proxy-agent.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/env-http-proxy-agent.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/retry-handler.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/retry-agent.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/api.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/interceptors.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/util.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/cookies.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/patch.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/websocket.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/eventsource.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/filereader.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/diagnostics-channel.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/content-type.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/cache.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/index.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/globals.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/assert.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/assert/strict.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/async_hooks.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/buffer.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/child_process.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/cluster.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/console.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/constants.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/crypto.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/dgram.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/diagnostics_channel.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/dns.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/dns/promises.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/domain.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/dom-events.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/events.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/fs.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/fs/promises.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/http.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/http2.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/https.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/inspector.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/module.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/net.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/os.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/path.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/perf_hooks.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/process.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/punycode.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/querystring.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/readline.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/readline/promises.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/repl.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/sea.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/stream.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/stream/promises.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/stream/consumers.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/stream/web.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/string_decoder.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/test.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/timers.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/timers/promises.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/tls.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/trace_events.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/tty.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/url.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/util.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/v8.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/vm.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/wasi.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/worker_threads.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/zlib.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/index.d.ts"],"fileIdsList":[[72,73,123,166],[73,123,166],[72,123,166],[83,84,87,88,98,106,108,109,110,114,123,166],[123,166],[85,123,166],[85,86,123,166],[83,87,88,106,108,109,123,166],[71,83,88,98,106,108,123,166],[83,88,94,102,111,123,166],[83,110,123,166],[108,123,166],[111,112,113,123,166],[83,88,99,100,101,109,123,166],[99,100,101,102,103,104,105,123,166],[102,123,166],[83,123,166],[88,100,102,123,166],[83,99,100,123,166],[74,123,166],[92,94,96,97,123,166],[74,83,88,89,123,166],[74,83,84,88,89,90,91,123,166],[74,88,89,123,166],[74,83,89,123,166],[74,89,123,166],[83,88,90,91,92,93,94,95,96,123,166],[74,83,123,166],[88,107,123,166],[74,81,123,166],[81,82,123,166],[62,63,64,65,67,68,69,70,123,166],[66,123,166],[75,76,77,78,123,166],[74,75,123,166],[60,61,79,80,116,123,166],[60,61,71,79,123,166],[60,71,74,79,80,115,123,166],[60,123,166],[123,163,166],[123,165,166],[166],[123,166,171,200],[123,166,167,172,178,179,186,197,208],[123,166,167,168,178,186],[118,119,120,123,166],[123,166,169,209],[123,166,170,171,179,187],[123,166,171,197,205],[123,166,172,174,178,186],[123,165,166,173],[123,166,174,175],[123,166,176,178],[123,165,166,178],[123,166,178,179,180,197,208],[123,166,178,179,180,193,197,200],[123,161,166],[123,166,174,178,181,186,197,208],[123,166,178,179,181,182,186,197,205,208],[123,166,181,183,197,205,208],[121,122,123,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214],[123,166,178,184],[123,166,185,208,213],[123,166,174,178,186,197],[123,166,187],[123,166,188],[123,165,166,189],[123,163,164,165,166,167,168,169,170,171,172,173,174,175,176,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214],[123,166,191],[123,166,192],[123,166,178,193,194],[123,166,193,195,209,211],[123,166,178,197,198,200],[123,166,199,200],[123,166,197,198],[123,166,200],[123,166,201],[123,163,166,197,202],[123,166,178,203,204],[123,166,203,204],[123,166,171,186,197,205],[123,166,206],[123,166,186,207],[123,166,181,192,208],[123,166,171,209],[123,166,197,210],[123,166,185,211],[123,166,212],[123,166,178,180,189,197,200,208,211,213],[123,166,197,214],[59,123,166],[123,133,137,166,208],[123,133,166,197,208],[123,128,166],[123,130,133,166,205,208],[123,166,186,205],[123,166,215],[123,128,166,215],[123,130,133,166,186,208],[123,125,126,129,132,166,178,197,208],[123,133,140,166],[123,125,131,166],[123,133,154,155,166],[123,129,133,166,200,208,215],[123,154,166,215],[123,127,128,166,215],[123,133,166],[123,127,128,129,130,131,132,133,134,135,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,155,156,157,158,159,160,166],[123,133,148,166],[123,133,140,141,166],[123,131,133,141,142,166],[123,132,166],[123,125,128,133,166],[123,133,137,141,142,166],[123,137,166],[123,131,133,136,166,208],[123,125,130,133,140,166],[123,166,197],[123,128,133,154,166,213,215]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"a6a5253138c5432c68a1510c70fe78a644fe2e632111ba778e1978010d6edfec","impliedFormat":1},{"version":"b8f34dd1757f68e03262b1ca3ddfa668a855b872f8bdd5224d6f993a7b37dc2c","impliedFormat":99},{"version":"09df675640c4a1cc0ad80db5b27ababbe98fd1ddb47341832a5c7add32cf3a1d","signature":"954cca308b794d31e8bd7b80cecec5f454bc9b9a4b39b91f583e2dfc8dabde7d","impliedFormat":99},{"version":"b6c4414ae580cf1ab858f1851520f1d0cee1ca59117ca7e836116cf9618c8819","impliedFormat":99},{"version":"1c440fad2b3f198c3b034257840dcf2999a41770d0b2cfccfc047189d98df18f","impliedFormat":99},{"version":"ef9f67b0f0bd71f90d52d8589b3b3c45e1267129b13f874c049a805ecd7ac37f","impliedFormat":99},{"version":"3d26b5544141b556e3b263e78bbe30fe9927f48f58a3ade62c0de58b4d41d9a4","impliedFormat":99},{"version":"d1beb1ffdddb2cf5fe1e58557c8783d3070680c6165bc6652993ed2a7bf48f38","impliedFormat":99},{"version":"4e3121b5b60b986fa48641a69098b66f0b37c876a973fb0d671394b09913752c","impliedFormat":99},{"version":"6573f1553e8ab870f43047dac35527ec3281a9f1c57c4f2be9872306a6dbe5ae","impliedFormat":99},{"version":"899a34e4f158e0b0ef1a72b566bf4041edeef09d0547f8882f740ec5dfd2c775","impliedFormat":99},{"version":"6b42cbd9637a7b84238d4cd7212e5405d9a3274f505a1cc8dc008f5ef7cbce12","impliedFormat":99},{"version":"23c7c084d919b1a6d948a8a0952a18969caaf0740f19651f046d978440b06d57","impliedFormat":99},{"version":"ac089737c8fddcff7af3b4b11d52ceb4053ecacb1e408186981a121b45d471ae","impliedFormat":99},{"version":"ddd386b335a31a931a79bb4a4194e4ad53836920f3eb847f9239577df45f0ada","impliedFormat":99},{"version":"21c5388dfa2af6acd9a77f68ace5f393e5f1163b371a7c4346742ebf0e102117","impliedFormat":99},{"version":"f1d219537856b85b587d64dbf8233115cc3b5a20d5a9ca29d71ab82f1d40fdeb","impliedFormat":99},{"version":"0adc1e3975856b12a811ab06af29a2d9e343b06e48c826f3c72bd7ceaf4be54f","impliedFormat":99},{"version":"4a169791aad1f002f3412ce6ed18bff156d2e97a645e1c5c6ba07dfcae10c1d3","impliedFormat":99},{"version":"e2264c936ae9474c390623d8b41ae4ee992554cac7f3f20109e22ef27725e764","impliedFormat":99},{"version":"03474982ddfb89dd5b162522e3e2a2c91ea40656a9e901bf71541402124a9bdf","impliedFormat":99},{"version":"8d1cb7c9ba84c62de25fd2671b1758eecb2d81113bf4d90bd1a836bb8c79231b","signature":"87bddd4f07117b616006c6b429a2aaee917d04ee609cbe00cbf8ee1c5be9d701","impliedFormat":99},{"version":"23ad1fa9322c6e341b8b1fd6bb93a6720ab1d0d10a0eda74652818d3ff3392e2","impliedFormat":99},{"version":"1595bfc83b235176aa8bc3ad7baed759964ca2127cefc014faa3d4647d362c6f","impliedFormat":99},{"version":"f8d0edd14faea72f0e9a0384f41910d26e3b0006f71451c330c34d1a1494ce33","impliedFormat":99},{"version":"85b8fe3f00141026c0fc749a2f23ac4ae5d030458ca2ed4598587ea0521e2eae","impliedFormat":99},{"version":"130f6370a530b3643e2214b630d3e2e123d76a0233e8e590f3509e072c906ea5","impliedFormat":99},{"version":"f7238b26bc44bf22e4d833995e2b61a73b8da62693303e4289b0456e0209fbd8","impliedFormat":99},{"version":"db4ff4c463764d1c94308182062ecd2d25472f52f00bee4acbe5a44b2f569852","impliedFormat":99},{"version":"42d790b95977358d889f7a229b5d6ddcdd0b349f3dc17f1fce23ed1981d627e9","impliedFormat":99},{"version":"61f587866ef1f487c3a8867926cd5f0d98052da7d4c374d23db8041086d56022","impliedFormat":99},{"version":"232cf2b08cd445b215cc34e8d7c3d942685deac6c335e2d6d5e3d3b450790fbe","impliedFormat":99},{"version":"16399c7ec44051bd6a1b0b5978c8eeadf92f92af2dd7ed92f4387d5402fd415b","impliedFormat":99},{"version":"7eccc5df9b04689731abffad3c85c330094f9385cc008af7b16e9bb684a01a81","impliedFormat":99},{"version":"c4dafacf7638b0b53ac6c0260e519a75700cf5e8e10f428980d3be0cf0bb5a43","impliedFormat":99},{"version":"a7252718aa03403a5bd897641ddfbd2c66874be55c5179bf960dbcb338332935","impliedFormat":99},{"version":"81bc54177adc5150443aa53fce811a6cd2fc68115de3a902938c9b11397b7b48","impliedFormat":99},{"version":"7e5098b7265fec8f1c07dfd86987713c004b6e9a89794b3fd53ae4e43b3a34a4","impliedFormat":99},{"version":"3792ab1424d2cc9fb3cea0a4532a989bd4648d5c0e3eec5ef0c0c2c789917639","impliedFormat":99},{"version":"ceb663d013c4ac93b76bc90aefaf643bb60fc47bf8d79a463c36c817788cab6b","impliedFormat":99},{"version":"be7dd117709b70c08c3dd3cad6db949b2add05c993965956aad087f28d0d4f1f","impliedFormat":99},{"version":"bb29fc63ec33f6ec97b45f8c80ed7f43108d33de088e1d2d3c3ad6fba8b07db9","impliedFormat":99},{"version":"ff8695b8c6fe2488fd76353671004ec63e8a87f3d82f35bdf55bdb5e304ee5ee","impliedFormat":99},{"version":"fb3663bfd2e5d316dbdd5210b0633a58cf1ec0c598735f9755d564e8dc0a7744","impliedFormat":99},{"version":"ae1bc79abc2d1b8cbc665ad296a21271359f8b9a591e62f868ac950e33b8adfb","impliedFormat":99},{"version":"2f41588912cfb2144c054c6841f22079faaf4d027b0c6372cb301cdcf996ca57","impliedFormat":99},{"version":"c48b92e464ec9eed3b29550d84f6ae59e072e7c5dfe1f4478739d730b02364b5","impliedFormat":99},{"version":"a3ee61aa8774ff2edc883442f88cd099324ac1941561cbedcc796a4e38f252aa","impliedFormat":99},{"version":"f4be38602c24316b0641a63db2c87edf760e1d07cb6c6f6101341eb60c0c36cb","impliedFormat":99},{"version":"5d73a3f0d5320a3d3ff77641407741c12192011a379ae8d4b487fbb5797950c1","impliedFormat":99},{"version":"c33414c55b8a3c3226672bd5b28267ea137ee8ae179765d637ec33a74ba6ecf2","impliedFormat":99},{"version":"79d6ace059374ba2d5ec4dabbea4e76568af5d32cad07996ad5476a057a299ec","impliedFormat":99},{"version":"01e68235fbff64c79c96de8c5f7127a51239beac5f644986fbb5557029512e4d","impliedFormat":99},{"version":"a1b9159487e86199143afa0f4594fec1168eeebe51459fc77a612cdc7f78fbb5","impliedFormat":99},{"version":"94ca152a91b6e52e515f7bea6cfb1d4ab55e461416cdb0fa3cf0a6a6f5c763d3","impliedFormat":99},{"version":"dee8a8603abae94cfa038ab6775bd8bc0d21081f9d1f0feb9880971be2dc10e4","impliedFormat":99},{"version":"bde3d9ee3993b92b21309fc76225337b74c1ea7a82b8752edbf1c2cd6648c314","impliedFormat":99},{"version":"9561ebbbd1a4ec60bbbd0e35311aaaa725e14911bca39011194ebe6274c55451","signature":"dce322762c7aaa63b937486a679b3bd07879dba1441b11969d8eb66fd4859b93","impliedFormat":99},{"version":"37c2a11511c5d061c22bd64c29e6e94b0f67508f371614e4d3b6be2e618b723d","impliedFormat":99},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"49a5a44f2e68241a1d2bd9ec894535797998841c09729e506a7cbfcaa40f2180","affectsGlobalScope":true,"impliedFormat":1},{"version":"4967529644e391115ca5592184d4b63980569adf60ee685f968fd59ab1557188","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"1ca84b44ad1d8e4576f24904d8b95dd23b94ea67e1575f89614ac90062fc67f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"6d586db0a09a9495ebb5dece28f54df9684bfbd6e1f568426ca153126dac4a40","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"8c0bcd6c6b67b4b503c11e91a1fb91522ed585900eab2ab1f61bba7d7caa9d6f","impliedFormat":1},{"version":"567b7f607f400873151d7bc63a049514b53c3c00f5f56e9e95695d93b66a138e","affectsGlobalScope":true,"impliedFormat":1},{"version":"f3e58c4c18a031cbb17abec7a4ad0bd5ae9fc70c1f4ba1e7fb921ad87c504aca","impliedFormat":1},{"version":"84c1930e33d1bb12ad01bcbe11d656f9646bd21b2fb2afd96e8e10615a021aef","impliedFormat":1},{"version":"35ec8b6760fd7138bbf5809b84551e31028fb2ba7b6dc91d95d098bf212ca8b4","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4b87f767c7bc841511113c876a6b8bf1fd0cb0b718c888ad84478b372ec486b1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d04e3640dd9eb67f7f1e5bd3d0bf96c784666f7aefc8ac1537af6f2d38d4c29","impliedFormat":1},{"version":"9d19808c8c291a9010a6c788e8532a2da70f811adb431c97520803e0ec649991","impliedFormat":1},{"version":"2bf469abae4cc9c0f340d4e05d9d26e37f936f9c8ca8f007a6534f109dcc77e4","impliedFormat":1},{"version":"4aacb0dd020eeaef65426153686cc639a78ec2885dc72ad220be1d25f1a439df","impliedFormat":1},{"version":"f0bd7e6d931657b59605c44112eaf8b980ba7f957a5051ed21cb93d978cf2f45","impliedFormat":1},{"version":"71450bbc2d82821d24ca05699a533e72758964e9852062c53b30f31c36978ab8","affectsGlobalScope":true,"impliedFormat":1},{"version":"0ada07543808f3b967624645a8e1ccd446f8b01ade47842acf1328aec899fed0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4c21aaa8257d7950a5b75a251d9075b6a371208fc948c9c8402f6690ef3b5b55","impliedFormat":1},{"version":"b5895e6353a5d708f55d8685c38a235c3a6d8138e374dee8ceb8ffde5aa8002a","impliedFormat":1},{"version":"54c4f21f578864961efc94e8f42bc893a53509e886370ec7dd602e0151b9266c","impliedFormat":1},{"version":"de735eca2c51dd8b860254e9fdb6d9ec19fe402dfe597c23090841ce3937cfc5","impliedFormat":1},{"version":"4ff41188773cbf465807dd2f7059c7494cbee5115608efc297383832a1150c43","impliedFormat":1},{"version":"5650cf3dace09e7c25d384e3e6b818b938f68f4e8de96f52d9c5a1b3db068e86","impliedFormat":1},{"version":"1354ca5c38bd3fd3836a68e0f7c9f91f172582ba30ab15bb8c075891b91502b7","affectsGlobalScope":true,"impliedFormat":1},{"version":"5155da3047ef977944d791a2188ff6e6c225f6975cc1910ab7bb6838ab84cede","impliedFormat":1},{"version":"93f437e1398a4f06a984f441f7fa7a9f0535c04399619b5c22e0b87bdee182cb","impliedFormat":1},{"version":"afbe24ab0d74694372baa632ecb28bb375be53f3be53f9b07ecd7fc994907de5","impliedFormat":1},{"version":"e16d218a30f6a6810b57f7e968124eaa08c7bb366133ea34bbf01e7cd6b8c0ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb8692dea24c27821f77e397272d9ed2eda0b95e4a75beb0fdda31081d15a8ae","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e043a1bc8fbf2a255bccf9bf27e0f1caf916c3b0518ea34aa72357c0afd42ec","impliedFormat":1},{"version":"b4f70ec656a11d570e1a9edce07d118cd58d9760239e2ece99306ee9dfe61d02","impliedFormat":1},{"version":"3bc2f1e2c95c04048212c569ed38e338873f6a8593930cf5a7ef24ffb38fc3b6","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"f9d9d753d430ed050dc1bf2667a1bab711ccbb1c1507183d794cc195a5b085cc","impliedFormat":1},{"version":"9eece5e586312581ccd106d4853e861aaaa1a39f8e3ea672b8c3847eedd12f6e","impliedFormat":1},{"version":"5b6844ad931dcc1d3aca53268f4bd671428421464b1286746027aede398094f2","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"0dbcebe2126d03936c70545e96a6e41007cf065be38a1ce4d32a39fcedefead4","affectsGlobalScope":true,"impliedFormat":1},{"version":"1851a3b4db78664f83901bb9cac9e45e03a37bb5933cc5bf37e10bb7e91ab4eb","impliedFormat":1},{"version":"461e54289e6287e8494a0178ba18182acce51a02bca8dea219149bf2cf96f105","impliedFormat":1},{"version":"12ed4559eba17cd977aa0db658d25c4047067444b51acfdcbf38470630642b23","affectsGlobalScope":true,"impliedFormat":1},{"version":"f3ffabc95802521e1e4bcba4c88d8615176dc6e09111d920c7a213bdda6e1d65","impliedFormat":1},{"version":"e31e51c55800014d926e3f74208af49cb7352803619855c89296074d1ecbb524","impliedFormat":1},{"version":"ae56f65caf3be91108707bd8dfbccc2a57a91feb5daabf7165a06a945545ed26","impliedFormat":1},{"version":"a136d5de521da20f31631a0a96bf712370779d1c05b7015d7019a9b2a0446ca9","impliedFormat":1},{"version":"dfb96ba5177b68003deec9e773c47257da5c4c8a74053d8956389d832df72002","affectsGlobalScope":true,"impliedFormat":1},{"version":"92d3070580cf72b4bb80959b7f16ede9a3f39e6f4ef2ac87cfa4561844fdc69f","affectsGlobalScope":true,"impliedFormat":1},{"version":"d3dffd70e6375b872f0b4e152de4ae682d762c61a24881ecc5eb9f04c5caf76f","impliedFormat":1},{"version":"613deebaec53731ff6b74fe1a89f094b708033db6396b601df3e6d5ab0ec0a47","impliedFormat":1},{"version":"d91a7d8b5655c42986f1bdfe2105c4408f472831c8f20cf11a8c3345b6b56c8c","impliedFormat":1},{"version":"e56eb632f0281c9f8210eb8c86cc4839a427a4ffffcfd2a5e40b956050b3e042","affectsGlobalScope":true,"impliedFormat":1},{"version":"e8a979b8af001c9fc2e774e7809d233c8ca955a28756f52ee5dee88ccb0611d2","impliedFormat":1},{"version":"cac793cc47c29e26e4ac3601dcb00b4435ebed26203485790e44f2ad8b6ad847","impliedFormat":1}],"root":[61,80,116,117],"options":{"composite":true,"declarationMap":true,"emitDeclarationOnly":false,"emitDecoratorMetadata":true,"experimentalDecorators":true,"importHelpers":true,"module":199,"noEmitOnError":true,"noFallthroughCasesInSwitch":true,"noImplicitOverride":true,"noImplicitReturns":true,"noUnusedLocals":true,"outDir":"./","rootDir":"../src","skipLibCheck":true,"strict":true,"target":9,"tsBuildInfoFile":"./tsconfig.lib.tsbuildinfo"},"referencedMap":[[74,1],[72,2],[73,3],[115,4],[85,5],[86,6],[87,7],[88,5],[110,8],[109,9],[112,10],[113,11],[111,12],[114,13],[102,14],[106,15],[104,16],[100,17],[103,16],[105,18],[101,19],[99,17],[89,20],[98,21],[90,22],[92,23],[91,22],[94,22],[96,24],[93,25],[95,26],[97,27],[84,28],[107,5],[108,29],[81,20],[82,30],[83,31],[71,32],[70,5],[62,5],[66,5],[64,5],[67,33],[65,5],[68,5],[63,5],[69,5],[79,34],[76,35],[77,5],[75,20],[78,5],[117,36],[80,37],[116,38],[61,39],[163,40],[164,40],[165,41],[123,42],[166,43],[167,44],[168,45],[118,5],[121,46],[119,5],[120,5],[169,47],[170,48],[171,49],[172,50],[173,51],[174,52],[175,52],[177,5],[176,53],[178,54],[179,55],[180,56],[162,57],[122,5],[181,58],[182,59],[183,60],[215,61],[184,62],[185,63],[186,64],[187,65],[188,66],[189,67],[190,68],[191,69],[192,70],[193,71],[194,71],[195,72],[196,5],[197,73],[199,74],[198,75],[200,76],[201,77],[202,78],[203,79],[204,80],[205,81],[206,82],[207,83],[208,84],[209,85],[210,86],[211,87],[212,88],[213,89],[214,90],[124,5],[60,91],[59,5],[57,5],[58,5],[10,5],[12,5],[11,5],[2,5],[13,5],[14,5],[15,5],[16,5],[17,5],[18,5],[19,5],[20,5],[3,5],[21,5],[22,5],[4,5],[23,5],[27,5],[24,5],[25,5],[26,5],[28,5],[29,5],[30,5],[5,5],[31,5],[32,5],[33,5],[34,5],[6,5],[38,5],[35,5],[36,5],[37,5],[39,5],[7,5],[40,5],[45,5],[46,5],[41,5],[42,5],[43,5],[44,5],[8,5],[50,5],[47,5],[48,5],[49,5],[51,5],[9,5],[52,5],[53,5],[54,5],[56,5],[55,5],[1,5],[140,92],[150,93],[139,92],[160,94],[131,95],[130,96],[159,97],[153,98],[158,99],[133,100],[147,101],[132,102],[156,103],[128,104],[127,97],[157,105],[129,106],[134,107],[135,5],[138,107],[125,5],[161,108],[151,109],[142,110],[143,111],[145,112],[141,113],[144,114],[154,97],[136,115],[137,116],[146,117],[126,118],[149,109],[148,107],[152,5],[155,119]],"latestChangedDtsFile":"./lib/relay-input-provider.d.ts","version":"5.9.3"}
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "@lagless/relay-client",
3
+ "version": "0.0.33",
4
+ "license": "MIT",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "https://github.com/ppauel/lagless",
8
+ "directory": "libs/relay-client"
9
+ },
10
+ "type": "module",
11
+ "main": "./dist/index.js",
12
+ "module": "./dist/index.js",
13
+ "types": "./dist/index.d.ts",
14
+ "exports": {
15
+ "./package.json": "./package.json",
16
+ ".": {
17
+ "@lagless/source": "./src/index.ts",
18
+ "types": "./dist/index.d.ts",
19
+ "import": "./dist/index.js",
20
+ "default": "./dist/index.js"
21
+ }
22
+ },
23
+ "nx": {
24
+ "sourceRoot": "libs/relay-client/src"
25
+ },
26
+ "dependencies": {
27
+ "@swc/helpers": "~0.5.11",
28
+ "@lagless/core": "0.0.33",
29
+ "@lagless/binary": "0.0.33",
30
+ "@lagless/misc": "0.0.33",
31
+ "@lagless/net-wire": "0.0.33"
32
+ },
33
+ "files": [
34
+ "dist",
35
+ "README.md"
36
+ ],
37
+ "publishConfig": {
38
+ "access": "public"
39
+ }
40
+ }