@eggjs/koa 2.14.2 → 2.15.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.
@@ -1,318 +1,264 @@
1
-
2
- 'use strict';
3
-
4
- /**
5
- * Module dependencies.
6
- */
7
-
8
- const isGeneratorFunction = require('is-generator-function');
9
- const debug = require('debug')('koa:application');
10
- const onFinished = require('on-finished');
11
- const assert = require('assert');
12
- const response = require('./response');
13
- const compose = require('koa-compose');
14
- const context = require('./context');
15
- const request = require('./request');
16
- const statuses = require('statuses');
17
- const Emitter = require('events');
18
- const util = require('util');
19
- const Stream = require('stream');
20
- const http = require('http');
21
- const only = require('only');
22
- const convert = require('koa-convert');
23
- const deprecate = require('depd')('koa');
24
- const { HttpError } = require('http-errors');
25
-
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 node_async_hooks_1 = require("node:async_hooks");
12
+ const is_generator_function_1 = __importDefault(require("is-generator-function"));
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 only_1 = __importDefault(require("only"));
17
+ const http_errors_1 = require("http-errors");
18
+ const context_1 = __importDefault(require("./context"));
19
+ const request_1 = __importDefault(require("./request"));
20
+ const response_1 = __importDefault(require("./response"));
21
+ const debug = (0, node_util_1.debuglog)('koa:application');
26
22
  /**
27
23
  * Expose `Application` class.
28
24
  * Inherits from `Emitter.prototype`.
29
25
  */
