@pezkuwi/extension-base 0.62.10 → 0.62.13

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 (97) hide show
  1. package/LICENSE +201 -0
  2. package/background/RequestBytesSign.js +6 -9
  3. package/background/RequestExtrinsicSign.js +6 -9
  4. package/background/handlers/Extension.js +304 -460
  5. package/background/handlers/State.js +365 -619
  6. package/background/handlers/Tabs.js +155 -273
  7. package/background/handlers/helpers.js +1 -3
  8. package/background/handlers/index.js +17 -22
  9. package/background/handlers/subscriptions.js +5 -9
  10. package/background/index.js +0 -2
  11. package/background/types.js +0 -2
  12. package/bundle.js +0 -2
  13. package/cjs/background/RequestBytesSign.d.ts +12 -0
  14. package/cjs/background/RequestBytesSign.js +15 -0
  15. package/cjs/background/RequestExtrinsicSign.d.ts +12 -0
  16. package/cjs/background/RequestExtrinsicSign.js +14 -0
  17. package/cjs/background/handlers/Extension.d.ts +49 -0
  18. package/cjs/background/handlers/Extension.js +492 -0
  19. package/cjs/background/handlers/State.d.ts +96 -0
  20. package/cjs/background/handlers/State.js +482 -0
  21. package/cjs/background/handlers/Tabs.d.ts +25 -0
  22. package/cjs/background/handlers/Tabs.js +199 -0
  23. package/cjs/background/handlers/helpers.d.ts +1 -0
  24. package/cjs/background/handlers/helpers.js +14 -0
  25. package/cjs/background/handlers/index.d.ts +3 -0
  26. package/cjs/background/handlers/index.js +46 -0
  27. package/cjs/background/handlers/subscriptions.d.ts +3 -0
  28. package/cjs/background/handlers/subscriptions.js +22 -0
  29. package/cjs/background/index.d.ts +1 -0
  30. package/cjs/background/index.js +7 -0
  31. package/cjs/background/types.d.ts +343 -0
  32. package/cjs/background/types.js +2 -0
  33. package/cjs/bundle.d.ts +1 -0
  34. package/cjs/bundle.js +5 -0
  35. package/cjs/defaults.d.ts +9 -0
  36. package/cjs/defaults.js +16 -0
  37. package/cjs/index.d.ts +1 -0
  38. package/cjs/index.js +4 -0
  39. package/cjs/package.json +3 -0
  40. package/cjs/packageDetect.d.ts +1 -0
  41. package/cjs/packageDetect.js +8 -0
  42. package/cjs/packageInfo.d.ts +6 -0
  43. package/cjs/packageInfo.js +4 -0
  44. package/cjs/page/Accounts.d.ts +7 -0
  45. package/cjs/page/Accounts.js +24 -0
  46. package/cjs/page/Injected.d.ts +13 -0
  47. package/cjs/page/Injected.js +25 -0
  48. package/cjs/page/Metadata.d.ts +7 -0
  49. package/cjs/page/Metadata.js +15 -0
  50. package/cjs/page/PostMessageProvider.d.ts +63 -0
  51. package/cjs/page/PostMessageProvider.js +135 -0
  52. package/cjs/page/Signer.d.ts +8 -0
  53. package/cjs/page/Signer.js +29 -0
  54. package/cjs/page/index.d.ts +16 -0
  55. package/cjs/page/index.js +52 -0
  56. package/cjs/page/types.d.ts +6 -0
  57. package/cjs/page/types.js +2 -0
  58. package/cjs/stores/Accounts.d.ts +6 -0
  59. package/cjs/stores/Accounts.js +21 -0
  60. package/cjs/stores/Base.d.ts +9 -0
  61. package/cjs/stores/Base.js +70 -0
  62. package/cjs/stores/Metadata.d.ts +5 -0
  63. package/cjs/stores/Metadata.js +13 -0
  64. package/cjs/stores/index.d.ts +2 -0
  65. package/cjs/stores/index.js +8 -0
  66. package/cjs/types.d.ts +9 -0
  67. package/cjs/types.js +2 -0
  68. package/cjs/utils/canDerive.d.ts +2 -0
  69. package/cjs/utils/canDerive.js +6 -0
  70. package/cjs/utils/getId.d.ts +1 -0
  71. package/cjs/utils/getId.js +8 -0
  72. package/cjs/utils/index.d.ts +1 -0
  73. package/cjs/utils/index.js +5 -0
  74. package/cjs/utils/portUtils.d.ts +13 -0
  75. package/cjs/utils/portUtils.js +49 -0
  76. package/defaults.js +10 -14
  77. package/index.js +0 -4
  78. package/package.json +464 -10
  79. package/packageDetect.js +0 -4
  80. package/packageInfo.js +1 -4
  81. package/page/Accounts.js +13 -18
  82. package/page/Injected.js +10 -10
  83. package/page/Metadata.js +8 -13
  84. package/page/PostMessageProvider.js +90 -192
  85. package/page/Signer.js +24 -90
  86. package/page/index.js +15 -72
  87. package/page/types.js +0 -2
  88. package/stores/Accounts.js +14 -80
  89. package/stores/Base.js +57 -240
  90. package/stores/Metadata.js +6 -26
  91. package/stores/index.js +0 -2
  92. package/types.js +0 -2
  93. package/utils/canDerive.js +0 -2
  94. package/utils/getId.js +2 -4
  95. package/utils/index.js +0 -2
  96. package/utils/portUtils.d.ts +0 -1
  97. package/utils/portUtils.js +31 -94
