-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathBlik_2025_inspector.js
More file actions
57 lines (55 loc) · 2.63 KB
/
Blik_2025_inspector.js
File metadata and controls
57 lines (55 loc) · 2.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import {note,compose,buffer,when,collect,infer,combine,wait,drop,slip,differ,crop,each,swap,pass,not,compound,functor,native,exit,tether,either,whether,describe,string,pattern,major,match,has,is,are,defined,flip,heritage} from "./Blik_2023_inference.js";
import {access,persist,purge,resolve,list,cookies,cookie,query,fetch,path,loader,delegate,location,window,listen,socket} from "./Blik_2023_interface.js";
import {authorize} from "./Blik_2024_static.js";
var sessions={};
export default
{async get(request)
{await authorize(request,"ranger");
let {inspector:sessionId}=cookies(request.headers.cookie||"");
if(!sessionId)
sessionId=await compose.call
("http://127.0.0.1:9100/json",fetch,digest,JSON.parse
,infer("find",({url})=>url===request.headers.referer)
,({webSocketDebuggerUrl:url,id:targetId})=>
provide([socket(url),{id:1,method:'Target.attachToTarget',params:{targetId,flatten:true}}])
,tether(listen,function session({params,result=params},sent,resume)
{sessions[result.sessionId]={session:this};
resume(result.sessionId);
})
);
let {session}=sessions[sessionId];
let id=session.id=session.id+1||1;
let scope={};
let actions=Object.values(
// https://chromedevtools.github.io/devtools-protocol/
{enable(message,{id,sessionId},resume,reject)
{if(message.id===id)
resume(provide([this,{id:this.id=id+1,sessionId,method:"Debugger.enable"},{}]));
},parse(message,{id,sessionId},resume,reject)
{if(message.method==="Debugger.scriptParsed")
return scope[message.params.url]=message.params.scriptId;
if(message.id!==id)
return;
resume(scope);
}}).flatMap(action=>tether(listen,action));
await compose(...actions)(session,{id,sessionId,method:"Debugger.disable"});
merge(sessions[sessionId],{scope});
let expires=new Date(new Date().getTime()+1000*60*60*6).toUTCString();
let cookie={inspector:sessionId,path:"/",expires,httponly:true,samesite:true};
return {body:scope,cookie};
},async put(request,scriptSource)
{await authorize(request,"ranger");
let {inspector:sessionId}=cookies(request.headers.cookie||"");
let {cookie}=sessionId
?{cookie:{inspector:sessionId,path:"/",expires:new Date(new Date().getTime()+1000*60*60*6).toUTCString(),httponly:true,samesite:true}}
:await this.get(...arguments);
let {scope,session}=sessions[cookie.inspector];
let {origin}=new URL("http"+(request.client.encrypted?"s":"")+"://"+request.headers.host);
let module=origin+query(request.url).module;
let scriptId=scope[module];
let params={scriptId,scriptSource};
return listen.call(session,function(message,{id},resume,reject)
{if(message.id===id)
(message.error?reject:resume)(message);
},{id:session.id+1,sessionId,method:"Debugger.setScriptSource",params});
}};