# posix-socket

> POSIX Socket API on nodeJS

Latest version **1.1.4** (published 2022-02-15) · MIT license · 0 weekly downloads

## Install

```sh
npm install posix-socket
pnpm add posix-socket
yarn add posix-socket
bun add posix-socket
```

## Health

**Score 15/100 (F)** — status: abandoned.

Positive: no vulnerabilities.

Warnings: low downloads; no types; no esm support.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 1.1.4 |
| Published | 2022-02-15 |
| First published | 2018-07-28 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | none |
| Module format | CommonJS |
| Node | >=12.0.0 <13.0.0 \|\| >=14.0.0 |
| Dependencies | 1 |
| Unpacked size | 57.6 KB |
| Known vulnerabilities | 0 |
| Install scripts | yes |
| GitHub stars | 1 |
| Author | Laurent Christophe |
| Maintainers | lachrist |
| Keywords | POSIX, Socket, C++, Addon, Synchronous, Low-Level |

## Links

- npm: https://www.npmjs.com/package/posix-socket
- Repository: https://github.com/lachrist/posix-socket
- Homepage: http://github.com/lachrist/posix-socket
- Issues: https://github.com/lachrist/posix-socket/issues
- npm.io page: https://npm.io/package/posix-socket

## Dependencies (1)

- [node-gyp](https://npm.io/package/node-gyp.md) ^8.4.0

## Alternatives

- [@opentelemetry/exporter-zipkin](https://npm.io/package/@opentelemetry/exporter-zipkin.md) — 14.8M weekly downloads
- [pusher-js](https://npm.io/package/pusher-js.md) — 2.0M weekly downloads
- [browserify](https://npm.io/package/browserify.md) — 1.7M weekly downloads
- [sqs-consumer](https://npm.io/package/sqs-consumer.md) — 1.7M weekly downloads
- [@sanity/eventsource](https://npm.io/package/@sanity/eventsource.md) — 930.8K weekly downloads

## Recent versions

- 1.1.4 (latest) — 2022-02-15
- 1.1.3 — 2021-12-21
- 1.1.2 — 2021-11-11
- 1.1.1 — 2021-10-25
- 1.1.0 — 2021-05-28
- 1.0.1 — 2021-04-10
- 1.0.0 — 2021-04-10
- 0.0.11 — 2019-10-04
- 0.0.10 — 2019-05-20
- 0.0.9 — 2019-03-01
- 0.0.8 — 2019-02-09
- 0.0.7 — 2018-09-04
- 0.0.6 — 2018-08-18
- 0.0.5 — 2018-08-18
- 0.0.4 — 2018-08-17
- … 4 more at https://npm.io/package/posix-socket/versions

## README

# PosixSocket

This npm module makes the POSIX Socket API available to node with minimal changes.

* `sockfd = socket(domain, type, protocol)`
* `bind(sockfd, addr)`
* `accept(sockfd, addr)`
* `connect(sockfd, addr)`
* `send(sockfd, buf, len, flags)`
* `sendto(sockfd, buf, len, flags, dest_addr)`
* `recv(sockfd, buf, len, flags)`
* `recvfrom(sockfd, buf, len, flags, src_addr)`
* `close(fd)`
* `shutdown(sockfd, how)`
* `getsockopt(sockfd, level, optname)`
* `setsockopt(sockfd, level, optname, optval)`

Differences with the POSIX Socket API:

1. Socket addresses are specified as JavaScript objects.
   Currently, only three address families are supported:
   * Local/Unix (`sockaddr_un`): `{sun_family:1, sun_path:"path/to/unix-sock.sock"}`.
   * Inet (`sockaddr_in`): `{sin_family:2, sin_port:8080, sin_addr:"127.0.0.1"}`.
   * Inet6 (`sockaddr_in6`): `{sin6_family:24, sin6_port:8080, sin6_flowinfo:0, sin6_addr:"::1", sin6_scope_id:0}`.
2. The length of socket addresses is computed by the module.
3. In `getsockopt` and `setsockopt`: `optval` can only be a number.

I made this module to perform fast synchronous communication between node processes.
Please, don't ask me why I needed the perform synchronous communication.
Without C++ addon, this can only be achieved with the synchronous API of `fs` / `child_process`.
Both these solutions are incredibly inefficient.

# Example

## Server

```js
const PosixSocket = require("posix-socket");
const sockfd = PosixSocket.socket(PosixSocket.AF_UNIX, PosixSocket.SOCK_STREAM, 0);
PosixSocket.bind(sockfd, {
  sun_family: PosixSocket.AF_UNIX,
  sun_path: "/tmp/yo.sock"
});
PosixSocket.listen(sockfd, 1);
const address = {};
const sockfd1 = PosixSocket.accept(sockfd, address);
console.log("connection accepted from", address);
const buffer = new ArrayBuffer(100);
const size = PosixSocket.recv(sockfd1, buffer, buffer.byteLength, 0);
console.log("got: <"+String.fromCharCode.apply(null, new Uint16Array(buffer, 0, size))+">");
PosixSocket.close(sockfd);
require("fs").unlinkSync("/tmp/yo.sock");
```

## Client

```js
const PosixSocket = require("posix-socket");
const sockfd = PosixSocket.socket(PosixSocket.AF_UNIX, PosixSocket.SOCK_STREAM, 0);
PosixSocket.connect(sockfd, {
  sun_family: PosixSocket.AF_UNIX,
  sun_path: "/tmp/yo.sock"
});
const buffer = new ArrayBuffer(100);
const view = new Uint16Array(buffer, 0, buffer.length);
const string = "HelloWorld!";
for (let i = 0; i<string.length; i++)
  view[i] = string.charCodeAt(i);
PosixSocket.send(sockfd, buffer, string.length*view.BYTES_PER_ELEMENT, 0);
PosixSocket.close(sockfd);
```

## Troubleshooting

https://github.com/nodejs/node-gyp/blob/master/macOS_Catalina.md

---
_Source: https://npm.io/package/posix-socket · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
