UNPKG

@rbxts/tether

Version:

A message-based networking solution for Roblox with automatic binary serialization and type validation

46 lines (45 loc) 2.79 kB
import type { Modding } from "@flamework/core"; import type { SerializerMetadata, SerializedData, Transform, Vector, String, u8, u16, u24, u32, i8, i16, i24, i32, f16, f24, f32, f64 } from "@rbxts/serio"; export type MessageCallback<T = unknown> = ServerMessageCallback<T> | ClientMessageCallback<T>; export type ClientMessageCallback<T = unknown> = (data: T) => void; export type ClientMessageFunctionCallback<T = unknown, R = unknown> = (data: T) => R; export type ServerMessageCallback<T = unknown> = (player: Player, data: T) => void; export type ServerMessageFunctionCallback<T = unknown, R = unknown> = (player: Player, data: T) => R; export type BaseMessage = number; export interface PacketInfo { readonly packet: SerializedPacket; readonly unreliable: boolean; } export interface SerializedPacket extends SerializedData { readonly messageBuf: buffer; } export type MessageEvent = (...packets: SerializedPacket[]) => void; type Prev = [never, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24]; type ReplaceByMapWithDepth<T, Depth extends number = 24> = [ Depth ] extends [never] ? T : T extends Callback ? T : T extends Vector ? Vector3 : T extends Transform ? CFrame : T extends String ? string : T extends { _packed: [infer V]; } ? ReplaceByMapWithDepth<V, Prev[Depth]> : T extends { _list: [infer V]; } ? ReplaceByMapWithDepth<V, Depth> : T extends { _tuple: [infer A]; } ? ReplaceByMapWithDepth<A, Prev[Depth]> : T extends { _set: [infer V]; } ? Set<ReplaceByMapWithDepth<V, Prev[Depth]>> : T extends { _set: infer T extends unknown[]; } ? Map<ReplaceByMapWithDepth<T[number], Prev[Depth]>, ReplaceByMapWithDepth<T[number], Prev[Depth]>> : T extends { _map: [infer K, infer V]; } ? Map<ReplaceByMapWithDepth<K, Prev[Depth]>, ReplaceByMapWithDepth<V, Prev[Depth]>> : T extends { _map: [infer V]; } ? Map<ReplaceByMapWithDepth<V, Prev[Depth]>, ReplaceByMapWithDepth<V, Prev[Depth]>> : T extends u8 | u16 | u24 | u32 | i8 | i16 | i24 | i32 | f16 | f24 | f32 | f64 ? number : T extends any[] ? ReplaceByMapWithDepth<T[number], Prev[Depth]>[] : T extends ReadonlyMap<unknown, unknown> ? T : T extends object ? { [K in keyof T]: ReplaceByMapWithDepth<T[K], Prev[Depth]>; } : T; export interface MessageMetadata<MessageData, Kind extends keyof MessageData> { readonly guard: Modding.Generic<ReplaceByMapWithDepth<MessageData[Kind]>, "guard">; readonly serializerMetadata: MessageData[Kind] extends undefined ? undefined : Modding.Many<SerializerMetadata<MessageData[Kind]>>; } export type Guard<T = unknown> = (value: unknown) => value is T; export type MessageEmitterMetadata<MessageData> = { readonly [Kind in keyof MessageData]: MessageMetadata<MessageData, Kind>; }; export {};