egg 3.29.0 → 4.0.0-beta.10

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 (232) hide show
  1. package/README.md +2 -1
  2. package/README.zh-CN.md +7 -5
  3. package/dist/commonjs/agent.d.ts +4 -0
  4. package/dist/commonjs/agent.js +10 -0
  5. package/dist/commonjs/app/extend/context.d.ts +154 -0
  6. package/dist/commonjs/app/extend/context.js +261 -0
  7. package/dist/commonjs/app/extend/context.types.d.ts +16 -0
  8. package/dist/commonjs/app/extend/context.types.js +3 -0
  9. package/dist/commonjs/app/extend/helper.d.ts +37 -0
  10. package/dist/commonjs/app/extend/helper.js +49 -0
  11. package/dist/commonjs/app/extend/request.d.ts +128 -0
  12. package/dist/commonjs/app/extend/request.js +270 -0
  13. package/dist/commonjs/app/extend/response.d.ts +25 -0
  14. package/dist/commonjs/app/extend/response.js +37 -0
  15. package/dist/commonjs/app/middleware/body_parser.d.ts +2 -0
  16. package/dist/commonjs/app/middleware/body_parser.js +8 -0
  17. package/dist/commonjs/app/middleware/meta.d.ts +10 -0
  18. package/dist/commonjs/app/middleware/meta.js +22 -0
  19. package/dist/commonjs/app/middleware/notfound.d.ts +7 -0
  20. package/dist/commonjs/app/middleware/notfound.js +31 -0
  21. package/dist/commonjs/app/middleware/override_method.d.ts +2 -0
  22. package/dist/commonjs/app/middleware/override_method.js +8 -0
  23. package/dist/commonjs/app/middleware/site_file.d.ts +9 -0
  24. package/dist/commonjs/app/middleware/site_file.js +58 -0
  25. package/dist/commonjs/config/config.default.d.ts +9 -0
  26. package/dist/commonjs/config/config.default.js +379 -0
  27. package/dist/commonjs/config/config.local.d.ts +8 -0
  28. package/dist/commonjs/config/config.local.js +12 -0
  29. package/dist/commonjs/config/config.unittest.d.ts +7 -0
  30. package/dist/commonjs/config/config.unittest.js +11 -0
  31. package/dist/commonjs/config/plugin.d.ts +122 -0
  32. package/dist/commonjs/config/plugin.js +125 -0
  33. package/dist/commonjs/index.d.ts +63 -0
  34. package/dist/commonjs/index.js +91 -0
  35. package/dist/commonjs/lib/agent.d.ts +19 -0
  36. package/dist/commonjs/lib/agent.js +58 -0
  37. package/dist/commonjs/lib/application.d.ts +59 -0
  38. package/dist/commonjs/lib/application.js +270 -0
  39. package/dist/commonjs/lib/core/base_context_class.d.ts +14 -0
  40. package/dist/commonjs/lib/core/base_context_class.js +22 -0
  41. package/dist/commonjs/lib/core/base_context_logger.d.ts +36 -0
  42. package/dist/commonjs/lib/core/base_context_logger.js +64 -0
  43. package/dist/commonjs/lib/core/base_hook_class.d.ts +11 -0
  44. package/dist/commonjs/lib/core/base_hook_class.js +30 -0
  45. package/dist/commonjs/lib/core/context_httpclient.d.ts +16 -0
  46. package/dist/commonjs/lib/core/context_httpclient.js +30 -0
  47. package/dist/commonjs/lib/core/httpclient.d.ts +13 -0
  48. package/dist/commonjs/lib/core/httpclient.js +37 -0
  49. package/dist/commonjs/lib/core/logger.d.ts +3 -0
  50. package/dist/commonjs/lib/core/logger.js +40 -0
  51. package/dist/commonjs/lib/core/messenger/IMessenger.d.ts +50 -0
  52. package/dist/commonjs/lib/core/messenger/IMessenger.js +3 -0
  53. package/dist/commonjs/lib/core/messenger/index.d.ts +7 -0
  54. package/dist/commonjs/lib/core/messenger/index.js +14 -0
  55. package/dist/commonjs/lib/core/messenger/ipc.d.ts +59 -0
  56. package/dist/commonjs/lib/core/messenger/ipc.js +137 -0
  57. package/dist/commonjs/lib/core/messenger/local.d.ts +61 -0
  58. package/dist/commonjs/lib/core/messenger/local.js +137 -0
  59. package/dist/commonjs/lib/core/singleton.d.ts +23 -0
  60. package/dist/commonjs/lib/core/singleton.js +120 -0
  61. package/dist/commonjs/lib/core/utils.d.ts +2 -0
  62. package/dist/commonjs/lib/core/utils.js +77 -0
  63. package/dist/commonjs/lib/egg.d.ts +276 -0
  64. package/dist/commonjs/lib/egg.js +617 -0
  65. package/dist/commonjs/lib/egg.types.d.ts +6 -0
  66. package/dist/commonjs/lib/egg.types.js +3 -0
  67. package/dist/commonjs/lib/loader/AgentWorkerLoader.d.ts +12 -0
  68. package/dist/commonjs/lib/loader/AgentWorkerLoader.js +24 -0
  69. package/dist/commonjs/lib/loader/AppWorkerLoader.d.ts +17 -0
  70. package/dist/commonjs/lib/loader/AppWorkerLoader.js +43 -0
  71. package/dist/commonjs/lib/loader/EggApplicationLoader.d.ts +4 -0
  72. package/dist/commonjs/lib/loader/EggApplicationLoader.js +8 -0
  73. package/dist/commonjs/lib/loader/index.d.ts +3 -0
  74. package/dist/commonjs/lib/loader/index.js +22 -0
  75. package/dist/commonjs/lib/start.d.ts +15 -0
  76. package/dist/commonjs/lib/start.js +49 -0
  77. package/dist/commonjs/lib/type.d.ts +293 -0
  78. package/dist/commonjs/lib/type.js +3 -0
  79. package/dist/commonjs/lib/utils.d.ts +2 -0
  80. package/dist/commonjs/lib/utils.js +21 -0
  81. package/dist/commonjs/package.json +3 -0
  82. package/dist/esm/agent.d.ts +4 -0
  83. package/dist/esm/agent.js +7 -0
  84. package/dist/esm/app/extend/context.d.ts +154 -0
  85. package/dist/esm/app/extend/context.js +255 -0
  86. package/dist/esm/app/extend/context.types.d.ts +16 -0
  87. package/dist/esm/app/extend/context.types.js +2 -0
  88. package/dist/esm/app/extend/helper.d.ts +37 -0
  89. package/dist/esm/app/extend/helper.js +43 -0
  90. package/dist/esm/app/extend/request.d.ts +128 -0
  91. package/dist/esm/app/extend/request.js +264 -0
  92. package/dist/esm/app/extend/response.d.ts +25 -0
  93. package/dist/esm/app/extend/response.js +34 -0
  94. package/dist/esm/app/middleware/body_parser.d.ts +2 -0
  95. package/dist/esm/app/middleware/body_parser.js +3 -0
  96. package/dist/esm/app/middleware/meta.d.ts +10 -0
  97. package/dist/esm/app/middleware/meta.js +20 -0
  98. package/dist/esm/app/middleware/notfound.d.ts +7 -0
  99. package/dist/esm/app/middleware/notfound.js +29 -0
  100. package/dist/esm/app/middleware/override_method.d.ts +2 -0
  101. package/dist/esm/app/middleware/override_method.js +3 -0
  102. package/dist/esm/app/middleware/site_file.d.ts +9 -0
  103. package/dist/esm/app/middleware/site_file.js +53 -0
  104. package/dist/esm/config/config.default.d.ts +9 -0
  105. package/dist/esm/config/config.default.js +374 -0
  106. package/dist/esm/config/config.local.d.ts +8 -0
  107. package/dist/esm/config/config.local.js +10 -0
  108. package/dist/esm/config/config.unittest.d.ts +7 -0
  109. package/dist/esm/config/config.unittest.js +9 -0
  110. package/dist/esm/config/favicon.png +0 -0
  111. package/dist/esm/config/plugin.d.ts +122 -0
  112. package/dist/esm/config/plugin.js +123 -0
  113. package/dist/esm/index.d.ts +63 -0
  114. package/dist/esm/index.js +66 -0
  115. package/dist/esm/lib/agent.d.ts +19 -0
  116. package/dist/esm/lib/agent.js +54 -0
  117. package/dist/esm/lib/application.d.ts +59 -0
  118. package/dist/esm/lib/application.js +263 -0
  119. package/dist/esm/lib/core/base_context_class.d.ts +14 -0
  120. package/dist/esm/lib/core/base_context_class.js +18 -0
  121. package/dist/esm/lib/core/base_context_logger.d.ts +36 -0
  122. package/dist/esm/lib/core/base_context_logger.js +60 -0
  123. package/dist/esm/lib/core/base_hook_class.d.ts +11 -0
  124. package/dist/esm/lib/core/base_hook_class.js +23 -0
  125. package/dist/esm/lib/core/context_httpclient.d.ts +16 -0
  126. package/dist/esm/lib/core/context_httpclient.js +26 -0
  127. package/dist/esm/lib/core/httpclient.d.ts +13 -0
  128. package/dist/esm/lib/core/httpclient.js +33 -0
  129. package/dist/esm/lib/core/logger.d.ts +3 -0
  130. package/dist/esm/lib/core/logger.js +37 -0
  131. package/dist/esm/lib/core/messenger/IMessenger.d.ts +50 -0
  132. package/dist/esm/lib/core/messenger/IMessenger.js +2 -0
  133. package/dist/esm/lib/core/messenger/index.d.ts +7 -0
  134. package/dist/esm/lib/core/messenger/index.js +11 -0
  135. package/dist/esm/lib/core/messenger/ipc.d.ts +59 -0
  136. package/dist/esm/lib/core/messenger/ipc.js +130 -0
  137. package/dist/esm/lib/core/messenger/local.d.ts +61 -0
  138. package/dist/esm/lib/core/messenger/local.js +130 -0
  139. package/dist/esm/lib/core/singleton.d.ts +23 -0
  140. package/dist/esm/lib/core/singleton.js +113 -0
  141. package/dist/esm/lib/core/utils.d.ts +2 -0
  142. package/dist/esm/lib/core/utils.js +70 -0
  143. package/dist/esm/lib/egg.d.ts +276 -0
  144. package/dist/esm/lib/egg.js +574 -0
  145. package/dist/esm/lib/egg.types.d.ts +6 -0
  146. package/dist/esm/lib/egg.types.js +2 -0
  147. package/dist/esm/lib/loader/AgentWorkerLoader.d.ts +12 -0
  148. package/dist/esm/lib/loader/AgentWorkerLoader.js +20 -0
  149. package/dist/esm/lib/loader/AppWorkerLoader.d.ts +17 -0
  150. package/dist/esm/lib/loader/AppWorkerLoader.js +39 -0
  151. package/dist/esm/lib/loader/EggApplicationLoader.d.ts +4 -0
  152. package/dist/esm/lib/loader/EggApplicationLoader.js +4 -0
  153. package/dist/esm/lib/loader/index.d.ts +3 -0
  154. package/dist/esm/lib/loader/index.js +4 -0
  155. package/dist/esm/lib/start.d.ts +15 -0
  156. package/dist/esm/lib/start.js +43 -0
  157. package/dist/esm/lib/type.d.ts +293 -0
  158. package/dist/esm/lib/type.js +2 -0
  159. package/dist/esm/lib/utils.d.ts +2 -0
  160. package/dist/esm/lib/utils.js +14 -0
  161. package/dist/esm/package.json +3 -0
  162. package/dist/package.json +4 -0
  163. package/package.json +97 -79
  164. package/src/agent.ts +7 -0
  165. package/src/app/extend/context.ts +303 -0
  166. package/src/app/extend/context.types.ts +24 -0
  167. package/{app/extend/helper.js → src/app/extend/helper.ts} +14 -13
  168. package/{app/extend/request.js → src/app/extend/request.ts} +81 -79
  169. package/src/app/extend/response.ts +36 -0
  170. package/src/app/middleware/body_parser.ts +3 -0
  171. package/{app/middleware/meta.js → src/app/middleware/meta.ts} +11 -4
  172. package/{app/middleware/notfound.js → src/app/middleware/notfound.ts} +8 -3
  173. package/src/app/middleware/override_method.ts +3 -0
  174. package/src/app/middleware/site_file.ts +68 -0
  175. package/{config/config.default.js → src/config/config.default.ts} +25 -45
  176. package/src/config/config.local.ts +11 -0
  177. package/src/config/config.unittest.ts +10 -0
  178. package/src/config/favicon.png +0 -0
  179. package/{config/plugin.js → src/config/plugin.ts} +3 -5
  180. package/src/index.ts +80 -0
  181. package/src/lib/agent.ts +66 -0
  182. package/{lib/application.js → src/lib/application.ts} +76 -124
  183. package/src/lib/core/base_context_class.ts +21 -0
  184. package/src/lib/core/base_context_logger.ts +67 -0
  185. package/src/lib/core/base_hook_class.ts +30 -0
  186. package/src/lib/core/context_httpclient.ts +33 -0
  187. package/src/lib/core/httpclient.ts +51 -0
  188. package/src/lib/core/logger.ts +42 -0
  189. package/src/lib/core/messenger/IMessenger.ts +58 -0
  190. package/src/lib/core/messenger/index.ts +15 -0
  191. package/src/lib/core/messenger/ipc.ts +148 -0
  192. package/{lib/core/messenger/local.js → src/lib/core/messenger/local.ts} +36 -28
  193. package/{lib/core/singleton.js → src/lib/core/singleton.ts} +56 -33
  194. package/src/lib/core/utils.ts +77 -0
  195. package/{lib/egg.js → src/lib/egg.ts} +287 -221
  196. package/src/lib/egg.types.ts +6 -0
  197. package/src/lib/loader/AgentWorkerLoader.ts +21 -0
  198. package/src/lib/loader/AppWorkerLoader.ts +42 -0
  199. package/src/lib/loader/EggApplicationLoader.ts +5 -0
  200. package/src/lib/loader/index.ts +3 -0
  201. package/src/lib/start.ts +56 -0
  202. package/src/lib/type.ts +329 -0
  203. package/src/lib/utils.ts +16 -0
  204. package/CHANGELOG.md +0 -2395
  205. package/History.md +0 -52
  206. package/agent.js +0 -11
  207. package/app/extend/context.js +0 -285
  208. package/app/extend/response.js +0 -101
  209. package/app/middleware/body_parser.js +0 -3
  210. package/app/middleware/override_method.js +0 -3
  211. package/app/middleware/site_file.js +0 -31
  212. package/config/config.local.js +0 -7
  213. package/config/config.unittest.js +0 -8
  214. package/index.d.ts +0 -1288
  215. package/index.js +0 -68
  216. package/lib/agent.js +0 -95
  217. package/lib/core/base_context_class.js +0 -20
  218. package/lib/core/base_context_logger.js +0 -64
  219. package/lib/core/base_hook_class.js +0 -31
  220. package/lib/core/context_httpclient.js +0 -26
  221. package/lib/core/dnscache_httpclient.js +0 -93
  222. package/lib/core/httpclient.js +0 -119
  223. package/lib/core/httpclient_next.js +0 -80
  224. package/lib/core/logger.js +0 -35
  225. package/lib/core/messenger/index.js +0 -14
  226. package/lib/core/messenger/ipc.js +0 -141
  227. package/lib/core/utils.js +0 -73
  228. package/lib/loader/agent_worker_loader.js +0 -27
  229. package/lib/loader/app_worker_loader.js +0 -48
  230. package/lib/loader/index.js +0 -5
  231. package/lib/start.js +0 -39
  232. /package/{config → dist/commonjs/config}/favicon.png +0 -0
