@tezos-x/octez.connect-core 4.8.4 → 4.8.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/dist/cjs/clients/client/Client.d.ts +6 -1
  2. package/dist/cjs/clients/client/Client.js +17 -4
  3. package/dist/cjs/clients/client/Client.js.map +1 -1
  4. package/dist/cjs/constants.js +1 -1
  5. package/dist/cjs/constants.js.map +1 -1
  6. package/dist/cjs/errors/PeerUnreachableBeaconError.d.ts +9 -0
  7. package/dist/cjs/errors/PeerUnreachableBeaconError.js +17 -0
  8. package/dist/cjs/errors/PeerUnreachableBeaconError.js.map +1 -0
  9. package/dist/cjs/errors/get-error.js +3 -0
  10. package/dist/cjs/errors/get-error.js.map +1 -1
  11. package/dist/cjs/index.d.ts +2 -1
  12. package/dist/cjs/index.js +3 -1
  13. package/dist/cjs/index.js.map +1 -1
  14. package/dist/cjs/storage/ChromeStorage.js +6 -15
  15. package/dist/cjs/storage/ChromeStorage.js.map +1 -1
  16. package/dist/cjs/storage/IndexedDBStorage.js +8 -1
  17. package/dist/cjs/storage/IndexedDBStorage.js.map +1 -1
  18. package/dist/cjs/storage/LocalStorage.js +5 -16
  19. package/dist/cjs/storage/LocalStorage.js.map +1 -1
  20. package/dist/cjs/storage/WCStorage.d.ts +1 -2
  21. package/dist/cjs/storage/WCStorage.js +40 -19
  22. package/dist/cjs/storage/WCStorage.js.map +1 -1
  23. package/dist/cjs/storage/storage-normalization.d.ts +9 -0
  24. package/dist/cjs/storage/storage-normalization.js +135 -0
  25. package/dist/cjs/storage/storage-normalization.js.map +1 -0
  26. package/dist/cjs/transports/Transport.js +6 -2
  27. package/dist/cjs/transports/Transport.js.map +1 -1
  28. package/dist/cjs/utils/multi-tab-channel.d.ts +1 -0
  29. package/dist/cjs/utils/multi-tab-channel.js +15 -0
  30. package/dist/cjs/utils/multi-tab-channel.js.map +1 -1
  31. package/dist/esm/clients/client/Client.d.ts +6 -1
  32. package/dist/esm/clients/client/Client.js +17 -4
  33. package/dist/esm/clients/client/Client.js.map +1 -1
  34. package/dist/esm/constants.js +1 -1
  35. package/dist/esm/constants.js.map +1 -1
  36. package/dist/esm/errors/PeerUnreachableBeaconError.d.ts +9 -0
  37. package/dist/esm/errors/PeerUnreachableBeaconError.js +13 -0
  38. package/dist/esm/errors/PeerUnreachableBeaconError.js.map +1 -0
  39. package/dist/esm/errors/get-error.js +3 -0
  40. package/dist/esm/errors/get-error.js.map +1 -1
  41. package/dist/esm/index.d.ts +2 -1
  42. package/dist/esm/index.js +2 -1
  43. package/dist/esm/index.js.map +1 -1
  44. package/dist/esm/storage/ChromeStorage.js +6 -15
  45. package/dist/esm/storage/ChromeStorage.js.map +1 -1
  46. package/dist/esm/storage/IndexedDBStorage.js +8 -1
  47. package/dist/esm/storage/IndexedDBStorage.js.map +1 -1
  48. package/dist/esm/storage/LocalStorage.js +6 -17
  49. package/dist/esm/storage/LocalStorage.js.map +1 -1
  50. package/dist/esm/storage/WCStorage.d.ts +1 -2
  51. package/dist/esm/storage/WCStorage.js +40 -17
  52. package/dist/esm/storage/WCStorage.js.map +1 -1
  53. package/dist/esm/storage/storage-normalization.d.ts +9 -0
  54. package/dist/esm/storage/storage-normalization.js +128 -0
  55. package/dist/esm/storage/storage-normalization.js.map +1 -0
  56. package/dist/esm/transports/Transport.js +6 -2
  57. package/dist/esm/transports/Transport.js.map +1 -1
  58. package/dist/esm/utils/multi-tab-channel.d.ts +1 -0
  59. package/dist/esm/utils/multi-tab-channel.js +13 -0
  60. package/dist/esm/utils/multi-tab-channel.js.map +1 -1
  61. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"get-error.js","sourceRoot":"","sources":["../../../src/errors/get-error.ts"],"names":[],"mappings":"AAAA,sBAAsB;AACtB,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,EAAE,8BAA8B,EAAE,MAAM,kCAAkC,CAAA;AACjF,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAA;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AAC/D,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAA;AAC7E,OAAO,EAAE,oCAAoC,EAAE,MAAM,wCAAwC,CAAA;AAC7F,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAA;AAC7E,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAA;AAC/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAEzD,OAAO,EAAE,WAAW,EAAE,CAAA,CAAC,mCAAmC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,8BAA8B,CAAC,OAAO,EAAE,CAAA;AAEvE,MAAM,QAAQ,GAAG,CAAC,SAA0B,EAAE,SAAkB,EAAe,EAAE;IAC/E,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,eAAe,CAAC,eAAe;YAClC,OAAO,IAAI,oBAAoB,EAAE,CAAA;QACnC,KAAK,eAAe,CAAC,qBAAqB;YACxC,OAAO,IAAI,8BAA8B,EAAE,CAAA;QAC7C,KAAK,eAAe,CAAC,gBAAgB;YACnC,OAAO,IAAI,oBAAoB,EAAE,CAAA;QACnC,KAAK,eAAe,CAAC,0BAA0B;YAC7C,OAAO,IAAI,uBAAuB,EAAE,CAAA;QACtC,KAAK,eAAe,CAAC,iBAAiB;YACpC,OAAO,IAAI,qBAAqB,EAAE,CAAA;QACpC,KAAK,eAAe,CAAC,wBAAwB;YAC3C,OAAO,IAAI,4BAA4B,EAAE,CAAA;QAC3C,KAAK,eAAe,CAAC,mBAAmB;YACtC,OAAO,IAAI,4BAA4B,EAAE,CAAA;QAC3C,KAAK,eAAe,CAAC,yBAAyB;YAC5C,OAAO,IAAI,6BAA6B,CAAC,SAAS,CAAC,CAAA;QACrD,KAAK,eAAe,CAAC,4BAA4B;YAC/C,OAAO,IAAI,oCAAoC,EAAE,CAAA;QACnD,sDAAsD;QACtD,uDAAuD;QACvD,KAAK,eAAe,CAAC,aAAa;YAChC,OAAO,IAAI,kBAAkB,EAAE,CAAA;QACjC,KAAK,eAAe,CAAC,aAAa;YAChC,OAAO,IAAI,kBAAkB,EAAE,CAAA;QACjC;YACE,WAAW,CAAC,SAAS,CAAC,CAAA;IAC1B,CAAC;AACH,CAAC,CAAA;AAED,eAAe,QAAQ,CAAA","sourcesContent":["// src/errors/index.ts\nimport { BeaconError } from './BeaconError'\nimport { BroadcastBeaconError } from './BroadcastBeaconError'\nimport { NetworkNotSupportedBeaconError } from './NetworkNotSupportedBeaconError'\nimport { BeaconErrorType } from '@tezos-x/octez.connect-types'\nimport { assertNever } from '../utils/assert-never'\nimport { AbortedBeaconError } from './AbortedBeaconError'\nimport { NoAddressBeaconError } from './NoAddressBeaconError'\nimport { NoPrivateKeyBeaconError } from './NoPrivateKeyBeaconError'\nimport { NotGrantedBeaconError } from './NotGrantedBeaconError'\nimport { ParametersInvalidBeaconError } from './ParametersInvalidBeaconError'\nimport { SignatureTypeNotSupportedBeaconError } from './SignatureTypeNotSupportedBeaconError'\nimport { TooManyOperationsBeaconError } from './TooManyOperationsBeaconError'\nimport { TransactionInvalidBeaconError } from './TransactionInvalidBeaconError'\nimport { UnknownBeaconError } from './UnknownBeaconError'\n\nexport { BeaconError } // plus each subclass, if you like:\nexport { BroadcastBeaconError, NetworkNotSupportedBeaconError /* … */ }\n\nconst getError = (errorType: BeaconErrorType, errorData: unknown): BeaconError => {\n switch (errorType) {\n case BeaconErrorType.BROADCAST_ERROR:\n return new BroadcastBeaconError()\n case BeaconErrorType.NETWORK_NOT_SUPPORTED:\n return new NetworkNotSupportedBeaconError()\n case BeaconErrorType.NO_ADDRESS_ERROR:\n return new NoAddressBeaconError()\n case BeaconErrorType.NO_PRIVATE_KEY_FOUND_ERROR:\n return new NoPrivateKeyBeaconError()\n case BeaconErrorType.NOT_GRANTED_ERROR:\n return new NotGrantedBeaconError()\n case BeaconErrorType.PARAMETERS_INVALID_ERROR:\n return new ParametersInvalidBeaconError()\n case BeaconErrorType.TOO_MANY_OPERATIONS:\n return new TooManyOperationsBeaconError()\n case BeaconErrorType.TRANSACTION_INVALID_ERROR:\n return new TransactionInvalidBeaconError(errorData)\n case BeaconErrorType.SIGNATURE_TYPE_NOT_SUPPORTED:\n return new SignatureTypeNotSupportedBeaconError()\n // case BeaconErrorType.ENCRYPTION_TYPE_NOT_SUPPORTED:\n // return new EncryptionTypeNotSupportedBeaconError()\n case BeaconErrorType.ABORTED_ERROR:\n return new AbortedBeaconError()\n case BeaconErrorType.UNKNOWN_ERROR:\n return new UnknownBeaconError()\n default:\n assertNever(errorType)\n }\n}\n\nexport default getError\n"]}
1
+ {"version":3,"file":"get-error.js","sourceRoot":"","sources":["../../../src/errors/get-error.ts"],"names":[],"mappings":"AAAA,sBAAsB;AACtB,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,EAAE,8BAA8B,EAAE,MAAM,kCAAkC,CAAA;AACjF,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAA;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AAC/D,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAA;AAC7E,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAA;AACzE,OAAO,EAAE,oCAAoC,EAAE,MAAM,wCAAwC,CAAA;AAC7F,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAA;AAC7E,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAA;AAC/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAEzD,OAAO,EAAE,WAAW,EAAE,CAAA,CAAC,mCAAmC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,8BAA8B,CAAC,OAAO,EAAE,CAAA;AAEvE,MAAM,QAAQ,GAAG,CAAC,SAA0B,EAAE,SAAkB,EAAe,EAAE;IAC/E,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,eAAe,CAAC,eAAe;YAClC,OAAO,IAAI,oBAAoB,EAAE,CAAA;QACnC,KAAK,eAAe,CAAC,qBAAqB;YACxC,OAAO,IAAI,8BAA8B,EAAE,CAAA;QAC7C,KAAK,eAAe,CAAC,gBAAgB;YACnC,OAAO,IAAI,oBAAoB,EAAE,CAAA;QACnC,KAAK,eAAe,CAAC,0BAA0B;YAC7C,OAAO,IAAI,uBAAuB,EAAE,CAAA;QACtC,KAAK,eAAe,CAAC,iBAAiB;YACpC,OAAO,IAAI,qBAAqB,EAAE,CAAA;QACpC,KAAK,eAAe,CAAC,wBAAwB;YAC3C,OAAO,IAAI,4BAA4B,EAAE,CAAA;QAC3C,KAAK,eAAe,CAAC,mBAAmB;YACtC,OAAO,IAAI,4BAA4B,EAAE,CAAA;QAC3C,KAAK,eAAe,CAAC,yBAAyB;YAC5C,OAAO,IAAI,6BAA6B,CAAC,SAAS,CAAC,CAAA;QACrD,KAAK,eAAe,CAAC,4BAA4B;YAC/C,OAAO,IAAI,oCAAoC,EAAE,CAAA;QACnD,sDAAsD;QACtD,uDAAuD;QACvD,KAAK,eAAe,CAAC,aAAa;YAChC,OAAO,IAAI,kBAAkB,EAAE,CAAA;QACjC,KAAK,eAAe,CAAC,gBAAgB;YACnC,OAAO,IAAI,0BAA0B,EAAE,CAAA;QACzC,KAAK,eAAe,CAAC,aAAa;YAChC,OAAO,IAAI,kBAAkB,EAAE,CAAA;QACjC;YACE,WAAW,CAAC,SAAS,CAAC,CAAA;IAC1B,CAAC;AACH,CAAC,CAAA;AAED,eAAe,QAAQ,CAAA","sourcesContent":["// src/errors/index.ts\nimport { BeaconError } from './BeaconError'\nimport { BroadcastBeaconError } from './BroadcastBeaconError'\nimport { NetworkNotSupportedBeaconError } from './NetworkNotSupportedBeaconError'\nimport { BeaconErrorType } from '@tezos-x/octez.connect-types'\nimport { assertNever } from '../utils/assert-never'\nimport { AbortedBeaconError } from './AbortedBeaconError'\nimport { NoAddressBeaconError } from './NoAddressBeaconError'\nimport { NoPrivateKeyBeaconError } from './NoPrivateKeyBeaconError'\nimport { NotGrantedBeaconError } from './NotGrantedBeaconError'\nimport { ParametersInvalidBeaconError } from './ParametersInvalidBeaconError'\nimport { PeerUnreachableBeaconError } from './PeerUnreachableBeaconError'\nimport { SignatureTypeNotSupportedBeaconError } from './SignatureTypeNotSupportedBeaconError'\nimport { TooManyOperationsBeaconError } from './TooManyOperationsBeaconError'\nimport { TransactionInvalidBeaconError } from './TransactionInvalidBeaconError'\nimport { UnknownBeaconError } from './UnknownBeaconError'\n\nexport { BeaconError } // plus each subclass, if you like:\nexport { BroadcastBeaconError, NetworkNotSupportedBeaconError /* … */ }\n\nconst getError = (errorType: BeaconErrorType, errorData: unknown): BeaconError => {\n switch (errorType) {\n case BeaconErrorType.BROADCAST_ERROR:\n return new BroadcastBeaconError()\n case BeaconErrorType.NETWORK_NOT_SUPPORTED:\n return new NetworkNotSupportedBeaconError()\n case BeaconErrorType.NO_ADDRESS_ERROR:\n return new NoAddressBeaconError()\n case BeaconErrorType.NO_PRIVATE_KEY_FOUND_ERROR:\n return new NoPrivateKeyBeaconError()\n case BeaconErrorType.NOT_GRANTED_ERROR:\n return new NotGrantedBeaconError()\n case BeaconErrorType.PARAMETERS_INVALID_ERROR:\n return new ParametersInvalidBeaconError()\n case BeaconErrorType.TOO_MANY_OPERATIONS:\n return new TooManyOperationsBeaconError()\n case BeaconErrorType.TRANSACTION_INVALID_ERROR:\n return new TransactionInvalidBeaconError(errorData)\n case BeaconErrorType.SIGNATURE_TYPE_NOT_SUPPORTED:\n return new SignatureTypeNotSupportedBeaconError()\n // case BeaconErrorType.ENCRYPTION_TYPE_NOT_SUPPORTED:\n // return new EncryptionTypeNotSupportedBeaconError()\n case BeaconErrorType.ABORTED_ERROR:\n return new AbortedBeaconError()\n case BeaconErrorType.PEER_UNREACHABLE:\n return new PeerUnreachableBeaconError()\n case BeaconErrorType.UNKNOWN_ERROR:\n return new UnknownBeaconError()\n default:\n assertNever(errorType)\n }\n}\n\nexport default getError\n"]}
@@ -13,6 +13,7 @@ import { ParametersInvalidBeaconError } from './errors/ParametersInvalidBeaconEr
13
13
  import { TooManyOperationsBeaconError } from './errors/TooManyOperationsBeaconError';
