@eggjs/koa 2.17.0 → 2.18.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 +9 -8
- package/{lib → dist/commonjs}/application.d.ts +25 -13
- package/dist/commonjs/application.js +255 -0
- package/{lib → dist/commonjs}/context.d.ts +72 -22
- package/dist/commonjs/context.js +209 -0
- package/dist/commonjs/index.d.ts +7 -0
- package/dist/commonjs/index.js +27 -0
- package/dist/commonjs/package.json +3 -0
- package/{lib → dist/commonjs}/request.d.ts +22 -10
- package/{lib → dist/commonjs}/request.js +9 -8
- package/{lib → dist/commonjs}/response.d.ts +24 -9
- package/dist/commonjs/response.js +453 -0
- package/{lib → dist/commonjs}/types.d.ts +1 -2
- package/{lib → dist/commonjs}/types.js +1 -1
- package/dist/esm/application.d.ts +122 -0
- package/dist/esm/application.js +249 -0
- package/dist/esm/context.d.ts +154 -0
- package/dist/esm/context.js +203 -0
- package/dist/esm/index.d.ts +7 -0
- package/dist/esm/index.js +8 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/request.d.ts +329 -0
- package/dist/esm/request.js +522 -0
- package/dist/esm/response.d.ts +225 -0
- package/dist/esm/response.js +447 -0
- package/dist/esm/types.d.ts +10 -0
- package/dist/esm/types.js +2 -0
- package/package.json +65 -31
- package/src/application.ts +276 -0
- package/src/context.ts +284 -0
- package/src/index.ts +9 -0
- package/src/request.ts +580 -0
- package/src/response.ts +473 -0
- package/src/types.ts +11 -0
- package/lib/application.js +0 -264
- package/lib/context.js +0 -221
- package/lib/response.js +0 -447
package/Readme.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @eggjs/koa
|
|
2
2
|
|
|
3
|
-
@eggjs/koa is forked from [Koa v2.x](https://github.com/koajs/koa/tree/v2.x) for LTS and drop Node.js <
|
|
3
|
+
@eggjs/koa is forked from [Koa v2.x](https://github.com/koajs/koa/tree/v2.x) for LTS and drop Node.js < 18.7.0 support.
|
|
4
4
|
|
|
5
5
|
<img height="240px" src="/docs/logo.png" alt="Koa middleware framework for nodejs"/>
|
|
6
6
|
|
|
@@ -19,7 +19,7 @@ Koa is not bundled with any middleware.
|
|
|
19
19
|
|
|
20
20
|
## Installation
|
|
21
21
|
|
|
22
|
-
@eggjs/koa requires __node
|
|
22
|
+
@eggjs/koa requires __node v18.7.0__ or higher for Node.js LTS support.
|
|
23
23
|
|
|
24
24
|
```bash
|
|
25
25
|
npm install @eggjs/koa
|
|
@@ -28,11 +28,12 @@ npm install @eggjs/koa
|
|
|
28
28
|
## Hello Koa
|
|
29
29
|
|
|
30
30
|
```ts
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
import { Application } from '@eggjs/koa';
|
|
32
|
+
|
|
33
|
+
const app = new Application();
|
|
33
34
|
|
|
34
35
|
// response
|
|
35
|
-
app.use(ctx => {
|
|
36
|
+
app.use((ctx) => {
|
|
36
37
|
ctx.body = 'Hello Koa';
|
|
37
38
|
});
|
|
38
39
|
|
|
@@ -86,7 +87,7 @@ Each middleware receives a Koa `Context` object that encapsulates an incoming
|
|
|
86
87
|
http message and the corresponding response to that message. `ctx` is often used
|
|
87
88
|
as the parameter name for the context object.
|
|
88
89
|
|
|
89
|
-
```
|
|
90
|
+
```ts
|
|
90
91
|
app.use(async (ctx, next) => {
|
|
91
92
|
await next();
|
|
92
93
|
});
|
|
@@ -180,6 +181,6 @@ See [AUTHORS](AUTHORS).
|
|
|
180
181
|
- [Wiki](https://github.com/koajs/koa/wiki)
|
|
181
182
|
- [中文文档 v2.x](https://github.com/demopark/koa-docs-Zh-CN)
|
|
182
183
|
|
|
183
|
-
|
|
184
|
+
## License
|
|
184
185
|
|
|
185
|
-
[MIT](
|
|
186
|
+
[MIT](LICENSE)
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/// <reference types="http-errors" />
|
|
1
2
|
/// <reference types="node" />
|
|
2
3
|
/// <reference types="node" />
|
|
3
4
|
/// <reference types="node" />
|
|
@@ -7,15 +8,15 @@ import util from 'node:util';
|
|
|
7
8
|
import http from 'node:http';
|
|
8
9
|
import type { AsyncLocalStorage } from 'node:async_hooks';
|
|
9
10
|
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
10
|
-
import Context from './context';
|
|
11
|
-
import Request from './request';
|
|
12
|
-
import Response from './response';
|
|
13
|
-
import type { ContextDelegation } from './context';
|
|
14
|
-
import type { CustomError,
|
|
11
|
+
import Context from './context.js';
|
|
12
|
+
import Request from './request.js';
|
|
13
|
+
import Response from './response.js';
|
|
14
|
+
import type { ContextDelegation } from './context.js';
|
|
15
|
+
import type { CustomError, AnyProto } from './types.js';
|
|
16
|
+
export type ProtoImplClass<T = object> = new (...args: any[]) => T;
|
|
15
17
|
export type Next = () => Promise<void>;
|
|
16
18
|
export type MiddlewareFunc = (ctx: ContextDelegation, next: Next) => Promise<void> | void;
|
|
17
|
-
export type { ContextDelegation as Context } from './context';
|
|
18
|
-
export type { CustomError, ProtoImplClass } from './types';
|
|
19
|
+
export type { ContextDelegation as Context } from './context.js';
|
|
19
20
|
/**
|
|
20
21
|
* Expose `Application` class.
|
|
21
22
|
* Inherits from `Emitter.prototype`.
|
|
@@ -26,7 +27,7 @@ export default class Application extends Emitter {
|
|
|
26
27
|
* Make HttpError available to consumers of the library so that consumers don't
|
|
27
28
|
* have a direct dependency upon `http-errors`
|
|
28
29
|
*/
|
|
29
|
-
static HttpError:
|
|
30
|
+
static HttpError: import("http-errors").HttpErrorConstructor<number>;
|
|
30
31
|
proxy: boolean;
|
|
31
32
|
subdomainOffset: number;
|
|
32
33
|
proxyIpHeader: string;
|
|
@@ -71,12 +72,24 @@ export default class Application extends Emitter {
|
|
|
71
72
|
* Return JSON representation.
|
|
72
73
|
* We only bother showing settings.
|
|
73
74
|
*/
|
|
74
|
-
toJSON():
|
|
75
|
+
toJSON(): {
|
|
76
|
+
subdomainOffset: number;
|
|
77
|
+
proxy: boolean;
|
|
78
|
+
env: string;
|
|
79
|
+
};
|
|
75
80
|
/**
|
|
76
81
|
* Inspect implementation.
|
|
77
82
|
*/
|
|
78
|
-
inspect():
|
|
79
|
-
|
|
83
|
+
inspect(): {
|
|
84
|
+
subdomainOffset: number;
|
|
85
|
+
proxy: boolean;
|
|
86
|
+
env: string;
|
|
87
|
+
};
|
|
88
|
+
[util.inspect.custom](): {
|
|
89
|
+
subdomainOffset: number;
|
|
90
|
+
proxy: boolean;
|
|
91
|
+
env: string;
|
|
92
|
+
};
|
|
80
93
|
/**
|
|
81
94
|
* Use the given middleware `fn`.
|
|
82
95
|
*
|
|
@@ -89,7 +102,7 @@ export default class Application extends Emitter {
|
|
|
89
102
|
*/
|
|
90
103
|
callback(): (req: IncomingMessage, res: ServerResponse) => Promise<void | http.ServerResponse<http.IncomingMessage>>;
|
|
91
104
|
/**
|
|
92
|
-
* return
|
|
105
|
+
* return current context from async local storage
|
|
93
106
|
*/
|
|
94
107
|
get currentContext(): ContextDelegation | undefined;
|
|
95
108
|
/**
|
|
@@ -102,7 +115,6 @@ export default class Application extends Emitter {
|
|
|
102
115
|
* @private
|
|
103
116
|
*/
|
|
104
117
|
protected onerror(err: CustomError): void;
|
|
105
|
-
createAsyncCtxStorageMiddleware(): (ctx: ContextDelegation, next: Next) => Promise<void>;
|
|
106
118
|
/**
|
|
107
119
|
* Response helper.
|
|
108
120
|
*/
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const node_util_1 = require("node:util");
|
|
7
|
+
const node_events_1 = __importDefault(require("node:events"));
|
|
8
|
+
const node_util_2 = __importDefault(require("node:util"));
|
|
9
|
+
const node_stream_1 = __importDefault(require("node:stream"));
|
|
10
|
+
const node_http_1 = __importDefault(require("node:http"));
|
|
11
|
+
const gals_1 = require("gals");
|
|
12
|
+
const is_type_of_1 = require("is-type-of");
|
|
13
|
+
const on_finished_1 = __importDefault(require("on-finished"));
|
|
14
|
+
const statuses_1 = __importDefault(require("statuses"));
|
|
15
|
+
const koa_compose_1 = __importDefault(require("koa-compose"));
|
|
16
|
+
const http_errors_1 = require("http-errors");
|
|
17
|
+
const context_js_1 = __importDefault(require("./context.js"));
|
|
18
|
+
const request_js_1 = __importDefault(require("./request.js"));
|
|
19
|
+
const response_js_1 = __importDefault(require("./response.js"));
|
|
20
|
+
const debug = (0, node_util_1.debuglog)('koa:application');
|
|
21
|
+
/**
|
|
22
|
+
* Expose `Application` class.
|
|
23
|
+
* Inherits from `Emitter.prototype`.
|
|
24
|
+
*/
|
|
25
|
+
class Application extends node_events_1.default {
|
|
26
|
+
/**
|
|
27
|
+
* Make HttpError available to consumers of the library so that consumers don't
|
|
28
|
+
* have a direct dependency upon `http-errors`
|
|
29
|
+
*/
|
|
30
|
+
static HttpError = http_errors_1.HttpError;
|
|
31
|
+
proxy;
|
|
32
|
+
subdomainOffset;
|
|
33
|
+
proxyIpHeader;
|
|
34
|
+
maxIpsCount;
|
|
35
|
+
env;
|
|
36
|
+
keys;
|
|
37
|
+
middleware;
|
|
38
|
+
ctxStorage;
|
|
39
|
+
silent;
|
|
40
|
+
ContextClass;
|
|
41
|
+
context;
|
|
42
|
+
RequestClass;
|
|
43
|
+
request;
|
|
44
|
+
ResponseClass;
|
|
45
|
+
response;
|
|
46
|
+
/**
|
|
47
|
+
* Initialize a new `Application`.
|
|
48
|
+
*
|
|
49
|
+
* @param {object} [options] Application options
|
|
50
|
+
* @param {string} [options.env='development'] Environment
|
|
51
|
+
* @param {string[]} [options.keys] Signed cookie keys
|
|
52
|
+
* @param {boolean} [options.proxy] Trust proxy headers
|
|
53
|
+
* @param {number} [options.subdomainOffset] Subdomain offset
|
|
54
|
+
* @param {string} [options.proxyIpHeader] Proxy IP header, defaults to X-Forwarded-For
|
|
55
|
+
* @param {number} [options.maxIpsCount] Max IPs read from proxy IP header, default to 0 (means infinity)
|
|
56
|
+
*/
|
|
57
|
+
constructor(options) {
|
|
58
|
+
super();
|
|
59
|
+
options = options || {};
|
|
60
|
+
this.proxy = options.proxy || false;
|
|
61
|
+
this.subdomainOffset = options.subdomainOffset || 2;
|
|
62
|
+
this.proxyIpHeader = options.proxyIpHeader || 'X-Forwarded-For';
|
|
63
|
+
this.maxIpsCount = options.maxIpsCount || 0;
|
|
64
|
+
this.env = options.env || process.env.NODE_ENV || 'development';
|
|
65
|
+
if (options.keys)
|
|
66
|
+
this.keys = options.keys;
|
|
67
|
+
this.middleware = [];
|
|
68
|
+
this.ctxStorage = (0, gals_1.getAsyncLocalStorage)();
|
|
69
|
+
this.silent = false;
|
|
70
|
+
this.ContextClass = class ApplicationContext extends context_js_1.default {
|
|
71
|
+
};
|
|
72
|
+
this.context = this.ContextClass.prototype;
|
|
73
|
+
this.RequestClass = class ApplicationRequest extends request_js_1.default {
|
|
74
|
+
};
|
|
75
|
+
this.request = this.RequestClass.prototype;
|
|
76
|
+
this.ResponseClass = class ApplicationResponse extends response_js_1.default {
|
|
77
|
+
};
|
|
78
|
+
this.response = this.ResponseClass.prototype;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Shorthand for:
|
|
82
|
+
*
|
|
83
|
+
* http.createServer(app.callback()).listen(...)
|
|
84
|
+
*/
|
|
85
|
+
listen(...args) {
|
|
86
|
+
debug('listen');
|
|
87
|
+
const server = node_http_1.default.createServer(this.callback());
|
|
88
|
+
return server.listen(...args);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Return JSON representation.
|
|
92
|
+
* We only bother showing settings.
|
|
93
|
+
*/
|
|
94
|
+
toJSON() {
|
|
95
|
+
return {
|
|
96
|
+
subdomainOffset: this.subdomainOffset,
|
|
97
|
+
proxy: this.proxy,
|
|
98
|
+
env: this.env,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Inspect implementation.
|
|
103
|
+
*/
|
|
104
|
+
inspect() {
|
|
105
|
+
return this.toJSON();
|
|
106
|
+
}
|
|
107
|
+
[node_util_2.default.inspect.custom]() {
|
|
108
|
+
return this.inspect();
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Use the given middleware `fn`.
|
|
112
|
+
*
|
|
113
|
+
* Old-style middleware will be converted.
|
|
114
|
+
*/
|
|
115
|
+
use(fn) {
|
|
116
|
+
if (typeof fn !== 'function')
|
|
117
|
+
throw new TypeError('middleware must be a function!');
|
|
118
|
+
if ((0, is_type_of_1.isGeneratorFunction)(fn)) {
|
|
119
|
+
throw new TypeError('Support for generators was removed. ' +
|
|
120
|
+
'See the documentation for examples of how to convert old middleware ' +
|
|
121
|
+
'https://github.com/koajs/koa/blob/master/docs/migration.md');
|
|
122
|
+
}
|
|
123
|
+
debug('use %s #%d', fn._name || fn.name || '-', this.middleware.length);
|
|
124
|
+
this.middleware.push(fn);
|
|
125
|
+
return this;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Return a request handler callback
|
|
129
|
+
* for node's native http server.
|
|
130
|
+
*/
|
|
131
|
+
callback() {
|
|
132
|
+
const fn = (0, koa_compose_1.default)(this.middleware);
|
|
133
|
+
if (!this.listenerCount('error')) {
|
|
134
|
+
this.on('error', this.onerror.bind(this));
|
|
135
|
+
}
|
|
136
|
+
const handleRequest = (req, res) => {
|
|
137
|
+
const ctx = this.createContext(req, res);
|
|
138
|
+
return this.ctxStorage.run(ctx, async () => {
|
|
139
|
+
return await this.#handleRequest(ctx, fn);
|
|
140
|
+
});
|
|
141
|
+
};
|
|
142
|
+
return handleRequest;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* return current context from async local storage
|
|
146
|
+
*/
|
|
147
|
+
get currentContext() {
|
|
148
|
+
return this.ctxStorage.getStore();
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Handle request in callback.
|
|
152
|
+
* @private
|
|
153
|
+
*/
|
|
154
|
+
async #handleRequest(ctx, fnMiddleware) {
|
|
155
|
+
const res = ctx.res;
|
|
156
|
+
res.statusCode = 404;
|
|
157
|
+
const onerror = (err) => ctx.onerror(err);
|
|
158
|
+
(0, on_finished_1.default)(res, onerror);
|
|
159
|
+
try {
|
|
160
|
+
await fnMiddleware(ctx);
|
|
161
|
+
return this._respond(ctx);
|
|
162
|
+
}
|
|
163
|
+
catch (err) {
|
|
164
|
+
return onerror(err);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Initialize a new context.
|
|
169
|
+
* @private
|
|
170
|
+
*/
|
|
171
|
+
createContext(req, res) {
|
|
172
|
+
const context = new this.ContextClass(this, req, res);
|
|
173
|
+
return context;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Default error handler.
|
|
177
|
+
* @private
|
|
178
|
+
*/
|
|
179
|
+
onerror(err) {
|
|
180
|
+
// When dealing with cross-globals a normal `instanceof` check doesn't work properly.
|
|
181
|
+
// See https://github.com/koajs/koa/issues/1466
|
|
182
|
+
// We can probably remove it once jest fixes https://github.com/facebook/jest/issues/2549.
|
|
183
|
+
const isNativeError = err instanceof Error ||
|
|
184
|
+
Object.prototype.toString.call(err) === '[object Error]';
|
|
185
|
+
if (!isNativeError)
|
|
186
|
+
throw new TypeError(node_util_2.default.format('non-error thrown: %j', err));
|
|
187
|
+
if (err.status === 404 || err.expose)
|
|
188
|
+
return;
|
|
189
|
+
if (this.silent)
|
|
190
|
+
return;
|
|
191
|
+
const msg = err.stack || err.toString();
|
|
192
|
+
console.error(`\n${msg.replace(/^/gm, ' ')}\n`);
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Response helper.
|
|
196
|
+
*/
|
|
197
|
+
_respond(ctx) {
|
|
198
|
+
// allow bypassing koa
|
|
199
|
+
if (ctx.respond === false)
|
|
200
|
+
return;
|
|
201
|
+
if (!ctx.writable)
|
|
202
|
+
return;
|
|
203
|
+
const res = ctx.res;
|
|
204
|
+
let body = ctx.body;
|
|
205
|
+
const code = ctx.status;
|
|
206
|
+
// ignore body
|
|
207
|
+
if (statuses_1.default.empty[code]) {
|
|
208
|
+
// strip headers
|
|
209
|
+
ctx.body = null;
|
|
210
|
+
return res.end();
|
|
211
|
+
}
|
|
212
|
+
if (ctx.method === 'HEAD') {
|
|
213
|
+
if (!res.headersSent && !ctx.response.has('Content-Length')) {
|
|
214
|
+
const { length } = ctx.response;
|
|
215
|
+
if (Number.isInteger(length))
|
|
216
|
+
ctx.length = length;
|
|
217
|
+
}
|
|
218
|
+
return res.end();
|
|
219
|
+
}
|
|
220
|
+
// status body
|
|
221
|
+
if (body == null) {
|
|
222
|
+
if (ctx.response._explicitNullBody) {
|
|
223
|
+
ctx.response.remove('Content-Type');
|
|
224
|
+
ctx.response.remove('Transfer-Encoding');
|
|
225
|
+
return res.end();
|
|
226
|
+
}
|
|
227
|
+
if (ctx.req.httpVersionMajor >= 2) {
|
|
228
|
+
body = String(code);
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
body = ctx.message || String(code);
|
|
232
|
+
}
|
|
233
|
+
if (!res.headersSent) {
|
|
234
|
+
ctx.type = 'text';
|
|
235
|
+
ctx.length = Buffer.byteLength(body);
|
|
236
|
+
}
|
|
237
|
+
return res.end(body);
|
|
238
|
+
}
|
|
239
|
+
// responses
|
|
240
|
+
if (Buffer.isBuffer(body))
|
|
241
|
+
return res.end(body);
|
|
242
|
+
if (typeof body === 'string')
|
|
243
|
+
return res.end(body);
|
|
244
|
+
if (body instanceof node_stream_1.default)
|
|
245
|
+
return body.pipe(res);
|
|
246
|
+
// body: json
|
|
247
|
+
body = JSON.stringify(body);
|
|
248
|
+
if (!res.headersSent) {
|
|
249
|
+
ctx.length = Buffer.byteLength(body);
|
|
250
|
+
}
|
|
251
|
+
res.end(body);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
exports.default = Application;
|
|
255
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwbGljYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBwbGljYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSx5Q0FBcUM7QUFDckMsOERBQWtDO0FBQ2xDLDBEQUE2QjtBQUM3Qiw4REFBaUM7QUFDakMsMERBQTZCO0FBRzdCLCtCQUE0QztBQUM1QywyQ0FBaUQ7QUFDakQsOERBQXFDO0FBQ3JDLHdEQUFnQztBQUNoQyw4REFBa0M7QUFDbEMsNkNBQXdDO0FBQ3hDLDhEQUFtQztBQUNuQyw4REFBbUM7QUFDbkMsZ0VBQXFDO0FBSXJDLE1BQU0sS0FBSyxHQUFHLElBQUEsb0JBQVEsRUFBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBTzFDOzs7R0FHRztBQUNILE1BQXFCLFdBQVksU0FBUSxxQkFBTztJQUM5Qzs7O09BR0c7SUFDSCxNQUFNLENBQUMsU0FBUyxHQUFHLHVCQUFTLENBQUM7SUFFN0IsS0FBSyxDQUFVO0lBQ2YsZUFBZSxDQUFTO0lBQ3hCLGFBQWEsQ0FBUztJQUN0QixXQUFXLENBQVM7SUFDcEIsR0FBRyxDQUFTO0lBQ1osSUFBSSxDQUFZO0lBQ2hCLFVBQVUsQ0FBbUI7SUFDN0IsVUFBVSxDQUF1QztJQUNqRCxNQUFNLENBQVU7SUFDaEIsWUFBWSxDQUEwQjtJQUN0QyxPQUFPLENBQVc7SUFDbEIsWUFBWSxDQUEwQjtJQUN0QyxPQUFPLENBQVc7SUFDbEIsYUFBYSxDQUEyQjtJQUN4QyxRQUFRLENBQVc7SUFFbkI7Ozs7Ozs7Ozs7UUFVSTtJQUVKLFlBQVksT0FPWDtRQUNDLEtBQUssRUFBRSxDQUFDO1FBQ1IsT0FBTyxHQUFHLE9BQU8sSUFBSSxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQztRQUNwQyxJQUFJLENBQUMsZUFBZSxHQUFHLE9BQU8sQ0FBQyxlQUFlLElBQUksQ0FBQyxDQUFDO1FBQ3BELElBQUks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
|
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
import util from 'node:util';
|
|
4
4
|
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
5
5
|
import Cookies from 'cookies';
|
|
6
|
-
import type Application from './application';
|
|
7
|
-
import type Request from './request';
|
|
8
|
-
import type Response from './response';
|
|
9
|
-
import type { CustomError, AnyProto } from './types';
|
|
6
|
+
import type Application from './application.js';
|
|
7
|
+
import type Request from './request.js';
|
|
8
|
+
import type Response from './response.js';
|
|
9
|
+
import type { CustomError, AnyProto } from './types.js';
|
|
10
10
|
export default class Context {
|
|
11
11
|
#private;
|
|
12
12
|
app: Application;
|
|
@@ -23,9 +23,21 @@ export default class Context {
|
|
|
23
23
|
* just returns the JSON output.
|
|
24
24
|
*/
|
|
25
25
|
inspect(): {
|
|
26
|
-
request:
|
|
27
|
-
|
|
28
|
-
|
|
26
|
+
request: {
|
|
27
|
+
method: string;
|
|
28
|
+
url: string;
|
|
29
|
+
header: import("http").IncomingHttpHeaders;
|
|
30
|
+
};
|
|
31
|
+
response: {
|
|
32
|
+
status: number;
|
|
33
|
+
message: string;
|
|
34
|
+
header: import("http").OutgoingHttpHeaders;
|
|
35
|
+
};
|
|
36
|
+
app: {
|
|
37
|
+
subdomainOffset: number;
|
|
38
|
+
proxy: boolean;
|
|
39
|
+
env: string;
|
|
40
|
+
};
|
|
29
41
|
originalUrl: string;
|
|
30
42
|
req: string;
|
|
31
43
|
res: string;
|
|
@@ -35,9 +47,21 @@ export default class Context {
|
|
|
35
47
|
* Custom inspection implementation for newer Node.js versions.
|
|
36
48
|
*/
|
|
37
49
|
[util.inspect.custom](): {
|
|
38
|
-
request:
|
|
39
|
-
|
|
40
|
-
|
|
50
|
+
request: {
|
|
51
|
+
method: string;
|
|
52
|
+
url: string;
|
|
53
|
+
header: import("http").IncomingHttpHeaders;
|
|
54
|
+
};
|
|
55
|
+
response: {
|
|
56
|
+
status: number;
|
|
57
|
+
message: string;
|
|
58
|
+
header: import("http").OutgoingHttpHeaders;
|
|
59
|
+
};
|
|
60
|
+
app: {
|
|
61
|
+
subdomainOffset: number;
|
|
62
|
+
proxy: boolean;
|
|
63
|
+
env: string;
|
|
64
|
+
};
|
|
41
65
|
originalUrl: string;
|
|
42
66
|
req: string;
|
|
43
67
|
res: string;
|
|
@@ -52,9 +76,21 @@ export default class Context {
|
|
|
52
76
|
* clone() to fail.
|
|
53
77
|
*/
|
|
54
78
|
toJSON(): {
|
|
55
|
-
request:
|
|
56
|
-
|
|
57
|
-
|
|
79
|
+
request: {
|
|
80
|
+
method: string;
|
|
81
|
+
url: string;
|
|
82
|
+
header: import("http").IncomingHttpHeaders;
|
|
83
|
+
};
|
|
84
|
+
response: {
|
|
85
|
+
status: number;
|
|
86
|
+
message: string;
|
|
87
|
+
header: import("http").OutgoingHttpHeaders;
|
|
88
|
+
};
|
|
89
|
+
app: {
|
|
90
|
+
subdomainOffset: number;
|
|
91
|
+
proxy: boolean;
|
|
92
|
+
env: string;
|
|
93
|
+
};
|
|
58
94
|
originalUrl: string;
|
|
59
95
|
req: string;
|
|
60
96
|
res: string;
|
|
@@ -66,13 +102,12 @@ export default class Context {
|
|
|
66
102
|
* this.assert(this.user, 401, 'Please login!');
|
|
67
103
|
*
|
|
68
104
|
* See: https://github.com/jshttp/http-assert
|
|
69
|
-
*
|
|
70
|
-
* @param {Mixed} test
|
|
105
|
+
* @param {Mixed} value
|
|
71
106
|
* @param {Number} status
|
|
72
|
-
* @param {String}
|
|
73
|
-
* @public
|
|
107
|
+
* @param {String} opts
|
|
74
108
|
*/
|
|
75
|
-
assert(
|
|
109
|
+
assert(value: any, status?: number, opts?: Record<string, any>): void;
|
|
110
|
+
assert(value: any, status?: number, msg?: string, opts?: Record<string, any>): void;
|
|
76
111
|
/**
|
|
77
112
|
* Throw an error with `status` (default 500) and
|
|
78
113
|
* `msg`. Note that these are user-level
|
|
@@ -83,16 +118,31 @@ export default class Context {
|
|
|
83
118
|
* this.throw('something exploded')
|
|
84
119
|
* this.throw(new Error('invalid'))
|
|
85
120
|
* this.throw(400, new Error('invalid'))
|
|
121
|
+
* this.throw(400, new Error('invalid'), { foo: 'bar' })
|
|
122
|
+
* this.throw(new Error('invalid'), { foo: 'bar' })
|
|
86
123
|
*
|
|
87
124
|
* See: https://github.com/jshttp/http-errors
|
|
88
125
|
*
|
|
89
126
|
* Note: `status` should only be passed as the first parameter.
|
|
90
127
|
*
|
|
91
|
-
* @param {String|Number|Error}
|
|
92
|
-
* @param {String|Number|Error} [
|
|
93
|
-
* @param {Object} [
|
|
128
|
+
* @param {String|Number|Error} status error, msg or status
|
|
129
|
+
* @param {String|Number|Error|Object} [error] error, msg, status or errorProps
|
|
130
|
+
* @param {Object} [errorProps] error object properties
|
|
94
131
|
*/
|
|
95
|
-
throw(
|
|
132
|
+
throw(status: number): void;
|
|
133
|
+
throw(status: number, errorProps: object): void;
|
|
134
|
+
throw(status: number, errorMessage: string): void;
|
|
135
|
+
throw(status: number, errorMessage: string, errorProps: object): void;
|
|
136
|
+
throw(status: number, error: Error): void;
|
|
137
|
+
throw(status: number, error: Error, errorProps: object): void;
|
|
138
|
+
throw(errorMessage: string): void;
|
|
139
|
+
throw(errorMessage: string, errorProps: object): void;
|
|
140
|
+
throw(errorMessage: string, status: number): void;
|
|
141
|
+
throw(errorMessage: string, status: number, errorProps: object): void;
|
|
142
|
+
throw(error: Error): void;
|
|
143
|
+
throw(error: Error, errorProps: object): void;
|
|
144
|
+
throw(error: Error, status: number): void;
|
|
145
|
+
throw(error: Error, status: number, errorProps: object): void;
|
|
96
146
|
/**
|
|
97
147
|
* Default error handling.
|
|
98
148
|
* @private
|