@pezkuwi/extension-base 0.62.8
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/README.md +12 -0
- package/build/background/RequestBytesSign.d.ts +12 -0
- package/build/background/RequestBytesSign.js +15 -0
- package/build/background/RequestExtrinsicSign.d.ts +12 -0
- package/build/background/RequestExtrinsicSign.js +14 -0
- package/build/background/handlers/Extension.d.ts +49 -0
- package/build/background/handlers/Extension.js +645 -0
- package/build/background/handlers/State.d.ts +96 -0
- package/build/background/handlers/State.js +732 -0
- package/build/background/handlers/Tabs.d.ts +25 -0
- package/build/background/handlers/Tabs.js +313 -0
- package/build/background/handlers/helpers.d.ts +1 -0
- package/build/background/handlers/helpers.js +13 -0
- package/build/background/handlers/index.d.ts +3 -0
- package/build/background/handlers/index.js +45 -0
- package/build/background/handlers/subscriptions.d.ts +3 -0
- package/build/background/handlers/subscriptions.js +22 -0
- package/build/background/index.d.ts +1 -0
- package/build/background/index.js +3 -0
- package/build/background/types.d.ts +343 -0
- package/build/background/types.js +3 -0
- package/build/bundle.d.ts +1 -0
- package/build/bundle.js +3 -0
- package/build/defaults.d.ts +9 -0
- package/build/defaults.js +17 -0
- package/build/index.d.ts +1 -0
- package/build/index.js +5 -0
- package/build/packageDetect.d.ts +1 -0
- package/build/packageDetect.js +10 -0
- package/build/packageInfo.d.ts +6 -0
- package/build/packageInfo.js +4 -0
- package/build/page/Accounts.d.ts +7 -0
- package/build/page/Accounts.js +26 -0
- package/build/page/Injected.d.ts +13 -0
- package/build/page/Injected.js +21 -0
- package/build/page/Metadata.d.ts +7 -0
- package/build/page/Metadata.js +17 -0
- package/build/page/PostMessageProvider.d.ts +63 -0
- package/build/page/PostMessageProvider.js +234 -0
- package/build/page/Signer.d.ts +8 -0
- package/build/page/Signer.js +92 -0
- package/build/page/index.d.ts +16 -0
- package/build/page/index.js +102 -0
- package/build/page/types.d.ts +6 -0
- package/build/page/types.js +3 -0
- package/build/stores/Accounts.d.ts +6 -0
- package/build/stores/Accounts.js +83 -0
- package/build/stores/Base.d.ts +9 -0
- package/build/stores/Base.js +250 -0
- package/build/stores/Metadata.d.ts +5 -0
- package/build/stores/Metadata.js +29 -0
- package/build/stores/index.d.ts +2 -0
- package/build/stores/index.js +4 -0
- package/build/types.d.ts +9 -0
- package/build/types.js +3 -0
- package/build/utils/canDerive.d.ts +2 -0
- package/build/utils/canDerive.js +5 -0
- package/build/utils/getId.d.ts +1 -0
- package/build/utils/getId.js +7 -0
- package/build/utils/index.d.ts +1 -0
- package/build/utils/index.js +3 -0
- package/build/utils/portUtils.d.ts +14 -0
- package/build/utils/portUtils.js +106 -0
- package/package.json +45 -0
- package/src/background/RequestBytesSign.ts +28 -0
- package/src/background/RequestExtrinsicSign.ts +22 -0
- package/src/background/handlers/Extension.spec.ts +478 -0
- package/src/background/handlers/Extension.ts +690 -0
- package/src/background/handlers/State.ts +664 -0
- package/src/background/handlers/Tabs.ts +289 -0
- package/src/background/handlers/helpers.ts +14 -0
- package/src/background/handlers/index.ts +60 -0
- package/src/background/handlers/subscriptions.ts +32 -0
- package/src/background/index.ts +4 -0
- package/src/background/types.ts +432 -0
- package/src/bundle.ts +4 -0
- package/src/defaults.ts +26 -0
- package/src/index.ts +7 -0
- package/src/packageDetect.ts +14 -0
- package/src/packageInfo.ts +6 -0
- package/src/page/Accounts.ts +33 -0
- package/src/page/Injected.ts +33 -0
- package/src/page/Metadata.ts +22 -0
- package/src/page/PostMessageProvider.ts +182 -0
- package/src/page/Signer.ts +45 -0
- package/src/page/index.ts +89 -0
- package/src/page/types.ts +10 -0
- package/src/stores/Accounts.ts +28 -0
- package/src/stores/Base.ts +93 -0
- package/src/stores/Metadata.ts +17 -0
- package/src/stores/index.ts +5 -0
- package/src/types.ts +12 -0
- package/src/utils/canDerive.ts +8 -0
- package/src/utils/getId.ts +10 -0
- package/src/utils/index.ts +4 -0
- package/src/utils/portUtils.ts +65 -0
- package/tsconfig.build.json +16 -0
- package/tsconfig.build.tsbuildinfo +1 -0
- package/tsconfig.spec.json +18 -0
- package/tsconfig.spec.tsbuildinfo +1 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { MessageTypes, RequestTypes, ResponseTypes } from '../types.js';
|
|
2
|
+
import type State from './State.js';
|
|
3
|
+
export default class Tabs {
|
|
4
|
+
#private;
|
|
5
|
+
constructor(state: State);
|
|
6
|
+
private filterForAuthorizedAccounts;
|
|
7
|
+
private authorize;
|
|
8
|
+
private accountsListAuthorized;
|
|
9
|
+
private accountsSubscribeAuthorized;
|
|
10
|
+
private accountsUnsubscribe;
|
|
11
|
+
private getSigningPair;
|
|
12
|
+
private bytesSign;
|
|
13
|
+
private extrinsicSign;
|
|
14
|
+
private metadataProvide;
|
|
15
|
+
private metadataList;
|
|
16
|
+
private rpcListProviders;
|
|
17
|
+
private rpcSend;
|
|
18
|
+
private rpcStartProvider;
|
|
19
|
+
private rpcSubscribe;
|
|
20
|
+
private rpcSubscribeConnected;
|
|
21
|
+
private rpcUnsubscribe;
|
|
22
|
+
private redirectPhishingLanding;
|
|
23
|
+
private redirectIfPhishing;
|
|
24
|
+
handle<TMessageType extends MessageTypes>(id: string, type: TMessageType, request: RequestTypes[TMessageType], url: string, port?: chrome.runtime.Port): Promise<ResponseTypes[keyof ResponseTypes]>;
|
|
25
|
+
}
|
|
@@ -0,0 +1,313 @@
|
|
|
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
|
+
import { combineLatest } from 'rxjs';
|
|
63
|
+
import { checkIfDenied } from '@pezkuwi/phishing';
|
|
64
|
+
import { keyring } from '@pezkuwi/ui-keyring';
|
|
65
|
+
import { accounts as accountsObservable } from '@pezkuwi/ui-keyring/observable/accounts';
|
|
66
|
+
import { assert, isNumber } from '@pezkuwi/util';
|
|
67
|
+
import { PHISHING_PAGE_REDIRECT } from '../../defaults.js';
|
|
68
|
+
import { canDerive } from '../../utils/index.js';
|
|
69
|
+
import RequestBytesSign from '../RequestBytesSign.js';
|
|
70
|
+
import RequestExtrinsicSign from '../RequestExtrinsicSign.js';
|
|
71
|
+
import { withErrorLog } from './helpers.js';
|
|
72
|
+
import { createSubscription, unsubscribe } from './subscriptions.js';
|
|
73
|
+
function transformAccounts(accounts, anyType) {
|
|
74
|
+
if (anyType === void 0) { anyType = false; }
|
|
75
|
+
return Object
|
|
76
|
+
.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
|
+
});
|
|
95
|
+
}
|
|
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");
|
|
101
|
+
}
|
|
102
|
+
Tabs.prototype.filterForAuthorizedAccounts = function (accounts, url) {
|
|
103
|
+
var auth = __classPrivateFieldGet(this, _Tabs_state, "f").authUrls[__classPrivateFieldGet(this, _Tabs_state, "f").stripUrl(url)];
|
|
104
|
+
if (!auth) {
|
|
105
|
+
return [];
|
|
106
|
+
}
|
|
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);
|
|
121
|
+
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();
|
|
129
|
+
if (!authUrlObservable) {
|
|
130
|
+
console.error("No authUrlSubject found for ".concat(strippedUrl));
|
|
131
|
+
return id;
|
|
132
|
+
}
|
|
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));
|
|
138
|
+
}),
|
|
139
|
+
url: url
|
|
140
|
+
};
|
|
141
|
+
port.onDisconnect.addListener(function () {
|
|
142
|
+
_this.accountsUnsubscribe(url, { id: id });
|
|
143
|
+
});
|
|
144
|
+
return id;
|
|
145
|
+
};
|
|
146
|
+
Tabs.prototype.accountsUnsubscribe = function (url, _a) {
|
|
147
|
+
var id = _a.id;
|
|
148
|
+
var sub = __classPrivateFieldGet(this, _Tabs_accountSubs, "f")[id];
|
|
149
|
+
if (!sub || sub.url !== url) {
|
|
150
|
+
return false;
|
|
151
|
+
}
|
|
152
|
+
delete __classPrivateFieldGet(this, _Tabs_accountSubs, "f")[id];
|
|
153
|
+
unsubscribe(id);
|
|
154
|
+
sub.subscription.unsubscribe();
|
|
155
|
+
return true;
|
|
156
|
+
};
|
|
157
|
+
Tabs.prototype.getSigningPair = function (address) {
|
|
158
|
+
var pair = keyring.getPair(address);
|
|
159
|
+
assert(pair, 'Unable to find keypair');
|
|
160
|
+
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
|
+
});
|
|
212
|
+
});
|
|
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 () {
|
|
219
|
+
unsubscribe(id);
|
|
220
|
+
});
|
|
221
|
+
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) {
|
|
235
|
+
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
|
+
});
|
|
308
|
+
});
|
|
309
|
+
};
|
|
310
|
+
return Tabs;
|
|
311
|
+
}());
|
|
312
|
+
_Tabs_accountSubs = new WeakMap(), _Tabs_state = new WeakMap();
|
|
313
|
+
export default Tabs;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function withErrorLog(fn: () => unknown): void;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// Copyright 2019-2025 @pezkuwi/extension-base authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
export function withErrorLog(fn) {
|
|
4
|
+
try {
|
|
5
|
+
var p = fn();
|
|
6
|
+
if (p && typeof p === 'object' && typeof p.catch === 'function') {
|
|
7
|
+
p.catch(console.error);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
catch (e) {
|
|
11
|
+
console.error(e);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { MessageTypes, TransportRequestMessage } from '../types.js';
|
|
2
|
+
export { withErrorLog } from './helpers.js';
|
|
3
|
+
export default function handler<TMessageType extends MessageTypes>({ id, message, request }: TransportRequestMessage<TMessageType>, port?: chrome.runtime.Port, extensionPortName?: string): void;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// Copyright 2019-2025 @pezkuwi/extension-base authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
import { assert } from '@pezkuwi/util';
|
|
4
|
+
import { PORT_EXTENSION } from '../../defaults.js';
|
|
5
|
+
import Extension from './Extension.js';
|
|
6
|
+
import State from './State.js';
|
|
7
|
+
import Tabs from './Tabs.js';
|
|
8
|
+
export { withErrorLog } from './helpers.js';
|
|
9
|
+
var state = new State();
|
|
10
|
+
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;
|
|
19
|
+
if (!isExtension && !sender) {
|
|
20
|
+
throw new Error('Unable to extract message sender');
|
|
21
|
+
}
|
|
22
|
+
var from = isExtension
|
|
23
|
+
? '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
|
|
28
|
+
? extension.handle(id, message, request, port)
|
|
29
|
+
: tabs.handle(id, message, request, from, port);
|
|
30
|
+
promise
|
|
31
|
+
.then(function (response) {
|
|
32
|
+
console.log("[out] ".concat(source)); // :: ${JSON.stringify(response)}`);
|
|
33
|
+
// between the start and the end of the promise, the user may have closed
|
|
34
|
+
// the tab, in which case port will be undefined
|
|
35
|
+
assert(port, 'Port has been disconnected');
|
|
36
|
+
port.postMessage({ id: id, response: response });
|
|
37
|
+
})
|
|
38
|
+
.catch(function (error) {
|
|
39
|
+
console.log("[err] ".concat(source, ":: ").concat(error.message));
|
|
40
|
+
// only send message back to port if it's still connected
|
|
41
|
+
if (port) {
|
|
42
|
+
port.postMessage({ error: error.message, id: id });
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { MessageTypesWithSubscriptions, SubscriptionMessageTypes } from '../types.js';
|
|
2
|
+
export declare function createSubscription<TMessageType extends MessageTypesWithSubscriptions>(id: string, port: chrome.runtime.Port): (data: SubscriptionMessageTypes[TMessageType]) => void;
|
|
3
|
+
export declare function unsubscribe(id: string): void;
|
|
@@ -0,0 +1,22 @@
|
|
|
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
|
|
5
|
+
export function createSubscription(id, port) {
|
|
6
|
+
subscriptions[id] = port;
|
|
7
|
+
return function (subscription) {
|
|
8
|
+
if (subscriptions[id]) {
|
|
9
|
+
port.postMessage({ id: id, subscription: subscription });
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
// clear a previous subscriber
|
|
14
|
+
export function unsubscribe(id) {
|
|
15
|
+
if (subscriptions[id]) {
|
|
16
|
+
console.log("Unsubscribing from ".concat(id));
|
|
17
|
+
delete subscriptions[id];
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
console.error("Unable to unsubscribe from ".concat(id));
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as handlers, withErrorLog } from './handlers/index.js';
|