Skip to content

Commit d0edce5

Browse files
author
blik
committed
Adopt linking of module requests with vm module
Record imports by relative scope Flatten fragment/document composition stacks Assimilate socket and worker delegation Draft inspector routes
1 parent d1a96b9 commit d0edce5

10 files changed

+468
-281
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
!Blik_2024_static.js
1919
!Blik_2020_svg.json
2020
!Blik_2024_svg.js
21+
!Blik_2025_inspector.js
2122

2223
!isaacs_2011_node-tar.js
2324
!tyrealhu_2023_acorn_typescript.js

Blik_2023_fragment.js

Lines changed: 189 additions & 118 deletions
Large diffs are not rendered by default.

Blik_2023_host.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -255,8 +255,7 @@
255255
};
256256

257257
export async function broadcast(server,actions)
258-
{let {default:{WebSocketServer}}=await import("./einaros_2011_ws.js");
259-
let connection=buffer(function connection(host,peer,request)
258+
{let connection=buffer(function connection(host,peer,request)
260259
{Object.assign(peer
261260
,{author:anonymous[Math.floor(Math.random()*anonymous.length)]
262261
,connected:true
@@ -277,6 +276,7 @@
277276
),host)
278277
});
279278
},note.bind(1));
279+
let {default:{WebSocketServer}}=await import("./einaros_2011_ws.js");
280280
return compose([{server}],Reflect.construct,{rooms:{}},Object.assign
281281
,{connection},tether(observe))(WebSocketServer);
282282
};

Blik_2023_inference.js

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -468,12 +468,11 @@
468468
register=true;
469469
//let propagate=register>1;
470470
let binary=
471-
{hover:['mouseover','mouseout']
471+
{focus:['focusin','focusout']
472472
,mouse:['mouseover','mouseout']
473-
,focus:['focusin','focusout']
474-
,touch:['pointerover','pointerout']
475-
,pinch:['touchstart',"touchmove",'touchend']
476-
,draw:['pointerdown','pointerup']
473+
,touch:['touchstart','touchend']
474+
,point:['pointerdown','pointerup']
475+
,hover:['pointerover','pointerout']
477476
};
478477
let entries=[action].flat().flatMap(action=>
479478
simple(action)?Object.entries(action):[[action?.name,action]]).flatMap(([name,action])=>
@@ -554,9 +553,9 @@
554553
// observe an abort signal, optionally composing it with a context for explicit abortion.
555554
return revert((resolve,reject,controller,...context)=>
556555
context.reduce((signal,term,index,context)=>
557-
compose(buffer(term),slip(controller),"abort")({signal},...context.splice(1))
556+
compose(buffer(term),collect,slip(controller),"abort")({signal},...context.splice(1))
558557
,observe.call(controller.signal,{abort({target:{reason}})
559-
{(reason instanceof Error?reject:resolve)(reason);
558+
{(is(Error)(reason[0])?reject:resolve)(provide(reason));
560559
}},{once:true})))(...arguments);
561560
};
562561

Blik_2023_interface.js

Lines changed: 117 additions & 90 deletions
Large diffs are not rendered by default.

Blik_2023_meta.js

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -574,23 +574,24 @@
574574
[[target,node]
575575
,[source,sources.find(source=>label(source).name===label(node).name&&twin(source,node))]
576576
,label(node)
577-
]).filter(({1:{1:term}})=>term).map(([[target,node],[source,term],{name}],index)=>
577+
]).filter(({1:{1:term}})=>term).map(([[target,node],[source,term],{name}])=>
578578
// https://tc39.es/ecma426/#sec-names-for-generated-javascript-code
579-
[label,mirror].flat().map((part,index,{length})=>
579+
// clip function declaration for method counterparts.
580+
[node.method!==term.method?whether(not(infer("method")),mirror):[],label,mirror].flat().map((part,index,{length})=>
580581
[[[source,term],[target,node]].map(([source,node])=>
581-
coordinates(source,part(node)[index?"end":"start"]))
582-
//length===3&&index<2?index?label:node.method?infer():mirror:mirror
582+
coordinates(source,part(node)[length-index-1?"start":"end"]))
583583
,name
584-
].flat())).flatMap(([start,end],index,locations)=>
584+
].flat())).flatMap(([start,...end],index,locations)=>
585585
// cut source between segments with reference to previous segment end.
586-
[[locations[index-1]?.[1]||[[0,0]],start].reduce(([source],[cut,target,name])=>
586+
[[locations[index-1]?.at(-1)||[[0,0]],start].reduce(([source],[cut,target,name])=>
587587
[source,target,name])
588-
,start
589-
,...Array(end[1][0]-start[1][0]).fill(0).map((line,index)=>
588+
,start,...end.slice(0,-1)
589+
,...Array(end.at(-1)[1][0]-start[1][0]).fill(0).flatMap((line,index)=>
590590
// map identical lines of procedure.
591+
Array(index?1:2).fill(index+1).map((line,index)=>
591592
prune.call(start,([field,offset])=>
592-
numeric(offset)?[offset+index+1,0][field]:offset))
593-
,end
593+
numeric(offset)?[offset+line,index][field]:offset)))
594+
,end.at(-1)
594595
]);
595596
locations.push([coordinates(source,source.length),locations.at(-1)[1]]);
596597
let quantifiers=
@@ -779,13 +780,13 @@
779780
let noncondition=either(
780781
not(defined),simple,is([array,infer("some",({condition})=>condition)]));
781782
let fails=await [tests].reduce(function test(module,tests,depth,path)
782-
{let {tether,scope,context=[],route=[],terms=[],condition}=tests;
783+
{let {scope,context=[],route=[],terms=[],condition}=tests;
783784
return noncondition(condition)
784785
?compose(Object.entries,infer("reduce",record(([term,tests])=>
785786
test(module[term]??module,tests,depth+1,[depth?path:[],term].flat())),[]),"flat")(tests)
786787
:buffer(compose
787788
(...[route].flat()
788-
,buffer(module.bind(scope||tether))
789+
,buffer(scope?tether(module):module)
789790
,...[terms].flat(),assert[condition]||condition,swap({})
790791
),({stack})=>({[path.join("/")]:stack}))(...context);
791792
},namespace);

Blik_2023_sources.json

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -917,5 +917,10 @@
917917
"Shiranuit_2021_segfault.node":{
918918
"https://github.com/Shiranuit/node-segfault-handler":{"v1.4.2":["binding.gyp",{"syntax":"gyp","edit":{"'nan'":"'../1/include_dirs.js'"}}]},
919919
"https://github.com/nodejs/nan":{"v2.23.0":[]}
920-
}
920+
},
921+
"Cardaci_2013_devtools_interface.js":{"https://github.com/cyrus-and/chrome-remote-interface":{"v0.33.3":["lib/chrome.js",{
922+
"syntax":"commonjs",
923+
"alias":{"ws":"./Cardaci_2013_devtools_interface/0/lib/websocket-wrapper.js"},
924+
"detach":["http","https","dns"]
925+
}]}}
921926
}

