@motiadev/plugin-bullmq 0.13.0-beta.162-717198
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/LICENSE +93 -0
- package/README.md +85 -0
- package/dist/api.d.ts +4 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/components/dlq-panel.d.ts +2 -0
- package/dist/components/dlq-panel.d.ts.map +1 -0
- package/dist/components/job-detail.d.ts +2 -0
- package/dist/components/job-detail.d.ts.map +1 -0
- package/dist/components/jobs-table.d.ts +2 -0
- package/dist/components/jobs-table.d.ts.map +1 -0
- package/dist/components/queue-detail.d.ts +2 -0
- package/dist/components/queue-detail.d.ts.map +1 -0
- package/dist/components/queue-list.d.ts +2 -0
- package/dist/components/queue-list.d.ts.map +1 -0
- package/dist/components/queues-page.d.ts +2 -0
- package/dist/components/queues-page.d.ts.map +1 -0
- package/dist/hooks/use-jobs.d.ts +16 -0
- package/dist/hooks/use-jobs.d.ts.map +1 -0
- package/dist/hooks/use-queues.d.ts +13 -0
- package/dist/hooks/use-queues.d.ts.map +1 -0
- package/dist/index.cjs +98 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2636 -0
- package/dist/plugin-bullmq.css +1 -0
- package/dist/plugin.cjs +1 -0
- package/dist/plugin.d.ts +3 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +290 -0
- package/dist/stores/use-bullmq-store.d.ts +26 -0
- package/dist/stores/use-bullmq-store.d.ts.map +1 -0
- package/dist/types/queue.d.ts +54 -0
- package/dist/types/queue.d.ts.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-tracking:initial;--tw-outline-style:solid;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-content:""}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-600:oklch(68.1% .162 75.834);--color-green-500:oklch(72.3% .219 149.579);--color-blue-500:oklch(62.3% .214 259.815);--color-purple-500:oklch(62.7% .265 303.9);--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-wider:.05em;--animate-spin:spin 1s linear infinite;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--font-weight-500:var(--font-weight-500);--font-weight-600:var(--font-weight-600);--font-weight-700:var(--font-weight-700)}}@layer base{*{border-color:var(--border)}body{background-color:var(--background);color:var(--foreground)}*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.top-0{top:calc(var(--spacing)*0)}.top-1\/2{top:50%}.right-3{right:calc(var(--spacing)*3)}.left-3{left:calc(var(--spacing)*3)}.mt-1{margin-top:calc(var(--spacing)*1)}.mr-2{margin-right:calc(var(--spacing)*2)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.ml-1\.5{margin-left:calc(var(--spacing)*1.5)}.ml-auto{margin-left:auto}.flex{display:flex}.grid{display:grid}.h-1\.5{height:calc(var(--spacing)*1.5)}.h-3{height:calc(var(--spacing)*3)}.h-4{height:calc(var(--spacing)*4)}.h-8{height:calc(var(--spacing)*8)}.h-full{height:100%}.max-h-\[300px\]{max-height:300px}.max-h-\[400px\]{max-height:400px}.w-3{width:calc(var(--spacing)*3)}.w-4{width:calc(var(--spacing)*4)}.w-8{width:calc(var(--spacing)*8)}.w-16{width:calc(var(--spacing)*16)}.w-\[60px\]{width:60px}.w-\[80px\]{width:80px}.w-\[100px\]{width:100px}.w-\[140px\]{width:140px}.w-\[150px\]{width:150px}.w-\[180px\]{width:180px}.w-\[200px\]{width:200px}.w-full{width:100%}.max-w-\[300px\]{max-width:300px}.flex-1{flex:1}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.grid-cols-\[300px_1fr\]{grid-template-columns:300px 1fr}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-1{gap:calc(var(--spacing)*1)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-border{border-color:var(--border)}.bg-background\/95{background-color:var(--background)}@supports (color:color-mix(in lab,red,red)){.bg-background\/95{background-color:color-mix(in oklab,var(--background)95%,transparent)}}.bg-destructive\/10{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.bg-destructive\/10{background-color:color-mix(in oklab,var(--destructive)10%,transparent)}}.bg-muted{background-color:var(--muted)}.bg-muted-foreground\/10{background-color:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){.bg-muted-foreground\/10{background-color:color-mix(in oklab,var(--muted-foreground)10%,transparent)}}.bg-muted\/30{background-color:var(--muted)}@supports (color:color-mix(in lab,red,red)){.bg-muted\/30{background-color:color-mix(in oklab,var(--muted)30%,transparent)}}.bg-primary{background-color:var(--primary)}.bg-yellow-500\/20{background-color:#edb20033}@supports (color:color-mix(in lab,red,red)){.bg-yellow-500\/20{background-color:color-mix(in oklab,var(--color-yellow-500)20%,transparent)}}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.px-1\.5{padding-inline:calc(var(--spacing)*1.5)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-9{padding-inline:calc(var(--spacing)*9)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-2{padding-block:calc(var(--spacing)*2)}.pt-2{padding-top:calc(var(--spacing)*2)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.text-blue-500{color:var(--color-blue-500)}.text-destructive{color:var(--destructive)}.text-green-500{color:var(--color-green-500)}.text-muted-foreground,.text-muted-foreground\/50{color:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/50{color:color-mix(in oklab,var(--muted-foreground)50%,transparent)}}.text-purple-500{color:var(--color-purple-500)}.text-yellow-500{color:var(--color-yellow-500)}.text-yellow-600{color:var(--color-yellow-600)}.uppercase{text-transform:uppercase}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.paused{animation-play-state:paused}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:right-0:after{content:var(--tw-content);right:calc(var(--spacing)*0)}.after\:bottom-0:after{content:var(--tw-content);bottom:calc(var(--spacing)*0)}.after\:left-0:after{content:var(--tw-content);left:calc(var(--spacing)*0)}.after\:h-0\.5:after{content:var(--tw-content);height:calc(var(--spacing)*.5)}.after\:bg-primary:after{content:var(--tw-content);background-color:var(--primary)}@media (hover:hover){.hover\:bg-muted-foreground\/10:hover{background-color:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-muted-foreground\/10:hover{background-color:color-mix(in oklab,var(--muted-foreground)10%,transparent)}}.hover\:bg-muted-foreground\/20:hover{background-color:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-muted-foreground\/20:hover{background-color:color-mix(in oklab,var(--muted-foreground)20%,transparent)}}.hover\:bg-muted\/70:hover{background-color:var(--muted)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-muted\/70:hover{background-color:color-mix(in oklab,var(--muted)70%,transparent)}}.hover\:text-muted-foreground:hover{color:var(--muted-foreground)}}}:root{--default-font-family:"DM Sans",ui-sans-serif,sans-serif;--font-dm-mono:"DM Mono",ui-monospace,monospace;color-scheme:light dark;font-size:16px;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"),serif;font-synthesis:none;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-optical-sizing:auto;--font-weight-500:500;--font-weight-600:600;--font-weight-700:700;--accent-1000:#2862fe;--accent-970:#2862fef7;--accent-950:#2862fef2;--accent-900:#2862fee5;--accent-800:#2862fecc;--accent-700:#2862feb2;--accent-600:#2862fe99;--accent-500:#2862fe80;--accent-400:#2862fe66;--accent-300:#2862fe4d;--accent-200:#2862fe33;--accent-100:#2862fe1a;--accent-50:#2862fe0d;--accent-30:#2862fe08;--dark-1000:#0a0a0a;--dark-970:#0a0a0af7;--dark-950:#0a0a0af2;--dark-900:#0a0a0ae5;--dark-800:#0a0a0acc;--dark-700:#0a0a0ab2;--dark-600:#0a0a0a99;--dark-500:#0a0a0a80;--dark-400:#0a0a0a66;--dark-300:#0a0a0a4d;--dark-200:#0a0a0a33;--dark-100:#0a0a0a1a;--dark-50:#0a0a0a0d;--dark-30:#0a0a0a08;--light-1000:#fff;--light-970:#fffffff7;--light-950:#fffffff2;--light-900:#ffffffe5;--light-800:#fffc;--light-700:#ffffffb2;--light-600:#fff9;--light-500:#ffffff80;--light-400:#fff6;--light-300:#ffffff4d;--light-200:#fff3;--light-100:#ffffff1a;--light-50:#ffffff0d;--light-30:#ffffff08;--error:#d61355;--canvas-background:#ebebeb;--background:var(--light-1000);--foreground:var(--dark-1000);--surface-content:var(--dark-30);--surface-component:var(--dark-50);--surface-light-100:var(--dark-100);--surface-light-200:var(--dark-200);--border:var(--dark-100);--border-accent:var(--accent-1000);--states-hover:var(--dark-30);--states-selected:var(--dark-100);--states-active:var(--accent-1000);--text-header:var(--dark-1000);--text-body:var(--dark-600);--text-placeholder:var(--dark-400);--text-accent:var(--accent-1000);--text-error:var(--error);--icon-active:var(--dark-1000);--icon-light:var(--dark-600);--icon-component:var(--dark-400);--icon-accent:var(--accent-1000);--primary:var(--accent-1000);--primary-foreground:var(--light-1000);--secondary:var(--surface-component);--secondary-foreground:var(--text-body);--muted:var(--surface-light-100);--muted-foreground:var(--text-body);--accent:var(--accent-1000);--accent-foreground:var(--light-1000);--destructive:var(--error);--destructive-foreground:var(--light-1000);--card:var(--surface-content);--card-foreground:var(--foreground);--popover:var(--surface-content);--popover-foreground:var(--foreground);--input:var(--states-hover);--ring:var(--border-accent);--chart-1:var(--accent-1000);--chart-2:var(--accent-800);--chart-3:var(--accent-600);--chart-4:var(--accent-400);--chart-5:var(--accent-200);--header:var(--background);--header-foreground:var(--text-header);--header-primary:var(--primary);--header-primary-foreground:var(--primary-foreground);--header-accent:var(--surface-component);--header-accent-foreground:var(--text-body);--header-border:var(--border);--header-ring:var(--ring);--sidebar:var(--background);--sidebar-foreground:var(--text-header);--sidebar-primary:var(--primary);--sidebar-primary-foreground:var(--primary-foreground);--sidebar-accent:var(--surface-component);--sidebar-accent-foreground:var(--text-body);--sidebar-border:var(--border);--sidebar-ring:var(--ring);width:100%}.dark{--canvas-background:#030303;--background:var(--dark-1000);--foreground:var(--light-1000);--surface-content:var(--light-30);--surface-component:var(--light-50);--surface-light-100:var(--light-100);--surface-light-200:var(--light-200);--border:var(--light-100);--states-hover:var(--light-30);--states-selected:var(--light-100);--text-header:var(--light-1000);--text-body:var(--light-600);--text-placeholder:var(--light-400);--icon-active:var(--light-1000);--icon-light:var(--light-600);--icon-component:var(--light-400);--secondary-foreground:var(--light-600);--muted-foreground:var(--light-600);--card:var(--surface-content);--card-foreground:var(--foreground);--popover:var(--surface-content);--popover-foreground:var(--foreground);--input:var(--states-hover);--ring:var(--border-accent);--chart-1:var(--accent-1000);--chart-2:var(--accent-800);--chart-3:var(--accent-600);--chart-4:var(--accent-400);--chart-5:var(--accent-200);--header:var(--background);--header-foreground:var(--text-header);--header-primary:var(--primary);--header-primary-foreground:var(--primary-foreground);--header-accent:var(--surface-component);--header-accent-foreground:var(--text-body);--header-border:var(--border);--header-ring:var(--ring);--sidebar:var(--background);--sidebar-foreground:var(--text-header);--sidebar-primary:var(--primary);--sidebar-primary-foreground:var(--primary-foreground);--sidebar-accent:var(--surface-component);--sidebar-accent-foreground:var(--text-body);--sidebar-border:var(--border);--sidebar-ring:var(--ring)}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@keyframes spin{to{transform:rotate(360deg)}}.json-view{display:block;color:#4d4d4d;text-align:left;--json-property: #009033;--json-index: #676dff;--json-number: #676dff;--json-string: #b2762e;--json-boolean: #dc155e;--json-null: #dc155e}.json-view .json-view--property{color:var(--json-property)}.json-view .json-view--index{color:var(--json-index)}.json-view .json-view--number{color:var(--json-number)}.json-view .json-view--string{color:var(--json-string)}.json-view .json-view--boolean{color:var(--json-boolean)}.json-view .json-view--null{color:var(--json-null)}.json-view .jv-indent{padding-left:1em}.json-view .jv-chevron{display:inline-block;vertical-align:-20%;cursor:pointer;opacity:.4;width:1em;height:1em}:is(.json-view .jv-chevron:hover,.json-view .jv-size:hover+.jv-chevron){opacity:.8}.json-view .jv-size{cursor:pointer;opacity:.4;font-size:.875em;font-style:italic;margin-left:.5em;vertical-align:-5%;line-height:1}.json-view :is(.json-view--copy,.json-view--edit),.json-view .json-view--link svg{display:none;width:1em;height:1em;margin-left:.25em;cursor:pointer}.json-view .json-view--input{width:120px;margin-left:.25em;border-radius:4px;border:1px solid currentColor;padding:0 4px;font-size:87.5%;line-height:1.25;background:transparent}.json-view .json-view--deleting{outline:1px solid #da0000;background-color:#da000011;text-decoration-line:line-through}:is(.json-view:hover,.json-view--pair:hover)>:is(.json-view--copy,.json-view--edit),:is(.json-view:hover,.json-view--pair:hover)>.json-view--link svg{display:inline-block}.json-view .jv-button{background:transparent;outline:none;border:none;cursor:pointer;color:inherit}.json-view .cursor-pointer{cursor:pointer}.json-view svg{vertical-align:-10%}.jv-size-chevron~svg{vertical-align:-16%}.json-view_a11y{color:#545454;--json-property: #aa5d00;--json-index: #007299;--json-number: #007299;--json-string: #008000;--json-boolean: #d91e18;--json-null: #d91e18}.json-view_github{color:#005cc5;--json-property: #005cc5;--json-index: #005cc5;--json-number: #005cc5;--json-string: #032f62;--json-boolean: #005cc5;--json-null: #005cc5}.json-view_vscode{color:#005cc5;--json-property: #0451a5;--json-index: #0000ff;--json-number: #0000ff;--json-string: #a31515;--json-boolean: #0000ff;--json-null: #0000ff}.json-view_atom{color:#383a42;--json-property: #e45649;--json-index: #986801;--json-number: #986801;--json-string: #50a14f;--json-boolean: #0184bc;--json-null: #0184bc}.json-view_winter-is-coming{color:#0431fa;--json-property: #3a9685;--json-index: #ae408b;--json-number: #ae408b;--json-string: #8123a9;--json-boolean: #0184bc;--json-null: #0184bc}
|
package/dist/plugin.cjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";const q=require("ioredis"),w=require("bullmq"),h=new Map,i=(s,n,c)=>{const m=h.get(s);if(m)return m;const t=new w.Queue(s,{connection:n,prefix:c});return h.set(s,t),t},g=async(s,n,c)=>{const m=`${n}:*:id`,t=await s.keys(m),e=new Set;for(const u of t){const l=u.slice(n.length+1).slice(0,-3);e.add(l)}const r=[];for(const u of e){const a=i(u,s,n),[l,d]=await Promise.all([a.isPaused(),a.getJobCounts()]);r.push({name:u,displayName:u,isPaused:l,isDLQ:u.endsWith(c),stats:{waiting:d.waiting||0,active:d.active||0,completed:d.completed||0,failed:d.failed||0,delayed:d.delayed||0,paused:d.paused||0,prioritized:d.prioritized||0}})}return r},P=({registerApi:s},n,c,m)=>{s({method:"GET",path:"/__motia/bullmq/queues"},async()=>{try{return{status:200,body:{queues:await g(m,n,c)}}}catch(t){return{status:500,body:{error:t instanceof Error?t.message:"Unknown error"}}}}),s({method:"GET",path:"/__motia/bullmq/queues/:name"},async t=>{try{const e=t.pathParams.name,r=i(e,m,n),[u,a]=await Promise.all([r.isPaused(),r.getJobCounts()]);return{status:200,body:{name:e,displayName:e,isPaused:u,isDLQ:e.endsWith(c),stats:{waiting:a.waiting||0,active:a.active||0,completed:a.completed||0,failed:a.failed||0,delayed:a.delayed||0,paused:a.paused||0,prioritized:a.prioritized||0}}}}catch(e){return{status:500,body:{error:e instanceof Error?e.message:"Unknown error"}}}}),s({method:"POST",path:"/__motia/bullmq/queues/:name/pause"},async t=>{try{const e=t.pathParams.name;return await i(e,m,n).pause(),{status:200,body:{message:"Queue paused"}}}catch(e){return{status:500,body:{error:e instanceof Error?e.message:"Unknown error"}}}}),s({method:"POST",path:"/__motia/bullmq/queues/:name/resume"},async t=>{try{const e=t.pathParams.name;return await i(e,m,n).resume(),{status:200,body:{message:"Queue resumed"}}}catch(e){return{status:500,body:{error:e instanceof Error?e.message:"Unknown error"}}}}),s({method:"POST",path:"/__motia/bullmq/queues/:name/clean"},async t=>{try{const e=t.pathParams.name,r=t.body,u={grace:r.grace??0,limit:r.limit??1e3,status:r.status??"completed"},l=await i(e,m,n).clean(u.grace,u.limit,u.status);return{status:200,body:{deleted:l.length,ids:l}}}catch(e){return{status:500,body:{error:e instanceof Error?e.message:"Unknown error"}}}}),s({method:"POST",path:"/__motia/bullmq/queues/:name/drain"},async t=>{try{const e=t.pathParams.name;return await i(e,m,n).drain(),{status:200,body:{message:"Queue drained"}}}catch(e){return{status:500,body:{error:e instanceof Error?e.message:"Unknown error"}}}}),s({method:"GET",path:"/__motia/bullmq/queues/:name/jobs"},async t=>{try{const e=t.pathParams.name,r=t.queryParams.status||"waiting",u=parseInt(t.queryParams.start,10)||0,a=parseInt(t.queryParams.end,10)||100;return{status:200,body:{jobs:(await i(e,m,n).getJobs([r],u,a)).map(o=>({id:o.id||"",name:o.name,data:o.data,opts:o.opts,progress:typeof o.progress=="object"?JSON.stringify(o.progress):o.progress,timestamp:o.timestamp,attemptsMade:o.attemptsMade,processedOn:o.processedOn,finishedOn:o.finishedOn,returnvalue:o.returnvalue,failedReason:o.failedReason,stacktrace:o.stacktrace}))}}}catch(e){return{status:500,body:{error:e instanceof Error?e.message:"Unknown error"}}}}),s({method:"GET",path:"/__motia/bullmq/queues/:queueName/jobs/:jobId"},async t=>{try{const e=t.pathParams.queueName,r=t.pathParams.jobId,a=await i(e,m,n).getJob(r);return a?{status:200,body:{id:a.id||"",name:a.name,data:a.data,opts:a.opts,progress:typeof a.progress=="object"?JSON.stringify(a.progress):a.progress,timestamp:a.timestamp,attemptsMade:a.attemptsMade,processedOn:a.processedOn,finishedOn:a.finishedOn,returnvalue:a.returnvalue,failedReason:a.failedReason,stacktrace:a.stacktrace}}:{status:404,body:{error:"Job not found"}}}catch(e){return{status:500,body:{error:e instanceof Error?e.message:"Unknown error"}}}}),s({method:"POST",path:"/__motia/bullmq/queues/:queueName/jobs/:jobId/retry"},async t=>{try{const e=t.pathParams.queueName,r=t.pathParams.jobId,a=await i(e,m,n).getJob(r);return a?(await a.retry(),{status:200,body:{message:"Job retried"}}):{status:404,body:{error:"Job not found"}}}catch(e){return{status:500,body:{error:e instanceof Error?e.message:"Unknown error"}}}}),s({method:"POST",path:"/__motia/bullmq/queues/:queueName/jobs/:jobId/remove"},async t=>{try{const e=t.pathParams.queueName,r=t.pathParams.jobId,a=await i(e,m,n).getJob(r);return a?(await a.remove(),{status:200,body:{message:"Job removed"}}):{status:404,body:{error:"Job not found"}}}catch(e){return{status:500,body:{error:e instanceof Error?e.message:"Unknown error"}}}}),s({method:"POST",path:"/__motia/bullmq/queues/:queueName/jobs/:jobId/promote"},async t=>{try{const e=t.pathParams.queueName,r=t.pathParams.jobId,a=await i(e,m,n).getJob(r);return a?(await a.promote(),{status:200,body:{message:"Job promoted"}}):{status:404,body:{error:"Job not found"}}}catch(e){return{status:500,body:{error:e instanceof Error?e.message:"Unknown error"}}}}),s({method:"GET",path:"/__motia/bullmq/dlq/:name/jobs"},async t=>{try{const e=t.pathParams.name,r=parseInt(t.queryParams.start,10)||0,u=parseInt(t.queryParams.end,10)||100,a=e.endsWith(c)?e:`${e}${c}`;return{status:200,body:{jobs:(await i(a,m,n).getJobs(["waiting","completed"],r,u)).map(o=>({id:o.id||"",name:o.name,data:o.data,timestamp:o.timestamp,originalEvent:o.data?.originalEvent,failureReason:o.data?.failureReason||o.failedReason,failureTimestamp:o.data?.failureTimestamp||o.finishedOn,attemptsMade:o.data?.attemptsMade||o.attemptsMade}))}}}catch(e){return{status:500,body:{error:e instanceof Error?e.message:"Unknown error"}}}}),s({method:"POST",path:"/__motia/bullmq/dlq/:name/retry/:jobId"},async t=>{try{const e=t.pathParams.name,r=t.pathParams.jobId,u=e.endsWith(c)?e:`${e}${c}`,l=await i(u,m,n).getJob(r);if(!l)return{status:404,body:{error:"Job not found in DLQ"}};const d=l.data?.originalEvent;if(d){const b=u.replace(c,""),o=i(b,m,n),p={topic:d.topic,data:d.data,traceId:d.traceId};d.flows&&(p.flows=d.flows),d.messageGroupId&&(p.messageGroupId=d.messageGroupId),await o.add(d.topic||l.name,p)}return await l.remove(),{status:200,body:{message:"Job retried from DLQ"}}}catch(e){return{status:500,body:{error:e instanceof Error?e.message:"Unknown error"}}}}),s({method:"POST",path:"/__motia/bullmq/dlq/:name/retry-all"},async t=>{try{const e=t.pathParams.name,r=e.endsWith(c)?e:`${e}${c}`,a=await i(r,m,n).getJobs(["waiting","completed"]),l=r.replace(c,""),d=i(l,m,n);let b=0;for(const o of a){const p=o.data?.originalEvent;if(p){const y={topic:p.topic,data:p.data,traceId:p.traceId};p.flows&&(y.flows=p.flows),p.messageGroupId&&(y.messageGroupId=p.messageGroupId),await d.add(p.topic||o.name,y)}await o.remove(),b++}return{status:200,body:{message:`Retried ${b} jobs from DLQ`,count:b}}}catch(e){return{status:500,body:{error:e instanceof Error?e.message:"Unknown error"}}}}),s({method:"POST",path:"/__motia/bullmq/dlq/:name/clear"},async t=>{try{const e=t.pathParams.name,r=e.endsWith(c)?e:`${e}${c}`;return await i(r,m,n).obliterate({force:!0}),{status:200,body:{message:"DLQ cleared"}}}catch(e){return{status:500,body:{error:e instanceof Error?e.message:"Unknown error"}}}})},f=s=>s!==null&&typeof s=="object"&&"connection"in s&&"prefix"in s&&"dlqSuffix"in s;function I(s){let n,c,m,t=!1;if(f(s.eventAdapter))n=s.eventAdapter.connection,c=s.eventAdapter.prefix,m=s.eventAdapter.dlqSuffix;else{const e=process.env.BULLMQ_REDIS_HOST||process.env.REDIS_HOST||"localhost",r=parseInt(process.env.BULLMQ_REDIS_PORT||process.env.REDIS_PORT||"6379",10),u=process.env.BULLMQ_REDIS_PASSWORD||process.env.REDIS_PASSWORD||void 0;c=process.env.BULLMQ_PREFIX||"motia:events",m=process.env.BULLMQ_DLQ_SUFFIX||".dlq",n=new q({host:e,port:r,password:u,maxRetriesPerRequest:null}),t=!0}return P(s,c,m,n),{workbench:[{packageName:"@motiadev/plugin-bullmq",cssImports:["@motiadev/plugin-bullmq/dist/plugin-bullmq.css"],label:"Queues",position:"top",componentName:"QueuesPage",labelIcon:"layers"}],onShutdown:async()=>{t&&await n.quit()}}}module.exports=I;
|
package/dist/plugin.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAcrE,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,KAAK,EAAE,kBAAkB,GAAG,WAAW,CAwCrE"}
|
package/dist/plugin.js
ADDED
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
import q from "ioredis";
|
|
2
|
+
import { Queue as w } from "bullmq";
|
|
3
|
+
const h = /* @__PURE__ */ new Map(), i = (s, n, c) => {
|
|
4
|
+
const m = h.get(s);
|
|
5
|
+
if (m)
|
|
6
|
+
return m;
|
|
7
|
+
const t = new w(s, { connection: n, prefix: c });
|
|
8
|
+
return h.set(s, t), t;
|
|
9
|
+
}, g = async (s, n, c) => {
|
|
10
|
+
const m = `${n}:*:id`, t = await s.keys(m), e = /* @__PURE__ */ new Set();
|
|
11
|
+
for (const u of t) {
|
|
12
|
+
const l = u.slice(n.length + 1).slice(0, -3);
|
|
13
|
+
e.add(l);
|
|
14
|
+
}
|
|
15
|
+
const r = [];
|
|
16
|
+
for (const u of e) {
|
|
17
|
+
const a = i(u, s, n), [l, d] = await Promise.all([a.isPaused(), a.getJobCounts()]);
|
|
18
|
+
r.push({
|
|
19
|
+
name: u,
|
|
20
|
+
displayName: u,
|
|
21
|
+
isPaused: l,
|
|
22
|
+
isDLQ: u.endsWith(c),
|
|
23
|
+
stats: {
|
|
24
|
+
waiting: d.waiting || 0,
|
|
25
|
+
active: d.active || 0,
|
|
26
|
+
completed: d.completed || 0,
|
|
27
|
+
failed: d.failed || 0,
|
|
28
|
+
delayed: d.delayed || 0,
|
|
29
|
+
paused: d.paused || 0,
|
|
30
|
+
prioritized: d.prioritized || 0
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
return r;
|
|
35
|
+
}, f = ({ registerApi: s }, n, c, m) => {
|
|
36
|
+
s({ method: "GET", path: "/__motia/bullmq/queues" }, async () => {
|
|
37
|
+
try {
|
|
38
|
+
return { status: 200, body: { queues: await g(m, n, c) } };
|
|
39
|
+
} catch (t) {
|
|
40
|
+
return { status: 500, body: { error: t instanceof Error ? t.message : "Unknown error" } };
|
|
41
|
+
}
|
|
42
|
+
}), s(
|
|
43
|
+
{ method: "GET", path: "/__motia/bullmq/queues/:name" },
|
|
44
|
+
async (t) => {
|
|
45
|
+
try {
|
|
46
|
+
const e = t.pathParams.name, r = i(e, m, n), [u, a] = await Promise.all([r.isPaused(), r.getJobCounts()]);
|
|
47
|
+
return {
|
|
48
|
+
status: 200,
|
|
49
|
+
body: {
|
|
50
|
+
name: e,
|
|
51
|
+
displayName: e,
|
|
52
|
+
isPaused: u,
|
|
53
|
+
isDLQ: e.endsWith(c),
|
|
54
|
+
stats: {
|
|
55
|
+
waiting: a.waiting || 0,
|
|
56
|
+
active: a.active || 0,
|
|
57
|
+
completed: a.completed || 0,
|
|
58
|
+
failed: a.failed || 0,
|
|
59
|
+
delayed: a.delayed || 0,
|
|
60
|
+
paused: a.paused || 0,
|
|
61
|
+
prioritized: a.prioritized || 0
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
} catch (e) {
|
|
66
|
+
return { status: 500, body: { error: e instanceof Error ? e.message : "Unknown error" } };
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
), s(
|
|
70
|
+
{ method: "POST", path: "/__motia/bullmq/queues/:name/pause" },
|
|
71
|
+
async (t) => {
|
|
72
|
+
try {
|
|
73
|
+
const e = t.pathParams.name;
|
|
74
|
+
return await i(e, m, n).pause(), { status: 200, body: { message: "Queue paused" } };
|
|
75
|
+
} catch (e) {
|
|
76
|
+
return { status: 500, body: { error: e instanceof Error ? e.message : "Unknown error" } };
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
), s(
|
|
80
|
+
{ method: "POST", path: "/__motia/bullmq/queues/:name/resume" },
|
|
81
|
+
async (t) => {
|
|
82
|
+
try {
|
|
83
|
+
const e = t.pathParams.name;
|
|
84
|
+
return await i(e, m, n).resume(), { status: 200, body: { message: "Queue resumed" } };
|
|
85
|
+
} catch (e) {
|
|
86
|
+
return { status: 500, body: { error: e instanceof Error ? e.message : "Unknown error" } };
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
), s(
|
|
90
|
+
{ method: "POST", path: "/__motia/bullmq/queues/:name/clean" },
|
|
91
|
+
async (t) => {
|
|
92
|
+
try {
|
|
93
|
+
const e = t.pathParams.name, r = t.body, u = {
|
|
94
|
+
grace: r.grace ?? 0,
|
|
95
|
+
limit: r.limit ?? 1e3,
|
|
96
|
+
status: r.status ?? "completed"
|
|
97
|
+
}, l = await i(e, m, n).clean(u.grace, u.limit, u.status);
|
|
98
|
+
return { status: 200, body: { deleted: l.length, ids: l } };
|
|
99
|
+
} catch (e) {
|
|
100
|
+
return { status: 500, body: { error: e instanceof Error ? e.message : "Unknown error" } };
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
), s(
|
|
104
|
+
{ method: "POST", path: "/__motia/bullmq/queues/:name/drain" },
|
|
105
|
+
async (t) => {
|
|
106
|
+
try {
|
|
107
|
+
const e = t.pathParams.name;
|
|
108
|
+
return await i(e, m, n).drain(), { status: 200, body: { message: "Queue drained" } };
|
|
109
|
+
} catch (e) {
|
|
110
|
+
return { status: 500, body: { error: e instanceof Error ? e.message : "Unknown error" } };
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
), s(
|
|
114
|
+
{ method: "GET", path: "/__motia/bullmq/queues/:name/jobs" },
|
|
115
|
+
async (t) => {
|
|
116
|
+
try {
|
|
117
|
+
const e = t.pathParams.name, r = t.queryParams.status || "waiting", u = parseInt(t.queryParams.start, 10) || 0, a = parseInt(t.queryParams.end, 10) || 100;
|
|
118
|
+
return { status: 200, body: { jobs: (await i(e, m, n).getJobs([r], u, a)).map((o) => ({
|
|
119
|
+
id: o.id || "",
|
|
120
|
+
name: o.name,
|
|
121
|
+
data: o.data,
|
|
122
|
+
opts: o.opts,
|
|
123
|
+
progress: typeof o.progress == "object" ? JSON.stringify(o.progress) : o.progress,
|
|
124
|
+
timestamp: o.timestamp,
|
|
125
|
+
attemptsMade: o.attemptsMade,
|
|
126
|
+
processedOn: o.processedOn,
|
|
127
|
+
finishedOn: o.finishedOn,
|
|
128
|
+
returnvalue: o.returnvalue,
|
|
129
|
+
failedReason: o.failedReason,
|
|
130
|
+
stacktrace: o.stacktrace
|
|
131
|
+
})) } };
|
|
132
|
+
} catch (e) {
|
|
133
|
+
return { status: 500, body: { error: e instanceof Error ? e.message : "Unknown error" } };
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
), s(
|
|
137
|
+
{ method: "GET", path: "/__motia/bullmq/queues/:queueName/jobs/:jobId" },
|
|
138
|
+
async (t) => {
|
|
139
|
+
try {
|
|
140
|
+
const e = t.pathParams.queueName, r = t.pathParams.jobId, a = await i(e, m, n).getJob(r);
|
|
141
|
+
return a ? { status: 200, body: {
|
|
142
|
+
id: a.id || "",
|
|
143
|
+
name: a.name,
|
|
144
|
+
data: a.data,
|
|
145
|
+
opts: a.opts,
|
|
146
|
+
progress: typeof a.progress == "object" ? JSON.stringify(a.progress) : a.progress,
|
|
147
|
+
timestamp: a.timestamp,
|
|
148
|
+
attemptsMade: a.attemptsMade,
|
|
149
|
+
processedOn: a.processedOn,
|
|
150
|
+
finishedOn: a.finishedOn,
|
|
151
|
+
returnvalue: a.returnvalue,
|
|
152
|
+
failedReason: a.failedReason,
|
|
153
|
+
stacktrace: a.stacktrace
|
|
154
|
+
} } : { status: 404, body: { error: "Job not found" } };
|
|
155
|
+
} catch (e) {
|
|
156
|
+
return { status: 500, body: { error: e instanceof Error ? e.message : "Unknown error" } };
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
), s(
|
|
160
|
+
{ method: "POST", path: "/__motia/bullmq/queues/:queueName/jobs/:jobId/retry" },
|
|
161
|
+
async (t) => {
|
|
162
|
+
try {
|
|
163
|
+
const e = t.pathParams.queueName, r = t.pathParams.jobId, a = await i(e, m, n).getJob(r);
|
|
164
|
+
return a ? (await a.retry(), { status: 200, body: { message: "Job retried" } }) : { status: 404, body: { error: "Job not found" } };
|
|
165
|
+
} catch (e) {
|
|
166
|
+
return { status: 500, body: { error: e instanceof Error ? e.message : "Unknown error" } };
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
), s(
|
|
170
|
+
{ method: "POST", path: "/__motia/bullmq/queues/:queueName/jobs/:jobId/remove" },
|
|
171
|
+
async (t) => {
|
|
172
|
+
try {
|
|
173
|
+
const e = t.pathParams.queueName, r = t.pathParams.jobId, a = await i(e, m, n).getJob(r);
|
|
174
|
+
return a ? (await a.remove(), { status: 200, body: { message: "Job removed" } }) : { status: 404, body: { error: "Job not found" } };
|
|
175
|
+
} catch (e) {
|
|
176
|
+
return { status: 500, body: { error: e instanceof Error ? e.message : "Unknown error" } };
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
), s(
|
|
180
|
+
{ method: "POST", path: "/__motia/bullmq/queues/:queueName/jobs/:jobId/promote" },
|
|
181
|
+
async (t) => {
|
|
182
|
+
try {
|
|
183
|
+
const e = t.pathParams.queueName, r = t.pathParams.jobId, a = await i(e, m, n).getJob(r);
|
|
184
|
+
return a ? (await a.promote(), { status: 200, body: { message: "Job promoted" } }) : { status: 404, body: { error: "Job not found" } };
|
|
185
|
+
} catch (e) {
|
|
186
|
+
return { status: 500, body: { error: e instanceof Error ? e.message : "Unknown error" } };
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
), s(
|
|
190
|
+
{ method: "GET", path: "/__motia/bullmq/dlq/:name/jobs" },
|
|
191
|
+
async (t) => {
|
|
192
|
+
try {
|
|
193
|
+
const e = t.pathParams.name, r = parseInt(t.queryParams.start, 10) || 0, u = parseInt(t.queryParams.end, 10) || 100, a = e.endsWith(c) ? e : `${e}${c}`;
|
|
194
|
+
return { status: 200, body: { jobs: (await i(a, m, n).getJobs(["waiting", "completed"], r, u)).map((o) => ({
|
|
195
|
+
id: o.id || "",
|
|
196
|
+
name: o.name,
|
|
197
|
+
data: o.data,
|
|
198
|
+
timestamp: o.timestamp,
|
|
199
|
+
originalEvent: o.data?.originalEvent,
|
|
200
|
+
failureReason: o.data?.failureReason || o.failedReason,
|
|
201
|
+
failureTimestamp: o.data?.failureTimestamp || o.finishedOn,
|
|
202
|
+
attemptsMade: o.data?.attemptsMade || o.attemptsMade
|
|
203
|
+
})) } };
|
|
204
|
+
} catch (e) {
|
|
205
|
+
return { status: 500, body: { error: e instanceof Error ? e.message : "Unknown error" } };
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
), s(
|
|
209
|
+
{ method: "POST", path: "/__motia/bullmq/dlq/:name/retry/:jobId" },
|
|
210
|
+
async (t) => {
|
|
211
|
+
try {
|
|
212
|
+
const e = t.pathParams.name, r = t.pathParams.jobId, u = e.endsWith(c) ? e : `${e}${c}`, l = await i(u, m, n).getJob(r);
|
|
213
|
+
if (!l)
|
|
214
|
+
return { status: 404, body: { error: "Job not found in DLQ" } };
|
|
215
|
+
const d = l.data?.originalEvent;
|
|
216
|
+
if (d) {
|
|
217
|
+
const b = u.replace(c, ""), o = i(b, m, n), p = {
|
|
218
|
+
topic: d.topic,
|
|
219
|
+
data: d.data,
|
|
220
|
+
traceId: d.traceId
|
|
221
|
+
};
|
|
222
|
+
d.flows && (p.flows = d.flows), d.messageGroupId && (p.messageGroupId = d.messageGroupId), await o.add(d.topic || l.name, p);
|
|
223
|
+
}
|
|
224
|
+
return await l.remove(), { status: 200, body: { message: "Job retried from DLQ" } };
|
|
225
|
+
} catch (e) {
|
|
226
|
+
return { status: 500, body: { error: e instanceof Error ? e.message : "Unknown error" } };
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
), s(
|
|
230
|
+
{ method: "POST", path: "/__motia/bullmq/dlq/:name/retry-all" },
|
|
231
|
+
async (t) => {
|
|
232
|
+
try {
|
|
233
|
+
const e = t.pathParams.name, r = e.endsWith(c) ? e : `${e}${c}`, a = await i(r, m, n).getJobs(["waiting", "completed"]), l = r.replace(c, ""), d = i(l, m, n);
|
|
234
|
+
let b = 0;
|
|
235
|
+
for (const o of a) {
|
|
236
|
+
const p = o.data?.originalEvent;
|
|
237
|
+
if (p) {
|
|
238
|
+
const y = {
|
|
239
|
+
topic: p.topic,
|
|
240
|
+
data: p.data,
|
|
241
|
+
traceId: p.traceId
|
|
242
|
+
};
|
|
243
|
+
p.flows && (y.flows = p.flows), p.messageGroupId && (y.messageGroupId = p.messageGroupId), await d.add(p.topic || o.name, y);
|
|
244
|
+
}
|
|
245
|
+
await o.remove(), b++;
|
|
246
|
+
}
|
|
247
|
+
return { status: 200, body: { message: `Retried ${b} jobs from DLQ`, count: b } };
|
|
248
|
+
} catch (e) {
|
|
249
|
+
return { status: 500, body: { error: e instanceof Error ? e.message : "Unknown error" } };
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
), s(
|
|
253
|
+
{ method: "POST", path: "/__motia/bullmq/dlq/:name/clear" },
|
|
254
|
+
async (t) => {
|
|
255
|
+
try {
|
|
256
|
+
const e = t.pathParams.name, r = e.endsWith(c) ? e : `${e}${c}`;
|
|
257
|
+
return await i(r, m, n).obliterate({ force: !0 }), { status: 200, body: { message: "DLQ cleared" } };
|
|
258
|
+
} catch (e) {
|
|
259
|
+
return { status: 500, body: { error: e instanceof Error ? e.message : "Unknown error" } };
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
);
|
|
263
|
+
}, P = (s) => s !== null && typeof s == "object" && "connection" in s && "prefix" in s && "dlqSuffix" in s;
|
|
264
|
+
function v(s) {
|
|
265
|
+
let n, c, m, t = !1;
|
|
266
|
+
if (P(s.eventAdapter))
|
|
267
|
+
n = s.eventAdapter.connection, c = s.eventAdapter.prefix, m = s.eventAdapter.dlqSuffix;
|
|
268
|
+
else {
|
|
269
|
+
const e = process.env.BULLMQ_REDIS_HOST || process.env.REDIS_HOST || "localhost", r = parseInt(process.env.BULLMQ_REDIS_PORT || process.env.REDIS_PORT || "6379", 10), u = process.env.BULLMQ_REDIS_PASSWORD || process.env.REDIS_PASSWORD || void 0;
|
|
270
|
+
c = process.env.BULLMQ_PREFIX || "motia:events", m = process.env.BULLMQ_DLQ_SUFFIX || ".dlq", n = new q({ host: e, port: r, password: u, maxRetriesPerRequest: null }), t = !0;
|
|
271
|
+
}
|
|
272
|
+
return f(s, c, m, n), {
|
|
273
|
+
workbench: [
|
|
274
|
+
{
|
|
275
|
+
packageName: "@motiadev/plugin-bullmq",
|
|
276
|
+
cssImports: ["@motiadev/plugin-bullmq/dist/plugin-bullmq.css"],
|
|
277
|
+
label: "Queues",
|
|
278
|
+
position: "top",
|
|
279
|
+
componentName: "QueuesPage",
|
|
280
|
+
labelIcon: "layers"
|
|
281
|
+
}
|
|
282
|
+
],
|
|
283
|
+
onShutdown: async () => {
|
|
284
|
+
t && await n.quit();
|
|
285
|
+
}
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
export {
|
|
289
|
+
v as default
|
|
290
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { JobInfo, JobStatus, QueueInfo } from '../types/queue';
|
|
2
|
+
type BullMQState = {
|
|
3
|
+
queues: QueueInfo[];
|
|
4
|
+
selectedQueue: QueueInfo | null;
|
|
5
|
+
jobs: JobInfo[];
|
|
6
|
+
selectedJob: JobInfo | null;
|
|
7
|
+
selectedStatus: JobStatus;
|
|
8
|
+
isLoading: boolean;
|
|
9
|
+
error: string | null;
|
|
10
|
+
searchQuery: string;
|
|
11
|
+
jobDetailOpen: boolean;
|
|
12
|
+
setQueues: (queues: QueueInfo[]) => void;
|
|
13
|
+
setSelectedQueue: (queue: QueueInfo | null) => void;
|
|
14
|
+
updateSelectedQueueStats: (queue: QueueInfo) => void;
|
|
15
|
+
setJobs: (jobs: JobInfo[]) => void;
|
|
16
|
+
setSelectedJob: (job: JobInfo | null) => void;
|
|
17
|
+
setSelectedStatus: (status: JobStatus) => void;
|
|
18
|
+
setLoading: (loading: boolean) => void;
|
|
19
|
+
setError: (error: string | null) => void;
|
|
20
|
+
setSearchQuery: (query: string) => void;
|
|
21
|
+
setJobDetailOpen: (open: boolean) => void;
|
|
22
|
+
reset: () => void;
|
|
23
|
+
};
|
|
24
|
+
export declare const useBullMQStore: import('zustand').UseBoundStore<import('zustand').StoreApi<BullMQState>>;
|
|
25
|
+
export {};
|
|
26
|
+
//# sourceMappingURL=use-bullmq-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-bullmq-store.d.ts","sourceRoot":"","sources":["../../src/stores/use-bullmq-store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAEnE,KAAK,WAAW,GAAG;IACjB,MAAM,EAAE,SAAS,EAAE,CAAA;IACnB,aAAa,EAAE,SAAS,GAAG,IAAI,CAAA;IAC/B,IAAI,EAAE,OAAO,EAAE,CAAA;IACf,WAAW,EAAE,OAAO,GAAG,IAAI,CAAA;IAC3B,cAAc,EAAE,SAAS,CAAA;IACzB,SAAS,EAAE,OAAO,CAAA;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,aAAa,EAAE,OAAO,CAAA;IAEtB,SAAS,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,IAAI,CAAA;IACxC,gBAAgB,EAAE,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,KAAK,IAAI,CAAA;IACnD,wBAAwB,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAA;IACpD,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAA;IAClC,cAAc,EAAE,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,KAAK,IAAI,CAAA;IAC7C,iBAAiB,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI,CAAA;IAC9C,UAAU,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;IACtC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAA;IACxC,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACvC,gBAAgB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACzC,KAAK,EAAE,MAAM,IAAI,CAAA;CAClB,CAAA;AAcD,eAAO,MAAM,cAAc,0EAcxB,CAAA"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { Redis, RedisOptions } from 'ioredis';
|
|
2
|
+
export type BullMQPluginConfig = {
|
|
3
|
+
connection: Redis | RedisOptions;
|
|
4
|
+
prefix?: string;
|
|
5
|
+
dlqSuffix?: string;
|
|
6
|
+
refreshInterval?: number;
|
|
7
|
+
};
|
|
8
|
+
export type JobStatus = 'waiting' | 'active' | 'completed' | 'failed' | 'delayed' | 'paused' | 'prioritized';
|
|
9
|
+
export type QueueStats = {
|
|
10
|
+
waiting: number;
|
|
11
|
+
active: number;
|
|
12
|
+
completed: number;
|
|
13
|
+
failed: number;
|
|
14
|
+
delayed: number;
|
|
15
|
+
paused: number;
|
|
16
|
+
prioritized: number;
|
|
17
|
+
};
|
|
18
|
+
export type QueueInfo = {
|
|
19
|
+
name: string;
|
|
20
|
+
displayName: string;
|
|
21
|
+
isPaused: boolean;
|
|
22
|
+
isDLQ: boolean;
|
|
23
|
+
stats: QueueStats;
|
|
24
|
+
};
|
|
25
|
+
export type JobProgress = number | string | object | boolean | null;
|
|
26
|
+
export type JobInfo = {
|
|
27
|
+
id: string;
|
|
28
|
+
name: string;
|
|
29
|
+
data: unknown;
|
|
30
|
+
opts: Record<string, unknown>;
|
|
31
|
+
progress: JobProgress;
|
|
32
|
+
attemptsMade: number;
|
|
33
|
+
failedReason?: string;
|
|
34
|
+
stacktrace?: string[];
|
|
35
|
+
returnvalue?: unknown;
|
|
36
|
+
timestamp: number;
|
|
37
|
+
finishedOn?: number;
|
|
38
|
+
processedOn?: number;
|
|
39
|
+
delay?: number;
|
|
40
|
+
};
|
|
41
|
+
export type DLQJobInfo = {
|
|
42
|
+
id: string;
|
|
43
|
+
originalEvent: unknown;
|
|
44
|
+
failureReason: string;
|
|
45
|
+
failureTimestamp: number;
|
|
46
|
+
attemptsMade: number;
|
|
47
|
+
originalJobId?: string;
|
|
48
|
+
};
|
|
49
|
+
export type CleanOptions = {
|
|
50
|
+
grace: number;
|
|
51
|
+
limit: number;
|
|
52
|
+
status: JobStatus;
|
|
53
|
+
};
|
|
54
|
+
//# sourceMappingURL=queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/types/queue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAElD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,UAAU,EAAE,KAAK,GAAG,YAAY,CAAA;IAChC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB,CAAA;AAED,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,aAAa,CAAA;AAE5G,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,OAAO,CAAA;IACjB,KAAK,EAAE,OAAO,CAAA;IACd,KAAK,EAAE,UAAU,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAA;AAEnE,MAAM,MAAM,OAAO,GAAG;IACpB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,OAAO,CAAA;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7B,QAAQ,EAAE,WAAW,CAAA;IACrB,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACrB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,aAAa,EAAE,OAAO,CAAA;IACtB,aAAa,EAAE,MAAM,CAAA;IACrB,gBAAgB,EAAE,MAAM,CAAA;IACxB,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,SAAS,CAAA;CAClB,CAAA"}
|
package/package.json
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@motiadev/plugin-bullmq",
|
|
3
|
+
"version": "0.13.0-beta.162-717198",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"module": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js",
|
|
12
|
+
"require": "./dist/index.cjs"
|
|
13
|
+
},
|
|
14
|
+
"./plugin": {
|
|
15
|
+
"types": "./dist/plugin.d.ts",
|
|
16
|
+
"import": "./dist/plugin.js",
|
|
17
|
+
"require": "./dist/plugin.cjs"
|
|
18
|
+
},
|
|
19
|
+
"./styles.css": "./dist/plugin-bullmq.css"
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
"dist"
|
|
23
|
+
],
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"bullmq": "^5.63.0",
|
|
26
|
+
"date-fns": "^3.6.0",
|
|
27
|
+
"ioredis": "^5.8.2",
|
|
28
|
+
"lucide-react": "^0.545.0",
|
|
29
|
+
"react18-json-view": "^0.2.9",
|
|
30
|
+
"zustand": "^5.0.8"
|
|
31
|
+
},
|
|
32
|
+
"peerDependencies": {
|
|
33
|
+
"@motiadev/adapter-bullmq-events": "0.13.0-beta.162-717198",
|
|
34
|
+
"@motiadev/stream-client-react": "0.13.0-beta.162-717198",
|
|
35
|
+
"@motiadev/ui": "0.13.0-beta.162-717198",
|
|
36
|
+
"@motiadev/core": "0.13.0-beta.162-717198"
|
|
37
|
+
},
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"@tailwindcss/vite": "^4.1.14",
|
|
40
|
+
"@types/node": "^24.7.2",
|
|
41
|
+
"@types/react": "^19.2.2",
|
|
42
|
+
"@vitejs/plugin-react": "^5.0.4",
|
|
43
|
+
"react": "^19.2.0",
|
|
44
|
+
"tailwindcss": "^4.1.14",
|
|
45
|
+
"tw-animate-css": "^1.2.9",
|
|
46
|
+
"typescript": "^5.9.3",
|
|
47
|
+
"vite": "^7.1.10",
|
|
48
|
+
"vite-plugin-dts": "^4.5.4"
|
|
49
|
+
},
|
|
50
|
+
"scripts": {
|
|
51
|
+
"build": "vite build",
|
|
52
|
+
"dev": "vite build --watch",
|
|
53
|
+
"clean": "rm -rf dist"
|
|
54
|
+
}
|
|
55
|
+
}
|