Comparing version 7.0.0 to 7.0.1
@@ -0,1 +1,2 @@ | ||
/* eslint-disable */ | ||
var jumpToCode = (function init () { | ||
@@ -2,0 +3,0 @@ // Classes of code we would like to highlight |
@@ -0,1 +1,2 @@ | ||
/* eslint-disable */ | ||
window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V<U;++V){var ae=Z[V];if(ae.ignoreCase){ac=true}else{if(/[a-z]/i.test(ae.source.replace(/\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi,""))){S=true;ac=false;break}}}var Y={b:8,t:9,n:10,v:11,f:12,r:13};function ab(ah){var ag=ah.charCodeAt(0);if(ag!==92){return ag}var af=ah.charAt(1);ag=Y[af];if(ag){return ag}else{if("0"<=af&&af<="7"){return parseInt(ah.substring(1),8)}else{if(af==="u"||af==="x"){return parseInt(ah.substring(2),16)}else{return ah.charCodeAt(1)}}}}function T(af){if(af<32){return(af<16?"\\x0":"\\x")+af.toString(16)}var ag=String.fromCharCode(af);if(ag==="\\"||ag==="-"||ag==="["||ag==="]"){ag="\\"+ag}return ag}function X(am){var aq=am.substring(1,am.length-1).match(new RegExp("\\\\u[0-9A-Fa-f]{4}|\\\\x[0-9A-Fa-f]{2}|\\\\[0-3][0-7]{0,2}|\\\\[0-7]{1,2}|\\\\[\\s\\S]|-|[^-\\\\]","g"));var ak=[];var af=[];var ao=aq[0]==="^";for(var ar=ao?1:0,aj=aq.length;ar<aj;++ar){var ah=aq[ar];if(/\\[bdsw]/i.test(ah)){ak.push(ah)}else{var ag=ab(ah);var al;if(ar+2<aj&&"-"===aq[ar+1]){al=ab(aq[ar+2]);ar+=2}else{al=ag}af.push([ag,al]);if(!(al<65||ag>122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;ar<af.length;++ar){var at=af[ar];if(at[0]<=ap[1]+1){ap[1]=Math.max(ap[1],at[1])}else{ai.push(ap=at)}}var an=["["];if(ao){an.push("^")}an.push.apply(an,ak);for(var ar=0;ar<ai.length;++ar){var at=ai[ar];an.push(T(at[0]));if(at[1]>at[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak<ah;++ak){var ag=aj[ak];if(ag==="("){++am}else{if("\\"===ag.charAt(0)){var af=+ag.substring(1);if(af&&af<=am){an[af]=-1}}}}for(var ak=1;ak<an.length;++ak){if(-1===an[ak]){an[ak]=++ad}}for(var ak=0,am=0;ak<ah;++ak){var ag=aj[ak];if(ag==="("){++am;if(an[am]===undefined){aj[ak]="(?:"}}else{if("\\"===ag.charAt(0)){var af=+ag.substring(1);if(af&&af<=am){aj[ak]="\\"+an[am]}}}}for(var ak=0,am=0;ak<ah;++ak){if("^"===aj[ak]&&"^"!==aj[ak+1]){aj[ak]=""}}if(al.ignoreCase&&S){for(var ak=0;ak<ah;++ak){var ag=aj[ak];var ai=ag.charAt(0);if(ag.length>=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V<U;++V){var ae=Z[V];if(ae.global||ae.multiline){throw new Error(""+ae)}aa.push("(?:"+W(ae)+")")}return new RegExp(aa.join("|"),ac?"gi":"g")}function a(V){var U=/(?:^|\s)nocode(?:\s|$)/;var X=[];var T=0;var Z=[];var W=0;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=document.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Y=S&&"pre"===S.substring(0,3);function aa(ab){switch(ab.nodeType){case 1:if(U.test(ab.className)){return}for(var ae=ab.firstChild;ae;ae=ae.nextSibling){aa(ae)}var ad=ab.nodeName;if("BR"===ad||"LI"===ad){X[W]="\n";Z[W<<1]=T++;Z[(W++<<1)|1]=ab}break;case 3:case 4:var ac=ab.nodeValue;if(ac.length){if(!Y){ac=ac.replace(/[ \t\r\n]+/g," ")}else{ac=ac.replace(/\r\n?/g,"\n")}X[W]=ac;Z[W<<1]=T;T+=ac.length;Z[(W++<<1)|1]=ab}break}}aa(V);return{sourceCode:X.join("").replace(/\n$/,""),spans:Z}}function B(S,U,W,T){if(!U){return}var V={sourceCode:U,basePos:S};W(V);T.push.apply(T,V.decorations)}var v=/\S/;function o(S){var V=undefined;for(var U=S.firstChild;U;U=U.nextSibling){var T=U.nodeType;V=(T===1)?(V?S:U):(T===3)?(v.test(U.nodeValue)?S:V):V}return V===S?undefined:V}function g(U,T){var S={};var V;(function(){var ad=U.concat(T);var ah=[];var ag={};for(var ab=0,Z=ad.length;ab<Z;++ab){var Y=ad[ab];var ac=Y[3];if(ac){for(var ae=ac.length;--ae>=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae<aq;++ae){var ag=an[ae];var ap=aj[ag];var ai=void 0;var am;if(typeof ap==="string"){am=false}else{var aa=S[ag.charAt(0)];if(aa){ai=ag.match(aa[1]);ap=aa[0]}else{for(var ao=0;ao<X;++ao){aa=T[ao];ai=ag.match(aa[1]);if(ai){ap=aa[0];break}}if(!ai){ap=F}}am=ap.length>=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y<W.length;++Y){ae(W[Y])}if(ag===(ag|0)){W[0].setAttribute("value",ag)}var aa=ac.createElement("OL");aa.className="linenums";var X=Math.max(0,((ag-1))|0)||0;for(var Y=0,T=W.length;Y<T;++Y){af=W[Y];af.className="L"+((Y+X)%10);if(!af.firstChild){af.appendChild(ac.createTextNode("\xA0"))}aa.appendChild(af)}V.appendChild(aa)}function D(ac){var aj=/\bMSIE\b/.test(navigator.userAgent);var am=/\n/g;var al=ac.sourceCode;var an=al.length;var V=0;var aa=ac.spans;var T=aa.length;var ah=0;var X=ac.decorations;var Y=X.length;var Z=0;X[Y]=an;var ar,aq;for(aq=ar=0;aq<Y;){if(X[aq]!==X[aq+2]){X[ar++]=X[aq++];X[ar++]=X[aq++]}else{aq+=2}}Y=ar;for(aq=ar=0;aq<Y;){var at=X[aq];var ab=X[aq+1];var W=aq+2;while(W+2<=Y&&X[W+1]===ab){W+=2}X[ar++]=at;X[ar++]=ab;aq=W}Y=X.length=ar;var ae=null;while(ah<T){var af=aa[ah];var S=aa[ah+2]||an;var ag=X[Z];var ap=X[Z+2]||an;var W=Math.min(S,ap);var ak=aa[ah+1];var U;if(ak.nodeType!==1&&(U=al.substring(V,W))){if(aj){U=U.replace(am,"\r")}ak.nodeValue=U;var ai=ak.ownerDocument;var ao=ai.createElement("SPAN");ao.className=X[Z+1];var ad=ak.parentNode;ad.replaceChild(ao,ak);ao.appendChild(ak);if(V<S){aa[ah+1]=ak=ai.createTextNode(al.substring(W,S));ad.insertBefore(ak,ao.nextSibling)}}V=W;if(V>=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*</.test(S)?"default-markup":"default-code"}return t[T]}c(K,["default-code"]);c(g([],[[F,/^[^<?]+/],[E,/^<!\w[^>]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa<ac.length;++aa){for(var Z=0,V=ac[aa].length;Z<V;++Z){T.push(ac[aa][Z])}}ac=null;var W=Date;if(!W.now){W={now:function(){return +(new Date)}}}var X=0;var S;var ab=/\blang(?:uage)?-([\w.]+)(?!\S)/;var ae=/\bprettyprint\b/;function U(){var ag=(window.PR_SHOULD_USE_CONTINUATION?W.now()+250:Infinity);for(;X<T.length&&W.now()<ag;X++){var aj=T[X];var ai=aj.className;if(ai.indexOf("prettyprint")>=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X<T.length){setTimeout(U,250)}else{if(ad){ad()}}}U()}window.prettyPrintOne=y;window.prettyPrint=b;window.PR={createSimpleLexer:g,registerLangHandler:c,sourceDecorator:i,PR_ATTRIB_NAME:P,PR_ATTRIB_VALUE:n,PR_COMMENT:j,PR_DECLARATION:E,PR_KEYWORD:z,PR_LITERAL:G,PR_NOCODE:N,PR_PLAIN:F,PR_PUNCTUATION:L,PR_SOURCE:J,PR_STRING:C,PR_TAG:m,PR_TYPE:O}})();PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_DECLARATION,/^<!\w[^>]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^<script\b[^>]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:<!--|-->)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); |
@@ -0,1 +1,2 @@ | ||
/* eslint-disable */ | ||
var addSorting = (function () { | ||
@@ -2,0 +3,0 @@ "use strict"; |
@@ -0,3 +1,4 @@ | ||
/*eslint-env node */ | ||
/*eslint-disable no-unused-vars */ | ||
/*global BPMux: false */ | ||
/*jslint node: true, unparam: true */ | ||
"use strict"; | ||
@@ -82,1 +83,9 @@ /** | ||
BPMux.events.removed = function (duplex) { return undefined; }; | ||
/** | ||
`keep_alive` event | ||
A `BPMux` object emits a `keep_alive` event when it receives a keep-alive | ||
message from its peer. | ||
*/ | ||
BPMux.events.keep_alive = function () { return undefined; }; |
@@ -1,4 +0,2 @@ | ||
/*global timeout: false, | ||
browser_timeout: false */ | ||
/*jslint node: true, nomen: true */ | ||
/*eslint-env node */ | ||
"use strict"; | ||
@@ -11,3 +9,4 @@ | ||
{ | ||
return true; | ||
return typeof obj === 'string' || | ||
obj.constructor.name == 'WithOptions'; | ||
}; | ||
@@ -19,7 +18,7 @@ | ||
{ | ||
jshint: { | ||
src: [ '*.js', 'test/*.js' ], | ||
options: { | ||
esversion: 6 | ||
} | ||
eslint: { | ||
target: [ | ||
'*.js', | ||
'test/*.js' | ||
] | ||
}, | ||
@@ -35,5 +34,8 @@ | ||
default: { | ||
src: [ 'test/test_tcp.js', | ||
'test/test_channel_full.js', | ||
'test/test_inline_stream.js'], | ||
src: [ | ||
'test/test_tcp.js', | ||
'test/test_channel_full.js', | ||
'test/test_inline_stream.js', | ||
'test/test_http2.js' | ||
], | ||
options: { | ||
@@ -61,4 +63,6 @@ timeout: 10 * 60 * 1000, | ||
command: "./node_modules/.bin/nyc -x Gruntfile.js -x 'test/**' ./node_modules/.bin/grunt test-fast", | ||
execOptions: { | ||
maxBuffer: 10000 * 1024 | ||
options: { | ||
execOptions: { | ||
maxBuffer: Infinity | ||
} | ||
} | ||
@@ -95,5 +99,7 @@ }, | ||
bpmux_test: { | ||
command: './build/bpmux-test/linux64/bpmux-test', | ||
execOptions: { | ||
maxBuffer: 10000 * 1024 | ||
command: 'export TEST_ERR_FILE=/tmp/test_err_$$; ./build/bpmux-test/linux64/bpmux-test; if [ -f $TEST_ERR_FILE ]; then exit 1; fi', | ||
options: { | ||
execOptions: { | ||
maxBuffer: Infinity | ||
} | ||
} | ||
@@ -116,3 +122,3 @@ }, | ||
grunt.loadNpmTasks('grunt-contrib-jshint'); | ||
grunt.loadNpmTasks('grunt-eslint'); | ||
grunt.loadNpmTasks('grunt-mocha-test'); | ||
@@ -123,17 +129,30 @@ grunt.loadNpmTasks('grunt-apidox'); | ||
grunt.registerTask('lint', 'jshint'); | ||
grunt.registerTask('test', 'mochaTest:default'); | ||
grunt.registerTask('test-fast', ['env:fast', 'mochaTest:default']); | ||
grunt.registerTask('lint', 'eslint'); | ||
grunt.registerTask('test', [ | ||
'shell:certs', | ||
'mochaTest:default' | ||
]); | ||
grunt.registerTask('test-fast', [ | ||
'shell:certs', | ||
'env:fast', | ||
'mochaTest:default' | ||
]); | ||
grunt.registerTask('test-inline', 'mochaTest:inline'); | ||
grunt.registerTask('test-examples', [ 'shell:bundle_example', | ||
'mochaTest:examples' ]); | ||
grunt.registerTask('test-browser', [ 'save-primus', | ||
'shell:certs', | ||
'shell:bundle', | ||
'shell:nw_build', | ||
'shell:bpmux_test' ]); | ||
grunt.registerTask('test-examples', [ | ||
'shell:bundle_example', | ||
'mochaTest:examples' | ||
]); | ||
grunt.registerTask('test-browser', [ | ||
'save-primus', | ||
'shell:certs', | ||
'shell:bundle', | ||
'shell:nw_build', | ||
'shell:bpmux_test' | ||
]); | ||
grunt.registerTask('docs', 'apidox'); | ||
grunt.registerTask('coverage', ['shell:cover', | ||
'shell:cover_report', | ||
'shell:cover_check']); | ||
grunt.registerTask('coverage', [ | ||
'shell:cover', | ||
'shell:cover_report', | ||
'shell:cover_check' | ||
]); | ||
grunt.registerTask('coveralls', 'shell:coveralls'); | ||
@@ -140,0 +159,0 @@ grunt.registerTask('default', ['lint', 'test']); |
86
index.js
@@ -10,5 +10,7 @@ /** | ||
- Unit tests with 100% coverage. | ||
- Tested with TCP streams and [Primus](https://github.com/primus/primus) (using [primus-backpressure](https://github.com/davedoesdev/primus-backpressure)) - works in the browser! | ||
- For TCP streams you'll get better performance if you [disable Nagle](https://nodejs.org/dist/latest-v10.x/docs/api/net.html#net_socket_setnodelay_nodelay). | ||
- Browser unit tests using [webpack](http://webpack.github.io/) and [nwjs](http://nwjs.io/). | ||
- Tested with TCP streams. You'll get better performance if you [disable Nagle](https://nodejs.org/dist/latest-v10.x/docs/api/net.html#net_socket_setnodelay_nodelay). | ||
- Works in the browser! | ||
- Tested with [Primus](https://github.com/primus/primus) (using [primus-backpressure](https://github.com/davedoesdev/primus-backpressure)). | ||
- Tested with HTTP/2 streams (using [browser-http2-duplex](https://github.com/davedoesdev/browser-http2-duplex)). Also tested Node-to-Node using `http2`. | ||
- Browser unit tests using [webpack](http://webpack.github.io/) and [nwjs](http://nwjs.io/). | ||
@@ -108,3 +110,3 @@ The API is described [here](#api). | ||
bufs = [], | ||
duplex = mux.multiplex({ handshake_data: new Buffer([n]) }); | ||
duplex = mux.multiplex({ handshake_data: Buffer.from([n]) }); | ||
@@ -244,3 +246,3 @@ buf_stream.end(buf); | ||
*/ | ||
/*jslint node: true, nomen: true, unparam: true */ | ||
/*eslint-env node */ | ||
'use strict'; | ||
@@ -261,3 +263,4 @@ | ||
TYPE_PRE_HANDSHAKE = 5, | ||
TYPE_ERROR_END = 6; | ||
TYPE_ERROR_END = 6, | ||
TYPE_KEEP_ALIVE = 7; | ||
@@ -268,7 +271,10 @@ function BPDuplex(options, mux, chan) | ||
options = options || {}; | ||
options = Object.assign( | ||
{ | ||
max_write_size: 0 | ||
}, options); | ||
this._mux = mux; | ||
this._chan = chan; | ||
this._max_write_size = options.max_write_size || 0; | ||
this._max_write_size = options.max_write_size; | ||
this._check_read_overflow = options.check_read_overflow !== false; | ||
@@ -331,3 +337,3 @@ this._seq = 0; | ||
{ | ||
this._mux._send_handshake(this, handshake_data || new Buffer(0)); | ||
this._mux._send_handshake(this, handshake_data || Buffer.alloc(0)); | ||
}; | ||
@@ -391,2 +397,4 @@ | ||
- `{Integer} [max_header_size]` `BPMux` adds a control header to each message it sends, which the receiver reads into memory. The header is of variable length — for example, handshake messages contain handshake data which can be supplied by the application. `max_header_size` is the maximum number of header bytes to read into memory. If a larger header is received, `BPMux` emits an `error` event. Defaults to 0 (no limit). | ||
- `{Integer|false}` `keep_alive` Send a single byte keep-alive message every N milliseconds. Defaults to 30000 (30 seconds). Pass `false` to disable. | ||
*/ | ||
@@ -397,7 +405,12 @@ function BPMux(carrier, options) | ||
options = options || {}; | ||
options = Object.assign( | ||
{ | ||
max_open: 0, | ||
max_header_size: 0, | ||
keep_alive: 30 * 1000 | ||
}, options); | ||
this._max_duplexes = Math.pow(2, 31); | ||
this._max_open = options.max_open || 0; | ||
this._max_header_size = options.max_header_size || 0; | ||
this._max_open = options.max_open; | ||
this._max_header_size = options.max_header_size; | ||
this.duplexes = new Map(); | ||
@@ -417,2 +430,3 @@ this._chan = 0; | ||
this._send_requested = false; | ||
this._keep_alive_id = null; | ||
@@ -435,4 +449,3 @@ this._out_stream = frame.encode(options); | ||
this._in_stream = frame.decode(util._extend(util._extend( | ||
{}, options), | ||
this._in_stream = frame.decode(Object.assign({}, options, | ||
{ | ||
@@ -450,2 +463,4 @@ unbuffered: true | ||
clearInterval(ths._keep_alive_id); | ||
for (var duplex of ths.duplexes.values()) | ||
@@ -568,2 +583,10 @@ { | ||
})); | ||
if (options.keep_alive !== false) | ||
{ | ||
this._keep_alive_id = setInterval(function () | ||
{ | ||
ths._send_keep_alive(); | ||
}, options.keep_alive); | ||
} | ||
} | ||
@@ -586,2 +609,7 @@ | ||
{ | ||
if ((buf.length > 0) && (buf[0] === TYPE_KEEP_ALIVE)) | ||
{ | ||
return this.emit('keep_alive'); | ||
} | ||
if (!this._check_buffer(buf, 5)) { return; } | ||
@@ -614,3 +642,3 @@ | ||
free = duplex._max_write_size > 0 ? | ||
Math.min(free, duplex._max_write_size) : free; | ||
Math.min(free, duplex._max_write_size) : free; | ||
@@ -697,3 +725,3 @@ duplex._remote_free = seq + free - duplex._seq; | ||
duplex._remote_free = duplex._max_write_size > 0 ? | ||
Math.min(free, duplex._max_write_size) : free; | ||
Math.min(free, duplex._max_write_size) : free; | ||
duplex._set_remote_free = true; | ||
@@ -703,4 +731,4 @@ } | ||
handshake_data = this._parse_handshake_data ? | ||
this._parse_handshake_data(buf.slice(9)) : | ||
buf.slice(9); | ||
this._parse_handshake_data(buf.slice(9)) : | ||
buf.slice(9); | ||
dhs = duplex._handshake_sent ? null : delay_handshake; | ||
@@ -755,2 +783,14 @@ this.emit('handshake', duplex, handshake_data, dhs); | ||
BPMux.prototype._send_keep_alive = function () | ||
{ | ||
// Note: Keep-alive messages are sent regardless of remote_free | ||
// (if the remove peer isn't reading any of its multiplexed streams, | ||
// we still want to keep the underlying connection alive). | ||
var buf = Buffer.alloc(1); | ||
buf.writeUInt8(TYPE_KEEP_ALIVE, 0, true); | ||
this._out_stream.write(buf); | ||
}; | ||
BPMux.prototype._send_end = function (duplex) | ||
@@ -760,3 +800,3 @@ { | ||
var buf = new Buffer(1 + 4); | ||
var buf = Buffer.alloc(1 + 4); | ||
@@ -781,3 +821,3 @@ buf.writeUInt8(duplex._error_end ? TYPE_ERROR_END : TYPE_END, 0, true); | ||
buf = new Buffer(size); | ||
buf = Buffer.alloc(size); | ||
@@ -847,3 +887,3 @@ buf.writeUInt8(handshake_data ? TYPE_HANDSHAKE : TYPE_PRE_HANDSHAKE, 0, true); | ||
buf = new Buffer(1 + 4 + 4 + duplex._remote_seq.length); | ||
buf = Buffer.alloc(1 + 4 + 4 + duplex._remote_seq.length); | ||
buf.writeUInt8(type, 0, true); | ||
@@ -895,3 +935,3 @@ buf.writeUInt32BE(duplex._chan, 1, true); | ||
var size = Math.min(info.size, Math.max(Math.floor(space / n), 1)), | ||
buf = new Buffer(1 + 4 + 4), | ||
buf = Buffer.alloc(1 + 4 + 4), | ||
buf2 = info.duplex._data.slice(info.duplex._index, info.duplex._index + size), | ||
@@ -931,3 +971,3 @@ cb; | ||
while (true) | ||
while (true) // eslint-disable-line no-constant-condition | ||
{ | ||
@@ -934,0 +974,0 @@ space = this._out_stream._writableState.highWaterMark - this._out_stream._writableState.length; |
{ | ||
"name": "bpmux", | ||
"description": "Node stream multiplexing with back-pressure on each stream", | ||
"version": "7.0.0", | ||
"version": "7.0.1", | ||
"homepage": "https://github.com/davedoesdev/bpmux", | ||
@@ -48,23 +48,25 @@ "author": { | ||
"devDependencies": { | ||
"async": "^2.6.1", | ||
"chai": "^4.2.0", | ||
"coveralls": "^3.0.2", | ||
"eslint": "^5.7.0", | ||
"finalhandler": "^1.1.1", | ||
"grunt": "^1.0.3", | ||
"grunt-contrib-jshint": "^1.1.0", | ||
"grunt-apidox": "^2.0.1", | ||
"grunt-env": "^0.4.4", | ||
"grunt-eslint": "^21.0.0", | ||
"grunt-mocha-test": "^0.13.3", | ||
"grunt-apidox": "^2.0.1", | ||
"grunt-shell": "^2.1.0", | ||
"http2-duplex": "0.0.4", | ||
"mocha": "^5.2.0", | ||
"chai": "^4.1.2", | ||
"nyc": "^13.0.1", | ||
"coveralls": "^3.0.2", | ||
"webpack": "^4.19.0", | ||
"webpack-cli": "^3.1.0", | ||
"primus": "^7.2.2", | ||
"nw-builder": "^3.5.4", | ||
"nyc": "^13.1.0", | ||
"primus": "^7.2.3", | ||
"primus-backpressure": "^1.0.5", | ||
"ws": "^6.0.0", | ||
"serve-static": "^1.13.2", | ||
"tmp": "^0.0.33", | ||
"async": "^2.6.1", | ||
"nw-builder": "^3.5.4", | ||
"grunt-env": "^0.4.4", | ||
"serve-static": "^1.13.2", | ||
"finalhandler": "^1.1.1" | ||
"webpack": "^4.22.0", | ||
"webpack-cli": "^3.1.2", | ||
"ws": "^6.1.0" | ||
} | ||
} |
@@ -9,5 +9,7 @@ # bpmux [![Build Status](https://travis-ci.org/davedoesdev/bpmux.png)](https://travis-ci.org/davedoesdev/bpmux) [![Coverage Status](https://coveralls.io/repos/davedoesdev/bpmux/badge.png?branch=master&service=github)](https://coveralls.io/r/davedoesdev/bpmux?branch=master) [![NPM version](https://badge.fury.io/js/bpmux.png)](http://badge.fury.io/js/bpmux) | ||
- Unit tests with 100% coverage. | ||
- Tested with TCP streams and [Primus](https://github.com/primus/primus) (using [primus-backpressure](https://github.com/davedoesdev/primus-backpressure)) - works in the browser! | ||
- For TCP streams you'll get better performance if you [disable Nagle](https://nodejs.org/dist/latest-v10.x/docs/api/net.html#net_socket_setnodelay_nodelay). | ||
- Browser unit tests using [webpack](http://webpack.github.io/) and [nwjs](http://nwjs.io/). | ||
- Tested with TCP streams. You'll get better performance if you [disable Nagle](https://nodejs.org/dist/latest-v10.x/docs/api/net.html#net_socket_setnodelay_nodelay). | ||
- Works in the browser! | ||
- Tested with [Primus](https://github.com/primus/primus) (using [primus-backpressure](https://github.com/davedoesdev/primus-backpressure)). | ||
- Tested with HTTP/2 streams (using [browser-http2-duplex](https://github.com/davedoesdev/browser-http2-duplex)). Also tested Node-to-Node using `http2`. | ||
- Browser unit tests using [webpack](http://webpack.github.io/) and [nwjs](http://nwjs.io/). | ||
@@ -107,3 +109,3 @@ The API is described [here](#api). | ||
bufs = [], | ||
duplex = mux.multiplex({ handshake_data: new Buffer([n]) }); | ||
duplex = mux.multiplex({ handshake_data: Buffer.from([n]) }); | ||
@@ -255,2 +257,3 @@ buf_stream.end(buf); | ||
- <a name="toc_bpmuxeventsremovedduplex"></a>[BPMux.events.removed](#bpmuxeventsremovedduplex) | ||
- <a name="toc_bpmuxeventskeep_alive"></a>[BPMux.events.keep_alive](#bpmuxeventskeep_alive) | ||
@@ -281,2 +284,4 @@ ## BPMux(carrier, [options]) | ||
- `{Integer|false}` `keep_alive` Send a single byte keep-alive message every N milliseconds. Defaults to 30000 (30 seconds). Pass `false` to disable. | ||
<sub>Go: [TOC](#tableofcontents)</sub> | ||
@@ -406,2 +411,11 @@ | ||
## BPMux.events.keep_alive() | ||
> `keep_alive` event | ||
A `BPMux` object emits a `keep_alive` event when it receives a keep-alive | ||
message from its peer. | ||
<sub>Go: [TOC](#tableofcontents) | [BPMux.events](#toc_bpmuxevents)</sub> | ||
_—generated by [apidox](https://github.com/codeactual/apidox)—_ |
@@ -0,1 +1,44 @@ | ||
const util = require('util'); | ||
const os = require('os'); | ||
function done(err) | ||
{ | ||
require('nw.gui').App.quit(); | ||
if (err) | ||
{ | ||
if (process.env.TEST_ERR_FILE) | ||
{ | ||
require('fs').writeFileSync(process.env.TEST_ERR_FILE, ''); | ||
} | ||
process.stderr.write(`${err.stack}\n`); | ||
throw err; | ||
} | ||
} | ||
window.addEventListener('unhandledrejection', function (ev) | ||
{ | ||
done(ev.reason); | ||
}); | ||
console.log = function () | ||
{ | ||
process.stdout.write(util.format.apply(this, arguments)); | ||
process.stdout.write(os.EOL); | ||
}; | ||
console.error = function () | ||
{ | ||
process.stderr.write(util.format.apply(this, arguments)); | ||
process.stderr.write(os.EOL); | ||
}; | ||
console.trace = function trace() | ||
{ | ||
var err = new Error(); | ||
err.name = 'Trace'; | ||
err.message = util.format.apply(this, arguments); | ||
Error.captureStackTrace(err, trace); | ||
this.error(err.stack); | ||
}; | ||
function doit() | ||
@@ -5,14 +48,16 @@ { | ||
{ | ||
//nw.Window.get().showDevTools(); | ||
require('test_browser')(Primus, | ||
PrimusDuplex, | ||
make_client_http2_duplex, | ||
BPMux, | ||
BundledBuffer, | ||
bundled_crypto, | ||
bundled_frame); | ||
bundled_frame, | ||
done); | ||
} | ||
catch (ex) | ||
{ | ||
process.stderr.write(ex.stack); | ||
process.exit(1); | ||
done(ex); | ||
} | ||
} |
PrimusDuplex = require('primus-backpressure').PrimusDuplex; | ||
make_client_http2_duplex = require('http2-duplex').default; | ||
BPMux = require('../../..').BPMux; | ||
@@ -3,0 +4,0 @@ BundledBuffer = require('buffer').Buffer; |
@@ -1,2 +0,2 @@ | ||
/*jslint node: true */ | ||
/*eslint-env node */ | ||
"use strict"; | ||
@@ -7,13 +7,15 @@ | ||
{ | ||
return true; | ||
return typeof obj === 'string' || | ||
obj.constructor.name == 'WithOptions'; | ||
}; | ||
var net = require('net'), | ||
fs = require('fs'), | ||
var fs = require('fs'), | ||
path = require('path'), | ||
util = require('util'), | ||
os = require('os'), | ||
http2 = require('http2'), | ||
Mocha = require('mocha'), | ||
Primus = require('primus'), | ||
PrimusDuplex = require('primus-backpressure').PrimusDuplex, | ||
make_http2_duplex_server = require('http2-duplex').default, | ||
BPMux = require('bpmux').BPMux, | ||
@@ -24,6 +26,8 @@ server_port = 7000; | ||
BrowserPrimusDuplex, | ||
make_client_http2_duplex, | ||
BrowserBPMux, | ||
BrowserBuffer, | ||
browser_crypto, | ||
browser_frame) | ||
browser_frame, | ||
cb) | ||
{ | ||
@@ -66,3 +70,3 @@ var mocha = new Mocha( | ||
BrowserBPMux, | ||
function (cb) | ||
function (server, cb) | ||
{ | ||
@@ -82,3 +86,57 @@ cb(new BrowserPrimusDuplex( | ||
console.log = function () | ||
require('test_comms')( | ||
'http2-duplex', | ||
BPMux, | ||
async function (conn_cb, cb) | ||
{ | ||
const http2_server = http2.createSecureServer( | ||
{ | ||
key: fs.readFileSync(path.join(__dirname, 'certs', 'server.key')), | ||
cert: fs.readFileSync(path.join(__dirname, 'certs', 'server.crt')) | ||
}); | ||
const http2_duplex_server = await make_http2_duplex_server( | ||
http2_server, | ||
'/test' | ||
); | ||
http2_duplex_server.http2_server = http2_server; | ||
http2_duplex_server.on('duplex', conn_cb); | ||
http2_server.listen(server_port, function () | ||
{ | ||
cb(http2_duplex_server); | ||
}); | ||
}, | ||
async function (http2_duplex_server, cb) | ||
{ | ||
await http2_duplex_server.close(); | ||
http2_duplex_server.http2_server.close(cb); | ||
}, | ||
function (conn, cb) | ||
{ | ||
conn.on('end', function () | ||
{ | ||
this.end(); | ||
cb(); | ||
}); | ||
}, | ||
BrowserBPMux, | ||
async function (server, cb) | ||
{ | ||
const url = 'https://localhost:' + server_port + '/test'; | ||
const duplex = await make_client_http2_duplex(url); | ||
cb(duplex); | ||
}, | ||
function (conn, cb) | ||
{ | ||
conn.on('end', cb); | ||
conn.end(); | ||
}, | ||
BrowserBuffer, | ||
browser_crypto, | ||
browser_frame, | ||
true); | ||
console.log = function () // eslint-disable-line no-console | ||
{ | ||
@@ -89,3 +147,3 @@ process.stdout.write(util.format.apply(this, arguments)); | ||
console.error = function () | ||
console.error = function () // eslint-disable-line no-console | ||
{ | ||
@@ -96,3 +154,3 @@ process.stderr.write(util.format.apply(this, arguments)); | ||
console.trace = function trace() | ||
console.trace = function trace() // eslint-disable-line no-console | ||
{ | ||
@@ -108,10 +166,4 @@ var err = new Error(); | ||
{ | ||
if (failures) | ||
{ | ||
return process.exit(failures); | ||
} | ||
/*global window */ | ||
window.require('nw.gui').App.quit(); | ||
cb(failures ? new Error('failed') : null); | ||
}); | ||
}; |
@@ -0,4 +1,4 @@ | ||
/*eslint-env node */ | ||
/*global describe: false, | ||
it: false */ | ||
/*jslint node: true, nomen: true */ | ||
"use strict"; | ||
@@ -24,3 +24,6 @@ | ||
{ | ||
var mux = new BPMux(dummy_carrier), | ||
var mux = new BPMux(dummy_carrier, | ||
{ | ||
keep_alive: false | ||
}), | ||
full_emitted = false; | ||
@@ -54,3 +57,7 @@ | ||
{ | ||
var mux = new BPMux(dummy_carrier, { max_open: 3 }), | ||
var mux = new BPMux(dummy_carrier, | ||
{ | ||
max_open: 3, | ||
keep_alive: false | ||
}), | ||
full_emitted = false; | ||
@@ -57,0 +64,0 @@ |
@@ -0,4 +1,4 @@ | ||
/*eslint-env node */ | ||
/*global describe: false, | ||
it: false */ | ||
/*jslint node: true, nomen: true */ | ||
"use strict"; | ||
@@ -8,137 +8,133 @@ | ||
{ | ||
it('first', function (cb) | ||
{ | ||
it('first', function (cb) | ||
{ | ||
var net = require('net'), | ||
crypto = require('crypto'), | ||
assert = require('assert'), | ||
BPMux = require('..').BPMux, | ||
sent = []; | ||
var net = require('net'), | ||
crypto = require('crypto'), | ||
assert = require('assert'), | ||
BPMux = require('..').BPMux, | ||
sent = []; | ||
net.createServer(function (c) | ||
{ | ||
var received = [], ended = 0; | ||
net.createServer(function (c) | ||
{ | ||
var received = [], ended = 0; | ||
new BPMux(c).on('handshake', function (duplex) | ||
{ | ||
var accum = ''; | ||
new BPMux(c).on('handshake', function (duplex) | ||
{ | ||
var accum = ''; | ||
duplex.on('readable', function () | ||
{ | ||
var data = this.read(); | ||
if (data) | ||
{ | ||
accum += data.toString('hex'); | ||
} | ||
}); | ||
duplex.on('readable', function () | ||
duplex.on('end', function () | ||
{ | ||
received.push(accum); | ||
ended += 1; | ||
assert(ended <= 10); | ||
if (ended === 10) | ||
{ | ||
assert.deepEqual(received.sort(), sent.sort()); | ||
cb(); | ||
} | ||
}); | ||
}); | ||
}).listen(7000, function () | ||
{ | ||
var data = this.read(); | ||
if (data) | ||
var mux = new BPMux(net.createConnection(7000)), i; | ||
function multiplex(n) | ||
{ | ||
accum += data.toString('hex'); | ||
var data = crypto.randomBytes(n * 100); | ||
mux.multiplex().end(data); | ||
sent.push(data.toString('hex')); | ||
} | ||
}); | ||
duplex.on('end', function () | ||
{ | ||
received.push(accum); | ||
ended += 1; | ||
assert(ended <= 10); | ||
if (ended === 10) | ||
for (i = 1; i <= 10; i += 1) | ||
{ | ||
assert.deepEqual(received.sort(), sent.sort()); | ||
cb(); | ||
multiplex(i); | ||
} | ||
}); | ||
}); | ||
}).listen(7000, function () | ||
{ | ||
var mux = new BPMux(net.createConnection(7000)), i; | ||
function multiplex(n) | ||
it('second', function (cb) | ||
{ | ||
var data = crypto.randomBytes(n * 100); | ||
mux.multiplex().end(data); | ||
sent.push(data.toString('hex')); | ||
} | ||
this.timeout(60 * 60 * 1000); | ||
for (i = 1; i <= 10; i += 1) | ||
{ | ||
multiplex(i); | ||
} | ||
}); | ||
var PrimusDuplex = require('primus-backpressure').PrimusDuplex, | ||
BPMux = require('..').BPMux, | ||
http = require('http'), | ||
path = require('path'), | ||
crypto = require('crypto'), | ||
stream = require('stream'), | ||
assert = require('assert'), | ||
finalhandler = require('finalhandler'), | ||
serve_static = require('serve-static'), | ||
Primus = require('primus'), | ||
serve = serve_static(path.join(__dirname, 'fixtures', 'example')); | ||
}); | ||
http.createServer(function (req, res) | ||
{ | ||
serve(req, res, finalhandler(req, res)); | ||
}).listen(7500, function () | ||
{ | ||
var primus = new Primus(this); | ||
it('second', function (cb) | ||
{ | ||
this.timeout(60 * 60 * 1000); | ||
primus.on('connection', function (spark) | ||
{ | ||
var mux = new BPMux(new PrimusDuplex(spark)), ended = 0, i; | ||
var PrimusDuplex = require('primus-backpressure').PrimusDuplex, | ||
BPMux = require('..').BPMux, | ||
http = require('http'), | ||
path = require('path'), | ||
crypto = require('crypto'), | ||
stream = require('stream'), | ||
assert = require('assert'), | ||
finalhandler = require('finalhandler'), | ||
serve_static = require('serve-static'), | ||
Primus = require('primus'), | ||
serve = serve_static(path.join(__dirname, 'fixtures', 'example')); | ||
function multiplex(n) | ||
{ | ||
var buf = crypto.randomBytes(10 * 1024), | ||
buf_stream = new stream.PassThrough(), | ||
bufs = [], | ||
duplex = mux.multiplex({ handshake_data: Buffer.from([n]) }); | ||
http.createServer(function (req, res) | ||
{ | ||
serve(req, res, finalhandler(req, res)); | ||
}).listen(7500, function () | ||
{ | ||
var primus = new Primus(this); | ||
buf_stream.end(buf); | ||
buf_stream.pipe(duplex); | ||
primus.on('connection', function (spark) | ||
{ | ||
var mux = new BPMux(new PrimusDuplex(spark)), ended = 0, i; | ||
duplex.on('readable', function () | ||
{ | ||
var data; | ||
function multiplex(n) | ||
{ | ||
var buf = crypto.randomBytes(10 * 1024), | ||
buf_stream = new stream.PassThrough(), | ||
bufs = [], | ||
duplex = mux.multiplex({ handshake_data: new Buffer([n]) }); | ||
while (true) // eslint-disable-line no-constant-condition | ||
{ | ||
data = this.read(); | ||
if (data === null) | ||
{ | ||
break; | ||
} | ||
bufs.push(data); | ||
} | ||
}); | ||
buf_stream.end(buf); | ||
buf_stream.pipe(duplex); | ||
duplex.on('readable', function () | ||
{ | ||
var data; | ||
while (true) | ||
{ | ||
data = this.read(); | ||
if (data === null) | ||
duplex.on('end', function () | ||
{ | ||
break; | ||
} | ||
bufs.push(data); | ||
console.log('end', n); // eslint-disable-line no-console | ||
ended += 1; | ||
assert(ended <= 10); | ||
assert.deepEqual(Buffer.concat(bufs), buf); | ||
if (ended === 10) | ||
{ | ||
cb(); | ||
} | ||
}); | ||
} | ||
}); | ||
duplex.on('end', function () | ||
{ | ||
console.log('end', n); | ||
ended += 1; | ||
assert(ended <= 10); | ||
assert.deepEqual(Buffer.concat(bufs), buf); | ||
if (ended === 10) | ||
for (i = 0; i < 10; i += 1) | ||
{ | ||
cb(); | ||
multiplex(i); | ||
} | ||
}); | ||
} | ||
for (i = 0; i < 10; i += 1) | ||
{ | ||
multiplex(i); | ||
} | ||
console.log('Point your browser to http://localhost:7500/loader.html'); // eslint-disable-line no-console | ||
}); | ||
}); | ||
console.log('Point your browser to http://localhost:7500/loader.html'); | ||
}); | ||
}); | ||
}); | ||
@@ -0,5 +1,5 @@ | ||
/*eslint-env node */ | ||
/*global describe: false, | ||
beforeEach: false, | ||
it: false */ | ||
/*jshint node: true */ | ||
"use strict"; | ||
@@ -12,4 +12,3 @@ | ||
util = require('util'), | ||
Duplex = stream.Duplex, | ||
PassThrough = stream.PassThrough; | ||
Duplex = stream.Duplex; | ||
@@ -111,3 +110,3 @@ function RightDuplex(left) | ||
{ | ||
handshake_data: new Buffer('right hs') | ||
handshake_data: Buffer.from('right hs') | ||
}).end('right data'); | ||
@@ -118,3 +117,3 @@ }); | ||
{ | ||
while (true) | ||
while (true) // eslint-disable-line no-constant-condition | ||
{ | ||
@@ -133,3 +132,3 @@ var data = this.read(); | ||
{ | ||
handshake_data: new Buffer('left hs') | ||
handshake_data: Buffer.from('left hs') | ||
}).end('left data'); | ||
@@ -157,3 +156,3 @@ | ||
{ | ||
while (true) | ||
while (true) // eslint-disable-line no-constant-condition | ||
{ | ||
@@ -181,3 +180,3 @@ var data = this.read(); | ||
{ | ||
while (true) | ||
while (true) // eslint-disable-line no-constant-condition | ||
{ | ||
@@ -190,3 +189,3 @@ var data = this.read(); | ||
this.end(new Buffer([2])); | ||
this.end(Buffer.from([2])); | ||
}); | ||
@@ -198,7 +197,7 @@ | ||
{ | ||
duplex.write(new Buffer([1])); | ||
duplex.write(Buffer.from([1])); | ||
duplex.on('readable', function () | ||
{ | ||
while (true) | ||
while (true) // eslint-disable-line no-constant-condition | ||
{ | ||
@@ -208,3 +207,3 @@ var data = this.read(); | ||
expect(data[0]).to.equal(2); | ||
this.end(new Buffer([3])); | ||
this.end(Buffer.from([3])); | ||
} | ||
@@ -220,3 +219,3 @@ }); | ||
lmux.on('handshake', function (duplex, hdata, delay) | ||
lmux.on('handshake', function (duplex) | ||
{ | ||
@@ -308,3 +307,3 @@ if (duplex !== control) | ||
{ | ||
while (true) | ||
while (true) // eslint-disable-line no-constant-condition | ||
{ | ||
@@ -347,3 +346,3 @@ var data = this.read(); | ||
{ | ||
while (true) | ||
while (true) // eslint-disable-line no-constant-condition | ||
{ | ||
@@ -423,3 +422,3 @@ var data = this.read(); | ||
{ | ||
if (lcomplete && lcomplete2 && rcomplete && rcomplete2 && rcomplete3) | ||
if (lcomplete && lcomplete2 && rcomplete && rcomplete2 && rcomplete3 && rcomplete4) | ||
{ | ||
@@ -532,3 +531,3 @@ cb(); | ||
{ | ||
var buf = new Buffer(128 * 1024); | ||
var buf = Buffer.alloc(128 * 1024); | ||
buf.fill('a'); | ||
@@ -542,3 +541,3 @@ | ||
{ | ||
while (true) | ||
while (true) // eslint-disable-line no-constant-condition | ||
{ | ||
@@ -567,3 +566,3 @@ var data = this.read(); | ||
{ | ||
var buf = new Buffer(100 * 1024); | ||
var buf = Buffer.alloc(100 * 1024); | ||
buf.fill('a'); | ||
@@ -579,3 +578,3 @@ | ||
{ | ||
while (true) | ||
while (true) // eslint-disable-line no-constant-condition | ||
{ | ||
@@ -582,0 +581,0 @@ var data = this.read(); |
@@ -1,2 +0,2 @@ | ||
/*jslint node: true */ | ||
/*eslint-env node, mocha */ | ||
"use strict"; | ||
@@ -43,3 +43,3 @@ | ||
BPMux, | ||
function (cb) | ||
function (server, cb) | ||
{ | ||
@@ -46,0 +46,0 @@ net.createConnection(server_port, function () |
@@ -1,3 +0,3 @@ | ||
var webpack = require('webpack'), | ||
path = require('path'); | ||
/*eslint-env node */ | ||
var path = require('path'); | ||
@@ -9,3 +9,3 @@ module.exports = { | ||
filename: 'bundle.js', | ||
path: path.join(__dirname, './fixtures/webpack') | ||
path: path.join(__dirname, 'fixtures/webpack') | ||
}, | ||
@@ -12,0 +12,0 @@ performance: { hints: false }, |
@@ -1,3 +0,3 @@ | ||
var webpack = require('webpack'), | ||
path = require('path'); | ||
/*eslint-env node */ | ||
var path = require('path'); | ||
@@ -9,5 +9,5 @@ module.exports = { | ||
filename: 'bundle.js', | ||
path: path.join(__dirname, './fixtures/example') | ||
path: path.join(__dirname, 'fixtures/example') | ||
}, | ||
performance: { hints: false } | ||
}; |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is too big to display
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Network access
Supply chain riskThis module accesses the network.
Found 2 instances in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
495834
40
4745
417
22
8
7