@jsenv/server 11.0.0 → 12.0.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
@@ -70,7 +70,10 @@ const notFoundService = (request) => {
70
70
  }
71
71
 
72
72
  const server = await startServer({
73
- requestToResponse: composeServices(indexService, notFoundService),
73
+ requestToResponse: composeServices({
74
+ index: indexService,
75
+ otherwise: notFoundService,
76
+ }),
74
77
  })
75
78
 
76
79
  const fetch = await import("node-fetch")
package/main.js CHANGED
@@ -5,10 +5,8 @@
5
5
  */
6
6
 
7
7
  export { startServer } from "./src/startServer.js"
8
- export {
9
- composeServices,
10
- composeServicesWithTiming,
11
- } from "./src/service_composition/service_composition.js"
8
+ export { composeServices } from "./src/service_composition/service_composition.js"
9
+ export { setupRoutes } from "./src/service_composition/routing.js"
12
10
  export { jsenvServerInternalErrorToResponse } from "./src/jsenvServerInternalErrorToResponse.js"
13
11
  export { readRequestBody } from "./src/readRequestBody.js"
14
12
  export { fetchFileSystem } from "./src/fetch_filesystem.js"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jsenv/server",
3
- "version": "11.0.0",
3
+ "version": "12.0.0",
4
4
  "description": "Write your Node.js server using pure functions",
5
5
  "license": "MIT",
6
6
  "author": {
@@ -13,7 +13,7 @@
13
13
  "url": "https://github.com/jsenv/server"
14
14
  },
15
15
  "engines": {
16
- "node": ">=14.17.0"
16
+ "node": ">=16.12.0"
17
17
  },
18
18
  "publishConfig": {
19
19
  "access": "public"
@@ -25,6 +25,7 @@
25
25
  },
26
26
  "./*": "./*"
27
27
  },
28
+ "main": "./main.js",
28
29
  "files": [
29
30
  "/src/",
30
31
  "/main.js"
@@ -48,28 +49,26 @@
48
49
  "@jsenv/abort": "4.1.1",
49
50
  "@jsenv/logger": "4.0.1",
50
51
  "@jsenv/url-meta": "6.0.1",
51
- "node-fetch": "2.6.2"
52
+ "node-fetch": "2.6.2",
53
+ "path-to-regexp": "6.2.0"
52
54
  },
53
55
  "devDependencies": {
54
- "@babel/core": "7.16.0",
55
- "@babel/eslint-parser": "7.16.0",
56
56
  "@jsenv/assert": "2.3.2",
57
- "@jsenv/codecov-upload": "3.5.0",
58
- "@jsenv/core": "23.7.1",
59
- "@jsenv/eslint-config": "16.0.8",
57
+ "@jsenv/core": "23.10.0",
58
+ "@jsenv/eslint-config": "16.0.9",
60
59
  "@jsenv/filesystem": "2.5.1",
61
60
  "@jsenv/github-release-package": "1.2.3",
62
- "@jsenv/https-local": "1.0.2",
61
+ "@jsenv/https-local": "1.0.3",
63
62
  "@jsenv/importmap-eslint-resolver": "5.1.2",
64
- "@jsenv/importmap-node-module": "2.4.1",
63
+ "@jsenv/importmap-node-module": "2.7.1",
65
64
  "@jsenv/package-publish": "1.6.2",
66
65
  "@jsenv/performance-impact": "2.2.1",
67
66
  "@jsenv/prettier-check-project": "5.6.1",
68
- "eslint": "7.32.0",
69
- "eslint-plugin-import": "2.25.2",
67
+ "eslint": "8.2.0",
68
+ "eslint-plugin-import": "2.25.3",
70
69
  "eventsource": "1.1.0",
71
- "fastify": "3.22.1",
72
- "fastify-static": "4.4.2",
70
+ "fastify": "3.24.0",
71
+ "fastify-static": "4.5.0",
73
72
  "playwright": "1.16.3",
74
73
  "prettier": "2.4.1"
75
74
  }
@@ -16,8 +16,6 @@ export const pluginRequestWaitingCheck = ({
16
16
  } = {}) => {
17
17
  return {
18
18
  plugin_request_waiting_check: {
19
- init: () => {},
20
-
21
19
  onRequest: (request, { logger }) => {
22
20
  const timeout = setTimeout(
23
21
  () => requestWaitingCallback({ request, logger, requestWaitingMs }),
@@ -0,0 +1,35 @@
1
+ import { createRequire } from "node:module"
2
+
3
+ const require = createRequire(import.meta.url)
4
+
5
+ export const setupRoutes = (routes) => {
6
+ const { match } = require("path-to-regexp")
7
+
8
+ const candidates = Object.keys(routes).map((pathPattern) => {
9
+ const applyPatternMatching = match(pathPattern, {
10
+ decode: decodeURIComponent,
11
+ })
12
+ return {
13
+ applyPatternMatching,
14
+ requestHandler: routes[pathPattern],
15
+ }
16
+ })
17
+
18
+ return (request, { pushResponse, redirectRequest }) => {
19
+ let result
20
+ const found = candidates.find((candidate) => {
21
+ result = candidate.applyPatternMatching(request.pathname)
22
+ return Boolean(result)
23
+ })
24
+ if (found) {
25
+ return found.requestHandler(
26
+ {
27
+ ...request,
28
+ routeParams: result.params,
29
+ },
30
+ { pushResponse, redirectRequest },
31
+ )
32
+ }
33
+ return null
34
+ }
35
+ }
@@ -2,27 +2,7 @@ import { timeFunction } from "@jsenv/server/src/server_timing/timing_measure.js"
2
2
  import { composeTwoResponses } from "@jsenv/server/src/internal/response_composition.js"
3
3
  import { applyRedirectionToRequest } from "@jsenv/server/src/internal/request_factory.js"
4
4
 
5
- export const composeServices = (...callbacks) => {
6
- return (request, { pushResponse }) => {
7
- const redirectRequest = (requestRedirection) => {
8
- request = applyRedirectionToRequest(request, requestRedirection)
9
- return null
10
- }
11
-
12
- return firstOperationMatching({
13
- array: callbacks,
14
- start: (callback) => callback(request, { pushResponse, redirectRequest }),
15
- predicate: (returnValue) => {
16
- if (returnValue === null || typeof returnValue !== "object") {
17
- return false
18
- }
19
- return true
20
- },
21
- })
22
- }
23
- }
24
-
25
- export const composeServicesWithTiming = (namedServices) => {
5
+ export const composeServices = (namedServices) => {
26
6
  return async (request, { pushResponse }) => {
27
7
  const redirectRequest = (requestRedirection) => {
28
8
  request = applyRedirectionToRequest(request, requestRedirection)
@@ -483,6 +483,7 @@ export const startServer = async ({
483
483
  if (onRequest) {
484
484
  const returnValue = onRequest(request, {
485
485
  warn,
486
+ logger,
486
487
  shortcircuitResponse,
487
488
  redirectRequest,
488
489
  })
@@ -729,12 +730,10 @@ const generateResponseDescription = async ({
729
730
  requestToResponse,
730
731
  request,
731
732
  pushResponse,
732
- requestFactory,
733
733
  }) => {
734
734
  try {
735
735
  const returnValue = await requestToResponse(request, {
736
736
  pushResponse,
737
- requestFactory,
738
737
  })
739
738
  return {
740
739
  responseProperties: returnValue,