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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions