@@ -1889,6 +1889,219 @@ a code.
1889
1889
Specifying a code to [` process .exit (code)` ][` process .exit ()` ] will override any
1890
1890
previous setting of ` process .exitCode ` .
1891
1891
1892
+ ## ` process .finalization .register (ref, callback)`
1893
+
1894
+ <!-- YAML
1895
+ added: REPLACEME
1896
+ -->
1897
+
1898
+ > Stability: 1.1 - Active Development
1899
+
1900
+ * ` ref` {Object | Function} The reference to the resource that is being tracked.
1901
+ * ` callback` {Function} The callback function to be called when the resource
1902
+ is finalized.
1903
+ * ` ref` {Object | Function} The reference to the resource that is being tracked.
1904
+ * ` event ` {string} The event that triggered the finalization. Defaults to 'exit'.
1905
+
1906
+ This function registers a callback to be called when the process emits the ` exit`
1907
+ event if the ` ref` object was not garbage collected. If the object ` ref` was garbage collected
1908
+ before the ` exit` event is emitted, the callback will be removed from the finalization registry,
1909
+ and it will not be called on process exit.
1910
+
1911
+ Inside the callback you can release the resources allocated by the ` ref` object.
1912
+ Be aware that all limitations applied to the ` beforeExit` event are also applied to the ` callback` function,
1913
+ this means that there is a possibility that the callback will not be called under special circumstances.
1914
+
1915
+ The idea of this function is to help you free up resources when the starts process exiting,
1916
+ but also let the object be garbage collected if it is no longer being used.
1917
+
1918
+ Eg: you can register an object that contains a buffer, you want to make sure that buffer is released
1919
+ when the process exit, but if the object is garbage collected before the process exit, we no longer
1920
+ need to release the buffer, so in this case we just remove the callback from the finalization registry.
1921
+
1922
+ ` ` ` cjs
1923
+ const { finalization } = require (' node:process' );
1924
+
1925
+ // Please make sure that the function passed to finalization.register()
1926
+ // does not create a closure around unnecessary objects.
1927
+ function onFinalize (obj , event ) {
1928
+ // You can do whatever you want with the object
1929
+ obj .dispose ();
1930
+ }
1931
+
1932
+ function setup () {
1933
+ // This object can be safely garbage collected,
1934
+ // and the resulting shutdown function will not be called.
1935
+ // There are no leaks.
1936
+ const myDisposableObject = {
1937
+ dispose () {
1938
+ // Free your resources synchronously
1939
+ },
1940
+ };
1941
+
1942
+ finalization .register (myDisposableObject, onFinalize);
1943
+ }
1944
+
1945
+ setup ();
1946
+ ` ` `
1947
+
1948
+ ` ` ` mjs
1949
+ import { finalization } from ' node:process' ;
1950
+
1951
+ // Please make sure that the function passed to finalization.register()
1952
+ // does not create a closure around unnecessary objects.
1953
+ function onFinalize (obj , event ) {
1954
+ // You can do whatever you want with the object
1955
+ obj .dispose ();
1956
+ }
1957
+
1958
+ function setup () {
1959
+ // This object can be safely garbage collected,
1960
+ // and the resulting shutdown function will not be called.
1961
+ // There are no leaks.
1962
+ const myDisposableObject = {
1963
+ dispose () {
1964
+ // Free your resources synchronously
1965
+ },
1966
+ };
1967
+
1968
+ finalization .register (myDisposableObject, onFinalize);
1969
+ }
1970
+
1971
+ setup ();
1972
+ ` ` `
1973
+
1974
+ The code above relies on the following assumptions:
1975
+
1976
+ * arrow functions are avoided
1977
+ * regular functions are recommended to be within the global context (root)
1978
+
1979
+ Regular functions _could_ reference the context where the ` obj` lives, making the ` obj` not garbage collectible.
1980
+
1981
+ Arrow functions will hold the previous context. Consider, for example:
1982
+
1983
+ ` ` ` js
1984
+ class Test {
1985
+ constructor () {
1986
+ finalization .register (this , (ref ) => ref .dispose ());
1987
+
1988
+ // even something like this is highly discouraged
1989
+ // finalization.register(this, () => this.dispose());
1990
+ }
1991
+ dispose () {}
1992
+ }
1993
+ ` ` `
1994
+
1995
+ It is very unlikely (not impossible) that this object will be garbage collected,
1996
+ but if it is not, ` dispose` will be called when ` process .exit ` is called.
1997
+
1998
+ Be careful and avoid relying on this feature for the disposal of critical resources,
1999
+ as it is not guaranteed that the callback will be called under all circumstances.
2000
+
2001
+ ## ` process .finalization .registerBeforeExit (ref, callback)`
2002
+
2003
+ <!-- YAML
2004
+ added: REPLACEME
2005
+ -->
2006
+
2007
+ > Stability: 1.1 - Active Development
2008
+
2009
+ * ` ref` {Object | Function} The reference
2010
+ to the resource that is being tracked.
2011
+ * ` callback` {Function} The callback function to be called when the resource
2012
+ is finalized.
2013
+ * ` ref` {Object | Function} The reference to the resource that is being tracked.
2014
+ * ` event ` {string} The event that triggered the finalization. Defaults to 'beforeExit'.
2015
+
2016
+ This function behaves exactly like the ` register` , except that the callback will be called
2017
+ when the process emits the ` beforeExit` event if ` ref` object was not garbage collected.
2018
+
2019
+ Be aware that all limitations applied to the ` beforeExit` event are also applied to the ` callback` function,
2020
+ this means that there is a possibility that the callback will not be called under special circumstances.
2021
+
2022
+ ## ` process .finalization .unregister (ref)`
2023
+
2024
+ <!-- YAML
2025
+ added: REPLACEME
2026
+ -->
2027
+
2028
+ > Stability: 1.1 - Active Development
2029
+
2030
+ * ` ref` {Object | Function} The reference
2031
+ to the resource that was registered previously.
2032
+
2033
+ This function remove the register of the object from the finalization
2034
+ registry, so the callback will not be called anymore.
2035
+
2036
+ ` ` ` cjs
2037
+ const { finalization } = require (' node:process' );
2038
+
2039
+ // Please make sure that the function passed to finalization.register()
2040
+ // does not create a closure around unnecessary objects.
2041
+ function onFinalize (obj , event ) {
2042
+ // You can do whatever you want with the object
2043
+ obj .dispose ();
2044
+ }
2045
+
2046
+ function setup () {
2047
+ // This object can be safely garbage collected,
2048
+ // and the resulting shutdown function will not be called.
2049
+ // There are no leaks.
2050
+ const myDisposableObject = {
2051
+ dispose () {
2052
+ // Free your resources synchronously
2053
+ },
2054
+ };
2055
+
2056
+ finalization .register (myDisposableObject, onFinalize);
2057
+
2058
+ // Do something
2059
+
2060
+ myDisposableObject .dispose ();
2061
+ finalization .unregister (myDisposableObject);
2062
+ }
2063
+
2064
+ setup ();
2065
+ ` ` `
2066
+
2067
+ ` ` ` mjs
2068
+ import { finalization } from ' node:process' ;
2069
+
2070
+ // Please make sure that the function passed to finalization.register()
2071
+ // does not create a closure around unnecessary objects.
2072
+ function onFinalize (obj , event ) {
2073
+ // You can do whatever you want with the object
2074
+ obj .dispose ();
2075
+ }
2076
+
2077
+ function setup () {
2078
+ // This object can be safely garbage collected,
2079
+ // and the resulting shutdown function will not be called.
2080
+ // There are no leaks.
2081
+ const myDisposableObject = {
2082
+ dispose () {
2083
+ // Free your resources synchronously
2084
+ },
2085
+ };
2086
+
2087
+ // Please make sure that the function passed to finalization.register()
2088
+ // does not create a closure around unnecessary objects.
2089
+ function onFinalize (obj , event ) {
2090
+ // You can do whatever you want with the object
2091
+ obj .dispose ();
2092
+ }
2093
+
2094
+ finalization .register (myDisposableObject, onFinalize);
2095
+
2096
+ // Do something
2097
+
2098
+ myDisposableObject .dispose ();
2099
+ finalization .unregister (myDisposableObject);
2100
+ }
2101
+
2102
+ setup ();
2103
+ ` ` `
2104
+
1892
2105
## ` process .getActiveResourcesInfo ()`
1893
2106
1894
2107
<!-- YAML
0 commit comments