Skip to content

Commit 7e666ee

Browse files
committed
feat: add plugin tester
1 parent eb9e43b commit 7e666ee

File tree

7 files changed

+85
-51
lines changed

7 files changed

+85
-51
lines changed

packages/network-debugger/src/fork/devtool.ts renamed to packages/network-debugger/src/fork/devtool/index.ts

Lines changed: 12 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import { Server, WebSocket } from 'ws'
22
import open, { apps } from 'open'
33
import { type ChildProcess } from 'child_process'
4-
import { IS_DEV_MODE, RequestDetail } from '../common'
5-
import { REMOTE_DEBUGGER_PORT } from '../common'
6-
import { RequestHeaderPipe } from './pipe'
7-
import { log } from '../utils'
4+
import { IS_DEV_MODE } from '../../common'
5+
import { REMOTE_DEBUGGER_PORT } from '../../common'
6+
import { log } from '../../utils'
7+
import { BaseDevtoolServer, DevtoolMessage } from './type'
88

99
export interface DevtoolServerInitOptions {
1010
port: number
@@ -13,36 +13,21 @@ export interface DevtoolServerInitOptions {
1313
onClose?: () => void
1414
}
1515

16-
const frameId = '517.528'
17-
const loaderId = '517.529'
18-
19-
export const toMimeType = (contentType: string) => {
20-
return contentType.split(';')[0] || 'text/plain'
21-
}
22-
23-
export interface DevtoolMessageRequest {
24-
method: string
25-
params: Record<string, any>
16+
export interface IDevtoolServer {
17+
send(message: DevtoolMessage): Promise<any>
18+
close(): void
19+
open(): Promise<void>
2620
}
21+
export * from './type'
2722

28-
export interface DevtoolMessageResponse {
29-
id: string
30-
result: any
31-
method?: string
32-
}
33-
34-
export type DevtoolMessage = DevtoolMessageRequest | DevtoolMessageResponse
35-
36-
export class DevtoolServer {
23+
export class DevtoolServer extends BaseDevtoolServer implements IDevtoolServer {
3724
private server: Server
3825
private port: number
3926
private browser: ChildProcess | null = null
4027
private socket: Promise<[WebSocket]>
41-
public timestamp = 0
42-
private startTime = Date.now()
4328

44-
private listeners: ((error: unknown | null, message?: any) => void)[] = []
4529
constructor(props: DevtoolServerInitOptions) {
30+
super()
4631
const { port, autoOpenDevtool = true, onConnect, onClose } = props
4732
this.port = port
4833
this.server = new Server({ port })
@@ -76,15 +61,6 @@ export class DevtoolServer {
7661
})
7762
}
7863

79-
public getTimestamp() {
80-
this.updateTimestamp()
81-
return this.timestamp
82-
}
83-
84-
public updateTimestamp() {
85-
this.timestamp = (Date.now() - this.startTime) / 1000
86-
}
87-
8864
public async open() {
8965
const url = `devtools://devtools/bundled/inspector.html?ws=localhost:${this.port}`
9066
try {
@@ -144,7 +120,7 @@ export class DevtoolServer {
144120

145121
log('opened in chrome or click here to open chrome devtool: ', url)
146122
this.browser = pro
147-
return pro
123+
return
148124
} catch (error) {
149125
console.warn(
150126
"Open devtools failed, but don't worry, you can open it in browser(Chrome or Edge) manually: " +
@@ -162,8 +138,4 @@ export class DevtoolServer {
162138
const [socket] = await this.socket
163139
return socket.send(JSON.stringify(message))
164140
}
165-
166-
public on(listener: (error: unknown | null, message?: any) => void) {
167-
this.listeners.push(listener)
168-
}
169141
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
export interface DevtoolMessageRequest {
2+
method: string
3+
params: Record<string, any>
4+
}
5+
6+
export interface DevtoolMessageResponse {
7+
id: string
8+
result: any
9+
method?: string
10+
}
11+
12+
export type DevtoolMessage = DevtoolMessageRequest | DevtoolMessageResponse
13+
14+
export class BaseDevtoolServer {
15+
public timestamp = 0
16+
private startTime = Date.now()
17+
public getTimestamp() {
18+
this.updateTimestamp()
19+
return this.timestamp
20+
}
21+
public listeners: ((error: unknown | null, message?: any) => void)[] = []
22+
public updateTimestamp() {
23+
this.timestamp = (Date.now() - this.startTime) / 1000
24+
}
25+
public on(listener: (error: unknown | null, message?: any) => void) {
26+
this.listeners.push(listener)
27+
}
28+
}

packages/network-debugger/src/fork/module/debugger/index.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { createPlugin, useConnect, useHandler } from '../common'
2+
import { NetworkPluginCore } from '../network'
23
export interface ISciprtParsed {
34
url: string
45
scriptLanguage: string
@@ -12,12 +13,14 @@ export interface ScriptSourceData {
1213
}
1314

1415
export const debuggerPlugin = createPlugin('debugger', ({ devtool, core }) => {
16+
const networkPlugin = core.usePlugin<NetworkPluginCore>('network')
17+
1518
useHandler<ScriptSourceData>('Debugger.getScriptSource', ({ id, data }) => {
1619
if (!id) {
1720
return
1821
}
1922
const { scriptId } = data
20-
const scriptSource = core.resourceService.getScriptSource(scriptId)
23+
const scriptSource = networkPlugin.resourceService.getScriptSource(scriptId)
2124
devtool.send({
2225
id: id,
2326
method: 'Debugger.getScriptSourceResponse',
@@ -27,7 +30,7 @@ export const debuggerPlugin = createPlugin('debugger', ({ devtool, core }) => {
2730
})
2831
})
2932

30-
const scriptList = core.resourceService.getLocalScriptList()
33+
const scriptList = networkPlugin.resourceService.getLocalScriptList()
3134
useConnect(() => {
3235
scriptList.forEach((script) => {
3336
devtool.send({

packages/network-debugger/src/fork/module/network/index.ts

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,20 @@ import { RequestDetail } from '../../../common'
33
import { BodyTransformer, RequestHeaderPipe } from '../../pipe'
44
import { createPlugin, useHandler } from '../common'
55
import zlib from 'node:zlib'
6-
import { toMimeType } from '../../devtool'
6+
import { ResourceService } from '../../resource-service'
77

88
const frameId = '517.528'
99
const loaderId = '517.529'
1010

11+
export const toMimeType = (contentType: string) => {
12+
return contentType.split(';')[0] || 'text/plain'
13+
}
14+
1115
export const networkPlugin = createPlugin('network', ({ devtool, core }) => {
1216
const requests: Record<string, RequestDetail> = {}
1317

18+
const resourceService = new ResourceService()
19+
1420
const getRequest = (id: string) => requests[id]
1521
const updateRequest = (request: RequestDetail) => {
1622
requests[request.id] = request
@@ -129,8 +135,8 @@ export const networkPlugin = createPlugin('network', ({ devtool, core }) => {
129135
request.initiator.stack.callFrames.forEach((frame) => {
130136
const fileUrl = pathToFileURL(frame.url)
131137
const scriptId =
132-
core.resourceService.getScriptIdByUrl(fileUrl.href) ??
133-
core.resourceService.getScriptIdByUrl(frame.url)
138+
resourceService.getScriptIdByUrl(fileUrl.href) ??
139+
resourceService.getScriptIdByUrl(frame.url)
134140
if (scriptId) {
135141
frame.scriptId = scriptId
136142
}
@@ -148,8 +154,8 @@ export const networkPlugin = createPlugin('network', ({ devtool, core }) => {
148154
request.initiator.stack.callFrames.forEach((frame) => {
149155
const fileUrl = pathToFileURL(frame.url)
150156
const scriptId =
151-
core.resourceService.getScriptIdByUrl(fileUrl.href) ??
152-
core.resourceService.getScriptIdByUrl(frame.url)
157+
resourceService.getScriptIdByUrl(fileUrl.href) ??
158+
resourceService.getScriptIdByUrl(frame.url)
153159
if (scriptId) {
154160
frame.scriptId = scriptId
155161
}
@@ -216,7 +222,8 @@ export const networkPlugin = createPlugin('network', ({ devtool, core }) => {
216222
})
217223

218224
return {
219-
getRequest
225+
getRequest,
226+
resourceService
220227
}
221228
})
222229

packages/network-debugger/src/fork/request-center.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import { DevtoolServer } from './devtool'
22
import { PORT, READY_MESSAGE, RequestDetail } from '../common'
33
import { Server } from 'ws'
44
import { log } from '../utils'
5-
import { ResourceService } from './resource-service'
65
import { PluginInstance } from './module/common'
76

87
export interface RequestCenterInitOptions {
@@ -22,7 +21,6 @@ export interface DevtoolMessageListener<T = any> {
2221
}
2322

2423
export class RequestCenter {
25-
public resourceService: ResourceService
2624
private devtool: DevtoolServer
2725
private server: Server
2826
private listeners: Record<string, Set<DevtoolMessageListener> | undefined> = {}
@@ -43,7 +41,6 @@ export class RequestCenter {
4341
)
4442
}
4543
})
46-
this.resourceService = new ResourceService()
4744
this.devtool.on((error, message) => {
4845
if (error) {
4946
log(error)
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { DevtoolMessage } from '../devtool'
2+
import { BaseDevtoolServer, IDevtoolServer, DevtoolServerInitOptions } from '../devtool/index'
3+
4+
/**
5+
* 模拟 Devtool server,作为 core 上下文用于测试
6+
*/
7+
export class DevToolTester extends BaseDevtoolServer implements IDevtoolServer {
8+
private port: number
9+
constructor(props: DevtoolServerInitOptions) {
10+
super()
11+
const { port, autoOpenDevtool = true } = props
12+
13+
this.port = port
14+
autoOpenDevtool && this.open()
15+
}
16+
async send(message: DevtoolMessage) {
17+
return message
18+
}
19+
async open() {}
20+
close() {}
21+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
export class PluginTester {
2+
public plugins: any[] = []
3+
public loadPlugins(plugins: any[]) {
4+
this.plugins = plugins
5+
}
6+
}

0 commit comments

Comments
 (0)