///
///
export { capability, context, curveKeyPair, version, Context, Event, EventOfType, EventType, Socket, Observer, Proxy, } from "./native";
import { Context, EventOfType, EventType, Options, Socket } from "./native";
/**
* A type representing the messages that are returned inside promises by
* {@link Readable.receive}().
*/
export type Message = Buffer;
/**
* Union type representing all message types that are accepted by
* {@link Writable.send}().
*/
export type MessageLike = ArrayBufferView | ArrayBuffer | SharedArrayBuffer | string | number | null;
/**
* Describes sockets that can send messages.
*
* @typeparam M The type of the message or message parts that can be sent.
* @typeparam O Rest type for any options, if applicable to the socket type
* (DRAFT only).
*/
export interface Writable {
/**
* ZMQ_MULTICAST_HOPS
*
* Sets the time-to-live field in every multicast packet sent from this
* socket. The default is 1 which means that the multicast packets don't leave
* the local network.
*/
multicastHops: number;
/**
* ZMQ_SNDBUF
*
* Underlying kernel transmit buffer size in bytes. A value of -1 means leave
* the OS default unchanged.
*/
sendBufferSize: number;
/**
* ZMQ_SNDHWM
*
* The high water mark is a hard limit on the maximum number of outgoing
* messages ØMQ shall queue in memory for any single peer that the specified
* socket is communicating with. A value of zero means no limit.
*
* If this limit has been reached the socket shall enter an exceptional state
* and depending on the socket type, ØMQ shall take appropriate action such as
* blocking or dropping sent messages.
*/
sendHighWaterMark: number;
/**
* ZMQ_SNDTIMEO
*
* Sets the timeout for sending messages on the socket. If the value is 0,
* {@link send}() will return a rejected promise immediately if the message
* cannot be sent. If the value is -1, it will wait asynchronously until the
* message is sent. For all other values, it will try to send the message for
* that amount of time before rejecting.
*/
sendTimeout: number;
/**
* Sends a single message or a multipart message on the socket. Queues the
* message immediately if possible, and returns a resolved promise. If the
* message cannot be queued because the high water mark has been reached, it
* will wait asynchronously. The promise will be resolved when the message was
* queued successfully.
*
* ```typescript
* await socket.send("hello world")
* await socket.send(["hello", "world"])
* ```
*
* Queueing may fail eventually if the socket has been configured with a
* {@link sendTimeout}.
*
* A call to {@link send}() is guaranteed to return with a resolved promise
* immediately if the message could be queued directly.
*
* Only **one** asynchronously blocking call to {@link send}() may be executed
* simultaneously. If you call {@link send}() again on a socket that is in the
* mute state it will return a rejected promise with an `EBUSY` error.
*
* The reason for disallowing multiple {@link send}() calls simultaneously is
* that it could create an implicit queue of unsendable outgoing messages.
* This would circumvent the socket's {@link sendHighWaterMark}. Such an
* implementation could even exhaust all system memory and cause the Node.js
* process to abort.
*
* For most application you should not notice this implementation detail. Only
* in rare occasions will a call to {@link send}() that does not resolve
* immediately be undesired. Here are some common scenarios:
*
* * If you wish to **send a message**, use `await send(...)`. ZeroMQ socket
* types have been carefully designed to give you the correct blocking
* behaviour on the chosen socket type in almost all cases:
*
* * If sending is not possible, it is often better to wait than to continue
* as if nothing happened. For example, on a {@link Request} socket, you
* can only receive a reply once a message has been sent; so waiting until
* a message could be queued before continuing with the rest of the
* program (likely to read from the socket) is required.
*
* * Certain socket types (such as {@link Router}) will always allow
* queueing messages and `await send(...)` won't delay any code that comes
* after. This makes sense for routers, since typically you don't want a
* single send operation to stop the handling of other incoming or
* outgoing messages.
*
* * If you wish to send on an occasionally **blocking** socket (for example
* on a {@link Router} with the {@link Router.mandatory} option set, or on a
* {@link Dealer}) and you're 100% certain that **dropping a message is
* better than blocking**, then you can set the {@link sendTimeout} option
* to `0` to effectively force {@link send}() to always resolve immediately.
* Be prepared to catch exceptions if sending a message is not immediately
* possible.
*
* * If you wish to send on a socket and **messages should be queued before
* they are dropped**, you should implement a [simple
* queue](examples/queue/queue.ts) in JavaScript. Such a queue is not
* provided by this library because most real world applications need to
* deal with undeliverable messages in more complex ways - for example, they
* might need to reply with a status message; or first retry delivery a
* certain number of times before giving up.
*
* @param message Single message or multipart message to queue for sending.
* @param options Any options, if applicable to the socket type (DRAFT only).
* @returns Resolved when the message was successfully queued.
*/
send(message: M, ...options: O): Promise;
}
type ReceiveType = T extends {
receive(): Promise;
} ? U : never;
/**
* Describes sockets that can receive messages.
*
* @typeparam M The type of the message or message parts that can be read.
*/
export interface Readable {
/**
* ZMQ_RCVBUF
*
* Underlying kernel receive buffer size in bytes. A value of -1 means leave
* the OS default unchanged.
*/
receiveBufferSize: number;
/**
* ZMQ_RCVHWM
*
* The high water mark is a hard limit on the maximum number of incoming
* messages ØMQ shall queue in memory for any single peer that the specified
* socket is communicating with. A value of zero means no limit.
*
* If this limit has been reached the socket shall enter an exceptional state
* and depending on the socket type, ØMQ shall take appropriate action such as
* blocking or dropping sent messages.
*/
receiveHighWaterMark: number;
/**
* ZMQ_RCVTIMEO
*
* Sets the timeout receiving messages on the socket. If the value is 0,
* {@link receive}() will return a rejected promise immediately if there is no
* message to receive. If the value is -1, it will wait asynchronously until a
* message is available. For all other values, it will wait for a message for
* that amount of time before rejecting.
*/
receiveTimeout: number;
/**
* Waits for the next single or multipart message to become availeble on the
* socket. Reads a message immediately if possible. If no messages can be
* read, it will wait asynchonously. The promise will be resolved with an
* array containing the parts of the next message when available.
*
* ```typescript
* const [msg] = await socket.receive()
* const [part1, part2] = await socket.receive()
* ```
*
* Reading may fail (eventually) if the socket has been configured with a
* {@link receiveTimeout}.
*
* A call to {@link receive}() is guaranteed to return with a resolved promise
* immediately if a message could be read from the socket directly.
*
* Only **one** asynchronously blocking call to {@link receive}() can be in
* progress simultaneously. If you call {@link receive}() again on the same
* socket it will return a rejected promise with an `EBUSY` error. For
* example, if no messages can be read and no `await` is used:
*
* ```typescript
* socket.receive() // -> pending promise until read is possible
* socket.receive() // -> promise rejection with `EBUSY` error
* ```
*
* **Note:** Due to the nature of Node.js and to avoid blocking the main
* thread, this method always attempts to read messages with the
* `ZMQ_DONTWAIT` flag. It polls asynchronously if reading is not currently
* possible. This means that all functionality related to timeouts and
* blocking behaviour is reimplemented in the Node.js bindings. Any
* differences in behaviour with the native ZMQ library is considered a bug.
*
* @returns Resolved with message parts that were successfully read.
*/
receive(): Promise;
/**
* Asynchronously iterate over messages becoming available on the socket. When
* the socket is closed with {@link Socket.close}(), the iterator will return.
* Returning early from the iterator will **not** close the socket unless it
* also goes out of scope.
*
* ```typescript
* for await (const [msg] of socket) {
* // handle messages
* }
* ```
*/
[Symbol.asyncIterator](): AsyncIterator, undefined>;
}
/**
* Represents the options that can be assigned in the constructor of a given
* socket type, for example `new Dealer({...})`. Readonly options
* for the particular socket will be omitted.
*
* @typeparam S The socket type to which the options should be applied.
*/
export type SocketOptions = Options;
export interface EventSubscriber {
/**
* Adds a listener function which will be invoked when the given event type is
* observed. Calling this method will convert the {@link Observer} to **event
* emitter mode**, which will make it impossible to call
* {@link Observer.receive}() at the same time.
*
* ```typescript
* socket.events.on("bind", event => {
* console.log(`Socket bound to ${event.address}`)
* // ...
* })
* ```
*
* @param type The type of event to listen for.
* @param listener The listener function that will be called with all event
* data when the event is observed.
*/
on(type: E, listener: (data: EventOfType) => void): EventSubscriber;
/**
* Removes the specified listener function from the list of functions to call
* when the given event is observed.
*
* @param type The type of event that the listener was listening for.
* @param listener The previously registered listener function.
*/
off(type: E, listener: (data: EventOfType) => void): EventSubscriber;
}
declare module "./native" {
interface Context {
/**
* ZMQ_BLOCKY
*
* By default the context will block forever when closed at process exit.
* The assumption behind this behavior is that abrupt termination will cause
* message loss. Most real applications use some form of handshaking to
* ensure applications receive termination messages, and then terminate the
* context with {@link Socket.linger} set to zero on all sockets. This
* setting is an easier way to get the same result. When {@link blocky} is
* set to `false`, all new sockets are given a linger timeout of zero. You
* must still close all sockets before exiting.
*/
blocky: boolean;
/**
* ZMQ_IO_THREADS
*
* Size of the ØMQ thread pool to handle I/O operations. If your application
* is using only the `inproc` transport for messaging you may set this to
* zero, otherwise set it to at least one (default).
*/
ioThreads: number;
/**
* ZMQ_MAX_MSGSZ
*
* Maximum allowed size of a message sent in the context.
*/
maxMessageSize: number;
/**
* ZMQ_MAX_SOCKETS
*
* Maximum number of sockets allowed on the context.
*/
maxSockets: number;
/**
* ZMQ_IPV6
*
* Enable or disable IPv6. When IPv6 is enabled, a socket will connect to,
* or accept connections from, both IPv4 and IPv6 hosts.
*/
ipv6: boolean;
/**
* ZMQ_THREAD_PRIORITY
*
* Scheduling priority for internal context's thread pool. This option is
* not available on Windows. Supported values for this option depend on
* chosen scheduling policy. Details can be found at
* http://man7.org/linux/man-pages/man2/sched_setscheduler.2.html. This
* option only applies before creating any sockets on the context.
*
* @writeonly
*/
threadPriority: number;
/**
* ZMQ_THREAD_SCHED_POLICY
*
* Scheduling policy for internal context's thread pool. This option is not
* available on Windows. Supported values for this option can be found at
* http://man7.org/linux/man-pages/man2/sched_setscheduler.2.html. This
* option only applies before creating any sockets on the context.
*
* @writeonly
*/
threadSchedulingPolicy: number;
/**
* ZMQ_SOCKET_LIMIT
*
* Largest number of sockets that can be set with {@link maxSockets}.
*
* @readonly
*/
readonly maxSocketsLimit: number;
}
/**
* Socket option names differ somewhat from the native libzmq option names.
* This is intentional to improve readability and be more idiomatic for
* JavaScript/TypeScript.
*/
interface Socket {
/**
* ZMQ_AFFINITY
*
* I/O thread affinity, which determines which threads from the ØMQ I/O
* thread pool associated with the socket's context shall handle newly
* created connections.
*
* **Note:** This value is a bit mask, but values higher than
* `Number.MAX_SAFE_INTEGER` may not be represented accurately! This
* currently means that configurations beyond 52 threads are unreliable.
*/
affinity: number;
/**
* ZMQ_RATE
*
* Maximum send or receive data rate for multicast transports such as `pgm`.
*/
rate: number;
/**
* ZMQ_RECOVERY_IVL
*
* Maximum time in milliseconds that a receiver can be absent from a
* multicast group before unrecoverable data loss will occur.
*/
recoveryInterval: number;
/**
* ZMQ_LINGER
*
* Determines how long pending messages which have yet to be sent to a peer
* shall linger in memory after a socket is closed with {@link close}().
*/
linger: number;
/**
* ZMQ_RECONNECT_IVL
*
* Period ØMQ shall wait between attempts to reconnect disconnected peers
* when using connection-oriented transports. The value -1 means no
* reconnection.
*/
reconnectInterval: number;
/**
* ZMQ_BACKLOG
*
* Maximum length of the queue of outstanding peer connections for the
* specified socket. This only applies to connection-oriented transports.
*/
backlog: number;
/**
* ZMQ_RECONNECT_IVL_MAX
*
* Maximum period ØMQ shall wait between attempts to reconnect. On each
* reconnect attempt, the previous interval shall be doubled until
* {@link reconnectMaxInterval} is reached. This allows for exponential
* backoff strategy. Zero (the default) means no exponential backoff is
* performed and reconnect interval calculations are only based on
* {@link reconnectInterval}.
*/
reconnectMaxInterval: number;
/**
* ZMQ_MAXMSGSIZE
*
* Limits the size of the inbound message. If a peer sends a message larger
* than the limit it is disconnected. Value of -1 means no limit.
*/
maxMessageSize: number;
/**
* ZMQ_TCP_KEEPALIVE
*
* Override SO_KEEPALIVE socket option (if supported by OS). The default
* value of -1 leaves it to the OS default.
*/
tcpKeepalive: number;
/**
* ZMQ_TCP_KEEPALIVE_CNT
*
* Overrides TCP_KEEPCNT socket option (if supported by OS). The default
* value of -1 leaves it to the OS default.
*/
tcpKeepaliveCount: number;
/**
* ZMQ_TCP_KEEPALIVE_IDLE
*
* Overrides TCP_KEEPIDLE / TCP_KEEPALIVE socket option (if supported by
* OS). The default value of -1 leaves it to the OS default.
*/
tcpKeepaliveIdle: number;
/**
* ZMQ_TCP_KEEPALIVE_INTVL
*
* Overrides TCP_KEEPINTVL socket option (if supported by the OS). The
* default value of -1 leaves it to the OS default.
*/
tcpKeepaliveInterval: number;
/**
* ZMQ_TCP_ACCEPT_FILTER
*
* Assign a filter that will be applied for each new TCP transport
* connection on a listening socket. If no filters are applied, then the TCP
* transport allows connections from any IP address. If at least one filter
* is applied then new connection source IP should be matched. To clear all
* filters set to `null`. Filter is a string with IPv6 or IPv4 CIDR.
*/
tcpAcceptFilter: string | null;
/**
* ZMQ_IMMEDIATE
*
* By default queues will fill on outgoing connections even if the
* connection has not completed. This can lead to "lost" messages on sockets
* with round-robin routing ({@link Request}, {@link Push}, {@link Dealer}).
* If this option is set to `true`, messages shall be queued only to
* completed connections. This will cause the socket to block if there are
* no other connections, but will prevent queues from filling on pipes
* awaiting connection.
*/
immediate: boolean;
/**
* ZMQ_IPV6
*
* Enable or disable IPv6. When IPv6 is enabled, the socket will connect to,
* or accept connections from, both IPv4 and IPv6 hosts.
*/
ipv6: boolean;
/**
* ZMQ_PLAIN_SERVER
*
* Defines whether the socket will act as server for PLAIN security. A value
* of `true` means the socket will act as PLAIN server. A value of `false`
* means the socket will not act as PLAIN server, and its security role then
* depends on other option settings.
*/
plainServer: boolean;
/**
* ZMQ_PLAIN_USERNAME
*
* Sets the username for outgoing connections over TCP or IPC. If you set
* this to a non-null value, the security mechanism used for connections
* shall be PLAIN.
*/
plainUsername: string | null;
/**
* ZMQ_PLAIN_PASSWORD
*
* Sets the password for outgoing connections over TCP or IPC. If you set
* this to a non-null value, the security mechanism used for connections
* shall be PLAIN.
*/
plainPassword: string | null;
/**
* ZMQ_CURVE_SERVER
*
* Defines whether the socket will act as server for CURVE security. A value
* of `true` means the socket will act as CURVE server. A value of `false`
* means the socket will not act as CURVE server, and its security role then
* depends on other option settings.
*/
curveServer: boolean;
/**
* ZMQ_CURVE_PUBLICKEY
*
* Sets the socket's long term public key. You must set this on CURVE client
* sockets. A server socket does not need to know its own public key. You
* can create a new keypair with {@link curveKeyPair}().
*/
curvePublicKey: string | null;
/**
* ZMQ_CURVE_SECRETKEY
*
* Sets the socket's long term secret key. You must set this on both CURVE
* client and server sockets. You can create a new keypair with
* {@link curveKeyPair}().
*/
curveSecretKey: string | null;
/**
* ZMQ_CURVE_SERVERKEY
*
* Sets the socket's long term server key. This is the public key of the
* CURVE *server* socket. You must set this on CURVE *client* sockets. This
* key must have been generated together with the server's secret key. You
* can create a new keypair with {@link curveKeyPair}().
*/
curveServerKey: string | null;
/** */
gssapiServer: boolean;
/** */
gssapiPrincipal: string | null;
/** */
gssapiServicePrincipal: string | null;
/** */
gssapiPlainText: boolean;
/** */
gssapiPrincipalNameType: "hostBased" | "userName" | "krb5Principal";
/** */
gssapiServicePrincipalNameType: "hostBased" | "userName" | "krb5Principal";
/**
* ZMQ_ZAP_DOMAIN
*
* Sets the domain for ZAP (ZMQ RFC 27) authentication. For NULL security
* (the default on all `tcp://` connections), ZAP authentication only
* happens if you set a non-empty domain. For PLAIN and CURVE security, ZAP
* requests are always made, if there is a ZAP handler present. See
* http://rfc.zeromq.org/spec:27 for more details.
*/
zapDomain: string | null;
/**
* ZMQ_TOS
*
* Sets the ToS fields (the *Differentiated Services* (DS) and *Explicit
* Congestion Notification* (ECN) field) of the IP header. The ToS field is
* typically used to specify a packet's priority. The availability of this
* option is dependent on intermediate network equipment that inspect the
* ToS field and provide a path for low-delay, high-throughput,
* highly-reliable service, etc.
*/
typeOfService: number;
/**
* ZMQ_HANDSHAKE_IVL
*
* Handshaking is the exchange of socket configuration information (socket
* type, identity, security) that occurs when a connection is first opened
* (only for connection-oriented transports). If handshaking does not
* complete within the configured time, the connection shall be closed. The
* value 0 means no handshake time limit.
*/
handshakeInterval: number;
/**
* ZMQ_SOCKS_PROXY
*
* The SOCKS5 proxy address that shall be used by the socket for the TCP
* connection(s). Does not support SOCKS5 authentication. If the endpoints
* are domain names instead of addresses they shall not be resolved and they
* shall be forwarded unchanged to the SOCKS proxy service in the client
* connection request message (address type 0x03 domain name).
*/
socksProxy: string | null;
/**
* ZMQ_HEARTBEAT_IVL
*
* Interval in milliseconds between sending ZMTP heartbeats for the
* specified socket. If this option is greater than 0, then a PING ZMTP
* command will be sent after every interval.
*/
heartbeatInterval: number;
/**
* ZMQ_HEARTBEAT_TTL
*
* The timeout in milliseconds on the remote peer for ZMTP heartbeats. If
* this option is greater than 0, the remote side shall time out the
* connection if it does not receive any more traffic within the TTL period.
* This option does not have any effect if {@link heartbeatInterval} is 0.
* Internally, this value is rounded down to the nearest decisecond, any
* value less than 100 will have no effect.
*/
heartbeatTimeToLive: number;
/**
* ZMQ_HEARTBEAT_TIMEOUT
*
* How long (in milliseconds) to wait before timing-out a connection after
* sending a PING ZMTP command and not receiving any traffic. This option is
* only valid if {@link heartbeatInterval} is greater than 0. The connection
* will time out if there is no traffic received after sending the PING
* command. The received traffic does not have to be a PONG command - any
* received traffic will cancel the timeout.
*/
heartbeatTimeout: number;
/**
* ZMQ_CONNECT_TIMEOUT
*
* Sets how long to wait before timing-out a connect() system call. The
* connect() system call normally takes a long time before it returns a time
* out error. Setting this option allows the library to time out the call at
* an earlier interval.
*/
connectTimeout: number;
/**
* ZMQ_TCP_MAXRT
*
* Sets how long before an unacknowledged TCP retransmit times out (if
* supported by the OS). The system normally attempts many TCP retransmits
* following an exponential backoff strategy. This means that after a
* network outage, it may take a long time before the session can be
* re-established. Setting this option allows the timeout to happen at a
* shorter interval.
*/
tcpMaxRetransmitTimeout: number;
/**
* ZMQ_MULTICAST_MAXTPDU
*
* Sets the maximum transport data unit size used for outbound multicast
* packets. This must be set at or below the minimum Maximum Transmission
* Unit (MTU) for all network paths over which multicast reception is
* required.
*/
multicastMaxTransportDataUnit: number;
/**
* ZMQ_VMCI_BUFFER_SIZE
*
* The size of the underlying buffer for the socket. Used during negotiation
* before the connection is established.
* For `vmci://` transports only.
*/
vmciBufferSize: number;
/**
* ZMQ_VMCI_BUFFER_MIN_SIZE
*
* Minimum size of the underlying buffer for the socket. Used during
* negotiation before the connection is established.
* For `vmci://` transports only.
*/
vmciBufferMinSize: number;
/**
* ZMQ_VMCI_BUFFER_MAX_SIZE
*
* Maximum size of the underlying buffer for the socket. Used during
* negotiation before the connection is established.
* For `vmci://` transports only.
*/
vmciBufferMaxSize: number;
/**
* ZMQ_VMCI_CONNECT_TIMEOUT
*
* Connection timeout for the socket.
* For `vmci://` transports only.
*/
vmciConnectTimeout: number;
/**
* ZMQ_BINDTODEVICE
*
* Binds the socket to the given network interface (Linux only). Allows to
* use Linux VRF, see:
* https://www.kernel.org/doc/Documentation/networking/vrf.txt. Requires the
* program to be ran as root **or** with `CAP_NET_RAW`.
*/
interface: string | null;
/**
* ZMQ_ZAP_ENFORCE_DOMAIN
*
* The ZAP (ZMQ RFC 27) authentication protocol specifies that a domain must
* always be set. Older versions of libzmq did not follow the spec and
* allowed an empty domain to be set. This option can be used to enabled or
* disable the stricter, backward incompatible behaviour. For now it is
* disabled by default, but in a future version it will be enabled by
* default.
*/
zapEnforceDomain: boolean;
/**
* ZMQ_LOOPBACK_FASTPATH
*
* Enable faster TCP connections on loopback devices. An application can
* enable this option to reduce the latency and improve the performance of
* loopback operations on a TCP socket on Windows.
*
* @windows
*/
loopbackFastPath: boolean;
/**
* ZMQ_TYPE
*
* Retrieve the socket type. This is fairly useless because you can test the
* socket class with e.g. `socket instanceof Dealer`.
*
* @readonly
*/
readonly type: SocketType;
/**
* ZMQ_LAST_ENDPOINT
*
* The last endpoint bound for TCP and IPC transports.
*
* @readonly
*/
readonly lastEndpoint: string | null;
/**
* ZMQ_MECHANISM
*
* Returns the current security mechanism for the socket, if any. The
* security mechanism is set implictly by using any of the relevant security
* options. The returned value is one of:
* * `null` - No security mechanism is used.
* * `"plain"` - The PLAIN mechanism defines a simple username/password
* mechanism that lets a server authenticate a client. PLAIN makes no
* attempt at security or confidentiality.
* * `"curve"` - The CURVE mechanism defines a mechanism for secure
* authentication and confidentiality for communications between a client
* and a server. CURVE is intended for use on public networks.
* * `"gssapi"` - The GSSAPI mechanism defines a mechanism for secure
* authentication and confidentiality for communications between a client
* and a server using the Generic Security Service Application Program
* Interface (GSSAPI). The GSSAPI mechanism can be used on both public and
* private networks.
*
* @readonly
*/
readonly securityMechanism: null | "plain" | "curve" | "gssapi";
/**
* ZMQ_THREAD_SAFE
*
* Whether or not the socket is threadsafe. Currently only DRAFT sockets is
* thread-safe.
*
* @readonly
*/
readonly threadSafe: boolean;
}
interface Observer extends EventSubscriber {
/**
* Asynchronously iterate over socket events. When the socket is closed or
* when the observer is closed manually with {@link Observer.close}(), the
* iterator will return.
*
* ```typescript
* for await (event of socket.events) {
* switch (event.type) {
* case "bind":
* console.log(`Socket bound to ${event.address}`)
* break
* // ...
* }
* }
* ```
*/
[Symbol.asyncIterator](): AsyncIterator, undefined>;
}
}
/**
* A {@link Pair} socket can only be connected to one other {@link Pair} at any
* one time. No message routing or filtering is performed on any messages.
*
* When a {@link Pair} socket enters the mute state due to having reached the
* high water mark for the connected peer, or if no peer is connected, then any
* {@link Writable.send}() operations on the socket shall block until the peer
* becomes available for sending; messages are not discarded.
*
* While {@link Pair} sockets can be used over transports other than
* `inproc://`, their inability to auto-reconnect coupled with the fact new
* incoming connections will be terminated while any previous connections
* (including ones in a closing state) exist makes them unsuitable for `tcp://`
* in most cases.
*/
export declare class Pair extends Socket {
constructor(options?: SocketOptions);
}
export interface Pair extends Writable, Readable {
}
/**
* A {@link Publisher} socket is used to distribute data to {@link Subscriber}s.
* Messages sent are distributed in a fan out fashion to all connected peers.
* This socket cannot receive messages.
*
* When a {@link Publisher} enters the mute state due to having reached the high
* water mark for a connected {@link Subscriber}, then any messages that would
* be sent to the subscriber in question shall instead be dropped until the mute
* state ends. The {@link Writable.send}() method will never block.
*/
export declare class Publisher extends Socket {
/**
* ZMQ_XPUB_NODROP
*
* Sets the socket behaviour to return an error if the high water mark is
* reached and the message could not be send. The default is to drop the
* message silently when the peer high water mark is reached.
*/
noDrop: boolean;
/**
* ZMQ_CONFLATE
*
* If set to `true`, a socket shall keep only one message in its
* inbound/outbound queue: the last message to be received/sent. Ignores any
* high water mark options. Does not support multi-part messages - in
* particular, only one part of it is kept in the socket internal queue.
*/
conflate: boolean;
/**
* ZMQ_INVERT_MATCHING
*
* Causes messages to be sent to all connected sockets except those subscribed
* to a prefix that matches the message.
*
* All {@link Subscriber} sockets connecting to the {@link Publisher} must
* also have the option set to `true`. Failure to do so will have the
* {@link Subscriber} sockets reject everything the {@link Publisher} socket
* sends them.
*/
invertMatching: boolean;
constructor(options?: SocketOptions);
}
export interface Publisher extends Writable {
}
/**
* A {@link Subscriber} socket is used to subscribe to data distributed by a
* {@link Publisher}. Initially a {@link Subscriber} is not subscribed to any
* messages. Use {@link Subscriber.subscribe}() to specify which messages to
* subscribe to. This socket cannot send messages.
*/
export declare class Subscriber extends Socket {
/**
* ZMQ_CONFLATE
*
* If set to `true`, a socket shall keep only one message in its
* inbound/outbound queue: the last message to be received/sent. Ignores any
* high water mark options. Does not support multi-part messages - in
* particular, only one part of it is kept in the socket internal queue.
*/
conflate: boolean;
/**
* ZMQ_INVERT_MATCHING
*
* Causes incoming messages that do not match any of the socket's
* subscriptions to be received by the user.
*
* All {@link Subscriber} sockets connecting to a {@link Publisher} must also
* have the option set to `true`. Failure to do so will have the
* {@link Subscriber} sockets reject everything the {@link Publisher} socket
* sends them.
*/
invertMatching: boolean;
constructor(options?: SocketOptions);
/**
* Establish a new message filter. Newly created {@link Subsriber} sockets
* will filtered out all incoming messages. Call this method to subscribe to
* messages beginning with the given prefix.
*
* Multiple filters may be attached to a single socket, in which case a
* message shall be accepted if it matches at least one filter. Subscribing
* without any filters shall subscribe to **all** incoming messages.
*
* ```typescript
* const sub = new Subscriber()
*
* // Listen to all messages beginning with 'foo'.
* sub.subscribe("foo")
*
* // Listen to all incoming messages.
* sub.subscribe()
* ```
*
* @param prefixes The prefixes of messages to subscribe to.
*/
subscribe(...prefixes: Array): void;
/**
* Remove an existing message filter which was previously established with
* {@link subscribe}(). Stops receiving messages with the given prefix.
*
* Unsubscribing without any filters shall unsubscribe from the "subscribe
* all" filter that is added by calling {@link subscribe}() without arguments.
*
* ```typescript
* const sub = new Subscriber()
*
* // Listen to all messages beginning with 'foo'.
* sub.subscribe("foo")
* // ...
*
* // Stop listening to messages beginning with 'foo'.
* sub.unsubscribe("foo")
* ```
*
* @param prefixes The prefixes of messages to subscribe to.
*/
unsubscribe(...prefixes: Array): void;
}
export interface Subscriber extends Readable {
}
/**
* A {@link Request} socket acts as a client to send requests to and receive
* replies from a {@link Reply} socket. This socket allows only an alternating
* sequence of {@link Writable.send}() and subsequent {@link Readable.receive}()
* calls. Each request sent is round-robined among all services, and each reply
* received is matched with the last issued request.
*
* If no services are available, then any send operation on the socket shall
* block until at least one service becomes available. The REQ socket shall not
* discard messages.
*/
export declare class Request extends Socket {
/**
* ZMQ_ROUTING_ID
*
* The identity of the specified socket when connecting to a `Router` socket.
*/
routingId: string | null;
/**
* ZMQ_PROBE_ROUTER
*
* When set to `true`, the socket will automatically send an empty message
* when a new connection is made or accepted. You may set this on sockets
* connected to a {@link Router} socket. The application must filter such
* empty messages. This option provides the {@link Router} with an event
* signaling the arrival of a new peer.
*
* *Warning:** Do not set this option on a socket that talks to any other
* socket type except {@link Router}: the results are undefined.
*
* @writeonly
*/
probeRouter: boolean;
/**
* ZMQ_REQ_CORRELATE
*
* The default behaviour of {@link Request} sockets is to rely on the ordering
* of messages to match requests and responses and that is usually sufficient.
* When this option is set to `true` the socket will prefix outgoing messages
* with an extra frame containing a request id. That means the full message is
* `[, `null`, user frames…]`. The {@link Request} socket will
* discard all incoming messages that don't begin with these two frames.
*/
correlate: boolean;
/**
* ZMQ_REQ_RELAXED
*
* By default, a {@link Request} socket does not allow initiating a new
* request until the reply to the previous one has been received. When set to
* `true`, sending another message is allowed and previous replies will be
* discarded. The request-reply state machine is reset and a new request is
* sent to the next available peer.
*
* **Note:** If set to `true`, also enable {@link correlate} to ensure correct
* matching of requests and replies. Otherwise a late reply to an aborted
* request can be reported as the reply to the superseding request.
*/
relaxed: boolean;
constructor(options?: SocketOptions);
}
export interface Request extends Readable, Writable {
}
/**
* A {@link Reply} socket can act as a server which receives requests from and
* sends replies to a {@link Request} socket. This socket type allows only an
* alternating sequence of {@link Readable.receive}() and subsequent
* {@link Writable.send}() calls. Each request received is fair-queued from
* among all clients, and each reply sent is routed to the client that issued
* the last request. If the original requester does not exist any more the reply
* is silently discarded.
*/
export declare class Reply extends Socket {
/**
* ZMQ_ROUTING_ID
*
* The identity of the specified socket when connecting to a `Router` socket.
*/
routingId: string | null;
constructor(options?: SocketOptions);
}
export interface Reply extends Readable, Writable {
}
/**
* A {@link Dealer} socket can be used to extend request/reply sockets. Each
* message sent is round-robined among all connected peers, and each message
* received is fair-queued from all connected peers.
*
* When a {@link Dealer} socket enters the mute state due to having reached the
* high water mark for all peers, or if there are no peers at all, then any
* {@link Writable.send}() operations on the socket shall block until the mute
* state ends or at least one peer becomes available for sending; messages are
* not discarded.
*
* When a {@link Dealer} is connected to a {@link Reply} socket, each message
* sent must consist of an empty message part, the delimiter, followed by one or
* more body parts.
*/
export declare class Dealer extends Socket {
/**
* ZMQ_ROUTING_ID
*
* The identity of the specified socket when connecting to a `Router` socket.
*/
routingId: string | null;
/**
* ZMQ_PROBE_ROUTER
*
* When set to `true`, the socket will automatically send an empty message
* when a new connection is made or accepted. You may set this on sockets
* connected to a {@link Router} socket. The application must filter such
* empty messages. This option provides the {@link Router} with an event
* signaling the arrival of a new peer.
*
* *Warning:** Do not set this option on a socket that talks to any other
* socket type except {@link Router}: the results are undefined.
*
* @writeonly
*/
probeRouter: boolean;
/**
* ZMQ_CONFLATE
*
* If set to `true`, a socket shall keep only one message in its
* inbound/outbound queue: the last message to be received/sent. Ignores any
* high water mark options. Does not support multi-part messages - in
* particular, only one part of it is kept in the socket internal queue.
*/
conflate: boolean;
constructor(options?: SocketOptions);
}
export interface Dealer extends Readable, Writable {
}
/**
* A {@link Router} can be used to extend request/reply sockets. When receiving
* messages a {@link Router} shall prepend a message part containing the routing
* id of the originating peer to the message. Messages received are fair-queued
* from among all connected peers. When sending messages, the first part of the
* message is removed and used to determine the routing id of the peer the
* message should be routed to.
*
* If the peer does not exist anymore, or has never existed, the message shall
* be silently discarded. However, if {@link Router.mandatory} is set to `true`,
* the socket shall fail with a `EHOSTUNREACH` error in both cases.
*
* When a {@link Router} enters the mute state due to having reached the high
* water mark for all peers, then any messages sent to the socket shall be
* dropped until the mute state ends. Likewise, any messages routed to a peer
* for which the individual high water mark has been reached shall also be
* dropped. If {@link Router.mandatory} is set to `true` the socket shall block
* or return an `EAGAIN` error in both cases.
*
* When a {@link Request} socket is connected to a {@link Router}, in addition
* to the routing id of the originating peer each message received shall contain
* an empty delimiter message part. Hence, the entire structure of each received
* message as seen by the application becomes: one or more routing id parts,
* delimiter part, one or more body parts. When sending replies to a
* {@link Request} the delimiter part must be included.
*/
export declare class Router extends Socket {
/**
* ZMQ_ROUTING_ID
*
* The identity of the specified socket when connecting to a `Router` socket.
*/
routingId: string | null;
/**
* ZMQ_ROUTER_MANDATORY
*
* A value of `false` is the default and discards the message silently when it
* cannot be routed or the peer's high water mark is reached. A value of
* `true` causes {@link send}() to fail if it cannot be routed, or wait
* asynchronously if the high water mark is reached.
*/
mandatory: boolean;
/**
* ZMQ_PROBE_ROUTER
*
* When set to `true`, the socket will automatically send an empty message
* when a new connection is made or accepted. You may set this on sockets
* connected to a {@link Router} socket. The application must filter such
* empty messages. This option provides the {@link Router} with an event
* signaling the arrival of a new peer.
*
* *Warning:** Do not set this option on a socket that talks to any other
* socket type except {@link Router}: the results are undefined.
*
* @writeonly
*/
probeRouter: boolean;
/**
* ZMQ_ROUTER_HANDOVER
*
* If two clients use the same identity when connecting to a {@link Router},
* the results shall depend on the this option. If it set to `false`
* (default), the {@link Router} socket shall reject clients trying to connect
* with an already-used identity. If it is set to `true`, the {@link Router}
* socket shall hand-over the connection to the new client and disconnect the
* existing one.
*/
handover: boolean;
constructor(options?: SocketOptions);
/**
* Connects to the given remote address. To specificy a specific routing id,
* provide a `routingId` option. The identity should be unique, from 1 to 255
* bytes long and MAY NOT start with binary zero.
*
* @param address The `tcp://` address to connect to.
* @param options Any connection options.
*/
connect(address: string, options?: RouterConnectOptions): void;
}
export interface RouterConnectOptions {
routingId?: string;
}
export interface Router extends Readable, Writable {
}
/**
* A {@link Pull} socket is used by a pipeline node to receive messages from
* upstream pipeline nodes. Messages are fair-queued from among all connected
* upstream nodes. This socket cannot send messages.
*/
export declare class Pull extends Socket {
constructor(options?: SocketOptions);
}
export interface Pull extends Readable {
/**
* ZMQ_CONFLATE
*
* If set to `true`, a socket shall keep only one message in its
* inbound/outbound queue: the last message to be received/sent. Ignores any
* high water mark options. Does not support multi-part messages - in
* particular, only one part of it is kept in the socket internal queue.
*/
conflate: boolean;
}
/**
* A {@link Push} socket is used by a pipeline node to send messages to
* downstream pipeline nodes. Messages are round-robined to all connected
* downstream nodes. This socket cannot receive messages.
*
* When a {@link Push} socket enters the mute state due to having reached the
* high water mark for all downstream nodes, or if there are no downstream nodes
* at all, then {@link Writable.send}() will block until the mute state ends or
* at least one downstream node becomes available for sending; messages are not
* discarded.
*/
export declare class Push extends Socket {
constructor(options?: SocketOptions);
}
export interface Push extends Writable {
/**
* ZMQ_CONFLATE
*
* If set to `true`, a socket shall keep only one message in its
* inbound/outbound queue: the last message to be received/sent. Ignores any
* high water mark options. Does not support multi-part messages - in
* particular, only one part of it is kept in the socket internal queue.
*/
conflate: boolean;
}
/**
* Same as {@link Publisher}, except that you can receive subscriptions from the
* peers in form of incoming messages. Subscription message is a byte 1 (for
* subscriptions) or byte 0 (for unsubscriptions) followed by the subscription
* body. Messages without a sub/unsub prefix are also received, but have no
* effect on subscription status.
*/
export declare class XPublisher extends Socket {
/**
* ZMQ_XPUB_NODROP
*
* Sets the socket behaviour to return an error if the high water mark is
* reached and the message could not be send. The default is to drop the
* message silently when the peer high water mark is reached.
*/
noDrop: boolean;
/**
* ZMQ_XPUB_MANUAL
*
* Sets the {@link XPublisher} socket subscription handling mode to
* manual/automatic. A value of `true` will change the subscription requests
* handling to manual.
*/
manual: boolean;
/**
* ZMQ_XPUB_WELCOME_MSG
*
* Sets a welcome message that will be recieved by subscriber when connecting.
* Subscriber must subscribe to the welcome message before connecting. For
* welcome messages to work well, poll on incoming subscription messages on
* the {@link XPublisher} socket and handle them.
*/
welcomeMessage: string | null;
/**
* ZMQ_INVERT_MATCHING
*
* Causes messages to be sent to all connected sockets except those subscribed
* to a prefix that matches the message.
*/
invertMatching: boolean;
/**
* ZMQ_XPUB_VERBOSE / ZMQ_XPUB_VERBOSER
*
* Whether to pass any duplicate subscription/unsuscription messages.
* * `null` (default) - Only unique subscribe and unsubscribe messages are
* visible to the caller.
* * `"allSubs"` - All subscribe messages (including duplicates) are visible
* to the caller, but only unique unsubscribe messages are visible.
* * `"allSubsUnsubs"` - All subscribe and unsubscribe messages (including
* duplicates) are visible to the caller.
*/
set verbosity(value: null | "allSubs" | "allSubsUnsubs");
constructor(options?: SocketOptions);
}
export interface XPublisher extends Readable, Writable {
}
/**
* Same as {@link Subscriber}, except that you subscribe by sending subscription
* messages to the socket. Subscription message is a byte 1 (for subscriptions)
* or byte 0 (for unsubscriptions) followed by the subscription body. Messages
* without a sub/unsub prefix may also be sent, but have no effect on
* subscription status.
*/
export declare class XSubscriber extends Socket {
constructor(options?: SocketOptions);
}
export interface XSubscriber extends Readable, Writable {
}
/**
* A {@link Stream} is used to send and receive TCP data from a non-ØMQ peer
* with the `tcp://` transport. A {@link Stream} can act as client and/or
* server, sending and/or receiving TCP data asynchronously.
*
* When sending and receiving data with {@link Writable.send}() and
* {@link Readable.receive}(), the first message part shall be the routing id of
* the peer. Unroutable messages will cause an error.
*
* When a connection is made to a {@link Stream}, a zero-length message will be
* received. Similarly, when the peer disconnects (or the connection is lost), a
* zero-length message will be received.
*
* To close a specific connection, {@link Writable.send}() the routing id frame
* followed by a zero-length message.
*
* To open a connection to a server, use {@link Stream.connect}().
*/
export declare class Stream extends Socket {
/**
* ZMQ_STREAM_NOTIFY
*
* Enables connect and disconnect notifications on a {@link Stream} when set
* to `true`. When notifications are enabled, the socket delivers a
* zero-length message when a peer connects or disconnects.
*/
notify: boolean;
constructor(options?: SocketOptions);
/**
* Connects to the given remote address. To specificy a specific routing id,
* provide a `routingId` option. The identity should be unique, from 1 to 255
* bytes long and MAY NOT start with binary zero.
*
* @param address The `tcp://` address to connect to.
* @param options Any connection options.
*/
connect(address: string, options?: StreamConnectOptions): void;
}
export interface StreamConnectOptions {
routingId?: string;
}
export interface Stream extends Readable<[Message, Message]>, Writable<[MessageLike, MessageLike]> {
}