@polkadot/extension-base 0.45.1 → 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.
- package/background/RequestBytesSign.d.ts +1 -1
- package/background/RequestBytesSign.js +0 -1
- package/background/RequestExtrinsicSign.d.ts +1 -1
- package/background/RequestExtrinsicSign.js +0 -1
- package/background/handlers/Extension.d.ts +2 -2
- package/background/handlers/Extension.js +37 -34
- package/background/handlers/State.d.ts +1 -1
- package/background/handlers/State.js +126 -123
- package/background/handlers/Tabs.d.ts +2 -2
- package/background/handlers/Tabs.js +23 -20
- package/background/handlers/index.d.ts +1 -1
- package/background/handlers/subscriptions.d.ts +1 -1
- package/background/types.d.ts +2 -2
- package/bundle.d.ts +1 -1
- package/cjs/background/handlers/Extension.js +11 -11
- package/cjs/background/handlers/State.js +6 -6
- package/cjs/background/handlers/Tabs.js +14 -14
- package/cjs/background/handlers/index.js +8 -8
- package/cjs/bundle.js +2 -2
- package/cjs/detectPackage.js +3 -3
- package/cjs/index.js +1 -1
- package/cjs/packageInfo.js +1 -1
- package/cjs/page/Injected.js +8 -8
- package/cjs/page/PostMessageProvider.js +2 -2
- package/cjs/page/index.js +6 -6
- package/cjs/stores/Accounts.js +5 -5
- package/cjs/stores/Metadata.js +5 -5
- package/cjs/stores/index.js +4 -4
- package/cjs/utils/getId.js +2 -2
- package/cjs/utils/index.js +2 -2
- package/index.d.ts +1 -1
- package/package.json +14 -14
- package/packageInfo.js +1 -1
- package/page/Accounts.d.ts +1 -1
- package/page/Injected.d.ts +5 -5
- package/page/Injected.js +1 -5
- package/page/Metadata.d.ts +1 -1
- package/page/PostMessageProvider.d.ts +1 -1
- package/page/PostMessageProvider.js +24 -21
- package/page/Signer.d.ts +1 -1
- package/page/index.d.ts +2 -2
- package/page/types.d.ts +1 -1
- package/stores/Accounts.d.ts +1 -1
- package/stores/Base.js +11 -8
- package/stores/Metadata.d.ts +1 -1
- package/stores/index.d.ts +2 -2
- package/utils/index.d.ts +1 -1
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
var _State_authUrls, _State_authRequests, _State_metaStore, _State_injectedProviders, _State_metaRequests, _State_notification, _State_providers, _State_signRequests, _State_windows, _State_connectedTabsUrl;
|
|
2
|
+
import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
|
|
1
3
|
import { BehaviorSubject } from 'rxjs';
|
|
2
4
|
import { getId } from '@polkadot/extension-base/utils/getId';
|
|
3
5
|
import { addMetadata, knownMetadata } from '@polkadot/extension-chains';
|
|
@@ -61,29 +63,87 @@ function extractMetadata(store) {
|
|
|
61
63
|
});
|
|
62
64
|
}
|
|
63
65
|
export default class State {
|
|
64
|
-
#authUrls = {};
|
|
65
|
-
#authRequests = {};
|
|
66
|
-
#metaStore = new MetadataStore();
|
|
67
|
-
// Map of providers currently injected in tabs
|
|
68
|
-
#injectedProviders = new Map();
|
|
69
|
-
#metaRequests = {};
|
|
70
|
-
#notification = settings.notification;
|
|
71
|
-
// Map of all providers exposed by the extension, they are retrievable by key
|
|
72
|
-
#providers;
|
|
73
|
-
#signRequests = {};
|
|
74
|
-
#windows = [];
|
|
75
|
-
#connectedTabsUrl = [];
|
|
76
|
-
authSubject = new BehaviorSubject([]);
|
|
77
|
-
metaSubject = new BehaviorSubject([]);
|
|
78
|
-
signSubject = new BehaviorSubject([]);
|
|
79
|
-
defaultAuthAccountSelection = [];
|
|
80
66
|
constructor(providers = {}) {
|
|
81
|
-
this
|
|
82
|
-
|
|
67
|
+
_State_authUrls.set(this, {});
|
|
68
|
+
_State_authRequests.set(this, {});
|
|
69
|
+
_State_metaStore.set(this, new MetadataStore());
|
|
70
|
+
// Map of providers currently injected in tabs
|
|
71
|
+
_State_injectedProviders.set(this, new Map());
|
|
72
|
+
_State_metaRequests.set(this, {});
|
|
73
|
+
_State_notification.set(this, settings.notification);
|
|
74
|
+
// Map of all providers exposed by the extension, they are retrievable by key
|
|
75
|
+
_State_providers.set(this, void 0);
|
|
76
|
+
_State_signRequests.set(this, {});
|
|
77
|
+
_State_windows.set(this, []);
|
|
78
|
+
_State_connectedTabsUrl.set(this, []);
|
|
79
|
+
this.authSubject = new BehaviorSubject([]);
|
|
80
|
+
this.metaSubject = new BehaviorSubject([]);
|
|
81
|
+
this.signSubject = new BehaviorSubject([]);
|
|
82
|
+
this.defaultAuthAccountSelection = [];
|
|
83
|
+
this.authComplete = (id, resolve, reject) => {
|
|
84
|
+
const complete = (authorizedAccounts = []) => {
|
|
85
|
+
const { idStr, request: { origin }, url } = __classPrivateFieldGet(this, _State_authRequests, "f")[id];
|
|
86
|
+
__classPrivateFieldGet(this, _State_authUrls, "f")[this.stripUrl(url)] = {
|
|
87
|
+
authorizedAccounts,
|
|
88
|
+
count: 0,
|
|
89
|
+
id: idStr,
|
|
90
|
+
origin,
|
|
91
|
+
url
|
|
92
|
+
};
|
|
93
|
+
this.saveCurrentAuthList();
|
|
94
|
+
this.updateDefaultAuthAccounts(authorizedAccounts);
|
|
95
|
+
delete __classPrivateFieldGet(this, _State_authRequests, "f")[id];
|
|
96
|
+
this.updateIconAuth(true);
|
|
97
|
+
};
|
|
98
|
+
return {
|
|
99
|
+
reject: (error) => {
|
|
100
|
+
complete();
|
|
101
|
+
reject(error);
|
|
102
|
+
},
|
|
103
|
+
resolve: ({ authorizedAccounts, result }) => {
|
|
104
|
+
complete(authorizedAccounts);
|
|
105
|
+
resolve({ authorizedAccounts, result });
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
};
|
|
109
|
+
this.metaComplete = (id, resolve, reject) => {
|
|
110
|
+
const complete = () => {
|
|
111
|
+
delete __classPrivateFieldGet(this, _State_metaRequests, "f")[id];
|
|
112
|
+
this.updateIconMeta(true);
|
|
113
|
+
};
|
|
114
|
+
return {
|
|
115
|
+
reject: (error) => {
|
|
116
|
+
complete();
|
|
117
|
+
reject(error);
|
|
118
|
+
},
|
|
119
|
+
resolve: (result) => {
|
|
120
|
+
complete();
|
|
121
|
+
resolve(result);
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
};
|
|
125
|
+
this.signComplete = (id, resolve, reject) => {
|
|
126
|
+
const complete = () => {
|
|
127
|
+
delete __classPrivateFieldGet(this, _State_signRequests, "f")[id];
|
|
128
|
+
this.updateIconSign(true);
|
|
129
|
+
};
|
|
130
|
+
return {
|
|
131
|
+
reject: (error) => {
|
|
132
|
+
complete();
|
|
133
|
+
reject(error);
|
|
134
|
+
},
|
|
135
|
+
resolve: (result) => {
|
|
136
|
+
complete();
|
|
137
|
+
resolve(result);
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
};
|
|
141
|
+
__classPrivateFieldSet(this, _State_providers, providers, "f");
|
|
142
|
+
extractMetadata(__classPrivateFieldGet(this, _State_metaStore, "f"));
|
|
83
143
|
// retrieve previously set authorizations
|
|
84
144
|
const authString = localStorage.getItem(AUTH_URLS_KEY) || '{}';
|
|
85
145
|
const previousAuth = JSON.parse(authString);
|
|
86
|
-
this
|
|
146
|
+
__classPrivateFieldSet(this, _State_authUrls, previousAuth, "f");
|
|
87
147
|
// retrieve previously set default auth accounts
|
|
88
148
|
const defaultAuthString = localStorage.getItem(DEFAULT_AUTH_ACCOUNTS) || '[]';
|
|
89
149
|
const previousDefaultAuth = JSON.parse(defaultAuthString);
|
|
@@ -93,72 +153,46 @@ export default class State {
|
|
|
93
153
|
return knownMetadata();
|
|
94
154
|
}
|
|
95
155
|
get numAuthRequests() {
|
|
96
|
-
return Object.keys(this
|
|
156
|
+
return Object.keys(__classPrivateFieldGet(this, _State_authRequests, "f")).length;
|
|
97
157
|
}
|
|
98
158
|
get numMetaRequests() {
|
|
99
|
-
return Object.keys(this
|
|
159
|
+
return Object.keys(__classPrivateFieldGet(this, _State_metaRequests, "f")).length;
|
|
100
160
|
}
|
|
101
161
|
get numSignRequests() {
|
|
102
|
-
return Object.keys(this
|
|
162
|
+
return Object.keys(__classPrivateFieldGet(this, _State_signRequests, "f")).length;
|
|
103
163
|
}
|
|
104
164
|
get allAuthRequests() {
|
|
105
165
|
return Object
|
|
106
|
-
.values(this
|
|
166
|
+
.values(__classPrivateFieldGet(this, _State_authRequests, "f"))
|
|
107
167
|
.map(({ id, request, url }) => ({ id, request, url }));
|
|
108
168
|
}
|
|
109
169
|
get allMetaRequests() {
|
|
110
170
|
return Object
|
|
111
|
-
.values(this
|
|
171
|
+
.values(__classPrivateFieldGet(this, _State_metaRequests, "f"))
|
|
112
172
|
.map(({ id, request, url }) => ({ id, request, url }));
|
|
113
173
|
}
|
|
114
174
|
get allSignRequests() {
|
|
115
175
|
return Object
|
|
116
|
-
.values(this
|
|
176
|
+
.values(__classPrivateFieldGet(this, _State_signRequests, "f"))
|
|
117
177
|
.map(({ account, id, request, url }) => ({ account, id, request, url }));
|
|
118
178
|
}
|
|
119
179
|
get authUrls() {
|
|
120
|
-
return this
|
|
180
|
+
return __classPrivateFieldGet(this, _State_authUrls, "f");
|
|
121
181
|
}
|
|
122
182
|
popupClose() {
|
|
123
|
-
this
|
|
124
|
-
this
|
|
183
|
+
__classPrivateFieldGet(this, _State_windows, "f").forEach((id) => withErrorLog(() => chrome.windows.remove(id)));
|
|
184
|
+
__classPrivateFieldSet(this, _State_windows, [], "f");
|
|
125
185
|
}
|
|
126
186
|
popupOpen() {
|
|
127
|
-
this
|
|
128
|
-
chrome.windows.create(this
|
|
187
|
+
__classPrivateFieldGet(this, _State_notification, "f") !== 'extension' &&
|
|
188
|
+
chrome.windows.create(__classPrivateFieldGet(this, _State_notification, "f") === 'window'
|
|
129
189
|
? NORMAL_WINDOW_OPTS
|
|
130
190
|
: POPUP_WINDOW_OPTS, (window) => {
|
|
131
191
|
if (window) {
|
|
132
|
-
this
|
|
192
|
+
__classPrivateFieldGet(this, _State_windows, "f").push(window.id || 0);
|
|
133
193
|
}
|
|
134
194
|
});
|
|
135
195
|
}
|
|
136
|
-
authComplete = (id, resolve, reject) => {
|
|
137
|
-
const complete = (authorizedAccounts = []) => {
|
|
138
|
-
const { idStr, request: { origin }, url } = this.#authRequests[id];
|
|
139
|
-
this.#authUrls[this.stripUrl(url)] = {
|
|
140
|
-
authorizedAccounts,
|
|
141
|
-
count: 0,
|
|
142
|
-
id: idStr,
|
|
143
|
-
origin,
|
|
144
|
-
url
|
|
145
|
-
};
|
|
146
|
-
this.saveCurrentAuthList();
|
|
147
|
-
this.updateDefaultAuthAccounts(authorizedAccounts);
|
|
148
|
-
delete this.#authRequests[id];
|
|
149
|
-
this.updateIconAuth(true);
|
|
150
|
-
};
|
|
151
|
-
return {
|
|
152
|
-
reject: (error) => {
|
|
153
|
-
complete();
|
|
154
|
-
reject(error);
|
|
155
|
-
},
|
|
156
|
-
resolve: ({ authorizedAccounts, result }) => {
|
|
157
|
-
complete(authorizedAccounts);
|
|
158
|
-
resolve({ authorizedAccounts, result });
|
|
159
|
-
}
|
|
160
|
-
};
|
|
161
|
-
};
|
|
162
196
|
udateCurrentTabsUrl(urls) {
|
|
163
197
|
const connectedTabs = urls.map((url) => {
|
|
164
198
|
let strippedUrl = '';
|
|
@@ -175,17 +209,17 @@ export default class State {
|
|
|
175
209
|
: undefined;
|
|
176
210
|
})
|
|
177
211
|
.filter((value) => !!value);
|
|
178
|
-
this
|
|
212
|
+
__classPrivateFieldSet(this, _State_connectedTabsUrl, connectedTabs, "f");
|
|
179
213
|
}
|
|
180
214
|
getConnectedTabsUrl() {
|
|
181
|
-
return this
|
|
215
|
+
return __classPrivateFieldGet(this, _State_connectedTabsUrl, "f");
|
|
182
216
|
}
|
|
183
217
|
deleteAuthRequest(requestId) {
|
|
184
|
-
delete this
|
|
218
|
+
delete __classPrivateFieldGet(this, _State_authRequests, "f")[requestId];
|
|
185
219
|
this.updateIconAuth(true);
|
|
186
220
|
}
|
|
187
221
|
saveCurrentAuthList() {
|
|
188
|
-
localStorage.setItem(AUTH_URLS_KEY, JSON.stringify(this
|
|
222
|
+
localStorage.setItem(AUTH_URLS_KEY, JSON.stringify(__classPrivateFieldGet(this, _State_authUrls, "f")));
|
|
189
223
|
}
|
|
190
224
|
saveDefaultAuthAccounts() {
|
|
191
225
|
localStorage.setItem(DEFAULT_AUTH_ACCOUNTS, JSON.stringify(this.defaultAuthAccountSelection));
|
|
@@ -194,38 +228,6 @@ export default class State {
|
|
|
194
228
|
this.defaultAuthAccountSelection = newList;
|
|
195
229
|
this.saveDefaultAuthAccounts();
|
|
196
230
|
}
|
|
197
|
-
metaComplete = (id, resolve, reject) => {
|
|
198
|
-
const complete = () => {
|
|
199
|
-
delete this.#metaRequests[id];
|
|
200
|
-
this.updateIconMeta(true);
|
|
201
|
-
};
|
|
202
|
-
return {
|
|
203
|
-
reject: (error) => {
|
|
204
|
-
complete();
|
|
205
|
-
reject(error);
|
|
206
|
-
},
|
|
207
|
-
resolve: (result) => {
|
|
208
|
-
complete();
|
|
209
|
-
resolve(result);
|
|
210
|
-
}
|
|
211
|
-
};
|
|
212
|
-
};
|
|
213
|
-
signComplete = (id, resolve, reject) => {
|
|
214
|
-
const complete = () => {
|
|
215
|
-
delete this.#signRequests[id];
|
|
216
|
-
this.updateIconSign(true);
|
|
217
|
-
};
|
|
218
|
-
return {
|
|
219
|
-
reject: (error) => {
|
|
220
|
-
complete();
|
|
221
|
-
reject(error);
|
|
222
|
-
},
|
|
223
|
-
resolve: (result) => {
|
|
224
|
-
complete();
|
|
225
|
-
resolve(result);
|
|
226
|
-
}
|
|
227
|
-
};
|
|
228
|
-
};
|
|
229
231
|
stripUrl(url) {
|
|
230
232
|
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:`);
|
|
231
233
|
const parts = url.split('/');
|
|
@@ -246,11 +248,11 @@ export default class State {
|
|
|
246
248
|
}
|
|
247
249
|
}
|
|
248
250
|
removeAuthorization(url) {
|
|
249
|
-
const entry = this
|
|
251
|
+
const entry = __classPrivateFieldGet(this, _State_authUrls, "f")[url];
|
|
250
252
|
assert(entry, `The source ${url} is not known`);
|
|
251
|
-
delete this
|
|
253
|
+
delete __classPrivateFieldGet(this, _State_authUrls, "f")[url];
|
|
252
254
|
this.saveCurrentAuthList();
|
|
253
|
-
return this
|
|
255
|
+
return __classPrivateFieldGet(this, _State_authUrls, "f");
|
|
254
256
|
}
|
|
255
257
|
updateIconAuth(shouldClose) {
|
|
256
258
|
this.authSubject.next(this.allAuthRequests);
|
|
@@ -266,7 +268,7 @@ export default class State {
|
|
|
266
268
|
}
|
|
267
269
|
updateAuthorizedAccounts(authorizedAccountDiff) {
|
|
268
270
|
authorizedAccountDiff.forEach(([url, authorizedAccountDiff]) => {
|
|
269
|
-
this
|
|
271
|
+
__classPrivateFieldGet(this, _State_authUrls, "f")[url].authorizedAccounts = authorizedAccountDiff;
|
|
270
272
|
});
|
|
271
273
|
this.saveCurrentAuthList();
|
|
272
274
|
}
|
|
@@ -274,12 +276,12 @@ export default class State {
|
|
|
274
276
|
const idStr = this.stripUrl(url);
|
|
275
277
|
// Do not enqueue duplicate authorization requests.
|
|
276
278
|
const isDuplicate = Object
|
|
277
|
-
.values(this
|
|
279
|
+
.values(__classPrivateFieldGet(this, _State_authRequests, "f"))
|
|
278
280
|
.some((request) => request.idStr === idStr);
|
|
279
281
|
assert(!isDuplicate, `The source ${url} has a pending authorization request`);
|
|
280
|
-
if (this
|
|
282
|
+
if (__classPrivateFieldGet(this, _State_authUrls, "f")[idStr]) {
|
|
281
283
|
// this url was seen in the past
|
|
282
|
-
assert(this
|
|
284
|
+
assert(__classPrivateFieldGet(this, _State_authUrls, "f")[idStr].authorizedAccounts || __classPrivateFieldGet(this, _State_authUrls, "f")[idStr].isAllowed, `The source ${url} is not allowed to interact with this extension`);
|
|
283
285
|
return {
|
|
284
286
|
authorizedAccounts: [],
|
|
285
287
|
result: false
|
|
@@ -287,7 +289,7 @@ export default class State {
|
|
|
287
289
|
}
|
|
288
290
|
return new Promise((resolve, reject) => {
|
|
289
291
|
const id = getId();
|
|
290
|
-
this
|
|
292
|
+
__classPrivateFieldGet(this, _State_authRequests, "f")[id] = {
|
|
291
293
|
...this.authComplete(id, resolve, reject),
|
|
292
294
|
id,
|
|
293
295
|
idStr,
|
|
@@ -299,14 +301,14 @@ export default class State {
|
|
|
299
301
|
});
|
|
300
302
|
}
|
|
301
303
|
ensureUrlAuthorized(url) {
|
|
302
|
-
const entry = this
|
|
304
|
+
const entry = __classPrivateFieldGet(this, _State_authUrls, "f")[this.stripUrl(url)];
|
|
303
305
|
assert(entry, `The source ${url} has not been enabled yet`);
|
|
304
306
|
return true;
|
|
305
307
|
}
|
|
306
308
|
injectMetadata(url, request) {
|
|
307
309
|
return new Promise((resolve, reject) => {
|
|
308
310
|
const id = getId();
|
|
309
|
-
this
|
|
311
|
+
__classPrivateFieldGet(this, _State_metaRequests, "f")[id] = {
|
|
310
312
|
...this.metaComplete(id, resolve, reject),
|
|
311
313
|
id,
|
|
312
314
|
request,
|
|
@@ -317,73 +319,73 @@ export default class State {
|
|
|
317
319
|
});
|
|
318
320
|
}
|
|
319
321
|
getAuthRequest(id) {
|
|
320
|
-
return this
|
|
322
|
+
return __classPrivateFieldGet(this, _State_authRequests, "f")[id];
|
|
321
323
|
}
|
|
322
324
|
getMetaRequest(id) {
|
|
323
|
-
return this
|
|
325
|
+
return __classPrivateFieldGet(this, _State_metaRequests, "f")[id];
|
|
324
326
|
}
|
|
325
327
|
getSignRequest(id) {
|
|
326
|
-
return this
|
|
328
|
+
return __classPrivateFieldGet(this, _State_signRequests, "f")[id];
|
|
327
329
|
}
|
|
328
330
|
// List all providers the extension is exposing
|
|
329
331
|
rpcListProviders() {
|
|
330
|
-
return Promise.resolve(Object.keys(this
|
|
331
|
-
acc[key] = this
|
|
332
|
+
return Promise.resolve(Object.keys(__classPrivateFieldGet(this, _State_providers, "f")).reduce((acc, key) => {
|
|
333
|
+
acc[key] = __classPrivateFieldGet(this, _State_providers, "f")[key].meta;
|
|
332
334
|
return acc;
|
|
333
335
|
}, {}));
|
|
334
336
|
}
|
|
335
337
|
rpcSend(request, port) {
|
|
336
|
-
const provider = this
|
|
338
|
+
const provider = __classPrivateFieldGet(this, _State_injectedProviders, "f").get(port);
|
|
337
339
|
assert(provider, 'Cannot call pub(rpc.subscribe) before provider is set');
|
|
338
340
|
return provider.send(request.method, request.params);
|
|
339
341
|
}
|
|
340
342
|
// Start a provider, return its meta
|
|
341
343
|
rpcStartProvider(key, port) {
|
|
342
|
-
assert(Object.keys(this
|
|
343
|
-
if (this
|
|
344
|
-
return Promise.resolve(this
|
|
344
|
+
assert(Object.keys(__classPrivateFieldGet(this, _State_providers, "f")).includes(key), `Provider ${key} is not exposed by extension`);
|
|
345
|
+
if (__classPrivateFieldGet(this, _State_injectedProviders, "f").get(port)) {
|
|
346
|
+
return Promise.resolve(__classPrivateFieldGet(this, _State_providers, "f")[key].meta);
|
|
345
347
|
}
|
|
346
348
|
// Instantiate the provider
|
|
347
|
-
this
|
|
349
|
+
__classPrivateFieldGet(this, _State_injectedProviders, "f").set(port, __classPrivateFieldGet(this, _State_providers, "f")[key].start());
|
|
348
350
|
// Close provider connection when page is closed
|
|
349
351
|
port.onDisconnect.addListener(() => {
|
|
350
|
-
const provider = this
|
|
352
|
+
const provider = __classPrivateFieldGet(this, _State_injectedProviders, "f").get(port);
|
|
351
353
|
if (provider) {
|
|
352
354
|
withErrorLog(() => provider.disconnect());
|
|
353
355
|
}
|
|
354
|
-
this
|
|
356
|
+
__classPrivateFieldGet(this, _State_injectedProviders, "f").delete(port);
|
|
355
357
|
});
|
|
356
|
-
return Promise.resolve(this
|
|
358
|
+
return Promise.resolve(__classPrivateFieldGet(this, _State_providers, "f")[key].meta);
|
|
357
359
|
}
|
|
358
360
|
rpcSubscribe({ method, params, type }, cb, port) {
|
|
359
|
-
const provider = this
|
|
361
|
+
const provider = __classPrivateFieldGet(this, _State_injectedProviders, "f").get(port);
|
|
360
362
|
assert(provider, 'Cannot call pub(rpc.subscribe) before provider is set');
|
|
361
363
|
return provider.subscribe(type, method, params, cb);
|
|
362
364
|
}
|
|
363
365
|
rpcSubscribeConnected(_request, cb, port) {
|
|
364
|
-
const provider = this
|
|
366
|
+
const provider = __classPrivateFieldGet(this, _State_injectedProviders, "f").get(port);
|
|
365
367
|
assert(provider, 'Cannot call pub(rpc.subscribeConnected) before provider is set');
|
|
366
368
|
cb(null, provider.isConnected); // Immediately send back current isConnected
|
|
367
369
|
provider.on('connected', () => cb(null, true));
|
|
368
370
|
provider.on('disconnected', () => cb(null, false));
|
|
369
371
|
}
|
|
370
372
|
rpcUnsubscribe(request, port) {
|
|
371
|
-
const provider = this
|
|
373
|
+
const provider = __classPrivateFieldGet(this, _State_injectedProviders, "f").get(port);
|
|
372
374
|
assert(provider, 'Cannot call pub(rpc.unsubscribe) before provider is set');
|
|
373
375
|
return provider.unsubscribe(request.type, request.method, request.subscriptionId);
|
|
374
376
|
}
|
|
375
377
|
saveMetadata(meta) {
|
|
376
|
-
this
|
|
378
|
+
__classPrivateFieldGet(this, _State_metaStore, "f").set(meta.genesisHash, meta);
|
|
377
379
|
addMetadata(meta);
|
|
378
380
|
}
|
|
379
381
|
setNotification(notification) {
|
|
380
|
-
this
|
|
382
|
+
__classPrivateFieldSet(this, _State_notification, notification, "f");
|
|
381
383
|
return true;
|
|
382
384
|
}
|
|
383
385
|
sign(url, request, account) {
|
|
384
386
|
const id = getId();
|
|
385
387
|
return new Promise((resolve, reject) => {
|
|
386
|
-
this
|
|
388
|
+
__classPrivateFieldGet(this, _State_signRequests, "f")[id] = {
|
|
387
389
|
...this.signComplete(id, resolve, reject),
|
|
388
390
|
account,
|
|
389
391
|
id,
|
|
@@ -394,4 +396,5 @@ export default class State {
|
|
|
394
396
|
this.popupOpen();
|
|
395
397
|
});
|
|
396
398
|
}
|
|
397
|
-
}
|
|
399
|
+
}
|
|
400
|
+
_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();
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <reference types="chrome" />
|
|
2
|
-
import type { MessageTypes, RequestTypes, ResponseTypes } from '../types';
|
|
3
|
-
import State from './State';
|
|
2
|
+
import type { MessageTypes, RequestTypes, ResponseTypes } from '../types.js';
|
|
3
|
+
import State from './State.js';
|
|
4
4
|
export default class Tabs {
|
|
5
5
|
#private;
|
|
6
6
|
constructor(state: State);
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
var _Tabs_accountSubs, _Tabs_state;
|
|
2
|
+
import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
|
|
1
3
|
import { PHISHING_PAGE_REDIRECT } from '@polkadot/extension-base/defaults';
|
|
2
4
|
import { canDerive } from '@polkadot/extension-base/utils';
|
|
3
5
|
import { checkIfDenied } from '@polkadot/phishing';
|
|
@@ -22,13 +24,13 @@ function transformAccounts(accounts, anyType = false) {
|
|
|
22
24
|
}));
|
|
23
25
|
}
|
|
24
26
|
export default class Tabs {
|
|
25
|
-
#accountSubs = {};
|
|
26
|
-
#state;
|
|
27
27
|
constructor(state) {
|
|
28
|
-
this
|
|
28
|
+
_Tabs_accountSubs.set(this, {});
|
|
29
|
+
_Tabs_state.set(this, void 0);
|
|
30
|
+
__classPrivateFieldSet(this, _Tabs_state, state, "f");
|
|
29
31
|
}
|
|
30
32
|
filterForAuthorizedAccounts(accounts, url) {
|
|
31
|
-
const auth = this
|
|
33
|
+
const auth = __classPrivateFieldGet(this, _Tabs_state, "f").authUrls[__classPrivateFieldGet(this, _Tabs_state, "f").stripUrl(url)];
|
|
32
34
|
return accounts.filter((allAcc) => auth.authorizedAccounts
|
|
33
35
|
// we have a list, use it
|
|
34
36
|
? auth.authorizedAccounts.includes(allAcc.address)
|
|
@@ -36,7 +38,7 @@ export default class Tabs {
|
|
|
36
38
|
: auth.isAllowed);
|
|
37
39
|
}
|
|
38
40
|
authorize(url, request) {
|
|
39
|
-
return this
|
|
41
|
+
return __classPrivateFieldGet(this, _Tabs_state, "f").authorizeUrl(url, request);
|
|
40
42
|
}
|
|
41
43
|
accountsListAuthorized(url, { anyType }) {
|
|
42
44
|
const transformedAccounts = transformAccounts(accountsObservable.subject.getValue(), anyType);
|
|
@@ -44,7 +46,7 @@ export default class Tabs {
|
|
|
44
46
|
}
|
|
45
47
|
accountsSubscribeAuthorized(url, id, port) {
|
|
46
48
|
const cb = createSubscription(id, port);
|
|
47
|
-
this
|
|
49
|
+
__classPrivateFieldGet(this, _Tabs_accountSubs, "f")[id] = {
|
|
48
50
|
subscription: accountsObservable.subject.subscribe((accounts) => {
|
|
49
51
|
const transformedAccounts = transformAccounts(accounts);
|
|
50
52
|
cb(this.filterForAuthorizedAccounts(transformedAccounts, url));
|
|
@@ -57,11 +59,11 @@ export default class Tabs {
|
|
|
57
59
|
return id;
|
|
58
60
|
}
|
|
59
61
|
accountsUnsubscribe(url, { id }) {
|
|
60
|
-
const sub = this
|
|
62
|
+
const sub = __classPrivateFieldGet(this, _Tabs_accountSubs, "f")[id];
|
|
61
63
|
if (!sub || sub.url !== url) {
|
|
62
64
|
return false;
|
|
63
65
|
}
|
|
64
|
-
delete this
|
|
66
|
+
delete __classPrivateFieldGet(this, _Tabs_accountSubs, "f")[id];
|
|
65
67
|
unsubscribe(id);
|
|
66
68
|
sub.subscription.unsubscribe();
|
|
67
69
|
return true;
|
|
@@ -74,36 +76,36 @@ export default class Tabs {
|
|
|
74
76
|
bytesSign(url, request) {
|
|
75
77
|
const address = request.address;
|
|
76
78
|
const pair = this.getSigningPair(address);
|
|
77
|
-
return this
|
|
79
|
+
return __classPrivateFieldGet(this, _Tabs_state, "f").sign(url, new RequestBytesSign(request), { address, ...pair.meta });
|
|
78
80
|
}
|
|
79
81
|
extrinsicSign(url, request) {
|
|
80
82
|
const address = request.address;
|
|
81
83
|
const pair = this.getSigningPair(address);
|
|
82
|
-
return this
|
|
84
|
+
return __classPrivateFieldGet(this, _Tabs_state, "f").sign(url, new RequestExtrinsicSign(request), { address, ...pair.meta });
|
|
83
85
|
}
|
|
84
86
|
metadataProvide(url, request) {
|
|
85
|
-
return this
|
|
87
|
+
return __classPrivateFieldGet(this, _Tabs_state, "f").injectMetadata(url, request);
|
|
86
88
|
}
|
|
87
89
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
88
90
|
metadataList(url) {
|
|
89
|
-
return this
|
|
91
|
+
return __classPrivateFieldGet(this, _Tabs_state, "f").knownMetadata.map(({ genesisHash, specVersion }) => ({
|
|
90
92
|
genesisHash,
|
|
91
93
|
specVersion
|
|
92
94
|
}));
|
|
93
95
|
}
|
|
94
96
|
rpcListProviders() {
|
|
95
|
-
return this
|
|
97
|
+
return __classPrivateFieldGet(this, _Tabs_state, "f").rpcListProviders();
|
|
96
98
|
}
|
|
97
99
|
rpcSend(request, port) {
|
|
98
|
-
return this
|
|
100
|
+
return __classPrivateFieldGet(this, _Tabs_state, "f").rpcSend(request, port);
|
|
99
101
|
}
|
|
100
102
|
rpcStartProvider(key, port) {
|
|
101
|
-
return this
|
|
103
|
+
return __classPrivateFieldGet(this, _Tabs_state, "f").rpcStartProvider(key, port);
|
|
102
104
|
}
|
|
103
105
|
async rpcSubscribe(request, id, port) {
|
|
104
106
|
const innerCb = createSubscription(id, port);
|
|
105
107
|
const cb = (_error, data) => innerCb(data);
|
|
106
|
-
const subscriptionId = await this
|
|
108
|
+
const subscriptionId = await __classPrivateFieldGet(this, _Tabs_state, "f").rpcSubscribe(request, cb, port);
|
|
107
109
|
port.onDisconnect.addListener(() => {
|
|
108
110
|
unsubscribe(id);
|
|
109
111
|
withErrorLog(() => this.rpcUnsubscribe({ ...request, subscriptionId }, port));
|
|
@@ -113,14 +115,14 @@ export default class Tabs {
|
|
|
113
115
|
rpcSubscribeConnected(request, id, port) {
|
|
114
116
|
const innerCb = createSubscription(id, port);
|
|
115
117
|
const cb = (_error, data) => innerCb(data);
|
|
116
|
-
this
|
|
118
|
+
__classPrivateFieldGet(this, _Tabs_state, "f").rpcSubscribeConnected(request, cb, port);
|
|
117
119
|
port.onDisconnect.addListener(() => {
|
|
118
120
|
unsubscribe(id);
|
|
119
121
|
});
|
|
120
122
|
return Promise.resolve(true);
|
|
121
123
|
}
|
|
122
124
|
async rpcUnsubscribe(request, port) {
|
|
123
|
-
return this
|
|
125
|
+
return __classPrivateFieldGet(this, _Tabs_state, "f").rpcUnsubscribe(request, port);
|
|
124
126
|
}
|
|
125
127
|
redirectPhishingLanding(phishingWebsite) {
|
|
126
128
|
const nonFragment = phishingWebsite.split('#')[0];
|
|
@@ -146,7 +148,7 @@ export default class Tabs {
|
|
|
146
148
|
return this.redirectIfPhishing(url);
|
|
147
149
|
}
|
|
148
150
|
if (type !== 'pub(authorize.tab)') {
|
|
149
|
-
this
|
|
151
|
+
__classPrivateFieldGet(this, _Tabs_state, "f").ensureUrlAuthorized(url);
|
|
150
152
|
}
|
|
151
153
|
switch (type) {
|
|
152
154
|
case 'pub(authorize.tab)':
|
|
@@ -183,4 +185,5 @@ export default class Tabs {
|
|
|
183
185
|
throw new Error(`Unable to handle message of type ${type}`);
|
|
184
186
|
}
|
|
185
187
|
}
|
|
186
|
-
}
|
|
188
|
+
}
|
|
189
|
+
_Tabs_accountSubs = new WeakMap(), _Tabs_state = new WeakMap();
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
/// <reference types="chrome" />
|
|
2
|
-
import type { MessageTypes, TransportRequestMessage } from '../types';
|
|
2
|
+
import type { MessageTypes, TransportRequestMessage } from '../types.js';
|
|
3
3
|
export default function handler<TMessageType extends MessageTypes>({ id, message, request }: TransportRequestMessage<TMessageType>, port?: chrome.runtime.Port, extensionPortName?: string): void;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/// <reference types="chrome" />
|
|
2
|
-
import type { MessageTypesWithSubscriptions, SubscriptionMessageTypes } from '../types';
|
|
2
|
+
import type { MessageTypesWithSubscriptions, SubscriptionMessageTypes } from '../types.js';
|
|
3
3
|
export declare function createSubscription<TMessageType extends MessageTypesWithSubscriptions>(id: string, port: chrome.runtime.Port): (data: SubscriptionMessageTypes[TMessageType]) => void;
|
|
4
4
|
export declare function unsubscribe(id: string): void;
|
package/background/types.d.ts
CHANGED
|
@@ -5,8 +5,8 @@ import type { Registry, SignerPayloadJSON, SignerPayloadRaw } from '@polkadot/ty
|
|
|
5
5
|
import type { KeyringPairs$Json } from '@polkadot/ui-keyring/types';
|
|
6
6
|
import type { HexString } from '@polkadot/util/types';
|
|
7
7
|
import type { KeypairType } from '@polkadot/util-crypto/types';
|
|
8
|
-
import { ALLOWED_PATH } from '../defaults';
|
|
9
|
-
import { AuthResponse, AuthUrls } from './handlers/State';
|
|
8
|
+
import { ALLOWED_PATH } from '../defaults.js';
|
|
9
|
+
import { AuthResponse, AuthUrls } from './handlers/State.js';
|
|
10
10
|
type KeysWithDefinedValues<T> = {
|
|
11
11
|
[K in keyof T]: T[K] extends undefined ? never : K;
|
|
12
12
|
}[keyof T];
|
package/bundle.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export { packageInfo } from './packageInfo';
|
|
1
|
+
export { packageInfo } from './packageInfo.js';
|
|
@@ -9,8 +9,8 @@ const ui_keyring_1 = tslib_1.__importDefault(require("@polkadot/ui-keyring"));
|
|
|
9
9
|
const accounts_1 = require("@polkadot/ui-keyring/observable/accounts");
|
|
10
10
|
const util_1 = require("@polkadot/util");
|
|
11
11
|
const util_crypto_1 = require("@polkadot/util-crypto");
|
|
12
|
-
const
|
|
13
|
-
const
|
|
12
|
+
const helpers_js_1 = require("./helpers.js");
|
|
13
|
+
const subscriptions_js_1 = require("./subscriptions.js");
|
|
14
14
|
const SEED_DEFAULT_LENGTH = 12;
|
|
15
15
|
const SEED_LENGTHS = [12, 15, 18, 21, 24];
|
|
16
16
|
const ETH_DERIVE_DEFAULT = "/m/44'/60'/0'/0/0";
|
|
@@ -127,10 +127,10 @@ class Extension {
|
|
|
127
127
|
}
|
|
128
128
|
}
|
|
129
129
|
accountsSubscribe(id, port) {
|
|
130
|
-
const cb = (0,
|
|
130
|
+
const cb = (0, subscriptions_js_1.createSubscription)(id, port);
|
|
131
131
|
const subscription = accounts_1.accounts.subject.subscribe((accounts) => cb(this.transformAccounts(accounts)));
|
|
132
132
|
port.onDisconnect.addListener(() => {
|
|
133
|
-
(0,
|
|
133
|
+
(0, subscriptions_js_1.unsubscribe)(id);
|
|
134
134
|
subscription.unsubscribe();
|
|
135
135
|
});
|
|
136
136
|
return true;
|
|
@@ -150,10 +150,10 @@ class Extension {
|
|
|
150
150
|
}
|
|
151
151
|
// FIXME This looks very much like what we have in accounts
|
|
152
152
|
authorizeSubscribe(id, port) {
|
|
153
|
-
const cb = (0,
|
|
153
|
+
const cb = (0, subscriptions_js_1.createSubscription)(id, port);
|
|
154
154
|
const subscription = tslib_1.__classPrivateFieldGet(this, _Extension_state, "f").authSubject.subscribe((requests) => cb(requests));
|
|
155
155
|
port.onDisconnect.addListener(() => {
|
|
156
|
-
(0,
|
|
156
|
+
(0, subscriptions_js_1.unsubscribe)(id);
|
|
157
157
|
subscription.unsubscribe();
|
|
158
158
|
});
|
|
159
159
|
return true;
|
|
@@ -180,10 +180,10 @@ class Extension {
|
|
|
180
180
|
return true;
|
|
181
181
|
}
|
|
182
182
|
metadataSubscribe(id, port) {
|
|
183
|
-
const cb = (0,
|
|
183
|
+
const cb = (0, subscriptions_js_1.createSubscription)(id, port);
|
|
184
184
|
const subscription = tslib_1.__classPrivateFieldGet(this, _Extension_state, "f").metaSubject.subscribe((requests) => cb(requests));
|
|
185
185
|
port.onDisconnect.addListener(() => {
|
|
186
|
-
(0,
|
|
186
|
+
(0, subscriptions_js_1.unsubscribe)(id);
|
|
187
187
|
subscription.unsubscribe();
|
|
188
188
|
});
|
|
189
189
|
return true;
|
|
@@ -324,10 +324,10 @@ class Extension {
|
|
|
324
324
|
}
|
|
325
325
|
// FIXME This looks very much like what we have in authorization
|
|
326
326
|
signingSubscribe(id, port) {
|
|
327
|
-
const cb = (0,
|
|
327
|
+
const cb = (0, subscriptions_js_1.createSubscription)(id, port);
|
|
328
328
|
const subscription = tslib_1.__classPrivateFieldGet(this, _Extension_state, "f").signSubject.subscribe((requests) => cb(requests));
|
|
329
329
|
port.onDisconnect.addListener(() => {
|
|
330
|
-
(0,
|
|
330
|
+
(0, subscriptions_js_1.unsubscribe)(id);
|
|
331
331
|
subscription.unsubscribe();
|
|
332
332
|
});
|
|
333
333
|
return true;
|
|
@@ -338,7 +338,7 @@ class Extension {
|
|
|
338
338
|
console.error('Not allowed to open the url:', url);
|
|
339
339
|
return false;
|
|
340
340
|
}
|
|
341
|
-
(0,
|
|
341
|
+
(0, helpers_js_1.withErrorLog)(() => chrome.tabs.create({ url }));
|
|
342
342
|
return true;
|
|
343
343
|
}
|
|
344
344
|
derive(parentAddress, suri, password, metadata) {
|