File tree Expand file tree Collapse file tree 5 files changed +37
-18
lines changed Expand file tree Collapse file tree 5 files changed +37
-18
lines changed Original file line number Diff line number Diff line change @@ -2004,6 +2004,23 @@ useful for addon developers who prefer to do type checking in JavaScript.
2004
2004
2005
2005
The API is accessible via ` require (' node:util' ).types ` or ` require (' node:util/types' )` .
2006
2006
2007
+ ### ` util .types .isArrayBufferDetached (value)`
2008
+
2009
+ <!-- YAML
2010
+ added: REPLACEME
2011
+ -->
2012
+
2013
+ * ` value` {any}
2014
+ * Returns: {boolean}
2015
+
2016
+ Returns ` true ` if the value is a built-in [` ArrayBuffer ` ][] and
2017
+ is detached.
2018
+
2019
+ ` ` ` js
2020
+ util .types .isArrayBufferDetached (null ); // Returns false
2021
+ util .types .isArrayBufferDetached (new ArrayBuffer ()); // Returns false
2022
+ ` ` `
2023
+
2007
2024
### ` util .types .isAnyArrayBuffer (value)`
2008
2025
2009
2026
<!-- YAML
Original file line number Diff line number Diff line change @@ -104,7 +104,6 @@ const {
104
104
extractHighWaterMark,
105
105
extractSizeAlgorithm,
106
106
lazyTransfer,
107
- isDetachedBuffer,
108
107
isViewedArrayBufferDetached,
109
108
isBrandCheck,
110
109
resetQueue,
@@ -117,6 +116,8 @@ const {
117
116
kState,
118
117
} = require ( 'internal/webstreams/util' ) ;
119
118
119
+ const { isArrayBufferDetached } = require ( 'internal/util/types' )
120
+
120
121
const {
121
122
WritableStreamDefaultWriter,
122
123
@@ -669,7 +670,7 @@ class ReadableStreamBYOBRequest {
669
670
const viewBuffer = ArrayBufferViewGetBuffer ( view ) ;
670
671
const viewBufferByteLength = ArrayBufferGetByteLength ( viewBuffer ) ;
671
672
672
- if ( isDetachedBuffer ( viewBuffer ) ) {
673
+ if ( isArrayBufferDetached ( viewBuffer ) ) {
673
674
throw new ERR_INVALID_STATE . TypeError ( 'Viewed ArrayBuffer is detached' ) ;
674
675
}
675
676
@@ -2643,7 +2644,7 @@ function readableByteStreamControllerEnqueue(controller, chunk) {
2643
2644
if ( pendingPullIntos . length ) {
2644
2645
const firstPendingPullInto = pendingPullIntos [ 0 ] ;
2645
2646
2646
- if ( isDetachedBuffer ( firstPendingPullInto . buffer ) ) {
2647
+ if ( isArrayBufferDetached ( firstPendingPullInto . buffer ) ) {
2647
2648
throw new ERR_INVALID_STATE . TypeError (
2648
2649
'Destination ArrayBuffer is detached' ,
2649
2650
) ;
Original file line number Diff line number Diff line change @@ -32,6 +32,7 @@ const {
32
32
} = internalBinding ( 'buffer' ) ;
33
33
34
34
const {
35
+ isArrayBufferDetached,
35
36
isPromise,
36
37
} = require ( 'internal/util/types' ) ;
37
38
@@ -139,23 +140,10 @@ function transferArrayBuffer(buffer) {
139
140
return res ;
140
141
}
141
142
142
- function isDetachedBuffer ( buffer ) {
143
- if ( ArrayBufferGetByteLength ( buffer ) === 0 ) {
144
- // TODO(daeyeon): Consider using C++ builtin to improve performance.
145
- try {
146
- new Uint8Array ( buffer ) ;
147
- } catch ( error ) {
148
- assert ( error . name === 'TypeError' ) ;
149
- return true ;
150
- }
151
- }
152
- return false ;
153
- }
154
-
155
143
function isViewedArrayBufferDetached ( view ) {
156
144
return (
157
145
ArrayBufferViewGetByteLength ( view ) === 0 &&
158
- isDetachedBuffer ( ArrayBufferViewGetBuffer ( view ) )
146
+ isArrayBufferDetached ( ArrayBufferViewGetBuffer ( view ) )
159
147
) ;
160
148
}
161
149
@@ -256,7 +244,6 @@ module.exports = {
256
244
extractSizeAlgorithm,
257
245
lazyTransfer,
258
246
isBrandCheck,
259
- isDetachedBuffer,
260
247
isPromisePending,
261
248
isViewedArrayBufferDetached,
262
249
peekQueueValue,
Original file line number Diff line number Diff line change @@ -61,6 +61,16 @@ static void IsBoxedPrimitive(const FunctionCallbackInfo<Value>& args) {
61
61
args[0 ]->IsSymbolObject ());
62
62
}
63
63
64
+ static void IsArrayBufferDetached (const FunctionCallbackInfo<Value>& args) {
65
+ if (args[0 ]->IsArrayBuffer ()) {
66
+ auto buffer = args[0 ].As <v8::ArrayBuffer>();
67
+ args.GetReturnValue ().Set (buffer->WasDetached ());
68
+ return ;
69
+ }
70
+
71
+ args.GetReturnValue ().Set (false );
72
+ }
73
+
64
74
void InitializeTypes (Local<Object> target,
65
75
Local<Value> unused,
66
76
Local<Context> context,
@@ -71,6 +81,8 @@ void InitializeTypes(Local<Object> target,
71
81
72
82
SetMethodNoSideEffect (context, target, " isAnyArrayBuffer" , IsAnyArrayBuffer);
73
83
SetMethodNoSideEffect (context, target, " isBoxedPrimitive" , IsBoxedPrimitive);
84
+ SetMethodNoSideEffect (
85
+ context, target, " isArrayBufferDetached" , IsArrayBufferDetached);
74
86
}
75
87
76
88
} // anonymous namespace
@@ -82,6 +94,7 @@ void RegisterTypesExternalReferences(ExternalReferenceRegistry* registry) {
82
94
83
95
registry->Register (IsAnyArrayBuffer);
84
96
registry->Register (IsBoxedPrimitive);
97
+ registry->Register (IsArrayBufferDetached);
85
98
}
86
99
} // namespace node
87
100
Original file line number Diff line number Diff line change @@ -5,6 +5,7 @@ declare function InternalBinding(binding: 'types'): {
5
5
isArrayBuffer ( value : unknown ) : value is ArrayBuffer ;
6
6
isArgumentsObject ( value : unknown ) : value is ArrayLike < unknown > ;
7
7
isBoxedPrimitive ( value : unknown ) : value is ( BigInt | Boolean | Number | String | Symbol ) ;
8
+ isArrayBufferDetached ( value : unknown ) : boolean ;
8
9
isDataView ( value : unknown ) : value is DataView ;
9
10
isExternal ( value : unknown ) : value is Object ;
10
11
isMap ( value : unknown ) : value is Map < unknown , unknown > ;
You can’t perform that action at this time.
0 commit comments