@4players/odin-common
Version:
Commonly used type definitions and utility functions across ODIN web projects
116 lines (115 loc) • 3.48 kB
TypeScript
import { type infer as ZodInfer, type ZodType } from 'zod';
import type { RpcSchema } from './serialization.ts';
import type { PeerId, PeerPosition } from './schema/peer.ts';
import type { MediaId, MediaProperties } from './schema/media.ts';
import type { RoomId } from './schema/room.ts';
import type { WebRtcUpdate } from './schema/webrtc.ts';
export type CommandSchema = {
request: RpcSchema;
response: RpcSchema;
};
export type Commands = Record<string, CommandSchema>;
export type CommandRequest<C extends Commands, K extends keyof C> = ZodInfer<C[K]['request']>;
export type CommandResponse<C extends Commands, K extends keyof C> = ZodInfer<C[K]['response']>;
export type ParsedCommand<C extends Commands, K extends keyof C = keyof C> = {
[Name in K]: {
name: Name;
request: ZodInfer<C[Name]['request']>;
};
}[K];
export declare function parseCommand<C extends Commands, K extends keyof C>(name: K, request: unknown, schema: C): ParsedCommand<C, K> | undefined;
export declare function parseRequest<C extends Commands, K extends keyof C>(name: K, request: unknown, schema: C): CommandRequest<C, K>;
export declare function parseResponse<C extends Commands, K extends keyof C>(name: K, response: unknown, schema: C): CommandResponse<C, K> | undefined;
export type MainCommands = {
Hello: {
request: ZodType<{
stream: 'main';
}>;
response: ZodType<null>;
};
JoinRoom: {
request: ZodType<{
token: string;
room_id: RoomId;
user_data: Uint8Array;
position: PeerPosition;
}>;
response: ZodType<{
peer_id: PeerId;
stream_id?: number;
token?: string;
}>;
};
WebRtcUpdate: {
request: ZodType<WebRtcUpdate>;
response: ZodType<null>;
};
RequestReconnectToken: {
request: ZodType<{
peer_id?: PeerId;
}>;
response: ZodType<string>;
};
Ping: {
request: ZodType<Record<PropertyKey, never>>;
response: ZodType<null>;
};
};
export declare const MainCommandsRpc: MainCommands;
export type RoomCommands = {
Hello: {
request: ZodType<{
stream: 'room';
token: string;
room_id: string;
user_data: Uint8Array;
position: PeerPosition;
}>;
response: ZodType<null>;
};
UpdatePeer: {
request: ZodType<{
user_data: Uint8Array;
}>;
response: ZodType<null>;
};
StartMedia: {
request: ZodType<{
media_id: MediaId;
properties: MediaProperties;
}>;
response: ZodType<null>;
};
StopMedia: {
request: ZodType<{
media_id: MediaId;
}>;
response: ZodType<null>;
};
PauseMedia: {
request: ZodType<{
media_id: MediaId;
}>;
response: ZodType<null>;
};
ResumeMedia: {
request: ZodType<{
media_id: MediaId;
}>;
response: ZodType<null>;
};
SetPeerPosition: {
request: ZodType<{
position: PeerPosition;
}>;
response: ZodType<null>;
};
SendMessage: {
request: ZodType<{
target_peer_ids?: PeerId[];
message: Uint8Array;
}>;
response: ZodType<null>;
};
};
export declare const RoomCommandsRpc: RoomCommands;