30
-
31
- module.exports = class Application extends Emitter {
32
- /**
33
- * Initialize a new `Application`.
34
- *
35
- * @api public
36
- */
37
-
38
- /**
39
- *
40
- * @param {object} [options] Application options
41
- * @param {string} [options.env='development'] Environment
42
- * @param {string[]} [options.keys] Signed cookie keys
43
- * @param {boolean} [options.proxy] Trust proxy headers
44
- * @param {number} [options.subdomainOffset] Subdomain offset
45
- * @param {string} [options.proxyIpHeader] Proxy IP header, defaults to X-Forwarded-For
46
- * @param {number} [options.maxIpsCount] Max IPs read from proxy IP header, default to 0 (means infinity)
47
- *
48
- */
49
-
50
- constructor(options) {
51
- super();
52
- options = options || {};
53
- this.proxy = options.proxy || false;
54
- this.subdomainOffset = options.subdomainOffset || 2;
55
- this.proxyIpHeader = options.proxyIpHeader || 'X-Forwarded-For';
56
- this.maxIpsCount = options.maxIpsCount || 0;
57
- this.env = options.env || process.env.NODE_ENV || 'development';
58
- if (options.keys) this.keys = options.keys;
59
- this.middleware = [];
60
- this.context = Object.create(context);
61
- this.request = Object.create(request);
62
- this.response = Object.create(response);
63
- // util.inspect.custom support for node 6+
64
- /* istanbul ignore else */
65
- if (util.inspect.custom) {
66
- this[util.inspect.custom] = this.inspect;
26
+ class Application extends node_events_1.default {
27
+ /**
28
+ * Make HttpError available to consumers of the library so that consumers don't
29
+ * have a direct dependency upon `http-errors`
30
+ */
31
+ static HttpError = http_errors_1.HttpError;
32
+ proxy;
33
+ subdomainOffset;
34
+ proxyIpHeader;
35
+ maxIpsCount;
36
+ env;
37
+ keys;
38
+ middleware;
39
+ ctxStorage;
40
+ silent;
41
+ ContextClass;
42
+ context;
43
+ RequestClass;
44
+ request;
45
+ ResponseClass;
46
+ response;
47
+ /**
48
+ * Initialize a new `Application`.
49
+ *
50
+ * @param {object} [options] Application options
51
+ * @param {string} [options.env='development'] Environment
52
+ * @param {string[]} [options.keys] Signed cookie keys
53
+ * @param {boolean} [options.proxy] Trust proxy headers
54
+ * @param {number} [options.subdomainOffset] Subdomain offset
55
+ * @param {string} [options.proxyIpHeader] Proxy IP header, defaults to X-Forwarded-For
56
+ * @param {number} [options.maxIpsCount] Max IPs read from proxy IP header, default to 0 (means infinity)
57
+ */
58
+ constructor(options) {
59
+ super();
60
+ options = options || {};
61
+ this.proxy = options.proxy || false;
62
+ this.subdomainOffset = options.subdomainOffset || 2;
63
+ this.proxyIpHeader = options.proxyIpHeader || 'X-Forwarded-For';
64
+ this.maxIpsCount = options.maxIpsCount || 0;
65
+ this.env = options.env || process.env.NODE_ENV || 'development';
66
+ if (options.keys)
67
+ this.keys = options.keys;
68
+ this.middleware = [];
69
+ this.ctxStorage = new node_async_hooks_1.AsyncLocalStorage();
70
+ this.silent = false;
71
+ this.ContextClass = class ApplicationContext extends context_1.default {
72
+ };
73
+ this.context = this.ContextClass.prototype;
74
+ this.RequestClass = class ApplicationRequest extends request_1.default {
75
+ };
76
+ this.request = this.RequestClass.prototype;
77
+ this.ResponseClass = class ApplicationResponse extends response_1.default {
78
+ };
79
+ this.response = this.ResponseClass.prototype;
80
+ }
81
+ /**
82
+ * Shorthand for:
83
+ *
84
+ * http.createServer(app.callback()).listen(...)
85
+ */
86
+ listen(...args) {
87
+ debug('listen');
88
+ const server = node_http_1.default.createServer(this.callback());
89
+ return server.listen(...args);
67
90
  }
68
- if (options.asyncLocalStorage) {
69
- const { AsyncLocalStorage } = require('async_hooks');
70
- assert(AsyncLocalStorage, 'Requires node 12.17.0 or higher to enable asyncLocalStorage');
71
- this.ctxStorage = new AsyncLocalStorage();
91
+ /**
92
+ * Return JSON representation.
93
+ * We only bother showing settings.
94
+ */
95
+ toJSON() {
96
+ return (0, only_1.default)(this, [
97
+ 'subdomainOffset',
98
+ 'proxy',
99
+ 'env',
100
+ ]);
72
101
  }
73
- }
74
-
75
- /**
76
- * Shorthand for:
77
- *
78
- * http.createServer(app.callback()).listen(...)
79
- *
80
- * @param {Mixed} ...
81
- * @return {Server}
82
- * @api public
83
- */
84
-
85
- listen(...args) {
86
- debug('listen');
87
- const server = http.createServer(this.callback());
88
- return server.listen(...args);
89
- }
90
-
91
- /**
92
- * Return JSON representation.
93
- * We only bother showing settings.
94
- *
95
- * @return {Object}
96
- * @api public
97
- */
98
-
99
- toJSON() {
100
- return only(this, [
101
- 'subdomainOffset',
102
- 'proxy',
103
- 'env'
104
- ]);
105
- }
106
-
107
- /**
108
- * Inspect implementation.
109
- *
110
- * @return {Object}
111
- * @api public
112
- */
113
-
114
- inspect() {
115
- return this.toJSON();
116
- }
117
-
118
- /**
119
- * Use the given middleware `fn`.
120
- *
121
- * Old-style middleware will be converted.
122
- *
123
- * @param {Function} fn
124
- * @return {Application} self
125
- * @api public
126
- */
127
-
128
- use(fn) {
129
- if (typeof fn !== 'function') throw new TypeError('middleware must be a function!');
130
- if (isGeneratorFunction(fn)) {
131
- deprecate('Support for generators will be removed in v3. ' +
102
+ /**
103
+ * Inspect implementation.
104
+ */
105
+ inspect() {
106
+ return this.toJSON();
107
+ }
108
+ [node_util_2.default.inspect.custom]() {
109
+ return this.inspect();
110
+ }
111
+ /**
112
+ * Use the given middleware `fn`.
113
+ *
114
+ * Old-style middleware will be converted.
115
+ */
116
+ use(fn) {
117
+ if (typeof fn !== 'function')
118
+ throw new TypeError('middleware must be a function!');
119
+ if ((0, is_generator_function_1.default)(fn)) {
120
+ throw new TypeError('Support for generators was removed. ' +
132
121
  'See the documentation for examples of how to convert old middleware ' +
133
122
  'https://github.com/koajs/koa/blob/master/docs/migration.md');
134
- fn = convert(fn);
123
+ }
124
+ debug('use %s #%d', fn._name || fn.name || '-', this.middleware.length);
125
+ this.middleware.push(fn);
126
+ return this;
135
127
  }
136
- debug('use %s', fn._name || fn.name || '-');
137
- this.middleware.push(fn);
138
- return this;
139
- }
140
-
141
- /**
142
- * Return a request handler callback
143
- * for node's native http server.
144
- *
145
- * @return {Function}
146
- * @api public
147
- */
148
-
149
- callback() {
150
- const fn = compose(this.middleware);
151
-
152
- if (!this.listenerCount('error')) this.on('error', this.onerror);
153
-
154
- const handleRequest = (req, res) => {
155
- const ctx = this.createContext(req, res);
156
- if (!this.ctxStorage) {
157
- return this.handleRequest(ctx, fn);
158
- }
159
- return this.ctxStorage.run(ctx, async() => {
160
- return await this.handleRequest(ctx, fn);
161
- });
162
- };
163
-
164
- return handleRequest;
165
- }
166
-
167
- /**
168
- * return currnect contenxt from async local storage
169
- */
170
- get currentContext() {
171
- if (this.ctxStorage) return this.ctxStorage.getStore();
172
- }
173
-
174
- /**
175
- * Handle request in callback.
176
- *
177
- * @api private
178
- */
179
-
180
- handleRequest(ctx, fnMiddleware) {
181
- const res = ctx.res;
182
- res.statusCode = 404;
183
- const onerror = err => ctx.onerror(err);
184
- const handleResponse = () => respond(ctx);
185
- onFinished(res, onerror);
186
- return fnMiddleware(ctx).then(handleResponse).catch(onerror);
187
- }
188
-
189
- /**
190
- * Initialize a new context.
191
- *
192
- * @api private
193
- */
194
-
195
- createContext(req, res) {
196
- const context = Object.create(this.context);
197
- const request = context.request = Object.create(this.request);
198
- const response = context.response = Object.create(this.response);
199
- context.app = request.app = response.app = this;
200
- context.req = request.req = response.req = req;
201
- context.res = request.res = response.res = res;
202
- request.ctx = response.ctx = context;
203
- request.response = response;
204
- response.request = request;
205
- context.originalUrl = request.originalUrl = req.url;
206
- context.state = {};
207
- return context;
208
- }
209
-
210
- /**
211
- * Default error handler.
212
- *
213
- * @param {Error} err
214
- * @api private
215
- */
216
-
217
- onerror(err) {
218
- // When dealing with cross-globals a normal `instanceof` check doesn't work properly.
219
- // See https://github.com/koajs/koa/issues/1466
220
- // We can probably remove it once jest fixes https://github.com/facebook/jest/issues/2549.
221
- const isNativeError =
222
- Object.prototype.toString.call(err) === '[object Error]' ||
223
- err instanceof Error;
224
- if (!isNativeError) throw new TypeError(util.format('non-error thrown: %j', err));
225
-
226
- if (404 === err.status || err.expose) return;
227
- if (this.silent) return;
228
-
229
- const msg = err.stack || err.toString();
230
- console.error(`\n${msg.replace(/^/gm, ' ')}\n`);
231
- }
232
-
233
- /**
234
- * Help TS users comply to CommonJS, ESM, bundler mismatch.
235
- * @see https://github.com/koajs/koa/issues/1513
236
- */
237
-
238
- static get default() {
239
- return Application;
240
- }
241
-
242
- createAsyncCtxStorageMiddleware() {
243
- const app = this;
244
- return async function asyncCtxStorage(ctx, next) {
245
- await app.ctxStorage.run(ctx, async() => {
246
- return await next();
247
- });
248
- };
249
- }
250
- };
251
-
252
- /**
253
- * Response helper.
254
- */
255
-
256
- function respond(ctx) {
257
- // allow bypassing koa
258
- if (false === ctx.respond) return;
259
-
260
- if (!ctx.writable) return;
261
-
262
- const res = ctx.res;
263
- let body = ctx.body;
264
- const code = ctx.status;
265
-
266
- // ignore body
267
- if (statuses.empty[code]) {
268
- // strip headers
269
- ctx.body = null;
270
- return res.end();
271
- }
272
-
273
- if ('HEAD' === ctx.method) {
274
- if (!res.headersSent && !ctx.response.has('Content-Length')) {
275
- const { length } = ctx.response;
276
- if (Number.isInteger(length)) ctx.length = length;
128
+ /**
129
+ * Return a request handler callback
130
+ * for node's native http server.
131
+ */
132
+ callback() {
133
+ const fn = (0, koa_compose_1.default)(this.middleware);
134
+ if (!this.listenerCount('error')) {
135
+ this.on('error', this.onerror.bind(this));
136
+ }
137
+ const handleRequest = (req, res) => {
138
+ const ctx = this.createContext(req, res);
139
+ return this.ctxStorage.run(ctx, async () => {
140
+ return await this.#handleRequest(ctx, fn);
141
+ });
142
+ };
143
+ return handleRequest;
144
+ }
145
+ /**
146
+ * return currnect contenxt from async local storage
147
+ */
148
+ get currentContext() {
149
+ if (this.ctxStorage)
150
+ return this.ctxStorage.getStore();
151
+ }
152
+ /**
153
+ * Handle request in callback.
154
+ * @private
155
+ */
156
+ async #handleRequest(ctx, fnMiddleware) {
157
+ const res = ctx.res;
158
+ res.statusCode = 404;
159
+ const onerror = (err) => ctx.onerror(err);
160
+ (0, on_finished_1.default)(res, onerror);
161
+ try {
162
+ await fnMiddleware(ctx);
163
+ return this._respond(ctx);
164
+ }
165
+ catch (err) {
166
+ return onerror(err);
167
+ }
277
168
  }
278
- return res.end();
279
- }
280
-
281
- // status body
282
- if (null == body) {
283
- if (ctx.response._explicitNullBody) {
284
- ctx.response.remove('Content-Type');
285
- ctx.response.remove('Transfer-Encoding');
286
- return res.end();
169
+ /**
170
+ * Initialize a new context.
171
+ * @private
172
+ */
173
+ createContext(req, res) {
174
+ const context = new this.ContextClass(this, req, res);
175
+ return context;
287
176
  }
288
- if (ctx.req.httpVersionMajor >= 2) {
289
- body = String(code);
290
- } else {
291
- body = ctx.message || String(code);
177
+ /**
178
+ * Default error handler.
179
+ * @private
180
+ */
181
+ onerror(err) {
182
+ // When dealing with cross-globals a normal `instanceof` check doesn't work properly.
183
+ // See https://github.com/koajs/koa/issues/1466
184
+ // We can probably remove it once jest fixes https://github.com/facebook/jest/issues/2549.
185
+ const isNativeError = err instanceof Error ||
186
+ Object.prototype.toString.call(err) === '[object Error]';
187
+ if (!isNativeError)
188
+ throw new TypeError(node_util_2.default.format('non-error thrown: %j', err));
189
+ if (err.status === 404 || err.expose)
190
+ return;
191
+ if (this.silent)
192
+ return;
193
+ const msg = err.stack || err.toString();
194
+ console.error(`\n${msg.replace(/^/gm, ' ')}\n`);
292
195
  }
293
- if (!res.headersSent) {
294
- ctx.type = 'text';
295
- ctx.length = Buffer.byteLength(body);
196
+ createAsyncCtxStorageMiddleware() {
197
+ return async (ctx, next) => {
198
+ await this.ctxStorage.run(ctx, async () => {
199
+ return await next();
200
+ });
201
+ };
202
+ }
203
+ /**
204
+ * Response helper.
205
+ */
206
+ _respond(ctx) {
207
+ // allow bypassing koa
208
+ if (ctx.respond === false)
209
+ return;
210
+ if (!ctx.writable)
211
+ return;
212
+ const res = ctx.res;
213
+ let body = ctx.body;
214
+ const code = ctx.status;
215
+ // ignore body
216
+ if (statuses_1.default.empty[code]) {
217
+ // strip headers
218
+ ctx.body = null;
219
+ return res.end();
220
+ }
221
+ if (ctx.method === 'HEAD') {
222
+ if (!res.headersSent && !ctx.response.has('Content-Length')) {
223
+ const { length } = ctx.response;
224
+ if (Number.isInteger(length))
225
+ ctx.length = length;
226
+ }
227
+ return res.end();
228
+ }
229
+ // status body
230
+ if (body == null) {
231
+ if (ctx.response._explicitNullBody) {
232
+ ctx.response.remove('Content-Type');
233
+ ctx.response.remove('Transfer-Encoding');
234
+ return res.end();
235
+ }
236
+ if (ctx.req.httpVersionMajor >= 2) {
237
+ body = String(code);
238
+ }
239
+ else {
240
+ body = ctx.message || String(code);
241
+ }
242
+ if (!res.headersSent) {
243
+ ctx.type = 'text';
244
+ ctx.length = Buffer.byteLength(body);
245
+ }
246
+ return res.end(body);
247
+ }
248
+ // responses
249
+ if (Buffer.isBuffer(body))
250
+ return res.end(body);
251
+ if (typeof body === 'string')
252
+ return res.end(body);
253
+ if (body instanceof node_stream_1.default)
254
+ return body.pipe(res);
255
+ // body: json
256
+ body = JSON.stringify(body);
257
+ if (!res.headersSent) {
258
+ ctx.length = Buffer.byteLength(body);
259
+ }
260
+ res.end(body);
296
261
  }
297
- return res.end(body);
298
- }
299
-
300
- // responses
301
- if (Buffer.isBuffer(body)) return res.end(body);
302
- if ('string' === typeof body) return res.end(body);
303
- if (body instanceof Stream) return body.pipe(res);
304
-
305
- // body: json
306
- body = JSON.stringify(body);
307
- if (!res.headersSent) {
308
- ctx.length = Buffer.byteLength(body);
309
- }
310
- res.end(body);
311
262
  }
312
-
313
- /**
314
- * Make HttpError available to consumers of the library so that consumers don't
315
- * have a direct dependency upon `http-errors`
316
- */
317
-
318
- module.exports.HttpError = HttpError;
263
+ exports.default = Application;
264
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwbGljYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvYXBwbGljYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSx5Q0FBcUM7QUFDckMsOERBQWtDO0FBQ2xDLDBEQUE2QjtBQUM3Qiw4REFBaUM7QUFDakMsMERBQTZCO0FBQzdCLHVEQUFxRDtBQUVyRCxrRkFBd0Q7QUFDeEQsOERBQXFDO0FBQ3JDLHdEQUFnQztBQUNoQyw4REFBa0M7QUFDbEMsZ0RBQXdCO0FBQ3hCLDZDQUF3QztBQUN4Qyx3REFBZ0M7QUFDaEMsd0RBQWdDO0FBQ2hDLDBEQUFrQztBQUlsQyxNQUFNLEtBQUssR0FBRyxJQUFBLG9CQUFRLEVBQUMsaUJBQWlCLENBQUMsQ0FBQztBQVExQzs7O0dBR0c7QUFDSCxNQUFxQixXQUFZLFNBQVEscUJBQU87SUFDOUM7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLFNBQVMsR0FBRyx1QkFBUyxDQUFDO0lBRTdCLEtBQUssQ0FBVTtJQUNmLGVBQWUsQ0FBUztJQUN4QixhQUFhLENBQVM7SUFDdEIsV0FBVyxDQUFTO0lBQ3BCLEdBQUcsQ0FBUztJQUNaLElBQUksQ0FBWTtJQUNoQixVQUFVLENBQW1CO0lBQzdCLFVBQVUsQ0FBdUM7SUFDakQsTUFBTSxDQUFVO0lBQ2hCLFlBQVksQ0FBMEI7SUFDdEMsT0FBTyxDQUFXO0lBQ2xCLFlBQVksQ0FBMEI7SUFDdEMsT0FBTyxDQUFXO0lBQ2xCLGFBQWEsQ0FBMkI7SUFDeEMsUUFBUSxDQUFXO0lBRW5COzs7Ozs7Ozs7O1FBVUk7SUFFSixZQUFZLE9BT1g7UUFDQyxLQUFLLEVBQUUsQ0FBQztRQUNSLE9BQU8sR0FBRyxPQUFPLElBQUksRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUM7UUFDcEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxPQUFPLENBQUMsZUFBZSxJQUFJLENBQUMsQ0FBQztR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