Functional Weave
Code in TypeScript

net.port-list@1.0.0

README.md

1,407 bytes · view raw

# net.port-list

Parses a port list as people type it on a command line or in a config file,
`22,80,8000-8010`, into port numbers: each port once, in the order it was
first given (a scan of `443,22` probes 443 first). Ranges are inclusive, and
every port is checked with `net.port`'s `isPort`, so 0 and 65536 are refused.

## Accepted

- Items separated by commas; spaces and tabs around an item are ignored.
- An item is a port (`80`) or an inclusive range (`8000-8010`).
- Duplicates, including ports already covered by an earlier range, are
  dropped silently, keeping the first.

## Refused, each with its own error

| input | error |
|-------|-------|
| `""`, `"   "` | `port list is empty` |
| `22,,80`, `22,` | `empty item in port list` |
| `ssh`, `+22`, `080`, `80\n`, non-ASCII digits | `invalid port "..."` |
| `0`, `65536`, `100000` | `port "..." is out of range 1-65535` |
| `8000-`, `-22`, `1-2-3` | `invalid port range "..."` |
| `8010-8000` | `port range "8010-8000" runs backwards` |

Leading zeros are refused rather than read as decimal, because some tools read
`080` as octal. A newline is not trimmed: a list read from a file should be
split into lines first. Service names (`ssh`) are not looked up; use
`net.port`'s `portService` to go the other way.

A very wide range such as `1-65535` is allowed and returns 65535 ports; a
caller that sweeps should cap what it is willing to probe.