@boo-labs/server 0.0.0-stage → 1.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.
Files changed (114) hide show
  1. package/README.md +229 -2
  2. package/index.mjs +23 -0
  3. package/package.json +71 -4
  4. package/source/application/Kernel/index.mjs +1137 -0
  5. package/source/application/Server/index.mjs +1201 -0
  6. package/source/application/configurations/Http2CleartextServerConfiguration/index.mjs +168 -0
  7. package/source/application/configurations/Http2SecureServerConfiguration/index.mjs +172 -0
  8. package/source/application/configurations/HttpServerConfiguration/index.mjs +169 -0
  9. package/source/application/configurations/HttpsServerConfiguration/index.mjs +172 -0
  10. package/source/application/configurations/ServerConfiguration/Options/CORSOptions/CORSOptionsValue.mjs +158 -0
  11. package/source/application/configurations/ServerConfiguration/Options/CORSOptions/index.mjs +87 -0
  12. package/source/application/configurations/ServerConfiguration/Options/CSRFOptions/CSRFOptionsValue.mjs +178 -0
  13. package/source/application/configurations/ServerConfiguration/Options/CSRFOptions/index.mjs +80 -0
  14. package/source/application/configurations/ServerConfiguration/Options/CompressOptions/CompressOptionsValue.mjs +126 -0
  15. package/source/application/configurations/ServerConfiguration/Options/CompressOptions/index.mjs +81 -0
  16. package/source/application/configurations/ServerConfiguration/Options/CookieParserOptions/CookieParserOptionsValue.mjs +107 -0
  17. package/source/application/configurations/ServerConfiguration/Options/CookieParserOptions/index.mjs +82 -0
  18. package/source/application/configurations/ServerConfiguration/Options/CookieSessionOptions/CookieSessionOptionsValue.mjs +182 -0
  19. package/source/application/configurations/ServerConfiguration/Options/CookieSessionOptions/index.mjs +86 -0
  20. package/source/application/configurations/ServerConfiguration/Options/ListenOptions/ListenOptionsValue.mjs +95 -0
  21. package/source/application/configurations/ServerConfiguration/Options/ListenOptions/index.mjs +47 -0
  22. package/source/application/configurations/ServerConfiguration/Options/MiddlewareOption.mjs +102 -0
  23. package/source/application/configurations/ServerConfiguration/Options/Options.mjs +105 -0
  24. package/source/application/configurations/ServerConfiguration/Options/RateLimitOptions/RateLimitOptionsValue.mjs +164 -0
  25. package/source/application/configurations/ServerConfiguration/Options/RateLimitOptions/index.mjs +84 -0
  26. package/source/application/configurations/ServerConfiguration/Options/RequestOptions/RequestOptionsValue.mjs +108 -0
  27. package/source/application/configurations/ServerConfiguration/Options/RequestOptions/index.mjs +47 -0
  28. package/source/application/configurations/ServerConfiguration/Options/ResponseOptions/ResponseOptionsValue.mjs +101 -0
  29. package/source/application/configurations/ServerConfiguration/Options/ResponseOptions/index.mjs +47 -0
  30. package/source/application/configurations/ServerConfiguration/Options/SecurityHeadersOptions/SecurityHeadersOptionsValue.mjs +272 -0
  31. package/source/application/configurations/ServerConfiguration/Options/SecurityHeadersOptions/index.mjs +85 -0
  32. package/source/application/configurations/ServerConfiguration/Options/ServerOption.mjs +50 -0
  33. package/source/application/configurations/ServerConfiguration/Options/StaticOptions/StaticOptionsValue.mjs +164 -0
  34. package/source/application/configurations/ServerConfiguration/Options/StaticOptions/index.mjs +89 -0
  35. package/source/application/configurations/ServerConfiguration/index.mjs +781 -0
  36. package/source/application/resolvers/TransportResolver/index.mjs +119 -0
  37. package/source/application/use-cases/CloseServer/index.mjs +85 -0
  38. package/source/application/use-cases/ListenServer/index.mjs +98 -0
  39. package/source/core/EventSystem/index.mjs +110 -0
  40. package/source/core/Exchange/ExchangeContext.mjs +291 -0
  41. package/source/core/Exchange/Telemetry.mjs +193 -0
  42. package/source/core/Exchange/index.mjs +604 -0
  43. package/source/core/ExchangeLayerBuilder/index.mjs +133 -0
  44. package/source/core/IPCMain/IPCMain.mjs +507 -0
  45. package/source/core/IPCMain/IPCProtocol.mjs +441 -0
  46. package/source/core/IPCMain/IPCServerChannel.mjs +331 -0
  47. package/source/core/IPCMain/WebSocketAdapter.mjs +189 -0
  48. package/source/core/Request/BodyParser/BodyParser.mjs +197 -0
  49. package/source/core/Request/BodyParser/JSONParser.mjs +70 -0
  50. package/source/core/Request/BodyParser/MultipartParser.mjs +612 -0
  51. package/source/core/Request/BodyParser/URLEncodedParser.mjs +71 -0
  52. package/source/core/Request/RequestHeaders.mjs +177 -0
  53. package/source/core/Request/index.mjs +805 -0
  54. package/source/core/Response/ResponseHeaders.mjs +402 -0
  55. package/source/core/Response/index.mjs +1370 -0
  56. package/source/core/middlewares/CORSMiddleware/index.mjs +289 -0
  57. package/source/core/middlewares/CSRFMiddleware/index.mjs +284 -0
  58. package/source/core/middlewares/CompressMiddleware/index.mjs +460 -0
  59. package/source/core/middlewares/CookieParserMiddleware/index.mjs +194 -0
  60. package/source/core/middlewares/CookieSessionMiddleware/index.mjs +460 -0
  61. package/source/core/middlewares/RateLimitMiddleware/index.mjs +245 -0
  62. package/source/core/middlewares/SecurityHeadersMiddleware/index.mjs +151 -0
  63. package/source/core/middlewares/StaticMiddleware/index.mjs +628 -0
  64. package/source/core/routing/ExchangeLayer/ExchangeMatcher.mjs +127 -0
  65. package/source/core/routing/ExchangeLayer/index.mjs +254 -0
  66. package/source/core/routing/Pipeline/index.mjs +157 -0
  67. package/source/core/routing/Router/Route.mjs +184 -0
  68. package/source/core/routing/Router/index.mjs +523 -0
  69. package/source/core/routing/RouterRegister/OptionsMiddleware.mjs +147 -0
  70. package/source/core/routing/RouterRegister/index.mjs +150 -0
  71. package/source/core/routing/RouterSystem/index.mjs +225 -0
  72. package/source/core/value-objects/Address/index.mjs +281 -0
  73. package/source/core/value-objects/Endpoint/index.mjs +293 -0
  74. package/source/index.mjs +62 -0
  75. package/source/infrastructure/adapters/Http2Adapter/index.mjs +144 -0
  76. package/source/infrastructure/adapters/Http2CleartextAdapter/index.mjs +147 -0
  77. package/source/infrastructure/adapters/HttpAdapter/index.mjs +124 -0
  78. package/source/infrastructure/adapters/HttpsAdapter/index.mjs +124 -0
  79. package/source/infrastructure/adapters/TransportAdapter/createWebSocketOpenRequest.mjs +843 -0
  80. package/source/infrastructure/adapters/TransportAdapter/index.mjs +555 -0
  81. package/source/shared/Identifier/index.mjs +671 -0
  82. package/source/shared/constants/symbols/brands/index.mjs +45 -0
  83. package/source/shared/domain/UUIDV7/index.mjs +346 -0
  84. package/source/shared/errors/BaseError/index.mjs +157 -0
  85. package/source/shared/errors/IPCError/index.mjs +97 -0
  86. package/source/shared/errors/MiddlewareError/index.mjs +106 -0
  87. package/source/shared/errors/PathnamePatternError/index.mjs +103 -0
  88. package/source/shared/errors/RequestError/index.mjs +116 -0
  89. package/source/shared/errors/ResponseError/index.mjs +140 -0
  90. package/source/shared/errors/RouterError/index.mjs +90 -0
  91. package/source/shared/errors/ServerConfigurationError/index.mjs +551 -0
  92. package/source/shared/errors/ServerError/index.mjs +127 -0
  93. package/source/shared/errors/WebSocketError/index.mjs +58 -0
  94. package/source/shared/outcome/ErrorSchema.mjs +361 -0
  95. package/source/shared/outcome/Result/index.mjs +239 -0
  96. package/source/shared/outcome/Validation/index.mjs +208 -0
  97. package/source/shared/validations/Middleware/index.mjs +160 -0
  98. package/source/shared/validations/PathnamePattern/index.mjs +256 -0
  99. package/source/shared/validations/Server/NotFoundHandler/index.mjs +94 -0
  100. package/source/shared/validations/Server/Router/index.mjs +68 -0
  101. package/source/shared/validations/Server/ServerConfiguration/index.mjs +68 -0
  102. package/source/shared/validations/Server/SystemErrorHandler/index.mjs +94 -0
  103. package/source/shared/validations/ServerConfiguration/CORSOptions/index.mjs +310 -0
  104. package/source/shared/validations/ServerConfiguration/CSRFOptions/index.mjs +299 -0
  105. package/source/shared/validations/ServerConfiguration/CompressOptions/index.mjs +204 -0
  106. package/source/shared/validations/ServerConfiguration/CookieParserOptions/index.mjs +102 -0
  107. package/source/shared/validations/ServerConfiguration/CookieSessionOptions/index.mjs +332 -0
  108. package/source/shared/validations/ServerConfiguration/ListenOptions/index.mjs +178 -0
  109. package/source/shared/validations/ServerConfiguration/RateLimitOptions/index.mjs +229 -0
  110. package/source/shared/validations/ServerConfiguration/RequestOptions/index.mjs +132 -0
  111. package/source/shared/validations/ServerConfiguration/ResponseOptions/index.mjs +122 -0
  112. package/source/shared/validations/ServerConfiguration/SecurityHeadersOptions/index.mjs +137 -0
  113. package/source/shared/validations/ServerConfiguration/StaticOptions/index.mjs +248 -0
  114. package/types/index.d.ts +719 -0
