@jonathanleelx/meddle 0.0.1 → 0.1.1

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.
@@ -0,0 +1,40 @@
1
+ /**
2
+ * meddle version - Print version information
3
+ */
4
+
5
+ const os = require('os')
6
+ const path = require('path')
7
+ const output = require('../lib/output')
8
+
9
+ const args = process.argv.slice(2)
10
+ const jsonFlag = args.includes('--json')
11
+ output.setJsonMode(jsonFlag)
12
+
13
+ function getVersionInfo() {
14
+ const pkg = require(path.join(__dirname, '../../package.json'))
15
+ return {
16
+ name: pkg.name,
17
+ version: pkg.version,
18
+ node: process.version,
19
+ platform: `${os.platform()} ${os.arch()}`,
20
+ homepage: pkg.homepage,
21
+ }
22
+ }
23
+
24
+ function run() {
25
+ const info = getVersionInfo()
26
+
27
+ if (output.isJsonMode()) {
28
+ output.jsonRaw(info)
29
+ return
30
+ }
31
+
32
+ output.header('Meddle Version')
33
+ output.kv('Package', info.name)
34
+ output.kv('Version', info.version)
35
+ output.kv('Node.js', info.node)
36
+ output.kv('Platform', info.platform)
37
+ output.kv('Homepage', info.homepage)
38
+ }
39
+
40
+ run()
@@ -31,6 +31,7 @@ const commands = {
31
31
  'supervise': './commands/supervise.js',
32
32
  'url': './commands/url.js',
33
33
  'status': './commands/status.js',
34
+ 'version': './commands/version.js',
34
35
  'session': './commands/session/index.js',
35
36
  'mock': './commands/mock/index.js',
36
37
  'route': './commands/route/index.js'
@@ -68,6 +69,7 @@ Meddle - 开发代理工具
68
69
  meddle doctor 检查配置文件健康状况
69
70
  meddle url 获取代理 URL
70
71
  meddle status 查看代理状态
72
+ meddle version 查看版本信息
71
73
 
72
74
  Session 命令 (多实例隔离,预览功能):
73
75
  meddle session create [--name <label>] [--port <port>]
package/dist/cert.d.ts CHANGED
@@ -4,6 +4,7 @@ interface CAStatus {
4
4
  trusted?: boolean;
5
5
  }
6
6
  export declare function getCAStatus(): Promise<CAStatus>;
7
+ export declare function checkCATrusted(): boolean;
7
8
  export declare function ensureRootCA(): Promise<void>;
8
9
  export declare function getRootCAPath(): string;
9
10
  export { crtMgr };
@@ -1 +1 @@
1
- {"version":3,"file":"cert.d.ts","sourceRoot":"","sources":["../cert.ts"],"names":[],"mappings":"AAsBA,QAAA,MAAM,MAAM,KAA8B,CAAC;AA+B3C,UAAU,QAAQ;IACd,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAGD,wBAAsB,WAAW,IAAI,OAAO,CAAC,QAAQ,CAAC,CAcrD;AAkED,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAgBlD;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,OAAO,EAAE,MAAM,EAAE,CAAC"}
1
+ {"version":3,"file":"cert.d.ts","sourceRoot":"","sources":["../cert.ts"],"names":[],"mappings":"AAsBA,QAAA,MAAM,MAAM,KAA8B,CAAC;AA+B3C,UAAU,QAAQ;IACd,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAGD,wBAAsB,WAAW,IAAI,OAAO,CAAC,QAAQ,CAAC,CAYrD;AA6FD,wBAAgB,cAAc,IAAI,OAAO,CA8BxC;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAWlD;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,OAAO,EAAE,MAAM,EAAE,CAAC"}
package/dist/cert.js CHANGED
@@ -35,6 +35,7 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.crtMgr = void 0;
37
37
  exports.getCAStatus = getCAStatus;
38
+ exports.checkCATrusted = checkCATrusted;
38
39
  exports.ensureRootCA = ensureRootCA;
39
40
  exports.getRootCAPath = getRootCAPath;
40
41
  const EasyCert = require('node-easy-cert');
@@ -92,9 +93,7 @@ async function getCAStatus() {
92
93
  }
93
94
  else {
94
95
  result.exist = true;
95
- if (!/^win/.test(process.platform)) {
96
- result.trusted = easyCert.ifRootCATrusted;
97
- }
96
+ result.trusted = checkCATrusted();
98
97
  return result;
99
98
  }
100
99
  }
@@ -145,20 +144,86 @@ async function trustRootCA() {
145
144
  console.log('证书路径:', rootCAPath, '- 请稍后手动添加信任以支持 HTTPS 代理。');
146
145
  return;
147
146
  }
