@axpecter/lync 2.0.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +475 -426
- package/package.json +1 -1
- package/src/Types.luau +63 -31
- package/src/api/Group.luau +101 -106
- package/src/api/Packet.luau +187 -186
- package/src/api/Query.luau +223 -284
- package/src/api/Scope.luau +46 -57
- package/src/api/Signal.luau +104 -137
- package/src/codec/Base.luau +69 -20
- package/src/codec/composite/Array.luau +179 -270
- package/src/codec/composite/Map.luau +97 -347
- package/src/codec/composite/Optional.luau +27 -24
- package/src/codec/composite/Shared.luau +96 -65
- package/src/codec/composite/Struct.luau +200 -360
- package/src/codec/composite/Tagged.luau +62 -187
- package/src/codec/composite/Tuple.luau +79 -103
- package/src/codec/datatype/Buffer.luau +49 -21
- package/src/codec/datatype/CFrame.luau +207 -30
- package/src/codec/datatype/Color.luau +21 -11
- package/src/codec/datatype/Instance.luau +28 -21
- package/src/codec/datatype/IntVector.luau +33 -21
- package/src/codec/datatype/NumberRange.luau +19 -10
- package/src/codec/datatype/Ray.luau +26 -22
- package/src/codec/datatype/Rect.luau +20 -16
- package/src/codec/datatype/Region.luau +51 -45
- package/src/codec/datatype/Sequence.luau +64 -56
- package/src/codec/datatype/String.luau +89 -56
- package/src/codec/datatype/UDim.luau +40 -22
- package/src/codec/datatype/Vector.luau +181 -17
- package/src/codec/meta/Auto.luau +295 -253
- package/src/codec/meta/Bitfield.luau +104 -148
- package/src/codec/meta/Custom.luau +8 -4
- package/src/codec/meta/Enum.luau +29 -57
- package/src/codec/meta/Float.luau +64 -0
- package/src/codec/meta/Nothing.luau +9 -5
- package/src/codec/meta/Unknown.luau +44 -36
- package/src/codec/primitive/Bool.luau +16 -26
- package/src/codec/primitive/Float16.luau +58 -64
- package/src/codec/primitive/Int.luau +68 -0
- package/src/codec/primitive/Number.luau +21 -43
- package/src/codec/primitive/Varint.luau +67 -46
- package/src/index.d.ts +249 -335
- package/src/init.luau +319 -207
- package/src/internal/Baseline.luau +29 -24
- package/src/internal/Channel.luau +333 -278
- package/src/internal/Middleware.luau +60 -85
- package/src/internal/Pool.luau +19 -30
- package/src/internal/Registry.luau +56 -113
- package/src/transport/Bridge.luau +64 -43
- package/src/transport/Client.luau +59 -170
- package/src/transport/Gate.luau +282 -142
- package/src/transport/Reader.luau +148 -140
- package/src/transport/Server.luau +138 -488
- package/src/api/Namespace.luau +0 -256
- package/src/codec/meta/Quantized.luau +0 -174
package/src/index.d.ts
CHANGED
|
@@ -1,347 +1,261 @@
|
|
|
1
|
-
|
|
1
|
+
/// <reference types="@rbxts/types" />
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
getBytesSent(this: Packet<T>): number;
|
|
139
|
-
getBytesReceived(this: Packet<T>): number;
|
|
140
|
-
getFires(this: Packet<T>): number;
|
|
141
|
-
getRecvFires(this: Packet<T>): number;
|
|
142
|
-
getDrops(this: Packet<T>): number;
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
// -- Query -------------------------------------------------------------
|
|
146
|
-
|
|
147
|
-
export interface QueryConfig<Req, Resp> {
|
|
148
|
-
request: Codec<Req>;
|
|
149
|
-
response: Codec<Resp>;
|
|
150
|
-
timeout?: number;
|
|
151
|
-
rateLimit?: RateLimitConfig;
|
|
152
|
-
validate?: (data: Req, player: Player) => LuaTuple<[boolean, string?]>;
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
export interface Query<Req, Resp> {
|
|
156
|
-
listen(
|
|
157
|
-
this: Query<Req, Resp>,
|
|
158
|
-
callback: (request: Req, player: Player) => Resp | undefined,
|
|
159
|
-
): Connection;
|
|
160
|
-
request(this: Query<Req, Resp>, data: Req): Resp | undefined;
|
|
161
|
-
requestFrom(this: Query<Req, Resp>, player: Player, data: Req): Resp | undefined;
|
|
162
|
-
requestAll(this: Query<Req, Resp>, data: Req): Map<Player, Resp | undefined>;
|
|
163
|
-
requestList(
|
|
164
|
-
this: Query<Req, Resp>,
|
|
165
|
-
players: Player[],
|
|
166
|
-
data: Req,
|
|
167
|
-
): Map<Player, Resp | undefined>;
|
|
168
|
-
requestGroup(
|
|
169
|
-
this: Query<Req, Resp>,
|
|
170
|
-
group: GroupObject,
|
|
171
|
-
data: Req,
|
|
172
|
-
): Map<Player, Resp | undefined>;
|
|
3
|
+
declare namespace Lync {
|
|
4
|
+
// ── Core Types ──────────────────────────────────────────────────
|
|
5
|
+
|
|
6
|
+
interface Codec<T> {
|
|
7
|
+
/** @hidden */ readonly _nominal_codec: T;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
interface Connection {
|
|
11
|
+
connected: boolean;
|
|
12
|
+
disconnect(): void;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
interface PacketStats {
|
|
16
|
+
bytesSent: number;
|
|
17
|
+
bytesReceived: number;
|
|
18
|
+
fires: number;
|
|
19
|
+
recvFires: number;
|
|
20
|
+
drops: number;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
interface PlayerStats {
|
|
24
|
+
bytesSent: number;
|
|
25
|
+
bytesReceived: number;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// ── Packet ──────────────────────────────────────────────────────
|
|
29
|
+
|
|
30
|
+
interface PacketOptions<T> {
|
|
31
|
+
unreliable?: boolean;
|
|
32
|
+
rateLimit?: { maxPerSecond?: number; burst?: number } | { cooldown: number };
|
|
33
|
+
validate?: (data: T, player: Player) => LuaTuple<[boolean, string?]>;
|
|
34
|
+
maxPayloadBytes?: number;
|
|
35
|
+
timestamp?: "frame" | "offset" | "full";
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
interface Packet<T> {
|
|
39
|
+
send(this: Packet<T>, data: T, target?: Target): void;
|
|
40
|
+
on(this: Packet<T>, fn: (data: T, sender?: Player, timestamp?: number) => void): Connection;
|
|
41
|
+
once(this: Packet<T>, fn: (data: T, sender?: Player, timestamp?: number) => void): Connection;
|
|
42
|
+
wait(this: Packet<T>): LuaTuple<[T, Player?, number?]>;
|
|
43
|
+
name(this: Packet<T>): string;
|
|
44
|
+
stats(this: Packet<T>): PacketStats;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// ── Query ───────────────────────────────────────────────────────
|
|
48
|
+
|
|
49
|
+
interface QueryOptions<Req> {
|
|
50
|
+
timeout?: number;
|
|
51
|
+
rateLimit?: { maxPerSecond?: number; burst?: number };
|
|
52
|
+
validate?: (data: Req, player: Player) => LuaTuple<[boolean, string?]>;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
interface Query<Req, Resp> {
|
|
56
|
+
handle(this: Query<Req, Resp>, fn: (request: Req, player?: Player) => Resp | undefined): Connection;
|
|
57
|
+
request(this: Query<Req, Resp>, data: Req): Resp | undefined;
|
|
58
|
+
request(this: Query<Req, Resp>, data: Req, target: Player): Resp | undefined;
|
|
59
|
+
request(this: Query<Req, Resp>, data: Req, target: Target): Map<Player, Resp | undefined>;
|
|
60
|
+
name(this: Query<Req, Resp>): string;
|
|
61
|
+
stats(this: Query<Req, Resp>): PacketStats;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// ── Group ───────────────────────────────────────────────────────
|
|
65
|
+
|
|
66
|
+
interface Group extends Iterable<Player> {
|
|
67
|
+
add(this: Group, player: Player): boolean;
|
|
68
|
+
remove(this: Group, player: Player): boolean;
|
|
69
|
+
has(this: Group, player: Player): boolean;
|
|
70
|
+
count(this: Group): number;
|
|
71
|
+
destroy(this: Group): void;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// ── Scope ───────────────────────────────────────────────────────
|
|
75
|
+
|
|
76
|
+
interface Scope {
|
|
77
|
+
on<T>(this: Scope, source: Packet<T>, fn: (data: T, sender?: Player, timestamp?: number) => void): Connection;
|
|
78
|
+
once<T>(this: Scope, source: Packet<T>, fn: (data: T, sender?: Player, timestamp?: number) => void): Connection;
|
|
79
|
+
add(this: Scope, connection: Connection | RBXScriptConnection): void;
|
|
80
|
+
destroy(this: Scope): void;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// ── Targets ─────────────────────────────────────────────────────
|
|
84
|
+
|
|
85
|
+
type Target = Player | Player[] | Group | AllTarget | ExceptTarget;
|
|
86
|
+
|
|
87
|
+
interface AllTarget {
|
|
88
|
+
/** @hidden */ readonly _lyncAll: true;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
interface ExceptTarget {
|
|
92
|
+
/** @hidden */ readonly _lyncExcept: true;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// ── Codec Inference ─────────────────────────────────────────────
|
|
96
|
+
|
|
97
|
+
type InferCodec<C> = C extends Codec<infer T> ? T : never;
|
|
98
|
+
|
|
99
|
+
type InferSchema<S extends Record<string, Codec<unknown>>> = {
|
|
100
|
+
[K in keyof S]: InferCodec<S[K]>;
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
// ── Callable Codecs ─────────────────────────────────────────────
|
|
104
|
+
|
|
105
|
+
interface StringCodec extends Codec<string> {
|
|
106
|
+
(maxLength: number): Codec<string>;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
interface Vec2Codec extends Codec<Vector2> {
|
|
110
|
+
(min: number, max: number, precision: number): Codec<Vector2>;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
interface Vec3Codec extends Codec<Vector3> {
|
|
114
|
+
(min: number, max: number, precision: number): Codec<Vector3>;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
interface CFrameCodec extends Codec<CFrame> {
|
|
118
|
+
(): Codec<CFrame>;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// ── Configure ───────────────────────────────────────────────────
|
|
122
|
+
|
|
123
|
+
interface ConfigureOptions {
|
|
124
|
+
channelMaxSize?: number;
|
|
125
|
+
validationDepth?: number;
|
|
126
|
+
poolSize?: number;
|
|
127
|
+
bandwidthLimit?: { softLimit: number; maxStrikes: number };
|
|
128
|
+
globalRateLimit?: { maxPerSecond: number };
|
|
129
|
+
stats?: boolean;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// ── Drop Sentinel ───────────────────────────────────────────────
|
|
133
|
+
|
|
134
|
+
interface DropSentinel {
|
|
135
|
+
/** @hidden */ readonly _lyncDrop: true;
|
|
136
|
+
}
|
|
173
137
|
}
|
|
174
138
|
|
|
175
|
-
|
|
139
|
+
interface LyncModule {
|
|
140
|
+
// ── Lifecycle ────────────────────────────────────────────────────
|
|
176
141
|
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
type InferPackets<P extends Record<string, PacketConfig<unknown>>> = {
|
|
183
|
-
[K in keyof P]: P[K] extends PacketConfig<infer T> ? Packet<T> : never;
|
|
184
|
-
};
|
|
185
|
-
|
|
186
|
-
type InferQueries<Q extends Record<string, QueryConfig<unknown, unknown>>> = {
|
|
187
|
-
[K in keyof Q]: Q[K] extends QueryConfig<infer Req, infer Resp>
|
|
188
|
-
? Query<Req, Resp>
|
|
189
|
-
: never;
|
|
190
|
-
};
|
|
191
|
-
|
|
192
|
-
export interface Namespace {
|
|
193
|
-
readonly packets: Record<string, Packet<unknown>>;
|
|
194
|
-
readonly queries: Record<string, Query<unknown, unknown>>;
|
|
195
|
-
listenAll(
|
|
196
|
-
this: Namespace,
|
|
197
|
-
callback: (name: string, data: unknown, sender: Player | undefined, timestamp: number | undefined) => void,
|
|
198
|
-
): Connection;
|
|
199
|
-
onSend(
|
|
200
|
-
this: Namespace,
|
|
201
|
-
handler: (data: unknown, name: string, player: Player | undefined) => unknown | DropSentinel | undefined,
|
|
202
|
-
): () => void;
|
|
203
|
-
onReceive(
|
|
204
|
-
this: Namespace,
|
|
205
|
-
handler: (data: unknown, name: string, player: Player | undefined) => unknown | DropSentinel | undefined,
|
|
206
|
-
): () => void;
|
|
207
|
-
disconnectAll(this: Namespace): void;
|
|
208
|
-
destroy(this: Namespace): void;
|
|
209
|
-
packetNames(this: Namespace): string[];
|
|
210
|
-
queryNames(this: Namespace): string[];
|
|
211
|
-
}
|
|
142
|
+
configure(options: Lync.ConfigureOptions): void;
|
|
143
|
+
start(): void;
|
|
144
|
+
readonly started: boolean;
|
|
212
145
|
|
|
213
|
-
//
|
|
146
|
+
// ── Definitions ─────────────────────────────────────────────────
|
|
214
147
|
|
|
215
|
-
|
|
216
|
-
// Lifecycle
|
|
217
|
-
export const VERSION: string;
|
|
218
|
-
export function start(): void;
|
|
148
|
+
packet<T>(name: string, codec: Lync.Codec<T>, options?: Lync.PacketOptions<T>): Lync.Packet<T>;
|
|
219
149
|
|
|
220
|
-
|
|
221
|
-
export function definePacket<T>(name: string, config: PacketConfig<T>): Packet<T>;
|
|
222
|
-
export function defineQuery<Req, Resp>(
|
|
150
|
+
query<Req, Resp>(
|
|
223
151
|
name: string,
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
152
|
+
requestCodec: Lync.Codec<Req>,
|
|
153
|
+
responseCodec: Lync.Codec<Resp>,
|
|
154
|
+
options?: Lync.QueryOptions<Req>,
|
|
155
|
+
): Lync.Query<Req, Resp>;
|
|
156
|
+
|
|
157
|
+
group(name: string): Lync.Group;
|
|
158
|
+
scope(): Lync.Scope;
|
|
159
|
+
|
|
160
|
+
// ── Targeting ───────────────────────────────────────────────────
|
|
161
|
+
|
|
162
|
+
readonly all: Lync.AllTarget;
|
|
163
|
+
except(...args: Array<Player | Lync.Group>): Lync.ExceptTarget;
|
|
164
|
+
readonly DROP: Lync.DropSentinel;
|
|
165
|
+
|
|
166
|
+
// ── Middleware ───────────────────────────────────────────────────
|
|
167
|
+
|
|
168
|
+
onSend(fn: (data: unknown, name: string, player?: Player) => unknown): Lync.Connection;
|
|
169
|
+
onReceive(fn: (data: unknown, name: string, player?: Player) => unknown): Lync.Connection;
|
|
170
|
+
onDrop(fn: (player: Player, reason: string, name: string, data?: unknown) => void): Lync.Connection;
|
|
171
|
+
|
|
172
|
+
// ── Runtime Control ─────────────────────────────────────────────
|
|
173
|
+
|
|
174
|
+
flush(): void;
|
|
175
|
+
flushRate(hz: number): void;
|
|
176
|
+
|
|
177
|
+
// ── Stats ───────────────────────────────────────────────────────
|
|
178
|
+
|
|
179
|
+
readonly stats: {
|
|
180
|
+
player(player: Player): Lync.PlayerStats | undefined;
|
|
181
|
+
reset(): void;
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
// ── Debug ───────────────────────────────────────────────────────
|
|
185
|
+
|
|
186
|
+
readonly debug: {
|
|
187
|
+
capture(label?: string): void;
|
|
188
|
+
stop(): void;
|
|
189
|
+
dump(): void;
|
|
190
|
+
pending(): number;
|
|
191
|
+
registrations(): ReadonlyArray<{
|
|
192
|
+
name: string;
|
|
193
|
+
id: number;
|
|
194
|
+
kind: number;
|
|
195
|
+
isUnreliable: boolean;
|
|
196
|
+
}>;
|
|
197
|
+
};
|
|
198
|
+
|
|
199
|
+
// ── Number Codecs ───────────────────────────────────────────────
|
|
200
|
+
|
|
201
|
+
int(min: number, max: number): Lync.Codec<number>;
|
|
202
|
+
float(min: number, max: number, precision: number): Lync.Codec<number>;
|
|
203
|
+
readonly f16: Lync.Codec<number>;
|
|
204
|
+
readonly f32: Lync.Codec<number>;
|
|
205
|
+
readonly f64: Lync.Codec<number>;
|
|
206
|
+
readonly bool: Lync.Codec<boolean>;
|
|
207
|
+
|
|
208
|
+
// ── String & Buffer ─────────────────────────────────────────────
|
|
209
|
+
|
|
210
|
+
readonly string: Lync.StringCodec;
|
|
211
|
+
readonly buff: Lync.Codec<buffer>;
|
|
212
|
+
|
|
213
|
+
// ── Vectors & Spatial ───────────────────────────────────────────
|
|
214
|
+
|
|
215
|
+
readonly vec2: Lync.Vec2Codec;
|
|
216
|
+
readonly vec3: Lync.Vec3Codec;
|
|
217
|
+
readonly cframe: Lync.CFrameCodec;
|
|
218
|
+
readonly ray: Lync.Codec<Ray>;
|
|
219
|
+
readonly rect: Lync.Codec<Rect>;
|
|
220
|
+
readonly region3: Lync.Codec<Region3>;
|
|
221
|
+
readonly region3int16: Lync.Codec<Region3int16>;
|
|
222
|
+
readonly vec2int16: Lync.Codec<Vector2int16>;
|
|
223
|
+
readonly vec3int16: Lync.Codec<Vector3int16>;
|
|
224
|
+
|
|
225
|
+
// ── Roblox Types ────────────────────────────────────────────────
|
|
226
|
+
|
|
227
|
+
readonly color3: Lync.Codec<Color3>;
|
|
228
|
+
readonly inst: Lync.Codec<Instance>;
|
|
229
|
+
readonly udim: Lync.Codec<UDim>;
|
|
230
|
+
readonly udim2: Lync.Codec<UDim2>;
|
|
231
|
+
readonly numberRange: Lync.Codec<NumberRange>;
|
|
232
|
+
readonly numberSequence: Lync.Codec<NumberSequence>;
|
|
233
|
+
readonly colorSequence: Lync.Codec<ColorSequence>;
|
|
234
|
+
|
|
235
|
+
// ── Composites ──────────────────────────────────────────────────
|
|
236
|
+
|
|
237
|
+
struct<S extends Record<string, Lync.Codec<unknown>>>(schema: S): Lync.Codec<Lync.InferSchema<S>>;
|
|
238
|
+
deltaStruct<S extends Record<string, Lync.Codec<unknown>>>(schema: S): Lync.Codec<Lync.InferSchema<S>>;
|
|
239
|
+
array<T>(element: Lync.Codec<T>, maxCount?: number): Lync.Codec<T[]>;
|
|
240
|
+
deltaArray<T>(element: Lync.Codec<T>, maxCount?: number): Lync.Codec<T[]>;
|
|
241
|
+
map<K, V>(keyCodec: Lync.Codec<K>, valueCodec: Lync.Codec<V>, maxCount?: number): Lync.Codec<Map<K, V>>;
|
|
242
|
+
deltaMap<K, V>(keyCodec: Lync.Codec<K>, valueCodec: Lync.Codec<V>, maxCount?: number): Lync.Codec<Map<K, V>>;
|
|
243
|
+
optional<T>(codec: Lync.Codec<T>): Lync.Codec<T | undefined>;
|
|
244
|
+
tuple<T extends Lync.Codec<unknown>[]>(...codecs: T): Lync.Codec<{ [K in keyof T]: Lync.InferCodec<T[K]> }>;
|
|
245
|
+
tagged<Tag extends string, V extends Record<string, Lync.Codec<unknown>>>(
|
|
283
246
|
tagField: Tag,
|
|
284
247
|
variants: V,
|
|
285
|
-
): Codec<
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
): Codec<T>;
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
export const auto: Codec<unknown>;
|
|
296
|
-
|
|
297
|
-
// Hooks
|
|
298
|
-
export function onDrop(
|
|
299
|
-
callback: (player: Player, reason: string, packetName: string, data: unknown) => void,
|
|
300
|
-
): () => void;
|
|
301
|
-
export function onSend(
|
|
302
|
-
handler: (data: unknown, name: string, player: Player | undefined) => unknown | DropSentinel | undefined,
|
|
303
|
-
): () => void;
|
|
304
|
-
export function onReceive(
|
|
305
|
-
handler: (data: unknown, name: string, player: Player | undefined) => unknown | DropSentinel | undefined,
|
|
306
|
-
): () => void;
|
|
307
|
-
|
|
308
|
-
// Target descriptors
|
|
309
|
-
export const all: AllTarget;
|
|
310
|
-
export function except(...players: Player[]): ExceptTarget;
|
|
311
|
-
|
|
312
|
-
// Middleware sentinel
|
|
313
|
-
export const DROP: DropSentinel;
|
|
314
|
-
|
|
315
|
-
// Groups
|
|
316
|
-
export function createGroup(name: string): GroupObject;
|
|
317
|
-
|
|
318
|
-
// Scope
|
|
319
|
-
export function scope(): Scope;
|
|
320
|
-
|
|
321
|
-
// Configuration (call before start)
|
|
322
|
-
export function setChannelMaxSize(bytes: number): void;
|
|
323
|
-
export function setValidationDepth(depth: number): void;
|
|
324
|
-
export function setPoolSize(count: number): void;
|
|
325
|
-
|
|
326
|
-
// Runtime configuration
|
|
327
|
-
export function flush(): void;
|
|
328
|
-
export function setFlushRate(hz: number): void;
|
|
329
|
-
|
|
330
|
-
// Stats (default off; call enableStats() to activate)
|
|
331
|
-
export function enableStats(): void;
|
|
332
|
-
export function getPlayerStats(player: Player): PlayerStats | undefined;
|
|
333
|
-
export function resetStats(): void;
|
|
334
|
-
|
|
335
|
-
// Security (server-only)
|
|
336
|
-
export function setBandwidthLimit(softLimit: number, maxStrikes: number): void;
|
|
337
|
-
|
|
338
|
-
// Introspection
|
|
339
|
-
export function queryPendingCount(): number;
|
|
340
|
-
|
|
341
|
-
// Packet capture (server-only, debug)
|
|
342
|
-
export function startCapture(label?: string): void;
|
|
343
|
-
export function stopCapture(): void;
|
|
344
|
-
export function dumpCaptures(): void;
|
|
248
|
+
): Lync.Codec<{ [K in keyof V]: Lync.InferSchema<{ [F in Tag]: K }> & Lync.InferCodec<V[K]> }[keyof V]>;
|
|
249
|
+
|
|
250
|
+
// ── Meta ────────────────────────────────────────────────────────
|
|
251
|
+
|
|
252
|
+
enum<T extends string[]>(...values: T): Lync.Codec<T[number]>;
|
|
253
|
+
bitfield(schema: Record<string, { type: "bool" } | { type: "uint"; width: number } | { type: "int"; width: number }>): Lync.Codec<Record<string, boolean | number>>;
|
|
254
|
+
custom<T>(size: number, write: (b: buffer, offset: number, value: T) => void, read: (b: buffer, offset: number) => T): Lync.Codec<T>;
|
|
255
|
+
readonly nothing: Lync.Codec<undefined>;
|
|
256
|
+
readonly unknown: Lync.Codec<unknown>;
|
|
257
|
+
readonly auto: Lync.Codec<unknown>;
|
|
345
258
|
}
|
|
346
259
|
|
|
347
|
-
|
|
260
|
+
declare const Lync: LyncModule;
|
|
261
|
+
export = Lync;
|