Skip to content
This repository was archived by the owner on Feb 21, 2024. It is now read-only.

Commit d3a9aaf

Browse files
committed
init
1 parent 1635320 commit d3a9aaf

File tree

7 files changed

+152
-0
lines changed

7 files changed

+152
-0
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
node_modules

.prettierrc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"tabWidth": 2,
3+
"semi": false,
4+
"singleQuote": true
5+
}

package.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"devDependencies": {
3+
"@types/chrome": "^0.0.241"
4+
}
5+
}

pnpm-lock.yaml

Lines changed: 33 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/content-script.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
let es
2+
3+
chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) {
4+
switch (request.type) {
5+
case 'close':
6+
es.close()
7+
break
8+
case 'create':
9+
es = new EventSource(request.url)
10+
break
11+
default:
12+
break
13+
}
14+
})

src/manifest.json

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
{
2+
"manifest_version": 3,
3+
"name": "SSE Viewer",
4+
"description": "",
5+
"version": "0.1.0",
6+
"permissions": ["debugger", "tabs"],
7+
"background": {
8+
"service_worker": "service-worker.js"
9+
},
10+
"action": {},
11+
"content_scripts": [
12+
{
13+
"matches": ["<all_urls>"],
14+
"js": ["content-script.js"]
15+
}
16+
]
17+
}

src/service-worker.js

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
function sendCommand(target, method, params) {
2+
return new Promise((resolve, reject) => {
3+
chrome.debugger.sendCommand(target, method, params, function (result) {
4+
if (chrome.runtime.lastError) {
5+
reject(chrome.runtime.lastError)
6+
} else {
7+
resolve(result)
8+
}
9+
})
10+
})
11+
}
12+
13+
chrome.action.onClicked.addListener(function (tab) {
14+
if (tab.url.startsWith('http')) {
15+
chrome.debugger.attach({ tabId: tab.id }, '1.2', function () {
16+
sendCommand({ tabId: tab.id }, 'Fetch.enable', {
17+
patterns: [{ requestStage: 'Request' }, { requestStage: 'Response' }],
18+
})
19+
})
20+
} else {
21+
console.log('Debugger can only be attached to HTTP/HTTPS pages.')
22+
}
23+
})
24+
25+
const esPathPrefix = '/__maltoze-sse-viewer'
26+
let esUrl
27+
let sseRequestId
28+
const bodyQueue = []
29+
30+
chrome.debugger.onEvent.addListener(async function (source, method, params) {
31+
const [tab] = await chrome.tabs.query({
32+
active: true,
33+
lastFocusedWindow: true,
34+
})
35+
36+
if (
37+
params.requestId === sseRequestId &&
38+
(method === 'Network.loadingFinished' || method === 'Network.loadingFailed')
39+
) {
40+
chrome.tabs.sendMessage(tab.id, { type: 'close' })
41+
}
42+
43+
if (method === 'Fetch.requestPaused') {
44+
const reqUrl = new URL(params.request.url)
45+
if (reqUrl.pathname === esUrl) {
46+
await sendCommand(source, 'Fetch.fulfillRequest', {
47+
requestId: params.requestId,
48+
responseCode: 200,
49+
responseHeaders: [
50+
{ name: 'Content-Type', value: 'text/event-stream' },
51+
{ name: 'Cache-Control', value: 'no-cache' },
52+
],
53+
body: bodyQueue.shift(),
54+
})
55+
chrome.tabs.sendMessage(tab.id, { type: 'close' })
56+
} else {
57+
if (params.request.headers.accept === 'text/event-stream') {
58+
sseRequestId = params.requestId
59+
esUrl = `${esPathPrefix}${reqUrl.pathname}`
60+
if (params.responseHeaders) {
61+
const resp = await sendCommand(source, 'Fetch.getResponseBody', {
62+
requestId: params.requestId,
63+
})
64+
bodyQueue.push(resp.body)
65+
chrome.tabs.sendMessage(tab.id, { type: 'create', url: esUrl })
66+
}
67+
sendCommand(source, 'Fetch.continueRequest', {
68+
requestId: params.requestId,
69+
})
70+
} else {
71+
sendCommand(source, 'Fetch.continueRequest', {
72+
requestId: params.requestId,
73+
})
74+
}
75+
}
76+
}
77+
})

0 commit comments

Comments
 (0)