Skip to content

Commit

Permalink
feat: name and random options
Browse files Browse the repository at this point in the history
  • Loading branch information
pooya parsa committed Jun 1, 2020
1 parent 36d12d3 commit ccea688
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 26 deletions.
22 changes: 17 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,13 +31,25 @@ Try sequence is: port > ports > memo > random

```ts
interface GetPortOptions {
ports?: number[]
port?: number
memoDir?: string
memoName?: string
name?: string
random?: boolean
port?: number
ports?: number[]
memoDir?: string
memoName?: string
}
```

### `name`

Unique name for port memorizing. Default is `default`.

### `random`

If enabled, `port` and `ports` will be ignored. Default is `false`.

### `port`

First port to check. Default is `process.env.PORT || 3000`
Expand All @@ -46,7 +58,7 @@ First port to check. Default is `process.env.PORT || 3000`

Alternative ports to check. Default is `[4000, 5000, 6000, 7000]`

### `memoDir`/`memoName`
### `memoDir` / `memoName`

Options passed to [fs-memo](https://github.com/nuxt-contrib/fs-memo)

Expand Down
53 changes: 32 additions & 21 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,47 +2,58 @@ import { createServer, AddressInfo } from 'net'
import { getMemo, setMemo } from 'fs-memo'

interface GetPortOptions {
ports: number[]
port: number
memoDir: string
memoName: string
name?: string

random?: boolean
port?: number
ports?: number[]

memoDir?: string
memoName?: string
}

const defaults: GetPortOptions = {
ports: [4000, 5000, 6000, 7000],
const defaults = {
name: 'default',

random: false,
port: parseInt(process.env.PORT || '') || 3000,
ports: [4000, 5000, 6000, 7000],

memoDir: __dirname,
memoName: '.get-port'
}

export default async function getPort (_options: Partial<GetPortOptions> = {}): Promise<number> {
const options = { ...defaults, _options }
export default async function getPort (options?: GetPortOptions): Promise<number> {
const opts = { ...defaults, ...options }

const portsToCheck: number[] = []

// options.port
if (options.port) {
portsToCheck.push(options.port)
}
if (!opts.random) {
// options.port
if (opts.port) {
portsToCheck.push(opts.port)
}

// options.ports
if (Array.isArray(options.ports)) {
portsToCheck.push(...options.ports)
// options.ports
if (Array.isArray(opts.ports)) {
portsToCheck.push(...opts.ports)
}
}

// Memo
const memoOptions = { name: options.memoName, dir: options.memoDir }
const memoOptions = { name: opts.memoName, dir: opts.memoDir }
const memoKey = 'port_' + name
const memo = await getMemo(memoOptions)
if (memo.port) {
portsToCheck.push(memo.port)
if (memo[memoKey]) {
portsToCheck.push(memo[memoKey])
}

const port = await checkPorts(portsToCheck)
const availablePort = await checkPorts(portsToCheck)

// Persist
await setMemo({ port }, memoOptions)
await setMemo({ [memoKey]: availablePort }, memoOptions)

return port
return availablePort
}

async function checkPorts (ports: number[]): Promise<number> {
Expand Down

0 comments on commit ccea688

Please sign in to comment.