@axpecter/lync 1.5.2 → 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.
Files changed (55) hide show
  1. package/README.md +499 -357
  2. package/package.json +2 -2
  3. package/src/Types.luau +69 -27
  4. package/src/api/Group.luau +101 -106
  5. package/src/api/Packet.luau +191 -157
  6. package/src/api/Query.luau +223 -282
  7. package/src/api/Scope.luau +46 -57
  8. package/src/api/Signal.luau +104 -137
  9. package/src/codec/Base.luau +69 -20
  10. package/src/codec/composite/Array.luau +189 -201
  11. package/src/codec/composite/Map.luau +97 -341
  12. package/src/codec/composite/Optional.luau +27 -23
  13. package/src/codec/composite/Shared.luau +96 -65
  14. package/src/codec/composite/Struct.luau +201 -339
  15. package/src/codec/composite/Tagged.luau +64 -178
  16. package/src/codec/composite/Tuple.luau +81 -95
  17. package/src/codec/datatype/Buffer.luau +49 -21
  18. package/src/codec/datatype/CFrame.luau +207 -30
  19. package/src/codec/datatype/Color.luau +21 -11
  20. package/src/codec/datatype/Instance.luau +29 -19
  21. package/src/codec/datatype/IntVector.luau +33 -21
  22. package/src/codec/datatype/NumberRange.luau +19 -10
  23. package/src/codec/datatype/Ray.luau +26 -22
  24. package/src/codec/datatype/Rect.luau +20 -16
  25. package/src/codec/datatype/Region.luau +51 -45
  26. package/src/codec/datatype/Sequence.luau +64 -56
  27. package/src/codec/datatype/String.luau +89 -56
  28. package/src/codec/datatype/UDim.luau +40 -22
  29. package/src/codec/datatype/Vector.luau +181 -17
  30. package/src/codec/meta/Auto.luau +295 -253
  31. package/src/codec/meta/Bitfield.luau +104 -148
  32. package/src/codec/meta/Custom.luau +8 -4
  33. package/src/codec/meta/Enum.luau +29 -57
  34. package/src/codec/meta/Float.luau +64 -0
  35. package/src/codec/meta/Nothing.luau +9 -5
  36. package/src/codec/meta/Unknown.luau +44 -35
  37. package/src/codec/primitive/Bool.luau +16 -26
  38. package/src/codec/primitive/Float16.luau +58 -64
  39. package/src/codec/primitive/Int.luau +68 -0
  40. package/src/codec/primitive/Number.luau +21 -43
  41. package/src/codec/primitive/Varint.luau +67 -46
  42. package/src/index.d.ts +249 -306
  43. package/src/init.luau +332 -173
  44. package/src/internal/Baseline.luau +29 -24
  45. package/src/internal/Channel.luau +346 -161
  46. package/src/internal/Middleware.luau +60 -85
  47. package/src/internal/Pool.luau +19 -30
  48. package/src/internal/Registry.luau +61 -101
  49. package/src/transport/Bridge.luau +64 -43
  50. package/src/transport/Client.luau +60 -117
  51. package/src/transport/Gate.luau +282 -133
  52. package/src/transport/Reader.luau +159 -100
  53. package/src/transport/Server.luau +147 -292
  54. package/src/api/Namespace.luau +0 -251
  55. package/src/codec/meta/Quantized.luau +0 -174
package/src/index.d.ts CHANGED
@@ -1,318 +1,261 @@
1
- // Type declarations for Lync networking library.
1
+ /// <reference types="@rbxts/types" />
2
2
 
