@jsenv/server 16.3.6 → 16.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/route_inspector/route_inspector.html +4 -4
- package/dist/jsenv_server.js +271 -189
- package/dist/ws/ws.js +37 -31
- package/index.js +53 -0
- package/package.json +7 -6
- package/src/{filesystem → services/filesystem}/fetch_filesystem.js +6 -5
- package/src/services/filesystem/jsenv_service_static_files.js +44 -0
- package/src/{filesystem → services/filesystem}/serve_directory.js +2 -1
- package/src/main.js +0 -52
- /package/src/{internal → services/filesystem}/etag.js +0 -0
- /package/src/{internal/convertFileSystemErrorToResponseProperties.js → services/filesystem/filesystem_error_to_response.js} +0 -0
- /package/src/{internal/filesystem.js → services/filesystem/filesystem_path_and_url.js} +0 -0
|
@@ -1131,17 +1131,17 @@ label .filter_text {
|
|
|
1131
1131
|
});
|
|
1132
1132
|
</script>
|
|
1133
1133
|
<script type="module">/* esm.sh - preact@10.23.1 */
|
|
1134
|
-
var M$2,h$1,X,ie,x$1,J$1,Y,R,j$1,$,O$1,T$1={},ee=[],le=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,I=Array.isArray;function b$3(_,e){for(var t in e)_[t]=e[t];return _}function _e(_){var e=_.parentNode;e&&e.removeChild(_);}function se(_,e,t){var i,n,r,l={};for(r in e)r=="key"?i=e[r]:r=="ref"?n=e[r]:l[r]=e[r];if(arguments.length>2&&(l.children=arguments.length>3?M$2.call(arguments,2):t),typeof _=="function"&&_.defaultProps!=null)for(r in _.defaultProps)l[r]===void 0&&(l[r]=_.defaultProps[r]);return U$1(_,l,i,n,null)}function U$1(_,e,t,i,n){var r={type:_,props:e,key:t,ref:i,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,constructor:void 0,__v:n??++X,__i:-1,__u:0};return n==null&&h$1.vnode!=null&&h$1.vnode(r),r}function N(_){return _.children}function F$1(_,e){this.props=_,this.context=e;}function C$3(_,e){if(e==null)return _.__?C$3(_.__,_.__i+1):null;for(var t;e<_.__k.length;e++)if((t=_.__k[e])!=null&&t.__e!=null)return t.__e;return typeof _.type=="function"?C$3(_):null}function te(_){var e,t;if((_=_.__)!=null&&_.__c!=null){for(_.__e=_.__c.base=null,e=0;e<_.__k.length;e++)if((t=_.__k[e])!=null&&t.__e!=null){_.__e=_.__c.base=t.__e;break}return te(_)}}function B(_){(!_.__d&&(_.__d=true)&&x$1.push(_)&&!H$1.__r++||J$1!==h$1.debounceRendering)&&((J$1=h$1.debounceRendering)||Y)(H$1);}function H$1(){var _,e,t,i,n,r,l,s;for(x$1.sort(R);_=x$1.shift();)_.__d&&(e=x$1.length,i=void 0,r=(n=(t=_).__v).__e,l=[],s=[],t.__P&&((i=b$3({},n)).__v=n.__v+1,h$1.vnode&&h$1.vnode(i),z$1(t.__P,i,n,t.__n,t.__P.namespaceURI,32&n.__u?[r]:null,l,r??C$3(n),!!(32&n.__u),s),i.__v=n.__v,i.__.__k[i.__i]=i,re(l,i,s),i.__e!=r&&te(i)),x$1.length>e&&x$1.sort(R));H$1.__r=0;}function ne(_,e,t,i,n,r,l,s,c,u,p){var o,m,f,v,g,y=i&&i.__k||ee,a=e.length;for(t.__d=c,ue(t,e,y),c=t.__d,o=0;o<a;o++)(f=t.__k[o])!=null&&typeof f!="boolean"&&typeof f!="function"&&(m=f.__i===-1?T$1:y[f.__i]||T$1,f.__i=o,z$1(_,f,m,n,r,l,s,c,u,p),v=f.__e,f.ref&&m.ref!=f.ref&&(m.ref&&q$1(m.ref,null,f),p.push(f.ref,f.__c||v,f)),g==null&&v!=null&&(g=v),65536&f.__u||m.__k===f.__k?c=oe(f,c,_):typeof f.type=="function"&&f.__d!==void 0?c=f.__d:v&&(c=v.nextSibling),f.__d=void 0,f.__u&=-196609);t.__d=c,t.__e=g;}function ue(_,e,t){var i,n,r,l,s,c=e.length,u=t.length,p=u,o=0;for(_.__k=[],i=0;i<c;i++)l=i+o,(n=_.__k[i]=(n=e[i])==null||typeof n=="boolean"||typeof n=="function"?null:typeof n=="string"||typeof n=="number"||typeof n=="bigint"||n.constructor==String?U$1(null,n,null,null,null):I(n)?U$1(N,{children:n},null,null,null):n.constructor===void 0&&n.__b>0?U$1(n.type,n.props,n.key,n.ref?n.ref:null,n.__v):n)!=null?(n.__=_,n.__b=_.__b+1,s=ce(n,t,l,p),n.__i=s,r=null,s!==-1&&(p--,(r=t[s])&&(r.__u|=131072)),r==null||r.__v===null?(s==-1&&o--,typeof n.type!="function"&&(n.__u|=65536)):s!==l&&(s==l-1?o=s-l:s==l+1?o++:s>l?p>c-l?o+=s-l:o--:s<l&&o++,s!==i+o&&(n.__u|=65536))):(r=t[l])&&r.key==null&&r.__e&&(131072&r.__u)==0&&(r.__e==_.__d&&(_.__d=C$3(r)),V(r,r,false),t[l]=null,p--);if(p)for(i=0;i<u;i++)(r=t[i])!=null&&(131072&r.__u)==0&&(r.__e==_.__d&&(_.__d=C$3(r)),V(r,r));}function oe(_,e,t){var i,n;if(typeof _.type=="function"){for(i=_.__k,n=0;i&&n<i.length;n++)i[n]&&(i[n].__=_,e=oe(i[n],e,t));return e}_.__e!=e&&(e&&_.type&&!t.contains(e)&&(e=C$3(_)),t.insertBefore(_.__e,e||null),e=_.__e);do e=e&&e.nextSibling;while(e!=null&&e.nodeType===8);return e}function ce(_,e,t,i){var n=_.key,r=_.type,l=t-1,s=t+1,c=e[t];if(c===null||c&&n==c.key&&r===c.type&&(131072&c.__u)==0)return t;if(i>(c!=null&&(131072&c.__u)==0?1:0))for(;l>=0||s<e.length;){if(l>=0){if((c=e[l])&&(131072&c.__u)==0&&n==c.key&&r===c.type)return l;l--;}if(s<e.length){if((c=e[s])&&(131072&c.__u)==0&&n==c.key&&r===c.type)return s;s++;}}return -1}function K(_,e,t){e[0]==="-"?_.setProperty(e,t??""):_[e]=t==null?"":typeof t!="number"||le.test(e)?t:t+"px";}function W$2(_,e,t,i,n){var r;e:if(e==="style")if(typeof t=="string")_.style.cssText=t;else {if(typeof i=="string"&&(_.style.cssText=i=""),i)for(e in i)t&&e in t||K(_.style,e,"");if(t)for(e in t)i&&t[e]===i[e]||K(_.style,e,t[e]);}else if(e[0]==="o"&&e[1]==="n")r=e!==(e=e.replace(/(PointerCapture)$|Capture$/i,"$1")),e=e.toLowerCase()in _||e==="onFocusOut"||e==="onFocusIn"?e.toLowerCase().slice(2):e.slice(2),_.l||(_.l={}),_.l[e+r]=t,t?i?t.u=i.u:(t.u=j$1,_.addEventListener(e,r?O$1:$,r)):_.removeEventListener(e,r?O$1:$,r);else {if(n=="http://www.w3.org/2000/svg")e=e.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if(e!="width"&&e!="height"&&e!="href"&&e!="list"&&e!="form"&&e!="tabIndex"&&e!="download"&&e!="rowSpan"&&e!="colSpan"&&e!="role"&&e!="popover"&&e in _)try{_[e]=t??"";break e}catch{}typeof t=="function"||(t==null||t===false&&e[4]!=="-"?_.removeAttribute(e):_.setAttribute(e,e=="popover"&&t==1?"":t));}}function Q(_){return function(e){if(this.l){var t=this.l[e.type+_];if(e.t==null)e.t=j$1++;else if(e.t<t.u)return;return t(h$1.event?h$1.event(e):e)}}}function z$1(_,e,t,i,n,r,l,s,c,u){var p,o,m,f,v,g,y,a,d,P,w,D,S,G,E,A,k=e.type;if(e.constructor!==void 0)return null;128&t.__u&&(c=!!(32&t.__u),r=[s=e.__e=t.__e]),(p=h$1.__b)&&p(e);e:if(typeof k=="function")try{if(a=e.props,d="prototype"in k&&k.prototype.render,P=(p=k.contextType)&&i[p.__c],w=p?P?P.props.value:p.__:i,t.__c?y=(o=e.__c=t.__c).__=o.__E:(d?e.__c=o=new k(a,w):(e.__c=o=new F$1(a,w),o.constructor=k,o.render=ae),P&&P.sub(o),o.props=a,o.state||(o.state={}),o.context=w,o.__n=i,m=o.__d=!0,o.__h=[],o._sb=[]),d&&o.__s==null&&(o.__s=o.state),d&&k.getDerivedStateFromProps!=null&&(o.__s==o.state&&(o.__s=b$3({},o.__s)),b$3(o.__s,k.getDerivedStateFromProps(a,o.__s))),f=o.props,v=o.state,o.__v=e,m)d&&k.getDerivedStateFromProps==null&&o.componentWillMount!=null&&o.componentWillMount(),d&&o.componentDidMount!=null&&o.__h.push(o.componentDidMount);else {if(d&&k.getDerivedStateFromProps==null&&a!==f&&o.componentWillReceiveProps!=null&&o.componentWillReceiveProps(a,w),!o.__e&&(o.shouldComponentUpdate!=null&&o.shouldComponentUpdate(a,o.__s,w)===!1||e.__v===t.__v)){for(e.__v!==t.__v&&(o.props=a,o.state=o.__s,o.__d=!1),e.__e=t.__e,e.__k=t.__k,e.__k.forEach(function(L){L&&(L.__=e);}),D=0;D<o._sb.length;D++)o.__h.push(o._sb[D]);o._sb=[],o.__h.length&&l.push(o);break e}o.componentWillUpdate!=null&&o.componentWillUpdate(a,o.__s,w),d&&o.componentDidUpdate!=null&&o.__h.push(function(){o.componentDidUpdate(f,v,g);});}if(o.context=w,o.props=a,o.__P=_,o.__e=!1,S=h$1.__r,G=0,d){for(o.state=o.__s,o.__d=!1,S&&S(e),p=o.render(o.props,o.state,o.context),E=0;E<o._sb.length;E++)o.__h.push(o._sb[E]);o._sb=[];}else do o.__d=!1,S&&S(e),p=o.render(o.props,o.state,o.context),o.state=o.__s;while(o.__d&&++G<25);o.state=o.__s,o.getChildContext!=null&&(i=b$3(b$3({},i),o.getChildContext())),d&&!m&&o.getSnapshotBeforeUpdate!=null&&(g=o.getSnapshotBeforeUpdate(f,v)),ne(_,I(A=p!=null&&p.type===N&&p.key==null?p.props.children:p)?A:[A],e,t,i,n,r,l,s,c,u),o.base=e.__e,e.__u&=-161,o.__h.length&&l.push(o),y&&(o.__E=o.__=null);}catch(L){if(e.__v=null,c||r!=null){for(e.__u|=c?160:32;s&&s.nodeType===8&&s.nextSibling;)s=s.nextSibling;r[r.indexOf(s)]=null,e.__e=s;}else e.__e=t.__e,e.__k=t.__k;h$1.__e(L,e,t);}else r==null&&e.__v===t.__v?(e.__k=t.__k,e.__e=t.__e):e.__e=pe(t.__e,e,t,i,n,r,l,c,u);(p=h$1.diffed)&&p(e);}function re(_,e,t){e.__d=void 0;for(var i=0;i<t.length;i++)q$1(t[i],t[++i],t[++i]);h$1.__c&&h$1.__c(e,_),_.some(function(n){try{_=n.__h,n.__h=[],_.some(function(r){r.call(n);});}catch(r){h$1.__e(r,n.__v);}});}function pe(_,e,t,i,n,r,l,s,c){var u,p,o,m,f,v,g,y=t.props,a=e.props,d=e.type;if(d==="svg"?n="http://www.w3.org/2000/svg":d==="math"?n="http://www.w3.org/1998/Math/MathML":n||(n="http://www.w3.org/1999/xhtml"),r!=null){for(u=0;u<r.length;u++)if((f=r[u])&&"setAttribute"in f==!!d&&(d?f.localName===d:f.nodeType===3)){_=f,r[u]=null;break}}if(_==null){if(d===null)return document.createTextNode(a);_=document.createElementNS(n,d,a.is&&a),r=null,s=false;}if(d===null)y===a||s&&_.data===a||(_.data=a);else {if(r=r&&M$2.call(_.childNodes),y=t.props||T$1,!s&&r!=null)for(y={},u=0;u<_.attributes.length;u++)y[(f=_.attributes[u]).name]=f.value;for(u in y)if(f=y[u],u!="children"){if(u=="dangerouslySetInnerHTML")o=f;else if(u!=="key"&&!(u in a)){if(u=="value"&&"defaultValue"in a||u=="checked"&&"defaultChecked"in a)continue;W$2(_,u,null,f,n);}}for(u in a)f=a[u],u=="children"?m=f:u=="dangerouslySetInnerHTML"?p=f:u=="value"?v=f:u=="checked"?g=f:u==="key"||s&&typeof f!="function"||y[u]===f||W$2(_,u,f,y[u],n);if(p)s||o&&(p.__html===o.__html||p.__html===_.innerHTML)||(_.innerHTML=p.__html),e.__k=[];else if(o&&(_.innerHTML=""),ne(_,I(m)?m:[m],e,t,i,d==="foreignObject"?"http://www.w3.org/1999/xhtml":n,r,l,r?r[0]:t.__k&&C$3(t,0),s,c),r!=null)for(u=r.length;u--;)r[u]!=null&&_e(r[u]);s||(u="value",v!==void 0&&(v!==_[u]||d==="progress"&&!v||d==="option"&&v!==y[u])&&W$2(_,u,v,y[u],n),u="checked",g!==void 0&&g!==_[u]&&W$2(_,u,g,y[u],n));}return _}function q$1(_,e,t){try{if(typeof _=="function"){var i=typeof _.__u=="function";i&&_.__u(),i&&e==null||(_.__u=_(e));}else _.current=e;}catch(n){h$1.__e(n,t);}}function V(_,e,t){var i,n;if(h$1.unmount&&h$1.unmount(_),(i=_.ref)&&(i.current&&i.current!==_.__e||q$1(i,null,e)),(i=_.__c)!=null){if(i.componentWillUnmount)try{i.componentWillUnmount();}catch(r){h$1.__e(r,e);}i.base=i.__P=null;}if(i=_.__k)for(n=0;n<i.length;n++)i[n]&&V(i[n],e,t||typeof _.type!="function");t||_.__e==null||_e(_.__e),_.__c=_.__=_.__e=_.__d=void 0;}function ae(_,e,t){return this.constructor(_,t)}function de(_,e,t){var i,n,r,l;h$1.__&&h$1.__(_,e),n=(i="undefined"=="function")?null:e.__k,r=[],l=[],z$1(e,_=(e).__k=se(N,null,[_]),n||T$1,T$1,e.namespaceURI,n?null:e.firstChild?M$2.call(e.childNodes):null,r,n?n.__e:e.firstChild,i,l),re(r,_,l);}M$2=ee.slice,h$1={__e:function(_,e,t,i){for(var n,r,l;e=e.__;)if((n=e.__c)&&!n.__)try{if((r=n.constructor)&&r.getDerivedStateFromError!=null&&(n.setState(r.getDerivedStateFromError(_)),l=n.__d),n.componentDidCatch!=null&&(n.componentDidCatch(_,i||{}),l=n.__d),l)return n.__E=n}catch(s){_=s;}throw _}},X=0,ie=function(_){return _!=null&&_.constructor==null},F$1.prototype.setState=function(_,e){var t;t=this.__s!=null&&this.__s!==this.state?this.__s:this.__s=b$3({},this.state),typeof _=="function"&&(_=_(b$3({},t),this.props)),_&&b$3(t,_),_!=null&&this.__v&&(e&&this._sb.push(e),B(this));},F$1.prototype.forceUpdate=function(_){this.__v&&(this.__e=true,_&&this.__h.push(_),B(this));},F$1.prototype.render=N,x$1=[],Y=typeof Promise=="function"?Promise.prototype.then.bind(Promise.resolve()):setTimeout,R=function(_,e){return _.__v.__b-e.__v.__b},H$1.__r=0,j$1=0,$=Q(false),O$1=Q(true);
|
|
1134
|
+
var M$2,h$1,X,ie,x$2,J$1,Y,R,j,$,O,T$1={},ee=[],le=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,I=Array.isArray;function b$3(_,e){for(var t in e)_[t]=e[t];return _}function _e(_){var e=_.parentNode;e&&e.removeChild(_);}function se(_,e,t){var i,n,r,l={};for(r in e)r=="key"?i=e[r]:r=="ref"?n=e[r]:l[r]=e[r];if(arguments.length>2&&(l.children=arguments.length>3?M$2.call(arguments,2):t),typeof _=="function"&&_.defaultProps!=null)for(r in _.defaultProps)l[r]===void 0&&(l[r]=_.defaultProps[r]);return U(_,l,i,n,null)}function U(_,e,t,i,n){var r={type:_,props:e,key:t,ref:i,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,constructor:void 0,__v:n??++X,__i:-1,__u:0};return n==null&&h$1.vnode!=null&&h$1.vnode(r),r}function N(_){return _.children}function F$1(_,e){this.props=_,this.context=e;}function C$3(_,e){if(e==null)return _.__?C$3(_.__,_.__i+1):null;for(var t;e<_.__k.length;e++)if((t=_.__k[e])!=null&&t.__e!=null)return t.__e;return typeof _.type=="function"?C$3(_):null}function te(_){var e,t;if((_=_.__)!=null&&_.__c!=null){for(_.__e=_.__c.base=null,e=0;e<_.__k.length;e++)if((t=_.__k[e])!=null&&t.__e!=null){_.__e=_.__c.base=t.__e;break}return te(_)}}function B(_){(!_.__d&&(_.__d=true)&&x$2.push(_)&&!H$1.__r++||J$1!==h$1.debounceRendering)&&((J$1=h$1.debounceRendering)||Y)(H$1);}function H$1(){var _,e,t,i,n,r,l,s;for(x$2.sort(R);_=x$2.shift();)_.__d&&(e=x$2.length,i=void 0,r=(n=(t=_).__v).__e,l=[],s=[],t.__P&&((i=b$3({},n)).__v=n.__v+1,h$1.vnode&&h$1.vnode(i),z$1(t.__P,i,n,t.__n,t.__P.namespaceURI,32&n.__u?[r]:null,l,r??C$3(n),!!(32&n.__u),s),i.__v=n.__v,i.__.__k[i.__i]=i,re(l,i,s),i.__e!=r&&te(i)),x$2.length>e&&x$2.sort(R));H$1.__r=0;}function ne(_,e,t,i,n,r,l,s,c,u,p){var o,m,f,v,g,y=i&&i.__k||ee,a=e.length;for(t.__d=c,ue(t,e,y),c=t.__d,o=0;o<a;o++)(f=t.__k[o])!=null&&typeof f!="boolean"&&typeof f!="function"&&(m=f.__i===-1?T$1:y[f.__i]||T$1,f.__i=o,z$1(_,f,m,n,r,l,s,c,u,p),v=f.__e,f.ref&&m.ref!=f.ref&&(m.ref&&q$1(m.ref,null,f),p.push(f.ref,f.__c||v,f)),g==null&&v!=null&&(g=v),65536&f.__u||m.__k===f.__k?c=oe(f,c,_):typeof f.type=="function"&&f.__d!==void 0?c=f.__d:v&&(c=v.nextSibling),f.__d=void 0,f.__u&=-196609);t.__d=c,t.__e=g;}function ue(_,e,t){var i,n,r,l,s,c=e.length,u=t.length,p=u,o=0;for(_.__k=[],i=0;i<c;i++)l=i+o,(n=_.__k[i]=(n=e[i])==null||typeof n=="boolean"||typeof n=="function"?null:typeof n=="string"||typeof n=="number"||typeof n=="bigint"||n.constructor==String?U(null,n,null,null,null):I(n)?U(N,{children:n},null,null,null):n.constructor===void 0&&n.__b>0?U(n.type,n.props,n.key,n.ref?n.ref:null,n.__v):n)!=null?(n.__=_,n.__b=_.__b+1,s=ce(n,t,l,p),n.__i=s,r=null,s!==-1&&(p--,(r=t[s])&&(r.__u|=131072)),r==null||r.__v===null?(s==-1&&o--,typeof n.type!="function"&&(n.__u|=65536)):s!==l&&(s==l-1?o=s-l:s==l+1?o++:s>l?p>c-l?o+=s-l:o--:s<l&&o++,s!==i+o&&(n.__u|=65536))):(r=t[l])&&r.key==null&&r.__e&&(131072&r.__u)==0&&(r.__e==_.__d&&(_.__d=C$3(r)),V(r,r,false),t[l]=null,p--);if(p)for(i=0;i<u;i++)(r=t[i])!=null&&(131072&r.__u)==0&&(r.__e==_.__d&&(_.__d=C$3(r)),V(r,r));}function oe(_,e,t){var i,n;if(typeof _.type=="function"){for(i=_.__k,n=0;i&&n<i.length;n++)i[n]&&(i[n].__=_,e=oe(i[n],e,t));return e}_.__e!=e&&(e&&_.type&&!t.contains(e)&&(e=C$3(_)),t.insertBefore(_.__e,e||null),e=_.__e);do e=e&&e.nextSibling;while(e!=null&&e.nodeType===8);return e}function ce(_,e,t,i){var n=_.key,r=_.type,l=t-1,s=t+1,c=e[t];if(c===null||c&&n==c.key&&r===c.type&&(131072&c.__u)==0)return t;if(i>(c!=null&&(131072&c.__u)==0?1:0))for(;l>=0||s<e.length;){if(l>=0){if((c=e[l])&&(131072&c.__u)==0&&n==c.key&&r===c.type)return l;l--;}if(s<e.length){if((c=e[s])&&(131072&c.__u)==0&&n==c.key&&r===c.type)return s;s++;}}return -1}function K(_,e,t){e[0]==="-"?_.setProperty(e,t??""):_[e]=t==null?"":typeof t!="number"||le.test(e)?t:t+"px";}function W$2(_,e,t,i,n){var r;e:if(e==="style")if(typeof t=="string")_.style.cssText=t;else {if(typeof i=="string"&&(_.style.cssText=i=""),i)for(e in i)t&&e in t||K(_.style,e,"");if(t)for(e in t)i&&t[e]===i[e]||K(_.style,e,t[e]);}else if(e[0]==="o"&&e[1]==="n")r=e!==(e=e.replace(/(PointerCapture)$|Capture$/i,"$1")),e=e.toLowerCase()in _||e==="onFocusOut"||e==="onFocusIn"?e.toLowerCase().slice(2):e.slice(2),_.l||(_.l={}),_.l[e+r]=t,t?i?t.u=i.u:(t.u=j,_.addEventListener(e,r?O:$,r)):_.removeEventListener(e,r?O:$,r);else {if(n=="http://www.w3.org/2000/svg")e=e.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if(e!="width"&&e!="height"&&e!="href"&&e!="list"&&e!="form"&&e!="tabIndex"&&e!="download"&&e!="rowSpan"&&e!="colSpan"&&e!="role"&&e!="popover"&&e in _)try{_[e]=t??"";break e}catch{}typeof t=="function"||(t==null||t===false&&e[4]!=="-"?_.removeAttribute(e):_.setAttribute(e,e=="popover"&&t==1?"":t));}}function Q(_){return function(e){if(this.l){var t=this.l[e.type+_];if(e.t==null)e.t=j++;else if(e.t<t.u)return;return t(h$1.event?h$1.event(e):e)}}}function z$1(_,e,t,i,n,r,l,s,c,u){var p,o,m,f,v,g,y,a,d,P,w,D,S,G,E,A,k=e.type;if(e.constructor!==void 0)return null;128&t.__u&&(c=!!(32&t.__u),r=[s=e.__e=t.__e]),(p=h$1.__b)&&p(e);e:if(typeof k=="function")try{if(a=e.props,d="prototype"in k&&k.prototype.render,P=(p=k.contextType)&&i[p.__c],w=p?P?P.props.value:p.__:i,t.__c?y=(o=e.__c=t.__c).__=o.__E:(d?e.__c=o=new k(a,w):(e.__c=o=new F$1(a,w),o.constructor=k,o.render=ae),P&&P.sub(o),o.props=a,o.state||(o.state={}),o.context=w,o.__n=i,m=o.__d=!0,o.__h=[],o._sb=[]),d&&o.__s==null&&(o.__s=o.state),d&&k.getDerivedStateFromProps!=null&&(o.__s==o.state&&(o.__s=b$3({},o.__s)),b$3(o.__s,k.getDerivedStateFromProps(a,o.__s))),f=o.props,v=o.state,o.__v=e,m)d&&k.getDerivedStateFromProps==null&&o.componentWillMount!=null&&o.componentWillMount(),d&&o.componentDidMount!=null&&o.__h.push(o.componentDidMount);else {if(d&&k.getDerivedStateFromProps==null&&a!==f&&o.componentWillReceiveProps!=null&&o.componentWillReceiveProps(a,w),!o.__e&&(o.shouldComponentUpdate!=null&&o.shouldComponentUpdate(a,o.__s,w)===!1||e.__v===t.__v)){for(e.__v!==t.__v&&(o.props=a,o.state=o.__s,o.__d=!1),e.__e=t.__e,e.__k=t.__k,e.__k.forEach(function(L){L&&(L.__=e);}),D=0;D<o._sb.length;D++)o.__h.push(o._sb[D]);o._sb=[],o.__h.length&&l.push(o);break e}o.componentWillUpdate!=null&&o.componentWillUpdate(a,o.__s,w),d&&o.componentDidUpdate!=null&&o.__h.push(function(){o.componentDidUpdate(f,v,g);});}if(o.context=w,o.props=a,o.__P=_,o.__e=!1,S=h$1.__r,G=0,d){for(o.state=o.__s,o.__d=!1,S&&S(e),p=o.render(o.props,o.state,o.context),E=0;E<o._sb.length;E++)o.__h.push(o._sb[E]);o._sb=[];}else do o.__d=!1,S&&S(e),p=o.render(o.props,o.state,o.context),o.state=o.__s;while(o.__d&&++G<25);o.state=o.__s,o.getChildContext!=null&&(i=b$3(b$3({},i),o.getChildContext())),d&&!m&&o.getSnapshotBeforeUpdate!=null&&(g=o.getSnapshotBeforeUpdate(f,v)),ne(_,I(A=p!=null&&p.type===N&&p.key==null?p.props.children:p)?A:[A],e,t,i,n,r,l,s,c,u),o.base=e.__e,e.__u&=-161,o.__h.length&&l.push(o),y&&(o.__E=o.__=null);}catch(L){if(e.__v=null,c||r!=null){for(e.__u|=c?160:32;s&&s.nodeType===8&&s.nextSibling;)s=s.nextSibling;r[r.indexOf(s)]=null,e.__e=s;}else e.__e=t.__e,e.__k=t.__k;h$1.__e(L,e,t);}else r==null&&e.__v===t.__v?(e.__k=t.__k,e.__e=t.__e):e.__e=pe(t.__e,e,t,i,n,r,l,c,u);(p=h$1.diffed)&&p(e);}function re(_,e,t){e.__d=void 0;for(var i=0;i<t.length;i++)q$1(t[i],t[++i],t[++i]);h$1.__c&&h$1.__c(e,_),_.some(function(n){try{_=n.__h,n.__h=[],_.some(function(r){r.call(n);});}catch(r){h$1.__e(r,n.__v);}});}function pe(_,e,t,i,n,r,l,s,c){var u,p,o,m,f,v,g,y=t.props,a=e.props,d=e.type;if(d==="svg"?n="http://www.w3.org/2000/svg":d==="math"?n="http://www.w3.org/1998/Math/MathML":n||(n="http://www.w3.org/1999/xhtml"),r!=null){for(u=0;u<r.length;u++)if((f=r[u])&&"setAttribute"in f==!!d&&(d?f.localName===d:f.nodeType===3)){_=f,r[u]=null;break}}if(_==null){if(d===null)return document.createTextNode(a);_=document.createElementNS(n,d,a.is&&a),r=null,s=false;}if(d===null)y===a||s&&_.data===a||(_.data=a);else {if(r=r&&M$2.call(_.childNodes),y=t.props||T$1,!s&&r!=null)for(y={},u=0;u<_.attributes.length;u++)y[(f=_.attributes[u]).name]=f.value;for(u in y)if(f=y[u],u!="children"){if(u=="dangerouslySetInnerHTML")o=f;else if(u!=="key"&&!(u in a)){if(u=="value"&&"defaultValue"in a||u=="checked"&&"defaultChecked"in a)continue;W$2(_,u,null,f,n);}}for(u in a)f=a[u],u=="children"?m=f:u=="dangerouslySetInnerHTML"?p=f:u=="value"?v=f:u=="checked"?g=f:u==="key"||s&&typeof f!="function"||y[u]===f||W$2(_,u,f,y[u],n);if(p)s||o&&(p.__html===o.__html||p.__html===_.innerHTML)||(_.innerHTML=p.__html),e.__k=[];else if(o&&(_.innerHTML=""),ne(_,I(m)?m:[m],e,t,i,d==="foreignObject"?"http://www.w3.org/1999/xhtml":n,r,l,r?r[0]:t.__k&&C$3(t,0),s,c),r!=null)for(u=r.length;u--;)r[u]!=null&&_e(r[u]);s||(u="value",v!==void 0&&(v!==_[u]||d==="progress"&&!v||d==="option"&&v!==y[u])&&W$2(_,u,v,y[u],n),u="checked",g!==void 0&&g!==_[u]&&W$2(_,u,g,y[u],n));}return _}function q$1(_,e,t){try{if(typeof _=="function"){var i=typeof _.__u=="function";i&&_.__u(),i&&e==null||(_.__u=_(e));}else _.current=e;}catch(n){h$1.__e(n,t);}}function V(_,e,t){var i,n;if(h$1.unmount&&h$1.unmount(_),(i=_.ref)&&(i.current&&i.current!==_.__e||q$1(i,null,e)),(i=_.__c)!=null){if(i.componentWillUnmount)try{i.componentWillUnmount();}catch(r){h$1.__e(r,e);}i.base=i.__P=null;}if(i=_.__k)for(n=0;n<i.length;n++)i[n]&&V(i[n],e,t||typeof _.type!="function");t||_.__e==null||_e(_.__e),_.__c=_.__=_.__e=_.__d=void 0;}function ae(_,e,t){return this.constructor(_,t)}function de(_,e,t){var i,n,r,l;h$1.__&&h$1.__(_,e),n=(i="undefined"=="function")?null:e.__k,r=[],l=[],z$1(e,_=(e).__k=se(N,null,[_]),n||T$1,T$1,e.namespaceURI,n?null:e.firstChild?M$2.call(e.childNodes):null,r,n?n.__e:e.firstChild,i,l),re(r,_,l);}M$2=ee.slice,h$1={__e:function(_,e,t,i){for(var n,r,l;e=e.__;)if((n=e.__c)&&!n.__)try{if((r=n.constructor)&&r.getDerivedStateFromError!=null&&(n.setState(r.getDerivedStateFromError(_)),l=n.__d),n.componentDidCatch!=null&&(n.componentDidCatch(_,i||{}),l=n.__d),l)return n.__E=n}catch(s){_=s;}throw _}},X=0,ie=function(_){return _!=null&&_.constructor==null},F$1.prototype.setState=function(_,e){var t;t=this.__s!=null&&this.__s!==this.state?this.__s:this.__s=b$3({},this.state),typeof _=="function"&&(_=_(b$3({},t),this.props)),_&&b$3(t,_),_!=null&&this.__v&&(e&&this._sb.push(e),B(this));},F$1.prototype.forceUpdate=function(_){this.__v&&(this.__e=true,_&&this.__h.push(_),B(this));},F$1.prototype.render=N,x$2=[],Y=typeof Promise=="function"?Promise.prototype.then.bind(Promise.resolve()):setTimeout,R=function(_,e){return _.__v.__b-e.__v.__b},H$1.__r=0,j=0,$=Q(false),O=Q(true);
|
|
1135
1135
|
|
|
1136
1136
|
/* esm.sh - htm@3.1.1 */
|
|
1137
|
-
var a$
|
|
1137
|
+
var a$2=function(p,f,c,n){var l;f[0]=0;for(var u=1;u<f.length;u++){var g=f[u++],o=f[u]?(f[0]|=g?1:2,c[f[u++]]):f[++u];g===3?n[0]=o:g===4?n[1]=Object.assign(n[1]||{},o):g===5?(n[1]=n[1]||{})[f[++u]]=o:g===6?n[1][f[++u]]+=o+"":g?(l=p.apply(o,a$2(p,o,c,["",null])),n.push(l),o[0]?f[0]|=2:(f[u-2]=0,f[u]=l)):n.push(o);}return n},M$1=new Map;function b$2(p){var f=M$1.get(this);return f||(f=new Map,M$1.set(this,f)),(f=a$2(this,f.get(p)||(f.set(p,f=(function(c){for(var n,l,u=1,g="",o="",i=[0],s=function(v){u===1&&(v||(g=g.replace(/^\s*\n\s*|\s*\n\s*$/g,"")))?i.push(0,v,g):u===3&&(v||g)?(i.push(3,v,g),u=2):u===2&&g==="..."&&v?i.push(4,v,0):u===2&&g&&!v?i.push(5,0,true,g):u>=5&&((g||!v&&u===5)&&(i.push(u,0,g,l),u=6),v&&(i.push(u,v,0,l),u=6)),g="";},t=0;t<c.length;t++){t&&(u===1&&s(),s(t));for(var w=0;w<c[t].length;w++)n=c[t][w],u===1?n==="<"?(s(),i=[i],u=3):g+=n:u===4?g==="--"&&n===">"?(u=1,g=""):g=n+g[0]:o?n===o?o="":g+=n:n==='"'||n==="'"?o=n:n===">"?(s(),u=1):u&&(n==="="?(u=5,l=g,g=""):n==="/"&&(u<5||c[t][w+1]===">")?(s(),u===3&&(i=i[0]),u=i,(i=i[0]).push(2,0,u),u=0):n===" "||n===" "||n===`
|
|
1138
1138
|
`||n==="\r"?(s(),u=2):g+=n),u===3&&g==="!--"&&(u=4,i=i[0]);}return s(),i})(p)),f),arguments,[])).length>1?f:f[0]}
|
|
1139
1139
|
|
|
1140
1140
|
/* esm.sh - htm@3.1.1/preact */
|
|
1141
1141
|
var p$3=b$2.bind(se);
|
|
1142
1142
|
|
|
1143
|
-
/* esm.sh - @preact/signals-core@1.14.
|
|
1144
|
-
var C$2=Symbol.for("preact-signals");function
|
|
1143
|
+
/* esm.sh - @preact/signals-core@1.14.1 */
|
|
1144
|
+
var C$2=Symbol.for("preact-signals");function p$2(){if(h>1)h--;else {var t,i=false;for((function(){var f=d$1;for(d$1=void 0;f!==void 0;)f.S.v===f.v&&(f.S.i=f.i),f=f.o;})();a$1!==void 0;){var o=a$1;for(a$1=void 0,c$2++;o!==void 0;){var r=o.u;if(o.u=void 0,o.f&=-3,!(8&o.f)&&b$1(o))try{o.c();}catch(f){i||(t=f,i=true);}o=r;}}if(c$2=0,h--,i)throw t}}var n=void 0;function S$2(t){var i=n;n=void 0;try{return t()}finally{n=i;}}var a$1=void 0,h=0,c$2=0,y=0,d$1=void 0,l$1=0;function m(t){if(n!==void 0){var i=t.n;if(i===void 0||i.t!==n)return i={i:0,S:t,p:n.s,n:void 0,t:n,e:void 0,x:void 0,r:i},n.s!==void 0&&(n.s.n=i),n.s=i,t.n=i,32&n.f&&t.S(i),i;if(i.i===-1)return i.i=0,i.n!==void 0&&(i.n.p=i.p,i.p!==void 0&&(i.p.n=i.n),i.p=n.s,i.n=void 0,n.s.n=i,n.s=i),i}}function s(t,i){this.v=t,this.i=0,this.n=void 0,this.t=void 0,this.l=0,this.W=i?.watched,this.Z=i?.unwatched,this.name=i?.name;}s.prototype.brand=C$2;s.prototype.h=function(){return true};s.prototype.S=function(t){var i=this,o=this.t;o!==t&&t.e===void 0&&(t.x=o,this.t=t,o!==void 0?o.e=t:S$2(function(){var r;(r=i.W)==null||r.call(i);}));};s.prototype.U=function(t){var i=this;if(this.t!==void 0){var o=t.e,r=t.x;o!==void 0&&(o.x=r,t.e=void 0),r!==void 0&&(r.e=o,t.x=void 0),t===this.t&&(this.t=r,r===void 0&&S$2(function(){var f;(f=i.Z)==null||f.call(i);}));}};s.prototype.subscribe=function(t){var i=this;return W$1(function(){var o=i.value,r=n;n=void 0;try{t(o);}finally{n=r;}},{name:"sub"})};s.prototype.valueOf=function(){return this.value};s.prototype.toString=function(){return this.value+""};s.prototype.toJSON=function(){return this.value};s.prototype.peek=function(){var t=n;n=void 0;try{return this.value}finally{n=t;}};Object.defineProperty(s.prototype,"value",{get:function(){var t=m(this);return t!==void 0&&(t.i=this.i),this.v},set:function(t){if(t!==this.v){if(c$2>100)throw new Error("Cycle detected");((function(o){h!==0&&c$2===0&&o.l!==y&&(o.l=y,d$1={S:o,v:o.v,i:o.i,o:d$1});}))(this),this.v=t,this.i++,l$1++,h++;try{for(var i=this.t;i!==void 0;i=i.x)i.t.N();}finally{p$2();}}}});function P(t,i){return new s(t,i)}function b$1(t){for(var i=t.s;i!==void 0;i=i.n)if(i.S.i!==i.i||!i.S.h()||i.S.i!==i.i)return true;return false}function x$1(t){for(var i=t.s;i!==void 0;i=i.n){var o=i.S.n;if(o!==void 0&&(i.r=o),i.S.n=i,i.i=-1,i.n===void 0){t.s=i;break}}}function g$1(t){for(var i=t.s,o=void 0;i!==void 0;){var r=i.p;i.i===-1?(i.S.U(i),r!==void 0&&(r.n=i.n),i.n!==void 0&&(i.n.p=r)):o=i,i.S.n=i.r,i.r!==void 0&&(i.r=void 0),i=r;}t.s=o;}function v$1(t,i){s.call(this,void 0),this.x=t,this.s=void 0,this.g=l$1-1,this.f=4,this.W=i?.watched,this.Z=i?.unwatched,this.name=i?.name;}v$1.prototype=new s;v$1.prototype.h=function(){if(this.f&=-3,1&this.f)return false;if((36&this.f)==32||(this.f&=-5,this.g===l$1))return true;if(this.g=l$1,this.f|=1,this.i>0&&!b$1(this))return this.f&=-2,true;var t=n;try{x$1(this),n=this;var i=this.x();(16&this.f||this.v!==i||this.i===0)&&(this.v=i,this.f&=-17,this.i++);}catch(o){this.v=o,this.f|=16,this.i++;}return n=t,g$1(this),this.f&=-2,true};v$1.prototype.S=function(t){if(this.t===void 0){this.f|=36;for(var i=this.s;i!==void 0;i=i.n)i.S.S(i);}s.prototype.S.call(this,t);};v$1.prototype.U=function(t){if(this.t!==void 0&&(s.prototype.U.call(this,t),this.t===void 0)){this.f&=-33;for(var i=this.s;i!==void 0;i=i.n)i.S.U(i);}};v$1.prototype.N=function(){if(!(2&this.f)){this.f|=6;for(var t=this.t;t!==void 0;t=t.x)t.t.N();}};Object.defineProperty(v$1.prototype,"value",{get:function(){if(1&this.f)throw new Error("Cycle detected");var t=m(this);if(this.h(),t!==void 0&&(t.i=this.i),16&this.f)throw this.v;return this.v}});function J(t,i){return new v$1(t,i)}function E$1(t){var i=t.m;if(t.m=void 0,typeof i=="function"){h++;var o=n;n=void 0;try{i();}catch(r){throw t.f&=-2,t.f|=8,w$1(t),r}finally{n=o,p$2();}}}function w$1(t){for(var i=t.s;i!==void 0;i=i.n)i.S.U(i);t.x=void 0,t.s=void 0,E$1(t);}function k$1(t){if(n!==this)throw new Error("Out-of-order effect");g$1(this),n=t,this.f&=-2,8&this.f&&w$1(this),p$2();}function u(t,i){this.x=t,this.m=void 0,this.s=void 0,this.u=void 0,this.f=32,this.name=i?.name;}u.prototype.c=function(){var t=this.S();try{if(8&this.f||this.x===void 0)return;var i=this.x();typeof i=="function"&&(this.m=i);}finally{t();}};u.prototype.S=function(){if(1&this.f)throw new Error("Cycle detected");this.f|=1,this.f&=-9,E$1(this),x$1(this),h++;var t=n;return n=this,k$1.bind(this,t)};u.prototype.N=function(){2&this.f||(this.f|=2,this.u=a$1,a$1=this);};u.prototype.d=function(){this.f|=8,1&this.f||w$1(this);};u.prototype.dispose=function(){this.d();};function W$1(t,i){var o=new u(t,i);try{o.c();}catch(f){throw o.d(),f}var r=o.d.bind(o);return r[Symbol.dispose]=r,r}
|
|
1145
1145
|
|
|
1146
1146
|
/* esm.sh - preact@10.23.1/hooks */
|
|
1147
1147
|
var c$1,r,d,b,v=0,x=[],o=h$1,g=o.__b,C$1=o.__r,A=o.diffed,D=o.__c,F=o.unmount,k=o.__;function l(t,_){o.__h&&o.__h(r,t,v||_),v=0;var u=r.__H||(r.__H={__:[],__h:[]});return t>=u.__.length&&u.__.push({}),u.__[t]}function z(t){return v=5,T(function(){return {current:t}},[])}function T(t,_){var u=l(c$1++,7);return E(u.__H,_)&&(u.__=t(),u.__H=_,u.__h=t),u.__}function M(t,_){return v=8,T(function(){return t},_)}function S$1(){for(var t;t=x.shift();)if(t.__P&&t.__H)try{t.__H.__h.forEach(p$1),t.__H.__h.forEach(H),t.__H.__h=[];}catch(_){t.__H.__h=[],o.__e(_,t.__v);}}o.__b=function(t){r=null,g&&g(t);},o.__=function(t,_){t&&_.__k&&_.__k.__m&&(t.__m=_.__k.__m),k&&k(t,_);},o.__r=function(t){C$1&&C$1(t),c$1=0;var _=(r=t.__c).__H;_&&(d===r?(_.__h=[],r.__h=[],_.__.forEach(function(u){u.__N&&(u.__=u.__N),u.i=u.__N=void 0;})):(_.__h.forEach(p$1),_.__h.forEach(H),_.__h=[],c$1=0)),d=r;},o.diffed=function(t){A&&A(t);var _=t.__c;_&&_.__H&&(_.__H.__h.length&&(x.push(_)!==1&&b===o.requestAnimationFrame||((b=o.requestAnimationFrame)||W)(S$1)),_.__H.__.forEach(function(u){u.i&&(u.__H=u.i),u.i=void 0;})),d=r=null;},o.__c=function(t,_){_.some(function(u){try{u.__h.forEach(p$1),u.__h=u.__h.filter(function(n){return !n.__||H(n)});}catch(n){_.some(function(i){i.__h&&(i.__h=[]);}),_=[],o.__e(n,u.__v);}}),D&&D(t,_);},o.unmount=function(t){F&&F(t);var _,u=t.__c;u&&u.__H&&(u.__H.__.forEach(function(n){try{p$1(n);}catch(i){_=i;}}),u.__H=void 0,_&&o.__e(_,u.__v));};var q=typeof requestAnimationFrame=="function";function W(t){var _,u=function(){clearTimeout(n),q&&cancelAnimationFrame(_),setTimeout(t);},n=setTimeout(u,100);q&&(_=requestAnimationFrame(u));}function p$1(t){var _=r,u=t.__c;typeof u=="function"&&(t.__c=void 0,u()),r=_;}function H(t){var _=r;t.__c=t.__(),r=_;}function E(t,_){return !t||t.length!==_.length||_.some(function(u,n){return u!==t[n]})}
|
package/dist/jsenv_server.js
CHANGED
|
@@ -3051,6 +3051,48 @@ const resourceToExtension = (resource) => {
|
|
|
3051
3051
|
return pathnameToExtension(pathname);
|
|
3052
3052
|
};
|
|
3053
3053
|
|
|
3054
|
+
const urlToScheme = (url) => {
|
|
3055
|
+
const urlString = String(url);
|
|
3056
|
+
const colonIndex = urlString.indexOf(":");
|
|
3057
|
+
if (colonIndex === -1) {
|
|
3058
|
+
return "";
|
|
3059
|
+
}
|
|
3060
|
+
|
|
3061
|
+
const scheme = urlString.slice(0, colonIndex);
|
|
3062
|
+
return scheme;
|
|
3063
|
+
};
|
|
3064
|
+
|
|
3065
|
+
const urlToResource = (url) => {
|
|
3066
|
+
const scheme = urlToScheme(url);
|
|
3067
|
+
|
|
3068
|
+
if (scheme === "file") {
|
|
3069
|
+
const urlAsStringWithoutFileProtocol = String(url).slice("file://".length);
|
|
3070
|
+
return urlAsStringWithoutFileProtocol;
|
|
3071
|
+
}
|
|
3072
|
+
|
|
3073
|
+
if (scheme === "https" || scheme === "http") {
|
|
3074
|
+
// remove origin
|
|
3075
|
+
const afterProtocol = String(url).slice(scheme.length + "://".length);
|
|
3076
|
+
const pathnameSlashIndex = afterProtocol.indexOf("/", "://".length);
|
|
3077
|
+
const urlAsStringWithoutOrigin = afterProtocol.slice(pathnameSlashIndex);
|
|
3078
|
+
return urlAsStringWithoutOrigin;
|
|
3079
|
+
}
|
|
3080
|
+
|
|
3081
|
+
const urlAsStringWithoutProtocol = String(url).slice(scheme.length + 1);
|
|
3082
|
+
return urlAsStringWithoutProtocol;
|
|
3083
|
+
};
|
|
3084
|
+
|
|
3085
|
+
const urlToPathname = (url) => {
|
|
3086
|
+
const resource = urlToResource(url);
|
|
3087
|
+
const pathname = resourceToPathname(resource);
|
|
3088
|
+
return pathname;
|
|
3089
|
+
};
|
|
3090
|
+
|
|
3091
|
+
const urlToExtension = (url) => {
|
|
3092
|
+
const pathname = urlToPathname(url);
|
|
3093
|
+
return pathnameToExtension(pathname);
|
|
3094
|
+
};
|
|
3095
|
+
|
|
3054
3096
|
const getCommonPathname = (pathname, otherPathname) => {
|
|
3055
3097
|
if (pathname === otherPathname) {
|
|
3056
3098
|
return pathname;
|
|
@@ -7610,6 +7652,198 @@ const jsenvServiceErrorHandler = ({ sendErrorDetails = false } = {}) => {
|
|
|
7610
7652
|
};
|
|
7611
7653
|
};
|
|
7612
7654
|
|
|
7655
|
+
class ProgressiveResponse {
|
|
7656
|
+
constructor(responseBodyHandler, { status = 200, statusText, headers } = {}) {
|
|
7657
|
+
const contentType = headers ? headers["content-type"] : "text/plain";
|
|
7658
|
+
const progressiveResponse = {
|
|
7659
|
+
status,
|
|
7660
|
+
statusText,
|
|
7661
|
+
headers,
|
|
7662
|
+
body: createObservable(({ next, complete, addTeardown }) => {
|
|
7663
|
+
// we must write something for fetch promise to resolve
|
|
7664
|
+
// this is conform to HTTP spec where client expect body to starts writing
|
|
7665
|
+
// before resolving response promise client side
|
|
7666
|
+
if (CONTENT_TYPE.isTextual(contentType)) {
|
|
7667
|
+
next("");
|
|
7668
|
+
} else {
|
|
7669
|
+
next(new Uint8Array());
|
|
7670
|
+
}
|
|
7671
|
+
const returnValue = responseBodyHandler({
|
|
7672
|
+
write: (data) => {
|
|
7673
|
+
next(data);
|
|
7674
|
+
},
|
|
7675
|
+
end: () => {
|
|
7676
|
+
complete();
|
|
7677
|
+
},
|
|
7678
|
+
});
|
|
7679
|
+
if (typeof returnValue === "function") {
|
|
7680
|
+
addTeardown(() => {
|
|
7681
|
+
returnValue();
|
|
7682
|
+
});
|
|
7683
|
+
}
|
|
7684
|
+
}),
|
|
7685
|
+
};
|
|
7686
|
+
// eslint-disable-next-line no-constructor-return
|
|
7687
|
+
return progressiveResponse;
|
|
7688
|
+
}
|
|
7689
|
+
}
|
|
7690
|
+
|
|
7691
|
+
/**
|
|
7692
|
+
* @jsenv/server is already registering a route to handle OPTIONS request
|
|
7693
|
+
* so here we just need to add the CORS headers to the response
|
|
7694
|
+
*/
|
|
7695
|
+
|
|
7696
|
+
const jsenvAccessControlAllowedHeaders = ["x-requested-with"];
|
|
7697
|
+
|
|
7698
|
+
const jsenvAccessControlAllowedMethods = [
|
|
7699
|
+
"GET",
|
|
7700
|
+
"POST",
|
|
7701
|
+
"PUT",
|
|
7702
|
+
"DELETE",
|
|
7703
|
+
"OPTIONS",
|
|
7704
|
+
];
|
|
7705
|
+
|
|
7706
|
+
const jsenvServiceCORS = ({
|
|
7707
|
+
accessControlAllowedOrigins = [],
|
|
7708
|
+
accessControlAllowedMethods = jsenvAccessControlAllowedMethods,
|
|
7709
|
+
accessControlAllowedHeaders = jsenvAccessControlAllowedHeaders,
|
|
7710
|
+
accessControlAllowRequestOrigin = false,
|
|
7711
|
+
accessControlAllowRequestMethod = false,
|
|
7712
|
+
accessControlAllowRequestHeaders = false,
|
|
7713
|
+
accessControlAllowCredentials = false,
|
|
7714
|
+
// by default OPTIONS request can be cache for a long time, it's not going to change soon ?
|
|
7715
|
+
// we could put a lot here, see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Max-Age
|
|
7716
|
+
accessControlMaxAge = 600,
|
|
7717
|
+
timingAllowOrigin = false,
|
|
7718
|
+
} = {}) => {
|
|
7719
|
+
// TODO: we should check access control params and throw/warn if we find strange values
|
|
7720
|
+
|
|
7721
|
+
const corsEnabled =
|
|
7722
|
+
accessControlAllowRequestOrigin || accessControlAllowedOrigins.length;
|
|
7723
|
+
|
|
7724
|
+
if (!corsEnabled) {
|
|
7725
|
+
return [];
|
|
7726
|
+
}
|
|
7727
|
+
|
|
7728
|
+
return {
|
|
7729
|
+
name: "jsenv:cors",
|
|
7730
|
+
injectResponseProperties: (request) => {
|
|
7731
|
+
const accessControlHeaders = generateAccessControlHeaders({
|
|
7732
|
+
request,
|
|
7733
|
+
accessControlAllowedOrigins,
|
|
7734
|
+
accessControlAllowRequestOrigin,
|
|
7735
|
+
accessControlAllowedMethods,
|
|
7736
|
+
accessControlAllowRequestMethod,
|
|
7737
|
+
accessControlAllowedHeaders,
|
|
7738
|
+
accessControlAllowRequestHeaders,
|
|
7739
|
+
accessControlAllowCredentials,
|
|
7740
|
+
accessControlMaxAge,
|
|
7741
|
+
timingAllowOrigin,
|
|
7742
|
+
});
|
|
7743
|
+
return {
|
|
7744
|
+
headers: accessControlHeaders,
|
|
7745
|
+
};
|
|
7746
|
+
},
|
|
7747
|
+
};
|
|
7748
|
+
};
|
|
7749
|
+
|
|
7750
|
+
// https://www.w3.org/TR/cors/
|
|
7751
|
+
// https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
|
|
7752
|
+
const generateAccessControlHeaders = ({
|
|
7753
|
+
request: { headers },
|
|
7754
|
+
accessControlAllowedOrigins,
|
|
7755
|
+
accessControlAllowRequestOrigin,
|
|
7756
|
+
accessControlAllowedMethods,
|
|
7757
|
+
accessControlAllowRequestMethod,
|
|
7758
|
+
accessControlAllowedHeaders,
|
|
7759
|
+
accessControlAllowRequestHeaders,
|
|
7760
|
+
accessControlAllowCredentials,
|
|
7761
|
+
// by default OPTIONS request can be cache for a long time, it's not going to change soon ?
|
|
7762
|
+
// we could put a lot here, see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Max-Age
|
|
7763
|
+
accessControlMaxAge = 600,
|
|
7764
|
+
timingAllowOrigin,
|
|
7765
|
+
} = {}) => {
|
|
7766
|
+
const vary = [];
|
|
7767
|
+
|
|
7768
|
+
const allowedOriginArray = [...accessControlAllowedOrigins];
|
|
7769
|
+
if (accessControlAllowRequestOrigin) {
|
|
7770
|
+
if ("origin" in headers && headers.origin !== "null") {
|
|
7771
|
+
allowedOriginArray.push(headers.origin);
|
|
7772
|
+
vary.push("origin");
|
|
7773
|
+
} else if ("referer" in headers) {
|
|
7774
|
+
allowedOriginArray.push(new URL(headers.referer).origin);
|
|
7775
|
+
vary.push("referer");
|
|
7776
|
+
} else {
|
|
7777
|
+
allowedOriginArray.push("*");
|
|
7778
|
+
}
|
|
7779
|
+
}
|
|
7780
|
+
|
|
7781
|
+
const allowedMethodArray = [...accessControlAllowedMethods];
|
|
7782
|
+
if (
|
|
7783
|
+
accessControlAllowRequestMethod &&
|
|
7784
|
+
"access-control-request-method" in headers
|
|
7785
|
+
) {
|
|
7786
|
+
const requestMethodName = headers["access-control-request-method"];
|
|
7787
|
+
if (!allowedMethodArray.includes(requestMethodName)) {
|
|
7788
|
+
allowedMethodArray.push(requestMethodName);
|
|
7789
|
+
vary.push("access-control-request-method");
|
|
7790
|
+
}
|
|
7791
|
+
}
|
|
7792
|
+
|
|
7793
|
+
const allowedHeaderArray = [...accessControlAllowedHeaders];
|
|
7794
|
+
if (
|
|
7795
|
+
accessControlAllowRequestHeaders &&
|
|
7796
|
+
"access-control-request-headers" in headers
|
|
7797
|
+
) {
|
|
7798
|
+
const requestHeaderNameArray =
|
|
7799
|
+
headers["access-control-request-headers"].split(", ");
|
|
7800
|
+
requestHeaderNameArray.forEach((headerName) => {
|
|
7801
|
+
const headerNameLowerCase = headerName.toLowerCase();
|
|
7802
|
+
if (!allowedHeaderArray.includes(headerNameLowerCase)) {
|
|
7803
|
+
allowedHeaderArray.push(headerNameLowerCase);
|
|
7804
|
+
if (!vary.includes("access-control-request-headers")) {
|
|
7805
|
+
vary.push("access-control-request-headers");
|
|
7806
|
+
}
|
|
7807
|
+
}
|
|
7808
|
+
});
|
|
7809
|
+
}
|
|
7810
|
+
|
|
7811
|
+
return {
|
|
7812
|
+
"access-control-allow-origin": allowedOriginArray.join(", "),
|
|
7813
|
+
"access-control-allow-methods": allowedMethodArray.join(", "),
|
|
7814
|
+
"access-control-allow-headers": allowedHeaderArray.join(", "),
|
|
7815
|
+
...(accessControlAllowCredentials
|
|
7816
|
+
? { "access-control-allow-credentials": true }
|
|
7817
|
+
: {}),
|
|
7818
|
+
"access-control-max-age": accessControlMaxAge,
|
|
7819
|
+
...(timingAllowOrigin
|
|
7820
|
+
? { "timing-allow-origin": allowedOriginArray.join(", ") }
|
|
7821
|
+
: {}),
|
|
7822
|
+
...(vary.length ? { vary: vary.join(", ") } : {}),
|
|
7823
|
+
};
|
|
7824
|
+
};
|
|
7825
|
+
|
|
7826
|
+
const ETAG_FOR_EMPTY_CONTENT = '"0-2jmj7l5rSw0yVb/vlWAYkK/YBwk"';
|
|
7827
|
+
|
|
7828
|
+
const bufferToEtag = (buffer) => {
|
|
7829
|
+
if (!Buffer.isBuffer(buffer)) {
|
|
7830
|
+
throw new TypeError(`buffer expect,got ${buffer}`);
|
|
7831
|
+
}
|
|
7832
|
+
|
|
7833
|
+
if (buffer.length === 0) {
|
|
7834
|
+
return ETAG_FOR_EMPTY_CONTENT;
|
|
7835
|
+
}
|
|
7836
|
+
|
|
7837
|
+
const hash = createHash("sha1");
|
|
7838
|
+
hash.update(buffer, "utf8");
|
|
7839
|
+
|
|
7840
|
+
const hashBase64String = hash.digest("base64");
|
|
7841
|
+
const hashBase64StringSubset = hashBase64String.slice(0, 27);
|
|
7842
|
+
const length = buffer.length;
|
|
7843
|
+
|
|
7844
|
+
return `"${length.toString(16)}-${hashBase64StringSubset}"`;
|
|
7845
|
+
};
|
|
7846
|
+
|
|
7613
7847
|
const convertFileSystemErrorToResponseProperties = (error) => {
|
|
7614
7848
|
// https://iojs.org/api/errors.html#errors_eacces_permission_denied
|
|
7615
7849
|
if (isErrorWithCode(error, "EACCES")) {
|
|
@@ -7664,27 +7898,6 @@ const isErrorWithCode = (error, code) => {
|
|
|
7664
7898
|
return typeof error === "object" && error.code === code;
|
|
7665
7899
|
};
|
|
7666
7900
|
|
|
7667
|
-
const ETAG_FOR_EMPTY_CONTENT = '"0-2jmj7l5rSw0yVb/vlWAYkK/YBwk"';
|
|
7668
|
-
|
|
7669
|
-
const bufferToEtag = (buffer) => {
|
|
7670
|
-
if (!Buffer.isBuffer(buffer)) {
|
|
7671
|
-
throw new TypeError(`buffer expect,got ${buffer}`);
|
|
7672
|
-
}
|
|
7673
|
-
|
|
7674
|
-
if (buffer.length === 0) {
|
|
7675
|
-
return ETAG_FOR_EMPTY_CONTENT;
|
|
7676
|
-
}
|
|
7677
|
-
|
|
7678
|
-
const hash = createHash("sha1");
|
|
7679
|
-
hash.update(buffer, "utf8");
|
|
7680
|
-
|
|
7681
|
-
const hashBase64String = hash.digest("base64");
|
|
7682
|
-
const hashBase64StringSubset = hashBase64String.slice(0, 27);
|
|
7683
|
-
const length = buffer.length;
|
|
7684
|
-
|
|
7685
|
-
return `"${length.toString(16)}-${hashBase64StringSubset}"`;
|
|
7686
|
-
};
|
|
7687
|
-
|
|
7688
7901
|
const isFileSystemPath = (value) => {
|
|
7689
7902
|
if (typeof value !== "string") {
|
|
7690
7903
|
throw new TypeError(
|
|
@@ -8223,176 +8436,45 @@ const asUrlString = (value) => {
|
|
|
8223
8436
|
return null;
|
|
8224
8437
|
};
|
|
8225
8438
|
|
|
8226
|
-
|
|
8227
|
-
constructor(responseBodyHandler, { status = 200, statusText, headers } = {}) {
|
|
8228
|
-
const contentType = headers ? headers["content-type"] : "text/plain";
|
|
8229
|
-
const progressiveResponse = {
|
|
8230
|
-
status,
|
|
8231
|
-
statusText,
|
|
8232
|
-
headers,
|
|
8233
|
-
body: createObservable(({ next, complete, addTeardown }) => {
|
|
8234
|
-
// we must write something for fetch promise to resolve
|
|
8235
|
-
// this is conform to HTTP spec where client expect body to starts writing
|
|
8236
|
-
// before resolving response promise client side
|
|
8237
|
-
if (CONTENT_TYPE.isTextual(contentType)) {
|
|
8238
|
-
next("");
|
|
8239
|
-
} else {
|
|
8240
|
-
next(new Uint8Array());
|
|
8241
|
-
}
|
|
8242
|
-
const returnValue = responseBodyHandler({
|
|
8243
|
-
write: (data) => {
|
|
8244
|
-
next(data);
|
|
8245
|
-
},
|
|
8246
|
-
end: () => {
|
|
8247
|
-
complete();
|
|
8248
|
-
},
|
|
8249
|
-
});
|
|
8250
|
-
if (typeof returnValue === "function") {
|
|
8251
|
-
addTeardown(() => {
|
|
8252
|
-
returnValue();
|
|
8253
|
-
});
|
|
8254
|
-
}
|
|
8255
|
-
}),
|
|
8256
|
-
};
|
|
8257
|
-
// eslint-disable-next-line no-constructor-return
|
|
8258
|
-
return progressiveResponse;
|
|
8259
|
-
}
|
|
8260
|
-
}
|
|
8261
|
-
|
|
8262
|
-
/**
|
|
8263
|
-
* @jsenv/server is already registering a route to handle OPTIONS request
|
|
8264
|
-
* so here we just need to add the CORS headers to the response
|
|
8265
|
-
*/
|
|
8266
|
-
|
|
8267
|
-
const jsenvAccessControlAllowedHeaders = ["x-requested-with"];
|
|
8268
|
-
|
|
8269
|
-
const jsenvAccessControlAllowedMethods = [
|
|
8270
|
-
"GET",
|
|
8271
|
-
"POST",
|
|
8272
|
-
"PUT",
|
|
8273
|
-
"DELETE",
|
|
8274
|
-
"OPTIONS",
|
|
8275
|
-
];
|
|
8276
|
-
|
|
8277
|
-
const jsenvServiceCORS = ({
|
|
8278
|
-
accessControlAllowedOrigins = [],
|
|
8279
|
-
accessControlAllowedMethods = jsenvAccessControlAllowedMethods,
|
|
8280
|
-
accessControlAllowedHeaders = jsenvAccessControlAllowedHeaders,
|
|
8281
|
-
accessControlAllowRequestOrigin = false,
|
|
8282
|
-
accessControlAllowRequestMethod = false,
|
|
8283
|
-
accessControlAllowRequestHeaders = false,
|
|
8284
|
-
accessControlAllowCredentials = false,
|
|
8285
|
-
// by default OPTIONS request can be cache for a long time, it's not going to change soon ?
|
|
8286
|
-
// we could put a lot here, see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Max-Age
|
|
8287
|
-
accessControlMaxAge = 600,
|
|
8288
|
-
timingAllowOrigin = false,
|
|
8289
|
-
} = {}) => {
|
|
8290
|
-
// TODO: we should check access control params and throw/warn if we find strange values
|
|
8291
|
-
|
|
8292
|
-
const corsEnabled =
|
|
8293
|
-
accessControlAllowRequestOrigin || accessControlAllowedOrigins.length;
|
|
8294
|
-
|
|
8295
|
-
if (!corsEnabled) {
|
|
8296
|
-
return [];
|
|
8297
|
-
}
|
|
8298
|
-
|
|
8299
|
-
return {
|
|
8300
|
-
name: "jsenv:cors",
|
|
8301
|
-
injectResponseProperties: (request) => {
|
|
8302
|
-
const accessControlHeaders = generateAccessControlHeaders({
|
|
8303
|
-
request,
|
|
8304
|
-
accessControlAllowedOrigins,
|
|
8305
|
-
accessControlAllowRequestOrigin,
|
|
8306
|
-
accessControlAllowedMethods,
|
|
8307
|
-
accessControlAllowRequestMethod,
|
|
8308
|
-
accessControlAllowedHeaders,
|
|
8309
|
-
accessControlAllowRequestHeaders,
|
|
8310
|
-
accessControlAllowCredentials,
|
|
8311
|
-
accessControlMaxAge,
|
|
8312
|
-
timingAllowOrigin,
|
|
8313
|
-
});
|
|
8314
|
-
return {
|
|
8315
|
-
headers: accessControlHeaders,
|
|
8316
|
-
};
|
|
8317
|
-
},
|
|
8318
|
-
};
|
|
8319
|
-
};
|
|
8320
|
-
|
|
8321
|
-
// https://www.w3.org/TR/cors/
|
|
8322
|
-
// https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
|
|
8323
|
-
const generateAccessControlHeaders = ({
|
|
8324
|
-
request: { headers },
|
|
8325
|
-
accessControlAllowedOrigins,
|
|
8326
|
-
accessControlAllowRequestOrigin,
|
|
8327
|
-
accessControlAllowedMethods,
|
|
8328
|
-
accessControlAllowRequestMethod,
|
|
8329
|
-
accessControlAllowedHeaders,
|
|
8330
|
-
accessControlAllowRequestHeaders,
|
|
8331
|
-
accessControlAllowCredentials,
|
|
8332
|
-
// by default OPTIONS request can be cache for a long time, it's not going to change soon ?
|
|
8333
|
-
// we could put a lot here, see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Max-Age
|
|
8334
|
-
accessControlMaxAge = 600,
|
|
8335
|
-
timingAllowOrigin,
|
|
8336
|
-
} = {}) => {
|
|
8337
|
-
const vary = [];
|
|
8338
|
-
|
|
8339
|
-
const allowedOriginArray = [...accessControlAllowedOrigins];
|
|
8340
|
-
if (accessControlAllowRequestOrigin) {
|
|
8341
|
-
if ("origin" in headers && headers.origin !== "null") {
|
|
8342
|
-
allowedOriginArray.push(headers.origin);
|
|
8343
|
-
vary.push("origin");
|
|
8344
|
-
} else if ("referer" in headers) {
|
|
8345
|
-
allowedOriginArray.push(new URL(headers.referer).origin);
|
|
8346
|
-
vary.push("referer");
|
|
8347
|
-
} else {
|
|
8348
|
-
allowedOriginArray.push("*");
|
|
8349
|
-
}
|
|
8350
|
-
}
|
|
8351
|
-
|
|
8352
|
-
const allowedMethodArray = [...accessControlAllowedMethods];
|
|
8353
|
-
if (
|
|
8354
|
-
accessControlAllowRequestMethod &&
|
|
8355
|
-
"access-control-request-method" in headers
|
|
8356
|
-
) {
|
|
8357
|
-
const requestMethodName = headers["access-control-request-method"];
|
|
8358
|
-
if (!allowedMethodArray.includes(requestMethodName)) {
|
|
8359
|
-
allowedMethodArray.push(requestMethodName);
|
|
8360
|
-
vary.push("access-control-request-method");
|
|
8361
|
-
}
|
|
8362
|
-
}
|
|
8363
|
-
|
|
8364
|
-
const allowedHeaderArray = [...accessControlAllowedHeaders];
|
|
8365
|
-
if (
|
|
8366
|
-
accessControlAllowRequestHeaders &&
|
|
8367
|
-
"access-control-request-headers" in headers
|
|
8368
|
-
) {
|
|
8369
|
-
const requestHeaderNameArray =
|
|
8370
|
-
headers["access-control-request-headers"].split(", ");
|
|
8371
|
-
requestHeaderNameArray.forEach((headerName) => {
|
|
8372
|
-
const headerNameLowerCase = headerName.toLowerCase();
|
|
8373
|
-
if (!allowedHeaderArray.includes(headerNameLowerCase)) {
|
|
8374
|
-
allowedHeaderArray.push(headerNameLowerCase);
|
|
8375
|
-
if (!vary.includes("access-control-request-headers")) {
|
|
8376
|
-
vary.push("access-control-request-headers");
|
|
8377
|
-
}
|
|
8378
|
-
}
|
|
8379
|
-
});
|
|
8380
|
-
}
|
|
8381
|
-
|
|
8439
|
+
const jsenvServiceStaticFiles = ({ directoryUrl, mainFilePath }) => {
|
|
8382
8440
|
return {
|
|
8383
|
-
|
|
8384
|
-
|
|
8385
|
-
|
|
8386
|
-
|
|
8387
|
-
|
|
8388
|
-
|
|
8389
|
-
|
|
8390
|
-
|
|
8391
|
-
|
|
8392
|
-
|
|
8393
|
-
|
|
8441
|
+
name: "jsenv:file_service",
|
|
8442
|
+
routes: [
|
|
8443
|
+
{
|
|
8444
|
+
endpoint: "GET *",
|
|
8445
|
+
description: "Serve static files.",
|
|
8446
|
+
fetch: (request, helpers) => {
|
|
8447
|
+
const urlIsVersioned = new URL(request.url).searchParams.has("v");
|
|
8448
|
+
if (mainFilePath && request.resource === "/") {
|
|
8449
|
+
request = {
|
|
8450
|
+
...request,
|
|
8451
|
+
resource: `/${mainFilePath}`,
|
|
8452
|
+
};
|
|
8453
|
+
}
|
|
8454
|
+
const urlObject = new URL(request.resource.slice(1), directoryUrl);
|
|
8455
|
+
return createFileSystemFetch(directoryUrl, {
|
|
8456
|
+
cacheControl: urlIsVersioned
|
|
8457
|
+
? `private,max-age=${SECONDS_IN_30_DAYS},immutable`
|
|
8458
|
+
: "private,max-age=0,must-revalidate",
|
|
8459
|
+
etagEnabled: true,
|
|
8460
|
+
compressionEnabled: true,
|
|
8461
|
+
canReadDirectory: true,
|
|
8462
|
+
ENOENTFallback: () => {
|
|
8463
|
+
if (
|
|
8464
|
+
!urlToExtension(urlObject) &&
|
|
8465
|
+
!urlToPathname(urlObject).endsWith("/")
|
|
8466
|
+
) {
|
|
8467
|
+
return new URL(mainFilePath, directoryUrl);
|
|
8468
|
+
}
|
|
8469
|
+
return null;
|
|
8470
|
+
},
|
|
8471
|
+
})(request, helpers);
|
|
8472
|
+
},
|
|
8473
|
+
},
|
|
8474
|
+
],
|
|
8394
8475
|
};
|
|
8395
8476
|
};
|
|
8477
|
+
const SECONDS_IN_30_DAYS = 60 * 60 * 24 * 30;
|
|
8396
8478
|
|
|
8397
8479
|
const jsenvServiceResponseAcceptanceCheck = () => {
|
|
8398
8480
|
return {
|
|
@@ -8483,4 +8565,4 @@ const replaceResource = (resourceBeforeAlias, newValue) => {
|
|
|
8483
8565
|
return resource;
|
|
8484
8566
|
};
|
|
8485
8567
|
|
|
8486
|
-
export { LazyServerEvents, ProgressiveResponse, STOP_REASON_INTERNAL_ERROR, STOP_REASON_NOT_SPECIFIED, STOP_REASON_PROCESS_BEFORE_EXIT, STOP_REASON_PROCESS_EXIT, STOP_REASON_PROCESS_SIGHUP, STOP_REASON_PROCESS_SIGINT, STOP_REASON_PROCESS_SIGTERM, ServerEvents, WebSocketResponse, composeTwoResponses, createFileSystemFetch, fetchFileSystem, findFreePort, jsenvAccessControlAllowedHeaders, jsenvAccessControlAllowedMethods, jsenvServiceCORS, jsenvServiceErrorHandler, jsenvServiceRequestAliases, jsenvServiceResponseAcceptanceCheck, pickContentEncoding, pickContentLanguage, pickContentType, serveDirectory, startServer };
|
|
8568
|
+
export { LazyServerEvents, ProgressiveResponse, STOP_REASON_INTERNAL_ERROR, STOP_REASON_NOT_SPECIFIED, STOP_REASON_PROCESS_BEFORE_EXIT, STOP_REASON_PROCESS_EXIT, STOP_REASON_PROCESS_SIGHUP, STOP_REASON_PROCESS_SIGINT, STOP_REASON_PROCESS_SIGTERM, ServerEvents, WebSocketResponse, composeTwoResponses, createFileSystemFetch, fetchFileSystem, findFreePort, jsenvAccessControlAllowedHeaders, jsenvAccessControlAllowedMethods, jsenvServiceCORS, jsenvServiceErrorHandler, jsenvServiceRequestAliases, jsenvServiceResponseAcceptanceCheck, jsenvServiceStaticFiles, pickContentEncoding, pickContentLanguage, pickContentType, serveDirectory, startServer };
|
package/dist/ws/ws.js
CHANGED
|
@@ -243,11 +243,11 @@ function requireLimiter () {
|
|
|
243
243
|
return limiter;
|
|
244
244
|
}
|
|
245
245
|
|
|
246
|
-
var permessageDeflate;
|
|
246
|
+
var permessageDeflate$1;
|
|
247
247
|
var hasRequiredPermessageDeflate;
|
|
248
248
|
|
|
249
249
|
function requirePermessageDeflate () {
|
|
250
|
-
if (hasRequiredPermessageDeflate) return permessageDeflate;
|
|
250
|
+
if (hasRequiredPermessageDeflate) return permessageDeflate$1;
|
|
251
251
|
hasRequiredPermessageDeflate = 1;
|
|
252
252
|
|
|
253
253
|
const zlib = require$$0;
|
|
@@ -287,6 +287,9 @@ function requirePermessageDeflate () {
|
|
|
287
287
|
* acknowledge disabling of client context takeover
|
|
288
288
|
* @param {Number} [options.concurrencyLimit=10] The number of concurrent
|
|
289
289
|
* calls to zlib
|
|
290
|
+
* @param {Boolean} [options.isServer=false] Create the instance in either
|
|
291
|
+
* server or client mode
|
|
292
|
+
* @param {Number} [options.maxPayload=0] The maximum allowed message length
|
|
290
293
|
* @param {(Boolean|Number)} [options.serverMaxWindowBits] Request/confirm the
|
|
291
294
|
* use of a custom server window size
|
|
292
295
|
* @param {Boolean} [options.serverNoContextTakeover=false] Request/accept
|
|
@@ -297,16 +300,13 @@ function requirePermessageDeflate () {
|
|
|
297
300
|
* deflate
|
|
298
301
|
* @param {Object} [options.zlibInflateOptions] Options to pass to zlib on
|
|
299
302
|
* inflate
|
|
300
|
-
* @param {Boolean} [isServer=false] Create the instance in either server or
|
|
301
|
-
* client mode
|
|
302
|
-
* @param {Number} [maxPayload=0] The maximum allowed message length
|
|
303
303
|
*/
|
|
304
|
-
constructor(options
|
|
305
|
-
this._maxPayload = maxPayload | 0;
|
|
304
|
+
constructor(options) {
|
|
306
305
|
this._options = options || {};
|
|
307
306
|
this._threshold =
|
|
308
307
|
this._options.threshold !== undefined ? this._options.threshold : 1024;
|
|
309
|
-
this.
|
|
308
|
+
this._maxPayload = this._options.maxPayload | 0;
|
|
309
|
+
this._isServer = !!this._options.isServer;
|
|
310
310
|
this._deflate = null;
|
|
311
311
|
this._inflate = null;
|
|
312
312
|
|
|
@@ -710,7 +710,7 @@ function requirePermessageDeflate () {
|
|
|
710
710
|
}
|
|
711
711
|
}
|
|
712
712
|
|
|
713
|
-
permessageDeflate = PerMessageDeflate;
|
|
713
|
+
permessageDeflate$1 = PerMessageDeflate;
|
|
714
714
|
|
|
715
715
|
/**
|
|
716
716
|
* The listener of the `zlib.DeflateRaw` stream `'data'` event.
|
|
@@ -776,7 +776,7 @@ function requirePermessageDeflate () {
|
|
|
776
776
|
err[kStatusCode] = 1007;
|
|
777
777
|
this[kCallback](err);
|
|
778
778
|
}
|
|
779
|
-
return permessageDeflate;
|
|
779
|
+
return permessageDeflate$1;
|
|
780
780
|
}
|
|
781
781
|
|
|
782
782
|
var validation = {exports: {}};
|
|
@@ -2564,11 +2564,11 @@ function requireEventTarget () {
|
|
|
2564
2564
|
return eventTarget;
|
|
2565
2565
|
}
|
|
2566
2566
|
|
|
2567
|
-
var extension;
|
|
2567
|
+
var extension$1;
|
|
2568
2568
|
var hasRequiredExtension;
|
|
2569
2569
|
|
|
2570
2570
|
function requireExtension () {
|
|
2571
|
-
if (hasRequiredExtension) return extension;
|
|
2571
|
+
if (hasRequiredExtension) return extension$1;
|
|
2572
2572
|
hasRequiredExtension = 1;
|
|
2573
2573
|
|
|
2574
2574
|
const { tokenChars } = requireValidation();
|
|
@@ -2771,8 +2771,8 @@ function requireExtension () {
|
|
|
2771
2771
|
.join(', ');
|
|
2772
2772
|
}
|
|
2773
2773
|
|
|
2774
|
-
extension = { format, parse };
|
|
2775
|
-
return extension;
|
|
2774
|
+
extension$1 = { format, parse };
|
|
2775
|
+
return extension$1;
|
|
2776
2776
|
}
|
|
2777
2777
|
|
|
2778
2778
|
/* eslint no-unused-vars: ["error", { "varsIgnorePattern": "^Duplex|Readable$", "caughtErrors": "none" }] */
|
|
@@ -3475,7 +3475,7 @@ function requireWebsocket () {
|
|
|
3475
3475
|
} else {
|
|
3476
3476
|
try {
|
|
3477
3477
|
parsedUrl = new URL(address);
|
|
3478
|
-
} catch
|
|
3478
|
+
} catch {
|
|
3479
3479
|
throw new SyntaxError(`Invalid URL: ${address}`);
|
|
3480
3480
|
}
|
|
3481
3481
|
}
|
|
@@ -3537,11 +3537,11 @@ function requireWebsocket () {
|
|
|
3537
3537
|
opts.timeout = opts.handshakeTimeout;
|
|
3538
3538
|
|
|
3539
3539
|
if (opts.perMessageDeflate) {
|
|
3540
|
-
perMessageDeflate = new PerMessageDeflate(
|
|
3541
|
-
opts.perMessageDeflate
|
|
3542
|
-
false,
|
|
3543
|
-
opts.maxPayload
|
|
3544
|
-
);
|
|
3540
|
+
perMessageDeflate = new PerMessageDeflate({
|
|
3541
|
+
...opts.perMessageDeflate,
|
|
3542
|
+
isServer: false,
|
|
3543
|
+
maxPayload: opts.maxPayload
|
|
3544
|
+
});
|
|
3545
3545
|
opts.headers['Sec-WebSocket-Extensions'] = format({
|
|
3546
3546
|
[PerMessageDeflate.extensionName]: perMessageDeflate.offer()
|
|
3547
3547
|
});
|
|
@@ -4348,17 +4348,19 @@ function requireStream () {
|
|
|
4348
4348
|
|
|
4349
4349
|
requireStream();
|
|
4350
4350
|
|
|
4351
|
+
requireExtension();
|
|
4352
|
+
|
|
4353
|
+
requirePermessageDeflate();
|
|
4354
|
+
|
|
4351
4355
|
requireReceiver();
|
|
4352
4356
|
|
|
4353
4357
|
requireSender();
|
|
4354
4358
|
|
|
4355
|
-
|
|
4356
|
-
|
|
4357
|
-
var subprotocol;
|
|
4359
|
+
var subprotocol$1;
|
|
4358
4360
|
var hasRequiredSubprotocol;
|
|
4359
4361
|
|
|
4360
4362
|
function requireSubprotocol () {
|
|
4361
|
-
if (hasRequiredSubprotocol) return subprotocol;
|
|
4363
|
+
if (hasRequiredSubprotocol) return subprotocol$1;
|
|
4362
4364
|
hasRequiredSubprotocol = 1;
|
|
4363
4365
|
|
|
4364
4366
|
const { tokenChars } = requireValidation();
|
|
@@ -4420,10 +4422,14 @@ function requireSubprotocol () {
|
|
|
4420
4422
|
return protocols;
|
|
4421
4423
|
}
|
|
4422
4424
|
|
|
4423
|
-
subprotocol = { parse };
|
|
4424
|
-
return subprotocol;
|
|
4425
|
+
subprotocol$1 = { parse };
|
|
4426
|
+
return subprotocol$1;
|
|
4425
4427
|
}
|
|
4426
4428
|
|
|
4429
|
+
requireSubprotocol();
|
|
4430
|
+
|
|
4431
|
+
requireWebsocket();
|
|
4432
|
+
|
|
4427
4433
|
/* eslint no-unused-vars: ["error", { "varsIgnorePattern": "^Duplex$", "caughtErrors": "none" }] */
|
|
4428
4434
|
|
|
4429
4435
|
var websocketServer$1;
|
|
@@ -4724,11 +4730,11 @@ function requireWebsocketServer () {
|
|
|
4724
4730
|
this.options.perMessageDeflate &&
|
|
4725
4731
|
secWebSocketExtensions !== undefined
|
|
4726
4732
|
) {
|
|
4727
|
-
const perMessageDeflate = new PerMessageDeflate(
|
|
4728
|
-
this.options.perMessageDeflate,
|
|
4729
|
-
true,
|
|
4730
|
-
this.options.maxPayload
|
|
4731
|
-
);
|
|
4733
|
+
const perMessageDeflate = new PerMessageDeflate({
|
|
4734
|
+
...this.options.perMessageDeflate,
|
|
4735
|
+
isServer: true,
|
|
4736
|
+
maxPayload: this.options.maxPayload
|
|
4737
|
+
});
|
|
4732
4738
|
|
|
4733
4739
|
try {
|
|
4734
4740
|
const offers = extension.parse(secWebSocketExtensions);
|
package/index.js
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This file is the first file executed by code using the package
|
|
3
|
+
* Its responsability is to export what is documented
|
|
4
|
+
* Ideally this file should be kept simple to help discovering codebase progressively.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
// tslint:disable:ordered-imports
|
|
8
|
+
|
|
9
|
+
export { startServer } from "./src/start_server.js";
|
|
10
|
+
|
|
11
|
+
export {
|
|
12
|
+
STOP_REASON_INTERNAL_ERROR,
|
|
13
|
+
STOP_REASON_PROCESS_SIGHUP,
|
|
14
|
+
STOP_REASON_PROCESS_SIGTERM,
|
|
15
|
+
STOP_REASON_PROCESS_SIGINT,
|
|
16
|
+
STOP_REASON_PROCESS_BEFORE_EXIT,
|
|
17
|
+
STOP_REASON_PROCESS_EXIT,
|
|
18
|
+
STOP_REASON_NOT_SPECIFIED,
|
|
19
|
+
} from "./src/stopReasons.js";
|
|
20
|
+
export { jsenvServiceErrorHandler } from "./src/services/error_handler/jsenv_service_error_handler.js";
|
|
21
|
+
|
|
22
|
+
// webSocket
|
|
23
|
+
export { WebSocketResponse } from "./src/web_socket_response.js";
|
|
24
|
+
// long polling
|
|
25
|
+
export { ProgressiveResponse } from "./src/progressive_response.js";
|
|
26
|
+
// Server event (can be used to push events to clients that can be connected with WebSocket or EventSource)
|
|
27
|
+
export { ServerEvents, LazyServerEvents } from "./src/server_events.js";
|
|
28
|
+
|
|
29
|
+
// CORS
|
|
30
|
+
export {
|
|
31
|
+
jsenvServiceCORS,
|
|
32
|
+
jsenvAccessControlAllowedHeaders,
|
|
33
|
+
jsenvAccessControlAllowedMethods,
|
|
34
|
+
} from "./src/services/cors/jsenv_service_cors.js";
|
|
35
|
+
|
|
36
|
+
// filesystem
|
|
37
|
+
export {
|
|
38
|
+
createFileSystemFetch,
|
|
39
|
+
fetchFileSystem,
|
|
40
|
+
} from "./src/services/filesystem/fetch_filesystem.js";
|
|
41
|
+
export { serveDirectory } from "./src/services/filesystem/serve_directory.js";
|
|
42
|
+
export { jsenvServiceStaticFiles } from "./src/services/filesystem/jsenv_service_static_files.js";
|
|
43
|
+
|
|
44
|
+
// content-negotiation
|
|
45
|
+
export { pickContentType } from "./src/content_negotiation/pick_content_type.js";
|
|
46
|
+
export { pickContentEncoding } from "./src/content_negotiation/pick_content_encoding.js";
|
|
47
|
+
export { pickContentLanguage } from "./src/content_negotiation/pick_content_language.js";
|
|
48
|
+
export { jsenvServiceResponseAcceptanceCheck } from "./src/services/response_acceptance_check/jsenv_service_response_acceptance_check.js";
|
|
49
|
+
|
|
50
|
+
// others
|
|
51
|
+
export { composeTwoResponses } from "./src/internal/response_composition.js";
|
|
52
|
+
export { jsenvServiceRequestAliases } from "./src/services/request_aliases/jsenv_service_request_aliases.js";
|
|
53
|
+
export { findFreePort } from "./src/internal/listen.js";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jsenv/server",
|
|
3
|
-
"version": "16.
|
|
3
|
+
"version": "16.4.0",
|
|
4
4
|
"description": "A modern Node.js HTTP server with declarative routing, content negotiation, and WebSocket support",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -19,23 +19,24 @@
|
|
|
19
19
|
"exports": {
|
|
20
20
|
".": {
|
|
21
21
|
"import": {
|
|
22
|
-
"dev:jsenv": "./
|
|
22
|
+
"dev:jsenv": "./index.js",
|
|
23
23
|
"default": "./dist/jsenv_server.js"
|
|
24
24
|
}
|
|
25
25
|
},
|
|
26
26
|
"./*": "./*"
|
|
27
27
|
},
|
|
28
|
-
"main": "./
|
|
28
|
+
"main": "./index.js",
|
|
29
29
|
"files": [
|
|
30
30
|
"/dist/",
|
|
31
|
-
"/src/"
|
|
31
|
+
"/src/",
|
|
32
|
+
"/index.js"
|
|
32
33
|
],
|
|
33
34
|
"scripts": {
|
|
34
35
|
"build": "node --experimental-import-meta-resolve ./scripts/build.mjs",
|
|
35
36
|
"prepublishOnly": "npm run build"
|
|
36
37
|
},
|
|
37
38
|
"dependencies": {
|
|
38
|
-
"launch-editor": "2.13.
|
|
39
|
+
"launch-editor": "2.13.2"
|
|
39
40
|
},
|
|
40
41
|
"devDependencies": {
|
|
41
42
|
"@jsenv/abort": "../../tooling/abort",
|
|
@@ -57,7 +58,7 @@
|
|
|
57
58
|
"formidable": "3.5.4",
|
|
58
59
|
"playwright": "1.58.1",
|
|
59
60
|
"undici": "7.24.2",
|
|
60
|
-
"ws": "8.
|
|
61
|
+
"ws": "8.20.0"
|
|
61
62
|
},
|
|
62
63
|
"engines": {
|
|
63
64
|
"node": ">=22.13.1"
|
|
@@ -6,14 +6,15 @@
|
|
|
6
6
|
|
|
7
7
|
import { CONTENT_TYPE } from "@jsenv/utils/src/content_type/content_type.js";
|
|
8
8
|
import { createReadStream, readFile, statSync } from "node:fs";
|
|
9
|
-
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
9
|
+
|
|
10
|
+
import { pickContentEncoding } from "../../content_negotiation/pick_content_encoding.js";
|
|
11
|
+
import { composeTwoResponses } from "../../internal/response_composition.js";
|
|
12
|
+
import { bufferToEtag } from "./etag.js";
|
|
13
|
+
import { convertFileSystemErrorToResponseProperties } from "./filesystem_error_to_response.js";
|
|
12
14
|
import {
|
|
13
15
|
fileSystemPathToUrl,
|
|
14
16
|
isFileSystemPath,
|
|
15
|
-
} from "
|
|
16
|
-
import { composeTwoResponses } from "../internal/response_composition.js";
|
|
17
|
+
} from "./filesystem_path_and_url.js";
|
|
17
18
|
import { serveDirectory } from "./serve_directory.js";
|
|
18
19
|
|
|
19
20
|
export const createFileSystemFetch = (directoryUrl, options) => {
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { urlToExtension, urlToPathname } from "@jsenv/urls";
|
|
2
|
+
|
|
3
|
+
import { createFileSystemFetch } from "./fetch_filesystem.js";
|
|
4
|
+
|
|
5
|
+
export const jsenvServiceStaticFiles = ({ directoryUrl, mainFilePath }) => {
|
|
6
|
+
return {
|
|
7
|
+
name: "jsenv:file_service",
|
|
8
|
+
routes: [
|
|
9
|
+
{
|
|
10
|
+
endpoint: "GET *",
|
|
11
|
+
description: "Serve static files.",
|
|
12
|
+
fetch: (request, helpers) => {
|
|
13
|
+
const urlIsVersioned = new URL(request.url).searchParams.has("v");
|
|
14
|
+
if (mainFilePath && request.resource === "/") {
|
|
15
|
+
request = {
|
|
16
|
+
...request,
|
|
17
|
+
resource: `/${mainFilePath}`,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
const urlObject = new URL(request.resource.slice(1), directoryUrl);
|
|
21
|
+
return createFileSystemFetch(directoryUrl, {
|
|
22
|
+
cacheControl: urlIsVersioned
|
|
23
|
+
? `private,max-age=${SECONDS_IN_30_DAYS},immutable`
|
|
24
|
+
: "private,max-age=0,must-revalidate",
|
|
25
|
+
etagEnabled: true,
|
|
26
|
+
compressionEnabled: true,
|
|
27
|
+
rootDirectoryUrl: directoryUrl,
|
|
28
|
+
canReadDirectory: true,
|
|
29
|
+
ENOENTFallback: () => {
|
|
30
|
+
if (
|
|
31
|
+
!urlToExtension(urlObject) &&
|
|
32
|
+
!urlToPathname(urlObject).endsWith("/")
|
|
33
|
+
) {
|
|
34
|
+
return new URL(mainFilePath, directoryUrl);
|
|
35
|
+
}
|
|
36
|
+
return null;
|
|
37
|
+
},
|
|
38
|
+
})(request, helpers);
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
],
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
const SECONDS_IN_30_DAYS = 60 * 60 * 24 * 30;
|
package/src/main.js
DELETED
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* This file is the first file executed by code using the package
|
|
3
|
-
* Its responsability is to export what is documented
|
|
4
|
-
* Ideally this file should be kept simple to help discovering codebase progressively.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
// tslint:disable:ordered-imports
|
|
8
|
-
|
|
9
|
-
export { startServer } from "./start_server.js";
|
|
10
|
-
|
|
11
|
-
export {
|
|
12
|
-
STOP_REASON_INTERNAL_ERROR,
|
|
13
|
-
STOP_REASON_PROCESS_SIGHUP,
|
|
14
|
-
STOP_REASON_PROCESS_SIGTERM,
|
|
15
|
-
STOP_REASON_PROCESS_SIGINT,
|
|
16
|
-
STOP_REASON_PROCESS_BEFORE_EXIT,
|
|
17
|
-
STOP_REASON_PROCESS_EXIT,
|
|
18
|
-
STOP_REASON_NOT_SPECIFIED,
|
|
19
|
-
} from "./stopReasons.js";
|
|
20
|
-
export { jsenvServiceErrorHandler } from "./services/error_handler/jsenv_service_error_handler.js";
|
|
21
|
-
|
|
22
|
-
// filesystem
|
|
23
|
-
export {
|
|
24
|
-
createFileSystemFetch,
|
|
25
|
-
fetchFileSystem,
|
|
26
|
-
} from "./filesystem/fetch_filesystem.js";
|
|
27
|
-
|
|
28
|
-
// webSocket
|
|
29
|
-
export { WebSocketResponse } from "./web_socket_response.js";
|
|
30
|
-
// long polling
|
|
31
|
-
export { ProgressiveResponse } from "./progressive_response.js";
|
|
32
|
-
// Server event (can be used to push events to clients that can be connected with WebSocket or EventSource)
|
|
33
|
-
export { ServerEvents, LazyServerEvents } from "./server_events.js";
|
|
34
|
-
|
|
35
|
-
// CORS
|
|
36
|
-
export {
|
|
37
|
-
jsenvServiceCORS,
|
|
38
|
-
jsenvAccessControlAllowedHeaders,
|
|
39
|
-
jsenvAccessControlAllowedMethods,
|
|
40
|
-
} from "./services/cors/jsenv_service_cors.js";
|
|
41
|
-
|
|
42
|
-
// content-negotiation
|
|
43
|
-
export { pickContentType } from "./content_negotiation/pick_content_type.js";
|
|
44
|
-
export { pickContentEncoding } from "./content_negotiation/pick_content_encoding.js";
|
|
45
|
-
export { pickContentLanguage } from "./content_negotiation/pick_content_language.js";
|
|
46
|
-
export { jsenvServiceResponseAcceptanceCheck } from "./services/response_acceptance_check/jsenv_service_response_acceptance_check.js";
|
|
47
|
-
|
|
48
|
-
// others
|
|
49
|
-
export { serveDirectory } from "./filesystem/serve_directory.js";
|
|
50
|
-
export { composeTwoResponses } from "./internal/response_composition.js";
|
|
51
|
-
export { jsenvServiceRequestAliases } from "./services/request_aliases/jsenv_service_request_aliases.js";
|
|
52
|
-
export { findFreePort } from "./internal/listen.js";
|
|
File without changes
|
|
File without changes
|
|
File without changes
|