{
 "compat_features": [
  "javascript.builtins.AsyncDisposableStack",
  "javascript.builtins.AsyncDisposableStack.@@asyncDispose",
  "javascript.builtins.AsyncDisposableStack.AsyncDisposableStack",
  "javascript.builtins.AsyncDisposableStack.adopt",
  "javascript.builtins.AsyncDisposableStack.defer",
  "javascript.builtins.AsyncDisposableStack.disposeAsync",
  "javascript.builtins.AsyncDisposableStack.disposed",
  "javascript.builtins.AsyncDisposableStack.move",
  "javascript.builtins.AsyncDisposableStack.use",
  "javascript.builtins.AsyncIterator.@@asyncDispose",
  "javascript.builtins.DisposableStack",
  "javascript.builtins.DisposableStack.@@dispose",
  "javascript.builtins.DisposableStack.DisposableStack",
  "javascript.builtins.DisposableStack.adopt",
  "javascript.builtins.DisposableStack.defer",
  "javascript.builtins.DisposableStack.dispose",
  "javascript.builtins.DisposableStack.disposed",
  "javascript.builtins.DisposableStack.move",
  "javascript.builtins.DisposableStack.use",
  "javascript.builtins.Iterator.@@dispose",
  "javascript.builtins.SuppressedError",
  "javascript.builtins.SuppressedError.SuppressedError",
  "javascript.builtins.SuppressedError.error",
  "javascript.builtins.SuppressedError.suppressed",
  "javascript.builtins.Symbol.asyncDispose",
  "javascript.builtins.Symbol.dispose",
  "javascript.statements.await_using",
  "javascript.statements.using"
 ],
 "description": "The using and await using declarations and the dispose and asyncDispose symbols manage the lifecycle of resources such as file handles and streams. The DisposableStack and AsyncDisposableStack objects can group, dispose, and coordinate dependencies between multiple disposable resources.",
 "description_html": "The <code>using</code> and <code>await using</code> declarations and the <code>dispose</code> and <code>asyncDispose</code> symbols manage the lifecycle of resources such as file handles and streams. The <code>DisposableStack</code> and <code>AsyncDisposableStack</code> objects can group, dispose, and coordinate dependencies between multiple disposable resources.",
 "kind": "feature",
 "name": "Explicit resource management",
 "spec": [
  "https://tc39.es/proposal-async-explicit-resource-management/"
 ],
 "status": {
  "baseline": false,
  "by_compat_key": {
   "javascript.builtins.AsyncDisposableStack": {
    "baseline": false,
    "support": {
     "chrome": "134",
     "chrome_android": "134",
     "edge": "134",
     "firefox": "141",
     "firefox_android": "141"
    }
   },
   "javascript.builtins.AsyncDisposableStack.@@asyncDispose": {
    "baseline": false,
    "support": {
     "chrome": "134",
     "chrome_android": "134",
     "edge": "134",
     "firefox": "141",
     "firefox_android": "141"
    }
   },
   "javascript.builtins.AsyncDisposableStack.AsyncDisposableStack": {
    "baseline": false,
    "support": {
     "chrome": "134",
     "chrome_android": "134",
     "edge": "134",
     "firefox": "141",
     "firefox_android": "141"
    }
   },
   "javascript.builtins.AsyncDisposableStack.adopt": {
    "baseline": false,
    "support": {
     "chrome": "134",
     "chrome_android": "134",
     "edge": "134",
     "firefox": "141",
     "firefox_android": "141"
    }
   },
   "javascript.builtins.AsyncDisposableStack.defer": {
    "baseline": false,
    "support": {
     "chrome": "134",
     "chrome_android": "134",
     "edge": "134",
     "firefox": "141",
     "firefox_android": "141"
    }
   },
   "javascript.builtins.AsyncDisposableStack.disposeAsync": {
    "baseline": false,
    "support": {
     "chrome": "134",
     "chrome_android": "134",
     "edge": "134",
     "firefox": "141",
     "firefox_android": "141"
    }
   },
   "javascript.builtins.AsyncDisposableStack.disposed": {
    "baseline": false,
    "support": {
     "chrome": "134",
     "chrome_android": "134",
     "edge": "134",
     "firefox": "141",
     "firefox_android": "141"
    }
   },
   "javascript.builtins.AsyncDisposableStack.move": {
    "baseline": false,
    "support": {
     "chrome": "134",
     "chrome_android": "134",
     "edge": "134",
     "firefox": "141",
     "firefox_android": "141"
    }
   },
   "javascript.builtins.AsyncDisposableStack.use": {
    "baseline": false,
    "support": {
     "chrome": "134",
     "chrome_android": "134",
     "edge": "134",
     "firefox": "141",
     "firefox_android": "141"
    }
   },
   "javascript.builtins.AsyncIterator.@@asyncDispose": {
    "baseline": false,
    "support": {
     "chrome": "134",
     "chrome_android": "134",
     "edge": "134",
     "firefox": "141",
     "firefox_android": "141"
    }
   },
   "javascript.builtins.DisposableStack": {
    "baseline": false,
    "support": {
     "chrome": "134",
     "chrome_android": "134",
     "edge": "134",
     "firefox": "141",
     "firefox_android": "141"
    }
   },
   "javascript.builtins.DisposableStack.@@dispose": {
    "baseline": false,
    "support": {
     "chrome": "134",
     "chrome_android": "134",
     "edge": "134",
     "firefox": "141",
     "firefox_android": "141"
    }
   },
   "javascript.builtins.DisposableStack.DisposableStack": {
    "baseline": false,
    "support": {
     "chrome": "134",
     "chrome_android": "134",
     "edge": "134",
     "firefox": "141",
     "firefox_android": "141"
    }
   },
   "javascript.builtins.DisposableStack.adopt": {
    "baseline": false,
    "support": {
     "chrome": "134",
     "chrome_android": "134",
     "edge": "134",
     "firefox": "141",
     "firefox_android": "141"
    }
   },
   "javascript.builtins.DisposableStack.defer": {
    "baseline": false,
    "support": {
     "chrome": "134",
     "chrome_android": "134",
     "edge": "134",
     "firefox": "141",
     "firefox_android": "141"
    }
   },
   "javascript.builtins.DisposableStack.dispose": {
    "baseline": false,
    "support": {
     "chrome": "134",
     "chrome_android": "134",
     "edge": "134",
     "firefox": "141",
     "firefox_android": "141"
    }
   },
   "javascript.builtins.DisposableStack.disposed": {
    "baseline": false,
    "support": {
     "chrome": "134",
     "chrome_android": "134",
     "edge": "134",
     "firefox": "141",
     "firefox_android": "141"
    }
   },
   "javascript.builtins.DisposableStack.move": {
    "baseline": false,
    "support": {
     "chrome": "134",
     "chrome_android": "134",
     "edge": "134",
     "firefox": "141",
     "firefox_android": "141"
    }
   },
   "javascript.builtins.DisposableStack.use": {
    "baseline": false,
    "support": {
     "chrome": "134",
     "chrome_android": "134",
     "edge": "134",
     "firefox": "141",
     "firefox_android": "141"
    }
   },
   "javascript.builtins.Iterator.@@dispose": {
    "baseline": false,
    "support": {
     "chrome": "134",
     "chrome_android": "134",
     "edge": "134",
     "firefox": "141",
     "firefox_android": "141"
    }
   },
   "javascript.builtins.SuppressedError": {
    "baseline": false,
    "support": {
     "chrome": "134",
     "chrome_android": "134",
     "edge": "134",
     "firefox": "141",
     "firefox_android": "141"
    }
   },
   "javascript.builtins.SuppressedError.SuppressedError": {
    "baseline": false,
    "support": {
     "chrome": "134",
     "chrome_android": "134",
     "edge": "134",
     "firefox": "141",
     "firefox_android": "141"
    }
   },
   "javascript.builtins.SuppressedError.error": {
    "baseline": false,
    "support": {
     "chrome": "134",
     "chrome_android": "134",
     "edge": "134",
     "firefox": "141",
     "firefox_android": "141"
    }
   },
   "javascript.builtins.SuppressedError.suppressed": {
    "baseline": false,
    "support": {
     "chrome": "134",
     "chrome_android": "134",
     "edge": "134",
     "firefox": "141",
     "firefox_android": "141"
    }
   },
   "javascript.builtins.Symbol.asyncDispose": {
    "baseline": false,
    "support": {
     "chrome": "127",
     "chrome_android": "127",
     "edge": "127",
     "firefox": "141",
     "firefox_android": "141"
    }
   },
   "javascript.builtins.Symbol.dispose": {
    "baseline": false,
    "support": {
     "chrome": "125",
     "chrome_android": "125",
     "edge": "125",
     "firefox": "141",
     "firefox_android": "141"
    }
   },
   "javascript.statements.await_using": {
    "baseline": false,
    "support": {
     "chrome": "134",
     "chrome_android": "134",
     "edge": "134",
     "firefox": "141",
     "firefox_android": "141"
    }
   },
   "javascript.statements.using": {
    "baseline": false,
    "support": {
     "chrome": "134",
     "chrome_android": "134",
     "edge": "134",
     "firefox": "141",
     "firefox_android": "141"
    }
   }
  },
  "support": {
   "chrome": "134",
   "chrome_android": "134",
   "edge": "134",
   "firefox": "141",
   "firefox_android": "141"
  }
 },
 "id": "explicit-resource-management",
 "groups": [],
 "specs": [
  {
   "url": "https://tc39.es/proposal-async-explicit-resource-management/",
   "seriesComposition": "full",
   "shortname": "tc39-async-explicit-resource-management",
   "series": {
    "shortname": "tc39-async-explicit-resource-management",
    "currentSpecification": "tc39-async-explicit-resource-management",
    "title": "ECMAScript Async Explicit Resource Management",
    "shortTitle": "ECMAScript Async Explicit Resource Management",
    "nightlyUrl": "https://tc39.es/proposal-async-explicit-resource-management/"
   },
   "organization": "Ecma International",
   "groups": [
    {
     "name": "TC39",
     "url": "https://tc39.es/"
    }
   ],
   "nightly": {
    "url": "https://tc39.es/proposal-async-explicit-resource-management/",
    "status": "Editor's Draft",
    "alternateUrls": [],
    "repository": "https://github.com/tc39/proposal-async-explicit-resource-management",
    "sourcePath": "spec.emu",
    "filename": "index.html"
   },
   "title": "ECMAScript Async Explicit Resource Management",
   "source": "spec",
   "shortTitle": "ECMAScript Async Explicit Resource Management",
   "categories": [
    "browser"
   ],
   "standing": "good",
   "fragment": null
  }
 ],
 "mdnUrls": [],
 "standardPositions": [],
 "hasNegativeStandardPosition": false,
 "stateOfSurveys": [],
 "chromeUseCounters": {
  "percentageOfPageLoad": 0.00225308,
  "url": "https://chromestatus.com/metrics/webfeature/timeline/popularity/308"
 },
 "interop": [],
 "wpt": null,
 "developerSignals": {
  "url": "https://github.com/web-platform-dx/developer-signals/issues/366",
  "votes": 16
 },
 "bugs": {},
 "useCases": [
  {
   "description": "Lots of resources on the web end up being stateful, from the DOM itself, to WebAudio components and WebGL components. It'd make managing them much more developer-friendly",
   "url": "https://github.com/web-platform-dx/developer-signals/issues/366#issuecomment-3649251946"
  },
  {
   "description": "As part of development for the Satellite.js library, I'm creating a WebAssembly option to propagate orbits of satellites, instead of just pure JS one. For this I make use of unmanaged memory in C++. I expose the results of propagation as views into WASM memory. To use orbit propagation in WASM, user needs to instantiate a class; in its constructor the class allocates unmanaged memory to work with it on hot path later. This memory needs to be `free`d when the user is done. In the future major version of the library, as part of the WASM API, the objects that work with unmanaged memory will use Explicit Resource Management to clean up the unmanaged memory after themselves when they leave the scope, and users will be encouraged to declare such objects with `using`.",
   "url": "https://github.com/web-platform-dx/developer-signals/issues/366#issuecomment-3772981800"
  }
 ],
 "baselineLowDateAsObject": null,
 "baselineHighDateAsObject": null,
 "blockedOn": "Safari",
 "blockedSince": "July 2025",
 "monthsBlocked": 14
}