3
- // -- Utility types -----------------------------------------------------
4
-
5
- // Expands mapped types in hover tooltips.
6
- type Prettify<T> = { [K in keyof T]: T[K] } & {};
7
-
8
- // -- Codec -------------------------------------------------------------
9
-
10
- // Opaque codec handle. Carries the serialized type at the type level.
11
- export interface Codec<T> {
12
- /** @hidden @deprecated Do not use. Only for type metadata. */
13
- readonly _nominal_Codec: T;
14
- }
15
-
16
- // Extracts the value type from a codec.
17
- export type InferCodec<C> = C extends Codec<infer T> ? T : never;
18
-
19
- // Maps a record of codecs to a record of their value types.
20
- type InferSchema<S extends Record<string, Codec<unknown>>> = Prettify<{
21
- [K in keyof S]: InferCodec<S[K]>;
22
- }>;
23
-
24
- // Maps a tuple of codecs to a tuple of their value types.
25
- type InferTuple<T extends readonly Codec<unknown>[]> = {
26
- [K in keyof T]: InferCodec<T[K]>;
27
- };
28
-
29
- // Infers the discriminated union from a tagged variant map.
30
- type InferTagged<
31
- Tag extends string,
32
- V extends Record<string, Codec<unknown>>,
33
- > = {
34
- [K in keyof V & string]: Prettify<InferCodec<V[K]> & { [T in Tag]: K }>;
35
- }[keyof V & string];
36
-
37
- // -- Connection --------------------------------------------------------
38
-
39
- export interface Connection {
40
- readonly connected: boolean;
41
- disconnect(this: Connection): void;
42
- }
43
-
44
- // -- Config ------------------------------------------------------------
45
-
46
- export interface RateLimitConfig {
47
- maxPerSecond: number;
48
- burstAllowance?: number;
49
- }
50
-
51
- export interface BoolFieldSpec {
52
- type: "bool";
53
- }
54
-
55
- export interface UintFieldSpec {
56
- type: "uint";
57
- width: number;
58
- }
59
-
60
- export interface IntFieldSpec {
61
- type: "int";
62
- width: number;
63
- }
64
-
65
- export type FieldSpec = BoolFieldSpec | UintFieldSpec | IntFieldSpec;
66
-
67
- type InferFieldSpec<F extends FieldSpec> = F extends BoolFieldSpec
68
- ? boolean
69
- : number;
70
-
71
- type InferBitfield<S extends Record<string, FieldSpec>> = Prettify<{
72
- [K in keyof S]: InferFieldSpec<S[K]>;
73
- }>;
74
-
75
- // -- Target descriptors ------------------------------------------------
76
-
77
- export interface AllTarget {
78
- readonly _tag: "all";
79
- }
80
-
81
- export interface ExceptTarget {
82
- readonly _tag: "except";
83
- readonly _set: ReadonlyMap<Player, true>;
84
- }
85
-
86
- export interface GroupObject {
87
- readonly _tag: "group";
88
- add(this: GroupObject, player: Player): boolean;
89
- remove(this: GroupObject, player: Player): boolean;
90
- has(this: GroupObject, player: Player): boolean;
91
- count(this: GroupObject): number;
92
- forEach(this: GroupObject, fn: (player: Player) => void): void;
93
- getSet(this: GroupObject): ReadonlyMap<Player, true>;
94
- destroy(this: GroupObject): void;
95
- }
96
-
97
- export type Target = Player | AllTarget | ExceptTarget | GroupObject | Player[];
98
-
99
- // -- Scope -------------------------------------------------------------
100
-
101
- export interface Scope {
102
- add(this: Scope, conn: Connection | RBXScriptConnection): void;
103
- listen<T>(this: Scope, source: Packet<T>, callback: (data: T, sender: Player | undefined) => void): void;
104
- once<T>(this: Scope, source: Packet<T>, callback: (data: T, sender: Player | undefined) => void): void;
105
- listenAll(this: Scope, namespace: Namespace, callback: (name: string, data: unknown, sender: Player | undefined) => void): void;
106
- destroy(this: Scope): void;
107
- }
108
-
109
- // -- DROP sentinel -----------------------------------------------------
110
-
111
- export interface DropSentinel {
112
- readonly _tag: "drop";
113
- }
114
-
115
- // -- Packet ------------------------------------------------------------
116
-
117
- export interface PacketConfig<T> {
118
- value: Codec<T>;
119
- unreliable?: boolean;
120
- rateLimit?: RateLimitConfig;
121
- validate?: (data: T, player: Player) => LuaTuple<[boolean, string?]>;
122
- maxPayloadBytes?: number;
123
- }
124
-
125
- export interface Packet<T> {
126
- send(this: Packet<T>, data: T, target?: Target): void;
127
- listen(this: Packet<T>, callback: (data: T, sender: Player | undefined) => void): Connection;
128
- once(this: Packet<T>, callback: (data: T, sender: Player | undefined) => void): Connection;
129
- wait(this: Packet<T>): LuaTuple<[T, Player | undefined]>;
130
- disconnectAll(this: Packet<T>): void;
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
+ }
131
137
  }
132
138
 