148
- if (platform === 'darwin' && answer.trustCA === 'auto') {
149
- try {
150
- (0, child_process_1.execSync)(`sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain "${rootCAPath}"`, {
151
- stdio: 'inherit'
152
- });
153
- console.log('根证书已成功添加到系统信任。');
147
+ if (answer.trustCA === 'auto') {
148
+ if (platform === 'darwin') {
149
+ try {
150
+ (0, child_process_1.execSync)(`sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain "${rootCAPath}"`, {
151
+ stdio: 'inherit'
152
+ });
153
+ console.log('根证书已成功添加到系统信任。');
154
+ }
155
+ catch (err) {
156
+ console.error('自动添加失败,正在打开证书文件供手动添加...');
157
+ openCertForUser(rootCAPath);
158
+ }
154
159
  }
155
- catch (err) {
156
- console.error('自动添加失败,正在打开证书文件供手动添加...');
160
+ else if (platform === 'win32') {
157
161
  openCertForUser(rootCAPath);
158
162
  }
163
+ else if (platform === 'linux') {
164
+ const certName = 'meddle-root-ca.crt';
165
+ const isDebian = (0, fs_1.existsSync)('/usr/local/share/ca-certificates');
166
+ const isRhel = (0, fs_1.existsSync)('/etc/pki/ca-trust/source/anchors');
167
+ try {
168
+ if (isDebian) {
169
+ const dest = `/usr/local/share/ca-certificates/${certName}`;
170
+ (0, child_process_1.execSync)(`sudo cp "${rootCAPath}" "${dest}" && sudo update-ca-certificates`, {
171
+ stdio: 'inherit'
172
+ });
173
+ console.log('根证书已成功添加到系统信任。');
174
+ }
175
+ else if (isRhel) {
176
+ const dest = `/etc/pki/ca-trust/source/anchors/${certName}`;
177
+ (0, child_process_1.execSync)(`sudo cp "${rootCAPath}" "${dest}" && sudo update-ca-trust`, {
178
+ stdio: 'inherit'
179
+ });
180
+ console.log('根证书已成功添加到系统信任。');
181
+ }
182
+ else {
183
+ console.log('未识别的 Linux 发行版,请手动安装证书。');
184
+ openCertForUser(rootCAPath);
185
+ }
186
+ }
187
+ catch (err) {
188
+ console.error('自动添加失败,正在打开证书文件供手动添加...');
189
+ openCertForUser(rootCAPath);
190
+ }
191
+ }
159
192
  }
160
- else if (platform === 'win32' && answer.trustCA === 'auto') {
161
- openCertForUser(rootCAPath);
193
+ }
194
+ function checkCATrusted() {
195
+ const rootCAPath = crtMgr.getRootCAFilePath();
196
+ if (!rootCAPath)
197
+ return false;
198
+ const platform = os.platform();
199
+ try {
200
+ if (platform === 'darwin') {
201
+ (0, child_process_1.execSync)(`security find-certificate -c "meddle" /Library/Keychains/System.keychain`, {
202
+ stdio: 'pipe'
203
+ });
204
+ return true;
205
+ }
206
+ else if (platform === 'linux') {
207
+ const caBundles = [
208
+ '/etc/ssl/certs/ca-certificates.crt',
209
+ '/etc/pki/tls/certs/ca-bundle.crt',
210
+ ];
211
+ for (const bundle of caBundles) {
212
+ if ((0, fs_1.existsSync)(bundle)) {
213
+ (0, child_process_1.execSync)(`openssl verify -CAfile "${bundle}" "${rootCAPath}"`, {
214
+ stdio: 'pipe'
215
+ });
216
+ return true;
217
+ }
218
+ }
219
+ return false;
220
+ }
221
+ else {
222
+ return false;
223
+ }
224
+ }
225
+ catch {
226
+ return false;
162
227
  }
163
228
  }
164
229
  async function ensureRootCA() {
@@ -166,14 +231,7 @@ async function ensureRootCA() {
166
231
  const { keyPath, crtPath } = await doGenerate(false);
167
232
  console.log('根证书已生成:', keyPath, crtPath);
168
233
  }
169
- const isTrusted = await new Promise((resolve) => {
170
- crtMgr.ifRootCATrusted((err, trusted) => {
171
- if (err)
172
- resolve(false);
173
- else
174
- resolve(trusted);
175
- });
176
- });
234
+ const isTrusted = checkCATrusted();
177
235
  if (!isTrusted && !process.env.MEDDLE_HEADLESS && !process.env.MEDDLE_MCP) {
178
236
  await trustRootCA();
179
237
  }
package/dist/cert.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cert.js","sourceRoot":"","sources":["../cert.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cert.js","sourceRoot":"","sources":["../cert.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function isStreamingResponse(headers?: Record<string, unknown>): boolean;
2
+ //# sourceMappingURL=streaming-response.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming-response.d.ts","sourceRoot":"","sources":["../../core/streaming-response.ts"],"names":[],"mappings":"AAQA,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAMlF"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isStreamingResponse = isStreamingResponse;
4
+ const STREAMING_CONTENT_TYPES = [
5
+ 'text/event-stream',
6
+ 'application/x-ndjson',
7
+ 'application/ndjson',
8
+ 'application/json-seq',
9
+ 'application/stream+json',
10
+ ];
11
+ function isStreamingResponse(headers = {}) {
12
+ const contentType = Object.entries(headers).find(([key]) => key.toLowerCase() === 'content-type')?.[1];
13
+ if (typeof contentType !== 'string')
14
+ return false;
15
+ const mediaType = contentType.split(';', 1)[0].trim().toLowerCase();
16
+ return STREAMING_CONTENT_TYPES.includes(mediaType);
17
+ }
18
+ //# sourceMappingURL=streaming-response.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming-response.js","sourceRoot":"","sources":["../../core/streaming-response.ts"],"names":[],"mappings":";;AAQA,kDAMC;AAdD,MAAM,uBAAuB,GAAG;IAC5B,mBAAmB;IACnB,sBAAsB;IACtB,oBAAoB;IACpB,sBAAsB;IACtB,yBAAyB;CAC5B,CAAA;AAED,SAAgB,mBAAmB,CAAC,UAAmC,EAAE;IACrE,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IACtG,IAAI,OAAO,WAAW,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IAEjD,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IACnE,OAAO,uBAAuB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;AACtD,CAAC"}
package/index.js CHANGED
@@ -106,6 +106,7 @@ const { createMockHandler } = require('./dist/core/mock-handler')
106
106
  const { handleMapLocalRequest } = require('./dist/core/map-local')
107
107
  const { createRouteLoader } = require('./dist/core/route-loader')
108
108
  const { createPluginIntercept } = require('./dist/core/plugin-intercept')
109
+ const { isStreamingResponse } = require('./dist/core/streaming-response')
109
110
  const { createPluginBootstrapRunner } = require('./dist/core/plugin-bootstrap-runner')
110
111
  const { openBrowserWithProxy } = require('./dist/core/browser')
111
112
  const { handleLocalRequest } = require('./dist/core/static-server')
@@ -382,10 +383,11 @@ const proxyServer = http.createServer(async (req, res) => {
382
383
  const url = new URL(target.startsWith('http') ? target : req.url, 'http://' + req.headers.host)
383
384
  const routeChanged = source !== url.href
384
385
  const startTime = Date.now()
385
- const intercepting = pluginIntercept.shouldInterceptResponse()
386
-
387
386
  const proxyReq = http.request(url, { method: req.method, headers: stripProxyHeaders(req.headers) }, (proxyRes) => {
388
387
  const resChunks = []
388
+ const pluginResponseInterception = pluginIntercept.shouldInterceptResponse()
389
+ const streamingResponse = isStreamingResponse(proxyRes.headers)
390
+ const intercepting = pluginResponseInterception && !streamingResponse
389
391
  let proxyResponseSettled = false
390
392
  const handleProxyResponseError = (err) => {
391
393
  if (proxyResponseSettled) return
@@ -426,7 +428,7 @@ const proxyServer = http.createServer(async (req, res) => {
426
428
  duration: Date.now() - startTime,
427
429
  ...clientIdentity,
428
430
  }
429
- if (!intercepting) pluginIntercept.emitLegacyResponseToPlugins(logData)
431
+ if (!pluginResponseInterception) pluginIntercept.emitLegacyResponseToPlugins(logData)
430
432
  const responseEncoding = proxyRes.headers && proxyRes.headers['content-encoding']
431
433
  // 获取 inspection 信息
432
434
  const inspectionStages = routeDecision.meta?._inspectionStages || []
@@ -624,10 +626,12 @@ proxyServer.on('connect', async (req, socket, head) => {
624
626
 
625
627
  const routeChanged = source !== target
626
628
  const startTime = Date.now()
627
- const intercepting = pluginIntercept.shouldInterceptResponse()
628
629
  try {
629
630
  const proxyRes = await makeProxyRequest(target, req.method, stripProxyHeaders(req.headers), reqBody)
630
631
  const resChunks = []
632
+ const pluginResponseInterception = pluginIntercept.shouldInterceptResponse()
633
+ const streamingResponse = isStreamingResponse(proxyRes.headers)
634
+ const intercepting = pluginResponseInterception && !streamingResponse
631
635
  let proxyResponseSettled = false
632
636
  const handleProxyResponseError = (err) => {
633
637
  if (proxyResponseSettled) return
@@ -669,7 +673,7 @@ proxyServer.on('connect', async (req, socket, head) => {
669
673
  statusCode: proxyRes.statusCode, duration: Date.now() - startTime,
670
674
  ...requestClientIdentity,
671
675
  }
672
- if (!intercepting) pluginIntercept.emitLegacyResponseToPlugins(logData)
676
+ if (!pluginResponseInterception) pluginIntercept.emitLegacyResponseToPlugins(logData)
673
677
  const responseEncoding = proxyRes.headers && proxyRes.headers['content-encoding']
674
678
  // 获取 inspection 信息
675
679
  const inspectionStages = routeDecision.meta?._inspectionStages || []
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jonathanleelx/meddle",
3
- "version": "0.0.1",
3
+ "version": "0.1.1",
4
4
  "description": "A simple development proxy server with custom routing rules, mock responses, HTTPS interception, and a plugin system",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -30,7 +30,7 @@
30
30
  "setup:web": "cd web && pnpm install"
31
31
  },
32
32
  "bin": {
33
- "meddle": "bin/index"
33
+ "meddle": "bin/index.js"
34
34
  },
35
35
  "files": [
36
36
  "bin/",