sumor 1.3.0 → 1.3.1
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/index.es.js +3 -3
- package/package.json +1 -1
package/index.es.js
CHANGED
|
@@ -491,7 +491,7 @@ function show(){
|
|
|
491
491
|
</body>
|
|
492
492
|
</html>`},Qe=class{constructor(e,r){this.req=e,this.res=r,this.respond=!1,this._changed=!1,this._hasError=!1,this._code="OK",this._message="",this._data=null}set code(e){let r=this.req.sumor.text(e,this._data);e&&r?(this._code=e,this._message=r):(this._code="sumorApp.NETWORK_ERROR",this._message=this.req.sumor.text(this._code))}get code(){return this._code}set message(e){this._message=e}get message(){return this._message}set data(e){this._data=e,this._changed=!0}get data(){return this._data}set changed(e){this._changed=e}get changed(){return this._changed}error(e){this.code=e,this._hasError=!0}end(){if(this._data!==void 0)try{this.res.send(this._data)}catch(e){if(e.code!=="ERR_HTTP_HEADERS_SENT")throw e}}send(){let e={code:this._code,message:this._message,data:this._data};if(this._hasError)try{this.res.status(500),this.req.accepts(["html","json"])==="html"?this.res.send(Ss({title:"\u670D\u52A1\u5F02\u5E38\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5",...e})):this.res.send(e)}catch(r){if(r.code!=="ERR_HTTP_HEADERS_SENT")throw r}else try{this.res.set("Content-Type","application/json;charset=utf-8"),this.res.send(e)}catch(r){if(r.code!=="ERR_HTTP_HEADERS_SENT")throw r}}},_r=async t=>{t.use((e,r,o)=>{e.sumor.response=new Qe(e,r),o()})};import vs from"ali-oss";var et={resize:{mode:"m",width:"w",height:"h",longer:"l",shorter:"s"},quality:{related:"q",absolute:"Q"},circle:{radius:"r"},blur:{radius:"r",size:"s"}},Es=t=>{let e={};if(t.image){let r=[];for(let o in et){let s=t.image[o];if(s){let i=[];i.push(o);for(let n in et[o])s[n]&&i.push(`${et[o][n]}_${s[n]}`);r.push(i.join(","))}}t.image.format&&r.push(`format,${t.image.format}`),t.image.orient&&r.push("auto-orient,1"),r.length>0&&(e.process=`image/${r.join("/")}`)}return e},tt=class{constructor(e){this.aliyunOSS=new vs(e)}async put(e,r){let o=await this.aliyunOSS.putStream(e,r);if(o.res.status>299){let s=new Error("sumorStorage.STORAGE_INSTANCE_ERROR");throw s.data={msg:o.res},s}}async info(e,r){r=r||{};let o={},s,i;try{if(s=await this.aliyunOSS.get(e,{process:"image/info"}),r.color)try{let a=await this.aliyunOSS.get(e,{process:"image/average-hue"});if(a.content){let c=JSON.parse(a.content.toString());o.color=c.RGB.replace("0x","#")}}catch{}}catch(a){if(a.code!=="NoSuchKey")i=a.message;else return null}if(!i&&s&&s.res.status>299&&(i=s.res),i){let a=new Error("sumorStorage.STORAGE_INSTANCE_ERROR");throw a.data={msg:i},a}let n=JSON.parse(s.content.toString()),m=a=>{if(n[a])return n[a].value};return o.format=m("Format"),o.size=m("FileSize"),o.height=m("ImageHeight"),o.height&&(o.height=parseInt(o.height,10)),o.width=m("ImageWidth"),o.width&&(o.width=parseInt(o.width,10)),o.make=m("LensMake"),o.model=m("LensModel"),o}async get(e,r){let o,s,i;try{s=await this.aliyunOSS.getStream(e,Es(r))}catch(n){n.code!=="NoSuchKey"&&(i=n.message)}if(!i&&s&&s.res.status>299&&(i=s.res),i){let n=new Error("sumorStorage.STORAGE_INSTANCE_ERROR");throw n.data={msg:i},n}return s&&(o=s.stream),o}async delete(e){let r=await this.aliyunOSS.delete(e);if(r.res.status>299){let o=new Error("sumorStorage.STORAGE_INSTANCE_ERROR");throw o.data={msg:r.res},o}}async exists(e){let r=!0;try{await this.aliyunOSS.get(e)}catch(o){if(o.code==="NoSuchKey")r=!1;else throw new Error("sumorStorage.STORAGE_INSTANCE_ERROR")}return r}},br=tt;import V from"fs-extra";import Sr from"path";var rt=class{constructor(e){this.config=e,this.root=Sr.resolve(process.cwd(),this.config.path)}_getTargetPath(e){return Sr.join(this.root,e)}async put(e,r){let o=this._getTargetPath(e);V.ensureFileSync(o),await new Promise(s=>{let i=V.createWriteStream(o,{encoding:"utf8",start:0});r.pipe(i),r.on("end",()=>{s()})})}async get(e){let r=this._getTargetPath(e);if(await V.exists(r))return V.createReadStream(r)}async delete(e){let r=this._getTargetPath(e);await V.remove(r)}async exists(e){let r=this._getTargetPath(e);return await V.exists(r)}},vr=rt;import ks from"crypto";var Er=t=>{let e={},r=ks.createHash("md5"),o=0;return t.on("data",s=>{o+=s.length}),t.on("data",r.update.bind(r)),t.on("end",()=>{e.length=o,e.hash=r.digest("hex")}),e};var Y=class{constructor(e,r){if(this._logger=r,e)switch(e.type){case"aliyunOSS":this._instance=new br(e);break;case"file":this._instance=new vr(e);break;default:break}}async put(e,r){if(r=be(r),this._instance)try{let o=Er(r),s=await this._instance.put(e,r);return o.response=s,o}catch{throw new Error("sumorStorage.STORAGE_FILE_SAVE_FAILED")}else throw new Error("sumorStorage.STORAGE_NOT_CONNECTED")}async get(e,r){if(r=r||{},this._instance)try{let o=await this._instance.get(e,r);return await Se(o,r.type)}catch{throw new Error("sumorStorage.STORAGE_FILE_READ_FAILED")}else throw new Error("sumorStorage.STORAGE_NOT_CONNECTED")}async delete(e){if(this._instance)try{return await this._instance.delete(e)}catch{throw new Error("sumorStorage.STORAGE_FILE_DELETE_FAILED")}else throw new Error("sumorStorage.STORAGE_NOT_CONNECTED")}async info(e,r){if(this._instance)try{return await this._instance.info(e,r)}catch{throw new Error("sumorStorage.STORAGE_FILE_INFO_FAILED")}else throw new Error("sumorStorage.STORAGE_NOT_CONNECTED")}async exists(e){if(this._instance)try{return await this._instance.exists(e)}catch{throw new Error("sumorStorage.STORAGE_FILE_INFO_FAILED")}else throw new Error("sumorStorage.STORAGE_NOT_CONNECTED")}};var kr=async t=>{let e=t.sumor.getLogger("STORAGE");t.sumor.storage=new Y(t.sumor.config.storage,e),t.use((r,o,s)=>{let i=r.sumor.getLogger("STORAGE");r.sumor.storage=new Y(t.sumor.config.storage,i),s()})};import Ts from"@alicloud/sms-sdk";var ot,Z=class{constructor(e,r){this._config=e,this._logger=r||{error:console.log,debug:console.log,trace:console.log}}async send(e,r,o,s){let{signName:i,accessKeyId:n,secretAccessKey:m}=this._config;if(this._config&&!this._config.disable){switch(ot||(ot=new Ts({accessKeyId:n,secretAccessKey:m})),r){case 86:if(!o.match(/^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\d{8}$/))throw new Error("sumorSMS.MOBILE_FORMAT");break;default:throw await new Promise(a=>{setTimeout(()=>{a()},1e3)}),new Error("sumorSMS.MOBILE_PREFIX_NOT_SUPPORT")}try{await new Promise((a,c)=>{ot.sendSMS({PhoneNumbers:o,SignName:i,TemplateCode:e,TemplateParam:JSON.stringify(s)}).then(l=>{let{Code:u}=l;u==="OK"?a():c(u)},l=>{l.data?c(l.data.Code):c(l)})})}catch(a){let c=new Error("sumorSMS.SMS_SEND_FAILED");throw c.data={msg:a},c}}else this._logger.error(`\u6D88\u606F\u53D1\u9001\u529F\u80FD\u4E0D\u53EF\u7528\u3002\u9700\u8981\u53D1\u9001\u6D88\u606F${e}\u7ED9${r} ${o}\uFF0C\u53C2\u6570${JSON.stringify(s)}`)}};var Tr=async t=>{if(t.sumor.config.sms){let e=t.sumor.getLogger("SMS");t.sumor.sms=new Z(t.sumor.config.sms,e)}t.use((e,r,o)=>{if(t.sumor.config.sms){let s=e.sumor.getLogger("SMS");e.sumor.sms=new Z(t.sumor.config.sms,s)}o()})};import st from"axios";import Cs from"axios";import Os from"crypto";import Ns from"fs";var Ie=(t,e)=>{let r=`${process.cwd()}/${e.pay.privateKey}`,o=Ns.readFileSync(r,"utf8"),s=`${t.join(`
|
|
493
493
|
`)}
|
|
494
|
-
`;return Os.createSign("RSA-SHA256").update(s).sign(o,"base64")};var X=async(t,e)=>{let r="https://api.mch.weixin.qq.com",o=Math.floor(Date.now()/1e3),s=Math.random().toString(36).substr(2,15),i=Ie([t.method.toUpperCase(),t.url,o,s,t.body],e),n={"Content-Type":"application/json",Accept:"application/json",Authorization:`WECHATPAY2-SHA256-RSA2048 mchid="${e.pay.mchId}",nonce_str="${s}",signature="${i}",timestamp="${o}",serial_no="${e.pay.serialNo}"`};try{return(await Cs({method:t.method.toUpperCase(),url:r+t.url,data:t.body,headers:n})).data}catch(m){throw m.response}};var Or=async(t,e)=>{t.desc=t.desc||"\u865A\u62DF\u5546\u54C1";let r={method:"POST",url:"/v3/pay/transactions/jsapi",body:JSON.stringify({appid:e.key,mchid:e.pay.mchId,description:t.desc,out_trade_no:t.id,notify_url:e.pay.notifyUrl,amount:{total:Math.round(t.amount*100),currency:"CNY"},payer:{openid:t.openId}})};return(await X(r,e)).prepay_id};async function Nr(t,e){return await X({method:"POST",url:`/v3/pay/transactions/out-trade-no/${t}/close`,body:JSON.stringify({mchid:e.pay.mchId,out_trade_no:t})},e)}async function Cr(t,e){let r;try{r=await X({method:"GET",url:`/v3/pay/transactions/out-trade-no/${t}?mchid=${e.pay.mchId}`},e)}catch(o){if(o.status===404)r={trade_state:"NOTPAY"};else throw o}return r}var ce={order:Or,close:Nr,check:Cr,sign:Ie};var Ir=30*60*1e3,q=class{constructor(e,r,o){this._config=e,this._cache=r,this._name=e.name||"",this._logger=o,this._updatingToken=!1,e.pay&&(this.pay={order(s){return ce.order(s,e)},close(s){return ce.close(s,e)},check(s){return ce.check(s,e)},sign(s){return ce.sign(s,e)}})}async call(e,r){let o;try{r?o=await st.post(e,r):o=await st.get(e)}catch(i){let n=new Error("WECHAT_API_FAILED");throw n.data={msg:`\u5FAE\u4FE1\u670D\u52A1\u5668\u8FDE\u63A5\u5931\u8D25\uFF1A${i.message}`},n}if(!o.data.errcode)return o.data;this._logger.error();let s=new Error("WECHAT_ERROR");throw s.data={msg:o.data.errmsg},s}async init(e){this._app=e,this._logger.info(`\u5FAE\u4FE1\u6821\u9A8C\u6587\u4EF6\u5DF2\u542F\u52A8 /MP_verify_${this._config.verifyCode}.txt`),e.get(`/MP_verify_${this._config.verifyCode}.txt`,(r,o)=>{o.send(this._config.verifyCode)}),await this.getToken(),setInterval(()=>{this._logger.trace("\u5F00\u59CB\u68C0\u67E5\u5FAE\u4FE1\u670D\u52A1\u6388\u6743\u51ED\u8BC1\u662F\u5426\u8FC7\u671F"),this.getToken(),this._logger.trace("\u68C0\u67E5\u5FAE\u4FE1\u670D\u52A1\u6388\u6743\u51ED\u8BC1\u5DF2\u5B8C\u6210")},60*1e3)}async getToken(){let e=async()=>{let o=await this._cache.get("wechatAccessToken",this._name);return o&&(o=JSON.parse(o)),o=o||{},o.time=o.time||0,o},r=await e();return Date.now()-r.time>Ir&&(await this._refreshToken(),r=await e()),(!r||!r.token||Date.now()-r.time>Ir)&&this._logger.error("\u5FAE\u4FE1\u670D\u52A1\u6388\u6743\u51ED\u8BC1\u66F4\u65B0\u5931\u8D25"),r.token}async reloadUsers(){let e="",r,o=0,s=[],i=async()=>{let m=await this.list(e);r||(r=m.total),o+=m.count,s=s.concat(m.data.openid),o<r&&(e=m.next_openid,await i())};await i();let n=[];for(let m of s)n.push(await this.detail(m));return n}async list(e){e=e||"";let o=`https://api.weixin.qq.com/cgi-bin/user/get?access_token=${await this.getToken()}&next_openid=${e}`;return await this.call(o)}async detail(e){let o=`https://api.weixin.qq.com/cgi-bin/user/info?access_token=${await this.getToken()}&openid=${e}`;return await this.call(o)}async sendTemplateMessage(e,r,o,s){let i=await this.getToken(),n={};for(let a in s)n[a]={value:s[a]};let m=`https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=${i}`;try{await this.call(m,{touser:e,template_id:r,url:o,data:n}),this._logger.debug(`\u6A21\u7248\u6D88\u606F\u5DF2\u53D1\u9001\u7ED9${e}\uFF0C\u6A21\u7248${r}\uFF0C\u6570\u636E${JSON.stringify(s)}`)}catch(a){this._logger.error(`\u7ED9${e}\u7684\u6A21\u7248\u6D88\u606F\u53D1\u9001\u5931\u8D25\uFF0C\u6A21\u7248${r}\uFF0C\u6570\u636E${JSON.stringify(s)}`),this._logger.error(a)}}async updateMenu(e){let r=await this.getToken();await this.call(`https://api.weixin.qq.com/cgi-bin/menu/create?access_token=${r}`,e)}async _refreshToken(){if(!this._updatingToken){this._updatingToken=!0,this._logger.info("\u6B63\u5728\u66F4\u65B0\u5FAE\u4FE1\u670D\u52A1\u6388\u6743\u51ED\u8BC1");let e=`https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${this._config.key}&secret=${this._config.secret}`,r=await st.get(e);if(r.status===200){let o={};r.data.access_token?(o.token=r.data.access_token,o.time=Date.now(),this._logger.trace(`\u5FAE\u4FE1\u670D\u52A1\u6388\u6743\u51ED\u8BC1: ${o.token}`),this._logger.info("\u5FAE\u4FE1\u670D\u52A1\u6388\u6743\u51ED\u8BC1\u5DF2\u66F4\u65B0"),await this._cache.set("wechatAccessToken",this._name,JSON.stringify(o))):this._logger.error(r.data)}else
|
|
494
|
+
`;return Os.createSign("RSA-SHA256").update(s).sign(o,"base64")};var X=async(t,e)=>{let r="https://api.mch.weixin.qq.com",o=Math.floor(Date.now()/1e3),s=Math.random().toString(36).substr(2,15),i=Ie([t.method.toUpperCase(),t.url,o,s,t.body],e),n={"Content-Type":"application/json",Accept:"application/json",Authorization:`WECHATPAY2-SHA256-RSA2048 mchid="${e.pay.mchId}",nonce_str="${s}",signature="${i}",timestamp="${o}",serial_no="${e.pay.serialNo}"`};try{return(await Cs({method:t.method.toUpperCase(),url:r+t.url,data:t.body,headers:n})).data}catch(m){throw m.response}};var Or=async(t,e)=>{t.desc=t.desc||"\u865A\u62DF\u5546\u54C1";let r={method:"POST",url:"/v3/pay/transactions/jsapi",body:JSON.stringify({appid:e.key,mchid:e.pay.mchId,description:t.desc,out_trade_no:t.id,notify_url:e.pay.notifyUrl,amount:{total:Math.round(t.amount*100),currency:"CNY"},payer:{openid:t.openId}})};return(await X(r,e)).prepay_id};async function Nr(t,e){return await X({method:"POST",url:`/v3/pay/transactions/out-trade-no/${t}/close`,body:JSON.stringify({mchid:e.pay.mchId,out_trade_no:t})},e)}async function Cr(t,e){let r;try{r=await X({method:"GET",url:`/v3/pay/transactions/out-trade-no/${t}?mchid=${e.pay.mchId}`},e)}catch(o){if(o.status===404)r={trade_state:"NOTPAY"};else throw o}return r}var ce={order:Or,close:Nr,check:Cr,sign:Ie};var Ir=30*60*1e3,q=class{constructor(e,r,o){this._config=e,this._cache=r,this._name=e.name||"",this._logger=o,this._updatingToken=!1,e.pay&&(this.pay={order(s){return ce.order(s,e)},close(s){return ce.close(s,e)},check(s){return ce.check(s,e)},sign(s){return ce.sign(s,e)}})}async call(e,r){let o;try{r?o=await st.post(e,r):o=await st.get(e)}catch(i){let n=new Error("WECHAT_API_FAILED");throw n.data={msg:`\u5FAE\u4FE1\u670D\u52A1\u5668\u8FDE\u63A5\u5931\u8D25\uFF1A${i.message}`},n}if(!o.data.errcode)return o.data;this._logger.error();let s=new Error("WECHAT_ERROR");throw s.data={msg:o.data.errmsg},s}async init(e){this._app=e,this._logger.info(`\u5FAE\u4FE1\u6821\u9A8C\u6587\u4EF6\u5DF2\u542F\u52A8 /MP_verify_${this._config.verifyCode}.txt`),e.get(`/MP_verify_${this._config.verifyCode}.txt`,(r,o)=>{o.send(this._config.verifyCode)}),await this.getToken(),setInterval(()=>{this._logger.trace("\u5F00\u59CB\u68C0\u67E5\u5FAE\u4FE1\u670D\u52A1\u6388\u6743\u51ED\u8BC1\u662F\u5426\u8FC7\u671F"),this.getToken(),this._logger.trace("\u68C0\u67E5\u5FAE\u4FE1\u670D\u52A1\u6388\u6743\u51ED\u8BC1\u5DF2\u5B8C\u6210")},60*1e3)}async getToken(){let e=async()=>{let o=await this._cache.get("wechatAccessToken",this._name);return o&&(o=JSON.parse(o)),o=o||{},o.time=o.time||0,o},r=await e();return Date.now()-r.time>Ir&&(await this._refreshToken(),r=await e()),(!r||!r.token||Date.now()-r.time>Ir)&&this._logger.error("\u5FAE\u4FE1\u670D\u52A1\u6388\u6743\u51ED\u8BC1\u66F4\u65B0\u5931\u8D25"),r.token}async reloadUsers(){let e="",r,o=0,s=[],i=async()=>{let m=await this.list(e);r||(r=m.total),o+=m.count,s=s.concat(m.data.openid),o<r&&(e=m.next_openid,await i())};await i();let n=[];for(let m of s)n.push(await this.detail(m));return n}async list(e){e=e||"";let o=`https://api.weixin.qq.com/cgi-bin/user/get?access_token=${await this.getToken()}&next_openid=${e}`;return await this.call(o)}async detail(e){let o=`https://api.weixin.qq.com/cgi-bin/user/info?access_token=${await this.getToken()}&openid=${e}`;return await this.call(o)}async sendTemplateMessage(e,r,o,s){let i=await this.getToken(),n={};for(let a in s)n[a]={value:s[a]};let m=`https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=${i}`;try{await this.call(m,{touser:e,template_id:r,url:o,data:n}),this._logger.debug(`\u6A21\u7248\u6D88\u606F\u5DF2\u53D1\u9001\u7ED9${e}\uFF0C\u6A21\u7248${r}\uFF0C\u6570\u636E${JSON.stringify(s)}`)}catch(a){this._logger.error(`\u7ED9${e}\u7684\u6A21\u7248\u6D88\u606F\u53D1\u9001\u5931\u8D25\uFF0C\u6A21\u7248${r}\uFF0C\u6570\u636E${JSON.stringify(s)}`),this._logger.error(a)}}async updateMenu(e){let r=await this.getToken();await this.call(`https://api.weixin.qq.com/cgi-bin/menu/create?access_token=${r}`,e)}async _refreshToken(){if(!this._updatingToken){this._updatingToken=!0,this._logger.info("\u6B63\u5728\u66F4\u65B0\u5FAE\u4FE1\u670D\u52A1\u6388\u6743\u51ED\u8BC1");let e=`https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${this._config.key}&secret=${this._config.secret}`,r=await st.get(e);if(r.status===200){let o={};r.data.access_token?(o.token=r.data.access_token,o.time=Date.now(),this._logger.trace(`\u5FAE\u4FE1\u670D\u52A1\u6388\u6743\u51ED\u8BC1: ${o.token}`),this._logger.info("\u5FAE\u4FE1\u670D\u52A1\u6388\u6743\u51ED\u8BC1\u5DF2\u66F4\u65B0"),await this._cache.set("wechatAccessToken",this._name,JSON.stringify(o))):this._logger.error(r.data)}else{let o=r.data;try{o=JSON.stringify(r.data)}catch{}this._logger.error(o)}this._updatingToken=!1}}};var Dr=async t=>{if(t.sumor.config.wechat){let e=t.sumor.getLogger("WECHAT");e.debug("\u5FAE\u4FE1\u670D\u52A1\u5668\u6B63\u5728\u542F\u52A8");let r;t.sumor.config.wechat.cache?r=(await Ce(t.sumor.config.wechat.cache,e))(e):r=t.sumor.cache,e.trace(`\u5FAE\u4FE1\u670D\u52A1\u5668\u914D\u7F6E\u4FE1\u606F ${JSON.stringify(t.sumor.config.wechat)}`),t.sumor.wechat=new q(t.sumor.config.wechat,r,e),await t.sumor.wechat.init(t),e.debug("\u5FAE\u4FE1\u670D\u52A1\u5668\u5DF2\u542F\u52A8"),t.use((o,s,i)=>{let n=o.sumor.getLogger("WECHAT");o.sumor.wechat=new q(t.sumor.config.wechat,n),i()})}};var Rr=async t=>{await Xt(t),await _r(t),await qt(t),await er(t),await tr(t),await rr(t),await Te(t),await ar(t),await cr(t),await mr(t),await yr(t),await xr(t),await $r(t),await kr(t),await Tr(t),await Dr(t)};var Ar=(t,e,r)=>{let o=`/${t.replace(/\./g,"/")}`,s=`${e.sumor.root}/tmp/uploads`,i=e.uploader(e.sumor.meta.api[t].parameters);return i?e.all(o,i,(n,m,a)=>{let c={};if(n.files)for(let l in n.files){let u=[];for(let f in n.files[l])u.push({name:n.files[l][f].originalname,size:n.files[l][f].size,mime:n.files[l][f].mimetype,encoding:n.files[l][f].encoding,path:`${s}/${n.files[l][f].filename}`});c[l]=u}Object.assign(n.sumor.data,c),a()},r):e.all(o,(n,m,a)=>{a()},r),!!i};var Lr=(t,e)=>{for(let r in e.parameters){let o=e.parameters[r];switch(o.default!==void 0&&(o.type==="string"?(t[r]===null||t[r]===void 0||t[r]==="")&&(t[r]=o.default):(t[r]===null||t[r]===void 0)&&(t[r]=o.default)),o.type){case"string":t[r]!==null&&t[r]!==void 0&&typeof t[r]!="string"&&(t[r]=t[r].toString());break;case"number":typeof t[r]!="number"&&t[r]!==null&&t[r]!==void 0&&(typeof t[r]=="string"?(t[r]=parseFloat(t[r]),isNaN(t[r])&&(t[r]=null)):delete t[r]);break;default:break}if(t[r]&&(o.trim&&(t[r]=t[r].trim()),o.upperCase&&(t[r]=t[r].toUpperCase()),o.lowerCase&&(t[r]=t[r].toLowerCase())),o.required===!0&&(t[r]===void 0||t[r]===null||t[r]===""))throw new Error("sumorApp.REQUIRED");if(o.length&&t[r]&&t[r].length>o.length){let s=new Error("sumorApp.LENGTH_OUT_OF_LIMIT");throw s.data={length:o.length},s}for(let s of o.rule)if(!new RegExp(s.expression).test(t[r]))throw new Error(s.text)}return t};var Pr=async t=>{let e=Object.keys(t.sumor.meta.api);e.sort((r,o)=>r>o?1:-1);for(let r of e){let o=`/${r.replace(/\./g,"/")}`,i=Ar(r,t,async function(n,m,a){n.sumor.meta=t.sumor.meta,n.sumor.cors=!0,n.sumor.response.changed=!0,t.sumor.meta.event.context&&await t.sumor.meta.event.context.program(n.sumor,n,m);try{let c=t.sumor.meta.api[r];n.sumor.data=Lr(n.sumor.data,c);let l=await c.program(n.sumor,n,m);n.sumor.response.data=l||n.sumor.response.data,await n.sumor.db.commit()}catch(c){try{await n.sumor.db.rollback()}catch{}n.sumor.response.error(c.message);let l="";c instanceof Error&&(l=t.sumor.text(c.message)),n.sumor.logger.debug(`\u5916\u90E8\u8BF7\u6C42\u51FA\u9519\uFF1A${c.message} ${l}`),n.sumor.logger.trace(c)}a()});t.sumor.exposeApis[o]={name:t.sumor.meta.api[r].name||"",desc:t.sumor.meta.api[r].desc||"",parameters:t.sumor.meta.api[r].parameters||{}},t.sumor.logger.info(`\u63A5\u53E3\u5DF2\u5C31\u7EEA\uFF1A${o}${i?" (\u5141\u8BB8\u6587\u4EF6\u4E0A\u4F20)":""}`)}t.sumor.logger.info("\u6240\u6709\u63A5\u53E3\u5DF2\u5C31\u7EEA")};import{createProxyMiddleware as Ms}from"http-proxy-middleware";var Fr=t=>{t.use((e,r,o)=>{e.sumor.cors&&(r.header("Access-Control-Allow-Origin","*"),r.header("Access-Control-Allow-Headers","X-Requested-With"),r.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS")),o()})};import Is from"fs-extra";var jr=t=>{t.use(async(e,r,o)=>{if(e.files){let s=`${t.sumor.root}/tmp/uploads`;for(let i in e.files)for(let n in e.files[i]){let m=`${s}/${e.files[i][n].filename}`;await Is.remove(m)}}o()})};var Mr=t=>{t.use((e,r,o)=>{e.sumor.saveCookie(),e.sumor.response.respond?e.sumor.response.end():e.sumor.response.changed?e.sumor.response.send():o()})};import it from"fs-extra";import Ur from"node:path";import Ds from"serve-static";import Rs from"fs";import{pathToFileURL as As}from"url";var zr=async t=>{let e="/",r=Ur.resolve(process.cwd(),"./output/web");if(await it.exists(r)){let o=await it.readFile(`${r}/client/index.html`,"utf-8"),s=JSON.parse(await it.readFile(`${r}/client/ssr-manifest.json`,"utf-8"));t.use(e,Ds(`${r}/client`,{index:!1}));let i;try{let n=Ur.resolve(r,"./server/entry-server.js");Rs.existsSync(n)&&(i=await import(As(n)),i=i.render)}catch(n){Te.error("ssrServerEntry load failed",n.stack)}t.use("*",async(n,m)=>{try{let a=n.originalUrl.replace(e,"/"),c=n.sumor.ssrContext,[l,u]=await i(a,s,c),f=`<title>${c.pageInfo.title}</title>
|
|
495
495
|
<meta name="description" content="${c.pageInfo.description}" />
|
|
496
496
|
<meta name="keywords" content="${c.pageInfo.keywords}" />`,w=o.replace("<!--app-page-info-->",f).replace("<!--preload-links-->",u).replace("<!--app-html-->",l);m.status(200).set({"Content-Type":"text/html"}).end(w)}catch(a){console.log(a.stack),m.status(500).end(a.stack)}})}};import Ls from"compression";import Ps from"zlib";import Fs from"serve-static";import js from"fs-extra";var Br=async t=>{let e=`${t.sumor.root}/static`;t.use(Ls({filter(){return!0},flush:Ps.Z_SYNC_FLUSH})),await js.exists(e)&&t.use(Fs(e))};var Hr=async t=>{if(await Fr(t),await jr(t),await Mr(t),await Br(t),t.sumor.mode==="development"){let e=`http://localhost:${t.sumor.uiPort}`;t.use("*",Ms({target:e,changeOrigin:!0,ws:!0,logProvider:function(o){let s=i=>{};return{log:s,debug:s,info:s,warn:s,error:s}}}))}(t.sumor.mode==="production"||t.sumor.mode==="preview")&&await zr(t)};import Gr from"http";import Us from"https";import"spdy";var De=t=>{let e=[];return t.on("connection",o=>{e.push(o),o.once("close",()=>{e.splice(e.indexOf(o),1)})}),async()=>await new Promise(o=>{e.forEach(s=>{s.destroy()}),t.close(()=>{o()})})};var Jr=async t=>{let e=t.sumor.port;if(t.sumor.protocol==="https"){let r;if(e===443){let i=Gr.createServer((n,m)=>{let a=`https://${n.headers.host}${n.url}`;m.writeHead(301,{Location:a}),m.end()});r=await new Promise(n=>{i.listen(80,()=>{n(De(i))})}),t.sumor.logger.info("http\u670D\u52A1\u5DF2\u542F\u52A8\uFF0C\u8BBF\u95EE\u5C06\u8DF3\u8F6C\u81F3https")}let o;o=Us.createServer({...t.sumor.ssl},t),o.on("error",i=>{t.sumor.logger.error(i)});let s=await new Promise(i=>{o.listen(e,()=>{i(De(o))})});t.sumor.close=async()=>{t.sumor.logger.info("\u6B63\u5728\u7EC8\u6B62\u7F51\u9875\u670D\u52A1"),r&&await r(),await s(),t.sumor.logger.info("\u7F51\u9875\u670D\u52A1\u5DF2\u505C\u6B62\u8FD0\u884C")}}else{let r=Gr.createServer(t),o=await new Promise(s=>{r.listen(e,()=>{s(De(r))})});t.sumor.close=async()=>{t.sumor.logger.info("\u6B63\u5728\u7EC8\u6B62\u7F51\u9875\u670D\u52A1"),await o(),t.sumor.logger.info("\u7F51\u9875\u670D\u52A1\u5DF2\u505C\u6B62\u8FD0\u884C")}}};var Wr=async t=>{let e=zs();e.disable("x-powered-by"),e.sumor=t,e.sumor.app=e,e.use((r,o,s)=>{r.sumor=t.getContext(),r.sumor.ssrContext={pageInfo:{title:"",description:"",keywords:""}},r.sumor.cors=!1,s()}),await Rr(e),e.use((r,o,s)=>{r.sumor.logger.trace(`\u4F1A\u8BDD\u4EA4\u4E92\u5BF9\u8C61: ${Object.keys(r.sumor).join(", ")}`),s()}),e.sumor.logger.debug("\u524D\u7F6E\u4E2D\u95F4\u4EF6\u52A0\u8F7D\u5B8C\u6210"),e.sumor.meta.event.setup&&await e.sumor.meta.event.setup.program(e.sumor),e.sumor.meta.event.prepare&&await e.sumor.meta.event.prepare.program(e.sumor),await Pr(e),e.sumor.logger.debug("\u5904\u7406\u7A0B\u5E8F\u52A0\u8F7D\u5B8C\u6210"),e.sumor.meta.event.serve&&await e.sumor.meta.event.serve.program(e.sumor),await Hr(e),e.sumor.logger.debug("\u540E\u7F6E\u4E2D\u95F4\u4EF6\u52A0\u8F7D\u5B8C\u6210"),await Jr(e),e.sumor.meta.event.served&&await e.sumor.meta.event.served.program(e.sumor),e.sumor.logger.info(`\u5E94\u7528\u5DF2\u8FD0\u884C\u5728 ${e.sumor.origin}`),e.sumor.mode==="production"&&process.on("uncaughtException",r=>{e.sumor.logger.error("\u672A\u6355\u6349\u9519\u8BEF"),e.sumor.logger.error(r)})};import{build as Kr,defineConfig as Vr}from"vite";var Yr=async t=>{await xe(t,!0);let e=await re(t);e.build.ssrManifest=!0,e.build.outDir="../../output/web/client",e.build.emptyOutDir=!0,await Kr(Vr(e));let r=await re(t);r.build.ssr="src/entry-server.js",r.build.outDir="../../output/web/server",r.build.emptyOutDir=!0,await Kr(Vr(r))};var Zr=async t=>{let e=t.config.database,r=t.getLogger("DATABASE");await Ne.install({config:e,logger:r,entity:t.meta.entity,view:t.meta.view})};var N=async t=>{t=t||{};let e=await Yt(t);e.logger.info(`\u65E5\u5FD7\u8BB0\u5F55\u7EA7\u522B\uFF1A${e.logLevel.toUpperCase()}`),e.logger.info(`\u8FD0\u884C\u6A21\u5F0F\uFF1A${e.mode.toUpperCase()}`),e.logger.trace(`\u5168\u5C40\u4EA4\u4E92\u5BF9\u8C61: ${Object.keys(e).join(", ")}`),e.logger.trace(`\u914D\u7F6E\u4FE1\u606F: ${JSON.stringify(e.config,null,4)}`),e.mode==="development"&&(e.logger.info("\u5F00\u59CB\u51C6\u5907\u5F00\u53D1\u73AF\u5883"),await xt(e),e.logger.info("\u5F00\u53D1\u73AF\u5883\u51C6\u5907\u5B8C\u6210")),(e.mode==="build"||e.mode==="preview")&&(e.logger.info("\u5F00\u59CB\u751F\u6210\u751F\u4EA7\u4EE3\u7801"),await Yr(e),e.logger.info("\u751F\u4EA7\u4EE3\u7801\u751F\u6210\u5B8C\u6BD5")),e.mode==="setup"&&(e.logger.info("\u5F00\u59CB\u90E8\u7F72\u6570\u636E\u5E93"),await Zr(e),e.logger.info("\u90E8\u7F72\u6570\u636E\u5E93\u5B8C\u6210")),(e.mode==="development"||e.mode==="preview"||e.mode==="production")&&(e.logger.info("\u5F00\u59CB\u542F\u52A8\u5BF9\u5916\u670D\u52A1"),await Wr(e),e.logger.info("\u5BF9\u5916\u670D\u52A1\u542F\u52A8\u5B8C\u6210"))};import{Command as li}from"commander";import ui from"fs-extra";var Xr=(t,e)=>{console.log(`
|
|
497
497
|
========================================================
|
|
@@ -527,7 +527,7 @@ WORKDIR /usr/source
|
|
|
527
527
|
COPY ./source /usr/source
|
|
528
528
|
RUN npm install
|
|
529
529
|
|
|
530
|
-
CMD ["npm", "start"]`,i=`/tmp/sumor-deployer-version/${e}_${r}`,n=`${i}/source`;
|
|
530
|
+
CMD ["npm", "start"]`,i=`/tmp/sumor-deployer-version/${e}_${r}`,n=`${i}/source`;await t.file.ensureDir(n),await t.file.putFolder(o,n),await t.file.exists(`${n}/.npmrc`)||await t.file.writeFile(`${n}/.npmrc`,`registry=https://registry.npmmirror.com
|
|
531
531
|
sass_binary_site=https://registry.npmmirror.com/mirrors/node-sass/
|
|
532
532
|
sharp_binary_host=https://registry.npmmirror.com/mirrors/sharp
|
|
533
533
|
sharp_libvips_binary_host=https://registry.npmmirror.com/mirrors/sharp-libvips
|
|
@@ -536,7 +536,7 @@ puppeteer_download_host=https://registry.npmmirror.com/mirrors/
|
|
|
536
536
|
phantomjs_cdnurl=https://registry.npmmirror.com/mirrors/phantomjs/
|
|
537
537
|
sentrycli_cdnurl=https://registry.npmmirror.com/mirrors/sentry-cli/
|
|
538
538
|
sqlite3_binary_site=https://registry.npmmirror.com/mirrors/sqlite3/
|
|
539
|
-
python_mirror=https://registry.npmmirror.com/mirrors/python
|
|
539
|
+
python_mirror=https://registry.npmmirror.com/mirrors/python/`),await t.file.writeFile(`${i}/Dockerfile`,s);let m=await this.execCommand(`docker build -t ${e}:${r} .`,{cwd:i});console.log(m),await t.file.remove(i)},async instances(){let e=await this._checkInfo("docker ps -a",["Names","CreatedAt","Status","Ports","Size"]);for(let r in e){e[r].instanceId=e[r].Names;let o=e[r].CreatedAt.split(" ");o.pop(),e[r].createdTime=new Date(o.join(" "))}return e},async instance(e){return(await this.instances()).filter(o=>o.instanceId===e)[0]},async _checkInfo(e,r){let o=[];for(let n in r)o.push(`{{.${r[n]}}}`);let s=await this.execCommand(`${e} --format "${o.join("|")}"`),i=[];if(s!==""){let n=s.split(`
|
|
540
540
|
`);for(let m in n){let a=n[m].split("|"),c={};for(let l=0;l<r.length;l++)c[r[l]]=a[l];i.push(c)}}return i}});var k=async(t,e)=>{let r;try{let o=await t.exec(e);r=parseFloat(o,10)}catch(o){console.log(o)}return r},po=t=>({async system(){let e=await k(t,"cat /proc/uptime | awk '{print $1}'");return e=Date.now()-parseInt(e*1e3,10),{disk:{total:await k(t,"df -m --output=size / | awk 'NR==2{print $1}'"),used:await k(t,"df -m --output=used / | awk 'NR==2{print $1}'"),free:await k(t,"df -m --output=avail / | awk 'NR==2{print $1}'")},memory:{total:await k(t,"free -m | awk 'NR==2{print $2}'"),used:await k(t,"free -m | awk 'NR==2{print $3}'"),free:await k(t,"free -m | awk 'NR==2{print $4}'"),cache:await k(t,"free -m | awk 'NR==2{print $6}'")},cpu:{usage:await k(t,`top -b -n 1 | grep "Cpu(s)" | awk '{print $2 + $4}'`),cores:await k(t,'cat /proc/cpuinfo | grep "processor" | wc -l')},uptime:e}}});import ri from"path";var go=t=>({async install(e){await t.exec(`npm i -g ${e}`)},async start(e,r){try{await t.install("nodejs"),await t.install("npm")}catch(s){console.log(s)}let o=!0;try{await t.exec("pm2 -v")}catch{o=!1}o||await t.node.install("pm2"),await t.exec("npm i",{cwd:ri.dirname(r)});try{await t.exec(`pm2 start ${r} --name ${e}`)}catch{await t.exec(`pm2 restart ${e}`)}},async stop(e){await t.exec(`pm2 stop ${e}`),await t.exec(`pm2 delete ${e}`)},async logs(e){return await t.exec(`pm2 logs --nostream --lines 1000 ${e}`)}});var S=t=>{let e=new ue(t);return e.addTool("file",lo),e.addTool("port",uo),e.addTool("docker",fo),e.addTool("node",go),e.addTool("monitor",po),e};var wo=async t=>{let e={};for(let r in t.server){let o=S(t.server[r]),s=await o.docker.instances();s=s.filter(i=>i.instanceId.indexOf("sumor_app")===0),e[r]=s.map(i=>i.instanceId),await o.disconnect()}return e};import L from"fs-extra";var ho=async(t,e)=>{await x(t,"clean -df"),await x(t,`checkout ${e}`)};var yo=async({server:t,app:e,env:r,git:o,version:s,domain:i})=>{let n=S(t);if(!await(async()=>!!(await n.docker.images()).find(y=>y.Repository===e&&y.Tag===s.name))()){console.log("\u5F00\u59CB\u6784\u5EFA\u4EE3\u7801");let g=o.url.split("/"),h=`${g[0]}//${o.username}:${o.password}@${g[2]}/${g.slice(3,g.length).join("/")}`,y=`${process.cwd()}/tmp/build/${e}/${s.name}`;if(!await L.exists(y)){console.log(`\u6B63\u5728\u6784\u5EFA\u6E90\u4EE3\u7801\u5230${y}`),await L.ensureDir(`${process.cwd()}/tmp/build`);try{await Le(y,h),await ho(y,s.id),await v("npm i",{cwd:y}),await v("npm run build",{cwd:y}),await L.remove(`${y}/web`),await L.remove(`${y}/node_modules`),await L.remove(`${y}/tmp`)}catch(O){console.log(O)}}console.log("\u4EE3\u7801\u6784\u5EFA\u5B8C\u6210"),console.log(`\u6B63\u5728\u6784\u5EFA\u7248\u672C${s.name}\u955C\u50CF`),await n.docker.buildNode(e,s.name,y),console.log("\u6784\u5EFA\u7248\u672C\u955C\u50CF\u5B8C\u6210")}console.log("\u90E8\u7F72\u5BB9\u5668\u5B9E\u4F8B");let c=`${process.cwd()}/tmp/env/${e}/${r}`;console.log(`\u6B63\u5728\u914D\u7F6E\u73AF\u5883\u76F8\u5173\u4EE3\u7801\u5230${c}`);let l=`${process.cwd()}/assets/${e}/${r}`;await L.exists(l)&&await L.copy(l,c);let u=await n.port.getPort(),f={app:e,env:r,version:s.name,server:t.name,port:u,upTime:Date.now(),versionTime:s.committerDate},w=`/usr/sumor-cloud/env/${e}_${r}`;await n.file.putFolder(c,w),await L.remove(c);let d=`/usr/sumor-cloud/instance/${e}_${r}/${Date.now()}.json`;await n.file.writeFile(d,JSON.stringify(f,null,4));let p=`sumor_app_${e}_${r}_${s.name}_${u}`;return console.log(`\u6B63\u5728\u90E8\u7F72\u5B9E\u4F8B\u5230\u5BB9\u5668${p}`),await n.docker.execCommand(`docker run -itd --restart=on-failure -v ${d}:/usr/source/instance.json:ro -v ${w}:/usr/source/config:ro -v /usr/sumor-cloud/ssl/${i}:/usr/source/ssl:ro -p ${u}:443 --name ${p} -d ${e}:${s.name}`),await n.disconnect(),p};var $o=t=>{let e=t.split("_");e.shift();let r=e.shift(),o=e.shift(),s=e.shift(),i,n,m;e.length>1?(n=e.shift(),i=parseInt(e.shift())):m=e.shift();let a={type:r,app:o,env:s,port:i,version:n,action:m};for(let c in a)a[c]||delete a[c];return a};var je=t=>{let e=typeof t;if(t===null)e="null";else if(e==="object"){let r=Object.prototype.toString.call(t);r==="[object Array]"?e="array":r==="[object RegExp]"&&(e="regexp")}return e};var P=(t,e)=>(je(e)==="array"&&(e=e.join(" ")),`${t} ${e};`);var ee=t=>{let e=[];for(let r in t)e.push(P(r,t[r]));return e};var te=t=>{let e=[];for(let r in t)if(je(t[r])==="array")for(let o in t[r])e.push(t[r][o]);else e.push(t[r]);return e};var T=(t,e)=>(e=te(e),te([`${t} {`,e.map(r=>` ${r}`),"}"]));var xo=()=>T("server",["listen 80 default_server;","server_name _;","return 301 https://$host$request_uri;"]);var _o=(t,e)=>T(`upstream ${t}_stream`,e.map(r=>{let o=["server"];return o.push(r.url),r.down?o.push("down"):r.backup?o.push("backup"):(r.weight&&!isNaN(r.weight)&&o.push(`weight=${r.weight}`),r.try&&!isNaN(r.try)&&(o.push(`max_fails=${r.try}`),r.wait&&!isNaN(r.wait)&&o.push(`fail_timeout=${r.wait}s`))),`${o.join(" ")};`}));var bo=t=>{let e;return t.instances.length>0?e=ee({"proxy_set_header Host":"$host","proxy_set_header X-Real-IP":"$remote_addr","proxy_set_header X-Forwarded-For":"$remote_addr",proxy_pass:`https://${t.name}_stream`}):e=ee({root:"/etc/nginx/pages",index:"no_instance.html"}),T("server",[ee({listen:`${t.port} ssl`,server_name:t.domain,access_log:`/tmp/${t.name}_access.log`,error_log:`/tmp/${t.name}_error.log`,ssl_certificate:`ssl/${t.domain}/domain.cer`,ssl_certificate_key:`ssl/${t.domain}/domain.key`,ssl_client_certificate:`ssl/${t.domain}/ca.cer`,ssl_session_timeout:"5m",ssl_ciphers:"ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4",ssl_protocols:"TLSv1 TLSv1.1 TLSv1.2",ssl_prefer_server_ciphers:"on"}),T("location /",[e])])};var So=(t,e)=>{e=e||{},e.user=e.user||"root";let r=[];for(let o of t)o.port=o.port||443,o.instances.length>0&&r.push(_o(o.name,o.instances)),r.push(bo(o));return te([ee({user:e.user,worker_processes:1}),T("events",["worker_connections 1024;"]),T("http",[P("proxy_connect_timeout","600s"),P("proxy_send_timeout","600s"),P("proxy_read_timeout","600s"),P("server_tokens","off"),P("client_max_body_size","10m"),xo(),te(r)])]).join(`
|
|
541
541
|
`)};var oi=`<html>
|
|
542
542
|
<head>
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"sumor","type":"module","bin":{"sumor":"cli.js","sr":"cli.js"},"main":"./index.es.js","module":"./index.es.js","exports":{".":{"import":"./index.es.js"}},"dependencies":{"@vitejs/plugin-vue":"^4.2.3","chalk":"^5.3.0","commander":"^11.0.0","esbuild":"^0.19.3","fs-extra":"^11.1.1","vite":"^4.4.9","axios":"^1.4.0","@alicloud/sms-sdk":"^1.1.6","ali-oss":"6.1.1","body-parser":"^1.20.1","compression":"^1.7.4","cookie-parser":"^1.4.6","express":"^4.18.2","knex":"^2.1.0","multer":"^1.4.2","mysql2":"^3.1.0","serve-static":"^1.14.1","spdy":"^4.0.2","uuid":"^3.3.2","glob":"^10.3.4","jsrsasign":"^10.8.6","yaml":"^2.3.2","chokidar":"^3.5.3","http-proxy-middleware":"^2.0.6","archiver":"^2.1.1","extract-zip":"^1.6.6","inquirer":"^8.2.5","node-ssh":"^6.0.0","os-utils":"0.0.14","vite-plugin-rewrite-all":"^1.0.1"},"version":"1.3.
|
|
1
|
+
{"name":"sumor","type":"module","bin":{"sumor":"cli.js","sr":"cli.js"},"main":"./index.es.js","module":"./index.es.js","exports":{".":{"import":"./index.es.js"}},"dependencies":{"@vitejs/plugin-vue":"^4.2.3","chalk":"^5.3.0","commander":"^11.0.0","esbuild":"^0.19.3","fs-extra":"^11.1.1","vite":"^4.4.9","axios":"^1.4.0","@alicloud/sms-sdk":"^1.1.6","ali-oss":"6.1.1","body-parser":"^1.20.1","compression":"^1.7.4","cookie-parser":"^1.4.6","express":"^4.18.2","knex":"^2.1.0","multer":"^1.4.2","mysql2":"^3.1.0","serve-static":"^1.14.1","spdy":"^4.0.2","uuid":"^3.3.2","glob":"^10.3.4","jsrsasign":"^10.8.6","yaml":"^2.3.2","chokidar":"^3.5.3","http-proxy-middleware":"^2.0.6","archiver":"^2.1.1","extract-zip":"^1.6.6","inquirer":"^8.2.5","node-ssh":"^6.0.0","os-utils":"0.0.14","vite-plugin-rewrite-all":"^1.0.1"},"version":"1.3.1"}
|