@nocobase/plugin-async-task-manager 2.0.0-beta.2 → 2.0.0-beta.20
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/index.js +1 -1
- package/dist/common/constants.d.ts +2 -2
- package/dist/common/constants.js +1 -1
- package/dist/externalVersion.js +6 -6
- package/dist/locale/en-US.json +2 -0
- package/dist/locale/zh-CN.json +2 -0
- package/dist/server/base-concurrency-monitor.d.ts +20 -0
- package/dist/server/base-concurrency-monitor.js +63 -0
- package/dist/server/base-task-manager.d.ts +16 -1
- package/dist/server/base-task-manager.js +54 -8
- package/dist/server/command-task-type.js +36 -8
- package/dist/server/interfaces/concurrency-monitor.d.ts +16 -0
- package/dist/server/interfaces/concurrency-monitor.js +24 -0
- package/package.json +2 -2
package/dist/client/index.js
CHANGED
|
@@ -7,4 +7,4 @@
|
|
|
7
7
|
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("react"),require("dayjs"),require("@nocobase/client"),require("@nocobase/utils/client"),require("antd"),require("react-i18next")):"function"==typeof define&&define.amd?define("@nocobase/plugin-async-task-manager",["react","dayjs","@nocobase/client","@nocobase/utils/client","antd","react-i18next"],t):"object"==typeof exports?exports["@nocobase/plugin-async-task-manager"]=t(require("react"),require("dayjs"),require("@nocobase/client"),require("@nocobase/utils/client"),require("antd"),require("react-i18next")):e["@nocobase/plugin-async-task-manager"]=t(e.react,e.dayjs,e["@nocobase/client"],e["@nocobase/utils/client"],e.antd,e["react-i18next"])}(self,function(e,t,n,r,o,a){var i={379:function(e,t,n){e.exports=function(e){"use strict";var t={name:"zh-cn",weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),ordinal:function(e,t){return"W"===t?e+"周":e+"日"},weekStart:1,yearStart:4,formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日Ah点mm分",LLLL:"YYYY年M月D日ddddAh点mm分",l:"YYYY/M/D",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},relativeTime:{future:"%s内",past:"%s前",s:"几秒",m:"1 分钟",mm:"%d 分钟",h:"1 小时",hh:"%d 小时",d:"1 天",dd:"%d 天",M:"1 个月",MM:"%d 个月",y:"1 年",yy:"%d 年"},meridiem:function(e,t){var n=100*e+t;return n<600?"凌晨":n<900?"早上":n<1100?"上午":n<1300?"中午":n<1800?"下午":"晚上"}};return(e&&"object"==typeof e&&"default"in e?e:{default:e}).default.locale(t,null,!0),t}(n(760))},809:function(e){e.exports=function(e,t,n){e=e||{};var r=t.prototype,o={future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"};function a(e,t,n,o){return r.fromToBase(e,t,n,o)}n.en.relativeTime=o,r.fromToBase=function(t,r,a,i,s){for(var l,c,u,f=a.$locale().relativeTime||o,p=e.thresholds||[{l:"s",r:44,d:"second"},{l:"m",r:89},{l:"mm",r:44,d:"minute"},{l:"h",r:89},{l:"hh",r:21,d:"hour"},{l:"d",r:35},{l:"dd",r:25,d:"day"},{l:"M",r:45},{l:"MM",r:10,d:"month"},{l:"y",r:17},{l:"yy",d:"year"}],d=p.length,y=0;y<d;y+=1){var m=p[y];m.d&&(l=i?n(t).diff(a,m.d,!0):a.diff(t,m.d,!0));var b=(e.rounding||Math.round)(Math.abs(l));if(u=l>0,b<=m.r||!m.r){b<=1&&y>0&&(m=p[y-1]);var v=f[m.l];s&&(b=s(""+b)),c="string"==typeof v?v.replace("%d",b):v(b,r,m.l,u);break}}if(r)return c;var h=u?f.future:f.past;return"function"==typeof h?h(c):h.replace("%s",c)},r.to=function(e,t){return a(e,t,this,!0)},r.from=function(e,t){return a(e,t,this)};var i=function(e){return e.$u?n.utc():n()};r.toNow=function(e){return this.to(i(this),e)},r.fromNow=function(e){return this.from(i(this),e)}}},772:function(e){"use strict";e.exports=n},584:function(e){"use strict";e.exports=r},721:function(e){"use strict";e.exports=o},760:function(e){"use strict";e.exports=t},156:function(t){"use strict";t.exports=e},238:function(e){"use strict";e.exports=a}},s={};function l(e){var t=s[e];if(void 0!==t)return t.exports;var n=s[e]={exports:{}};return i[e].call(n.exports,n,n.exports,l),n.exports}l.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return l.d(t,{a:t}),t},l.d=function(e,t){for(var n in t)l.o(t,n)&&!l.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},l.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},l.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var c={};return!function(){"use strict";l.r(c),l.d(c,{PluginAsyncTaskManagerClient:function(){return Y},default:function(){return M}});var e,t=l(584),n=l(772),r=l(156),o=l.n(r),a=l(721),i=l(238),s=l(760),u=l.n(s);l(379);var f=l(809),p=l.n(f),d=JSON.parse('{"u2":"@nocobase/plugin-async-task-manager"}');function y(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var m="@nocobase/plugin-async-task-manager",b={PENDING:null,RUNNING:0,SUCCEEDED:1,FAILED:-1,CANCELED:-2},v=(y(e={},b.PENDING,{value:b.PENDING,label:"{{t('Waiting', { ns: '".concat(m,"' })}}"),color:"default",icon:"ClockCircleOutlined"}),y(e,b.RUNNING,{value:b.RUNNING,label:"{{t('Processing', { ns: '".concat(m,"' })}}"),color:"processing",icon:"LoadingOutlined"}),y(e,b.SUCCEEDED,{value:b.SUCCEEDED,label:"{{t('Completed', { ns: '".concat(m,"' })}}"),color:"success",icon:"CheckCircleOutlined"}),y(e,b.FAILED,{value:b.FAILED,label:"{{t('Failed', { ns: '".concat(m,"' })}}"),color:"error",icon:"CloseCircleOutlined"}),y(e,b.CANCELED,{value:b.CANCELED,label:"{{t('Canceled', { ns: '".concat(m,"' })}}"),color:"warning",icon:"StopOutlined"}),e);function h(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function g(e,t,n,r,o,a,i){try{var s=e[a](i),l=s.value}catch(e){n(e);return}s.done?t(l):Promise.resolve(l).then(r,o)}function E(e){return function(){var t=this,n=arguments;return new Promise(function(r,o){var a=e.apply(t,n);function i(e){g(a,r,o,i,s,"next",e)}function s(e){g(a,r,o,i,s,"throw",e)}i(void 0)})}}function k(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n,r,o=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=o){var a=[],i=!0,s=!1;try{for(o=o.call(e);!(i=(n=o.next()).done)&&(a.push(n.value),!t||a.length!==t);i=!0);}catch(e){s=!0,r=e}finally{try{i||null==o.return||o.return()}finally{if(s)throw r}}return a}}(e,t)||w(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function w(e,t){if(e){if("string"==typeof e)return h(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return h(e,t)}}function O(e,t){var n,r,o,a,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return a={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function s(a){return function(s){var l=[a,s];if(n)throw TypeError("Generator is already executing.");for(;i;)try{if(n=1,r&&(o=2&l[0]?r.return:l[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,l[1])).done)return o;switch(r=0,o&&(l=[2&l[0],o.value]),l[0]){case 0:case 1:o=l;break;case 4:return i.label++,{value:l[1],done:!1};case 5:i.label++,r=l[1],l=[0];continue;case 7:l=i.ops.pop(),i.trys.pop();continue;default:if(!(o=(o=i.trys).length>0&&o[o.length-1])&&(6===l[0]||2===l[0])){i=0;continue}if(3===l[0]&&(!o||l[1]>o[0]&&l[1]<o[3])){i.label=l[1];break}if(6===l[0]&&i.label<o[1]){i.label=o[1],o=l;break}if(o&&i.label<o[2]){i.label=o[2],i.ops.push(l);break}o[2]&&i.ops.pop(),i.trys.pop();continue}l=t.call(e,i)}catch(e){l=[6,e],r=0}finally{n=o=0}if(5&l[0])throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}}}var _=(0,n.createStyles)(function(e){return{button:{color:e.token.colorTextHeaderMenu+" !important"}}});u().extend(p());var S=function(e){var t,r=e.popoverVisible,s=e.setPopoverVisible,l=e.tasks,c=e.refresh,f=e.loading;e.hasProcessingTasks;var p=(0,n.useAPIClient)(),y=(t=(0,n.useApp)(),function(e,n){return t.i18n.t(e,function(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{},r=Object.keys(n);"function"==typeof Object.getOwnPropertySymbols&&(r=r.concat(Object.getOwnPropertySymbols(n).filter(function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable}))),r.forEach(function(t){var r;r=n[t],t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r})}return e}({ns:[d.u2,"client"]},n))}),m=(0,i.useTranslation)().t,h=_().styles,g=(0,n.usePlugin)("async-task-manager"),k=(0,n.useCompile)(),w=function(e){s(!1)},S=[{title:y("Created at"),dataIndex:"createdAt",key:"createdAt",width:180,render:function(e){return o().createElement(a.Tooltip,{title:u()(e).format("YYYY-MM-DD HH:mm:ss")},u()(e).fromNow())}},{title:y("Task"),dataIndex:"title",key:"title"},{title:y("Status"),dataIndex:"status",key:"status",width:160,render:function(e,t){var r=v[e]||{},i=r.color,s=r.label;return o().createElement("div",{style:{display:"flex",alignItems:"center",gap:8}},o().createElement("div",{style:{flex:1}},function(){var n,r,i={width:100,margin:0};switch(e){case b.PENDING:return o().createElement(a.Alert,{showIcon:!1,message:k(s),banner:!0});case b.RUNNING:return o().createElement(a.Progress,{type:"line",size:"small",strokeWidth:4,percent:Number(((null!=(n=t.progressCurrent)?n:0)/(null!=(r=t.progressTotal)?r:1)*100).toFixed(2)),status:"active",style:i,format:function(e){return"".concat(e.toFixed(1),"%")}});case b.SUCCEEDED:return o().createElement(a.Progress,{type:"line",size:"small",strokeWidth:4,percent:100,status:"success",style:i,format:function(){return""}});case b.FAILED:return o().createElement(a.Progress,{type:"line",size:"small",strokeWidth:4,percent:100,status:"exception",style:i,format:function(){return""}});default:return null}}()),o().createElement(a.Tag,{color:i,icon:(null==r?void 0:r.icon)?o().createElement(n.Icon,{type:r.icon}):null,style:{margin:0,padding:"0 4px",height:22,width:22}}))}},{title:y("Actions"),dataIndex:"result",key:"actions",width:180,render:function(e,t){var r,i=[],l=null!=(r=g.taskOrigins.get(t.origin))?r:{},u=l.Result,f=l.ResultButton,d=u||function(){return null};return t.cancelable&&(t.status===b.RUNNING||t.status===b.PENDING)&&i.push(o().createElement(a.Popconfirm,{key:"cancel",title:y("Confirm cancel"),description:y("Confirm to cancel this task?"),onConfirm:E(function(){return O(this,function(e){switch(e.label){case 0:return[4,p.resource("asyncTasks").stop({filterByTk:t.id})];case 1:return e.sent(),c(),[2]}})}),okText:y("Confirm"),cancelText:y("Cancel"),disabled:!1},o().createElement(a.Button,{type:"link",size:"small",icon:o().createElement(n.Icon,{type:"StopOutlined"}),disabled:!1},y("Stop")))),t.status===b.SUCCEEDED&&e&&(f?i.push(o().createElement(f,{key:"result-button",task:t})):i.push(o().createElement(a.Button,{key:"view",type:"link",size:"small",icon:o().createElement(n.Icon,{type:"EyeOutlined"}),onClick:function(){w(t),a.Modal.info({title:y("Task result"),content:u?o().createElement(d,{payload:e,task:t}):o().createElement("div",null,y("No renderer available for this task type, payload: ".concat(t.result)))})}},y("View result")))),t.status===b.FAILED&&e&&i.push(o().createElement(a.Button,{key:"error",type:"link",size:"small",icon:o().createElement(n.Icon,{type:"ExclamationCircleOutlined"}),onClick:function(){s(!1);var n,r,i=g.taskOrigins.get(t.origin).namespace;a.Modal.info({title:y("Error Details"),content:o().createElement(a.Typography.Text,null,m(e.message,(n=function(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{},r=Object.keys(n);"function"==typeof Object.getOwnPropertySymbols&&(r=r.concat(Object.getOwnPropertySymbols(n).filter(function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable}))),r.forEach(function(t){var r;r=n[t],t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r})}return e}({},e.params),r=r={ns:void 0===i?"client":i},Object.getOwnPropertyDescriptors?Object.defineProperties(n,Object.getOwnPropertyDescriptors(r)):(function(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n.push.apply(n,r)}return n})(Object(r)).forEach(function(e){Object.defineProperty(n,e,Object.getOwnPropertyDescriptor(r,e))}),n))),closable:!0,width:400})}},y("Error details"))),o().createElement(a.Space,{size:"middle"},i)}}];l.filter(function(e){return[b.SUCCEEDED,b.FAILED].includes(e.status)}).length;var x=o().createElement("div",{style:{maxHeight:"70vh",overflow:"auto",width:l.length>0?800:200}},l.length>0?o().createElement(a.Table,{loading:f,columns:S,dataSource:l,size:"small",pagination:!1,rowKey:"taskId"}):o().createElement("div",{style:{padding:"24px 0",display:"flex",justifyContent:"center"}},o().createElement(a.Empty,{description:y("No tasks"),image:a.Empty.PRESENTED_IMAGE_SIMPLE})));return o().createElement(o().Fragment,null,o().createElement(a.Popover,{content:x,trigger:"click",placement:"bottom",open:r,onOpenChange:s},o().createElement(a.Button,{className:["sync-task-button",h.button].join(" "),onClick:function(){s(!r),r||c()},icon:o().createElement(n.Icon,{type:"SyncOutlined",spin:l.some(function(e){return b.RUNNING===e.status})})})))},x=function(){var e=(0,n.useApp)(),t=(0,n.useRequest)({resource:"asyncTasks",action:"list",params:{sort:"-createdAt"}}),a=t.data,i=t.refresh;t.loading;var s=k((0,r.useState)((null==a?void 0:a.data)||[]),2),l=s[0],c=s[1],u=k((0,r.useState)(!1),2),f=u[0],p=u[1];(0,r.useEffect)(function(){c((null==a?void 0:a.data)||[])},[a]);var d=(0,r.useCallback)(E(function(){return O(this,function(e){return p(!0),i(),console.log("handleTaskCreated"),[2]})}),[]),y=(0,r.useCallback)(function(e){var t=e.detail;c(function(e){var n=e.findIndex(function(e){return e.id===t.id});return -1===n?e.unshift(t):e.splice(n,1,t),function(e){if(Array.isArray(e))return h(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||w(e)||function(){throw TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()})},[]),m=(0,r.useCallback)(function(){i(),console.log("handleTaskStatus")},[]),b=(0,r.useCallback)(function(){i(),console.log("handleTaskDeleted")},[]);return(0,r.useEffect)(function(){return e.eventBus.addEventListener("ws:message:async-tasks:created",d),e.eventBus.addEventListener("ws:message:async-tasks:progress",y),e.eventBus.addEventListener("ws:message:async-tasks:status",m),e.eventBus.addEventListener("ws:message:async-tasks:deleted",b),function(){e.eventBus.removeEventListener("ws:message:async-tasks:created",d),e.eventBus.removeEventListener("ws:message:async-tasks:progress",y),e.eventBus.removeEventListener("ws:message:async-tasks:status",m),e.eventBus.removeEventListener("ws:message:async-tasks:deleted",b)}},[e,b,d,y,m]),(null==l?void 0:l.length)>0&&o().createElement(S,{tasks:l,refresh:i,popoverVisible:f,setPopoverVisible:p})},P=function(e){return o().createElement(n.PinnedPluginListProvider,{items:{asyncTasks:{order:300,component:"AsyncTasks",pin:!0,snippet:"*"}}},o().createElement(n.SchemaComponentOptions,{components:{AsyncTasks:x}},e.children))};function C(e,t,n,r,o,a,i){try{var s=e[a](i),l=s.value}catch(e){n(e);return}s.done?t(l):Promise.resolve(l).then(r,o)}function j(e,t,n){return(j=I()?Reflect.construct:function(e,t,n){var r=[null];r.push.apply(r,t);var o=new(Function.bind.apply(e,r));return n&&N(o,n.prototype),o}).apply(null,arguments)}function D(e){return(D=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function N(e,t){return(N=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function T(e){var t="function"==typeof Map?new Map:void 0;return(T=function(e){if(null===e||-1===Function.toString.call(e).indexOf("[native code]"))return e;if("function"!=typeof e)throw TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,n)}function n(){return j(e,arguments,D(this).constructor)}return n.prototype=Object.create(e.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),N(n,e)})(e)}function I(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(e){}return(I=function(){return!!e})()}var Y=function(e){var n;if("function"!=typeof e&&null!==e)throw TypeError("Super expression must either be null or a function");function r(){var e,n,o,a,i,s;if(!(this instanceof r))throw TypeError("Cannot call a class as a function");return n=r,o=arguments,n=D(n),a=e=function(e,t){var n;if(t&&("object"==((n=t)&&"undefined"!=typeof Symbol&&n.constructor===Symbol?"symbol":typeof n)||"function"==typeof t))return t;if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(this,I()?Reflect.construct(n,o||[],D(this).constructor):n.apply(this,o)),i="taskOrigins",s=new t.Registry,i in a?Object.defineProperty(a,i,{value:s,enumerable:!0,configurable:!0,writable:!0}):a[i]=s,e}return r.prototype=Object.create(e&&e.prototype,{constructor:{value:r,writable:!0,configurable:!0}}),e&&N(r,e),n=[{key:"load",value:function(){var e,t=this;return(e=function(){return function(e,t){var n,r,o,a,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return a={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function s(a){return function(s){var l=[a,s];if(n)throw TypeError("Generator is already executing.");for(;i;)try{if(n=1,r&&(o=2&l[0]?r.return:l[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,l[1])).done)return o;switch(r=0,o&&(l=[2&l[0],o.value]),l[0]){case 0:case 1:o=l;break;case 4:return i.label++,{value:l[1],done:!1};case 5:i.label++,r=l[1],l=[0];continue;case 7:l=i.ops.pop(),i.trys.pop();continue;default:if(!(o=(o=i.trys).length>0&&o[o.length-1])&&(6===l[0]||2===l[0])){i=0;continue}if(3===l[0]&&(!o||l[1]>o[0]&&l[1]<o[3])){i.label=l[1];break}if(6===l[0]&&i.label<o[1]){i.label=o[1],o=l;break}if(o&&i.label<o[2]){i.label=o[2],i.ops.push(l);break}o[2]&&i.ops.pop(),i.trys.pop();continue}l=t.call(e,i)}catch(e){l=[6,e],r=0}finally{n=o=0}if(5&l[0])throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}}}(this,function(e){return t.app.use(P),[2]})},function(){var t=this,n=arguments;return new Promise(function(r,o){var a=e.apply(t,n);function i(e){C(a,r,o,i,s,"next",e)}function s(e){C(a,r,o,i,s,"throw",e)}i(void 0)})})()}}],function(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}(r.prototype,n),r}(T(n.Plugin)),M=Y}(),c});
|
|
10
|
+
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("react"),require("dayjs"),require("@nocobase/client"),require("@nocobase/utils/client"),require("antd"),require("react-i18next")):"function"==typeof define&&define.amd?define("@nocobase/plugin-async-task-manager",["react","dayjs","@nocobase/client","@nocobase/utils/client","antd","react-i18next"],t):"object"==typeof exports?exports["@nocobase/plugin-async-task-manager"]=t(require("react"),require("dayjs"),require("@nocobase/client"),require("@nocobase/utils/client"),require("antd"),require("react-i18next")):e["@nocobase/plugin-async-task-manager"]=t(e.react,e.dayjs,e["@nocobase/client"],e["@nocobase/utils/client"],e.antd,e["react-i18next"])}(self,function(e,t,n,r,o,a){var i={379:function(e,t,n){e.exports=function(e){"use strict";var t={name:"zh-cn",weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),ordinal:function(e,t){return"W"===t?e+"周":e+"日"},weekStart:1,yearStart:4,formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日Ah点mm分",LLLL:"YYYY年M月D日ddddAh点mm分",l:"YYYY/M/D",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},relativeTime:{future:"%s内",past:"%s前",s:"几秒",m:"1 分钟",mm:"%d 分钟",h:"1 小时",hh:"%d 小时",d:"1 天",dd:"%d 天",M:"1 个月",MM:"%d 个月",y:"1 年",yy:"%d 年"},meridiem:function(e,t){var n=100*e+t;return n<600?"凌晨":n<900?"早上":n<1100?"上午":n<1300?"中午":n<1800?"下午":"晚上"}};return(e&&"object"==typeof e&&"default"in e?e:{default:e}).default.locale(t,null,!0),t}(n(760))},809:function(e){e.exports=function(e,t,n){e=e||{};var r=t.prototype,o={future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"};function a(e,t,n,o){return r.fromToBase(e,t,n,o)}n.en.relativeTime=o,r.fromToBase=function(t,r,a,i,s){for(var l,c,u,f=a.$locale().relativeTime||o,p=e.thresholds||[{l:"s",r:44,d:"second"},{l:"m",r:89},{l:"mm",r:44,d:"minute"},{l:"h",r:89},{l:"hh",r:21,d:"hour"},{l:"d",r:35},{l:"dd",r:25,d:"day"},{l:"M",r:45},{l:"MM",r:10,d:"month"},{l:"y",r:17},{l:"yy",d:"year"}],d=p.length,y=0;y<d;y+=1){var m=p[y];m.d&&(l=i?n(t).diff(a,m.d,!0):a.diff(t,m.d,!0));var b=(e.rounding||Math.round)(Math.abs(l));if(u=l>0,b<=m.r||!m.r){b<=1&&y>0&&(m=p[y-1]);var v=f[m.l];s&&(b=s(""+b)),c="string"==typeof v?v.replace("%d",b):v(b,r,m.l,u);break}}if(r)return c;var h=u?f.future:f.past;return"function"==typeof h?h(c):h.replace("%s",c)},r.to=function(e,t){return a(e,t,this,!0)},r.from=function(e,t){return a(e,t,this)};var i=function(e){return e.$u?n.utc():n()};r.toNow=function(e){return this.to(i(this),e)},r.fromNow=function(e){return this.from(i(this),e)}}},772:function(e){"use strict";e.exports=n},584:function(e){"use strict";e.exports=r},721:function(e){"use strict";e.exports=o},760:function(e){"use strict";e.exports=t},156:function(t){"use strict";t.exports=e},238:function(e){"use strict";e.exports=a}},s={};function l(e){var t=s[e];if(void 0!==t)return t.exports;var n=s[e]={exports:{}};return i[e].call(n.exports,n,n.exports,l),n.exports}l.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return l.d(t,{a:t}),t},l.d=function(e,t){for(var n in t)l.o(t,n)&&!l.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},l.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},l.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var c={};return!function(){"use strict";l.r(c),l.d(c,{PluginAsyncTaskManagerClient:function(){return Y},default:function(){return M}});var e,t=l(584),n=l(772),r=l(156),o=l.n(r),a=l(721),i=l(238),s=l(760),u=l.n(s);l(379);var f=l(809),p=l.n(f),d=JSON.parse('{"u2":"@nocobase/plugin-async-task-manager"}');function y(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var m="@nocobase/plugin-async-task-manager",b={PENDING:null,RUNNING:0,SUCCEEDED:1,FAILED:-1,CANCELED:-2},v=(y(e={},b.PENDING,{value:b.PENDING,label:"{{t('Waiting', { ns: '".concat(m,"' })}}"),color:"default",icon:"ClockCircleOutlined"}),y(e,b.RUNNING,{value:b.RUNNING,label:"{{t('Processing', { ns: '".concat(m,"' })}}"),color:"processing",icon:"LoadingOutlined"}),y(e,b.SUCCEEDED,{value:b.SUCCEEDED,label:"{{t('Completed', { ns: '".concat(m,"' })}}"),color:"success",icon:"CheckCircleOutlined"}),y(e,b.FAILED,{value:b.FAILED,label:"{{t('Failed', { ns: '".concat(m,"' })}}"),color:"error",icon:"CloseCircleOutlined"}),y(e,b.CANCELED,{value:b.CANCELED,label:"{{t('Cancelled', { ns: '".concat(m,"' })}}"),color:"warning",icon:"StopOutlined"}),e);function h(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function g(e,t,n,r,o,a,i){try{var s=e[a](i),l=s.value}catch(e){n(e);return}s.done?t(l):Promise.resolve(l).then(r,o)}function E(e){return function(){var t=this,n=arguments;return new Promise(function(r,o){var a=e.apply(t,n);function i(e){g(a,r,o,i,s,"next",e)}function s(e){g(a,r,o,i,s,"throw",e)}i(void 0)})}}function k(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n,r,o=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=o){var a=[],i=!0,s=!1;try{for(o=o.call(e);!(i=(n=o.next()).done)&&(a.push(n.value),!t||a.length!==t);i=!0);}catch(e){s=!0,r=e}finally{try{i||null==o.return||o.return()}finally{if(s)throw r}}return a}}(e,t)||w(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function w(e,t){if(e){if("string"==typeof e)return h(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return h(e,t)}}function O(e,t){var n,r,o,a,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return a={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function s(a){return function(s){var l=[a,s];if(n)throw TypeError("Generator is already executing.");for(;i;)try{if(n=1,r&&(o=2&l[0]?r.return:l[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,l[1])).done)return o;switch(r=0,o&&(l=[2&l[0],o.value]),l[0]){case 0:case 1:o=l;break;case 4:return i.label++,{value:l[1],done:!1};case 5:i.label++,r=l[1],l=[0];continue;case 7:l=i.ops.pop(),i.trys.pop();continue;default:if(!(o=(o=i.trys).length>0&&o[o.length-1])&&(6===l[0]||2===l[0])){i=0;continue}if(3===l[0]&&(!o||l[1]>o[0]&&l[1]<o[3])){i.label=l[1];break}if(6===l[0]&&i.label<o[1]){i.label=o[1],o=l;break}if(o&&i.label<o[2]){i.label=o[2],i.ops.push(l);break}o[2]&&i.ops.pop(),i.trys.pop();continue}l=t.call(e,i)}catch(e){l=[6,e],r=0}finally{n=o=0}if(5&l[0])throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}}}var _=(0,n.createStyles)(function(e){return{button:{color:e.token.colorTextHeaderMenu+" !important"}}});u().extend(p());var S=function(e){var t,r=e.popoverVisible,s=e.setPopoverVisible,l=e.tasks,c=e.refresh,f=e.loading;e.hasProcessingTasks;var p=(0,n.useAPIClient)(),y=(t=(0,n.useApp)(),function(e,n){return t.i18n.t(e,function(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{},r=Object.keys(n);"function"==typeof Object.getOwnPropertySymbols&&(r=r.concat(Object.getOwnPropertySymbols(n).filter(function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable}))),r.forEach(function(t){var r;r=n[t],t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r})}return e}({ns:[d.u2,"client"]},n))}),m=(0,i.useTranslation)().t,h=_().styles,g=(0,n.usePlugin)("async-task-manager"),k=(0,n.useCompile)(),w=function(e){s(!1)},S=[{title:y("Created at"),dataIndex:"createdAt",key:"createdAt",width:180,render:function(e){return o().createElement(a.Tooltip,{title:u()(e).format("YYYY-MM-DD HH:mm:ss")},u()(e).fromNow())}},{title:y("Task"),dataIndex:"title",key:"title"},{title:y("Status"),dataIndex:"status",key:"status",width:160,render:function(e,t){var r=v[e]||{},i=r.color,s=r.label;return o().createElement("div",{style:{display:"flex",alignItems:"center",gap:8}},o().createElement("div",{style:{flex:1}},function(){var n,r,i={width:100,margin:0};switch(e){case b.PENDING:case b.CANCELED:return o().createElement(a.Alert,{showIcon:!1,message:k(s),banner:!0});case b.RUNNING:return o().createElement(a.Progress,{type:"line",size:"small",strokeWidth:4,percent:Number(((null!=(n=t.progressCurrent)?n:0)/(null!=(r=t.progressTotal)?r:1)*100).toFixed(2)),status:"active",style:i,format:function(e){return"".concat(e.toFixed(1),"%")}});case b.SUCCEEDED:return o().createElement(a.Progress,{type:"line",size:"small",strokeWidth:4,percent:100,status:"success",style:i,format:function(){return""}});case b.FAILED:return o().createElement(a.Progress,{type:"line",size:"small",strokeWidth:4,percent:100,status:"exception",style:i,format:function(){return""}});default:return null}}()),o().createElement(a.Tag,{color:i,icon:(null==r?void 0:r.icon)?o().createElement(n.Icon,{type:r.icon}):null,style:{margin:0,padding:"0 4px",height:22,width:22}}))}},{title:y("Actions"),dataIndex:"result",key:"actions",width:180,render:function(e,t){var r,i=[],l=null!=(r=g.taskOrigins.get(t.origin))?r:{},u=l.Result,f=l.ResultButton,d=u||function(){return null};return t.cancelable&&(t.status===b.RUNNING||t.status===b.PENDING)&&i.push(o().createElement(a.Popconfirm,{key:"cancel",title:y("Confirm cancel"),description:y("Confirm to cancel this task?"),onConfirm:E(function(){return O(this,function(e){switch(e.label){case 0:return[4,p.resource("asyncTasks").stop({filterByTk:t.id})];case 1:return e.sent(),c(),[2]}})}),okText:y("Confirm"),cancelText:y("Cancel"),disabled:!1},o().createElement(a.Button,{type:"link",size:"small",icon:o().createElement(n.Icon,{type:"StopOutlined"}),disabled:!1},y("Stop")))),t.status===b.SUCCEEDED&&e&&(f?i.push(o().createElement(f,{key:"result-button",task:t})):i.push(o().createElement(a.Button,{key:"view",type:"link",size:"small",icon:o().createElement(n.Icon,{type:"EyeOutlined"}),onClick:function(){w(t),a.Modal.info({title:y("Task result"),content:u?o().createElement(d,{payload:e,task:t}):o().createElement("div",null,y("No renderer available for this task type, payload: ".concat(t.result)))})}},y("View result")))),t.status===b.FAILED&&e&&i.push(o().createElement(a.Button,{key:"error",type:"link",size:"small",icon:o().createElement(n.Icon,{type:"ExclamationCircleOutlined"}),onClick:function(){s(!1);var n,r,i=g.taskOrigins.get(t.origin).namespace;a.Modal.info({title:y("Error Details"),content:o().createElement(a.Typography.Text,null,m(e.message,(n=function(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{},r=Object.keys(n);"function"==typeof Object.getOwnPropertySymbols&&(r=r.concat(Object.getOwnPropertySymbols(n).filter(function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable}))),r.forEach(function(t){var r;r=n[t],t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r})}return e}({},e.params),r=r={ns:void 0===i?"client":i},Object.getOwnPropertyDescriptors?Object.defineProperties(n,Object.getOwnPropertyDescriptors(r)):(function(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n.push.apply(n,r)}return n})(Object(r)).forEach(function(e){Object.defineProperty(n,e,Object.getOwnPropertyDescriptor(r,e))}),n))),closable:!0,width:400})}},y("Error details"))),o().createElement(a.Space,{size:"middle"},i)}}];l.filter(function(e){return[b.SUCCEEDED,b.FAILED].includes(e.status)}).length;var x=o().createElement("div",{style:{maxHeight:"70vh",overflow:"auto",width:l.length>0?800:200}},l.length>0?o().createElement(a.Table,{loading:f,columns:S,dataSource:l,size:"small",pagination:!1,rowKey:"taskId"}):o().createElement("div",{style:{padding:"24px 0",display:"flex",justifyContent:"center"}},o().createElement(a.Empty,{description:y("No tasks"),image:a.Empty.PRESENTED_IMAGE_SIMPLE})));return o().createElement(o().Fragment,null,o().createElement(a.Popover,{content:x,trigger:"click",placement:"bottom",open:r,onOpenChange:s},o().createElement(a.Button,{className:["sync-task-button",h.button].join(" "),onClick:function(){s(!r),r||c()},icon:o().createElement(n.Icon,{type:"SyncOutlined",spin:l.some(function(e){return b.RUNNING===e.status})})})))},x=function(){var e=(0,n.useApp)(),t=(0,n.useRequest)({resource:"asyncTasks",action:"list",params:{sort:"-createdAt"}}),a=t.data,i=t.refresh;t.loading;var s=k((0,r.useState)((null==a?void 0:a.data)||[]),2),l=s[0],c=s[1],u=k((0,r.useState)(!1),2),f=u[0],p=u[1];(0,r.useEffect)(function(){c((null==a?void 0:a.data)||[])},[a]);var d=(0,r.useCallback)(E(function(){return O(this,function(e){return p(!0),i(),console.log("handleTaskCreated"),[2]})}),[]),y=(0,r.useCallback)(function(e){var t=e.detail;c(function(e){var n=e.findIndex(function(e){return e.id===t.id});return -1===n?e.unshift(t):e.splice(n,1,t),function(e){if(Array.isArray(e))return h(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||w(e)||function(){throw TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()})},[]),m=(0,r.useCallback)(function(){i(),console.log("handleTaskStatus")},[]),b=(0,r.useCallback)(function(){i(),console.log("handleTaskDeleted")},[]);return(0,r.useEffect)(function(){return e.eventBus.addEventListener("ws:message:async-tasks:created",d),e.eventBus.addEventListener("ws:message:async-tasks:progress",y),e.eventBus.addEventListener("ws:message:async-tasks:status",m),e.eventBus.addEventListener("ws:message:async-tasks:deleted",b),function(){e.eventBus.removeEventListener("ws:message:async-tasks:created",d),e.eventBus.removeEventListener("ws:message:async-tasks:progress",y),e.eventBus.removeEventListener("ws:message:async-tasks:status",m),e.eventBus.removeEventListener("ws:message:async-tasks:deleted",b)}},[e,b,d,y,m]),(null==l?void 0:l.length)>0&&o().createElement(S,{tasks:l,refresh:i,popoverVisible:f,setPopoverVisible:p})},P=function(e){return o().createElement(n.PinnedPluginListProvider,{items:{asyncTasks:{order:300,component:"AsyncTasks",pin:!0,snippet:"*"}}},o().createElement(n.SchemaComponentOptions,{components:{AsyncTasks:x}},e.children))};function C(e,t,n,r,o,a,i){try{var s=e[a](i),l=s.value}catch(e){n(e);return}s.done?t(l):Promise.resolve(l).then(r,o)}function j(e,t,n){return(j=I()?Reflect.construct:function(e,t,n){var r=[null];r.push.apply(r,t);var o=new(Function.bind.apply(e,r));return n&&N(o,n.prototype),o}).apply(null,arguments)}function D(e){return(D=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function N(e,t){return(N=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function T(e){var t="function"==typeof Map?new Map:void 0;return(T=function(e){if(null===e||-1===Function.toString.call(e).indexOf("[native code]"))return e;if("function"!=typeof e)throw TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,n)}function n(){return j(e,arguments,D(this).constructor)}return n.prototype=Object.create(e.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),N(n,e)})(e)}function I(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(e){}return(I=function(){return!!e})()}var Y=function(e){var n;if("function"!=typeof e&&null!==e)throw TypeError("Super expression must either be null or a function");function r(){var e,n,o,a,i,s;if(!(this instanceof r))throw TypeError("Cannot call a class as a function");return n=r,o=arguments,n=D(n),a=e=function(e,t){var n;if(t&&("object"==((n=t)&&"undefined"!=typeof Symbol&&n.constructor===Symbol?"symbol":typeof n)||"function"==typeof t))return t;if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(this,I()?Reflect.construct(n,o||[],D(this).constructor):n.apply(this,o)),i="taskOrigins",s=new t.Registry,i in a?Object.defineProperty(a,i,{value:s,enumerable:!0,configurable:!0,writable:!0}):a[i]=s,e}return r.prototype=Object.create(e&&e.prototype,{constructor:{value:r,writable:!0,configurable:!0}}),e&&N(r,e),n=[{key:"load",value:function(){var e,t=this;return(e=function(){return function(e,t){var n,r,o,a,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return a={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function s(a){return function(s){var l=[a,s];if(n)throw TypeError("Generator is already executing.");for(;i;)try{if(n=1,r&&(o=2&l[0]?r.return:l[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,l[1])).done)return o;switch(r=0,o&&(l=[2&l[0],o.value]),l[0]){case 0:case 1:o=l;break;case 4:return i.label++,{value:l[1],done:!1};case 5:i.label++,r=l[1],l=[0];continue;case 7:l=i.ops.pop(),i.trys.pop();continue;default:if(!(o=(o=i.trys).length>0&&o[o.length-1])&&(6===l[0]||2===l[0])){i=0;continue}if(3===l[0]&&(!o||l[1]>o[0]&&l[1]<o[3])){i.label=l[1];break}if(6===l[0]&&i.label<o[1]){i.label=o[1],o=l;break}if(o&&i.label<o[2]){i.label=o[2],i.ops.push(l);break}o[2]&&i.ops.pop(),i.trys.pop();continue}l=t.call(e,i)}catch(e){l=[6,e],r=0}finally{n=o=0}if(5&l[0])throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}}}(this,function(e){return t.app.use(P),[2]})},function(){var t=this,n=arguments;return new Promise(function(r,o){var a=e.apply(t,n);function i(e){C(a,r,o,i,s,"next",e)}function s(e){C(a,r,o,i,s,"throw",e)}i(void 0)})})()}}],function(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}(r.prototype,n),r}(T(n.Plugin)),M=Y}(),c});
|
|
@@ -37,7 +37,7 @@ export declare const TASK_STATUS_OPTIONS: {
|
|
|
37
37
|
readonly icon: "CloseCircleOutlined";
|
|
38
38
|
} | {
|
|
39
39
|
readonly value: -2;
|
|
40
|
-
readonly label: "{{t('
|
|
40
|
+
readonly label: "{{t('Cancelled', { ns: '@nocobase/plugin-async-task-manager' })}}";
|
|
41
41
|
readonly color: "warning";
|
|
42
42
|
readonly icon: "StopOutlined";
|
|
43
43
|
};
|
|
@@ -61,7 +61,7 @@ export declare const TASK_STATUS_OPTIONS: {
|
|
|
61
61
|
};
|
|
62
62
|
readonly [-2]: {
|
|
63
63
|
readonly value: -2;
|
|
64
|
-
readonly label: "{{t('
|
|
64
|
+
readonly label: "{{t('Cancelled', { ns: '@nocobase/plugin-async-task-manager' })}}";
|
|
65
65
|
readonly color: "warning";
|
|
66
66
|
readonly icon: "StopOutlined";
|
|
67
67
|
};
|
package/dist/common/constants.js
CHANGED
package/dist/externalVersion.js
CHANGED
|
@@ -8,15 +8,15 @@
|
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
module.exports = {
|
|
11
|
-
"@nocobase/client": "2.0.0-beta.
|
|
11
|
+
"@nocobase/client": "2.0.0-beta.20",
|
|
12
12
|
"react": "18.2.0",
|
|
13
|
-
"@nocobase/utils": "2.0.0-beta.
|
|
13
|
+
"@nocobase/utils": "2.0.0-beta.20",
|
|
14
14
|
"lodash": "4.17.21",
|
|
15
|
-
"@nocobase/server": "2.0.0-beta.
|
|
16
|
-
"@nocobase/logger": "2.0.0-beta.
|
|
17
|
-
"@nocobase/database": "2.0.0-beta.
|
|
15
|
+
"@nocobase/server": "2.0.0-beta.20",
|
|
16
|
+
"@nocobase/logger": "2.0.0-beta.20",
|
|
17
|
+
"@nocobase/database": "2.0.0-beta.20",
|
|
18
18
|
"antd": "5.24.2",
|
|
19
19
|
"react-i18next": "11.18.6",
|
|
20
20
|
"dayjs": "1.11.13",
|
|
21
|
-
"@nocobase/actions": "2.0.0-beta.
|
|
21
|
+
"@nocobase/actions": "2.0.0-beta.20"
|
|
22
22
|
};
|
package/dist/locale/en-US.json
CHANGED
|
@@ -31,6 +31,8 @@
|
|
|
31
31
|
"Skipped records": "Skipped records",
|
|
32
32
|
"Status": "Status",
|
|
33
33
|
"Successfully imported": "Successfully imported",
|
|
34
|
+
"Stop": "Stop",
|
|
35
|
+
"Stopping...": "Stopping...",
|
|
34
36
|
"Task": "Task",
|
|
35
37
|
"Task cancelled": "Task cancelled",
|
|
36
38
|
"Task completed": "Task completed",
|
package/dist/locale/zh-CN.json
CHANGED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is part of the NocoBase (R) project.
|
|
3
|
+
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
|
4
|
+
* Authors: NocoBase Team.
|
|
5
|
+
*
|
|
6
|
+
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
|
+
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
|
+
*/
|
|
9
|
+
import { TaskId } from '../common/types';
|
|
10
|
+
import { ConcurrencyMonitor } from './interfaces/concurrency-monitor';
|
|
11
|
+
export declare class BaseConcurrencyMonitor implements ConcurrencyMonitor {
|
|
12
|
+
private _concurrency;
|
|
13
|
+
constructor(_concurrency: number);
|
|
14
|
+
private taskIds;
|
|
15
|
+
idle(): boolean;
|
|
16
|
+
get concurrency(): number;
|
|
17
|
+
set concurrency(concurrency: number);
|
|
18
|
+
increase(taskId: TaskId): boolean;
|
|
19
|
+
decrease(taskId: TaskId): void;
|
|
20
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is part of the NocoBase (R) project.
|
|
3
|
+
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
|
4
|
+
* Authors: NocoBase Team.
|
|
5
|
+
*
|
|
6
|
+
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
|
+
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
var __defProp = Object.defineProperty;
|
|
11
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
12
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
13
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
14
|
+
var __export = (target, all) => {
|
|
15
|
+
for (var name in all)
|
|
16
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
17
|
+
};
|
|
18
|
+
var __copyProps = (to, from, except, desc) => {
|
|
19
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
20
|
+
for (let key of __getOwnPropNames(from))
|
|
21
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
22
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
23
|
+
}
|
|
24
|
+
return to;
|
|
25
|
+
};
|
|
26
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
27
|
+
var base_concurrency_monitor_exports = {};
|
|
28
|
+
__export(base_concurrency_monitor_exports, {
|
|
29
|
+
BaseConcurrencyMonitor: () => BaseConcurrencyMonitor
|
|
30
|
+
});
|
|
31
|
+
module.exports = __toCommonJS(base_concurrency_monitor_exports);
|
|
32
|
+
class BaseConcurrencyMonitor {
|
|
33
|
+
constructor(_concurrency) {
|
|
34
|
+
this._concurrency = _concurrency;
|
|
35
|
+
}
|
|
36
|
+
taskIds = /* @__PURE__ */ new Set();
|
|
37
|
+
idle() {
|
|
38
|
+
return this.taskIds.size < this.concurrency;
|
|
39
|
+
}
|
|
40
|
+
get concurrency() {
|
|
41
|
+
return this._concurrency;
|
|
42
|
+
}
|
|
43
|
+
set concurrency(concurrency) {
|
|
44
|
+
this._concurrency = concurrency;
|
|
45
|
+
}
|
|
46
|
+
increase(taskId) {
|
|
47
|
+
if (this.taskIds.has(taskId)) {
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
if (this.taskIds.size + 1 > this.concurrency) {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
this.taskIds.add(taskId);
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
decrease(taskId) {
|
|
57
|
+
this.taskIds.delete(taskId);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
61
|
+
0 && (module.exports = {
|
|
62
|
+
BaseConcurrencyMonitor
|
|
63
|
+
});
|
|
@@ -11,6 +11,7 @@ import { Logger } from '@nocobase/logger';
|
|
|
11
11
|
import { AsyncTasksManager, CreateTaskOptions } from './interfaces/async-task-manager';
|
|
12
12
|
import { ITask, TaskConstructor, TaskModel } from './interfaces/task';
|
|
13
13
|
import { TaskId, TaskStatus } from '../common/types';
|
|
14
|
+
import { ConcurrencyMode, ConcurrencyMonitor } from './interfaces/concurrency-monitor';
|
|
14
15
|
export declare class BaseTaskManager implements AsyncTasksManager {
|
|
15
16
|
private taskTypes;
|
|
16
17
|
private tasks;
|
|
@@ -19,7 +20,9 @@ export declare class BaseTaskManager implements AsyncTasksManager {
|
|
|
19
20
|
private logger;
|
|
20
21
|
private app;
|
|
21
22
|
private progressThrottles;
|
|
22
|
-
|
|
23
|
+
private concurrencyMonitor;
|
|
24
|
+
get concurrency(): number;
|
|
25
|
+
set concurrency(concurrency: number);
|
|
23
26
|
private idle;
|
|
24
27
|
private onQueueTask;
|
|
25
28
|
private onTaskProgress;
|
|
@@ -40,3 +43,15 @@ export declare class BaseTaskManager implements AsyncTasksManager {
|
|
|
40
43
|
private prepareTask;
|
|
41
44
|
runTask(task: ITask): Promise<void>;
|
|
42
45
|
}
|
|
46
|
+
export declare class ConcurrencyMonitorDelegate implements ConcurrencyMonitor {
|
|
47
|
+
private mode;
|
|
48
|
+
private appConcurrencyMonitor;
|
|
49
|
+
private processConcurrencyMonitor;
|
|
50
|
+
constructor(mode?: ConcurrencyMode, appConcurrencyMonitor?: ConcurrencyMonitor, processConcurrencyMonitor?: ConcurrencyMonitor);
|
|
51
|
+
private get concurrencyMonitor();
|
|
52
|
+
idle(): boolean;
|
|
53
|
+
get concurrency(): number;
|
|
54
|
+
set concurrency(concurrency: number);
|
|
55
|
+
increase(taskId: TaskId): boolean;
|
|
56
|
+
decrease(taskId: TaskId): void;
|
|
57
|
+
}
|
|
@@ -36,14 +36,19 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
36
36
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
37
37
|
var base_task_manager_exports = {};
|
|
38
38
|
__export(base_task_manager_exports, {
|
|
39
|
-
BaseTaskManager: () => BaseTaskManager
|
|
39
|
+
BaseTaskManager: () => BaseTaskManager,
|
|
40
|
+
ConcurrencyMonitorDelegate: () => ConcurrencyMonitorDelegate
|
|
40
41
|
});
|
|
41
42
|
module.exports = __toCommonJS(base_task_manager_exports);
|
|
42
43
|
var import_lodash = require("lodash");
|
|
43
44
|
var import_constants = require("../common/constants");
|
|
44
45
|
var import_crypto = require("crypto");
|
|
45
46
|
var import_plugin = __toESM(require("./plugin"));
|
|
47
|
+
var import_base_concurrency_monitor = require("./base-concurrency-monitor");
|
|
46
48
|
const WORKER_JOB_ASYNC_TASK_PROCESS = "async-task:process";
|
|
49
|
+
const CONCURRENCY = process.env.ASYNC_TASK_MAX_CONCURRENCY ? Number.parseInt(process.env.ASYNC_TASK_MAX_CONCURRENCY, 10) : 3;
|
|
50
|
+
const CONCURRENCY_MODE = process.env.ASYNC_TASK_CONCURRENCY_MODE ?? "app";
|
|
51
|
+
const PROCESS_CONCURRENCY_MONITOR = new import_base_concurrency_monitor.BaseConcurrencyMonitor(CONCURRENCY);
|
|
47
52
|
class BaseTaskManager {
|
|
48
53
|
taskTypes = /* @__PURE__ */ new Map();
|
|
49
54
|
tasks = /* @__PURE__ */ new Map();
|
|
@@ -53,13 +58,25 @@ class BaseTaskManager {
|
|
|
53
58
|
logger;
|
|
54
59
|
app;
|
|
55
60
|
progressThrottles = /* @__PURE__ */ new Map();
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
return this.
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
+
concurrencyMonitor = new ConcurrencyMonitorDelegate();
|
|
62
|
+
get concurrency() {
|
|
63
|
+
return this.concurrencyMonitor.concurrency;
|
|
64
|
+
}
|
|
65
|
+
set concurrency(concurrency) {
|
|
66
|
+
this.concurrencyMonitor.concurrency = concurrency;
|
|
67
|
+
}
|
|
68
|
+
idle = () => this.app.serving(WORKER_JOB_ASYNC_TASK_PROCESS) && this.concurrencyMonitor.idle();
|
|
69
|
+
onQueueTask = async ({ id }, { queueOptions }) => {
|
|
61
70
|
const task = await this.prepareTask(id);
|
|
62
|
-
|
|
71
|
+
if (!this.concurrencyMonitor.increase(task.record.id)) {
|
|
72
|
+
this.enqueueTask(task, queueOptions);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
try {
|
|
76
|
+
await this.runTask(task);
|
|
77
|
+
} finally {
|
|
78
|
+
this.concurrencyMonitor.decrease(task.record.id);
|
|
79
|
+
}
|
|
63
80
|
};
|
|
64
81
|
onTaskProgress = (item) => {
|
|
65
82
|
const userId = item.createdById;
|
|
@@ -105,6 +122,7 @@ class BaseTaskManager {
|
|
|
105
122
|
if (task.doneAt) {
|
|
106
123
|
this.progressThrottles.delete(task.id);
|
|
107
124
|
this.tasks.delete(task.id);
|
|
125
|
+
this.concurrencyMonitor.decrease(task.id);
|
|
108
126
|
}
|
|
109
127
|
if (task.status === import_constants.TASK_STATUS.SUCCEEDED) {
|
|
110
128
|
this.app.emit("workflow:dispatch");
|
|
@@ -113,6 +131,7 @@ class BaseTaskManager {
|
|
|
113
131
|
onTaskAfterDelete = (task) => {
|
|
114
132
|
this.tasks.delete(task.id);
|
|
115
133
|
this.progressThrottles.delete(task.id);
|
|
134
|
+
this.concurrencyMonitor.decrease(task.id);
|
|
116
135
|
const userId = task.createdById;
|
|
117
136
|
if (userId) {
|
|
118
137
|
this.app.emit("ws:sendToUser", {
|
|
@@ -152,6 +171,7 @@ class BaseTaskManager {
|
|
|
152
171
|
for (const task of tasksToCleanup) {
|
|
153
172
|
this.tasks.delete(task.id);
|
|
154
173
|
this.progressThrottles.delete(task.id);
|
|
174
|
+
this.concurrencyMonitor.decrease(task.id);
|
|
155
175
|
}
|
|
156
176
|
await TaskRepo.destroy({
|
|
157
177
|
filterByTk: tasksToCleanup.map((task) => task.id),
|
|
@@ -326,7 +346,33 @@ class BaseTaskManager {
|
|
|
326
346
|
}
|
|
327
347
|
}
|
|
328
348
|
}
|
|
349
|
+
class ConcurrencyMonitorDelegate {
|
|
350
|
+
constructor(mode = CONCURRENCY_MODE, appConcurrencyMonitor = new import_base_concurrency_monitor.BaseConcurrencyMonitor(CONCURRENCY), processConcurrencyMonitor = PROCESS_CONCURRENCY_MONITOR) {
|
|
351
|
+
this.mode = mode;
|
|
352
|
+
this.appConcurrencyMonitor = appConcurrencyMonitor;
|
|
353
|
+
this.processConcurrencyMonitor = processConcurrencyMonitor;
|
|
354
|
+
}
|
|
355
|
+
get concurrencyMonitor() {
|
|
356
|
+
return this.mode === "process" ? this.processConcurrencyMonitor : this.appConcurrencyMonitor;
|
|
357
|
+
}
|
|
358
|
+
idle() {
|
|
359
|
+
return this.concurrencyMonitor.idle();
|
|
360
|
+
}
|
|
361
|
+
get concurrency() {
|
|
362
|
+
return this.concurrencyMonitor.concurrency;
|
|
363
|
+
}
|
|
364
|
+
set concurrency(concurrency) {
|
|
365
|
+
this.concurrencyMonitor.concurrency = concurrency;
|
|
366
|
+
}
|
|
367
|
+
increase(taskId) {
|
|
368
|
+
return this.concurrencyMonitor.increase(taskId);
|
|
369
|
+
}
|
|
370
|
+
decrease(taskId) {
|
|
371
|
+
this.concurrencyMonitor.decrease(taskId);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
329
374
|
// Annotate the CommonJS export names for ESM import in node:
|
|
330
375
|
0 && (module.exports = {
|
|
331
|
-
BaseTaskManager
|
|
376
|
+
BaseTaskManager,
|
|
377
|
+
ConcurrencyMonitorDelegate
|
|
332
378
|
});
|
|
@@ -45,6 +45,20 @@ var import_node_process = __toESM(require("node:process"));
|
|
|
45
45
|
var import_worker_threads = require("worker_threads");
|
|
46
46
|
var import_path = __toESM(require("path"));
|
|
47
47
|
var import_task_type = require("./task-type");
|
|
48
|
+
const getResourceLimitsFromEnv = () => {
|
|
49
|
+
let resourceLimitsUndefined = true;
|
|
50
|
+
const resourceLimits = {};
|
|
51
|
+
if (import_node_process.default.env.ASYNC_TASK_WORKER_MAX_OLD) {
|
|
52
|
+
resourceLimits.maxOldGenerationSizeMb = Number.parseInt(import_node_process.default.env.ASYNC_TASK_WORKER_MAX_OLD, 10);
|
|
53
|
+
resourceLimitsUndefined = false;
|
|
54
|
+
}
|
|
55
|
+
if (import_node_process.default.env.ASYNC_TASK_WORKER_MAX_YOUNG) {
|
|
56
|
+
resourceLimits.maxYoungGenerationSizeMb = Number.parseInt(import_node_process.default.env.ASYNC_TASK_WORKER_MAX_YOUNG, 10);
|
|
57
|
+
resourceLimitsUndefined = false;
|
|
58
|
+
}
|
|
59
|
+
return resourceLimitsUndefined ? void 0 : resourceLimits;
|
|
60
|
+
};
|
|
61
|
+
const RESOURCE_LIMITS = getResourceLimitsFromEnv();
|
|
48
62
|
function parseArgv(list) {
|
|
49
63
|
const argv = {};
|
|
50
64
|
for (const item of list) {
|
|
@@ -93,6 +107,19 @@ class CommandTaskType extends import_task_type.TaskType {
|
|
|
93
107
|
const workerPath = import_path.default.resolve(import_node_process.default.cwd(), appRoot, isDev ? "src/index.ts" : "lib/index.js");
|
|
94
108
|
const workerPromise = new Promise((resolve, reject) => {
|
|
95
109
|
var _a2, _b;
|
|
110
|
+
let settled = false;
|
|
111
|
+
let successPayload;
|
|
112
|
+
const settleOnce = (err, payload) => {
|
|
113
|
+
if (settled) {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
settled = true;
|
|
117
|
+
if (err) {
|
|
118
|
+
reject(err);
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
resolve(payload);
|
|
122
|
+
};
|
|
96
123
|
try {
|
|
97
124
|
(_a2 = this.logger) == null ? void 0 : _a2.info(
|
|
98
125
|
`Creating worker for task ${this.record.id} - path: ${workerPath}, argv: ${JSON.stringify(
|
|
@@ -108,7 +135,8 @@ class CommandTaskType extends import_task_type.TaskType {
|
|
|
108
135
|
...import_node_process.default.env,
|
|
109
136
|
WORKER_MODE: "-",
|
|
110
137
|
...parsedArgv.app && parsedArgv.app !== "main" ? { STARTUP_SUBAPP: parsedArgv.app } : {}
|
|
111
|
-
}
|
|
138
|
+
},
|
|
139
|
+
resourceLimits: RESOURCE_LIMITS
|
|
112
140
|
});
|
|
113
141
|
this.workerThread = worker;
|
|
114
142
|
(_b = this.logger) == null ? void 0 : _b.debug(`Worker created successfully for task ${this.record.id}`);
|
|
@@ -131,30 +159,30 @@ class CommandTaskType extends import_task_type.TaskType {
|
|
|
131
159
|
message.payload
|
|
132
160
|
)}`
|
|
133
161
|
);
|
|
134
|
-
|
|
162
|
+
successPayload = message.payload;
|
|
135
163
|
}
|
|
136
164
|
});
|
|
137
165
|
worker.on("error", (error) => {
|
|
138
166
|
var _a3;
|
|
139
167
|
(_a3 = this.logger) == null ? void 0 : _a3.error(`Worker error for task ${this.record.id}`, error);
|
|
140
|
-
|
|
168
|
+
settleOnce(error);
|
|
141
169
|
});
|
|
142
170
|
worker.on("exit", (code) => {
|
|
143
171
|
var _a3;
|
|
144
172
|
(_a3 = this.logger) == null ? void 0 : _a3.info(`Worker exited for task ${this.record.id} with code ${code}`);
|
|
145
173
|
if (isCancelling) {
|
|
146
|
-
|
|
174
|
+
settleOnce(new import_async_task_manager.CancelError());
|
|
147
175
|
} else if (code !== 0) {
|
|
148
|
-
|
|
176
|
+
settleOnce(new Error(`Worker stopped with exit code ${code}`));
|
|
149
177
|
} else {
|
|
150
|
-
|
|
178
|
+
settleOnce(null, successPayload ?? code);
|
|
151
179
|
}
|
|
152
180
|
});
|
|
153
181
|
worker.on("messageerror", (error) => {
|
|
154
|
-
|
|
182
|
+
settleOnce(error);
|
|
155
183
|
});
|
|
156
184
|
} catch (error) {
|
|
157
|
-
|
|
185
|
+
settleOnce(error);
|
|
158
186
|
}
|
|
159
187
|
});
|
|
160
188
|
return workerPromise;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is part of the NocoBase (R) project.
|
|
3
|
+
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
|
4
|
+
* Authors: NocoBase Team.
|
|
5
|
+
*
|
|
6
|
+
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
|
+
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
|
+
*/
|
|
9
|
+
import { TaskId } from '../../common/types';
|
|
10
|
+
export type ConcurrencyMode = 'app' | 'process';
|
|
11
|
+
export interface ConcurrencyMonitor {
|
|
12
|
+
idle(): boolean;
|
|
13
|
+
concurrency: number;
|
|
14
|
+
increase(taskId: TaskId): boolean;
|
|
15
|
+
decrease(taskId: TaskId): void;
|
|
16
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is part of the NocoBase (R) project.
|
|
3
|
+
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
|
4
|
+
* Authors: NocoBase Team.
|
|
5
|
+
*
|
|
6
|
+
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
|
+
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
var __defProp = Object.defineProperty;
|
|
11
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
12
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
13
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
14
|
+
var __copyProps = (to, from, except, desc) => {
|
|
15
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
16
|
+
for (let key of __getOwnPropNames(from))
|
|
17
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
18
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
19
|
+
}
|
|
20
|
+
return to;
|
|
21
|
+
};
|
|
22
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
23
|
+
var concurrency_monitor_exports = {};
|
|
24
|
+
module.exports = __toCommonJS(concurrency_monitor_exports);
|
package/package.json
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"description": "Manage and monitor asynchronous tasks such as data import/export. Support task progress tracking and notification.",
|
|
7
7
|
"description.ru-RU": "Управление асинхронными задачами и мониторинг (например, импорт/экспорт данных). Поддержка отслеживания прогресса и уведомлений о задачах.",
|
|
8
8
|
"description.zh-CN": "管理和监控数据导入导出等异步任务。支持任务进度跟踪和通知。",
|
|
9
|
-
"version": "2.0.0-beta.
|
|
9
|
+
"version": "2.0.0-beta.20",
|
|
10
10
|
"main": "dist/server/index.js",
|
|
11
11
|
"peerDependencies": {
|
|
12
12
|
"@nocobase/client": "2.x",
|
|
@@ -17,5 +17,5 @@
|
|
|
17
17
|
"dependencies": {
|
|
18
18
|
"p-queue": "^6.6.2"
|
|
19
19
|
},
|
|
20
|
-
"gitHead": "
|
|
20
|
+
"gitHead": "f4ab788fc6c17915157617026dfbba6f0d78eaac"
|
|
21
21
|
}
|