@@ -755,6 +755,153 @@ if (isMainThread) {
755
755
}
756
756
` ` `
757
757
758
+ ## ` worker .locks `
759
+
760
+ <!-- YAML
761
+ added: REPLACEME
762
+ -->
763
+
764
+ > Stability: 1 - Experimental
765
+
766
+ * {LockManager}
767
+
768
+ An instance of a [` LockManager` ][LockManager] that can be used to coordinate
769
+ access to resources that may be shared across multiple threads within the same
770
+ process. The API mirrors the semantics of the
771
+ [browser ` LockManager` ][]
772
+
773
+ ### Class: ` Lock`
774
+
775
+ <!-- YAML
776
+ added: REPLACEME
777
+ -->
778
+
779
+ The ` Lock` interface provides information about a lock that has been granted via
780
+ [` locks .request ()` ][locks.request()]
781
+
782
+ #### ` lock .name `
783
+
784
+ <!-- YAML
785
+ added: REPLACEME
786
+ -->
787
+
788
+ * {string}
789
+
790
+ The name of the lock.
791
+
792
+ #### ` lock .mode `
793
+
794
+ <!-- YAML
795
+ added: REPLACEME
796
+ -->
797
+
798
+ * {string}
799
+
800
+ The mode of the lock. Either ` shared` or ` exclusive` .
801
+
802
+ ### Class: ` LockManager`
803
+
804
+ <!-- YAML
805
+ added: REPLACEME
806
+ -->
807
+
808
+ The ` LockManager` interface provides methods for requesting and introspecting
809
+ locks. To obtain a ` LockManager` instance use
810
+
811
+ ` ` ` mjs
812
+ import { locks } from ' node:worker_threads' ;
813
+ ` ` `
814
+
815
+ ` ` ` cjs
816
+ ' use strict' ;
817
+
818
+ const { locks } = require (' node:worker_threads' );
819
+ ` ` `
820
+
821
+ This implementation matches the [browser ` LockManager` ][] API.
822
+
823
+ #### ` locks .request (name[, options], callback)`
824
+
825
+ <!-- YAML
826
+ added: REPLACEME
827
+ -->
828
+
829
+ * ` name` {string}
830
+ * ` options` {Object}
831
+ * ` mode` {string} Either ` ' exclusive' ` or ` ' shared' ` . **Default:** ` ' exclusive' ` .
832
+ * ` ifAvailable` {boolean} If ` true ` , the request will only be granted if the
833
+ lock is not already held. If it cannot be granted, ` callback` will be
834
+ invoked with ` null ` instead of a ` Lock` instance. **Default:** ` false ` .
835
+ * ` steal` {boolean} If ` true ` , any existing locks with the same name are
836
+ released and the request is granted immediately, pre-empting any queued
837
+ requests. **Default:** ` false ` .
838
+ * ` signal` {AbortSignal} that can be used to abort a
839
+ pending (but not yet granted) lock request.
840
+ * ` callback` {Function} Invoked once the lock is granted (or immediately with
841
+ ` null ` if ` ifAvailable` is ` true ` and the lock is unavailable). The lock is
842
+ released automatically when the function returns, or—if the function returns
843
+ a promise—when that promise settles.
844
+ * Returns: {Promise} Resolves once the lock has been released.
845
+
846
+ ` ` ` mjs
847
+ import { locks } from ' node:worker_threads' ;
848
+
849
+ await locks .request (' my_resource' , async (lock ) => {
850
+ // The lock has been acquired.
851
+ });
852
+ // The lock has been released here.
853
+ ` ` `
854
+
855
+ ` ` ` cjs
856
+ ' use strict' ;
857
+
858
+ const { locks } = require (' node:worker_threads' );
859
+
860
+ locks .request (' my_resource' , async (lock ) => {
861
+ // The lock has been acquired.
862
+ }).then (() => {
863
+ // The lock has been released here.
864
+ });
865
+ ` ` `
866
+
867
+ #### ` locks .query ()`
868
+
869
+ <!-- YAML
870
+ added: REPLACEME
871
+ -->
872
+
873
+ * Returns: {Promise}
874
+
875
+ Resolves with a ` LockManagerSnapshot` describing the currently held and pending
876
+ locks for the current process.
877
+
878
+ ` ` ` mjs
879
+ import { locks } from ' node:worker_threads' ;
880
+
881
+ const snapshot = await locks .query ();
882
+ for (const lock of snapshot .held ) {
883
+ console .log (` held lock: name ${ lock .name } , mode ${ lock .mode } ` );
884
+ }
885
+ for (const pending of snapshot .pending ) {
886
+ console .log (` pending lock: name ${ pending .name } , mode ${ pending .mode } ` );
887
+ }
888
+ ` ` `
889
+
890
+ ` ` ` cjs
891
+ ' use strict' ;
892
+
893
+ const { locks } = require (' node:worker_threads' );
894
+
895
+ locks .query ().then ((snapshot ) => {
896
+ for (const lock of snapshot .held ) {
897
+ console .log (` held lock: name ${ lock .name } , mode ${ lock .mode } ` );
898
+ }
899
+ for (const pending of snapshot .pending ) {
900
+ console .log (` pending lock: name ${ pending .name } , mode ${ pending .mode } ` );
901
+ }
902
+ });
903
+ ` ` `
904
+
758
905
## Class: ` BroadcastChannel extends EventTarget `
759
906
760
907
<!-- YAML
@@ -1937,6 +2084,7 @@ thread spawned will spawn another until the application crashes.
1937
2084
[Addons worker support]: addons .md #worker- support
1938
2085
[ECMAScript module loader]: esm .md #data- imports
1939
2086
[HTML structured clone algorithm]: https: // developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm
2087
+ [LockManager]: #class - lockmanager
1940
2088
[Signals events]: process .md #signal- events
1941
2089
[Web Workers]: https: // developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API
1942
2090
[` 'close'` event ]: #event - close
@@ -1992,7 +2140,9 @@ thread spawned will spawn another until the application crashes.
1992
2140
[` worker.terminate()` ]: #workerterminate
1993
2141
[` worker.threadId` ]: #workerthreadid_1
1994
2142
[async - resource- worker- pool]: async_context .md #using- asyncresource- for - a- worker- thread- pool
2143
+ [browser ` LockManager` ]: https: // developer.mozilla.org/en-US/docs/Web/API/LockManager
1995
2144
[browser ` MessagePort` ]: https: // developer.mozilla.org/en-US/docs/Web/API/MessagePort
1996
2145
[child processes]: child_process .md
1997
2146
[contextified]: vm .md #what- does- it- mean- to- contextify- an- object
2147
+ [locks .request ()]: #locksrequestname- options- callback
1998
2148
[v8 .serdes ]: v8 .md #serialization- api
0 commit comments