Skip to main content
Deno 2 is finally here šŸŽ‰ļø
Learn more

Deno CI

/x/socket_fetch

What?

A remake of some fetch() functionality in pure TypeScript, with a set of pluggable Dialer implementations to customize how network connections are established.

Support for:

  • http: over TCP
  • https: over TCP + TLS
  • http+unix: over stream-type Unix Domain Sockets (UDS)

Note that this module can & should be deprecated once Denoā€™s HTTP builtins provide comparable networking functionality.

Why?

Denoā€™s fetch() APIs are relatively limited for a server-side runtime. Numerous advanced network features have been lacking:

Unfortunately, HTTP over UNIX domain sockets and HTTPS to IP addresses are both really useful in modern/containerized cloud architecture. For example, the Docker Engine listens only at /var/run/docker.sock by default, and Google Kubernetes Engine HTTPS APIs are only externally reachable via IP address.

In order to support connecting to these endpoints from various modules, Iā€™ve opted to leverage Denoā€™s TCP primitives directly in a new module.

When?

Consider this library if you:

  • Need to send basic HTTP requests to a daemon that listens on a Unix socket
    • Docker Engine, tailscaled, Podman, snapd, etc
  • Need to communicate with an HTTPS endpoint that doesnā€™t have a proper DNS name
    • Google Kubernetes Engine API, Kubernetes nodes/pods, IoT devices on your LAN
    • You just need to provide any DNS name that is on the serverā€™s certificate
  • Need to use a service which has a different DNS name and TLS name
    • I have no examples of this, and I hope you donā€™t either.

Implemented features

  • Protocols:
    • http:
    • https:
    • http+unix:
  • Requests:
    • Headers
    • Buffered bodies
    • Streaming bodies
  • Responses:
    • Headers
    • Buffered bodies
    • Streaming bodies

Remaining work

  • Rewrite with /std/io/buffer.ts (added in Deno v1.8.3)
  • Enable/test connection reuse
  • Figure out TLS client certificates (missing in Deno.startTls())
  • Implement error handling

What about WebSocket?

In addition to the fetch() limitations listed above, Denoā€™s WebSocket API is even further behind:

A similar reimplementation effort already exists for WebSocket and so far it addresses custom request headers.