Skip to content

[Feature] Implement Multiton Pattern for Enhanced Instance Management in AsgardeoAuthClient #368

@kavindadimuthu

Description

@kavindadimuthu

Current Limitation

The AsgardeoAuthClient currently relies on a public constructor, allowing for the uncontrolled creation of multiple instances without a centralized management system. Unlike the browser-specific implementations in the SDK ecosystem, there is no static mechanism to track, retrieve, or properly dispose of active client instances.

This lack of lifecycle management creates several issues:

  • Inconsistency: It diverges from the architectural patterns used elsewhere in the SDK, leading to a fragmented developer experience.
  • Resource Management: There is no standard way to destroy an instance or clear its session data, which poses risks for memory leaks.
  • Multi-tenancy issues: Applications needing multiple isolated authentication contexts (e.g., distinct organization sessions) have no reliable way to manage and access specific instances by ID.
  • Testing challenges: Without a way to destroyAllInstances(), ensuring a clean state between unit tests is difficult.

Suggested Improvement

Refactor the AsgardeoAuthClient to implement the Multiton Pattern. This involves restricting direct instantiation and managing instances via a static internal map.

Specific changes recommended:

  • Protected Constructor: Change the constructor visibility to protected to prevent direct usage of new AsgardeoAuthClient().
  • Static Instance Map: Introduce a static Map<number, AsgardeoAuthClient> to store active instances.
  • Factory Method: Implement a static getInstance(id?: number) method that creates a new instance only if one does not exist for the given ID.
  • Lifecycle Methods: Add utility methods to support proper cleanup:
    • destroyInstance(id)
    • destroyAllInstances()
    • hasInstance(id)

Please select the package issue is related to

@asgardeo/javascript

Version

N/A

Reporter Checklist

  • I have searched the existing issues and this is not a duplicate.
  • I have provided all the necessary information.
  • I have verified the improvement is not available in the latest version of the package.

Metadata

Metadata

Assignees

No one assigned

    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