14
14
  import { TransactionInvalidBeaconError } from './errors/TransactionInvalidBeaconError';
15
15
  import { UnknownBeaconError } from './errors/UnknownBeaconError';
16
+ import { PeerUnreachableBeaconError } from './errors/PeerUnreachableBeaconError';
16
17
  import { Transport } from './transports/Transport';
17
18
  import { ChromeStorage } from './storage/ChromeStorage';
18
19
  import { LocalStorage } from './storage/LocalStorage';
@@ -42,7 +43,7 @@ import { StorageValidator } from './storage/StorageValidator';
42
43
  import { MultiTabChannel } from './utils/multi-tab-channel';
43
44
  import getError from './errors/get-error';
44
45
  export { BeaconClient, BeaconClientOptions, Client, ClientOptions, ClientEvents };
45
- export { getError, BeaconError, AbortedBeaconError, BroadcastBeaconError, NetworkNotSupportedBeaconError, NoAddressBeaconError, NoPrivateKeyBeaconError, NotGrantedBeaconError, ParametersInvalidBeaconError, TooManyOperationsBeaconError, TransactionInvalidBeaconError, SignatureTypeNotSupportedBeaconError, UnknownBeaconError };
46
+ export { getError, BeaconError, AbortedBeaconError, BroadcastBeaconError, NetworkNotSupportedBeaconError, NoAddressBeaconError, NoPrivateKeyBeaconError, NotGrantedBeaconError, ParametersInvalidBeaconError, TooManyOperationsBeaconError, TransactionInvalidBeaconError, SignatureTypeNotSupportedBeaconError, PeerUnreachableBeaconError, UnknownBeaconError };
46
47
  export { Transport, MessageBasedClient, CommunicationClient };
47
48
  export { ChromeStorage, LocalStorage, WCStorage, IndexedDBStorage, StorageValidator, getStorage };
48
49
  export { PeerManager, AccountManager, AppMetadataManager, PermissionManager };
package/dist/esm/index.js CHANGED
@@ -13,6 +13,7 @@ import { ParametersInvalidBeaconError } from './errors/ParametersInvalidBeaconEr
13
13
  import { TooManyOperationsBeaconError } from './errors/TooManyOperationsBeaconError';
14
14
  import { TransactionInvalidBeaconError } from './errors/TransactionInvalidBeaconError';
15
15
  import { UnknownBeaconError } from './errors/UnknownBeaconError';
16
+ import { PeerUnreachableBeaconError } from './errors/PeerUnreachableBeaconError';
16
17
  import { Transport } from './transports/Transport';
17
18
  import { ChromeStorage } from './storage/ChromeStorage';
18
19
  import { LocalStorage } from './storage/LocalStorage';
@@ -46,7 +47,7 @@ import getError from './errors/get-error';
46
47
  // Clients
47
48
  export { BeaconClient, Client };
48
49
  // Errors