@@ -1,64 +1,3 @@
1
- // Copyright 2019-2025 @pezkuwi/extension-base authors & contributors
2
- // SPDX-License-Identifier: Apache-2.0
3
- var __assign = (this && this.__assign) || function () {
4
- __assign = Object.assign || function(t) {
5
- for (var s, i = 1, n = arguments.length; i < n; i++) {
6
- s = arguments[i];
7
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
8
- t[p] = s[p];
9
- }
10
- return t;
11
- };
12
- return __assign.apply(this, arguments);
13
- };
14
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
15
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
16
- return new (P || (P = Promise))(function (resolve, reject) {
17
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
18
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
19
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
20
- step((generator = generator.apply(thisArg, _arguments || [])).next());
21
- });
22
- };
23
- var __generator = (this && this.__generator) || function (thisArg, body) {
24
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
25
- return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
26
- function verb(n) { return function (v) { return step([n, v]); }; }
27
- function step(op) {
28
- if (f) throw new TypeError("Generator is already executing.");
29
- while (g && (g = 0, op[0] && (_ = 0)), _) try {
30
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
31
- if (y = 0, t) op = [op[0] & 2, t.value];
32
- switch (op[0]) {
33
- case 0: case 1: t = op; break;
34
- case 4: _.label++; return { value: op[1], done: false };
35
- case 5: _.label++; y = op[1]; op = [0]; continue;
36
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
37
- default:
38
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
39
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
40
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
41
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
42
- if (t[2]) _.ops.pop();
43
- _.trys.pop(); continue;
44
- }
45
- op = body.call(thisArg, _);
46
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
47
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
48
- }
49
- };
50
- var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
51
- if (kind === "m") throw new TypeError("Private method is not writable");
52
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
53
- if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
54
- return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
55
- };
56
- var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
57
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
58
- if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
59
- return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
60
- };
61
- var _Tabs_accountSubs, _Tabs_state;
62
1
  import { combineLatest } from 'rxjs';
63
2
  import { checkIfDenied } from '@pezkuwi/phishing';
64
3
  import { keyring } from '@pezkuwi/ui-keyring';
@@ -70,244 +9,187 @@ import RequestBytesSign from '../RequestBytesSign.js';
70
9
  import RequestExtrinsicSign from '../RequestExtrinsicSign.js';
71
10
  import { withErrorLog } from './helpers.js';
72
11
  import { createSubscription, unsubscribe } from './subscriptions.js';
