@bepalo/spine 1.0.3

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 (83) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +830 -0
  3. package/dist/auth-middlewares.d.ts +119 -0
  4. package/dist/auth-middlewares.d.ts.map +1 -0
  5. package/dist/auth-middlewares.js +168 -0
  6. package/dist/auth-middlewares.js.map +1 -0
  7. package/dist/cjs/auth-middlewares.d.ts +119 -0
  8. package/dist/cjs/auth-middlewares.d.ts.map +1 -0
  9. package/dist/cjs/auth-middlewares.js +168 -0
  10. package/dist/cjs/auth-middlewares.js.map +1 -0
  11. package/dist/cjs/helpers.d.ts +180 -0
  12. package/dist/cjs/helpers.d.ts.map +1 -0
  13. package/dist/cjs/helpers.js +366 -0
  14. package/dist/cjs/helpers.js.map +1 -0
  15. package/dist/cjs/index.d.ts +11 -0
  16. package/dist/cjs/index.d.ts.map +1 -0
  17. package/dist/cjs/index.js +30 -0
  18. package/dist/cjs/index.js.map +1 -0
  19. package/dist/cjs/middlewares.d.ts +88 -0
  20. package/dist/cjs/middlewares.d.ts.map +1 -0
  21. package/dist/cjs/middlewares.js +262 -0
  22. package/dist/cjs/middlewares.js.map +1 -0
  23. package/dist/cjs/parsers.d.ts +177 -0
  24. package/dist/cjs/parsers.d.ts.map +1 -0
  25. package/dist/cjs/parsers.js +1021 -0
  26. package/dist/cjs/parsers.js.map +1 -0
  27. package/dist/cjs/router.d.ts +124 -0
  28. package/dist/cjs/router.d.ts.map +1 -0
  29. package/dist/cjs/router.js +1378 -0
  30. package/dist/cjs/router.js.map +1 -0
  31. package/dist/cjs/status.d.ts +77 -0
  32. package/dist/cjs/status.d.ts.map +1 -0
  33. package/dist/cjs/status.js +252 -0
  34. package/dist/cjs/status.js.map +1 -0
  35. package/dist/cjs/types.d.ts +135 -0
  36. package/dist/cjs/types.d.ts.map +1 -0
  37. package/dist/cjs/types.js +109 -0
  38. package/dist/cjs/types.js.map +1 -0
  39. package/dist/cjs/utils.d.ts +11 -0
  40. package/dist/cjs/utils.d.ts.map +1 -0
  41. package/dist/cjs/utils.js +76 -0
  42. package/dist/cjs/utils.js.map +1 -0
  43. package/dist/cjs/utils.node.d.ts +4 -0
  44. package/dist/cjs/utils.node.d.ts.map +1 -0
  45. package/dist/cjs/utils.node.js +99 -0
  46. package/dist/cjs/utils.node.js.map +1 -0
  47. package/dist/helpers.d.ts +180 -0
  48. package/dist/helpers.d.ts.map +1 -0
  49. package/dist/helpers.js +366 -0
  50. package/dist/helpers.js.map +1 -0
  51. package/dist/index.d.ts +11 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +30 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/middlewares.d.ts +88 -0
  56. package/dist/middlewares.d.ts.map +1 -0
  57. package/dist/middlewares.js +262 -0
  58. package/dist/middlewares.js.map +1 -0
  59. package/dist/parsers.d.ts +177 -0
  60. package/dist/parsers.d.ts.map +1 -0
  61. package/dist/parsers.js +1021 -0
  62. package/dist/parsers.js.map +1 -0
  63. package/dist/router.d.ts +124 -0
  64. package/dist/router.d.ts.map +1 -0
  65. package/dist/router.js +1378 -0
  66. package/dist/router.js.map +1 -0
  67. package/dist/status.d.ts +77 -0
  68. package/dist/status.d.ts.map +1 -0
  69. package/dist/status.js +252 -0
  70. package/dist/status.js.map +1 -0
  71. package/dist/types.d.ts +135 -0
  72. package/dist/types.d.ts.map +1 -0
  73. package/dist/types.js +109 -0
  74. package/dist/types.js.map +1 -0
  75. package/dist/utils.d.ts +11 -0
  76. package/dist/utils.d.ts.map +1 -0
  77. package/dist/utils.js +76 -0
  78. package/dist/utils.js.map +1 -0
  79. package/dist/utils.node.d.ts +4 -0
  80. package/dist/utils.node.d.ts.map +1 -0
  81. package/dist/utils.node.js +66 -0
  82. package/dist/utils.node.js.map +1 -0
  83. package/package.json +57 -0
