Skip to content

Commit 65ecdd4

Browse files
committed
src,lib: replace DOMException with native impl
Refs: #41038 Signed-off-by: James M Snell <jasnell@gmail.com>
1 parent 218f13d commit 65ecdd4

19 files changed

+73
-257
lines changed

lib/internal/abort_controller.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ const {
4040

4141
const {
4242
DOMException,
43-
} = internalBinding('messaging');
43+
} = internalBinding('errors');
4444

4545
const {
4646
clearTimeout,

lib/internal/per_context/domexception.js

Lines changed: 0 additions & 122 deletions
This file was deleted.

lib/internal/util.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -468,12 +468,12 @@ function createDeferredPromise() {
468468

469469
let _DOMException;
470470
const lazyDOMExceptionClass = () => {
471-
_DOMException ??= internalBinding('messaging').DOMException;
471+
_DOMException ??= internalBinding('errors').DOMException;
472472
return _DOMException;
473473
};
474474

475475
const lazyDOMException = hideStackFrames((message, name) => {
476-
_DOMException ??= internalBinding('messaging').DOMException;
476+
_DOMException ??= internalBinding('errors').DOMException;
477477
return new _DOMException(message, name);
478478
});
479479

lib/internal/webstreams/readablestream.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ const {
4040

4141
const {
4242
DOMException,
43-
} = internalBinding('messaging');
43+
} = internalBinding('errors');
4444

4545
const {
4646
isArrayBufferView,

lib/internal/webstreams/transfer.js

Lines changed: 3 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
'use strict';
22

33
const {
4-
ObjectDefineProperties,
54
PromiseResolve,
6-
ReflectConstruct,
75
} = primordials;
86

97
const {
@@ -13,7 +11,7 @@ const {
1311

1412
const {
1513
DOMException,
16-
} = internalBinding('messaging');
14+
} = internalBinding('errors');
1715

1816
const {
1917
ReadableStream,
@@ -34,72 +32,6 @@ const {
3432

3533
const assert = require('internal/assert');
3634

37-
const {
38-
makeTransferable,
39-
kClone,
40-
kDeserialize,
41-
} = require('internal/worker/js_transferable');
42-
43-
// This class is a bit of a hack. The Node.js implementation of
44-
// DOMException is not transferable/cloneable. This provides us
45-
// with a variant that is. Unfortunately, it means playing around
46-
// a bit with the message, name, and code properties and the
47-
// prototype. We can revisit this if DOMException is ever made
48-
// properly cloneable.
49-
class CloneableDOMException extends DOMException {
50-
constructor(message, name) {
51-
super(message, name);
52-
this[kDeserialize]({
53-
message: this.message,
54-
name: this.name,
55-
code: this.code,
56-
});
57-
// eslint-disable-next-line no-constructor-return
58-
return makeTransferable(this);
59-
}
60-
61-
[kClone]() {
62-
return {
63-
data: {
64-
message: this.message,
65-
name: this.name,
66-
code: this.code,
67-
},
68-
deserializeInfo:
69-
'internal/webstreams/transfer:InternalCloneableDOMException'
70-
};
71-
}
72-
73-
[kDeserialize]({ message, name, code }) {
74-
ObjectDefineProperties(this, {
75-
message: {
76-
configurable: true,
77-
enumerable: true,
78-
get() { return message; },
79-
},
80-
name: {
81-
configurable: true,
82-
enumerable: true,
83-
get() { return name; },
84-
},
85-
code: {
86-
configurable: true,
87-
enumerable: true,
88-
get() { return code; },
89-
},
90-
});
91-
}
92-
}
93-
94-
function InternalCloneableDOMException() {
95-
return makeTransferable(
96-
ReflectConstruct(
97-
CloneableDOMException,
98-
[],
99-
DOMException));
100-
}
101-
InternalCloneableDOMException[kDeserialize] = () => {};
102-
10335
class CrossRealmTransformReadableSource {
10436
constructor(port) {
10537
this[kState] = {
@@ -133,7 +65,7 @@ class CrossRealmTransformReadableSource {
13365
};
13466

13567
port.onmessageerror = () => {
136-
const error = new CloneableDOMException(
68+
const error = new DOMException(
13769
'Internal transferred ReadableStream error',
13870
'DataCloneError');
13971
port.postMessage({ type: 'error', value: error });
@@ -156,10 +88,6 @@ class CrossRealmTransformReadableSource {
15688
try {
15789
this[kState].port.postMessage({ type: 'error', value: reason });
15890
} catch (error) {
159-
if (error instanceof DOMException) {
160-
// eslint-disable-next-line no-ex-assign
161-
error = new CloneableDOMException(error.message, error.name);
162-
}
16391
this[kState].port.postMessage({ type: 'error', value: error });
16492
throw error;
16593
} finally {
@@ -200,7 +128,7 @@ class CrossRealmTransformWritableSink {
200128
}
201129
};
202130
port.onmessageerror = () => {
203-
const error = new CloneableDOMException(
131+
const error = new DOMException(
204132
'Internal transferred ReadableStream error',
205133
'DataCloneError');
206134
port.postMessage({ type: 'error', value: error });
@@ -229,10 +157,6 @@ class CrossRealmTransformWritableSink {
229157
try {
230158
this[kState].port.postMessage({ type: 'chunk', value: chunk });
231159
} catch (error) {
232-
if (error instanceof DOMException) {
233-
// eslint-disable-next-line no-ex-assign
234-
error = new CloneableDOMException(error.message, error.name);
235-
}
236160
this[kState].port.postMessage({ type: 'error', value: error });
237161
this[kState].port.close();
238162
throw error;
@@ -248,10 +172,6 @@ class CrossRealmTransformWritableSink {
248172
try {
249173
this[kState].port.postMessage({ type: 'error', value: reason });
250174
} catch (error) {
251-
if (error instanceof DOMException) {
252-
// eslint-disable-next-line no-ex-assign
253-
error = new CloneableDOMException(error.message, error.name);
254-
}
255175
this[kState].port.postMessage({ type: 'error', value: error });
256176
throw error;
257177
} finally {
@@ -294,6 +214,4 @@ module.exports = {
294214
newCrossRealmWritableSink,
295215
CrossRealmTransformWritableSink,
296216
CrossRealmTransformReadableSource,
297-
CloneableDOMException,
298-
InternalCloneableDOMException,
299217
};

lib/internal/webstreams/transformstream.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ const {
2222

2323
const {
2424
DOMException,
25-
} = internalBinding('messaging');
25+
} = internalBinding('errors');
2626

2727
const {
2828
createDeferredPromise,

lib/internal/webstreams/writablestream.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ const {
2828

2929
const {
3030
DOMException,
31-
} = internalBinding('messaging');
31+
} = internalBinding('errors');
3232

3333
const {
3434
createDeferredPromise,

lib/internal/worker/io.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,12 @@ const {
3232
receiveMessageOnPort: receiveMessageOnPort_,
3333
stopMessagePort,
3434
checkMessagePort,
35-
DOMException,
3635
} = internalBinding('messaging');
36+
37+
const {
38+
DOMException,
39+
} = internalBinding('errors');
40+
3741
const {
3842
getEnvMessagePort
3943
} = internalBinding('worker');

src/api/environment.cc

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -669,7 +669,6 @@ Maybe<bool> InitializePrimordials(Local<Context> context) {
669669
}
670670

671671
static const char* context_files[] = {"internal/per_context/primordials",
672-
"internal/per_context/domexception",
673672
"internal/per_context/messageport",
674673
nullptr};
675674

src/node_errors.cc

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1175,6 +1175,27 @@ BaseObjectPtr<DOMException> DOMException::Create(
11751175
return MakeBaseObject<DOMException>(env, obj, message, name);
11761176
}
11771177

1178+
BaseObjectPtr<DOMException> DOMException::Create(
1179+
Environment* env,
1180+
Local<Value> message,
1181+
const std::string& name) {
1182+
HandleScope scope(env->isolate());
1183+
1184+
Local<Function> ctor;
1185+
if (!GetConstructorTemplate(env)->GetFunction(env->context()).ToLocal(&ctor))
1186+
return BaseObjectPtr<DOMException>();
1187+
1188+
Local<Object> obj;
1189+
if (!ctor->NewInstance(env->context()).ToLocal(&obj))
1190+
return BaseObjectPtr<DOMException>();
1191+
1192+
return MakeBaseObject<DOMException>(
1193+
env,
1194+
obj,
1195+
message,
1196+
String::NewFromUtf8(env->isolate(), name.c_str()).ToLocalChecked());
1197+
}
1198+
11781199
void DOMException::New(const FunctionCallbackInfo<Value>& args) {
11791200
CHECK(args.IsConstructCall());
11801201

0 commit comments

Comments
 (0)