@nifrajs/core 5.0.0 → 5.2.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/CHANGELOG.md +2384 -0
- package/dist/assurance.d.ts +15 -1
- package/dist/assurance.d.ts.map +1 -1
- package/dist/assurance.js +97 -71
- package/dist/assurance.js.map +1 -1
- package/dist/capabilities.d.ts +2 -0
- package/dist/capabilities.d.ts.map +1 -1
- package/dist/capabilities.js +1 -1
- package/dist/capabilities.js.map +1 -1
- package/dist/edge-kit.d.ts +1 -1
- package/dist/edge-kit.d.ts.map +1 -1
- package/dist/edge-kit.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/internal/hook-origins.d.ts +17 -1
- package/dist/internal/hook-origins.d.ts.map +1 -1
- package/dist/internal/hook-origins.js +20 -0
- package/dist/internal/hook-origins.js.map +1 -1
- package/dist/internal/route-compiler.d.ts +9 -0
- package/dist/internal/route-compiler.d.ts.map +1 -1
- package/dist/internal/route-compiler.js +95 -13
- package/dist/internal/route-compiler.js.map +1 -1
- package/dist/internal/route-program.d.ts +2 -0
- package/dist/internal/route-program.d.ts.map +1 -1
- package/dist/internal/route-program.js +22 -17
- package/dist/internal/route-program.js.map +1 -1
- package/dist/internal/same-origin.d.ts +11 -1
- package/dist/internal/same-origin.d.ts.map +1 -1
- package/dist/internal/same-origin.js +8 -0
- package/dist/internal/same-origin.js.map +1 -1
- package/dist/reflection.d.ts +23 -2
- package/dist/reflection.d.ts.map +1 -1
- package/dist/reflection.js +57 -1
- package/dist/reflection.js.map +1 -1
- package/dist/server/body-lane.d.ts +8 -2
- package/dist/server/body-lane.d.ts.map +1 -1
- package/dist/server/body-lane.js +27 -2
- package/dist/server/body-lane.js.map +1 -1
- package/dist/server/client-ip.js +6 -5
- package/dist/server/client-ip.js.map +1 -1
- package/dist/server/context.d.ts +7 -4
- package/dist/server/context.d.ts.map +1 -1
- package/dist/server/cookies.d.ts.map +1 -1
- package/dist/server/cookies.js +13 -1
- package/dist/server/cookies.js.map +1 -1
- package/dist/server/core-copies.d.ts +7 -1
- package/dist/server/core-copies.d.ts.map +1 -1
- package/dist/server/core-copies.js +37 -1
- package/dist/server/core-copies.js.map +1 -1
- package/dist/server/edge.d.ts.map +1 -1
- package/dist/server/edge.js +2 -1
- package/dist/server/edge.js.map +1 -1
- package/dist/server/headers.d.ts +9 -0
- package/dist/server/headers.d.ts.map +1 -1
- package/dist/server/headers.js +26 -0
- package/dist/server/headers.js.map +1 -1
- package/dist/server/http.d.ts.map +1 -1
- package/dist/server/http.js +5 -1
- package/dist/server/http.js.map +1 -1
- package/dist/server/response-contract-lane.d.ts +57 -7
- package/dist/server/response-contract-lane.d.ts.map +1 -1
- package/dist/server/response-contract-lane.js +394 -23
- package/dist/server/response-contract-lane.js.map +1 -1
- package/dist/server/server-types.d.ts +23 -9
- package/dist/server/server-types.d.ts.map +1 -1
- package/dist/server/server.d.ts +40 -5
- package/dist/server/server.d.ts.map +1 -1
- package/dist/server/server.js +188 -43
- package/dist/server/server.js.map +1 -1
- package/dist/server/websocket.d.ts +11 -0
- package/dist/server/websocket.d.ts.map +1 -1
- package/dist/server/websocket.js +26 -12
- package/dist/server/websocket.js.map +1 -1
- package/dist/server/ws-bun.d.ts +7 -1
- package/dist/server/ws-bun.d.ts.map +1 -1
- package/dist/server/ws-bun.js +42 -2
- package/dist/server/ws-bun.js.map +1 -1
- package/dist/server/ws-hook.d.ts +9 -3
- package/dist/server/ws-hook.d.ts.map +1 -1
- package/dist/server.d.ts +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +1 -1
- package/dist/server.js.map +1 -1
- package/dist/single-copy.d.ts.map +1 -1
- package/dist/single-copy.js +81 -10
- package/dist/single-copy.js.map +1 -1
- package/dist/wire.d.ts +5 -0
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +5 -0
- package/dist/wire.js.map +1 -1
- package/dist/ws.d.ts.map +1 -1
- package/dist/ws.js +2 -1
- package/dist/ws.js.map +1 -1
- package/package.json +3 -2
- package/src/assurance.ts +120 -81
- package/src/capabilities.ts +3 -1
- package/src/edge-kit.ts +1 -1
- package/src/index.ts +2 -2
- package/src/internal/hook-origins.ts +35 -0
- package/src/internal/route-compiler.ts +107 -16
- package/src/internal/route-program.ts +39 -20
- package/src/internal/same-origin.ts +14 -1
- package/src/reflection.ts +61 -1
- package/src/server/body-lane.ts +36 -1
- package/src/server/client-ip.ts +5 -5
- package/src/server/context.ts +7 -4
- package/src/server/cookies.ts +12 -1
- package/src/server/core-copies.ts +40 -0
- package/src/server/edge.ts +2 -1
- package/src/server/headers.ts +39 -0
- package/src/server/http.ts +7 -1
- package/src/server/response-contract-lane.ts +491 -24
- package/src/server/server-types.ts +23 -9
- package/src/server/server.ts +249 -35
- package/src/server/websocket.ts +39 -13
- package/src/server/ws-bun.ts +48 -1
- package/src/server/ws-hook.ts +9 -2
- package/src/server.ts +1 -1
- package/src/single-copy.ts +90 -9
- package/src/wire.ts +14 -0
- package/src/ws.ts +2 -0
package/src/server/edge.ts
CHANGED
|
@@ -116,7 +116,8 @@ export function toFetchHandler<Env = unknown>(
|
|
|
116
116
|
const platform: Platform<Env> = { env, waitUntil: (promise) => ctx.waitUntil(promise) }
|
|
117
117
|
// WebSocket broadcast on Workers: route upgrades to the hub Durable Object (it holds the
|
|
118
118
|
// connections + runs the app's pub/sub, so `app.publish` reaches every client). The hub itself
|
|
119
|
-
// resolves the route and
|
|
119
|
+
// resolves the route, and a request that is no handshake for a WebSocket route gets its HTTP
|
|
120
|
+
// answer there. See `@nifrajs/workers`' `createWebSocketHub`.
|
|
120
121
|
if (
|
|
121
122
|
webSocketHub !== undefined &&
|
|
122
123
|
request.headers.get("upgrade")?.toLowerCase() === "websocket"
|
package/src/server/headers.ts
CHANGED
|
@@ -9,3 +9,42 @@ export function headerObjectOf(headers: Headers): Record<string, string> {
|
|
|
9
9
|
for (const [name, value] of headers) out[name.toLowerCase()] = value
|
|
10
10
|
return out
|
|
11
11
|
}
|
|
12
|
+
|
|
13
|
+
const HEADER_NAME = /^[\w!#$%&'*+.^`|~-]+$/
|
|
14
|
+
|
|
15
|
+
/** The parts of a header schema's JSON Schema that decide how the slot reads the request. */
|
|
16
|
+
interface HeaderJsonSchema {
|
|
17
|
+
readonly type?: unknown
|
|
18
|
+
readonly additionalProperties?: unknown
|
|
19
|
+
readonly patternProperties?: unknown
|
|
20
|
+
readonly properties?: object
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* The names a closed header schema declares, or `undefined` when it is open or lists no names.
|
|
25
|
+
* Every client sends headers no route declares (`host`, `user-agent`, `accept`), so a closed schema
|
|
26
|
+
* fed the whole record would refuse all real traffic; it is fed the names it declares instead,
|
|
27
|
+
* which is also how OpenAPI publishes it. A name that is not a valid header token is never sent.
|
|
28
|
+
*/
|
|
29
|
+
export function declaredHeaderNames(schema: object): readonly string[] | undefined {
|
|
30
|
+
const json: HeaderJsonSchema | null | undefined = Reflect.get(schema, "jsonSchema")
|
|
31
|
+
return json?.type === "object" &&
|
|
32
|
+
json.additionalProperties === false &&
|
|
33
|
+
json.patternProperties === undefined &&
|
|
34
|
+
json.properties
|
|
35
|
+
? Object.keys(json.properties).filter((name) => HEADER_NAME.test(name))
|
|
36
|
+
: undefined
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** The declared headers present on the request, each under the name as declared. */
|
|
40
|
+
export function declaredHeaders(
|
|
41
|
+
headers: Headers,
|
|
42
|
+
names: readonly string[],
|
|
43
|
+
): Record<string, string> {
|
|
44
|
+
const out: Record<string, string> = Object.create(null)
|
|
45
|
+
for (const name of names) {
|
|
46
|
+
const value = headers.get(name)
|
|
47
|
+
if (value !== null) out[name] = value
|
|
48
|
+
}
|
|
49
|
+
return out
|
|
50
|
+
}
|
package/src/server/http.ts
CHANGED
|
@@ -30,7 +30,13 @@ export function isSameOriginPath(value: string): boolean {
|
|
|
30
30
|
const code = value.charCodeAt(i)
|
|
31
31
|
if (code === 0x5c /* \ */ || code <= 0x1f || code === 0x7f) return false
|
|
32
32
|
}
|
|
33
|
-
|
|
33
|
+
// `/.//host` and `/a/..//host` (or their `%2e` forms) resolve to the path `//host`, which any
|
|
34
|
+
// relative reference later built from that path - a client router's redirect - reads as a host.
|
|
35
|
+
// A path-absolute reference against a valid base always parses, so this cannot throw.
|
|
36
|
+
return (
|
|
37
|
+
!(value.includes(".") || value.includes("%")) ||
|
|
38
|
+
!new URL(value, "http://n.invalid").pathname.startsWith("//")
|
|
39
|
+
)
|
|
34
40
|
}
|
|
35
41
|
|
|
36
42
|
/**
|