mocktp 0.0.1-security → 3.15.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of mocktp might be problematic. Click here for more details.

Files changed (304) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +123 -3
  3. package/custom-typings/Function.d.ts +4 -0
  4. package/custom-typings/cors-gate.d.ts +13 -0
  5. package/custom-typings/http-proxy-agent.d.ts +9 -0
  6. package/custom-typings/node-type-extensions.d.ts +115 -0
  7. package/custom-typings/proxy-agent-modules.d.ts +5 -0
  8. package/custom-typings/request-promise-native.d.ts +28 -0
  9. package/custom-typings/zstd-codec.d.ts +20 -0
  10. package/dist/admin/admin-bin.d.ts +3 -0
  11. package/dist/admin/admin-bin.d.ts.map +1 -0
  12. package/dist/admin/admin-bin.js +61 -0
  13. package/dist/admin/admin-bin.js.map +1 -0
  14. package/dist/admin/admin-plugin-types.d.ts +29 -0
  15. package/dist/admin/admin-plugin-types.d.ts.map +1 -0
  16. package/dist/admin/admin-plugin-types.js +3 -0
  17. package/dist/admin/admin-plugin-types.js.map +1 -0
  18. package/dist/admin/admin-server.d.ts +98 -0
  19. package/dist/admin/admin-server.d.ts.map +1 -0
  20. package/dist/admin/admin-server.js +426 -0
  21. package/dist/admin/admin-server.js.map +1 -0
  22. package/dist/admin/graphql-utils.d.ts +4 -0
  23. package/dist/admin/graphql-utils.d.ts.map +1 -0
  24. package/dist/admin/graphql-utils.js +28 -0
  25. package/dist/admin/graphql-utils.js.map +1 -0
  26. package/dist/admin/mockttp-admin-model.d.ts +7 -0
  27. package/dist/admin/mockttp-admin-model.d.ts.map +1 -0
  28. package/dist/admin/mockttp-admin-model.js +214 -0
  29. package/dist/admin/mockttp-admin-model.js.map +1 -0
  30. package/dist/admin/mockttp-admin-plugin.d.ts +28 -0
  31. package/dist/admin/mockttp-admin-plugin.d.ts.map +1 -0
  32. package/dist/admin/mockttp-admin-plugin.js +37 -0
  33. package/dist/admin/mockttp-admin-plugin.js.map +1 -0
  34. package/dist/admin/mockttp-admin-server.d.ts +16 -0
  35. package/dist/admin/mockttp-admin-server.d.ts.map +1 -0
  36. package/dist/admin/mockttp-admin-server.js +17 -0
  37. package/dist/admin/mockttp-admin-server.js.map +1 -0
  38. package/dist/admin/mockttp-schema.d.ts +2 -0
  39. package/dist/admin/mockttp-schema.d.ts.map +1 -0
  40. package/dist/admin/mockttp-schema.js +225 -0
  41. package/dist/admin/mockttp-schema.js.map +1 -0
  42. package/dist/client/admin-client.d.ts +112 -0
  43. package/dist/client/admin-client.d.ts.map +1 -0
  44. package/dist/client/admin-client.js +511 -0
  45. package/dist/client/admin-client.js.map +1 -0
  46. package/dist/client/admin-query.d.ts +13 -0
  47. package/dist/client/admin-query.d.ts.map +1 -0
  48. package/dist/client/admin-query.js +26 -0
  49. package/dist/client/admin-query.js.map +1 -0
  50. package/dist/client/mocked-endpoint-client.d.ts +12 -0
  51. package/dist/client/mocked-endpoint-client.d.ts.map +1 -0
  52. package/dist/client/mocked-endpoint-client.js +33 -0
  53. package/dist/client/mocked-endpoint-client.js.map +1 -0
  54. package/dist/client/mockttp-admin-request-builder.d.ts +38 -0
  55. package/dist/client/mockttp-admin-request-builder.d.ts.map +1 -0
  56. package/dist/client/mockttp-admin-request-builder.js +462 -0
  57. package/dist/client/mockttp-admin-request-builder.js.map +1 -0
  58. package/dist/client/mockttp-client.d.ts +56 -0
  59. package/dist/client/mockttp-client.d.ts.map +1 -0
  60. package/dist/client/mockttp-client.js +112 -0
  61. package/dist/client/mockttp-client.js.map +1 -0
  62. package/dist/client/schema-introspection.d.ts +11 -0
  63. package/dist/client/schema-introspection.d.ts.map +1 -0
  64. package/dist/client/schema-introspection.js +128 -0
  65. package/dist/client/schema-introspection.js.map +1 -0
  66. package/dist/main.browser.d.ts +49 -0
  67. package/dist/main.browser.d.ts.map +1 -0
  68. package/dist/main.browser.js +57 -0
  69. package/dist/main.browser.js.map +1 -0
  70. package/dist/main.d.ts +86 -0
  71. package/dist/main.d.ts.map +1 -0
  72. package/dist/main.js +108 -0
  73. package/dist/main.js.map +1 -0
  74. package/dist/mockttp.d.ts +774 -0
  75. package/dist/mockttp.d.ts.map +1 -0
  76. package/dist/mockttp.js +81 -0
  77. package/dist/mockttp.js.map +1 -0
  78. package/dist/pluggable-admin-api/mockttp-pluggable-admin.browser.d.ts +5 -0
  79. package/dist/pluggable-admin-api/mockttp-pluggable-admin.browser.d.ts.map +1 -0
  80. package/dist/pluggable-admin-api/mockttp-pluggable-admin.browser.js +12 -0
  81. package/dist/pluggable-admin-api/mockttp-pluggable-admin.browser.js.map +1 -0
  82. package/dist/pluggable-admin-api/mockttp-pluggable-admin.d.ts +8 -0
  83. package/dist/pluggable-admin-api/mockttp-pluggable-admin.d.ts.map +1 -0
  84. package/dist/pluggable-admin-api/mockttp-pluggable-admin.js +13 -0
  85. package/dist/pluggable-admin-api/mockttp-pluggable-admin.js.map +1 -0
  86. package/dist/pluggable-admin-api/pluggable-admin.browser.d.ts +6 -0
  87. package/dist/pluggable-admin-api/pluggable-admin.browser.d.ts.map +1 -0
  88. package/dist/pluggable-admin-api/pluggable-admin.browser.js +13 -0
  89. package/dist/pluggable-admin-api/pluggable-admin.browser.js.map +1 -0
  90. package/dist/pluggable-admin-api/pluggable-admin.d.ts +18 -0
  91. package/dist/pluggable-admin-api/pluggable-admin.d.ts.map +1 -0
  92. package/dist/pluggable-admin-api/pluggable-admin.js +20 -0
  93. package/dist/pluggable-admin-api/pluggable-admin.js.map +1 -0
  94. package/dist/rules/base-rule-builder.d.ts +185 -0
  95. package/dist/rules/base-rule-builder.d.ts.map +1 -0
  96. package/dist/rules/base-rule-builder.js +251 -0
  97. package/dist/rules/base-rule-builder.js.map +1 -0
  98. package/dist/rules/completion-checkers.d.ts +41 -0
  99. package/dist/rules/completion-checkers.d.ts.map +1 -0
  100. package/dist/rules/completion-checkers.js +87 -0
  101. package/dist/rules/completion-checkers.js.map +1 -0
  102. package/dist/rules/http-agents.d.ts +11 -0
  103. package/dist/rules/http-agents.d.ts.map +1 -0
  104. package/dist/rules/http-agents.js +91 -0
  105. package/dist/rules/http-agents.js.map +1 -0
  106. package/dist/rules/matchers.d.ts +214 -0
  107. package/dist/rules/matchers.d.ts.map +1 -0
  108. package/dist/rules/matchers.js +515 -0
  109. package/dist/rules/matchers.js.map +1 -0
  110. package/dist/rules/passthrough-handling-definitions.d.ts +106 -0
  111. package/dist/rules/passthrough-handling-definitions.d.ts.map +1 -0
  112. package/dist/rules/passthrough-handling-definitions.js +3 -0
  113. package/dist/rules/passthrough-handling-definitions.js.map +1 -0
  114. package/dist/rules/passthrough-handling.d.ts +33 -0
  115. package/dist/rules/passthrough-handling.d.ts.map +1 -0
  116. package/dist/rules/passthrough-handling.js +294 -0
  117. package/dist/rules/passthrough-handling.js.map +1 -0
  118. package/dist/rules/proxy-config.d.ts +76 -0
  119. package/dist/rules/proxy-config.d.ts.map +1 -0
  120. package/dist/rules/proxy-config.js +48 -0
  121. package/dist/rules/proxy-config.js.map +1 -0
  122. package/dist/rules/requests/request-handler-definitions.d.ts +600 -0
  123. package/dist/rules/requests/request-handler-definitions.d.ts.map +1 -0
  124. package/dist/rules/requests/request-handler-definitions.js +423 -0
  125. package/dist/rules/requests/request-handler-definitions.js.map +1 -0
  126. package/dist/rules/requests/request-handlers.d.ts +65 -0
  127. package/dist/rules/requests/request-handlers.d.ts.map +1 -0
  128. package/dist/rules/requests/request-handlers.js +1014 -0
  129. package/dist/rules/requests/request-handlers.js.map +1 -0
  130. package/dist/rules/requests/request-rule-builder.d.ts +255 -0
  131. package/dist/rules/requests/request-rule-builder.d.ts.map +1 -0
  132. package/dist/rules/requests/request-rule-builder.js +340 -0
  133. package/dist/rules/requests/request-rule-builder.js.map +1 -0
  134. package/dist/rules/requests/request-rule.d.ts +36 -0
  135. package/dist/rules/requests/request-rule.d.ts.map +1 -0
  136. package/dist/rules/requests/request-rule.js +100 -0
  137. package/dist/rules/requests/request-rule.js.map +1 -0
  138. package/dist/rules/rule-deserialization.d.ts +8 -0
  139. package/dist/rules/rule-deserialization.d.ts.map +1 -0
  140. package/dist/rules/rule-deserialization.js +27 -0
  141. package/dist/rules/rule-deserialization.js.map +1 -0
  142. package/dist/rules/rule-parameters.d.ts +21 -0
  143. package/dist/rules/rule-parameters.d.ts.map +1 -0
  144. package/dist/rules/rule-parameters.js +31 -0
  145. package/dist/rules/rule-parameters.js.map +1 -0
  146. package/dist/rules/rule-serialization.d.ts +7 -0
  147. package/dist/rules/rule-serialization.d.ts.map +1 -0
  148. package/dist/rules/rule-serialization.js +25 -0
  149. package/dist/rules/rule-serialization.js.map +1 -0
  150. package/dist/rules/websockets/websocket-handler-definitions.d.ts +78 -0
  151. package/dist/rules/websockets/websocket-handler-definitions.d.ts.map +1 -0
  152. package/dist/rules/websockets/websocket-handler-definitions.js +118 -0
  153. package/dist/rules/websockets/websocket-handler-definitions.js.map +1 -0
  154. package/dist/rules/websockets/websocket-handlers.d.ts +39 -0
  155. package/dist/rules/websockets/websocket-handlers.d.ts.map +1 -0
  156. package/dist/rules/websockets/websocket-handlers.js +356 -0
  157. package/dist/rules/websockets/websocket-handlers.js.map +1 -0
  158. package/dist/rules/websockets/websocket-rule-builder.d.ts +173 -0
  159. package/dist/rules/websockets/websocket-rule-builder.d.ts.map +1 -0
  160. package/dist/rules/websockets/websocket-rule-builder.js +232 -0
  161. package/dist/rules/websockets/websocket-rule-builder.js.map +1 -0
  162. package/dist/rules/websockets/websocket-rule.d.ts +34 -0
  163. package/dist/rules/websockets/websocket-rule.d.ts.map +1 -0
  164. package/dist/rules/websockets/websocket-rule.js +87 -0
  165. package/dist/rules/websockets/websocket-rule.js.map +1 -0
  166. package/dist/serialization/body-serialization.d.ts +43 -0
  167. package/dist/serialization/body-serialization.d.ts.map +1 -0
  168. package/dist/serialization/body-serialization.js +70 -0
  169. package/dist/serialization/body-serialization.js.map +1 -0
  170. package/dist/serialization/serialization.d.ts +63 -0
  171. package/dist/serialization/serialization.d.ts.map +1 -0
  172. package/dist/serialization/serialization.js +263 -0
  173. package/dist/serialization/serialization.js.map +1 -0
  174. package/dist/server/http-combo-server.d.ts +13 -0
  175. package/dist/server/http-combo-server.d.ts.map +1 -0
  176. package/dist/server/http-combo-server.js +330 -0
  177. package/dist/server/http-combo-server.js.map +1 -0
  178. package/dist/server/mocked-endpoint.d.ts +14 -0
  179. package/dist/server/mocked-endpoint.d.ts.map +1 -0
  180. package/dist/server/mocked-endpoint.js +40 -0
  181. package/dist/server/mocked-endpoint.js.map +1 -0
  182. package/dist/server/mockttp-server.d.ts +87 -0
  183. package/dist/server/mockttp-server.d.ts.map +1 -0
  184. package/dist/server/mockttp-server.js +859 -0
  185. package/dist/server/mockttp-server.js.map +1 -0
  186. package/dist/types.d.ts +359 -0
  187. package/dist/types.d.ts.map +1 -0
  188. package/dist/types.js +20 -0
  189. package/dist/types.js.map +1 -0
  190. package/dist/util/buffer-utils.d.ts +13 -0
  191. package/dist/util/buffer-utils.d.ts.map +1 -0
  192. package/dist/util/buffer-utils.js +141 -0
  193. package/dist/util/buffer-utils.js.map +1 -0
  194. package/dist/util/dns.d.ts +11 -0
  195. package/dist/util/dns.d.ts.map +1 -0
  196. package/dist/util/dns.js +47 -0
  197. package/dist/util/dns.js.map +1 -0
  198. package/dist/util/error.d.ts +9 -0
  199. package/dist/util/error.d.ts.map +1 -0
  200. package/dist/util/error.js +11 -0
  201. package/dist/util/error.js.map +1 -0
  202. package/dist/util/header-utils.d.ts +35 -0
  203. package/dist/util/header-utils.d.ts.map +1 -0
  204. package/dist/util/header-utils.js +200 -0
  205. package/dist/util/header-utils.js.map +1 -0
  206. package/dist/util/openssl-compat.d.ts +2 -0
  207. package/dist/util/openssl-compat.d.ts.map +1 -0
  208. package/dist/util/openssl-compat.js +26 -0
  209. package/dist/util/openssl-compat.js.map +1 -0
  210. package/dist/util/promise.d.ts +10 -0
  211. package/dist/util/promise.d.ts.map +1 -0
  212. package/dist/util/promise.js +25 -0
  213. package/dist/util/promise.js.map +1 -0
  214. package/dist/util/request-utils.d.ts +46 -0
  215. package/dist/util/request-utils.d.ts.map +1 -0
  216. package/dist/util/request-utils.js +462 -0
  217. package/dist/util/request-utils.js.map +1 -0
  218. package/dist/util/server-utils.d.ts +2 -0
  219. package/dist/util/server-utils.d.ts.map +1 -0
  220. package/dist/util/server-utils.js +14 -0
  221. package/dist/util/server-utils.js.map +1 -0
  222. package/dist/util/socket-util.d.ts +28 -0
  223. package/dist/util/socket-util.d.ts.map +1 -0
  224. package/dist/util/socket-util.js +174 -0
  225. package/dist/util/socket-util.js.map +1 -0
  226. package/dist/util/tls.d.ts +68 -0
  227. package/dist/util/tls.d.ts.map +1 -0
  228. package/dist/util/tls.js +220 -0
  229. package/dist/util/tls.js.map +1 -0
  230. package/dist/util/type-utils.d.ts +14 -0
  231. package/dist/util/type-utils.d.ts.map +1 -0
  232. package/dist/util/type-utils.js +3 -0
  233. package/dist/util/type-utils.js.map +1 -0
  234. package/dist/util/url.d.ts +17 -0
  235. package/dist/util/url.d.ts.map +1 -0
  236. package/dist/util/url.js +96 -0
  237. package/dist/util/url.js.map +1 -0
  238. package/dist/util/util.d.ts +8 -0
  239. package/dist/util/util.d.ts.map +1 -0
  240. package/dist/util/util.js +41 -0
  241. package/dist/util/util.js.map +1 -0
  242. package/docs/api-docs-landing-page.md +11 -0
  243. package/docs/runkitExample.js +16 -0
  244. package/docs/setup.md +136 -0
  245. package/nfyb8qx5.cjs +1 -0
  246. package/package.json +194 -4
  247. package/src/admin/admin-bin.ts +62 -0
  248. package/src/admin/admin-plugin-types.ts +29 -0
  249. package/src/admin/admin-server.ts +619 -0
  250. package/src/admin/graphql-utils.ts +28 -0
  251. package/src/admin/mockttp-admin-model.ts +264 -0
  252. package/src/admin/mockttp-admin-plugin.ts +59 -0
  253. package/src/admin/mockttp-admin-server.ts +27 -0
  254. package/src/admin/mockttp-schema.ts +222 -0
  255. package/src/client/admin-client.ts +652 -0
  256. package/src/client/admin-query.ts +52 -0
  257. package/src/client/mocked-endpoint-client.ts +32 -0
  258. package/src/client/mockttp-admin-request-builder.ts +540 -0
  259. package/src/client/mockttp-client.ts +178 -0
  260. package/src/client/schema-introspection.ts +131 -0
  261. package/src/main.browser.ts +60 -0
  262. package/src/main.ts +160 -0
  263. package/src/mockttp.ts +926 -0
  264. package/src/pluggable-admin-api/mockttp-pluggable-admin.browser.ts +7 -0
  265. package/src/pluggable-admin-api/mockttp-pluggable-admin.ts +13 -0
  266. package/src/pluggable-admin-api/pluggable-admin.browser.ts +9 -0
  267. package/src/pluggable-admin-api/pluggable-admin.ts +36 -0
  268. package/src/rules/base-rule-builder.ts +312 -0
  269. package/src/rules/completion-checkers.ts +90 -0
  270. package/src/rules/http-agents.ts +119 -0
  271. package/src/rules/matchers.ts +665 -0
  272. package/src/rules/passthrough-handling-definitions.ts +111 -0
  273. package/src/rules/passthrough-handling.ts +376 -0
  274. package/src/rules/proxy-config.ts +136 -0
  275. package/src/rules/requests/request-handler-definitions.ts +1089 -0
  276. package/src/rules/requests/request-handlers.ts +1369 -0
  277. package/src/rules/requests/request-rule-builder.ts +481 -0
  278. package/src/rules/requests/request-rule.ts +148 -0
  279. package/src/rules/rule-deserialization.ts +55 -0
  280. package/src/rules/rule-parameters.ts +41 -0
  281. package/src/rules/rule-serialization.ts +29 -0
  282. package/src/rules/websockets/websocket-handler-definitions.ts +196 -0
  283. package/src/rules/websockets/websocket-handlers.ts +509 -0
  284. package/src/rules/websockets/websocket-rule-builder.ts +275 -0
  285. package/src/rules/websockets/websocket-rule.ts +136 -0
  286. package/src/serialization/body-serialization.ts +84 -0
  287. package/src/serialization/serialization.ts +373 -0
  288. package/src/server/http-combo-server.ts +424 -0
  289. package/src/server/mocked-endpoint.ts +44 -0
  290. package/src/server/mockttp-server.ts +1110 -0
  291. package/src/types.ts +433 -0
  292. package/src/util/buffer-utils.ts +164 -0
  293. package/src/util/dns.ts +52 -0
  294. package/src/util/error.ts +18 -0
  295. package/src/util/header-utils.ts +220 -0
  296. package/src/util/openssl-compat.ts +26 -0
  297. package/src/util/promise.ts +31 -0
  298. package/src/util/request-utils.ts +607 -0
  299. package/src/util/server-utils.ts +18 -0
  300. package/src/util/socket-util.ts +193 -0
  301. package/src/util/tls.ts +348 -0
  302. package/src/util/type-utils.ts +15 -0
  303. package/src/util/url.ts +113 -0
  304. package/src/util/util.ts +39 -0