Blik_2024_script.js

Lines changed: 68 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
import {merge,prune,unfold,record} from "./Blik_2023_search.js";
1+
import {merge,prune,unfold,record,extract} from "./Blik_2023_search.js";
22
import {aphorize,serialize} from "./Blik_2023_meta.js";
33
import {infer,compose,buffer,whether,wait,string,note,basic,defined,drop,modular,observe} from "./Blik_2023_inference.js";
44
import {window,fetch,digest,path,agent} from "./Blik_2023_interface.js";
55
import {document,css,capture,metamarkup,destroy,keyboard} from "./Blik_2023_fragment.js";
66
import {EditorState,Compartment} from './haverbeke_2022_codemirror_state.js';
77
import {EditorView,keymap,lineNumbers,drawSelection} from './haverbeke_2022_codemirror_view.js';
88
import {history,defaultKeymap,historyKeymap} from './haverbeke_2022_codemirror_commands.js';
9-
import {foldGutter,foldKeymap,codeFolding,syntaxHighlighting,defaultHighlightStyle,HighlightStyle,syntaxTree,ensureSyntaxTree,foldable,foldEffect,unfoldAll,foldAll} from './haverbeke_2022_codemirror_language.js';
9+
import {foldGutter,foldKeymap,codeFolding,syntaxHighlighting,defaultHighlightStyle,HighlightStyle,syntaxTree,syntaxTreeAvailable,ensureSyntaxTree,forceParsing,foldable,foldEffect,unfoldAll,foldAll} from './haverbeke_2022_codemirror_language.js';
1010
import {javascript} from './haverbeke_2022_codemirror_js.js';
1111
import {StyleModule} from './haverbeke_2022_stylemod.js';
1212
import {parser as lezer} from "./haverbeke_2022_lezer_js.js"
@@ -35,59 +35,78 @@
3535
{"/Blik_2023_search.js":["","merge","record"]
3636
,"/Blik_2023_interface.js":["","resolve","fetch"]
3737
,"/Blik_2023_inference.js":["","note","slip","compose","collect","combine"]
38-
,"/Blik_2023_fragment.js":["","metamarkup as dataset"]
38+
,"/Blik_2023_fragment.js":["","metamarkup as dataset","destroy","size"]
3939
,[file]:["script","fold","resize"]
4040
}
4141
,exports:{default:
4242
{".codemirror":
4343
{contextrestored(event)
4444
{let lines=Array.from(this.querySelectorAll(".cm-line")).map(({textContent:line})=>line);
4545
let meta=[dataset(this),{parent:this}].reduce(merge,{});
46-
this.childNodes.forEach(destroy);
46+
Array.from(this.childNodes).forEach(destroy);
4747
script(lines.join("\n"),meta);
48-
},keydown({keyCode,ctrlKey,altKey})
48+
},keydown({keyCode,ctrlKey:ctrl,altKey:alt})
4949
{let {s,w,f}=keyboard(keyCode);
50-
if(ctrlKey&&altKey&&f)
51-
return fold.call(this);
52-
if(w&&altKey)
53-
return compose(combine(infer(),({whiteSpace})=>whiteSpace==="pre-wrap"
50+
if(alt&&f)
51+
return arguments[0].preventDefault(),fold.call(this);
52+
if(alt&&w)
53+
return compose(stash(({whiteSpace})=>whiteSpace==="pre-wrap"
5454
?{maxWidth:"",whiteSpace:"",wordBreak:""}
55-
:{maxWidth:"calc(100% - 2.5em)",whiteSpace:"pre-wrap",wordBreak:"break-all"}),note,Object.assign)(this.querySelector(".cm-content").style);
56-
if(!s||!ctrlKey)return;
55+
:{maxWidth:"calc(100% - 2.5em)",whiteSpace:"pre-wrap",wordBreak:"break-all"}),Object.assign)(this.querySelector(".cm-content").style);
56+
if(!s||!ctrl)return;
5757
arguments[0].preventDefault();
5858
let source=this.querySelector(".cm-content").cmView.view.viewState.state.doc.toString();
5959
let bytes=new Array(source.length);
6060
for(let index in source)
6161
bytes[index]=source.charCodeAt(index);
6262
var blob=new Blob([new Uint8Array(bytes)],{type:'text/plain'});
6363
let target=this.dataset.source+"?override=true";
64-
let buffer=Object.assign(new FileReader(),{onload:compose
64+
let buffer=Object.assign(new FileReader()
65+
,{onload:compose
6566
((file,event)=>fetch(target,{method:"put",body:btoa(event.target.result)})
66-
,compose("text",["message"],record,{action:"broadcast",room:this.dataset.source},merge
67+
,note,"text",combine
68+
(body=>fetch("/inspect?module="+this.dataset.source,{method:"put",body})
69+
,compose(["message"],record,{action:"broadcast",room:this.dataset.source},merge
6770
,["data"],record,{bubbles:true},merge,slip("message"),collect,slip(MessageEvent)
6871
,Reflect.construct,slip(this),"dispatchEvent")
72+
)
6973
)})
7074
buffer.readAsBinaryString(blob);
71-
},...observe({pinch(event)
72-
{if(event.touches.length!==2)
75+
},...observe({touch(event)
76+
{let {type,touches,isTrusted:start}=event;
77+
if(!start)
78+
return this.control?.abort();
79+
if(touches.length!==2)
7380
return;
81+
let width=({touches})=>Array.from(touches).map(({pageX:x,pageY:y})=>[x,y]).reduce(([x1,y1],[x2,y2])=>Math.hypot(x1-x2,y1-y2));
82+
let unit=width(event);
83+
let font=size(this.querySelector(".cm-content"));
84+
merge(this,{control:new AbortController()});
85+
observe.call(this
86+
,{touchmove(event)
87+
{event.preventDefault();
88+
resize.call(this,Math.max(1,Math.round(width(event)/unit*font)));
89+
}},{signal:this.control.signal});
90+
}})
91+
,wheel(event)
92+
{if(!event.ctrlKey)return;
7493
event.preventDefault();
75-
let {type,touches,isTrusted:start}=event;
76-
let [[x1,y1],[x2,y2]]=Array.from(touches).map(({pageX:x,pageY:y})=>[x,y]);
77-
let width=Math.hypot(x1-x2,y1-y2);
78-
if(start)
79-
return this.start=width;
80-
let scale=2**(Math.floor(width-this.start)/50);
81-
resize.call(this,scale);
82-
}})}
94+
let past=size(this.querySelector(".cm-content"));
95+
let dy=event.deltaY/4;
96+
let scale=1-Math.sign(dy)*Math.min(24,Math.abs(dy))
97+
resize.call(this,Math.max(1,Math.round(past*scale)));
98+
}}
8399
}}};
84100
let parent=settings.parent||document({div:{class:"codemirror",...metamarkup(settings)}});
85101
//let language=(new Compartment).of(js());
86102
let indentation=new Compartment().of(EditorState.tabSize.of(1));
87103
let doc=string(source)?settings.source?source:await compose(fetch,digest,infer(serialize,"json"),buffer(compose(JSON.parse,aphorize),drop(1)))(source):JSON.stringify(source);
104+
let author=cookie("author");
105+
let {font}=author?await compose(fetch,digest)("/author/"+author):{};
106+
let size=font?font.size+"px":"1em";
88107
let theme=new Compartment().of(EditorView.theme(
89-
{".cm-content":{"text-align":"left","font-family":settings.font,"font-size":"1em"}
90-
,".cm-gutters":{background:"transparent"}
108+
{".cm-content":{"text-align":"left","font-family":settings.font,"font-size":size}
109+
,".cm-gutters":{background:"transparent","font-size":size}
91110
// gutter heights are calculated dynamically on client-side.
92111
,".cm-gutterElement":{height:"4px !important",color:"var(--note)"}
93112
,".cm-gutterElement:not(:first-of-type)":{height:"1.4em !important",transform:"translate(0,-4px)"}
@@ -101,44 +120,50 @@
101120
},{dark:true}));
102121
let state=EditorState.create({doc,extensions:[basetheme,foldtheme,theme,extensions].flat()});
103122
let view=new EditorView({parent,state},window);
104-
if(defined(settings.fold))
105-
settings.fold<1?foldAll(view):fold.call(parent,settings.fold);
106-
let style=parent.ownerDocument.querySelector("head").querySelector("style").textContent;
123+
if(settings.fold!==false&&globalThis.window)
124+
fold.call(parent,settings.fold||0);
107125
//let style=view.styleModules.flatMap(({rules})=>rules).reverse().join("\n");
108-
parent.prepend(document({style:{"#text":style}}));
126+
let style=parent.ownerDocument.querySelector("head").querySelector("style");
109127
if(!globalThis.window)
110-
parent.querySelector(".cm-content").cmView.view.viewState.state.doc.toString().split("\n").forEach((line,index)=>
128+
parent.prepend(document({style:{"#text":style.textContent}})),style.remove()
129+
,parent=parent.cloneNode(true),doc.split("\n").forEach((line,index)=>
111130
[".cm-line",".cm-lineNumbers>.cm-gutterElement"].map(name=>
112131
Array.from(parent.querySelectorAll(name))).forEach((lines,gutter)=>
113-
lines[index+gutter]||lines.at(-1).after(Object.assign(lines[gutter].cloneNode(true)
132+
lines[index+gutter]||lines.at(-1).after(Object.assign(lines.at(-1).cloneNode(true)
114133
,{textContent:gutter?index+1:line}))));
115-
return capture.call(parent,file+"/module/default/module");
134+
return settings.parent?parent:capture.call(parent,file+"/module/default/module");
116135
};
117136

118-
export function resize(scale)
137+
export function resize(next)
119138
{let text=this.querySelector(".cm-content");
120-
let {view}=text.cmView;
121-
let {fontSize}=window.getComputedStyle(text);
139+
let past=size(text);
140+
if(next===past)return;
141+
let {cmView:{view}}=text;
122142
let theme=view.viewState.state.config.base[2];
123-
let size=Number(fontSize.replace(/[a-z]/g,"")||1)*scale;
124-
view.dispatch({effects:theme.compartment.reconfigure([theme.inner,EditorView.theme(
125-
{".cm-content":{"font-size":size+"em"}
126-
,".cm-gutters":{"font-size":size+"em"}
127-
})])});
143+
view.dispatch({effects:theme.compartment.reconfigure([EditorView.theme(
144+
{".cm-content":{"font-size":next+"px"}
145+
,".cm-gutters":{"font-size":next+"px"}
146+
}),theme.inner])});
147+
let author=cookie("author");
148+
if(!author)return;
149+
buffer(compose
150+
(wait(10000),size,when(is(next)),drop()
151+
,"/author/"+author,{method:"put",body:JSON.stringify({font:{size:next}})},fetch,digest,note
152+
),note)(text);
128153
};
129154

130155
export function fold(depth=0)
131156
{let {view}=this.querySelector(".cm-content").cmView;
132157
let {state}=view.viewState;
133158
let effects=[];
134-
ensureSyntaxTree(state,state.doc.length,5000).iterate(
159+
ensureSyntaxTree(state,state.doc.length,10000).iterate(
135160
{enter({stack:{length},from,to})
136161
{let effect=depth<=length?foldable(state,from,to):undefined;
137162
if(effect)effects.push(foldEffect.of(effect));
138163
},from:0,to:state.doc.length
139164
});
140165
view.dispatch({effects});
141-
};
166+
};
142167

143168
export function highlight(source)
144169
{let span=[];
@@ -183,7 +208,7 @@
183208
},Object.entries,infer("map",([field,value])=>[".cm-"+field,value]),Object.fromEntries
184209
));
185210

186-
const foldtheme = EditorView.baseTheme(
211+
var foldtheme=EditorView.baseTheme(
187212
{".cm-foldPlaceholder":{backgroundColor: "#eee",border: "1px solid #ddd",color: "#888",borderRadius: ".2em",margin: "0 1px",padding: "0 1px",cursor: "pointer"}
188213
,".cm-foldGutter span": {padding: "0 1px",cursor: "pointer"}
189214
});

Blik_2024_static.js

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
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,ascend,defined,flip,heritage} from "./Blik_2023_inference.js";
2-
import {access,persist,purge,resolve,list,modularise,cookies,cookie,query,fetch,path,loader,delegate,location,window} from "./Blik_2023_interface.js";
2+
import {access,persist,purge,resolve,list,modularise,cookies,cookie,query,fetch,path,loader,delegate,location,window,listen,infrastructure} from "./Blik_2023_interface.js";
33
import {document,hypertext,css,throttle,error,capture,defer} from "./Blik_2023_fragment.js";
44
import {serialize,mime,proceduralize,sourcemap} from "./Blik_2023_meta.js";
55
import {search,merge,prune,random,extract,record,remember} from "./Blik_2023_search.js";
@@ -54,13 +54,13 @@
5454
,combine
5555
(compose(path,slip("path","resolve","./"),resolve.bind(import.meta.url),pass(permit,classified))
5656
,compose(drop(1),buffer(JSON.parse,compose(drop(1,2),"base64",Buffer.from,"toString")))
57-
,compose("url",query,buffer(differ("override"),swap(undefined)),is("true"))
58-
),note
57+
,compose("url",query,buffer(differ("override"),swap(undefined)),is(true))
58+
)
5959
,combine
6060
(crop(1)
6161
,compose(combine(buffer(compose(crop(1),infer(access,true),buffer(JSON.parse,drop(1))),swap({})),drop(1)),merge)
6262
)
63-
,true,note,access,true,combine
63+
,true,access,true,combine
6464
(compose(access,buffer(JSON.parse,drop(1)))
6565
,compose(crop(1),slip("path","relative","./"),resolve.bind(import.meta.url),"/","split")
6666
),record
@@ -93,14 +93,15 @@
9393
(simple(this)?serialize:"toString",term?compose
9494
(origin+"/"+file,buffer(modularise
9595
,compose(drop(2),origin,location,"replace",resolve.bind(import.meta.url))),either("namespace",crop(1))
96-
):compose(["body"],record
96+
):compose("//# sourceMappingURL=./sourcemap",collect,"\n","join",["body"],record
9797
,{type:mime("js"),headers:["X-",""].map(field=>(
9898
{[field+"SourceMap"]:"./sourcemap"})).reduce(merge)
9999
},merge)
100100
)(this);
101101
},sourcemap
102-
,scope(){return delegate.call(loader,"infrastructure");}
103-
};
102+
,sources(){return infrastructure();}
103+
,infrastructure(){return delegate.call(loader,"infrastructure");}
104+
};
104105

105106
export function persistence(resource)
106107
{classify(resource);
@@ -145,7 +146,7 @@
145146
}});
146147
};
147148

148-
async function authorize({headers:{cookie}},authority)
149+
export async function authorize({headers:{cookie}},authority)
149150
{when(defined)(authority);
150151
let {author:name}=cookies(cookie||"");
151152
if(!name)exit(Error("unauthorized"));

0 commit comments

Comments
 (0)