handlerParameterPrompt.js 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import { nanoid } from 'nanoid/non-secure';
  2. import browser from 'webextension-polyfill';
  3. import { sleep } from '@/utils/helper';
  4. function getInputtedParams(promptId, ms = 10000) {
  5. return new Promise((resolve, reject) => {
  6. const timeout = null;
  7. const storageListener = (event) => {
  8. if (!event[promptId]) return;
  9. clearTimeout(timeout);
  10. browser.storage.onChanged.removeListener(storageListener);
  11. browser.storage.local.remove(promptId);
  12. const { newValue } = event[promptId];
  13. if (newValue.$isError) {
  14. reject(new Error(newValue.message));
  15. return;
  16. }
  17. resolve(newValue);
  18. };
  19. if (ms > 0) {
  20. setTimeout(() => {
  21. browser.storage.onChanged.removeListener(storageListener);
  22. resolve({});
  23. }, ms);
  24. }
  25. browser.storage.onChanged.addListener(storageListener);
  26. });
  27. }
  28. export default async function ({ data, id }) {
  29. const paramURL = browser.runtime.getURL('/params.html');
  30. let tab = (await browser.tabs.query({})).find((item) =>
  31. item.url.includes(paramURL)
  32. );
  33. if (!tab) {
  34. const { tabs } = await browser.windows.create({
  35. type: 'popup',
  36. width: 480,
  37. height: 600,
  38. url: browser.runtime.getURL('/params.html'),
  39. });
  40. [tab] = tabs;
  41. await sleep(1000);
  42. } else {
  43. await browser.tabs.update(tab.id, {
  44. active: true,
  45. });
  46. await browser.windows.update(tab.windowId, { focused: true });
  47. }
  48. const promptId = `params-prompt:${nanoid(4)}__${id}`;
  49. const { timeout } = data;
  50. await browser.tabs.sendMessage(tab.id, {
  51. name: 'workflow:params-block',
  52. data: {
  53. promptId,
  54. blockId: id,
  55. timeoutMs: timeout,
  56. execId: this.engine.id,
  57. params: data.parameters,
  58. timeout: Date.now() + timeout,
  59. name: this.engine.workflow.name,
  60. icon: this.engine.workflow.icon,
  61. description: this.engine.workflow.description,
  62. },
  63. });
  64. const result = await getInputtedParams(promptId, timeout);
  65. Object.entries(result).forEach(([varName, varValue]) => {
  66. this.setVariable(varName, varValue);
  67. });
  68. return {
  69. data: '',
  70. nextBlockId: this.getBlockConnections(id),
  71. };
  72. }