Skip to content

Frame error : "RangeError Maximum call stack exceeded" #566

@tfrancart

Description

@tfrancart

I ran into this error while framing a large JSON-LD file:

/home/runner/work/garance/garance/node_modules/jsonld/lib/frame.js:76
api.frame = (state, subjects, frame, parent, property = null) => {
            ^

RangeError: Maximum call stack size exceeded
    at api.frame (/home/runner/work/garance/garance/node_modules/jsonld/lib/frame.js:76:13)
    at api.frame (/home/runner/work/garance/garance/node_modules/jsonld/lib/frame.js:258:15)
    at api.frame (/home/runner/work/garance/garance/node_modules/jsonld/lib/frame.js:258:15)
    at api.frame (/home/runner/work/garance/garance/node_modules/jsonld/lib/frame.js:258:15)
    at api.frame (/home/runner/work/garance/garance/node_modules/jsonld/lib/frame.js:258:15)
    at api.frame (/home/runner/work/garance/garance/node_modules/jsonld/lib/frame.js:258:15)
    at api.frame (/home/runner/work/garance/garance/node_modules/jsonld/lib/frame.js:258:15)
    at api.frame (/home/runner/work/garance/garance/node_modules/jsonld/lib/frame.js:258:15)
    at api.frame (/home/runner/work/garance/garance/node_modules/jsonld/lib/frame.js:258:15)
    at api.frame (/home/runner/work/garance/garance/node_modules/jsonld/lib/frame.js:258:15)

Seems like this is induced by some kind of recursive call in the framing algorithm, line 258 of frame.js: https://github.com/digitalbazaar/jsonld.js/blob/main/lib/frame.js#L258

I am reading here that using a "setTimeout" every e.g. 1000 recursive calls may provide the engine the chance to clear the stack: https://stackoverflow.com/a/20999077/189723

Activity

davidlehn

davidlehn commented on Mar 6, 2025

@davidlehn
Member

I imagine some data patterns might have trouble there. Do you have a short example of the shape of your data and the frame? It's easier to debug these sorts of things with an example to run, and knowing the general shape of the data would help to programatically create a large test case.

tfrancart

tfrancart commented on Mar 6, 2025

@tfrancart
Author

Thanks for your answer. I was able to track the problem down.
Here is the JSON-LD to be framed, including ~16000 instances of the class rico:Agent on which we apply the framing : garance-for-agents.zip

Here is the frame that gives the error, on the owl:sameAs property at the bottom:

{
  "@context": {
    "id": "@id",
    "type": "@type",
    "graph": "@graph",
    "included": "@included",

    "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
    "owl": "http://www.w3.org/2002/07/owl#",
    "rdfs": "http://www.w3.org/2000/01/rdf-schema#",
    "rico": "https://www.ica.org/standards/RiC/ontology#",
    "skos": "http://www.w3.org/2004/02/skos/core#",
    "foaf": "http://xmlns.com/foaf/0.1/",
    "dc": "http://purl.org/dc/elements/1.1/",
    "dcterms": "http://purl.org/dc/terms/",
    "html": "http://www.w3.org/1999/xhtml",
    "an": "http://data.archives-nationales.culture.gouv.fr/",
    "xsd": "http://www.w3.org/2001/XMLSchema#",


    "owl:sameAs": {
      "@id": "owl:sameAs",
      "@container": "@set",
      "@type": "@id"
    },
    "rdfs:label": {
      "@id": "rdfs:label",
      "@container": "@set"
    },
    "rico:isOrWasDescribedBy": {
      "@id": "rico:isOrWasDescribedBy",
      "@container": "@set"
    },
    "rico:isOrWasRegulatedBy": {
      "@id": "rico:isOrWasRegulatedBy",
      "@container": "@set",
      "@type": "@id"
    },
    "rico:history": {
      "@id": "rico:history",
      "@container": "@set"
    },
    "rico:hasOrHadAgentName": {
      "@id": "rico:hasOrHadAgentName",
      "@container": "@set"
    },
    "rico:agentIsTargetOfAgentOriginationRelation": {
      "@id": "rico:agentIsTargetOfAgentOriginationRelation",
      "@container": "@set"
    },
    "rico:agentIsTargetOfPerformanceRelation": {
      "@id": "rico:agentIsTargetOfPerformanceRelation",
      "@container": "@set"
    },
    "skos:prefLabel": {
      "@id": "skos:prefLabel",
      "@container": "@set"
    },
    "skos:altLabel": {
      "@id": "skos:altLabel",
      "@container": "@set"
    }
    
  },

  "@explicit": true,
  "type": [
    "rico:Agent"
  ],
  "rdfs:label": { "@omitDefault": true },
  "rico:history": { "@omitDefault": true },
  "rico:beginningDate": { "@omitDefault": true },
  "rico:endDate": { "@omitDefault": true },
  "rico:birthDate": { "@omitDefault": true },
  "rico:deathDate": { "@omitDefault": true },  
  "rico:hasOrHadAgentName": { 
    "@omitDefault": true,
    "@explicit": true,
    "rico:isOrWasRegulatedBy": { "@omitDefault": true },
    "rico:textualValue": { "@omitDefault": true },
    "rico:type": { "@omitDefault": true },
    "rico:usedFromDate": { "@omitDefault": true },
    "rico:usedToDate": { "@omitDefault": true }
  },
  "rico:agentIsTargetOfAgentOriginationRelation": {
    "@omitDefault": true,
    "@explicit": true
  },
  "rico:agentIsTargetOfPerformanceRelation": {
    "@omitDefault": true,
    "@explicit": true,
    "rico:performanceRelationHasSource": {
      "@explicit": true,
      "@omitDefault": true,
      "rico:hasActivityType": {
        "@explicit": true,
        "@omitDefault": true,
        "skos:prefLabel": {}
      }
    }
  },
  "rico:isOrWasMemberOf": {
    "@omitDefault": true,
    "@explicit": true,
    "rdfs:label": { "@omitDefault": true }
  },
  "rico:hasOrHadSubdivision": {
    "@omitDefault": true,
    "@explicit": true,
    "rdfs:label": { "@omitDefault": true }
  },
  "owl:sameAs": { 
    /* THE PROBLEM IS HERE */
    "@omitDefault": true
  }  
}

The point is that owl:sameAs can point either to external resources, or to one of the 16000 agents inside the JSON-LD. And when this is the case, the framing on these entities takes very long and crashes.

If I set @explicit: true in owl:sameAs (which is what I want, I want only URIs here, with labels), then the problem disappears.
Here is the frame that does not gives the error (see the modified owl:sameAs at the end):

{
  "@context": {
    "id": "@id",
    "type": "@type",
    "graph": "@graph",
    "included": "@included",

    "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
    "owl": "http://www.w3.org/2002/07/owl#",
    "rdfs": "http://www.w3.org/2000/01/rdf-schema#",
    "rico": "https://www.ica.org/standards/RiC/ontology#",
    "skos": "http://www.w3.org/2004/02/skos/core#",
    "foaf": "http://xmlns.com/foaf/0.1/",
    "dc": "http://purl.org/dc/elements/1.1/",
    "dcterms": "http://purl.org/dc/terms/",
    "html": "http://www.w3.org/1999/xhtml",
    "an": "http://data.archives-nationales.culture.gouv.fr/",
    "xsd": "http://www.w3.org/2001/XMLSchema#",


    "owl:sameAs": {
      "@id": "owl:sameAs",
      "@container": "@set",
      "@type": "@id"
    },
    "rdfs:label": {
      "@id": "rdfs:label",
      "@container": "@set"
    },
    "rico:isOrWasDescribedBy": {
      "@id": "rico:isOrWasDescribedBy",
      "@container": "@set"
    },
    "rico:isOrWasRegulatedBy": {
      "@id": "rico:isOrWasRegulatedBy",
      "@container": "@set",
      "@type": "@id"
    },
    "rico:history": {
      "@id": "rico:history",
      "@container": "@set"
    },
    "rico:hasOrHadAgentName": {
      "@id": "rico:hasOrHadAgentName",
      "@container": "@set"
    },
    "rico:agentIsTargetOfAgentOriginationRelation": {
      "@id": "rico:agentIsTargetOfAgentOriginationRelation",
      "@container": "@set"
    },
    "rico:agentIsTargetOfPerformanceRelation": {
      "@id": "rico:agentIsTargetOfPerformanceRelation",
      "@container": "@set"
    },
    "skos:prefLabel": {
      "@id": "skos:prefLabel",
      "@container": "@set"
    },
    "skos:altLabel": {
      "@id": "skos:altLabel",
      "@container": "@set"
    }
    
  },

  "@explicit": true,
  "type": [
    "rico:Agent"
  ],
  "rdfs:label": { "@omitDefault": true },
  "rico:history": { "@omitDefault": true },
  "rico:beginningDate": { "@omitDefault": true },
  "rico:endDate": { "@omitDefault": true },
  "rico:birthDate": { "@omitDefault": true },
  "rico:deathDate": { "@omitDefault": true },  
  "rico:hasOrHadAgentName": { 
    "@omitDefault": true,
    "@explicit": true,
    "rico:isOrWasRegulatedBy": { "@omitDefault": true },
    "rico:textualValue": { "@omitDefault": true },
    "rico:type": { "@omitDefault": true },
    "rico:usedFromDate": { "@omitDefault": true },
    "rico:usedToDate": { "@omitDefault": true }
  },
  "rico:agentIsTargetOfAgentOriginationRelation": {
    "@omitDefault": true,
    "@explicit": true
  },
  "rico:agentIsTargetOfPerformanceRelation": {
    "@omitDefault": true,
    "@explicit": true,
    "rico:performanceRelationHasSource": {
      "@explicit": true,
      "@omitDefault": true,
      "rico:hasActivityType": {
        "@explicit": true,
        "@omitDefault": true,
        "skos:prefLabel": {}
      }
    }
  },
  "rico:isOrWasMemberOf": {
    "@omitDefault": true,
    "@explicit": true,
    "rdfs:label": { "@omitDefault": true }
  },
  "rico:hasOrHadSubdivision": {
    "@omitDefault": true,
    "@explicit": true,
    "rdfs:label": { "@omitDefault": true }
  },
  "owl:sameAs": { 
    "@omitDefault": true,
    "@explicit": true,
    "rdfs:label": { "@omitDefault": true }
  }  
}

Even if I am able to work around the problem, I would be happy to understand the reason for the crash.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      No branches or pull requests

        Participants

        @davidlehn@tfrancart

        Issue actions

          Frame error : "RangeError Maximum call stack exceeded" · Issue #566 · digitalbazaar/jsonld.js