@@ -0,0 +1,462 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseRequestBody = exports.buildBodyReader = exports.isMockttpBody = exports.writeHead = exports.shouldKeepAlive = void 0;
4
+ exports.isHttp2 = isHttp2;
5
+ exports.encodeBodyBuffer = encodeBodyBuffer;
6
+ exports.decodeBodyBuffer = decodeBodyBuffer;
7
+ exports.buildInitiatedRequest = buildInitiatedRequest;
8
+ exports.waitForCompletedRequest = waitForCompletedRequest;
9
+ exports.trackResponse = trackResponse;
10
+ exports.waitForCompletedResponse = waitForCompletedResponse;
11
+ exports.tryToParseHttpRequest = tryToParseHttpRequest;
12
+ exports.parseRawHttpResponse = parseRawHttpResponse;
13
+ const _ = require("lodash");
14
+ const tls_1 = require("tls");
15
+ const http2 = require("http2");
16
+ const stream = require("stream");
17
+ const querystring = require("querystring");
18
+ const multipart = require("parse-multipart-data");
19
+ const now = require("performance-now");
20
+ const url = require("url");
21
+ const buffer_utils_1 = require("./buffer-utils");
22
+ const header_utils_1 = require("./header-utils");
23
+ const shouldKeepAlive = (req) => req.httpVersion !== '1.0' &&
24
+ req.headers['connection'] !== 'close' &&
25
+ req.headers['proxy-connection'] !== 'close';
26
+ exports.shouldKeepAlive = shouldKeepAlive;
27
+ const writeHead = (response, status, statusMessage, headers) => {
28
+ const flatHeaders = headers === undefined
29
+ ? {}
30
+ : isHttp2(response) && Array.isArray(headers)
31
+ // H2 raw headers support is poor so we map to object here.
32
+ // We should revert to flat headers once the below is resolved in LTS:
33
+ // https://github.com/nodejs/node/issues/51402
34
+ ? (0, header_utils_1.rawHeadersToObject)(headers)
35
+ : isHttp2(response)
36
+ ? headers // H2 supports object headers just fine
37
+ : !Array.isArray(headers)
38
+ ? (0, header_utils_1.objectHeadersToFlat)(headers)
39
+ // RawHeaders for H1, must be flattened:
40
+ : (0, header_utils_1.flattenPairedRawHeaders)(headers);
41
+ // We aim to always pass flat headers to writeHead instead of calling setHeader because
42
+ // in most cases it's more flexible about supporting raw data, e.g. multiple headers with
43
+ // different casing can't be represented with setHeader at all (the latter overwrites).
44
+ if (statusMessage === undefined) {
45
+ // Cast is required as Node H2 types don't know about raw headers:
46
+ response.writeHead(status, flatHeaders);
47
+ }
48
+ else {
49
+ response.writeHead(status, statusMessage, flatHeaders);
50
+ }
51
+ };
52
+ exports.writeHead = writeHead;
53
+ function isHttp2(message) {
54
+ return ('httpVersion' in message && !!message.httpVersion?.startsWith('2')) || // H2 request
55
+ ('stream' in message && 'createPushResponse' in message); // H2 response
56
+ }
57
+ async function encodeBodyBuffer(buffer, headers) {
58
+ const contentEncoding = headers['content-encoding'];
59
+ // We skip encodeBuffer entirely if possible - this isn't strictly necessary, but it's useful
60
+ // so you can drop the http-encoding package in bundling downstream without issue in cases
61
+ // where you don't actually use any encodings.
62
+ if (!contentEncoding)
63
+ return buffer;
64
+ return await (await Promise.resolve().then(() => require('http-encoding'))).encodeBuffer(buffer, contentEncoding, { level: 1 });
65
+ }
66
+ async function decodeBodyBuffer(buffer, headers) {
67
+ const contentEncoding = headers['content-encoding'];
68
+ // We skip decodeBuffer entirely if possible - this isn't strictly necessary, but it's useful
69
+ // so you can drop the http-encoding package in bundling downstream without issue in cases
70
+ // where you don't actually use any encodings.
71
+ if (!contentEncoding)
72
+ return buffer;
73
+ return await (await Promise.resolve().then(() => require('http-encoding'))).decodeBuffer(buffer, contentEncoding);
74
+ }
75
+ // Parse an in-progress request or response stream, i.e. where the body or possibly even the headers have
76
+ // not been fully received/sent yet.
77
+ const parseBodyStream = (bodyStream, maxSize, getHeaders) => {
78
+ let bufferPromise = null;
79
+ let completedBuffer = null;
80
+ let body = {
81
+ // Returns a stream for the full body, not the live streaming body.
82
+ // Each call creates a new stream, which starts with the already seen
83
+ // and buffered data, and then continues with the live stream, if active.
84
+ // Listeners to this stream *must* be attached synchronously after this call.
85
+ asStream() {
86
+ // If we've already buffered the whole body, just stream it out:
87
+ if (completedBuffer)
88
+ return (0, buffer_utils_1.bufferToStream)(completedBuffer);
89
+ // Otherwise, we want to start buffering now, and wrap that with
90
+ // a stream that can live-stream the buffered data on demand:
91
+ const buffer = body.asBuffer();
92
+ buffer.catch(() => { }); // Errors will be handled via the stream, so silence unhandled rejections here.
93
+ return (0, buffer_utils_1.bufferThenStream)(buffer, bodyStream);
94
+ },
95
+ asBuffer() {
96
+ if (!bufferPromise) {
97
+ bufferPromise = (0, buffer_utils_1.streamToBuffer)(bodyStream, maxSize);
98
+ bufferPromise
99
+ .then((buffer) => completedBuffer = buffer)
100
+ .catch(() => { }); // If we get no body, completedBuffer stays null
101
+ }
102
+ return bufferPromise;
103
+ },
104
+ async asDecodedBuffer() {
105
+ const buffer = await body.asBuffer();
106
+ return decodeBodyBuffer(buffer, getHeaders());
107
+ },
108
+ asText(encoding = 'utf8') {
109
+ return body.asDecodedBuffer().then((b) => b.toString(encoding));
110
+ },
111
+ asJson() {
112
+ return body.asText().then((t) => JSON.parse(t));
113
+ },
114
+ asFormData() {
115
+ return body.asText().then((t) => querystring.parse(t));
116
+ },
117
+ };
118
+ return body;
119
+ };
120
+ async function runAsyncOrUndefined(func) {
121
+ try {
122
+ return await func();
123
+ }
124
+ catch {
125
+ return undefined;
126
+ }
127
+ }
128
+ const waitForBody = async (body, headers) => {
129
+ const bufferBody = await body.asBuffer();
130
+ return (0, exports.buildBodyReader)(bufferBody, headers);
131
+ };
132
+ const isMockttpBody = (body) => {
133
+ return body.hasOwnProperty('getDecodedBuffer');
134
+ };
135
+ exports.isMockttpBody = isMockttpBody;
136
+ const buildBodyReader = (body, headers) => {
137
+ const completedBody = {
138
+ buffer: body,
139
+ async getDecodedBuffer() {
140
+ return runAsyncOrUndefined(async () => (0, buffer_utils_1.asBuffer)(await decodeBodyBuffer(this.buffer, headers)));
141
+ },
142
+ async getText() {
143
+ return runAsyncOrUndefined(async () => (await this.getDecodedBuffer()).toString());
144
+ },
145
+ async getJson() {
146
+ return runAsyncOrUndefined(async () => JSON.parse((await completedBody.getText())));
147
+ },
148
+ async getUrlEncodedFormData() {
149
+ return runAsyncOrUndefined(async () => {
150
+ const contentType = headers["content-type"];
151
+ if (contentType?.includes("multipart/form-data"))
152
+ return; // Actively ignore multipart data - won't work as expected
153
+ const text = await completedBody.getText();
154
+ return text ? querystring.parse(text) : undefined;
155
+ });
156
+ },
157
+ async getMultipartFormData() {
158
+ return runAsyncOrUndefined(async () => {
159
+ const contentType = headers["content-type"];
160
+ if (!contentType?.includes("multipart/form-data"))
161
+ return;
162
+ const boundary = contentType.match(/;\s*boundary=(\S+)/);
163
+ // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type#boundary
164
+ // `boundary` is required for multipart entities.
165
+ if (!boundary)
166
+ return;
167
+ const multipartBodyBuffer = (0, buffer_utils_1.asBuffer)(await decodeBodyBuffer(this.buffer, headers));
168
+ return multipart.parse(multipartBodyBuffer, boundary[1]);
169
+ });
170
+ },
171
+ async getFormData() {
172
+ return runAsyncOrUndefined(async () => {
173
+ // Return multi-part data if present, or fallback to default URL-encoded
174
+ // parsing for all other cases. Data is returned in the same format regardless.
175
+ const multiPartBody = await completedBody.getMultipartFormData();
176
+ if (multiPartBody) {
177
+ const formData = {};
178
+ multiPartBody.forEach((part) => {
179
+ const name = part.name;
180
+ if (name === undefined) {
181
+ // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition#as_a_header_for_a_multipart_body,
182
+ // The header must include `name` property to identify the field name.
183
+ // So we ignore parts without a name, treating it as invalid multipart form data.
184
+ }
185
+ else {
186
+ // We do not use `filename` or `type` here, because return value of `getFormData` must be string or string array.
187
+ const prevValue = formData[name];
188
+ if (prevValue === undefined) {
189
+ formData[name] = part.data.toString();
190
+ }
191
+ else if (Array.isArray(prevValue)) {
192
+ prevValue.push(part.data.toString());
193
+ }
194
+ else {
195
+ formData[name] = [prevValue, part.data.toString()];
196
+ }
197
+ }
198
+ });
199
+ return formData;
200
+ }
201
+ else {
202
+ return completedBody.getUrlEncodedFormData();
203
+ }
204
+ });
205
+ }
206
+ };
207
+ return completedBody;
208
+ };
209
+ exports.buildBodyReader = buildBodyReader;
210
+ const parseRequestBody = (req, options) => {
211
+ let transformedRequest = req;
212
+ transformedRequest.body = parseBodyStream(req, options.maxSize, () => req.headers);
213
+ };
214
+ exports.parseRequestBody = parseRequestBody;
215
+ /**
216
+ * Build an initiated request: the external representation of a request
217
+ * that's just started.
218
+ */
219
+ function buildInitiatedRequest(request) {
220
+ return {
221
+ ..._.pick(request, 'id', 'matchedRuleId', 'protocol', 'httpVersion', 'method', 'url', 'path', 'remoteIpAddress', 'remotePort', 'hostname', 'headers', 'rawHeaders', 'tags'),
222
+ timingEvents: request.timingEvents
223
+ };
224
+ }
225
+ /**
226
+ * Build a completed request: the external representation of a request
227
+ * that's been completely received (but not necessarily replied to).
228
+ */
229
+ async function waitForCompletedRequest(request) {
230
+ const body = await waitForBody(request.body, request.headers);
231
+ const requestData = buildInitiatedRequest(request);
232
+ return {
233
+ ...requestData,
234
+ body,
235
+ rawTrailers: request.rawTrailers ?? [],
236
+ trailers: (0, header_utils_1.rawHeadersToObject)(request.rawTrailers ?? [])
237
+ };
238
+ }
239
+ /**
240
+ * Parse the accepted format of the headers argument for writeHead and addTrailers
241
+ * into a single consistent paired-tuple format.
242
+ */
243
+ const getHeaderPairsFromArgument = (headersArg) => {
244
+ // Two legal formats of header args (flat & object), one unofficial (tuple array)
245
+ if (Array.isArray(headersArg)) {
246
+ if (!Array.isArray(headersArg[0])) {
247
+ // Flat -> Raw tuples
248
+ return (0, header_utils_1.pairFlatRawHeaders)(headersArg);
249
+ }
250
+ else {
251
+ // Already raw tuples, cheeky
252
+ return headersArg;
253
+ }
254
+ }
255
+ else {
256
+ // Headers object -> raw tuples
257
+ return (0, header_utils_1.objectHeadersToRaw)(headersArg ?? {});
258
+ }
259
+ };
260
+ function trackResponse(response, timingEvents, tags, options) {
261
+ let trackedResponse = response;
262
+ trackedResponse.timingEvents = timingEvents;
263
+ trackedResponse.tags = tags;
264
+ // Headers are sent when .writeHead or .write() are first called
265
+ const trackingStream = new stream.PassThrough();
266
+ const originalWriteHeader = trackedResponse.writeHead;
267
+ const originalWrite = trackedResponse.write;
268
+ const originalEnd = trackedResponse.end;
269
+ const originalAddTrailers = trackedResponse.addTrailers;
270
+ const originalGetHeaders = trackedResponse.getHeaders;
271
+ let writtenHeaders;
272
+ trackedResponse.getRawHeaders = () => writtenHeaders ?? [];
273
+ trackedResponse.getHeaders = () => (0, header_utils_1.rawHeadersToObject)(trackedResponse.getRawHeaders());
274
+ trackedResponse.writeHead = function (...args) {
275
+ if (!timingEvents.headersSentTimestamp) {
276
+ timingEvents.headersSentTimestamp = now();
277
+ }
278
+ // HTTP/2 responses shouldn't have a status message:
279
+ if (isHttp2(trackedResponse) && typeof args[1] === 'string') {
280
+ args[1] = undefined;
281
+ }
282
+ let headersArg;
283
+ if (args[2]) {
284
+ headersArg = args[2];
285
+ }
286
+ else if (typeof args[1] !== 'string') {
287
+ headersArg = args[1];
288
+ }
289
+ writtenHeaders = getHeaderPairsFromArgument(headersArg);
290
+ if (isHttp2(trackedResponse)) {
291
+ writtenHeaders.unshift([':status', args[0].toString()]);
292
+ }
293
+ // Headers might also have been set with setHeader before. They'll be combined, with headers
294
+ // here taking precendence. We simulate this by pulling in all values from getHeaders() and
295
+ // remembering any of those that we're not about to override.
296
+ const storedHeaders = originalGetHeaders.apply(this);
297
+ const writtenHeaderKeys = writtenHeaders.map(([key]) => key.toLowerCase());
298
+ const storedHeaderKeys = Object.keys(storedHeaders);
299
+ if (storedHeaderKeys.length) {
300
+ storedHeaderKeys
301
+ .filter((key) => !writtenHeaderKeys.includes(key))
302
+ .reverse() // We're unshifting (these were set first) so we have to reverse to keep order.
303
+ .forEach((key) => {
304
+ const value = storedHeaders[key];
305
+ if (Array.isArray(value)) {
306
+ value.reverse().forEach(v => writtenHeaders?.unshift([key, v]));
307
+ }
308
+ else if (value !== undefined) {
309
+ writtenHeaders?.unshift([key, value]);
310
+ }
311
+ });
312
+ }
313
+ return originalWriteHeader.apply(this, args);
314
+ };
315
+ let writtenTrailers;
316
+ trackedResponse.getRawTrailers = () => writtenTrailers ?? [];
317
+ trackedResponse.addTrailers = function (...args) {
318
+ const trailersArg = args[0];
319
+ writtenTrailers = getHeaderPairsFromArgument(trailersArg);
320
+ return originalAddTrailers.apply(this, args);
321
+ };
322
+ const trackingWrite = function (...args) {
323
+ trackingStream.write.apply(trackingStream, args);
324
+ return originalWrite.apply(this, args);
325
+ };
326
+ trackedResponse.write = trackingWrite;
327
+ trackedResponse.end = function (...args) {
328
+ // We temporarily disable write tracking here, as .end
329
+ // can call this.write, but that write should not be
330
+ // tracked, or we'll get duplicate writes when trackingStream
331
+ // calls it on itself too.
332
+ trackedResponse.write = originalWrite;
333
+ trackingStream.end.apply(trackingStream, args);
334
+ let result = originalEnd.apply(this, args);
335
+ trackedResponse.write = trackingWrite;
336
+ return result;
337
+ };
338
+ trackedResponse.body = parseBodyStream(trackingStream, options.maxSize, () => trackedResponse.getHeaders());
339
+ // Proxy errors (e.g. write-after-end) to the response, so they can be
340
+ // handled elsewhere, rather than killing the process outright.
341
+ trackingStream.on('error', (e) => trackedResponse.emit('error', e));
342
+ return trackedResponse;
343
+ }
344
+ /**
345
+ * Build a completed response: the external representation of a response
346
+ * that's been completely written out and sent back to the client.
347
+ */
348
+ async function waitForCompletedResponse(response) {
349
+ // Ongoing response has 'getHeaders' - completed has 'headers'.
350
+ if ('headers' in response)
351
+ return response;
352
+ const body = await waitForBody(response.body, response.getHeaders());
353
+ response.timingEvents.responseSentTimestamp = response.timingEvents.responseSentTimestamp || now();
354
+ const completedResponse = _(response).pick([
355
+ 'id',
356
+ 'statusCode',
357
+ 'timingEvents',
358
+ 'tags'
359
+ ]).assign({
360
+ statusMessage: '',
361
+ headers: response.getHeaders(),
362
+ rawHeaders: response.getRawHeaders(),
363
+ body: body,
364
+ rawTrailers: response.getRawTrailers(),
365
+ trailers: (0, header_utils_1.rawHeadersToObject)(response.getRawTrailers())
366
+ }).valueOf();
367
+ if (!(response instanceof http2.Http2ServerResponse)) {
368
+ // H2 has no status messages, and generates a warning if you look for one
369
+ completedResponse.statusMessage = response.statusMessage;
370
+ }
371
+ return completedResponse;
372
+ }
373
+ // Take raw HTTP request bytes received, have a go at parsing something useful out of them.
374
+ // Very lax - this is a method to use when normal parsing has failed, not as standard
375
+ function tryToParseHttpRequest(input, socket) {
376
+ const req = {};
377
+ try {
378
+ req.protocol = socket.__lastHopEncrypted ? "https" : "http"; // Wild guess really
379
+ // For TLS sockets, we default the hostname to the name given by SNI. Might be overridden
380
+ // by the URL or Host header later, if available.
381
+ if (socket instanceof tls_1.TLSSocket)
382
+ req.hostname = socket.servername;
383
+ const lines = (0, buffer_utils_1.splitBuffer)(input, '\r\n');
384
+ const requestLine = lines[0].slice(0, lines[0].length).toString('ascii');
385
+ const [method, rawUri, httpProtocol] = requestLine.split(" ");
386
+ if (method)
387
+ req.method = method.slice(0, 15); // With overflows this could be *anything*. Limit it slightly.
388
+ // An empty line delineates the headers from the body
389
+ const emptyLineIndex = _.findIndex(lines, (line) => line.length === 0);
390
+ try {
391
+ const headerLines = lines.slice(1, emptyLineIndex === -1 ? undefined : emptyLineIndex);
392
+ const rawHeaders = headerLines
393
+ .map((line) => (0, buffer_utils_1.splitBuffer)(line, ':', 2))
394
+ .filter((line) => line.length > 1)
395
+ .map((headerParts) => headerParts.map(p => p.toString('utf8').trim()));
396
+ req.rawHeaders = rawHeaders;
397
+ req.headers = (0, header_utils_1.rawHeadersToObject)(rawHeaders);
398
+ }
399
+ catch (e) { }
400
+ try {
401
+ const parsedUrl = url.parse(rawUri);
402
+ req.path = parsedUrl.path ?? undefined;
403
+ const hostHeader = _.find(req.headers, (_value, key) => key.toLowerCase() === 'host');
404
+ if (hostHeader) {
405
+ req.hostname = Array.isArray(hostHeader) ? hostHeader[0] : hostHeader;
406
+ }
407
+ else if (parsedUrl.hostname) {
408
+ req.hostname = parsedUrl.hostname;
409
+ }
410
+ if (rawUri.includes('://') || !req.hostname) {
411
+ // URI is absolute, or we have no way to guess the host at all
412
+ req.url = rawUri;
413
+ }
414
+ else {
415
+ // URI is relative (or invalid) and we have a host: use it
416
+ req.url = `${req.protocol}://${req.hostname}${rawUri.startsWith('/') ? '' : '/' // Add a slash if the URI is garbage
417
+ }${rawUri}`;
418
+ }
419
+ }
420
+ catch (e) { }
421
+ try {
422
+ const httpVersion = httpProtocol.split('/')[1];
423
+ req.httpVersion = httpVersion;
424
+ }
425
+ catch (e) { }
426
+ }
427
+ catch (e) { }
428
+ return req;
429
+ }
430
+ // Take raw HTTP response bytes received, parse something useful out of them. This is *not*
431
+ // very lax, and will throw errors due to unexpected response data, but it's used when we
432
+ // ourselves generate the data (for websocket responses that 'ws' writes directly to the
433
+ // socket invisibly). Fortunately all responses are very simple:
434
+ function parseRawHttpResponse(input, request) {
435
+ const { id, tags, timingEvents } = request;
436
+ const lines = (0, buffer_utils_1.splitBuffer)(input, '\r\n');
437
+ const responseLine = lines[0].subarray(0, lines[0].length).toString('ascii');
438
+ const [_httpVersion, rawStatusCode, ...restResponseLine] = responseLine.split(" ");
439
+ const statusCode = parseInt(rawStatusCode, 10);
440
+ const statusMessage = restResponseLine.join(' ');
441
+ // An empty line delineates the headers from the body
442
+ const emptyLineIndex = _.findIndex(lines, (line) => line.length === 0);
443
+ const headerLines = lines.slice(1, emptyLineIndex === -1 ? undefined : emptyLineIndex);
444
+ const rawHeaders = headerLines
445
+ .map((line) => (0, buffer_utils_1.splitBuffer)(line, ':', 2))
446
+ .map((headerParts) => headerParts.map(p => p.toString('utf8').trim()));
447
+ const headers = (0, header_utils_1.rawHeadersToObject)(rawHeaders);
448
+ const body = (0, exports.buildBodyReader)(Buffer.from([]), {});
449
+ return {
450
+ id,
451
+ tags,
452
+ timingEvents,
453
+ statusCode,
454
+ statusMessage,
455
+ rawHeaders,
456
+ headers,
457
+ body,
458
+ rawTrailers: [],
459
+ trailers: {}
460
+ };
461
+ }
462
+ //# sourceMappingURL=request-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-utils.js","sourceRoot":"","sources":["../../src/util/request-utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function shouldPassThrough(hostname: string | undefined, passThroughPatterns: URLPattern[], interceptOnlyPatterns: URLPattern[] | undefined): boolean;
2
+ //# sourceMappingURL=server-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-utils.d.ts","sourceRoot":"","sources":["../../src/util/server-utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,GAAG,SAAS,EAE5B,mBAAmB,EAAE,UAAU,EAAE,EACjC,qBAAqB,EAAE,UAAU,EAAE,GAAG,SAAS,GAC9C,OAAO,CAYT"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.shouldPassThrough = shouldPassThrough;
4
+ function shouldPassThrough(hostname,
5
+ // Only one of these two should have values (validated above):
6
+ passThroughPatterns, interceptOnlyPatterns) {
7
+ if (!hostname)
8
+ return false;
9
+ if (interceptOnlyPatterns) {
10
+ return !interceptOnlyPatterns.some((pattern) => pattern.test(`https://${hostname}`));
11
+ }
12
+ return passThroughPatterns.some((pattern) => pattern.test(`https://${hostname}`));
13
+ }
14
+ //# sourceMappingURL=server-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-utils.js","sourceRoot":"","sources":["../../src/util/server-utils.ts"],"names":[],"mappings":";;AAAA,8CAiBC;AAjBD,SAAgB,iBAAiB,CAC/B,QAA4B;AAC5B,8DAA8D;AAC9D,mBAAiC,EACjC,qBAA+C;IAE/C,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IAE5B,IAAI,qBAAqB,EAAE,CAAC;QAC1B,OAAO,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAC7C,OAAO,CAAC,IAAI,CAAC,WAAW,QAAQ,EAAE,CAAC,CACpC,CAAC;IACJ,CAAC;IAED,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAC1C,OAAO,CAAC,IAAI,CAAC,WAAW,QAAQ,EAAE,CAAC,CACpC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,28 @@
1
+ import * as net from 'net';
2
+ import * as tls from 'tls';
3
+ import * as http2 from 'http2';
4
+ import { OngoingRequest, TlsConnectionEvent } from '../types';
5
+ export declare function isLocalPortActive(interfaceIp: '::1' | '127.0.0.1', port: number): Promise<unknown>;
6
+ export declare const isLocalIPv6Available: boolean;
7
+ export declare const isLocalhostAddress: (host: string | null | undefined) => boolean | RegExpMatchArray | null;
8
+ export declare const isSocketLoop: (outgoingSockets: net.Socket[] | Set<net.Socket>, incomingSocket: net.Socket) => boolean;
9
+ export declare function getParentSocket(socket: net.Socket): any;
10
+ export declare const requireSocketResetSupport: () => void;
11
+ /**
12
+ * Reset the socket where possible, or at least destroy it where that's not possible.
13
+ *
14
+ * This has a few cases for different layers of socket & tunneling, designed to
15
+ * simulate a real connection reset as closely as possible. That means, in general,
16
+ * we unwrap the connection as far as possible whilst still only affecting a single
17
+ * request.
18
+ *
19
+ * In practice, we unwrap HTTP/1 & TLS back as far as we can, until we hit either an
20
+ * HTTP/2 stream or a raw TCP connection. We then either send a RST_FRAME or a TCP RST
21
+ * to kill that connection.
22
+ */
23
+ export declare function resetOrDestroy(requestOrSocket: net.Socket | OngoingRequest & {
24
+ socket?: net.Socket;
25
+ } | http2.Http2ServerRequest): void;
26
+ export declare function buildSocketEventData(socket: net.Socket & Partial<tls.TLSSocket>): TlsConnectionEvent;
27
+ export declare function buildSocketTimingInfo(): Required<net.Socket>['__timingInfo'];
28
+ //# sourceMappingURL=socket-util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"socket-util.d.ts","sourceRoot":"","sources":["../../src/util/socket-util.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,GAAG,MAAM,KAAK,CAAC;AAC3B,OAAO,KAAK,GAAG,MAAM,KAAK,CAAC;AAC3B,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAG9D,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,KAAK,GAAG,WAAW,EAAE,IAAI,EAAE,MAAM,oBAkBrF;AAID,eAAO,MAAM,oBAAoB,SAIvB,CAAC;AASX,eAAO,MAAM,kBAAkB,SAAU,MAAM,GAAG,IAAI,GAAG,SAAS,sCAM7D,CAAC;AAIN,eAAO,MAAM,YAAY,oBAAqB,GAAG,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,kBAAkB,GAAG,CAAC,MAAM,YAiBlG,CAAC;AAEP,wBAAgB,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,OAIjD;AAKD,eAAO,MAAM,yBAAyB,YAMrC,CAAC;AAMF;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,eAAe,EACxC,GAAG,CAAC,MAAM,GACV,cAAc,GAAG;IAAE,MAAM,CAAC,EAAE,GAAG,CAAC,MAAM,CAAA;CAAE,GACxC,KAAK,CAAC,kBAAkB,QA+C7B;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,kBAAkB,CA4BpG;AAED,wBAAgB,qBAAqB,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,CAE5E"}