{"record":{"id":"cc87be61fe987d5e","repo":"toeverything/AFFiNE","slug":"dynamic-resolve-recursion-limit-reached","errorCode":null,"errorMessage":"Dynamic resolve recursion limit reached","messagePattern":"Dynamic resolve recursion limit reached","errorType":"exception","errorClass":"RecursionLimitError","httpStatus":null,"severity":"error","filePath":"packages/common/infra/src/framework/core/provider.ts","lineNumber":269,"sourceCode":"      } else {\n        service = this.provider.cache.getOrInsert(\n          {\n            identifierName: identifier.identifierName,\n            variant,\n          },\n          runFactory\n        );\n      }\n      result.set(variant, service);\n    }\n\n    return result;\n  }\n\n  track(identifier: IdentifierValue): Resolver {\n    const depth = this.depth + 1;\n    if (depth >= 100) {\n      throw new RecursionLimitError();\n    }\n    const circular = this.stack.find(\n      i =>\n        i.identifierName === identifier.identifierName &&\n        i.variant === identifier.variant\n    );\n    if (circular) {\n      throw new CircularDependencyError([...this.stack, identifier]);\n    }\n\n    return new Resolver(this.provider, depth, [...this.stack, identifier]);\n  }\n\n  override dispose(): void {}\n}\n\nexport class BasicFrameworkProvider extends FrameworkProvider {\n  public readonly cache = new ComponentCachePool();","sourceCodeStart":251,"sourceCodeEnd":287,"githubUrl":"https://github.com/toeverything/AFFiNE/blob/b4c8548c09da21b2898443559a5b846f0ccf5dd8/packages/common/infra/src/framework/core/provider.ts#L251-L287","documentation":"track() increments a depth counter while resolving service identifiers; when resolution nesting reaches 100 levels it assumes a runaway/circular dependency graph and throws RecursionLimitError. Called from nextResolver during dependency resolution.","triggerScenarios":"Thrown at packages/common/infra/src/framework/core/provider.ts:269 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Reduce dynamic resolution depth; a factory likely resolves itself or loops.","Break the recursive resolution by restructuring the factory or caching the result.","Inspect the dependency graph for a cycle expressed through dynamic factories."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"b4c8548c09da21b2898443559a5b846f0ccf5dd8","analyzedAt":"2026-08-18T21:16:52.546Z","contentChangedAt":"2026-08-18T21:16:52.546Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}