@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.
@@ -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('Canceled', { ns: '@nocobase/plugin-async-task-manager' })}}";
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('Canceled', { ns: '@nocobase/plugin-async-task-manager' })}}";
64
+ readonly label: "{{t('Cancelled', { ns: '@nocobase/plugin-async-task-manager' })}}";
65
65
  readonly color: "warning";
66
66
  readonly icon: "StopOutlined";
67
67
  };
@@ -67,7 +67,7 @@ const TASK_STATUS_OPTIONS = {
67
67
  },
68
68
  [TASK_STATUS.CANCELED]: {
69
69
  value: TASK_STATUS.CANCELED,
70
- label: `{{t('Canceled', { ns: '${NAMESPACE}' })}}`,
70
+ label: `{{t('Cancelled', { ns: '${NAMESPACE}' })}}`,
71
71
  color: "warning",
72
72
  icon: "StopOutlined"
73
73
  }
@@ -8,15 +8,15 @@
8
8
  */
9
9
 
10
10
  module.exports = {
11
- "@nocobase/client": "2.0.0-beta.2",
11
+ "@nocobase/client": "2.0.0-beta.20",
12
12
  "react": "18.2.0",
13
- "@nocobase/utils": "2.0.0-beta.2",
13
+ "@nocobase/utils": "2.0.0-beta.20",
14
14
  "lodash": "4.17.21",
15
- "@nocobase/server": "2.0.0-beta.2",
16
- "@nocobase/logger": "2.0.0-beta.2",
17
- "@nocobase/database": "2.0.0-beta.2",
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.2"
21
+ "@nocobase/actions": "2.0.0-beta.20"
22
22
  };
@@ -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",
@@ -31,6 +31,8 @@
31
31
  "Skipped records": "已跳过记录",
32
32
  "Status": "状态",
33
33
  "Successfully imported": "成功导入",
34
+ "Stop": "停止",
35
+ "Stopping...": "停止中...",
34
36
  "Task": "任务",
35
37
  "Task cancelled": "任务已取消",
36
38
  "Task completed": "任务已完成",
@@ -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
- concurrency: number;
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
- concurrency = process.env.ASYNC_TASK_MAX_CONCURRENCY ? Number.parseInt(process.env.ASYNC_TASK_MAX_CONCURRENCY, 10) : 3;
57
- idle = () => {
58
- return this.app.serving(WORKER_JOB_ASYNC_TASK_PROCESS) && this.tasks.size < this.concurrency;
59
- };
60
- onQueueTask = async ({ id }) => {
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
- await this.runTask(task);
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
- resolve(message.payload);
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
- reject(error);
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
- reject(new import_async_task_manager.CancelError());
174
+ settleOnce(new import_async_task_manager.CancelError());
147
175
  } else if (code !== 0) {
148
- reject(new Error(`Worker stopped with exit code ${code}`));
176
+ settleOnce(new Error(`Worker stopped with exit code ${code}`));
149
177
  } else {
150
- resolve(code);
178
+ settleOnce(null, successPayload ?? code);
151
179
  }
152
180
  });
153
181
  worker.on("messageerror", (error) => {
154
- reject(error);
182
+ settleOnce(error);
155
183
  });
156
184
  } catch (error) {
157
- reject(error);
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.2",
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": "b77a33ee933ae6e09d2d5dce017ca15d8552d57b"
20
+ "gitHead": "f4ab788fc6c17915157617026dfbba6f0d78eaac"
21
21
  }