File tree 6 files changed +53
-19
lines changed
6 files changed +53
-19
lines changed Original file line number Diff line number Diff line change @@ -2024,6 +2024,23 @@ util.types.isAnyArrayBuffer(new ArrayBuffer()); // Returns true
2024
2024
util .types .isAnyArrayBuffer (new SharedArrayBuffer ()); // Returns true
2025
2025
` ` `
2026
2026
2027
+ ### ` util .types .isArrayBufferDetached (value)`
2028
+
2029
+ <!-- YAML
2030
+ added: REPLACEME
2031
+ -->
2032
+
2033
+ * ` value` {any}
2034
+ * Returns: {boolean}
2035
+
2036
+ Returns ` true ` if the value is a built-in [` ArrayBuffer ` ][] and
2037
+ is detached.
2038
+
2039
+ ` ` ` js
2040
+ util .types .isArrayBufferDetached (null ); // Returns false
2041
+ util .types .isArrayBufferDetached (new ArrayBuffer ()); // Returns false
2042
+ ` ` `
2043
+
2027
2044
### ` util .types .isArrayBufferView (value)`
2028
2045
2029
2046
<!-- YAML
Original file line number Diff line number Diff line change 2
2
3
3
const {
4
4
ArrayBufferIsView,
5
+ ArrayBufferPrototype,
5
6
ObjectDefineProperties,
7
+ ReflectGet,
6
8
TypedArrayPrototypeGetSymbolToStringTag,
7
9
} = primordials ;
8
10
11
+ const { isArrayBufferDetached : _isArrayBufferDetached , ...internalTypes } = internalBinding ( 'types' ) ;
12
+
13
+ function ArrayBufferGetByteLength ( view ) {
14
+ return ReflectGet ( ArrayBufferPrototype , 'byteLength' , view ) ;
15
+ }
16
+
9
17
function isTypedArray ( value ) {
10
18
return TypedArrayPrototypeGetSymbolToStringTag ( value ) !== undefined ;
11
19
}
@@ -54,8 +62,16 @@ function isBigUint64Array(value) {
54
62
return TypedArrayPrototypeGetSymbolToStringTag ( value ) === 'BigUint64Array' ;
55
63
}
56
64
65
+ function isArrayBufferDetached ( value ) {
66
+ if ( ArrayBufferGetByteLength ( value ) === 0 ) {
67
+ return _isArrayBufferDetached ( value ) ;
68
+ }
69
+ return false ;
70
+ }
71
+
57
72
module . exports = {
58
- ...internalBinding ( 'types' ) ,
73
+ ...internalTypes ,
74
+ isArrayBufferDetached,
59
75
isArrayBufferView : ArrayBufferIsView ,
60
76
isTypedArray,
61
77
isUint8Array,
Original file line number Diff line number Diff line change @@ -43,6 +43,7 @@ const {
43
43
} = internalBinding ( 'messaging' ) ;
44
44
45
45
const {
46
+ isArrayBufferDetached,
46
47
isArrayBufferView,
47
48
isDataView,
48
49
} = require ( 'internal/util/types' ) ;
@@ -104,7 +105,6 @@ const {
104
105
extractHighWaterMark,
105
106
extractSizeAlgorithm,
106
107
lazyTransfer,
107
- isDetachedBuffer,
108
108
isViewedArrayBufferDetached,
109
109
isBrandCheck,
110
110
resetQueue,
@@ -669,7 +669,7 @@ class ReadableStreamBYOBRequest {
669
669
const viewBuffer = ArrayBufferViewGetBuffer ( view ) ;
670
670
const viewBufferByteLength = ArrayBufferGetByteLength ( viewBuffer ) ;
671
671
672
- if ( isDetachedBuffer ( viewBuffer ) ) {
672
+ if ( isArrayBufferDetached ( viewBuffer ) ) {
673
673
throw new ERR_INVALID_STATE . TypeError ( 'Viewed ArrayBuffer is detached' ) ;
674
674
}
675
675
@@ -2643,7 +2643,7 @@ function readableByteStreamControllerEnqueue(controller, chunk) {
2643
2643
if ( pendingPullIntos . length ) {
2644
2644
const firstPendingPullInto = pendingPullIntos [ 0 ] ;
2645
2645
2646
- if ( isDetachedBuffer ( firstPendingPullInto . buffer ) ) {
2646
+ if ( isArrayBufferDetached ( firstPendingPullInto . buffer ) ) {
2647
2647
throw new ERR_INVALID_STATE . TypeError (
2648
2648
'Destination ArrayBuffer is detached' ,
2649
2649
) ;
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