@tezos-x/octez.connect-core 4.8.4 → 4.8.5
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.
- package/dist/cjs/clients/client/Client.d.ts +6 -1
- package/dist/cjs/clients/client/Client.js +17 -4
- package/dist/cjs/clients/client/Client.js.map +1 -1
- package/dist/cjs/constants.js +1 -1
- package/dist/cjs/constants.js.map +1 -1
- package/dist/cjs/errors/PeerUnreachableBeaconError.d.ts +9 -0
- package/dist/cjs/errors/PeerUnreachableBeaconError.js +17 -0
- package/dist/cjs/errors/PeerUnreachableBeaconError.js.map +1 -0
- package/dist/cjs/errors/get-error.js +3 -0
- package/dist/cjs/errors/get-error.js.map +1 -1
- package/dist/cjs/index.d.ts +2 -1
- package/dist/cjs/index.js +3 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/storage/ChromeStorage.js +6 -15
- package/dist/cjs/storage/ChromeStorage.js.map +1 -1
- package/dist/cjs/storage/IndexedDBStorage.js +8 -1
- package/dist/cjs/storage/IndexedDBStorage.js.map +1 -1
- package/dist/cjs/storage/LocalStorage.js +5 -16
- package/dist/cjs/storage/LocalStorage.js.map +1 -1
- package/dist/cjs/storage/WCStorage.d.ts +1 -2
- package/dist/cjs/storage/WCStorage.js +40 -19
- package/dist/cjs/storage/WCStorage.js.map +1 -1
- package/dist/cjs/storage/storage-normalization.d.ts +9 -0
- package/dist/cjs/storage/storage-normalization.js +135 -0
- package/dist/cjs/storage/storage-normalization.js.map +1 -0
- package/dist/cjs/transports/Transport.js +6 -2
- package/dist/cjs/transports/Transport.js.map +1 -1
- package/dist/cjs/utils/multi-tab-channel.d.ts +1 -0
- package/dist/cjs/utils/multi-tab-channel.js +15 -0
- package/dist/cjs/utils/multi-tab-channel.js.map +1 -1
- package/dist/esm/clients/client/Client.d.ts +6 -1
- package/dist/esm/clients/client/Client.js +17 -4
- package/dist/esm/clients/client/Client.js.map +1 -1
- package/dist/esm/constants.js +1 -1
- package/dist/esm/constants.js.map +1 -1
- package/dist/esm/errors/PeerUnreachableBeaconError.d.ts +9 -0
- package/dist/esm/errors/PeerUnreachableBeaconError.js +13 -0
- package/dist/esm/errors/PeerUnreachableBeaconError.js.map +1 -0
- package/dist/esm/errors/get-error.js +3 -0
- package/dist/esm/errors/get-error.js.map +1 -1
- package/dist/esm/index.d.ts +2 -1
- package/dist/esm/index.js +2 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/storage/ChromeStorage.js +6 -15
- package/dist/esm/storage/ChromeStorage.js.map +1 -1
- package/dist/esm/storage/IndexedDBStorage.js +8 -1
- package/dist/esm/storage/IndexedDBStorage.js.map +1 -1
- package/dist/esm/storage/LocalStorage.js +6 -17
- package/dist/esm/storage/LocalStorage.js.map +1 -1
- package/dist/esm/storage/WCStorage.d.ts +1 -2
- package/dist/esm/storage/WCStorage.js +40 -17
- package/dist/esm/storage/WCStorage.js.map +1 -1
- package/dist/esm/storage/storage-normalization.d.ts +9 -0
- package/dist/esm/storage/storage-normalization.js +128 -0
- package/dist/esm/storage/storage-normalization.js.map +1 -0
- package/dist/esm/transports/Transport.js +6 -2
- package/dist/esm/transports/Transport.js.map +1 -1
- package/dist/esm/utils/multi-tab-channel.d.ts +1 -0
- package/dist/esm/utils/multi-tab-channel.js +13 -0
- package/dist/esm/utils/multi-tab-channel.js.map +1 -1
- package/package.json +3 -3
|
@@ -13,9 +13,41 @@ exports.WCStorage = void 0;
|
|
|
13
13
|
const octez_connect_types_1 = require("@tezos-x/octez.connect-types");
|
|
14
14
|
const LocalStorage_1 = require("./LocalStorage");
|
|
15
15
|
const IndexedDBStorage_1 = require("./IndexedDBStorage");
|
|
16
|
+
const parseStorageArray = (value) => {
|
|
17
|
+
try {
|
|
18
|
+
return JSON.parse(value);
|
|
19
|
+
}
|
|
20
|
+
catch (_a) {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
const hasNonEmptyWalletConnectStorageValue = (value) => {
|
|
25
|
+
if (!value) {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
const parsedValue = parseStorageArray(value);
|
|
29
|
+
return Array.isArray(parsedValue) && parsedValue.length > 0;
|
|
30
|
+
};
|
|
31
|
+
const isWalletConnectLocalStorageKey = (key, name) => {
|
|
32
|
+
if (!key.includes('wc@2:')) {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
return name ? key.endsWith(name) : true;
|
|
36
|
+
};
|
|
37
|
+
// WalletConnect owns its prefix; Airgap's StorageKey enum does not match WC's emitted key shape.
|
|
38
|
+
const getWalletConnectLocalStorageKeys = (name) => {
|
|
39
|
+
const keys = [];
|
|
40
|
+
for (let i = 0; i < localStorage.length; i++) {
|
|
41
|
+
const key = localStorage.key(i);
|
|
42
|
+
if (key && isWalletConnectLocalStorageKey(key, name)) {
|
|
43
|
+
keys.push(key);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return keys;
|
|
47
|
+
};
|
|
48
|
+
const hasNonEmptyWalletConnectLocalStorageEntries = (name) => getWalletConnectLocalStorageKeys(name).some((key) => { var _a; return hasNonEmptyWalletConnectStorageValue((_a = localStorage.getItem(key)) !== null && _a !== void 0 ? _a : undefined); });
|
|
16
49
|
class WCStorage {
|
|
17
50
|
constructor() {
|
|
18
|
-
this.localStorage = new LocalStorage_1.LocalStorage();
|
|
19
51
|
this.indexedDB = new IndexedDBStorage_1.IndexedDBStorage();
|
|
20
52
|
this.channel = new BroadcastChannel('WALLET_CONNECT_V2_INDEXED_DB');
|
|
21
53
|
this.channel.onmessage = this.onMessage.bind(this);
|
|
@@ -33,26 +65,24 @@ class WCStorage {
|
|
|
33
65
|
}
|
|
34
66
|
hasPairings() {
|
|
35
67
|
return __awaiter(this, void 0, void 0, function* () {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
if (pairings.length) {
|
|
68
|
+
const pairings = yield this.indexedDB.get(octez_connect_types_1.StorageKey.WC_2_CORE_PAIRING);
|
|
69
|
+
if (hasNonEmptyWalletConnectStorageValue(pairings)) {
|
|
39
70
|
return true;
|
|
40
71
|
}
|
|
41
72
|
if (yield LocalStorage_1.LocalStorage.isSupported()) {
|
|
42
|
-
return (
|
|
73
|
+
return hasNonEmptyWalletConnectLocalStorageEntries('pairing');
|
|
43
74
|
}
|
|
44
75
|
return false;
|
|
45
76
|
});
|
|
46
77
|
}
|
|
47
78
|
hasSessions() {
|
|
48
79
|
return __awaiter(this, void 0, void 0, function* () {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
if (sessions.length) {
|
|
80
|
+
const sessions = yield this.indexedDB.get(octez_connect_types_1.StorageKey.WC_2_CLIENT_SESSION);
|
|
81
|
+
if (hasNonEmptyWalletConnectStorageValue(sessions)) {
|
|
52
82
|
return true;
|
|
53
83
|
}
|
|
54
84
|
if (yield LocalStorage_1.LocalStorage.isSupported()) {
|
|
55
|
-
return (
|
|
85
|
+
return hasNonEmptyWalletConnectLocalStorageEntries('session');
|
|
56
86
|
}
|
|
57
87
|
return false;
|
|
58
88
|
});
|
|
@@ -66,16 +96,7 @@ class WCStorage {
|
|
|
66
96
|
return __awaiter(this, void 0, void 0, function* () {
|
|
67
97
|
yield this.indexedDB.clearStore();
|
|
68
98
|
if (yield LocalStorage_1.LocalStorage.isSupported()) {
|
|
69
|
-
|
|
70
|
-
this.localStorage.delete(octez_connect_types_1.StorageKey.WC_2_CLIENT_SESSION),
|
|
71
|
-
this.localStorage.delete(octez_connect_types_1.StorageKey.WC_2_CORE_PAIRING),
|
|
72
|
-
this.localStorage.delete(octez_connect_types_1.StorageKey.WC_2_CORE_KEYCHAIN),
|
|
73
|
-
this.localStorage.delete(octez_connect_types_1.StorageKey.WC_2_CORE_MESSAGES),
|
|
74
|
-
this.localStorage.delete(octez_connect_types_1.StorageKey.WC_2_CLIENT_PROPOSAL),
|
|
75
|
-
this.localStorage.delete(octez_connect_types_1.StorageKey.WC_2_CORE_SUBSCRIPTION),
|
|
76
|
-
this.localStorage.delete(octez_connect_types_1.StorageKey.WC_2_CORE_HISTORY),
|
|
77
|
-
this.localStorage.delete(octez_connect_types_1.StorageKey.WC_2_CORE_EXPIRER)
|
|
78
|
-
]);
|
|
99
|
+
getWalletConnectLocalStorageKeys().forEach((key) => localStorage.removeItem(key));
|
|
79
100
|
}
|
|
80
101
|
});
|
|
81
102
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WCStorage.js","sourceRoot":"","sources":["../../../src/storage/WCStorage.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,sEAAyD;AACzD,iDAA6C;AAC7C,yDAAqD;AAErD,
|
|
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,135 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.assertStorageKeyNormalizationIsExhaustive = exports.isStorageKey = exports.normalizeStoredValue = exports.normalizeParsedStoredValue = exports.STRING_STORAGE_KEYS = exports.OBJECT_STORAGE_KEYS = exports.BOOLEAN_STORAGE_KEYS = exports.ARRAY_STORAGE_KEYS = void 0;
|
|
4
|
+
const octez_connect_types_1 = require("@tezos-x/octez.connect-types");
|
|
5
|
+
exports.ARRAY_STORAGE_KEYS = new Set([
|
|
6
|
+
octez_connect_types_1.StorageKey.TRANSPORT_P2P_PEERS_DAPP,
|
|
7
|
+
octez_connect_types_1.StorageKey.TRANSPORT_P2P_PEERS_WALLET,
|
|
8
|
+
octez_connect_types_1.StorageKey.TRANSPORT_POSTMESSAGE_PEERS_DAPP,
|
|
9
|
+
octez_connect_types_1.StorageKey.TRANSPORT_POSTMESSAGE_PEERS_WALLET,
|
|
10
|
+
octez_connect_types_1.StorageKey.TRANSPORT_WALLETCONNECT_PEERS_DAPP,
|
|
11
|
+
octez_connect_types_1.StorageKey.ACCOUNTS,
|
|
12
|
+
octez_connect_types_1.StorageKey.PUSH_TOKENS,
|
|
13
|
+
octez_connect_types_1.StorageKey.APP_METADATA_LIST,
|
|
14
|
+
octez_connect_types_1.StorageKey.PERMISSION_LIST,
|
|
15
|
+
octez_connect_types_1.StorageKey.ONGOING_PROOF_OF_EVENT_CHALLENGES
|
|
16
|
+
]);
|
|
17
|
+
exports.BOOLEAN_STORAGE_KEYS = new Set([
|
|
18
|
+
octez_connect_types_1.StorageKey.MULTI_NODE_SETUP_DONE,
|
|
19
|
+
octez_connect_types_1.StorageKey.ENABLE_METRICS
|
|
20
|
+
]);
|
|
21
|
+
exports.OBJECT_STORAGE_KEYS = new Set([
|
|
22
|
+
octez_connect_types_1.StorageKey.LAST_SELECTED_WALLET,
|
|
23
|
+
octez_connect_types_1.StorageKey.MATRIX_PRESERVED_STATE,
|
|
24
|
+
octez_connect_types_1.StorageKey.MATRIX_PEER_ROOM_IDS
|
|
25
|
+
]);
|
|
26
|
+
exports.STRING_STORAGE_KEYS = new Set([
|
|
27
|
+
octez_connect_types_1.StorageKey.ACTIVE_ACCOUNT,
|
|
28
|
+
octez_connect_types_1.StorageKey.BEACON_SDK_SECRET_SEED,
|
|
29
|
+
octez_connect_types_1.StorageKey.BEACON_LAST_ERROR,
|
|
30
|
+
octez_connect_types_1.StorageKey.BEACON_SDK_VERSION,
|
|
31
|
+
octez_connect_types_1.StorageKey.MATRIX_SELECTED_NODE,
|
|
32
|
+
octez_connect_types_1.StorageKey.USER_ID,
|
|
33
|
+
octez_connect_types_1.StorageKey.WC_INIT_ERROR,
|
|
34
|
+
octez_connect_types_1.StorageKey.WC_2_CLIENT_SESSION,
|
|
35
|
+
octez_connect_types_1.StorageKey.WC_2_CORE_PAIRING,
|
|
36
|
+
octez_connect_types_1.StorageKey.WC_2_CORE_KEYCHAIN,
|
|
37
|
+
octez_connect_types_1.StorageKey.WC_2_CORE_MESSAGES,
|
|
38
|
+
octez_connect_types_1.StorageKey.WC_2_CLIENT_PROPOSAL,
|
|
39
|
+
octez_connect_types_1.StorageKey.WC_2_CORE_SUBSCRIPTION,
|
|
40
|
+
octez_connect_types_1.StorageKey.WC_2_CORE_HISTORY,
|
|
41
|
+
octez_connect_types_1.StorageKey.WC_2_CORE_EXPIRER
|
|
42
|
+
]);
|
|
43
|
+
const SENTINEL_STRINGS = new Set(['undefined', 'null']);
|
|
44
|
+
const CLASSIFIED_STORAGE_KEYS = [
|
|
45
|
+
...exports.ARRAY_STORAGE_KEYS,
|
|
46
|
+
...exports.BOOLEAN_STORAGE_KEYS,
|
|
47
|
+
...exports.OBJECT_STORAGE_KEYS,
|
|
48
|
+
...exports.STRING_STORAGE_KEYS
|
|
49
|
+
];
|
|
50
|
+
const STORAGE_KEY_VALUES = new Set(Object.values(octez_connect_types_1.StorageKey));
|
|
51
|
+
const isRecord = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
52
|
+
const defaultValue = (key) => {
|
|
53
|
+
const value = octez_connect_types_1.defaultValues[key];
|
|
54
|
+
return (isRecord(value) || Array.isArray(value) ? JSON.parse(JSON.stringify(value)) : value);
|
|
55
|
+
};
|
|
56
|
+
const parseStringifiedString = (rawValue) => {
|
|
57
|
+
try {
|
|
58
|
+
return JSON.parse(rawValue);
|
|
59
|
+
}
|
|
60
|
+
catch (_a) {
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
const parseStoredValue = (rawValue) => {
|
|
65
|
+
try {
|
|
66
|
+
return JSON.parse(rawValue);
|
|
67
|
+
}
|
|
68
|
+
catch (_a) {
|
|
69
|
+
return rawValue;
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
const normalizeRawStringValue = (key, rawValue) => {
|
|
73
|
+
// STRING keys are SDK-controlled identifiers and serialized WalletConnect blobs, not free-form text.
|
|
74
|
+
if (!rawValue.startsWith('"')) {
|
|
75
|
+
return rawValue;
|
|
76
|
+
}
|
|
77
|
+
const parsedValue = parseStringifiedString(rawValue);
|
|
78
|
+
if (typeof parsedValue !== 'string' || !parsedValue || SENTINEL_STRINGS.has(parsedValue)) {
|
|
79
|
+
return defaultValue(key);
|
|
80
|
+
}
|
|
81
|
+
return parsedValue;
|
|
82
|
+
};
|
|
83
|
+
const formatKeys = (keys) => keys.length === 0 ? 'none' : keys.join(', ');
|
|
84
|
+
const normalizeParsedStoredValue = (key, value) => {
|
|
85
|
+
if (value === undefined ||
|
|
86
|
+
value === null ||
|
|
87
|
+
(typeof value === 'string' && (!value || SENTINEL_STRINGS.has(value)))) {
|
|
88
|
+
return defaultValue(key);
|
|
89
|
+
}
|
|
90
|
+
if (exports.ARRAY_STORAGE_KEYS.has(key)) {
|
|
91
|
+
return (Array.isArray(value) ? value : defaultValue(key));
|
|
92
|
+
}
|
|
93
|
+
if (exports.BOOLEAN_STORAGE_KEYS.has(key)) {
|
|
94
|
+
return (typeof value === 'boolean' ? value : defaultValue(key));
|
|
95
|
+
}
|
|
96
|
+
if (exports.OBJECT_STORAGE_KEYS.has(key)) {
|
|
97
|
+
return (isRecord(value) ? value : defaultValue(key));
|
|
98
|
+
}
|
|
99
|
+
if (exports.STRING_STORAGE_KEYS.has(key)) {
|
|
100
|
+
return (typeof value === 'string' ? value : defaultValue(key));
|
|
101
|
+
}
|
|
102
|
+
return defaultValue(key);
|
|
103
|
+
};
|
|
104
|
+
exports.normalizeParsedStoredValue = normalizeParsedStoredValue;
|
|
105
|
+
// LocalStorage exposes raw strings; Chrome and IndexedDB expose already-decoded JS values.
|
|
106
|
+
const normalizeStoredValue = (key, rawValue) => {
|
|
107
|
+
if (!rawValue || SENTINEL_STRINGS.has(rawValue)) {
|
|
108
|
+
return defaultValue(key);
|
|
109
|
+
}
|
|
110
|
+
if (exports.STRING_STORAGE_KEYS.has(key)) {
|
|
111
|
+
return normalizeRawStringValue(key, rawValue);
|
|
112
|
+
}
|
|
113
|
+
return (0, exports.normalizeParsedStoredValue)(key, parseStoredValue(rawValue));
|
|
114
|
+
};
|
|
115
|
+
exports.normalizeStoredValue = normalizeStoredValue;
|
|
116
|
+
const isStorageKey = (key) => STORAGE_KEY_VALUES.has(key);
|
|
117
|
+
exports.isStorageKey = isStorageKey;
|
|
118
|
+
const assertStorageKeyNormalizationIsExhaustive = (expectedStorageKeys = Object.values(octez_connect_types_1.StorageKey)) => {
|
|
119
|
+
const expectedKeys = new Set(expectedStorageKeys);
|
|
120
|
+
const classifiedKeyValues = new Set(CLASSIFIED_STORAGE_KEYS);
|
|
121
|
+
const missingKeys = expectedStorageKeys.filter((key) => !classifiedKeyValues.has(key));
|
|
122
|
+
const extraKeys = CLASSIFIED_STORAGE_KEYS.filter((key) => !expectedKeys.has(key));
|
|
123
|
+
const duplicateKeys = CLASSIFIED_STORAGE_KEYS.filter((key, index) => CLASSIFIED_STORAGE_KEYS.indexOf(key) !== index);
|
|
124
|
+
if (missingKeys.length > 0 || extraKeys.length > 0 || duplicateKeys.length > 0) {
|
|
125
|
+
throw new Error([
|
|
126
|
+
'Storage normalization keys are not exhaustive.',
|
|
127
|
+
`Missing: ${formatKeys(missingKeys)}.`,
|
|
128
|
+
`Extra: ${formatKeys(extraKeys)}.`,
|
|
129
|
+
`Duplicate: ${formatKeys(duplicateKeys)}.`
|
|
130
|
+
].join(' '));
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
exports.assertStorageKeyNormalizationIsExhaustive = assertStorageKeyNormalizationIsExhaustive;
|
|
134
|
+
(0, exports.assertStorageKeyNormalizationIsExhaustive)();
|
|
135
|
+
//# sourceMappingURL=storage-normalization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage-normalization.js","sourceRoot":"","sources":["../../../src/storage/storage-normalization.ts"],"names":[],"mappings":"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","sourcesContent":["import { StorageKey, StorageKeyReturnType, defaultValues } from '@tezos-x/octez.connect-types'\n\nexport const ARRAY_STORAGE_KEYS = new Set<StorageKey>([\n StorageKey.TRANSPORT_P2P_PEERS_DAPP,\n StorageKey.TRANSPORT_P2P_PEERS_WALLET,\n StorageKey.TRANSPORT_POSTMESSAGE_PEERS_DAPP,\n StorageKey.TRANSPORT_POSTMESSAGE_PEERS_WALLET,\n StorageKey.TRANSPORT_WALLETCONNECT_PEERS_DAPP,\n StorageKey.ACCOUNTS,\n StorageKey.PUSH_TOKENS,\n StorageKey.APP_METADATA_LIST,\n StorageKey.PERMISSION_LIST,\n StorageKey.ONGOING_PROOF_OF_EVENT_CHALLENGES\n])\n\nexport const BOOLEAN_STORAGE_KEYS = new Set<StorageKey>([\n StorageKey.MULTI_NODE_SETUP_DONE,\n StorageKey.ENABLE_METRICS\n])\n\nexport const OBJECT_STORAGE_KEYS = new Set<StorageKey>([\n StorageKey.LAST_SELECTED_WALLET,\n StorageKey.MATRIX_PRESERVED_STATE,\n StorageKey.MATRIX_PEER_ROOM_IDS\n])\n\nexport const STRING_STORAGE_KEYS = new Set<StorageKey>([\n StorageKey.ACTIVE_ACCOUNT,\n StorageKey.BEACON_SDK_SECRET_SEED,\n StorageKey.BEACON_LAST_ERROR,\n StorageKey.BEACON_SDK_VERSION,\n StorageKey.MATRIX_SELECTED_NODE,\n StorageKey.USER_ID,\n StorageKey.WC_INIT_ERROR,\n StorageKey.WC_2_CLIENT_SESSION,\n StorageKey.WC_2_CORE_PAIRING,\n StorageKey.WC_2_CORE_KEYCHAIN,\n StorageKey.WC_2_CORE_MESSAGES,\n StorageKey.WC_2_CLIENT_PROPOSAL,\n StorageKey.WC_2_CORE_SUBSCRIPTION,\n StorageKey.WC_2_CORE_HISTORY,\n StorageKey.WC_2_CORE_EXPIRER\n])\n\nconst SENTINEL_STRINGS = new Set(['undefined', 'null'])\nconst CLASSIFIED_STORAGE_KEYS = [\n ...ARRAY_STORAGE_KEYS,\n ...BOOLEAN_STORAGE_KEYS,\n ...OBJECT_STORAGE_KEYS,\n ...STRING_STORAGE_KEYS\n]\nconst STORAGE_KEY_VALUES = new Set<string>(Object.values(StorageKey))\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n\nconst defaultValue = <K extends StorageKey>(key: K): StorageKeyReturnType[K] => {\n const value = defaultValues[key]\n\n return (\n isRecord(value) || Array.isArray(value) ? JSON.parse(JSON.stringify(value)) : value\n ) as StorageKeyReturnType[K]\n}\n\nconst parseStringifiedString = (rawValue: string): unknown => {\n try {\n return JSON.parse(rawValue)\n } catch {\n return undefined\n }\n}\n\nconst parseStoredValue = (rawValue: string): unknown => {\n try {\n return JSON.parse(rawValue)\n } catch {\n return rawValue\n }\n}\n\nconst normalizeRawStringValue = <K extends StorageKey>(\n key: K,\n rawValue: string\n): StorageKeyReturnType[K] => {\n // STRING keys are SDK-controlled identifiers and serialized WalletConnect blobs, not free-form text.\n if (!rawValue.startsWith('\"')) {\n return rawValue as StorageKeyReturnType[K]\n }\n\n const parsedValue = parseStringifiedString(rawValue)\n\n if (typeof parsedValue !== 'string' || !parsedValue || SENTINEL_STRINGS.has(parsedValue)) {\n return defaultValue(key)\n }\n\n return parsedValue as StorageKeyReturnType[K]\n}\n\nconst formatKeys = (keys: readonly string[]): string =>\n keys.length === 0 ? 'none' : keys.join(', ')\n\nexport const normalizeParsedStoredValue = <K extends StorageKey>(\n key: K,\n value: unknown\n): StorageKeyReturnType[K] => {\n if (\n value === undefined ||\n value === null ||\n (typeof value === 'string' && (!value || SENTINEL_STRINGS.has(value)))\n ) {\n return defaultValue(key)\n }\n\n if (ARRAY_STORAGE_KEYS.has(key)) {\n return (Array.isArray(value) ? value : defaultValue(key)) as StorageKeyReturnType[K]\n }\n\n if (BOOLEAN_STORAGE_KEYS.has(key)) {\n return (typeof value === 'boolean' ? value : defaultValue(key)) as StorageKeyReturnType[K]\n }\n\n if (OBJECT_STORAGE_KEYS.has(key)) {\n return (isRecord(value) ? value : defaultValue(key)) as StorageKeyReturnType[K]\n }\n\n if (STRING_STORAGE_KEYS.has(key)) {\n return (typeof value === 'string' ? value : defaultValue(key)) as StorageKeyReturnType[K]\n }\n\n return defaultValue(key)\n}\n\n// LocalStorage exposes raw strings; Chrome and IndexedDB expose already-decoded JS values.\nexport const normalizeStoredValue = <K extends StorageKey>(\n key: K,\n rawValue: string | null | undefined\n): StorageKeyReturnType[K] => {\n if (!rawValue || SENTINEL_STRINGS.has(rawValue)) {\n return defaultValue(key)\n }\n\n if (STRING_STORAGE_KEYS.has(key)) {\n return normalizeRawStringValue(key, rawValue)\n }\n\n return normalizeParsedStoredValue(key, parseStoredValue(rawValue))\n}\n\nexport const isStorageKey = (key: string): key is StorageKey => STORAGE_KEY_VALUES.has(key)\n\nexport const assertStorageKeyNormalizationIsExhaustive = (\n expectedStorageKeys: readonly string[] = Object.values(StorageKey)\n): void => {\n const expectedKeys = new Set(expectedStorageKeys)\n const classifiedKeyValues = new Set<string>(CLASSIFIED_STORAGE_KEYS)\n const missingKeys = expectedStorageKeys.filter((key) => !classifiedKeyValues.has(key))\n const extraKeys = CLASSIFIED_STORAGE_KEYS.filter((key) => !expectedKeys.has(key))\n const duplicateKeys = CLASSIFIED_STORAGE_KEYS.filter(\n (key, index) => CLASSIFIED_STORAGE_KEYS.indexOf(key) !== index\n )\n\n if (missingKeys.length > 0 || extraKeys.length > 0 || duplicateKeys.length > 0) {\n throw new Error(\n [\n 'Storage normalization keys are not exhaustive.',\n `Missing: ${formatKeys(missingKeys)}.`,\n `Extra: ${formatKeys(extraKeys)}.`,\n `Duplicate: ${formatKeys(duplicateKeys)}.`\n ].join(' ')\n )\n }\n}\n\nassertStorageKeyNormalizationIsExhaustive()\n"]}
|
|
@@ -87,8 +87,12 @@ class Transport {
|
|
|
87
87
|
else {
|
|
88
88
|
const knownPeers = yield this.getPeers();
|
|
89
89
|
// A broadcast request has to be sent everywhere.
|
|
90
|
-
const
|
|
91
|
-
|
|
90
|
+
const results = yield Promise.allSettled(knownPeers.map((peerEl) => this.client.sendMessage(message, peerEl)));
|
|
91
|
+
results.forEach((result) => {
|
|
92
|
+
if (result.status === 'rejected') {
|
|
93
|
+
logger.warn('Transport.send broadcast', result.reason);
|
|
94
|
+
}
|
|
95
|
+
});
|
|
92
96
|
}
|
|
93
97
|
});
|
|
94
98
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Transport.js","sourceRoot":"","sources":["../../../src/transports/Transport.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,4CAAwC;AACxC,sEAOqC;AAMrC,MAAM,MAAM,GAAG,IAAI,eAAM,CAAC,WAAW,CAAC,CAAA;AAEtC;;;;GAIG;AACH,MAAsB,SAAS;IAqC7B,eAAe,CAAC,KAAmB,EAAE,GAAa;QAChD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IAC3C,CAAC;IAOD;;OAEG;IACH,IAAW,gBAAgB;QACzB,OAAO,IAAI,CAAC,YAAY,CAAA;IAC1B,CAAC;IAED,YAAY,IAAY,EAAE,MAAS,EAAE,WAA2B;QA3ChE;;WAEG;QACa,SAAI,GAAkB,mCAAa,CAAC,YAAY,CAAA;QAOhE;;WAEG;QACO,iBAAY,GAAoB,qCAAe,CAAC,aAAa,CAAA;QAkBvE;;WAEG;QACK,cAAS,GAAsE,EAAE,CAAA;QAUvF,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;IAChC,CAAC;IAED;;OAEG;IACI,MAAM,CAAO,WAAW;;YAC7B,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAC/B,CAAC;KAAA;IAED;;OAEG;IACU,OAAO;;YAClB,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;YACrB,IAAI,CAAC,YAAY,GAAG,qCAAe,CAAC,SAAS,CAAA;YAE7C,OAAM;QACR,CAAC;KAAA;IAED;;OAEG;IACU,UAAU;;YACrB,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;YACxB,IAAI,CAAC,YAAY,GAAG,qCAAe,CAAC,aAAa,CAAA;YAEjD,OAAM;QACR,CAAC;KAAA;IAED;;;;;OAKG;IACU,IAAI,CAAC,OAAe,EAAE,IAAe;;YAChD,IAAI,IAAI,EAAE,CAAC;gBACT,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;YAC/C,CAAC;iBAAM,CAAC;gBACN,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAA;gBACxC,iDAAiD;gBACjD,MAAM,
|
|
1
|
+
{"version":3,"file":"Transport.js","sourceRoot":"","sources":["../../../src/transports/Transport.ts"],"names":[],"mappings":"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","sourcesContent":["import { Logger } from '../utils/Logger'\nimport {\n TransportType,\n TransportStatus,\n PeerInfo,\n StorageKey,\n StorageKeyReturnType,\n ConnectionContext\n} from '@tezos-x/octez.connect-types'\nimport { PeerManager } from '../managers/PeerManager'\nimport { ArrayElem } from '../managers/StorageManager'\nimport { CommunicationClient } from './clients/CommunicationClient'\nimport { ClientEvents } from './clients/ClientEvents'\n\nconst logger = new Logger('Transport')\n\n/**\n * @internalapi\n *\n *\n */\nexport abstract class Transport<\n T extends PeerInfo = PeerInfo,\n K extends\n | StorageKey.TRANSPORT_P2P_PEERS_DAPP\n | StorageKey.TRANSPORT_P2P_PEERS_WALLET\n | StorageKey.TRANSPORT_POSTMESSAGE_PEERS_DAPP\n | StorageKey.TRANSPORT_POSTMESSAGE_PEERS_WALLET\n | StorageKey.TRANSPORT_WALLETCONNECT_PEERS_DAPP = any,\n S extends CommunicationClient = any\n> {\n /**\n * The type of the transport\n */\n public readonly type: TransportType = TransportType.POST_MESSAGE\n\n /**\n * The name of the app\n */\n protected readonly name: string\n\n /**\n * The status of the transport\n */\n protected _isConnected: TransportStatus = TransportStatus.NOT_CONNECTED\n\n protected readonly peerManager: PeerManager<K>\n\n /**\n * The client handling the encryption/decryption of messages\n */\n protected client: S\n\n /**\n * The listener that will be invoked when a new peer is connected\n */\n protected newPeerListener?: (peer: T) => void\n\n setEventHandler(event: ClientEvents, fun: Function) {\n this.client.eventHandlers.set(event, fun)\n }\n\n /**\n * The listeners that will be notified when new messages are coming in\n */\n private listeners: ((message: unknown, connectionInfo: ConnectionContext) => void)[] = []\n\n /**\n * Return the status of the connection\n */\n public get connectionStatus(): TransportStatus {\n return this._isConnected\n }\n\n constructor(name: string, client: S, peerManager: PeerManager<K>) {\n this.name = name\n this.client = client\n this.peerManager = peerManager\n }\n\n /**\n * Returns a promise that resolves to true if the transport is available, false if it is not\n */\n public static async isAvailable(): Promise<boolean> {\n return Promise.resolve(false)\n }\n\n /**\n * Connect the transport\n */\n public async connect(): Promise<void> {\n logger.log('connect')\n this._isConnected = TransportStatus.CONNECTED\n\n return\n }\n\n /**\n * Disconnect the transport\n */\n public async disconnect(): Promise<void> {\n logger.log('disconnect')\n this._isConnected = TransportStatus.NOT_CONNECTED\n\n return\n }\n\n /**\n * Send a message through the transport\n *\n * @param message The message to send\n * @param recipient The recipient of the message\n */\n public async send(message: string, peer?: PeerInfo): Promise<void> {\n if (peer) {\n return this.client.sendMessage(message, peer)\n } else {\n const knownPeers = await this.getPeers()\n // A broadcast request has to be sent everywhere.\n const results = await Promise.allSettled(\n knownPeers.map((peerEl) => this.client.sendMessage(message, peerEl))\n )\n results.forEach((result) => {\n if (result.status === 'rejected') {\n logger.warn('Transport.send broadcast', result.reason)\n }\n })\n }\n }\n\n /**\n * Add a listener to be called when a new message is received\n *\n * @param listener The listener that will be registered\n */\n public async addListener(\n listener: (message: unknown, connectionInfo: ConnectionContext) => void\n ): Promise<void> {\n logger.debug('addListener')\n\n this.listeners.push(listener)\n\n return\n }\n\n /**\n * Remove a listener\n *\n * @param listener\n */\n public async removeListener(\n listener: (message: string, connectionInfo: ConnectionContext) => void\n ): Promise<void> {\n logger.log('removeListener')\n\n this.listeners = this.listeners.filter((element) => element !== listener)\n\n return\n }\n\n public async getPeers(): Promise<T[]> {\n return this.peerManager.getPeers() as any // TODO: Fix type\n }\n\n public async addPeer(newPeer: T, _sendPairingResponse: boolean = true): Promise<void> {\n logger.log('addPeer', 'adding peer', newPeer)\n await this.peerManager.addPeer(newPeer as ArrayElem<StorageKeyReturnType[K]>) // TODO: Fix type\n await this.listen(newPeer.publicKey)\n }\n\n public async removePeer(peerToBeRemoved: T): Promise<void> {\n logger.log('removePeer', 'removing peer', peerToBeRemoved)\n await this.peerManager.removePeer(peerToBeRemoved.publicKey)\n if (this.client) {\n await this.client.unsubscribeFromEncryptedMessage(peerToBeRemoved.publicKey)\n }\n }\n\n public async removeAllPeers(): Promise<void> {\n logger.log('removeAllPeers')\n await this.peerManager.removeAllPeers()\n if (this.client) {\n await this.client.unsubscribeFromEncryptedMessages()\n }\n }\n\n /**\n * Notify the listeners when a new message comes in\n *\n * @param message Message\n * @param connectionInfo Context info about the connection\n */\n protected async notifyListeners(\n message: unknown,\n connectionInfo: ConnectionContext\n ): Promise<void> {\n if (this.listeners.length === 0) {\n logger.warn('notifyListeners', '0 listeners notified!', this)\n } else {\n logger.log('notifyListeners', `Notifying ${this.listeners.length} listeners`, this)\n }\n\n this.listeners.forEach((listener) => {\n listener(message, connectionInfo)\n })\n\n return\n }\n\n abstract listen(publicKey: string): Promise<void>\n}\n"]}
|
|
@@ -8,6 +8,7 @@ export declare class MultiTabChannel {
|
|
|
8
8
|
private initialized;
|
|
9
9
|
constructor(name: string, onBCMessageHandler: Function, onElectedLeaderHandler: Function);
|
|
10
10
|
init(): Promise<void>;
|
|
11
|
+
close(): Promise<void>;
|
|
11
12
|
private onBeforeUnloadHandler;
|
|
12
13
|
private onMessageHandler;
|
|
13
14
|
isLeader(): boolean;
|
|
@@ -41,6 +41,21 @@ class MultiTabChannel {
|
|
|
41
41
|
this.initialized = true;
|
|
42
42
|
});
|
|
43
43
|
}
|
|
44
|
+
close() {
|
|
45
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
46
|
+
const wasLeader = this.wasLeader;
|
|
47
|
+
window === null || window === void 0 ? void 0 : window.removeEventListener('beforeunload', this.eventListeners[0]);
|
|
48
|
+
this.channel.removeEventListener('message', this.eventListeners[1]);
|
|
49
|
+
this.channel.onmessage = null;
|
|
50
|
+
yield this.elector.die();
|
|
51
|
+
if (wasLeader) {
|
|
52
|
+
this.postMessage({ type: 'LEADER_DEAD' });
|
|
53
|
+
}
|
|
54
|
+
yield this.channel.close();
|
|
55
|
+
this.initialized = false;
|
|
56
|
+
this.wasLeader = false;
|
|
57
|
+
});
|
|
58
|
+
}
|
|
44
59
|
onBeforeUnloadHandler() {
|
|
45
60
|
return __awaiter(this, void 0, void 0, function* () {
|
|
46
61
|
if (this.wasLeader) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multi-tab-channel.js","sourceRoot":"","sources":["../../../src/utils/multi-tab-channel.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,yDAAyF;AAQzF,MAAa,eAAe;IAc1B,YAAY,IAAY,EAAE,kBAA4B,EAAE,sBAAgC;QAXhF,mBAAc,GAAG;YACvB,GAAG,EAAE,CAAC,IAAI,CAAC,qBAAqB,EAAE;YAClC,CAAC,OAAY,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;SACjD,CAAA;QAGD,uDAAuD;QACvD,4DAA4D;QACpD,cAAS,GAAY,KAAK,CAAA;QAC1B,gBAAW,GAAY,KAAK,CAAA;QAGlC,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,CAAA;QAC5C,IAAI,CAAC,sBAAsB,GAAG,sBAAsB,CAAA;QACpD,IAAI,CAAC,OAAO,GAAG,IAAI,oCAAgB,CAAC,IAAI,CAAC,CAAA;QACzC,IAAI,CAAC,OAAO,GAAG,IAAA,wCAAoB,EAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACnD,CAAC;IAEK,IAAI;;YACR,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrB,OAAM;YACR,CAAC;YAED,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAA;YAEhD,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAA;gBACpC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;YAClC,CAAC;YAED,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAA;YAC/C,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,gBAAgB,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAA;YAEhE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAA;QACzB,CAAC;KAAA;IAEa,qBAAqB;;YACjC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBACnB,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAA;gBACxB,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAA;YAC3C,CAAC;YAED,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,mBAAmB,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAA;YACnE,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAA;QACrE,CAAC;KAAA;IAEa,gBAAgB,CAAC,OAAgB;;YAC7C,IAAI,OAAO,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;gBACnC,MAAM,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAA;gBAEpC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;gBAEhC,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;oBACpB,IAAI,CAAC,sBAAsB,EAAE,CAAA;gBAC/B,CAAC;gBACD,OAAM;YACR,CAAC;YAED,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAA;QAClC,CAAC;KAAA;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAA;IAC9B,CAAC;IAEK,aAAa;;YACjB,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAA;QACvC,CAAC;KAAA;IAEK,SAAS;;YACb,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAA;QACjC,CAAC;KAAA;IAED,WAAW,CAAC,OAAY;QACtB,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;IACnC,CAAC;CACF;
|
|
1
|
+
{"version":3,"file":"multi-tab-channel.js","sourceRoot":"","sources":["../../../src/utils/multi-tab-channel.ts"],"names":[],"mappings":"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","sourcesContent":["import { createLeaderElection, BroadcastChannel, LeaderElector } from 'broadcast-channel'\n\ntype Message = {\n type: string\n id: string\n data: any\n}\n\nexport class MultiTabChannel {\n private channel: BroadcastChannel\n private elector: LeaderElector\n private eventListeners = [\n () => this.onBeforeUnloadHandler(),\n (message: any) => this.onMessageHandler(message)\n ]\n private onBCMessageHandler: Function\n private onElectedLeaderHandler: Function\n // Auxiliary variable needed for handling beforeUnload.\n // Closing a tab causes the elector to be killed immediately\n private wasLeader: boolean = false\n private initialized: boolean = false\n\n constructor(name: string, onBCMessageHandler: Function, onElectedLeaderHandler: Function) {\n this.onBCMessageHandler = onBCMessageHandler\n this.onElectedLeaderHandler = onElectedLeaderHandler\n this.channel = new BroadcastChannel(name)\n this.elector = createLeaderElection(this.channel)\n }\n\n async init() {\n if (this.initialized) {\n return\n }\n\n const hasLeader = await this.elector.hasLeader()\n\n if (!hasLeader) {\n await this.elector.awaitLeadership()\n this.wasLeader = this.isLeader()\n }\n\n this.channel.onmessage = this.eventListeners[1]\n window?.addEventListener('beforeunload', this.eventListeners[0])\n\n this.initialized = true\n }\n\n public async close() {\n const wasLeader = this.wasLeader\n window?.removeEventListener('beforeunload', this.eventListeners[0])\n this.channel.removeEventListener('message', this.eventListeners[1])\n this.channel.onmessage = null\n await this.elector.die()\n if (wasLeader) {\n this.postMessage({ type: 'LEADER_DEAD' })\n }\n await this.channel.close()\n this.initialized = false\n this.wasLeader = false\n }\n\n private async onBeforeUnloadHandler() {\n if (this.wasLeader) {\n await this.elector.die()\n this.postMessage({ type: 'LEADER_DEAD' })\n }\n\n window?.removeEventListener('beforeunload', this.eventListeners[0])\n this.channel.removeEventListener('message', this.eventListeners[1])\n }\n\n private async onMessageHandler(message: Message) {\n if (message.type === 'LEADER_DEAD') {\n await this.elector.awaitLeadership()\n\n this.wasLeader = this.isLeader()\n\n if (this.isLeader()) {\n this.onElectedLeaderHandler()\n }\n return\n }\n\n this.onBCMessageHandler(message)\n }\n\n isLeader(): boolean {\n return this.elector.isLeader\n }\n\n async getLeadership() {\n return this.elector.awaitLeadership()\n }\n\n async hasLeader(): Promise<boolean> {\n return this.elector.hasLeader()\n }\n\n postMessage(message: any): void {\n this.channel.postMessage(message)\n }\n}\n"]}
|
|
@@ -4,6 +4,10 @@ import { BeaconClient } from '../beacon-client/BeaconClient';
|
|
|
4
4
|
import { AccountManager } from '../../managers/AccountManager';
|
|
5
5
|
import { ClientOptions } from './ClientOptions';
|
|
6
6
|
import { Transport } from '../../transports/Transport';
|
|
7
|
+
interface TransportCleanupTarget {
|
|
8
|
+
readonly type: TransportType;
|
|
9
|
+
removeListener(listener: (message: string, connectionInfo: ConnectionContext) => void): Promise<void>;
|
|
10
|
+
}
|
|
7
11
|
/**
|
|
8
12
|
* @internalapi
|
|
9
13
|
*
|
|
@@ -38,7 +42,7 @@ export declare abstract class Client extends BeaconClient {
|
|
|
38
42
|
*/
|
|
39
43
|
get ready(): Promise<void>;
|
|
40
44
|
constructor(config: ClientOptions);
|
|
41
|
-
protected cleanup(): Promise<void>;
|
|
45
|
+
protected cleanup(transports?: TransportCleanupTarget[]): Promise<void>;
|
|
42
46
|
/**
|
|
43
47
|
* Return all locally known accounts
|
|
44
48
|
*/
|
|
@@ -89,3 +93,4 @@ export declare abstract class Client extends BeaconClient {
|
|
|
89
93
|
protected addListener(transport: Transport<any>): Promise<void>;
|
|
90
94
|
protected sendDisconnectToPeer(peer: PeerInfo, transport?: Transport<any>): Promise<void>;
|
|
91
95
|
}
|
|
96
|
+
export {};
|
|
@@ -53,15 +53,28 @@ export class Client extends BeaconClient {
|
|
|
53
53
|
throw new Error(`not overwritten${JSON.stringify(message)} - ${JSON.stringify(connectionInfo)}`);
|
|
54
54
|
};
|
|
55
55
|
}
|
|
56
|
-
async cleanup() {
|
|
56
|
+
async cleanup(transports) {
|
|
57
57
|
if (!this.transportListeners.size) {
|
|
58
58
|
return;
|
|
59
59
|
}
|
|
60
|
-
if (
|
|
61
|
-
|
|
62
|
-
|
|
60
|
+
if (!transports) {
|
|
61
|
+
if (this._transport.isResolved()) {
|
|
62
|
+
const transport = await this.transport;
|
|
63
|
+
await Promise.all(Array.from(this.transportListeners.values()).map((listener) => transport.removeListener(listener)));
|
|
64
|
+
}
|
|
63
65
|
this.transportListeners.clear();
|
|
66
|
+
return;
|
|
64
67
|
}
|
|
68
|
+
// Explicit transport cleanup is scoped: callers tearing down secondary
|
|
69
|
+
// transports should not unregister listeners for transports left alive.
|
|
70
|
+
await Promise.all(transports.map(async (transport) => {
|
|
71
|
+
const listener = this.transportListeners.get(transport.type);
|
|
72
|
+
if (!listener) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
await transport.removeListener(listener);
|
|
76
|
+
this.transportListeners.delete(transport.type);
|
|
77
|
+
}));
|
|
65
78
|
}
|
|
66
79
|
/**
|
|
67
80
|
* Return all locally known accounts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Client.js","sourceRoot":"","sources":["../../../../src/clients/client/Client.ts"],"names":[],"mappings":"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","sourcesContent":["import { ExposedPromise, generateGUID } from '@tezos-x/octez.connect-utils'\nimport {\n ConnectionContext,\n TransportType,\n TransportStatus,\n BeaconBaseMessage,\n AccountInfo,\n PeerInfo,\n BeaconMessageType,\n DisconnectMessage,\n AppMetadata,\n BeaconRequestMessage,\n BeaconMessageWrapper,\n NodeDistributions\n} from '@tezos-x/octez.connect-types'\nimport { BeaconClient } from '../beacon-client/BeaconClient'\nimport { AccountManager } from '../../managers/AccountManager'\nimport { getSenderId } from '../../utils/get-sender-id'\nimport { Logger } from '../../utils/Logger'\nimport { ClientOptions } from './ClientOptions'\nimport { Transport } from '../../transports/Transport'\nimport { Serializer } from '../../Serializer'\n\nconst logger = new Logger('Client')\n\n/**\n * @internalapi\n *\n * This abstract class handles the a big part of the logic that is shared between the dapp and wallet client.\n * For example, it selects and manages the transport and accounts.\n */\nexport abstract class Client extends BeaconClient {\n protected readonly accountManager: AccountManager\n\n protected handleResponse: (\n _event: BeaconRequestMessage | BeaconMessageWrapper<BeaconBaseMessage>,\n connectionInfo: ConnectionContext\n ) => void\n\n /**\n * How many requests can be sent after another\n */\n protected readonly rateLimit: number = 2\n /**\n * The time window in seconds in which the \"rateLimit\" is checked\n */\n protected readonly rateLimitWindowInSeconds: number = 5\n\n /**\n * Stores the times when requests have been made to determine if the rate limit has been reached\n */\n protected requestCounter: number[] = []\n\n protected readonly matrixNodes: NodeDistributions\n\n private transportListeners: Map<\n TransportType,\n (message: any, connectionInfo: ConnectionContext) => Promise<void>\n > = new Map()\n\n protected _transport: ExposedPromise<Transport<any>> = new ExposedPromise()\n protected get transport(): Promise<Transport<any>> {\n return this._transport.promise\n }\n\n /**\n * Returns the connection status of the Client\n */\n public get connectionStatus(): TransportStatus {\n return this._transport.promiseResult?.connectionStatus ?? TransportStatus.NOT_CONNECTED\n }\n\n /**\n * Returns whether or not the transaport is ready\n */\n public get ready(): Promise<void> {\n return this.transport.then(() => undefined)\n }\n\n constructor(config: ClientOptions) {\n super(config)\n\n this.accountManager = new AccountManager(config.storage)\n this.matrixNodes = config.matrixNodes ?? {}\n\n this.handleResponse = (\n message: BeaconBaseMessage | BeaconMessageWrapper<BeaconBaseMessage>,\n connectionInfo: ConnectionContext\n ): void => {\n throw new Error(\n `not overwritten${JSON.stringify(message)} - ${JSON.stringify(connectionInfo)}`\n )\n }\n }\n protected async cleanup() {\n if (!this.transportListeners.size) {\n return\n }\n\n if (this._transport.isResolved()) {\n const transport = await this.transport\n await Promise.all(\n Array.from(this.transportListeners.values()).map((listener) =>\n transport.removeListener(listener)\n )\n )\n this.transportListeners.clear()\n }\n }\n\n /**\n * Return all locally known accounts\n */\n public async getAccounts(): Promise<AccountInfo[]> {\n return this.accountManager.getAccounts()\n }\n\n /**\n * Return the account by ID\n * @param accountIdentifier The ID of an account\n */\n public async getAccount(accountIdentifier: string): Promise<AccountInfo | undefined> {\n return this.accountManager.getAccount(accountIdentifier)\n }\n\n /**\n * Remove the account by ID\n * @param accountIdentifier The ID of an account\n */\n public async removeAccount(accountIdentifier: string): Promise<void> {\n return this.accountManager.removeAccount(accountIdentifier)\n }\n\n /**\n * Remove all locally stored accounts\n */\n public async removeAllAccounts(): Promise<void> {\n return this.accountManager.removeAllAccounts()\n }\n\n /**\n * Add a new request (current timestamp) to the pending requests, remove old ones and check if we are above the limit\n */\n public async addRequestAndCheckIfRateLimited(): Promise<boolean> {\n const now: number = new Date().getTime()\n this.requestCounter = this.requestCounter.filter(\n (date) => date + this.rateLimitWindowInSeconds * 1000 > now\n )\n\n this.requestCounter.push(now)\n\n return this.requestCounter.length > this.rateLimit\n }\n\n /**\n * This method initializes the client. It will check if the connection should be established to a\n * browser extension or if the P2P transport should be used.\n *\n * @param transport A transport that can be provided by the user\n */\n public async init(transport: Transport<any>): Promise<TransportType> {\n if (this._transport.isResolved()) {\n return (await this.transport).type\n }\n\n await this.setTransport(transport) // Let users define their own transport\n\n return transport.type\n }\n\n /**\n * Returns the metadata of this DApp\n */\n public async getOwnAppMetadata(): Promise<AppMetadata> {\n return {\n senderId: await getSenderId(await this.beaconId),\n name: this.name,\n icon: this.iconUrl\n }\n }\n\n /**\n * Return all known peers\n */\n public async getPeers(): Promise<PeerInfo[]> {\n return (await this.transport).getPeers()\n }\n\n /**\n * Add a new peer to the known peers\n * @param peer The new peer to add\n */\n public async addPeer(peer: PeerInfo): Promise<void> {\n return (await this.transport).addPeer(peer)\n }\n\n public async destroy(): Promise<void> {\n if (this._transport.isResolved()) {\n const transport = await this.transport\n await this.cleanup()\n await transport.disconnect()\n if (transport.type === TransportType.WALLETCONNECT) {\n await (transport as any).doClientCleanup() // any because I cannot import the type definition\n }\n }\n await super.destroy()\n }\n\n /**\n * A \"setter\" for when the transport needs to be changed.\n */\n protected async setTransport(transport?: Transport<any>): Promise<void> {\n if (transport) {\n if (this._transport.isSettled()) {\n // If the promise has already been resolved we need to create a new one.\n this._transport = ExposedPromise.resolve(transport)\n } else {\n this._transport.resolve(transport)\n }\n } else {\n if (this._transport.isSettled()) {\n // If the promise has already been resolved we need to create a new one.\n this._transport = new ExposedPromise()\n }\n }\n }\n\n protected async addListener(transport: Transport<any>): Promise<void> {\n // in beacon we subscribe to the transport on client init only\n // unsubscribing from the transport is only beneficial when running\n // a single page dApp.\n // However, while running a multiple tabs setup, if one of the dApps disconnects\n // the others wont't recover until after a page refresh\n\n if (this.transportListeners.has(transport.type)) {\n await transport.removeListener(this.transportListeners.get(transport.type)!)\n }\n\n const subscription = async (message: any, connectionInfo: ConnectionContext) => {\n if (typeof message === 'string') {\n const deserializedMessage = (await new Serializer().deserialize(\n message\n )) as BeaconRequestMessage\n this.handleResponse(deserializedMessage, connectionInfo)\n }\n }\n\n this.transportListeners.set(transport.type, subscription)\n\n transport.addListener(subscription).catch((error) => logger.error('addListener', error))\n }\n\n protected async sendDisconnectToPeer(peer: PeerInfo, transport?: Transport<any>): Promise<void> {\n const request: DisconnectMessage = {\n id: await generateGUID(),\n version: peer.version,\n senderId: await getSenderId(await this.beaconId),\n type: BeaconMessageType.Disconnect\n }\n\n const payload = await new Serializer().serialize(request)\n const selectedTransport = transport ?? (await this.transport)\n\n await selectedTransport.send(payload, peer)\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Client.js","sourceRoot":"","sources":["../../../../src/clients/client/Client.ts"],"names":[],"mappings":"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","sourcesContent":["import { ExposedPromise, generateGUID } from '@tezos-x/octez.connect-utils'\nimport {\n ConnectionContext,\n TransportType,\n TransportStatus,\n BeaconBaseMessage,\n AccountInfo,\n PeerInfo,\n BeaconMessageType,\n DisconnectMessage,\n AppMetadata,\n BeaconRequestMessage,\n BeaconMessageWrapper,\n NodeDistributions\n} from '@tezos-x/octez.connect-types'\nimport { BeaconClient } from '../beacon-client/BeaconClient'\nimport { AccountManager } from '../../managers/AccountManager'\nimport { getSenderId } from '../../utils/get-sender-id'\nimport { Logger } from '../../utils/Logger'\nimport { ClientOptions } from './ClientOptions'\nimport { Transport } from '../../transports/Transport'\nimport { Serializer } from '../../Serializer'\n\nconst logger = new Logger('Client')\n\ninterface TransportCleanupTarget {\n readonly type: TransportType\n removeListener(\n listener: (message: string, connectionInfo: ConnectionContext) => void\n ): Promise<void>\n}\n\n/**\n * @internalapi\n *\n * This abstract class handles the a big part of the logic that is shared between the dapp and wallet client.\n * For example, it selects and manages the transport and accounts.\n */\nexport abstract class Client extends BeaconClient {\n protected readonly accountManager: AccountManager\n\n protected handleResponse: (\n _event: BeaconRequestMessage | BeaconMessageWrapper<BeaconBaseMessage>,\n connectionInfo: ConnectionContext\n ) => void\n\n /**\n * How many requests can be sent after another\n */\n protected readonly rateLimit: number = 2\n /**\n * The time window in seconds in which the \"rateLimit\" is checked\n */\n protected readonly rateLimitWindowInSeconds: number = 5\n\n /**\n * Stores the times when requests have been made to determine if the rate limit has been reached\n */\n protected requestCounter: number[] = []\n\n protected readonly matrixNodes: NodeDistributions\n\n private transportListeners: Map<\n TransportType,\n (message: any, connectionInfo: ConnectionContext) => Promise<void>\n > = new Map()\n\n protected _transport: ExposedPromise<Transport<any>> = new ExposedPromise()\n protected get transport(): Promise<Transport<any>> {\n return this._transport.promise\n }\n\n /**\n * Returns the connection status of the Client\n */\n public get connectionStatus(): TransportStatus {\n return this._transport.promiseResult?.connectionStatus ?? TransportStatus.NOT_CONNECTED\n }\n\n /**\n * Returns whether or not the transaport is ready\n */\n public get ready(): Promise<void> {\n return this.transport.then(() => undefined)\n }\n\n constructor(config: ClientOptions) {\n super(config)\n\n this.accountManager = new AccountManager(config.storage)\n this.matrixNodes = config.matrixNodes ?? {}\n\n this.handleResponse = (\n message: BeaconBaseMessage | BeaconMessageWrapper<BeaconBaseMessage>,\n connectionInfo: ConnectionContext\n ): void => {\n throw new Error(\n `not overwritten${JSON.stringify(message)} - ${JSON.stringify(connectionInfo)}`\n )\n }\n }\n protected async cleanup(transports?: TransportCleanupTarget[]) {\n if (!this.transportListeners.size) {\n return\n }\n\n if (!transports) {\n if (this._transport.isResolved()) {\n const transport = await this.transport\n await Promise.all(\n Array.from(this.transportListeners.values()).map((listener) =>\n transport.removeListener(listener)\n )\n )\n }\n this.transportListeners.clear()\n\n return\n }\n\n // Explicit transport cleanup is scoped: callers tearing down secondary\n // transports should not unregister listeners for transports left alive.\n await Promise.all(\n transports.map(async (transport) => {\n const listener = this.transportListeners.get(transport.type)\n\n if (!listener) {\n return\n }\n\n await transport.removeListener(listener)\n this.transportListeners.delete(transport.type)\n })\n )\n }\n\n /**\n * Return all locally known accounts\n */\n public async getAccounts(): Promise<AccountInfo[]> {\n return this.accountManager.getAccounts()\n }\n\n /**\n * Return the account by ID\n * @param accountIdentifier The ID of an account\n */\n public async getAccount(accountIdentifier: string): Promise<AccountInfo | undefined> {\n return this.accountManager.getAccount(accountIdentifier)\n }\n\n /**\n * Remove the account by ID\n * @param accountIdentifier The ID of an account\n */\n public async removeAccount(accountIdentifier: string): Promise<void> {\n return this.accountManager.removeAccount(accountIdentifier)\n }\n\n /**\n * Remove all locally stored accounts\n */\n public async removeAllAccounts(): Promise<void> {\n return this.accountManager.removeAllAccounts()\n }\n\n /**\n * Add a new request (current timestamp) to the pending requests, remove old ones and check if we are above the limit\n */\n public async addRequestAndCheckIfRateLimited(): Promise<boolean> {\n const now: number = new Date().getTime()\n this.requestCounter = this.requestCounter.filter(\n (date) => date + this.rateLimitWindowInSeconds * 1000 > now\n )\n\n this.requestCounter.push(now)\n\n return this.requestCounter.length > this.rateLimit\n }\n\n /**\n * This method initializes the client. It will check if the connection should be established to a\n * browser extension or if the P2P transport should be used.\n *\n * @param transport A transport that can be provided by the user\n */\n public async init(transport: Transport<any>): Promise<TransportType> {\n if (this._transport.isResolved()) {\n return (await this.transport).type\n }\n\n await this.setTransport(transport) // Let users define their own transport\n\n return transport.type\n }\n\n /**\n * Returns the metadata of this DApp\n */\n public async getOwnAppMetadata(): Promise<AppMetadata> {\n return {\n senderId: await getSenderId(await this.beaconId),\n name: this.name,\n icon: this.iconUrl\n }\n }\n\n /**\n * Return all known peers\n */\n public async getPeers(): Promise<PeerInfo[]> {\n return (await this.transport).getPeers()\n }\n\n /**\n * Add a new peer to the known peers\n * @param peer The new peer to add\n */\n public async addPeer(peer: PeerInfo): Promise<void> {\n return (await this.transport).addPeer(peer)\n }\n\n public async destroy(): Promise<void> {\n if (this._transport.isResolved()) {\n const transport = await this.transport\n await this.cleanup()\n await transport.disconnect()\n if (transport.type === TransportType.WALLETCONNECT) {\n await (transport as any).doClientCleanup() // any because I cannot import the type definition\n }\n }\n await super.destroy()\n }\n\n /**\n * A \"setter\" for when the transport needs to be changed.\n */\n protected async setTransport(transport?: Transport<any>): Promise<void> {\n if (transport) {\n if (this._transport.isSettled()) {\n // If the promise has already been resolved we need to create a new one.\n this._transport = ExposedPromise.resolve(transport)\n } else {\n this._transport.resolve(transport)\n }\n } else {\n if (this._transport.isSettled()) {\n // If the promise has already been resolved we need to create a new one.\n this._transport = new ExposedPromise()\n }\n }\n }\n\n protected async addListener(transport: Transport<any>): Promise<void> {\n // in beacon we subscribe to the transport on client init only\n // unsubscribing from the transport is only beneficial when running\n // a single page dApp.\n // However, while running a multiple tabs setup, if one of the dApps disconnects\n // the others wont't recover until after a page refresh\n\n if (this.transportListeners.has(transport.type)) {\n await transport.removeListener(this.transportListeners.get(transport.type)!)\n }\n\n const subscription = async (message: any, connectionInfo: ConnectionContext) => {\n if (typeof message === 'string') {\n const deserializedMessage = (await new Serializer().deserialize(\n message\n )) as BeaconRequestMessage\n this.handleResponse(deserializedMessage, connectionInfo)\n }\n }\n\n this.transportListeners.set(transport.type, subscription)\n\n transport.addListener(subscription).catch((error) => logger.error('addListener', error))\n }\n\n protected async sendDisconnectToPeer(peer: PeerInfo, transport?: Transport<any>): Promise<void> {\n const request: DisconnectMessage = {\n id: await generateGUID(),\n version: peer.version,\n senderId: await getSenderId(await this.beaconId),\n type: BeaconMessageType.Disconnect\n }\n\n const payload = await new Serializer().serialize(request)\n const selectedTransport = transport ?? (await this.transport)\n\n await selectedTransport.send(payload, peer)\n }\n}\n"]}
|
package/dist/esm/constants.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export const SDK_VERSION = '4.8.
|
|
1
|
+
export const SDK_VERSION = '4.8.5';
|
|
2
2
|
export const BEACON_VERSION = '3';
|
|
3
3
|
export const NOTIFICATION_ORACLE_URL = 'https://beacon-notification-oracle.dev.gke.papers.tech';
|
|
4
4
|
export const BACKEND_URL = 'https://beacon-backend.prod.gke.papers.tech';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAW,OAAO,CAAA;AAC1C,MAAM,CAAC,MAAM,cAAc,GAAW,GAAG,CAAA;AAEzC,MAAM,CAAC,MAAM,uBAAuB,GAClC,wDAAwD,CAAA;AAE1D,MAAM,CAAC,MAAM,WAAW,GAAW,6CAA6C,CAAA","sourcesContent":["export const SDK_VERSION: string = '4.8.
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAW,OAAO,CAAA;AAC1C,MAAM,CAAC,MAAM,cAAc,GAAW,GAAG,CAAA;AAEzC,MAAM,CAAC,MAAM,uBAAuB,GAClC,wDAAwD,CAAA;AAE1D,MAAM,CAAC,MAAM,WAAW,GAAW,6CAA6C,CAAA","sourcesContent":["export const SDK_VERSION: string = '4.8.5'\nexport const BEACON_VERSION: string = '3'\n\nexport const NOTIFICATION_ORACLE_URL: string =\n 'https://beacon-notification-oracle.dev.gke.papers.tech'\n\nexport const BACKEND_URL: string = 'https://beacon-backend.prod.gke.papers.tech'\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { BeaconErrorType } from '@tezos-x/octez.connect-types';
|
|
2
|
+
import { BeaconError } from './BeaconError';
|
|
3
|
+
/**
|
|
4
|
+
* @category Error
|
|
5
|
+
*/
|
|
6
|
+
export class PeerUnreachableBeaconError extends BeaconError {
|
|
7
|
+
name = 'PeerUnreachableBeaconError';
|
|
8
|
+
title = 'Peer Unreachable';
|
|
9
|
+
constructor() {
|
|
10
|
+
super(BeaconErrorType.PEER_UNREACHABLE, 'The wallet did not answer the request. Reset the connection and pair the wallet again.');
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=PeerUnreachableBeaconError.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PeerUnreachableBeaconError.js","sourceRoot":"","sources":["../../../src/errors/PeerUnreachableBeaconError.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAE3C;;GAEG;AACH,MAAM,OAAO,0BAA2B,SAAQ,WAAW;IAClD,IAAI,GAAW,4BAA4B,CAAA;IAC3C,KAAK,GAAW,kBAAkB,CAAA;IAEzC;QACE,KAAK,CACH,eAAe,CAAC,gBAAgB,EAChC,wFAAwF,CACzF,CAAA;IACH,CAAC;CACF","sourcesContent":["import { BeaconErrorType } from '@tezos-x/octez.connect-types'\nimport { BeaconError } from './BeaconError'\n\n/**\n * @category Error\n */\nexport class PeerUnreachableBeaconError extends BeaconError {\n public name: string = 'PeerUnreachableBeaconError'\n public title: string = 'Peer Unreachable'\n\n constructor() {\n super(\n BeaconErrorType.PEER_UNREACHABLE,\n 'The wallet did not answer the request. Reset the connection and pair the wallet again.'\n )\n }\n}\n"]}
|
|
@@ -9,6 +9,7 @@ import { NoAddressBeaconError } from './NoAddressBeaconError';
|
|
|
9
9
|
import { NoPrivateKeyBeaconError } from './NoPrivateKeyBeaconError';
|
|
10
10
|
import { NotGrantedBeaconError } from './NotGrantedBeaconError';
|
|
11
11
|
import { ParametersInvalidBeaconError } from './ParametersInvalidBeaconError';
|
|
12
|
+
import { PeerUnreachableBeaconError } from './PeerUnreachableBeaconError';
|
|
12
13
|
import { SignatureTypeNotSupportedBeaconError } from './SignatureTypeNotSupportedBeaconError';
|
|
13
14
|
import { TooManyOperationsBeaconError } from './TooManyOperationsBeaconError';
|
|
14
15
|
import { TransactionInvalidBeaconError } from './TransactionInvalidBeaconError';
|
|
@@ -39,6 +40,8 @@ const getError = (errorType, errorData) => {
|
|
|
39
40
|
// return new EncryptionTypeNotSupportedBeaconError()
|
|
40
41
|
case BeaconErrorType.ABORTED_ERROR:
|
|
41
42
|
return new AbortedBeaconError();
|
|
43
|
+
case BeaconErrorType.PEER_UNREACHABLE:
|
|
44
|
+
return new PeerUnreachableBeaconError();
|
|
42
45
|
case BeaconErrorType.UNKNOWN_ERROR:
|
|
43
46
|
return new UnknownBeaconError();
|
|
44
47
|
default:
|