49
- export { getError, BeaconError, AbortedBeaconError, BroadcastBeaconError, NetworkNotSupportedBeaconError, NoAddressBeaconError, NoPrivateKeyBeaconError, NotGrantedBeaconError, ParametersInvalidBeaconError, TooManyOperationsBeaconError, TransactionInvalidBeaconError, SignatureTypeNotSupportedBeaconError,
50
+ export { getError, BeaconError, AbortedBeaconError, BroadcastBeaconError, NetworkNotSupportedBeaconError, NoAddressBeaconError, NoPrivateKeyBeaconError, NotGrantedBeaconError, ParametersInvalidBeaconError, TooManyOperationsBeaconError, TransactionInvalidBeaconError, SignatureTypeNotSupportedBeaconError, PeerUnreachableBeaconError,
50
51
  // EncryptionTypeNotSupportedBeaconError,
51
52
  UnknownBeaconError };
52
53
  // Transport
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * General docs\n * @module public\n */\nimport { Client } from './clients/client/Client'\nimport { BeaconError } from './errors/BeaconError'\nimport { BroadcastBeaconError } from './errors/BroadcastBeaconError'\nimport { NetworkNotSupportedBeaconError } from './errors/NetworkNotSupportedBeaconError'\nimport { NoAddressBeaconError } from './errors/NoAddressBeaconError'\nimport { NoPrivateKeyBeaconError } from './errors/NoPrivateKeyBeaconError'\nimport { NotGrantedBeaconError } from './errors/NotGrantedBeaconError'\nimport { ParametersInvalidBeaconError } from './errors/ParametersInvalidBeaconError'\nimport { TooManyOperationsBeaconError } from './errors/TooManyOperationsBeaconError'\nimport { TransactionInvalidBeaconError } from './errors/TransactionInvalidBeaconError'\nimport { UnknownBeaconError } from './errors/UnknownBeaconError'\nimport { Transport } from './transports/Transport'\nimport { ChromeStorage } from './storage/ChromeStorage'\nimport { LocalStorage } from './storage/LocalStorage'\nimport { getStorage } from './storage/getStorage'\nimport { Serializer } from './Serializer'\n// import { RequestEncryptPayloadInput } from './types/RequestEncryptPayloadInput'\nimport { ClientOptions } from './clients/client/ClientOptions'\nimport { SDK_VERSION, BEACON_VERSION } from './constants'\nimport { AccountManager } from './managers/AccountManager'\nimport { AppMetadataManager } from './managers/AppMetadataManager'\nimport { PermissionManager } from './managers/PermissionManager'\nimport { BeaconClient } from './clients/beacon-client/BeaconClient'\nimport { BeaconClientOptions } from './clients/beacon-client/BeaconClientOptions'\nimport { getAccountIdentifier } from './utils/get-account-identifier'\nimport { AbortedBeaconError } from './errors/AbortedBeaconError'\nimport { getSenderId } from './utils/get-sender-id'\nimport { PeerManager } from './managers/PeerManager'\nimport { MessageBasedClient } from './transports/clients/MessageBasedClient'\nimport { setDebugEnabled, getDebugEnabled } from './debug'\n// import { EncryptPayloadRequest } from './types/beacon/messages/EncryptPayloadRequest'\n// import { EncryptPayloadResponse } from './types/beacon/messages/EncryptPayloadResponse'\n// import { EncryptionTypeNotSupportedBeaconError } from './errors/EncryptionTypeNotSupportedBeaconError'\nimport { SignatureTypeNotSupportedBeaconError } from './errors/SignatureTypeNotSupportedBeaconError'\nimport { getLogger, Logger, setLogger } from './utils/Logger'\nimport { windowRef } from './MockWindow'\nimport { CommunicationClient } from './transports/clients/CommunicationClient'\nimport { ClientEvents } from './transports/clients/ClientEvents'\nimport { WCStorage } from './storage/WCStorage'\nimport { IndexedDBStorage } from './storage/IndexedDBStorage'\nimport { StorageValidator } from './storage/StorageValidator'\nimport { MultiTabChannel } from './utils/multi-tab-channel'\nimport getError from './errors/get-error'\n// import { EncryptionType } from './types/EncryptionType'\n// import { EncryptionOperation } from './types/EncryptionOperation'\n\n// Clients\nexport { BeaconClient, BeaconClientOptions, Client, ClientOptions, ClientEvents }\n\n// Errors\nexport {\n getError,\n BeaconError,\n AbortedBeaconError,\n BroadcastBeaconError,\n NetworkNotSupportedBeaconError,\n NoAddressBeaconError,\n NoPrivateKeyBeaconError,\n NotGrantedBeaconError,\n ParametersInvalidBeaconError,\n TooManyOperationsBeaconError,\n TransactionInvalidBeaconError,\n SignatureTypeNotSupportedBeaconError,\n // EncryptionTypeNotSupportedBeaconError,\n UnknownBeaconError\n}\n\n// Transport\nexport { Transport, MessageBasedClient, CommunicationClient }\n\n// Storage\nexport { ChromeStorage, LocalStorage, WCStorage, IndexedDBStorage, StorageValidator, getStorage }\n\n// Managers\nexport { PeerManager, AccountManager, AppMetadataManager, PermissionManager }\n\n// Constants\nexport { SDK_VERSION, BEACON_VERSION }\n\n// Utils\nexport { getSenderId, getAccountIdentifier, windowRef, MultiTabChannel }\n\n// Others\nexport { Serializer, Logger, setLogger, getLogger }\n\n// Debug\nexport { setDebugEnabled, getDebugEnabled }\n\nexport { NOTIFICATION_ORACLE_URL, BACKEND_URL } from './constants'\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * General docs\n * @module public\n */\nimport { Client } from './clients/client/Client'\nimport { BeaconError } from './errors/BeaconError'\nimport { BroadcastBeaconError } from './errors/BroadcastBeaconError'\nimport { NetworkNotSupportedBeaconError } from './errors/NetworkNotSupportedBeaconError'\nimport { NoAddressBeaconError } from './errors/NoAddressBeaconError'\nimport { NoPrivateKeyBeaconError } from './errors/NoPrivateKeyBeaconError'\nimport { NotGrantedBeaconError } from './errors/NotGrantedBeaconError'\nimport { ParametersInvalidBeaconError } from './errors/ParametersInvalidBeaconError'\nimport { TooManyOperationsBeaconError } from './errors/TooManyOperationsBeaconError'\nimport { TransactionInvalidBeaconError } from './errors/TransactionInvalidBeaconError'\nimport { UnknownBeaconError } from './errors/UnknownBeaconError'\nimport { PeerUnreachableBeaconError } from './errors/PeerUnreachableBeaconError'\nimport { Transport } from './transports/Transport'\nimport { ChromeStorage } from './storage/ChromeStorage'\nimport { LocalStorage } from './storage/LocalStorage'\nimport { getStorage } from './storage/getStorage'\nimport { Serializer } from './Serializer'\n// import { RequestEncryptPayloadInput } from './types/RequestEncryptPayloadInput'\nimport { ClientOptions } from './clients/client/ClientOptions'\nimport { SDK_VERSION, BEACON_VERSION } from './constants'\nimport { AccountManager } from './managers/AccountManager'\nimport { AppMetadataManager } from './managers/AppMetadataManager'\nimport { PermissionManager } from './managers/PermissionManager'\nimport { BeaconClient } from './clients/beacon-client/BeaconClient'\nimport { BeaconClientOptions } from './clients/beacon-client/BeaconClientOptions'\nimport { getAccountIdentifier } from './utils/get-account-identifier'\nimport { AbortedBeaconError } from './errors/AbortedBeaconError'\nimport { getSenderId } from './utils/get-sender-id'\nimport { PeerManager } from './managers/PeerManager'\nimport { MessageBasedClient } from './transports/clients/MessageBasedClient'\nimport { setDebugEnabled, getDebugEnabled } from './debug'\n// import { EncryptPayloadRequest } from './types/beacon/messages/EncryptPayloadRequest'\n// import { EncryptPayloadResponse } from './types/beacon/messages/EncryptPayloadResponse'\n// import { EncryptionTypeNotSupportedBeaconError } from './errors/EncryptionTypeNotSupportedBeaconError'\nimport { SignatureTypeNotSupportedBeaconError } from './errors/SignatureTypeNotSupportedBeaconError'\nimport { getLogger, Logger, setLogger } from './utils/Logger'\nimport { windowRef } from './MockWindow'\nimport { CommunicationClient } from './transports/clients/CommunicationClient'\nimport { ClientEvents } from './transports/clients/ClientEvents'\nimport { WCStorage } from './storage/WCStorage'\nimport { IndexedDBStorage } from './storage/IndexedDBStorage'\nimport { StorageValidator } from './storage/StorageValidator'\nimport { MultiTabChannel } from './utils/multi-tab-channel'\nimport getError from './errors/get-error'\n// import { EncryptionType } from './types/EncryptionType'\n// import { EncryptionOperation } from './types/EncryptionOperation'\n\n// Clients\nexport { BeaconClient, BeaconClientOptions, Client, ClientOptions, ClientEvents }\n\n// Errors\nexport {\n getError,\n BeaconError,\n AbortedBeaconError,\n BroadcastBeaconError,\n NetworkNotSupportedBeaconError,\n NoAddressBeaconError,\n NoPrivateKeyBeaconError,\n NotGrantedBeaconError,\n ParametersInvalidBeaconError,\n TooManyOperationsBeaconError,\n TransactionInvalidBeaconError,\n SignatureTypeNotSupportedBeaconError,\n PeerUnreachableBeaconError,\n // EncryptionTypeNotSupportedBeaconError,\n UnknownBeaconError\n}\n\n// Transport\nexport { Transport, MessageBasedClient, CommunicationClient }\n\n// Storage\nexport { ChromeStorage, LocalStorage, WCStorage, IndexedDBStorage, StorageValidator, getStorage }\n\n// Managers\nexport { PeerManager, AccountManager, AppMetadataManager, PermissionManager }\n\n// Constants\nexport { SDK_VERSION, BEACON_VERSION }\n\n// Utils\nexport { getSenderId, getAccountIdentifier, windowRef, MultiTabChannel }\n\n// Others\nexport { Serializer, Logger, setLogger, getLogger }\n\n// Debug\nexport { setDebugEnabled, getDebugEnabled }\n\nexport { NOTIFICATION_ORACLE_URL, BACKEND_URL } from './constants'\n"]}
@@ -1,4 +1,4 @@
1
- import { defaultValues } from '@tezos-x/octez.connect-types';
1
+ import { normalizeParsedStoredValue } from './storage-normalization';
2
2
  /**
3
3
  * @internalapi
4
4
  *
@@ -15,23 +15,14 @@ export class ChromeStorage {
15
15
  async get(key) {
16
16
  return new Promise((resolve) => {
17
17
  chrome.storage.local.get(null, (storageContent) => {
18
- const value = storageContent[key];
19
- if (value !== undefined) {
20
- resolve(value);
21
- }
22
- else {
23
- const defaultValue = defaultValues[key];
24
- if (typeof defaultValue === 'object') {
25
- resolve(JSON.parse(JSON.stringify(defaultValue)));
26
- }
27
- else {
28
- resolve(defaultValue);
29
- }
30
- }
18
+ resolve(normalizeParsedStoredValue(key, storageContent[key]));
31
19
  });
32
20
  });
33
21
  }
34
22
  async set(key, value) {
23
+ if (value === undefined) {
24
+ return this.delete(key);
25
+ }
35
26
  return new Promise((resolve) => {
36
27
  chrome.storage.local.set({ [key]: value }, () => {
37
28
  resolve();
@@ -40,7 +31,7 @@ export class ChromeStorage {
40
31
  }
41
32
  async delete(key) {
42
33
  return new Promise((resolve) => {
43
- chrome.storage.local.set({ [key]: undefined }, () => {
34
+ chrome.storage.local.remove(String(key), () => {
44
35
  resolve();
45
36
  });
46
37
  });
@@ -1 +1 @@
1
- {"version":3,"file":"ChromeStorage.js","sourceRoot":"","sources":["../../../src/storage/ChromeStorage.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6C,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAEvG;;;;GAIG;AACH,MAAM,OAAO,aAAa;IACjB,MAAM,CAAC,KAAK,CAAC,WAAW;QAC7B,OAAO,CACL,OAAO,MAAM,KAAK,WAAW;YAC7B,OAAO,MAAM,KAAK,WAAW;YAC7B,OAAO,CAAC,MAAM,CAAC;YACf,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;YACvB,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAC3B,CAAA;IACH,CAAC;IAEM,KAAK,CAAC,GAAG,CAAuB,GAAM;QAC3C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,cAA6C,EAAE,EAAE;gBAC/E,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,CAAA;gBACjC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oBACxB,OAAO,CAAC,KAAK,CAAC,CAAA;gBAChB,CAAC;qBAAM,CAAC;oBACN,MAAM,YAAY,GAAG,aAAa,CAAC,GAAG,CAAC,CAAA;oBAEvC,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE,CAAC;wBACrC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;oBACnD,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,YAAY,CAAC,CAAA;oBACvB,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC;IAEM,KAAK,CAAC,GAAG,CAAuB,GAAM,EAAE,KAA8B;QAC3E,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE;gBAC9C,OAAO,EAAE,CAAA;YACX,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC;IAEM,KAAK,CAAC,MAAM,CAAuB,GAAM;QAC9C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE;gBAClD,OAAO,EAAE,CAAA;YACX,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC;IAEM,KAAK,CAAC,yBAAyB,CACpC,SAKQ;QAER,OAAO;IACT,CAAC;IAEM,cAAc,CAAC,GAAW;QAC/B,OAAO,GAAG,CAAA;IACZ,CAAC;CACF","sourcesContent":["import { Storage, StorageKey, StorageKeyReturnType, defaultValues } from '@tezos-x/octez.connect-types'\n\n/**\n * @internalapi\n *\n * A storage that can be used in chrome extensions\n */\nexport class ChromeStorage implements Storage {\n public static async isSupported(): Promise<boolean> {\n return (\n typeof window !== 'undefined' &&\n typeof chrome !== 'undefined' &&\n Boolean(chrome) &&\n Boolean(chrome.runtime) &&\n Boolean(chrome.runtime.id)\n )\n }\n\n public async get<K extends StorageKey>(key: K): Promise<StorageKeyReturnType[K]> {\n return new Promise((resolve) => {\n chrome.storage.local.get(null, (storageContent: Partial<StorageKeyReturnType>) => {\n const value = storageContent[key]\n if (value !== undefined) {\n resolve(value)\n } else {\n const defaultValue = defaultValues[key]\n\n if (typeof defaultValue === 'object') {\n resolve(JSON.parse(JSON.stringify(defaultValue)))\n } else {\n resolve(defaultValue)\n }\n }\n })\n })\n }\n\n public async set<K extends StorageKey>(key: K, value: StorageKeyReturnType[K]): Promise<void> {\n return new Promise((resolve) => {\n chrome.storage.local.set({ [key]: value }, () => {\n resolve()\n })\n })\n }\n\n public async delete<K extends StorageKey>(key: K): Promise<void> {\n return new Promise((resolve) => {\n chrome.storage.local.set({ [key]: undefined }, () => {\n resolve()\n })\n })\n }\n\n public async subscribeToStorageChanged(\n _callback: (arg: {\n eventType: 'storageCleared' | 'entryModified'\n key: string | null\n oldValue: string | null\n newValue: string | null\n }) => {}\n ): Promise<void> {\n // TODO\n }\n\n public getPrefixedKey(key: string): string {\n return key\n }\n}\n"]}
1
+ {"version":3,"file":"ChromeStorage.js","sourceRoot":"","sources":["../../../src/storage/ChromeStorage.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAA;AAEpE;;;;GAIG;AACH,MAAM,OAAO,aAAa;IACjB,MAAM,CAAC,KAAK,CAAC,WAAW;QAC7B,OAAO,CACL,OAAO,MAAM,KAAK,WAAW;YAC7B,OAAO,MAAM,KAAK,WAAW;YAC7B,OAAO,CAAC,MAAM,CAAC;YACf,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;YACvB,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAC3B,CAAA;IACH,CAAC;IAEM,KAAK,CAAC,GAAG,CAAuB,GAAM;QAC3C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,cAA6C,EAAE,EAAE;gBAC/E,OAAO,CAAC,0BAA0B,CAAC,GAAG,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YAC/D,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC;IAEM,KAAK,CAAC,GAAG,CAAuB,GAAM,EAAE,KAA8B;QAC3E,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QACzB,CAAC;QAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE;gBAC9C,OAAO,EAAE,CAAA;YACX,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC;IAEM,KAAK,CAAC,MAAM,CAAuB,GAAM;QAC9C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE;gBAC5C,OAAO,EAAE,CAAA;YACX,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC;IAEM,KAAK,CAAC,yBAAyB,CACpC,SAKQ;QAER,OAAO;IACT,CAAC;IAEM,cAAc,CAAC,GAAW;QAC/B,OAAO,GAAG,CAAA;IACZ,CAAC;CACF","sourcesContent":["import { Storage, StorageKey, StorageKeyReturnType } from '@tezos-x/octez.connect-types'\nimport { normalizeParsedStoredValue } from './storage-normalization'\n\n/**\n * @internalapi\n *\n * A storage that can be used in chrome extensions\n */\nexport class ChromeStorage implements Storage {\n public static async isSupported(): Promise<boolean> {\n return (\n typeof window !== 'undefined' &&\n typeof chrome !== 'undefined' &&\n Boolean(chrome) &&\n Boolean(chrome.runtime) &&\n Boolean(chrome.runtime.id)\n )\n }\n\n public async get<K extends StorageKey>(key: K): Promise<StorageKeyReturnType[K]> {\n return new Promise((resolve) => {\n chrome.storage.local.get(null, (storageContent: Partial<StorageKeyReturnType>) => {\n resolve(normalizeParsedStoredValue(key, storageContent[key]))\n })\n })\n }\n\n public async set<K extends StorageKey>(key: K, value: StorageKeyReturnType[K]): Promise<void> {\n if (value === undefined) {\n return this.delete(key)\n }\n\n return new Promise((resolve) => {\n chrome.storage.local.set({ [key]: value }, () => {\n resolve()\n })\n })\n }\n\n public async delete<K extends StorageKey>(key: K): Promise<void> {\n return new Promise((resolve) => {\n chrome.storage.local.remove(String(key), () => {\n resolve()\n })\n })\n }\n\n public async subscribeToStorageChanged(\n _callback: (arg: {\n eventType: 'storageCleared' | 'entryModified'\n key: string | null\n oldValue: string | null\n newValue: string | null\n }) => {}\n ): Promise<void> {\n // TODO\n }\n\n public getPrefixedKey(key: string): string {\n return key\n }\n}\n"]}
@@ -1,5 +1,6 @@
1
1
  import { Storage } from '@tezos-x/octez.connect-types';
2
2
  import { Logger } from '../utils/Logger';
3
+ import { isStorageKey, normalizeParsedStoredValue } from './storage-normalization';
3
4
  const logger = new Logger('IndexedDBStorage');
4
5
  export class IndexedDBStorage extends Storage {
5
6
  dbName;
@@ -98,13 +99,19 @@ export class IndexedDBStorage extends Storage {
98
99
  });
99
100
  }
100
101
  get(key, storeName = this.storeNames[0]) {
101
- return this.transaction('readonly', storeName, (store) => new Promise((resolve, reject) => {
102
+ const storedValue = this.transaction('readonly', storeName, (store) => new Promise((resolve, reject) => {
102
103
  const getRequest = store.get(key);
103
104
  getRequest.onsuccess = () => resolve(getRequest.result);
104
105
  getRequest.onerror = () => reject(getRequest.error);
105
106
  }));
107
+ return isStorageKey(key)
108
+ ? storedValue.then((value) => normalizeParsedStoredValue(key, value))
109
+ : storedValue;
106
110
  }
107
111
  set(key, value, storeName = this.storeNames[0]) {
112
+ if (value === undefined) {
113
+ return this.delete(key, storeName);
114
+ }
108
115
  return this.transaction('readwrite', storeName, (store) => new Promise((resolve, reject) => {
109
116
  const putRequest = store.put(value, key);
110
117
  putRequest.onsuccess = () => resolve();
@@ -1 +1 @@
1
- {"version":3,"file":"IndexedDBStorage.js","sourceRoot":"","sources":["../../../src/storage/IndexedDBStorage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAoC,MAAM,8BAA8B,CAAA;AACxF,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAExC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,kBAAkB,CAAC,CAAA;AAE7C,MAAM,OAAO,gBAAiB,SAAQ,OAAO;IAUxB;IACA;IAVX,EAAE,GAAuB,IAAI,CAAA;IAC7B,WAAW,GAAY,IAAI,CAAA;IAEnC;;;;OAIG;IACH,YACmB,SAAiB,8BAA8B,EAC/C,aAAuB,CAAC,iBAAiB,CAAC;QAE3D,KAAK,EAAE,CAAA;QAHU,WAAM,GAAN,MAAM,CAAyC;QAC/C,eAAU,GAAV,UAAU,CAAgC;QAG3D,IAAI,CAAC,MAAM,EAAE;aACV,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;aAC5B,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAA;IAC9C,CAAC;IAEO,oBAAoB;QAC1B,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,WAAW,IAAI,MAAM,EAAE,CAAC;YAC3D,MAAM,CAAC,GAAG,CAAC,sBAAsB,EAAE,yCAAyC,CAAC,CAAA;YAC7E,OAAO,IAAI,CAAA;QACb,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE,6CAA6C,CAAC,CAAA;YACnF,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,MAAM;QAClB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAA;YAC9C,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;gBACtB,MAAM,CAAC,6BAA6B,CAAC,CAAA;gBACrC,OAAM;YACR,CAAC;YAED,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YAE/C,WAAW,CAAC,eAAe,GAAG,GAAG,EAAE;gBACjC,MAAM,EAAE,GAAG,WAAW,CAAC,MAAM,CAAA;gBAC7B,oCAAoC;gBACpC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;oBACpC,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;wBAC7C,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAA;oBACjC,CAAC;gBACH,CAAC,CAAC,CAAA;YACJ,CAAC,CAAA;YAED,WAAW,CAAC,SAAS,GAAG,CAAC,KAAU,EAAE,EAAE;gBACrC,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,MAAqB,CAAA;gBAC7C,0DAA0D;gBAC1D,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAC1C,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,SAAS,CAAC,CACxD,CAAA;gBACD,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC7B,EAAE,CAAC,KAAK,EAAE,CAAA;oBACV,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,GAAG,CAAC,CAAA;oBACjC,MAAM,cAAc,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;oBAE9D,cAAc,CAAC,eAAe,GAAG,GAAG,EAAE;wBACpC,MAAM,UAAU,GAAG,cAAc,CAAC,MAAM,CAAA;wBACxC,aAAa,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;4BAClC,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gCACrD,UAAU,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAA;4BACzC,CAAC;wBACH,CAAC,CAAC,CAAA;oBACJ,CAAC,CAAA;oBAED,cAAc,CAAC,SAAS,GAAG,CAAC,KAAU,EAAE,EAAE;wBACxC,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,MAAqB,CAAA;wBAC5C,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;oBAClB,CAAC,CAAA;oBAED,cAAc,CAAC,OAAO,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;gBACrE,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;oBACZ,OAAO,CAAC,EAAE,CAAC,CAAA;gBACb,CAAC;YACH,CAAC,CAAA;YAED,WAAW,CAAC,OAAO,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAClE,CAAC,CAAC,CAAA;IACJ,CAAC;IAED;;;;;OAKG;IACK,KAAK,CAAC,WAAW,CACvB,IAAwB,EACxB,SAAiB,EACjB,SAAgD;QAEhD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;gBACtB,MAAM,CAAC,6BAA6B,CAAC,CAAA;gBACrC,OAAM;YACR,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,gBAAgB,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gBACnD,MAAM,CAAC,GAAG,SAAS,sBAAsB,IAAI,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,CAAA;gBAC7D,OAAM;YACR,CAAC;YAED,MAAM,WAAW,GAAG,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;YACxD,MAAM,WAAW,GAAG,WAAW,CAAC,WAAW,CAAC,SAAS,CAAC,CAAA;YACtD,SAAS,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QACpD,CAAC,CAAC,CAAA;IACJ,CAAC;IAQM,GAAG,CAAC,GAAwB,EAAE,YAAoB,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QACzE,OAAO,IAAI,CAAC,WAAW,CACrB,UAAU,EACV,SAAS,EACT,CAAC,KAAK,EAAE,EAAE,CACR,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC9B,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YACjC,UAAU,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;YACvD,UAAU,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;QACrD,CAAC,CAAC,CACL,CAAA;IACH,CAAC;IAWM,GAAG,CACR,GAAwB,EACxB,KAAU,EACV,YAAoB,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAEtC,OAAO,IAAI,CAAC,WAAW,CACrB,WAAW,EACX,SAAS,EACT,CAAC,KAAK,EAAE,EAAE,CACR,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC9B,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;YACxC,UAAU,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC,OAAO,EAAE,CAAA;YACtC,UAAU,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;QACrD,CAAC,CAAC,CACL,CAAA;IACH,CAAC;IAOM,MAAM,CAAC,GAAwB,EAAE,YAAoB,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAC5E,OAAO,IAAI,CAAC,WAAW,CACrB,WAAW,EACX,SAAS,EACT,CAAC,KAAK,EAAE,EAAE,CACR,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC9B,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YACvC,aAAa,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC,OAAO,EAAE,CAAA;YACzC,aAAa,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;QAC3D,CAAC,CAAC,CACL,CAAA;IACH,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,SAAkB;QAC9B,OAAO,IAAI,CAAC,WAAW,CACrB,UAAU,EACV,SAAS,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAC/B,CAAC,KAAK,EAAE,EAAE,CACR,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC9B,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,EAAE,CAAA;YACpC,aAAa,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;YAC7D,aAAa,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;QAC3D,CAAC,CAAC,CACL,CAAA;IACH,CAAC;IAED;;OAEG;IACI,UAAU,CAAC,SAAkB;QAClC,OAAO,IAAI,CAAC,WAAW,CACrB,UAAU,EACV,SAAS,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAC/B,CAAC,KAAK,EAAE,EAAE,CACR,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC9B,MAAM,iBAAiB,GAAG,KAAK,CAAC,UAAU,EAAE,CAAA;YAC5C,iBAAiB,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAA;YACrE,iBAAiB,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAA;QACnE,CAAC,CAAC,CACL,CAAA;IACH,CAAC;IAED;;OAEG;IACI,UAAU,CAAC,SAAkB;QAClC,OAAO,IAAI,CAAC,WAAW,CACrB,WAAW,EACX,SAAS,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAC/B,CAAC,KAAK,EAAE,EAAE,CACR,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC9B,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,EAAE,CAAA;YAClC,YAAY,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC,OAAO,EAAE,CAAA;YACxC,YAAY,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAA;QACzD,CAAC,CAAC,CACL,CAAA;IACH,CAAC;IAED,cAAc,CAAuB,GAAM;QACzC,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAA;QACnC,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAA;IAC5C,CAAC;IAED,yBAAyB,CACvB,QAKQ;QAER,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,QAAQ,CAAC,CAAA;QACjD,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAA;IAC5C,CAAC;IAED;;;;;;OAMG;IACI,KAAK,CAAC,SAAS,CACpB,YAAoB,EACpB,eAAuB,EACvB,WAAqB,EAAE,EACvB,kBAA0B,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAE5C,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,0BAA0B,CAAC,CAAA;YACrD,OAAM;QACR,CAAC;QAED,MAAM,eAAe,GAAG,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAEpD,eAAe,CAAC,OAAO,GAAG,CAAC,KAAU,EAAE,EAAE;YACvC,MAAM,IAAI,KAAK,CAAC,mCAAmC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAA;QAC1E,CAAC,CAAA;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,OAAO,CAAc,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAClE,eAAe,CAAC,SAAS,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAE,KAAK,CAAC,MAA2B,CAAC,MAAM,CAAC,CAAA;YACzF,eAAe,CAAC,OAAO,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACtE,CAAC,CAAC,CAAA;QAEF,qFAAqF;QACrF,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,eAAe,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE;YACxE,MAAM,aAAa,GAAG,WAAW,CAAC,MAAM,EAAE,CAAA;YAC1C,MAAM,iBAAiB,GAAG,WAAW,CAAC,UAAU,EAAE,CAAA;YAElD,aAAa,CAAC,SAAS,GAAG,KAAK,IAAI,EAAE;gBACnC,iBAAiB,CAAC,SAAS,GAAG,KAAK,IAAI,EAAE;oBACvC,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAA;oBAClC,MAAM,IAAI,GAAG,iBAAiB,CAAC,MAAM,CAAA;oBAErC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;wBACzD,MAAM,CAAC,KAAK,CAAC,GAAG,eAAe,eAAe,IAAI,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,CAAA;wBAClE,OAAM;oBACR,CAAC;oBAED,MAAM,iBAAiB,GAAG,QAAQ,CAAC,WAAW,CAAC,eAAe,EAAE,WAAW,CAAC,CAAA;oBAC5E,MAAM,WAAW,GAAG,iBAAiB,CAAC,WAAW,CAAC,eAAe,CAAC,CAAA;oBAElE,IAAI;yBACD,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;yBACnD,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;wBACtB,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAA;oBACpC,CAAC,CAAC,CAAA;oBAEJ,iBAAiB,CAAC,OAAO,GAAG,CAAC,KAAU,EAAE,EAAE;wBACzC,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;oBACzD,CAAC,CAAA;gBACH,CAAC,CAAA;YACH,CAAC,CAAA;YACD,iBAAiB,CAAC,OAAO,GAAG,GAAG,EAAE;gBAC/B,MAAM,CAAC,KAAK,CAAC,mCAAmC,EAAE,iBAAiB,CAAC,KAAK,CAAC,CAAA;YAC5E,CAAC,CAAA;YACD,aAAa,CAAC,OAAO,GAAG,GAAG,EAAE;gBAC3B,MAAM,CAAC,KAAK,CAAC,+BAA+B,EAAE,aAAa,CAAC,KAAK,CAAC,CAAA;YACpE,CAAC,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;CACF","sourcesContent":["import { Storage, StorageKey, StorageKeyReturnType } from '@tezos-x/octez.connect-types'\nimport { Logger } from '../utils/Logger'\n\nconst logger = new Logger('IndexedDBStorage')\n\nexport class IndexedDBStorage extends Storage {\n private db: IDBDatabase | null = null\n private isSupported: boolean = true\n\n /**\n * @param dbName Name of the database.\n * @param storeNames An array of object store names to create in the database.\n * The first store in the array will be used as the default if none is specified.\n */\n constructor(\n private readonly dbName: string = 'WALLET_CONNECT_V2_INDEXED_DB',\n private readonly storeNames: string[] = ['keyvaluestorage']\n ) {\n super()\n this.initDB()\n .then((db) => (this.db = db))\n .catch((err) => logger.error(err.message))\n }\n\n private isIndexedDBSupported() {\n if (typeof window !== 'undefined' && 'indexedDB' in window) {\n logger.log('isIndexedDBSupported', 'IndexedDB is supported in this browser.')\n return true\n } else {\n logger.error('isIndexedDBSupported', 'IndexedDB is not supported in this browser.')\n return false\n }\n }\n\n private async initDB(): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n this.isSupported = this.isIndexedDBSupported()\n if (!this.isSupported) {\n reject('IndexedDB is not supported.')\n return\n }\n\n const openRequest = indexedDB.open(this.dbName)\n\n openRequest.onupgradeneeded = () => {\n const db = openRequest.result\n // Create all required object stores\n this.storeNames.forEach((storeName) => {\n if (!db.objectStoreNames.contains(storeName)) {\n db.createObjectStore(storeName)\n }\n })\n }\n\n openRequest.onsuccess = (event: any) => {\n const db = event.target.result as IDBDatabase\n // Check if all stores exist – if not, perform an upgrade.\n const missingStores = this.storeNames.filter(\n (storeName) => !db.objectStoreNames.contains(storeName)\n )\n if (missingStores.length > 0) {\n db.close()\n const newVersion = db.version + 1\n const upgradeRequest = indexedDB.open(this.dbName, newVersion)\n\n upgradeRequest.onupgradeneeded = () => {\n const upgradedDB = upgradeRequest.result\n missingStores.forEach((storeName) => {\n if (!upgradedDB.objectStoreNames.contains(storeName)) {\n upgradedDB.createObjectStore(storeName)\n }\n })\n }\n\n upgradeRequest.onsuccess = (event: any) => {\n this.db = event.target.result as IDBDatabase\n resolve(this.db)\n }\n\n upgradeRequest.onerror = (event: any) => reject(event.target.error)\n } else {\n this.db = db\n resolve(db)\n }\n }\n\n openRequest.onerror = (event: any) => reject(event.target.error)\n })\n }\n\n /**\n * Performs a transaction on the given object store.\n * @param mode Transaction mode.\n * @param storeName The name of the object store.\n * @param operation The operation to perform with the object store.\n */\n private async transaction<T>(\n mode: IDBTransactionMode,\n storeName: string,\n operation: (store: IDBObjectStore) => Promise<T>\n ): Promise<T> {\n return new Promise((resolve, reject) => {\n if (!this.isSupported) {\n reject('IndexedDB is not supported.')\n return\n }\n\n if (!this.db?.objectStoreNames.contains(storeName)) {\n reject(`${storeName} not found. error: ${new Error().stack}`)\n return\n }\n\n const transaction = this.db.transaction(storeName, mode)\n const objectStore = transaction.objectStore(storeName)\n operation(objectStore).then(resolve).catch(reject)\n })\n }\n\n /**\n * Retrieves a value by key from the specified object store.\n * If no store is specified, the default (first in the list) is used.\n */\n public get<K extends StorageKey>(key: K, storeName?: string): Promise<StorageKeyReturnType[K]>\n public get(key: string, storeName?: string): Promise<string | undefined>\n public get(key: StorageKey | string, storeName: string = this.storeNames[0]): Promise<any> {\n return this.transaction(\n 'readonly',\n storeName,\n (store) =>\n new Promise((resolve, reject) => {\n const getRequest = store.get(key)\n getRequest.onsuccess = () => resolve(getRequest.result)\n getRequest.onerror = () => reject(getRequest.error)\n })\n )\n }\n\n /**\n * Stores a key/value pair in the specified object store.\n */\n public set<K extends StorageKey>(\n key: K,\n value: StorageKeyReturnType[K],\n storeName?: string\n ): Promise<void>\n public set(key: string, value: string, storeName?: string): Promise<void>\n public set(\n key: StorageKey | string,\n value: any,\n storeName: string = this.storeNames[0]\n ): Promise<void> {\n return this.transaction(\n 'readwrite',\n storeName,\n (store) =>\n new Promise((resolve, reject) => {\n const putRequest = store.put(value, key)\n putRequest.onsuccess = () => resolve()\n putRequest.onerror = () => reject(putRequest.error)\n })\n )\n }\n\n /**\n * Deletes an entry by key from the specified object store.\n */\n public delete<K extends StorageKey>(key: K, storeName?: string): Promise<void>\n public delete(key: string, storeName?: string): Promise<void>\n public delete(key: StorageKey | string, storeName: string = this.storeNames[0]): Promise<void> {\n return this.transaction(\n 'readwrite',\n storeName,\n (store) =>\n new Promise((resolve, reject) => {\n const deleteRequest = store.delete(key)\n deleteRequest.onsuccess = () => resolve()\n deleteRequest.onerror = () => reject(deleteRequest.error)\n })\n )\n }\n\n /**\n * Retrieves all values from the specified object store.\n */\n public getAll(storeName?: string): Promise<string[]> {\n return this.transaction(\n 'readonly',\n storeName || this.storeNames[0],\n (store) =>\n new Promise((resolve, reject) => {\n const getAllRequest = store.getAll()\n getAllRequest.onsuccess = () => resolve(getAllRequest.result)\n getAllRequest.onerror = () => reject(getAllRequest.error)\n })\n )\n }\n\n /**\n * Retrieves all keys from the specified object store.\n */\n public getAllKeys(storeName?: string): Promise<IDBValidKey[]> {\n return this.transaction(\n 'readonly',\n storeName || this.storeNames[0],\n (store) =>\n new Promise((resolve, reject) => {\n const getAllKeysRequest = store.getAllKeys()\n getAllKeysRequest.onsuccess = () => resolve(getAllKeysRequest.result)\n getAllKeysRequest.onerror = () => reject(getAllKeysRequest.error)\n })\n )\n }\n\n /**\n * Clears all entries from the specified object store.\n */\n public clearStore(storeName?: string): Promise<void> {\n return this.transaction(\n 'readwrite',\n storeName || this.storeNames[0],\n (store) =>\n new Promise((resolve, reject) => {\n const clearRequest = store.clear()\n clearRequest.onsuccess = () => resolve()\n clearRequest.onerror = () => reject(clearRequest.error)\n })\n )\n }\n\n getPrefixedKey<K extends StorageKey>(key: K): string {\n logger.debug('getPrefixedKey', key)\n throw new Error('Method not implemented.')\n }\n\n subscribeToStorageChanged(\n callback: (arg: {\n eventType: 'storageCleared' | 'entryModified'\n key: string | null\n oldValue: string | null\n newValue: string | null\n }) => {}\n ): Promise<void> {\n logger.debug('subscribeToStorageEvent', callback)\n throw new Error('Method not implemented.')\n }\n\n /**\n * Copies all key/value pairs from the source store into a target store.\n * @param targetDBName Name of the target database.\n * @param targetStoreName Name of the target object store.\n * @param skipKeys Keys to skip.\n * @param sourceStoreName (Optional) Source store name – defaults to the default store.\n */\n public async fillStore(\n targetDBName: string,\n targetStoreName: string,\n skipKeys: string[] = [],\n sourceStoreName: string = this.storeNames[0]\n ): Promise<void> {\n if (!this.isSupported) {\n logger.error('fillStore', 'IndexedDB not supported.')\n return\n }\n\n const targetDBRequest = indexedDB.open(targetDBName)\n\n targetDBRequest.onerror = (event: any) => {\n throw new Error(`Failed to open target database: ${event.target.error}`)\n }\n\n const targetDB = await new Promise<IDBDatabase>((resolve, reject) => {\n targetDBRequest.onsuccess = (event) => resolve((event.target as IDBOpenDBRequest).result)\n targetDBRequest.onerror = (event: any) => reject(event.target.error)\n })\n\n // Copy items from the source store to the target store, skipping any specified keys.\n await this.transaction('readonly', sourceStoreName, async (sourceStore) => {\n const getAllRequest = sourceStore.getAll()\n const getAllKeysRequest = sourceStore.getAllKeys()\n\n getAllRequest.onsuccess = async () => {\n getAllKeysRequest.onsuccess = async () => {\n const items = getAllRequest.result\n const keys = getAllKeysRequest.result\n\n if (!targetDB.objectStoreNames.contains(targetStoreName)) {\n logger.error(`${targetStoreName} not found. ${new Error().stack}`)\n return\n }\n\n const targetTransaction = targetDB.transaction(targetStoreName, 'readwrite')\n const targetStore = targetTransaction.objectStore(targetStoreName)\n\n keys\n .filter((key) => !skipKeys.includes(key.toString()))\n .forEach((key, index) => {\n targetStore.put(items[index], key)\n })\n\n targetTransaction.onerror = (event: any) => {\n logger.error('Transaction error: ', event.target.error)\n }\n }\n }\n getAllKeysRequest.onerror = () => {\n logger.error('Failed to getAllKeys from source:', getAllKeysRequest.error)\n }\n getAllRequest.onerror = () => {\n logger.error('Failed to getAll from source:', getAllRequest.error)\n }\n })\n }\n}\n"]}
1
+ {"version":3,"file":"IndexedDBStorage.js","sourceRoot":"","sources":["../../../src/storage/IndexedDBStorage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAoC,MAAM,8BAA8B,CAAA;AACxF,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AACxC,OAAO,EAAE,YAAY,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAA;AAElF,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,kBAAkB,CAAC,CAAA;AAE7C,MAAM,OAAO,gBAAiB,SAAQ,OAAO;IAUxB;IACA;IAVX,EAAE,GAAuB,IAAI,CAAA;IAC7B,WAAW,GAAY,IAAI,CAAA;IAEnC;;;;OAIG;IACH,YACmB,SAAiB,8BAA8B,EAC/C,aAAuB,CAAC,iBAAiB,CAAC;QAE3D,KAAK,EAAE,CAAA;QAHU,WAAM,GAAN,MAAM,CAAyC;QAC/C,eAAU,GAAV,UAAU,CAAgC;QAG3D,IAAI,CAAC,MAAM,EAAE;aACV,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;aAC5B,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAA;IAC9C,CAAC;IAEO,oBAAoB;QAC1B,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,WAAW,IAAI,MAAM,EAAE,CAAC;YAC3D,MAAM,CAAC,GAAG,CAAC,sBAAsB,EAAE,yCAAyC,CAAC,CAAA;YAC7E,OAAO,IAAI,CAAA;QACb,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE,6CAA6C,CAAC,CAAA;YACnF,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,MAAM;QAClB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAA;YAC9C,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;gBACtB,MAAM,CAAC,6BAA6B,CAAC,CAAA;gBACrC,OAAM;YACR,CAAC;YAED,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YAE/C,WAAW,CAAC,eAAe,GAAG,GAAG,EAAE;gBACjC,MAAM,EAAE,GAAG,WAAW,CAAC,MAAM,CAAA;gBAC7B,oCAAoC;gBACpC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;oBACpC,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;wBAC7C,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAA;oBACjC,CAAC;gBACH,CAAC,CAAC,CAAA;YACJ,CAAC,CAAA;YAED,WAAW,CAAC,SAAS,GAAG,CAAC,KAAU,EAAE,EAAE;gBACrC,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,MAAqB,CAAA;gBAC7C,0DAA0D;gBAC1D,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAC1C,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,SAAS,CAAC,CACxD,CAAA;gBACD,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC7B,EAAE,CAAC,KAAK,EAAE,CAAA;oBACV,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,GAAG,CAAC,CAAA;oBACjC,MAAM,cAAc,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;oBAE9D,cAAc,CAAC,eAAe,GAAG,GAAG,EAAE;wBACpC,MAAM,UAAU,GAAG,cAAc,CAAC,MAAM,CAAA;wBACxC,aAAa,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;4BAClC,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gCACrD,UAAU,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAA;4BACzC,CAAC;wBACH,CAAC,CAAC,CAAA;oBACJ,CAAC,CAAA;oBAED,cAAc,CAAC,SAAS,GAAG,CAAC,KAAU,EAAE,EAAE;wBACxC,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,MAAqB,CAAA;wBAC5C,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;oBAClB,CAAC,CAAA;oBAED,cAAc,CAAC,OAAO,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;gBACrE,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;oBACZ,OAAO,CAAC,EAAE,CAAC,CAAA;gBACb,CAAC;YACH,CAAC,CAAA;YAED,WAAW,CAAC,OAAO,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAClE,CAAC,CAAC,CAAA;IACJ,CAAC;IAED;;;;;OAKG;IACK,KAAK,CAAC,WAAW,CACvB,IAAwB,EACxB,SAAiB,EACjB,SAAgD;QAEhD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;gBACtB,MAAM,CAAC,6BAA6B,CAAC,CAAA;gBACrC,OAAM;YACR,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,gBAAgB,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gBACnD,MAAM,CAAC,GAAG,SAAS,sBAAsB,IAAI,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,CAAA;gBAC7D,OAAM;YACR,CAAC;YAED,MAAM,WAAW,GAAG,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;YACxD,MAAM,WAAW,GAAG,WAAW,CAAC,WAAW,CAAC,SAAS,CAAC,CAAA;YACtD,SAAS,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QACpD,CAAC,CAAC,CAAA;IACJ,CAAC;IAQM,GAAG,CAAC,GAAwB,EAAE,YAAoB,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QACzE,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAClC,UAAU,EACV,SAAS,EACT,CAAC,KAAK,EAAE,EAAE,CACR,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC9B,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YACjC,UAAU,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;YACvD,UAAU,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;QACrD,CAAC,CAAC,CACL,CAAA;QAED,OAAO,YAAY,CAAC,GAAG,CAAC;YACtB,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,0BAA0B,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACrE,CAAC,CAAC,WAAW,CAAA;IACjB,CAAC;IAWM,GAAG,CACR,GAAwB,EACxB,KAAU,EACV,YAAoB,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAEtC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,CAAA;QACpC,CAAC;QAED,OAAO,IAAI,CAAC,WAAW,CACrB,WAAW,EACX,SAAS,EACT,CAAC,KAAK,EAAE,EAAE,CACR,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC9B,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;YACxC,UAAU,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC,OAAO,EAAE,CAAA;YACtC,UAAU,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;QACrD,CAAC,CAAC,CACL,CAAA;IACH,CAAC;IAOM,MAAM,CAAC,GAAwB,EAAE,YAAoB,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAC5E,OAAO,IAAI,CAAC,WAAW,CACrB,WAAW,EACX,SAAS,EACT,CAAC,KAAK,EAAE,EAAE,CACR,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC9B,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YACvC,aAAa,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC,OAAO,EAAE,CAAA;YACzC,aAAa,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;QAC3D,CAAC,CAAC,CACL,CAAA;IACH,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,SAAkB;QAC9B,OAAO,IAAI,CAAC,WAAW,CACrB,UAAU,EACV,SAAS,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAC/B,CAAC,KAAK,EAAE,EAAE,CACR,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC9B,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,EAAE,CAAA;YACpC,aAAa,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;YAC7D,aAAa,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;QAC3D,CAAC,CAAC,CACL,CAAA;IACH,CAAC;IAED;;OAEG;IACI,UAAU,CAAC,SAAkB;QAClC,OAAO,IAAI,CAAC,WAAW,CACrB,UAAU,EACV,SAAS,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAC/B,CAAC,KAAK,EAAE,EAAE,CACR,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC9B,MAAM,iBAAiB,GAAG,KAAK,CAAC,UAAU,EAAE,CAAA;YAC5C,iBAAiB,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAA;YACrE,iBAAiB,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAA;QACnE,CAAC,CAAC,CACL,CAAA;IACH,CAAC;IAED;;OAEG;IACI,UAAU,CAAC,SAAkB;QAClC,OAAO,IAAI,CAAC,WAAW,CACrB,WAAW,EACX,SAAS,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAC/B,CAAC,KAAK,EAAE,EAAE,CACR,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC9B,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,EAAE,CAAA;YAClC,YAAY,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC,OAAO,EAAE,CAAA;YACxC,YAAY,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAA;QACzD,CAAC,CAAC,CACL,CAAA;IACH,CAAC;IAED,cAAc,CAAuB,GAAM;QACzC,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAA;QACnC,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAA;IAC5C,CAAC;IAED,yBAAyB,CACvB,QAKQ;QAER,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,QAAQ,CAAC,CAAA;QACjD,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAA;IAC5C,CAAC;IAED;;;;;;OAMG;IACI,KAAK,CAAC,SAAS,CACpB,YAAoB,EACpB,eAAuB,EACvB,WAAqB,EAAE,EACvB,kBAA0B,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAE5C,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,0BAA0B,CAAC,CAAA;YACrD,OAAM;QACR,CAAC;QAED,MAAM,eAAe,GAAG,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAEpD,eAAe,CAAC,OAAO,GAAG,CAAC,KAAU,EAAE,EAAE;YACvC,MAAM,IAAI,KAAK,CAAC,mCAAmC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAA;QAC1E,CAAC,CAAA;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,OAAO,CAAc,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAClE,eAAe,CAAC,SAAS,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAE,KAAK,CAAC,MAA2B,CAAC,MAAM,CAAC,CAAA;YACzF,eAAe,CAAC,OAAO,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACtE,CAAC,CAAC,CAAA;QAEF,qFAAqF;QACrF,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,eAAe,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE;YACxE,MAAM,aAAa,GAAG,WAAW,CAAC,MAAM,EAAE,CAAA;YAC1C,MAAM,iBAAiB,GAAG,WAAW,CAAC,UAAU,EAAE,CAAA;YAElD,aAAa,CAAC,SAAS,GAAG,KAAK,IAAI,EAAE;gBACnC,iBAAiB,CAAC,SAAS,GAAG,KAAK,IAAI,EAAE;oBACvC,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAA;oBAClC,MAAM,IAAI,GAAG,iBAAiB,CAAC,MAAM,CAAA;oBAErC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;wBACzD,MAAM,CAAC,KAAK,CAAC,GAAG,eAAe,eAAe,IAAI,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,CAAA;wBAClE,OAAM;oBACR,CAAC;oBAED,MAAM,iBAAiB,GAAG,QAAQ,CAAC,WAAW,CAAC,eAAe,EAAE,WAAW,CAAC,CAAA;oBAC5E,MAAM,WAAW,GAAG,iBAAiB,CAAC,WAAW,CAAC,eAAe,CAAC,CAAA;oBAElE,IAAI;yBACD,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;yBACnD,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;wBACtB,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAA;oBACpC,CAAC,CAAC,CAAA;oBAEJ,iBAAiB,CAAC,OAAO,GAAG,CAAC,KAAU,EAAE,EAAE;wBACzC,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;oBACzD,CAAC,CAAA;gBACH,CAAC,CAAA;YACH,CAAC,CAAA;YACD,iBAAiB,CAAC,OAAO,GAAG,GAAG,EAAE;gBAC/B,MAAM,CAAC,KAAK,CAAC,mCAAmC,EAAE,iBAAiB,CAAC,KAAK,CAAC,CAAA;YAC5E,CAAC,CAAA;YACD,aAAa,CAAC,OAAO,GAAG,GAAG,EAAE;gBAC3B,MAAM,CAAC,KAAK,CAAC,+BAA+B,EAAE,aAAa,CAAC,KAAK,CAAC,CAAA;YACpE,CAAC,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;CACF","sourcesContent":["import { Storage, StorageKey, StorageKeyReturnType } from '@tezos-x/octez.connect-types'\nimport { Logger } from '../utils/Logger'\nimport { isStorageKey, normalizeParsedStoredValue } from './storage-normalization'\n\nconst logger = new Logger('IndexedDBStorage')\n\nexport class IndexedDBStorage extends Storage {\n private db: IDBDatabase | null = null\n private isSupported: boolean = true\n\n /**\n * @param dbName Name of the database.\n * @param storeNames An array of object store names to create in the database.\n * The first store in the array will be used as the default if none is specified.\n */\n constructor(\n private readonly dbName: string = 'WALLET_CONNECT_V2_INDEXED_DB',\n private readonly storeNames: string[] = ['keyvaluestorage']\n ) {\n super()\n this.initDB()\n .then((db) => (this.db = db))\n .catch((err) => logger.error(err.message))\n }\n\n private isIndexedDBSupported() {\n if (typeof window !== 'undefined' && 'indexedDB' in window) {\n logger.log('isIndexedDBSupported', 'IndexedDB is supported in this browser.')\n return true\n } else {\n logger.error('isIndexedDBSupported', 'IndexedDB is not supported in this browser.')\n return false\n }\n }\n\n private async initDB(): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n this.isSupported = this.isIndexedDBSupported()\n if (!this.isSupported) {\n reject('IndexedDB is not supported.')\n return\n }\n\n const openRequest = indexedDB.open(this.dbName)\n\n openRequest.onupgradeneeded = () => {\n const db = openRequest.result\n // Create all required object stores\n this.storeNames.forEach((storeName) => {\n if (!db.objectStoreNames.contains(storeName)) {\n db.createObjectStore(storeName)\n }\n })\n }\n\n openRequest.onsuccess = (event: any) => {\n const db = event.target.result as IDBDatabase\n // Check if all stores exist – if not, perform an upgrade.\n const missingStores = this.storeNames.filter(\n (storeName) => !db.objectStoreNames.contains(storeName)\n )\n if (missingStores.length > 0) {\n db.close()\n const newVersion = db.version + 1\n const upgradeRequest = indexedDB.open(this.dbName, newVersion)\n\n upgradeRequest.onupgradeneeded = () => {\n const upgradedDB = upgradeRequest.result\n missingStores.forEach((storeName) => {\n if (!upgradedDB.objectStoreNames.contains(storeName)) {\n upgradedDB.createObjectStore(storeName)\n }\n })\n }\n\n upgradeRequest.onsuccess = (event: any) => {\n this.db = event.target.result as IDBDatabase\n resolve(this.db)\n }\n\n upgradeRequest.onerror = (event: any) => reject(event.target.error)\n } else {\n this.db = db\n resolve(db)\n }\n }\n\n openRequest.onerror = (event: any) => reject(event.target.error)\n })\n }\n\n /**\n * Performs a transaction on the given object store.\n * @param mode Transaction mode.\n * @param storeName The name of the object store.\n * @param operation The operation to perform with the object store.\n */\n private async transaction<T>(\n mode: IDBTransactionMode,\n storeName: string,\n operation: (store: IDBObjectStore) => Promise<T>\n ): Promise<T> {\n return new Promise((resolve, reject) => {\n if (!this.isSupported) {\n reject('IndexedDB is not supported.')\n return\n }\n\n if (!this.db?.objectStoreNames.contains(storeName)) {\n reject(`${storeName} not found. error: ${new Error().stack}`)\n return\n }\n\n const transaction = this.db.transaction(storeName, mode)\n const objectStore = transaction.objectStore(storeName)\n operation(objectStore).then(resolve).catch(reject)\n })\n }\n\n /**\n * Retrieves a value by key from the specified object store.\n * If no store is specified, the default (first in the list) is used.\n */\n public get<K extends StorageKey>(key: K, storeName?: string): Promise<StorageKeyReturnType[K]>\n public get(key: string, storeName?: string): Promise<string | undefined>\n public get(key: StorageKey | string, storeName: string = this.storeNames[0]): Promise<any> {\n const storedValue = this.transaction(\n 'readonly',\n storeName,\n (store) =>\n new Promise((resolve, reject) => {\n const getRequest = store.get(key)\n getRequest.onsuccess = () => resolve(getRequest.result)\n getRequest.onerror = () => reject(getRequest.error)\n })\n )\n\n return isStorageKey(key)\n ? storedValue.then((value) => normalizeParsedStoredValue(key, value))\n : storedValue\n }\n\n /**\n * Stores a key/value pair in the specified object store.\n */\n public set<K extends StorageKey>(\n key: K,\n value: StorageKeyReturnType[K],\n storeName?: string\n ): Promise<void>\n public set(key: string, value: string, storeName?: string): Promise<void>\n public set(\n key: StorageKey | string,\n value: any,\n storeName: string = this.storeNames[0]\n ): Promise<void> {\n if (value === undefined) {\n return this.delete(key, storeName)\n }\n\n return this.transaction(\n 'readwrite',\n storeName,\n (store) =>\n new Promise((resolve, reject) => {\n const putRequest = store.put(value, key)\n putRequest.onsuccess = () => resolve()\n putRequest.onerror = () => reject(putRequest.error)\n })\n )\n }\n\n /**\n * Deletes an entry by key from the specified object store.\n */\n public delete<K extends StorageKey>(key: K, storeName?: string): Promise<void>\n public delete(key: string, storeName?: string): Promise<void>\n public delete(key: StorageKey | string, storeName: string = this.storeNames[0]): Promise<void> {\n return this.transaction(\n 'readwrite',\n storeName,\n (store) =>\n new Promise((resolve, reject) => {\n const deleteRequest = store.delete(key)\n deleteRequest.onsuccess = () => resolve()\n deleteRequest.onerror = () => reject(deleteRequest.error)\n })\n )\n }\n\n /**\n * Retrieves all values from the specified object store.\n */\n public getAll(storeName?: string): Promise<string[]> {\n return this.transaction(\n 'readonly',\n storeName || this.storeNames[0],\n (store) =>\n new Promise((resolve, reject) => {\n const getAllRequest = store.getAll()\n getAllRequest.onsuccess = () => resolve(getAllRequest.result)\n getAllRequest.onerror = () => reject(getAllRequest.error)\n })\n )\n }\n\n /**\n * Retrieves all keys from the specified object store.\n */\n public getAllKeys(storeName?: string): Promise<IDBValidKey[]> {\n return this.transaction(\n 'readonly',\n storeName || this.storeNames[0],\n (store) =>\n new Promise((resolve, reject) => {\n const getAllKeysRequest = store.getAllKeys()\n getAllKeysRequest.onsuccess = () => resolve(getAllKeysRequest.result)\n getAllKeysRequest.onerror = () => reject(getAllKeysRequest.error)\n })\n )\n }\n\n /**\n * Clears all entries from the specified object store.\n */\n public clearStore(storeName?: string): Promise<void> {\n return this.transaction(\n 'readwrite',\n storeName || this.storeNames[0],\n (store) =>\n new Promise((resolve, reject) => {\n const clearRequest = store.clear()\n clearRequest.onsuccess = () => resolve()\n clearRequest.onerror = () => reject(clearRequest.error)\n })\n )\n }\n\n getPrefixedKey<K extends StorageKey>(key: K): string {\n logger.debug('getPrefixedKey', key)\n throw new Error('Method not implemented.')\n }\n\n subscribeToStorageChanged(\n callback: (arg: {\n eventType: 'storageCleared' | 'entryModified'\n key: string | null\n oldValue: string | null\n newValue: string | null\n }) => {}\n ): Promise<void> {\n logger.debug('subscribeToStorageEvent', callback)\n throw new Error('Method not implemented.')\n }\n\n /**\n * Copies all key/value pairs from the source store into a target store.\n * @param targetDBName Name of the target database.\n * @param targetStoreName Name of the target object store.\n * @param skipKeys Keys to skip.\n * @param sourceStoreName (Optional) Source store name – defaults to the default store.\n */\n public async fillStore(\n targetDBName: string,\n targetStoreName: string,\n skipKeys: string[] = [],\n sourceStoreName: string = this.storeNames[0]\n ): Promise<void> {\n if (!this.isSupported) {\n logger.error('fillStore', 'IndexedDB not supported.')\n return\n }\n\n const targetDBRequest = indexedDB.open(targetDBName)\n\n targetDBRequest.onerror = (event: any) => {\n throw new Error(`Failed to open target database: ${event.target.error}`)\n }\n\n const targetDB = await new Promise<IDBDatabase>((resolve, reject) => {\n targetDBRequest.onsuccess = (event) => resolve((event.target as IDBOpenDBRequest).result)\n targetDBRequest.onerror = (event: any) => reject(event.target.error)\n })\n\n // Copy items from the source store to the target store, skipping any specified keys.\n await this.transaction('readonly', sourceStoreName, async (sourceStore) => {\n const getAllRequest = sourceStore.getAll()\n const getAllKeysRequest = sourceStore.getAllKeys()\n\n getAllRequest.onsuccess = async () => {\n getAllKeysRequest.onsuccess = async () => {\n const items = getAllRequest.result\n const keys = getAllKeysRequest.result\n\n if (!targetDB.objectStoreNames.contains(targetStoreName)) {\n logger.error(`${targetStoreName} not found. ${new Error().stack}`)\n return\n }\n\n const targetTransaction = targetDB.transaction(targetStoreName, 'readwrite')\n const targetStore = targetTransaction.objectStore(targetStoreName)\n\n keys\n .filter((key) => !skipKeys.includes(key.toString()))\n .forEach((key, index) => {\n targetStore.put(items[index], key)\n })\n\n targetTransaction.onerror = (event: any) => {\n logger.error('Transaction error: ', event.target.error)\n }\n }\n }\n getAllKeysRequest.onerror = () => {\n logger.error('Failed to getAllKeys from source:', getAllKeysRequest.error)\n }\n getAllRequest.onerror = () => {\n logger.error('Failed to getAll from source:', getAllRequest.error)\n }\n })\n }\n}\n"]}
@@ -1,4 +1,5 @@
1
- import { Storage, defaultValues } from '@tezos-x/octez.connect-types';
1
+ import { Storage } from '@tezos-x/octez.connect-types';
2
+ import { normalizeStoredValue } from './storage-normalization';
2
3
  /**
3
4
  * @internalapi
4
5
  *
@@ -15,24 +16,12 @@ export class LocalStorage extends Storage {
15
16
  }
16
17
  async get(key) {
17
18
  const value = localStorage.getItem(this.getPrefixedKey(key));
18
- if (!value) {
19
- if (typeof defaultValues[key] === 'object') {
20
- return JSON.parse(JSON.stringify(defaultValues[key]));
21
- }
22
- else {
23
- return defaultValues[key];
24
- }
25
- }
26
- else {
27
- try {
28
- return JSON.parse(value);
29
- }
30
- catch (jsonParseError) {
31
- return value; // TODO: Validate storage
32
- }
33
- }
19
+ return normalizeStoredValue(key, value);
34
20
  }
35
21
  async set(key, value) {
22
+ if (value === undefined) {
23
+ return this.delete(key);
24
+ }
36
25
  if (typeof value === 'string') {
37
26
  return localStorage.setItem(this.getPrefixedKey(key), value);
38
27
  }
@@ -1 +1 @@
1
- {"version":3,"file":"LocalStorage.js","sourceRoot":"","sources":["../../../src/storage/LocalStorage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAoC,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAEvG;;;;GAIG;AACH,MAAM,OAAO,YAAa,SAAQ,OAAO;IACV;IAA7B,YAA6B,MAAe;QAC1C,KAAK,EAAE,CAAA;QADoB,WAAM,GAAN,MAAM,CAAS;IAE5C,CAAC;IACM,MAAM,CAAC,KAAK,CAAC,WAAW;QAC7B,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,MAAM,KAAK,WAAW,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAA;IAChG,CAAC;IAEM,KAAK,CAAC,GAAG,CAAuB,GAAM;QAC3C,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAA;QAC5D,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,OAAO,aAAa,CAAC,GAAG,CAAC,KAAK,QAAQ,EAAE,CAAC;gBAC3C,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YACvD,CAAC;iBAAM,CAAC;gBACN,OAAO,aAAa,CAAC,GAAG,CAAC,CAAA;YAC3B,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC;gBACH,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;YAC1B,CAAC;YAAC,OAAO,cAAc,EAAE,CAAC;gBACxB,OAAO,KAAgC,CAAA,CAAC,yBAAyB;YACnE,CAAC;QACH,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,GAAG,CAAuB,GAAM,EAAE,KAA8B;QAC3E,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAA;QAC9D,CAAC;aAAM,CAAC;YACN,OAAO,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAA;QAC9E,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,MAAM,CAAuB,GAAM;QAC9C,OAAO,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IAC3E,CAAC;IAEM,KAAK,CAAC,yBAAyB,CACpC,QAKQ;QAER,MAAM,CAAC,gBAAgB,CACrB,SAAS,EACT,CAAC,KAAK,EAAE,EAAE;YACR,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;gBACf,QAAQ,CAAC;oBACP,SAAS,EAAE,gBAAgB;oBAC3B,GAAG,EAAE,IAAI;oBACT,QAAQ,EAAE,IAAI;oBACd,QAAQ,EAAE,IAAI;iBACf,CAAC,CAAA;YACJ,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC;oBACP,SAAS,EAAE,eAAe;oBAC1B,GAAG,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC;oBACnC,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;iBACzB,CAAC,CAAA;YACJ,CAAC;QACH,CAAC,EACD,KAAK,CACN,CAAA;IACH,CAAC;IAEM,cAAc,CAAC,GAAW;QAC/B,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAA;IACpD,CAAC;CACF","sourcesContent":["import { Storage, StorageKey, StorageKeyReturnType, defaultValues } from '@tezos-x/octez.connect-types'\n\n/**\n * @internalapi\n *\n * A storage that can be used in the browser\n */\nexport class LocalStorage extends Storage {\n constructor(private readonly prefix?: string) {\n super()\n }\n public static async isSupported(): Promise<boolean> {\n return Promise.resolve(Boolean(typeof window !== 'undefined') && Boolean(window.localStorage))\n }\n\n public async get<K extends StorageKey>(key: K): Promise<StorageKeyReturnType[K]> {\n const value = localStorage.getItem(this.getPrefixedKey(key))\n if (!value) {\n if (typeof defaultValues[key] === 'object') {\n return JSON.parse(JSON.stringify(defaultValues[key]))\n } else {\n return defaultValues[key]\n }\n } else {\n try {\n return JSON.parse(value)\n } catch (jsonParseError) {\n return value as StorageKeyReturnType[K] // TODO: Validate storage\n }\n }\n }\n\n public async set<K extends StorageKey>(key: K, value: StorageKeyReturnType[K]): Promise<void> {\n if (typeof value === 'string') {\n return localStorage.setItem(this.getPrefixedKey(key), value)\n } else {\n return localStorage.setItem(this.getPrefixedKey(key), JSON.stringify(value))\n }\n }\n\n public async delete<K extends StorageKey>(key: K): Promise<void> {\n return Promise.resolve(localStorage.removeItem(this.getPrefixedKey(key)))\n }\n\n public async subscribeToStorageChanged(\n callback: (arg: {\n eventType: 'storageCleared' | 'entryModified'\n key: string | null\n oldValue: string | null\n newValue: string | null\n }) => {}\n ): Promise<void> {\n window.addEventListener(\n 'storage',\n (event) => {\n if (!event.key) {\n callback({\n eventType: 'storageCleared',\n key: null,\n oldValue: null,\n newValue: null\n })\n } else {\n callback({\n eventType: 'entryModified',\n key: this.getPrefixedKey(event.key),\n oldValue: event.oldValue,\n newValue: event.newValue\n })\n }\n },\n false\n )\n }\n\n public getPrefixedKey(key: string): string {\n return this.prefix ? `${this.prefix}-${key}` : key\n }\n}\n"]}
1
+ {"version":3,"file":"LocalStorage.js","sourceRoot":"","sources":["../../../src/storage/LocalStorage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAoC,MAAM,8BAA8B,CAAA;AACxF,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAE9D;;;;GAIG;AACH,MAAM,OAAO,YAAa,SAAQ,OAAO;IACV;IAA7B,YAA6B,MAAe;QAC1C,KAAK,EAAE,CAAA;QADoB,WAAM,GAAN,MAAM,CAAS;IAE5C,CAAC;IACM,MAAM,CAAC,KAAK,CAAC,WAAW;QAC7B,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,MAAM,KAAK,WAAW,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAA;IAChG,CAAC;IAEM,KAAK,CAAC,GAAG,CAAuB,GAAM;QAC3C,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAA;QAE5D,OAAO,oBAAoB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IACzC,CAAC;IAEM,KAAK,CAAC,GAAG,CAAuB,GAAM,EAAE,KAA8B;QAC3E,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QACzB,CAAC;QAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAA;QAC9D,CAAC;aAAM,CAAC;YACN,OAAO,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAA;QAC9E,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,MAAM,CAAuB,GAAM;QAC9C,OAAO,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IAC3E,CAAC;IAEM,KAAK,CAAC,yBAAyB,CACpC,QAKQ;QAER,MAAM,CAAC,gBAAgB,CACrB,SAAS,EACT,CAAC,KAAK,EAAE,EAAE;YACR,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;gBACf,QAAQ,CAAC;oBACP,SAAS,EAAE,gBAAgB;oBAC3B,GAAG,EAAE,IAAI;oBACT,QAAQ,EAAE,IAAI;oBACd,QAAQ,EAAE,IAAI;iBACf,CAAC,CAAA;YACJ,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC;oBACP,SAAS,EAAE,eAAe;oBAC1B,GAAG,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC;oBACnC,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;iBACzB,CAAC,CAAA;YACJ,CAAC;QACH,CAAC,EACD,KAAK,CACN,CAAA;IACH,CAAC;IAEM,cAAc,CAAC,GAAW;QAC/B,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAA;IACpD,CAAC;CACF","sourcesContent":["import { Storage, StorageKey, StorageKeyReturnType } from '@tezos-x/octez.connect-types'\nimport { normalizeStoredValue } from './storage-normalization'\n\n/**\n * @internalapi\n *\n * A storage that can be used in the browser\n */\nexport class LocalStorage extends Storage {\n constructor(private readonly prefix?: string) {\n super()\n }\n public static async isSupported(): Promise<boolean> {\n return Promise.resolve(Boolean(typeof window !== 'undefined') && Boolean(window.localStorage))\n }\n\n public async get<K extends StorageKey>(key: K): Promise<StorageKeyReturnType[K]> {\n const value = localStorage.getItem(this.getPrefixedKey(key))\n\n return normalizeStoredValue(key, value)\n }\n\n public async set<K extends StorageKey>(key: K, value: StorageKeyReturnType[K]): Promise<void> {\n if (value === undefined) {\n return this.delete(key)\n }\n\n if (typeof value === 'string') {\n return localStorage.setItem(this.getPrefixedKey(key), value)\n } else {\n return localStorage.setItem(this.getPrefixedKey(key), JSON.stringify(value))\n }\n }\n\n public async delete<K extends StorageKey>(key: K): Promise<void> {\n return Promise.resolve(localStorage.removeItem(this.getPrefixedKey(key)))\n }\n\n public async subscribeToStorageChanged(\n callback: (arg: {\n eventType: 'storageCleared' | 'entryModified'\n key: string | null\n oldValue: string | null\n newValue: string | null\n }) => {}\n ): Promise<void> {\n window.addEventListener(\n 'storage',\n (event) => {\n if (!event.key) {\n callback({\n eventType: 'storageCleared',\n key: null,\n oldValue: null,\n newValue: null\n })\n } else {\n callback({\n eventType: 'entryModified',\n key: this.getPrefixedKey(event.key),\n oldValue: event.oldValue,\n newValue: event.newValue\n })\n }\n },\n false\n )\n }\n\n public getPrefixedKey(key: string): string {\n return this.prefix ? `${this.prefix}-${key}` : key\n }\n}\n"]}
@@ -1,7 +1,6 @@
1
1
  export declare class WCStorage {
2
- private readonly localStorage;
3
2
  private readonly indexedDB;
4
- private channel;
3
+ private readonly channel;
5
4
  onMessageHandler: ((type: string) => void) | undefined;
6
5
  onErrorHandler: ((data: any) => void) | undefined;
7
6
  constructor();
@@ -1,8 +1,40 @@
1
1
  import { StorageKey } from '@tezos-x/octez.connect-types';
2
2
  import { LocalStorage } from './LocalStorage';
3
3
  import { IndexedDBStorage } from './IndexedDBStorage';
4
+ const parseStorageArray = (value) => {
5
+ try {
6
+ return JSON.parse(value);
7
+ }
8
+ catch {
9
+ return undefined;
10
+ }
11
+ };
12
+ const hasNonEmptyWalletConnectStorageValue = (value) => {
13
+ if (!value) {
14
+ return false;
15
+ }
16
+ const parsedValue = parseStorageArray(value);
17
+ return Array.isArray(parsedValue) && parsedValue.length > 0;
18
+ };
19
+ const isWalletConnectLocalStorageKey = (key, name) => {
20
+ if (!key.includes('wc@2:')) {
21
+ return false;
22
+ }
23
+ return name ? key.endsWith(name) : true;
24
+ };
25
+ // WalletConnect owns its prefix; Airgap's StorageKey enum does not match WC's emitted key shape.
26
+ const getWalletConnectLocalStorageKeys = (name) => {
27
+ const keys = [];
28
+ for (let i = 0; i < localStorage.length; i++) {
29
+ const key = localStorage.key(i);
30
+ if (key && isWalletConnectLocalStorageKey(key, name)) {
31
+ keys.push(key);
32
+ }
33
+ }
34
+ return keys;
35
+ };
36
+ const hasNonEmptyWalletConnectLocalStorageEntries = (name) => getWalletConnectLocalStorageKeys(name).some((key) => hasNonEmptyWalletConnectStorageValue(localStorage.getItem(key) ?? undefined));
4
37
  export class WCStorage {
5
- localStorage = new LocalStorage();
6
38
  indexedDB = new IndexedDBStorage();
7
39
  channel = new BroadcastChannel('WALLET_CONNECT_V2_INDEXED_DB');
8
40
  onMessageHandler;
@@ -21,22 +53,22 @@ export class WCStorage {
21
53
  this.channel?.postMessage({ type });
22
54
  }
23
55
  async hasPairings() {
24
- const pairings = (await this.indexedDB.get(StorageKey.WC_2_CORE_PAIRING)) ?? '[]';
25
- if (pairings.length) {
56
+ const pairings = await this.indexedDB.get(StorageKey.WC_2_CORE_PAIRING);
57
+ if (hasNonEmptyWalletConnectStorageValue(pairings)) {
26
58
  return true;
27
59
  }
28
60
  if (await LocalStorage.isSupported()) {
29
- return ((await this.localStorage.get(StorageKey.WC_2_CORE_PAIRING)) ?? '[]') !== '[]';
61
+ return hasNonEmptyWalletConnectLocalStorageEntries('pairing');
30
62
  }
31
63
  return false;
32
64
  }
33
65
  async hasSessions() {
34
- const sessions = (await this.indexedDB.get(StorageKey.WC_2_CLIENT_SESSION)) ?? '[]';
35
- if (sessions.length) {
66
+ const sessions = await this.indexedDB.get(StorageKey.WC_2_CLIENT_SESSION);
67
+ if (hasNonEmptyWalletConnectStorageValue(sessions)) {
36
68
  return true;
37
69
  }
38
70
  if (await LocalStorage.isSupported()) {
39
- return ((await this.localStorage.get(StorageKey.WC_2_CLIENT_SESSION)) ?? '[]') !== '[]';
71
+ return hasNonEmptyWalletConnectLocalStorageEntries('session');
40
72
  }
41
73
  return false;
42
74
  }
@@ -48,16 +80,7 @@ export class WCStorage {
48
80
  async resetState() {
49
81
  await this.indexedDB.clearStore();
50
82
  if (await LocalStorage.isSupported()) {
51
- await Promise.all([
52
- this.localStorage.delete(StorageKey.WC_2_CLIENT_SESSION),
53
- this.localStorage.delete(StorageKey.WC_2_CORE_PAIRING),
54
- this.localStorage.delete(StorageKey.WC_2_CORE_KEYCHAIN),
55
- this.localStorage.delete(StorageKey.WC_2_CORE_MESSAGES),
56
- this.localStorage.delete(StorageKey.WC_2_CLIENT_PROPOSAL),
57
- this.localStorage.delete(StorageKey.WC_2_CORE_SUBSCRIPTION),
58
- this.localStorage.delete(StorageKey.WC_2_CORE_HISTORY),
59
- this.localStorage.delete(StorageKey.WC_2_CORE_EXPIRER)
60
- ]);
83
+ getWalletConnectLocalStorageKeys().forEach((key) => localStorage.removeItem(key));
61
84
  }
62
85
  }
63
86
  }
@@ -1 +1 @@
1
- {"version":3,"file":"WCStorage.js","sourceRoot":"","sources":["../../../src/storage/WCStorage.ts"],"names":[],"mappings":"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","sourcesContent":["import { StorageKey } from '@tezos-x/octez.connect-types'\nimport { LocalStorage } from './LocalStorage'\nimport { IndexedDBStorage } from './IndexedDBStorage'\n\nexport class WCStorage {\n private readonly localStorage = new LocalStorage()\n private readonly indexedDB = new IndexedDBStorage()\n private channel: BroadcastChannel = new BroadcastChannel('WALLET_CONNECT_V2_INDEXED_DB')\n onMessageHandler: ((type: string) => void) | undefined\n onErrorHandler: ((data: any) => void) | undefined\n\n constructor() {\n this.channel.onmessage = this.onMessage.bind(this)\n this.channel.onmessageerror = this.onError.bind(this)\n }\n\n private onMessage(message: MessageEvent) {\n this.onMessageHandler && this.onMessageHandler(message.data.type)\n }\n\n private onError({ data }: MessageEvent) {\n this.onErrorHandler && this.onErrorHandler(data)\n }\n\n notify(type: string) {\n this.channel?.postMessage({ type })\n }\n\n async hasPairings() {\n const pairings = (await this.indexedDB.get(StorageKey.WC_2_CORE_PAIRING)) ?? '[]'\n\n if (pairings.length) {\n return true\n }\n\n if (await LocalStorage.isSupported()) {\n return ((await this.localStorage.get(StorageKey.WC_2_CORE_PAIRING)) ?? '[]') !== '[]'\n }\n\n return false\n }\n\n async hasSessions() {\n const sessions = (await this.indexedDB.get(StorageKey.WC_2_CLIENT_SESSION)) ?? '[]'\n\n if (sessions.length) {\n return true\n }\n\n if (await LocalStorage.isSupported()) {\n return ((await this.localStorage.get(StorageKey.WC_2_CLIENT_SESSION)) ?? '[]') !== '[]'\n }\n\n return false\n }\n\n backup() {\n this.indexedDB\n .fillStore('beacon', 'bug_report', [StorageKey.WC_2_CORE_KEYCHAIN])\n .catch((error) => console.error(error.message))\n }\n\n async resetState() {\n await this.indexedDB.clearStore()\n\n if (await LocalStorage.isSupported()) {\n await Promise.all([\n this.localStorage.delete(StorageKey.WC_2_CLIENT_SESSION),\n this.localStorage.delete(StorageKey.WC_2_CORE_PAIRING),\n this.localStorage.delete(StorageKey.WC_2_CORE_KEYCHAIN),\n this.localStorage.delete(StorageKey.WC_2_CORE_MESSAGES),\n this.localStorage.delete(StorageKey.WC_2_CLIENT_PROPOSAL),\n this.localStorage.delete(StorageKey.WC_2_CORE_SUBSCRIPTION),\n this.localStorage.delete(StorageKey.WC_2_CORE_HISTORY),\n this.localStorage.delete(StorageKey.WC_2_CORE_EXPIRER)\n ])\n }\n }\n}\n"]}
1
+ {"version":3,"file":"WCStorage.js","sourceRoot":"","sources":["../../../src/storage/WCStorage.ts"],"names":[],"mappings":"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","sourcesContent":["import { StorageKey } from '@tezos-x/octez.connect-types'\nimport { LocalStorage } from './LocalStorage'\nimport { IndexedDBStorage } from './IndexedDBStorage'\n\nconst parseStorageArray = (value: string): unknown => {\n try {\n return JSON.parse(value)\n } catch {\n return undefined\n }\n}\n\nconst hasNonEmptyWalletConnectStorageValue = (value: string | undefined): boolean => {\n if (!value) {\n return false\n }\n\n const parsedValue = parseStorageArray(value)\n\n return Array.isArray(parsedValue) && parsedValue.length > 0\n}\n\nconst isWalletConnectLocalStorageKey = (key: string, name?: string): boolean => {\n if (!key.includes('wc@2:')) {\n return false\n }\n\n return name ? key.endsWith(name) : true\n}\n\n// WalletConnect owns its prefix; Airgap's StorageKey enum does not match WC's emitted key shape.\nconst getWalletConnectLocalStorageKeys = (name?: string): string[] => {\n const keys: string[] = []\n\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i)\n\n if (key && isWalletConnectLocalStorageKey(key, name)) {\n keys.push(key)\n }\n }\n\n return keys\n}\n\nconst hasNonEmptyWalletConnectLocalStorageEntries = (name: string): boolean =>\n getWalletConnectLocalStorageKeys(name).some((key) =>\n hasNonEmptyWalletConnectStorageValue(localStorage.getItem(key) ?? undefined)\n )\n\nexport class WCStorage {\n private readonly indexedDB = new IndexedDBStorage()\n private readonly channel: BroadcastChannel = new BroadcastChannel('WALLET_CONNECT_V2_INDEXED_DB')\n onMessageHandler: ((type: string) => void) | undefined\n onErrorHandler: ((data: any) => void) | undefined\n\n constructor() {\n this.channel.onmessage = this.onMessage.bind(this)\n this.channel.onmessageerror = this.onError.bind(this)\n }\n\n private onMessage(message: MessageEvent) {\n this.onMessageHandler && this.onMessageHandler(message.data.type)\n }\n\n private onError({ data }: MessageEvent) {\n this.onErrorHandler && this.onErrorHandler(data)\n }\n\n notify(type: string) {\n this.channel?.postMessage({ type })\n }\n\n async hasPairings() {\n const pairings = await this.indexedDB.get(StorageKey.WC_2_CORE_PAIRING)\n\n if (hasNonEmptyWalletConnectStorageValue(pairings)) {\n return true\n }\n\n if (await LocalStorage.isSupported()) {\n return hasNonEmptyWalletConnectLocalStorageEntries('pairing')\n }\n\n return false\n }\n\n async hasSessions() {\n const sessions = await this.indexedDB.get(StorageKey.WC_2_CLIENT_SESSION)\n\n if (hasNonEmptyWalletConnectStorageValue(sessions)) {\n return true\n }\n\n if (await LocalStorage.isSupported()) {\n return hasNonEmptyWalletConnectLocalStorageEntries('session')\n }\n\n return false\n }\n\n backup() {\n this.indexedDB\n .fillStore('beacon', 'bug_report', [StorageKey.WC_2_CORE_KEYCHAIN])\n .catch((error) => console.error(error.message))\n }\n\n async resetState() {\n await this.indexedDB.clearStore()\n\n if (await LocalStorage.isSupported()) {\n getWalletConnectLocalStorageKeys().forEach((key) => localStorage.removeItem(key))\n }\n }\n}\n"]}
@@ -0,0 +1,9 @@
1
+ import { StorageKey, StorageKeyReturnType } from '@tezos-x/octez.connect-types';
2
+ export declare const ARRAY_STORAGE_KEYS: Set<StorageKey>;
3
+ export declare const BOOLEAN_STORAGE_KEYS: Set<StorageKey>;
4
+ export declare const OBJECT_STORAGE_KEYS: Set<StorageKey>;
5
+ export declare const STRING_STORAGE_KEYS: Set<StorageKey>;
6
+ export declare const normalizeParsedStoredValue: <K extends StorageKey>(key: K, value: unknown) => StorageKeyReturnType[K];
7
+ export declare const normalizeStoredValue: <K extends StorageKey>(key: K, rawValue: string | null | undefined) => StorageKeyReturnType[K];
8
+ export declare const isStorageKey: (key: string) => key is StorageKey;
9
+ export declare const assertStorageKeyNormalizationIsExhaustive: (expectedStorageKeys?: readonly string[]) => void;
@@ -0,0 +1,128 @@
1
+ import { StorageKey, defaultValues } from '@tezos-x/octez.connect-types';
2
+ export const ARRAY_STORAGE_KEYS = new Set([
3
+ StorageKey.TRANSPORT_P2P_PEERS_DAPP,
4
+ StorageKey.TRANSPORT_P2P_PEERS_WALLET,
5
+ StorageKey.TRANSPORT_POSTMESSAGE_PEERS_DAPP,
6
+ StorageKey.TRANSPORT_POSTMESSAGE_PEERS_WALLET,
7
+ StorageKey.TRANSPORT_WALLETCONNECT_PEERS_DAPP,
8
+ StorageKey.ACCOUNTS,
9
+ StorageKey.PUSH_TOKENS,
10
+ StorageKey.APP_METADATA_LIST,
11
+ StorageKey.PERMISSION_LIST,
12
+ StorageKey.ONGOING_PROOF_OF_EVENT_CHALLENGES
13
+ ]);
14
+ export const BOOLEAN_STORAGE_KEYS = new Set([
15
+ StorageKey.MULTI_NODE_SETUP_DONE,
16
+ StorageKey.ENABLE_METRICS
17
+ ]);
18
+ export const OBJECT_STORAGE_KEYS = new Set([
19
+ StorageKey.LAST_SELECTED_WALLET,
20
+ StorageKey.MATRIX_PRESERVED_STATE,
21
+ StorageKey.MATRIX_PEER_ROOM_IDS
22
+ ]);
23
+ export const STRING_STORAGE_KEYS = new Set([
24
+ StorageKey.ACTIVE_ACCOUNT,
25
+ StorageKey.BEACON_SDK_SECRET_SEED,
26
+ StorageKey.BEACON_LAST_ERROR,
27
+ StorageKey.BEACON_SDK_VERSION,
28
+ StorageKey.MATRIX_SELECTED_NODE,
29
+ StorageKey.USER_ID,
30
+ StorageKey.WC_INIT_ERROR,
31
+ StorageKey.WC_2_CLIENT_SESSION,
32
+ StorageKey.WC_2_CORE_PAIRING,
33
+ StorageKey.WC_2_CORE_KEYCHAIN,
34
+ StorageKey.WC_2_CORE_MESSAGES,
35
+ StorageKey.WC_2_CLIENT_PROPOSAL,
36
+ StorageKey.WC_2_CORE_SUBSCRIPTION,
37
+ StorageKey.WC_2_CORE_HISTORY,
38
+ StorageKey.WC_2_CORE_EXPIRER
39
+ ]);
40
+ const SENTINEL_STRINGS = new Set(['undefined', 'null']);
41
+ const CLASSIFIED_STORAGE_KEYS = [
42
+ ...ARRAY_STORAGE_KEYS,
43
+ ...BOOLEAN_STORAGE_KEYS,
44
+ ...OBJECT_STORAGE_KEYS,
45
+ ...STRING_STORAGE_KEYS
46
+ ];
47
+ const STORAGE_KEY_VALUES = new Set(Object.values(StorageKey));
48
+ const isRecord = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
49
+ const defaultValue = (key) => {
50
+ const value = defaultValues[key];
51
+ return (isRecord(value) || Array.isArray(value) ? JSON.parse(JSON.stringify(value)) : value);
52
+ };
53
+ const parseStringifiedString = (rawValue) => {
54
+ try {
55
+ return JSON.parse(rawValue);
56
+ }
57
+ catch {
58
+ return undefined;
59
+ }
60
+ };
61
+ const parseStoredValue = (rawValue) => {
62
+ try {
63
+ return JSON.parse(rawValue);
64
+ }
65
+ catch {
66
+ return rawValue;
67
+ }
68
+ };
69
+ const normalizeRawStringValue = (key, rawValue) => {
70
+ // STRING keys are SDK-controlled identifiers and serialized WalletConnect blobs, not free-form text.
71
+ if (!rawValue.startsWith('"')) {
72
+ return rawValue;
73
+ }
74
+ const parsedValue = parseStringifiedString(rawValue);
75
+ if (typeof parsedValue !== 'string' || !parsedValue || SENTINEL_STRINGS.has(parsedValue)) {
76
+ return defaultValue(key);
77
+ }
78
+ return parsedValue;
79
+ };
80
+ const formatKeys = (keys) => keys.length === 0 ? 'none' : keys.join(', ');
81
+ export const normalizeParsedStoredValue = (key, value) => {
82
+ if (value === undefined ||
83
+ value === null ||
84
+ (typeof value === 'string' && (!value || SENTINEL_STRINGS.has(value)))) {
85
+ return defaultValue(key);
86
+ }
87
+ if (ARRAY_STORAGE_KEYS.has(key)) {
88
+ return (Array.isArray(value) ? value : defaultValue(key));
89
+ }
90
+ if (BOOLEAN_STORAGE_KEYS.has(key)) {
91
+ return (typeof value === 'boolean' ? value : defaultValue(key));
92
+ }
93
+ if (OBJECT_STORAGE_KEYS.has(key)) {
94
+ return (isRecord(value) ? value : defaultValue(key));
95
+ }
96
+ if (STRING_STORAGE_KEYS.has(key)) {
97
+ return (typeof value === 'string' ? value : defaultValue(key));
98
+ }
99
+ return defaultValue(key);
100
+ };
101
+ // LocalStorage exposes raw strings; Chrome and IndexedDB expose already-decoded JS values.
102
+ export const normalizeStoredValue = (key, rawValue) => {
103
+ if (!rawValue || SENTINEL_STRINGS.has(rawValue)) {
104
+ return defaultValue(key);
105
+ }
106
+ if (STRING_STORAGE_KEYS.has(key)) {
107
+ return normalizeRawStringValue(key, rawValue);
108
+ }
109
+ return normalizeParsedStoredValue(key, parseStoredValue(rawValue));
110
+ };
111
+ export const isStorageKey = (key) => STORAGE_KEY_VALUES.has(key);
112
+ export const assertStorageKeyNormalizationIsExhaustive = (expectedStorageKeys = Object.values(StorageKey)) => {
113
+ const expectedKeys = new Set(expectedStorageKeys);
114
+ const classifiedKeyValues = new Set(CLASSIFIED_STORAGE_KEYS);
115
+ const missingKeys = expectedStorageKeys.filter((key) => !classifiedKeyValues.has(key));
116
+ const extraKeys = CLASSIFIED_STORAGE_KEYS.filter((key) => !expectedKeys.has(key));
117
+ const duplicateKeys = CLASSIFIED_STORAGE_KEYS.filter((key, index) => CLASSIFIED_STORAGE_KEYS.indexOf(key) !== index);
118
+ if (missingKeys.length > 0 || extraKeys.length > 0 || duplicateKeys.length > 0) {
119
+ throw new Error([
120
+ 'Storage normalization keys are not exhaustive.',
121
+ `Missing: ${formatKeys(missingKeys)}.`,
122
+ `Extra: ${formatKeys(extraKeys)}.`,
123
+ `Duplicate: ${formatKeys(duplicateKeys)}.`
124
+ ].join(' '));
125
+ }
126
+ };
127
+ assertStorageKeyNormalizationIsExhaustive();
128
+ //# sourceMappingURL=storage-normalization.js.map