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"]) const join = (Socket.prototype as any).join const leave = (Socket.prototype as any).leave export class Dish extends Socket { constructor(options?: SocketOptions) { super(SocketType.Dish, options) } /* TODO: These methods might accept arrays in their C++ implementation for the sake of simplicity. */ join(...values: Array): void { for (const value of values) { join(value) } } leave(...values: Array): void { for (const value of values) { leave(value) } } } 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"])