@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 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 < 16.13.0 support.
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 v16.3.0__ or higher for Node.js LTS support.
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
- const Koa = require('@eggjs/koa');
32
- const app = new Koa();
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
- ```js
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
- # License
184
+ ## License
184
185
 
185
- [MIT](https://github.com/eggjs/koa/blob/master/LICENSE)
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, ProtoImplClass, AnyProto } from './types';
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: any;
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(): any;
75
+ toJSON(): {
76
+ subdomainOffset: number;
77
+ proxy: boolean;
78
+ env: string;
79
+ };
75
80
  /**
76
81
  * Inspect implementation.
77
82
  */
78
- inspect(): any;
79
- [util.inspect.custom](): any;
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 currnect contenxt from async local storage
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: any;
27
- response: any;
28
- app: any;
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: any;
39
- response: any;
40
- app: any;
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: any;
56
- response: any;
57
- app: any;
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} message
73
- * @public
107
+ * @param {String} opts
74
108
  */
75
- assert(...args: any[]): any;
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} err, msg or status
92
- * @param {String|Number|Error} [err, msg or status]
93
- * @param {Object} [props]
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(...args: any[]): void;
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