@@ -0,0 +1,262 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.cors = exports.limitRate = void 0;
13
+ const helpers_ts_1 = require("./helpers.js");
14
+ const types_ts_1 = require("./types.js");
15
+ /**
16
+ * Creates a rate limiting middleware using token bucket algorithm.
17
+ * Supports both fixed interval refill and continuous rate-based refill.
18
+ *
19
+ * @template {Record<string, unknown>} ExtendContext - Extend Router Context
20
+ * @param {Object} config - Rate limiting configuration
21
+ * @param {Function} [config.key] - Function to generate cache key from request and context
22
+ * @param {number} [config.maxTokens] - Maximum number of tokens in the bucket
23
+ * @param {number} [config.refillInterval] - Fixed interval in seconds for token refill
24
+ * @param {number} [config.refillRate] - Continuous refill rate in tokens per second
25
+ * @param {number} [config.cleanUpInterval] - Interval in seconds for cleanup timer
26
+ * @param {number} [config.cleanUpIdleDelay] - Time in seconds to delay cleanup of filled token buckets
27
+ * @param {boolean} [config.setXRateLimitHeaders=false] - Whether to set X-RateLimit headers in response
28
+ * @returns {Function} Middleware function that enforces rate limits
29
+ *
30
+ * @example
31
+ * // Fixed interval rate limiting (10 requests per minute)
32
+ * const rateLimiter = limitRate({
33
+ * key: (ctx) => ctx.clientId, // IP-based limiting
34
+ * refillInterval: 60, // 1 minute
35
+ * refillRate: 10, // 10 tokens per interval
36
+ * maxTokens: 10,
37
+ * setXRateLimitHeaders: true
38
+ * });
39
+ *
40
+ * @example
41
+ * // Continuous rate limiting (100 requests per hour)
42
+ * const rateLimiter = limitRate({
43
+ * key: (ctx) => ctx.clientId || 'anonymous',
44
+ * refillRate: 60, // 100 tokens per 60 seconds
45
+ * maxTokens: 100,
46
+ * });
47
+ *
48
+ * @throws {RouterError} If neither refillInterval nor refillRate is provided
49
+ */
50
+ const limitRate = (config) => {
51
+ var _a;
52
+ const { key, maxTokens, refillInterval, refillRate, cleanUpInterval, setXRateLimitHeaders = false, breakPipeline = false, } = config;
53
+ const cleanUpIdleDelay = -((_a = config.cleanUpIdleDelay) !== null && _a !== void 0 ? _a : 0);
54
+ const rateLimits = new Map();
55
+ const now = () => performance.now() / 1000;
56
+ const getRateLimits = (id) => {
57
+ let entry = rateLimits.get(id);
58
+ if (entry == null) {
59
+ entry = {
60
+ tokens: maxTokens,
61
+ lastRefill: now(),
62
+ };
63
+ rateLimits.set(id, entry);
64
+ }
65
+ return entry;
66
+ };
67
+ const timeToFill = (key) => {
68
+ const entry = rateLimits.get(key);
69
+ if (entry == null) {
70
+ return undefined;
71
+ }
72
+ const timeElapsed = now() - entry.lastRefill;
73
+ if (refillInterval != null) {
74
+ const timeLeft = refillRate != null
75
+ ? (maxTokens - entry.tokens) / (refillRate / refillInterval) -
76
+ timeElapsed
77
+ : refillInterval - timeElapsed;
78
+ return timeLeft;
79
+ }
80
+ else if (refillRate != null) {
81
+ const timeLeft = (maxTokens - entry.tokens) / refillRate - timeElapsed;
82
+ return timeLeft;
83
+ }
84
+ return undefined;
85
+ };
86
+ const cleanUpRateLimits = () => {
87
+ for (const key of rateLimits.keys()) {
88
+ const timeLeft = timeToFill(key);
89
+ if (timeLeft == null) {
90
+ continue;
91
+ }
92
+ if (timeLeft <= cleanUpIdleDelay) {
93
+ rateLimits.delete(key);
94
+ }
95
+ }
96
+ };
97
+ if (cleanUpInterval != null) {
98
+ setInterval(cleanUpRateLimits, cleanUpInterval * 1000);
99
+ }
100
+ if (refillInterval != null) {
101
+ return function (ctx) {
102
+ return __awaiter(this, void 0, void 0, function* () {
103
+ const id = yield key(ctx);
104
+ const entry = getRateLimits(id);
105
+ const timeElapsed = now() - entry.lastRefill;
106
+ if (timeElapsed >= refillInterval) {
107
+ if (refillRate != null) {
108
+ const newTokens = entry.tokens +
109
+ refillRate * Math.floor(timeElapsed / refillInterval);
110
+ entry.tokens = Math.min(newTokens, maxTokens);
111
+ entry.lastRefill = now();
112
+ }
113
+ else {
114
+ entry.tokens = maxTokens;
115
+ entry.lastRefill = now();
116
+ }
117
+ }
118
+ if (entry.tokens <= 0) {
119
+ ctx.headers.set("Retry-After", Math.ceil(refillInterval - timeElapsed).toFixed());
120
+ return (0, helpers_ts_1.status)(429);
121
+ }
122
+ else {
123
+ entry.tokens--;
124
+ }
125
+ if (setXRateLimitHeaders) {
126
+ ctx.headers.set("X-RateLimit-Limit", maxTokens.toFixed());
127
+ ctx.headers.set("X-RateLimit-Remaining", entry.tokens.toFixed());
128
+ }
129
+ if (breakPipeline) {
130
+ return types_ts_1.Break_Pipeline;
131
+ }
132
+ });
133
+ };
134
+ }
135
+ else if (refillRate != null) {
136
+ return function (ctx) {
137
+ return __awaiter(this, void 0, void 0, function* () {
138
+ const id = yield key(ctx);
139
+ const entry = getRateLimits(id);
140
+ const timeElapsed = now() - entry.lastRefill;
141
+ const newTokens = entry.tokens + refillRate * timeElapsed;
142
+ entry.tokens = Math.min(newTokens, maxTokens);
143
+ entry.lastRefill = now();
144
+ if (entry.tokens <= 0) {
145
+ ctx.headers.set("Retry-After", Math.ceil(1 / refillRate).toFixed());
146
+ return (0, helpers_ts_1.status)(429);
147
+ }
148
+ else {
149
+ entry.tokens--;
150
+ }
151
+ if (setXRateLimitHeaders) {
152
+ ctx.headers.set("X-RateLimit-Limit", maxTokens.toFixed());
153
+ ctx.headers.set("X-RateLimit-Remaining", Math.max(0, entry.tokens).toFixed());
154
+ }
155
+ if (breakPipeline) {
156
+ return types_ts_1.Break_Pipeline;
157
+ }
158
+ });
159
+ };
160
+ }
161
+ throw new types_ts_1.RouterError("LIMIT-RATE: `refillInterval` or `refillRate` or both should be set");
162
+ };
163
+ exports.limitRate = limitRate;
164
+ /**
165
+ * Creates a CORS (Cross-Origin Resource Sharing) middleware.
166
+ * Supports preflight requests and configurable CORS headers.
167
+ *
168
+ * @template {Record<string, unknown>} ExtendContext - Extend Router Context
169
+ * @param {Object} [config] - CORS configuration
170
+ * @param {string|string[]|"*"} [config.origins="*"] - Allowed origins (wildcard "*", single origin, or array)
171
+ * @param {HttpMethod[]} [config.methods=["GET","HEAD","PUT","PATCH","POST","DELETE"]] - Allowed HTTP methods
172
+ * @param {string[]} [config.allowedHeaders=["Content-Type","Authorization"]] - Allowed request headers
173
+ * @param {string[]} [config.exposedHeaders] - Headers exposed to the browser
174
+ * @param {boolean} [config.credentials=false] - Allow credentials (cookies, authorization headers)
175
+ * @param {number} [config.maxAge=86400] - Maximum age for preflight cache in seconds
176
+ * @param {boolean} [config.varyOrigin=false] - Add Vary: Origin header for caching
177
+ * @param {boolean} [options.breakPipeline=false] - If true, stops only pipeline flow per handler type after success.
178
+ * @returns {Function} Middleware function that handles CORS headers
179
+ *
180
+ * @example
181
+ * // Basic CORS with all defaults
182
+ * const corsMiddleware = cors();
183
+ *
184
+ * @example
185
+ * // Specific origins with credentials
186
+ * const corsMiddleware = cors({
187
+ * origins: ["https://example.com", "https://api.example.com"],
188
+ * credentials: true,
189
+ * methods: ["GET", "POST", "PUT", "DELETE"],
190
+ * allowedHeaders: ["Content-Type", "Authorization", "X-Custom-Header"]
191
+ * });
192
+ *
193
+ * @throws {HttpError} If credentials is true with wildcard origin ("*")
194
+ */
195
+ const cors = (config) => {
196
+ const { origins = "*", methods = ["Get", "Head", "Put", "Patch", "Post", "Delete"], allowedHeaders = ["Content-Type", "Authorization"], exposedHeaders, credentials = false, maxAge = 86400, varyOrigin = false, breakPipeline = false, } = config !== null && config !== void 0 ? config : {};
197
+ const globOrigin = origins === "*" ? "*" : null;
198
+ const originsSet = new Set(typeof origins !== "string" ? origins : origins !== "*" ? [] : [origins]);
199
+ if (methods != null) {
200
+ for (let i = 0; i < methods.length; i++) {
201
+ methods[i] = methods[i].toUpperCase();
202
+ }
203
+ }
204
+ return function (ctx) {
205
+ const { request, headers } = ctx;
206
+ const origin = request.headers.get("origin");
207
+ let corsOrigin = null;
208
+ if (!origin) {
209
+ if (breakPipeline) {
210
+ return types_ts_1.Break_Pipeline;
211
+ }
212
+ return;
213
+ }
214
+ if (globOrigin) {
215
+ corsOrigin = "*";
216
+ }
217
+ else {
218
+ corsOrigin = originsSet.has(origin) ? origin : null;
219
+ }
220
+ if (!corsOrigin) {
221
+ if (varyOrigin)
222
+ ctx.headers.append("Vary", "Origin");
223
+ if (breakPipeline) {
224
+ return types_ts_1.Break_Pipeline;
225
+ }
226
+ return;
227
+ }
228
+ headers.set("Access-Control-Allow-Origin", corsOrigin);
229
+ if (credentials) {
230
+ if (corsOrigin === "*")
231
+ throw new types_ts_1.HttpError(403, "CORS: Cannot use credentials with wildcard origin");
232
+ headers.set("Access-Control-Allow-Credentials", "true");
233
+ }
234
+ if (exposedHeaders && exposedHeaders.length > 0) {
235
+ headers.set("Access-Control-Expose-Headers", exposedHeaders.join(", "));
236
+ }
237
+ if (varyOrigin) {
238
+ headers.append("Vary", "Origin");
239
+ }
240
+ if (request.method === "OPTIONS") {
241
+ if (methods && methods.length > 0) {
242
+ const requestMethod = request.headers.get("Access-Control-Request-Method");
243
+ if (requestMethod && !methods.includes(requestMethod)) {
244
+ return (0, helpers_ts_1.status)(405, `Method ${requestMethod} not allowed`);
245
+ }
246
+ headers.set("Access-Control-Allow-Methods", methods.join(", "));
247
+ }
248
+ if (allowedHeaders && allowedHeaders.length > 0) {
249
+ headers.set("Access-Control-Allow-Headers", allowedHeaders.join(", "));
250
+ }
251
+ if (maxAge) {
252
+ headers.set("Access-Control-Max-Age", maxAge.toString());
253
+ }
254
+ return (0, helpers_ts_1.status)(204, null);
255
+ }
256
+ if (breakPipeline) {
257
+ return types_ts_1.Break_Pipeline;
258
+ }
259
+ };
260
+ };
261
+ exports.cors = cors;
262
+ //# sourceMappingURL=middlewares.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middlewares.js","sourceRoot":"","sources":["../src/middlewares.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,177 @@
1
+ import { Break_Pipe, Break_Pipeline, HttpError, type Context, type EmptyRecord, type Handler, type MimeType } from "./types.ts";
2
+ /**
3
+ * Parsed params.
4
+ *
5
+ * @type {Object} Params
6
+ */
7
+ export type Params<Keys extends string = string, ExtendParams extends Record<Keys, string> | Record<string, string | unknown> = {}> = Omit<Record<Keys, string>, keyof ExtendParams> & ExtendParams;
8
+ /**
9
+ * Context object containing parsed params.
10
+ *
11
+ * @type {Object} CTParams
12
+ * @property {Record<string, string>} params - Parsed params
13
+ */
14
+ export type CTParams<Keys extends string = string, ExtendParams extends Record<Keys, string> | Record<string, string | unknown> = {}> = {
15
+ params: Params<Keys, ExtendParams>;
16
+ };
17
+ /**
18
+ * Parsed query.
19
+ *
20
+ * @type {Object} Query
21
+ */
22
+ export type Query<Keys extends string = string, ExtendQuery extends Record<Keys, string> | Record<string, string | unknown> = {}> = Omit<Record<Keys, string>, keyof ExtendQuery> & ExtendQuery;
23
+ /**
24
+ * Context object containing parsed query.
25
+ *
26
+ * @template {string} Keys - Keys to extend context Query. "q"|"search"
27
+ * @template {Record<string, unknown>} ExtendQuery - Extend context Query
28
+ *
29
+ * @type {Object} CTQuery
30
+ * @property {Record<string, string>} query - Parsed query
31
+ */
32
+ export type CTQuery<Keys extends string = string, ExtendQuery extends Record<Keys, string> | Record<string, string | unknown> = {}> = {
33
+ query: Query<Keys, ExtendQuery>;
34
+ };
35
+ /**
36
+ * Creates middleware that parses queries from the request url and adds them to the context.
37
+ *
38
+ * @template {string} Keys - Keys to extend context Query. "q"|"search"
39
+ * @template {Record<string, unknown>} ExtendQuery - Extend context Query
40
+ * @template {Record<string, unknown>} ExtendContext - Extend Router Context
41
+ *
42
+ * @returns {Function} A middleware function that adds parsed queries to context.query
43
+ */
44
+ export declare const parseQuery: <Keys extends string = string, ExtendQuery extends Record<Keys, string> | Record<string, string | unknown> = {}, ExtendContext extends Record<string, unknown> = EmptyRecord>() => Handler<ExtendContext & CTQuery<Keys, ExtendQuery>>;
45
+ /**
46
+ * Parses cookies from a Request object's Cookie header.
47
+ * @template {Record<string, string>} Expected
48
+ * @param {Request} req - The request object containing cookies
49
+ * @returns {Expected|undefined} An object with cookie name-value pairs, or undefined if no cookies
50
+ * @example
51
+ * const cookies = parseCookieFromRequest(req);
52
+ * // Returns: { session: "abc123", theme: "dark" }
53
+ */
54
+ export declare const parseCookieFromRequest: <Expected extends Record<string, string>>(req: Request, cookies?: Expected) => Expected | undefined;
55
+ /**
56
+ * Parsed cookie.
57
+ *
58
+ * @type {Object} Cookies
59
+ * @template {string} Keys - Keys to extend context Cookie. "session"|"geo"
60
+ * @template {Record<string, string>} ExtendCookie - Extend context Cookie
61
+ */
62
+ export type Cookies<Keys extends string = string, ExtendCookie extends Record<Keys, string> | Record<string, string | unknown> = {}> = Omit<Record<Keys, string>, keyof ExtendCookie> & ExtendCookie;
63
+ /**
64
+ * Context object containing parsed cookie.
65
+ *
66
+ * @type {Object} CTCookie
67
+ * @property {Record<string, string|unknown>} cookie - Parsed cookie
68
+ */
69
+ export type CTCookie<Keys extends string = string, ExtendCookie extends Record<Keys, string> | Record<string, string | unknown> = {}> = {
70
+ cookie: Cookies<Keys, ExtendCookie>;
71
+ };
72
+ /**
73
+ * Creates middleware that parses cookies from the request and adds them to the context.
74
+ *
75
+ * @template {string} Keys - Keys to extend context Cookie. "session"|"geo"
76
+ * @template {Record<string, string>} ExtendCookie - Extend context Cookie
77
+ * @template {Record<string, string>} ExtendContext - Extend Router Context
78
+ *
79
+ * @returns {Function} A middleware function that adds parsed cookies to context.cookie
80
+ */
81
+ export declare const parseCookie: <Keys extends string = string, ExtendCookie extends Record<Keys, string> | Record<string, string | unknown> = {}, ExtendContext extends Record<string, unknown> = EmptyRecord>() => Handler<ExtendContext & CTCookie<Keys, ExtendCookie>>;
82
+ /**
83
+ * Parsed body object types.
84
+ * @type {Object|Array<unknown>|string|null|undefined} ParsedBody
85
+ */
86
+ export type ParsedBody = Record<string, unknown> | Array<unknown> | string | number | boolean | null | undefined;
87
+ /**
88
+ * Context object containing parsed request body.
89
+ *
90
+ * @type {Object} CTBody
91
+ * @template {any | ParsedBody} BodyType - Define body type
92
+ * @property {ParsedBody} body - Parsed request body data
93
+ */
94
+ export type CTBody<BodyType = ParsedBody> = {
95
+ body: BodyType;
96
+ };
97
+ /**
98
+ * Supported media types for request body parsing.
99
+ * @type {"application/x-www-form-urlencoded"|"application/json"|"application/rjson"|"text/plain"} SupportedBodyMediaTypes
100
+ */
101
+ export type SupportedBodyMediaTypes = "application/x-www-form-urlencoded" | "application/json" | "application/rjson" | "text/plain";
102
+ /**
103
+ * Fronzen Set of supported media types for request body parsing.
104
+ */
105
+ export declare const SUPPORTED_MEDIA_TYPES: Readonly<Set<string>>;
106
+ /**
107
+ * Fronzen Array of supported media types for request body parsing.
108
+ */
109
+ export declare const SUPPORTED_MEDIA_TYPES_LIST: readonly string[];
110
+ /**
111
+ * Creates middleware that parses the request body based on Content-Type.
112
+ * Supports url-encoded forms, JSON, RJSON, and plain text.
113
+ *
114
+ * @template {Record<string, unknown>} ExtendContext - Extend Router Context
115
+ * @param {Object} [options] - Configuration options for body parsing
116
+ * @param {SupportedBodyMediaTypes|SupportedBodyMediaTypes[]} [options.accept] - Media types to accept (defaults to all supported)
117
+ * @param {number} [options.maxSize] - Maximum body size in bytes (defaults to 1MB)
118
+ * @param {number} [options.once] - Do not parse if parsed already. checks `ctx.body`
119
+ * @param {number} [options.clone] - Clone request before parsing it. Useful for forwarding.
120
+ * @returns {Function} A middleware function that adds parsed body to context.body
121
+ * @returns {Response} Returns a 415 response if content-type is not accepted
122
+ * @returns {Response} Returns a 413 response if body exceeds maxSize
123
+ * @returns {Response} Returns a 400 response if body is malformed
124
+ */
125
+ export declare const parseBody: <ExtendContext extends Record<string, unknown> = EmptyRecord>(options?: {
126
+ accept?: SupportedBodyMediaTypes | SupportedBodyMediaTypes[];
127
+ maxSize?: number;
128
+ once?: boolean;
129
+ clone?: boolean;
130
+ }) => Handler<ExtendContext & CTBody>;
131
+ export declare const parseHeaders: (rawHeaders: Uint8Array, contentDisposition?: object) => Headers;
132
+ export type ParsedFormDataFile<ExtendParsedFormDataFile extends Record<string, unknown> = EmptyRecord> = {
133
+ name: string;
134
+ type: MimeType;
135
+ size: number;
136
+ totalSize?: number;
137
+ } & ExtendParsedFormDataFile;
138
+ export type CTFormData<ExtendParsedFormDataFile extends Record<string, unknown> = EmptyRecord> = {
139
+ files: Map<string, ParsedFormDataFile<ExtendParsedFormDataFile>>;
140
+ fields: Map<string, string | any>;
141
+ };
142
+ export type ParseMultipartCallbacksReturnType = Response | typeof Break_Pipeline | typeof Break_Pipe | void | Promise<Response | typeof Break_Pipeline | typeof Break_Pipe | void>;
143
+ export declare const parseMultipart: <ExtendContext extends Record<string, unknown> = EmptyRecord, ExtendParsedFormDataFile extends Record<string, unknown> = EmptyRecord>({ idGenerator, onStart, onEnd, onHeader, onData, onDataCompletion, }: {
144
+ idGenerator?: (info: {
145
+ headers: Headers;
146
+ name: string;
147
+ filename?: string;
148
+ }) => string;
149
+ onStart?: (ctx: Context<CTFormData<ExtendParsedFormDataFile> & ExtendContext>) => ParseMultipartCallbacksReturnType;
150
+ onEnd?: (ctx: Context<CTFormData<ExtendParsedFormDataFile> & ExtendContext>, info: {
151
+ success: boolean;
152
+ error?: Error | HttpError;
153
+ }) => ParseMultipartCallbacksReturnType;
154
+ onHeader?: (ctx: Context<CTFormData<ExtendParsedFormDataFile> & ExtendContext>, info: {
155
+ headers: Headers;
156
+ id: string;
157
+ name: string;
158
+ filename?: string;
159
+ file?: ParsedFormDataFile<ExtendParsedFormDataFile>;
160
+ }) => ParseMultipartCallbacksReturnType;
161
+ onData: (ctx: Context<CTFormData<ExtendParsedFormDataFile> & ExtendContext>, info: {
162
+ chunk: Uint8Array;
163
+ headers: Headers;
164
+ id: string;
165
+ name: string;
166
+ filename?: string;
167
+ file?: ParsedFormDataFile<ExtendParsedFormDataFile>;
168
+ }) => ParseMultipartCallbacksReturnType;
169
+ onDataCompletion: (ctx: Context<CTFormData<ExtendParsedFormDataFile> & ExtendContext>, info: {
170
+ headers: Headers;
171
+ id: string;
172
+ name: string;
173
+ filename?: string;
174
+ file?: ParsedFormDataFile<ExtendParsedFormDataFile>;
175
+ }) => ParseMultipartCallbacksReturnType;
176
+ }) => Handler<CTFormData<ExtendParsedFormDataFile> & ExtendContext>;
177
+ //# sourceMappingURL=parsers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parsers.d.ts","sourceRoot":"","sources":["../src/parsers.ts"],"names":[],"mappings":"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"}