73
- function transformAccounts(accounts, anyType) {
74
- if (anyType === void 0) { anyType = false; }
12
+ function transformAccounts(accounts, anyType = false) {
75
13
  return Object
76
14
  .values(accounts)
77
- .filter(function (_a) {
78
- var isHidden = _a.json.meta.isHidden;
79
- return !isHidden;
80
- })
81
- .filter(function (_a) {
82
- var type = _a.type;
83
- return anyType ? true : canDerive(type);
84
- })
85
- .sort(function (a, b) { return (a.json.meta.whenCreated || 0) - (b.json.meta.whenCreated || 0); })
86
- .map(function (_a) {
87
- var _b = _a.json, address = _b.address, _c = _b.meta, genesisHash = _c.genesisHash, name = _c.name, type = _a.type;
88
- return ({
89
- address: address,
90
- genesisHash: genesisHash,
91
- name: name,
92
- type: type
93
- });
94
- });
15
+ .filter(({ json: { meta: { isHidden } } }) => !isHidden)
16
+ .filter(({ type }) => anyType ? true : canDerive(type))
17
+ .sort((a, b) => (a.json.meta.whenCreated || 0) - (b.json.meta.whenCreated || 0))
18
+ .map(({ json: { address, meta: { genesisHash, name } }, type }) => ({
19
+ address,
20
+ genesisHash,
21
+ name,
22
+ type
23
+ }));
95
24
  }
96
- var Tabs = /** @class */ (function () {
97
- function Tabs(state) {
98
- _Tabs_accountSubs.set(this, {});
99
- _Tabs_state.set(this, void 0);
100
- __classPrivateFieldSet(this, _Tabs_state, state, "f");
25
+ export default class Tabs {
26
+ #accountSubs = {};
27
+ #state;
28
+ constructor(state) {
29
+ this.#state = state;
101
30
  }
102
- Tabs.prototype.filterForAuthorizedAccounts = function (accounts, url) {
103
- var auth = __classPrivateFieldGet(this, _Tabs_state, "f").authUrls[__classPrivateFieldGet(this, _Tabs_state, "f").stripUrl(url)];
31
+ filterForAuthorizedAccounts(accounts, url) {
32
+ const auth = this.#state.authUrls[this.#state.stripUrl(url)];
104
33
  if (!auth) {
105
34
  return [];
106
35
  }
107
- return accounts.filter(function (allAcc) {
108
- return auth.authorizedAccounts
109
- // we have a list, use it
110
- ? auth.authorizedAccounts.includes(allAcc.address)
111
- // if no authorizedAccounts and isAllowed return all - these are old converted urls
112
- : auth.isAllowed;
113
- });
114
- };
115
- Tabs.prototype.authorize = function (url, request) {
116
- return __classPrivateFieldGet(this, _Tabs_state, "f").authorizeUrl(url, request);
117
- };
118
- Tabs.prototype.accountsListAuthorized = function (url, _a) {
119
- var anyType = _a.anyType;
120
- var transformedAccounts = transformAccounts(accountsObservable.subject.getValue(), anyType);
36
+ return accounts.filter((allAcc) => auth.authorizedAccounts
37
+ // we have a list, use it
38
+ ? auth.authorizedAccounts.includes(allAcc.address)
39
+ // if no authorizedAccounts and isAllowed return all - these are old converted urls
40
+ : auth.isAllowed);
41
+ }
42
+ authorize(url, request) {
43
+ return this.#state.authorizeUrl(url, request);
44
+ }
45
+ accountsListAuthorized(url, { anyType }) {
46
+ const transformedAccounts = transformAccounts(accountsObservable.subject.getValue(), anyType);
121
47
  return this.filterForAuthorizedAccounts(transformedAccounts, url);
122
- };
123
- Tabs.prototype.accountsSubscribeAuthorized = function (url, id, port) {
124
- var _this = this;
125
- var _a;
126
- var cb = createSubscription(id, port);
127
- var strippedUrl = __classPrivateFieldGet(this, _Tabs_state, "f").stripUrl(url);
128
- var authUrlObservable = (_a = __classPrivateFieldGet(this, _Tabs_state, "f").authUrlSubjects[strippedUrl]) === null || _a === void 0 ? void 0 : _a.asObservable();
48
+ }
49
+ accountsSubscribeAuthorized(url, id, port) {
50
+ const cb = createSubscription(id, port);
51
+ const strippedUrl = this.#state.stripUrl(url);
52
+ const authUrlObservable = this.#state.authUrlSubjects[strippedUrl]?.asObservable();
129
53
  if (!authUrlObservable) {
130
- console.error("No authUrlSubject found for ".concat(strippedUrl));
54
+ console.error(`No authUrlSubject found for ${strippedUrl}`);
131
55
  return id;
132
56
  }
133
- __classPrivateFieldGet(this, _Tabs_accountSubs, "f")[id] = {
134
- subscription: combineLatest([accountsObservable.subject, authUrlObservable]).subscribe(function (_a) {
135
- var accounts = _a[0], _authUrlInfo = _a[1];
136
- var transformedAccounts = transformAccounts(accounts);
137
- cb(_this.filterForAuthorizedAccounts(transformedAccounts, url));
57
+ this.#accountSubs[id] = {
58
+ subscription: combineLatest([accountsObservable.subject, authUrlObservable]).subscribe(([accounts, _authUrlInfo]) => {
59
+ const transformedAccounts = transformAccounts(accounts);
60
+ cb(this.filterForAuthorizedAccounts(transformedAccounts, url));
138
61
  }),
139
- url: url
62
+ url
140
63
  };
141
- port.onDisconnect.addListener(function () {
142
- _this.accountsUnsubscribe(url, { id: id });
64
+ port.onDisconnect.addListener(() => {
65
+ this.accountsUnsubscribe(url, { id });
143
66
  });
144
67
  return id;
145
- };
146
- Tabs.prototype.accountsUnsubscribe = function (url, _a) {
147
- var id = _a.id;
148
- var sub = __classPrivateFieldGet(this, _Tabs_accountSubs, "f")[id];
68
+ }
69
+ accountsUnsubscribe(url, { id }) {
70
+ const sub = this.#accountSubs[id];
149
71
  if (!sub || sub.url !== url) {
150
72
  return false;
151
73
  }
152
- delete __classPrivateFieldGet(this, _Tabs_accountSubs, "f")[id];
74
+ delete this.#accountSubs[id];
153
75
  unsubscribe(id);
154
76
  sub.subscription.unsubscribe();
155
77
  return true;
156
- };
157
- Tabs.prototype.getSigningPair = function (address) {
158
- var pair = keyring.getPair(address);
78
+ }
79
+ getSigningPair(address) {
80
+ const pair = keyring.getPair(address);
159
81
  assert(pair, 'Unable to find keypair');
160
82
  return pair;
161
- };
162
- Tabs.prototype.bytesSign = function (url, request) {
163
- var address = request.address;
164
- var pair = this.getSigningPair(address);
165
- return __classPrivateFieldGet(this, _Tabs_state, "f").sign(url, new RequestBytesSign(request), __assign({ address: address }, pair.meta));
166
- };
167
- Tabs.prototype.extrinsicSign = function (url, request) {
168
- var address = request.address;
169
- var pair = this.getSigningPair(address);
170
- return __classPrivateFieldGet(this, _Tabs_state, "f").sign(url, new RequestExtrinsicSign(request), __assign({ address: address }, pair.meta));
171
- };
172
- Tabs.prototype.metadataProvide = function (url, request) {
173
- return __classPrivateFieldGet(this, _Tabs_state, "f").injectMetadata(url, request);
174
- };
175
- Tabs.prototype.metadataList = function (_url) {
176
- return __classPrivateFieldGet(this, _Tabs_state, "f").knownMetadata.map(function (_a) {
177
- var genesisHash = _a.genesisHash, specVersion = _a.specVersion;
178
- return ({
179
- genesisHash: genesisHash,
180
- specVersion: specVersion
181
- });
182
- });
183
- };
184
- Tabs.prototype.rpcListProviders = function () {
185
- return __classPrivateFieldGet(this, _Tabs_state, "f").rpcListProviders();
186
- };
187
- Tabs.prototype.rpcSend = function (request, port) {
188
- return __classPrivateFieldGet(this, _Tabs_state, "f").rpcSend(request, port);
189
- };
190
- Tabs.prototype.rpcStartProvider = function (key, port) {
191
- return __classPrivateFieldGet(this, _Tabs_state, "f").rpcStartProvider(key, port);
192
- };
193
- Tabs.prototype.rpcSubscribe = function (request, id, port) {
194
- return __awaiter(this, void 0, void 0, function () {
195
- var innerCb, cb, subscriptionId;
196
- var _this = this;
197
- return __generator(this, function (_a) {
198
- switch (_a.label) {
199
- case 0:
200
- innerCb = createSubscription(id, port);
201
- cb = function (_error, data) { return innerCb(data); };
202
- return [4 /*yield*/, __classPrivateFieldGet(this, _Tabs_state, "f").rpcSubscribe(request, cb, port)];
203
- case 1:
204
- subscriptionId = _a.sent();
205
- port.onDisconnect.addListener(function () {
206
- unsubscribe(id);
207
- withErrorLog(function () { return _this.rpcUnsubscribe(__assign(__assign({}, request), { subscriptionId: subscriptionId }), port); });
208
- });
209
- return [2 /*return*/, true];
210
- }
211
- });
83
+ }
84
+ bytesSign(url, request) {
85
+ const address = request.address;
86
+ const pair = this.getSigningPair(address);
87
+ return this.#state.sign(url, new RequestBytesSign(request), { address, ...pair.meta });
88
+ }
89
+ extrinsicSign(url, request) {
90
+ const address = request.address;
91
+ const pair = this.getSigningPair(address);
92
+ return this.#state.sign(url, new RequestExtrinsicSign(request), { address, ...pair.meta });
93
+ }
94
+ metadataProvide(url, request) {
95
+ return this.#state.injectMetadata(url, request);
96
+ }
97
+ metadataList(_url) {
98
+ return this.#state.knownMetadata.map(({ genesisHash, specVersion }) => ({
99
+ genesisHash,
100
+ specVersion
101
+ }));
102
+ }
103
+ rpcListProviders() {
104
+ return this.#state.rpcListProviders();
105
+ }
106
+ rpcSend(request, port) {
107
+ return this.#state.rpcSend(request, port);
108
+ }
109
+ rpcStartProvider(key, port) {
110
+ return this.#state.rpcStartProvider(key, port);
111
+ }
112
+ async rpcSubscribe(request, id, port) {
113
+ const innerCb = createSubscription(id, port);
114
+ const cb = (_error, data) => innerCb(data);
115
+ const subscriptionId = await this.#state.rpcSubscribe(request, cb, port);
116
+ port.onDisconnect.addListener(() => {
117
+ unsubscribe(id);
118
+ withErrorLog(() => this.rpcUnsubscribe({ ...request, subscriptionId }, port));
212
119
  });
213
- };
214
- Tabs.prototype.rpcSubscribeConnected = function (request, id, port) {
215
- var innerCb = createSubscription(id, port);
216
- var cb = function (_error, data) { return innerCb(data); };
217
- __classPrivateFieldGet(this, _Tabs_state, "f").rpcSubscribeConnected(request, cb, port);
218
- port.onDisconnect.addListener(function () {
120
+ return true;
121
+ }
122
+ rpcSubscribeConnected(request, id, port) {
123
+ const innerCb = createSubscription(id, port);
124
+ const cb = (_error, data) => innerCb(data);
125
+ this.#state.rpcSubscribeConnected(request, cb, port);
126
+ port.onDisconnect.addListener(() => {
219
127
  unsubscribe(id);
220
128
  });
221
129
  return Promise.resolve(true);
222
- };
223
- Tabs.prototype.rpcUnsubscribe = function (request, port) {
224
- return __awaiter(this, void 0, void 0, function () {
225
- return __generator(this, function (_a) {
226
- return [2 /*return*/, __classPrivateFieldGet(this, _Tabs_state, "f").rpcUnsubscribe(request, port)];
227
- });
228
- });
229
- };
230
- Tabs.prototype.redirectPhishingLanding = function (phishingWebsite) {
231
- var nonFragment = phishingWebsite.split('#')[0];
232
- var encodedWebsite = encodeURIComponent(nonFragment);
233
- var url = "".concat(chrome.runtime.getURL('index.html'), "#").concat(PHISHING_PAGE_REDIRECT, "/").concat(encodedWebsite);
234
- chrome.tabs.query({ url: nonFragment }, function (tabs) {
130
+ }
131
+ async rpcUnsubscribe(request, port) {
132
+ return this.#state.rpcUnsubscribe(request, port);
133
+ }
134
+ redirectPhishingLanding(phishingWebsite) {
135
+ const nonFragment = phishingWebsite.split('#')[0];
136
+ const encodedWebsite = encodeURIComponent(nonFragment);
137
+ const url = `${chrome.runtime.getURL('index.html')}#${PHISHING_PAGE_REDIRECT}/${encodedWebsite}`;
138
+ chrome.tabs.query({ url: nonFragment }, (tabs) => {
235
139
  tabs
236
- .map(function (_a) {
237
- var id = _a.id;
238
- return id;
239
- })
240
- .filter(function (id) { return isNumber(id); })
241
- .forEach(function (id) {
242
- return withErrorLog(function () { return chrome.tabs.update(id, { url: url }); });
243
- });
244
- });
245
- };
246
- Tabs.prototype.redirectIfPhishing = function (url) {
247
- return __awaiter(this, void 0, void 0, function () {
248
- var isInDenyList;
249
- return __generator(this, function (_a) {
250
- switch (_a.label) {
251
- case 0: return [4 /*yield*/, checkIfDenied(url)];
252
- case 1:
253
- isInDenyList = _a.sent();
254
- if (isInDenyList) {
255
- this.redirectPhishingLanding(url);
256
- return [2 /*return*/, true];
257
- }
258
- return [2 /*return*/, false];
259
- }
260
- });
261
- });
262
- };
263
- Tabs.prototype.handle = function (id, type, request, url, port) {
264
- return __awaiter(this, void 0, void 0, function () {
265
- return __generator(this, function (_a) {
266
- if (type === 'pub(phishing.redirectIfDenied)') {
267
- return [2 /*return*/, this.redirectIfPhishing(url)];
268
- }
269
- if (type !== 'pub(authorize.tab)') {
270
- __classPrivateFieldGet(this, _Tabs_state, "f").ensureUrlAuthorized(url);
271
- }
272
- switch (type) {
273
- case 'pub(authorize.tab)':
274
- return [2 /*return*/, this.authorize(url, request)];
275
- case 'pub(accounts.list)':
276
- return [2 /*return*/, this.accountsListAuthorized(url, request)];
277
- case 'pub(accounts.subscribe)':
278
- return [2 /*return*/, port && this.accountsSubscribeAuthorized(url, id, port)];
279
- case 'pub(accounts.unsubscribe)':
280
- return [2 /*return*/, this.accountsUnsubscribe(url, request)];
281
- case 'pub(bytes.sign)':
282
- return [2 /*return*/, this.bytesSign(url, request)];
283
- case 'pub(extrinsic.sign)':
284
- return [2 /*return*/, this.extrinsicSign(url, request)];
285
- case 'pub(metadata.list)':
286
- return [2 /*return*/, this.metadataList(url)];
287
- case 'pub(metadata.provide)':
288
- return [2 /*return*/, this.metadataProvide(url, request)];
289
- case 'pub(ping)':
290
- return [2 /*return*/, Promise.resolve(true)];
291
- case 'pub(rpc.listProviders)':
292
- return [2 /*return*/, this.rpcListProviders()];
293
- case 'pub(rpc.send)':
294
- return [2 /*return*/, port && this.rpcSend(request, port)];
295
- case 'pub(rpc.startProvider)':
296
- return [2 /*return*/, port && this.rpcStartProvider(request, port)];
297
- case 'pub(rpc.subscribe)':
298
- return [2 /*return*/, port && this.rpcSubscribe(request, id, port)];
299
- case 'pub(rpc.subscribeConnected)':
300
- return [2 /*return*/, port && this.rpcSubscribeConnected(request, id, port)];
301
- case 'pub(rpc.unsubscribe)':
302
- return [2 /*return*/, port && this.rpcUnsubscribe(request, port)];
303
- default:
304
- throw new Error("Unable to handle message of type ".concat(type));
305
- }
306
- return [2 /*return*/];
307
- });
140
+ .map(({ id }) => id)
141
+ .filter((id) => isNumber(id))
142
+ .forEach((id) => withErrorLog(() => chrome.tabs.update(id, { url })));
308
143
  });
309
- };
310
- return Tabs;
311
- }());
312
- _Tabs_accountSubs = new WeakMap(), _Tabs_state = new WeakMap();
313
- export default Tabs;
144
+ }
145
+ async redirectIfPhishing(url) {
146
+ const isInDenyList = await checkIfDenied(url);
147
+ if (isInDenyList) {
148
+ this.redirectPhishingLanding(url);
149
+ return true;
150
+ }
151
+ return false;
152
+ }
153
+ async handle(id, type, request, url, port) {
154
+ if (type === 'pub(phishing.redirectIfDenied)') {
155
+ return this.redirectIfPhishing(url);
156
+ }
157
+ if (type !== 'pub(authorize.tab)') {
158
+ this.#state.ensureUrlAuthorized(url);
159
+ }
160
+ switch (type) {
161
+ case 'pub(authorize.tab)':
162
+ return this.authorize(url, request);
163
+ case 'pub(accounts.list)':
164
+ return this.accountsListAuthorized(url, request);
165
+ case 'pub(accounts.subscribe)':
166
+ return port && this.accountsSubscribeAuthorized(url, id, port);
167
+ case 'pub(accounts.unsubscribe)':
168
+ return this.accountsUnsubscribe(url, request);
169
+ case 'pub(bytes.sign)':
170
+ return this.bytesSign(url, request);
171
+ case 'pub(extrinsic.sign)':
172
+ return this.extrinsicSign(url, request);
173
+ case 'pub(metadata.list)':
174
+ return this.metadataList(url);
175
+ case 'pub(metadata.provide)':
176
+ return this.metadataProvide(url, request);
177
+ case 'pub(ping)':
178
+ return Promise.resolve(true);
179
+ case 'pub(rpc.listProviders)':
180
+ return this.rpcListProviders();
181
+ case 'pub(rpc.send)':
182
+ return port && this.rpcSend(request, port);
183
+ case 'pub(rpc.startProvider)':
184
+ return port && this.rpcStartProvider(request, port);
185
+ case 'pub(rpc.subscribe)':
186
+ return port && this.rpcSubscribe(request, id, port);
187
+ case 'pub(rpc.subscribeConnected)':
188
+ return port && this.rpcSubscribeConnected(request, id, port);
189
+ case 'pub(rpc.unsubscribe)':
190
+ return port && this.rpcUnsubscribe(request, port);
191
+ default:
192
+ throw new Error(`Unable to handle message of type ${type}`);
193
+ }
194
+ }
195
+ }
@@ -1,8 +1,6 @@
1
- // Copyright 2019-2025 @pezkuwi/extension-base authors & contributors
2
- // SPDX-License-Identifier: Apache-2.0
3
1
  export function withErrorLog(fn) {
4
2
  try {
5
- var p = fn();
3
+ const p = fn();
6
4
  if (p && typeof p === 'object' && typeof p.catch === 'function') {
7
5
  p.catch(console.error);
8
6
  }
@@ -1,45 +1,40 @@
1
- // Copyright 2019-2025 @pezkuwi/extension-base authors & contributors
2
- // SPDX-License-Identifier: Apache-2.0
3
1
  import { assert } from '@pezkuwi/util';
4
2
  import { PORT_EXTENSION } from '../../defaults.js';
5
3
  import Extension from './Extension.js';
6
4
  import State from './State.js';
7
5
  import Tabs from './Tabs.js';
8
6
  export { withErrorLog } from './helpers.js';
9
- var state = new State();
7
+ const state = new State();
10
8
  await state.init();
11
- var extension = new Extension(state);
12
- var tabs = new Tabs(state);
13
- export default function handler(_a, port, extensionPortName) {
14
- var _b;
15
- var id = _a.id, message = _a.message, request = _a.request;
16
- if (extensionPortName === void 0) { extensionPortName = PORT_EXTENSION; }
17
- var isExtension = !port || (port === null || port === void 0 ? void 0 : port.name) === extensionPortName;
18
- var sender = port === null || port === void 0 ? void 0 : port.sender;
9
+ const extension = new Extension(state);
10
+ const tabs = new Tabs(state);
11
+ export default function handler({ id, message, request }, port, extensionPortName = PORT_EXTENSION) {
12
+ const isExtension = !port || port?.name === extensionPortName;
13
+ const sender = port?.sender;
19
14
  if (!isExtension && !sender) {
20
15
  throw new Error('Unable to extract message sender');
21
16
  }
22
- var from = isExtension
17
+ const from = isExtension
23
18
  ? 'extension'
24
- : (sender === null || sender === void 0 ? void 0 : sender.url) || ((_b = sender === null || sender === void 0 ? void 0 : sender.tab) === null || _b === void 0 ? void 0 : _b.url) || '<unknown>';
25
- var source = "".concat(from, ": ").concat(id, ": ").concat(message);
26
- console.log(" [in] ".concat(source)); // :: ${JSON.stringify(request)}`);
27
- var promise = isExtension
19
+ : sender?.url || sender?.tab?.url || '<unknown>';
20
+ const source = `${from}: ${id}: ${message}`;
21
+ console.log(` [in] ${source}`); // :: ${JSON.stringify(request)}`);
22
+ const promise = isExtension
28
23
  ? extension.handle(id, message, request, port)
29
24
  : tabs.handle(id, message, request, from, port);
30
25
  promise
31
- .then(function (response) {
32
- console.log("[out] ".concat(source)); // :: ${JSON.stringify(response)}`);
26
+ .then((response) => {
27
+ console.log(`[out] ${source}`); // :: ${JSON.stringify(response)}`);
33
28
  // between the start and the end of the promise, the user may have closed
34
29
  // the tab, in which case port will be undefined
35
30
  assert(port, 'Port has been disconnected');
36
- port.postMessage({ id: id, response: response });
31
+ port.postMessage({ id, response });
37
32
  })
38
- .catch(function (error) {
39
- console.log("[err] ".concat(source, ":: ").concat(error.message));
33
+ .catch((error) => {
34
+ console.log(`[err] ${source}:: ${error.message}`);
40
35
  // only send message back to port if it's still connected
41
36
  if (port) {
42
- port.postMessage({ error: error.message, id: id });
37
+ port.postMessage({ error: error.message, id });
43
38
  }
44
39
  });
45
40
  }
@@ -1,22 +1,18 @@
1
- // Copyright 2019-2025 @pezkuwi/extension-base authors & contributors
2
- // SPDX-License-Identifier: Apache-2.0
3
- var subscriptions = {};
4
- // return a subscription callback, that will send the data to the caller via the port
1
+ const subscriptions = {};
5
2
  export function createSubscription(id, port) {
6
3
  subscriptions[id] = port;
7
- return function (subscription) {
4
+ return (subscription) => {
8
5
  if (subscriptions[id]) {
9
- port.postMessage({ id: id, subscription: subscription });
6
+ port.postMessage({ id, subscription });
10
7
  }
11
8
  };
12
9
  }
13
- // clear a previous subscriber
14
10
  export function unsubscribe(id) {
15
11
  if (subscriptions[id]) {
16
- console.log("Unsubscribing from ".concat(id));
12
+ console.log(`Unsubscribing from ${id}`);
17
13
  delete subscriptions[id];
18
14
  }
19
15
  else {
20
- console.error("Unable to unsubscribe from ".concat(id));
16
+ console.error(`Unable to unsubscribe from ${id}`);
21
17
  }
22
18
  }
@@ -1,3 +1 @@
1
- // Copyright 2019-2025 @pezkuwi/extension-base authors & contributors
2
- // SPDX-License-Identifier: Apache-2.0
3
1
  export { default as handlers, withErrorLog } from './handlers/index.js';
@@ -1,3 +1 @@
1
- // Copyright 2019-2025 @pezkuwi/extension-base authors & contributors
2
- // SPDX-License-Identifier: Apache-2.0
3
1
  export {};
package/bundle.js CHANGED
@@ -1,3 +1 @@
1
- // Copyright 2019-2025 @pezkuwi/extension-base authors & contributors
2
- // SPDX-License-Identifier: Apache-2.0
3
1
  export { packageInfo } from './packageInfo.js';
@@ -0,0 +1,12 @@
1
+ import type { KeyringPair } from '@pezkuwi/keyring/types';
2
+ import type { TypeRegistry } from '@pezkuwi/types';
3
+ import type { SignerPayloadRaw } from '@pezkuwi/types/types';
4
+ import type { HexString } from '@pezkuwi/util/types';
5
+ import type { RequestSign } from './types.js';
6
+ export default class RequestBytesSign implements RequestSign {
7
+ readonly payload: SignerPayloadRaw;
8
+ constructor(payload: SignerPayloadRaw);
9
+ sign(_registry: TypeRegistry, pair: KeyringPair): {
10
+ signature: HexString;
11
+ };
12
+ }
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const util_1 = require("@pezkuwi/util");
4
+ class RequestBytesSign {
5
+ payload;
6
+ constructor(payload) {
7
+ this.payload = payload;
8
+ }
9
+ sign(_registry, pair) {
10
+ return {
11
+ signature: (0, util_1.u8aToHex)(pair.sign((0, util_1.u8aWrapBytes)(this.payload.data)))
12
+ };
13
+ }
14
+ }
15
+ exports.default = RequestBytesSign;
@@ -0,0 +1,12 @@
1
+ import type { KeyringPair } from '@pezkuwi/keyring/types';
2
+ import type { TypeRegistry } from '@pezkuwi/types';
3
+ import type { SignerPayloadJSON } from '@pezkuwi/types/types';
4
+ import type { HexString } from '@pezkuwi/util/types';
5
+ import type { RequestSign } from './types.js';
6
+ export default class RequestExtrinsicSign implements RequestSign {
7
+ readonly payload: SignerPayloadJSON;
8
+ constructor(payload: SignerPayloadJSON);
9
+ sign(registry: TypeRegistry, pair: KeyringPair): {
10
+ signature: HexString;
11
+ };
12
+ }
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ class RequestExtrinsicSign {
4
+ payload;
5
+ constructor(payload) {
6
+ this.payload = payload;
7
+ }
8
+ sign(registry, pair) {
9
+ return registry
10
+ .createType('ExtrinsicPayload', this.payload, { version: this.payload.version })
11
+ .sign(pair);
12
+ }
13
+ }
14
+ exports.default = RequestExtrinsicSign;