@jsenv/server 12.5.9 → 12.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # server [![npm package](https://img.shields.io/npm/v/@jsenv/server.svg?logo=npm&label=package)](https://www.npmjs.com/package/@jsenv/server) [![github workflow](https://github.com/jsenv/server/workflows/main/badge.svg)](https://github.com/jsenv/server/actions?workflow=main) [![codecov coverage](https://codecov.io/gh/jsenv/server/branch/main/graph/badge.svg)](https://codecov.io/gh/jsenv/server)
1
+ # server [![npm package](https://img.shields.io/npm/v/@jsenv/server.svg?logo=npm&label=package)](https://www.npmjs.com/package/@jsenv/server)
2
2
 
3
3
  `@jsenv/server` helps to write flexible server code with a declarative API.
4
4
 
@@ -7,7 +7,6 @@ import { startServer } from "@jsenv/server"
7
7
 
8
8
  await startServer({
9
9
  protocol: "http",
10
- ip: "127.0.0.1",
11
10
  port: 8080,
12
11
  requestToResponse: () => {
13
12
  return {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jsenv/server",
3
- "version": "12.5.9",
3
+ "version": "12.6.0",
4
4
  "description": "Write your Node.js server using pure functions",
5
5
  "license": "MIT",
6
6
  "author": {
@@ -2,43 +2,37 @@ import { networkInterfaces } from "os"
2
2
  import { URL } from "url"
3
3
 
4
4
  export const getServerOrigins = ({ protocol, ip, port }) => {
5
+ const isInternalIp = ip === "127.0.0.1"
6
+ const internalOrigin = createServerOrigin({
7
+ protocol,
8
+ hostname: "localhost",
9
+ port,
10
+ })
11
+ if (isInternalIp) {
12
+ return { internal: internalOrigin }
13
+ }
14
+ const isAnyIp = !ip || ip === "::" || ip === "0.0.0.0"
5
15
  return {
6
- main: createServerOrigin({ protocol, ip, port }),
7
- external: createServerOrigin({ protocol, ip: getExternalIp(ip), port }),
16
+ internal: internalOrigin,
17
+ external: createServerOrigin({
18
+ protocol,
19
+ hostname: isAnyIp ? getExternalIp(ip) : ip,
20
+ port,
21
+ }),
8
22
  }
9
23
  }
10
24
 
11
- const createServerOrigin = ({ protocol, ip, port }) => {
25
+ const createServerOrigin = ({ protocol, hostname, port }) => {
12
26
  const url = new URL("https://127.0.0.1:80")
13
-
14
27
  url.protocol = protocol
15
- url.hostname = ipToHostname(ip)
28
+ url.hostname = hostname
16
29
  url.port = port
17
-
18
30
  return url.origin
19
31
  }
20
32
 
21
- const ipToHostname = (
22
- ip,
23
- {
24
- preferLocalhost = true,
25
- preferLocalIp = false,
26
- preferExternalIp = false,
27
- } = {},
28
- ) => {
29
- if (ip === "0.0.0.0" || !ip) {
30
- if (preferLocalhost) return "localhost"
31
- if (preferLocalIp) return "127.0.0.1"
32
- if (preferExternalIp) return getExternalIp(ip) || "0.0.0.0"
33
- return "0.0.0.0"
34
- }
35
- return ip
36
- }
37
-
38
33
  const getExternalIp = () => {
39
34
  const networkInterfaceMap = networkInterfaces()
40
35
  let internalIPV4NetworkAddress
41
-
42
36
  Object.keys(networkInterfaceMap).find((key) => {
43
37
  const networkAddressArray = networkInterfaceMap[key]
44
38
  return networkAddressArray.find((networkAddress) => {
@@ -48,6 +42,5 @@ const getExternalIp = () => {
48
42
  return true
49
43
  })
50
44
  })
51
-
52
45
  return internalIPV4NetworkAddress ? internalIPV4NetworkAddress.address : null
53
46
  }
@@ -20,7 +20,6 @@ const listen = async ({
20
20
  ip,
21
21
  })
22
22
  }
23
-
24
23
  listeningOperation.throwIfAborted()
25
24
  port = await startListening({ server, port, ip })
26
25
  listeningOperation.addAbortCallback(() => stopListening(server))
@@ -43,7 +42,6 @@ export const findFreePort = async (
43
42
  } = {},
44
43
  ) => {
45
44
  const findFreePortOperation = Abort.startOperation()
46
-
47
45
  try {
48
46
  findFreePortOperation.addAbortSignal(signal)
49
47
  findFreePortOperation.throwIfAborted()
@@ -61,7 +59,6 @@ export const findFreePort = async (
61
59
  }
62
60
  return testUntil(nextPort, ip)
63
61
  }
64
-
65
62
  const freePort = await testUntil(initialPort, ip)
66
63
  return freePort
67
64
  } finally {
@@ -40,6 +40,7 @@ import {
40
40
  export const startServer = async ({
41
41
  signal = new AbortController().signal,
42
42
  logLevel,
43
+ startLog = true,
43
44
  serverName = "server",
44
45
 
45
46
  protocol = "http",
@@ -47,7 +48,8 @@ export const startServer = async ({
47
48
  http1Allowed = true,
48
49
  redirectHttpToHttps,
49
50
  allowHttpRequestOnHttps = false,
50
- ip = "0.0.0.0", // will it work on windows ? https://github.com/nodejs/node/issues/14900
51
+ listenAnyIp = false,
52
+ ip = listenAnyIp ? undefined : "127.0.0.1",
51
53
  port = 0, // assign a random available port
52
54
  portHint,
53
55
  privateKey,
@@ -207,7 +209,7 @@ export const startServer = async ({
207
209
 
208
210
  status = "opened"
209
211
  const serverOrigins = getServerOrigins({ protocol, ip, port })
210
- const serverOrigin = serverOrigins.main
212
+ const serverOrigin = serverOrigins.internal
211
213
 
212
214
  const removeConnectionErrorListener = listenServerConnectionError(
213
215
  nodeServer,
@@ -734,9 +736,11 @@ export const startServer = async ({
734
736
  // ensure we don't try to handle new requests while server is stopping
735
737
  stopCallbackList.add(removeRequestListener)
736
738
 
737
- logger.info(
738
- `${serverName} started at ${serverOrigin} (${serverOrigins.external})`,
739
- )
739
+ if (startLog) {
740
+ logger.info(
741
+ `${serverName} started at ${serverOrigin} (${serverOrigins.external})`,
742
+ )
743
+ }
740
744
 
741
745
  const addEffect = (callback) => {
742
746
  const cleanup = callback()
@@ -748,6 +752,7 @@ export const startServer = async ({
748
752
  return {
749
753
  getStatus: () => status,
750
754
  origin: serverOrigin,
755
+ origins: serverOrigins,
751
756
  nodeServer,
752
757
  stop,
753
758
  stoppedPromise,