https://localhost
files
https://localhost
get
https://localhost
put
https://localhost
error
https://localhost
interface
https://localhost
style
https://localhost
feed
https://localhost
svg
https://localhost
namespace
https://localhost
module
https://localhost
sourcemap
https://localhost
scope
https://localhost
author
https://localhost
document
https://localhost
media
https://localhost
network
https://localhost
relay
https://localhost
manifest
https://localhost
robots.txt
https://localhost
wordpress
https://localhost
google
https://localhost
facebook
https://localhost
https
https://localhost
http
https://localhost
medium
https://localhost
wikipedia
https://localhost
mapbox
https://localhost
overpass
https://localhost
elsevier
https://localhost
.well-known
https://localhost
worker
https://localhost
calendar
https://localhost
actions
author
get
author
put
google
files
google
search
google
map
wikipedia
get
wikipedia
coedits
wikipedia
coreference
wikipedia
network
.well-known
appspecific
appspecific
com.chrome.devtools.json https://localhost https://localhost files files get get put put error error interface interface style style feed feed svg svg namespace namespace module module sourcemap sourcemap scope scope author author document document media media network network relay relay manifest manifest robots.txt robots.txt wordpress wordpress google google search search map map facebook facebook https https http http medium medium wikipedia wikipedia coedits coedits coreference coreference mapbox mapbox overpass overpass elsevier elsevier .well-known .well-known appspecific appspecific com.chrome.devtools.json com.chrome.devtoo ls.json worker worker calendar calendar actions actions
source files get compose(combine(compose(drop(1),path,infer("split","/"),"reverse",infer("reduce",functor,Object)),compose(combine(drop(0,1),compose(drop(1),path)),compose(collect,"reverse",provide),compose(combine(compose(either(compose(is("get"),when(is(Array)),drop(Infinity,0,0)),drop(Infinity,0,1)),drop(0,0,Array),get,infer),infer(undefined)),infer,"call"))),merge) put compose(drop(1),infer(pass(buffer(combine(compose(path,drop(0,0,"path","resolve","./"),resolve,Array,Boolean,permit),compose(drop(1),wait(0),parse,keys,"length",when(compose(when(numeric),infer(major,0))))),compose(drop(1),infer(authorize,"ranger"))))),combine(compose(path,drop(0,0,"path","resolve","./"),resolve,infer(pass(permit,Array))),compose(drop(1),buffer(parse,compose(drop(1,2),"base64",from,"toString"))),compose("url",compose(when(string),compose(combine(compose(either(compose(compose("/","startsWith"),when(is(Array)),drop(Infinity,0,0)),drop(Infinity,0,1)),drop(0,0,Array),get,infer),infer(undefined)),infer,"call"),collect,drop(0,0,URL),construct,"searchParams","entries",from,fromEntries,compose(when(defined),infer(tether prune,functor,0,0))),buffer(compose(combine(compose(same,not,when),"override"),infer,call),drop(Infinity,0,undefined)),is("true"))),note,combine(drop(0,1),compose(combine(buffer(compose(drop(0,1),infer(access,Boolean),buffer(parse,drop(1))),drop(Infinity,0,Object)),drop(1)),merge)),Boolean,note,access,Boolean,combine(compose(access,buffer(parse,drop(1))),compose(drop(0,1),drop(0,0,"path","relative","./"),resolve,"/","split")),record) error async function (path,request)
{when(is(Error))(this);
// if(!request.headers?.referer?.endsWith(request.url))
// return this;
if(!request.headers?.accept?.split(",").includes("text/html"))
return {body:this.stack,status:500};
let style=await css({body:{background:"black",color:color.red}});
let report=compose.call({div:{id:"frame",style:"white-space:pre-wrap","#text":this.stack}},"Error","/svg/animal/worm/document",[],[style],hypertext,document);
let body=report.outerHTML;
report.innerHTML="";
return {body,status:500,type:mime("html")};
} interface async function(request)
{let queries=query(request.url);
let fragment=numeric(this.put)?"fragment/feed":basic(this)?"network":"fragment/media";
let {controls,...fields}={source:"",fragment,...queries};
let form=compose(composer,document)(fields);
toggle.call(form,"get");
let body=
{span:form,style:compose
({"#frame":layout.frame},layout.theme,layout.goo,layout.link
,collect,infer("reduce",merge)
)(extract.call(layout,["body","a","blockquote","table"]))
};
let {averia,oswald,ranger}=fontface;
let style=css(
{"@font-face":[averia,oswald,ranger]
,"@keyframes wave":{"0%":{height:0,transform:"translate(0,-100%)",opacity:0},"50%":{opacity:0.25},"100%":{transform:"translate(0,100%)",opacity:0}}
,...animation.dotdot
});
let url=request.url.replace(/\/($|\?.*)/g,"");
let title=url.split("/").reverse().find(Boolean)||"JSInterface";
fragment=compose.call(body,title,"/svg/object/node/document",[],style,hypertext,document);
merge(fields
// root needs explicit /get method to reach json representation.
,{source:path(window.origin+(this===routes?"/get":request.url))
,resource:this!==routes&&compose(stage,digest)(this.get?.(...arguments)||this
,{url,headers:request.headers})
},1);
await buffer(compose(tether(submission.get),throttle))(form,fields);
if(String(controls)==="false")
form.remove();
return fragment;
} style compose(drop,Object,css,Array,record,Object,merge) feed function()
{let body=serialize({imports:{"./Blik_2023_search.js":["","merge"]},exports:{default:{}}});
return {body,type:mime("js")};
} svg namespace function()
{return compose.call
(this,when(modular),tether(prune,([field,term],path,trace)=>
trace.includes(term)?path:functor(term)
?"data:text/javascript;"+serialize(term,field)
:!native(term)?String(term):term)
);
} module function(request,body,response,route)
{let file=route.join("/");
let term=path(request).replace(file+"/module","");
return compose
(simple(this)?serialize:"toString",term?compose
("./"+file,buffer(modularise
,compose(swap("./"+file),resolve)),either("namespace",crop(1))
):compose(["body"],record,{type:mime("js")},merge)
)(this);
} sourcemap async function (request)
{let {pathname:address}=new URL(request.url);
address=address.replace("/sourcemap","");
let {default:actions,...exports}=await modularize(this);
let namespace=
{["./"+await resolve("path","relative",".",address)]:
[exports,...Object.values(actions)].flatMap(names=>
Object.entries(names).map(([field,value])=>
is(Function)(value)&&value.name||field))
};
let names=Object.values(namespace).flat();
let sources=await Object.keys(namespace).reduce
(record(source=>infer(access,true)(source))
,[this]
);
let grammars=await Object.entries({...namespace,[address]:names}).reduce(record(function([module,[...names]],index,namespaces)
{// find node with same source text as first name match in source files (names are more likely shadowed in output, but source may still be mistaken).
let reference=this.slice(0,namespaces[index+1]?0:index).flatMap(Object.values);
return compose(buffer(parse,swap(null)),tether(search,({1:value})=>names.includes(value?.id?.name)&&
[value,reference?.find(node=>node.id.name===value.id.name)].filter(Boolean).map(node=>
(sources[node===value?index:this.findIndex(grammar=>Object.values(grammar).includes(node))]).slice(node.start,node.end)).reduce((text,reference)=>text===reference)&&
names.splice(names.indexOf(value.id.name),1),true))(sources[index]);
}),[]);
let [source,grammar]=[sources,grammars].map(list=>list.pop());
let locations=grammars.map((nodes,index)=>Object.values(nodes).map(node=>
[coordinates(sources[index],node.id.start)
,coordinates(source,Object.values(grammar).find(({id})=>id.name===node.id.name)?.id.start)
,node.id.name
]).filter(({0:source,1:target})=>
// filter locations not matched due to transformation.
[source,target].flat().every(numeric)));
let entries=locations.flatMap((locations,source)=>
locations.map(([[sourceline,sourcecharacter],[line,character],name],index,locations)=>[line,[
// zero-based character, file, sourceline, sourcecharacter and name index relative to previous value.
[character-(locations[index-1]?.[1][0]===line?locations[index-1][1][1]:0)
,index?0:source?1:0
,sourceline-(locations[index-1]?.[0][0]??0)
,sourcecharacter-(locations[index-1]?.[0][1]??0)
,[locations[index-1]?.[2],name].filter(Boolean).map(name=>names.indexOf(name)).reduce((past,next)=>next-past)
]]]));
let vlq='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
let quantifiers=entries.map(entry=>Object.fromEntries([entry])).reduce((quantifiers,quantifier)=>merge(quantifiers,quantifier,0));
let mappings=Object.assign(Array(),quantifiers).map(entries=>
entries.map(entry=>entry.map(quantifier=>
// https://github.com/Rich-Harris/vlq/blob/master/src/index.js
[quantifier<0?(-quantifier<<1)|1:quantifier<<1].reduce(function clamp(stack,shifted)
{return (!stack.length||shifted>0)&&(shifted>>>5>0)?clamp([...stack,(shifted&31)|32],shifted>>>5):[...stack,shifted&31];
},[]).map(quantifier=>vlq[quantifier]).join("")).join("")).join(",")).join(";");
let {origin}=new URL("http"+(request.client.encrypted?"s":"")+"://"+request.headers.host);
let report=locations.flatMap((locations,index)=>locations.map(([source,target,name])=>name+": "+
[[Object.keys(namespace)[index],source.map(index=>index+1)].flat().join(":")
,[address,target.map(index=>index+1)].flat().join(":")
].map(path=>path.replace(/^\.{0,1}/,origin)).join(" -> "))).join("; \n");
return {version:3,file:address,sources:Object.keys(namespace),names,mappings,report};
} scope function(){return delegate.call(thread,"infrastructure");} author get async function(request)
{let route=request?.url?.split("/")||request||[];
let create=whether(compose("code",is("ENOENT")),compose(drop(1),"{}",true,access,"object",access),exit);
let records=await buffer(compose("object",access),create)(resource);
records=prune.call(records,([field,value])=>request&&["signature","code"].includes(field)?undefined:value,0,2);
return prune.call(records,([field,value],path)=>path.at(-1)==="pub"&&route.length>4
?compose(swap(field),pass(permit,classified),"binary",access):value);
} put async function(request,body)
{let {2:name}=request.url.split("/");
let {signature}=cookies(request.headers.cookie||"");
body=body?await prune.call(JSON.parse(body)
,([field,value])=>encryption[field]?.(value)||value):{};
let credentials=extract.call(body,Object.keys(encryption));
let anonymous=!signature&&!Object.keys(credentials).length;
if(anonymous)
exit(Error("missing "+Object.keys(credentials)+" or signature for "+name));
let records=await this.get();
let record=search.call(records,name);
let mismatch=record&&Object.entries(credentials).find(([field,value])=>value!==record[field])?.[0];
if(mismatch)
exit(Error(mismatch+" not authorized."));
let unauthorised=!signature||signature!==record.signature;
if(!body.code&&unauthorised)
exit(Error("invalid signature."));
let put=Date.now();
let expiry=1000*60*60*6;
let expired=put-record?.put>expiry;
signature=signature&&!expired?signature:random(20);
record=[record,body,{signature,put}].reduce(merge);
merge(records,record,name);
await access(resource,JSON.stringify(records),true);
record=prune.call(record,([field,value])=>
["signature","code"].includes(field)?undefined:value,0,1);
return merge(records
,{cookie:{signature,path:"/",expires:new Date(record.put+expiry).toUTCString(),httponly:true,samesite:true}
,body:record
},name);
} document compose(drop(0,1),infer(record,Array),document) media compose(drop(0,1),"toString",media,collect,document) network compose(combine(drop(Infinity,0,object),drop(0,1),compose(drop(1),compose(when(string),compose(combine(compose(either(compose(compose("/","startsWith"),when(is(Array)),drop(Infinity,0,0)),drop(Infinity,0,1)),drop(0,0,Array),get,infer),infer(undefined)),infer,"call"),collect,drop(0,0,URL),construct,"searchParams","entries",from,fromEntries,compose(when(defined),infer(tether prune,functor,0,0))))),compose(when(defined),infer(tether compose(drop(1),combine(sprawl,drop(1)),combine(spread,drop(1)),note,chart,simulate,infer(pass(compose(combine(compose(either(compose(compose(when(defined),infer(tether search,Array)),when(is(Array)),drop(Infinity,0,0)),drop(Infinity,0,1)),drop(0,0,Array),get,infer),infer(undefined)),infer,"call")))))),throttle,Object,compose(when(defined),infer(tether document))) relay function()
{let relay=
{imports:
{"./Blik_2023_inference.js":["","note","each","infer","buffer","provide","collect","compose","wait","has","clock"]
,"./Blik_2023_interface.js":["","path","query","locate","resolve"]
,"./Blik_2023_fragment.js":["","demarkup","document","insert","fill","image","canvas","message as entry"]
,"./Blik_2023_search.js":["","record"]
}
,exports:
{default:
{check(){this.send(JSON.stringify({action:"check"}));}
,signal({author},window)
{let form=window.document.querySelector("#composer");
let fields=Array.from(form.querySelectorAll("span[role=textbox]"));
let input=fields.find(input=>demarkup(input,"id").id==="message");
let label=input.closest("label");
let list=label.querySelector("ul")||label.appendChild(document({ul:{}}));
let node=list.querySelector("span#signal");
let entry=document({span:{id:"signal","#text":author.name+" is typing..."}});
list[node?"replaceChild":"appendChild"](entry,node);
compose(wait(3000),node=>node.parentNode&&node.remove())(entry);
},async message({message,put,author:{name,icon}={name:"system",icon:"/svg/object/cog/document"}},window)
{let form=window.document.querySelector("#composer");
let span=document({span:await entry({icon:icon||"/svg/animal/deer/document",name:name||"anonymous",put,message})});
if(form.querySelector("#message"))
document.call(form,{span:{id:"message",span:{class:"messages",role:"list",span}}});
if(name==="system")
compose(wait(10000),{style:"transition:all 1s;opacity:0;"},Object.assign,wait(1000),"remove")(li);
},broadcast({message,room,author})
{let {href}=window.location;
compose({source:room,...query(href)},transform,infer(insert,"under",window.document.querySelector("[actions='"+room+"']")))(message);
},history({messages},window)
{collect(each.call(provide(messages),async event=>entry(event,window)));
},save({author,room,updates})
{if(author==window.room.labels.message)
return window.Tone.Transport.start();
let {state}=this.room.content.viewState;
import("./haverbeke_2020_codemirror.js").then(({ChangeSet,receiveUpdates})=>
receiveUpdates(state,updates.map(({changes})=>
Array.isArray(changes)
?ChangeSet.fromJSON(changes)
:changes.toJSON()).map((changes,index)=>
Object.assign(updates[index],{changes})))).then(updates=>
this.room.content.update([updates]));
}}
,transform
}
};
return compose.call(relay,serialize,["body"],record,{type:mime("js")},Object.assign);
} manifest function()
{return {name:"JS Interface",short_name:"interface",theme_color:"#ffcbe4",background_color:"#fa99ca"
,display:"standalone",scope:"/",start_url:"https://jsinterface.org/",description:"public js interface"
,orientation:"any",icons:[{src:"/svg/object/node/document",sizes:"1024x1024"}]
};
} rss async function(request)
{when(has(["pub","put"]))(this);
let queries=query(request.url);
let item=await Object.keys(this.pub).reduce(record(async item=>
{let description=item;
let pubDate=await compose(access,"birthtime","toString")(item);
let content=await compose(fetch,"text",queries.augment?media
:infer("replace",/[<>]/g,match=>"&"+{"<":"l",">":"g"}[match]+"t;"))(item);
return prune.call({description,pubDate,content}
,([field,value])=>({"#text":value}),0,1);
}),[]);
//let xml=await import("./dylang_2017_xml.js").then(module=>module.default);
let channel=prune.call({title:"",description:""}//link:request.url}
,([field,value])=>({"#text":value}),0,1);
let {outerHTML:body}=document({rss:{version:"2.0",channel:{...channel,item}}});
//,{declaration:true,indent:" "})
return {status:200,type:"rss+xml",body:'<?xml version="1.0" encoding="UTF-8" ?>'+body};
} robots.txt function(){return "User-agent: *\nDisallow: "} rss2json function=>compose(fetch,"json",["body"],record)("https://api.rss2json.com/v1/api.json?"+new URLSearchParams(
{rss_url:string(request)?request:query(request.url).url
,api_key:syndication.rss2json.key
})) wordpress function(request)
{return compose
(resolve,request.url.split("/").slice(2).join("/"),"site"
,{number:15},"postsList",request.url.split("/").slice(2),record,note
)("./wordpress_2019_wpcom.js","WPCOM");
} google files function(request)
{return compose(fetch,"json",["body"],record)("https://www.googleapis.com/drive/v3/files/"+"?alt=media&key="+syndication.google.api);
} search function(request)
{let {q,type="image"}=query(request.url);
return compose(fetch,"json",["body"],record)(
["https://www.googleapis.com/customsearch/v1?"+new URLSearchParams(
{q,searchType:type,key:syndication.google.api
,cx:syndication.google.search
})
].join(""));
} map function(request)
{let options=query(request.url);
merge(options,{zoom:1,size:"600x500",maptype:"satellite",key:syndication.google.api},0);
return compose(fetch)("https://maps.googleapis.com/maps/api/staticmap?"+new URLSearchParams(options));
} facebook function(request)
{return compose(revert((resolve,reject,{source},fields)=>
FB.api("/"+source,"GET",{fields},resolve)),note
,({object_id:id,message,name,link})=>id?compose
(revert((resolve,reject,id,fields)=>
FB.api("/"+id,"GET",{fields},resolve)),note
,responseobject=>responseobject.embed_html+" \n"+message
)(id,'id,title,format,source,embed_html')
:[response.message,name&&link?name.replace(/ /g,"_")+"@"+link:""].join())
(query(request.url)
,'id,name,from,created_time,message,type,timeline_visibility,link,object_id'
);
} https function{url})=>compose(fetch,"json")("https:/"+url) http function{url})=>compose(fetch,"json")("http:/"+url) medium function=>compose(fetch,"text",note,slip(new DOMParser()),"text/xml","parseFromString","item","querySelectorAll")("https://medium.com/feed/"+new URL(request.url).pathname.split("/").slice(2).join("/")) wikipedia get async function(request)
{let {title,depth=1,height,section,homogeneous=true}=query(request.url);
let pages=await expand(title,depth,height,section,homogeneous);
if(path(request).split("/").at(-1)==="wikipedia")
return note({[title]:prune.call(pages,({1:page})=>
page.title?page.pages?{[page.title]:page.pages||{}}:page.title:page)});
return unfold.call({title,pages},"pages").filter(page=>page.pages);
} coedits async function(request)
{let pages=await this.get(request);
pages=pages.flatMap(page=>[page,page.pages.filter(page=>!page.pages)].flat());
let revisions=await Promise.all(pages.map(({title})=>harvest(
{...parameters.query,action:"query",prop:"revisions",rvlimit:500,rvprop:"user"//"timestamp|user|comment|slotsize|userid|ids|tags"
,rvdir:"newer",rvstart:new Date("2020-01-01").toISOString()
,formatversion:"2",titles:title
})));
let edits=revisions.flat().flatMap(({query:{pages}})=>pages.map(({title,revisions})=>(
{[title]:Array.from(new Set(revisions?.map(({user})=>user)||[]))}))).reduce(compose(crop(2),0,merge));
let {implicit}=query(request.url);
return compose
(Object.entries,infer("map",([title,editors],index,entries)=>
[title,implicit
?entries.slice(index+1).filter(({1:coeditors})=>coeditors.some(editor=>editors.includes(editor))).map(([title])=>title)
:editors.filter(editor=>entries.some(([cotitle,editors])=>cotitle!==title&&editors.includes(editor)))
]),Object.fromEntries
)(edits);
} coreference async function(request)
{let pages=await this.get(request); note(pages)
return pages.map(page=>
merge(page,{pages:page.pages.map(({title})=>title)})).map(({title,pages:links},index,pages)=>(
{[title]:pages.slice(index+1).filter(({pages:colinks})=>
colinks.some(link=>links.includes(link))).map(({title})=>title)})).reduce(merge);
} network async function(request)
{let pages=await this.get(request);
return pages.map(page=>
merge(page,{pages:page.pages.map(({title})=>title)})).map(({title},index,pages)=>(
{[title]:pages.filter(({title:cotitle,pages})=>
cotitle!==title&&pages.includes(title)).map(({title})=>title)})).reduce(merge);
} mapbox function(request){return infer("mapbox",request,syndication.mapbox)(resolve("./Blik_2024_map.js","proxy"));} overpass function()
{return fetch('https://www.overpass-api.de/api/interpreter?'+new URLSearchParams({data:'[out:json];rel[admin_level=2]'/*'convert item ::=::,::geom=geom(),_osm_type=type();'*/+';out geom;'}));
} elsevier function(request)
{if(!syndication.elsevier.token)
return compose(note,fetch,note,"text",note)("https://api.elsevier.com/authenticate?platform=SCOPUS",{headers:
{"X-ELS-APIKey":syndication.elsevier.api
}})
let address="https://api.elsevier.com/content/search/scidir";
let options=query(request.url);
let field="dc:title,dc:creator,prism:publicationName,prism:coverDate,dc:description,prism:doi";
merge(options,{field,count:25,view:"COMPLETE"},0);
return compose(fetch,note,"text",note)(note(address+"?"+new URLSearchParams(options)),{headers:
{"X-ELS-APIKey":syndication.elsevier.api
,Accept:"application/json"
}})
} .well-known appspecific com.chrome.devtools.json function()
{return {"workspace":{"root":process.env.PWD,"uuid":"53b029bb-c989-4dca-969b-835fecec3717"}};
} worker calendar function()
{return compose("toString",JSON.parse,calendar,["body"],record,{type:"text/calendar"},merge)(this);
} actions function()
{return {imports:{"/Blik_2023_inference.js":["","compose","wait"]}
,exports:
{default:
{"#Interface":
{async mousedown({target})
{let circle=this.querySelector("circle");
if(target!==circle)
return;
let icon=this.querySelector("g").lastChild;
circle.style.transition="0s";
circle.style.transform="scale(1)";
icon.style.transform="scale(1)";
let pulse=circle.cloneNode(true);
pulse.style.opacity=0.1;
pulse.style.pointerEvents="none";
pulse.style.transition="1.5s ease-out";
circle.insertAdjacentElement("afterEnd",pulse);
await wait(100)();
icon.style.transform="scale(1.1)";
circle.style.transition="0.1s";
circle.style.removeProperty("transform");
pulse.style.transform="scale(16)";
pulse.style.opacity=0;
compose(wait(3000),"remove")(pulse);
//await wait(5000)();
//this.dispatchEvent(new Event("mousedown",{bubbles:true}))
}}
}
}};
} fragment network fragment script chart network extrude map