import {Socket, SocketType} from "./native" import {Message, MessageLike, Readable, SocketOptions, Writable} from "." import {allowMethods} from "./util" export class Server extends Socket { constructor(options?: SocketOptions) { super(SocketType.Server, options) } } interface ServerRoutingOptions { routingId: number } export interface Server extends Readable<[Message, ServerRoutingOptions]>, Writable {} allowMethods(Server.prototype, ["send", "receive"]) export class Client extends Socket { constructor(options?: SocketOptions) { super(SocketType.Client, options) } } export interface Client extends Readable<[Message]>, Writable {} allowMethods(Client.prototype, ["send", "receive"]) export class Radio extends Socket { constructor(options?: SocketOptions) { super(SocketType.Radio, options) } } interface RadioGroupOptions { group: Buffer | string } // eslint-disable-next-line @typescript-eslint/no-empty-interface export interface Radio extends Writable {} allowMethods(Radio.prototype, ["send"]) export class Dish extends Socket { constructor(options?: SocketOptions) { super(SocketType.Dish, options) } join(...values: Array): void { const {join} = Socket.prototype as Socket & { join: (value: Array) => void } join(values) } leave(...values: Array): void { const {leave} = Socket.prototype as Socket & { leave: (value: Array) => void } leave(values) } } interface DishGroupOptions { group: Buffer } // eslint-disable-next-line @typescript-eslint/no-empty-interface export interface Dish extends Readable<[Message, DishGroupOptions]> {} allowMethods(Dish.prototype, ["receive", "join", "leave"]) export class Gather extends Socket { constructor(options?: SocketOptions) { super(SocketType.Gather, options) } } export interface Gather extends Readable<[Message]> { conflate: boolean } allowMethods(Gather.prototype, ["receive"]) export class Scatter extends Socket { constructor(options?: SocketOptions) { super(SocketType.Scatter, options) } } export interface Scatter extends Writable { conflate: boolean } allowMethods(Scatter.prototype, ["send"]) export class Datagram extends Socket { constructor(options?: SocketOptions) { super(SocketType.Datagram, options) } } export interface Datagram extends Readable<[Message, Message]>, Writable<[MessageLike, MessageLike]> {} allowMethods(Datagram.prototype, ["send", "receive"])