@lovrozagar/honey 0.3.5 → 0.4.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 +8 -5
- package/dist/body-limit.d.ts.map +1 -1
- package/dist/error.d.ts.map +1 -1
- package/dist/response.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/body-limit.ts +42 -6
- package/src/error.ts +1 -0
- package/src/response.ts +0 -1
package/README.md
CHANGED
|
@@ -619,7 +619,7 @@ throw ctx.errors.unauthorized({
|
|
|
619
619
|
})
|
|
620
620
|
```
|
|
621
621
|
|
|
622
|
-
Standard error JSON:
|
|
622
|
+
Standard error JSON (matches OpenAPI / generated `_ErrEnvelope`):
|
|
623
623
|
|
|
624
624
|
```json
|
|
625
625
|
{
|
|
@@ -628,11 +628,14 @@ Standard error JSON:
|
|
|
628
628
|
"status_key": "conflict",
|
|
629
629
|
"message": "org_slug_taken",
|
|
630
630
|
"success": false,
|
|
631
|
-
"fields": {}
|
|
632
|
-
"vars": { "slug": "acme" }
|
|
631
|
+
"fields": {}
|
|
633
632
|
}
|
|
634
633
|
```
|
|
635
634
|
|
|
635
|
+
`vars` are **ICU input only** — used by `.errorI18n()` to interpolate the top-level `message`, and included in `HoneyError.serialize` for logs. They are **not** part of the public envelope. With i18n on, clients read the interpolated `message` (e.g. `"Slug acme is taken"`); they must not re-translate from `vars` + `error_key`.
|
|
636
|
+
|
|
637
|
+
For structured client extras (numbers a CLI can chart, typed payloads), use a **custom-schema** error (`defineErrors({ key: { status, schema } })`) and its `data` body — not `vars`.
|
|
638
|
+
|
|
636
639
|
Custom-schema errors serialize **the schema payload** as the body (not the envelope), unless you set `customErrorFormatter`.
|
|
637
640
|
|
|
638
641
|
Per-route:
|
|
@@ -685,9 +688,9 @@ app.errorI18n({
|
|
|
685
688
|
})
|
|
686
689
|
```
|
|
687
690
|
|
|
688
|
-
Messages are ICU: `{slug}`, `{n, number}`, `{n, plural, one {# item} other {# items}}`, `{k, select, a {A} other {X}}`. `cause` is reserved and is not a template var.
|
|
691
|
+
Messages are ICU: `{slug}`, `{n, number}`, `{n, plural, one {# item} other {# items}}`, `{k, select, a {A} other {X}}`. Pass matching values as `vars` on the throw. `cause` is reserved and is not a template var. Field `path` labels use `fieldNames`; field `message` strings are not interpolated with top-level `vars`.
|
|
689
692
|
|
|
690
|
-
`HoneyError` fields: `errorKey`, `status` (number), `statusKey`, `fields`, `vars
|
|
693
|
+
`HoneyError` fields: `errorKey`, `status` (number), `statusKey`, `fields`, `vars` (ICU / logs only), `data`, `headers`. `HoneyError.serialize(err)` is a JSON-safe dump for logs (includes `vars` when set; never put on the public JSON).
|
|
691
694
|
|
|
692
695
|
Framework-owned keys you do not declare: `validation_failed` (400), `output_validation_failed` (500), plus routing / content-negotiation keys.
|
|
693
696
|
|
package/dist/body-limit.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"body-limit.d.ts","sourceRoot":"","sources":["../src/body-limit.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAGnD,KAAK,gBAAgB,GAAG;IACvB,gGAAgG;IAChG,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,wFAAwF;IACxF,OAAO,EAAE,MAAM,CAAA;IACf;;;;;;;;OAQG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC5B,CAAA;AAED,YAAY,EAAE,gBAAgB,EAAE,CAAA;AAEhC,wBAAgB,SAAS,CAAC,IAAI,EAAE,gBAAgB,GAAG,YAAY,CAAC;IAAE,GAAG,EAAE,OAAO,CAAA;CAAE,EAAE,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"body-limit.d.ts","sourceRoot":"","sources":["../src/body-limit.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAGnD,KAAK,gBAAgB,GAAG;IACvB,gGAAgG;IAChG,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,wFAAwF;IACxF,OAAO,EAAE,MAAM,CAAA;IACf;;;;;;;;OAQG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC5B,CAAA;AAED,YAAY,EAAE,gBAAgB,EAAE,CAAA;AAEhC,wBAAgB,SAAS,CAAC,IAAI,EAAE,gBAAgB,GAAG,YAAY,CAAC;IAAE,GAAG,EAAE,OAAO,CAAA;CAAE,EAAE,EAAE,CAAC,CAgHpF"}
|
package/dist/error.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAGvD,qBAAa,UAAW,SAAQ,KAAK;IACpC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAA;IAC7C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACzC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAA;IAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAA;IAE/C,YAAY,IAAI,EAAE;QACjB,KAAK,CAAC,EAAE,OAAO,CAAA;QACf,IAAI,CAAC,EAAE,OAAO,CAAA;QACd,QAAQ,EAAE,MAAM,CAAA;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAA;QACrC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QAChC,MAAM,EAAE,SAAS,CAAA;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAA;KACtC,EASA;IAED,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAGvD,qBAAa,UAAW,SAAQ,KAAK;IACpC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAA;IAC7C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACzC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAA;IAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAA;IAE/C,YAAY,IAAI,EAAE;QACjB,KAAK,CAAC,EAAE,OAAO,CAAA;QACf,IAAI,CAAC,EAAE,OAAO,CAAA;QACd,QAAQ,EAAE,MAAM,CAAA;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAA;QACrC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QAChC,MAAM,EAAE,SAAS,CAAA;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAA;KACtC,EASA;IAED,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAoBpD;CACD"}
|
package/dist/response.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../src/response.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../src/response.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/body-limit.ts
CHANGED
|
@@ -60,27 +60,63 @@ export function bodyLimit(opts: BodyLimitOptions): MiddlewareFn<{ req: Request }
|
|
|
60
60
|
if (trustContentLength === true) return next()
|
|
61
61
|
}
|
|
62
62
|
|
|
63
|
-
/* slow path: stream-count when no Content-Length (chunked) or trustContentLength disabled
|
|
63
|
+
/* slow path: stream-count when no Content-Length (chunked) or trustContentLength disabled.
|
|
64
|
+
* On overflow, error the downstream consumer then drain (do not cancel) the upstream —
|
|
65
|
+
* cancelling an undici FormData body mid-encode enqueues into a closed stream on Node 24. */
|
|
64
66
|
if (req.body !== null) {
|
|
65
67
|
let totalBytes = 0
|
|
68
|
+
let overflowed = false
|
|
66
69
|
const limit = resolvedMax
|
|
67
|
-
const
|
|
68
|
-
|
|
69
|
-
|
|
70
|
+
const reader = req.body.getReader()
|
|
71
|
+
|
|
72
|
+
const drainUpstream = (): void => {
|
|
73
|
+
void (async () => {
|
|
74
|
+
try {
|
|
75
|
+
while (true) {
|
|
76
|
+
const r = await reader.read()
|
|
77
|
+
if (r.done) break
|
|
78
|
+
}
|
|
79
|
+
} catch {
|
|
80
|
+
/* producer may already be done */
|
|
81
|
+
}
|
|
82
|
+
})()
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const limited = new ReadableStream<Uint8Array>({
|
|
86
|
+
async cancel(reason) {
|
|
87
|
+
/* consumer aborted — still drain so undici FormData encoders can finish */
|
|
88
|
+
drainUpstream()
|
|
89
|
+
void reason
|
|
90
|
+
},
|
|
91
|
+
async pull(controller) {
|
|
92
|
+
if (overflowed) return
|
|
93
|
+
let result: ReadableStreamReadResult<Uint8Array>
|
|
94
|
+
try {
|
|
95
|
+
result = await reader.read()
|
|
96
|
+
} catch (err) {
|
|
97
|
+
controller.error(err)
|
|
98
|
+
return
|
|
99
|
+
}
|
|
100
|
+
if (result.done) {
|
|
101
|
+
controller.close()
|
|
102
|
+
return
|
|
103
|
+
}
|
|
104
|
+
totalBytes += result.value.byteLength
|
|
70
105
|
if (totalBytes > limit) {
|
|
106
|
+
overflowed = true
|
|
71
107
|
controller.error(
|
|
72
108
|
new HoneyError({
|
|
73
109
|
errorKey: EK.content_too_large,
|
|
74
110
|
status: SK.content_too_large,
|
|
75
111
|
}),
|
|
76
112
|
)
|
|
113
|
+
drainUpstream()
|
|
77
114
|
return
|
|
78
115
|
}
|
|
79
|
-
controller.enqueue(
|
|
116
|
+
controller.enqueue(result.value)
|
|
80
117
|
},
|
|
81
118
|
})
|
|
82
119
|
|
|
83
|
-
const limited = req.body.pipeThrough(transform)
|
|
84
120
|
const replaceBody = (req as unknown as Record<symbol, unknown>)[Symbol.for("honey.replaceBody")]
|
|
85
121
|
if (typeof replaceBody === "function") {
|
|
86
122
|
;(replaceBody as (stream: ReadableStream<Uint8Array>) => void).call(req, limited)
|
package/src/error.ts
CHANGED
|
@@ -43,6 +43,7 @@ export class HoneyError extends Error {
|
|
|
43
43
|
obj["status"] = e.status
|
|
44
44
|
obj["statusKey"] = e.statusKey
|
|
45
45
|
if (Object.keys(e.fields).length > 0) obj["fields"] = e.fields
|
|
46
|
+
if (e.vars) obj["vars"] = e.vars
|
|
46
47
|
}
|
|
47
48
|
|
|
48
49
|
if (e.cause) obj["cause"] = HoneyError.serialize(e.cause)
|
package/src/response.ts
CHANGED