dom_exception.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. //go:build js && wasm
  2. // +build js,wasm
  3. package idb
  4. import (
  5. "syscall/js"
  6. "github.com/hack-pad/safejs"
  7. )
  8. func tryAsDOMException(err error) error {
  9. switch err := err.(type) {
  10. case js.Error:
  11. return domExceptionAsError(safejs.Safe(err.Value))
  12. default:
  13. return err
  14. }
  15. }
  16. func domExceptionAsError(jsDOMException safejs.Value) error {
  17. truthy, err := jsDOMException.Truthy()
  18. if err != nil || !truthy {
  19. return err
  20. }
  21. domException, err := parseJSDOMException(jsDOMException)
  22. if err != nil {
  23. return err
  24. }
  25. return domException
  26. }
  27. // DOMException is a JavaScript DOMException with a standard name.
  28. // Use errors.Is() to compare by name.
  29. type DOMException struct {
  30. name string
  31. message string
  32. }
  33. // NewDOMException returns a new DOMException with the given name.
  34. // Only useful for errors.Is() comparisons with errors returned from idb.
  35. func NewDOMException(name string) DOMException {
  36. return DOMException{name: name}
  37. }
  38. func parseJSDOMException(jsDOMException safejs.Value) (DOMException, error) {
  39. name, err := jsDOMException.Get("name")
  40. if err != nil {
  41. return DOMException{}, err
  42. }
  43. nameStr, err := name.String()
  44. if err != nil {
  45. return DOMException{}, err
  46. }
  47. message, err := jsDOMException.Get("message")
  48. if err != nil {
  49. return DOMException{}, err
  50. }
  51. messageStr, err := message.String()
  52. if err != nil {
  53. return DOMException{}, err
  54. }
  55. return DOMException{
  56. name: nameStr,
  57. message: messageStr,
  58. }, nil
  59. }
  60. func (e DOMException) Error() string {
  61. if e.message == "" {
  62. return e.name
  63. }
  64. return e.name + ": " + e.message
  65. }
  66. // Is returns true target is a DOMException and matches this DOMException's name. Use 'errors.Is()' to call it.
  67. func (e DOMException) Is(target error) bool {
  68. targetDOMException, ok := target.(DOMException)
  69. return ok && targetDOMException.name == e.name
  70. }