133
- // -- Query -------------------------------------------------------------
134
-
135
- export interface QueryConfig<Req, Resp> {
136
- request: Codec<Req>;
137
- response: Codec<Resp>;
138
- timeout?: number;
139
- rateLimit?: RateLimitConfig;
140
- validate?: (data: Req, player: Player) => LuaTuple<[boolean, string?]>;
141
- }
139
+ interface LyncModule {
140
+ // ── Lifecycle ────────────────────────────────────────────────────
142
141
 
143
- export interface Query<Req, Resp> {
144
- listen(
145
- this: Query<Req, Resp>,
146
- callback: (request: Req, player: Player) => Resp | undefined,
147
- ): Connection;
148
- request(this: Query<Req, Resp>, data: Req): Resp | undefined;
149
- requestFrom(this: Query<Req, Resp>, player: Player, data: Req): Resp | undefined;
150
- requestAll(this: Query<Req, Resp>, data: Req): Map<Player, Resp | undefined>;
151
- requestList(
152
- this: Query<Req, Resp>,
153
- players: Player[],
154
- data: Req,
155
- ): Map<Player, Resp | undefined>;
156
- requestGroup(
157
- this: Query<Req, Resp>,
158
- group: GroupObject,
159
- data: Req,
160
- ): Map<Player, Resp | undefined>;
161
- }
142
+ configure(options: Lync.ConfigureOptions): void;
143
+ start(): void;
144
+ readonly started: boolean;
162
145
 
163
- // -- Namespace ---------------------------------------------------------
146
+ // ── Definitions ─────────────────────────────────────────────────
164
147
 
165
- export interface NamespaceConfig {
166
- packets?: Record<string, PacketConfig<unknown>>;
167
- queries?: Record<string, QueryConfig<unknown, unknown>>;
168
- }
169
-
170
- type InferPackets<P extends Record<string, PacketConfig<unknown>>> = {
171
- [K in keyof P]: P[K] extends PacketConfig<infer T> ? Packet<T> : never;
172
- };
173
-
174
- type InferQueries<Q extends Record<string, QueryConfig<unknown, unknown>>> = {
175
- [K in keyof Q]: Q[K] extends QueryConfig<infer Req, infer Resp>
176
- ? Query<Req, Resp>
177
- : never;
178
- };
179
-
180
- export interface Namespace {
181
- readonly packets: Record<string, Packet<unknown>>;
182
- readonly queries: Record<string, Query<unknown, unknown>>;
183
- listenAll(
184
- this: Namespace,
185
- callback: (name: string, data: unknown, sender: Player | undefined) => void,
186
- ): Connection;
187
- onSend(
188
- this: Namespace,
189
- handler: (data: unknown, name: string, player: Player | undefined) => unknown | DropSentinel | undefined,
190
- ): () => void;
191
- onReceive(
192
- this: Namespace,
193
- handler: (data: unknown, name: string, player: Player | undefined) => unknown | DropSentinel | undefined,
194
- ): () => void;
195
- disconnectAll(this: Namespace): void;
196
- destroy(this: Namespace): void;
197
- packetNames(this: Namespace): string[];
198
- queryNames(this: Namespace): string[];
199
- }
148
+ packet<T>(name: string, codec: Lync.Codec<T>, options?: Lync.PacketOptions<T>): Lync.Packet<T>;
200
149
 
201
- // -- Lync --------------------------------------------------------------
202
-
203
- declare namespace Lync {
204
- // Lifecycle
205
- export const VERSION: string;
206
- export function start(): void;
207
-
208
- // Definition
209
- export function definePacket<T>(name: string, config: PacketConfig<T>): Packet<T>;
210
- export function defineQuery<Req, Resp>(
150
+ query<Req, Resp>(
211
151
  name: string,
212
- config: QueryConfig<Req, Resp>,
213
- ): Query<Req, Resp>;
214
- export function defineNamespace<
215
- P extends Record<string, PacketConfig<unknown>> = {},
216
- Q extends Record<string, QueryConfig<unknown, unknown>> = {},
217
- >(
218
- name: string,
219
- config: { packets?: P; queries?: Q },
220
- ): Namespace & InferPackets<P> & InferQueries<Q>;
221
-
222
- // Primitives
223
- export const u8: Codec<number>;
224
- export const u16: Codec<number>;
225
- export const u32: Codec<number>;
226
- export const i8: Codec<number>;
227
- export const i16: Codec<number>;
228
- export const i32: Codec<number>;
229
- export const f32: Codec<number>;
230
- export const f64: Codec<number>;
231
- export const bool: Codec<boolean>;
232
- export const f16: Codec<number>;
233
-
234
- // Datatypes
235
- const string: Codec<string>;
236
- export { string };
237
- export const vec2: Codec<Vector2>;
238
- export const vec3: Codec<Vector3>;
239
- export const cframe: Codec<CFrame>;
240
- export const color3: Codec<Color3>;
241
- export const inst: Codec<Instance>;
242
- export const buff: Codec<buffer>;
243
- export const udim: Codec<UDim>;
244
- export const udim2: Codec<UDim2>;
245
- export const numberRange: Codec<NumberRange>;
246
- export const rect: Codec<Rect>;
247
- export const vec2int16: Codec<Vector2int16>;
248
- export const vec3int16: Codec<Vector3int16>;
249
- export const region3: Codec<Region3>;
250
- export const region3int16: Codec<Region3int16>;
251
- export const ray: Codec<Ray>;
252
- export const numberSequence: Codec<NumberSequence>;
253
- export const colorSequence: Codec<ColorSequence>;
254
-
255
- // Composites
256
- export function struct<S extends Record<string, Codec<unknown>>>(schema: S): Codec<InferSchema<S>>;
257
- export function deltaStruct<S extends Record<string, Codec<unknown>>>(schema: S): Codec<InferSchema<S>>;
258
- export function array<T>(element: Codec<T>, maxCount?: number): Codec<T[]>;
259
- export function deltaArray<T>(element: Codec<T>, maxCount?: number): Codec<T[]>;
260
- export function map<K extends defined, V>(key: Codec<K>, value: Codec<V>, maxCount?: number): Codec<Map<K, V>>;
261
- export function deltaMap<K extends defined, V>(key: Codec<K>, value: Codec<V>, maxCount?: number): Codec<Map<K, V>>;
262
- export function optional<T>(inner: Codec<T>): Codec<T | undefined>;
263
-
264
- // Meta
265
- function _enum<T extends string>(...values: T[]): Codec<T>;
266
- export { _enum as enum };
267
- export function quantizedFloat(min: number, max: number, precision: number): Codec<number>;
268
- export function quantizedVec3(min: number, max: number, precision: number): Codec<Vector3>;
269
- export function bitfield<S extends Record<string, FieldSpec>>(schema: S): Codec<InferBitfield<S>>;
270
- export function tagged<Tag extends string, V extends Record<string, Codec<unknown>>>(
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>>>(
271
246
  tagField: Tag,
272
247
  variants: V,
273
- ): Codec<InferTagged<Tag, V>>;
274
- export function tuple<T extends Codec<unknown>[]>(...codecs: T): Codec<InferTuple<T>>;
275
- export function custom<T>(
276
- size: number,
277
- write: (b: buffer, offset: number, value: T) => void,
278
- read: (b: buffer, offset: number) => T,
279
- ): Codec<T>;
280
- export function boundedString(maxLength: number): Codec<string>;
281
- export const nothing: Codec<undefined>;
282
- export const unknown: Codec<unknown>;
283
- export const auto: Codec<unknown>;
284
-
285
- // Hooks
286
- export function onDrop(
287
- callback: (player: Player, reason: string, packetName: string, data: unknown) => void,
288
- ): () => void;
289
- export function onSend(
290
- handler: (data: unknown, name: string, player: Player | undefined) => unknown | DropSentinel | undefined,
291
- ): () => void;
292
- export function onReceive(
293
- handler: (data: unknown, name: string, player: Player | undefined) => unknown | DropSentinel | undefined,
294
- ): () => void;
295
-
296
- // Target descriptors
297
- export const all: AllTarget;
298
- export function except(...players: Player[]): ExceptTarget;
299
-
300
- // Middleware sentinel
301
- export const DROP: DropSentinel;
302
-
303
- // Groups
304
- export function createGroup(name: string): GroupObject;
305
-
306
- // Scope
307
- export function scope(): Scope;
308
-
309
- // Configuration
310
- export function setChannelMaxSize(bytes: number): void;
311
- export function setValidationDepth(depth: number): void;
312
- export function setPoolSize(count: number): void;
313
-
314
- // Introspection
315
- export function queryPendingCount(): number;
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>;
316
258
  }
317
259
 
318
- export default Lync;
260
+ declare const Lync: LyncModule;
261
+ export = Lync;