Skip to content

Commit d0c66ed

Browse files
committed
webcrypto: catch JS exception during webcrypto calls
This useful under Safari, when calling an unimplemented feature.
1 parent b9ca915 commit d0c66ed

File tree

1 file changed

+17
-6
lines changed

1 file changed

+17
-6
lines changed

js/webcrypto/webcrypto.go

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ func getSubtle() *js.Object {
6060
// }
6161

6262
// SubtleCall calls the object's method with the given arguments assuming that it returns a promise, wait for it to be settled, and returns the result/error.
63-
func SubtleCall(method string, args ...interface{}) (*js.Object, error) {
63+
func SubtleCall(method string, args ...interface{}) (res *js.Object, err error) {
6464
if SubtleCrypto == nil {
6565
return nil, ErrWebCryptoInterfaceNotFound
6666
}
@@ -73,25 +73,36 @@ func SubtleCall(method string, args ...interface{}) (*js.Object, error) {
7373
resCh := make(chan *js.Object, 1)
7474
failCh := make(chan *js.Object, 1)
7575

76+
defer func() {
77+
switch exc := recover().(type) {
78+
case *js.Error:
79+
err = exc
80+
case nil:
81+
break
82+
default:
83+
panic(exc)
84+
}
85+
}()
86+
7687
promise := SubtleCrypto.Call(method, args...)
7788
promise.Call(
7889
"then",
7990
func(o *js.Object) { resCh <- o },
8091
func(err *js.Object) { failCh <- err })
8192

8293
select {
83-
case res := <-resCh:
84-
return res, nil
85-
case err := <-failCh:
86-
switch err.Get("name").String() {
94+
case jsres := <-resCh:
95+
return jsres, nil
96+
case jserr := <-failCh:
97+
switch jserr.Get("name").String() {
8798
case "DataError":
8899
return nil, ErrWebCryptoDataError
89100
case "NotSupportedError":
90101
return nil, ErrWebCryptoNotSupportedError
91102
case "OperationError":
92103
return nil, ErrWebCryptoOperationError
93104
default:
94-
return nil, &js.Error{Object: err}
105+
return nil, &js.Error{Object: jserr}
95106
}
96107
}
97108
}

0 commit comments

Comments
 (0)