@@ -0,0 +1,137 @@
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
+ exports.Messenger = void 0;
7
+ const node_util_1 = require("node:util");
8
+ const node_events_1 = __importDefault(require("node:events"));
9
+ const debug = (0, node_util_1.debuglog)('egg/lib/core/messenger/local');
10
+ /**
11
+ * Communication between app worker and agent worker with EventEmitter
12
+ */
13
+ class Messenger extends node_events_1.default {
14
+ pid;
15
+ egg;
16
+ constructor(egg) {
17
+ super();
18
+ this.egg = egg;
19
+ this.pid = String(process.pid);
20
+ }
21
+ /**
22
+ * Send message to all agent and app
23
+ * @param {String} action - message key
24
+ * @param {Object} data - message value
25
+ * @return {Messenger} this
26
+ */
27
+ broadcast(action, data) {
28
+ debug('[%s:%s] broadcast %s with %j', this.egg.type, this.pid, action, data);
29
+ this.send(action, data, 'both');
30
+ return this;
31
+ }
32
+ /**
33
+ * send message to the specified process
34
+ * Notice: in single process mode, it only can send to self process,
35
+ * and it will send to both agent and app's messengers.
36
+ * @param {String} workerId - the workerId of the receiver
37
+ * @param {String} action - message key
38
+ * @param {Object} data - message value
39
+ * @return {Messenger} this
40
+ */
41
+ sendTo(workerId, action, data) {
42
+ debug('[%s:%s] send %s with %j to %s', this.egg.type, this.pid, action, data, workerId);
43
+ if (String(workerId) !== this.pid) {
44
+ return this;
45
+ }
46
+ this.send(action, data, 'both');
47
+ return this;
48
+ }
49
+ /**
50
+ * send message to one worker by random
51
+ * Notice: in single process mode, we only start one agent worker and one app worker
52
+ * - if it's running in agent, it will send to one of app workers
53
+ * - if it's running in app, it will send to agent
54
+ * @param {String} action - message key
55
+ * @param {Object} data - message value
56
+ * @return {Messenger} this
57
+ */
58
+ sendRandom(action, data) {
59
+ debug('[%s:%s] send %s with %j to opposite', this.egg.type, this.pid, action, data);
60
+ this.send(action, data, 'opposite');
61
+ return this;
62
+ }
63
+ /**
64
+ * send message to app
65
+ * @param {String} action - message key
66
+ * @param {Object} data - message value
67
+ * @return {Messenger} this
68
+ */
69
+ sendToApp(action, data) {
70
+ debug('[%s:%s] send %s with %j to all app', this.egg.type, this.pid, action, data);
71
+ this.send(action, data, 'application');
72
+ return this;
73
+ }
74
+ /**
75
+ * send message to agent
76
+ * @param {String} action - message key
77
+ * @param {Object} data - message value
78
+ * @return {Messenger} this
79
+ */
80
+ sendToAgent(action, data) {
81
+ debug('[%s:%s] send %s with %j to all agent', this.egg.type, this.pid, action, data);
82
+ this.send(action, data, 'agent');
83
+ return this;
84
+ }
85
+ /**
86
+ * @param {String} action - message key
87
+ * @param {Object} data - message value
88
+ * @param {String} to - let master know how to send message
89
+ * @return {Messenger} this
90
+ */
91
+ send(action, data, to) {
92
+ // use nextTick to keep it async as IPC messenger
93
+ process.nextTick(() => {
94
+ const { egg } = this;
95
+ let application;
96
+ let agent;
97
+ let opposite;
98
+ if (egg.type === 'application') {
99
+ application = egg;
100
+ agent = egg.agent;
101
+ opposite = agent;
102
+ }
103
+ else {
104
+ agent = egg;
105
+ application = egg.application;
106
+ opposite = application;
107
+ }
108
+ if (!to) {
109
+ to = egg.type === 'application' ? 'agent' : 'application';
110
+ }
111
+ if (application && application.messenger && (to === 'application' || to === 'both')) {
112
+ application.messenger.onMessage({ action, data });
113
+ }
114
+ if (agent && agent.messenger && (to === 'agent' || to === 'both')) {
115
+ agent.messenger.onMessage({ action, data });
116
+ }
117
+ if (opposite && opposite.messenger && to === 'opposite') {
118
+ opposite.messenger.onMessage({ action, data });
119
+ }
120
+ });
121
+ return this;
122
+ }
123
+ onMessage(message) {
124
+ if (typeof message?.action === 'string') {
125
+ debug('[%s:%s] got message %s with %j', this.egg.type, this.pid, message.action, message.data);
126
+ this.emit(message.action, message.data);
127
+ }
128
+ else {
129
+ debug('[%s:%s] got an invalid message %j', this.egg.type, this.pid, message);
130
+ }
131
+ }
132
+ close() {
133
+ this.removeAllListeners();
134
+ }
135
+ }
136
+ exports.Messenger = Messenger;
137
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvcmUvbWVzc2VuZ2VyL2xvY2FsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHlDQUFxQztBQUNyQyw4REFBdUM7QUFJdkMsTUFBTSxLQUFLLEdBQUcsSUFBQSxvQkFBUSxFQUFDLDhCQUE4QixDQUFDLENBQUM7QUFFdkQ7O0dBRUc7QUFDSCxNQUFhLFNBQVUsU0FBUSxxQkFBWTtJQUNoQyxHQUFHLENBQVM7SUFDWixHQUFHLENBQXFCO0lBRWpDLFlBQVksR0FBdUI7UUFDakMsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNmLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxTQUFTLENBQUMsTUFBYyxFQUFFLElBQWM7UUFDdEMsS0FBSyxDQUFDLDhCQUE4QixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzdFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNoQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILE1BQU0sQ0FBQyxRQUFnQixFQUFFLE1BQWMsRUFBRSxJQUFjO1FBQ3JELEtBQUssQ0FBQywrQkFBK0IsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDeEYsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFD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
@@ -0,0 +1,23 @@
1
+ import type { EggApplicationCore } from '../egg.js';
2
+ export type SingletonCreateMethod = (config: Record<string, any>, app: EggApplicationCore, clientName: string) => unknown | Promise<unknown>;
3
+ export interface SingletonOptions {
4
+ name: string;
5
+ app: EggApplicationCore;
6
+ create: SingletonCreateMethod;
7
+ }
8
+ export declare class Singleton {
9
+ #private;
10
+ readonly clients: Map<string, any>;
11
+ readonly app: EggApplicationCore;
12
+ readonly create: SingletonCreateMethod;
13
+ readonly name: string;
14
+ readonly options: Record<string, any>;
15
+ constructor(options: SingletonOptions);
16
+ init(): void | Promise<void>;
17
+ initSync(): void;
18
+ initAsync(): Promise<void>;
19
+ get(id: string): any;
20
+ getSingletonInstance(id: string): any;
21
+ createInstance(config: Record<string, any>, clientName: string): unknown;
22
+ createInstanceAsync(config: Record<string, any>, clientName: string): Promise<unknown>;
23
+ }
@@ -0,0 +1,120 @@
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
+ exports.Singleton = void 0;
7
+ const node_assert_1 = __importDefault(require("node:assert"));
8
+ const is_type_of_1 = require("is-type-of");
9
+ class Singleton {
10
+ clients = new Map();
11
+ app;
12
+ create;
13
+ name;
14
+ options;
15
+ constructor(options) {
16
+ (0, node_assert_1.default)(options.name, '[egg:singleton] Singleton#constructor options.name is required');
17
+ (0, node_assert_1.default)(options.app, '[egg:singleton] Singleton#constructor options.app is required');
18
+ (0, node_assert_1.default)(options.create, '[egg:singleton] Singleton#constructor options.create is required');
19
+ (0, node_assert_1.default)(!(options.name in options.app), `[egg:singleton] ${options.name} is already exists in app`);
20
+ this.app = options.app;
21
+ this.name = options.name;
22
+ this.create = options.create;
23
+ this.options = options.app.config[this.name] ?? {};
24
+ }
25
+ init() {
26
+ return (0, is_type_of_1.isAsyncFunction)(this.create) ? this.initAsync() : this.initSync();
27
+ }
28
+ initSync() {
29
+ const options = this.options;
30
+ (0, node_assert_1.default)(!(options.client && options.clients), `[egg:singleton] ${this.name} can not set options.client and options.clients both`);
31
+ // alias app[name] as client, but still support createInstance method
32
+ if (options.client) {
33
+ const client = this.createInstance(options.client, options.name);
34
+ this.#setClientToApp(client);
35
+ this.#extendDynamicMethods(client);
36
+ return;
37
+ }
38
+ // multi client, use app[name].getInstance(id)
39
+ if (options.clients) {
40
+ Object.keys(options.clients).forEach(id => {
41
+ const client = this.createInstance(options.clients[id], id);
42
+ this.clients.set(id, client);
43
+ });
44
+ this.#setClientToApp(this);
45
+ return;
46
+ }
47
+ // no config.clients and config.client
48
+ this.#setClientToApp(this);
49
+ }
50
+ async initAsync() {
51
+ const options = this.options;
52
+ (0, node_assert_1.default)(!(options.client && options.clients), `[egg:singleton] ${this.name} can not set options.client and options.clients both`);
53
+ // alias app[name] as client, but still support createInstance method
54
+ if (options.client) {
55
+ const client = await this.createInstanceAsync(options.client, options.name);
56
+ this.#setClientToApp(client);
57
+ this.#extendDynamicMethods(client);
58
+ return;
59
+ }
60
+ // multi client, use app[name].getInstance(id)
61
+ if (options.clients) {
62
+ await Promise.all(Object.keys(options.clients).map((id) => {
63
+ return this.createInstanceAsync(options.clients[id], id)
64
+ .then(client => this.clients.set(id, client));
65
+ }));
66
+ this.#setClientToApp(this);
67
+ return;
68
+ }
69
+ // no config.clients and config.client
70
+ this.#setClientToApp(this);
71
+ }
72
+ #setClientToApp(client) {
73
+ Reflect.set(this.app, this.name, client);
74
+ }
75
+ get(id) {
76
+ return this.clients.get(id);
77
+ }
78
+ // alias to `get(id)`
79
+ getSingletonInstance(id) {
80
+ return this.clients.get(id);
81
+ }
82
+ createInstance(config, clientName) {
83
+ // async creator only support createInstanceAsync
84
+ (0, node_assert_1.default)(!(0, is_type_of_1.isAsyncFunction)(this.create), `egg:singleton ${this.name} only support create asynchronous, please use createInstanceAsync`);
85
+ // options.default will be merge in to options.clients[id]
86
+ config = {
87
+ ...this.options.default,
88
+ ...config,
89
+ };
90
+ return this.create(config, this.app, clientName);
91
+ }
92
+ async createInstanceAsync(config, clientName) {
93
+ // options.default will be merge in to options.clients[id]
94
+ config = {
95
+ ...this.options.default,
96
+ ...config,
97
+ };
98
+ return await this.create(config, this.app, clientName);
99
+ }
100
+ #extendDynamicMethods(client) {
101
+ (0, node_assert_1.default)(!client.createInstance, 'singleton instance should not have createInstance method');
102
+ (0, node_assert_1.default)(!client.createInstanceAsync, 'singleton instance should not have createInstanceAsync method');
103
+ try {
104
+ let extendable = client;
105
+ // Object.preventExtensions() or Object.freeze()
106
+ if (!Object.isExtensible(client) || Object.isFrozen(client)) {
107
+ // eslint-disable-next-line no-proto
108
+ extendable = client.__proto__ || client;
109
+ }
110
+ extendable.createInstance = this.createInstance.bind(this);
111
+ extendable.createInstanceAsync = this.createInstanceAsync.bind(this);
112
+ }
113
+ catch (err) {
114
+ this.app.coreLogger.warn('[egg:singleton] %s dynamic create is disabled because of client is un-extendable', this.name);
115
+ this.app.coreLogger.warn(err);
116
+ }
117
+ }
118
+ }
119
+ exports.Singleton = Singleton;
120
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2luZ2xldG9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9jb3JlL3NpbmdsZXRvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw4REFBaUM7QUFDakMsMkNBQTZDO0FBWTdDLE1BQWEsU0FBUztJQUNYLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBZSxDQUFDO0lBQ2pDLEdBQUcsQ0FBcUI7SUFDeEIsTUFBTSxDQUF3QjtJQUM5QixJQUFJLENBQVM7SUFDYixPQUFPLENBQXNCO0lBRXRDLFlBQVksT0FBeUI7UUFDbkMsSUFBQSxxQkFBTSxFQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsZ0VBQWdFLENBQUMsQ0FBQztRQUN2RixJQUFBLHFCQUFNLEVBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSwrREFBK0QsQ0FBQyxDQUFDO1FBQ3JGLElBQUEscUJBQU0sRUFBQyxPQUFPLENBQUMsTUFBTSxFQUFFLGtFQUFrRSxDQUFDLENBQUM7UUFDM0YsSUFBQSxxQkFBTSxFQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxtQkFBbUIsT0FBTyxDQUFDLElBQUksMkJBQTJCLENBQUMsQ0FBQztRQUNuRyxJQUFJLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUM7UUFDdkIsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUM3QixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDckQsQ0FBQztJQUVELElBQUk7UUFDRixPQUFPLElBQUEsNEJBQWUsRUFBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUks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
@@ -0,0 +1,2 @@
1
+ export declare function convertObject(obj: any, ignore: string | RegExp | (string | RegExp)[]): any;
2
+ export declare function safeParseURL(url: string): URL | null;
@@ -0,0 +1,77 @@
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
+ exports.convertObject = convertObject;
7
+ exports.safeParseURL = safeParseURL;
8
+ const node_util_1 = __importDefault(require("node:util"));
9
+ const is_type_of_1 = require("is-type-of");
10
+ function convertObject(obj, ignore) {
11
+ if (!Array.isArray(ignore)) {
12
+ ignore = [ignore];
13
+ }
14
+ for (const key of Object.keys(obj)) {
15
+ obj[key] = convertValue(key, obj[key], ignore);
16
+ }
17
+ return obj;
18
+ }
19
+ function convertValue(key, value, ignore) {
20
+ if (value === null || value === undefined) {
21
+ return value;
22
+ }
23
+ let hit = false;
24
+ for (const matchKey of ignore) {
25
+ if (typeof matchKey === 'string' && matchKey === key) {
26
+ hit = true;
27
+ break;
28
+ }
29
+ else if ((0, is_type_of_1.isRegExp)(matchKey) && matchKey.test(key)) {
30
+ hit = true;
31
+ break;
32
+ }
33
+ }
34
+ if (!hit) {
35
+ if ((0, is_type_of_1.isSymbol)(value) || (0, is_type_of_1.isRegExp)(value)) {
36
+ return value.toString();
37
+ }
38
+ if ((0, is_type_of_1.isPrimitive)(value) || Array.isArray(value)) {
39
+ return value;
40
+ }
41
+ }
42
+ // only convert recursively when it's a plain object,
43
+ // o = {}
44
+ if (Object.getPrototypeOf(value) === Object.prototype) {
45
+ return convertObject(value, ignore);
46
+ }
47
+ // support class
48
+ const name = value.name || 'anonymous';
49
+ if ((0, is_type_of_1.isClass)(value)) {
50
+ return `<Class ${name}>`;
51
+ }
52
+ // support generator function
53
+ if ((0, is_type_of_1.isFunction)(value)) {
54
+ if ((0, is_type_of_1.isGeneratorFunction)(value))
55
+ return `<GeneratorFunction ${name}>`;
56
+ if ((0, is_type_of_1.isAsyncFunction)(value))
57
+ return `<AsyncFunction ${name}>`;
58
+ return `<Function ${name}>`;
59
+ }
60
+ const typeName = value.constructor.name;
61
+ if (typeName) {
62
+ if (Buffer.isBuffer(value) || typeof value === 'string') {
63
+ return `<${typeName} len: ${value.length}>`;
64
+ }
65
+ return `<${typeName}>`;
66
+ }
67
+ return node_util_1.default.format(value);
68
+ }
69
+ function safeParseURL(url) {
70
+ try {
71
+ return new URL(url);
72
+ }
73
+ catch {
74
+ return null;
75
+ }
76
+ }
77
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2NvcmUvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFNQSxzQ0FRQztBQXdERCxvQ0FNQztBQTVFRCwwREFBNkI7QUFDN0IsMkNBR29CO0FBRXBCLFNBQWdCLGFBQWEsQ0FBQyxHQUFRLEVBQUUsTUFBNkM7SUFDbkYsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUMzQixNQUFNLEdBQUcsQ0FBRSxNQUFNLENBQUUsQ0FBQztJQUN0QixDQUFDO0lBQ0QsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDbkMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFlBQVksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxHQUFXLEVBQUUsS0FBVSxFQUFFLE1BQTJCO0lBQ3hFLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDMUMsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDO0lBQ2hCLEtBQUssTUFBTSxRQUFRLElBQUksTUFBTSxFQUFFLENBQUM7UUFDOUIsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUksUUFBUSxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQ3JELEdBQUcsR0FBRyxJQUFJLENBQUM7WUFDWCxNQUFNO1FBQ1IsQ0FBQzthQUFNLElBQUksSUFBQSxxQkFBUSxFQUFDLFFBQVEsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNwRCxHQUFHLEdBQUcsSUFBSSxDQUFDO1lBQ1gsTUFBTTtRQUNSLENBQUM7SUFDSCxDQUFDO0lBQ0QsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ1QsSUFBSSxJQUFBLHFCQUFRLEVBQUMsS0FBSyxDQUFDLElBQUksSUFBQSxxQkFBUSxFQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdkMsT0FBTyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDMUIsQ0FBQztRQUNELElBQUksSUFBQSx3QkFBVyxFQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMvQyxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQscURBQXFEO0lBQ3JELFNBQVM7SUFDVCxJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEtBQUssTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3RELE9BQU8sYUFBYSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLElBQUksV0FBVyxDQUFDO0lBQ3ZDLElBQUksSUFBQSxvQkFBTyxFQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbkIsT0FBTyxVQUFVLElBQUksR0FBRyxDQUFDO0lBQzNCLENBQUM7SUFFRCw2QkFBNkI7SUFDN0IsSUFBSSxJQUFBLHVCQUFVLEVBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN0QixJQUFJLElBQUEsZ0NBQW1CLEVBQUMsS0FBSyxDQUFDO1lBQUUsT0FBTyxzQkFBc0IsSUFBSSxHQUFHLENBQUM7UUFDckUsSUFBSSxJQUFBLDRCQUFlLEVBQUMsS0FBSyxDQUFDO1lBQUUsT0FBTyxrQkFBa0IsSUFBSSxHQUFHLENBQUM7UUFDN0QsT0FBTyxhQUFhLElBQUksR0FBRyxDQUFDO0lBQzlCLENBQUM7SUFFRCxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztJQUN4QyxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ2IsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3hELE9BQU8sSUFBSSxRQUFRLFNBQVMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQzlDLENBQUM7UUFDRCxPQUFPLElBQUksUUFBUSxHQUFHLENBQUM7SUFDekIsQ0FBQztJQUVELE9BQU8sbUJBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDNUIsQ0FBQztBQUVELFNBQWdCLFlBQVksQ0FBQyxHQUFXO0lBQ3RDLElBQUksQ0FBQztRQUNILE9BQU8sSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdEIsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztBQUNILENBQUMifQ==
@@ -0,0 +1,276 @@
1
+ import { type IncomingMessage, type ServerResponse } from 'node:http';
2
+ import { AsyncLocalStorage } from 'node:async_hooks';
3
+ import { EggCore, Request as EggCoreRequest, Response as EggCoreResponse, Router } from '@eggjs/core';
4
+ import type { EggCoreOptions, Next, MiddlewareFunc as EggCoreMiddlewareFunc, ILifecycleBoot } from '@eggjs/core';
5
+ import { EggContextLogger as ContextLogger, EggLoggers, EggLogger } from 'egg-logger';
6
+ import { Cookies as ContextCookies } from '@eggjs/cookies';
7
+ import type { Agent } from './agent.js';
8
+ import type { Application } from './application.js';
9
+ import Context, { type ContextDelegation } from '../app/extend/context.js';
10
+ import type { EggAppConfig } from './type.js';
11
+ import { IMessenger } from './core/messenger/index.js';
12
+ import { ContextHttpClient } from './core/context_httpclient.js';
13
+ import { HttpClient, type HttpClientRequestOptions, type HttpClientRequestURL, type HttpClientResponse } from './core/httpclient.js';
14
+ import { type SingletonCreateMethod } from './core/singleton.js';
15
+ import { BaseContextClass } from './core/base_context_class.js';
16
+ import { BaseHookClass } from './core/base_hook_class.js';
17
+ import type { EggApplicationLoader } from './loader/index.js';
18
+ import './egg.types.js';
19
+ declare const EGG_PATH: unique symbol;
20
+ export interface EggApplicationCoreOptions extends Omit<EggCoreOptions, 'baseDir'> {
21
+ mode?: 'cluster' | 'single';
22
+ clusterPort?: number;
23
+ baseDir?: string;
24
+ }
25
+ export { Context, Router, EggLogger, };
26
+ export declare class Request extends EggCoreRequest {
27
+ app: EggCore;
28
+ response: Response;
29
+ ctx: ContextDelegation;
30
+ }
31
+ export declare class Response extends EggCoreResponse {
32
+ app: EggCore;
33
+ request: Request;
34
+ ctx: ContextDelegation;
35
+ }
36
+ export type { ContextDelegation, ILifecycleBoot, Next, };
37
+ export type EggContext = ContextDelegation;
38
+ export type MiddlewareFunc<T extends ContextDelegation = ContextDelegation> = EggCoreMiddlewareFunc<T>;
39
+ /**
40
+ * Based on koa's Application
41
+ * @see https://github.com/eggjs/egg-core
42
+ * @see https://github.com/eggjs/koa/blob/master/src/application.ts
43
+ * @augments EggCore
44
+ */
45
+ export declare class EggApplicationCore extends EggCore {
46
+ #private;
47
+ ctxStorage: AsyncLocalStorage<ContextDelegation>;
48
+ ContextCookies: typeof ContextCookies;
49
+ ContextLogger: typeof ContextLogger;
50
+ ContextHttpClient: typeof ContextHttpClient;
51
+ HttpClient: typeof HttpClient;
52
+ /**
53
+ * Retrieve base context class
54
+ * @member {BaseContextClass} BaseContextClass
55
+ * @since 1.0.0
56
+ */
57
+ BaseContextClass: typeof BaseContextClass;
58
+ /**
59
+ * Retrieve base controller
60
+ * @member {Controller} Controller
61
+ * @since 1.0.0
62
+ */
63
+ Controller: typeof BaseContextClass;
64
+ /**
65
+ * Retrieve base service
66
+ * @member {Service} Service
67
+ * @since 1.0.0
68
+ */
69
+ Service: typeof BaseContextClass;
70
+ /**
71
+ * Retrieve base subscription
72
+ * @member {Subscription} Subscription
73
+ * @since 2.12.0
74
+ */
75
+ Subscription: typeof BaseContextClass;
76
+ /**
77
+ * Retrieve base context class
78
+ * @member {BaseHookClass} BaseHookClass
79
+ */
80
+ BaseHookClass: typeof BaseHookClass;
81
+ /**
82
+ * Retrieve base boot
83
+ * @member {Boot}
84
+ */
85
+ Boot: typeof BaseHookClass;
86
+ options: Required<EggApplicationCoreOptions>;
87
+ readonly messenger: IMessenger;
88
+ agent?: Agent;
89
+ application?: Application;
90
+ loader: EggApplicationLoader;
91
+ /**
92
+ * @class
93
+ * @param {Object} options
94
+ * - {Object} [type] - type of instance, Agent and Application both extend koa, type can determine what it is.
95
+ * - {String} [baseDir] - app root dir, default is `process.cwd()`
96
+ * - {Object} [plugins] - custom plugin config, use it in unittest
97
+ * - {String} [mode] - process mode, can be cluster / single, default is `cluster`
98
+ */
99
+ constructor(options?: EggApplicationCoreOptions);
100
+ /**
101
+ * @deprecated please use `options` property instead
102
+ */
103
+ get _options(): Required<EggApplicationCoreOptions>;
104
+ protected loadConfig(): Promise<void>;
105
+ protected load(): Promise<void>;
106
+ /**
107
+ * Wrap the Client with Leader/Follower Pattern
108
+ *
109
+ * @description almost the same as Agent.cluster API, the only different is that this method create Follower.
110
+ *
111
+ * @see https://github.com/node-modules/cluster-client
112
+ * @param {Function} clientClass - client class function
113
+ * @param {Object} [options]
114
+ * - {Boolean} [autoGenerate] - whether generate delegate rule automatically, default is true
115
+ * - {Function} [formatKey] - a method to transform the subscription info into a string,default is JSON.stringify
116
+ * - {Object} [transcode|JSON.stringify/parse]
117
+ * - {Function} encode - custom serialize method
118
+ * - {Function} decode - custom deserialize method
119
+ * - {Boolean} [isBroadcast] - whether broadcast subscription result to all followers or just one, default is true
120
+ * - {Number} [responseTimeout] - response timeout, default is 3 seconds
121
+ * - {Number} [maxWaitTime|30000] - leader startup max time, default is 30 seconds
122
+ * @return {ClientWrapper} wrapper
123
+ */
124
+ cluster(clientClass: unknown, options?: object): any;
125
+ /**
126
+ * print the information when console.log(app)
127
+ * @return {Object} inspected app.
128
+ * @since 1.0.0
129
+ * @example
130
+ * ```js
131
+ * console.log(app);
132
+ * =>
133
+ * {
134
+ * name: 'mock-app',
135
+ * env: 'test',
136
+ * subdomainOffset: 2,
137
+ * config: '<egg config>',
138
+ * controller: '<egg controller>',
139
+ * service: '<egg service>',
140
+ * middlewares: '<egg middlewares>',
141
+ * urllib: '<egg urllib>',
142
+ * loggers: '<egg loggers>'
143
+ * }
144
+ * ```
145
+ */
146
+ inspect(): any;
147
+ toJSON(): any;
148
+ /**
149
+ * http request helper base on {@link httpclient}, it will auto save httpclient log.
150
+ * Keep the same api with `httpclient.request(url, args)`.
151
+ *
152
+ * See https://github.com/node-modules/urllib#api-doc for more details.
153
+ *
154
+ * @param {String} url request url address.
155
+ * @param {Object} options
156
+ * - method {String} - Request method, defaults to GET. Could be GET, POST, DELETE or PUT. Alias 'type'.
157
+ * - data {Object} - Data to be sent. Will be stringify automatically.
158
+ * - dataType {String} - String - Type of response data. Could be `text` or `json`.
159
+ * If it's `text`, the callback data would be a String.
160
+ * If it's `json`, the data of callback would be a parsed JSON Object.
161
+ * Default callback data would be a Buffer.
162
+ * - headers {Object} - Request headers.
163
+ * - timeout {Number} - Request timeout in milliseconds. Defaults to exports.TIMEOUT.
164
+ * Include remote server connecting timeout and response timeout.
165
+ * When timeout happen, will return ConnectionTimeout or ResponseTimeout.
166
+ * - auth {String} - `username:password` used in HTTP Basic Authorization.
167
+ * - followRedirect {Boolean} - follow HTTP 3xx responses as redirects. defaults to false.
168
+ * - gzip {Boolean} - let you get the res object when request connected, default false. alias customResponse
169
+ * - nestedQuerystring {Boolean} - urllib default use querystring to stringify form data which don't
170
+ * support nested object, will use qs instead of querystring to support nested object by set this option to true.
171
+ * - more options see https://github.com/node-modules/urllib
172
+ * @return {Object}
173
+ * - status {Number} - HTTP response status
174
+ * - headers {Object} - HTTP response headers
175
+ * - res {Object} - HTTP response meta
176
+ * - data {Object} - HTTP response body
177
+ *
178
+ * @example
179
+ * ```js
180
+ * const result = await app.curl('http://example.com/foo.json', {
181
+ * method: 'GET',
182
+ * dataType: 'json',
183
+ * });
184
+ * console.log(result.status, result.headers, result.data);
185
+ * ```
186
+ */
187
+ curl<T = any>(url: HttpClientRequestURL, options?: HttpClientRequestOptions): Promise<HttpClientResponse<T>>;
188
+ /**
189
+ * HttpClient instance
190
+ * @see https://github.com/node-modules/urllib
191
+ * @member {HttpClient}
192
+ */
193
+ get httpClient(): HttpClient;
194
+ /**
195
+ * @deprecated please use httpClient instead
196
+ * @alias httpClient
197
+ * @member {HttpClient}
198
+ */
199
+ get httpclient(): HttpClient;
200
+ /**
201
+ * All loggers contain logger, coreLogger and customLogger
202
+ * @member {Object}
203
+ * @since 1.0.0
204
+ */
205
+ get loggers(): EggLoggers;
206
+ /**
207
+ * Get logger by name, it's equal to app.loggers['name'],
208
+ * but you can extend it with your own logical.
209
+ * @param {String} name - logger name
210
+ * @return {Logger} logger
211
+ */
212
+ getLogger(name: string): EggLogger;
213
+ /**
214
+ * application logger, log file is `$HOME/logs/{appname}/{appname}-web`
215
+ * @member {Logger}
216
+ * @since 1.0.0
217
+ */
218
+ get logger(): EggLogger;
219
+ /**
220
+ * core logger for framework and plugins, log file is `$HOME/logs/{appname}/egg-web`
221
+ * @member {Logger}
222
+ * @since 1.0.0
223
+ */
224
+ get coreLogger(): EggLogger;
225
+ _unhandledRejectionHandler(err: any): void;
226
+ /**
227
+ * dump out the config and meta object
228
+ * @private
229
+ */
230
+ dumpConfigToObject(): {
231
+ config: Record<string, any>;
232
+ meta: Record<string, any>;
233
+ };
234
+ /**
235
+ * save app.config to `run/${type}_config.json`
236
+ * @private
237
+ */
238
+ dumpConfig(): void;
239
+ dumpTiming(): void;
240
+ get [EGG_PATH](): string;
241
+ get config(): EggAppConfig;
242
+ /**
243
+ * app.env delegate app.config.env
244
+ * @deprecated
245
+ */
246
+ get env(): string;
247
+ set env(_: string);
248
+ /**
249
+ * app.proxy delegate app.config.proxy
250
+ * @deprecated
251
+ */
252
+ get proxy(): boolean;
253
+ set proxy(_: boolean);
254
+ /**
255
+ * create a singleton instance
256
+ * @param {String} name - unique name for singleton
257
+ * @param {Function|AsyncFunction} create - method will be invoked when singleton instance create
258
+ */
259
+ addSingleton(name: string, create: SingletonCreateMethod): void;
260
+ /**
261
+ * Create an anonymous context, the context isn't request level, so the request is mocked.
262
+ * then you can use context level API like `ctx.service`
263
+ * @member {String} EggApplication#createAnonymousContext
264
+ * @param {Request} [req] - if you want to mock request like querystring, you can pass an object to this function.
265
+ * @return {Context} context
266
+ */
267
+ createAnonymousContext(req?: any): EggContext;
268
+ /**
269
+ * Create egg context
270
+ * @function EggApplication#createContext
271
+ * @param {Req} req - node native Request object
272
+ * @param {Res} res - node native Response object
273
+ * @return {Context} context object
274
+ */
275
+ createContext(req: IncomingMessage, res: ServerResponse): EggContext;
276
+ }