@@ -0,0 +1,151 @@
1
+ // @ts-check
2
+ /**
3
+ * @file Defines the Security Headers middleware.
4
+ *
5
+ * @description Applies a curated collection of HTTP security headers to
6
+ * responses. Supports modern security policies and selected legacy
7
+ * compatibility headers.
8
+ *
9
+ * Configuration is expected to be validated and normalized before the
10
+ * middleware is created.
11
+ *
12
+ * @module SecurityHeadersMiddleware
13
+ */
14
+
15
+ // ━━ TYPE DEFINITIONS ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
16
+ /**
17
+ * Represents an HTTP exchange.
18
+ *
19
+ * @typedef {import('#Exchange').default} Exchange
20
+ */
21
+
22
+ /**
23
+ * Represents an outgoing HTTP response.
24
+ *
25
+ * @typedef {import('#Response').default} Response
26
+ */
27
+
28
+ /**
29
+ * Represents a function that delegates execution to the next middleware
30
+ * layer.
31
+ *
32
+ * @typedef {() => void | Promise<void>} NextFunction
33
+ */
34
+
35
+ /**
36
+ * Represents normalized Security Headers middleware configuration.
37
+ *
38
+ * A value of `false` disables the corresponding header. String values are
39
+ * written to the response as provided.
40
+ *
41
+ * @typedef {object} SecurityHeadersOptionsData
42
+ * @property {string|false} contentSecurityPolicy - Value for the Content-Security-Policy header, or `false` to omit it.
43
+ * @property {string|false} crossOriginEmbedderPolicy - Value for the Cross-Origin-Embedder-Policy header, or `false` to omit it.
44
+ * @property {string|false} crossOriginOpenerPolicy - Value for the Cross-Origin-Opener-Policy header, or `false` to omit it.
45
+ * @property {string|false} crossOriginResourcePolicy - Value for the Cross-Origin-Resource-Policy header, or `false` to omit it.
46
+ * @property {string|false} originAgentCluster - Value for the Origin-Agent-Cluster header, or `false` to omit it.
47
+ * @property {string|false} permissionsPolicy - Value for the Permissions-Policy header, or `false` to omit it.
48
+ * @property {string|false} referrerPolicy - Value for the Referrer-Policy header, or `false` to omit it.
49
+ * @property {string|false} strictTransportSecurity - Value for the Strict-Transport-Security header, or `false` to omit it.
50
+ * @property {string|false} xContentTypeOptions - Value for the X-Content-Type-Options header, or `false` to omit it.
51
+ * @property {string|false} xDnsPrefetchControl - Value for the X-DNS-Prefetch-Control header, or `false` to omit it.
52
+ * @property {string|false} xDownloadOptions - Value for the X-Download-Options header, or `false` to omit it.
53
+ * @property {string|false} xFrameOptions - Value for the X-Frame-Options header, or `false` to omit it.
54
+ * @property {string|false} xPermittedCrossDomainPolicies - Value for the X-Permitted-Cross-Domain-Policies header, or `false` to omit it.
55
+ * @property {string|false} xXssProtection - Value for the legacy X-XSS-Protection header, or `false` to omit it.
56
+ */
57
+
58
+ // ━━ CONSTANTS ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
59
+ /**
60
+ * Maps configuration properties to their corresponding HTTP security headers.
61
+ *
62
+ * @type {Readonly<Array<readonly [keyof SecurityHeadersOptionsData, string]>>}
63
+ */
64
+ const SECURITY_HEADERS = [
65
+ ['contentSecurityPolicy', 'Content-Security-Policy'],
66
+ ['crossOriginEmbedderPolicy', 'Cross-Origin-Embedder-Policy'],
67
+ ['crossOriginOpenerPolicy', 'Cross-Origin-Opener-Policy'],
68
+ ['crossOriginResourcePolicy', 'Cross-Origin-Resource-Policy'],
69
+ ['originAgentCluster', 'Origin-Agent-Cluster'],
70
+ ['permissionsPolicy', 'Permissions-Policy'],
71
+ ['referrerPolicy', 'Referrer-Policy'],
72
+ ['strictTransportSecurity', 'Strict-Transport-Security'],
73
+ ['xContentTypeOptions', 'X-Content-Type-Options'],
74
+ ['xDnsPrefetchControl', 'X-DNS-Prefetch-Control'],
75
+ ['xDownloadOptions', 'X-Download-Options'],
76
+ ['xFrameOptions', 'X-Frame-Options'],
77
+ ['xPermittedCrossDomainPolicies', 'X-Permitted-Cross-Domain-Policies'],
78
+ ['xXssProtection', 'X-XSS-Protection'],
79
+ ];
80
+
81
+ // ━━ MODULE ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
82
+ /**
83
+ * Applies configured HTTP security headers to an HTTP exchange.
84
+ *
85
+ * @classdesc Writes enabled security headers before delegating to the next
86
+ * middleware. The middleware does not end the response itself.
87
+ */
88
+ class SecurityHeadersMiddleware {
89
+ /**
90
+ * Normalized Security Headers middleware options.
91
+ *
92
+ * @type {Readonly<SecurityHeadersOptionsData>}
93
+ */
94
+ #options;
95
+
96
+ /**
97
+ * Creates a Security Headers middleware.
98
+ *
99
+ * @param {SecurityHeadersOptionsData} options - Validated and normalized security headers options.
100
+ *
101
+ * @example
102
+ * ```js
103
+ * const middleware = new SecurityHeadersMiddleware({
104
+ * contentSecurityPolicy: "default-src 'self'",
105
+ * crossOriginEmbedderPolicy: false,
106
+ * crossOriginOpenerPolicy: 'same-origin',
107
+ * crossOriginResourcePolicy: false,
108
+ * originAgentCluster: false,
109
+ * permissionsPolicy: 'geolocation=(), microphone=()',
110
+ * referrerPolicy: 'no-referrer',
111
+ * strictTransportSecurity: 'max-age=31536000; includeSubDomains',
112
+ * xContentTypeOptions: 'nosniff',
113
+ * xDnsPrefetchControl: false,
114
+ * xDownloadOptions: false,
115
+ * xFrameOptions: 'SAMEORIGIN',
116
+ * xPermittedCrossDomainPolicies: false,
117
+ * xXssProtection: '0',
118
+ * });
119
+ * ```
120
+ */
121
+ constructor(options) {
122
+ this.#options = options;
123
+ }
124
+
125
+ /**
126
+ * Processes an HTTP exchange and applies the configured security headers.
127
+ *
128
+ * @param {Exchange} exchange - Exchange to process.
129
+ * @param {NextFunction} next - Function that delegates to the next middleware.
130
+ * @returns {Promise<void>} Resolves when request processing has completed.
131
+ *
132
+ * @example
133
+ * await middleware.handle(exchange, next);
134
+ */
135
+ async handle(exchange, next) {
136
+ const { response } = exchange;
137
+
138
+ for (const [optionKey, headerName] of SECURITY_HEADERS) {
139
+ const value = this.#options[optionKey];
140
+
141
+ if (typeof value === 'string') {
142
+ response.setHeader(headerName, value);
143
+ }
144
+ }
145
+
146
+ await next();
147
+ }
148
+ }
149
+
150
+ // ━━ EXPORT MODULE ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
151
+ export default SecurityHeadersMiddleware;