Skip to content

json-logic-engine crashes when trying return mildly complex objects from an 'if' command #57

@CoryAlbrecht

Description

@CoryAlbrecht

Javascript code

async function processMission(fromWhere, character) {
  const actions = [];
  const characterData = character.getCharacterData();
  const mission = await Mission.findMissionById(
    characterData.currentMission.id
  );
  const stage = mission.getStageByNumber(
    character.getData("currentMission.stage")
  );

  if (stage.actions) {
    for (const action of stage.actions) {
      const result = engine.run(action, {
        evaluate: { fromWhere: fromWhere, characterData: characterData },
      });
      if (result) {
        if (Array.isArray(result)) {
          for (const r of result) {
            actions.push(r);
          }
        } else {
          actions.push(result);
        }
      }
    }
  }
  return actions;
}

Node crash output:

[dev:server] node:internal/process/promises:392
[dev:server]       new UnhandledPromiseRejection(reason);
[dev:server]       ^
[dev:server] 
[dev:server] UnhandledPromiseRejection: This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). The promise rejected with the reason "#<Object>".
[dev:server]     at throwUnhandledRejectionsMode (node:internal/process/promises:392:7)
[dev:server]     at processPromiseRejections (node:internal/process/promises:475:17)
[dev:server]     at process.processTicksAndRejections (node:internal/process/task_queues:105:32) {
[dev:server]   code: 'ERR_UNHANDLED_REJECTION'
[dev:server] }
[dev:server] 
[dev:server] Node.js v24.14.0
[dev:server] Command failed with exit code 1: /home/cory/.config/nvm/versions/node/v24.14.0/bin/node ./src/server.js
[dev:server] Waiting for the debugger to disconnect...
[dev:server] Waiting for the debugger to disconnect...
[dev:styles] Waiting for the debugger to disconnect...
ERROR: "dev:server" exited with 1.
Waiting for the debugger to disconnect...
[nodemon] app crashed - waiting for file changes before starting...

Example data fragments that can cause the crash:

This one is taken from thh YAML file that gets loaded

  - if:
      - and:
          - "==":
              - var: evaluate.fromWhere
              - map
          - "==":
              - var: evaluate.characterData.currentMission.id
              - 1
          - "==":
              - var: evaluate.characterData.currentMission.stage
              - 1
      - var:
          - cmd: "set"
            target: "character"
            data:
              - "currentMission.id"
              - 1
          - cmd: "set"
            target: "character"
            data:
              - "currentMission.stage"
              - 2
          - cmd: "set"
            target: "character"
            data:
              - "currentActivity"
              - "location"
          - cmd: "set"
            target: "location"
            data:
              - 1

Here's a copy of data that caused the crash from an in memory object from VSCode just before the crash. (Yes, I know there's there's lots of , in there that aren't 'proper' JSON, but if you uses VSCode you know that's how it copy's values during debugging.)

{
  if: [
    {
      and: [
        {
          "==": [
            {
              var: "evaluate.fromWhere",
            },
            "map",
          ],
        },
        {
          "==": [
            {
              var: "evaluate.characterData.currentMission.id",
            },
            1,
          ],
        },
        {
          "==": [
            {
              var: "evaluate.characterData.currentMission.stage",
            },
            1,
          ],
        },
      ],
    },
    [
      {
        cmd: "set",
        target: "character",
        data: [
          "currentMission.id",
          1,
        ],
      },
      {
        cmd: "set",
        target: "character",
        data: [
          "currentMission.stage",
          2,
        ],
      },
      {
        cmd: "set",
        target: "character",
        data: [
          "currentActivity",
          "location",
        ],
      },
      {
        cmd: "set",
        target: "location",
        data: [
          1,
        ],
      },
    ],
  ],
}

Version of the data that works without a crash:

actions:
  - if:
      - and:
          - "==":
              - var: evaluate.fromWhere
              - map
          - "==":
              - var: evaluate.characterData.currentMission.id
              - 1
          - "==":
              - var: evaluate.characterData.currentMission.stage
              - 1
      - [
          "set character currentMission.id 1",
          "set character currentMission.stage 2",
          "set location 1",
          "set character currentActivity \"location\""
        ]

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions