@polkadot/extension-base 0.44.9 → 0.45.2

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 (79) hide show
  1. package/background/RequestBytesSign.d.ts +1 -1
  2. package/background/RequestBytesSign.js +8 -11
  3. package/background/RequestExtrinsicSign.d.ts +1 -1
  4. package/background/RequestExtrinsicSign.js +8 -11
  5. package/background/handlers/Extension.d.ts +2 -2
  6. package/background/handlers/Extension.js +460 -612
  7. package/background/handlers/State.d.ts +1 -1
  8. package/background/handlers/State.js +380 -424
  9. package/background/handlers/Tabs.d.ts +2 -2
  10. package/background/handlers/Tabs.js +178 -212
  11. package/background/handlers/helpers.js +8 -10
  12. package/background/handlers/index.d.ts +1 -1
  13. package/background/handlers/index.js +29 -39
  14. package/background/handlers/subscriptions.d.ts +1 -1
  15. package/background/handlers/subscriptions.js +13 -22
  16. package/background/types.d.ts +2 -2
  17. package/bundle.d.ts +1 -1
  18. package/bundle.js +1 -4
  19. package/cjs/background/RequestBytesSign.js +11 -18
  20. package/cjs/background/RequestExtrinsicSign.js +9 -16
  21. package/cjs/background/handlers/Extension.js +468 -658
  22. package/cjs/background/handlers/State.js +389 -460
  23. package/cjs/background/handlers/Tabs.js +185 -242
  24. package/cjs/background/handlers/helpers.js +12 -16
  25. package/cjs/background/handlers/index.js +37 -52
  26. package/cjs/background/handlers/subscriptions.js +17 -28
  27. package/cjs/background/types.js +2 -1
  28. package/cjs/bundle.js +4 -11
  29. package/cjs/defaults.js +3 -12
  30. package/cjs/detectOther.js +5 -12
  31. package/cjs/detectPackage.js +6 -11
  32. package/cjs/index.js +3 -15
  33. package/cjs/packageInfo.js +2 -16
  34. package/cjs/page/Accounts.js +19 -28
  35. package/cjs/page/Injected.js +19 -26
  36. package/cjs/page/Metadata.js +10 -18
  37. package/cjs/page/PostMessageProvider.js +127 -160
  38. package/cjs/page/Signer.js +23 -38
  39. package/cjs/page/index.js +44 -61
  40. package/cjs/page/types.js +2 -1
  41. package/cjs/stores/Accounts.js +17 -22
  42. package/cjs/stores/Base.js +56 -63
  43. package/cjs/stores/Metadata.js +10 -15
  44. package/cjs/stores/index.js +9 -19
  45. package/cjs/types.js +2 -1
  46. package/cjs/utils/canDerive.js +5 -10
  47. package/cjs/utils/getId.js +6 -11
  48. package/cjs/utils/index.js +4 -11
  49. package/defaults.js +1 -8
  50. package/detectOther.js +0 -3
  51. package/detectPackage.js +2 -7
  52. package/index.d.ts +1 -1
  53. package/index.js +1 -7
  54. package/package.json +20 -17
  55. package/packageInfo.js +1 -11
  56. package/page/Accounts.d.ts +1 -1
  57. package/page/Accounts.js +18 -23
  58. package/page/Injected.d.ts +5 -5
  59. package/page/Injected.js +15 -18
  60. package/page/Metadata.d.ts +1 -1
  61. package/page/Metadata.js +9 -13
  62. package/page/PostMessageProvider.d.ts +1 -1
  63. package/page/PostMessageProvider.js +124 -152
  64. package/page/Signer.d.ts +1 -1
  65. package/page/Signer.js +22 -33
  66. package/page/index.d.ts +2 -2
  67. package/page/index.js +36 -59
  68. package/page/types.d.ts +1 -1
  69. package/stores/Accounts.d.ts +1 -1
  70. package/stores/Accounts.js +14 -15
  71. package/stores/Base.js +55 -57
  72. package/stores/Metadata.d.ts +1 -1
  73. package/stores/Metadata.js +7 -8
  74. package/stores/index.d.ts +2 -2
  75. package/stores/index.js +2 -5
  76. package/utils/canDerive.js +1 -4
  77. package/utils/getId.js +2 -5
  78. package/utils/index.d.ts +1 -1
  79. package/utils/index.js +1 -4
@@ -1,475 +1,404 @@
1
1
  "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports.default = exports.NotificationOptions = void 0;
8
- var _rxjs = require("rxjs");
9
- var _getId = require("@polkadot/extension-base/utils/getId");
10
- var _extensionChains = require("@polkadot/extension-chains");
11
- var _defaults = require("@polkadot/networks/defaults");
12
- var _uiSettings = _interopRequireDefault(require("@polkadot/ui-settings"));
13
- var _util = require("@polkadot/util");
14
- var _stores = require("../../stores");
15
- var _helpers = require("./helpers");
16
- // Copyright 2019-2023 @polkadot/extension-bg authors & contributors
17
- // SPDX-License-Identifier: Apache-2.0
18
-
2
+ var _State_authUrls, _State_authRequests, _State_metaStore, _State_injectedProviders, _State_metaRequests, _State_notification, _State_providers, _State_signRequests, _State_windows, _State_connectedTabsUrl;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.NotificationOptions = void 0;
5
+ const tslib_1 = require("tslib");
6
+ const rxjs_1 = require("rxjs");
7
+ const getId_1 = require("@polkadot/extension-base/utils/getId");
8
+ const extension_chains_1 = require("@polkadot/extension-chains");
9
+ const defaults_1 = require("@polkadot/networks/defaults");
10
+ const ui_settings_1 = tslib_1.__importDefault(require("@polkadot/ui-settings"));
11
+ const util_1 = require("@polkadot/util");
12
+ const index_js_1 = require("../../stores/index.js");
13
+ const helpers_js_1 = require("./helpers.js");
19
14
  const NOTIFICATION_URL = chrome.extension.getURL('notification.html');
20
15
  const POPUP_WINDOW_OPTS = {
21
- focused: true,
22
- height: 621,
23
- left: 150,
24
- top: 150,
25
- type: 'popup',
26
- url: NOTIFICATION_URL,
27
- width: 560
16
+ focused: true,
17
+ height: 621,
18
+ left: 150,
19
+ top: 150,
20
+ type: 'popup',
21
+ url: NOTIFICATION_URL,
22
+ width: 560
28
23
  };
29
24
  const NORMAL_WINDOW_OPTS = {
30
- focused: true,
31
- type: 'normal',
32
- url: NOTIFICATION_URL
25
+ focused: true,
26
+ type: 'normal',
27
+ url: NOTIFICATION_URL
33
28
  };
34
- let NotificationOptions;
35
- exports.NotificationOptions = NotificationOptions;
29
+ var NotificationOptions;
36
30
  (function (NotificationOptions) {
37
- NotificationOptions[NotificationOptions["None"] = 0] = "None";
38
- NotificationOptions[NotificationOptions["Normal"] = 1] = "Normal";
39
- NotificationOptions[NotificationOptions["PopUp"] = 2] = "PopUp";
40
- })(NotificationOptions || (exports.NotificationOptions = NotificationOptions = {}));
31
+ NotificationOptions[NotificationOptions["None"] = 0] = "None";
32
+ NotificationOptions[NotificationOptions["Normal"] = 1] = "Normal";
33
+ NotificationOptions[NotificationOptions["PopUp"] = 2] = "PopUp";
34
+ })(NotificationOptions = exports.NotificationOptions || (exports.NotificationOptions = {}));
41
35
  const AUTH_URLS_KEY = 'authUrls';
42
36
  const DEFAULT_AUTH_ACCOUNTS = 'defaultAuthAccounts';
43
37
  function extractMetadata(store) {
44
- store.allMap(map => {
45
- const knownEntries = Object.entries(_defaults.knownGenesis);
46
- const defs = {};
47
- const removals = [];
48
- Object.entries(map).forEach(_ref => {
49
- let [key, def] = _ref;
50
- const entry = knownEntries.find(_ref2 => {
51
- let [, hashes] = _ref2;
52
- return hashes.includes(def.genesisHash);
53
- });
54
- if (entry) {
55
- const [name, hashes] = entry;
56
- const index = hashes.indexOf(def.genesisHash);
57
-
58
- // flatten the known metadata based on the genesis index
59
- // (lower is better/newer)
60
- if (!defs[name] || defs[name].index > index) {
61
- if (defs[name]) {
62
- // remove the old version of the metadata
63
- removals.push(defs[name].key);
64
- }
65
- defs[name] = {
66
- def,
67
- index,
68
- key
69
- };
70
- }
71
- } else {
72
- // this is not a known entry, so we will just apply it
73
- defs[key] = {
74
- def,
75
- index: 0,
76
- key
77
- };
78
- }
79
- });
80
- removals.forEach(key => store.remove(key));
81
- Object.values(defs).forEach(_ref3 => {
82
- let {
83
- def
84
- } = _ref3;
85
- return (0, _extensionChains.addMetadata)(def);
38
+ store.allMap((map) => {
39
+ const knownEntries = Object.entries(defaults_1.knownGenesis);
40
+ const defs = {};
41
+ const removals = [];
42
+ Object
43
+ .entries(map)
44
+ .forEach(([key, def]) => {
45
+ const entry = knownEntries.find(([, hashes]) => hashes.includes(def.genesisHash));
46
+ if (entry) {
47
+ const [name, hashes] = entry;
48
+ const index = hashes.indexOf(def.genesisHash);
49
+ // flatten the known metadata based on the genesis index
50
+ // (lower is better/newer)
51
+ if (!defs[name] || (defs[name].index > index)) {
52
+ if (defs[name]) {
53
+ // remove the old version of the metadata
54
+ removals.push(defs[name].key);
55
+ }
56
+ defs[name] = { def, index, key };
57
+ }
58
+ }
59
+ else {
60
+ // this is not a known entry, so we will just apply it
61
+ defs[key] = { def, index: 0, key };
62
+ }
63
+ });
64
+ removals.forEach((key) => store.remove(key));
65
+ Object.values(defs).forEach(({ def }) => (0, extension_chains_1.addMetadata)(def));
86
66
  });
87
- });
88
67
  }
89
68
  class State {
90
- #authUrls = {};
91
- #authRequests = {};
92
- #metaStore = new _stores.MetadataStore();
93
-
94
- // Map of providers currently injected in tabs
95
- #injectedProviders = new Map();
96
- #metaRequests = {};
97
- #notification = _uiSettings.default.notification;
98
-
99
- // Map of all providers exposed by the extension, they are retrievable by key
100
- #providers;
101
- #signRequests = {};
102
- #windows = [];
103
- #connectedTabsUrl = [];
104
- authSubject = new _rxjs.BehaviorSubject([]);
105
- metaSubject = new _rxjs.BehaviorSubject([]);
106
- signSubject = new _rxjs.BehaviorSubject([]);
107
- defaultAuthAccountSelection = [];
108
- constructor() {
109
- let providers = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
110
- this.#providers = providers;
111
- extractMetadata(this.#metaStore);
112
-
113
- // retrieve previously set authorizations
114
- const authString = localStorage.getItem(AUTH_URLS_KEY) || '{}';
115
- const previousAuth = JSON.parse(authString);
116
- this.#authUrls = previousAuth;
117
-
118
- // retrieve previously set default auth accounts
119
- const defaultAuthString = localStorage.getItem(DEFAULT_AUTH_ACCOUNTS) || '[]';
120
- const previousDefaultAuth = JSON.parse(defaultAuthString);
121
- this.defaultAuthAccountSelection = previousDefaultAuth;
122
- }
123
- get knownMetadata() {
124
- return (0, _extensionChains.knownMetadata)();
125
- }
126
- get numAuthRequests() {
127
- return Object.keys(this.#authRequests).length;
128
- }
129
- get numMetaRequests() {
130
- return Object.keys(this.#metaRequests).length;
131
- }
132
- get numSignRequests() {
133
- return Object.keys(this.#signRequests).length;
134
- }
135
- get allAuthRequests() {
136
- return Object.values(this.#authRequests).map(_ref4 => {
137
- let {
138
- id,
139
- request,
140
- url
141
- } = _ref4;
142
- return {
143
- id,
144
- request,
145
- url
146
- };
147
- });
148
- }
149
- get allMetaRequests() {
150
- return Object.values(this.#metaRequests).map(_ref5 => {
151
- let {
152
- id,
153
- request,
154
- url
155
- } = _ref5;
156
- return {
157
- id,
158
- request,
159
- url
160
- };
161
- });
162
- }
163
- get allSignRequests() {
164
- return Object.values(this.#signRequests).map(_ref6 => {
165
- let {
166
- account,
167
- id,
168
- request,
169
- url
170
- } = _ref6;
171
- return {
172
- account,
173
- id,
174
- request,
175
- url
176
- };
177
- });
178
- }
179
- get authUrls() {
180
- return this.#authUrls;
181
- }
182
- popupClose() {
183
- this.#windows.forEach(id => (0, _helpers.withErrorLog)(() => chrome.windows.remove(id)));
184
- this.#windows = [];
185
- }
186
- popupOpen() {
187
- this.#notification !== 'extension' && chrome.windows.create(this.#notification === 'window' ? NORMAL_WINDOW_OPTS : POPUP_WINDOW_OPTS, window => {
188
- if (window) {
189
- this.#windows.push(window.id || 0);
190
- }
191
- });
192
- }
193
- authComplete = (id, resolve, reject) => {
194
- var _this = this;
195
- const complete = function () {
196
- let authorizedAccounts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
197
- const {
198
- idStr,
199
- request: {
200
- origin
201
- },
202
- url
203
- } = _this.#authRequests[id];
204
- _this.#authUrls[_this.stripUrl(url)] = {
205
- authorizedAccounts,
206
- count: 0,
207
- id: idStr,
208
- origin,
209
- url
210
- };
211
- _this.saveCurrentAuthList();
212
- _this.updateDefaultAuthAccounts(authorizedAccounts);
213
- delete _this.#authRequests[id];
214
- _this.updateIconAuth(true);
215
- };
216
- return {
217
- reject: error => {
218
- complete();
219
- reject(error);
220
- },
221
- resolve: _ref7 => {
222
- let {
223
- authorizedAccounts,
224
- result
225
- } = _ref7;
226
- complete(authorizedAccounts);
227
- resolve({
228
- authorizedAccounts,
229
- result
69
+ constructor(providers = {}) {
70
+ _State_authUrls.set(this, {});
71
+ _State_authRequests.set(this, {});
72
+ _State_metaStore.set(this, new index_js_1.MetadataStore());
73
+ // Map of providers currently injected in tabs
74
+ _State_injectedProviders.set(this, new Map());
75
+ _State_metaRequests.set(this, {});
76
+ _State_notification.set(this, ui_settings_1.default.notification);
77
+ // Map of all providers exposed by the extension, they are retrievable by key
78
+ _State_providers.set(this, void 0);
79
+ _State_signRequests.set(this, {});
80
+ _State_windows.set(this, []);
81
+ _State_connectedTabsUrl.set(this, []);
82
+ this.authSubject = new rxjs_1.BehaviorSubject([]);
83
+ this.metaSubject = new rxjs_1.BehaviorSubject([]);
84
+ this.signSubject = new rxjs_1.BehaviorSubject([]);
85
+ this.defaultAuthAccountSelection = [];
86
+ this.authComplete = (id, resolve, reject) => {
87
+ const complete = (authorizedAccounts = []) => {
88
+ const { idStr, request: { origin }, url } = tslib_1.__classPrivateFieldGet(this, _State_authRequests, "f")[id];
89
+ tslib_1.__classPrivateFieldGet(this, _State_authUrls, "f")[this.stripUrl(url)] = {
90
+ authorizedAccounts,
91
+ count: 0,
92
+ id: idStr,
93
+ origin,
94
+ url
95
+ };
96
+ this.saveCurrentAuthList();
97
+ this.updateDefaultAuthAccounts(authorizedAccounts);
98
+ delete tslib_1.__classPrivateFieldGet(this, _State_authRequests, "f")[id];
99
+ this.updateIconAuth(true);
100
+ };
101
+ return {
102
+ reject: (error) => {
103
+ complete();
104
+ reject(error);
105
+ },
106
+ resolve: ({ authorizedAccounts, result }) => {
107
+ complete(authorizedAccounts);
108
+ resolve({ authorizedAccounts, result });
109
+ }
110
+ };
111
+ };
112
+ this.metaComplete = (id, resolve, reject) => {
113
+ const complete = () => {
114
+ delete tslib_1.__classPrivateFieldGet(this, _State_metaRequests, "f")[id];
115
+ this.updateIconMeta(true);
116
+ };
117
+ return {
118
+ reject: (error) => {
119
+ complete();
120
+ reject(error);
121
+ },
122
+ resolve: (result) => {
123
+ complete();
124
+ resolve(result);
125
+ }
126
+ };
127
+ };
128
+ this.signComplete = (id, resolve, reject) => {
129
+ const complete = () => {
130
+ delete tslib_1.__classPrivateFieldGet(this, _State_signRequests, "f")[id];
131
+ this.updateIconSign(true);
132
+ };
133
+ return {
134
+ reject: (error) => {
135
+ complete();
136
+ reject(error);
137
+ },
138
+ resolve: (result) => {
139
+ complete();
140
+ resolve(result);
141
+ }
142
+ };
143
+ };
144
+ tslib_1.__classPrivateFieldSet(this, _State_providers, providers, "f");
145
+ extractMetadata(tslib_1.__classPrivateFieldGet(this, _State_metaStore, "f"));
146
+ // retrieve previously set authorizations
147
+ const authString = localStorage.getItem(AUTH_URLS_KEY) || '{}';
148
+ const previousAuth = JSON.parse(authString);
149
+ tslib_1.__classPrivateFieldSet(this, _State_authUrls, previousAuth, "f");
150
+ // retrieve previously set default auth accounts
151
+ const defaultAuthString = localStorage.getItem(DEFAULT_AUTH_ACCOUNTS) || '[]';
152
+ const previousDefaultAuth = JSON.parse(defaultAuthString);
153
+ this.defaultAuthAccountSelection = previousDefaultAuth;
154
+ }
155
+ get knownMetadata() {
156
+ return (0, extension_chains_1.knownMetadata)();
157
+ }
158
+ get numAuthRequests() {
159
+ return Object.keys(tslib_1.__classPrivateFieldGet(this, _State_authRequests, "f")).length;
160
+ }
161
+ get numMetaRequests() {
162
+ return Object.keys(tslib_1.__classPrivateFieldGet(this, _State_metaRequests, "f")).length;
163
+ }
164
+ get numSignRequests() {
165
+ return Object.keys(tslib_1.__classPrivateFieldGet(this, _State_signRequests, "f")).length;
166
+ }
167
+ get allAuthRequests() {
168
+ return Object
169
+ .values(tslib_1.__classPrivateFieldGet(this, _State_authRequests, "f"))
170
+ .map(({ id, request, url }) => ({ id, request, url }));
171
+ }
172
+ get allMetaRequests() {
173
+ return Object
174
+ .values(tslib_1.__classPrivateFieldGet(this, _State_metaRequests, "f"))
175
+ .map(({ id, request, url }) => ({ id, request, url }));
176
+ }
177
+ get allSignRequests() {
178
+ return Object
179
+ .values(tslib_1.__classPrivateFieldGet(this, _State_signRequests, "f"))
180
+ .map(({ account, id, request, url }) => ({ account, id, request, url }));
181
+ }
182
+ get authUrls() {
183
+ return tslib_1.__classPrivateFieldGet(this, _State_authUrls, "f");
184
+ }
185
+ popupClose() {
186
+ tslib_1.__classPrivateFieldGet(this, _State_windows, "f").forEach((id) => (0, helpers_js_1.withErrorLog)(() => chrome.windows.remove(id)));
187
+ tslib_1.__classPrivateFieldSet(this, _State_windows, [], "f");
188
+ }
189
+ popupOpen() {
190
+ tslib_1.__classPrivateFieldGet(this, _State_notification, "f") !== 'extension' &&
191
+ chrome.windows.create(tslib_1.__classPrivateFieldGet(this, _State_notification, "f") === 'window'
192
+ ? NORMAL_WINDOW_OPTS
193
+ : POPUP_WINDOW_OPTS, (window) => {
194
+ if (window) {
195
+ tslib_1.__classPrivateFieldGet(this, _State_windows, "f").push(window.id || 0);
196
+ }
197
+ });
198
+ }
199
+ udateCurrentTabsUrl(urls) {
200
+ const connectedTabs = urls.map((url) => {
201
+ let strippedUrl = '';
202
+ // the assert in stripUrl may throw for new tabs with "chrome://newtab/"
203
+ try {
204
+ strippedUrl = this.stripUrl(url);
205
+ }
206
+ catch (e) {
207
+ console.error(e);
208
+ }
209
+ // return the stripped url only if this website is known
210
+ return !!strippedUrl && this.authUrls[strippedUrl]
211
+ ? strippedUrl
212
+ : undefined;
213
+ })
214
+ .filter((value) => !!value);
215
+ tslib_1.__classPrivateFieldSet(this, _State_connectedTabsUrl, connectedTabs, "f");
216
+ }
217
+ getConnectedTabsUrl() {
218
+ return tslib_1.__classPrivateFieldGet(this, _State_connectedTabsUrl, "f");
219
+ }
220
+ deleteAuthRequest(requestId) {
221
+ delete tslib_1.__classPrivateFieldGet(this, _State_authRequests, "f")[requestId];
222
+ this.updateIconAuth(true);
223
+ }
224
+ saveCurrentAuthList() {
225
+ localStorage.setItem(AUTH_URLS_KEY, JSON.stringify(tslib_1.__classPrivateFieldGet(this, _State_authUrls, "f")));
226
+ }
227
+ saveDefaultAuthAccounts() {
228
+ localStorage.setItem(DEFAULT_AUTH_ACCOUNTS, JSON.stringify(this.defaultAuthAccountSelection));
229
+ }
230
+ updateDefaultAuthAccounts(newList) {
231
+ this.defaultAuthAccountSelection = newList;
232
+ this.saveDefaultAuthAccounts();
233
+ }
234
+ stripUrl(url) {
235
+ (0, util_1.assert)(url && (url.startsWith('http:') || url.startsWith('https:') || url.startsWith('ipfs:') || url.startsWith('ipns:')), `Invalid url ${url}, expected to start with http: or https: or ipfs: or ipns:`);
236
+ const parts = url.split('/');
237
+ return parts[2];
238
+ }
239
+ updateIcon(shouldClose) {
240
+ const authCount = this.numAuthRequests;
241
+ const metaCount = this.numMetaRequests;
242
+ const signCount = this.numSignRequests;
243
+ const text = (authCount
244
+ ? 'Auth'
245
+ : metaCount
246
+ ? 'Meta'
247
+ : (signCount ? `${signCount}` : ''));
248
+ (0, helpers_js_1.withErrorLog)(() => chrome.browserAction.setBadgeText({ text }));
249
+ if (shouldClose && text === '') {
250
+ this.popupClose();
251
+ }
252
+ }
253
+ removeAuthorization(url) {
254
+ const entry = tslib_1.__classPrivateFieldGet(this, _State_authUrls, "f")[url];
255
+ (0, util_1.assert)(entry, `The source ${url} is not known`);
256
+ delete tslib_1.__classPrivateFieldGet(this, _State_authUrls, "f")[url];
257
+ this.saveCurrentAuthList();
258
+ return tslib_1.__classPrivateFieldGet(this, _State_authUrls, "f");
259
+ }
260
+ updateIconAuth(shouldClose) {
261
+ this.authSubject.next(this.allAuthRequests);
262
+ this.updateIcon(shouldClose);
263
+ }
264
+ updateIconMeta(shouldClose) {
265
+ this.metaSubject.next(this.allMetaRequests);
266
+ this.updateIcon(shouldClose);
267
+ }
268
+ updateIconSign(shouldClose) {
269
+ this.signSubject.next(this.allSignRequests);
270
+ this.updateIcon(shouldClose);
271
+ }
272
+ updateAuthorizedAccounts(authorizedAccountDiff) {
273
+ authorizedAccountDiff.forEach(([url, authorizedAccountDiff]) => {
274
+ tslib_1.__classPrivateFieldGet(this, _State_authUrls, "f")[url].authorizedAccounts = authorizedAccountDiff;
230
275
  });
231
- }
232
- };
233
- };
234
- udateCurrentTabsUrl(urls) {
235
- const connectedTabs = urls.map(url => {
236
- let strippedUrl = '';
237
-
238
- // the assert in stripUrl may throw for new tabs with "chrome://newtab/"
239
- try {
240
- strippedUrl = this.stripUrl(url);
241
- } catch (e) {
242
- console.error(e);
243
- }
244
-
245
- // return the stripped url only if this website is known
246
- return !!strippedUrl && this.authUrls[strippedUrl] ? strippedUrl : undefined;
247
- }).filter(value => !!value);
248
- this.#connectedTabsUrl = connectedTabs;
249
- }
250
- getConnectedTabsUrl() {
251
- return this.#connectedTabsUrl;
252
- }
253
- deleteAuthRequest(requestId) {
254
- delete this.#authRequests[requestId];
255
- this.updateIconAuth(true);
256
- }
257
- saveCurrentAuthList() {
258
- localStorage.setItem(AUTH_URLS_KEY, JSON.stringify(this.#authUrls));
259
- }
260
- saveDefaultAuthAccounts() {
261
- localStorage.setItem(DEFAULT_AUTH_ACCOUNTS, JSON.stringify(this.defaultAuthAccountSelection));
262
- }
263
- updateDefaultAuthAccounts(newList) {
264
- this.defaultAuthAccountSelection = newList;
265
- this.saveDefaultAuthAccounts();
266
- }
267
- metaComplete = (id, resolve, reject) => {
268
- const complete = () => {
269
- delete this.#metaRequests[id];
270
- this.updateIconMeta(true);
271
- };
272
- return {
273
- reject: error => {
274
- complete();
275
- reject(error);
276
- },
277
- resolve: result => {
278
- complete();
279
- resolve(result);
280
- }
281
- };
282
- };
283
- signComplete = (id, resolve, reject) => {
284
- const complete = () => {
285
- delete this.#signRequests[id];
286
- this.updateIconSign(true);
287
- };
288
- return {
289
- reject: error => {
290
- complete();
291
- reject(error);
292
- },
293
- resolve: result => {
294
- complete();
295
- resolve(result);
296
- }
297
- };
298
- };
299
- stripUrl(url) {
300
- (0, _util.assert)(url && (url.startsWith('http:') || url.startsWith('https:') || url.startsWith('ipfs:') || url.startsWith('ipns:')), `Invalid url ${url}, expected to start with http: or https: or ipfs: or ipns:`);
301
- const parts = url.split('/');
302
- return parts[2];
303
- }
304
- updateIcon(shouldClose) {
305
- const authCount = this.numAuthRequests;
306
- const metaCount = this.numMetaRequests;
307
- const signCount = this.numSignRequests;
308
- const text = authCount ? 'Auth' : metaCount ? 'Meta' : signCount ? `${signCount}` : '';
309
- (0, _helpers.withErrorLog)(() => chrome.browserAction.setBadgeText({
310
- text
311
- }));
312
- if (shouldClose && text === '') {
313
- this.popupClose();
314
- }
315
- }
316
- removeAuthorization(url) {
317
- const entry = this.#authUrls[url];
318
- (0, _util.assert)(entry, `The source ${url} is not known`);
319
- delete this.#authUrls[url];
320
- this.saveCurrentAuthList();
321
- return this.#authUrls;
322
- }
323
- updateIconAuth(shouldClose) {
324
- this.authSubject.next(this.allAuthRequests);
325
- this.updateIcon(shouldClose);
326
- }
327
- updateIconMeta(shouldClose) {
328
- this.metaSubject.next(this.allMetaRequests);
329
- this.updateIcon(shouldClose);
330
- }
331
- updateIconSign(shouldClose) {
332
- this.signSubject.next(this.allSignRequests);
333
- this.updateIcon(shouldClose);
334
- }
335
- updateAuthorizedAccounts(authorizedAccountDiff) {
336
- authorizedAccountDiff.forEach(_ref8 => {
337
- let [url, authorizedAccountDiff] = _ref8;
338
- this.#authUrls[url].authorizedAccounts = authorizedAccountDiff;
339
- });
340
- this.saveCurrentAuthList();
341
- }
342
- async authorizeUrl(url, request) {
343
- const idStr = this.stripUrl(url);
344
-
345
- // Do not enqueue duplicate authorization requests.
346
- const isDuplicate = Object.values(this.#authRequests).some(request => request.idStr === idStr);
347
- (0, _util.assert)(!isDuplicate, `The source ${url} has a pending authorization request`);
348
- if (this.#authUrls[idStr]) {
349
- // this url was seen in the past
350
- (0, _util.assert)(this.#authUrls[idStr].authorizedAccounts || this.#authUrls[idStr].isAllowed, `The source ${url} is not allowed to interact with this extension`);
351
- return {
352
- authorizedAccounts: [],
353
- result: false
354
- };
355
- }
356
- return new Promise((resolve, reject) => {
357
- const id = (0, _getId.getId)();
358
- this.#authRequests[id] = {
359
- ...this.authComplete(id, resolve, reject),
360
- id,
361
- idStr,
362
- request,
363
- url
364
- };
365
- this.updateIconAuth();
366
- this.popupOpen();
367
- });
368
- }
369
- ensureUrlAuthorized(url) {
370
- const entry = this.#authUrls[this.stripUrl(url)];
371
- (0, _util.assert)(entry, `The source ${url} has not been enabled yet`);
372
- return true;
373
- }
374
- injectMetadata(url, request) {
375
- return new Promise((resolve, reject) => {
376
- const id = (0, _getId.getId)();
377
- this.#metaRequests[id] = {
378
- ...this.metaComplete(id, resolve, reject),
379
- id,
380
- request,
381
- url
382
- };
383
- this.updateIconMeta();
384
- this.popupOpen();
385
- });
386
- }
387
- getAuthRequest(id) {
388
- return this.#authRequests[id];
389
- }
390
- getMetaRequest(id) {
391
- return this.#metaRequests[id];
392
- }
393
- getSignRequest(id) {
394
- return this.#signRequests[id];
395
- }
396
-
397
- // List all providers the extension is exposing
398
- rpcListProviders() {
399
- return Promise.resolve(Object.keys(this.#providers).reduce((acc, key) => {
400
- acc[key] = this.#providers[key].meta;
401
- return acc;
402
- }, {}));
403
- }
404
- rpcSend(request, port) {
405
- const provider = this.#injectedProviders.get(port);
406
- (0, _util.assert)(provider, 'Cannot call pub(rpc.subscribe) before provider is set');
407
- return provider.send(request.method, request.params);
408
- }
409
-
410
- // Start a provider, return its meta
411
- rpcStartProvider(key, port) {
412
- (0, _util.assert)(Object.keys(this.#providers).includes(key), `Provider ${key} is not exposed by extension`);
413
- if (this.#injectedProviders.get(port)) {
414
- return Promise.resolve(this.#providers[key].meta);
415
- }
416
-
417
- // Instantiate the provider
418
- this.#injectedProviders.set(port, this.#providers[key].start());
419
-
420
- // Close provider connection when page is closed
421
- port.onDisconnect.addListener(() => {
422
- const provider = this.#injectedProviders.get(port);
423
- if (provider) {
424
- (0, _helpers.withErrorLog)(() => provider.disconnect());
425
- }
426
- this.#injectedProviders.delete(port);
427
- });
428
- return Promise.resolve(this.#providers[key].meta);
429
- }
430
- rpcSubscribe(_ref9, cb, port) {
431
- let {
432
- method,
433
- params,
434
- type
435
- } = _ref9;
436
- const provider = this.#injectedProviders.get(port);
437
- (0, _util.assert)(provider, 'Cannot call pub(rpc.subscribe) before provider is set');
438
- return provider.subscribe(type, method, params, cb);
439
- }
440
- rpcSubscribeConnected(_request, cb, port) {
441
- const provider = this.#injectedProviders.get(port);
442
- (0, _util.assert)(provider, 'Cannot call pub(rpc.subscribeConnected) before provider is set');
443
- cb(null, provider.isConnected); // Immediately send back current isConnected
444
- provider.on('connected', () => cb(null, true));
445
- provider.on('disconnected', () => cb(null, false));
446
- }
447
- rpcUnsubscribe(request, port) {
448
- const provider = this.#injectedProviders.get(port);
449
- (0, _util.assert)(provider, 'Cannot call pub(rpc.unsubscribe) before provider is set');
450
- return provider.unsubscribe(request.type, request.method, request.subscriptionId);
451
- }
452
- saveMetadata(meta) {
453
- this.#metaStore.set(meta.genesisHash, meta);
454
- (0, _extensionChains.addMetadata)(meta);
455
- }
456
- setNotification(notification) {
457
- this.#notification = notification;
458
- return true;
459
- }
460
- sign(url, request, account) {
461
- const id = (0, _getId.getId)();
462
- return new Promise((resolve, reject) => {
463
- this.#signRequests[id] = {
464
- ...this.signComplete(id, resolve, reject),
465
- account,
466
- id,
467
- request,
468
- url
469
- };
470
- this.updateIconSign();
471
- this.popupOpen();
472
- });
473
- }
276
+ this.saveCurrentAuthList();
277
+ }
278
+ async authorizeUrl(url, request) {
279
+ const idStr = this.stripUrl(url);
280
+ // Do not enqueue duplicate authorization requests.
281
+ const isDuplicate = Object
282
+ .values(tslib_1.__classPrivateFieldGet(this, _State_authRequests, "f"))
283
+ .some((request) => request.idStr === idStr);
284
+ (0, util_1.assert)(!isDuplicate, `The source ${url} has a pending authorization request`);
285
+ if (tslib_1.__classPrivateFieldGet(this, _State_authUrls, "f")[idStr]) {
286
+ // this url was seen in the past
287
+ (0, util_1.assert)(tslib_1.__classPrivateFieldGet(this, _State_authUrls, "f")[idStr].authorizedAccounts || tslib_1.__classPrivateFieldGet(this, _State_authUrls, "f")[idStr].isAllowed, `The source ${url} is not allowed to interact with this extension`);
288
+ return {
289
+ authorizedAccounts: [],
290
+ result: false
291
+ };
292
+ }
293
+ return new Promise((resolve, reject) => {
294
+ const id = (0, getId_1.getId)();
295
+ tslib_1.__classPrivateFieldGet(this, _State_authRequests, "f")[id] = {
296
+ ...this.authComplete(id, resolve, reject),
297
+ id,
298
+ idStr,
299
+ request,
300
+ url
301
+ };
302
+ this.updateIconAuth();
303
+ this.popupOpen();
304
+ });
305
+ }
306
+ ensureUrlAuthorized(url) {
307
+ const entry = tslib_1.__classPrivateFieldGet(this, _State_authUrls, "f")[this.stripUrl(url)];
308
+ (0, util_1.assert)(entry, `The source ${url} has not been enabled yet`);
309
+ return true;
310
+ }
311
+ injectMetadata(url, request) {
312
+ return new Promise((resolve, reject) => {
313
+ const id = (0, getId_1.getId)();
314
+ tslib_1.__classPrivateFieldGet(this, _State_metaRequests, "f")[id] = {
315
+ ...this.metaComplete(id, resolve, reject),
316
+ id,
317
+ request,
318
+ url
319
+ };
320
+ this.updateIconMeta();
321
+ this.popupOpen();
322
+ });
323
+ }
324
+ getAuthRequest(id) {
325
+ return tslib_1.__classPrivateFieldGet(this, _State_authRequests, "f")[id];
326
+ }
327
+ getMetaRequest(id) {
328
+ return tslib_1.__classPrivateFieldGet(this, _State_metaRequests, "f")[id];
329
+ }
330
+ getSignRequest(id) {
331
+ return tslib_1.__classPrivateFieldGet(this, _State_signRequests, "f")[id];
332
+ }
333
+ // List all providers the extension is exposing
334
+ rpcListProviders() {
335
+ return Promise.resolve(Object.keys(tslib_1.__classPrivateFieldGet(this, _State_providers, "f")).reduce((acc, key) => {
336
+ acc[key] = tslib_1.__classPrivateFieldGet(this, _State_providers, "f")[key].meta;
337
+ return acc;
338
+ }, {}));
339
+ }
340
+ rpcSend(request, port) {
341
+ const provider = tslib_1.__classPrivateFieldGet(this, _State_injectedProviders, "f").get(port);
342
+ (0, util_1.assert)(provider, 'Cannot call pub(rpc.subscribe) before provider is set');
343
+ return provider.send(request.method, request.params);
344
+ }
345
+ // Start a provider, return its meta
346
+ rpcStartProvider(key, port) {
347
+ (0, util_1.assert)(Object.keys(tslib_1.__classPrivateFieldGet(this, _State_providers, "f")).includes(key), `Provider ${key} is not exposed by extension`);
348
+ if (tslib_1.__classPrivateFieldGet(this, _State_injectedProviders, "f").get(port)) {
349
+ return Promise.resolve(tslib_1.__classPrivateFieldGet(this, _State_providers, "f")[key].meta);
350
+ }
351
+ // Instantiate the provider
352
+ tslib_1.__classPrivateFieldGet(this, _State_injectedProviders, "f").set(port, tslib_1.__classPrivateFieldGet(this, _State_providers, "f")[key].start());
353
+ // Close provider connection when page is closed
354
+ port.onDisconnect.addListener(() => {
355
+ const provider = tslib_1.__classPrivateFieldGet(this, _State_injectedProviders, "f").get(port);
356
+ if (provider) {
357
+ (0, helpers_js_1.withErrorLog)(() => provider.disconnect());
358
+ }
359
+ tslib_1.__classPrivateFieldGet(this, _State_injectedProviders, "f").delete(port);
360
+ });
361
+ return Promise.resolve(tslib_1.__classPrivateFieldGet(this, _State_providers, "f")[key].meta);
362
+ }
363
+ rpcSubscribe({ method, params, type }, cb, port) {
364
+ const provider = tslib_1.__classPrivateFieldGet(this, _State_injectedProviders, "f").get(port);
365
+ (0, util_1.assert)(provider, 'Cannot call pub(rpc.subscribe) before provider is set');
366
+ return provider.subscribe(type, method, params, cb);
367
+ }
368
+ rpcSubscribeConnected(_request, cb, port) {
369
+ const provider = tslib_1.__classPrivateFieldGet(this, _State_injectedProviders, "f").get(port);
370
+ (0, util_1.assert)(provider, 'Cannot call pub(rpc.subscribeConnected) before provider is set');
371
+ cb(null, provider.isConnected); // Immediately send back current isConnected
372
+ provider.on('connected', () => cb(null, true));
373
+ provider.on('disconnected', () => cb(null, false));
374
+ }
375
+ rpcUnsubscribe(request, port) {
376
+ const provider = tslib_1.__classPrivateFieldGet(this, _State_injectedProviders, "f").get(port);
377
+ (0, util_1.assert)(provider, 'Cannot call pub(rpc.unsubscribe) before provider is set');
378
+ return provider.unsubscribe(request.type, request.method, request.subscriptionId);
379
+ }
380
+ saveMetadata(meta) {
381
+ tslib_1.__classPrivateFieldGet(this, _State_metaStore, "f").set(meta.genesisHash, meta);
382
+ (0, extension_chains_1.addMetadata)(meta);
383
+ }
384
+ setNotification(notification) {
385
+ tslib_1.__classPrivateFieldSet(this, _State_notification, notification, "f");
386
+ return true;
387
+ }
388
+ sign(url, request, account) {
389
+ const id = (0, getId_1.getId)();
390
+ return new Promise((resolve, reject) => {
391
+ tslib_1.__classPrivateFieldGet(this, _State_signRequests, "f")[id] = {
392
+ ...this.signComplete(id, resolve, reject),
393
+ account,
394
+ id,
395
+ request,
396
+ url
397
+ };
398
+ this.updateIconSign();
399
+ this.popupOpen();
400
+ });
401
+ }
474
402
  }
475
- exports.default = State;
403
+ exports.default = State;
404
+ _State_authUrls = new WeakMap(), _State_authRequests = new WeakMap(), _State_metaStore = new WeakMap(), _State_injectedProviders = new WeakMap(), _State_metaRequests = new WeakMap(), _State_notification = new WeakMap(), _State_providers = new WeakMap(), _State_signRequests = new WeakMap(), _State_windows = new WeakMap(), _State_connectedTabsUrl = new WeakMap();