Forge bridge invoke, ReferenceError: window is not defined error

Hi,
I previously reported an issue related to window is not defined, and now I’m encountering the same error again, but in a different context.
I have a trigger defined in my manifest as follows:

trigger:
  - key: issue-fields-trigger
    function: issue-field-trigger
    filter:
      expression: event.type.includes("***")
    events:
      - avi:jira:created:field
      - avi:jira:updated:field
      - avi:jira:trashed:field
      - avi:jira:restored:field
      - avi:jira:deleted:field
function:
  - key: resolver
    handler: index.handler
  - key: issue-field-trigger
    handler: trigger.run

And the trigger.run function looks like this:

import { invoke } from "@forge/bridge";

export const run = async (event) => {
  let eventType = event.eventType;
  const fieldName = event.name;
  const fieldID = event.id;
  const fieldDescription = event.description;

  console.log("Event Type:", eventType);
  console.log("Field Name:", fieldName);
  console.log("Field ID:", fieldID);
  console.log("Field Description:", fieldDescription);

  const data = {
    fieldID,
    fieldName,
    fieldDescription
  };

  const getStoredData = await invoke('getStorage', { key: 'myKey' });
  const storedData = (getStoredData.status === 200 && getStoredData.res) ? getStoredData.res : [];
  let updatedData = [...storedData, data];

  const responseStorage = await invoke('setStorage', { key: 'issuePicker', value: updatedData });

  if (responseStorage.status !== 200) {
    console.error("Error setting storage:", responseStorage.message);
    return;
  }
}

When this trigger is executed, I’m getting a window is not defined error. I assume this may be due to the usage of @forge/bridge within the trigger function context, which is server-side.
Could you please advise on how to properly handle this case or suggest an alternative way to achieve the same functionality?
Thank you in advance.
Best regards,
Mertcan.

1 Like

Yeah @forge/bridge is a frontend-only package. Trigger event is going to fire on the backend.

Also the Forge CLI bundler doesn’t currently do correct tree-shaking. So if you import a frontend @forge/* package anywhere in your backend code you’ll get that window is not defined error regardless of whether that package is used in a function call.

Hi @MertcanKaraba1,

@nathanwaters is correct — invoke is only used to make requests from the frontend to a resolver. You can’t use invoke to call one function from another on the backend.

If you have common library functions you want to share across Forge functions, you can use regular JS import/export statements to do so.

e.g. to share logic across a resolver and a trigger you could do something like:

// lib.js
export async function getStorage(key) { ... }
export async function setStorage(key, value) { ... }
// resolver.js
import { getStorage, setStorage } from "./lib"

const resolver = new Resolver();

resolver.define('doTheThing', async ({ payload, context }) => {
  // ...
  const value = await getStorage(payload.key); 
  // ...
});
// trigger.js
import { getStorage, setStorage } from "./lib"

export async function run(event) {
   // ...
   const getStoredData = await getStorage('myKey');
   // ...
}

Hope that helps!

cheers,
Tim

1 Like